diff --git a/public/dist/ATON.min.js b/public/dist/ATON.min.js index af5ce522..30a39221 100644 --- a/public/dist/ATON.min.js +++ b/public/dist/ATON.min.js @@ -1,2 +1,2 @@ /*! For license information please see ATON.min.js.LICENSE.txt */ -(()=>{"use strict";class e extends THREE.Group{constructor(e,t){super(),this.type=t||ATON.NTYPES.SCENE,this.enablePicking(),this.type===ATON.NTYPES.SCENE&&(this._rootG=ATON._rootVisible,this._nodes=ATON.snodes),this.type===ATON.NTYPES.SEM&&(this._rootG=ATON._rootSem,this._nodes=ATON.semnodes),this.type===ATON.NTYPES.UI&&(this._rootG=ATON._rootUI,this._nodes=ATON.uinodes),this.as(e),this.kwords=void 0,this._bCloneOnLoadHit=!0,this._tlist=void 0,this._aniMixers=void 0,this.castShadow=!1,this.receiveShadow=!1,this._bs=new THREE.Sphere,this.autocenter=!1,this.onHover=void 0,this.onLeave=void 0,this.onSelect=void 0}as(e){if(void 0!==e&&e!==ATON.ROOT_NID)return this._nodes[e]=this,this.nid=e,this.name=e,this}setAsRoot(){return this._nodes[ATON.ROOT_NID]=this,this.nid=ATON.ROOT_NID,this}setCloneOnLoadHit(e){return this._bCloneOnLoadHit=e,this}addKeywords(e){let t=e.split(",");void 0===this.kwords&&(this.kwords={});for(let e in t){let o=t[e].trim();o.length>0&&(this.kwords[o]=!0)}for(let t in this.children){let o=this.children[t];void 0!==o.type&&o.addKeywords(e)}return this}hasKeyword(e){if(void 0!==this.kwords)return void 0!==this.kwords[e]}setDescription(e){return this.userData.description=e,this}getDescription(){return this.userData.description}setAudio(e){return this.userData.audio=e,this}getAudio(){return this.userData.audio}hide(){let e=this.visible;return this.visible=!1,ATON.Utils.setPicking(this,this.type,!1),ATON._renderer.shadowMap.enabled&&(ATON._dMainL.shadow.needsUpdate=!0),e&&ATON.updateLightProbes(),this}show(){let e=this.visible;return this.visible=!0,ATON.Utils.setPicking(this,this.type,this.bPickable),ATON._renderer.shadowMap.enabled&&void 0!==ATON._dMainL&&void 0!==ATON._dMainL.shadow&&(ATON._dMainL.shadow.needsUpdate=!0),e||ATON.updateLightProbes(),this}toggle(e){return void 0===e?this.visible?this.hide():this.show():e?this.show():this.hide()}disablePicking(){return this.bPickable=!1,ATON.Utils.setPicking(this,this.type,this.bPickable),this}enablePicking(){return this.bPickable=!0,ATON.Utils.setPicking(this,this.type,this.bPickable),this}setPickable(e){return e?this.enablePicking():this.disablePicking(),this}setMaterial(e){this.userData.cMat=e,this.traverse((t=>{t.isMesh&&(t.material=e),t.type&&(this.userData.cMat=e)}));for(let t in this.children){let o=this.children[t];o.setMaterial&&o.setMaterial(e)}return this}getMaterial(){return this.userData.cMat}setDefaultAndHighlightMaterials(e,t){return this.userData.matSTD=e,this.userData.matHL=t,this}highlight(){return this.userData.matHL&&this.setMaterial(this.userData.matHL),this}restoreDefaultMaterial(){return this.userData.matSTD&&this.setMaterial(this.userData.matSTD),this}setOpacity(e){return this.traverse((t=>{t.isMesh&&(t.material.opacity=e)})),this}setShadowCast(e){return this.castShadow=e,this.traverse((t=>{t.isMesh&&(t.castShadow=e)})),this}setShadowReceive(e){return this.receiveShadow=e,this.traverse((t=>{t.isMesh&&(t.receiveShadow=e)})),this}setEnvMap(e){return this.traverse((t=>{t.isMesh&&(t.material.envMap=e)})),this}assignLightProbe(e){return this.traverse((t=>{t.isMesh&&t.geometry&&ATON.Utils.assignLightProbeToMesh(e,t)})),this}assignLightProbesByProximity(){return 0===ATON._lps.length||this.traverse((e=>{if(e.isMesh&&e.geometry){let t,o,i=new THREE.Vector3;(new THREE.Box3).setFromObject(e).getCenter(i);for(let e in ATON._lps){let r=ATON._lps[e],a=i.distanceToSquared(r.pos);(void 0===t||a{e.isMesh&&e.geometry&&(ATON.Utils.clearLightProbeFromMesh(e),e.material&&(e.material.envMap.dispose(),e.material.needsUpdate=!0))})),this}updateLightProbes=()=>(this.traverse((e=>{if(e.isMesh&&e.geometry){let t=e.userData.LP;void 0!==t&&(t.update(),e.material.envMap=t.getEnvTex(),e.material.needsUpdate=!0)}})),this);duplicate(){let e=this.clone();return e.traverse((e=>{e.isMesh&&(e.material=e.material.clone())})),e}delete(){let e=this.parent;void 0!==e&&void 0!==e.nid&&e.removeChild(this)}removeChild(e){if(void 0!==e)return e.nid,void 0!==e.nid&&(this._nodes[e.nid]=void 0),e.parent=void 0,e.traverse((e=>{e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()})),this.remove(e),this}removeChildren(){for(let e=this.children.length-1;e>=0;e--)this.removeChild(this.children[e]);return this}attachTo(e){let t="string"==typeof e?this._nodes[e]:e;return t&&(t.add(this),void 0!==t.userData.cMat&&(this.userData.cMat=t.userData.cMat),void 0!==t.bPickable&&(this.bPickable=t.bPickable)),t}attachToRoot(){return this._rootG.add(this),void 0!==this._rootG.userData.cMat&&(this.userData.cMat=this._rootG.userData.cMat),void 0!==this._rootG.bPickable&&(this.bPickable=this._rootG.bPickable),this._rootG}getBound(){return this.dirtyBound(),this._bs}dirtyBound(){return(new THREE.Box3).setFromObject(this).getBoundingSphere(this._bs),this}autoFit(e,t){if(this.dirtyBound(),e&&(this.position.copy(this._bs.center),this.position.multiplyScalar(-1)),t&&t>0&&this._bs.radius>0){let e=t/this._bs.radius;this.scale.set(e,e,e)}}setPosition(e,t,o){return e instanceof THREE.Vector3?this.position.copy(e):this.position.set(e,t,o),this}setScale(e,t,o){return e instanceof THREE.Vector3?this.scale.copy(e):(void 0===t&&(t=e,o=e),this.scale.set(e,t,o)),this}setRotation(e,t,o){return e instanceof THREE.Vector3?this.rotation.copy(e):this.rotation.set(e,t,o),this}orientToCamera(){return this.quaternion.copy(ATON.Nav._qOri),this}orientToLocation(e,t,o){return e instanceof THREE.Vector3?this.lookAt(e):this.lookAt(e,t,o),this}orientToNode(e){return e?(this.orientToLocation(e.position),this):this}setYup(){return this.rotation.set(-1.57079632679,0,0),this}addTransform(e){let t;return"string"==typeof e&&(t=ATON.Utils.parseTransformString(e)),void 0===t||(void 0===this._tlist&&(this._tlist=[]),this._tlist.push(t)),this}load(e,t){if(void 0===e)return this;let o=this;if(e=ATON.Utils.resolveCollectionURL(e),ATON.Utils.tryLoadFromService(e,o))return t&&t(),o;if("json"===ATON.Utils.getFileExtension(e))return ATON.MRes.loadTileSetFromURL(e,o),t&&t(),o;if(ATON._resHandler)for(let t in ATON._resHandler)if(ATON._resHandler[t](e,o))return o;if(o._bCloneOnLoadHit&&void 0!==ATON._assetsManager[e])return ATON._assetsManager[e].then((e=>{let i=e.clone();if(ATON.Utils.modelVisitor(o,i),void 0!==o._tlist)for(let e in o._tlist)o._tlist[e].add(i.clone()),o.add(o._tlist[e]);else o.add(i);t&&t()})),o;ATON._assetReqNew(e);let i=new Promise(((i,r)=>{ATON._aLoader.load(e,(r=>{let a=r.scene||r.scene[0];if(ATON.Utils.modelVisitor(o,a),void 0!==o._tlist)for(let e in o._tlist)o._tlist[e].add(a.clone()),o.add(o._tlist[e]);else o.add(a);ATON.Utils.registerAniMixers(o,r),ATON.CC.extract(r),i(a),console.log("%cModel loaded","color:green"),ATON._assetReqComplete(e),o.type===ATON.NTYPES.SCENE&&(ATON._bqScene=!0),o.type===ATON.NTYPES.SEM&&(ATON._bqSem=!0),o.bPickable&&o.enablePicking(),o.dirtyBound(),t&&t()}),void 0,(o=>{console.log("%cError loading model "+e,"color:red"),ATON._assetReqComplete(e),t&&t()}))}));return o._bCloneOnLoadHit&&(ATON._assetsManager[e]=i),this}exportAs(e){return ATON.Utils.exportNode(this,e),this}setOnHover(e){return this.onHover=e,this}setOnLeave(e){return this.onLeave=e,this}setOnSelect(e){return this.onSelect=e,this}loadCesiumIONAsset(e){return ATON.MRes.loadCesiumIONAsset(e,this),this}loadSketchfabAsset(e){let t=ATON.getAPIToken("sketchfab"),o=this;return null==t&&(console.log("A valid Sketchfab token is required"),t=prompt("Please enter a valid Sketchfab token:"),null==t||""==t)||fetch("https://api.sketchfab.com/v3/models/"+e+"/download",{method:"GET",headers:{Authorization:"Token "+t},mode:"cors"}).then((function(e){return e.json()})).then((function(e){if(ATON.setAPIToken("sketchfab",t),e.glb){let t=e.glb.url;return o.load(t),o}})),this}}const t=e;let o={init:()=>{o.evLocal={},o.evNetwork={},ATON.on=o.on,ATON.fire=o.fire,ATON.fireEvent=o.fire,ATON.clearEventHandlers=o.clearEventHandlers},clearEventHandlers:e=>{o.evLocal[e]=[],o.evNetwork[e]=[]},executeHandlers:(e,t)=>{if(e)for(let o=0;o{if(void 0!==t){const i=o.evLocal;void 0===i[e]&&(i[e]=[]),i[e].push(t)}void 0!==i&&ATON.Photon.on(e,i)},fire:(e,t,i)=>{const r=o.evLocal[e];o.executeHandlers(r,t),i&&ATON.Photon.fire(e,t)}};const i=o;let r={init:()=>{r.materials={},r.colors={},r._loader=new THREE.MaterialLoader,r._uSem={time:{type:"float",value:0},tint:{type:"vec4",value:new THREE.Vector4(.2,.2,1,.2)},sel:{type:"vec4",value:new THREE.Vector4(0,0,0,.1)}},r.addDefaults()},getDefVertexShader:()=>"\n varying vec3 vPositionW;\n varying vec3 vNormalW;\n varying vec3 vNormalV;\n varying vec2 vUv;\n\n void main(){\n vUv = uv;\n\n vPositionW = ( modelMatrix * vec4( position, 1.0 )).xyz;\n vNormalV = normalize( vec3( normalMatrix * normal ));\n vNormalW = ( modelMatrix * vec4(normal, 0.0 )).xyz;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n ",addDefaults:()=>{r.colors.white=new THREE.Color(1,1,1),r.colors.black=new THREE.Color(0,0,0),r.colors.green=new THREE.Color(0,1,0),r.colors.yellow=new THREE.Color(1,1,0),r.colors.red=new THREE.Color(1,0,0),r.colors.blue=new THREE.Color(0,0,1),r.colors.orange=new THREE.Color(1,.5,0),r.colors.defUI=new THREE.Color(.85,1,.95),r.colors.sem=new THREE.Color(0,1,.5),r.colors.darksem=new THREE.Color(0,0,.1),r.materials.fullyTransparent=new THREE.MeshBasicMaterial({transparent:!0,depthWrite:!1,opacity:0}),r.materials.defUI=new THREE.ShaderMaterial({uniforms:{tint:{type:"vec3",value:r.colors.defUI},opacity:{type:"float",value:0}},vertexShader:r.getDefVertexShader(),fragmentShader:"\n varying vec3 vPositionW;\n\t\t varying vec3 vNormalW;\n varying vec3 vNormalV;\n uniform vec3 tint;\n //uniform vec3 base;\n uniform float opacity;\n\n\t\t void main(){\n\t\t //vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\n\n float f;\n\t\t //f = dot(vNormalV, viewDirectionW);\n f = dot(vNormalV, vec3(0,0,1));\n\t\t f = clamp(1.0-f, 0.0, 1.0);\n f *= f;\n\n f = mix(opacity, 1.0 + opacity, f);\n f = clamp(f, 0.0,1.0);\n\n //vec3 col = mix(base,tint, f);\n\t\t //gl_FragColor = vec4(col, f * opacity);\n\n gl_FragColor = vec4(tint, f);\n\t\t }\n ",transparent:!0,depthWrite:!1}),r.materials.selector=r.materials.defUI.clone(),r.materials.outline=new THREE.MeshBasicMaterial({color:r.colors.black,side:THREE.BackSide,transparent:!0,depthWrite:!1,opacity:.2}),r.materials.controllerRay=r.materials.defUI.clone(),r.materials.controllerRay.uniforms.tint.value=r.colors.white,r.materials.xray=r.materials.defUI.clone(),r.materials.xray.uniforms.tint.value=r.colors.white,r.materials.xray.uniforms.opacity.value=.5,r.materials.teleportLoc=new THREE.MeshBasicMaterial({transparent:!0,opacity:1,depthWrite:!1,side:THREE.DoubleSide}),ATON.Utils.textureLoader.load(ATON.PATH_RES+"grad.png",(e=>{r.materials.teleportLoc.map=e})),r.materials.measurement=new THREE.MeshBasicMaterial({color:r.colors.white,transparent:!0,depthWrite:!1,opacity:.5,depthTest:!1}),r.materials.semanticShape=new THREE.ShaderMaterial({uniforms:r._uSem,vertexShader:r.getDefVertexShader(),fragmentShader:"\n varying vec3 vPositionW;\n\t\t varying vec3 vNormalW;\n varying vec3 vNormalV;\n\n uniform float time;\n uniform vec4 tint;\n\n\t\t void main(){\n\t\t //vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\n\n //float ff = dot(vNormalV, vec3(0,0,1));\n\t\t //ff = clamp(1.0-ff, 0.0, 1.0);\n\n float f = (1.0 * cos(time*2.0)); // - 0.5;\n //f = cos(time + (vPositionW.y*10.0));\n f = clamp(f, 0.0,1.0);\n\n\t\t gl_FragColor = vec4(tint.rgb, tint.a * f);\n //gl_FragColor = vec4(tint.rgb, ff);\n\t\t }\n ",transparent:!0,depthWrite:!1}),r.materials.semanticShapeHL=new THREE.MeshBasicMaterial({color:r.colors.sem,transparent:!0,depthWrite:!1,opacity:.2}),r.materials.semanticShapeEdit=new THREE.MeshBasicMaterial({color:r.colors.orange,transparent:!0,depthWrite:!1,opacity:.5}),r.materials.transWhite=new THREE.MeshBasicMaterial({color:r.colors.white,transparent:!0,depthWrite:!1,side:THREE.DoubleSide,opacity:.2}),r.materials.transBlack=new THREE.MeshBasicMaterial({color:r.colors.black,transparent:!0,depthWrite:!1,side:THREE.DoubleSide,opacity:.2}),r.materials.wireframe=new THREE.MeshBasicMaterial({color:r.colors.black,transparent:!0,depthWrite:!1,opacity:.1,wireframe:!0}),r.materials.normSlope=new THREE.ShaderMaterial({vertexShader:r.getDefVertexShader(),fragmentShader:"\n varying vec3 vPositionW;\n\t\t varying vec3 vNormalW;\n\n\t\t void main(){\n vec4 A = vec4(0,1,0, 1.0);\n vec4 B = vec4(1,0,0, 1.0);\n\n float f;\n f = dot(vNormalW, vec3(0,1,0));\n\n\t\t gl_FragColor = mix(B,A, f);\n\t\t }\n "}),r.materials.gradient=new THREE.ShaderMaterial({uniforms:{range:{type:"vec2",value:new THREE.Vector2(-4,5)}},vertexShader:r.getDefVertexShader(),fragmentShader:"\n varying vec3 vPositionW;\n\n uniform vec2 range;\n\n\t\t void main(){\n vec4 A = vec4(0,0,0, 1.0);\n vec4 B = vec4(0,0.5,1, 1.0);\n\n float t = (vPositionW.y - range.x)/(range.y - range.x);\n t = clamp(t, 0.0,1.0);\n\n\t\t gl_FragColor = mix(A,B, t);\n\t\t }\n "}),r.materials.lp=new THREE.ShaderMaterial({vertexShader:r.getDefVertexShader(),fragmentShader:"\n varying vec3 vPositionW;\n\t\t varying vec3 vNormalW;\n varying vec3 vNormalV;\n\n\t\t void main(){\n\t\t vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\n\n float f;\n\t\t //f = dot(viewDirectionW, vNormalW);\n f = dot(vNormalV, vec3(0,0,1));\n\t\t f = clamp(1.0 - f, 0.0, 1.0);\n\n\t\t gl_FragColor = vec4(1.0,1.0,1.0, f);\n\t\t }\n ",transparent:!0,depthWrite:!1});let e=(new THREE.TextureLoader).load(ATON.PATH_RES+"point-mask.png");e.generateMipmaps=!1,r.materials.point=new THREE.PointsMaterial({vertexColors:!0,alphaMap:e,alphaTest:.5,depthTest:!0,transparent:!1,size:4,sizeAttenuation:!1}),r.materials.chromakey=new THREE.ShaderMaterial({uniforms:{tBase:{type:"t"},keycolor:{type:"vec4",value:new THREE.Vector4(0,1,0,0)},similarity:{type:"float",value:.4},smoothness:{type:"float",value:.08},spill:{type:"float",value:.1}},vertexShader:r.getDefVertexShader(),fragmentShader:"\n uniform sampler2D tBase;\n uniform vec4 keycolor;\n\n uniform float similarity;\n uniform float smoothness;\n uniform float spill;\n\n varying vec2 vUv;\n\n // From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\n vec2 RGBtoUV(vec3 rgb){\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n }\n\n // From https://godotshaders.com/shader/green-screen-chromakey/\n\t\t void main(){\n\t\t vec4 frag = texture2D(tBase, vUv);\n vec4 orig = frag;\n\n float chromaDist = distance(RGBtoUV(frag.rgb), RGBtoUV(keycolor.rgb));\n\n float baseMask = chromaDist - similarity;\n float fullMask = pow(clamp(baseMask / smoothness, 0.0,1.0), 1.5);\n frag.a = fullMask;\n \n float spillVal = pow(clamp(baseMask / spill, 0.0,1.0), 1.5);\n float desat = clamp(frag.r * 0.2126 + frag.g * 0.7152 + frag.b * 0.0722, 0.0,1.0);\n frag.rgb = mix(vec3(desat, desat, desat), frag.rgb, spillVal);\n\n frag = mix(orig,frag, keycolor.w);\n\n\t\t gl_FragColor = frag;\n\t\t }\n ",transparent:!0,side:THREE.DoubleSide})},addMaterial:(e,t)=>{r.materials[e]?console.log("MatHub: material "+e+" already registered"):r.materials[e]=t},loadMaterial:(e,t)=>{r._loader.load(t,(t=>{r.addMaterial(e,t)}),void 0,(e=>{console.log(e)}))},getMaterial:e=>r.materials[e],update:()=>{r._uSem.time.value+=ATON._dt,r._uSem.sel.value.x=ATON.SUI.mainSelector.position.x,r._uSem.sel.value.y=ATON.SUI.mainSelector.position.y,r._uSem.sel.value.z=ATON.SUI.mainSelector.position.z,r._uSem.sel.value.w=ATON.SUI._selectorRad}};const a=r;let n={TSTRING_SEPARATOR:" ",VOID_CAST:(e,t)=>{},init:()=>{ATON.device={},n.geomUnitSphere=new THREE.SphereGeometry(1,32,32),n.geomUnitCube=new THREE.BoxGeometry,n.exporterGLTF=void 0,n.exporterOBJ=void 0,n.exporterUSDZ=void 0,n._dlink=document.createElement("a"),n._dlink.style.display="none",document.body.appendChild(n._dlink),n.textureLoader=new THREE.TextureLoader,n._bvhBounds=0,n.stats={},n.stats.numVertices=0,n.stats.numTris=0},generateID:e=>(void 0===e&&(e="id"),e+"-"+Math.random().toString(36).substr(2,9)),goToURL:e=>{window.location.href=e},goToScene:(e,t)=>{if(void 0===e)return;if(e.length<2)return;let o=ATON.PATH_FE+e;void 0!==t&&(o+="&vrc="+t),window.location.href=o},isConnectionSecure:()=>window.isSecureContext,isLocalhost:()=>!!window.location.origin.includes("localhost")||!!window.location.origin.includes("127.0.0.1"),showBVHbounds:e=>{e>0&&(n._bvhBounds=e)},_addBVHbounds:(e,t)=>{if(void 0===e)return;let o=new ThreeMeshBVH.MeshBVHHelper(e,t);o.displayParents=!0,o.update(),e.parent.add(o)},profileDevice:()=>{ATON.device.isMobile=!1,ATON.device.isMobile=!(!/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent)&&!/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))),ATON.device.xrSupported={},ATON.device.xrSupported["immersive-vr"]=!1,ATON.device.xrSupported["immersive-ar"]=!1,"xr"in navigator&&(navigator.xr.isSessionSupported("immersive-vr").then((e=>{ATON.device.xrSupported["immersive-vr"]=!!e,console.log("WebXR VR session support: "+ATON.device.xrSupported["immersive-vr"]),ATON.fire("XR_support",{type:"immersive-vr",v:ATON.device.xrSupported["immersive-vr"]})})),navigator.xr.isSessionSupported("immersive-ar").then((e=>{ATON.device.xrSupported["immersive-ar"]=!!e,console.log("WebXR AR session support: "+ATON.device.xrSupported["immersive-ar"]),ATON.fire("XR_support",{type:"immersive-ar",v:ATON.device.xrSupported["immersive-ar"]})})))},profileRenderingCapabilities:()=>{if(void 0===ATON._renderer)return;let e=ATON._renderer.capabilities;void 0!==e&&(ATON.device.lowGPU=!1,e.isWebGL2||(ATON.device.lowGPU=!0),e.maxTextureSize<8192&&(ATON.device.lowGPU=!0),e.maxCubemapSize<4096&&(ATON.device.lowGPU=!0),console.log(e))},isMobile:()=>ATON.device.isMobile,isVRsupported:()=>ATON.device.xrSupported["immersive-vr"],isARsupported:()=>ATON.device.xrSupported["immersive-ar"],getFileExtension:e=>e.substr(e.lastIndexOf(".")+1).toLowerCase(),removeFileExtension:e=>e.replace(/\.[^/.]+$/,""),isVideo:e=>{let t=n.getFileExtension(e);return"mp4"===t||"webm"===t||"m3u8"===t},isImage:e=>{let t=n.getFileExtension(e);return"jpg"===t||"png"===t||"ktx"===t||"ktx2"===t},getBaseFolder:e=>{var t=e.lastIndexOf("/");return-1!==t?e.substring(0,t+1):""},getFilename:e=>e.split(/(\\|\/)/g).pop(),isResourceURL:e=>!!e.startsWith("http://")||!!e.startsWith("https://"),URLify:e=>{if("string"!=typeof e)return e;const t=e.match(/(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)/g);return t&&t.forEach((function(t){e=e.replace(t,"")})),e},resolveCollectionURL:e=>e?(ATON._collMod&&(e=ATON._collMod(e)),e.startsWith("http")?e:ATON.PATH_COLLECTION+e):"",tryLoadFromService:(e,t)=>{if(!t)return!1;if(e.startsWith("https://cesium.com/ion/assets/")||e.startsWith("https://ion.cesium.com/assets/")){let o=e.split("/"),i=o[o.length-1];return t.loadCesiumIONAsset(i),!0}if(e.startsWith("https://assets.cesium.com/")){let o=e.split("/"),i=o[o.length-2];return t.loadCesiumIONAsset(i),!0}if(e.startsWith("https://sketchfab.com/3d-models/")){let o=e.split("-"),i=o[o.length-1];return t.loadSketchfabAsset(i),!0}for(let o in ATON._resMappers){let i=ATON._resMappers[o](e);if(void 0!==i)return t.load(i),!0}return!1},postJSON:(e,t,o,i)=>{$.ajax({url:e,type:"POST",xhrFields:{withCredentials:!0},data:JSON.stringify(t),contentType:"application/json; charset=utf-8",dataType:"json",success:e=>{o&&o(e)}}).fail((e=>{console.log(e),i&&i()}))},getJSON:(e,t)=>{fetch(e,{method:"GET",headers:{Accept:"application/json"}}).then((e=>e.json())).then((e=>{console.log(e),t&&t(e)}))},runAsync:e=>{const t=new Worker(URL.createObjectURL(new Blob([`postMessage((${e})());`]),{type:"application/javascript; charset=utf-8"}));return new Promise(((e,o)=>{t.onmessage=({data:o})=>{e(o),t.terminate()},t.onerror=e=>{o(e),t.terminate()}}))},mergeObject:e=>{e.updateMatrixWorld(!0);const t=[];e.traverse((e=>{if(e.isMesh){const o=e.geometry;o.applyMatrix4(e.matrixWorld),t.push(o.toNonIndexed())}}));const o=THREE.BufferGeometryUtils.mergeGeometries(t,!1),i=THREE.BufferGeometryUtils.mergeVertices(o).center(),r=new THREE.Group,a=new THREE.Mesh(i);return r.add(a),r},setPicking:(e,t,o)=>{void 0===o&&(o=!0),e.traverse((e=>{o?e.layers.enable(t):e.layers.disable(t)}))},graphPostVisitor:e=>{e.visible?console.log(e):n.setPicking(e,e.type,!1)},rotationBetweenDirections:(e,t)=>{const o=new THREE.Quaternion,i=(new THREE.Vector3).crossVectors(e,t);return o.x=i.x,o.y=i.y,o.z=i.z,o.w=1+e.clone().dot(t),o.normalize(),o},clampValue:(e,t,o)=>Math.min(Math.max(e,t),o),loadTexture:(e,t)=>{e.endsWith(".ktx2")?ATON._ktx2Loader.load(e,t):n.textureLoader.load(e,t)},modelVisitor:(e,t)=>{if(void 0===t)return;if(void 0===e)return;let o=e.type;t.traverse((t=>{t.isMesh&&(o===ATON.NTYPES.SCENE&&(t.castShadow=!0,t.receiveShadow=!0,t.geometry&&(t.geometry.computeBoundsTree(),console.log("Computed visible BVH"),n._bvhBounds>0&&n._addBVHbounds(t,n._bvhBounds)),n.processMaterial(t.material)),o===ATON.NTYPES.SEM&&(t.material=ATON.MatHub.materials.semanticShape,t.geometry&&(t.geometry.computeBoundsTree(),console.log("Computed semantic BVH"))),e.userData.cMat&&(t.material=e.userData.cMat))}))},processMaterial:e=>{void 0!==e&&null!==e.map&&void 0!==e.map&&(e.map.generateMipmaps=!0,e.map.anisotropy=ATON.device.isMobile?0:ATON._maxAnisotropy,e.map.minFilter=THREE.LinearMipmapLinearFilter,e.map.magFilter=THREE.LinearFilter,e.map.colorSpace=ATON._stdEncoding)},_visitorCP:e=>{ATON._renderer.localClippingEnabled&&(e||(e=ATON._rootVisible),e.traverse((e=>{e.material&&(e.material.clippingPlanes=ATON._clipPlanes,e.material.clipIntersection=!1,e.material.clipShadows=!0)})))},cleanupVisitor:e=>{e.traverse((e=>{if(e.material)if(e.material.length)for(let t=0;t{let o=t.scene||t.scene[0],i=!1;if(void 0===t.animations)return;let r=new THREE.AnimationMixer(o);t.animations.forEach((e=>{r.clipAction(e).play(),i=!0})),i&&(ATON._aniMixers.push(r),void 0===e._aniMixers&&(e._aniMixers=[]),e._aniMixers.push(r))},parseTransformString:e=>{let t=new THREE.Group,o=e.split(n.TSTRING_SEPARATOR),i=o.length;return i<3||(t.position.set(parseFloat(o[0]),parseFloat(o[1]),parseFloat(o[2])),i<6||(t.rotation.set(parseFloat(o[3]),parseFloat(o[4]),parseFloat(o[5])),i<9||t.scale.set(parseFloat(o[6]),parseFloat(o[7]),parseFloat(o[8])))),t},setVectorPrecision:(e,t)=>(e.x=parseFloat(e.x.toPrecision(t)),e.y=parseFloat(e.y.toPrecision(t)),e.z=parseFloat(e.z.toPrecision(t)),e),parseMD:e=>(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=e.replace(/^\s*\n\*/gm,"
    \n*")).replace(/^(\*.+)\s*\n([^\*])/gm,"$1\n
\n\n$2")).replace(/^\*(.+)/gm,"
  • $1
  • ")).replace(/^\s*\n\d\./gm,"
      \n1.")).replace(/^(\d\..+)\s*\n([^\d\.])/gm,"$1\n
    \n\n$2")).replace(/^\d\.(.+)/gm,"
  • $1
  • ")).replace(/^\>(.+)/gm,"
    $1
    ")).replace(/[\#]{6}(.+)/g,"
    $1
    ")).replace(/[\#]{5}(.+)/g,"
    $1
    ")).replace(/[\#]{4}(.+)/g,"

    $1

    ")).replace(/[\#]{3}(.+)/g,"

    $1

    ")).replace(/[\#]{2}(.+)/g,"

    $1

    ")).replace(/[\#]{1}(.+)/g,"

    $1

    ")).replace(/^(.+)\n\=+/gm,"

    $1

    ")).replace(/^(.+)\n\-+/gm,"

    $1

    ")).replace(/\!\[([^\]]+)\]\(([^\)]+)\)/g,'$1')).replace(/[\[]{1}([^\]]+)[\]]{1}[\(]{1}([^\)\"]+)(\"(.+)\")?[\)]{1}/g,'$1')).replace(/[\*\_]{2}([^\*\_]+)[\*\_]{2}/g,"$1")).replace(/[\*\_]{1}([^\*\_]+)[\*\_]{1}/g,"$1")).replace(/[\~]{2}([^\~]+)[\~]{2}/g,"$1")).replace(/^\s*\n\`\`\`(([^\s]+))?/gm,'
    ')).replace(/^\`\`\`\s*\n/gm,"
    \n\n")).replace(/[\`]{1}([^\`]+)[\`]{1}/g,"$1")).replace(/^\s*(\n)?(.+)/gm,(function(e){return/\<(\/)?(h\d|ul|ol|li|blockquote|pre|img)/.test(e)?e:"

    "+e+"

    "}))).replace(/(\)\s*\n\(.+)\<\/p\>/gm,"$1$2"),checkAuth:e=>{$.ajax({type:"GET",url:ATON.PATH_RESTAPI+"user",xhrFields:{withCredentials:!0},dataType:"json",success:t=>{e(t)}})},getHumanReadableDistance:e=>{let t=" m";return e<.01?(t=" mm",t=(e*=1e3).toPrecision(3)+t,t):e<1?(t=" cm",t=(e*=100).toPrecision(3)+t,t):e>1e3?(t=" km",t=e.toPrecision(3)+t,t):(t=e.toPrecision(3)+t,t)},stripHTMLtagsFromString:e=>e.replace(/(<([^>]+)>)/gi,""),requestFullscreen:()=>{let e=document.documentElement;return e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen(),!0},downloadBlob:(e,t)=>{void 0!==t&&(n._dlink.href=URL.createObjectURL(e),n._dlink.download=t,n._dlink.click())},downloadText:(e,t)=>{n.downloadBlob(new Blob([e],{type:"text/plain"}),t)},downloadJSONobj:(e,t)=>{n.downloadText(JSON.stringify(e),t)},downloadArrayBuffer:(e,t)=>{n.downloadBlob(new Blob([e],{type:"application/octet-stream"}),t)},downloadImageFromCanvas:(e,t)=>{if(!e)return;let o=e.toDataURL();ATON.Utils._dlink.href=o,ATON.Utils._dlink.download=t,ATON.Utils._dlink.click()},exportNode:(e,t)=>{let o=n.getFileExtension(t);if(!(o.length<1)){if("glb"===o||"gltf"===o){let i={binary:"glb"===o};void 0===n.exporterGLTF&&(n.exporterGLTF=new THREE.GLTFExporter),n.exporterGLTF.parse(e,(e=>{e instanceof ArrayBuffer?n.downloadArrayBuffer(e,t):(console.log(e),n.downloadJSONobj(e,t))}),i)}if("obj"===o){void 0===n.exporterOBJ&&(n.exporterOBJ=new THREE.OBJExporter);let o=n.exporterOBJ.parse(e);n.downloadText(o,t)}"usdz"===o&&(void 0===n.exporterUSDZ&&(n.exporterUSDZ=new THREE.USDZExporter),$("#idLoader").show(),n.exporterUSDZ.parse(e).then((e=>{n.downloadArrayBuffer(e,t),$("#idLoader").hide()})))}},takeScreenshot:(e,t)=>{let o=new Image;console.log("Screenshot with size:"+e),ATON.Nav._camera.aspect=1,ATON.Nav._camera.updateProjectionMatrix(),ATON._renderer.setSize(e,e),ATON._renderer.render(ATON._mainRoot,ATON.Nav._camera);let i=ATON._renderer.domElement;if(ATON.FX.composer){if(ATON.FX.composer.setSize(e,e),ATON.FX.passes[ATON.FX.PASS_AA]){let t=ATON.FX.passes[ATON.FX.PASS_AA].material.uniforms;t&&t.resolution.value.set(1/e,1/e)}ATON.FX.composer.render(),i=ATON.FX.composer.renderer.domElement}let r=ATON._renderer.domElement.toDataURL();return o.src=r,t&&(n._dlink.href=r.replace("image/png","image/octet-stream"),n._dlink.download=t,n._dlink.click()),ATON._onResize(),o},assignLightProbeToMesh:(e,t)=>{void 0!==e&&void 0!==t&&(t.noLP||(t.userData.LP=e))},clearLightProbeFromMesh:e=>{void 0!==e&&(e.noLP||(e.userData.LP=null))},vibrate:e=>{void 0===e&&(e=100),window.navigator.vibrate(e)},createATONCube:e=>{let t=new THREE.BoxGeometry(1,1,1),o=new THREE.MeshStandardMaterial;n.textureLoader.load(ATON.PATH_RES+"models/aton-cube.jpg",(e=>{e.colorSpace=ATON._stdEncoding,o.map=e}));let i=ATON.createSceneNode(e);return i.add(new THREE.Mesh(t)),i.setMaterial(o),i.enablePicking(),i},createATONCubePBR:e=>{let t=new THREE.BoxGeometry(1,1,1),o=new THREE.MeshStandardMaterial;o.metalness=1,n.textureLoader.load(ATON.PATH_RES+"models/aton-cube.jpg",(e=>{e.colorSpace=ATON._stdEncoding,o.map=e})),n.textureLoader.load(ATON.PATH_RES+"models/aton-cube-pbr.jpg",(e=>{e.colorSpace=ATON._stdEncoding,o.metalnessMap=e,o.roughnessMap=e})),n.textureLoader.load(ATON.PATH_RES+"models/aton-cube-nrm.png",(e=>{e.colorSpace=ATON._stdEncoding,o.normalMap=e}));let i=ATON.createSceneNode(e);return i.add(new THREE.Mesh(t)),i.setMaterial(o),i.enablePicking(),i},createGround:(e,t,o)=>{void 0===t&&(t=1),void 0===o&&(o=1);let i=new THREE.PlaneGeometry(t,o),r=new THREE.MeshStandardMaterial;void 0!==e&&n.textureLoader.load(e,(e=>{e.colorSpace=ATON._stdEncoding,r.map=e}));let a=ATON.createSceneNode().rotateX(.5*-Math.PI);return a.add(new THREE.Mesh(i,r)),a.enablePicking(),a},convertByteArrayToHexString:e=>e.reduce(((e,t)=>e+t.toString(16).padStart(2,"0")),""),convertHexStringToByteArray:e=>Uint8Array.from(e.match(/.{1,2}/g).map((e=>parseInt(e,16))))};const s=n;let l={MODE_ADD:0,MODE_DEL:1,FLOAT_PREC:5,init:()=>{l.currID=void 0,l.currData=void 0,l._bEdit=!1,l._bLoading=!1,l._title=void 0,l._descr=void 0,l.initBaseParsers()},setEditMode:e=>{l._bEdit=e,console.log("Edit mode:"+e)},load:(e,t,o)=>(l._bLoading=!0,console.log("Loading Scene: "+t),$.getJSON(e,(e=>{l.currData=e,l.currID=t,l._bLoading=!1,l.parseScene(e),o&&o(),ATON.fire("SceneJSONLoaded",t)}))),clearScene:()=>{if(!(ATON._rootVisible.children.length<=0)){ATON._rootVisible.removeChildren();for(let e in ATON.snodes)e!==ATON.ROOT_NID&&delete ATON.snodes[e];ATON.MRes.clear(),ATON.XPFNetwork.clear()}},clearSemantics:()=>{if(!(ATON._rootSem.children.length<=0)){ATON._rootSem.removeChildren();for(let e in ATON.semnodes)e!==ATON.ROOT_NID&&delete ATON.semnodes[e];ATON.SUI.gSemIcons&&ATON.SUI.gSemIcons.removeChildren(),ATON.SemFactory.stopCurrentConvex(),ATON.SemFactory.init()}},clear:()=>{l.clearScene(),l.clearSemantics(),ATON.Nav.clear()},parseScene:e=>{if(void 0!==(e=void 0===e?l.currData:e))for(let t in e)l._jsonParsers[t]&&l._jsonParsers[t](e[t])},getJSONchildren:(e,t)=>{let o;void 0===t&&(t=ATON.NTYPES.SCENE);let i=[];if(t===ATON.NTYPES.SEM&&(o=ATON.getSemanticNode(e)),t===ATON.NTYPES.SCENE&&(o=ATON.getSceneNode(e)),void 0!==o){for(let e in o.children){let t=o.children[e];void 0!==t.nid&&i.push(t.nid)}return i}},getJSONgraphEdges:e=>{void 0===e&&(e=ATON.NTYPES.SCENE);let t=ATON.snodes;e===ATON.NTYPES.SEM&&(t=ATON.semnodes),e===ATON.NTYPES.UI&&(t=ATON.uinodes);let o={};for(let e in t){let i=t[e];i&&i.parent&&i.parent.nid&&(void 0===o[i.parent.nid]&&(o[i.parent.nid]=[]),o[i.parent.nid].push(i.nid))}return o},getJSONsemanticSpheresList:e=>{let t=ATON.getSemanticNode(e);if(void 0===t)return;let o=[];for(let e in t.children){let i=t.children[e];i.type&&o.push([parseFloat(i.position.x.toPrecision(l.FLOAT_PREC)),parseFloat(i.position.y.toPrecision(l.FLOAT_PREC)),parseFloat(i.position.z.toPrecision(l.FLOAT_PREC)),parseFloat(i.scale.x.toPrecision(l.FLOAT_PREC))])}return o},getJSONsemanticConvexShapes:e=>{let t=ATON.getSemanticNode(e);if(void 0===t)return;let o=[];for(let e in t.children){let i=t.children[e];i.userData._convexPoints&&o.push(i.userData._convexPoints)}return o},_applyJSONTransformToNode:(e,t)=>{if(void 0!==e&&void 0!==t){if(e.bUseGeoCoords)return t.bUseGeoCoords=!0,void(e.scale&&t.setScale(e.scale[0],e.scale[1],e.scale[2]));e.autocenter?t.autocenter=!0:e.position&&t.setPosition(e.position[0],e.position[1],e.position[2]),e.rotation&&t.setRotation(e.rotation[0],e.rotation[1],e.rotation[2]),e.scale&&t.setScale(e.scale[0],e.scale[1],e.scale[2]),e.list&&Array.isArray(e.list)}},initBaseParsers:()=>{l._jsonParsers={},l._jsonParsers.title=e=>{void 0!==e&&l.setTitle(e)},l._jsonParsers.description=e=>{void 0!==e&&l.setDescription(e)},l._jsonParsers.fx=e=>{e.ao&&(ATON.FX.togglePass(ATON.FX.PASS_AO,!0),e.ao.i&&ATON.FX.setAOintensity(parseFloat(e.ao.i))),e.bloom&&(ATON.FX.togglePass(ATON.FX.PASS_BLOOM,!0),e.bloom.i&&ATON.FX.setBloomStrength(parseFloat(e.bloom.i)),e.bloom.t&&ATON.FX.setBloomThreshold(parseFloat(e.bloom.t))),e.dof&&(ATON.FX.togglePass(ATON.FX.PASS_DOF,!0),e.dof.f&&ATON.FX.setDOFfocus(parseFloat(e.dof.f)))},l._jsonParsers.environment=e=>{let t=e.mainpano;if(e.mainpano&&(t.url&&ATON.setMainPanorama(t.url),t.rotation&&ATON.setMainPanoramaRotation(t.rotation)),e.bgcolor){let t=new THREE.Color(e.bgcolor[0],e.bgcolor[1],e.bgcolor[2]);ATON.setBackgroundColor(t)}let o=e.mainlight;o?(o.direction&&ATON.setMainLightDirection(new THREE.Vector3(o.direction[0],o.direction[1],o.direction[2])),ATON._dMainL?(o.color&&(ATON._dMainL.color=new THREE.Color(o.color[0],o.color[1],o.color[2])),o.intensity&&(ATON._dMainL.intensity=o.intensity),void 0!==o.shadows?ATON.toggleShadows(o.shadows):ATON.toggleShadows(!1)):ATON.toggleMainLight(!1)):ATON.toggleMainLight(!1);let i=e.lightprobes;if(i&&(void 0!==i.auto&&ATON.setAutoLP(i.auto),i.list))for(let e in i.list){let t=i.list[e],o=new ATON.LightProbe(t.res);t.pos&&o.setPosition(parseFloat(t.pos[0]),parseFloat(t.pos[1]),parseFloat(t.pos[2])),t.near&&o.setNear(parseFloat(t.near)),t.far&&o.setFar(parseFloat(t.far)),ATON.addLightProbe(o),console.log(o)}e.exposure&&ATON.setExposure(e.exposure)},l._jsonParsers.soundscape=e=>{void 0!==e&&e.global&&ATON.setGlobalAudio(e.global.url,e.global.loop)},l._jsonParsers.navmode=e=>{void 0!==e&&ATON.Nav.setNavMode(e)},l._jsonParsers.locomotionGraph=e=>{if(void 0!==e){for(let t in e){let o=e[t];o.pos&&ATON.Nav.addLocomotionNode(parseFloat(o.pos[0]),parseFloat(o.pos[1]),parseFloat(o.pos[2]),!0)}ATON.Nav.setFirstPersonControl(),ATON.Nav.toggleLocomotionValidator(!1)}},l._jsonParsers.measurements=e=>{if(void 0!==e)for(let t in e){let o=e[t];if(o.points&&6===o.points.length){let e=new THREE.Vector3(parseFloat(o.points[0]),parseFloat(o.points[1]),parseFloat(o.points[2])),t=new THREE.Vector3(parseFloat(o.points[3]),parseFloat(o.points[4]),parseFloat(o.points[5]));ATON.SUI.addMeasurementPoint(e),ATON.SUI.addMeasurementPoint(t)}}},l._jsonParsers.viewpoints=e=>{if(void 0!==e)for(let t in e){let o=e[t];"home"===t?ATON.Nav.setHomePOV((new ATON.POV).setPosition(o.position[0],o.position[1],o.position[2]).setTarget(o.target[0],o.target[1],o.target[2]).setFOV(o.fov)):new ATON.POV(t).setPosition(o.position[0],o.position[1],o.position[2]).setTarget(o.target[0],o.target[1],o.target[2]).setFOV(o.fov)}},l._jsonParsers.scenegraph=e=>{if(void 0===e)return;let t=e.nodes,o=e.edges;for(let e in t){let o=t[e],i=ATON.getOrCreateSceneNode(e).removeChildren();l._applyJSONTransformToNode(o.transform,i);let r=o.urls;if(r&&(Array.isArray(r)?r.forEach((e=>{i.load(e)})):i.load(r)),o["cesium.ion"]){let e=o["cesium.ion"];ATON.MRes.loadCesiumIONAsset(e,i)}if(o.stream){let t,r=o.stream;if(r.src.startsWith("#")){let e=parseInt(r.src.substring(1));t=ATON.MediaFlow.getOrCreateVideoStream(e,void 0,!0)}else{let o=ATON.Utils.resolveCollectionURL(r.src);t=ATON.MediaFlow.getOrCreateVideoStream(e,o)}if(r.chromakey){let e=r.chromakey.color;e&&t.matStream.uniforms.keycolor.value.set(parseFloat(e[0]),parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3])),r.chromakey.smoothness&&(t.matStream.uniforms.smoothness.value=parseFloat(r.chromakey.smoothness)),r.chromakey.spill&&(t.matStream.uniforms.spill.value=parseFloat(r.chromakey.spill)),r.chromakey.similarity&&(t.matStream.uniforms.similarity.value=parseFloat(r.chromakey.similarity))}if(!o.urls){let e=new THREE.PlaneGeometry(1,1),o=new THREE.Mesh(e);o.scale.x=1,o.scale.y=-1,t.el.addEventListener("loadedmetadata",(e=>{let i=t.el.videoWidth/t.el.videoHeight;o.scale.x=i,o.scale.y=-1})),ATON.Utils.modelVisitor(i,o),i.add(o),ATON._bqScene=!0,i.setPickable(!0),i.dirtyBound()}i.setMaterial(t.matStream)}o.shadowcast&&i.setShadowCast(o.shadowcast),o.shadowreceive&&i.setShadowCast(o.shadowreceive),o.toYup&&i.setYup(),o.keywords&&(i.kwords=o.keywords)}for(let e in o){let t=o[e],i=ATON.getSceneNode(e);if(void 0!==i)for(let e in t){let o=t[e],r=ATON.getSceneNode(o);void 0!==r&&r.attachTo(i)}}for(let e in t){let o=t[e],i=ATON.getSceneNode(e);if(void 0!==i&&(void 0!==o.show&&(o.show?(i.show(),console.log("show "+e)):(i.hide(),console.log("hide "+e))),o.material)){let e;"string"==typeof o.material?e=ATON.MatHub.materials[o.material]:o.material.fragmentShader||o.material.vertexShader?(o.material.vertexShader||(o.material.vertexShader=ATON.MatHub.getDefVertexShader()),e=new THREE.ShaderMaterial(o.material)):e=new THREE.MeshStandardMaterial(o.material),e&&i.setMaterial(e)}}},l._jsonParsers.semanticgraph=e=>{if(void 0===e)return;let t=e.nodes,o=e.edges;for(let e in t){let o=t[e],i=ATON.getOrCreateSemanticNode(e).removeChildren(),r=o.urls;r&&(Array.isArray(r)?r.forEach((e=>{i.load(e)})):i.load(r)),o.toYup&&i.setYup(),o.description&&i.setDescription(o.description),o.audio&&i.setAudio(o.audio),o.keywords&&(i.kwords=o.keywords);let a=o.spheres;if(Array.isArray(a))for(let t in a){let o=a[t],i=new THREE.Vector3(parseFloat(o[0]),parseFloat(o[1]),parseFloat(o[2]));ATON.SemFactory.createSphere(e,i,parseFloat(o[3]))}let n=o.convexshapes;if(Array.isArray(n))for(let t in n){let o=n[t],i=[];for(let e=0;e{if(ATON.Nav.setFirstPersonControl(),e.list){let t=e.list,o=t.length;for(let e=0;e{ATON.XPFNetwork.setHomeXPF(0),ATON.XPFNetwork.requestTransitionByIndex(0,0)}))}},addSceneParser:(e,t)=>{l._jsonParsers[e]=t},patch:(e,t,o)=>{if(l._bLoading||!l._bEdit)return;if(void 0===e)return;void 0===t&&(t=l.MODE_ADD);let i=l.currID,r={};r.data=e,r.mode=t===l.MODE_DEL?"DEL":"ADD";let a=JSON.stringify(r);e=null,r=null,$.ajax({url:ATON.PATH_RESTAPI2+"scenes/"+i,type:"PATCH",data:a,contentType:"application/json; charset=utf-8",dataType:"json",success:e=>{e&&(l.currData=e),o&&o()}})}};l.sendEdit=l.patch,l.setVisibility=(e,t)=>{l.currData.visibility=e,l.sendEdit({visibility:e},ATON.SceneHub.MODE_ADD,t)},l.currSceneHasHomeConfig=()=>void 0!==l.currData&&void 0!==l.currData.viewpoints&&void 0!==l.currData.viewpoints.home,l.setTitle=e=>{l._title=e},l.getTitle=()=>l._title,l.setDescription=e=>{l._descr=e},l.getDescription=()=>l._descr;const d=l;let c={init:()=>{c._listener=new THREE.AudioListener,c._loader=new THREE.AudioLoader,c._bGenAuPlaying=!1},playOnceGlobally:(e,t)=>{if(t&&c._bGenAuPlaying)return;e=ATON.Utils.resolveCollectionURL(e);let o=new THREE.Audio(ATON.AudioHub._listener);return c._loader.load(e,(e=>{o.setBuffer(e),o.play(),t&&(c._bGenAuPlaying=!0)})),t&&(o.onEnded=()=>{c._bGenAuPlaying=!1}),o}};const u=c;class p extends THREE.EventDispatcher{constructor(e){super(),!1===window.isSecureContext&&console.error("DeviceOrientationEvent is only available in secure contexts (https)"),this._zee=new THREE.Vector3(0,0,1),this._euler=new THREE.Euler,this._q0=new THREE.Quaternion,this._q1=new THREE.Quaternion(-Math.sqrt(.5),0,0,Math.sqrt(.5)),this._changeEvent={type:"change"};const t=this,o=new THREE.Quaternion;this.object=e,this.object.rotation.reorder("YXZ"),this.enabled=!0,this.deviceOrientation={},this.screenOrientation=0,this.alphaOffset=0;const i=function(e){t.deviceOrientation=e},r=function(){t.screenOrientation=window.orientation||0};this.connect=function(){r(),void 0!==window.DeviceOrientationEvent&&"function"==typeof window.DeviceOrientationEvent.requestPermission?window.DeviceOrientationEvent.requestPermission().then((function(e){"granted"==e&&(window.addEventListener("orientationchange",r),window.addEventListener("deviceorientation",i))})).catch((function(e){console.error("Unable to use DeviceOrientation API:",e)})):(window.addEventListener("orientationchange",r),window.addEventListener("deviceorientation",i)),t.enabled=!0},this.disconnect=function(){window.removeEventListener("orientationchange",r),window.removeEventListener("deviceorientation",i),t.enabled=!1},this.update=function(){if(!1===t.enabled)return;const e=t.deviceOrientation;if(e){const i=e.alpha?THREE.MathUtils.degToRad(e.alpha)+t.alphaOffset:0,r=e.beta?THREE.MathUtils.degToRad(e.beta):0,a=e.gamma?THREE.MathUtils.degToRad(e.gamma):0,n=t.screenOrientation?THREE.MathUtils.degToRad(t.screenOrientation):0;!function(e,o,i,r,a){t._euler.set(i,o,-r,"YXZ"),e.setFromEuler(t._euler),e.multiply(t._q1),e.multiply(t._q0.setFromAxisAngle(t._zee,-a))}(t.object.quaternion,i,r,a,n),8*(1-o.dot(t.object.quaternion))>1e-6&&(o.copy(t.object.quaternion),t.dispatchEvent(t._changeEvent))}},this.dispose=function(){t.disconnect()},this.connect()}}const _=p;let m={STD_FOV:50,STD_NEAR:.01,STD_FAR:800,FP_EPS:.01,STD_POV_TRANS_DURATION:2,STD_LOCNODE_SIZE:.5,MIN_LOC_VALID_DIST:1.5,MODE_ORBIT:0,MODE_FP:1,MODE_DEVORI:2,LocomotionNode:class{constructor(e){this.pos=new THREE.Vector3(0,0,0),this.id=e,this._iXPF=void 0,this._sui=void 0}setLocation(e,t,o){return e instanceof THREE.Vector3?this.pos.copy(e):this.pos.set(e,t,o),this._sui&&this._sui.position.copy(this.pos),this}getLocation(){return this.pos}realizeSUI(e){return void 0===ATON.SUI.gLocNodes||(this._sui=new THREE.Sprite(ATON.SUI.getOrCreateSpriteWalk()),this._sui.position.copy(this.pos),this._sui.scale.set(ATON.Nav.STD_LOCNODE_SIZE,ATON.Nav.STD_LOCNODE_SIZE,ATON.Nav.STD_LOCNODE_SIZE),ATON.SUI.gLocNodes.add(this._sui)),this}toggleSUI(e){return void 0===this._sui||(this._sui.visible=e),this}},init:()=>{m._mode=void 0,m.POVtransitionDuration=m.STD_POV_TRANS_DURATION,m._rotSpeedOrbit=.4,m._rotSpeedFP=-.2,m._inertia=.08,m._bControl=!0,m._bLocValidator=!0,m._bInteracting=!1,m._prevMode=void 0,m.setOrbitControl(),m._currPOV=(new ATON.POV).setPosition(0,0,0).setTarget(1,0,0).setFOV(ATON.Nav.STD_FOV),m._fromPOV=new ATON.POV,m._reqPOV=new ATON.POV,m.homePOV=void 0,m._tPOVcall=-1,m._tPOVprogress=0,m.povlist={},m._vDir=new THREE.Vector3(1,0,0),m._qOri=new THREE.Quaternion,m._lastPos=new THREE.Vector3(0,0,0),m._lastOri=new THREE.Quaternion,m._dOri=0,m._dPos=0,m._motionAmt=0,m._motionDir=new THREE.Vector3(0,1,0),m._bValidLocomotion=!1,m._locNodes=[],m._prevLN=void 0},getCurrentEyeLocation:()=>m._currPOV.pos,getCurrentDirection:()=>m._vDir,copyCurrentPOV:()=>{let e=new ATON.POV;return e.pos.copy(m._currPOV.pos),e.target.copy(m._currPOV.target),e.fov=m._currPOV.fov,e},addPOV:(e,t)=>{if(void 0!==e)return e.as(t),e},clearPOVs:()=>{for(let e in ATON.Nav.povlist)delete m.povlist[e]},isTransitioning:()=>m._tPOVcall>=0,currentQueryValidForLocomotion:()=>m._bValidLocomotion,locomotionValidator:()=>{if(void 0===ATON._queryDataScene)return void(m._bValidLocomotion=!1);let e=ATON._queryDataScene,t=(e.p,e.n);e.d<=m.MIN_LOC_VALID_DIST?m._bValidLocomotion=!1:t?t.y<=.7?m._bValidLocomotion=!1:m._bValidLocomotion=!0:m._bValidLocomotion=!1},toggleLocomotionValidator:e=>{e?m._bLocValidator=!0:(m._bLocValidator=!1,m._bValidLocomotion=!1)},addLocomotionNode:(e,t,o,i)=>{let r=(new m.LocomotionNode).setLocation(e,t,o);return i&&r.realizeSUI(),m._locNodes.push(r),ATON.fire("LocomotionNodeAdded",r),r},getLocomotionNodeByIndex:e=>m._locNodes[e],clearLocomotionNodes:()=>{m._locNodes=[],m._prevLN=void 0,ATON.SUI.gLocNodes&&ATON.SUI.gLocNodes.removeChildren()},getLocomotionNodeInSight:()=>{let e=m._locNodes.length;if(e<=0)return;if(m.isTransitioning())return;let t,o,i=m._currPOV.pos,r=m._vDir;void 0===m._dirLNode&&(m._dirLNode=new THREE.Vector3);for(let a=0;a.8){let e=i.distanceToSquared(m._posLNode);e>.3&&(void 0===o||e{if(void 0===e)return;if(m._mode===m.MODE_ORBIT)return;let o=ATON.Nav._vDir,i=(new ATON.POV).setPosition(e.pos).setTarget(e.pos.x+o.x,e.pos.y+o.y,e.pos.z+o.z).setFOV(m._currPOV.fov);e.toggleSUI(!1),void 0!==m._prevLN&&m._prevLN.toggleSUI(!0),m.requestPOV(i,t),m._prevLN=e,ATON.fire("LocomotionNodeRequested",e)},requestTransitionToLocomotionNodeInSightIfAny:e=>{let t=ATON.XPFNetwork.getNextXPFindex();if(void 0!==t)return m.requestTransitionToLocomotionNode(ATON.XPFNetwork._list[t]._lnode,e),!0;let o=ATON.Nav.getLocomotionNodeInSight();if(void 0===o)return!1;let i=m._locNodes[o];return m.requestTransitionToLocomotionNode(i,e),!0},requestDeltaRotation:(e,t,o)=>{if(ATON.XR._bPresenting)return;let i=new THREE.Vector3,r=new THREE.Vector3;i.crossVectors(m._vDir,THREE.Object3D.DEFAULT_UP),r.x=m._currPOV.target.x+i.x*e,r.y=m._currPOV.target.y+t,r.z=m._currPOV.target.z+i.z*e;let a=new ATON.POV;a.setTarget(r),a.setPosition(ATON.Nav._currPOV.pos),ATON.Nav.requestPOV(a,o)},setUserControl:e=>{void 0!==e&&e!==m._bControl&&(m._bControl=e,void 0!==m._controls&&(m._controls.enabled=e),m._cOrbit&&(m._cOrbit.enabled=e),m._cFirstPerson&&(m._cFirstPerson.enabled=e),console.log("Nav controls: "+m._bControl))},toggleUserControl:()=>{m.setUserControl(!m._bControl)},isUserControlEnabled:()=>m._bControl,isOrbit:()=>!ATON.XR._bPresenting&&m._mode===m.MODE_ORBIT,isFirstPerson:()=>!ATON.XR._bPresenting&&m._mode===m.MODE_FP,isDevOri:()=>!ATON.XR._bPresenting&&m._mode===m.MODE_DEVORI,setNavMode:e=>{void 0!==e&&(e===m.MODE_ORBIT&&m.setOrbitControl(),e===m.MODE_FP&&m.setFirstPersonControl(),e===m.MODE_DEVORI&&m.setDeviceOrientationControl())},restorePreviousNavMode:()=>{void 0===m._prevMode&&m.setOrbitControl(),m.setNavMode(m._prevMode)},_updCamera:e=>{if(void 0===e&&(e=m._camera),ATON.FX.composer){let t=ATON.FX.composer.passes;if(t)for(let o=0;o{if(!ATON.XR.isPresenting()){if(m._prevMode=m._mode,m._mode=m.MODE_ORBIT,m._bInteracting=!1,ATON.fire("NavInteraction",!1),void 0===m._cOrbit){m._camOrbit=new THREE.PerspectiveCamera(m.STD_FOV,window.innerWidth/window.innerHeight,m.STD_NEAR,m.STD_FAR),m._camOrbit.layers.enableAll(),m._cOrbit=new THREE.OrbitControls(m._camOrbit,ATON._renderer.domElement);let e=m._cOrbit;e.rotateSpeed=m._rotSpeedOrbit,e.enablePan=!0,m._inertia>0&&(e.enableDamping=!0,e.dampingFactor=m._inertia),e.screenSpacePanning=!0,e.enableZoom=!0,e.minDistance=.03,e.maxDistance=300,m._bControl||(e.enabled=!1),e.addEventListener("start",(()=>{m._bInteracting=!0,ATON.fire("NavInteraction",!0)})),e.addEventListener("end",(()=>{m._bInteracting=!1,ATON.fire("NavInteraction",!1)}))}m._controls=m._cOrbit,m._camera=m._camOrbit,ATON.AudioHub._listener&&m._camera.children.length<1&&m._camera.add(ATON.AudioHub._listener),m._updCamera(),m._controls.update(),m._currPOV&&m.syncCurrCamera(),ATON._onResize(),ATON.toggleCenteredQuery(!1),ATON.fire("NavMode",m._mode)}},setFirstPersonControl:()=>{if(!ATON.XR.isPresenting()){if(m._prevMode=m._mode,ATON.SUI.getSelectorRadius()>.1&&ATON.SUI.setSelectorRadius(.1),m._mode=m.MODE_FP,m._bInteracting=!1,ATON.fire("NavInteraction",!1),void 0===m._cFirstPerson){m._camFP=new THREE.PerspectiveCamera(m.STD_FOV,window.innerWidth/window.innerHeight,m.STD_NEAR,m.STD_FAR),m._camFP.layers.enableAll(),m._cFirstPerson=new THREE.OrbitControls(m._camFP,ATON._renderer.domElement);let e=m._cFirstPerson;e.enableZoom=!1,e.enablePan=!1,e.rotateSpeed=m._rotSpeedFP,m._inertia>0&&(e.enableDamping=!0,e.dampingFactor=m._inertia),e.target.copy(m._camera.position),e.minDistance=.01,e.maxDistance=.01,m._bControl||(e.enabled=!1)}m._controls=m._cFirstPerson,m._camera=m._camFP,ATON.AudioHub._listener&&m._camera.children.length<1&&m._camera.add(ATON.AudioHub._listener),m._updCamera(),m._controls.update(),m._currPOV&&m.syncCurrCamera(),ATON._onResize(),ATON.toggleCenteredQuery(!1),ATON.fire("NavMode",m._mode)}},setDeviceOrientationControl:()=>{ATON.Utils.isMobile()&&(m._prevMode=m._mode,m._mode=m.MODE_DEVORI,m._bInteracting=!1,ATON.fire("NavInteraction",!1),ATON._screenPointerCoords.set(0,0),void 0===m._cDevOri&&(m._camDevOri=new THREE.PerspectiveCamera(m.STD_FOV,window.innerWidth/window.innerHeight,m.STD_NEAR,m.STD_FAR),m._camDevOri.layers.enableAll(),m._cDevOri=new _(m._camDevOri,ATON._renderer.domElement),m._cDevOri.alphaOffset=0),m._controls=m._cDevOri,m._camera=m._camDevOri,ATON.AudioHub._listener&&m._camera.children.length<1&&m._camera.add(ATON.AudioHub._listener),m._updCamera(),m._controls.update(),m._currPOV&&m.syncCurrCamera(),ATON._onResize(),ATON.toggleCenteredQuery(!0),ATON.fire("NavMode",m._mode))},useAbsoluteOrientation:e=>{m._cDevOri},setMotionAmount:e=>{m._motionAmt=e},setMotionDirection:e=>{m._motionDir.copy(e)},stop:()=>{m._motionAmt=0},setFOV:e=>{if(ATON.XR.isPresenting())return;m._currPOV.fov=e;let t=m._camera;t.fov=e,t.updateProjectionMatrix()},getFOV:()=>m._currPOV.fov,_deltaMotions:()=>{m._dOri=m._lastOri.angleTo(ATON.Nav._qOri),m._dPos=m._lastPos.distanceToSquared(m._currPOV.pos),m._lastPos.copy(m._currPOV.pos),m._lastOri.copy(ATON.Nav._qOri)},syncCurrPOV:()=>{if(ATON.XR.isPresenting()){const e=ATON._renderer.xr.getCamera().cameras[0];return m._currPOV.pos.copy(e.position),m._qOri.copy(e.quaternion),e.getWorldDirection(m._vDir),m._currPOV.pos.x+=ATON.XR.rig.position.x,m._currPOV.pos.y+=ATON.XR.rig.position.y,m._currPOV.pos.z+=ATON.XR.rig.position.z,void m._deltaMotions()}const e=m._controls,t=m._camera;if(t.getWorldDirection(m._vDir),t.getWorldQuaternion(m._qOri),m._deltaMotions(),m._mode!==m.MODE_DEVORI){if(m._mode===m.MODE_FP)return m._currPOV.pos.copy(e.target),m._currPOV.target.x=m._currPOV.pos.x+m._vDir.x,m._currPOV.target.y=m._currPOV.pos.y+m._vDir.y,void(m._currPOV.target.z=m._currPOV.pos.z+m._vDir.z);m._currPOV.pos.copy(t.position),m._currPOV.target.copy(e.target)}else m._currPOV.pos.copy(t.position)},applyPOVconstraints:e=>{},handlePOV:()=>{ATON.XR.isPresenting()?m.handleXRtransition():m.handlePOVtransition(),m.handleMotion(),m.applyPOVconstraints(m._currPOV)},handleMotion:()=>{if(m.isTransitioning())return;if(0==m._motionAmt)return;ATON.XR.controller0&&ATON.XR.controller0.visible?(ATON.XR.controller0.getWorldDirection(m._motionDir),m._motionDir.negate()):m._motionDir.copy(m._vDir);let e=m._motionAmt*ATON._dt,t=m._motionDir.x*e,o=m._motionDir.y*e,i=m._motionDir.z*e;m._currPOV.pos.x+=t,m._currPOV.pos.y+=o,m._currPOV.pos.z+=i,m._currPOV.target.x+=t,m._currPOV.target.y+=o,m._currPOV.target.z+=i},handlePOVtransition:()=>{if(!(m._tPOVcall<0)){if(m.POVtransitionDuration<=0?m._tPOVprogress=1:m._tPOVprogress=(ATON._clock.elapsedTime-m._tPOVcall)/m.POVtransitionDuration,m._tPOVprogress>=1)return m._tPOVcall=-1,m._currPOV.pos.copy(m._reqPOV.pos),m._currPOV.target.copy(m._reqPOV.target),m._currPOV.fov=m._reqPOV.fov,void ATON.fire("POVTransitionCompleted",m._reqPOV.id);var e;m._tPOVprogress=(e=m._tPOVprogress,(1-Math.cos(e*Math.PI))/2),m._currPOV.pos.lerpVectors(m._fromPOV.pos,m._reqPOV.pos,m._tPOVprogress),m._currPOV.target.lerpVectors(m._fromPOV.target,m._reqPOV.target,m._tPOVprogress),m._fromPOV.fov&&m._reqPOV.fov&&(m._currPOV.fov=THREE.MathUtils.lerp(m._fromPOV.fov,m._reqPOV.fov,m._tPOVprogress),m._camera.fov=m._currPOV.fov,m._camera.updateProjectionMatrix())}},handleXRtransition:()=>{if(!(m._tPOVcall<0)){if(m.POVtransitionDuration<=0?m._tPOVprogress=1:m._tPOVprogress=(ATON._clock.elapsedTime-m._tPOVcall)/m.POVtransitionDuration,m._tPOVprogress>=1)return m._tPOVcall=-1,ATON.XR._currPos.copy(ATON.XR._reqPos),void ATON.fire("POVTransitionCompleted",m._reqPOV.id);ATON.XR._currPos.lerpVectors(ATON.XR._fromPos,ATON.XR._reqPos,m._tPOVprogress)}},syncCurrCamera:()=>{if(ATON.XR.isPresenting())return;let e=m._controls,t=m._camera,o=m._currPOV.pos,i=m._currPOV.target;m._mode!==m.MODE_DEVORI?(m._vDir.subVectors(i,o),m._vDir.normalize(),m._mode===m.MODE_FP?(e.target.copy(o),t.position.x=e.target.x-m._vDir.x*m.FP_EPS,t.position.y=e.target.y-m._vDir.y*m.FP_EPS,t.position.z=e.target.z-m._vDir.z*m.FP_EPS):(t.position.copy(o),e.target.copy(i))):t.position.copy(o)},update:()=>{m.syncCurrPOV(),m.handlePOV(),m.syncCurrCamera()},requestPOV:(e,t,o)=>{ATON._tPOVcall>=0||void 0!==e&&(ATON.XR._bPresenting&&"immersive-ar"===ATON.XR._sessionType||(m.POVtransitionDuration=void 0!==t?t:m.STD_POV_TRANS_DURATION,ATON.XR.isPresenting()?(m._reqPOV.pos.copy(e.pos?e.pos:m._currPOV.pos),m._fromPOV.pos.copy(m._currPOV.pos),ATON.XR._reqPos.copy(e.pos?e.pos:m._currPOV.pos),ATON.XR._fromPos.copy(ATON.XR._currPos)):(m._reqPOV.pos.copy(e.pos?e.pos:m._currPOV.pos),m._reqPOV.target.copy(e.target?e.target:m._currPOV.target),m._reqPOV.fov=e.fov?e.fov:m._currPOV.fov,m._fromPOV.pos.copy(m._currPOV.pos),m._fromPOV.target.copy(m._currPOV.target),m._fromPOV.fov=m._currPOV.fov),o&&(e.pos&&(m._reqPOV.pos.x*=ATON._worldScale,m._reqPOV.pos.y*=ATON._worldScale,m._reqPOV.pos.z*=ATON._worldScale,ATON.XR.isPresenting()&&(ATON.XR._reqPos.x*=ATON._worldScale,ATON.XR._reqPos.y*=ATON._worldScale,ATON.XR._reqPos.z*=ATON._worldScale)),e.target&&(m._reqPOV.target.x*=ATON._worldScale,m._reqPOV.target.y*=ATON._worldScale,m._reqPOV.target.z*=ATON._worldScale)),m._tPOVcall=ATON._clock.elapsedTime,ATON.fire("POVTransitionRequested",e.id)))},requestPOVbyBound:(e,t)=>{if(void 0===e)return;let o=new THREE.Vector3,i=3*e.radius;o.x=e.center.x-i*m._vDir.x,o.y=e.center.y-i*m._vDir.y,o.z=e.center.z-i*m._vDir.z;let r=(new ATON.POV).setPosition(o).setTarget(e.center);m.requestPOV(r,t)},requestPOVbyNode:(e,t)=>{if(void 0===e)return;let o=e.getBound();m.requestPOVbyBound(o,t)},requestPOVbyID:(e,t)=>{if(void 0===e)return;let o=m.povlist[e];void 0!==o&&m.requestPOV(o,t)},requestRetarget:(e,t,o)=>{let i=new THREE.Vector3;if(void 0===t)i.lerpVectors(e,m._currPOV.pos,.8);else{let o=e.distanceTo(m._currPOV.pos);o*=.5,i.x=e.x+t.x*o,i.y=e.y+t.y*o,i.z=e.z+t.z*o}let r=e.distanceTo(i);ATON.FX.setDOFfocus(r);let a=(new ATON.POV).setPosition(i).setTarget(e).setFOV(m._currPOV.fov);m.requestPOV(a,o),console.log(a)},computeDefaultHome:(e,t)=>{void 0===e&&(e=new THREE.Vector3(1,.7,1)),void 0===t&&(t=ATON.getRootScene().getBound());let o=new THREE.Vector3(t.center.x+t.radius*e.x*1.5,t.center.y+t.radius*e.y*1.5,t.center.z+t.radius*e.z*1.5);m.homePOV=(new ATON.POV).setPosition(o).setTarget(t.center)},setHomePOV:e=>{m.homePOV=e},computeAndRequestDefaultHome:(e,t,o)=>{m.computeDefaultHome(t,o),m.requestPOV(m.homePOV,e)},requestHomePOV:e=>{m.requestPOV(m.homePOV,e)}};m.requestHome=m.requestHomePOV,m.setAndRequestHomePOV=(e,t)=>{m.setHomePOV(e),m.requestPOV(e,t)},m.clear=()=>{m.clearPOVs(),m.clearLocomotionNodes()},m.DeviceOrientationControls=function(e){let t=this;this.object=e,this.object.rotation.reorder("YXZ"),this.enabled=!0,this.deviceOrientation={},this.screenOrientation=0,this.alphaOffset=0,this.absolute=!1,this.alphaOffsetDevice=void 0,this.alphaOffsetScreen=void 0;let o=function(e){t.absolute||(t.deviceOrientation=e)},i=function(e){t.deviceOrientation=e,t.absolute=!0},r=function(){t.screenOrientation=window.orientation||0},a=function(){let e=new THREE.Vector3(0,0,1),t=new THREE.Euler,o=new THREE.Quaternion,i=new THREE.Quaternion(-Math.sqrt(.5),0,0,Math.sqrt(.5));return function(r,a,n,s,l){t.set(n,a,-s,"YXZ"),r.setFromEuler(t),r.multiply(i),r.multiply(o.setFromAxisAngle(e,-l))}}();this.connect=function(){r(),window.addEventListener("orientationchange",r,!1),window.addEventListener("deviceorientation",o,!1),window.addEventListener("deviceorientationabsolute",i,!1),t.enabled=!0},this.disconnect=function(){window.removeEventListener("orientationchange",r,!1),window.removeEventListener("deviceorientation",o,!1),window.removeEventListener("deviceorientationabsolute",i,!1),t.enabled=!1},this.update=function(){if(!1===t.enabled)return;let e;if(e=t.deviceOrientation,e){let o=this.getDirection()?THREE.Math.degToRad(this.getDirection())+t.alphaOffset:0,i=e.beta?THREE.Math.degToRad(e.beta):0,r=e.gamma?THREE.Math.degToRad(e.gamma):0,n=t.screenOrientation?THREE.Math.degToRad(t.screenOrientation):0;a(t.object.quaternion,o,i,r,n)}},this.dispose=()=>{t.disconnect()},this.iOSOrientationPermission=()=>{"function"==typeof DeviceOrientationEvent.requestPermission&&DeviceOrientationEvent.requestPermission().then((e=>{console.log(e)})).catch(console.error)},this.getDirection=()=>void 0!==t.deviceOrientation.webkitCompassHeading?t.deviceOrientation.webkitCompassHeading:t.deviceOrientation.alpha,this.getDirectionMap=()=>void 0!==t.deviceOrientation.webkitCompassHeading?360-t.deviceOrientation.webkitCompassHeading:t.deviceOrientation.alpha,this.connect()};const h=m;let T={STD_TELEP_DURATION:.03,HAND_R:0,HAND_L:1,MOBILE_DENSITY_F:.5,MAX_QUERY_DISTANCE:40,init:()=>{ATON._renderer.xr.enabled=!0,ATON._renderer.xr.setReferenceSpaceType("local"),ATON.device.isMobile?ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd*T.MOBILE_DENSITY_F):ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd),T._bPresenting=!1,T.currSession=null,T._sessionType="immersive-vr",T._bReqPresenting=!1,T.rig=new THREE.Group,T.rig.add(ATON.Nav._camera),ATON._rootUI.add(T.rig),T._cam=void 0,T._currPos=T.rig.position,T._fromPos=new THREE.Vector3,T._reqPos=new THREE.Vector3,T.gControllers=void 0,T.controller0=void 0,T.controller1=void 0,T.controller0pos=new THREE.Vector3,T.controller1pos=new THREE.Vector3,T.controller0dir=new THREE.Vector3,T.controller1dir=new THREE.Vector3,T._lastPosR=void 0,T._lastPosL=void 0,T._pointerLineGeom=void 0,T._pointerLineMesh=void 0,T.gpad0=void 0,T.gpad1=void 0,T._urlHand=ATON.PATH_RES+"models/hand/hand.glb",ATON.on("XRselectStart",(e=>{e===T.HAND_R&&ATON._stdActivation()})),ATON.on("XRselectEnd",(e=>{})),ATON.on("XRsqueezeStart",(e=>{e===T.HAND_R&&ATON.Photon.setFocusStreaming(!0)})),ATON.on("XRsqueezeEnd",(e=>{e===T.HAND_R&&ATON.Photon.setFocusStreaming(!1)})),ATON.on("VRC_IDassigned",(e=>{let t=ATON.getUINode("Rhand"),o=ATON.getUINode("Lhand"),i=ATON.MatHub.materials.avatars,r=i[e%i.length];o&&o.setMaterial(r),t&&t.setMaterial(r)}))},setSessionType:e=>{void 0!==e&&("immersive-vr"!==e&&"immersive-ar"!==e||(T._sessionType=e,console.log("Session type: "+e)))},isPresenting:()=>T._bPresenting,teleportOnQueriedPoint:()=>{if(!ATON.Nav.currentQueryValidForLocomotion())return!1;const e=ATON._queryDataScene.p;return ATON.Nav.requestPOV((new ATON.POV).setPosition(e.x,e.y+ATON.userHeight,e.z),T.STD_TELEP_DURATION),!0},setupQueryRay:e=>{void 0!==e&&(T.controller0?e.set(T.controller0pos,T.controller0dir):e.set(ATON.Nav.getCurrentEyeLocation(),ATON.Nav.getCurrentDirection()))},setRefSpaceLocation:e=>{T.rig.position.copy(e)},_setupControllerR:(e,t)=>{T.controller0||(T.controller0=e,console.log("R controller"),e.addEventListener("selectstart",(()=>{ATON.fire("XRselectStart",T.HAND_R)})),e.addEventListener("selectend",(()=>{ATON.fire("XRselectEnd",T.HAND_R)})),e.addEventListener("squeezestart",(()=>{ATON.fire("XRsqueezeStart",T.HAND_R)})),e.addEventListener("squeezeend",(()=>{ATON.fire("XRsqueezeEnd",T.HAND_R)})),T.setupControllerUI(T.HAND_R,t),ATON.fire("XRcontrollerConnected",T.HAND_R))},_setupControllerL:(e,t)=>{T.controller1||(T.controller1=e,console.log("L controller"),e.addEventListener("selectstart",(()=>{ATON.fire("XRselectStart",T.HAND_L)})),e.addEventListener("selectend",(()=>{ATON.fire("XRselectEnd",T.HAND_L)})),e.addEventListener("squeezestart",(()=>{ATON.fire("XRsqueezeStart",T.HAND_L)})),e.addEventListener("squeezeend",(()=>{ATON.fire("XRsqueezeEnd",T.HAND_L)})),T.setupControllerUI(T.HAND_L,t),ATON.fire("XRcontrollerConnected",T.HAND_L))},setupSceneForAR:()=>{if("immersive-ar"!==T._sessionType)return;ATON.recomputeSceneBounds();let e=ATON.bounds.center;ATON._rootVisible.position.x=-e.x,ATON._rootVisible.position.y=-e.y,ATON._rootVisible.position.z=-e.z,ATON._rootSem.position.x=-e.x,ATON._rootSem.position.y=-e.y,ATON._rootSem.position.z=-e.z,ATON.recomputeSceneBounds()},resetSceneOffsets:()=>{ATON._rootVisible.position.set(0,0,0),ATON._rootSem.position.set(0,0,0),ATON.recomputeSceneBounds()},onSessionStarted:e=>{T.currSession||(T._bReqPresenting=!1,e.addEventListener("end",T.onSessionEnded),e.isImmersive=!0,console.log(T._sessionType+" session started."),ATON.MediaFlow.stopAllStreams(),"immersive-ar"===T._sessionType&&ATON._renderer.xr.setReferenceSpaceType("local"),ATON._renderer.xr.setSession(e).then((()=>{if(T.currSession=e,console.log(T.currSession),"immersive-ar"===T._sessionType)ATON._mainRoot.background=null,ATON._mMainPano&&(ATON._mMainPano.visible=!1),ATON._renderer.xr.getController(0)&&ATON.device.isMobile&&(T.controller0=ATON._renderer.xr.getController(0),T.controller0.addEventListener("selectstart",(()=>{ATON.fire("XRselectStart",T.HAND_R),console.log("Head-aligned select")})),T.controller0.addEventListener("selectend",(()=>{ATON.fire("XRselectEnd",T.HAND_R)})),T.gControllers.add(T.controller0));else{for(let e=0;e<2;e++){const t=ATON._renderer.xr.getController(e);void 0===t||t.userData.bXRconfig||(t.visible=!1,t.userData.bXRconfig=!0,t.addEventListener("connected",(e=>{let o=e.data.handedness;t.gm=e.data.gamepad,console.log("Hand "+o),console.log("GamePad "+t.gm),"left"===o?T._setupControllerL(t,!0):"right"===o?T._setupControllerR(t,!0):(t.addEventListener("selectstart",(()=>{ATON.fire("XRselectStart",T.HAND_R),console.log("Head-aligned select")})),t.addEventListener("selectend",(()=>{ATON.fire("XRselectEnd",T.HAND_R)})),ATON.fire("XRcontrollerConnected",T.HAND_R))})))}T.rig.add(ATON.Nav._camera),T.setRefSpaceLocation(ATON.Nav._currPOV.pos)}let t=ATON._renderer.xr.getCamera(ATON.Nav._camera);ATON.Nav._updCamera(t),T._bPresenting=!0,ATON.Nav._bInteracting=!1,console.log("XR now presenting"),ATON.fire("XRmode",!0),ATON.rewindAllPlayingMedia(),ATON.toggleShadows(!1),ATON.SUI.getSelectorRadius()>ATON.FE.STD_SEL_RAD&&ATON.SUI.setSelectorRadius(ATON.FE.STD_SEL_RAD),ATON._qSyncInt=2,ATON.XPFNetwork.getNumXPFs()>0?ATON.setQueryRange(0,100):ATON.setQueryRange(0,T.MAX_QUERY_DISTANCE),ATON.MRes.estimateTSErrorTarget(),setTimeout((()=>{ATON.SUI.getSelectorRadius()>ATON.FE.STD_SEL_RAD&&ATON.SUI.setSelectorRadius(ATON.FE.STD_SEL_RAD)}),2e3)})))},onSessionEnded:()=>{T.currSession.removeEventListener("end",T.onSessionEnded),T.currSession=null,T._bReqPresenting=!1,T._bPresenting=!1,ATON.Nav._bInteracting=!1,"immersive-ar"===T._sessionType&&ATON._mMainPano&&(ATON._mMainPano.visible=!0),T.setRefSpaceLocation(new THREE.Vector3(0,0,0)),ATON.fire("XRmode",!1),ATON._qSyncInt=1,ATON.MediaFlow.stopAllStreams(),ATON.Nav.requestHome(),ATON.Nav._updCamera(),ATON.setQueryRange(0,1/0),ATON.MRes.estimateTSErrorTarget(),console.log("Quit XR")},toggle:e=>{if(T.setSessionType(e),ATON.device.xrSupported[T._sessionType])if(null===T.currSession){let e={optionalFeatures:["high-refresh-rate"]};"immersive-ar"===T._sessionType&&(void 0===e.optionalFeatures&&(e.optionalFeatures=[]),e.optionalFeatures.push("light-estimation")),T._bReqPresenting=!0,navigator.xr.requestSession(T._sessionType,e).then(T.onSessionStarted)}else T.currSession.end()},setupControllerUI:(e,t)=>{let o,i;if(void 0===T.gControllers&&(T.gControllers=ATON.createUINode(),T.gControllers.disablePicking(),T.rig.add(T.gControllers)),e===T.HAND_L?(T.gControllers.add(T.controller1),t&&(i=ATON.createUINode("Lhand").load(T._urlHand).setMaterial(ATON.MatHub.materials.controllerRay).setScale(-1,1,1),T.controller1.add(i))):(T.gControllers.add(T.controller0),t&&(T._pointerLineGeom=new THREE.CylinderGeometry(.003,.003,1,4),T._pointerLineGeom.rotateX(-Math.PI/2),T._pointerLineGeom.translate(0,0,-.5),T._pointerLineMesh=new THREE.Mesh(T._pointerLineGeom,ATON.MatHub.materials.controllerRay),T.controller0.add(T._pointerLineMesh),T._pointerLineMesh.visible=!1,o=ATON.createUINode("Rhand").load(T._urlHand).setMaterial(ATON.MatHub.materials.controllerRay),T.controller0.add(o))),void 0!==ATON.Photon.uid&&t){let t=ATON.MatHub.materials.avatars,r=t[ATON.Photon.uid%t.length];e===T.HAND_L?i.setMaterial(r):o.setMaterial(r)}},switchHands:()=>{let e=T.controller1;T.controller1=T.controller0,T.controller0=e;for(let e in T.controller0.children)T.controller0.remove(T.controller0.children[e]);for(let e in T.controller1.children)T.controller1.remove(T.controller1.children[e]);T.gControllers.removeChildren(),T.setupControllerUI(T.HAND_L),T.setupControllerUI(T.HAND_R),console.log("VR controllers switched")},getControllerSpace:e=>{1===e?T.getControllerGrip(1):T.getControllerGrip(0)},getControllerWorldLocation:e=>1===e?T.controller1pos:T.controller0pos,getControllerWorldDirection:e=>1===e?T.controller1dir:T.controller0dir,getControllerWorldOrientation:e=>{let t=new THREE.Quaternion;return 1===e?T.controller1.getWorldQuaternion(t):T.controller0.getWorldQuaternion(t),t},_deltaMotionController:e=>{if(e===T.HAND_L&&void 0===T._lastPosL)return;if(e===T.HAND_R&&void 0===T._lastPosR)return;let t=e===T.HAND_L?T.controller1pos:T.controller0pos,o=e===T.HAND_L?T._lastPosL:T._lastPosR;THREE.Vector3(t.x-o.x,t.y-o.y,t.z-o.z).lengthSq(),e===T.HAND_L?T._lastPosL=t:T._lastPosR=t},update:()=>{T.controller0&&T.controller0.visible&&(T.controller0.getWorldPosition(T.controller0pos),T.controller0.getWorldDirection(T.controller0dir),T.controller0dir.negate()),T.controller1&&T.controller1.visible&&(T.controller1.getWorldPosition(T.controller1pos),T.controller1.getWorldDirection(T.controller1dir),T.controller1dir.negate())},getAxisValue:e=>{let t=new THREE.Vector2(0,0),o=e===T.HAND_L?T.controller1:T.controller0;if(void 0===o)return t;if(void 0===o.gm||void 0===o.gm.axes)return t;let i=o.gm.axes[0],r=o.gm.axes[2],a=o.gm.axes[1],n=o.gm.axes[3];return t.x=i>0?-i:r,t.y=a>0?a:-n,t}};const v=T,g=class extends t{constructor(e,t,o){super(e,ATON.NTYPES.UI),this.baseColor=ATON.MatHub.colors.black,this.baseOpacity=.5,this.container=new ThreeMeshUI.Block({width:t||.2,height:o||.05,padding:.001,borderRadius:.01,backgroundColor:this.baseColor,backgroundOpacity:this.baseOpacity,fontFamily:ATON.SUI.PATH_FONT_JSON,fontTexture:ATON.SUI.PATH_FONT_TEX,justifyContent:"center",textAlign:"center"}),this.container.position.z=.03,this.add(this.container),this.uiText=new ThreeMeshUI.Text({content:"Label",fontSize:.03,fontColor:ATON.MatHub.colors.white}),this.container.add(this.uiText),ThreeMeshUI.update()}setBaseColor(e){return this.baseColor=e,this.container.set({backgroundColor:this.baseColor}),ThreeMeshUI.update(),this}setTextColor(e){return this.uiText.set({fontColor:e}),ThreeMeshUI.update(),this}setBackgroundOpacity(e){return this.container.set({backgroundOpacity:e}),this.baseOpacity=e,ThreeMeshUI.update(),this}setText(e){return this.uiText.set({content:e}),ThreeMeshUI.update(),this}};let S={STD_BTN_SIZE:.1,STD_SELECTOR_TICKNESS:1.05};S.Button=class extends t{constructor(e,t=1,o=1){super(e,ATON.NTYPES.UI),this.baseColor=ATON.MatHub.colors.black,this.switchColor=ATON.MatHub.colors.green,this.baseOpacity=.5,this.hoverOpacity=.8,this._bSwitched=!1,this.container=new ThreeMeshUI.Block({width:.1*t,height:.1,padding:.01,borderRadius:.02,backgroundColor:this.baseColor,backgroundOpacity:this.baseOpacity,fontFamily:ATON.SUI.PATH_FONT_JSON,fontTexture:ATON.SUI.PATH_FONT_TEX,justifyContent:"center",textAlign:"center"}),this.add(this.container),this.uiText=new ThreeMeshUI.Text({content:"",fontSize:.02*o,fontColor:ATON.MatHub.colors.white}),this.container.add(this.uiText);let i=.9*ATON.SUI.STD_BTN_SIZE*t,r=.9*ATON.SUI.STD_BTN_SIZE;this._trigger=new THREE.Mesh(new THREE.PlaneGeometry(i,r,2),ATON.MatHub.materials.fullyTransparent),this._trigger.position.set(0,0,.002),this.add(this._trigger),this.onHover=()=>{this.container.set({backgroundOpacity:this.hoverOpacity})},this.onLeave=()=>{this.container.set({backgroundOpacity:this.baseOpacity})},this.enablePicking(),this.traverse((e=>{e.material&&(e.material.depthWrite=!1)})),ThreeMeshUI.update()}setBaseColor(e){return this.baseColor=e,this._bSwitched||this.container.set({backgroundColor:this.baseColor}),ThreeMeshUI.update(),this}setSwitchColor(e){return this.switchColor=e,this._bSwitched&&this.container.set({backgroundColor:this.switchColor}),ThreeMeshUI.update(),this}setBackgroundOpacity(e){return this.container.set({backgroundOpacity:e}),this.baseOpacity=e,ThreeMeshUI.update(),this}setText(e){return this.uiText.set({content:e}),ThreeMeshUI.update(),this}switch(e){return this._bSwitched=e,e?this.container.set({backgroundColor:this.switchColor}):this.container.set({backgroundColor:this.baseColor}),ThreeMeshUI.update(),this}setIcon(e,t){return ATON.Utils.textureLoader.load(e,(e=>{this._trigger.material=new THREE.MeshStandardMaterial({map:e,transparent:!0,depthWrite:!1}),t&&(this.setBackgroundOpacity(0),this.hoverOpacity=0),this.uiText.position.set(0,-.035,0)})),ThreeMeshUI.update(),this}},S.Label=g,S.MediaPanel=class extends t{constructor(e){super(e,ATON.NTYPES.UI),this._resurl=void 0,this._mediamesh=void 0,this._vs=void 0,this._yratio=1,this._titleYoffs=.6,this._color=ATON.MatHub.colors.black;let t=this;this.onSelect=()=>{t._vs&&t._vs.el}}load(e,t){this._yratio=1,this._mediamesh||(this._mediamesh=new THREE.Mesh(new THREE.PlaneGeometry(1,1)),this.add(this._mediamesh)),e=ATON.Utils.resolveCollectionURL(e);let o=this;return ATON.Utils.isVideo(e)?(this._vs=ATON.MediaFlow.getOrCreateVideoStream(this.nid,e,!1),this._mediamesh.material=this._vs.matStream,this._vs.el.addEventListener("loadedmetadata",(i=>{o._yratio=o._vs.el.videoHeight/o._vs.el.videoWidth,o._mediamesh.scale.y=-o._yratio,o._resurl=e,o._onContentLoad(),t&&t()}))):ATON.Utils.loadTexture(e,(i=>{i.image&&(this._yratio=i.image.height/i.image.width),o._mediamesh.scale.y=o._yratio,o._mediamesh.material=ATON.MatHub.materials.chromakey.clone(),o._mediamesh.material.uniforms.tBase.value=i,o._mediamesh.material.needsUpdate=!0,o._resurl=e,o._onContentLoad(),t&&t()})),this.setPickable(!0),this}setColor(e){return this._color=e,this._labelTitle&&this._labelTitle.setBaseColor(e),this._bd&&(this._bd.material.color=e),this}getMaterial(){return this._mediamesh.material}_onContentLoad(){this._labelTitle&&(this._labelTitle.position.y=this._yratio*this._titleYoffs),this._bd&&(this._bd.scale.y=1.05*this._yratio)}setTitle(e){return this._labelTitle||(this._labelTitle=new g(void 0,.5,.07),this._labelTitle.position.z=-.01,this._labelTitle.attachTo(this)),this._labelTitle.setText(e),this._labelTitle.setBaseColor(this._color),this}toggleTitle(e){return this._labelTitle?(this._labelTitle.toggle(e),this):this}setBackdrop(e){return this._bd=new THREE.Mesh(new THREE.PlaneGeometry(1,1)),this._bd.material=new THREE.MeshStandardMaterial({transparent:!0,side:THREE.DoubleSide,color:this._color,opacity:e||.5}),this._bd.scale.x=1.05,this._bd.scale.y=1.05*this._yratio,this._bd.position.z=-.005,this.add(this._bd),this}},S.init=()=>{S.initSelector(),S.fpTeleport=ATON.createUINode();let e=new THREE.CylinderGeometry(.4,.4,.9,32,1,!0),t=new THREE.Mesh(e,ATON.MatHub.getMaterial("teleportLoc"));t.renderOrder=100,S.fpTeleport.add(t),S.fpTeleport.disablePicking(),S.fpTeleport.visible=!1,ATON._rootUI.add(S.fpTeleport),S.PATH_FONT_JSON||(S.PATH_FONT_JSON=ATON.PATH_RES+"fonts/custom-msdf.json"),S.PATH_FONT_TEX||(S.PATH_FONT_TEX=ATON.PATH_RES+"fonts/custom.png"),S.gMeasures=ATON.createUINode(),S._prevMPoint=void 0,S._measLabels=[],ATON._rootUI.add(S.gMeasures);let o=(new THREE.BufferGeometry).setFromPoints([new THREE.Vector3,new THREE.Vector3]);S._measLine=new THREE.Line(o,ATON.MatHub.getMaterial("measurement")),S._measLine.visible=!1,ATON._rootUI.add(S._measLine),S.gPoints=ATON.createUINode(),ATON._rootUI.add(S.gPoints),S.gLocNodes=ATON.createUINode(),ATON._rootUI.add(S.gLocNodes),S.buildInfoNode(),S.bShowInfo=!0,S._labelScale=ATON.Utils.isMobile()?80:90,S._labelScaleVR=2,S.sprites={},S._sync=0},S.getOrCreateSpritePointEdit=()=>(S.sprites.pointEdit||(S.sprites.pointEdit=new THREE.SpriteMaterial({map:(new THREE.TextureLoader).load(ATON.PATH_RES+"sui-point.png"),color:ATON.MatHub.colors.orange,transparent:!0,opacity:1,depthTest:!1})),S.sprites.pointEdit),S.getOrCreateSpriteSemIcon=()=>(S.sprites.semIcon||(S.sprites.semIcon=new THREE.SpriteMaterial({map:(new THREE.TextureLoader).load(ATON.PATH_RES+"sui-sem.png"),transparent:!0,opacity:1,depthWrite:!1,depthTest:!1})),S.sprites.semIcon),S.getOrCreateSpriteLP=()=>(S.sprites.lp||(S.sprites.lp=new THREE.SpriteMaterial({map:(new THREE.TextureLoader).load(ATON.PATH_RES+"sui-lp.png"),transparent:!0,opacity:1,depthWrite:!1}),S.sprites.lp.sizeAttenuation=!1),S.sprites.lp),S.getOrCreateSpriteWalk=()=>(S.sprites.walk||(S.sprites.walk=new THREE.SpriteMaterial({map:(new THREE.TextureLoader).load(ATON.PATH_RES+"sui-walk.png"),transparent:!0,opacity:1,depthWrite:!1})),S.sprites.walk),S.initSelector=()=>{S.mainSelector=ATON.createUINode(),S._mSelectorSphere=new THREE.Mesh(ATON.Utils.geomUnitSphere,ATON.MatHub.getMaterial("selector")),S._mSelectorSphere.renderOrder=100,S.mainSelector.add(S._mSelectorSphere),S.mainSelector.disablePicking(),S.setSelectorRadius(.05),S.mainSelector.visible=!1,ATON._rootUI.add(S.mainSelector),S._selOffset=new THREE.Vector3,S._bShowSelector=!0},S.enableLPIcons=()=>{S.gLPIcons=ATON.createUINode(),S.gLPIcons.disablePicking(),ATON._rootUI.add(S.gLPIcons)},S.enableSemIcons=()=>{S.gSemIcons=ATON.createUINode(),S.gSemIcons.disablePicking(),ATON._rootUI.add(S.gSemIcons)},S.showSelector=e=>{S._bShowSelector=e},S.setSelectorRadius=e=>{S._selectorRad=e,S.mainSelector.scale.set(e,e,e)},S.setSelectorOffset=(e,t,o)=>{void 0!==e&&(S._selOffset.x=e),void 0!==t&&(S._selOffset.y=t),void 0!==o&&(S._selOffset.z=o);let i=ATON.getSceneQueriedPoint();void 0!==i&&(S.mainSelector.position.x=i.x+S._selOffset.x,S.mainSelector.position.y=i.y+S._selOffset.y,S.mainSelector.position.z=i.z+S._selOffset.z)},S.getSelectorRadius=()=>S._selectorRad,S.getSelectorLocation=()=>S.mainSelector.position,S.setSelectorModel=(e,t)=>{void 0!==e&&(S.mainSelector.removeChildren(),S.mainSelector.load(e).disablePicking(),t&&S.mainSelector.setMaterial(ATON.MatHub.getMaterial("selector")))},S.setSelectorColor=(e,t)=>{let o=ATON.MatHub.materials.selector;o.uniforms.tint.value=e,void 0!==t&&(o.uniforms.opacity.value=t)},S.addSemIcon=(e,t)=>{if(void 0===S.gSemIcons)return;let o=(new THREE.Box3).setFromObject(t),i=new THREE.Sphere;o.getBoundingSphere(i);let r=new THREE.Sprite(S.getOrCreateSpriteSemIcon());r.position.copy(i.center),r.scale.set(.8,.8,1),r.name=e,S.gSemIcons.add(r)},S.addLPIcon=e=>{if(void 0===S.gLPIcons)return;let t=e._near,o=new THREE.Sprite(S.getOrCreateSpriteLP());o.position.copy(e.pos),o.scale.set(.1,.1,.1);let i=new THREE.Mesh(ATON.Utils.geomUnitSphere,ATON.MatHub.materials.lp);i.scale.set(t,t,t),i.position.copy(e.pos),S.gLPIcons.add(o),S.gLPIcons.add(i)},S.setSemIconsOpacity=e=>{ATON.MatHub.spriteSemIcon.opacity=void 0===e?1:e},S.buildInfoNode=()=>{S.infoNode=ATON.createUINode(),S.infoNode.attachToRoot(),S.infoContainer=new ThreeMeshUI.Block({width:.2,height:.05,padding:.01,borderRadius:.02,backgroundColor:ATON.MatHub.colors.black,backgroundOpacity:.4,fontFamily:S.PATH_FONT_JSON,fontTexture:S.PATH_FONT_TEX,justifyContent:"center",textAlign:"center"}),S.infoContainer.position.y=.03,S.infoNode.add(S.infoContainer),S.infoNodeText=new ThreeMeshUI.Text({content:"Info",fontSize:.02,fontColor:ATON.MatHub.colors.white}),S.infoContainer.add(S.infoNodeText),ThreeMeshUI.update()},S.getInfoNode=()=>S.infoNode,S.setInfoNodeText=e=>{S.bShowInfo&&(S.infoNodeText.set({content:e}),ThreeMeshUI.update())},S.createToolbar=(e,t,o)=>{let i=ATON.createUINode(),r=e.length,a=.3*S.STD_BTN_SIZE,n=new ThreeMeshUI.Block({width:S.STD_BTN_SIZE*r*1.1+a,height:S.STD_BTN_SIZE+a,padding:.01,borderRadius:.02,backgroundColor:t||ATON.MatHub.colors.black,backgroundOpacity:void 0!==o?o:.3,fontFamily:S.PATH_FONT_JSON,fontTexture:S.PATH_FONT_TEX,justifyContent:"center",textAlign:"center"}),s=.5*r*S.STD_BTN_SIZE*1.1;s-=.5*S.STD_BTN_SIZE;for(let t=0;t{void 0===o&&(o=1),void 0===i&&(i=1);let r=ATON.createUINode(e),a=new THREE.Mesh(new THREE.PlaneGeometry(o,i,2),ATON.MatHub.materials.fullyTransparent);return r.add(a),void 0!==t&&ATON.Utils.textureLoader.load(t,(e=>{a.material=new THREE.MeshStandardMaterial({map:e,transparent:!0,depthWrite:!1,side:THREE.DoubleSide})})),r},S.createLayout=(e,t)=>{let o=e.children.length;for(let i=0;i{if(void 0===e)return;let t=.01,o=.001;if(void 0===S._prevMPoint){S._prevMPoint=e;let t=S._measLine.geometry.attributes.position.array;return t[0]=e.x,t[1]=e.y,void(t[2]=e.z)}S._measLine.visible=!1;let i=S._prevMPoint.distanceTo(e);t*=i,o*=i;let r=new THREE.Mesh(ATON.Utils.geomUnitCube,ATON.MatHub.getMaterial("measurement"));r.position.copy(S._prevMPoint),r.scale.set(t,t,t),S.gMeasures.add(r);let a=new THREE.Mesh(ATON.Utils.geomUnitCube,ATON.MatHub.getMaterial("measurement"));a.position.copy(e),a.scale.set(t,t,t),S.gMeasures.add(a);let n=2*i,s=(new THREE.BufferGeometry).setFromPoints([S._prevMPoint,e]);S.gMeasures.add(new THREE.Line(s,ATON.MatHub.getMaterial("measurement")));let l=new S.Label;l.setBaseColor(ATON.MatHub.colors.white).setTextColor(ATON.MatHub.colors.black),l.userData.vStart=new THREE.Vector3,l.userData.vEnd=new THREE.Vector3,l.userData.vStart.copy(S._prevMPoint),l.userData.vEnd.copy(e),l.userData.vSEdir=new THREE.Vector3,l.userData.vSEdir.x=l.userData.vStart.x-l.userData.vEnd.x,l.userData.vSEdir.y=l.userData.vStart.y-l.userData.vEnd.y,l.userData.vSEdir.z=l.userData.vStart.z-l.userData.vEnd.z,l.userData.vSEdir.normalize(),l.setPosition(.5*(S._prevMPoint.x+e.x),.5*(S._prevMPoint.y+e.y),.5*(S._prevMPoint.z+e.z)),l.setScale(n).setText(ATON.Utils.getHumanReadableDistance(i)),S.gMeasures.add(l),S._measLabels.push(l);let d={};return d.A=l.userData.vStart,d.B=l.userData.vEnd,S._prevMPoint=void 0,d},S.clearMeasurements=()=>{S.gMeasures.removeChildren(),S._measLabels=[]},S._updateMeasurements=()=>{if(!(S._measLabels.length<=0))for(let e in S._measLabels)S._measLabels[e].orientToCamera()},S.update=()=>{if(ATON.Nav.isTransitioning()||ATON._bPauseQuery)S.infoNode.visible=!1;else{if(S._prevMPoint){if(ATON._queryDataScene){let e=S._measLine.geometry.attributes.position.array;e[3]=ATON._queryDataScene.p.x,e[4]=ATON._queryDataScene.p.y,e[5]=ATON._queryDataScene.p.z,S._measLine.geometry.attributes.position.needsUpdate=!0}S._measLine.visible=!0}else S._measLine.visible=!1;if(ATON._queryDataScene&&!ATON.Nav._bInteracting?(S._bShowSelector&&(S.mainSelector.visible=!0),S.mainSelector.position.x=ATON._queryDataScene.p.x+S._selOffset.x,S.mainSelector.position.y=ATON._queryDataScene.p.y+S._selOffset.y,S.mainSelector.position.z=ATON._queryDataScene.p.z+S._selOffset.z):S.mainSelector.visible=!1,S.gSemIcons&&(ATON.Nav._bInteracting?S.gSemIcons.hide():void 0===ATON._hoveredSemNode&&S.gSemIcons.show()),ATON.Nav.isOrbit()&&!ATON.XR._bPresenting||!ATON.Nav.currentQueryValidForLocomotion()?S.fpTeleport.visible=!1:(S.fpTeleport.visible=!0,S.fpTeleport.position.copy(ATON._queryDataScene.p)),ATON.XR._pointerLineMesh){let e=0;ATON._queryDataScene&&(e=ATON._queryDataScene.d),ATON._queryDataUI&&(e<=0||ATON._queryDataUI.d0?(ATON.XR._pointerLineMesh.visible=!0,ATON.XR._pointerLineMesh.scale.set(1,1,e)):ATON.XR._pointerLineMesh.visible=!1}if(S._updateMeasurements(),ATON._queryDataSem)ATON.XR._bPresenting&&(S.bShowInfo&&(S.infoNode.visible=!0),ATON.XR.controller0?(S.infoNode.position.copy(ATON.XR.controller0pos),S.infoNode.position.x-=.1*ATON.XR.controller0dir.x,S.infoNode.position.y-=.1*ATON.XR.controller0dir.y,S.infoNode.position.z-=.1*ATON.XR.controller0dir.z,S.infoNode.setScale(1)):(S.infoNode.position.lerpVectors(ATON._queryDataSem.p,ATON.Nav._currPOV.pos,.1),S.infoNode.setScale(ATON._queryDataSem.d*S._labelScaleVR)),S.infoNode.orientToCamera()),ATON.Photon._bStreamFocus||(S.mainSelector.visible=!1);else if(ATON.XR._bPresenting&&S.bShowInfo&&ATON._queryDataScene&&void 0!==ATON.XPFNetwork._semCurr){S.infoNode.position.lerpVectors(ATON._queryDataScene.p,ATON.Nav._currPOV.pos,.5);const e=ATON._queryDataScene.d*(ATON.Nav._currPOV.fov/S._labelScale);S.infoNode.setScale(e),S.infoNode.orientToCamera(),S.infoNode.visible=!0}else S.infoNode.visible=!1;if(S.mainSelector.visible&&ATON.Photon._bStreamFocus){let e=S._selectorRad*(1+.2*Math.cos(10*ATON._clock.elapsedTime));S.mainSelector.scale.set(e,e,e);let t=ATON.getSceneFocalPoint();void 0!==t&&void 0!==ATON.plight&&(ATON.enablePointLight(),ATON.plight.position.copy(t),ATON.plight.distance=2*S._selectorRad)}}};const N=S;let O={SCENES_SORTER:(e,t)=>{let o=e.creationDate,i=t.creationDate;return o&&i?o>i?-1:i>o?1:0:0},init:()=>{window.bootstrap&&window.bootstrap.Offcanvas&&(O._parser=new DOMParser,O.PATH_RES_ICONS=ATON.PATH_RES+"icons/",O._bModal=!1,O._bSidePanel=!1,O._bSemL=!1,O._setupBase())},setTheme:e=>{document.body.setAttribute("data-bs-theme",e)},createElementFromHTMLString:e=>O._parser.parseFromString(e,"text/html").body.firstElementChild,onContextMenu:()=>!1,_setupBase:()=>{document.body.oncontextmenu=O.onContextMenu,O.setTheme("dark"),O.elCenteredOverlay=O.createElementFromHTMLString('\n
    \n
    Loading...
    \n
    \n\t'),document.body.append(O.elCenteredOverlay),O.hideCenteredOverlay(),O.elLabelCon=document.createElement("div"),O.elLabelCon.classList.add("aton-floating-label-container"),O.elLabel=document.createElement("div"),O.elLabel.classList.add("aton-floating-label"),O.elLabelCon.append(O.elLabel),document.body.prepend(O.elLabelCon),O.hideSemLabel(),O.elModal=O.createElementFromHTMLString('\n \n\t'),O.modal=new bootstrap.Modal(O.elModal),document.body.append(O.elModal),O.elModalContent=document.getElementById("uiModalContent"),O.elSidePanel=O.createElementFromHTMLString('\n
    \n\t'),O.sidepanel=new bootstrap.Offcanvas(O.elSidePanel),document.body.append(O.elSidePanel)},showCenteredOverlay:e=>{O.elCenteredOverlay.classList.add("d-flex"),O.elCenteredOverlay.classList.remove("d-none")},hideCenteredOverlay:()=>{O.elCenteredOverlay.classList.remove("d-flex"),O.elCenteredOverlay.classList.add("d-none")},showModal:e=>{if(e){if(O.elModalContent.innerHTML="",e.header){let t=document.createElement("div");t.classList.add("modal-header"),t.innerHTML="",O.elModalContent.append(t)}if(e.body){let t=document.createElement("div");t.classList.add("modal-body"),t.append(e.body),O.elModalContent.append(t)}if(e.footer){let t=document.createElement("div");t.classList.add("modal-footer"),t.append(e.footer),O.elModalContent.append(t)}O.modal.show(),O._bModal=!0}},hideModal:()=>{O.modal.hide(),O._bModal=!1},showSidePanel:e=>{if(e){if(O.elSidePanel.innerHTML="",e.header){let t=document.createElement("div");t.classList.add("offcanvas-header"),t.innerHTML="

    "+e.header+"

    ",O.elSidePanel.append(t)}if(e.body){let t=document.createElement("div");t.classList.add("offcanvas-body"),t.append(e.body),O.elSidePanel.append(t)}O.sidepanel.show(),O._bSidePanel=!0}},hideSidePanel:()=>{O.sidepanel.hide(),O._bSidePanel=!1},addBasicEvents:()=>{let e=document.querySelector("canvas");ATON.on("NodeRequestFired",(()=>{O.showCenteredOverlay()})),ATON.on("AllNodeRequestsCompleted",(()=>{O.hideCenteredOverlay()})),ATON.on("SemanticNodeHover",(t=>{let o=ATON.getSemanticNode(t);void 0!==o&&(O.showSemLabel(t),o.highlight(),e.style.cursor="pointer",ATON.SUI.gSemIcons&&ATON.SUI.gSemIcons.hide())})),ATON.on("SemanticNodeLeave",(t=>{let o=ATON.getSemanticNode(t);void 0!==o&&(O.hideSemLabel(),o.restoreDefaultMaterial(),e.style.cursor="grab",ATON.SUI.gSemIcons&&ATON.SUI.gSemIcons.show())})),ATON.on("SemanticMaskHover",(t=>{O.showSemLabel(t),e.style.cursor="pointer"})),ATON.on("SemanticMaskLeave",(t=>{O.hideSemLabel(),e.style.cursor="grab"})),ATON.addUpdateRoutine(O.update)},update:()=>{if(O._bSemL&&!ATON.XR._bPresenting){let e=.5*ATON._screenPointerCoords.x*window.innerWidth,t=.5*(1-ATON._screenPointerCoords.y)*window.innerHeight;t-=35,O.elLabel.style.transform="translate("+e+"px, "+t+"px)"}},showSemLabel:e=>{O.elLabel.innerHTML=e,O.elLabel.style.display="inline-block",O._bSemL=!0},hideSemLabel:()=>{O.elLabel.style.display="none",O._bSemL=!1},loadPartial:(e,t,o,i)=>{fetch(e).then((e=>e.text())).then((e=>{let i=O._parser.parseFromString(e,"text/html").body.childNodes;t?o?document.querySelector(`#${t}`).prepend(...i):document.querySelector(`#${t}`).append(...i):o?document.body.prepend(...i):document.body.append(...i)})).catch((e=>`Error fetching partial: ${e}`)),i&&i()},resolveIconURL:e=>e.includes("/")?e:O.PATH_RES_ICONS+e+".png",prependIcon:(e,t)=>{t.startsWith("bi-")?e.prepend(O.createElementFromHTMLString("")):e.prepend(O.createElementFromHTMLString(""))},createButton:e=>{let t=document.createElement("button");return t.classList.add("btn","aton-btn"),t.setAttribute("type","button"),e.variant&&t.classList.add("btn-"+e.variant),e.text&&(t.innerText=e.text),e.icon&&O.prependIcon(t,e.icon),e.badge&&t.append(O.createElementFromHTMLString(""+e.badge+"")),e.onpress&&(t.onclick=e.onpress),t},createDropdown:e=>{let t=document.createElement("div");t.classList.add("btn-group");let o=O.createElementFromHTMLString(`\n \n `);if(e.icon&&O.prependIcon(o,e.icon),t.append(o),e.items){let o=document.createElement("ul");o.classList.add("dropdown-menu","dropdown-menu-sm-end","aton-dropdown-menu");for(let t=0;t${r.title}\n `);let a=document.createElement("li");a.append(i),o.append(a),r.icon&&O.prependIcon(i,r.icon)}t.append(o)}return t},createTabsGroup:e=>{let t=ATON.Utils.generateID("tabgroup"),o=document.createElement("div"),i=document.createElement("ul");i.classList.add("nav","nav-justified","nav-tabs"),i.setAttribute("role","tablist");let r=document.createElement("div");r.classList.add("tab-content"),o.append(i),o.append(r);for(let o=0;o");let c=t+"-"+n;c=c.replaceAll(" ","");let u,p=document.createElement("li");p.classList.add("nav-item"),p.setAttribute("role","presentation"),p.innerHTML=0===o?"":"",i.append(p),u=0===o?O.createElementFromHTMLString("
    "):O.createElementFromHTMLString("
    "),u.style.padding="10px 0px 10px 0px",s&&u.append(s),r.append(u)}return o},createTreeGroup:e=>{let t=ATON.Utils.generateID("tree"),o=document.createElement("div");o.classList.add("aton-tree-container");for(let i=0;i"+a+"")),n){let e=document.createElement("div");e.classList.add("aton-tree-item-content"),e.append(r.content),s.append(e)}o.append(s)}return o},createVectorControl:e=>{let t,o=ATON.Utils.generateID("vec3");e.vector&&(t=e.vector);let i=.01;e.step&&(i=e.step);let r=t?t.x:0,a=t?t.y:0,n=t?t.z:0,s=O.createElementFromHTMLString(`\n
    \n \n \n \n
    \n `);s.id=o;let l=s.children[0],d=s.children[1],c=s.children[2];return l.oninput=()=>{let o=l.value;t&&(t.x=o),e.onupdate&&e.onupdate()},d.oninput=()=>{let o=d.value;t&&(t.y=o),e.onupdate&&e.onupdate()},c.oninput=()=>{let o=c.value;t&&(t.z=o),e.onupdate&&e.onupdate()},s},createQuaternionControl:e=>{let t,o=ATON.Utils.generateID("vec3");e.quat&&(t=e.quat);let i=.01;e.step&&(i=e.step);let r=t?t.x:0,a=t?t.y:0,n=t?t.z:0,s=t?t.w:0,l=O.createElementFromHTMLString(`\n
    \n \n \n \n \n
    \n `);l.id=o;let d=l.children[0],c=l.children[1],u=l.children[2],p=l.children[3];return d.oninput=()=>{let o=d.value;t&&(t.x=o),e.onupdate&&e.onupdate()},c.oninput=()=>{let o=c.value;t&&(t.y=o),e.onupdate&&e.onupdate()},u.oninput=()=>{let o=u.value;t&&(t.z=o),e.onupdate&&e.onupdate()},u.oninput=()=>{let o=p.value;t&&(t.w=o),e.onupdate&&e.onupdate()},l},createNodeTrasformControl:e=>{let t,o=ATON.Utils.generateID("ftrans"),i=document.createElement("div");if(i.id=o,e.node&&(t=ATON.getSceneNode(e.node)),e.position){let o=O.createVectorControl({vector:t.position,step:e.position.step});i.append(O.createElementFromHTMLString("")),i.append(o)}if(e.scale){let o=O.createVectorControl({vector:t.scale,step:e.scale.step});i.append(O.createElementFromHTMLString("")),i.append(o)}if(e.rotation){let o=O.createVectorControl({vector:t.rotation,step:e.rotation.step});i.append(O.createElementFromHTMLString("")),i.append(o)}return i},createSceneCard:e=>{let t,o,i,r=document.createElement("div");if(r.classList.add("card","aton-scene-card"),"small"===e.size&&r.classList.add("aton-scene-card-small"),"large"===e.size&&r.classList.add("aton-scene-card-large"),!e.sid)return r;let a="";if(e.keywords){for(let t in e.keywords)a+=t+" ";a=a.trim().toLowerCase(),r.setAttribute("data-search-term",a)}i=ATON.PATH_RESTAPI2+"scenes/"+e.sid+"/cover";let n=e.sid.split("/");if(t=n[0],o=n[1],r.setAttribute("data-search-user",t),e.useblurtint){let e=document.createElement("div");e.classList.add("aton-scene-card-bg"),e.style.backgroundImage="url('"+i+"')",r.append(e)}r.innerHTML+="";let s=document.createElement("div");s.classList.add("card-body","aton-scene-card-body"),r.append(s);let l=document.createElement("div");return l.classList.add("card-title","aton-scene-card-title"),l.innerHTML="Title",s.append(l),e.title?(l.innerHTML=e.title,a+=e.title.trim().toLowerCase(),r.setAttribute("data-search-term",a)):ATON.REQ.get("scenes/"+e.sid,(e=>{e.title&&(l.innerHTML=e.title)})),s.innerHTML+="
    "+t+"
    ",r},createLiveFilter:e=>{let t=ATON.Utils.generateID("filter"),o=t+"-input",i=document.createElement("form");i.id=t,i.classList.add("d-flex"),i.setAttribute("role","search");let r="Search";e.placeholder&&(r=e.placeholder);let a=O.createElementFromHTMLString(``);const n=document.createElement("div");return n.classList.add("input-group"),n.append(O.createElementFromHTMLString("")),n.append(a),e.oninput?a.oninput=e.oninput:a.oninput=()=>{if(!e.filterclass)return;let t=a.value.trim().toLowerCase(),o=document.querySelectorAll(`.${e.filterclass}`);if(t.length<3)for(let e of o)e.classList.remove("d-none");else for(let e of o){let o=e.getAttribute("data-search-term");o&&(o.includes(t)||t.length<1)?e.classList.remove("d-none"):e.classList.add("d-none")}},e.onfocus&&(a.onfocus=e.onfocus),e.onblur&&(a.onblur=e.onblur),i.append(n),i},createPublicScenesGallery:e=>{if(!e.containerid)return;let t=document.getElementById(e.containerid);if(!t)return;const o=o=>{o.sort(O.SCENES_SORTER),console.log(o);for(let i of o){let o=i.sid.startsWith("samples/");if(!o||o&&e.samples){let o=ATON.UI.createSceneCard({title:i.title?i.title:i.sid,sid:i.sid,keywords:i.kwords,useblurtint:!0,size:e.size});t.append(o)}}};return e.entries?o(e.entries):ATON.REQ.get("scenes/",(e=>o(e))),t},createLoginForm:e=>{let t=document.createElement("form");t.classList.add("container-sm","text-center");let o=O.createElementFromHTMLString('
    Username
    '),i=O.createElementFromHTMLString('
    Password
    '),r=O.createElementFromHTMLString(''),a=O.createElementFromHTMLString('');o.append(r),i.append(a);let n=ATON.UI.createButton({text:"Login",icon:"bi-person",variant:"primary",onpress:()=>{let t=r.value.trim(),o=a.value.trim();ATON.REQ.login(t,o,e.onSuccess,e.onFail)}});return e.header?t.append(e.header):t.append(O.createElementFromHTMLString('')),t.append(o),t.append(i),t.append(n),t}};const A=O;let b={USER_STATE_FREQ:.25,REPLICATED_EVT:"EREP",THRES_STATE_POS:.01,THRES_STATE_ORI:.08};b.Avatar=class extends t{constructor(e){super(void 0,ATON.NTYPES.UI),this.userid=e,this.username=void 0,this.message="...",this.color=ATON.Photon.ucolors[this.userid%ATON.Photon.ucolors.length],this._auTalk=[],this._auTalk.push(new THREE.PositionalAudio(ATON.AudioHub._listener)),this._auTalk.push(new THREE.PositionalAudio(ATON.AudioHub._listener));for(let e=0;e<2;e++)this._auTalk[e].setRefDistance(30),this._auTalk[e].setLoop(!1),this.add(this._auTalk[e]);this._auTalki=0,this.bMuted=!1,this._bPlayingAudio=!1,this._blob=void 0,this._b64=void 0,this._tStateCall=-1,this._tProgress=0,this._tFocCall=-1,this._currFocusPos=new THREE.Vector3,this._tgtFocusPos=new THREE.Vector3,this._currState={position:new THREE.Vector3,quaternion:new THREE.Quaternion,scale:1},this._tgtState={position:new THREE.Vector3,quaternion:new THREE.Quaternion,scale:1},this.userlabelnode=void 0,this.mStream=void 0,this._elVStream=void 0,this.realize()}getColor(){return this.color}setTalkDistance(e){e>0&&this._auTalk.setRefDistance(e)}setMuted(e){this.bMuted=e}getAvatarMaterialByUID(e){let t=ATON.MatHub.materials.avatars;return t[e%t.length]}_buildLabel(){this.userlabelnode=ATON.createUINode(),this.labelcontainer=new ThreeMeshUI.Block({width:.5,height:.2,padding:.03,borderRadius:.05,backgroundColor:ATON.MatHub.colors.white,fontFamily:ATON.SUI.PATH_FONT_JSON,fontTexture:ATON.SUI.PATH_FONT_TEX,justifyContent:"center",textAlign:"center"}),this.userlabelnode.position.y=.4,this.userlabelnode.add(this.labelcontainer),this.usernametext=new ThreeMeshUI.Text({content:"User #"+this.userid,fontSize:.07,fontColor:this.color}),this.usernametext.position.y=.01,this.labelcontainer.add(this.usernametext),this.add(this.userlabelnode),ThreeMeshUI.update()}realizeStreamPanel(){let e=ATON.MediaFlow.getOrCreateVideoStream(this.userid,void 0,!0);this._elVStream=e.el;let t=new THREE.PlaneGeometry(1,1);this.mStream=new THREE.Mesh(t,e.matStream),this.mStream.position.y=1;let o=.5625;this.mStream.scale.y=-o,this.mStream.position.y=.8*o,this._elVStream.addEventListener("loadedmetadata",(e=>{o=this._elVStream.videoHeight/this._elVStream.videoWidth,this.mStream.scale.y=-o,this.mStream.position.y=.8*o}))}getStreamPanel(){return this.mStream}toggleStreamPanel(e){void 0!==this.mStream&&(this.mStream.visible=e)}realize(){let e=new THREE.SphereGeometry(.2,16,16);ATON.Photon.customAvatarMaterial?this.usermaterial=ATON.Photon.customAvatarMaterial():this.usermaterial=this.getAvatarMaterialByUID(this.userid);let t=new THREE.Mesh(e,this.usermaterial);this.usermeshnode=ATON.createUINode(),this.usermeshnode.add(t),this.usermeshnode.setMaterial(this.usermaterial),this.usermeshnode.setCloneOnLoadHit(!1),this.add(this.usermeshnode),this.userauinode=new THREE.Sprite(ATON.Photon.uspritemats[this.userid%ATON.Photon.uspritemats.length]),this.userauinode.position.set(0,0,0),this.userauinode.visible=!1,this.add(this.userauinode),this.userfpnode=new THREE.Sprite(ATON.Photon.ufocmats[this.userid%ATON.Photon.ufocmats.length]),this.userfpnode.position.set(0,0,0),this.userfpnode.visible=!1,void 0===ATON.Photon._focNodes[this.userid]&&(ATON.Photon._focNodes[this.userid]=this.userfpnode,ATON.Photon.focGroup.add(this.userfpnode)),this._buildLabel()}loadRepresentation(e){let t=this;return void 0!==t.usermeshnode.children[0]&&t.usermeshnode.remove(t.usermeshnode.children[0]),t.usermeshnode.load(e),this}setUsername(e){return void 0===this.userlabelnode||(this.username=e,this.usernametext.set({content:e}),ThreeMeshUI.update()),this}getUsername(){if(void 0!==this.userid)return void 0===this.username?"User #"+this.userid:this.username}setMessage(e){if(void 0===this.userlabelnode)return this;this.message=e}setTalkVolume(e){if(void 0!==e)if(e>0){this.userauinode.visible=!0;let t=.1+.03*e;this.userauinode.scale.set(t,t,t)}else this.userauinode.visible=!1;else this.userauinode.visible=!1}hideFocalPoint(){this.userfpnode.visible=!1}requestFocus(e){if(void 0===e)return;if(this._tFocCall>=0)return;this._tFocCall=ATON._clock.elapsedTime,this._currFocusPos.copy(this.userfpnode.position);let t=this.scale.x*ATON._worldScale,o=parseFloat(e[0])*t,i=parseFloat(e[1])*t,r=parseFloat(e[2])*t,a=parseFloat(e[3])*t;this._tgtFocusPos.set(o,i,r),this._tgtFocusRad=2*a,this.userfpnode.scale.set(this._tgtFocusRad,this._tgtFocusRad,this._tgtFocusRad),this.userfpnode.visible=!0,ATON.enablePointLight(),ATON.plight.color=this.color,ATON.plight.position.copy(this._tgtFocusPos),ATON.plight.distance=this._tgtFocusRad}handleFocusTransition(){if(this._tFocCall<0)return;let e=ATON.Photon.USER_STATE_FREQ,t=(ATON._clock.elapsedTime-this._tFocCall)/e;if(t>=1)return this._tFocCall=-1,this.userfpnode.position.copy(this._tgtFocusPos),this.userfpnode.scale.set(this._tgtFocusRad,this._tgtFocusRad,this._tgtFocusRad),void(this.userfpnode.visible=!0);this.userfpnode.position.lerpVectors(this._currFocusPos,this._tgtFocusPos,t),ATON.plight.position.copy(this.userfpnode.position),this.userfpnode.visible=!0}requestStateTransition(e){this._tStateCall>=0||void 0!==e&&(this._tStateCall=ATON._clock.elapsedTime,this._currState.position.copy(this.position),this._currState.quaternion.copy(this.quaternion),this._currState.scale=this.scale,this._tgtState.position.copy(e.position),this._tgtState.quaternion.copy(e.quaternion),this._tgtState.scale=1/e.scale)}handleStateTransition(){if(this._tStateCall<0)return;let e=ATON.Photon.USER_STATE_FREQ;this._tProgress=e<=0?1:(ATON._clock.elapsedTime-this._tStateCall)/e;let t=this._currState,o=this._tgtState;if(this._tProgress>=1)return this._tStateCall=-1,this.position.copy(o.position),void this.usermeshnode.quaternion.copy(o.quaternion);this.position.lerpVectors(t.position,o.position,this._tProgress),this.usermeshnode.quaternion.slerp(o.quaternion,this._tProgress)}update(){if(this.handleStateTransition(),this.userfpnode&&this.userfpnode.visible){this.handleFocusTransition();let e=this.userfpnode.scale.x;e>.001?(this.userfpnode.scale.set(.99*e,.99*e,.99*e),ATON.plight.intensity*=.99):(this.userfpnode.visible=!1,ATON.disablePointLight())}let e=ATON.Nav._camera,t=ATON.Nav._currPOV.pos;if(void 0===e||void 0===t)return;this.userlabelnode&&this.userlabelnode.orientToCamera();let o=this.userauinode.scale.x;o*=.99,o>.01?this.userauinode.scale.set(o,o,o):this.userauinode.visible=!1}_handleTalk(){if(this._auTalk.isPlaying)return;if(this._auChunks.length<2)return;let e=this._auChunks[this._iAU];this._auTalk.setBuffer(e),this._auTalk.play(),this.setTalkVolume(5)}_handleTalkOLD(){if(this._bPlayingAudio)return;if(this._auChunks.length<1)return;let e=this._auChunks.shift();this._auTalk.setBuffer(e),this._auTalk.play(),this._bPlayingAudio=!0,this._auTalk.onended=()=>{this._bPlayingAudio=!1,e=null},this.setTalkVolume(5)}},b.CSTATE={DISCONNECTED:0,CONNECTING:1,CONNECTED:2},b.init=()=>{b.address=window.location.origin,b.initMaterials(),b.socket=void 0,b._cstate=b.CSTATE.DISCONNECTED,b._reqSSID=void 0,b._username=void 0,b.uid=void 0,b.color=ATON.MatHub.colors.white,b._bStreamFocus=!1,b._numUsers=1,b.avatarList=[],b.avaGroup=ATON.createUINode("avatars"),b.avaGroup.attachToRoot(),b.focGroup=ATON.createUINode("focus"),b.focGroup.attachTo(b.avaGroup),b._focNodes=[],b.bSendState=!0,window.setInterval(b.sendState,1e3*b.USER_STATE_FREQ),b._lastStateSent=void 0,b._bShowAvaG=!0,b._bSpatial=!0,b._decS={quaternion:new THREE.Quaternion,position:new THREE.Vector3},b.customAvatarMaterial=void 0,console.log("Photon initialized"),b.enableChatLog(),b._elVStream=void 0,window.addEventListener("beforeunload",(e=>{b.disconnect()}))},b.setCustomAvatarMaterialRoutine=e=>{b.customAvatarMaterial=e},b.enableChatLog=()=>{b._elChat=$("
    ").text("")},b.getNumUsers=()=>b._numUsers,b.initMaterials=()=>{b.ucolorhex=[],b.ucolorhex.push("#D88"),b.ucolorhex.push("#DD8"),b.ucolorhex.push("#8D8"),b.ucolorhex.push("#8DD"),b.ucolorhex.push("#88D"),b.ucolorhex.push("#D8D"),b.ucolorhex_light=[],b.ucolorhex_light.push("#FAA"),b.ucolorhex_light.push("#FFA"),b.ucolorhex_light.push("#AFA"),b.ucolorhex_light.push("#AFF"),b.ucolorhex_light.push("#AAF"),b.ucolorhex_light.push("#FAF"),b.ucolors=[],b.ucolors.push(new THREE.Color(b.ucolorhex[0])),b.ucolors.push(new THREE.Color(b.ucolorhex[1])),b.ucolors.push(new THREE.Color(b.ucolorhex[2])),b.ucolors.push(new THREE.Color(b.ucolorhex[3])),b.ucolors.push(new THREE.Color(b.ucolorhex[4])),b.ucolors.push(new THREE.Color(b.ucolorhex[5])),b.ucolorsdark=[],b.ucolorsdark.push(new THREE.Color(.2,0,0)),b.ucolorsdark.push(new THREE.Color(.2,.2,0)),b.ucolorsdark.push(new THREE.Color(0,.2,0)),b.ucolorsdark.push(new THREE.Color(0,.2,.2)),b.ucolorsdark.push(new THREE.Color(0,0,.2)),b.ucolorsdark.push(new THREE.Color(.2,0,.2));let e=ATON.MatHub.materials;e&&(e.avatars=[]);for(let t=0;t{if(!b.isConnected())return;let o=b.socket;o&&o.emit(b.REPLICATED_EVT,{e,d:t})},b.fireEvent=b.fire,b.on=(e,t)=>{if(void 0===t)return;let o=ATON.EventHub.evNetwork;void 0===o[e]&&(o[e]=[]),o[e].push(t)},b.isConnected=()=>b._cstate===b.CSTATE.CONNECTED,b.hasID=()=>void 0!==b.uid,b.log=e=>{if(!b.isConnected())return;let t=b.socket;t&&t.emit("UMSG",e)},b.joinSession=e=>{b.socket&&(void 0===e&&(e=ATON.SceneHub.currID),void 0!==e?(console.log("Joining Photon session '"+e+"'..."),b.socket.emit("SENTER",e)):console.log("Photon ERROR: current session ID is undefined"))},b.requestSceneState=()=>{b.socket&&b.socket.emit("SSTATE")},b.setAvatarsVisibility=e=>{b._bShowAvaG=e,e?b.avaGroup.show():b.avaGroup.hide()},b.disableSpatiality=()=>{b._bSpatial=!1},b.enableSpatiality=()=>{b._bSpatial=!0},b.setAddress=e=>{e&&(b.address=e)},b.connect=e=>{if(b._cstate===b.CSTATE.CONNECTED)return;if(b._cstate===b.CSTATE.CONNECTING)return;b._reqSSID=e;let t={};ATON.Utils.isConnectionSecure()?(t.path="/svrc/socket.io",t.secure=!0,t.rejectUnauthorized=!1):t.path="/vrc/socket.io",b._cstate=b.CSTATE.CONNECTING,b.socket=io.connect(b.address,t),void 0!==b.socket?b._registerSocketHandlers():b._cstate=b.CSTATE.DISCONNECTED},b.disconnect=()=>{void 0!==b.socket&&(b._numUsers=1,b.socket.disconnect(),b.color=ATON.MatHub.colors.white,ATON.plight.color=ATON.MatHub.colors.white,b._cstate=b.CSTATE.DISCONNECTED)},b._onConnected=()=>{},b.setUsername=e=>{(e=e.trim()).length<1||(b._username=e,void 0!==b.socket&&void 0!==b.uid&&(b.appendToChatBox("Your username is now: "+e+""),b.socket.emit("UNAME",e)))},b.setMessage=e=>{(e=e.trim()).length<1||e.length>3e3||(b._msg=e,void 0!==b.socket&&void 0!==b.uid&&(b.socket.emit("UMSG",e),b._elChat&&(e=b.chatMessageProcessor(b.uid,e),b.appendToChatBox("
    YOU
    : "+e+""))))},b.appendToChatBox=e=>{b._elChat&&(b._elChat.append("
    "+e+"
    "),b._elChat.scrollTop(b._elChat[0].scrollHeight))},b._registerSocketHandlers=()=>{b.socket.on("connect",(()=>{b._cstate=b.CSTATE.CONNECTED,void 0!==b._reqSSID?b.joinSession(b._reqSSID):b.joinSession(ATON.SceneHub.currID),console.log("Connected to Photon service!"),ATON.fire("VRC_Connected"),b._onConnected()})),b.socket.on("disconnect",(()=>{b._cstate=b.CSTATE.DISCONNECTED,b.uid=void 0,b.avaGroup.hide(),b.appendToChatBox("YOU disconnected from the Photon session"),console.log("Disconnected from Photon service!"),ATON.fire("VRC_Disconnected")})),b.socket.on(b.REPLICATED_EVT,(e=>{let t=e.e,o=e.d,i=ATON.EventHub.evNetwork[t];ATON.EventHub.executeHandlers(i,o)})),b.socket.on("ID",(e=>{console.log("Your ID is "+e),b.uid=e,b.color=b.ucolors[b.uid%b.ucolors.length],b._bShowAvaG&&b.avaGroup.show(),b.appendToChatBox("Your ID is #"+e+""),b.requestSceneState(),ATON.fire("VRC_IDassigned",e)})),b.socket.on("SSTATE",(e=>{b._numUsers=e.numUsers,console.log("Num. users: "+b._numUsers),ATON.fire("VRC_SceneState",e)})),b.socket.on("UENTER",(e=>{let t=e;console.log("User #"+t+" entered the session"),b.appendToChatBox("User #"+t+" entered the session"),b.requestSceneState(),ATON.fire("VRC_UserEnter",t)})),b.socket.on("ULEAVE",(e=>{let t=e;if(void 0===t)return;let o=b.avatarList[t];o&&(o.toggleStreamPanel(!1),o.hide()),console.log("User #"+t+" left the session"),b.appendToChatBox("User #"+t+" left the session"),b.requestSceneState(),ATON.fire("VRC_UserLeave",t)})),b.socket.on("USTATE",(e=>{if(!b._bShowAvaG)return;if(!b._bSpatial)return;let t=b.decodeState(e),o=t.userid,i=b.touchAvatar(o);i.requestStateTransition(t);let r=1/t.scale;i.scale.set(r,r,r)})),b.socket.on("UFOCUS",(e=>{if(!b._bSpatial)return;let t=e.uid,o=e.fp;b.touchAvatar(t).requestFocus(o)})),b.socket.on("UNAME",(e=>{let t=e.uid,o=e.name;void 0!==t&&(b.touchAvatar(t).setUsername(o),console.log("User #"+t+" changed username to: "+o),b.appendToChatBox("User #"+t+" changed username to: "+o+""),ATON.fire("VRC_UName",e))})),b.socket.on("UMSG",(e=>{let t=e.uid,o=e.msg;if(void 0===t)return;let i=b.touchAvatar(t);o.length<100&&i.setMessage(o),console.log("User #"+t+": "+o);let r=i.getUsername();o=b.chatMessageProcessor(t,o),b.ucolorhex[t%6];let a=b.ucolorhex_light[t%6];b.appendToChatBox("
    "+r+"
    : "+o+""),ATON.fire("VRC_UMessage",e)})),b.socket.on("UTALK",(e=>{let t=e.uid;if(void 0===t)return;let o=e.audio;if(o){if(b._bSpatial){let e=b.touchAvatar(t);if(e.bMuted)return;ATON.AudioHub._loader.load(o,(t=>{let o=e._auTalk[e._auTalki],i=(e._auTalki+1)%2;o.setBuffer(t),o.isPlaying||o.play(),e.setTalkVolume(5),e._auTalki=i}))}ATON.fire("VRC_UTalk",e),o=null}})),b.socket.on("UTALKSTOP",(e=>{void 0!==e.uid&&ATON.fire("VRC_UTalkStop",e)})),b.socket.on("UVIDEO",(e=>{void 0!==e.uid&&ATON.fire("VRC_UVideo",e)})),b.socket.on("UVIDEOSTOP",(e=>{let t=e.uid;if(void 0===t)return;let o=b.avatarList[t];o&&o.toggleStreamPanel(!1),ATON.fire("VRC_UVideoStop",e)}))},b.chatMessageProcessor=(e,t)=>{const o=(t=String(t)).match(/(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)/g);return o&&o.forEach((e=>{t=t.replace(e,""+e+"")})),t},b.encodeState=e=>{if(!e)return;let t=new Float32Array(5);t[0]=e.position.x,t[1]=e.position.y,t[2]=e.position.z;var o=new Int8Array(t.buffer);return o[12]=128*e.quaternion.x,o[13]=128*e.quaternion.y,o[14]=128*e.quaternion.z,o[15]=128*e.quaternion.w,o[16]=e.userid,o[17]=ATON._ws,o},b.decodeState=e=>{let t=new Int8Array(e);b._decS.userid=t[16];let o=ATON._unpackScale(t[17]);return b._decS.scale=o,b._decS.quaternion.set(parseFloat(t[12])/128,parseFloat(t[13])/128,parseFloat(t[14])/128,parseFloat(t[15])/128),t=new Float32Array(e),b._decS.position.set(parseFloat(t[0])/o,parseFloat(t[1])/o,parseFloat(t[2])/o),b._decS},b.update=()=>{if(b.isConnected())for(let e=0;e{if(void 0!==e){if(e)return b._bStreamFocus||(ATON.fire("VRC_FocusStreamingStarted"),ATON.enablePointLight(),ATON.plight.color=ATON.Photon.color),void(b._bStreamFocus=!0);{b._bStreamFocus&&(ATON.fire("VRC_FocusStreamingStopped"),ATON.disablePointLight());let e=ATON.SUI._selectorRad;ATON.SUI.mainSelector.scale.set(e,e,e),b._bStreamFocus=!1}}},b.sendState=()=>{if(!b.bSendState||!b._bSpatial)return;if(void 0===b.uid)return;if(!b.socket||!b.isConnected())return;let e=ATON.Nav._currPOV;if(!e)return;let t=ATON.getSceneFocalPoint();if(b._bStreamFocus&&void 0!==t){let e=t.x.toFixed(3),o=t.y.toFixed(3),i=t.z.toFixed(3),r=ATON.SUI.getSelectorRadius().toFixed(3);b.socket.emit("UFOCUS",[e,o,i,r])}if(!e.pos)return;if(!ATON.Nav._qOri)return;if(void 0!==b._lastStateSent){let t=b._lastStateSent.position,o=b._lastStateSent.quaternion,i=t.distanceToSquared(e.pos),r=o.angleTo(ATON.Nav._qOri);if(ib.avatarList[e],b.touchAvatar=e=>{if(void 0===b.avatarList[e]){let t=new b.Avatar(e);t.attachTo(b.avaGroup),t.loadRepresentation(ATON.PATH_RES+"models/vrc/head.glb"),b.avatarList[e]=t}let t=b.avatarList[e];return t.visible||ATON.fire("VRC_UserEnter",e),b._bShowAvaG&&t.show(),t},b.destroyAvatar=e=>{let t=b.avatarList[e];void 0!==t&&t.destroy()},b.clearAllAvatars=()=>{for(let e in b.avatarList)b.avatarList[e].hide()};const P=b;let f={FLOAT_PREC:5,init:()=>{f.bConvexBuilding=!1,f.convexPoints=[],f.convexNode=void 0,f.currConvexMesh=void 0,f.currSemNode=ATON.createSemanticNode(),f.currSemNode.disablePicking(),f.currSemNode.attachToRoot(),f.resetMaterial(),f._numShapes=0},resetMaterial:()=>{f.currMaterial=ATON.MatHub.getMaterial("semanticShapeHL")},setMaterial:e=>{void 0!==e&&(f.currMaterial=e)},addConvexPoint:e=>{if(void 0===e)return!1;if(f.convexPoints.length>0){let t=f.convexPoints[f.convexPoints.length-1];if(e.equals(t))return!1}f.convexPoints.push(e);let t=f.convexPoints.length,o=new THREE.Sprite(ATON.SUI.getOrCreateSpritePointEdit()),i=.02*ATON.getSceneQueriedDistance();if(void 0===i&&(i=.02),o.position.copy(e),o.scale.set(i,i,i),ATON.SUI.gPoints.add(o),t<4)return!1;let r=new THREE.ConvexGeometry(f.convexPoints),a=new THREE.Mesh(r,ATON.MatHub.getMaterial("semanticShapeEdit"));if(f.bConvexBuilding){let t=f.currConvexMesh;t.geometry.dispose(),t.geometry=r,ATON.Utils.setVectorPrecision(e,4),t.userData._convexPoints.push(e.x),t.userData._convexPoints.push(e.y),t.userData._convexPoints.push(e.z)}else{f.currSemNode.add(a),a.userData._convexPoints=[];for(let e=0;e{if(0!==f.convexPoints.length&&(f.convexPoints.pop(),f.currConvexMesh)){let e=f.currConvexMesh.userData;e._convexPoints&&e._convexPoints.pop()}},stopCurrentConvex:()=>{f.bConvexBuilding&&(f.convexPoints=[],f.bConvexBuilding=!1,f.currSemNode.removeChildren(),ATON.SUI.gPoints.removeChildren())},getCurrentConvexShape:()=>f.currSemNode,isBuildingShape:()=>f.convexPoints.length>0,completeConvexShape:e=>{if(f.convexPoints=[],f.bConvexBuilding=!1,void 0===f.currSemNode)return;void 0===e&&(e="sem"+f._numShapes);let t=ATON.getSemanticNode(e)||ATON.createSemanticNode(e),o=f.currSemNode.children[0];return ATON.SUI.addSemIcon(e,o),t.add(o),t.setMaterial(ATON.MatHub.materials.semanticShape),t.setDefaultAndHighlightMaterials(ATON.MatHub.materials.semanticShape,f.currMaterial),t.enablePicking(),f.currSemNode.removeChildren(),f._numShapes++,ATON.SUI.gPoints.removeChildren(),ATON._bqSem=!0,t},createConvexShape:(e,t)=>{let o=new THREE.ConvexGeometry(t),i=new THREE.Mesh(o,ATON.MatHub.materials.semanticShape);i.userData._convexPoints=[];for(let e=0;e{if(void 0===ATON._queryDataScene)return!1;void 0===e&&(e=.02);let t=ATON._queryDataScene.p,o=ATON.Nav.getCurrentEyeLocation();return t.lerpVectors(t,o,e),f.addConvexPoint(t),t},createSphere:(e,t,o)=>{if(void 0===t)return;if(void 0===o)return;void 0===e&&(e="sem"+f._numShapes);let i=ATON.getOrCreateSemanticNode(e),r=new THREE.Mesh(ATON.Utils.geomUnitSphere,ATON.MatHub.materials.semanticShape),a=new THREE.Object3D;return a.position.copy(t),a.scale.set(o,o,o),a.add(r),ATON.SUI.addSemIcon(e,a),i.add(a),i.enablePicking(),i.setDefaultAndHighlightMaterials(ATON.MatHub.materials.semanticShape,f.currMaterial),f._numShapes++,ATON._bqSem=!0,i},createSurfaceSphere:e=>{if(!ATON._queryDataScene)return;let t=ATON._queryDataScene.p,o=ATON.SUI.getSelectorRadius();return f.createSphere(e,t,o)},deleteSemanticNode:e=>{let t=ATON.getSemanticNode(e);if(void 0===t)return!1;if(t.removeChildren(),void 0===ATON.SUI.gSemIcons)return!0;for(let t in ATON.SUI.gSemIcons.children){let o=ATON.SUI.gSemIcons.children[t];o&&o.name===e&&ATON.SUI.gSemIcons.removeChild(o)}return!0}};const E=f;let R={SEMSHAPE_SPHERE:0,SEMSHAPE_CONVEX:1,POPUP_DT:500,STD_SEL_RAD:.05,_bRealized:!1,realize:()=>{if(R._bRealized)return;R.PATH_RES_ICONS=ATON.PATH_RES+"icons/",R._bPopup=!1,R._tPopup=void 0,R.popupBlurBG=0,R._userAuth={},R._bControlLight=!1,R._bControlSelScale=!1,R._cLightDir=new THREE.Vector3,R._auSemNode=void 0,R._auSemNodePlaying=!1,R._bReqHome=!1,R._bVRCsetup=!1,R.urlParams=new URLSearchParams(window.location.search),R._uiSetupBase(),R._uiProfiles={},R._uiCurrProfile=void 0,R._selRanges=[.01,50],R._selRefRadius=.5,ATON.realize(),ATON.on("Fullscreen",(e=>{R.uiSwitchButton("fullscreen",e)}));let e=ATON.FE.urlParams.get("d");e&&e>0&&(ATON.setDefaultPixelDensity(e),ATON.toggleAdaptiveDensity(!1));let t=ATON.FE.urlParams.get("dd");t&&t>0&&ATON.toggleAdaptiveDensity(!0),R._canvas=ATON._renderer.domElement,R._bSem=!1,R._bShowSemLabel=!0,R._bRealized=!0,R.loadSceneID=ATON.App.loadScene},_handleHomeReq:()=>{R._bReqHome||ATON.getRootScene().getBound().radius<=0||(R._bReqHome=!0,void 0!==ATON.Nav.homePOV?ATON.Nav.requestHome(1):ATON.Nav.computeAndRequestDefaultHome(.5))},addBasicLoaderEvents:()=>{ATON.on("NodeRequestFired",(()=>{$("#idLoader").show()})),ATON.on("SceneJSONLoaded",(()=>{ATON.SceneHub.getDescription()&&$("#btn-info").show(),void 0!==ATON.Nav.homePOV&&ATON.Nav.requestHome(1),ATON.XPFNetwork._list.length>0&&void 0===ATON.Nav.homePOV&&(ATON.XPFNetwork.setHomeXPF(0),ATON.XPFNetwork.requestTransitionByIndex(0))})),ATON.on("AllNodeRequestsCompleted",(()=>{$("#idLoader").hide(),ATON.CC.anyCopyrightFound()&&$("#btn-cc").show(),R.computeSelectorRanges(),ATON.SUI.setSelectorRadius(Math.min(R.STD_SEL_RAD,R._selRefRadius)),R._handleHomeReq()})),ATON.on("XR_support",(e=>{"immersive-vr"===e.type&&(e.v?$("#btn-vr").show():$("#btn-vr").hide())})),ATON.on("SemanticNodeHover",(e=>{let t=ATON.getSemanticNode(e);void 0!==t&&(R.showSemLabel(e),R._bSem=!0,t.highlight(),$("canvas").css({cursor:"crosshair"}),ATON.SUI.gSemIcons&&ATON.SUI.gSemIcons.hide())})),ATON.on("SemanticNodeLeave",(e=>{let t=ATON.getSemanticNode(e);void 0!==t&&(R.hideSemLabel(),R._bSem=!1,t.restoreDefaultMaterial(),$("canvas").css({cursor:"grab"}),ATON.SUI.gSemIcons&&ATON.SUI.gSemIcons.show())})),ATON.on("SemanticMaskHover",(e=>{R.showSemLabel(e),R._bSem=!0,$("canvas").css({cursor:"crosshair"})})),ATON.on("SemanticMaskLeave",(e=>{R.hideSemLabel(),R._bSem=!1,$("canvas").css({cursor:"grab"})})),ATON.addUpdateRoutine(R._update)},showSemLabel:e=>{R._bShowSemLabel&&($("#idPopupLabel").html(e),$("#idPopupLabel").show(),ATON.SUI.setInfoNodeText(e))},hideSemLabel:()=>{$("#idPopupLabel").hide(),$("#idPopupLabel").html("")},controlLight:e=>{R._bControlLight=e,ATON.Nav.setUserControl(!e)},controlSelectorScale:e=>{R._bControlSelScale=e,ATON._bPauseQuery=e,ATON.Nav.setUserControl(!e)},attachGizmoToNode:e=>{if(void 0===ATON._gizmo)return;let t=ATON.getSceneNode(e);void 0!==t&&ATON._gizmo.attach(t)},useMouseWheelToScaleSelector:e=>{void 0===e&&(e=.9),ATON.on("MouseWheel",(t=>{if(ATON._kModCtrl){let e=ATON.Nav.getFOV();return t>0?e+=1:e-=1,void ATON.Nav.setFOV(e)}if(ATON._kModShift){let o=ATON.SUI.mainSelector.scale.x;return t>0?o*=e:o/=e,oR._selRanges[1]&&(o=R._selRanges[1]),void ATON.SUI.setSelectorRadius(o)}}))},_update:()=>{if(R._bControlLight){const e=ATON._screenPointerCoords.x,t=ATON._screenPointerCoords.y;R._cLightDir.x=-Math.cos(e*Math.PI),R._cLightDir.y=4*-t,R._cLightDir.z=-Math.sin(e*Math.PI),R._cLightDir.normalize(),ATON.setMainLightDirection(R._cLightDir)}if(ATON.XR._bPresenting){let e=ATON.XR.getAxisValue(ATON.XR.HAND_R);if(!ATON.Photon._bStreamFocus){let t=ATON.SUI._selectorRad;t+=.01*e.y,t>.001&&ATON.SUI.setSelectorRadius(t)}}else{if(ATON.Nav.isTransitioning()||ATON.Nav._bInteracting||ATON._bPauseQuery)return void $("#idPopupLabel").hide();if(R._bSem&&R._bShowSemLabel){$("#idPopupLabel").show();let e=.5*ATON._screenPointerCoords.x*window.innerWidth,t=.5*(1-ATON._screenPointerCoords.y)*window.innerHeight;t-=55,$("#idPopupLabel").css("transform","translate("+e+"px, "+t+"px)")}else $("#idPopupLabel").hide()}},uiBasicSetup:()=>{R.uiAddButton("idTopToolbar","fullscreen",ATON.toggleFullScreen),ATON.Utils.isConnectionSecure()&&R.uiAddButton("idTopToolbar","vr",ATON.XR.toggle),R.uiAddButton("idBottomToolbar","home",(()=>{ATON.Nav.requestHome(.1)}))},_uiSetupBase:()=>{$("#idPopup").click(R.popupClose),$("#idLoader").html(""),$("body").prepend("
    "),R.hideSemLabel()},uiAddButton:(e,t,o,i)=>{let r,a;t.endsWith(".png")?(r=t,a=t.slice(0,-4)):(r=R.PATH_RES_ICONS+t+".png",a=t);let n=$("
    ");$("#"+e).append(n),o&&n.click(o),i&&n.attr("title",i)},uiSwitchButton:(e,t)=>{t?$("#btn-"+e).addClass("switchedON"):$("#btn-"+e).removeClass("switchedON")},uiSetButtonHandler:(e,t)=>{$("#"+e).click(t)},uiAddButtonHome:e=>{R.uiAddButton(e,"home",(()=>{ATON.Nav.requestHome(.3)}),"Home viewpoint")},uiAddButtonBack:(e,t)=>{R.uiAddButton(e,"back",(()=>{t&&t.length>1&&t.startsWith("http:")?ATON.Utils.goToURL(t):history.back()}),"Go Back")},uiAddButtonFirstPerson:e=>{R.uiAddButton(e,"fp",(()=>{ATON.Nav.isFirstPerson()?(ATON.Nav.setOrbitControl(),R.uiSwitchButton("fp",!1)):(ATON.Nav.setFirstPersonControl(),R.uiSwitchButton("fp",!0))}),"First-person navigation mode"),ATON.Nav.isFirstPerson()?R.uiSwitchButton("fp",!0):R.uiSwitchButton("fp",!1)},uiAddButtonVR:e=>{ATON.Utils.isConnectionSecure()&&(R.uiAddButton(e,"vr",(()=>{ATON.XR.toggle("immersive-vr")}),"Immersive VR mode"),ATON.Utils.isVRsupported()||$("#btn-vr").hide())},uiAddButtonAR:e=>{ATON.Utils.isConnectionSecure()&&R.uiAddButton(e,"ar",(()=>{ATON.Utils.isARsupported()&&ATON.XR.toggle("immersive-ar")}),"Immersive AR mode")},uiAddButtonDeviceOrientation:e=>{ATON.Utils.isConnectionSecure()&&ATON.Utils.isMobile()&&(R.uiAddButton(e,"devori",(()=>{ATON.Nav.isDevOri()?(ATON.Nav.restorePreviousNavMode(),R.uiSwitchButton("devori",!1)):(ATON.Nav.setDeviceOrientationControl(),R.uiSwitchButton("devori",!0))}),"Device-orientation mode"),ATON.Nav.isDevOri()?R.uiSwitchButton("devori",!0):R.uiSwitchButton("devori",!1))},uiAddButtonNav:e=>{R.uiAddButton(e,"nav",(()=>{R.popupNav()}),"Navigation")},uiAddButtonTalk:e=>{ATON.Utils.isConnectionSecure()&&(R.uiAddButton(e,"talk",(()=>{ATON.MediaFlow.isAudioRecording()?(ATON.MediaFlow.stopAudioStreaming(),$("#btn-talk").removeClass("atonBTN-rec")):(ATON.MediaFlow.startAudioStreaming(),$("#btn-talk").addClass("atonBTN-rec"))}),"Talk ON/OFF"),ATON.MediaFlow.isAudioRecording()?$("#btn-talk").addClass("atonBTN-rec"):$("#btn-talk").removeClass("atonBTN-rec"))},uiAddButtonStreamFocus:e=>{R.uiAddButton(e,"focus",(()=>{ATON.Photon._bStreamFocus?(ATON.Photon.setFocusStreaming(!1),$("#btn-focus").removeClass("atonBTN-rec")):(ATON.Photon.setFocusStreaming(!0),$("#btn-focus").addClass("atonBTN-rec"))}),"Focus streaming ON/OFF"),ATON.Photon._bStreamFocus?$("#btn-focus").addClass("atonBTN-rec"):$("#btn-focus").removeClass("atonBTN-rec")},uiAddButtonMainVideoPanoPlayPause:e=>{R.uiAddButton(e,"playpause",(()=>{ATON._vpanoPlaying?ATON._elPanoVideo&&ATON._elPanoVideo.pause():ATON._elPanoVideo&&ATON._elPanoVideo.play()}),"360 Video play/pause"),ATON._elPanoVideo?$("#btn-playpause").show():$("#btn-playpause").hide()},uiAddButtonQR:e=>{ATON.Utils.isLocalhost()||R.uiAddButton(e,"qr",R.popupQR,"QR-code")},uiAddButtonScreenshot:e=>{R.uiAddButton(e,"sshot",R.popupScreenShot,"Screenshot")},uiAddButtonInfo:e=>{R.uiAddButton(e,"info",ATON.FE.popupSceneInfo,"Scene information"),$("#btn-info").hide()},uiAddButtonFullScreen:e=>{R.uiAddButton(e,"fullscreen",(()=>{ATON.toggleFullScreen()}),"Fullscreen"),R.uiSwitchButton("fullscreen",ATON.isFullscreen())},uiAddKeywordsArea:(e,t,o,i)=>{let r="";r+="Add keyword:

    ",r+="
    ",$("#"+e).html(r),R.uiAttachInputFilterID("idKWordInput"),$.getJSON(ATON.PATH_RESTAPI+"keywords/",(t=>{let o="";for(let e in t)o+="";o+="",$("#"+e).append(o)}));let a={},n=e=>{a[e]||(e=e.toLowerCase().trim(),$("#idKWordInput").val(""),a[e]=1,console.log("Added keyword "+e),o&&o(e),$("#idKWords").append("
    "+e+"
    "),$("#idkw-"+e).click((()=>{$("#idkw-"+e).remove(),a[e]=void 0,console.log("Removed keyword "+e),i&&i(e)})))};if(t)for(let e in t)n(t[e]);$("#idKWordInput").keypress((function(e){if("13"!=(e.keyCode?e.keyCode:e.which))return;let t=$("#idKWordInput").val().toLowerCase().trim();!t||t.length<3||n(t)})),$("#idKWadd").click((()=>{let e=$("#idKWordInput").val().toLowerCase().trim();!e||e.length<3||n(e)}))},uiAttachCollectionItemsToInput:(e,t)=>{let o="";$("#"+e).attr("list",e+"-list"),$("#"+e).attr("name",e+"-list"),$.getJSON(ATON.PATH_RESTAPI+"c/"+t+"/",(t=>{o+="";for(let e in t){let i=t[e];o+=""}o+="",$("#"+e).html(o)}))},getVRCclassFromID:e=>"atonVRCu"+e%6,_setupVRCevents:()=>{R._bVRCsetup||(ATON.on("VRC_IDassigned",(e=>{$("#btn-vrc").addClass(R.getVRCclassFromID(e)),ATON.SUI.setSelectorColor(ATON.Photon.color),ATON.plight.color=ATON.Photon.color,R.checkAuth((e=>{void 0!==e.username&&ATON.Photon.setUsername(e.username)}))})),ATON.on("VRC_SceneState",(e=>{let t=ATON.Photon.getNumUsers();t>1?$("#idVRCnumusers").html(t):$("#idVRCnumusers").html(""),console.log("Users: "+t)})),ATON.on("VRC_Disconnected",(()=>{$("#btn-vrc").attr("class","atonBTN"),ATON.SUI.setSelectorColor(ATON.MatHub.colors.defUI),ATON.MediaFlow.stopAllStreams(),$("#idVRCnumusers").html("")})),R._bVRCsetup=!0)},uiAddButtonPhoton:e=>{R.uiAddButton(e,"vrc",(()=>{ATON.Photon.isConnected()?R.popupVRC():ATON.Photon.connect()}),"Photon (collaborative session)"),$("#btn-vrc").append(""),R._setupVRCevents(),void 0!==ATON.Photon.uid?$("#btn-vrc").addClass(R.getVRCclassFromID(ATON.Photon.uid)):$("#btn-vrc").attr("class","atonBTN")}};R.uiAddButtonVRC=R.uiAddButtonPhoton,R.uiAddButtonUser=e=>{R.uiAddButton(e,"user",(()=>{R.popupUser()}),"User"),R.checkAuth((e=>{void 0!==e.username?$("#btn-user").addClass("switchedON"):$("#btn-user").removeClass("switchedON")}))},R.uiSetEditMode=(e,t)=>{ATON.SceneHub._bEdit=e,R.uiSwitchButton("edit",e),ATON._renderer.domElement,e?$("#"+t).addClass("atonToolbar-bg-edit"):$("#"+t).removeClass("atonToolbar-bg-edit")},R.uiAddButtonEditMode=e=>{R.uiAddButton(e,"edit",(()=>{R.checkAuth((t=>{void 0!==t.username?(ATON.SceneHub._bEdit?R.uiSetEditMode(!1,e):R.uiSetEditMode(!0,e),console.log("Persistent Edit Mode: "+ATON.SceneHub._bEdit)):R.popupUser()}))}),"Persistent Edit Mode"),ATON.SceneHub._bEdit?R.uiSwitchButton("edit",!0):R.uiSwitchButton("edit",!1)},R.uiAddProfile=(e,t)=>{"function"==typeof t&&(R._uiProfiles[e]=t)},R.uiLoadProfile=e=>{let t=R._uiProfiles[e];void 0!==t&&(t(),R._uiCurrProfile=e,console.log("Loaded UI Profile: "+R._uiCurrProfile))},R.getCurrentUIP=()=>R._uiCurrProfile,R.attachHandlerToButton=(e,t)=>{void 0!==t&&$("#"+e).click((()=>{t()}))},R.uiAttachInputFilterID=e=>{$("#"+e).on("keyup change input",(()=>{let t=$("#"+e).val(),o=new RegExp("[^A-Za-z0-9-_]","ig");$("#"+e).val(t.replace(o,""))}))},R.switchNode=(e,t,o)=>{let i;i=o===ATON.NTYPES.SEM?ATON.getSemanticNode(e):ATON.getSceneNode(e),void 0!==i&&(i.toggle(t),ATON.fire("FE_NodeSwitch",{nid:e,t:o,v:t}))},R.uiCreateGraph=e=>{let t=ATON.snodes;e===ATON.NTYPES.SEM&&(t=ATON.semnodes);let o="";for(let i in t){let r=t[i].visible?"checked":"";"."!==i&&(o+="'+i,o+="
    ")}return o},R.setupBasicUISounds=()=>{R.auLib={},R.auLib.switch=new Audio(ATON.PATH_RES+"audio/switch.wav"),R.auLib.switch.loop=!1},R.playAudioFromSemanticNode=e=>{if(void 0===e)return;let t=ATON.getSemanticNode(e);if(void 0===t)return;let o=t.getAudio();void 0!==o&&("string"!=typeof o||o.startsWith("data:audio")||(o=ATON.Utils.resolveCollectionURL(o)),void 0===R._auSemNode||null===R._auSemNode?R._auSemNode=new THREE.Audio(ATON.AudioHub._listener):R._auSemNode.stop(),ATON.AudioHub._loader.load(o,(e=>{R._auSemNode.setBuffer(e),R._auSemNode.setLoop(!1),R._auSemNode.play()})))},R.popupShow=(e,t)=>{if(R._bPopup)return!1;R._tPopup=Date.now();let o="atonPopup ";t&&(o+=t);let i="
    ";return i+=e+"
    ",R._bPopup=!0,ATON._bListenKeyboardEvents=!1,$("#idPopup").html(i),$("#idPopupContent").click((e=>{e.stopPropagation()})),$("#idPopup").show(),R.popupBlurBG>0&&(ATON._renderer.domElement.style.filter="blur("+R.popupBlurBG+"px)"),ATON._bPauseQuery=!0,$("#idTopToolbar").hide(),$("#idBottomToolbar").hide(),$("#idBottomRToolbar").hide(),$("#idPoweredBy").hide(),!0},R.popupClose=e=>{Date.now()-R._tPopup0&&(ATON._renderer.domElement.style.filter="none"),$("#idPopup").hide(),ATON._bPauseQuery=!1,$("#idTopToolbar").show(),$("#idBottomToolbar").show(),$("#idBottomRToolbar").show(),$("#idPoweredBy").show(),ATON.focusOn3DView())},R.subPopup=e=>{ATON.FE.popupClose(),e()},R.popupQR=()=>{let e="
    Share
    ";if(e+="


    ",!ATON.FE.popupShow("
    Share


    "))return;let t=window.location.href;new QRCode(document.getElementById("idQRcode"),t)},R.popupScreenShot=()=>{let e=ATON.Utils.takeScreenshot(256);R.checkAuth((t=>{let o="
    Capture
    ";o+="This is a preview of what your screenshot will look like:

    ",o+="
    ",o+="Resolution: px
    ",o+="
    Screenshot
    ",o+="
    Record video
    ",void 0!==t.username&&(o+="
    Set as Cover
    "),ATON.FE.popupShow(o)&&(ATON.MediaFlow._bScreenRec?$("#btnScreenRec").addClass("atonBTN-rec"):$("#btnScreenRec").removeClass("atonBTN-rec"),$("#btnScreenShot").click((()=>{let e=parseInt($("#isShotSize").val());e<100||(ATON.FE.popupClose(),ATON.Utils.takeScreenshot(e,"shot.png"))})),$("#btnScreenRec").click((()=>{ATON.MediaFlow._bScreenRec||ATON.MediaFlow.startScreenRecording(),ATON.FE.popupClose()})),$("#btnSetCover").click((()=>{ATON.FE.popupClose(),ATON.Utils.postJSON(ATON.PATH_RESTAPI+"cover/scene/",{sid:ATON.SceneHub.currID,img:e.src},(e=>{console.log(e)}))})))}))},R.popupVRC=()=>{let e="",t=ATON.Photon.getNumUsers();e+=t>1?"
    Collaborative Session ("+t+" users)
    ":"
    Collaborative Session
    ",e+="
    ",e+="",e+="",e+="
    LEAVE
    ",e+="
    ",e+="",ATON.FE.popupShow(e,"atonPopupLarge")&&(ATON.checkAuth((e=>{console.log(e),ATON.MediaFlow._bCamStream||ATON.FE.uiAddButton("idCollabTools","screenshare",(()=>{ATON.MediaFlow._bScreenStream?$("#btn-screenshare").addClass("atonBTN-rec"):$("#btn-screenshare").removeClass("atonBTN-rec"),ATON.MediaFlow.startOrStopScreenStreaming(),ATON.FE.popupClose()}),"Share your screen with other participants"),!ATON.MediaFlow._bScreenStream&&ATON.MediaFlow.hasVideoInput()&&ATON.FE.uiAddButton("idCollabTools","camera",(()=>{ATON.MediaFlow._bCamStream?$("#btn-camera").addClass("atonBTN-rec"):$("#btn-camera").removeClass("atonBTN-rec"),ATON.MediaFlow.startOrStopCameraStreaming(),ATON.FE.popupClose()}),"Share your camera with other participants"),ATON.MediaFlow._bScreenStream?$("#btn-screenshare").addClass("atonBTN-rec"):$("#btn-screenshare").removeClass("atonBTN-rec"),ATON.MediaFlow._bCamStream?$("#btn-camera").addClass("atonBTN-rec"):$("#btn-camera").removeClass("atonBTN-rec")})),void 0===ATON.Photon._username?($("#idVRCusername").show(),$("#idVRCusernameBTN").hide()):($("#idVRCusername").val(ATON.Photon._username),$("#idVRCusername").hide(),$("#idVRCusernameBTN").show()),void 0!==ATON.Photon.uid&&$("#idVRCusernameBTN").addClass("atonVRCu"+ATON.Photon.uid%6),$("#idChatBoxPopup").append(ATON.Photon._elChat),$("#idVRCmsg").keypress((e=>{if("13"==(e.keyCode?e.keyCode:e.which)){let e=$("#idVRCmsg").val();ATON.Photon.setMessage(e),$("#idVRCmsg").val("")}})),$("#idVRCusername").keypress((e=>{if("13"==(e.keyCode?e.keyCode:e.which)){let e=$("#idVRCusername").val();ATON.Photon.setUsername(e),$("#idVRCusername").hide(),$("#idVRCusernameBTN").html(ATON.Photon._username),$("#idVRCusernameBTN").show()}})),$("#idVRCusernameBTN").click((()=>{$("#idVRCusername").show(),$("#idVRCusernameBTN").hide()})),$("#idVRCdisconnect").click((()=>{ATON.Photon.disconnect(),ATON.FE.popupClose()})))},R.checkAuth=e=>{ATON.Utils.checkAuth((t=>{R._userAuth=t,void 0!==t.username?($("#btn-user").addClass("switchedON"),void 0===ATON.Photon._username&&ATON.Photon.setUsername(t.username)):$("#btn-user").removeClass("switchedON"),e&&e(t)}))},R.popupUser=()=>{R.checkAuth((e=>{if(void 0!==e.username){let t="
    ";if(t+="'"+e.username+"'

    ",Object.keys(R._uiProfiles).length>0){t+="UI Profile:


    "}if(t+="
    LOGOUT
    ",!ATON.FE.popupShow(t))return;R._uiCurrProfile&&(console.log(R._uiCurrProfile),$("#idUIProfiles").val(R._uiCurrProfile)),$("#idLogoutBTN").click((()=>{$.get(ATON.PATH_RESTAPI+"logout",(e=>{console.log(e),ATON.SceneHub.setEditMode(!1),R.uiSwitchButton("edit",!1),ATON.fire("Logout"),$("#btn-user").removeClass("switchedON")})),ATON.FE.popupClose()})),$("#idSHUscenes").click((()=>{ATON.Utils.goToURL("/shu/scenes/")})),$("#idSHUuser").click((()=>{ATON.Utils.goToURL("/shu/auth/")})),$("#idUIProfiles").on("change",(()=>{let e=$("#idUIProfiles").val();R.uiLoadProfile(e),ATON.FE.popupClose()}))}else{let e="
    ";if(e+="username:
    ",e+="password:
    ",e+="
    LOGIN
    ",!ATON.FE.popupShow(e))return;$("#idLoginBTN").click((()=>{let e=JSON.stringify({username:$("#idUsername").val(),password:$("#idPassword").val()});$.ajax({url:ATON.PATH_RESTAPI+"login",type:"POST",data:e,contentType:"application/json; charset=utf-8",dataType:"json",success:e=>{console.log(e),e&&(ATON.fire("Login",e),$("#btn-user").addClass("switchedON"),ATON.FE.popupClose())}}).fail((e=>{$("#idLoginBTN").html("LOGIN FAILED"),$("#idLoginBTN").attr("class","atonBTN atonBTN-red")}))}))}}))},R.popupSceneInfo=()=>{let e=ATON.SceneHub.getTitle();void 0===e&&(e=ATON.SceneHub.currID);let t=ATON.SceneHub.getDescription(),o="
    "+e+"
    ";t&&(o+="
    "+JSON.parse(t)+"
    "),o+="
    OK
    ",ATON.FE.popupShow(o)&&$("#btnOK").click((()=>{ATON._onUserInteraction(),ATON.FE.popupClose()}))},R.computeSelectorRanges=()=>{let e=ATON.bounds.radius;e<=0||(R._selRanges[0]=.001*e,R._selRefRadius=.01*e,R._selRanges[1]=.5*e)},R.popupSelector=()=>{let e="
    3D Selector
    ",t=ATON.SUI.getSelectorRadius(),o=ATON.Utils.getHumanReadableDistance(t);R.computeSelectorRanges(),e+="Radius ("+o+"):
    ",e+="",ATON.FE.popupShow(e,"atonPopupLarge")&&($("#idSelRad").val(t),$("#idSelRad").on("input change",(()=>{let e=parseFloat($("#idSelRad").val());ATON.SUI.setSelectorRadius(e),$("#idSelRadTxt").html(ATON.Utils.getHumanReadableDistance(e))})))},R.popupNav=()=>{let e="
    Navigation
    ";e+="
    ",e+="
    ",e+="
    Switch between first-person and orbit navigation mode
    ",e+="
    ",ATON.Utils.isConnectionSecure()&&(e+="
    ",e+="
    ",e+="
    Immersive VR mode
    ",e+="
    ",ATON.Utils.isMobile()&&(e+="
    ",e+="
    ",e+="
    Enable or disable device-orientation mode
    ",e+="
    ")),R.popupShow(e)&&(R.uiAddButtonFirstPerson("idNMfp"),R.uiAddButtonDeviceOrientation("idNMdevori"),R.uiAddButtonVR("idNMvr"))},R.popupModalToken=(e,t)=>{if(void 0===t)return;ATON.FE.popupClose();let o="
    Token Required
    ";e&&(o+=e),o+="

    ",o+="
    OK
    ",R.popupShow(o)&&$("#btnTokenOK").click((()=>{let e=$("#idTokStr").val();void 0===e||e.length<2||(ATON.FE.popupClose(),t(e))}))},R.popupNewNode=e=>{void 0===e&&(e=ATON.NTYPES.SCENE);let t="";e===ATON.NTYPES.SCENE&&(t="
    New Scene Node
    "),e===ATON.NTYPES.SEM&&(t="
    New Semantic Node
    "),t+="ID:
    ",t+="
    Add

    ",R.popupShow(t)&&$("#btnNewNID").click((()=>{let t=$("#idNID").val().trim();void 0===t||t.length<3||new ATON.Node(t,e).attachToRoot()}))};const y=R;let w={auType:"audio/wav",auStreamSegmentInterval:200,auStreamNumSegments:2,vidStreamSegmentInterval:300,vidStreamNumSegments:1,auMinVol:1,init:()=>{w._bAudioRecording=!1,w._bAudioStreaming=!1,w._bScreenRec=!1,w._blobOptAudio={type:"audio/wav"},w._blobOptVideo={type:"video/mp4"},w._cAuStream={audio:{channelCount:1,echoCancellation:!0,noiseSuppression:!0}},w._cAuRec={audio:{channelCount:1}},w._cScreenRec={video:{width:1280,height:720,framerate:30}},w._cScreenStream={video:{cursor:"always",width:{max:640},height:{max:360},framerate:15}},w._cCamStream={video:{width:{max:512},height:{max:512}}},w._oStream={audioBitsPerSecond:9e3,videoBitsPerSecond:5e5},w._aurec=void 0,w._sblob=void 0,w._schunks=[],w._bVideoStream=!1,w._vrec=void 0,w._scblob=void 0,w._scchunks=[],w._bCamStream=!1,w._bScreenStream=!1,w._setupFR(),w.detectDevices(),navigator.mediaDevices&&navigator.mediaDevices.addEventListener("devicechange",(e=>{w.detectDevices()})),w._vStreams={}},_setupFR:()=>{w._frAR=new window.FileReader,w._frAR.onloadend=()=>{let e=w._frAR.result;ATON.fire("AudioRecordCompleted",e),w._bAudioRecording=!1},w._frAS=new window.FileReader,w._frAS.onloadend=()=>{if(!w._bAudioStreaming)return;let e=w._frAS.result;ATON.Photon.socket.emit("UTALK",{audio:e,uid:ATON.Photon.uid}),e=null},w._frVS=new window.FileReader,w._frVS.onloadend=()=>{if(!w._bVideoStream)return;let e=w._frVS.result;ATON.Photon.socket.emit("UVIDEO",{video:e,uid:ATON.Photon.uid}),e=null}},detectDevices:()=>{w.audioInputDevices=[],w.videoInputDevices=[],navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices().then((e=>{for(let t in e){let o=e[t];"audioinput"===o.kind&&w.audioInputDevices.push(o),"videoinput"===o.kind&&w.videoInputDevices.push(o)}}))},hasAudioInput:()=>w.audioInputDevices.length>0,hasVideoInput:()=>w.videoInputDevices.length>0,isAudioRecording:()=>w._bAudioRecording,startRecording:()=>{w._bAudioRecording?console.log("Already recording."):navigator.mediaDevices.getUserMedia(w._cAuRec).then((e=>{w._aurec=new MediaRecorder(e),w._aurec.onstart=function(e){console.log("Start recording..."),w._bAudioRecording=!0,w._schunks=[]},w._aurec.ondataavailable=function(e){w._schunks.push(e.data)},w._aurec.onstop=function(e){console.log("Stop recording..."),w._sblob=new Blob(w._schunks,w._blobOptAudio),w._frAR.readAsDataURL(w._sblob)},w._aurec.start()})).catch((e=>{console.log(e)}))},stopRecording:()=>{w._aurec&&w._bAudioRecording&&w._aurec.stop()},startOrStopRecording:()=>{w._bAudioRecording?w.stopRecording():w.startRecording()},startAudioStreaming:()=>{navigator.mediaDevices.getUserMedia(w._cAuStream).then((e=>{w._aurec=new MediaRecorder(e,w._oStream),w._aurec.start(w.auStreamSegmentInterval),console.log("Start audio streaming"),w._aurec.onstart=e=>{w._bAudioStreaming=!0,w._bAudioRecording=!0,w._schunks=[]},w._aurec.ondataavailable=e=>{e.data.size<=0||(w._schunks.push(e.data),w._schunks.length{w._sblob=new Blob(w._schunks,w._blobOptAudio),w._frAS.readAsDataURL(w._sblob),w._bAudioStreaming&&w._aurec.start(w.auStreamSegmentInterval)}})).catch((e=>{console.log(e)}))},stopAudioStreaming:()=>{w._aurec&&w._bAudioStreaming&&("inactive"!==w._aurec.state&&w._aurec.stop(),console.log("Stop audio streaming"),w._bAudioStreaming=!1,w._bAudioRecording=!1,ATON.Photon.socket.emit("UAUDIOSTOP",{uid:ATON.Photon.uid}))},startOrStopAudioStreaming:()=>{w._bAudioRecording?w.stopAudioStreaming():w.startAudioStreaming()},startScreenRecording:()=>{w._bScreenRec||w._bScreenStream||navigator.mediaDevices.getDisplayMedia(w._cScreenRec).then((e=>{w._vrec=new MediaRecorder(e),w._scchunks=[],w._vrec.ondataavailable=e=>{e.data.size>0&&w._scchunks.push(e.data)},w._vrec.onstop=()=>{w._scblob=new Blob(w._scchunks,w._blobOptVideo),console.log(w._scblob.size),ATON.Utils.downloadBlob(w._scblob,"capture.mp4"),w._scchunks=[],w._bScreenRec=!1},w._vrec.start(200),w._bScreenRec=!0})).catch((e=>{console.log(e)}))},stopScreenRecording:()=>{w._bScreenRec&&(w._vrec.stop(),w._bVideoStream=!1,w._bScreenStream=!1,console.log("Stop screen recording"))},startScreenStreaming:()=>{navigator.mediaDevices.getDisplayMedia(w._cScreenStream).then((e=>{w.realizeOrUpdateVStream(e,w.stopScreenStreaming),w._vrec=new MediaRecorder(e,w._oStream),w._vrec.start(w.vidStreamSegmentInterval),console.log("Start screen streaming"),w._vrec.onstart=e=>{w._bVideoStream=!0,w._bScreenStream=!0,w._scchunks=[]},w._vrec.ondataavailable=e=>{e.data.size<1||(w._scchunks.push(e.data),w._scchunks.length{w._scblob=new Blob(w._scchunks,w._blobOptVideo),w._frVS.readAsDataURL(w._scblob),w._bVideoStream&&w._vrec.start(w.vidStreamSegmentInterval)}})).catch((e=>{console.log(e)}))},stopScreenStreaming:()=>{if(w._vrec&&w._bVideoStream&&(w._vrec.stop(),w._bVideoStream=!1,w._bScreenStream=!1,console.log("Stop screen streaming"),void 0!==ATON.Photon.uid)){let e=w.getVideoStream(ATON.Photon.uid);e.el.style.display="none",e.el.pause(),ATON.Photon.socket.emit("UVIDEOSTOP",{uid:ATON.Photon.uid})}},startOrStopScreenStreaming:()=>{w._bVideoStream?w.stopScreenStreaming():w.startScreenStreaming()},startCameraStreaming:()=>{w._bVideoStream||navigator.mediaDevices.getUserMedia(w._cCamStream).then((e=>{w.realizeOrUpdateVStream(e,w.stopCameraStreaming),w._vrec=new MediaRecorder(e,w._oStream),w._vrec.start(w.vidStreamSegmentInterval),console.log("Start camera streaming"),w._vrec.onstart=e=>{w._bVideoStream=!0,w._bCamStream=!0,w._scchunks=[]},w._vrec.ondataavailable=e=>{e.data.size<1||(w._scchunks.push(e.data),w._scchunks.length{w._scblob=new Blob(w._scchunks,w._blobOptVideo),w._frVS.readAsDataURL(w._scblob),w._bVideoStream&&w._vrec.start(w.vidStreamSegmentInterval)}})).catch((e=>{console.log(e)}))},stopCameraStreaming:()=>{if(w._vrec&&w._bVideoStream&&(w._vrec.stop(),w._bVideoStream=!1,w._bCamStream=!1,console.log("Stop camera streaming"),void 0!==ATON.Photon.uid)){let e=w.getVideoStream(ATON.Photon.uid);e.el.style.display="none",e.el.pause(),ATON.Photon.socket.emit("UVIDEOSTOP",{uid:ATON.Photon.uid})}},startOrStopCameraStreaming:()=>{w._bVideoStream?w.stopCameraStreaming():w.startCameraStreaming()},realizeOrUpdateVStream:(e,t)=>{let o=ATON.Photon.uid;if(void 0===o)return;let i=w.getOrCreateVideoStream(o,void 0,!0);i.el.playsinline=!0,i.el.style.display="inline-block",i.el.classList.add("atonVRCvidStream"),i.el.classList.add("atonVRCu"+o%6),t&&(i.el.onclick=t),i.el.srcObject=e},stopAllStreams:()=>{w.stopAudioStreaming(),w.stopCameraStreaming(),w.stopScreenStreaming()},getOrCreateVideoStream:(e,t,o)=>{if(w._vStreams[e])t&&(w._vStreams[e].el.src=t);else{w._vStreams[e]={};let i="vStream-"+e;if(o&&(i="uStream"+e,w._vStreams[e].uid=e),$("").appendTo("body"),w._vStreams[e].el=document.getElementById(i),t)if(t.endsWith("m3u8"))if(Hls.isSupported()){let o=new Hls;o.loadSource(t),o.attachMedia(w._vStreams[e].el)}else w._vStreams[e].el.src=t;else w._vStreams[e].el.src=t;o||(w._vStreams[e].el.loop=!0),w._vStreams[e].texStream=new THREE.VideoTexture(w._vStreams[e].el),w._vStreams[e].texStream.colorSpace=ATON._stdEncoding,w._vStreams[e].texStream.flipY=!1,w._vStreams[e].matStream=ATON.MatHub.materials.chromakey.clone(),w._vStreams[e].matStream.uniforms.tBase.value=w._vStreams[e].texStream}return w._vStreams[e]},getVideoStream:e=>w._vStreams[e],downloadVideoSnapshot:(e,t,o)=>{o||(o=1);let i=e.videoWidth*o,r=e.videoHeight*o,a=document.createElement("canvas");a.width=i,a.height=r,a.getContext("2d").drawImage(e,0,0,i,r),ATON.Utils.downloadImageFromCanvas(a,t)}};const M=w;let L={EARTH_R_KM:6371};L.EARTH_D_KM=2*L.EARTH_R_KM,L.init=()=>{L._bActive=!1,L._wpid=void 0,L._currGeoPos=new THREE.Vector2,L._GeoPOIs=[],L._currGeoPOI=void 0,L._closestGeoPOI=void 0,L._maxGeoError=40},L.enableGeoTracking=()=>{L._bActive||ATON.Utils.isConnectionSecure()&&navigator.geolocation&&(L._wpid=navigator.geolocation.watchPosition(L._onGeoPosition,L._onGeoError,{enableHighAccuracy:!0}),L._bActive=!0)},L.disableGeoTracking=()=>{L._bActive&&(navigator.geolocation.clearWatch(L._wpid),L._bActive=!1)},L.setMaxGeoError=e=>{e>0&&(L._maxGeoError=e)},L._onGeoError=()=>{console.log("Geolocation error")},L._onGeoPosition=e=>{if(!L._bActive)return;if(!e.coords)return;let t=e.coords.accuracy;t&&t>L._maxGeoError||(L._currGeoPos.x=e.coords.latitude,L._currGeoPos.y=e.coords.longitude,ATON.fire("GeoLocation",e),L._handleGeoPOIs())},L._handleGeoPOIs=()=>{let e=L._GeoPOIs.length;if(!(e<=0)){L._closestGeoPOIdist=void 0,L._closestGeoPOI=void 0;for(let t=0;t{if(L._bActive)return L._currGeoPos},L.geolocationFromLatLon=(e,t)=>new THREE.Vector2(e,t),L.geodistance_orig=(e,t)=>{let o=ATON.DEG2RAD*(t.x-e.x),i=ATON.DEG2RAD*(t.y-e.y),r=Math.sin(o/2)*Math.sin(o/2)+Math.cos(ATON.DEG2RAD*e.x)*Math.cos(ATON.DEG2RAD*t.x)*Math.sin(i/2)*Math.sin(i/2),a=2*Math.atan2(Math.sqrt(r),Math.sqrt(1-r));return L.EARTH_R_KM*a*1e3},L.geodistance=(e,t)=>{let o=.5-Math.cos((t.x-e.x)*ATON.DEG2RAD)/2+Math.cos(e.x*ATON.DEG2RAD)*Math.cos(t.x*ATON.DEG2RAD)*(1-Math.cos((t.y-e.y)*ATON.DEG2RAD))/2;return L.EARTH_D_KM*Math.asin(Math.sqrt(o))*1e3},L.addGeoPOI=(e,t)=>{let o={};return o.pos=new THREE.Vector2(e.x,e.y),o.radius=t,L._GeoPOIs.push(o),L._bActive||L.enableTracking(),L._handleGeoPOIs(),L._GeoPOIs.length-1},L.getGeoPOIbyIndex=e=>L._GeoPOIs[e],L.getClosestGeoPOI=()=>L._closestGeoPOI,L.getClosestGeoPOIdistance=()=>L._closestGeoPOIdist;const C=L;let H={};H._id=$("meta[name='aton\\:appid']").attr("content"),H._data={},H.setup=void 0,H.update=void 0,H._bRunning=!1,H._pDeps=[],H._fLoading=0,H._sendDataPatch=(e,t,o)=>new Promise(((i,r)=>{if(void 0===e)return void r("No storage ID specified");if(e.length<3)return void r("Storage ID too short");if(void 0===t)return void r("No storage patch");if(void 0===H._id)return void r("No app-ID");void 0===o&&(o=ATON.PATCH_ADD);let a={};a.wappid=H._id,a.fid=e,a.data=t,a.mode=o===ATON.PATCH_DEL?"DEL":"ADD";let n=JSON.stringify(a);$.ajax({url:ATON.PATH_RESTAPI+"patch/wapp",type:"POST",data:n,contentType:"application/json; charset=utf-8",dataType:"json",success:t=>{void 0!==t?(H._data[e]=t,i(t)):r("Error writing on server")}})})),H.getAppID=()=>H._id,H.addToStorage=(e,t)=>H._sendDataPatch(e,t,ATON.PATCH_ADD),H.deleteFromStorage=(e,t)=>H._sendDataPatch(e,t,ATON.PATCH_DEL),H.getStorage=e=>new Promise(((t,o)=>{void 0!==H._id?void 0!==e?$.getJSON(ATON.PATH_WAPPS+H._id+"/data/"+e+".json",(o=>{console.log(o),H._data[e]=o,t(o)})):o("No storage ID specified"):o()})),H.loadJSONConfig=(e,t)=>(ATON.Utils.getJSON(e,t),H),H.registerServiceWorker=e=>{if(e)return H.basePath&&(e=H.basePath+e),"serviceWorker"in navigator&&window.addEventListener("load",(()=>{navigator.serviceWorker.register(e).then((e=>console.log("PWA service worker registered"))).catch((e=>console.log("PWA service worker not registered",e)))})),H},H.requireFlares=e=>{if(e)return ATON._fReqList=e,console.log("Required Flares: "+ATON._fReqList),H},H.loadScene=(e,t)=>{void 0!==e&&ATON.SceneHub.load(ATON.PATH_RESTAPI2+"scenes/"+e,e,t)},H.realize=(e,t,o)=>{H.setup=e,H.update=t,H.params=new URLSearchParams(window.location.search),H.basePath=ATON.Utils.getBaseFolder(window.location.href.split("?")[0]),H.registerServiceWorker(o);let i=H.params.get("ff");if(i){let e=String(i).split(",");H.requireFlares(e)}return H},H.realizeAndRun=(e,t,o)=>{H.realize(e,t,o).run()},H.run=()=>!H._bRunning&&(H._bRunning=!0,H.setup?H.setup():(ATON.FE.realize(),console.log("App [Warn]: your App should define a setup() routine")),H.update&&(ATON.addUpdateRoutine(H.update),console.log("App: update routine registered")),ATON._fRequired<=0&&ATON.fire("AllFlaresReady"),!0);const D=H;let x={PASS_BASE:"p_base",PASS_AA:"p_aa",PASS_AO:"p_ao",PASS_SSR:"p_ssr",PASS_BLOOM:"p_bloom",PASS_DOF:"p_dof",PASS_GAMMA:"p_gamma",PASS_SOBEL:"p_sobel",init:()=>{if(void 0===ATON._renderer)return;let e=ATON._renderer.getPixelRatio(),t=ATON._renderer.getSize(new THREE.Vector2);const o=new THREE.WebGLRenderTarget(t.width*e,t.height*e,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat,colorSpace:ATON._stdEncoding});o.texture.name="EffectComposer.rt1",x.composer=new THREE.EffectComposer(ATON._renderer,o),x.passes={},ATON._renderer.autoClear=!1;let i=window.innerWidth*ATON._stdpxd,r=window.innerHeight*ATON._stdpxd;x.passes[x.PASS_BASE]=new THREE.RenderPass(ATON._mainRoot,ATON.Nav._camera),x.composer.addPass(x.passes[x.PASS_BASE]),x.passes[x.PASS_AO]=new THREE.SAOPass(ATON._mainRoot,ATON.Nav._camera,i,r),x.passes[x.PASS_AO].params.saoBias=1,x.passes[x.PASS_AO].params.saoScale=100,x.passes[x.PASS_AO].params.saoIntensity=.2,x.passes[x.PASS_BLOOM]=new THREE.UnrealBloomPass(new THREE.Vector2(i,r),1.5,.4,.85),x.passes[x.PASS_BLOOM].threshold=.9,x.passes[x.PASS_BLOOM].strength=1,x.passes[x.PASS_BLOOM].radius=1.2,x.passes[x.PASS_DOF]=new THREE.BokehPass(ATON._mainRoot,ATON.Nav._camera,{focus:5,aperture:.001,maxblur:.01,width:i,height:r}),x.composer.addPass(x.passes[x.PASS_AO]),x.composer.addPass(x.passes[x.PASS_DOF]),x.composer.addPass(x.passes[x.PASS_BLOOM]),x.togglePass(x.PASS_AO,!1),x.togglePass(x.PASS_BLOOM,!1),x.togglePass(x.PASS_DOF,!1)},togglePass:(e,t)=>{void 0!==x.composer&&(ATON.device.lowGPU||void 0!==x.passes[e]&&(x.passes[e].enabled=void 0===t?!x.passes[e].enabled:t))},isPassEnabled:e=>void 0!==x.composer&&(void 0!==x.passes[e]&&x.passes[e].enabled),setAOintensity:e=>{void 0!==x.composer&&void 0!==x.passes[x.PASS_AO]&&(x.passes[x.PASS_AO].params.saoIntensity=e)},getAOintensity:()=>void 0===x.composer||void 0===x.passes[x.PASS_AO]?0:x.passes[x.PASS_AO].params.saoIntensity,setBloomStrength:e=>{void 0!==x.composer&&void 0!==x.passes[x.PASS_BLOOM]&&(x.passes[x.PASS_BLOOM].strength=e)},getBloomStrength:()=>void 0===x.composer||void 0===x.passes[x.PASS_BLOOM]?0:x.passes[x.PASS_BLOOM].strength,setBloomThreshold:e=>{void 0!==x.composer&&void 0!==x.passes[x.PASS_BLOOM]&&(x.passes[x.PASS_BLOOM].threshold=e)},getBloomThreshold:()=>void 0===x.composer||void 0===x.passes[x.PASS_BLOOM]?0:x.passes[x.PASS_BLOOM].threshold,setDOFfocus:e=>{if(void 0===x.composer)return;if(void 0===x.passes[x.PASS_DOF])return;let t=x.passes[x.PASS_DOF].uniforms;void 0!==t&&(t.focus.value=e)},getDOFfocus:()=>{if(void 0===x.composer)return 0;if(void 0===x.passes[x.PASS_DOF])return 0;let e=x.passes[x.PASS_DOF].uniforms;return void 0===e?0:e.focus.value},setDOFaperture:e=>{if(void 0===x.composer)return;if(void 0===x.passes[x.PASS_DOF])return;let t=x.passes[x.PASS_DOF].uniforms;void 0!==t&&(t.aperture.value=e)}};const F=x;let V={STD_XPF_TRANSITION_DURATION:1,SEM_PREFIX:"XPF",SEMGROUP_PREFIX:"GXPF",init:()=>{V._list=[],V._iCurr=void 0,V._iNext=void 0,V._geom=void 0,V._mesh=void 0,V._mat=void 0,V._size=50,V._gSem=[],V._semIMGMasks={},V._semCanvas=void 0,V._semCTX=void 0,V._semCurr=void 0,V._shColor=new THREE.Color(0,0,1),V._shOpacity=.2,V._txCache={},V._pathMod=void 0,V._realizeBaseMat(),V._elVid=void 0,V._vidPlaying=!1},_realizeBaseMat:()=>{V._uniforms={tBase:{type:"t"},tSem:{type:"t"},tSemHint:{type:"t"},semHL:{type:"vec4",value:new THREE.Vector4(0,1,0,.15)},opacity:{type:"float",value:1},shColor:{type:"vec4",value:new THREE.Vector4(0,0,1,.2)},time:{type:"float",value:0}},V._mat=new THREE.ShaderMaterial({uniforms:V._uniforms,vertexShader:"\n varying vec3 vPositionW;\n varying vec3 vNormalW;\n varying vec3 vNormalV;\n varying vec2 vUv;\n\n void main(){\n vUv = uv;\n\n vPositionW = vec3( vec4( position, 1.0 ) * modelMatrix);\n vNormalW = normalize( vec3( vec4( normal, 0.0 ) * modelMatrix ) );\n vNormalV = normalize( vec3( normalMatrix * normal ));\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n ",fragmentShader:"\n varying vec3 vPositionW;\n\t\t varying vec3 vNormalW;\n varying vec3 vNormalV;\n varying vec2 vUv;\n\n uniform float time;\n uniform sampler2D tBase;\n uniform sampler2D tSem;\n uniform sampler2D tSemHint;\n //uniform sampler2D tDepth;\n\n uniform vec4 semHL, shColor;\n uniform float opacity;\n\n\t\t void main(){\n vec4 frag = texture2D(tBase, vUv);\n vec4 sem = texture2D(tSem, vUv);\n vec4 semH = texture2D(tSemHint, vUv);\n float shv = max( max(semH.r,semH.g), semH.b);\n\n float t = (1.0 * cos(time*2.0));\n t = clamp(t, 0.0,1.0);\n\n frag = mix(frag, semHL, (sem.r * semHL.a));\n\n frag = mix(frag, shColor, (t * shv * shColor.a));\n\n frag.a = opacity;\n\n gl_FragColor = frag;\n\t\t }\n ",depthTest:!1,depthWrite:!1}),V.setSemanticHintMapOpacity(.2)},setPathModifier:e=>{if(void 0!==e){V._pathMod=e;for(let t in V.list)V.list[t].setPathModifier(e)}},update:()=>{if(ATON.Nav.isTransitioning())return;if(V._list.length<1)return;let e,t,o,i,r=V._list.length,a=ATON.Nav._currPOV.pos,n=ATON.Nav._vDir;V._uniforms.time.value+=ATON._dt,void 0===V._dirLNode&&(V._dirLNode=new THREE.Vector3);for(let s=0;s.8&&(void 0===o||l{void 0===V._geom&&(V._group=new THREE.Group,ATON._rootVisibleGlobal.add(V._group),V._geom=new THREE.SphereGeometry(1,40,40),V._geom.scale(-V._size,V._size,V._size),V._geom.castShadow=!1,V._geom.receiveShadow=!1,V._mesh=new THREE.Mesh(V._geom,V._mat),V._mesh.frustumCulled=!1,V._mesh.renderOrder=-100,V._mesh.layers.enable(ATON.NTYPES.SCENE),V._group.add(V._mesh),V._mesh.visible=!1)},setBaseGeometry:e=>{},add:e=>{if(void 0===e)return;V.realizeBaseGeometry();let t=V._list.length;V._list.push(e);let o=e.getMesh();o&&V._group.add(o);let i=ATON.getOrCreateSemanticNode(V.SEMGROUP_PREFIX+t);V._gSem.push(i),i.attachToRoot(),t>0||(ATON.Nav.toggleLocomotionValidator(!1),ATON._bqScene=!0)},clear:()=>{V._iCurr=void 0,V._iNext=void 0,V._semCurr=void 0;for(let e=0;eV._list.length,getMainGroup:()=>V._group,getSemanticGroup:e=>V._gSem[e],getCurrentSemanticGroup:()=>{if(void 0!==V._iCurr)return V._gSem[V._iCurr]},_preloadBaseLayer:(e,t)=>{if(void 0!==V._txCache[e])return V._txCache[e];let o=V._list[e]._pathbaselayer;V._pathMod&&(o=V._pathMod(o)),ATON.Utils.textureLoader.load(o,(o=>{o.colorSpace=ATON._stdEncoding,o.generateMipmaps=!0,V._txCache[e]=o,t&&t(o)}))},_clearTexCache:()=>{if(void 0!==V._iCurr)for(let e in V._txCache)V._txCache[e]&&e!==V._iCurr&&(V._txCache[e].dispose(),V._txCache[e]=void 0)},_setBaseLayerTexture:(e,t)=>{V._mat.map=t,V._mat.needsUpdate=!0,V._mesh.position.copy(e.getLocation()),V._mesh.rotation.set(e.getRotation().x,e.getRotation().y,e.getRotation().z)},updateCurrentXPFbaseLayer:e=>{if(void 0===V._iCurr)return;let t=V._list[V._iCurr];if(void 0===t)return;let o=t._pathbaselayer;if(V._pathMod&&(o=V._pathMod(o)),ATON.Utils.isVideo(o)){if(void 0===V._elVid){let e="",$(e).appendTo("body"),V._elVid=document.getElementById("idXPFVideo"),V._elVid.onplaying=()=>{console.log("XPF VideoPano playing"),V._vidPlaying=!0},V._elVid.onpause=()=>{console.log("XPF VideoPano paused"),V._vidPlaying=!1},V._elVid.addEventListener("touchstart",(function(){V._elVid.play()})),enableInlineVideo(V._elVid)}let i=new THREE.VideoTexture(V._elVid);return i.colorSpace=ATON._stdEncoding,V._mat.map=i,V._mat.needsUpdate=!0,V._uniforms.tBase.value=i,V._mesh.position.copy(t.getLocation()),V._mesh.rotation.set(t.getRotation().x,t.getRotation().y,t.getRotation().z),void(e&&e(i))}ATON.Utils.textureLoader.load(o,(o=>{o.colorSpace=ATON._stdEncoding,o.generateMipmaps=!0,V._mat.map=o,V._mat.needsUpdate=!0,V._uniforms.tBase.value=o,V._mesh.position.copy(t.getLocation()),V._mesh.rotation.set(t.getRotation().x,t.getRotation().y,t.getRotation().z),e&&e(o)}))},playOrPauseXPFVideoStream:()=>{void 0!==V._elVid&&(V._vidPlaying?V._elVid.pause():V._elVid.play())},updateCurrentXPFsemLayer:e=>{let t=V._list.indexOf(e);t<0||t===V._iCurr&&V.loadSemanticMasksIfAny(V._iCurr)},setCurrentXPF:(e,t)=>{V.toggleSUI(e,!1),V._iCurr=e,V._iNext=void 0,V._mesh.visible=!0,V._gSem[e].show(),V.updateCurrentXPFbaseLayer(t),ATON.fire("CurrentXPF",e),ATON.fire("NextXPF",void 0),V.loadSemanticMasksIfAny(e)},toggleSUI:(e,t)=>{if(void 0===e)return;let o=V._list[e];void 0!==o&&o._lnode.toggleSUI(t)},loadSemanticMasksIfAny:e=>{let t=V._list[e];if(void 0!==t){V._semIMGMasks={},V._uniforms.tSemHint.value=0,void 0!==t._semHintURL&&(V._uniforms.tSemHint.value=ATON.Utils.textureLoader.load(t._semHintURL));for(let e in t._semMasksURLs){void 0===V._semCanvas&&(V._semCanvas=document.createElement("canvas"),V._semCanvas.width=2048,V._semCanvas.height=2048,V._semCTX=V._semCanvas.getContext("2d",{willReadFrequently:!0}));let o=t._semMasksURLs[e],i=new Image;i.src=o,V._semIMGMasks[e]=i}}},getXPFbyIndex:e=>V._list[e],getCurrentXPFindex:()=>V._iCurr,getCurrentXPF:()=>{if(void 0!==V._iCurr)return V._list[V._iCurr]},getNextXPFindex:()=>V._iNext,getNextXPF:()=>{if(void 0!==V._iNext)return V._list[V._iNext]},getDistanceToXPFindex:e=>{if(void 0===e)return;let t=V._list[e];return void 0!==t?ATON.Nav._currPOV.pos.distanceTo(t.getLocation()):void 0},showSUIonlyForXPF:e=>{let t=V._list.length;if(!(t<1))for(let o=0;o{let o=V._list[e];void 0!==o&&(void 0===t&&(t=V.STD_XPF_TRANSITION_DURATION),ATON.XR._bPresenting&&(t=0),V.setCurrentXPF(e),ATON.Nav.requestTransitionToLocomotionNode(o.getLocomotionNode(),t))},requestTransitionToTarget:(e,t,o)=>{if(void 0===e)return;let i=new ATON.POV;i.setTarget(e),i.setPosition(ATON.Nav._currPOV.pos),t&&i.setFOV(t),ATON.Nav.requestPOV(i,o)},requestTransitionToDirection:(e,t,o)=>{if(void 0===e)return;let i=new THREE.Vector3;i.x=e.x+ATON.Nav._currPOV.pos.x,i.y=e.y+ATON.Nav._currPOV.pos.y,i.z=e.z+ATON.Nav._currPOV.pos.z,V.requestTransitionToTarget(i,t,o)},setHomeXPF:e=>{let t=V._list[e];if(void 0===t)return;let o=t.getLocomotionNode(),i=(new ATON.POV).setPosition(o.pos).setTarget(o.pos.x,o.pos.y,o.pos.z+1);ATON.Nav.setHomePOV(i)},getSemanticMaskURLfromXPFindex:(e,t)=>{let o=V._list[e];if(void 0!==o)return o.getSemanticMaskURL(t)},getSemanticMaskURLfromCurrentXPF:e=>{if(void 0!==V._iCurr)return V.getSemanticMaskURLfromXPFindex(V._iCurr,e)},setSemanticColor:(e,t)=>{void 0===t&&(t=.15),V._uniforms.semHL.value=new THREE.Vector4(e.r,e.g,e.b,t)},setSemanticOpacity:e=>{void 0===e&&(e=.15),V._uniforms.semHL.value.w=e},setSemanticHintMapOpacity:e=>{void 0===e&&(e=.2),V._shOpacity=e,V._uniforms.shColor.value.w=e},setSemanticHintMapColor:(e,t)=>{void 0!==e&&(V._shColor=e,V._uniforms.shColor.value.x=e.r,V._uniforms.shColor.value.y=e.g,V._uniforms.shColor.value.z=e.b,void 0!==t&&V.setSemanticHintMapOpacity(t))},querySemanticMasks:()=>{if(void 0===V._semCTX)return;if(void 0===ATON._queryDataScene)return;if(void 0===ATON._queryDataScene.uv)return;let e,t=V._semCTX,o=ATON._queryDataScene.uv;for(let i in V._semIMGMasks){let r=V._semIMGMasks[i],a=parseInt(r.width*o.x),n=parseInt(r.height*(1-o.y));if(t.drawImage(r,0,0),t.getImageData(a,n,1,1).data[0]>127){e=i;break}}if(void 0===e)return void 0!==V._semCurr&&ATON.fire("SemanticMaskLeave",V._semCurr),V._semCurr=void 0,V._uniforms.tSem.value=0,V._uniforms.shColor.value.w=V._shOpacity,void(V._mat.needsUpdate=!0);V.highlightSemanticMaskInCurrentXPF(e),V._semCurr=e},highlightSemanticMaskInCurrentXPF:e=>{if(void 0===e)return void 0!==V._semCurr&&ATON.fire("SemanticMaskLeave",V._semCurr),V._semCurr=void 0,V._uniforms.tSem.value=0,V._uniforms.shColor.value.w=V._shOpacity,void(V._mat.needsUpdate=!0);if(V._semCurr===e)return;let t=V.getSemanticMaskURLfromCurrentXPF(e);V._uniforms.tSem.value=ATON.Utils.textureLoader.load(t),V._mat.needsUpdate=!0,ATON.fire("SemanticMaskHover",e),V._uniforms.shColor.value.w=0,void 0!==V._semCurr&&ATON.fire("SemanticMaskLeave",V._semCurr)},loadFromPhotoscanFile:(e,t)=>{if(void 0===e)return;e=ATON.Utils.resolveCollectionURL(e);let o=ATON.Utils.getBaseFolder(e),i=0;$.ajax({url:e,dataType:"text",success:function(e){e=e.split(/\r\n|\n/);for(let t in e){let r=e[t];if(!r.startsWith("#")){let e=r.split(/\s{2,}|\t/);if(e.length>10){let t=new ATON.XPF,r=o+e[0],a=parseFloat(e[1]),n=parseFloat(e[2]),s=parseFloat(e[3]),l=ATON.DEG2RAD*parseFloat(e[4]);ATON.DEG2RAD,parseFloat(e[5]),ATON.DEG2RAD,parseFloat(e[6]),t.setLocation(a,s,-n),t.setBaseLayer(r),t.setRotation(0,-l,0),V.add(t),i++}}}console.log("Num panoramas parsed: "+i),t&&t()}})}};const I=V;let U={init:()=>{U.list=[]},anyCopyrightFound:()=>U.list.length>0,extract:e=>{if(void 0===e)return;if(void 0===e.asset)return;let t={};if(e.asset.copyright&&(t.copyright=e.asset.copyright),e.asset.extras)for(let o in e.asset.extras)"string"==typeof e.asset.extras[o]&&(t[o]=e.asset.extras[o]);if(U.extractXMP3DC(e,t),0!==Object.keys(t).length){e.asset.generator&&(t.generator=e.asset.generator);for(let e in U.list){let o=U.list[e];if(U.compare(t,o))return}U.list.push(t),console.log(t)}},compare:(e,t)=>{if(void 0===e||void 0===t)return!1;const o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(let i of o)if(e[i]!==t[i])return!1;return!0},extractXMP3DC:(e,t)=>{if(void 0===e||void 0===t)return;if(!e.userData)return;let o=e.userData.gltfExtensions;if(!o)return;if(!o.KHR_xmp)return;let i=o.KHR_xmp.packets;if(!i)return;let r=i[0],a="en-us";r["model3d:spdxLicense"]&&(t.license=r["model3d:spdxLicense"]),r["dc:date"]&&(t.date=r["dc:date"]),r["dc:title"]&&(t.title=r["dc:title"][a]),r["dc:description"]&&(t.description=r["dc:description"][a]),r["dc:rights"]&&(t.rights=r["dc:rights"][a]),r["dc:source"]&&(t.source=r["dc:source"]),r["dc:subject"]&&(t.subject=r["dc:subject"]),r["dc:type"]&&(t.type=r["dc:type"]),r["xmpRights:Owner"]&&(t.owner=r["xmpRights:Owner"]),r["xmp:CreatorTool"]&&(t.creatorTool=r["xmp:CreatorTool"])}};const k=U;let B={REST_API_CESIUMION_DEF_TOKEN:"https://api.cesium.com/v2/tokens/default",THRES_ORI:.01,THRES_POS:1e-6,init:()=>{B._tsets=[],B._tsET=20,B._tsB=!1,B._bTileBVH=!0,B._tsTasks=[],B.tsSchedCB=e=>{B._tsTasks.push(e)},B._tseBase=8,B.estimateTSErrorTarget(),B._tsuSync=0,B._bPCs=!1,B._pqLRU=void 0,B._pqDownload=void 0,B._pqParse=void 0,B._numTilesLoaded=0,B._numTSLoaded=0},clear:()=>{for(let e in B._tsets)B._tsets[e]=null;B._tsets=[],B._bPCs=!1},getTSetsErrorTarget:()=>B._tsET,setTSetsErrorTarget:e=>{B._tsET=e;const t=B._tsets.length;if(!(t<=0))for(let o=0;o{B._tsB=e;const t=B._tsets.length;if(!(t<=0))for(let o=0;o{void 0===e&&(e=ATON.Nav._camera);const t=B._tsets.length;if(!(t<=0))for(let o=0;o{B._tseBase=e,console.log(B._tseBase),B.estimateTSErrorTarget()},estimateTSErrorTarget:()=>{let e=B._tseBase;(ATON.device.lowGPU||ATON.device.isMobile)&&(e+=4),ATON.XR._bPresenting&&(e+=3),e<1&&(e=1),e>25&&(e=25),console.log("Estimated TSet error target: "+e),B.setTSetsErrorTarget(e)},loadTileSetFromURL:(e,t,o)=>{if(void 0===t)return;let i=new TILES.TilesRenderer(e);if(!i)return;ATON._assetReqNew(e),i.displayBoxBounds=B._tsB,i.fetchOptions.mode="cors",i.registerPlugin(new TILES.ImplicitTilingPlugin),o&&(i.fetchOptions.headers={},i.fetchOptions.headers.Authorization=`Bearer ${o.accessToken}`,i.preprocessURL=e=>(e=new URL(e),/^http/.test(e.protocol)&&e.searchParams.append("v",o.v),e.toString())),i.errorTarget=B._tsET,i.optimizeRaycast=!1,void 0===B._pqLRU?(i.downloadQueue.schedulingCallback=B.tsSchedCB,i.parseQueue.schedulingCallback=B.tsSchedCB,i.downloadQueue.maxJobs=6,i.parseQueue.maxJobs=1,B._pqLRU=i.lruCache,B._pqDownload=i.downloadQueue,B._pqParse=i.parseQueue):(i.lruCache=B._pqLRU,i.downloadQueue=B._pqDownload,i.parseQueue=B._pqParse),i.setCamera(ATON.Nav._camera),i.setResolutionFromRenderer(ATON.Nav._camera,ATON._renderer),i.manager.addHandler(/\.gltf$/,ATON._aLoader),i.manager.addHandler(/\.ktx2$/,ATON._ktx2Loader),i.manager.addHandler(/\.drc$/,ATON._dracoLoader),t.add(i.group),$.getJSON(e,(e=>{ATON.CC.extract(e)}));let r=new THREE.Box3,a=new THREE.Sphere;new THREE.Matrix4,new THREE.Vector3;let n=!1;i.addEventListener("load-tile-set",(()=>{if(console.log("TileSet loaded"),ATON._assetReqComplete(e),B._numTSLoaded++,o||t.bUseGeoCoords){console.log("TileSet using GeoCoords"),i.getBoundingSphere(a);const e=a.center.clone(),t=e.length(),o=e.normalize(),r=new THREE.Vector3(0,1,0),n=ATON.Utils.rotationBetweenDirections(o,r);i.group.quaternion.x=n.x,i.group.quaternion.y=n.y,i.group.quaternion.z=n.z,i.group.quaternion.w=n.w,i.group.position.y=-t}else i.getBoundingBox(r)?(r.getBoundingSphere(a),t.autocenter?(r.getCenter(i.group.position),i.group.position.multiplyScalar(-1)):void 0===ATON.Nav.homePOV&&ATON.Nav.computeAndRequestDefaultHome(.5,void 0,a)):i.getBoundingSphere(a)&&(t.autocenter?(i.group.position.copy(a.center),i.group.position.multiplyScalar(-1)):void 0===ATON.Nav.homePOV&&ATON.Nav.computeAndRequestDefaultHome(.5,void 0,a));ATON.Utils._visitorCP(i.group)})),i.addEventListener("load-model",(e=>{let o=e.scene;B._numTilesLoaded++,o.traverse((e=>{if(e.layers.enable(t.type),e.isMesh?(e.castShadow=!0,e.receiveShadow=!0,B._bTileBVH&&e.geometry&&(e.geometry.computeVertexNormals(),e.geometry.computeBoundsTree({}),ATON.Utils._bvhBounds>0&&ATON.Utils._addBVHbounds(e,ATON.Utils._bvhBounds)),ATON._bqScene=!0):(n=!0,B._bPCs=!0,e.layers.disable(t.type),e.raycast=ATON.Utils.VOID_CAST,e.material=ATON.MatHub.materials.point),t.userData.cMat&&(e.material=t.userData.cMat),e.material){let t=e.material.map;t&&(t.minFilter=THREE.LinearMipmapLinearFilter,t.magFilter=THREE.LinearFilter,t.colorSpace=ATON._stdEncoding)}})),ATON.fire("TileLoaded",o),ATON.Utils._visitorCP(o)})),i.addEventListener("dispose-model",((e,t)=>{ATON.Utils.cleanupVisitor(e.scene),e=null})),n||ATON.Utils.setPicking(t,t.type,!0),B._tsets.push(i)},loadCesiumIONAsset:(e,t)=>{let o=ATON.getAPIToken("cesium.ion");if(null==o&&(console.log("A valid Cesium ION token is required"),o=prompt("Please enter a valid Cesium ION token:"),null==o||""==o))return;let i=new URL(`https://api.cesium.com/v1/assets/${e}/endpoint`);i.searchParams.append("access_token",o),fetch(i,{mode:"cors"}).then((e=>e.ok?e.json():Promise.reject(`${e.status} : ${e.statusText}`))).then((e=>{i=new URL(e.url);const r=i.searchParams.get("v");B.loadTileSetFromURL(i.toString(),t,{accessToken:e.accessToken,v:r}),ATON.setAPIToken("cesium.ion",o)}))},update:()=>{const e=B._tsets.length;if(e<1)return;for(let t=0;t!!ATON.Nav._bControl&&(ATON.Nav._dOri>B.THRES_ORI||ATON.Nav._dPos>B.THRES_POS)};const q=B;let z={DELIM_CSV:",",DELIM_TSV:"\t",init:()=>{},loadTextFromURL:(e,t)=>($.get(e,(e=>{t&&t(e)})),z),loadValuesFromFile:(e,t,o,i)=>{let r={};void 0===o&&(o=-1),$.get(e,(e=>{let a=e.split("\n"),n=a.length,s=[],l=!1;for(let e=0;e0)if(l){let a=i.split(t),n=o>=0?a[o]:e;r[n]={};for(let e=0;e{z.loadValuesFromFile(e,z.DELIM_CSV,t,o)},loadTSV:(e,t,o)=>{z.loadValuesFromFile(e,z.DELIM_TSV,t,o)}};const X=z;let G={init:()=>{G._base=ATON.PATH_RESTAPI2},setBaseDomain:e=>e.startsWith("http")?(G._base=e,G):G,get:(e,t,o)=>(e.startsWith("http")||(e=G._base+e),fetch(e,{credentials:"include"}).then((e=>{e.ok?e.json().then(t).catch((e=>{console.log("ERROR: "+e),o&&o(e)})):o&&o()})),G),post:(e,t,o,i)=>(e.startsWith("http")||(e=G._base+e),fetch(e,{method:"POST",body:JSON.stringify(t),credentials:"include",headers:{"Content-type":"application/json; charset=UTF-8"}}).then((e=>{e.ok?e.json().then(o).catch((e=>{console.log("ERROR: "+e),i&&i(e)})):i&&i()})),G),put:(e,t,o,i)=>(e.startsWith("http")||(e=G._base+e),fetch(e,{method:"PUT",body:JSON.stringify(t),credentials:"include",headers:{"Content-type":"application/json; charset=UTF-8"}}).then((e=>{e.ok?e.json().then(o).catch((e=>{console.log("ERROR: "+e),i&&i(e)})):i&&i()})),G),patch:(e,t,o,i)=>(e.startsWith("http")||(e=G._base+e),fetch(e,{method:"PATCH",body:JSON.stringify(t),credentials:"include",headers:{"Content-type":"application/json; charset=UTF-8"}}).then((e=>{e.ok?e.json().then(o).catch((e=>{console.log("ERROR: "+e),i&&i(e)})):i&&i()})),G),delete:(e,t,o)=>(e.startsWith("http")||(e=G._base+e),fetch(e,{method:"DELETE",credentials:"include"}).then((e=>{e.ok?e.json().then(t).catch((e=>{console.log("ERROR: "+e),o&&o(e)})):o&&o()})),G),login:(e,t,o,i)=>G.post("login",{username:e,password:t},(e=>{e&&o?o(e):i&&i()}),(e=>{i&&i()})),logout:(e,t)=>G.get("logout",e,t)};const W=G;let j={};window.ATON=j,j.Node=t,j.POV=class{constructor(e){this.pos=new THREE.Vector3(1,0,0),this.target=new THREE.Vector3(0,0,0),this.up=ATON.STD_UPVECTOR,this.fov=void 0,this.nextPOV=void 0,this.prevPOV=void 0,this.as(e)}as(e){if(void 0!==e)return ATON.Nav.povlist[e]=this,this.id=e,this}setPosition(e,t,o){return e instanceof THREE.Vector3?this.pos.copy(e):this.pos.set(e,t,o),this}setTarget(e,t,o){return e instanceof THREE.Vector3?this.target.copy(e):this.target.set(e,t,o),this}setFOV(e){return this.fov=e,this}addKeywords(e){let t=e.split(",");void 0===this.kwords&&(this.kwords={});for(let e in t){let o=t[e].trim();o.length>0&&(this.kwords[o]=!0)}return this}hasKeyword(e){if(void 0!==this.kwords)return void 0!==this.kwords[e]}setNextPOV(e){if(e)return this.nextPOV=e,this}setPrevPOV(e){if(e)return this.prevPOV=e,this}},j.LightProbe=class{constructor(e,t,o){this.pos=new THREE.Vector3(0,0,0),this._res=void 0!==e?e:128,this._near=void 0!==t?t:1,this._far=void 0!==o?o:ATON.Nav.STD_FAR,this._envtex=void 0,this._CC=void 0,void 0===ATON._pmremGenerator&&(ATON._pmremGenerator=new THREE.PMREMGenerator(ATON._renderer),ATON._pmremGenerator.compileCubemapShader())}setPosition(e,t,o){return e instanceof THREE.Vector3?this.pos.copy(e):this.pos.set(e,t,o),this}setNear(e){return this._near=e,this}setFar(e){return this._far=e,this}_createCCtarget(){this._CCtarget||(this._CCtarget=new THREE.WebGLCubeRenderTarget(this._res,{format:THREE.RGBEFormat,generateMipmaps:!0,minFilter:THREE.LinearMipmapLinearFilter,colorSpace:ATON._stdEncoding}))}update(){return this._envtex&&this._envtex.dispose(),ATON._rootVisibleGlobal.position.set(-this.pos.x,-this.pos.y,-this.pos.z),ATON._render(),this._envtex=ATON._pmremGenerator.fromScene(ATON._mainRoot,0,this._near,this._far).texture,ATON._rootVisibleGlobal.position.set(0,0,0),ATON._renderer.shadowMap.enabled&&ATON._dMainL&&(ATON._dMainL.shadow.needsUpdate=!0),this}getEnvTex(){return this._envtex}assignToNode(e){}},j.XPF=class{constructor(e){this.id=e,this._geom=void 0,this._mesh=void 0,this._pathbaselayer=void 0,this._size=20,this._location=new THREE.Vector3(0,0,0),this._rotation=new THREE.Vector3(0,0,0),this._lnode=ATON.Nav.addLocomotionNode(this._location),this._pathMod=void 0,this._semMasksURLs={},this._semHintURL=void 0}setSize(e){this._size=e}realizeSUI(){return void 0===this._lnode||this._lnode.realizeSUI(),this}realizeGeometry(){return void 0!==this._geom||(this._geom=new THREE.SphereGeometry(1,60,60),this._geom.scale(-this._size,this._size,this._size),this._geom.castShadow=!1,this._geom.receiveShadow=!1,this._mat=new THREE.MeshBasicMaterial({depthTest:!1,depthWrite:!1}),this._mesh=new THREE.Mesh(this._geom,this._mat),this._mesh.frustumCulled=!1,this._mesh.renderOrder=-100),this}getMesh(){return this._mesh}getLocomotionNode(){return this._lnode}setRotation(e,t,o){return e instanceof THREE.Vector3?this._rotation.copy(e):this._rotation.set(e,t,o),void 0===this._mesh||this._mesh.rotation.copy(this._rotation),this}getRotation(){return this._rotation}setLocation(e,t,o){return e instanceof THREE.Vector3?this._location.copy(e):this._location.set(e,t,o),this._lnode&&this._lnode.setLocation(this._location),void 0===this._mesh||this._mesh.position.copy(this._location),this}getLocation(){return this._location}hasGeometry(){return void 0!==this._geom}setPathModifier=e=>(this._pathMod=e,this);updateBaseLayer(){}setBaseLayer(e){if(void 0===e)return this;this._pathbaselayer=ATON.Utils.resolveCollectionURL(e);let t=this;return this._pathMod&&(this._pathbaselayer=this._pathMod(this._pathbaselayer)),this.hasGeometry()?(ATON.Utils.isVideo(this._pathbaselayer)||ATON.Utils.textureLoader.load(t._pathbaselayer,(e=>{e.colorSpace=ATON._stdEncoding,e.generateMipmaps=!0,t._mat.map=e,t._mat.map.needsUpdate=!0,t._mat.needsUpdate=!0,console.log("XPF base layer "+t._pathbaselayer+" loaded")})),this):this}setSemanticMask(e,t){return void 0===e||(this._semMasksURLs[e]=ATON.Utils.resolveCollectionURL(t),ATON.XPFNetwork.updateCurrentXPFsemLayer(this)),this}removeSemanticMask(e){return void 0===e||(this._semMasksURLs[e]=void 0,ATON.XPFNetwork.updateCurrentXPFsemLayer(this)),this}removeAllSemanticMasks(){return this._semMasksURLs={},this}getSemanticMaskURL(e){return this._semMasksURLs[e]}setSemanticHintMap(e){return void 0===e||(this._semHintURL=ATON.Utils.resolveCollectionURL(e),ATON.XPFNetwork.updateCurrentXPFsemLayer(this)),this}removeSemanticHintMap(){return this._semHintURL=void 0,ATON.XPFNetwork.updateCurrentXPFsemLayer(this),this}},j.Flare=class{constructor(e){this._id=void 0,this._bDeployed=!1,e&&this.register(e)}register(e){return e&&(this._id=e),ATON.addFlare(this),this}getID(){return this._id}log(e){return this._id?console.log("[Flare "+this._id+"] "+e):console.log("[Flare]"+e),this}setSetup(e){return this.setup=e,this}setUpdate(e){return this.update=e,this}},j.EventHub=i,j.Utils=s,j.CC=k,j.SceneHub=d,j.MatHub=a,j.Nav=h,j.AudioHub=u,j.XR=v,j.SUI=N,j.UI=A,j.Photon=P,j.SemFactory=E,j.FE=y,j.MediaFlow=M,j.Phygital=C,j.App=D,j.FX=F,j.XPFNetwork=I,j.MRes=q,j.ASCII=X,j.REQ=W,j.STD_UPVECTOR=new THREE.Vector3(0,1,0),j.ROOT_NID=".",j.RAD2DEG=180/Math.PI,j.DEG2RAD=Math.PI/180,j.PATCH_ADD=0,j.PATCH_DEL=1,j.NTYPES={},j.NTYPES.SCENE=3,j.NTYPES.SEM=4,j.NTYPES.UI=5,j.SHADOWS_NEAR=.1,j.SHADOWS_FAR=100,j.SHADOWS_SIZE=50,j.SHADOWS_RES=1024,j.AMB_L=.2,j.SCALE_DEFAULT=0,j.SCALE_BIG=5,j.SCALE_VERYBIG=10,j.SCALE_SMALL=-5,j.SCALE_VERYSMALL=-10,j.Flares={},j._fReqList=[],j._bInitialized=!1,j._b2D=!1,j._resMappers=[],j._clipPlanes=[],j.setBaseURL=e=>{j.BASE_URL=e,j.PATH_RESTAPI=`${j.BASE_URL}/api/`,j.PATH_RESTAPI_SCENE=`${j.PATH_RESTAPI}scene/`,j.PATH_RESTAPI2=`${j.BASE_URL}/api/v2/`,j.PATH_WAPPS=`${j.BASE_URL}/a/`,j.PATH_FLARES=`${j.BASE_URL}/flares/`,j.PATH_DRACO_LIB=`${j.BASE_URL}/dist/draco/`,j.PATH_BASIS_LIB=`${j.BASE_URL}/dist/basis/`,j.PATH_COLLECTION=`${j.BASE_URL}/collections/`,j.PATH_SCENES=`${j.BASE_URL}/scenes/`,j.PATH_RES=`${j.BASE_URL}/res/`,j.PATH_FE=`${j.BASE_URL}/s/`},j.setBaseURL(window.location.origin),j.setPathCollection=e=>{j.PATH_COLLECTION=e},j.setPathScenes=e=>{j.PATH_SCENES=e},j.setAsStandalone=e=>{e||(e="../"),j.PATH_DRACO_LIB=e+"dist/draco/",j.PATH_BASIS_LIB=e+"dist/basis/",j.PATH_RES=e+"res/"},j.addResourceMapper=e=>{j._resMappers.push(e)},j._onUserInteraction=()=>{j._elPanoVideo&&!j._vpanoPlaying&&j._elPanoVideo.play(),j.XPFNetwork._elVid&&!j.XPFNetwork._vidPlaying&&j.XPFNetwork._elVid.play(),j.AudioHub._listener&&j.AudioHub._listener.context&&"suspended"===j.AudioHub._listener.context.state&&j.AudioHub._listener.context.resume();for(let e in j.MediaFlow._vStreams){let t=j.MediaFlow._vStreams[e].el;t.playing||t.uid||t.play()}},j.rewindAllPlayingMedia=()=>{j._elPanoVideo&&(j._elPanoVideo.currentTime=0),j.XPFNetwork._elVid&&(j.XPFNetwork.currentTime=0),j._auMain&&(j._auMain.stop(),j._auMain.play());for(let e in j.MediaFlow._vStreams){let t=j.MediaFlow._vStreams[e].el;t.playing&&!t.uid&&(t.stop(),t.play())}},j.checkAuth=(e,t)=>{j.REQ.get("user",(o=>{o&&e?e(o):t&&t()}),(e=>{t&&t()}))},j._setupBaseListeners=()=>{let e,t,o=j._renderer.domElement;window.addEventListener("resize",j._onResize,!1),window.onorientationchange=j._readDeviceOrientationMode,document.addEventListener("fullscreenchange",(e=>{j._bFS=!!document.fullscreenElement,j.fire("Fullscreen",j._bFS),j._bFS?console.log("Now fullscreen"):console.log("Exit fullscreen")})),void 0!==document.hidden?(e="hidden",t="visibilitychange"):void 0!==document.mozHidden?(e="mozHidden",t="mozvisibilitychange"):void 0!==document.msHidden?(e="msHidden",t="msvisibilitychange"):void 0!==document.webkitHidden&&(e="webkitHidden",t="webkitvisibilitychange"),void 0!==e&&document.addEventListener(t,(()=>{if(document[e]){if(j.XR._bPresenting)return;console.log("Suspend"),j.renderPause()}else{if(j.XR._bPresenting)return;console.log("Resume"),j.renderResume()}}),!1),o.addEventListener("mousemove",j._updateScreenMove,!1),o.addEventListener("mousedown",(e=>{1===e.button&&j.fire("MouseMidButton"),2===e.button&&j.fire("MouseRightButton")})),o.addEventListener("wheel",j._onMouseWheel,!1),j._bPointerDown=!1,Hammer(o).on("doubletap",(e=>{j._bPointerDown=!1,j._onUserInteraction(),j.fire("DoubleTap",e.srcEvent)})),Hammer(o).on("tap",(e=>{if(j._bPointerDown=!1,j._onUserInteraction(),j._updateScreenMove(e.srcEvent),j._handleQueries(),j.fire("Tap",e.srcEvent),void 0===j._hoveredUI)return;let t=j.getUINode(j._hoveredUI);t&&t.onSelect&&t.onSelect()})),j.on("DoubleTap",(e=>{j.defaultDoubleTapFromScreenCoords(e)})),j._kModShift=!1,j._kModCtrl=!1,j._bListenKeyboardEvents=!0,window.addEventListener("keydown",(e=>{j._onUserInteraction(),"Shift"===e.key&&(j._kModShift=!0),"Control"===e.key&&(j._kModCtrl=!0),j._bListenKeyboardEvents&&j.fire("KeyPress",e.key)}),!1),window.addEventListener("keyup",(e=>{"Shift"===e.key&&(j._kModShift=!1),"Control"===e.key&&(j._kModCtrl=!1),j._bListenKeyboardEvents&&j.fire("KeyUp",e.key)}),!1),j.on("KeyPress",(e=>{if("+"===e){let e=j.Nav.getFOV()+1;j.Nav.setFOV(e)}if("-"===e){let e=j.Nav.getFOV()-1;j.Nav.setFOV(e)}}))},j._onResize=()=>{if(j.Nav._camera.aspect=window.innerWidth/window.innerHeight,j.Nav._camera.updateProjectionMatrix(),j._renderer.setSize(window.innerWidth,window.innerHeight),j.FX.composer&&(j.FX.composer.setSize(window.innerWidth,window.innerHeight),j.FX.passes[j.FX.PASS_AA])){let e=j.FX.passes[j.FX.PASS_AA].material.uniforms;e&&e.resolution.value.set(1/window.innerWidth,1/window.innerHeight)}console.log("onResize")},j._onMouseWheel=e=>{e.preventDefault(),j.fire("MouseWheel",e.deltaY)},j.focusOn3DView=()=>{j._renderer.domElement.focus()},j._SUIactivation=()=>{const e=j.getUINode(j._hoveredUI);return void 0!==e&&void 0!==e.onSelect&&(e.onSelect(),!0)},j._stdActivation=()=>{if(j._SUIactivation())return;if(!j.Nav._bControl)return;if(void 0!==j.XPFNetwork._semCurr&&j.fire("SemanticMaskSelect",j.XPFNetwork._semCurr),j.XR._bPresenting){if(h.requestTransitionToLocomotionNodeInSightIfAny(j.XR.STD_TELEP_DURATION))return;return"immersive-vr"===j.XR._sessionType&&j.XR.teleportOnQueriedPoint(),void j.FE.playAudioFromSemanticNode(j._hoveredSemNode)}if(j.Nav.isFirstPerson()||j.Nav.isDevOri()){if(h.requestTransitionToLocomotionNodeInSightIfAny(.5))return;if(j.Nav.currentQueryValidForLocomotion()){let e=j._queryDataScene.p,t=j.Nav._vDir,o=new THREE.Vector3(e.x,e.y+j.userHeight,e.z),i=new THREE.Vector3(o.x+t.x,o.y+t.y,o.z+t.z),r=(new j.POV).setPosition(o).setTarget(i).setFOV(j.Nav._currPOV.fov);j.Nav.requestPOV(r,.5)}return}let e=j.getSemanticNode(j._hoveredSemNode);j._queryDataSem&&e?j.Nav.requestPOVbyNode(e,.5):j._queryDataScene&&j.Nav.requestRetarget(j._queryDataScene.p,void 0,.5)},j.defaultDoubleTapFromScreenCoords=e=>{j._updateScreenMove(e),j._handleQueryScene(),j._stdActivation()},j.isFullscreen=()=>j._bFS,j.toggleFullScreen=()=>{document.fullscreenElement?document.exitFullscreen&&document.exitFullscreen():document.documentElement.requestFullscreen()},j.realize=e=>{console.log("Initialize ATON..."),j.Utils.init(),j.Utils.profileDevice(),j._clock=new THREE.Clock(!0),j.bounds=new THREE.Sphere,j._worldScale=1,j._ws=0,j._bFS=!1,j._renderer=new THREE.WebGLRenderer({antialias:!0,alpha:!0}),j._renderer.setSize(window.innerWidth,window.innerHeight),j.Utils.profileRenderingCapabilities(),j._stdpxd=1,j._fps=60,j._dt=.01,j._dtAccum=0,j._dtCount=0,j._avgFPSaccum=0,j._avgFPS=60,j._dRenderBudgetMinFPS=20,j._dRenderBudgetMaxFPS=55,j._bAdaptiveDensity=!0,j._adMin=.4,j._adMax=1.5,j.device.lowGPU&&(j._adMax=1),j._aniMixers=[],j._stdEncoding=THREE.LinearSRGBColorSpace,j._renderer.outputColorSpace=j._stdEncoding,j._renderer.toneMapping=THREE.LinearToneMapping,j._renderer.toneMappingExposure=1,e||j._renderer.setAnimationLoop(j._onFrame),j._maxAnisotropy=j._renderer.capabilities.getMaxAnisotropy(),j.userHeight=1.7,e||document.body.appendChild(j._renderer.domElement);let t=j._renderer.domElement;t.id="idView3D",t.style.outline="none",t.style.border="none",j.UI.init(),j.REQ.init(),j._vpanoPlaying=!1,j._bUserInts=0,j.EventHub.init(),j.MatHub.init(),j.ASCII.init(),j._assetsManager={},j._aLoader=new THREE.GLTFLoader,j._numReqLoad=0,j._collMod=void 0,j._ktx2Loader=new THREE.KTX2Loader,j._ktx2Loader.setTranscoderPath(j.PATH_BASIS_LIB),j._ktx2Loader.detectSupport(j._renderer),j._dracoLoader=new THREE.DRACOLoader,j._dracoLoader.setDecoderPath(j.PATH_DRACO_LIB),j._dracoLoader.setWorkerLimit(2),j._dracoLoader.preload(),j._aLoader.setDRACOLoader(j._dracoLoader),j._aLoader.setKTX2Loader(j._ktx2Loader),THREE.DefaultLoadingManager.addHandler(/\.ktx2$/,j._ktx2Loader),j._updRoutines=[],j._pmremGenerator=void 0,j._lps=[],j._bAutoLP=!1,j._envMapInt=1,j._numLPbounces=2,j._lpbCount=0,j._bShadowsFixedBound=!1,j._shadowsFixedBoundCenter=void 0,j._shadowsNear=j.SHADOWS_NEAR,j._shadowsFar=j.SHADOWS_FAR,j._shadowsSize=j.SHADOWS_SIZE,j._shadowsRes=j.SHADOWS_RES,j.initGraphs(),j.SceneHub.init(),j.MRes.init(),j.CC.init(),j.AudioHub.init(),j.Nav.init(),j.XR.init(),j.SUI.init(),j.Photon.init(),j.VRoadcast=j.Photon,j.MediaFlow.init(),j.SemFactory.init(),j.Phygital.init(),j.XPFNetwork.init(),j.device.lowGPU||j.device.isMobile||j.FX.init(),j.FX.composer||(j._render=()=>{j._renderer.render(j._mainRoot,j.Nav._camera)}),j.setDefaultPixelDensity(1),j._queryDataScene=void 0,j._queryDataSem=void 0,j._queryDataUI=void 0,j._hoveredSemNode=void 0,j._hoveredUI=void 0,j._bq=!0,j._bQuerySemOcclusion=!0,j._bQueryNormals=!0,j._bPauseQuery=!1,j._bCenteredQuery=!1,j._bqScene=!1,j._bqSem=!1,j._qSync=0,j._qSyncInt=1,j._tgiDur=void 0,j._tgiPer=void 0,j._tHover=void 0,j._bMainPanoInfinite=!0,j._matMainPano=void 0,j._mMainPano=void 0,j._screenPointerCoords=new THREE.Vector2(0,0),j._rcScene=new THREE.Raycaster,j._rcScene.layers.set(j.NTYPES.SCENE),j._rcScene.firstHitOnly=!0,j._rcSemantics=new THREE.Raycaster,j._rcSemantics.layers.set(j.NTYPES.SEM),j._rcSemantics.firstHitOnly=!0,j._rcUI=new THREE.Raycaster,j._rcUI.layers.set(j.NTYPES.UI),j._rcUI.firstHitOnly=!0,j._setupBaseListeners(),j.device.isMobile&&j._readDeviceOrientationMode(),j._fLoading=0,j._fRequired=j._fReqList.length,j._loadFlares(),j._gizmo=void 0,j._bGizmo=!1,j.focusOn3DView(),j._bInitialized=!0},j.realize2D=()=>{j._b2D=!0,j.UI.init(),j.REQ.init(),document.body.classList.add("aton-body2D"),document.body.oncontextmenu=null,j.EventHub.init(),j._bInitialized=!0},j.addFlare=e=>{if(void 0===e)return;let t=Object.keys(j.Flares).length,o=e.getID();o?j.Flares[o]=e:j.Flares["F"+t]=e},j.registerFlare=j.addFlare,j.getFlare=e=>j.Flares[e],j.loadScript=(e,t,o)=>{let i=document.createElement("script");i.src=e,i.async=!1,document.head.appendChild(i),t&&(i.onload=t),o&&(i.onerror=o)},j._loadFlare=e=>{j._fLoading++,$.get(j.PATH_RESTAPI2+"flares/"+e,(t=>{let o=t.files;if(o){let t=o.length;for(let i in o)j.loadScript(j.PATH_FLARES+e+"/"+o[i],(()=>{t--,t<=0&&j._onFlareLoaded(e)}),(()=>{console.log("Missing flare '"+e+"' dependency: "+o[i]),t--,t<=0&&j._onFlareLoaded(e)}))}})).fail((()=>{console.log("Flare "+e+" not found."),j._onFlareError(e)}))},j._loadFlares=()=>{if(j._fRequired<=0)j.fire("AllFlaresReady");else for(let e in j._fReqList)j._loadFlare(j._fReqList[e])},j._onFlareLoaded=e=>{console.log("All deps loaded for flare '"+e+"'"),j._deployNewFlares(),j._fLoading--,j._fLoading<=0&&j._onAllFlaresLoaded()},j._onFlareError=e=>{j._fLoading--,j._fLoading<=0&&j._onAllFlaresLoaded()},j._onAllFlaresLoaded=()=>{console.log("All Flares ready!"),j.fire("AllFlaresReady")},j._deployFlare=e=>{e._bDeployed||(void 0!==e.setup&&e.setup(),void 0!==e.update&&j.addUpdateRoutine(e.update),e._bDeployed=!0)},j._deployNewFlares=()=>{for(let e in j.Flares)j._deployFlare(j.Flares[e])},j.setCollectionPathModifier=e=>{j._collMod=e},j.setTimedGazeDuration=e=>{j._tgiDur=e},j.getTimedGazeProgress=()=>{if(void 0!==j._tgiDur)return j._tgiPer},j.getElapsedTime=()=>j._clock.elapsedTime,j.renderPause=()=>{j._renderer.setAnimationLoop(void 0)},j.renderResume=()=>{j._renderer.setAnimationLoop(j._onFrame)},j._setupLoadManager=()=>{j._loadManager=new THREE.LoadingManager,j._loadManager.onStart=(e,t,o)=>{console.log("Started loading file: "+e+".\nLoaded "+t+" of "+o+" files."),j.fire("NodeRequestFired",e)},j._loadManager.onLoad=()=>{console.log("Loading complete!"),j.fire("AllNodeRequestsCompleted")},j._loadManager.onProgress=(e,t,o)=>{},j._loadManager.onError=e=>{console.log("There was an error loading "+e)}},j.setDefaultPixelDensity=e=>{j._stdpxd=e,j._renderer.setPixelRatio(e),j.FX.composer&&j.FX.composer.setPixelRatio(e),void 0!==j._renderer.xr&&(j.device.isMobile?j._renderer.xr.setFramebufferScaleFactor(j._stdpxd*j.XR.MOBILE_DENSITY_F):j._renderer.xr.setFramebufferScaleFactor(j._stdpxd))},j.resetPixelDensity=()=>{j._renderer.setPixelRatio(j._stdpxd)},j._readDeviceOrientationMode=()=>{90===Math.abs(window.orientation)?(console.log("Landscape Mode"),j.fire("MobileLandscapeMode")):(console.log("Portrait Mode"),j.fire("MobilePortraitMode")),setTimeout(j._onResize,500)},j.snodes={},j.semnodes={},j.uinodes={},j.createSceneNode=e=>new j.Node(e,j.NTYPES.SCENE),j.getSceneNode=e=>{if(void 0!==e)return j.snodes[e]},j.getOrCreateSceneNode=e=>{let t=j.getSceneNode(e);return void 0!==t?t:j.createSceneNode(e)},j.getRootScene=()=>j._rootVisible,j.createSemanticNode=e=>new j.Node(e,j.NTYPES.SEM),j.getSemanticNode=e=>{if(void 0!==e)return j.semnodes[e]},j.getOrCreateSemanticNode=e=>{let t=j.getSemanticNode(e);return void 0!==t?t:j.createSemanticNode(e)},j.getRootSemantics=()=>j._rootSem,j.createUINode=e=>new j.Node(e,j.NTYPES.UI),j.getUINode=e=>{if(void 0!==e)return j.uinodes[e]},j.getRootUI=()=>j._rootUI,j._unpackScale=e=>0==e?1:e>=0?1.1*e:1/(-1.1*e),j.setUserScaleLevel=e=>{j.setWorldScaleLevel(-e)},j.getUserScale=()=>1/j._worldScale,j.setWorldScaleLevel=e=>{void 0===e&&(e=0),e<-127&&(e=127),e>127&&(e=127),j._ws=e;let t=j._unpackScale(e);j._rootVisible.scale.set(t,t,t),j._rootSem.scale.set(t,t,t),N.gLocNodes.scale.set(t,t,t),N.gMeasures.scale.set(t,t,t),j.Photon.avaGroup&&j.Photon.avaGroup.scale.set(t,t,t),j.recomputeSceneBounds();let o=t/j._worldScale;j.Nav._currPOV.pos.x*=o,j.Nav._currPOV.pos.y*=o,j.Nav._currPOV.pos.z*=o,j.Nav._currPOV.target.x*=o,j.Nav._currPOV.target.y*=o,j.Nav._currPOV.target.z*=o,j.Nav.syncCurrCamera(),j.XR._bPresenting&&j.XR.setRefSpaceLocation(j.Nav._currPOV.pos),j._worldScale=t,console.log("World scale: "+t)},j.getWorldScaleLevel=()=>j._ws,j.getWorldScale=()=>j._worldScale,j._assetReqNew=e=>{j._numReqLoad++,j.fire("NodeRequestFired",e)},j._assetReqComplete=e=>{j.fire("NodeRequestCompleted",e),j._numReqLoad--,j._numReqLoad<=0&&j._onAllReqsCompleted()},j._onAllReqsCompleted=()=>{j.recomputeSceneBounds(),j.getRootScene().assignLightProbesByProximity(),j.fire("AllNodeRequestsCompleted"),j._postAllReqsCompleted(),setTimeout((()=>{j.updateLightProbes(),j._renderer.shadowMap.enabled&&j._bShadowsFixedBound&&0===j._aniMixers.length&&(j._dMainL.shadow.autoUpdate=!1,console.log("Lazy shadows"))}),1e3)},j._postAllReqsCompleted=e=>{void 0===e&&(e=j._rootVisible);for(let t in e.children){let o=e.children[t];o&&o.toggle&&(j._postAllReqsCompleted(o),o.toggle(o.visible))}ThreeMeshUI.update()},j.recomputeSceneBounds=e=>{e?j.bounds.union(e):(j.bounds.center.copy(j._rootVisible.getBound().center),j.bounds.radius=j._rootVisible.getBound().radius),j.bounds.radius<=0||(j._renderer.shadowMap.enabled&&(j._rootVisible.traverse((e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0)})),j.adjustShadowsParamsFromSceneBounds(),j._bShadowsFixedBound&&j.updateDirShadows()),j._bAutoLP&&(void 0===j._lps[0]?j.addLightProbe((new j.LightProbe).setPosition(j.bounds.center).setNear(j.bounds.radius)):j._lps[0].setPosition(j.bounds.center).setNear(j.bounds.radius),console.log("Auto LP")),j.FX.composer&&j.FX.setDOFaperture(1/(30*j.bounds.radius)),j._mMainPano&&j._mMainPano.position.copy(j.bounds.center))},j.registerNodeResourceHandler=(e,t)=>{j._resHandler||(j._resHandler={}),j._resHandler[e]=t,console.log("Registered resource handler '"+e+"'")},j.removeNodeResourceHanlder=e=>{j._resHandler&&j._resHandler[e]&&(j._resHandler[e]=void 0)},j.initGraphs=()=>{j._mainRoot=new THREE.Scene,j._mainRoot.background=new THREE.Color(.7,.7,.7),j._rootVisibleGlobal=new THREE.Scene,j._mainRoot.add(j._rootVisibleGlobal),j._rootVisible=j.createSceneNode().setAsRoot(),j._rootVisibleGlobal.add(j._rootVisible),j._rootSem=j.createSemanticNode().setAsRoot(),j._mainRoot.add(j._rootSem),j._rootUI=j.createUINode().setAsRoot(),j._mainRoot.add(j._rootUI),j.ambLight=new THREE.AmbientLight(new THREE.Color(1,1,1)),j.ambLight.intensity=3,j._rootVisibleGlobal.add(j.ambLight),j.plight=new THREE.PointLight,j.plight.intensity=0,j.plight.decay=.2,j._rootVisibleGlobal.add(j.plight)},j.enablePointLight=()=>{j.plight.intensity=3},j.disablePointLight=()=>{j.plight.intensity=0},j.setBackgroundColor=e=>{j._mainRoot.background=e},j.setFog=(e,t)=>{void 0!==e&&(void 0===t&&(t=200),j._rootVisibleGlobal.fog=new THREE.Fog(e,1,t),j.setBackgroundColor(e))},j.disableFog=()=>{j._rootVisibleGlobal.fog=null},j.setAutoLP=e=>{j._bAutoLP=e},j.setNeutralAmbientLight=e=>{j.ambLight.color=new THREE.Color(e,e,e)},j.addLightProbe=e=>{void 0!==e&&(j._lps.push(e),j.setNeutralAmbientLight(0),void 0!==j.SUI.gLPIcons&&N.addLPIcon(e))},j.getNumLightProbes=()=>j._lps.length,j._updLP=()=>{for(let e in j._lps)j._lps[e].update();j._rootVisible.traverse((e=>{let t=e.userData.LP;void 0!==t&&t instanceof j.LightProbe&&(e.material.envMap=t.getEnvTex(),e.material.envMapIntensity=j._envMapInt,e.material.needsUpdate=!0)}))},j.setLightProbesNumBounces=e=>{e<1||(j._numLPbounces=e)},j.dirtyLightProbes=e=>{void 0===e&&(e=j._numLPbounces),j._lpbCount=e},j.updateLightProbes=()=>{if(!j.XR._bPresenting&&0!==j._lps.length){for(let e=0;e{let t;if(e=j.Utils.resolveCollectionURL(e),void 0===j._mMainPano&&(j._gMainPano=new THREE.SphereGeometry(1,60,60),j._gMainPano.castShadow=!1,j._gMainPano.receiveShadow=!1,j._mMainPano=new THREE.Mesh(j._gMainPano,j._matMainPano),j._mMainPano.frustumCulled=!1,j._mMainPano.renderOrder=-100,j._mMainPano.layers.disable(j.NTYPES.SCENE),j._mMainPano.layers.disable(j.NTYPES.SEM),j._mMainPano.layers.disable(j.NTYPES.UI),j._mMainPano.raycast=j.Utils.VOID_CAST,j.setMainPanoramaRadius(.8*j.Nav.STD_FAR)),j.Utils.isVideo(e)){if(void 0===j._elPanoVideo){let t="",$(t).appendTo("body"),j._elPanoVideo=document.getElementById("idPanoVideo"),j._elPanoVideo.onplaying=()=>{console.log("VideoPano playing"),j._vpanoPlaying=!0},j._elPanoVideo.onpause=()=>{console.log("VideoPano paused"),j._vpanoPlaying=!1},j._elPanoVideo.addEventListener("touchstart",(function(){j._elPanoVideo.play()})),enableInlineVideo(j._elPanoVideo)}t=new THREE.VideoTexture(j._elPanoVideo),t.colorSpace=j._stdEncoding,j._realizeOrUpdateMainPano(t),j.fire("MainPanoVideo")}else{if(e.endsWith(".hdr"))return void(new THREE.RGBELoader).load(e,(e=>{e.minFilter=THREE.LinearMipmapLinearFilter,e.magFilter=THREE.LinearFilter,e.colorSpace=j._stdEncoding,j._realizeOrUpdateMainPano(e),j.fire("MainPanoHDR")}));if(e.endsWith(".exr"))return void(new THREE.EXRLoader).load(e,(e=>{e.minFilter=THREE.LinearMipmapLinearFilter,e.magFilter=THREE.LinearFilter,e.colorSpace=j._stdEncoding,j._realizeOrUpdateMainPano(e),j.fire("MainPanoHDR")}));j.Utils.textureLoader.load(e,(e=>{e.colorSpace=j._stdEncoding,e.generateMipmaps=!0,j._realizeOrUpdateMainPano(e),j.fire("MainPano")}))}},j.playMainPanorama=()=>{j._elPanoVideo&&(j._vpanoPlaying||j._elPanoVideo.play())},j.pauseMainPanorama=()=>{j._elPanoVideo&&j._vpanoPlaying&&j._elPanoVideo.pause()},j.playOrPauseMainPanorama=()=>{j._elPanoVideo&&(j._vpanoPlaying?j._elPanoVideo.pause():j._elPanoVideo.play())},j.stopAndRemoveMainPanorama=()=>{j._elPanoVideo&&(j._vpanoPlaying&&j._elPanoVideo.pause(),j._elPanoVideo.remove(),j._elPanoVideo=void 0,j._vpanoPlaying=!1)},j._realizeOrUpdateMainPano=e=>{if(void 0!==j._matMainPano)return j._matMainPano.map=e,void j.updateLightProbes();j._matMainPano=new THREE.MeshBasicMaterial({map:e,depthTest:!1,depthWrite:!1}),j._mMainPano.material=j._matMainPano,j._bMainPanoInfinite&&(j._mMainPano.onAfterRender=()=>{"immersive-ar"!==j.XR._sessionType&&j.Nav._currPOV&&j._mMainPano.position.copy(j.Nav._currPOV.pos)}),j._rootVisibleGlobal.add(j._mMainPano),j.updateLightProbes()},j.setMainPanoramaRadius=e=>{void 0!==j._gMainPano&&j._gMainPano.scale(-e,e,e)},j.setMainPanoramaRotation=e=>{void 0!==j._mMainPano&&j._mMainPano.rotation.set(0,e,0)},j.setMainPanoramaInfinite=e=>{j._bMainPanoInfinite=e,void 0!==j._mMainPano&&(j._mMainPano.onAfterRender=e?()=>{j.Nav._currPOV&&j._mMainPano.position.copy(j.Nav._currPOV.pos)}:void 0)},j.setMainPanoramaLocation=e=>{j._bMainPanoInfinite||void 0!==j._mMainPano&&j._mMainPano.position.copy(e)},j.setMainLightDirection=e=>{let t=e.clone();t.normalize(),t.x*=.5*j.SHADOWS_FAR,t.y*=.5*j.SHADOWS_FAR,t.z*=.5*j.SHADOWS_FAR,void 0===j._dMainL&&(j._dMainL=new THREE.DirectionalLight(new THREE.Color(1,1,1),1),j._dMainL.castShadow=!1,j._dMainL.intensity=2,j._dMainLtgt=new THREE.Object3D,j._rootVisibleGlobal.add(j._dMainLtgt),j._dMainL.target=j._dMainLtgt,j._rootVisibleGlobal.add(j._dMainL),j._dMainLpos=new THREE.Vector3),j._dMainLdir=t,j._dMainL.position.set(-t.x,-t.y,-t.z),j._renderer.shadowMap.enabled&&(j._dMainL.shadow.needsUpdate=!0),j.toggleMainLight(!0)},j.getMainLightDirection=()=>{if(void 0===j._dMainLdir)return;let e=j._dMainLdir.clone();return e.normalize(),e},j.toggleMainLight=e=>{if(void 0===j._dMainL)return;j._dMainL.visible=e;let t=j._lps.length;e?(t>0?j.setNeutralAmbientLight(0):j.setNeutralAmbientLight(j.AMB_L),j.updateDirShadows()):t>0?j.setNeutralAmbientLight(0):j.setNeutralAmbientLight(j.AMB_L)},j.isMainLightEnabled=()=>void 0!==j._dMainL&&!!j._dMainL.visible,j.setExposure=e=>{j._renderer.toneMappingExposure=e},j.getExposure=()=>j._renderer.toneMappingExposure,j.adjustShadowsParamsFromSceneBounds=()=>{if(void 0===j._dMainL)return;let e=j._rootVisible.getBound().radius,t=j._rootVisible.getBound().center;e<=0||e>=j.SHADOWS_SIZE?(j._bShadowsFixedBound=!1,j._shadowsSize=j.SHADOWS_SIZE):(j._bShadowsFixedBound=!0,j._shadowsFixedBoundCenter=t,j._shadowsSize=1.5*e),j._dMainL.shadow.map&&(j._dMainL.shadow.map.dispose(),j._dMainL.shadow.map=null),j._dMainL.shadow.camera.left=-j._shadowsSize,j._dMainL.shadow.camera.right=j._shadowsSize,j._dMainL.shadow.camera.bottom=-j._shadowsSize,j._dMainL.shadow.camera.top=j._shadowsSize,j._dMainL.shadow.mapSize.width=j._shadowsRes,j._dMainL.shadow.mapSize.height=j._shadowsRes,j._dMainL.shadow.camera.near=j._shadowsNear,j._dMainL.shadow.camera.far=j._shadowsFar;let o=-2e-4*e;o<-.001&&(o=-.001),j._dMainL.shadow.bias=o},j.toggleShadows=e=>{if(void 0!==j._dMainL)if(e){if(j.XR.isPresenting())return;if(j.device.lowGPU)return;j._dMainL.castShadow=!0,j._renderer.shadowMap.enabled=!0,j.device.isMobile?j._renderer.shadowMap.type=THREE.PCFShadowMap:j._renderer.shadowMap.type=THREE.PCFSoftShadowMap,j._rootVisible.traverse((e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0)})),j.adjustShadowsParamsFromSceneBounds(),j.updateDirShadows(),j._dMainL.shadow.needsUpdate=!0,console.log("Shadows ON")}else j._dMainL.castShadow=!1,j._renderer.shadowMap.enabled=!1,console.log("Shadows OFF")},j.updateDirShadows=()=>{if(void 0===j._dMainLdir)return;if(void 0===j._dMainLpos)return;let e=j._shadowsFixedBoundCenter;void 0===e?(e=j.Nav.getCurrentEyeLocation(),j._dMainLpos.x=e.x+j.Nav._vDir.x*j._shadowsSize,j._dMainLpos.y=e.y+j.Nav._vDir.y*j._shadowsSize,j._dMainLpos.z=e.z+j.Nav._vDir.z*j._shadowsSize):(j._dMainLpos.x=e.x,j._dMainLpos.y=e.y,j._dMainLpos.z=e.z),j._dMainL.position.set(j._dMainLpos.x-j._dMainLdir.x,j._dMainLpos.y-j._dMainLdir.y,j._dMainLpos.z-j._dMainLdir.z),j._dMainLtgt.position.copy(j._dMainLpos)},j._updateEnvironment=()=>{j._renderer.shadowMap.enabled&&(j._bShadowsFixedBound||j.updateDirShadows())},j.setGlobalAudio=(e,t)=>{void 0!==e&&(void 0===t&&(t=!0),e=j.Utils.resolveCollectionURL(e),void 0===j._auMain||null===j._auMain?j._auMain=new THREE.Audio(j.AudioHub._listener):j._auMain.isPlaying&&j._auMain.stop(),j.AudioHub._loader.load(e,(e=>{j._auMain.setBuffer(e),j._auMain.setLoop(t),j._auMain.play()})))},j._markFPS=()=>{j._numReqLoad>0||j._dt<0||(j._dtCount+=1,j._dtAccum+=j._dt,j._dtAccum<1||(j._fps=1/(j._dtAccum/j._dtCount),j._dtCount=0,j._dtAccum=0,j._handleDynamicRenderProfiles()))},j.toggleAdaptiveDensity=e=>{j._bAdaptiveDensity=e},j.setAdaptiveDensityRange=(e,t)=>{e>=t||(j._adMin=e,j._adMax=t)},j.setDynamicRenderingFPS=(e,t)=>{e>=t||(e&&(j._dRenderBudgetMinFPS=e),t&&(j._dRenderBudgetMaxFPS=t))},j._handleDynamicRenderProfiles=()=>{let e=j._renderer.getPixelRatio();j._fps=j._adMin&&(j._renderer.setPixelRatio(e),j.FX.composer&&j.FX.composer.setPixelRatio(e),console.log("Density: "+e.toPrecision(2)))),j.fire("RequestLowerRender")),j._fps>j._dRenderBudgetMaxFPS&&(j._bAdaptiveDensity&&!j.XR._bPresenting&&(e+=.1,e<=j._adMax&&(j._renderer.setPixelRatio(e),j.FX.composer&&j.FX.composer.setPixelRatio(e),console.log("Density: "+e.toPrecision(2)))),j.fire("RequestHigherRender"))},j._onFrame=()=>{j._dt=j._clock.getDelta(),j._markFPS(),j.XR._bPresenting?j.XR.update():j.Nav._controls.update(j._dt),j._handleQueries(),j.Nav.update(),j.Photon.update(),j.SUI.update(),j.MatHub.update(),j._updateEnvironment(),j._updateAniMixers(),j._updateRoutines(),j.MRes.update(),j.XPFNetwork.update(),j._render()},j._render=()=>{!j.FX.composer||j.XR._bPresenting?j._renderer.render(j._mainRoot,j.Nav._camera):j.FX.composer.render()},j.addUpdateRoutine=e=>{void 0!==e&&j._updRoutines.push(e)},j.deleteAllUpdateRoutines=()=>{j._updRoutines=[]},j._updateRoutines=()=>{let e=j._updRoutines.length;if(!(e<=0))for(let t=0;t{let e=j._aniMixers.length;if(!(e<1))for(let t=0;t{e.preventDefault&&e.preventDefault(),j._bCenteredQuery||(j._screenPointerCoords.x=e.clientX/window.innerWidth*2-1,j._screenPointerCoords.y=-e.clientY/window.innerHeight*2+1)},j.toggleCenteredQuery=e=>{j._bCenteredQuery=e,e&&(j._screenPointerCoords.x=0,j._screenPointerCoords.y=0)},j.toggleQueries=e=>{j._bq=e},j._registerRCS=()=>{j._rcRR=0,j._rcHandlers=[],j._rcHandlers.push(j._handleQueryScene),j._rcHandlers.push(j._handleQuerySemantics),j._rcHandlers.push(j._handleQueryUI)},j._handleQueries=()=>{if(!j._bq)return;if(j._bPauseQuery)return;if(j.Nav._bInteracting)return;if(j._numReqLoad>0)return;if(j.Nav.isTransitioning())return;if(j._handleQueryUI(),j._bqScene&&j._handleQueryScene(),j._bqSem&&j._handleQuerySemantics(),j.Nav._bLocValidator&&j.Nav.locomotionValidator(),void 0===j._tgiDur)return;if(void 0===j._tHover)return;const e=j._clock.elapsedTime-j._tHover;e>=j._tgiDur?(j._stdActivation(),j._tHover=void 0,j._tgiPer=void 0):j._tgiPer=e/j._tgiDur},j._handleQueryScene=()=>{if(j.XR.isPresenting()?j.XR.setupQueryRay(j._rcScene):j._rcScene.setFromCamera(j._screenPointerCoords,j.Nav._camera),j._hitsScene=[],j._rcScene.intersectObjects(j._mainRoot.children,!0,j._hitsScene),j._hitsScene.length<=0)return void(j._queryDataScene=void 0);const e=j._hitsScene[0];j._queryDataScene={},j._queryDataScene.p=e.point,j._queryDataScene.d=e.distance,j._queryDataScene.o=e.object,j._queryDataScene.uv=e.uv,j._bQueryNormals&&e.face&&e.face.normal&&(j._queryDataScene.matrixWorld=(new THREE.Matrix3).getNormalMatrix(e.object.matrixWorld),j._queryDataScene.n=e.face.normal.clone().applyMatrix3(j._queryDataScene.matrixWorld).normalize())},j.getSceneFocalPoint=()=>{if(void 0===j._queryDataScene)return;let e=j._queryDataScene.p,t=new THREE.Vector3;return t.lerpVectors(e,j.Nav._currPOV.pos,.02),t},j.getSceneQueriedPoint=()=>{if(void 0!==j._queryDataScene)return j._queryDataScene.p},j.getSceneQueriedDistance=()=>{if(void 0!==j._queryDataScene)return j._queryDataScene.d},j.getSceneQueriedNormal=()=>{if(void 0!==j._queryDataScene)return j._queryDataScene.n},j.getSceneQueriedObjectName=()=>{if(void 0!==j._queryDataScene&&void 0!==j._queryDataScene.o)return j._queryDataScene.o.name},j.getSceneQueriedUV=()=>{if(void 0!==j._queryDataScene)return j._queryDataScene.uv},j.setQueryRange=(e,t,o)=>{void 0!==o&&o!==j.NTYPES.SCENE||(j._rcScene.near=e,j._rcScene.far=t),void 0!==o&&o!==j.NTYPES.SEM||(j._rcSemantics.near=e,j._rcSemantics.far=t)},j._handleQuerySemantics=()=>{if(j.XR.isPresenting()?j.XR.setupQueryRay(j._rcSemantics):j._rcSemantics.setFromCamera(j._screenPointerCoords,j.Nav._camera),j._hitsSem=[],j._rcSemantics.intersectObjects(j._mainRoot.children,!0,j._hitsSem),j._hitsSem.length<=0){if(j._queryDataSem=void 0,j._hoveredSemNode){j.fire("SemanticNodeLeave",j._hoveredSemNode);let e=j.getSemanticNode(j._hoveredSemNode);e&&e.onLeave&&e.onLeave()}return j._hoveredSemNode=void 0,void(j._tHover=void 0)}const e=j._hitsSem[0];if(j._bQuerySemOcclusion&&j._queryDataScene&&j._queryDataScene.d{if(j.XR.isPresenting()?j.XR.setupQueryRay(j._rcUI):j._rcUI.setFromCamera(j._screenPointerCoords,j.Nav._camera),j._hitsUI=[],j._rcUI.intersectObjects(j._mainRoot.children,!0,j._hitsUI),j._hitsUI.length<=0){if(j._queryDataUI=void 0,j._hoveredUI){j.fire("UINodeLeave",j._hoveredUI);const e=j.getUINode(j._hoveredUI);e&&e.onLeave&&e.onLeave()}return j._hoveredUI=void 0,void(j._tHover=void 0)}const e=j._hitsUI[0];if(j._queryDataScene&&j._queryDataScene.d{if(void 0!==j._hoveredSemNode)return j.getSemanticNode(j._hoveredSemNode)},j.setAPIToken=(e,t)=>{window.sessionStorage.setItem("ATON.tokens."+e,t)},j.getAPIToken=e=>window.sessionStorage.getItem("ATON.tokens."+e),j.clearToken=e=>{window.sessionStorage.removeItem("ATON.tokens."+e)},j.enableClipPlanes=()=>{j._renderer&&(j._renderer.localClippingEnabled=!0)},j.disableClipPlanes=()=>{j._renderer&&(j._renderer.localClippingEnabled=!1,j._clipPlanes=[])},j.addClipPlane=(e,t)=>{j.enableClipPlanes();let o=new THREE.Plane;return o.setFromNormalAndCoplanarPoint(e,t),j._clipPlanes.push(o),j.Utils._visitorCP(),o},j.useGizmo=e=>{j._bGizmo=e,j._setupGizmo()},j._setupGizmo=()=>{}})(); \ No newline at end of file +(()=>{"use strict";class e extends THREE.Group{constructor(e,t){super(),this.type=t||ATON.NTYPES.SCENE,this.enablePicking(),this.type===ATON.NTYPES.SCENE&&(this._rootG=ATON._rootVisible,this._nodes=ATON.snodes),this.type===ATON.NTYPES.SEM&&(this._rootG=ATON._rootSem,this._nodes=ATON.semnodes),this.type===ATON.NTYPES.UI&&(this._rootG=ATON._rootUI,this._nodes=ATON.uinodes),this.as(e),this.kwords=void 0,this._bCloneOnLoadHit=!0,this._tlist=void 0,this._aniMixers=void 0,this.castShadow=!1,this.receiveShadow=!1,this._bs=new THREE.Sphere,this.autocenter=!1,this.onHover=void 0,this.onLeave=void 0,this.onSelect=void 0}as(e){if(void 0!==e&&e!==ATON.ROOT_NID)return this._nodes[e]=this,this.nid=e,this.name=e,this}setAsRoot(){return this._nodes[ATON.ROOT_NID]=this,this.nid=ATON.ROOT_NID,this}setCloneOnLoadHit(e){return this._bCloneOnLoadHit=e,this}addKeywords(e){let t=e.split(",");void 0===this.kwords&&(this.kwords={});for(let e in t){let o=t[e].trim();o.length>0&&(this.kwords[o]=!0)}for(let t in this.children){let o=this.children[t];void 0!==o.type&&o.addKeywords(e)}return this}hasKeyword(e){if(void 0!==this.kwords)return void 0!==this.kwords[e]}setDescription(e){return this.userData.description=e,this}getDescription(){return this.userData.description}setAudio(e){return this.userData.audio=e,this}getAudio(){return this.userData.audio}hide(){let e=this.visible;return this.visible=!1,ATON.Utils.setPicking(this,this.type,!1),ATON._renderer.shadowMap.enabled&&(ATON._dMainL.shadow.needsUpdate=!0),e&&ATON.updateLightProbes(),this}show(){let e=this.visible;return this.visible=!0,ATON.Utils.setPicking(this,this.type,this.bPickable),ATON._renderer.shadowMap.enabled&&void 0!==ATON._dMainL&&void 0!==ATON._dMainL.shadow&&(ATON._dMainL.shadow.needsUpdate=!0),e||ATON.updateLightProbes(),this}toggle(e){return void 0===e?this.visible?this.hide():this.show():e?this.show():this.hide()}disablePicking(){return this.bPickable=!1,ATON.Utils.setPicking(this,this.type,this.bPickable),this}enablePicking(){return this.bPickable=!0,ATON.Utils.setPicking(this,this.type,this.bPickable),this}setPickable(e){return e?this.enablePicking():this.disablePicking(),this}setMaterial(e){this.userData.cMat=e,this.traverse((t=>{t.isMesh&&(t.material=e),t.type&&(this.userData.cMat=e)}));for(let t in this.children){let o=this.children[t];o.setMaterial&&o.setMaterial(e)}return this}getMaterial(){return this.userData.cMat}setDefaultAndHighlightMaterials(e,t){return this.userData.matSTD=e,this.userData.matHL=t,this}highlight(){return this.userData.matHL&&this.setMaterial(this.userData.matHL),this}restoreDefaultMaterial(){return this.userData.matSTD&&this.setMaterial(this.userData.matSTD),this}setOpacity(e){return this.traverse((t=>{t.isMesh&&(t.material.opacity=e)})),this}setShadowCast(e){return this.castShadow=e,this.traverse((t=>{t.isMesh&&(t.castShadow=e)})),this}setShadowReceive(e){return this.receiveShadow=e,this.traverse((t=>{t.isMesh&&(t.receiveShadow=e)})),this}setEnvMap(e){return this.traverse((t=>{t.isMesh&&(t.material.envMap=e)})),this}assignLightProbe(e){return this.traverse((t=>{t.isMesh&&t.geometry&&ATON.Utils.assignLightProbeToMesh(e,t)})),this}assignLightProbesByProximity(){return 0===ATON._lps.length||this.traverse((e=>{if(e.isMesh&&e.geometry){let t,o,i=new THREE.Vector3;(new THREE.Box3).setFromObject(e).getCenter(i);for(let e in ATON._lps){let r=ATON._lps[e],a=i.distanceToSquared(r.pos);(void 0===t||a{e.isMesh&&e.geometry&&(ATON.Utils.clearLightProbeFromMesh(e),e.material&&(e.material.envMap.dispose(),e.material.needsUpdate=!0))})),this}updateLightProbes=()=>(this.traverse((e=>{if(e.isMesh&&e.geometry){let t=e.userData.LP;void 0!==t&&(t.update(),e.material.envMap=t.getEnvTex(),e.material.needsUpdate=!0)}})),this);duplicate(){let e=this.clone();return e.traverse((e=>{e.isMesh&&(e.material=e.material.clone())})),e}delete(){let e=this.parent;void 0!==e&&void 0!==e.nid&&e.removeChild(this)}removeChild(e){if(void 0!==e)return e.nid,void 0!==e.nid&&(this._nodes[e.nid]=void 0),e.parent=void 0,e.traverse((e=>{e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()})),this.remove(e),this}removeChildren(){for(let e=this.children.length-1;e>=0;e--)this.removeChild(this.children[e]);return this}attachTo(e){let t="string"==typeof e?this._nodes[e]:e;return t&&(t.add(this),void 0!==t.userData.cMat&&(this.userData.cMat=t.userData.cMat),void 0!==t.bPickable&&(this.bPickable=t.bPickable)),t}attachToRoot(){return this._rootG.add(this),void 0!==this._rootG.userData.cMat&&(this.userData.cMat=this._rootG.userData.cMat),void 0!==this._rootG.bPickable&&(this.bPickable=this._rootG.bPickable),this._rootG}getBound(){return this.dirtyBound(),this._bs}dirtyBound(){return(new THREE.Box3).setFromObject(this).getBoundingSphere(this._bs),this}autoFit(e,t){if(this.dirtyBound(),e&&(this.position.copy(this._bs.center),this.position.multiplyScalar(-1)),t&&t>0&&this._bs.radius>0){let e=t/this._bs.radius;this.scale.set(e,e,e)}}setPosition(e,t,o){return e instanceof THREE.Vector3?this.position.copy(e):this.position.set(e,t,o),this}setScale(e,t,o){return e instanceof THREE.Vector3?this.scale.copy(e):(void 0===t&&(t=e,o=e),this.scale.set(e,t,o)),this}setRotation(e,t,o){return e instanceof THREE.Vector3?this.rotation.copy(e):this.rotation.set(e,t,o),this}orientToCamera(){return this.quaternion.copy(ATON.Nav._qOri),this}orientToLocation(e,t,o){return e instanceof THREE.Vector3?this.lookAt(e):this.lookAt(e,t,o),this}orientToNode(e){return e?(this.orientToLocation(e.position),this):this}setYup(){return this.rotation.set(-1.57079632679,0,0),this}addTransform(e){let t;return"string"==typeof e&&(t=ATON.Utils.parseTransformString(e)),void 0===t||(void 0===this._tlist&&(this._tlist=[]),this._tlist.push(t)),this}load(e,t){if(void 0===e)return this;let o=this;if(e=ATON.Utils.resolveCollectionURL(e),ATON.Utils.tryLoadFromService(e,o))return t&&t(),o;if("json"===ATON.Utils.getFileExtension(e))return ATON.MRes.loadTileSetFromURL(e,o),t&&t(),o;if(ATON._resHandler)for(let t in ATON._resHandler)if(ATON._resHandler[t](e,o))return o;if(o._bCloneOnLoadHit&&void 0!==ATON._assetsManager[e])return ATON._assetsManager[e].then((e=>{let i=e.clone();if(ATON.Utils.modelVisitor(o,i),void 0!==o._tlist)for(let e in o._tlist)o._tlist[e].add(i.clone()),o.add(o._tlist[e]);else o.add(i);t&&t()})),o;ATON._assetReqNew(e);let i=new Promise(((i,r)=>{ATON._aLoader.load(e,(r=>{let a=r.scene||r.scene[0];if(ATON.Utils.modelVisitor(o,a),void 0!==o._tlist)for(let e in o._tlist)o._tlist[e].add(a.clone()),o.add(o._tlist[e]);else o.add(a);ATON.Utils.registerAniMixers(o,r),ATON.CC.extract(r),i(a),console.log("%cModel loaded","color:green"),ATON._assetReqComplete(e),o.type===ATON.NTYPES.SCENE&&(ATON._bqScene=!0),o.type===ATON.NTYPES.SEM&&(ATON._bqSem=!0),o.bPickable&&o.enablePicking(),o.dirtyBound(),t&&t()}),void 0,(o=>{console.log("%cError loading model "+e,"color:red"),ATON._assetReqComplete(e),t&&t()}))}));return o._bCloneOnLoadHit&&(ATON._assetsManager[e]=i),this}exportAs(e){return ATON.Utils.exportNode(this,e),this}setOnHover(e){return this.onHover=e,this}setOnLeave(e){return this.onLeave=e,this}setOnSelect(e){return this.onSelect=e,this}loadCesiumIONAsset(e){return ATON.MRes.loadCesiumIONAsset(e,this),this}loadSketchfabAsset(e){let t=ATON.getAPIToken("sketchfab"),o=this;return null==t&&(console.log("A valid Sketchfab token is required"),t=prompt("Please enter a valid Sketchfab token:"),null==t||""==t)||fetch("https://api.sketchfab.com/v3/models/"+e+"/download",{method:"GET",headers:{Authorization:"Token "+t},mode:"cors"}).then((function(e){return e.json()})).then((function(e){if(ATON.setAPIToken("sketchfab",t),e.glb){let t=e.glb.url;return o.load(t),o}})),this}}const t=e;let o={init:()=>{o.evLocal={},o.evNetwork={},ATON.on=o.on,ATON.fire=o.fire,ATON.fireEvent=o.fire,ATON.clearEventHandlers=o.clearEventHandlers},clearEventHandlers:e=>{o.evLocal[e]=[],o.evNetwork[e]=[]},executeHandlers:(e,t)=>{if(e)for(let o=0;o{if(void 0!==t){const i=o.evLocal;void 0===i[e]&&(i[e]=[]),i[e].push(t)}void 0!==i&&ATON.Photon.on(e,i)},fire:(e,t,i)=>{const r=o.evLocal[e];o.executeHandlers(r,t),i&&ATON.Photon.fire(e,t)}};const i=o;let r={init:()=>{r.materials={},r.colors={},r._loader=new THREE.MaterialLoader,r._uSem={time:{type:"float",value:0},tint:{type:"vec4",value:new THREE.Vector4(.2,.2,1,.2)},sel:{type:"vec4",value:new THREE.Vector4(0,0,0,.1)}},r.addDefaults()},getDefVertexShader:()=>"\n varying vec3 vPositionW;\n varying vec3 vNormalW;\n varying vec3 vNormalV;\n varying vec2 vUv;\n\n void main(){\n vUv = uv;\n\n vPositionW = ( modelMatrix * vec4( position, 1.0 )).xyz;\n vNormalV = normalize( vec3( normalMatrix * normal ));\n vNormalW = ( modelMatrix * vec4(normal, 0.0 )).xyz;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n ",addDefaults:()=>{r.colors.white=new THREE.Color(1,1,1),r.colors.black=new THREE.Color(0,0,0),r.colors.green=new THREE.Color(0,1,0),r.colors.yellow=new THREE.Color(1,1,0),r.colors.red=new THREE.Color(1,0,0),r.colors.blue=new THREE.Color(0,0,1),r.colors.orange=new THREE.Color(1,.5,0),r.colors.defUI=new THREE.Color(.85,1,.95),r.colors.sem=new THREE.Color(0,1,.5),r.colors.darksem=new THREE.Color(0,0,.1),r.materials.fullyTransparent=new THREE.MeshBasicMaterial({transparent:!0,depthWrite:!1,opacity:0}),r.materials.defUI=new THREE.ShaderMaterial({uniforms:{tint:{type:"vec3",value:r.colors.defUI},opacity:{type:"float",value:0}},vertexShader:r.getDefVertexShader(),fragmentShader:"\n varying vec3 vPositionW;\n\t\t varying vec3 vNormalW;\n varying vec3 vNormalV;\n uniform vec3 tint;\n //uniform vec3 base;\n uniform float opacity;\n\n\t\t void main(){\n\t\t //vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\n\n float f;\n\t\t //f = dot(vNormalV, viewDirectionW);\n f = dot(vNormalV, vec3(0,0,1));\n\t\t f = clamp(1.0-f, 0.0, 1.0);\n f *= f;\n\n f = mix(opacity, 1.0 + opacity, f);\n f = clamp(f, 0.0,1.0);\n\n //vec3 col = mix(base,tint, f);\n\t\t //gl_FragColor = vec4(col, f * opacity);\n\n gl_FragColor = vec4(tint, f);\n\t\t }\n ",transparent:!0,depthWrite:!1}),r.materials.selector=r.materials.defUI.clone(),r.materials.outline=new THREE.MeshBasicMaterial({color:r.colors.black,side:THREE.BackSide,transparent:!0,depthWrite:!1,opacity:.2}),r.materials.controllerRay=r.materials.defUI.clone(),r.materials.controllerRay.uniforms.tint.value=r.colors.white,r.materials.xray=r.materials.defUI.clone(),r.materials.xray.uniforms.tint.value=r.colors.white,r.materials.xray.uniforms.opacity.value=.5,r.materials.teleportLoc=new THREE.MeshBasicMaterial({transparent:!0,opacity:1,depthWrite:!1,side:THREE.DoubleSide}),ATON.Utils.textureLoader.load(ATON.PATH_RES+"grad.png",(e=>{r.materials.teleportLoc.map=e})),r.materials.measurement=new THREE.MeshBasicMaterial({color:r.colors.white,transparent:!0,depthWrite:!1,opacity:.5,depthTest:!1}),r.materials.semanticShape=new THREE.ShaderMaterial({uniforms:r._uSem,vertexShader:r.getDefVertexShader(),fragmentShader:"\n varying vec3 vPositionW;\n\t\t varying vec3 vNormalW;\n varying vec3 vNormalV;\n\n uniform float time;\n uniform vec4 tint;\n\n\t\t void main(){\n\t\t //vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\n\n //float ff = dot(vNormalV, vec3(0,0,1));\n\t\t //ff = clamp(1.0-ff, 0.0, 1.0);\n\n float f = (1.0 * cos(time*2.0)); // - 0.5;\n //f = cos(time + (vPositionW.y*10.0));\n f = clamp(f, 0.0,1.0);\n\n\t\t gl_FragColor = vec4(tint.rgb, tint.a * f);\n //gl_FragColor = vec4(tint.rgb, ff);\n\t\t }\n ",transparent:!0,depthWrite:!1}),r.materials.semanticShapeHL=new THREE.MeshBasicMaterial({color:r.colors.sem,transparent:!0,depthWrite:!1,opacity:.2}),r.materials.semanticShapeEdit=new THREE.MeshBasicMaterial({color:r.colors.orange,transparent:!0,depthWrite:!1,opacity:.5}),r.materials.transWhite=new THREE.MeshBasicMaterial({color:r.colors.white,transparent:!0,depthWrite:!1,side:THREE.DoubleSide,opacity:.2}),r.materials.transBlack=new THREE.MeshBasicMaterial({color:r.colors.black,transparent:!0,depthWrite:!1,side:THREE.DoubleSide,opacity:.2}),r.materials.wireframe=new THREE.MeshBasicMaterial({color:r.colors.black,transparent:!0,depthWrite:!1,opacity:.1,wireframe:!0}),r.materials.normSlope=new THREE.ShaderMaterial({vertexShader:r.getDefVertexShader(),fragmentShader:"\n varying vec3 vPositionW;\n\t\t varying vec3 vNormalW;\n\n\t\t void main(){\n vec4 A = vec4(0,1,0, 1.0);\n vec4 B = vec4(1,0,0, 1.0);\n\n float f;\n f = dot(vNormalW, vec3(0,1,0));\n\n\t\t gl_FragColor = mix(B,A, f);\n\t\t }\n "}),r.materials.gradient=new THREE.ShaderMaterial({uniforms:{range:{type:"vec2",value:new THREE.Vector2(-4,5)}},vertexShader:r.getDefVertexShader(),fragmentShader:"\n varying vec3 vPositionW;\n\n uniform vec2 range;\n\n\t\t void main(){\n vec4 A = vec4(0,0,0, 1.0);\n vec4 B = vec4(0,0.5,1, 1.0);\n\n float t = (vPositionW.y - range.x)/(range.y - range.x);\n t = clamp(t, 0.0,1.0);\n\n\t\t gl_FragColor = mix(A,B, t);\n\t\t }\n "}),r.materials.lp=new THREE.ShaderMaterial({vertexShader:r.getDefVertexShader(),fragmentShader:"\n varying vec3 vPositionW;\n\t\t varying vec3 vNormalW;\n varying vec3 vNormalV;\n\n\t\t void main(){\n\t\t vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\n\n float f;\n\t\t //f = dot(viewDirectionW, vNormalW);\n f = dot(vNormalV, vec3(0,0,1));\n\t\t f = clamp(1.0 - f, 0.0, 1.0);\n\n\t\t gl_FragColor = vec4(1.0,1.0,1.0, f);\n\t\t }\n ",transparent:!0,depthWrite:!1});let e=(new THREE.TextureLoader).load(ATON.PATH_RES+"point-mask.png");e.generateMipmaps=!1,r.materials.point=new THREE.PointsMaterial({vertexColors:!0,alphaMap:e,alphaTest:.5,depthTest:!0,transparent:!1,size:4,sizeAttenuation:!1}),r.materials.chromakey=new THREE.ShaderMaterial({uniforms:{tBase:{type:"t"},keycolor:{type:"vec4",value:new THREE.Vector4(0,1,0,0)},similarity:{type:"float",value:.4},smoothness:{type:"float",value:.08},spill:{type:"float",value:.1}},vertexShader:r.getDefVertexShader(),fragmentShader:"\n uniform sampler2D tBase;\n uniform vec4 keycolor;\n\n uniform float similarity;\n uniform float smoothness;\n uniform float spill;\n\n varying vec2 vUv;\n\n // From https://github.com/libretro/glsl-shaders/blob/master/nnedi3/shaders/rgb-to-yuv.glsl\n vec2 RGBtoUV(vec3 rgb){\n return vec2(\n rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5,\n rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5\n );\n }\n\n // From https://godotshaders.com/shader/green-screen-chromakey/\n\t\t void main(){\n\t\t vec4 frag = texture2D(tBase, vUv);\n vec4 orig = frag;\n\n float chromaDist = distance(RGBtoUV(frag.rgb), RGBtoUV(keycolor.rgb));\n\n float baseMask = chromaDist - similarity;\n float fullMask = pow(clamp(baseMask / smoothness, 0.0,1.0), 1.5);\n frag.a = fullMask;\n \n float spillVal = pow(clamp(baseMask / spill, 0.0,1.0), 1.5);\n float desat = clamp(frag.r * 0.2126 + frag.g * 0.7152 + frag.b * 0.0722, 0.0,1.0);\n frag.rgb = mix(vec3(desat, desat, desat), frag.rgb, spillVal);\n\n frag = mix(orig,frag, keycolor.w);\n\n\t\t gl_FragColor = frag;\n\t\t }\n ",transparent:!0,side:THREE.DoubleSide})},addMaterial:(e,t)=>{r.materials[e]?console.log("MatHub: material "+e+" already registered"):r.materials[e]=t},loadMaterial:(e,t)=>{r._loader.load(t,(t=>{r.addMaterial(e,t)}),void 0,(e=>{console.log(e)}))},getMaterial:e=>r.materials[e],update:()=>{r._uSem.time.value+=ATON._dt,r._uSem.sel.value.x=ATON.SUI.mainSelector.position.x,r._uSem.sel.value.y=ATON.SUI.mainSelector.position.y,r._uSem.sel.value.z=ATON.SUI.mainSelector.position.z,r._uSem.sel.value.w=ATON.SUI._selectorRad}};const a=r;let n={TSTRING_SEPARATOR:" ",VOID_CAST:(e,t)=>{},init:()=>{ATON.device={},n.geomUnitSphere=new THREE.SphereGeometry(1,32,32),n.geomUnitCube=new THREE.BoxGeometry,n.exporterGLTF=void 0,n.exporterOBJ=void 0,n.exporterUSDZ=void 0,n._dlink=document.createElement("a"),n._dlink.style.display="none",document.body.appendChild(n._dlink),n.textureLoader=new THREE.TextureLoader,n._bvhBounds=0,n.stats={},n.stats.numVertices=0,n.stats.numTris=0},generateID:e=>(void 0===e&&(e="id"),e+"-"+Math.random().toString(36).substr(2,9)),goToURL:e=>{window.location.href=e},goToScene:(e,t)=>{if(void 0===e)return;if(e.length<2)return;let o=ATON.PATH_FE+e;void 0!==t&&(o+="&vrc="+t),window.location.href=o},isConnectionSecure:()=>window.isSecureContext,isLocalhost:()=>!!window.location.origin.includes("localhost")||!!window.location.origin.includes("127.0.0.1"),showBVHbounds:e=>{e>0&&(n._bvhBounds=e)},_addBVHbounds:(e,t)=>{if(void 0===e)return;let o=new ThreeMeshBVH.MeshBVHHelper(e,t);o.displayParents=!0,o.update(),e.parent.add(o)},profileDevice:()=>{ATON.device.isMobile=!1,ATON.device.isMobile=!(!/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent)&&!/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))),ATON.device.xrSupported={},ATON.device.xrSupported["immersive-vr"]=!1,ATON.device.xrSupported["immersive-ar"]=!1,"xr"in navigator&&(navigator.xr.isSessionSupported("immersive-vr").then((e=>{ATON.device.xrSupported["immersive-vr"]=!!e,console.log("WebXR VR session support: "+ATON.device.xrSupported["immersive-vr"]),ATON.fire("XR_support",{type:"immersive-vr",v:ATON.device.xrSupported["immersive-vr"]})})),navigator.xr.isSessionSupported("immersive-ar").then((e=>{ATON.device.xrSupported["immersive-ar"]=!!e,console.log("WebXR AR session support: "+ATON.device.xrSupported["immersive-ar"]),ATON.fire("XR_support",{type:"immersive-ar",v:ATON.device.xrSupported["immersive-ar"]})})))},profileRenderingCapabilities:()=>{if(void 0===ATON._renderer)return;let e=ATON._renderer.capabilities;void 0!==e&&(ATON.device.lowGPU=!1,e.isWebGL2||(ATON.device.lowGPU=!0),e.maxTextureSize<8192&&(ATON.device.lowGPU=!0),e.maxCubemapSize<4096&&(ATON.device.lowGPU=!0),console.log(e))},isMobile:()=>ATON.device.isMobile,isVRsupported:()=>ATON.device.xrSupported["immersive-vr"],isARsupported:()=>ATON.device.xrSupported["immersive-ar"],getFileExtension:e=>e.substr(e.lastIndexOf(".")+1).toLowerCase(),removeFileExtension:e=>e.replace(/\.[^/.]+$/,""),isVideo:e=>{let t=n.getFileExtension(e);return"mp4"===t||"webm"===t||"m3u8"===t},isImage:e=>{let t=n.getFileExtension(e);return"jpg"===t||"png"===t||"ktx"===t||"ktx2"===t},getBaseFolder:e=>{var t=e.lastIndexOf("/");return-1!==t?e.substring(0,t+1):""},getFilename:e=>e.split(/(\\|\/)/g).pop(),isResourceURL:e=>!!e.startsWith("http://")||!!e.startsWith("https://"),URLify:e=>{if("string"!=typeof e)return e;const t=e.match(/(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)/g);return t&&t.forEach((function(t){e=e.replace(t,"")})),e},resolveCollectionURL:e=>e?(ATON._collMod&&(e=ATON._collMod(e)),e.startsWith("http")?e:ATON.PATH_COLLECTION+e):"",tryLoadFromService:(e,t)=>{if(!t)return!1;if(e.startsWith("https://cesium.com/ion/assets/")||e.startsWith("https://ion.cesium.com/assets/")){let o=e.split("/"),i=o[o.length-1];return t.loadCesiumIONAsset(i),!0}if(e.startsWith("https://assets.cesium.com/")){let o=e.split("/"),i=o[o.length-2];return t.loadCesiumIONAsset(i),!0}if(e.startsWith("https://sketchfab.com/3d-models/")){let o=e.split("-"),i=o[o.length-1];return t.loadSketchfabAsset(i),!0}for(let o in ATON._resMappers){let i=ATON._resMappers[o](e);if(void 0!==i)return t.load(i),!0}return!1},postJSON:(e,t,o,i)=>{$.ajax({url:e,type:"POST",xhrFields:{withCredentials:!0},data:JSON.stringify(t),contentType:"application/json; charset=utf-8",dataType:"json",success:e=>{o&&o(e)}}).fail((e=>{console.log(e),i&&i()}))},getJSON:(e,t)=>{fetch(e,{method:"GET",headers:{Accept:"application/json"}}).then((e=>e.json())).then((e=>{console.log(e),t&&t(e)}))},runAsync:e=>{const t=new Worker(URL.createObjectURL(new Blob([`postMessage((${e})());`]),{type:"application/javascript; charset=utf-8"}));return new Promise(((e,o)=>{t.onmessage=({data:o})=>{e(o),t.terminate()},t.onerror=e=>{o(e),t.terminate()}}))},mergeObject:e=>{e.updateMatrixWorld(!0);const t=[];e.traverse((e=>{if(e.isMesh){const o=e.geometry;o.applyMatrix4(e.matrixWorld),t.push(o.toNonIndexed())}}));const o=THREE.BufferGeometryUtils.mergeGeometries(t,!1),i=THREE.BufferGeometryUtils.mergeVertices(o).center(),r=new THREE.Group,a=new THREE.Mesh(i);return r.add(a),r},setPicking:(e,t,o)=>{void 0===o&&(o=!0),e.traverse((e=>{o?e.layers.enable(t):e.layers.disable(t)}))},graphPostVisitor:e=>{e.visible?console.log(e):n.setPicking(e,e.type,!1)},rotationBetweenDirections:(e,t)=>{const o=new THREE.Quaternion,i=(new THREE.Vector3).crossVectors(e,t);return o.x=i.x,o.y=i.y,o.z=i.z,o.w=1+e.clone().dot(t),o.normalize(),o},clampValue:(e,t,o)=>Math.min(Math.max(e,t),o),loadTexture:(e,t)=>{e.endsWith(".ktx2")?ATON._ktx2Loader.load(e,t):n.textureLoader.load(e,t)},modelVisitor:(e,t)=>{if(void 0===t)return;if(void 0===e)return;let o=e.type;t.traverse((t=>{t.isMesh&&(o===ATON.NTYPES.SCENE&&(t.castShadow=!0,t.receiveShadow=!0,t.geometry&&(t.geometry.computeBoundsTree(),console.log("Computed visible BVH"),n._bvhBounds>0&&n._addBVHbounds(t,n._bvhBounds)),n.processMaterial(t.material)),o===ATON.NTYPES.SEM&&(t.material=ATON.MatHub.materials.semanticShape,t.geometry&&(t.geometry.computeBoundsTree(),console.log("Computed semantic BVH"))),e.userData.cMat&&(t.material=e.userData.cMat))}))},processMaterial:e=>{void 0!==e&&null!==e.map&&void 0!==e.map&&(e.map.generateMipmaps=!0,e.map.anisotropy=ATON.device.isMobile?0:ATON._maxAnisotropy,e.map.minFilter=THREE.LinearMipmapLinearFilter,e.map.magFilter=THREE.LinearFilter,e.map.colorSpace=ATON._stdEncoding)},_visitorCP:e=>{ATON._renderer.localClippingEnabled&&(e||(e=ATON._rootVisible),e.traverse((e=>{e.material&&(e.material.clippingPlanes=ATON._clipPlanes,e.material.clipIntersection=!1,e.material.clipShadows=!0)})))},cleanupVisitor:e=>{e.traverse((e=>{if(e.material)if(e.material.length)for(let t=0;t{let o=t.scene||t.scene[0],i=!1;if(void 0===t.animations)return;let r=new THREE.AnimationMixer(o);t.animations.forEach((e=>{r.clipAction(e).play(),i=!0})),i&&(ATON._aniMixers.push(r),void 0===e._aniMixers&&(e._aniMixers=[]),e._aniMixers.push(r))},parseTransformString:e=>{let t=new THREE.Group,o=e.split(n.TSTRING_SEPARATOR),i=o.length;return i<3||(t.position.set(parseFloat(o[0]),parseFloat(o[1]),parseFloat(o[2])),i<6||(t.rotation.set(parseFloat(o[3]),parseFloat(o[4]),parseFloat(o[5])),i<9||t.scale.set(parseFloat(o[6]),parseFloat(o[7]),parseFloat(o[8])))),t},setVectorPrecision:(e,t)=>(e.x=parseFloat(e.x.toPrecision(t)),e.y=parseFloat(e.y.toPrecision(t)),e.z=parseFloat(e.z.toPrecision(t)),e),parseMD:e=>(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=e.replace(/^\s*\n\*/gm,"
      \n*")).replace(/^(\*.+)\s*\n([^\*])/gm,"$1\n
    \n\n$2")).replace(/^\*(.+)/gm,"
  • $1
  • ")).replace(/^\s*\n\d\./gm,"
      \n1.")).replace(/^(\d\..+)\s*\n([^\d\.])/gm,"$1\n
    \n\n$2")).replace(/^\d\.(.+)/gm,"
  • $1
  • ")).replace(/^\>(.+)/gm,"
    $1
    ")).replace(/[\#]{6}(.+)/g,"
    $1
    ")).replace(/[\#]{5}(.+)/g,"
    $1
    ")).replace(/[\#]{4}(.+)/g,"

    $1

    ")).replace(/[\#]{3}(.+)/g,"

    $1

    ")).replace(/[\#]{2}(.+)/g,"

    $1

    ")).replace(/[\#]{1}(.+)/g,"

    $1

    ")).replace(/^(.+)\n\=+/gm,"

    $1

    ")).replace(/^(.+)\n\-+/gm,"

    $1

    ")).replace(/\!\[([^\]]+)\]\(([^\)]+)\)/g,'$1')).replace(/[\[]{1}([^\]]+)[\]]{1}[\(]{1}([^\)\"]+)(\"(.+)\")?[\)]{1}/g,'$1')).replace(/[\*\_]{2}([^\*\_]+)[\*\_]{2}/g,"$1")).replace(/[\*\_]{1}([^\*\_]+)[\*\_]{1}/g,"$1")).replace(/[\~]{2}([^\~]+)[\~]{2}/g,"$1")).replace(/^\s*\n\`\`\`(([^\s]+))?/gm,'
    ')).replace(/^\`\`\`\s*\n/gm,"
    \n\n")).replace(/[\`]{1}([^\`]+)[\`]{1}/g,"$1")).replace(/^\s*(\n)?(.+)/gm,(function(e){return/\<(\/)?(h\d|ul|ol|li|blockquote|pre|img)/.test(e)?e:"

    "+e+"

    "}))).replace(/(\)\s*\n\(.+)\<\/p\>/gm,"$1$2"),checkAuth:e=>{$.ajax({type:"GET",url:ATON.PATH_RESTAPI+"user",xhrFields:{withCredentials:!0},dataType:"json",success:t=>{e(t)}})},getHumanReadableDistance:e=>{let t=" m";return e<.01?(t=" mm",t=(e*=1e3).toPrecision(3)+t,t):e<1?(t=" cm",t=(e*=100).toPrecision(3)+t,t):e>1e3?(t=" km",t=e.toPrecision(3)+t,t):(t=e.toPrecision(3)+t,t)},stripHTMLtagsFromString:e=>e.replace(/(<([^>]+)>)/gi,""),requestFullscreen:()=>{let e=document.documentElement;return e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen(),!0},downloadBlob:(e,t)=>{void 0!==t&&(n._dlink.href=URL.createObjectURL(e),n._dlink.download=t,n._dlink.click())},downloadText:(e,t)=>{n.downloadBlob(new Blob([e],{type:"text/plain"}),t)},downloadJSONobj:(e,t)=>{n.downloadText(JSON.stringify(e),t)},downloadArrayBuffer:(e,t)=>{n.downloadBlob(new Blob([e],{type:"application/octet-stream"}),t)},downloadImageFromCanvas:(e,t)=>{if(!e)return;let o=e.toDataURL();ATON.Utils._dlink.href=o,ATON.Utils._dlink.download=t,ATON.Utils._dlink.click()},exportNode:(e,t)=>{let o=n.getFileExtension(t);if(!(o.length<1)){if("glb"===o||"gltf"===o){let i={binary:"glb"===o};void 0===n.exporterGLTF&&(n.exporterGLTF=new THREE.GLTFExporter),n.exporterGLTF.parse(e,(e=>{e instanceof ArrayBuffer?n.downloadArrayBuffer(e,t):(console.log(e),n.downloadJSONobj(e,t))}),i)}if("obj"===o){void 0===n.exporterOBJ&&(n.exporterOBJ=new THREE.OBJExporter);let o=n.exporterOBJ.parse(e);n.downloadText(o,t)}"usdz"===o&&(void 0===n.exporterUSDZ&&(n.exporterUSDZ=new THREE.USDZExporter),$("#idLoader").show(),n.exporterUSDZ.parse(e).then((e=>{n.downloadArrayBuffer(e,t),$("#idLoader").hide()})))}},takeScreenshot:(e,t)=>{let o=new Image;console.log("Screenshot with size:"+e),ATON.Nav._camera.aspect=1,ATON.Nav._camera.updateProjectionMatrix(),ATON._renderer.setSize(e,e),ATON._renderer.render(ATON._mainRoot,ATON.Nav._camera);let i=ATON._renderer.domElement;if(ATON.FX.composer){if(ATON.FX.composer.setSize(e,e),ATON.FX.passes[ATON.FX.PASS_AA]){let t=ATON.FX.passes[ATON.FX.PASS_AA].material.uniforms;t&&t.resolution.value.set(1/e,1/e)}ATON.FX.composer.render(),i=ATON.FX.composer.renderer.domElement}let r=ATON._renderer.domElement.toDataURL();return o.src=r,t&&(n._dlink.href=r.replace("image/png","image/octet-stream"),n._dlink.download=t,n._dlink.click()),ATON._onResize(),o},assignLightProbeToMesh:(e,t)=>{void 0!==e&&void 0!==t&&(t.noLP||(t.userData.LP=e))},clearLightProbeFromMesh:e=>{void 0!==e&&(e.noLP||(e.userData.LP=null))},vibrate:e=>{void 0===e&&(e=100),window.navigator.vibrate(e)},createATONCube:e=>{let t=new THREE.BoxGeometry(1,1,1),o=new THREE.MeshStandardMaterial;n.textureLoader.load(ATON.PATH_RES+"models/aton-cube.jpg",(e=>{e.colorSpace=ATON._stdEncoding,o.map=e}));let i=ATON.createSceneNode(e);return i.add(new THREE.Mesh(t)),i.setMaterial(o),i.enablePicking(),i},createATONCubePBR:e=>{let t=new THREE.BoxGeometry(1,1,1),o=new THREE.MeshStandardMaterial;o.metalness=1,n.textureLoader.load(ATON.PATH_RES+"models/aton-cube.jpg",(e=>{e.colorSpace=ATON._stdEncoding,o.map=e})),n.textureLoader.load(ATON.PATH_RES+"models/aton-cube-pbr.jpg",(e=>{e.colorSpace=ATON._stdEncoding,o.metalnessMap=e,o.roughnessMap=e})),n.textureLoader.load(ATON.PATH_RES+"models/aton-cube-nrm.png",(e=>{e.colorSpace=ATON._stdEncoding,o.normalMap=e}));let i=ATON.createSceneNode(e);return i.add(new THREE.Mesh(t)),i.setMaterial(o),i.enablePicking(),i},createGround:(e,t,o)=>{void 0===t&&(t=1),void 0===o&&(o=1);let i=new THREE.PlaneGeometry(t,o),r=new THREE.MeshStandardMaterial;void 0!==e&&n.textureLoader.load(e,(e=>{e.colorSpace=ATON._stdEncoding,r.map=e}));let a=ATON.createSceneNode().rotateX(.5*-Math.PI);return a.add(new THREE.Mesh(i,r)),a.enablePicking(),a},convertByteArrayToHexString:e=>e.reduce(((e,t)=>e+t.toString(16).padStart(2,"0")),""),convertHexStringToByteArray:e=>Uint8Array.from(e.match(/.{1,2}/g).map((e=>parseInt(e,16))))};const s=n;let l={MODE_ADD:0,MODE_DEL:1,FLOAT_PREC:5,init:()=>{l.currID=void 0,l.currData=void 0,l._bEdit=!1,l._bLoading=!1,l._title=void 0,l._descr=void 0,l.initBaseParsers()},setEditMode:e=>{l._bEdit=e,console.log("Edit mode:"+e)},load:(e,t,o)=>(l._bLoading=!0,console.log("Loading Scene: "+t),$.getJSON(e,(e=>{l.currData=e,l.currID=t,l._bLoading=!1,l.parseScene(e),o&&o(),ATON.fire("SceneJSONLoaded",t)}))),clearScene:()=>{if(!(ATON._rootVisible.children.length<=0)){ATON._rootVisible.removeChildren();for(let e in ATON.snodes)e!==ATON.ROOT_NID&&delete ATON.snodes[e];ATON.MRes.clear(),ATON.XPFNetwork.clear()}},clearSemantics:()=>{if(!(ATON._rootSem.children.length<=0)){ATON._rootSem.removeChildren();for(let e in ATON.semnodes)e!==ATON.ROOT_NID&&delete ATON.semnodes[e];ATON.SUI.gSemIcons&&ATON.SUI.gSemIcons.removeChildren(),ATON.SemFactory.stopCurrentConvex(),ATON.SemFactory.init()}},clear:()=>{l.clearScene(),l.clearSemantics(),ATON.Nav.clear()},parseScene:e=>{if(void 0!==(e=void 0===e?l.currData:e))for(let t in e)l._jsonParsers[t]&&l._jsonParsers[t](e[t])},getJSONchildren:(e,t)=>{let o;void 0===t&&(t=ATON.NTYPES.SCENE);let i=[];if(t===ATON.NTYPES.SEM&&(o=ATON.getSemanticNode(e)),t===ATON.NTYPES.SCENE&&(o=ATON.getSceneNode(e)),void 0!==o){for(let e in o.children){let t=o.children[e];void 0!==t.nid&&i.push(t.nid)}return i}},getJSONgraphEdges:e=>{void 0===e&&(e=ATON.NTYPES.SCENE);let t=ATON.snodes;e===ATON.NTYPES.SEM&&(t=ATON.semnodes),e===ATON.NTYPES.UI&&(t=ATON.uinodes);let o={};for(let e in t){let i=t[e];i&&i.parent&&i.parent.nid&&(void 0===o[i.parent.nid]&&(o[i.parent.nid]=[]),o[i.parent.nid].push(i.nid))}return o},getJSONsemanticSpheresList:e=>{let t=ATON.getSemanticNode(e);if(void 0===t)return;let o=[];for(let e in t.children){let i=t.children[e];i.type&&o.push([parseFloat(i.position.x.toPrecision(l.FLOAT_PREC)),parseFloat(i.position.y.toPrecision(l.FLOAT_PREC)),parseFloat(i.position.z.toPrecision(l.FLOAT_PREC)),parseFloat(i.scale.x.toPrecision(l.FLOAT_PREC))])}return o},getJSONsemanticConvexShapes:e=>{let t=ATON.getSemanticNode(e);if(void 0===t)return;let o=[];for(let e in t.children){let i=t.children[e];i.userData._convexPoints&&o.push(i.userData._convexPoints)}return o},_applyJSONTransformToNode:(e,t)=>{if(void 0!==e&&void 0!==t){if(e.bUseGeoCoords)return t.bUseGeoCoords=!0,void(e.scale&&t.setScale(e.scale[0],e.scale[1],e.scale[2]));e.autocenter?t.autocenter=!0:e.position&&t.setPosition(e.position[0],e.position[1],e.position[2]),e.rotation&&t.setRotation(e.rotation[0],e.rotation[1],e.rotation[2]),e.scale&&t.setScale(e.scale[0],e.scale[1],e.scale[2]),e.list&&Array.isArray(e.list)}},initBaseParsers:()=>{l._jsonParsers={},l._jsonParsers.title=e=>{void 0!==e&&l.setTitle(e)},l._jsonParsers.description=e=>{void 0!==e&&l.setDescription(e)},l._jsonParsers.fx=e=>{e.ao&&(ATON.FX.togglePass(ATON.FX.PASS_AO,!0),e.ao.i&&ATON.FX.setAOintensity(parseFloat(e.ao.i))),e.bloom&&(ATON.FX.togglePass(ATON.FX.PASS_BLOOM,!0),e.bloom.i&&ATON.FX.setBloomStrength(parseFloat(e.bloom.i)),e.bloom.t&&ATON.FX.setBloomThreshold(parseFloat(e.bloom.t))),e.dof&&(ATON.FX.togglePass(ATON.FX.PASS_DOF,!0),e.dof.f&&ATON.FX.setDOFfocus(parseFloat(e.dof.f)))},l._jsonParsers.environment=e=>{let t=e.mainpano;if(e.mainpano&&(t.url&&ATON.setMainPanorama(t.url),t.rotation&&ATON.setMainPanoramaRotation(t.rotation)),e.bgcolor){let t=new THREE.Color(e.bgcolor[0],e.bgcolor[1],e.bgcolor[2]);ATON.setBackgroundColor(t)}let o=e.mainlight;o?(o.direction&&ATON.setMainLightDirection(new THREE.Vector3(o.direction[0],o.direction[1],o.direction[2])),ATON._dMainL?(o.color&&(ATON._dMainL.color=new THREE.Color(o.color[0],o.color[1],o.color[2])),o.intensity&&(ATON._dMainL.intensity=o.intensity),void 0!==o.shadows?ATON.toggleShadows(o.shadows):ATON.toggleShadows(!1)):ATON.toggleMainLight(!1)):ATON.toggleMainLight(!1);let i=e.lightprobes;if(i&&(void 0!==i.auto&&ATON.setAutoLP(i.auto),i.list))for(let e in i.list){let t=i.list[e],o=new ATON.LightProbe(t.res);t.pos&&o.setPosition(parseFloat(t.pos[0]),parseFloat(t.pos[1]),parseFloat(t.pos[2])),t.near&&o.setNear(parseFloat(t.near)),t.far&&o.setFar(parseFloat(t.far)),ATON.addLightProbe(o),console.log(o)}e.exposure&&ATON.setExposure(e.exposure)},l._jsonParsers.soundscape=e=>{void 0!==e&&e.global&&ATON.setGlobalAudio(e.global.url,e.global.loop)},l._jsonParsers.navmode=e=>{void 0!==e&&ATON.Nav.setNavMode(e)},l._jsonParsers.locomotionGraph=e=>{if(void 0!==e){for(let t in e){let o=e[t];o.pos&&ATON.Nav.addLocomotionNode(parseFloat(o.pos[0]),parseFloat(o.pos[1]),parseFloat(o.pos[2]),!0)}ATON.Nav.setFirstPersonControl(),ATON.Nav.toggleLocomotionValidator(!1)}},l._jsonParsers.measurements=e=>{if(void 0!==e)for(let t in e){let o=e[t];if(o.points&&6===o.points.length){let e=new THREE.Vector3(parseFloat(o.points[0]),parseFloat(o.points[1]),parseFloat(o.points[2])),t=new THREE.Vector3(parseFloat(o.points[3]),parseFloat(o.points[4]),parseFloat(o.points[5]));ATON.SUI.addMeasurementPoint(e),ATON.SUI.addMeasurementPoint(t)}}},l._jsonParsers.viewpoints=e=>{if(void 0!==e)for(let t in e){let o=e[t];"home"===t?ATON.Nav.setHomePOV((new ATON.POV).setPosition(o.position[0],o.position[1],o.position[2]).setTarget(o.target[0],o.target[1],o.target[2]).setFOV(o.fov)):new ATON.POV(t).setPosition(o.position[0],o.position[1],o.position[2]).setTarget(o.target[0],o.target[1],o.target[2]).setFOV(o.fov)}},l._jsonParsers.scenegraph=e=>{if(void 0===e)return;let t=e.nodes,o=e.edges;for(let e in t){let o=t[e],i=ATON.getOrCreateSceneNode(e).removeChildren();l._applyJSONTransformToNode(o.transform,i);let r=o.urls;if(r&&(Array.isArray(r)?r.forEach((e=>{i.load(e)})):i.load(r)),o["cesium.ion"]){let e=o["cesium.ion"];ATON.MRes.loadCesiumIONAsset(e,i)}if(o.stream){let t,r=o.stream;if(r.src.startsWith("#")){let e=parseInt(r.src.substring(1));t=ATON.MediaFlow.getOrCreateVideoStream(e,void 0,!0)}else{let o=ATON.Utils.resolveCollectionURL(r.src);t=ATON.MediaFlow.getOrCreateVideoStream(e,o)}if(r.chromakey){let e=r.chromakey.color;e&&t.matStream.uniforms.keycolor.value.set(parseFloat(e[0]),parseFloat(e[1]),parseFloat(e[2]),parseFloat(e[3])),r.chromakey.smoothness&&(t.matStream.uniforms.smoothness.value=parseFloat(r.chromakey.smoothness)),r.chromakey.spill&&(t.matStream.uniforms.spill.value=parseFloat(r.chromakey.spill)),r.chromakey.similarity&&(t.matStream.uniforms.similarity.value=parseFloat(r.chromakey.similarity))}if(!o.urls){let e=new THREE.PlaneGeometry(1,1),o=new THREE.Mesh(e);o.scale.x=1,o.scale.y=-1,t.el.addEventListener("loadedmetadata",(e=>{let i=t.el.videoWidth/t.el.videoHeight;o.scale.x=i,o.scale.y=-1})),ATON.Utils.modelVisitor(i,o),i.add(o),ATON._bqScene=!0,i.setPickable(!0),i.dirtyBound()}i.setMaterial(t.matStream)}o.shadowcast&&i.setShadowCast(o.shadowcast),o.shadowreceive&&i.setShadowCast(o.shadowreceive),o.toYup&&i.setYup(),o.keywords&&(i.kwords=o.keywords)}for(let e in o){let t=o[e],i=ATON.getSceneNode(e);if(void 0!==i)for(let e in t){let o=t[e],r=ATON.getSceneNode(o);void 0!==r&&r.attachTo(i)}}for(let e in t){let o=t[e],i=ATON.getSceneNode(e);if(void 0!==i&&(void 0!==o.show&&(o.show?(i.show(),console.log("show "+e)):(i.hide(),console.log("hide "+e))),o.material)){let e;"string"==typeof o.material?e=ATON.MatHub.materials[o.material]:o.material.fragmentShader||o.material.vertexShader?(o.material.vertexShader||(o.material.vertexShader=ATON.MatHub.getDefVertexShader()),e=new THREE.ShaderMaterial(o.material)):e=new THREE.MeshStandardMaterial(o.material),e&&i.setMaterial(e)}}},l._jsonParsers.semanticgraph=e=>{if(void 0===e)return;let t=e.nodes,o=e.edges;for(let e in t){let o=t[e],i=ATON.getOrCreateSemanticNode(e).removeChildren(),r=o.urls;r&&(Array.isArray(r)?r.forEach((e=>{i.load(e)})):i.load(r)),o.toYup&&i.setYup(),o.description&&i.setDescription(o.description),o.audio&&i.setAudio(o.audio),o.keywords&&(i.kwords=o.keywords);let a=o.spheres;if(Array.isArray(a))for(let t in a){let o=a[t],i=new THREE.Vector3(parseFloat(o[0]),parseFloat(o[1]),parseFloat(o[2]));ATON.SemFactory.createSphere(e,i,parseFloat(o[3]))}let n=o.convexshapes;if(Array.isArray(n))for(let t in n){let o=n[t],i=[];for(let e=0;e{if(ATON.Nav.setFirstPersonControl(),e.list){let t=e.list,o=t.length;for(let e=0;e{ATON.XPFNetwork.setHomeXPF(0),ATON.XPFNetwork.requestTransitionByIndex(0,0)}))}},addSceneParser:(e,t)=>{l._jsonParsers[e]=t},patch:(e,t,o)=>{if(l._bLoading||!l._bEdit)return;if(void 0===e)return;void 0===t&&(t=l.MODE_ADD);let i=l.currID,r={};r.data=e,r.mode=t===l.MODE_DEL?"DEL":"ADD";let a=JSON.stringify(r);e=null,r=null,$.ajax({url:ATON.PATH_RESTAPI2+"scenes/"+i,type:"PATCH",data:a,contentType:"application/json; charset=utf-8",dataType:"json",success:e=>{e&&(l.currData=e),o&&o()}})}};l.sendEdit=l.patch,l.setVisibility=(e,t)=>{l.currData.visibility=e,l.sendEdit({visibility:e},ATON.SceneHub.MODE_ADD,t)},l.currSceneHasHomeConfig=()=>void 0!==l.currData&&void 0!==l.currData.viewpoints&&void 0!==l.currData.viewpoints.home,l.setTitle=e=>{l._title=e},l.getTitle=()=>l._title,l.setDescription=e=>{l._descr=e},l.getDescription=()=>l._descr;const d=l;let c={init:()=>{c._listener=new THREE.AudioListener,c._loader=new THREE.AudioLoader,c._bGenAuPlaying=!1},playOnceGlobally:(e,t)=>{if(t&&c._bGenAuPlaying)return;e=ATON.Utils.resolveCollectionURL(e);let o=new THREE.Audio(ATON.AudioHub._listener);return c._loader.load(e,(e=>{o.setBuffer(e),o.play(),t&&(c._bGenAuPlaying=!0)})),t&&(o.onEnded=()=>{c._bGenAuPlaying=!1}),o}};const u=c;class p extends THREE.EventDispatcher{constructor(e){super(),!1===window.isSecureContext&&console.error("DeviceOrientationEvent is only available in secure contexts (https)"),this._zee=new THREE.Vector3(0,0,1),this._euler=new THREE.Euler,this._q0=new THREE.Quaternion,this._q1=new THREE.Quaternion(-Math.sqrt(.5),0,0,Math.sqrt(.5)),this._changeEvent={type:"change"};const t=this,o=new THREE.Quaternion;this.object=e,this.object.rotation.reorder("YXZ"),this.enabled=!0,this.deviceOrientation={},this.screenOrientation=0,this.alphaOffset=0;const i=function(e){t.deviceOrientation=e},r=function(){t.screenOrientation=window.orientation||0};this.connect=function(){r(),void 0!==window.DeviceOrientationEvent&&"function"==typeof window.DeviceOrientationEvent.requestPermission?window.DeviceOrientationEvent.requestPermission().then((function(e){"granted"==e&&(window.addEventListener("orientationchange",r),window.addEventListener("deviceorientation",i))})).catch((function(e){console.error("Unable to use DeviceOrientation API:",e)})):(window.addEventListener("orientationchange",r),window.addEventListener("deviceorientation",i)),t.enabled=!0},this.disconnect=function(){window.removeEventListener("orientationchange",r),window.removeEventListener("deviceorientation",i),t.enabled=!1},this.update=function(){if(!1===t.enabled)return;const e=t.deviceOrientation;if(e){const i=e.alpha?THREE.MathUtils.degToRad(e.alpha)+t.alphaOffset:0,r=e.beta?THREE.MathUtils.degToRad(e.beta):0,a=e.gamma?THREE.MathUtils.degToRad(e.gamma):0,n=t.screenOrientation?THREE.MathUtils.degToRad(t.screenOrientation):0;!function(e,o,i,r,a){t._euler.set(i,o,-r,"YXZ"),e.setFromEuler(t._euler),e.multiply(t._q1),e.multiply(t._q0.setFromAxisAngle(t._zee,-a))}(t.object.quaternion,i,r,a,n),8*(1-o.dot(t.object.quaternion))>1e-6&&(o.copy(t.object.quaternion),t.dispatchEvent(t._changeEvent))}},this.dispose=function(){t.disconnect()},this.connect()}}const _=p;let m={STD_FOV:50,STD_NEAR:.01,STD_FAR:800,FP_EPS:.01,STD_POV_TRANS_DURATION:2,STD_LOCNODE_SIZE:.5,MIN_LOC_VALID_DIST:1.5,MODE_ORBIT:0,MODE_FP:1,MODE_DEVORI:2,LocomotionNode:class{constructor(e){this.pos=new THREE.Vector3(0,0,0),this.id=e,this._iXPF=void 0,this._sui=void 0}setLocation(e,t,o){return e instanceof THREE.Vector3?this.pos.copy(e):this.pos.set(e,t,o),this._sui&&this._sui.position.copy(this.pos),this}getLocation(){return this.pos}realizeSUI(e){return void 0===ATON.SUI.gLocNodes||(this._sui=new THREE.Sprite(ATON.SUI.getOrCreateSpriteWalk()),this._sui.position.copy(this.pos),this._sui.scale.set(ATON.Nav.STD_LOCNODE_SIZE,ATON.Nav.STD_LOCNODE_SIZE,ATON.Nav.STD_LOCNODE_SIZE),ATON.SUI.gLocNodes.add(this._sui)),this}toggleSUI(e){return void 0===this._sui||(this._sui.visible=e),this}},init:()=>{m._mode=void 0,m.POVtransitionDuration=m.STD_POV_TRANS_DURATION,m._rotSpeedOrbit=.4,m._rotSpeedFP=-.2,m._inertia=.08,m._bControl=!0,m._bLocValidator=!0,m._bInteracting=!1,m._prevMode=void 0,m.setOrbitControl(),m._currPOV=(new ATON.POV).setPosition(0,0,0).setTarget(1,0,0).setFOV(ATON.Nav.STD_FOV),m._fromPOV=new ATON.POV,m._reqPOV=new ATON.POV,m.homePOV=void 0,m._tPOVcall=-1,m._tPOVprogress=0,m.povlist={},m._vDir=new THREE.Vector3(1,0,0),m._qOri=new THREE.Quaternion,m._lastPos=new THREE.Vector3(0,0,0),m._lastOri=new THREE.Quaternion,m._dOri=0,m._dPos=0,m._motionAmt=0,m._motionDir=new THREE.Vector3(0,1,0),m._bValidLocomotion=!1,m._locNodes=[],m._prevLN=void 0},getCurrentEyeLocation:()=>m._currPOV.pos,getCurrentDirection:()=>m._vDir,copyCurrentPOV:()=>{let e=new ATON.POV;return e.pos.copy(m._currPOV.pos),e.target.copy(m._currPOV.target),e.fov=m._currPOV.fov,e},addPOV:(e,t)=>{if(void 0!==e)return e.as(t),e},clearPOVs:()=>{for(let e in ATON.Nav.povlist)delete m.povlist[e]},isTransitioning:()=>m._tPOVcall>=0,currentQueryValidForLocomotion:()=>m._bValidLocomotion,locomotionValidator:()=>{if(void 0===ATON._queryDataScene)return void(m._bValidLocomotion=!1);let e=ATON._queryDataScene,t=(e.p,e.n);e.d<=m.MIN_LOC_VALID_DIST?m._bValidLocomotion=!1:t?t.y<=.7?m._bValidLocomotion=!1:m._bValidLocomotion=!0:m._bValidLocomotion=!1},toggleLocomotionValidator:e=>{e?m._bLocValidator=!0:(m._bLocValidator=!1,m._bValidLocomotion=!1)},addLocomotionNode:(e,t,o,i)=>{let r=(new m.LocomotionNode).setLocation(e,t,o);return i&&r.realizeSUI(),m._locNodes.push(r),ATON.fire("LocomotionNodeAdded",r),r},getLocomotionNodeByIndex:e=>m._locNodes[e],clearLocomotionNodes:()=>{m._locNodes=[],m._prevLN=void 0,ATON.SUI.gLocNodes&&ATON.SUI.gLocNodes.removeChildren()},getLocomotionNodeInSight:()=>{let e=m._locNodes.length;if(e<=0)return;if(m.isTransitioning())return;let t,o,i=m._currPOV.pos,r=m._vDir;void 0===m._dirLNode&&(m._dirLNode=new THREE.Vector3);for(let a=0;a.8){let e=i.distanceToSquared(m._posLNode);e>.3&&(void 0===o||e{if(void 0===e)return;if(m._mode===m.MODE_ORBIT)return;let o=ATON.Nav._vDir,i=(new ATON.POV).setPosition(e.pos).setTarget(e.pos.x+o.x,e.pos.y+o.y,e.pos.z+o.z).setFOV(m._currPOV.fov);e.toggleSUI(!1),void 0!==m._prevLN&&m._prevLN.toggleSUI(!0),m.requestPOV(i,t),m._prevLN=e,ATON.fire("LocomotionNodeRequested",e)},requestTransitionToLocomotionNodeInSightIfAny:e=>{let t=ATON.XPFNetwork.getNextXPFindex();if(void 0!==t)return m.requestTransitionToLocomotionNode(ATON.XPFNetwork._list[t]._lnode,e),!0;let o=ATON.Nav.getLocomotionNodeInSight();if(void 0===o)return!1;let i=m._locNodes[o];return m.requestTransitionToLocomotionNode(i,e),!0},requestDeltaRotation:(e,t,o)=>{if(ATON.XR._bPresenting)return;let i=new THREE.Vector3,r=new THREE.Vector3;i.crossVectors(m._vDir,THREE.Object3D.DEFAULT_UP),r.x=m._currPOV.target.x+i.x*e,r.y=m._currPOV.target.y+t,r.z=m._currPOV.target.z+i.z*e;let a=new ATON.POV;a.setTarget(r),a.setPosition(ATON.Nav._currPOV.pos),ATON.Nav.requestPOV(a,o)},setUserControl:e=>{void 0!==e&&e!==m._bControl&&(m._bControl=e,void 0!==m._controls&&(m._controls.enabled=e),m._cOrbit&&(m._cOrbit.enabled=e),m._cFirstPerson&&(m._cFirstPerson.enabled=e),console.log("Nav controls: "+m._bControl))},toggleUserControl:()=>{m.setUserControl(!m._bControl)},isUserControlEnabled:()=>m._bControl,isOrbit:()=>!ATON.XR._bPresenting&&m._mode===m.MODE_ORBIT,isFirstPerson:()=>!ATON.XR._bPresenting&&m._mode===m.MODE_FP,isDevOri:()=>!ATON.XR._bPresenting&&m._mode===m.MODE_DEVORI,setNavMode:e=>{void 0!==e&&(e===m.MODE_ORBIT&&m.setOrbitControl(),e===m.MODE_FP&&m.setFirstPersonControl(),e===m.MODE_DEVORI&&m.setDeviceOrientationControl())},restorePreviousNavMode:()=>{void 0===m._prevMode&&m.setOrbitControl(),m.setNavMode(m._prevMode)},_updCamera:e=>{if(void 0===e&&(e=m._camera),ATON.FX.composer){let t=ATON.FX.composer.passes;if(t)for(let o=0;o{if(!ATON.XR.isPresenting()){if(m._prevMode=m._mode,m._mode=m.MODE_ORBIT,m._bInteracting=!1,ATON.fire("NavInteraction",!1),void 0===m._cOrbit){m._camOrbit=new THREE.PerspectiveCamera(m.STD_FOV,window.innerWidth/window.innerHeight,m.STD_NEAR,m.STD_FAR),m._camOrbit.layers.enableAll(),m._cOrbit=new THREE.OrbitControls(m._camOrbit,ATON._renderer.domElement);let e=m._cOrbit;e.rotateSpeed=m._rotSpeedOrbit,e.enablePan=!0,m._inertia>0&&(e.enableDamping=!0,e.dampingFactor=m._inertia),e.screenSpacePanning=!0,e.enableZoom=!0,e.minDistance=.03,e.maxDistance=300,m._bControl||(e.enabled=!1),e.addEventListener("start",(()=>{m._bInteracting=!0,ATON.fire("NavInteraction",!0)})),e.addEventListener("end",(()=>{m._bInteracting=!1,ATON.fire("NavInteraction",!1)}))}m._controls=m._cOrbit,m._camera=m._camOrbit,ATON.AudioHub._listener&&m._camera.children.length<1&&m._camera.add(ATON.AudioHub._listener),m._updCamera(),m._controls.update(),m._currPOV&&m.syncCurrCamera(),ATON._onResize(),ATON.toggleCenteredQuery(!1),ATON.fire("NavMode",m._mode)}},setFirstPersonControl:()=>{if(!ATON.XR.isPresenting()){if(m._prevMode=m._mode,ATON.SUI.getSelectorRadius()>.1&&ATON.SUI.setSelectorRadius(.1),m._mode=m.MODE_FP,m._bInteracting=!1,ATON.fire("NavInteraction",!1),void 0===m._cFirstPerson){m._camFP=new THREE.PerspectiveCamera(m.STD_FOV,window.innerWidth/window.innerHeight,m.STD_NEAR,m.STD_FAR),m._camFP.layers.enableAll(),m._cFirstPerson=new THREE.OrbitControls(m._camFP,ATON._renderer.domElement);let e=m._cFirstPerson;e.enableZoom=!1,e.enablePan=!1,e.rotateSpeed=m._rotSpeedFP,m._inertia>0&&(e.enableDamping=!0,e.dampingFactor=m._inertia),e.target.copy(m._camera.position),e.minDistance=.01,e.maxDistance=.01,m._bControl||(e.enabled=!1)}m._controls=m._cFirstPerson,m._camera=m._camFP,ATON.AudioHub._listener&&m._camera.children.length<1&&m._camera.add(ATON.AudioHub._listener),m._updCamera(),m._controls.update(),m._currPOV&&m.syncCurrCamera(),ATON._onResize(),ATON.toggleCenteredQuery(!1),ATON.fire("NavMode",m._mode)}},setDeviceOrientationControl:()=>{ATON.Utils.isMobile()&&(m._prevMode=m._mode,m._mode=m.MODE_DEVORI,m._bInteracting=!1,ATON.fire("NavInteraction",!1),ATON._screenPointerCoords.set(0,0),void 0===m._cDevOri&&(m._camDevOri=new THREE.PerspectiveCamera(m.STD_FOV,window.innerWidth/window.innerHeight,m.STD_NEAR,m.STD_FAR),m._camDevOri.layers.enableAll(),m._cDevOri=new _(m._camDevOri,ATON._renderer.domElement),m._cDevOri.alphaOffset=0),m._controls=m._cDevOri,m._camera=m._camDevOri,ATON.AudioHub._listener&&m._camera.children.length<1&&m._camera.add(ATON.AudioHub._listener),m._updCamera(),m._controls.update(),m._currPOV&&m.syncCurrCamera(),ATON._onResize(),ATON.toggleCenteredQuery(!0),ATON.fire("NavMode",m._mode))},useAbsoluteOrientation:e=>{m._cDevOri},setMotionAmount:e=>{m._motionAmt=e},setMotionDirection:e=>{m._motionDir.copy(e)},stop:()=>{m._motionAmt=0},setFOV:e=>{if(ATON.XR.isPresenting())return;m._currPOV.fov=e;let t=m._camera;t.fov=e,t.updateProjectionMatrix()},getFOV:()=>m._currPOV.fov,_deltaMotions:()=>{m._dOri=m._lastOri.angleTo(ATON.Nav._qOri),m._dPos=m._lastPos.distanceToSquared(m._currPOV.pos),m._lastPos.copy(m._currPOV.pos),m._lastOri.copy(ATON.Nav._qOri)},syncCurrPOV:()=>{if(ATON.XR.isPresenting()){const e=ATON._renderer.xr.getCamera().cameras[0];return m._currPOV.pos.copy(e.position),m._qOri.copy(e.quaternion),e.getWorldDirection(m._vDir),m._currPOV.pos.x+=ATON.XR.rig.position.x,m._currPOV.pos.y+=ATON.XR.rig.position.y,m._currPOV.pos.z+=ATON.XR.rig.position.z,void m._deltaMotions()}const e=m._controls,t=m._camera;if(t.getWorldDirection(m._vDir),t.getWorldQuaternion(m._qOri),m._deltaMotions(),m._mode!==m.MODE_DEVORI){if(m._mode===m.MODE_FP)return m._currPOV.pos.copy(e.target),m._currPOV.target.x=m._currPOV.pos.x+m._vDir.x,m._currPOV.target.y=m._currPOV.pos.y+m._vDir.y,void(m._currPOV.target.z=m._currPOV.pos.z+m._vDir.z);m._currPOV.pos.copy(t.position),m._currPOV.target.copy(e.target)}else m._currPOV.pos.copy(t.position)},applyPOVconstraints:e=>{},handlePOV:()=>{ATON.XR.isPresenting()?m.handleXRtransition():m.handlePOVtransition(),m.handleMotion(),m.applyPOVconstraints(m._currPOV)},handleMotion:()=>{if(m.isTransitioning())return;if(0==m._motionAmt)return;ATON.XR.controller0&&ATON.XR.controller0.visible?(ATON.XR.controller0.getWorldDirection(m._motionDir),m._motionDir.negate()):m._motionDir.copy(m._vDir);let e=m._motionAmt*ATON._dt,t=m._motionDir.x*e,o=m._motionDir.y*e,i=m._motionDir.z*e;m._currPOV.pos.x+=t,m._currPOV.pos.y+=o,m._currPOV.pos.z+=i,m._currPOV.target.x+=t,m._currPOV.target.y+=o,m._currPOV.target.z+=i},handlePOVtransition:()=>{if(!(m._tPOVcall<0)){if(m.POVtransitionDuration<=0?m._tPOVprogress=1:m._tPOVprogress=(ATON._clock.elapsedTime-m._tPOVcall)/m.POVtransitionDuration,m._tPOVprogress>=1)return m._tPOVcall=-1,m._currPOV.pos.copy(m._reqPOV.pos),m._currPOV.target.copy(m._reqPOV.target),m._currPOV.fov=m._reqPOV.fov,void ATON.fire("POVTransitionCompleted",m._reqPOV.id);var e;m._tPOVprogress=(e=m._tPOVprogress,(1-Math.cos(e*Math.PI))/2),m._currPOV.pos.lerpVectors(m._fromPOV.pos,m._reqPOV.pos,m._tPOVprogress),m._currPOV.target.lerpVectors(m._fromPOV.target,m._reqPOV.target,m._tPOVprogress),m._fromPOV.fov&&m._reqPOV.fov&&(m._currPOV.fov=THREE.MathUtils.lerp(m._fromPOV.fov,m._reqPOV.fov,m._tPOVprogress),m._camera.fov=m._currPOV.fov,m._camera.updateProjectionMatrix())}},handleXRtransition:()=>{if(!(m._tPOVcall<0)){if(m.POVtransitionDuration<=0?m._tPOVprogress=1:m._tPOVprogress=(ATON._clock.elapsedTime-m._tPOVcall)/m.POVtransitionDuration,m._tPOVprogress>=1)return m._tPOVcall=-1,ATON.XR._currPos.copy(ATON.XR._reqPos),void ATON.fire("POVTransitionCompleted",m._reqPOV.id);ATON.XR._currPos.lerpVectors(ATON.XR._fromPos,ATON.XR._reqPos,m._tPOVprogress)}},syncCurrCamera:()=>{if(ATON.XR.isPresenting())return;let e=m._controls,t=m._camera,o=m._currPOV.pos,i=m._currPOV.target;m._mode!==m.MODE_DEVORI?(m._vDir.subVectors(i,o),m._vDir.normalize(),m._mode===m.MODE_FP?(e.target.copy(o),t.position.x=e.target.x-m._vDir.x*m.FP_EPS,t.position.y=e.target.y-m._vDir.y*m.FP_EPS,t.position.z=e.target.z-m._vDir.z*m.FP_EPS):(t.position.copy(o),e.target.copy(i))):t.position.copy(o)},update:()=>{m.syncCurrPOV(),m.handlePOV(),m.syncCurrCamera()},requestPOV:(e,t,o)=>{ATON._tPOVcall>=0||void 0!==e&&(ATON.XR._bPresenting&&"immersive-ar"===ATON.XR._sessionType||(m.POVtransitionDuration=void 0!==t?t:m.STD_POV_TRANS_DURATION,ATON.XR.isPresenting()?(m._reqPOV.pos.copy(e.pos?e.pos:m._currPOV.pos),m._fromPOV.pos.copy(m._currPOV.pos),ATON.XR._reqPos.copy(e.pos?e.pos:m._currPOV.pos),ATON.XR._fromPos.copy(ATON.XR._currPos)):(m._reqPOV.pos.copy(e.pos?e.pos:m._currPOV.pos),m._reqPOV.target.copy(e.target?e.target:m._currPOV.target),m._reqPOV.fov=e.fov?e.fov:m._currPOV.fov,m._fromPOV.pos.copy(m._currPOV.pos),m._fromPOV.target.copy(m._currPOV.target),m._fromPOV.fov=m._currPOV.fov),o&&(e.pos&&(m._reqPOV.pos.x*=ATON._worldScale,m._reqPOV.pos.y*=ATON._worldScale,m._reqPOV.pos.z*=ATON._worldScale,ATON.XR.isPresenting()&&(ATON.XR._reqPos.x*=ATON._worldScale,ATON.XR._reqPos.y*=ATON._worldScale,ATON.XR._reqPos.z*=ATON._worldScale)),e.target&&(m._reqPOV.target.x*=ATON._worldScale,m._reqPOV.target.y*=ATON._worldScale,m._reqPOV.target.z*=ATON._worldScale)),m._tPOVcall=ATON._clock.elapsedTime,ATON.fire("POVTransitionRequested",e.id)))},requestPOVbyBound:(e,t)=>{if(void 0===e)return;let o=new THREE.Vector3,i=3*e.radius;o.x=e.center.x-i*m._vDir.x,o.y=e.center.y-i*m._vDir.y,o.z=e.center.z-i*m._vDir.z;let r=(new ATON.POV).setPosition(o).setTarget(e.center);m.requestPOV(r,t)},requestPOVbyNode:(e,t)=>{if(void 0===e)return;let o=e.getBound();m.requestPOVbyBound(o,t)},requestPOVbyID:(e,t)=>{if(void 0===e)return;let o=m.povlist[e];void 0!==o&&m.requestPOV(o,t)},requestRetarget:(e,t,o)=>{let i=new THREE.Vector3;if(void 0===t)i.lerpVectors(e,m._currPOV.pos,.8);else{let o=e.distanceTo(m._currPOV.pos);o*=.5,i.x=e.x+t.x*o,i.y=e.y+t.y*o,i.z=e.z+t.z*o}let r=e.distanceTo(i);ATON.FX.setDOFfocus(r);let a=(new ATON.POV).setPosition(i).setTarget(e).setFOV(m._currPOV.fov);m.requestPOV(a,o),console.log(a)},computeDefaultHome:(e,t)=>{void 0===e&&(e=new THREE.Vector3(1,.7,1)),void 0===t&&(t=ATON.getRootScene().getBound());let o=new THREE.Vector3(t.center.x+t.radius*e.x*1.5,t.center.y+t.radius*e.y*1.5,t.center.z+t.radius*e.z*1.5);m.homePOV=(new ATON.POV).setPosition(o).setTarget(t.center)},setHomePOV:e=>{m.homePOV=e},computeAndRequestDefaultHome:(e,t,o)=>{m.computeDefaultHome(t,o),m.requestPOV(m.homePOV,e)},requestHomePOV:e=>{m.requestPOV(m.homePOV,e)}};m.requestHome=m.requestHomePOV,m.setAndRequestHomePOV=(e,t)=>{m.setHomePOV(e),m.requestPOV(e,t)},m.clear=()=>{m.clearPOVs(),m.clearLocomotionNodes()},m.DeviceOrientationControls=function(e){let t=this;this.object=e,this.object.rotation.reorder("YXZ"),this.enabled=!0,this.deviceOrientation={},this.screenOrientation=0,this.alphaOffset=0,this.absolute=!1,this.alphaOffsetDevice=void 0,this.alphaOffsetScreen=void 0;let o=function(e){t.absolute||(t.deviceOrientation=e)},i=function(e){t.deviceOrientation=e,t.absolute=!0},r=function(){t.screenOrientation=window.orientation||0},a=function(){let e=new THREE.Vector3(0,0,1),t=new THREE.Euler,o=new THREE.Quaternion,i=new THREE.Quaternion(-Math.sqrt(.5),0,0,Math.sqrt(.5));return function(r,a,n,s,l){t.set(n,a,-s,"YXZ"),r.setFromEuler(t),r.multiply(i),r.multiply(o.setFromAxisAngle(e,-l))}}();this.connect=function(){r(),window.addEventListener("orientationchange",r,!1),window.addEventListener("deviceorientation",o,!1),window.addEventListener("deviceorientationabsolute",i,!1),t.enabled=!0},this.disconnect=function(){window.removeEventListener("orientationchange",r,!1),window.removeEventListener("deviceorientation",o,!1),window.removeEventListener("deviceorientationabsolute",i,!1),t.enabled=!1},this.update=function(){if(!1===t.enabled)return;let e;if(e=t.deviceOrientation,e){let o=this.getDirection()?THREE.Math.degToRad(this.getDirection())+t.alphaOffset:0,i=e.beta?THREE.Math.degToRad(e.beta):0,r=e.gamma?THREE.Math.degToRad(e.gamma):0,n=t.screenOrientation?THREE.Math.degToRad(t.screenOrientation):0;a(t.object.quaternion,o,i,r,n)}},this.dispose=()=>{t.disconnect()},this.iOSOrientationPermission=()=>{"function"==typeof DeviceOrientationEvent.requestPermission&&DeviceOrientationEvent.requestPermission().then((e=>{console.log(e)})).catch(console.error)},this.getDirection=()=>void 0!==t.deviceOrientation.webkitCompassHeading?t.deviceOrientation.webkitCompassHeading:t.deviceOrientation.alpha,this.getDirectionMap=()=>void 0!==t.deviceOrientation.webkitCompassHeading?360-t.deviceOrientation.webkitCompassHeading:t.deviceOrientation.alpha,this.connect()};const h=m;let T={STD_TELEP_DURATION:.03,HAND_R:0,HAND_L:1,MOBILE_DENSITY_F:.5,MAX_QUERY_DISTANCE:40,init:()=>{ATON._renderer.xr.enabled=!0,ATON._renderer.xr.setReferenceSpaceType("local"),ATON.device.isMobile?ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd*T.MOBILE_DENSITY_F):ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd),T._bPresenting=!1,T.currSession=null,T._sessionType="immersive-vr",T._bReqPresenting=!1,T.rig=new THREE.Group,T.rig.add(ATON.Nav._camera),ATON._rootUI.add(T.rig),T._cam=void 0,T._currPos=T.rig.position,T._fromPos=new THREE.Vector3,T._reqPos=new THREE.Vector3,T.gControllers=void 0,T.controller0=void 0,T.controller1=void 0,T.controller0pos=new THREE.Vector3,T.controller1pos=new THREE.Vector3,T.controller0dir=new THREE.Vector3,T.controller1dir=new THREE.Vector3,T._lastPosR=void 0,T._lastPosL=void 0,T._pointerLineGeom=void 0,T._pointerLineMesh=void 0,T.gpad0=void 0,T.gpad1=void 0,T._urlHand=ATON.PATH_RES+"models/hand/hand.glb",ATON.on("XRselectStart",(e=>{e===T.HAND_R&&ATON._stdActivation()})),ATON.on("XRselectEnd",(e=>{})),ATON.on("XRsqueezeStart",(e=>{e===T.HAND_R&&ATON.Photon.setFocusStreaming(!0)})),ATON.on("XRsqueezeEnd",(e=>{e===T.HAND_R&&ATON.Photon.setFocusStreaming(!1)})),ATON.on("VRC_IDassigned",(e=>{let t=ATON.getUINode("Rhand"),o=ATON.getUINode("Lhand"),i=ATON.MatHub.materials.avatars,r=i[e%i.length];o&&o.setMaterial(r),t&&t.setMaterial(r)}))},setSessionType:e=>{void 0!==e&&("immersive-vr"!==e&&"immersive-ar"!==e||(T._sessionType=e,console.log("Session type: "+e)))},isPresenting:()=>T._bPresenting,teleportOnQueriedPoint:()=>{if(!ATON.Nav.currentQueryValidForLocomotion())return!1;const e=ATON._queryDataScene.p;return ATON.Nav.requestPOV((new ATON.POV).setPosition(e.x,e.y+ATON.userHeight,e.z),T.STD_TELEP_DURATION),!0},setupQueryRay:e=>{void 0!==e&&(T.controller0?e.set(T.controller0pos,T.controller0dir):e.set(ATON.Nav.getCurrentEyeLocation(),ATON.Nav.getCurrentDirection()))},setRefSpaceLocation:e=>{T.rig.position.copy(e)},_setupControllerR:(e,t)=>{T.controller0||(T.controller0=e,console.log("R controller"),e.addEventListener("selectstart",(()=>{ATON.fire("XRselectStart",T.HAND_R)})),e.addEventListener("selectend",(()=>{ATON.fire("XRselectEnd",T.HAND_R)})),e.addEventListener("squeezestart",(()=>{ATON.fire("XRsqueezeStart",T.HAND_R)})),e.addEventListener("squeezeend",(()=>{ATON.fire("XRsqueezeEnd",T.HAND_R)})),T.setupControllerUI(T.HAND_R,t),ATON.fire("XRcontrollerConnected",T.HAND_R))},_setupControllerL:(e,t)=>{T.controller1||(T.controller1=e,console.log("L controller"),e.addEventListener("selectstart",(()=>{ATON.fire("XRselectStart",T.HAND_L)})),e.addEventListener("selectend",(()=>{ATON.fire("XRselectEnd",T.HAND_L)})),e.addEventListener("squeezestart",(()=>{ATON.fire("XRsqueezeStart",T.HAND_L)})),e.addEventListener("squeezeend",(()=>{ATON.fire("XRsqueezeEnd",T.HAND_L)})),T.setupControllerUI(T.HAND_L,t),ATON.fire("XRcontrollerConnected",T.HAND_L))},setupSceneForAR:()=>{if("immersive-ar"!==T._sessionType)return;ATON.recomputeSceneBounds();let e=ATON.bounds.center;ATON._rootVisible.position.x=-e.x,ATON._rootVisible.position.y=-e.y,ATON._rootVisible.position.z=-e.z,ATON._rootSem.position.x=-e.x,ATON._rootSem.position.y=-e.y,ATON._rootSem.position.z=-e.z,ATON.recomputeSceneBounds()},resetSceneOffsets:()=>{ATON._rootVisible.position.set(0,0,0),ATON._rootSem.position.set(0,0,0),ATON.recomputeSceneBounds()},onSessionStarted:e=>{T.currSession||(T._bReqPresenting=!1,e.addEventListener("end",T.onSessionEnded),e.isImmersive=!0,console.log(T._sessionType+" session started."),ATON.MediaFlow.stopAllStreams(),"immersive-ar"===T._sessionType&&ATON._renderer.xr.setReferenceSpaceType("local"),ATON._renderer.xr.setSession(e).then((()=>{if(T.currSession=e,console.log(T.currSession),"immersive-ar"===T._sessionType)ATON._mainRoot.background=null,ATON._mMainPano&&(ATON._mMainPano.visible=!1),ATON._renderer.xr.getController(0)&&ATON.device.isMobile&&(T.controller0=ATON._renderer.xr.getController(0),T.controller0.addEventListener("selectstart",(()=>{ATON.fire("XRselectStart",T.HAND_R),console.log("Head-aligned select")})),T.controller0.addEventListener("selectend",(()=>{ATON.fire("XRselectEnd",T.HAND_R)})),T.gControllers.add(T.controller0));else{for(let e=0;e<2;e++){const t=ATON._renderer.xr.getController(e);void 0===t||t.userData.bXRconfig||(t.visible=!1,t.userData.bXRconfig=!0,t.addEventListener("connected",(e=>{let o=e.data.handedness;t.gm=e.data.gamepad,console.log("Hand "+o),console.log("GamePad "+t.gm),"left"===o?T._setupControllerL(t,!0):"right"===o?T._setupControllerR(t,!0):(t.addEventListener("selectstart",(()=>{ATON.fire("XRselectStart",T.HAND_R),console.log("Head-aligned select")})),t.addEventListener("selectend",(()=>{ATON.fire("XRselectEnd",T.HAND_R)})),ATON.fire("XRcontrollerConnected",T.HAND_R))})))}T.rig.add(ATON.Nav._camera),T.setRefSpaceLocation(ATON.Nav._currPOV.pos)}let t=ATON._renderer.xr.getCamera(ATON.Nav._camera);ATON.Nav._updCamera(t),T._bPresenting=!0,ATON.Nav._bInteracting=!1,console.log("XR now presenting"),ATON.fire("XRmode",!0),ATON.rewindAllPlayingMedia(),ATON.toggleShadows(!1),ATON.SUI.getSelectorRadius()>ATON.FE.STD_SEL_RAD&&ATON.SUI.setSelectorRadius(ATON.FE.STD_SEL_RAD),ATON._qSyncInt=2,ATON.XPFNetwork.getNumXPFs()>0?ATON.setQueryRange(0,100):ATON.setQueryRange(0,T.MAX_QUERY_DISTANCE),ATON.MRes.estimateTSErrorTarget(),setTimeout((()=>{ATON.SUI.getSelectorRadius()>ATON.FE.STD_SEL_RAD&&ATON.SUI.setSelectorRadius(ATON.FE.STD_SEL_RAD)}),2e3)})))},onSessionEnded:()=>{T.currSession.removeEventListener("end",T.onSessionEnded),T.currSession=null,T._bReqPresenting=!1,T._bPresenting=!1,ATON.Nav._bInteracting=!1,"immersive-ar"===T._sessionType&&ATON._mMainPano&&(ATON._mMainPano.visible=!0),T.setRefSpaceLocation(new THREE.Vector3(0,0,0)),ATON.fire("XRmode",!1),ATON._qSyncInt=1,ATON.MediaFlow.stopAllStreams(),ATON.Nav.requestHome(),ATON.Nav._updCamera(),ATON.setQueryRange(0,1/0),ATON.MRes.estimateTSErrorTarget(),console.log("Quit XR")},toggle:e=>{if(T.setSessionType(e),ATON.device.xrSupported[T._sessionType])if(null===T.currSession){let e={optionalFeatures:["high-refresh-rate"]};"immersive-ar"===T._sessionType&&(void 0===e.optionalFeatures&&(e.optionalFeatures=[]),e.optionalFeatures.push("light-estimation")),T._bReqPresenting=!0,navigator.xr.requestSession(T._sessionType,e).then(T.onSessionStarted)}else T.currSession.end()},setupControllerUI:(e,t)=>{let o,i;if(void 0===T.gControllers&&(T.gControllers=ATON.createUINode(),T.gControllers.disablePicking(),T.rig.add(T.gControllers)),e===T.HAND_L?(T.gControllers.add(T.controller1),t&&(i=ATON.createUINode("Lhand").load(T._urlHand).setMaterial(ATON.MatHub.materials.controllerRay).setScale(-1,1,1),T.controller1.add(i))):(T.gControllers.add(T.controller0),t&&(T._pointerLineGeom=new THREE.CylinderGeometry(.003,.003,1,4),T._pointerLineGeom.rotateX(-Math.PI/2),T._pointerLineGeom.translate(0,0,-.5),T._pointerLineMesh=new THREE.Mesh(T._pointerLineGeom,ATON.MatHub.materials.controllerRay),T.controller0.add(T._pointerLineMesh),T._pointerLineMesh.visible=!1,o=ATON.createUINode("Rhand").load(T._urlHand).setMaterial(ATON.MatHub.materials.controllerRay),T.controller0.add(o))),void 0!==ATON.Photon.uid&&t){let t=ATON.MatHub.materials.avatars,r=t[ATON.Photon.uid%t.length];e===T.HAND_L?i.setMaterial(r):o.setMaterial(r)}},switchHands:()=>{let e=T.controller1;T.controller1=T.controller0,T.controller0=e;for(let e in T.controller0.children)T.controller0.remove(T.controller0.children[e]);for(let e in T.controller1.children)T.controller1.remove(T.controller1.children[e]);T.gControllers.removeChildren(),T.setupControllerUI(T.HAND_L),T.setupControllerUI(T.HAND_R),console.log("VR controllers switched")},getControllerSpace:e=>{1===e?T.getControllerGrip(1):T.getControllerGrip(0)},getControllerWorldLocation:e=>1===e?T.controller1pos:T.controller0pos,getControllerWorldDirection:e=>1===e?T.controller1dir:T.controller0dir,getControllerWorldOrientation:e=>{let t=new THREE.Quaternion;return 1===e?T.controller1.getWorldQuaternion(t):T.controller0.getWorldQuaternion(t),t},_deltaMotionController:e=>{if(e===T.HAND_L&&void 0===T._lastPosL)return;if(e===T.HAND_R&&void 0===T._lastPosR)return;let t=e===T.HAND_L?T.controller1pos:T.controller0pos,o=e===T.HAND_L?T._lastPosL:T._lastPosR;THREE.Vector3(t.x-o.x,t.y-o.y,t.z-o.z).lengthSq(),e===T.HAND_L?T._lastPosL=t:T._lastPosR=t},update:()=>{T.controller0&&T.controller0.visible&&(T.controller0.getWorldPosition(T.controller0pos),T.controller0.getWorldDirection(T.controller0dir),T.controller0dir.negate()),T.controller1&&T.controller1.visible&&(T.controller1.getWorldPosition(T.controller1pos),T.controller1.getWorldDirection(T.controller1dir),T.controller1dir.negate())},getAxisValue:e=>{let t=new THREE.Vector2(0,0),o=e===T.HAND_L?T.controller1:T.controller0;if(void 0===o)return t;if(void 0===o.gm||void 0===o.gm.axes)return t;let i=o.gm.axes[0],r=o.gm.axes[2],a=o.gm.axes[1],n=o.gm.axes[3];return t.x=i>0?-i:r,t.y=a>0?a:-n,t}};const v=T,g=class extends t{constructor(e,t,o){super(e,ATON.NTYPES.UI),this.baseColor=ATON.MatHub.colors.black,this.baseOpacity=.5,this.container=new ThreeMeshUI.Block({width:t||.2,height:o||.05,padding:.001,borderRadius:.01,backgroundColor:this.baseColor,backgroundOpacity:this.baseOpacity,fontFamily:ATON.SUI.PATH_FONT_JSON,fontTexture:ATON.SUI.PATH_FONT_TEX,justifyContent:"center",textAlign:"center"}),this.container.position.z=.03,this.add(this.container),this.uiText=new ThreeMeshUI.Text({content:"Label",fontSize:.03,fontColor:ATON.MatHub.colors.white}),this.container.add(this.uiText),ThreeMeshUI.update()}setBaseColor(e){return this.baseColor=e,this.container.set({backgroundColor:this.baseColor}),ThreeMeshUI.update(),this}setTextColor(e){return this.uiText.set({fontColor:e}),ThreeMeshUI.update(),this}setBackgroundOpacity(e){return this.container.set({backgroundOpacity:e}),this.baseOpacity=e,ThreeMeshUI.update(),this}setText(e){return this.uiText.set({content:e}),ThreeMeshUI.update(),this}};let S={STD_BTN_SIZE:.1,STD_SELECTOR_TICKNESS:1.05};S.Button=class extends t{constructor(e,t=1,o=1){super(e,ATON.NTYPES.UI),this.baseColor=ATON.MatHub.colors.black,this.switchColor=ATON.MatHub.colors.green,this.baseOpacity=.5,this.hoverOpacity=.8,this._bSwitched=!1,this.container=new ThreeMeshUI.Block({width:.1*t,height:.1,padding:.01,borderRadius:.02,backgroundColor:this.baseColor,backgroundOpacity:this.baseOpacity,fontFamily:ATON.SUI.PATH_FONT_JSON,fontTexture:ATON.SUI.PATH_FONT_TEX,justifyContent:"center",textAlign:"center"}),this.add(this.container),this.uiText=new ThreeMeshUI.Text({content:"",fontSize:.02*o,fontColor:ATON.MatHub.colors.white}),this.container.add(this.uiText);let i=.9*ATON.SUI.STD_BTN_SIZE*t,r=.9*ATON.SUI.STD_BTN_SIZE;this._trigger=new THREE.Mesh(new THREE.PlaneGeometry(i,r,2),ATON.MatHub.materials.fullyTransparent),this._trigger.position.set(0,0,.002),this.add(this._trigger),this.onHover=()=>{this.container.set({backgroundOpacity:this.hoverOpacity})},this.onLeave=()=>{this.container.set({backgroundOpacity:this.baseOpacity})},this.enablePicking(),this.traverse((e=>{e.material&&(e.material.depthWrite=!1)})),ThreeMeshUI.update()}setBaseColor(e){return this.baseColor=e,this._bSwitched||this.container.set({backgroundColor:this.baseColor}),ThreeMeshUI.update(),this}setSwitchColor(e){return this.switchColor=e,this._bSwitched&&this.container.set({backgroundColor:this.switchColor}),ThreeMeshUI.update(),this}setBackgroundOpacity(e){return this.container.set({backgroundOpacity:e}),this.baseOpacity=e,ThreeMeshUI.update(),this}setText(e){return this.uiText.set({content:e}),ThreeMeshUI.update(),this}switch(e){return this._bSwitched=e,e?this.container.set({backgroundColor:this.switchColor}):this.container.set({backgroundColor:this.baseColor}),ThreeMeshUI.update(),this}setIcon(e,t){return ATON.Utils.textureLoader.load(e,(e=>{this._trigger.material=new THREE.MeshStandardMaterial({map:e,transparent:!0,depthWrite:!1}),t&&(this.setBackgroundOpacity(0),this.hoverOpacity=0),this.uiText.position.set(0,-.035,0)})),ThreeMeshUI.update(),this}},S.Label=g,S.MediaPanel=class extends t{constructor(e){super(e,ATON.NTYPES.UI),this._resurl=void 0,this._mediamesh=void 0,this._vs=void 0,this._yratio=1,this._titleYoffs=.6,this._color=ATON.MatHub.colors.black;let t=this;this.onSelect=()=>{t._vs&&t._vs.el}}load(e,t){this._yratio=1,this._mediamesh||(this._mediamesh=new THREE.Mesh(new THREE.PlaneGeometry(1,1)),this.add(this._mediamesh)),e=ATON.Utils.resolveCollectionURL(e);let o=this;return ATON.Utils.isVideo(e)?(this._vs=ATON.MediaFlow.getOrCreateVideoStream(this.nid,e,!1),this._mediamesh.material=this._vs.matStream,this._vs.el.addEventListener("loadedmetadata",(i=>{o._yratio=o._vs.el.videoHeight/o._vs.el.videoWidth,o._mediamesh.scale.y=-o._yratio,o._resurl=e,o._onContentLoad(),t&&t()}))):ATON.Utils.loadTexture(e,(i=>{i.image&&(this._yratio=i.image.height/i.image.width),o._mediamesh.scale.y=o._yratio,o._mediamesh.material=ATON.MatHub.materials.chromakey.clone(),o._mediamesh.material.uniforms.tBase.value=i,o._mediamesh.material.needsUpdate=!0,o._resurl=e,o._onContentLoad(),t&&t()})),this.setPickable(!0),this}setColor(e){return this._color=e,this._labelTitle&&this._labelTitle.setBaseColor(e),this._bd&&(this._bd.material.color=e),this}getMaterial(){return this._mediamesh.material}_onContentLoad(){this._labelTitle&&(this._labelTitle.position.y=this._yratio*this._titleYoffs),this._bd&&(this._bd.scale.y=1.05*this._yratio)}setTitle(e){return this._labelTitle||(this._labelTitle=new g(void 0,.5,.07),this._labelTitle.position.z=-.01,this._labelTitle.attachTo(this)),this._labelTitle.setText(e),this._labelTitle.setBaseColor(this._color),this}toggleTitle(e){return this._labelTitle?(this._labelTitle.toggle(e),this):this}setBackdrop(e){return this._bd=new THREE.Mesh(new THREE.PlaneGeometry(1,1)),this._bd.material=new THREE.MeshStandardMaterial({transparent:!0,side:THREE.DoubleSide,color:this._color,opacity:e||.5}),this._bd.scale.x=1.05,this._bd.scale.y=1.05*this._yratio,this._bd.position.z=-.005,this.add(this._bd),this}},S.init=()=>{S.initSelector(),S.fpTeleport=ATON.createUINode();let e=new THREE.CylinderGeometry(.4,.4,.9,32,1,!0),t=new THREE.Mesh(e,ATON.MatHub.getMaterial("teleportLoc"));t.renderOrder=100,S.fpTeleport.add(t),S.fpTeleport.disablePicking(),S.fpTeleport.visible=!1,ATON._rootUI.add(S.fpTeleport),S.PATH_FONT_JSON||(S.PATH_FONT_JSON=ATON.PATH_RES+"fonts/custom-msdf.json"),S.PATH_FONT_TEX||(S.PATH_FONT_TEX=ATON.PATH_RES+"fonts/custom.png"),S.gMeasures=ATON.createUINode(),S._prevMPoint=void 0,S._measLabels=[],ATON._rootUI.add(S.gMeasures);let o=(new THREE.BufferGeometry).setFromPoints([new THREE.Vector3,new THREE.Vector3]);S._measLine=new THREE.Line(o,ATON.MatHub.getMaterial("measurement")),S._measLine.visible=!1,ATON._rootUI.add(S._measLine),S.gPoints=ATON.createUINode(),ATON._rootUI.add(S.gPoints),S.gLocNodes=ATON.createUINode(),ATON._rootUI.add(S.gLocNodes),S.buildInfoNode(),S.bShowInfo=!0,S._labelScale=ATON.Utils.isMobile()?80:90,S._labelScaleVR=2,S.sprites={},S._sync=0},S.getOrCreateSpritePointEdit=()=>(S.sprites.pointEdit||(S.sprites.pointEdit=new THREE.SpriteMaterial({map:(new THREE.TextureLoader).load(ATON.PATH_RES+"sui-point.png"),color:ATON.MatHub.colors.orange,transparent:!0,opacity:1,depthTest:!1})),S.sprites.pointEdit),S.getOrCreateSpriteSemIcon=()=>(S.sprites.semIcon||(S.sprites.semIcon=new THREE.SpriteMaterial({map:(new THREE.TextureLoader).load(ATON.PATH_RES+"sui-sem.png"),transparent:!0,opacity:1,depthWrite:!1,depthTest:!1})),S.sprites.semIcon),S.getOrCreateSpriteLP=()=>(S.sprites.lp||(S.sprites.lp=new THREE.SpriteMaterial({map:(new THREE.TextureLoader).load(ATON.PATH_RES+"sui-lp.png"),transparent:!0,opacity:1,depthWrite:!1}),S.sprites.lp.sizeAttenuation=!1),S.sprites.lp),S.getOrCreateSpriteWalk=()=>(S.sprites.walk||(S.sprites.walk=new THREE.SpriteMaterial({map:(new THREE.TextureLoader).load(ATON.PATH_RES+"sui-walk.png"),transparent:!0,opacity:1,depthWrite:!1})),S.sprites.walk),S.initSelector=()=>{S.mainSelector=ATON.createUINode(),S._mSelectorSphere=new THREE.Mesh(ATON.Utils.geomUnitSphere,ATON.MatHub.getMaterial("selector")),S._mSelectorSphere.renderOrder=100,S.mainSelector.add(S._mSelectorSphere),S.mainSelector.disablePicking(),S.setSelectorRadius(.05),S.mainSelector.visible=!1,ATON._rootUI.add(S.mainSelector),S._selOffset=new THREE.Vector3,S._bShowSelector=!0},S.enableLPIcons=()=>{S.gLPIcons=ATON.createUINode(),S.gLPIcons.disablePicking(),ATON._rootUI.add(S.gLPIcons)},S.enableSemIcons=()=>{S.gSemIcons=ATON.createUINode(),S.gSemIcons.disablePicking(),ATON._rootUI.add(S.gSemIcons)},S.showSelector=e=>{S._bShowSelector=e},S.setSelectorRadius=e=>{S._selectorRad=e,S.mainSelector.scale.set(e,e,e)},S.setSelectorOffset=(e,t,o)=>{void 0!==e&&(S._selOffset.x=e),void 0!==t&&(S._selOffset.y=t),void 0!==o&&(S._selOffset.z=o);let i=ATON.getSceneQueriedPoint();void 0!==i&&(S.mainSelector.position.x=i.x+S._selOffset.x,S.mainSelector.position.y=i.y+S._selOffset.y,S.mainSelector.position.z=i.z+S._selOffset.z)},S.getSelectorRadius=()=>S._selectorRad,S.getSelectorLocation=()=>S.mainSelector.position,S.setSelectorModel=(e,t)=>{void 0!==e&&(S.mainSelector.removeChildren(),S.mainSelector.load(e).disablePicking(),t&&S.mainSelector.setMaterial(ATON.MatHub.getMaterial("selector")))},S.setSelectorColor=(e,t)=>{let o=ATON.MatHub.materials.selector;o.uniforms.tint.value=e,void 0!==t&&(o.uniforms.opacity.value=t)},S.addSemIcon=(e,t)=>{if(void 0===S.gSemIcons)return;let o=(new THREE.Box3).setFromObject(t),i=new THREE.Sphere;o.getBoundingSphere(i);let r=new THREE.Sprite(S.getOrCreateSpriteSemIcon());r.position.copy(i.center),r.scale.set(.8,.8,1),r.name=e,S.gSemIcons.add(r)},S.addLPIcon=e=>{if(void 0===S.gLPIcons)return;let t=e._near,o=new THREE.Sprite(S.getOrCreateSpriteLP());o.position.copy(e.pos),o.scale.set(.1,.1,.1);let i=new THREE.Mesh(ATON.Utils.geomUnitSphere,ATON.MatHub.materials.lp);i.scale.set(t,t,t),i.position.copy(e.pos),S.gLPIcons.add(o),S.gLPIcons.add(i)},S.setSemIconsOpacity=e=>{ATON.MatHub.spriteSemIcon.opacity=void 0===e?1:e},S.buildInfoNode=()=>{S.infoNode=ATON.createUINode(),S.infoNode.attachToRoot(),S.infoContainer=new ThreeMeshUI.Block({width:.2,height:.05,padding:.01,borderRadius:.02,backgroundColor:ATON.MatHub.colors.black,backgroundOpacity:.4,fontFamily:S.PATH_FONT_JSON,fontTexture:S.PATH_FONT_TEX,justifyContent:"center",textAlign:"center"}),S.infoContainer.position.y=.03,S.infoNode.add(S.infoContainer),S.infoNodeText=new ThreeMeshUI.Text({content:"Info",fontSize:.02,fontColor:ATON.MatHub.colors.white}),S.infoContainer.add(S.infoNodeText),ThreeMeshUI.update()},S.getInfoNode=()=>S.infoNode,S.setInfoNodeText=e=>{S.bShowInfo&&(S.infoNodeText.set({content:e}),ThreeMeshUI.update())},S.createToolbar=(e,t,o)=>{let i=ATON.createUINode(),r=e.length,a=.3*S.STD_BTN_SIZE,n=new ThreeMeshUI.Block({width:S.STD_BTN_SIZE*r*1.1+a,height:S.STD_BTN_SIZE+a,padding:.01,borderRadius:.02,backgroundColor:t||ATON.MatHub.colors.black,backgroundOpacity:void 0!==o?o:.3,fontFamily:S.PATH_FONT_JSON,fontTexture:S.PATH_FONT_TEX,justifyContent:"center",textAlign:"center"}),s=.5*r*S.STD_BTN_SIZE*1.1;s-=.5*S.STD_BTN_SIZE;for(let t=0;t{void 0===o&&(o=1),void 0===i&&(i=1);let r=ATON.createUINode(e),a=new THREE.Mesh(new THREE.PlaneGeometry(o,i,2),ATON.MatHub.materials.fullyTransparent);return r.add(a),void 0!==t&&ATON.Utils.textureLoader.load(t,(e=>{a.material=new THREE.MeshStandardMaterial({map:e,transparent:!0,depthWrite:!1,side:THREE.DoubleSide})})),r},S.createLayout=(e,t)=>{let o=e.children.length;for(let i=0;i{if(void 0===e)return;let t=.01,o=.001;if(void 0===S._prevMPoint){S._prevMPoint=e;let t=S._measLine.geometry.attributes.position.array;return t[0]=e.x,t[1]=e.y,void(t[2]=e.z)}S._measLine.visible=!1;let i=S._prevMPoint.distanceTo(e);t*=i,o*=i;let r=new THREE.Mesh(ATON.Utils.geomUnitCube,ATON.MatHub.getMaterial("measurement"));r.position.copy(S._prevMPoint),r.scale.set(t,t,t),S.gMeasures.add(r);let a=new THREE.Mesh(ATON.Utils.geomUnitCube,ATON.MatHub.getMaterial("measurement"));a.position.copy(e),a.scale.set(t,t,t),S.gMeasures.add(a);let n=2*i,s=(new THREE.BufferGeometry).setFromPoints([S._prevMPoint,e]);S.gMeasures.add(new THREE.Line(s,ATON.MatHub.getMaterial("measurement")));let l=new S.Label;l.setBaseColor(ATON.MatHub.colors.white).setTextColor(ATON.MatHub.colors.black),l.userData.vStart=new THREE.Vector3,l.userData.vEnd=new THREE.Vector3,l.userData.vStart.copy(S._prevMPoint),l.userData.vEnd.copy(e),l.userData.vSEdir=new THREE.Vector3,l.userData.vSEdir.x=l.userData.vStart.x-l.userData.vEnd.x,l.userData.vSEdir.y=l.userData.vStart.y-l.userData.vEnd.y,l.userData.vSEdir.z=l.userData.vStart.z-l.userData.vEnd.z,l.userData.vSEdir.normalize(),l.setPosition(.5*(S._prevMPoint.x+e.x),.5*(S._prevMPoint.y+e.y),.5*(S._prevMPoint.z+e.z)),l.setScale(n).setText(ATON.Utils.getHumanReadableDistance(i)),S.gMeasures.add(l),S._measLabels.push(l);let d={};return d.A=l.userData.vStart,d.B=l.userData.vEnd,S._prevMPoint=void 0,d},S.clearMeasurements=()=>{S.gMeasures.removeChildren(),S._measLabels=[]},S._updateMeasurements=()=>{if(!(S._measLabels.length<=0))for(let e in S._measLabels)S._measLabels[e].orientToCamera()},S.update=()=>{if(ATON.Nav.isTransitioning()||ATON._bPauseQuery)S.infoNode.visible=!1;else{if(S._prevMPoint){if(ATON._queryDataScene){let e=S._measLine.geometry.attributes.position.array;e[3]=ATON._queryDataScene.p.x,e[4]=ATON._queryDataScene.p.y,e[5]=ATON._queryDataScene.p.z,S._measLine.geometry.attributes.position.needsUpdate=!0}S._measLine.visible=!0}else S._measLine.visible=!1;if(ATON._queryDataScene&&!ATON.Nav._bInteracting?(S._bShowSelector&&(S.mainSelector.visible=!0),S.mainSelector.position.x=ATON._queryDataScene.p.x+S._selOffset.x,S.mainSelector.position.y=ATON._queryDataScene.p.y+S._selOffset.y,S.mainSelector.position.z=ATON._queryDataScene.p.z+S._selOffset.z):S.mainSelector.visible=!1,S.gSemIcons&&(ATON.Nav._bInteracting?S.gSemIcons.hide():void 0===ATON._hoveredSemNode&&S.gSemIcons.show()),ATON.Nav.isOrbit()&&!ATON.XR._bPresenting||!ATON.Nav.currentQueryValidForLocomotion()?S.fpTeleport.visible=!1:(S.fpTeleport.visible=!0,S.fpTeleport.position.copy(ATON._queryDataScene.p)),ATON.XR._pointerLineMesh){let e=0;ATON._queryDataScene&&(e=ATON._queryDataScene.d),ATON._queryDataUI&&(e<=0||ATON._queryDataUI.d0?(ATON.XR._pointerLineMesh.visible=!0,ATON.XR._pointerLineMesh.scale.set(1,1,e)):ATON.XR._pointerLineMesh.visible=!1}if(S._updateMeasurements(),ATON._queryDataSem)ATON.XR._bPresenting&&(S.bShowInfo&&(S.infoNode.visible=!0),ATON.XR.controller0?(S.infoNode.position.copy(ATON.XR.controller0pos),S.infoNode.position.x-=.1*ATON.XR.controller0dir.x,S.infoNode.position.y-=.1*ATON.XR.controller0dir.y,S.infoNode.position.z-=.1*ATON.XR.controller0dir.z,S.infoNode.setScale(1)):(S.infoNode.position.lerpVectors(ATON._queryDataSem.p,ATON.Nav._currPOV.pos,.1),S.infoNode.setScale(ATON._queryDataSem.d*S._labelScaleVR)),S.infoNode.orientToCamera()),ATON.Photon._bStreamFocus||(S.mainSelector.visible=!1);else if(ATON.XR._bPresenting&&S.bShowInfo&&ATON._queryDataScene&&void 0!==ATON.XPFNetwork._semCurr){S.infoNode.position.lerpVectors(ATON._queryDataScene.p,ATON.Nav._currPOV.pos,.5);const e=ATON._queryDataScene.d*(ATON.Nav._currPOV.fov/S._labelScale);S.infoNode.setScale(e),S.infoNode.orientToCamera(),S.infoNode.visible=!0}else S.infoNode.visible=!1;if(S.mainSelector.visible&&ATON.Photon._bStreamFocus){let e=S._selectorRad*(1+.2*Math.cos(10*ATON._clock.elapsedTime));S.mainSelector.scale.set(e,e,e);let t=ATON.getSceneFocalPoint();void 0!==t&&void 0!==ATON.plight&&(ATON.enablePointLight(),ATON.plight.position.copy(t),ATON.plight.distance=2*S._selectorRad)}}};const N=S;let O={SCENES_SORTER:(e,t)=>{let o=e.creationDate,i=t.creationDate;return o&&i?o>i?-1:i>o?1:0:0},init:()=>{window.bootstrap&&window.bootstrap.Offcanvas&&(O._parser=new DOMParser,O.PATH_RES_ICONS=ATON.PATH_RES+"icons/",O._bModal=!1,O._bSidePanel=!1,O._bSemL=!1,O._setupBase())},setTheme:e=>{document.body.setAttribute("data-bs-theme",e)},createElementFromHTMLString:e=>O._parser.parseFromString(e,"text/html").body.firstElementChild,onContextMenu:()=>!1,_setupBase:()=>{document.body.oncontextmenu=O.onContextMenu,O.setTheme("dark"),O.elCenteredOverlay=O.createElementFromHTMLString('\n
    \n
    Loading...
    \n
    \n\t'),document.body.append(O.elCenteredOverlay),O.hideCenteredOverlay(),O.elLabelCon=document.createElement("div"),O.elLabelCon.classList.add("aton-floating-label-container"),O.elLabel=document.createElement("div"),O.elLabel.classList.add("aton-floating-label"),O.elLabelCon.append(O.elLabel),document.body.prepend(O.elLabelCon),O.hideSemLabel(),O.elModal=O.createElementFromHTMLString('\n \n\t'),O.modal=new bootstrap.Modal(O.elModal),document.body.append(O.elModal),O.elModalContent=document.getElementById("uiModalContent"),O.elSidePanel=O.createElementFromHTMLString('\n
    \n\t'),O.sidepanel=new bootstrap.Offcanvas(O.elSidePanel),document.body.append(O.elSidePanel)},showCenteredOverlay:e=>{O.elCenteredOverlay.classList.add("d-flex"),O.elCenteredOverlay.classList.remove("d-none")},hideCenteredOverlay:()=>{O.elCenteredOverlay.classList.remove("d-flex"),O.elCenteredOverlay.classList.add("d-none")},showModal:e=>{if(e){if(O.elModalContent.innerHTML="",e.header){let t=document.createElement("div");t.classList.add("modal-header"),t.innerHTML="",O.elModalContent.append(t)}if(e.body){let t=document.createElement("div");t.classList.add("modal-body"),t.append(e.body),O.elModalContent.append(t)}if(e.footer){let t=document.createElement("div");t.classList.add("modal-footer"),t.append(e.footer),O.elModalContent.append(t)}O.modal.show(),O._bModal=!0}},hideModal:()=>{O.modal.hide(),O._bModal=!1},showSidePanel:e=>{if(e){if(O.elSidePanel.innerHTML="",e.header){let t=document.createElement("div");t.classList.add("offcanvas-header"),t.innerHTML="

    "+e.header+"

    ",O.elSidePanel.append(t)}if(e.body){let t=document.createElement("div");t.classList.add("offcanvas-body"),t.append(e.body),O.elSidePanel.append(t)}O.sidepanel.show(),O._bSidePanel=!0}},hideSidePanel:()=>{O.sidepanel.hide(),O._bSidePanel=!1},addBasicEvents:()=>{let e=document.querySelector("canvas");ATON.on("NodeRequestFired",(()=>{O.showCenteredOverlay()})),ATON.on("AllNodeRequestsCompleted",(()=>{O.hideCenteredOverlay()})),ATON.on("SemanticNodeHover",(t=>{let o=ATON.getSemanticNode(t);void 0!==o&&(O.showSemLabel(t),o.highlight(),e.style.cursor="pointer",ATON.SUI.gSemIcons&&ATON.SUI.gSemIcons.hide())})),ATON.on("SemanticNodeLeave",(t=>{let o=ATON.getSemanticNode(t);void 0!==o&&(O.hideSemLabel(),o.restoreDefaultMaterial(),e.style.cursor="grab",ATON.SUI.gSemIcons&&ATON.SUI.gSemIcons.show())})),ATON.on("SemanticMaskHover",(t=>{O.showSemLabel(t),e.style.cursor="pointer"})),ATON.on("SemanticMaskLeave",(t=>{O.hideSemLabel(),e.style.cursor="grab"})),ATON.addUpdateRoutine(O.update)},update:()=>{if(O._bSemL&&!ATON.XR._bPresenting){let e=.5*ATON._screenPointerCoords.x*window.innerWidth,t=.5*(1-ATON._screenPointerCoords.y)*window.innerHeight;t-=35,O.elLabel.style.transform="translate("+e+"px, "+t+"px)"}},showSemLabel:e=>{O.elLabel.innerHTML=e,O.elLabel.style.display="inline-block",O._bSemL=!0},hideSemLabel:()=>{O.elLabel.style.display="none",O._bSemL=!1},loadPartial:(e,t,o,i)=>{fetch(e).then((e=>e.text())).then((e=>{let i=O._parser.parseFromString(e,"text/html").body.childNodes;t?o?document.querySelector(`#${t}`).prepend(...i):document.querySelector(`#${t}`).append(...i):o?document.body.prepend(...i):document.body.append(...i)})).catch((e=>`Error fetching partial: ${e}`)),i&&i()},resolveIconURL:e=>e.includes("/")?e:O.PATH_RES_ICONS+e+".png",prependIcon:(e,t)=>{t.startsWith("bi-")?e.prepend(O.createElementFromHTMLString("")):e.prepend(O.createElementFromHTMLString(""))},createButton:e=>{let t=document.createElement("button");return t.classList.add("btn","aton-btn"),t.setAttribute("type","button"),e.variant&&t.classList.add("btn-"+e.variant),e.text&&(t.innerText=e.text),e.icon&&O.prependIcon(t,e.icon),e.badge&&t.append(O.createElementFromHTMLString(""+e.badge+"")),e.onpress&&(t.onclick=e.onpress),t},createDropdown:e=>{let t=document.createElement("div");t.classList.add("btn-group");let o=O.createElementFromHTMLString(`\n \n `);if(e.icon&&O.prependIcon(o,e.icon),t.append(o),e.items){let o=document.createElement("ul");o.classList.add("dropdown-menu","dropdown-menu-sm-end","aton-dropdown-menu");for(let t=0;t${r.title}\n `);let a=document.createElement("li");a.append(i),o.append(a),r.icon&&O.prependIcon(i,r.icon)}t.append(o)}return t},createTabsGroup:e=>{let t=ATON.Utils.generateID("tabgroup"),o=document.createElement("div"),i=document.createElement("ul");i.classList.add("nav","nav-justified","nav-tabs"),i.setAttribute("role","tablist");let r=document.createElement("div");r.classList.add("tab-content"),o.append(i),o.append(r);for(let o=0;o");let c=t+"-"+n;c=c.replaceAll(" ","");let u,p=document.createElement("li");p.classList.add("nav-item"),p.setAttribute("role","presentation"),p.innerHTML=0===o?"":"",i.append(p),u=0===o?O.createElementFromHTMLString("
    "):O.createElementFromHTMLString("
    "),u.style.padding="10px 0px 10px 0px",s&&u.append(s),r.append(u)}return o},createTreeGroup:e=>{let t=ATON.Utils.generateID("tree"),o=document.createElement("div");o.classList.add("aton-tree-container");for(let i=0;i"+a+"")),n){let e=document.createElement("div");e.classList.add("aton-tree-item-content"),e.append(r.content),s.append(e)}o.append(s)}return o},createVectorControl:e=>{let t,o=ATON.Utils.generateID("vec3");e.vector&&(t=e.vector);let i=.01;e.step&&(i=e.step);let r=t?t.x:0,a=t?t.y:0,n=t?t.z:0,s=O.createElementFromHTMLString(`\n
    \n \n \n \n
    \n `);s.id=o;let l=s.children[0],d=s.children[1],c=s.children[2];return l.oninput=()=>{let o=l.value;t&&(t.x=o),e.onupdate&&e.onupdate()},d.oninput=()=>{let o=d.value;t&&(t.y=o),e.onupdate&&e.onupdate()},c.oninput=()=>{let o=c.value;t&&(t.z=o),e.onupdate&&e.onupdate()},s},createQuaternionControl:e=>{let t,o=ATON.Utils.generateID("vec3");e.quat&&(t=e.quat);let i=.01;e.step&&(i=e.step);let r=t?t.x:0,a=t?t.y:0,n=t?t.z:0,s=t?t.w:0,l=O.createElementFromHTMLString(`\n
    \n \n \n \n \n
    \n `);l.id=o;let d=l.children[0],c=l.children[1],u=l.children[2],p=l.children[3];return d.oninput=()=>{let o=d.value;t&&(t.x=o),e.onupdate&&e.onupdate()},c.oninput=()=>{let o=c.value;t&&(t.y=o),e.onupdate&&e.onupdate()},u.oninput=()=>{let o=u.value;t&&(t.z=o),e.onupdate&&e.onupdate()},u.oninput=()=>{let o=p.value;t&&(t.w=o),e.onupdate&&e.onupdate()},l},createNodeTrasformControl:e=>{let t,o=ATON.Utils.generateID("ftrans"),i=document.createElement("div");if(i.id=o,e.node&&(t=ATON.getSceneNode(e.node)),e.position){let o=O.createVectorControl({vector:t.position,step:e.position.step});i.append(O.createElementFromHTMLString("")),i.append(o)}if(e.scale){let o=O.createVectorControl({vector:t.scale,step:e.scale.step});i.append(O.createElementFromHTMLString("")),i.append(o)}if(e.rotation){let o=O.createVectorControl({vector:t.rotation,step:e.rotation.step});i.append(O.createElementFromHTMLString("")),i.append(o)}return i},createSceneCard:e=>{let t,o,i,r=document.createElement("div");if(r.classList.add("card","aton-scene-card"),"small"===e.size&&r.classList.add("aton-scene-card-small"),"large"===e.size&&r.classList.add("aton-scene-card-large"),!e.sid)return r;let a="";if(e.keywords){for(let t in e.keywords)a+=t+" ";a=a.trim().toLowerCase(),r.setAttribute("data-search-term",a)}i=ATON.PATH_RESTAPI2+"scenes/"+e.sid+"/cover";let n=e.sid.split("/");if(t=n[0],o=n[1],r.setAttribute("data-search-user",t),e.useblurtint){let e=document.createElement("div");e.classList.add("aton-scene-card-bg"),e.style.backgroundImage="url('"+i+"')",r.append(e)}r.innerHTML+="
    ";let s=document.createElement("div");s.classList.add("card-body","aton-scene-card-body"),r.append(s);let l=document.createElement("div");return l.classList.add("card-title","aton-scene-card-title"),l.innerHTML="Title",s.append(l),e.title?(l.innerHTML=e.title,a+=e.title.trim().toLowerCase(),r.setAttribute("data-search-term",a)):ATON.REQ.get("scenes/"+e.sid,(e=>{e.title&&(l.innerHTML=e.title)})),s.innerHTML+="
    "+t+"
    ",r},createLiveFilter:e=>{let t=ATON.Utils.generateID("filter"),o=t+"-input",i=document.createElement("form");i.id=t,i.classList.add("d-flex"),i.setAttribute("role","search");let r="Search";e.placeholder&&(r=e.placeholder);let a=O.createElementFromHTMLString(``);const n=document.createElement("div");return n.classList.add("input-group"),n.append(O.createElementFromHTMLString("")),n.append(a),e.oninput?a.oninput=e.oninput:a.oninput=()=>{if(!e.filterclass)return;let t=a.value.trim().toLowerCase(),o=document.querySelectorAll(`.${e.filterclass}`);if(t.length<3)for(let e of o)e.classList.remove("d-none");else for(let e of o){let o=e.getAttribute("data-search-term");o&&(o.includes(t)||t.length<1)?e.classList.remove("d-none"):e.classList.add("d-none")}},e.onfocus&&(a.onfocus=e.onfocus),e.onblur&&(a.onblur=e.onblur),i.append(n),i},createPublicScenesGallery:e=>{if(!e.containerid)return;let t=document.getElementById(e.containerid);if(!t)return;const o=o=>{o.sort(O.SCENES_SORTER),console.log(o);for(let i of o){let o=i.sid.startsWith("samples/");if(!o||o&&e.samples){let o=ATON.UI.createSceneCard({title:i.title?i.title:i.sid,sid:i.sid,keywords:i.kwords,useblurtint:!0,size:e.size});t.append(o)}}};return e.entries?o(e.entries):ATON.REQ.get("scenes/",(e=>o(e))),t},createLoginForm:e=>{let t=document.createElement("form");t.classList.add("container-sm","text-center");let o=O.createElementFromHTMLString('
    Username
    '),i=O.createElementFromHTMLString('
    Password
    '),r=O.createElementFromHTMLString(''),a=O.createElementFromHTMLString('');o.append(r),i.append(a);let n=ATON.UI.createButton({text:"Login",icon:"bi-person",variant:"primary",onpress:()=>{let t=r.value.trim(),o=a.value.trim();ATON.REQ.login(t,o,e.onSuccess,e.onFail)}});return e.header?t.append(e.header):t.append(O.createElementFromHTMLString('')),t.append(o),t.append(i),t.append(n),t}};const A=O;let b={USER_STATE_FREQ:.25,REPLICATED_EVT:"EREP",THRES_STATE_POS:.01,THRES_STATE_ORI:.08};b.Avatar=class extends t{constructor(e){super(void 0,ATON.NTYPES.UI),this.userid=e,this.username=void 0,this.message="...",this.color=ATON.Photon.ucolors[this.userid%ATON.Photon.ucolors.length],this._auTalk=[],this._auTalk.push(new THREE.PositionalAudio(ATON.AudioHub._listener)),this._auTalk.push(new THREE.PositionalAudio(ATON.AudioHub._listener));for(let e=0;e<2;e++)this._auTalk[e].setRefDistance(30),this._auTalk[e].setLoop(!1),this.add(this._auTalk[e]);this._auTalki=0,this.bMuted=!1,this._bPlayingAudio=!1,this._blob=void 0,this._b64=void 0,this._tStateCall=-1,this._tProgress=0,this._tFocCall=-1,this._currFocusPos=new THREE.Vector3,this._tgtFocusPos=new THREE.Vector3,this._currState={position:new THREE.Vector3,quaternion:new THREE.Quaternion,scale:1},this._tgtState={position:new THREE.Vector3,quaternion:new THREE.Quaternion,scale:1},this.userlabelnode=void 0,this.mStream=void 0,this._elVStream=void 0,this.realize()}getColor(){return this.color}setTalkDistance(e){e>0&&this._auTalk.setRefDistance(e)}setMuted(e){this.bMuted=e}getAvatarMaterialByUID(e){let t=ATON.MatHub.materials.avatars;return t[e%t.length]}_buildLabel(){this.userlabelnode=ATON.createUINode(),this.labelcontainer=new ThreeMeshUI.Block({width:.5,height:.2,padding:.03,borderRadius:.05,backgroundColor:ATON.MatHub.colors.white,fontFamily:ATON.SUI.PATH_FONT_JSON,fontTexture:ATON.SUI.PATH_FONT_TEX,justifyContent:"center",textAlign:"center"}),this.userlabelnode.position.y=.4,this.userlabelnode.add(this.labelcontainer),this.usernametext=new ThreeMeshUI.Text({content:"User #"+this.userid,fontSize:.07,fontColor:this.color}),this.usernametext.position.y=.01,this.labelcontainer.add(this.usernametext),this.add(this.userlabelnode),ThreeMeshUI.update()}realizeStreamPanel(){let e=ATON.MediaFlow.getOrCreateVideoStream(this.userid,void 0,!0);this._elVStream=e.el;let t=new THREE.PlaneGeometry(1,1);this.mStream=new THREE.Mesh(t,e.matStream),this.mStream.position.y=1;let o=.5625;this.mStream.scale.y=-o,this.mStream.position.y=.8*o,this._elVStream.addEventListener("loadedmetadata",(e=>{o=this._elVStream.videoHeight/this._elVStream.videoWidth,this.mStream.scale.y=-o,this.mStream.position.y=.8*o}))}getStreamPanel(){return this.mStream}toggleStreamPanel(e){void 0!==this.mStream&&(this.mStream.visible=e)}realize(){let e=new THREE.SphereGeometry(.2,16,16);ATON.Photon.customAvatarMaterial?this.usermaterial=ATON.Photon.customAvatarMaterial():this.usermaterial=this.getAvatarMaterialByUID(this.userid);let t=new THREE.Mesh(e,this.usermaterial);this.usermeshnode=ATON.createUINode(),this.usermeshnode.add(t),this.usermeshnode.setMaterial(this.usermaterial),this.usermeshnode.setCloneOnLoadHit(!1),this.add(this.usermeshnode),this.userauinode=new THREE.Sprite(ATON.Photon.uspritemats[this.userid%ATON.Photon.uspritemats.length]),this.userauinode.position.set(0,0,0),this.userauinode.visible=!1,this.add(this.userauinode),this.userfpnode=new THREE.Sprite(ATON.Photon.ufocmats[this.userid%ATON.Photon.ufocmats.length]),this.userfpnode.position.set(0,0,0),this.userfpnode.visible=!1,void 0===ATON.Photon._focNodes[this.userid]&&(ATON.Photon._focNodes[this.userid]=this.userfpnode,ATON.Photon.focGroup.add(this.userfpnode)),this._buildLabel()}loadRepresentation(e){let t=this;return void 0!==t.usermeshnode.children[0]&&t.usermeshnode.remove(t.usermeshnode.children[0]),t.usermeshnode.load(e),this}setUsername(e){return void 0===this.userlabelnode||(this.username=e,this.usernametext.set({content:e}),ThreeMeshUI.update()),this}getUsername(){if(void 0!==this.userid)return void 0===this.username?"User #"+this.userid:this.username}setMessage(e){if(void 0===this.userlabelnode)return this;this.message=e}setTalkVolume(e){if(void 0!==e)if(e>0){this.userauinode.visible=!0;let t=.1+.03*e;this.userauinode.scale.set(t,t,t)}else this.userauinode.visible=!1;else this.userauinode.visible=!1}hideFocalPoint(){this.userfpnode.visible=!1}requestFocus(e){if(void 0===e)return;if(this._tFocCall>=0)return;this._tFocCall=ATON._clock.elapsedTime,this._currFocusPos.copy(this.userfpnode.position);let t=this.scale.x*ATON._worldScale,o=parseFloat(e[0])*t,i=parseFloat(e[1])*t,r=parseFloat(e[2])*t,a=parseFloat(e[3])*t;this._tgtFocusPos.set(o,i,r),this._tgtFocusRad=2*a,this.userfpnode.scale.set(this._tgtFocusRad,this._tgtFocusRad,this._tgtFocusRad),this.userfpnode.visible=!0,ATON.enablePointLight(),ATON.plight.color=this.color,ATON.plight.position.copy(this._tgtFocusPos),ATON.plight.distance=this._tgtFocusRad}handleFocusTransition(){if(this._tFocCall<0)return;let e=ATON.Photon.USER_STATE_FREQ,t=(ATON._clock.elapsedTime-this._tFocCall)/e;if(t>=1)return this._tFocCall=-1,this.userfpnode.position.copy(this._tgtFocusPos),this.userfpnode.scale.set(this._tgtFocusRad,this._tgtFocusRad,this._tgtFocusRad),void(this.userfpnode.visible=!0);this.userfpnode.position.lerpVectors(this._currFocusPos,this._tgtFocusPos,t),ATON.plight.position.copy(this.userfpnode.position),this.userfpnode.visible=!0}requestStateTransition(e){this._tStateCall>=0||void 0!==e&&(this._tStateCall=ATON._clock.elapsedTime,this._currState.position.copy(this.position),this._currState.quaternion.copy(this.quaternion),this._currState.scale=this.scale,this._tgtState.position.copy(e.position),this._tgtState.quaternion.copy(e.quaternion),this._tgtState.scale=1/e.scale)}handleStateTransition(){if(this._tStateCall<0)return;let e=ATON.Photon.USER_STATE_FREQ;this._tProgress=e<=0?1:(ATON._clock.elapsedTime-this._tStateCall)/e;let t=this._currState,o=this._tgtState;if(this._tProgress>=1)return this._tStateCall=-1,this.position.copy(o.position),void this.usermeshnode.quaternion.copy(o.quaternion);this.position.lerpVectors(t.position,o.position,this._tProgress),this.usermeshnode.quaternion.slerp(o.quaternion,this._tProgress)}update(){if(this.handleStateTransition(),this.userfpnode&&this.userfpnode.visible){this.handleFocusTransition();let e=this.userfpnode.scale.x;e>.001?(this.userfpnode.scale.set(.99*e,.99*e,.99*e),ATON.plight.intensity*=.99):(this.userfpnode.visible=!1,ATON.disablePointLight())}let e=ATON.Nav._camera,t=ATON.Nav._currPOV.pos;if(void 0===e||void 0===t)return;this.userlabelnode&&this.userlabelnode.orientToCamera();let o=this.userauinode.scale.x;o*=.99,o>.01?this.userauinode.scale.set(o,o,o):this.userauinode.visible=!1}_handleTalk(){if(this._auTalk.isPlaying)return;if(this._auChunks.length<2)return;let e=this._auChunks[this._iAU];this._auTalk.setBuffer(e),this._auTalk.play(),this.setTalkVolume(5)}_handleTalkOLD(){if(this._bPlayingAudio)return;if(this._auChunks.length<1)return;let e=this._auChunks.shift();this._auTalk.setBuffer(e),this._auTalk.play(),this._bPlayingAudio=!0,this._auTalk.onended=()=>{this._bPlayingAudio=!1,e=null},this.setTalkVolume(5)}},b.CSTATE={DISCONNECTED:0,CONNECTING:1,CONNECTED:2},b.init=()=>{b.address=window.location.origin,b.initMaterials(),b.socket=void 0,b._cstate=b.CSTATE.DISCONNECTED,b._reqSSID=void 0,b._username=void 0,b.uid=void 0,b.color=ATON.MatHub.colors.white,b._bStreamFocus=!1,b._numUsers=1,b.avatarList=[],b.avaGroup=ATON.createUINode("avatars"),b.avaGroup.attachToRoot(),b.focGroup=ATON.createUINode("focus"),b.focGroup.attachTo(b.avaGroup),b._focNodes=[],b.bSendState=!0,window.setInterval(b.sendState,1e3*b.USER_STATE_FREQ),b._lastStateSent=void 0,b._bShowAvaG=!0,b._bSpatial=!0,b._decS={quaternion:new THREE.Quaternion,position:new THREE.Vector3},b.customAvatarMaterial=void 0,console.log("Photon initialized"),b.enableChatLog(),b._elVStream=void 0,window.addEventListener("beforeunload",(e=>{b.disconnect()}))},b.setCustomAvatarMaterialRoutine=e=>{b.customAvatarMaterial=e},b.enableChatLog=()=>{b._elChat=$("
    ").text("")},b.getNumUsers=()=>b._numUsers,b.initMaterials=()=>{b.ucolorhex=[],b.ucolorhex.push("#D88"),b.ucolorhex.push("#DD8"),b.ucolorhex.push("#8D8"),b.ucolorhex.push("#8DD"),b.ucolorhex.push("#88D"),b.ucolorhex.push("#D8D"),b.ucolorhex_light=[],b.ucolorhex_light.push("#FAA"),b.ucolorhex_light.push("#FFA"),b.ucolorhex_light.push("#AFA"),b.ucolorhex_light.push("#AFF"),b.ucolorhex_light.push("#AAF"),b.ucolorhex_light.push("#FAF"),b.ucolors=[],b.ucolors.push(new THREE.Color(b.ucolorhex[0])),b.ucolors.push(new THREE.Color(b.ucolorhex[1])),b.ucolors.push(new THREE.Color(b.ucolorhex[2])),b.ucolors.push(new THREE.Color(b.ucolorhex[3])),b.ucolors.push(new THREE.Color(b.ucolorhex[4])),b.ucolors.push(new THREE.Color(b.ucolorhex[5])),b.ucolorsdark=[],b.ucolorsdark.push(new THREE.Color(.2,0,0)),b.ucolorsdark.push(new THREE.Color(.2,.2,0)),b.ucolorsdark.push(new THREE.Color(0,.2,0)),b.ucolorsdark.push(new THREE.Color(0,.2,.2)),b.ucolorsdark.push(new THREE.Color(0,0,.2)),b.ucolorsdark.push(new THREE.Color(.2,0,.2));let e=ATON.MatHub.materials;e&&(e.avatars=[]);for(let t=0;t{if(!b.isConnected())return;let o=b.socket;o&&o.emit(b.REPLICATED_EVT,{e,d:t})},b.fireEvent=b.fire,b.on=(e,t)=>{if(void 0===t)return;let o=ATON.EventHub.evNetwork;void 0===o[e]&&(o[e]=[]),o[e].push(t)},b.isConnected=()=>b._cstate===b.CSTATE.CONNECTED,b.hasID=()=>void 0!==b.uid,b.log=e=>{if(!b.isConnected())return;let t=b.socket;t&&t.emit("UMSG",e)},b.joinSession=e=>{b.socket&&(void 0===e&&(e=ATON.SceneHub.currID),void 0!==e?(console.log("Joining Photon session '"+e+"'..."),b.socket.emit("SENTER",e)):console.log("Photon ERROR: current session ID is undefined"))},b.requestSceneState=()=>{b.socket&&b.socket.emit("SSTATE")},b.setAvatarsVisibility=e=>{b._bShowAvaG=e,e?b.avaGroup.show():b.avaGroup.hide()},b.disableSpatiality=()=>{b._bSpatial=!1},b.enableSpatiality=()=>{b._bSpatial=!0},b.setAddress=e=>{e&&(b.address=e)},b.connect=e=>{if(b._cstate===b.CSTATE.CONNECTED)return;if(b._cstate===b.CSTATE.CONNECTING)return;b._reqSSID=e;let t={};ATON.Utils.isConnectionSecure()?(t.path="/svrc/socket.io",t.secure=!0,t.rejectUnauthorized=!1):t.path="/vrc/socket.io",b._cstate=b.CSTATE.CONNECTING,b.socket=io.connect(b.address,t),void 0!==b.socket?b._registerSocketHandlers():b._cstate=b.CSTATE.DISCONNECTED},b.disconnect=()=>{void 0!==b.socket&&(b._numUsers=1,b.socket.disconnect(),b.color=ATON.MatHub.colors.white,ATON.plight.color=ATON.MatHub.colors.white,b._cstate=b.CSTATE.DISCONNECTED)},b._onConnected=()=>{},b.setUsername=e=>{(e=e.trim()).length<1||(b._username=e,void 0!==b.socket&&void 0!==b.uid&&(b.appendToChatBox("Your username is now: "+e+""),b.socket.emit("UNAME",e)))},b.setMessage=e=>{(e=e.trim()).length<1||e.length>3e3||(b._msg=e,void 0!==b.socket&&void 0!==b.uid&&(b.socket.emit("UMSG",e),b._elChat&&(e=b.chatMessageProcessor(b.uid,e),b.appendToChatBox("
    YOU
    : "+e+""))))},b.appendToChatBox=e=>{b._elChat&&(b._elChat.append("
    "+e+"
    "),b._elChat.scrollTop(b._elChat[0].scrollHeight))},b._registerSocketHandlers=()=>{b.socket.on("connect",(()=>{b._cstate=b.CSTATE.CONNECTED,void 0!==b._reqSSID?b.joinSession(b._reqSSID):b.joinSession(ATON.SceneHub.currID),console.log("Connected to Photon service!"),ATON.fire("VRC_Connected"),b._onConnected()})),b.socket.on("disconnect",(()=>{b._cstate=b.CSTATE.DISCONNECTED,b.uid=void 0,b.avaGroup.hide(),b.appendToChatBox("YOU disconnected from the Photon session"),console.log("Disconnected from Photon service!"),ATON.fire("VRC_Disconnected")})),b.socket.on(b.REPLICATED_EVT,(e=>{let t=e.e,o=e.d,i=ATON.EventHub.evNetwork[t];ATON.EventHub.executeHandlers(i,o)})),b.socket.on("ID",(e=>{console.log("Your ID is "+e),b.uid=e,b.color=b.ucolors[b.uid%b.ucolors.length],b._bShowAvaG&&b.avaGroup.show(),b.appendToChatBox("Your ID is #"+e+""),b.requestSceneState(),ATON.fire("VRC_IDassigned",e)})),b.socket.on("SSTATE",(e=>{b._numUsers=e.numUsers,console.log("Num. users: "+b._numUsers),ATON.fire("VRC_SceneState",e)})),b.socket.on("UENTER",(e=>{let t=e;console.log("User #"+t+" entered the session"),b.appendToChatBox("User #"+t+" entered the session"),b.requestSceneState(),ATON.fire("VRC_UserEnter",t)})),b.socket.on("ULEAVE",(e=>{let t=e;if(void 0===t)return;let o=b.avatarList[t];o&&(o.toggleStreamPanel(!1),o.hide()),console.log("User #"+t+" left the session"),b.appendToChatBox("User #"+t+" left the session"),b.requestSceneState(),ATON.fire("VRC_UserLeave",t)})),b.socket.on("USTATE",(e=>{if(!b._bShowAvaG)return;if(!b._bSpatial)return;let t=b.decodeState(e),o=t.userid,i=b.touchAvatar(o);i.requestStateTransition(t);let r=1/t.scale;i.scale.set(r,r,r)})),b.socket.on("UFOCUS",(e=>{if(!b._bSpatial)return;let t=e.uid,o=e.fp;b.touchAvatar(t).requestFocus(o)})),b.socket.on("UNAME",(e=>{let t=e.uid,o=e.name;void 0!==t&&(b.touchAvatar(t).setUsername(o),console.log("User #"+t+" changed username to: "+o),b.appendToChatBox("User #"+t+" changed username to: "+o+""),ATON.fire("VRC_UName",e))})),b.socket.on("UMSG",(e=>{let t=e.uid,o=e.msg;if(void 0===t)return;let i=b.touchAvatar(t);o.length<100&&i.setMessage(o),console.log("User #"+t+": "+o);let r=i.getUsername();o=b.chatMessageProcessor(t,o),b.ucolorhex[t%6];let a=b.ucolorhex_light[t%6];b.appendToChatBox("
    "+r+"
    : "+o+""),ATON.fire("VRC_UMessage",e)})),b.socket.on("UTALK",(e=>{let t=e.uid;if(void 0===t)return;let o=e.audio;if(o){if(b._bSpatial){let e=b.touchAvatar(t);if(e.bMuted)return;ATON.AudioHub._loader.load(o,(t=>{let o=e._auTalk[e._auTalki],i=(e._auTalki+1)%2;o.setBuffer(t),o.isPlaying||o.play(),e.setTalkVolume(5),e._auTalki=i}))}ATON.fire("VRC_UTalk",e),o=null}})),b.socket.on("UTALKSTOP",(e=>{void 0!==e.uid&&ATON.fire("VRC_UTalkStop",e)})),b.socket.on("UVIDEO",(e=>{void 0!==e.uid&&ATON.fire("VRC_UVideo",e)})),b.socket.on("UVIDEOSTOP",(e=>{let t=e.uid;if(void 0===t)return;let o=b.avatarList[t];o&&o.toggleStreamPanel(!1),ATON.fire("VRC_UVideoStop",e)}))},b.chatMessageProcessor=(e,t)=>{const o=(t=String(t)).match(/(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)/g);return o&&o.forEach((e=>{t=t.replace(e,""+e+"")})),t},b.encodeState=e=>{if(!e)return;let t=new Float32Array(5);t[0]=e.position.x,t[1]=e.position.y,t[2]=e.position.z;var o=new Int8Array(t.buffer);return o[12]=128*e.quaternion.x,o[13]=128*e.quaternion.y,o[14]=128*e.quaternion.z,o[15]=128*e.quaternion.w,o[16]=e.userid,o[17]=ATON._ws,o},b.decodeState=e=>{let t=new Int8Array(e);b._decS.userid=t[16];let o=ATON._unpackScale(t[17]);return b._decS.scale=o,b._decS.quaternion.set(parseFloat(t[12])/128,parseFloat(t[13])/128,parseFloat(t[14])/128,parseFloat(t[15])/128),t=new Float32Array(e),b._decS.position.set(parseFloat(t[0])/o,parseFloat(t[1])/o,parseFloat(t[2])/o),b._decS},b.update=()=>{if(b.isConnected())for(let e=0;e{if(void 0!==e){if(e)return b._bStreamFocus||(ATON.fire("VRC_FocusStreamingStarted"),ATON.enablePointLight(),ATON.plight.color=ATON.Photon.color),void(b._bStreamFocus=!0);{b._bStreamFocus&&(ATON.fire("VRC_FocusStreamingStopped"),ATON.disablePointLight());let e=ATON.SUI._selectorRad;ATON.SUI.mainSelector.scale.set(e,e,e),b._bStreamFocus=!1}}},b.sendState=()=>{if(!b.bSendState||!b._bSpatial)return;if(void 0===b.uid)return;if(!b.socket||!b.isConnected())return;let e=ATON.Nav._currPOV;if(!e)return;let t=ATON.getSceneFocalPoint();if(b._bStreamFocus&&void 0!==t){let e=t.x.toFixed(3),o=t.y.toFixed(3),i=t.z.toFixed(3),r=ATON.SUI.getSelectorRadius().toFixed(3);b.socket.emit("UFOCUS",[e,o,i,r])}if(!e.pos)return;if(!ATON.Nav._qOri)return;if(void 0!==b._lastStateSent){let t=b._lastStateSent.position,o=b._lastStateSent.quaternion,i=t.distanceToSquared(e.pos),r=o.angleTo(ATON.Nav._qOri);if(ib.avatarList[e],b.touchAvatar=e=>{if(void 0===b.avatarList[e]){let t=new b.Avatar(e);t.attachTo(b.avaGroup),t.loadRepresentation(ATON.PATH_RES+"models/vrc/head.glb"),b.avatarList[e]=t}let t=b.avatarList[e];return t.visible||ATON.fire("VRC_UserEnter",e),b._bShowAvaG&&t.show(),t},b.destroyAvatar=e=>{let t=b.avatarList[e];void 0!==t&&t.destroy()},b.clearAllAvatars=()=>{for(let e in b.avatarList)b.avatarList[e].hide()};const P=b;let f={FLOAT_PREC:5,init:()=>{f.bConvexBuilding=!1,f.convexPoints=[],f.convexNode=void 0,f.currConvexMesh=void 0,f.currSemNode=ATON.createSemanticNode(),f.currSemNode.disablePicking(),f.currSemNode.attachToRoot(),f.resetMaterial(),f._numShapes=0},resetMaterial:()=>{f.currMaterial=ATON.MatHub.getMaterial("semanticShapeHL")},setMaterial:e=>{void 0!==e&&(f.currMaterial=e)},addConvexPoint:e=>{if(void 0===e)return!1;if(f.convexPoints.length>0){let t=f.convexPoints[f.convexPoints.length-1];if(e.equals(t))return!1}f.convexPoints.push(e);let t=f.convexPoints.length,o=new THREE.Sprite(ATON.SUI.getOrCreateSpritePointEdit()),i=.02*ATON.getSceneQueriedDistance();if(void 0===i&&(i=.02),o.position.copy(e),o.scale.set(i,i,i),ATON.SUI.gPoints.add(o),t<4)return!1;let r=new THREE.ConvexGeometry(f.convexPoints),a=new THREE.Mesh(r,ATON.MatHub.getMaterial("semanticShapeEdit"));if(f.bConvexBuilding){let t=f.currConvexMesh;t.geometry.dispose(),t.geometry=r,ATON.Utils.setVectorPrecision(e,4),t.userData._convexPoints.push(e.x),t.userData._convexPoints.push(e.y),t.userData._convexPoints.push(e.z)}else{f.currSemNode.add(a),a.userData._convexPoints=[];for(let e=0;e{if(0!==f.convexPoints.length&&(f.convexPoints.pop(),f.currConvexMesh)){let e=f.currConvexMesh.userData;e._convexPoints&&e._convexPoints.pop()}},stopCurrentConvex:()=>{f.bConvexBuilding&&(f.convexPoints=[],f.bConvexBuilding=!1,f.currSemNode.removeChildren(),ATON.SUI.gPoints.removeChildren())},getCurrentConvexShape:()=>f.currSemNode,isBuildingShape:()=>f.convexPoints.length>0,completeConvexShape:e=>{if(f.convexPoints=[],f.bConvexBuilding=!1,void 0===f.currSemNode)return;void 0===e&&(e="sem"+f._numShapes);let t=ATON.getSemanticNode(e)||ATON.createSemanticNode(e),o=f.currSemNode.children[0];return ATON.SUI.addSemIcon(e,o),t.add(o),t.setMaterial(ATON.MatHub.materials.semanticShape),t.setDefaultAndHighlightMaterials(ATON.MatHub.materials.semanticShape,f.currMaterial),t.enablePicking(),f.currSemNode.removeChildren(),f._numShapes++,ATON.SUI.gPoints.removeChildren(),ATON._bqSem=!0,t},createConvexShape:(e,t)=>{let o=new THREE.ConvexGeometry(t),i=new THREE.Mesh(o,ATON.MatHub.materials.semanticShape);i.userData._convexPoints=[];for(let e=0;e{if(void 0===ATON._queryDataScene)return!1;void 0===e&&(e=.02);let t=ATON._queryDataScene.p,o=ATON.Nav.getCurrentEyeLocation();return t.lerpVectors(t,o,e),f.addConvexPoint(t),t},createSphere:(e,t,o)=>{if(void 0===t)return;if(void 0===o)return;void 0===e&&(e="sem"+f._numShapes);let i=ATON.getOrCreateSemanticNode(e),r=new THREE.Mesh(ATON.Utils.geomUnitSphere,ATON.MatHub.materials.semanticShape),a=new THREE.Object3D;return a.position.copy(t),a.scale.set(o,o,o),a.add(r),ATON.SUI.addSemIcon(e,a),i.add(a),i.enablePicking(),i.setDefaultAndHighlightMaterials(ATON.MatHub.materials.semanticShape,f.currMaterial),f._numShapes++,ATON._bqSem=!0,i},createSurfaceSphere:e=>{if(!ATON._queryDataScene)return;let t=ATON._queryDataScene.p,o=ATON.SUI.getSelectorRadius();return f.createSphere(e,t,o)},deleteSemanticNode:e=>{let t=ATON.getSemanticNode(e);if(void 0===t)return!1;if(t.removeChildren(),void 0===ATON.SUI.gSemIcons)return!0;for(let t in ATON.SUI.gSemIcons.children){let o=ATON.SUI.gSemIcons.children[t];o&&o.name===e&&ATON.SUI.gSemIcons.removeChild(o)}return!0}};const E=f;let R={SEMSHAPE_SPHERE:0,SEMSHAPE_CONVEX:1,POPUP_DT:500,STD_SEL_RAD:.05,_bRealized:!1,realize:()=>{if(R._bRealized)return;R.PATH_RES_ICONS=ATON.PATH_RES+"icons/",R._bPopup=!1,R._tPopup=void 0,R.popupBlurBG=0,R._userAuth={},R._bControlLight=!1,R._bControlSelScale=!1,R._cLightDir=new THREE.Vector3,R._auSemNode=void 0,R._auSemNodePlaying=!1,R._bReqHome=!1,R._bVRCsetup=!1,R.urlParams=new URLSearchParams(window.location.search),R._uiSetupBase(),R._uiProfiles={},R._uiCurrProfile=void 0,R._selRanges=[.01,50],R._selRefRadius=.5,ATON.realize(),ATON.on("Fullscreen",(e=>{R.uiSwitchButton("fullscreen",e)}));let e=ATON.FE.urlParams.get("d");e&&e>0&&(ATON.setDefaultPixelDensity(e),ATON.toggleAdaptiveDensity(!1));let t=ATON.FE.urlParams.get("dd");t&&t>0&&ATON.toggleAdaptiveDensity(!0),R._canvas=ATON._renderer.domElement,R._bSem=!1,R._bShowSemLabel=!0,R._bRealized=!0,R.loadSceneID=ATON.App.loadScene},_handleHomeReq:()=>{R._bReqHome||ATON.getRootScene().getBound().radius<=0||(R._bReqHome=!0,void 0!==ATON.Nav.homePOV?ATON.Nav.requestHome(1):ATON.Nav.computeAndRequestDefaultHome(.5))},addBasicLoaderEvents:()=>{ATON.on("NodeRequestFired",(()=>{$("#idLoader").show()})),ATON.on("SceneJSONLoaded",(()=>{ATON.SceneHub.getDescription()&&$("#btn-info").show(),void 0!==ATON.Nav.homePOV&&ATON.Nav.requestHome(1),ATON.XPFNetwork._list.length>0&&void 0===ATON.Nav.homePOV&&(ATON.XPFNetwork.setHomeXPF(0),ATON.XPFNetwork.requestTransitionByIndex(0))})),ATON.on("AllNodeRequestsCompleted",(()=>{$("#idLoader").hide(),ATON.CC.anyCopyrightFound()&&$("#btn-cc").show(),R.computeSelectorRanges(),ATON.SUI.setSelectorRadius(Math.min(R.STD_SEL_RAD,R._selRefRadius)),R._handleHomeReq()})),ATON.on("XR_support",(e=>{"immersive-vr"===e.type&&(e.v?$("#btn-vr").show():$("#btn-vr").hide())})),ATON.on("SemanticNodeHover",(e=>{let t=ATON.getSemanticNode(e);void 0!==t&&(R.showSemLabel(e),R._bSem=!0,t.highlight(),$("canvas").css({cursor:"crosshair"}),ATON.SUI.gSemIcons&&ATON.SUI.gSemIcons.hide())})),ATON.on("SemanticNodeLeave",(e=>{let t=ATON.getSemanticNode(e);void 0!==t&&(R.hideSemLabel(),R._bSem=!1,t.restoreDefaultMaterial(),$("canvas").css({cursor:"grab"}),ATON.SUI.gSemIcons&&ATON.SUI.gSemIcons.show())})),ATON.on("SemanticMaskHover",(e=>{R.showSemLabel(e),R._bSem=!0,$("canvas").css({cursor:"crosshair"})})),ATON.on("SemanticMaskLeave",(e=>{R.hideSemLabel(),R._bSem=!1,$("canvas").css({cursor:"grab"})})),ATON.addUpdateRoutine(R._update)},showSemLabel:e=>{R._bShowSemLabel&&($("#idPopupLabel").html(e),$("#idPopupLabel").show(),ATON.SUI.setInfoNodeText(e))},hideSemLabel:()=>{$("#idPopupLabel").hide(),$("#idPopupLabel").html("")},controlLight:e=>{R._bControlLight=e,ATON.Nav.setUserControl(!e)},controlSelectorScale:e=>{R._bControlSelScale=e,ATON._bPauseQuery=e,ATON.Nav.setUserControl(!e)},attachGizmoToNode:e=>{if(void 0===ATON._gizmo)return;let t=ATON.getSceneNode(e);void 0!==t&&ATON._gizmo.attach(t)},useMouseWheelToScaleSelector:e=>{void 0===e&&(e=.9),ATON.on("MouseWheel",(t=>{if(ATON._kModCtrl){let e=ATON.Nav.getFOV();return t>0?e+=1:e-=1,void ATON.Nav.setFOV(e)}if(ATON._kModShift){let o=ATON.SUI.mainSelector.scale.x;return t>0?o*=e:o/=e,oR._selRanges[1]&&(o=R._selRanges[1]),void ATON.SUI.setSelectorRadius(o)}}))},_update:()=>{if(R._bControlLight){const e=ATON._screenPointerCoords.x,t=ATON._screenPointerCoords.y;R._cLightDir.x=-Math.cos(e*Math.PI),R._cLightDir.y=4*-t,R._cLightDir.z=-Math.sin(e*Math.PI),R._cLightDir.normalize(),ATON.setMainLightDirection(R._cLightDir)}if(ATON.XR._bPresenting){let e=ATON.XR.getAxisValue(ATON.XR.HAND_R);if(!ATON.Photon._bStreamFocus){let t=ATON.SUI._selectorRad;t+=.01*e.y,t>.001&&ATON.SUI.setSelectorRadius(t)}}else{if(ATON.Nav.isTransitioning()||ATON.Nav._bInteracting||ATON._bPauseQuery)return void $("#idPopupLabel").hide();if(R._bSem&&R._bShowSemLabel){$("#idPopupLabel").show();let e=.5*ATON._screenPointerCoords.x*window.innerWidth,t=.5*(1-ATON._screenPointerCoords.y)*window.innerHeight;t-=55,$("#idPopupLabel").css("transform","translate("+e+"px, "+t+"px)")}else $("#idPopupLabel").hide()}},uiBasicSetup:()=>{R.uiAddButton("idTopToolbar","fullscreen",ATON.toggleFullScreen),ATON.Utils.isConnectionSecure()&&R.uiAddButton("idTopToolbar","vr",ATON.XR.toggle),R.uiAddButton("idBottomToolbar","home",(()=>{ATON.Nav.requestHome(.1)}))},_uiSetupBase:()=>{$("#idPopup").click(R.popupClose),$("#idLoader").html(""),$("body").prepend("
    "),R.hideSemLabel()},uiAddButton:(e,t,o,i)=>{let r,a;t.endsWith(".png")?(r=t,a=t.slice(0,-4)):(r=R.PATH_RES_ICONS+t+".png",a=t);let n=$("
    ");$("#"+e).append(n),o&&n.click(o),i&&n.attr("title",i)},uiSwitchButton:(e,t)=>{t?$("#btn-"+e).addClass("switchedON"):$("#btn-"+e).removeClass("switchedON")},uiSetButtonHandler:(e,t)=>{$("#"+e).click(t)},uiAddButtonHome:e=>{R.uiAddButton(e,"home",(()=>{ATON.Nav.requestHome(.3)}),"Home viewpoint")},uiAddButtonBack:(e,t)=>{R.uiAddButton(e,"back",(()=>{t&&t.length>1&&t.startsWith("http:")?ATON.Utils.goToURL(t):history.back()}),"Go Back")},uiAddButtonFirstPerson:e=>{R.uiAddButton(e,"fp",(()=>{ATON.Nav.isFirstPerson()?(ATON.Nav.setOrbitControl(),R.uiSwitchButton("fp",!1)):(ATON.Nav.setFirstPersonControl(),R.uiSwitchButton("fp",!0))}),"First-person navigation mode"),ATON.Nav.isFirstPerson()?R.uiSwitchButton("fp",!0):R.uiSwitchButton("fp",!1)},uiAddButtonVR:e=>{ATON.Utils.isConnectionSecure()&&(R.uiAddButton(e,"vr",(()=>{ATON.XR.toggle("immersive-vr")}),"Immersive VR mode"),ATON.Utils.isVRsupported()||$("#btn-vr").hide())},uiAddButtonAR:e=>{ATON.Utils.isConnectionSecure()&&R.uiAddButton(e,"ar",(()=>{ATON.Utils.isARsupported()&&ATON.XR.toggle("immersive-ar")}),"Immersive AR mode")},uiAddButtonDeviceOrientation:e=>{ATON.Utils.isConnectionSecure()&&ATON.Utils.isMobile()&&(R.uiAddButton(e,"devori",(()=>{ATON.Nav.isDevOri()?(ATON.Nav.restorePreviousNavMode(),R.uiSwitchButton("devori",!1)):(ATON.Nav.setDeviceOrientationControl(),R.uiSwitchButton("devori",!0))}),"Device-orientation mode"),ATON.Nav.isDevOri()?R.uiSwitchButton("devori",!0):R.uiSwitchButton("devori",!1))},uiAddButtonNav:e=>{R.uiAddButton(e,"nav",(()=>{R.popupNav()}),"Navigation")},uiAddButtonTalk:e=>{ATON.Utils.isConnectionSecure()&&(R.uiAddButton(e,"talk",(()=>{ATON.MediaFlow.isAudioRecording()?(ATON.MediaFlow.stopAudioStreaming(),$("#btn-talk").removeClass("atonBTN-rec")):(ATON.MediaFlow.startAudioStreaming(),$("#btn-talk").addClass("atonBTN-rec"))}),"Talk ON/OFF"),ATON.MediaFlow.isAudioRecording()?$("#btn-talk").addClass("atonBTN-rec"):$("#btn-talk").removeClass("atonBTN-rec"))},uiAddButtonStreamFocus:e=>{R.uiAddButton(e,"focus",(()=>{ATON.Photon._bStreamFocus?(ATON.Photon.setFocusStreaming(!1),$("#btn-focus").removeClass("atonBTN-rec")):(ATON.Photon.setFocusStreaming(!0),$("#btn-focus").addClass("atonBTN-rec"))}),"Focus streaming ON/OFF"),ATON.Photon._bStreamFocus?$("#btn-focus").addClass("atonBTN-rec"):$("#btn-focus").removeClass("atonBTN-rec")},uiAddButtonMainVideoPanoPlayPause:e=>{R.uiAddButton(e,"playpause",(()=>{ATON._vpanoPlaying?ATON._elPanoVideo&&ATON._elPanoVideo.pause():ATON._elPanoVideo&&ATON._elPanoVideo.play()}),"360 Video play/pause"),ATON._elPanoVideo?$("#btn-playpause").show():$("#btn-playpause").hide()},uiAddButtonQR:e=>{ATON.Utils.isLocalhost()||R.uiAddButton(e,"qr",R.popupQR,"QR-code")},uiAddButtonScreenshot:e=>{R.uiAddButton(e,"sshot",R.popupScreenShot,"Screenshot")},uiAddButtonInfo:e=>{R.uiAddButton(e,"info",ATON.FE.popupSceneInfo,"Scene information"),$("#btn-info").hide()},uiAddButtonFullScreen:e=>{R.uiAddButton(e,"fullscreen",(()=>{ATON.toggleFullScreen()}),"Fullscreen"),R.uiSwitchButton("fullscreen",ATON.isFullscreen())},uiAddKeywordsArea:(e,t,o,i)=>{let r="";r+="Add keyword:

    ",r+="
    ",$("#"+e).html(r),R.uiAttachInputFilterID("idKWordInput"),$.getJSON(ATON.PATH_RESTAPI+"keywords/",(t=>{let o="";for(let e in t)o+="";o+="",$("#"+e).append(o)}));let a={},n=e=>{a[e]||(e=e.toLowerCase().trim(),$("#idKWordInput").val(""),a[e]=1,console.log("Added keyword "+e),o&&o(e),$("#idKWords").append("
    "+e+"
    "),$("#idkw-"+e).click((()=>{$("#idkw-"+e).remove(),a[e]=void 0,console.log("Removed keyword "+e),i&&i(e)})))};if(t)for(let e in t)n(t[e]);$("#idKWordInput").keypress((function(e){if("13"!=(e.keyCode?e.keyCode:e.which))return;let t=$("#idKWordInput").val().toLowerCase().trim();!t||t.length<3||n(t)})),$("#idKWadd").click((()=>{let e=$("#idKWordInput").val().toLowerCase().trim();!e||e.length<3||n(e)}))},uiAttachCollectionItemsToInput:(e,t)=>{let o="";$("#"+e).attr("list",e+"-list"),$("#"+e).attr("name",e+"-list"),$.getJSON(ATON.PATH_RESTAPI+"c/"+t+"/",(t=>{o+="";for(let e in t){let i=t[e];o+=""}o+="",$("#"+e).html(o)}))},getVRCclassFromID:e=>"atonVRCu"+e%6,_setupVRCevents:()=>{R._bVRCsetup||(ATON.on("VRC_IDassigned",(e=>{$("#btn-vrc").addClass(R.getVRCclassFromID(e)),ATON.SUI.setSelectorColor(ATON.Photon.color),ATON.plight.color=ATON.Photon.color,R.checkAuth((e=>{void 0!==e.username&&ATON.Photon.setUsername(e.username)}))})),ATON.on("VRC_SceneState",(e=>{let t=ATON.Photon.getNumUsers();t>1?$("#idVRCnumusers").html(t):$("#idVRCnumusers").html(""),console.log("Users: "+t)})),ATON.on("VRC_Disconnected",(()=>{$("#btn-vrc").attr("class","atonBTN"),ATON.SUI.setSelectorColor(ATON.MatHub.colors.defUI),ATON.MediaFlow.stopAllStreams(),$("#idVRCnumusers").html("")})),R._bVRCsetup=!0)},uiAddButtonPhoton:e=>{R.uiAddButton(e,"vrc",(()=>{ATON.Photon.isConnected()?R.popupVRC():ATON.Photon.connect()}),"Photon (collaborative session)"),$("#btn-vrc").append(""),R._setupVRCevents(),void 0!==ATON.Photon.uid?$("#btn-vrc").addClass(R.getVRCclassFromID(ATON.Photon.uid)):$("#btn-vrc").attr("class","atonBTN")}};R.uiAddButtonVRC=R.uiAddButtonPhoton,R.uiAddButtonUser=e=>{R.uiAddButton(e,"user",(()=>{R.popupUser()}),"User"),R.checkAuth((e=>{void 0!==e.username?$("#btn-user").addClass("switchedON"):$("#btn-user").removeClass("switchedON")}))},R.uiSetEditMode=(e,t)=>{ATON.SceneHub._bEdit=e,R.uiSwitchButton("edit",e),ATON._renderer.domElement,e?$("#"+t).addClass("atonToolbar-bg-edit"):$("#"+t).removeClass("atonToolbar-bg-edit")},R.uiAddButtonEditMode=e=>{R.uiAddButton(e,"edit",(()=>{R.checkAuth((t=>{void 0!==t.username?(ATON.SceneHub._bEdit?R.uiSetEditMode(!1,e):R.uiSetEditMode(!0,e),console.log("Persistent Edit Mode: "+ATON.SceneHub._bEdit)):R.popupUser()}))}),"Persistent Edit Mode"),ATON.SceneHub._bEdit?R.uiSwitchButton("edit",!0):R.uiSwitchButton("edit",!1)},R.uiAddProfile=(e,t)=>{"function"==typeof t&&(R._uiProfiles[e]=t)},R.uiLoadProfile=e=>{let t=R._uiProfiles[e];void 0!==t&&(t(),R._uiCurrProfile=e,console.log("Loaded UI Profile: "+R._uiCurrProfile))},R.getCurrentUIP=()=>R._uiCurrProfile,R.attachHandlerToButton=(e,t)=>{void 0!==t&&$("#"+e).click((()=>{t()}))},R.uiAttachInputFilterID=e=>{$("#"+e).on("keyup change input",(()=>{let t=$("#"+e).val(),o=new RegExp("[^A-Za-z0-9-_]","ig");$("#"+e).val(t.replace(o,""))}))},R.switchNode=(e,t,o)=>{let i;i=o===ATON.NTYPES.SEM?ATON.getSemanticNode(e):ATON.getSceneNode(e),void 0!==i&&(i.toggle(t),ATON.fire("FE_NodeSwitch",{nid:e,t:o,v:t}))},R.uiCreateGraph=e=>{let t=ATON.snodes;e===ATON.NTYPES.SEM&&(t=ATON.semnodes);let o="";for(let i in t){let r=t[i].visible?"checked":"";"."!==i&&(o+="'+i,o+="
    ")}return o},R.setupBasicUISounds=()=>{R.auLib={},R.auLib.switch=new Audio(ATON.PATH_RES+"audio/switch.wav"),R.auLib.switch.loop=!1},R.playAudioFromSemanticNode=e=>{if(void 0===e)return;let t=ATON.getSemanticNode(e);if(void 0===t)return;let o=t.getAudio();void 0!==o&&("string"!=typeof o||o.startsWith("data:audio")||(o=ATON.Utils.resolveCollectionURL(o)),void 0===R._auSemNode||null===R._auSemNode?R._auSemNode=new THREE.Audio(ATON.AudioHub._listener):R._auSemNode.stop(),ATON.AudioHub._loader.load(o,(e=>{R._auSemNode.setBuffer(e),R._auSemNode.setLoop(!1),R._auSemNode.play()})))},R.popupShow=(e,t)=>{if(R._bPopup)return!1;R._tPopup=Date.now();let o="atonPopup ";t&&(o+=t);let i="
    ";return i+=e+"
    ",R._bPopup=!0,ATON._bListenKeyboardEvents=!1,$("#idPopup").html(i),$("#idPopupContent").click((e=>{e.stopPropagation()})),$("#idPopup").show(),R.popupBlurBG>0&&(ATON._renderer.domElement.style.filter="blur("+R.popupBlurBG+"px)"),ATON._bPauseQuery=!0,$("#idTopToolbar").hide(),$("#idBottomToolbar").hide(),$("#idBottomRToolbar").hide(),$("#idPoweredBy").hide(),!0},R.popupClose=e=>{Date.now()-R._tPopup0&&(ATON._renderer.domElement.style.filter="none"),$("#idPopup").hide(),ATON._bPauseQuery=!1,$("#idTopToolbar").show(),$("#idBottomToolbar").show(),$("#idBottomRToolbar").show(),$("#idPoweredBy").show(),ATON.focusOn3DView())},R.subPopup=e=>{ATON.FE.popupClose(),e()},R.popupQR=()=>{let e="
    Share
    ";if(e+="


    ",!ATON.FE.popupShow("
    Share


    "))return;let t=window.location.href;new QRCode(document.getElementById("idQRcode"),t)},R.popupScreenShot=()=>{let e=ATON.Utils.takeScreenshot(256);R.checkAuth((t=>{let o="
    Capture
    ";o+="This is a preview of what your screenshot will look like:

    ",o+="
    ",o+="Resolution: px
    ",o+="
    Screenshot
    ",o+="
    Record video
    ",void 0!==t.username&&(o+="
    Set as Cover
    "),ATON.FE.popupShow(o)&&(ATON.MediaFlow._bScreenRec?$("#btnScreenRec").addClass("atonBTN-rec"):$("#btnScreenRec").removeClass("atonBTN-rec"),$("#btnScreenShot").click((()=>{let e=parseInt($("#isShotSize").val());e<100||(ATON.FE.popupClose(),ATON.Utils.takeScreenshot(e,"shot.png"))})),$("#btnScreenRec").click((()=>{ATON.MediaFlow._bScreenRec||ATON.MediaFlow.startScreenRecording(),ATON.FE.popupClose()})),$("#btnSetCover").click((()=>{ATON.FE.popupClose(),ATON.Utils.postJSON(ATON.PATH_RESTAPI+"cover/scene/",{sid:ATON.SceneHub.currID,img:e.src},(e=>{console.log(e)}))})))}))},R.popupVRC=()=>{let e="",t=ATON.Photon.getNumUsers();e+=t>1?"
    Collaborative Session ("+t+" users)
    ":"
    Collaborative Session
    ",e+="
    ",e+="",e+="",e+="
    LEAVE
    ",e+="
    ",e+="",ATON.FE.popupShow(e,"atonPopupLarge")&&(ATON.checkAuth((e=>{console.log(e),ATON.MediaFlow._bCamStream||ATON.FE.uiAddButton("idCollabTools","screenshare",(()=>{ATON.MediaFlow._bScreenStream?$("#btn-screenshare").addClass("atonBTN-rec"):$("#btn-screenshare").removeClass("atonBTN-rec"),ATON.MediaFlow.startOrStopScreenStreaming(),ATON.FE.popupClose()}),"Share your screen with other participants"),!ATON.MediaFlow._bScreenStream&&ATON.MediaFlow.hasVideoInput()&&ATON.FE.uiAddButton("idCollabTools","camera",(()=>{ATON.MediaFlow._bCamStream?$("#btn-camera").addClass("atonBTN-rec"):$("#btn-camera").removeClass("atonBTN-rec"),ATON.MediaFlow.startOrStopCameraStreaming(),ATON.FE.popupClose()}),"Share your camera with other participants"),ATON.MediaFlow._bScreenStream?$("#btn-screenshare").addClass("atonBTN-rec"):$("#btn-screenshare").removeClass("atonBTN-rec"),ATON.MediaFlow._bCamStream?$("#btn-camera").addClass("atonBTN-rec"):$("#btn-camera").removeClass("atonBTN-rec")})),void 0===ATON.Photon._username?($("#idVRCusername").show(),$("#idVRCusernameBTN").hide()):($("#idVRCusername").val(ATON.Photon._username),$("#idVRCusername").hide(),$("#idVRCusernameBTN").show()),void 0!==ATON.Photon.uid&&$("#idVRCusernameBTN").addClass("atonVRCu"+ATON.Photon.uid%6),$("#idChatBoxPopup").append(ATON.Photon._elChat),$("#idVRCmsg").keypress((e=>{if("13"==(e.keyCode?e.keyCode:e.which)){let e=$("#idVRCmsg").val();ATON.Photon.setMessage(e),$("#idVRCmsg").val("")}})),$("#idVRCusername").keypress((e=>{if("13"==(e.keyCode?e.keyCode:e.which)){let e=$("#idVRCusername").val();ATON.Photon.setUsername(e),$("#idVRCusername").hide(),$("#idVRCusernameBTN").html(ATON.Photon._username),$("#idVRCusernameBTN").show()}})),$("#idVRCusernameBTN").click((()=>{$("#idVRCusername").show(),$("#idVRCusernameBTN").hide()})),$("#idVRCdisconnect").click((()=>{ATON.Photon.disconnect(),ATON.FE.popupClose()})))},R.checkAuth=e=>{ATON.Utils.checkAuth((t=>{R._userAuth=t,void 0!==t.username?($("#btn-user").addClass("switchedON"),void 0===ATON.Photon._username&&ATON.Photon.setUsername(t.username)):$("#btn-user").removeClass("switchedON"),e&&e(t)}))},R.popupUser=()=>{R.checkAuth((e=>{if(void 0!==e.username){let t="
    ";if(t+="'"+e.username+"'

    ",Object.keys(R._uiProfiles).length>0){t+="UI Profile:


    "}if(t+="
    LOGOUT
    ",!ATON.FE.popupShow(t))return;R._uiCurrProfile&&(console.log(R._uiCurrProfile),$("#idUIProfiles").val(R._uiCurrProfile)),$("#idLogoutBTN").click((()=>{$.get(ATON.PATH_RESTAPI+"logout",(e=>{console.log(e),ATON.SceneHub.setEditMode(!1),R.uiSwitchButton("edit",!1),ATON.fire("Logout"),$("#btn-user").removeClass("switchedON")})),ATON.FE.popupClose()})),$("#idSHUscenes").click((()=>{ATON.Utils.goToURL("/shu/scenes/")})),$("#idSHUuser").click((()=>{ATON.Utils.goToURL("/shu/auth/")})),$("#idUIProfiles").on("change",(()=>{let e=$("#idUIProfiles").val();R.uiLoadProfile(e),ATON.FE.popupClose()}))}else{let e="
    ";if(e+="username:
    ",e+="password:
    ",e+="
    LOGIN
    ",!ATON.FE.popupShow(e))return;$("#idLoginBTN").click((()=>{let e=JSON.stringify({username:$("#idUsername").val(),password:$("#idPassword").val()});$.ajax({url:ATON.PATH_RESTAPI+"login",type:"POST",data:e,contentType:"application/json; charset=utf-8",dataType:"json",success:e=>{console.log(e),e&&(ATON.fire("Login",e),$("#btn-user").addClass("switchedON"),ATON.FE.popupClose())}}).fail((e=>{$("#idLoginBTN").html("LOGIN FAILED"),$("#idLoginBTN").attr("class","atonBTN atonBTN-red")}))}))}}))},R.popupSceneInfo=()=>{let e=ATON.SceneHub.getTitle();void 0===e&&(e=ATON.SceneHub.currID);let t=ATON.SceneHub.getDescription(),o="
    "+e+"
    ";t&&(o+="
    "+JSON.parse(t)+"
    "),o+="
    OK
    ",ATON.FE.popupShow(o)&&$("#btnOK").click((()=>{ATON._onUserInteraction(),ATON.FE.popupClose()}))},R.computeSelectorRanges=()=>{let e=ATON.bounds.radius;e<=0||(R._selRanges[0]=.001*e,R._selRefRadius=.01*e,R._selRanges[1]=.5*e)},R.popupSelector=()=>{let e="
    3D Selector
    ",t=ATON.SUI.getSelectorRadius(),o=ATON.Utils.getHumanReadableDistance(t);R.computeSelectorRanges(),e+="Radius ("+o+"):
    ",e+="",ATON.FE.popupShow(e,"atonPopupLarge")&&($("#idSelRad").val(t),$("#idSelRad").on("input change",(()=>{let e=parseFloat($("#idSelRad").val());ATON.SUI.setSelectorRadius(e),$("#idSelRadTxt").html(ATON.Utils.getHumanReadableDistance(e))})))},R.popupNav=()=>{let e="
    Navigation
    ";e+="
    ",e+="
    ",e+="
    Switch between first-person and orbit navigation mode
    ",e+="
    ",ATON.Utils.isConnectionSecure()&&(e+="
    ",e+="
    ",e+="
    Immersive VR mode
    ",e+="
    ",ATON.Utils.isMobile()&&(e+="
    ",e+="
    ",e+="
    Enable or disable device-orientation mode
    ",e+="
    ")),R.popupShow(e)&&(R.uiAddButtonFirstPerson("idNMfp"),R.uiAddButtonDeviceOrientation("idNMdevori"),R.uiAddButtonVR("idNMvr"))},R.popupModalToken=(e,t)=>{if(void 0===t)return;ATON.FE.popupClose();let o="
    Token Required
    ";e&&(o+=e),o+="

    ",o+="
    OK
    ",R.popupShow(o)&&$("#btnTokenOK").click((()=>{let e=$("#idTokStr").val();void 0===e||e.length<2||(ATON.FE.popupClose(),t(e))}))},R.popupNewNode=e=>{void 0===e&&(e=ATON.NTYPES.SCENE);let t="";e===ATON.NTYPES.SCENE&&(t="
    New Scene Node
    "),e===ATON.NTYPES.SEM&&(t="
    New Semantic Node
    "),t+="ID:
    ",t+="
    Add

    ",R.popupShow(t)&&$("#btnNewNID").click((()=>{let t=$("#idNID").val().trim();void 0===t||t.length<3||new ATON.Node(t,e).attachToRoot()}))};const y=R;let w={auType:"audio/wav",auStreamSegmentInterval:200,auStreamNumSegments:2,vidStreamSegmentInterval:300,vidStreamNumSegments:1,auMinVol:1,init:()=>{w._bAudioRecording=!1,w._bAudioStreaming=!1,w._bScreenRec=!1,w._blobOptAudio={type:"audio/wav"},w._blobOptVideo={type:"video/mp4"},w._cAuStream={audio:{channelCount:1,echoCancellation:!0,noiseSuppression:!0}},w._cAuRec={audio:{channelCount:1}},w._cScreenRec={video:{width:1280,height:720,framerate:30}},w._cScreenStream={video:{cursor:"always",width:{max:640},height:{max:360},framerate:15}},w._cCamStream={video:{width:{max:512},height:{max:512}}},w._oStream={audioBitsPerSecond:9e3,videoBitsPerSecond:5e5},w._aurec=void 0,w._sblob=void 0,w._schunks=[],w._bVideoStream=!1,w._vrec=void 0,w._scblob=void 0,w._scchunks=[],w._bCamStream=!1,w._bScreenStream=!1,w._setupFR(),w.detectDevices(),navigator.mediaDevices&&navigator.mediaDevices.addEventListener("devicechange",(e=>{w.detectDevices()})),w._vStreams={}},_setupFR:()=>{w._frAR=new window.FileReader,w._frAR.onloadend=()=>{let e=w._frAR.result;ATON.fire("AudioRecordCompleted",e),w._bAudioRecording=!1},w._frAS=new window.FileReader,w._frAS.onloadend=()=>{if(!w._bAudioStreaming)return;let e=w._frAS.result;ATON.Photon.socket.emit("UTALK",{audio:e,uid:ATON.Photon.uid}),e=null},w._frVS=new window.FileReader,w._frVS.onloadend=()=>{if(!w._bVideoStream)return;let e=w._frVS.result;ATON.Photon.socket.emit("UVIDEO",{video:e,uid:ATON.Photon.uid}),e=null}},detectDevices:()=>{w.audioInputDevices=[],w.videoInputDevices=[],navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices().then((e=>{for(let t in e){let o=e[t];"audioinput"===o.kind&&w.audioInputDevices.push(o),"videoinput"===o.kind&&w.videoInputDevices.push(o)}}))},hasAudioInput:()=>w.audioInputDevices.length>0,hasVideoInput:()=>w.videoInputDevices.length>0,isAudioRecording:()=>w._bAudioRecording,startRecording:()=>{w._bAudioRecording?console.log("Already recording."):navigator.mediaDevices.getUserMedia(w._cAuRec).then((e=>{w._aurec=new MediaRecorder(e),w._aurec.onstart=function(e){console.log("Start recording..."),w._bAudioRecording=!0,w._schunks=[]},w._aurec.ondataavailable=function(e){w._schunks.push(e.data)},w._aurec.onstop=function(e){console.log("Stop recording..."),w._sblob=new Blob(w._schunks,w._blobOptAudio),w._frAR.readAsDataURL(w._sblob)},w._aurec.start()})).catch((e=>{console.log(e)}))},stopRecording:()=>{w._aurec&&w._bAudioRecording&&w._aurec.stop()},startOrStopRecording:()=>{w._bAudioRecording?w.stopRecording():w.startRecording()},startAudioStreaming:()=>{navigator.mediaDevices.getUserMedia(w._cAuStream).then((e=>{w._aurec=new MediaRecorder(e,w._oStream),w._aurec.start(w.auStreamSegmentInterval),console.log("Start audio streaming"),w._aurec.onstart=e=>{w._bAudioStreaming=!0,w._bAudioRecording=!0,w._schunks=[]},w._aurec.ondataavailable=e=>{e.data.size<=0||(w._schunks.push(e.data),w._schunks.length{w._sblob=new Blob(w._schunks,w._blobOptAudio),w._frAS.readAsDataURL(w._sblob),w._bAudioStreaming&&w._aurec.start(w.auStreamSegmentInterval)}})).catch((e=>{console.log(e)}))},stopAudioStreaming:()=>{w._aurec&&w._bAudioStreaming&&("inactive"!==w._aurec.state&&w._aurec.stop(),console.log("Stop audio streaming"),w._bAudioStreaming=!1,w._bAudioRecording=!1,ATON.Photon.socket.emit("UAUDIOSTOP",{uid:ATON.Photon.uid}))},startOrStopAudioStreaming:()=>{w._bAudioRecording?w.stopAudioStreaming():w.startAudioStreaming()},startScreenRecording:()=>{w._bScreenRec||w._bScreenStream||navigator.mediaDevices.getDisplayMedia(w._cScreenRec).then((e=>{w._vrec=new MediaRecorder(e),w._scchunks=[],w._vrec.ondataavailable=e=>{e.data.size>0&&w._scchunks.push(e.data)},w._vrec.onstop=()=>{w._scblob=new Blob(w._scchunks,w._blobOptVideo),console.log(w._scblob.size),ATON.Utils.downloadBlob(w._scblob,"capture.mp4"),w._scchunks=[],w._bScreenRec=!1},w._vrec.start(200),w._bScreenRec=!0})).catch((e=>{console.log(e)}))},stopScreenRecording:()=>{w._bScreenRec&&(w._vrec.stop(),w._bVideoStream=!1,w._bScreenStream=!1,console.log("Stop screen recording"))},startScreenStreaming:()=>{navigator.mediaDevices.getDisplayMedia(w._cScreenStream).then((e=>{w.realizeOrUpdateVStream(e,w.stopScreenStreaming),w._vrec=new MediaRecorder(e,w._oStream),w._vrec.start(w.vidStreamSegmentInterval),console.log("Start screen streaming"),w._vrec.onstart=e=>{w._bVideoStream=!0,w._bScreenStream=!0,w._scchunks=[]},w._vrec.ondataavailable=e=>{e.data.size<1||(w._scchunks.push(e.data),w._scchunks.length{w._scblob=new Blob(w._scchunks,w._blobOptVideo),w._frVS.readAsDataURL(w._scblob),w._bVideoStream&&w._vrec.start(w.vidStreamSegmentInterval)}})).catch((e=>{console.log(e)}))},stopScreenStreaming:()=>{if(w._vrec&&w._bVideoStream&&(w._vrec.stop(),w._bVideoStream=!1,w._bScreenStream=!1,console.log("Stop screen streaming"),void 0!==ATON.Photon.uid)){let e=w.getVideoStream(ATON.Photon.uid);e.el.style.display="none",e.el.pause(),ATON.Photon.socket.emit("UVIDEOSTOP",{uid:ATON.Photon.uid})}},startOrStopScreenStreaming:()=>{w._bVideoStream?w.stopScreenStreaming():w.startScreenStreaming()},startCameraStreaming:()=>{w._bVideoStream||navigator.mediaDevices.getUserMedia(w._cCamStream).then((e=>{w.realizeOrUpdateVStream(e,w.stopCameraStreaming),w._vrec=new MediaRecorder(e,w._oStream),w._vrec.start(w.vidStreamSegmentInterval),console.log("Start camera streaming"),w._vrec.onstart=e=>{w._bVideoStream=!0,w._bCamStream=!0,w._scchunks=[]},w._vrec.ondataavailable=e=>{e.data.size<1||(w._scchunks.push(e.data),w._scchunks.length{w._scblob=new Blob(w._scchunks,w._blobOptVideo),w._frVS.readAsDataURL(w._scblob),w._bVideoStream&&w._vrec.start(w.vidStreamSegmentInterval)}})).catch((e=>{console.log(e)}))},stopCameraStreaming:()=>{if(w._vrec&&w._bVideoStream&&(w._vrec.stop(),w._bVideoStream=!1,w._bCamStream=!1,console.log("Stop camera streaming"),void 0!==ATON.Photon.uid)){let e=w.getVideoStream(ATON.Photon.uid);e.el.style.display="none",e.el.pause(),ATON.Photon.socket.emit("UVIDEOSTOP",{uid:ATON.Photon.uid})}},startOrStopCameraStreaming:()=>{w._bVideoStream?w.stopCameraStreaming():w.startCameraStreaming()},realizeOrUpdateVStream:(e,t)=>{let o=ATON.Photon.uid;if(void 0===o)return;let i=w.getOrCreateVideoStream(o,void 0,!0);i.el.playsinline=!0,i.el.style.display="inline-block",i.el.classList.add("atonVRCvidStream"),i.el.classList.add("atonVRCu"+o%6),t&&(i.el.onclick=t),i.el.srcObject=e},stopAllStreams:()=>{w.stopAudioStreaming(),w.stopCameraStreaming(),w.stopScreenStreaming()},getOrCreateVideoStream:(e,t,o)=>{if(w._vStreams[e])t&&(w._vStreams[e].el.src=t);else{w._vStreams[e]={};let i="vStream-"+e;if(o&&(i="uStream"+e,w._vStreams[e].uid=e),$("").appendTo("body"),w._vStreams[e].el=document.getElementById(i),t)if(t.endsWith("m3u8"))if(Hls.isSupported()){let o=new Hls;o.loadSource(t),o.attachMedia(w._vStreams[e].el)}else w._vStreams[e].el.src=t;else w._vStreams[e].el.src=t;o||(w._vStreams[e].el.loop=!0),w._vStreams[e].texStream=new THREE.VideoTexture(w._vStreams[e].el),w._vStreams[e].texStream.colorSpace=ATON._stdEncoding,w._vStreams[e].texStream.flipY=!1,w._vStreams[e].matStream=ATON.MatHub.materials.chromakey.clone(),w._vStreams[e].matStream.uniforms.tBase.value=w._vStreams[e].texStream}return w._vStreams[e]},getVideoStream:e=>w._vStreams[e],downloadVideoSnapshot:(e,t,o)=>{o||(o=1);let i=e.videoWidth*o,r=e.videoHeight*o,a=document.createElement("canvas");a.width=i,a.height=r,a.getContext("2d").drawImage(e,0,0,i,r),ATON.Utils.downloadImageFromCanvas(a,t)}};const M=w;let L={EARTH_R_KM:6371};L.EARTH_D_KM=2*L.EARTH_R_KM,L.init=()=>{L._bActive=!1,L._wpid=void 0,L._currGeoPos=new THREE.Vector2,L._GeoPOIs=[],L._currGeoPOI=void 0,L._closestGeoPOI=void 0,L._maxGeoError=40},L.enableGeoTracking=()=>{L._bActive||ATON.Utils.isConnectionSecure()&&navigator.geolocation&&(L._wpid=navigator.geolocation.watchPosition(L._onGeoPosition,L._onGeoError,{enableHighAccuracy:!0}),L._bActive=!0)},L.disableGeoTracking=()=>{L._bActive&&(navigator.geolocation.clearWatch(L._wpid),L._bActive=!1)},L.setMaxGeoError=e=>{e>0&&(L._maxGeoError=e)},L._onGeoError=()=>{console.log("Geolocation error")},L._onGeoPosition=e=>{if(!L._bActive)return;if(!e.coords)return;let t=e.coords.accuracy;t&&t>L._maxGeoError||(L._currGeoPos.x=e.coords.latitude,L._currGeoPos.y=e.coords.longitude,ATON.fire("GeoLocation",e),L._handleGeoPOIs())},L._handleGeoPOIs=()=>{let e=L._GeoPOIs.length;if(!(e<=0)){L._closestGeoPOIdist=void 0,L._closestGeoPOI=void 0;for(let t=0;t{if(L._bActive)return L._currGeoPos},L.geolocationFromLatLon=(e,t)=>new THREE.Vector2(e,t),L.geodistance_orig=(e,t)=>{let o=ATON.DEG2RAD*(t.x-e.x),i=ATON.DEG2RAD*(t.y-e.y),r=Math.sin(o/2)*Math.sin(o/2)+Math.cos(ATON.DEG2RAD*e.x)*Math.cos(ATON.DEG2RAD*t.x)*Math.sin(i/2)*Math.sin(i/2),a=2*Math.atan2(Math.sqrt(r),Math.sqrt(1-r));return L.EARTH_R_KM*a*1e3},L.geodistance=(e,t)=>{let o=.5-Math.cos((t.x-e.x)*ATON.DEG2RAD)/2+Math.cos(e.x*ATON.DEG2RAD)*Math.cos(t.x*ATON.DEG2RAD)*(1-Math.cos((t.y-e.y)*ATON.DEG2RAD))/2;return L.EARTH_D_KM*Math.asin(Math.sqrt(o))*1e3},L.addGeoPOI=(e,t)=>{let o={};return o.pos=new THREE.Vector2(e.x,e.y),o.radius=t,L._GeoPOIs.push(o),L._bActive||L.enableTracking(),L._handleGeoPOIs(),L._GeoPOIs.length-1},L.getGeoPOIbyIndex=e=>L._GeoPOIs[e],L.getClosestGeoPOI=()=>L._closestGeoPOI,L.getClosestGeoPOIdistance=()=>L._closestGeoPOIdist;const C=L;let H={};H._id=$("meta[name='aton\\:appid']").attr("content"),H._data={},H.setup=void 0,H.update=void 0,H._bRunning=!1,H._pDeps=[],H._fLoading=0,H._sendDataPatch=(e,t,o)=>new Promise(((i,r)=>{if(void 0===e)return void r("No storage ID specified");if(e.length<3)return void r("Storage ID too short");if(void 0===t)return void r("No storage patch");if(void 0===H._id)return void r("No app-ID");void 0===o&&(o=ATON.PATCH_ADD);let a={};a.wappid=H._id,a.fid=e,a.data=t,a.mode=o===ATON.PATCH_DEL?"DEL":"ADD";let n=JSON.stringify(a);$.ajax({url:ATON.PATH_RESTAPI+"patch/wapp",type:"POST",data:n,contentType:"application/json; charset=utf-8",dataType:"json",success:t=>{void 0!==t?(H._data[e]=t,i(t)):r("Error writing on server")}})})),H.getAppID=()=>H._id,H.addToStorage=(e,t)=>H._sendDataPatch(e,t,ATON.PATCH_ADD),H.deleteFromStorage=(e,t)=>H._sendDataPatch(e,t,ATON.PATCH_DEL),H.getStorage=e=>new Promise(((t,o)=>{void 0!==H._id?void 0!==e?$.getJSON(ATON.PATH_WAPPS+H._id+"/data/"+e+".json",(o=>{console.log(o),H._data[e]=o,t(o)})):o("No storage ID specified"):o()})),H.loadJSONConfig=(e,t)=>(ATON.Utils.getJSON(e,t),H),H.registerServiceWorker=e=>{if(e)return H.basePath&&(e=H.basePath+e),"serviceWorker"in navigator&&window.addEventListener("load",(()=>{navigator.serviceWorker.register(e).then((e=>console.log("PWA service worker registered"))).catch((e=>console.log("PWA service worker not registered",e)))})),H},H.requireFlares=e=>{if(e)return ATON._fReqList=e,console.log("Required Flares: "+ATON._fReqList),H},H.loadScene=(e,t)=>{void 0!==e&&ATON.SceneHub.load(ATON.PATH_RESTAPI2+"scenes/"+e,e,t)},H.realize=(e,t,o)=>{H.setup=e,H.update=t,H.params=new URLSearchParams(window.location.search),H.basePath=ATON.Utils.getBaseFolder(window.location.href.split("?")[0]),H.registerServiceWorker(o);let i=H.params.get("ff");if(i){let e=String(i).split(",");H.requireFlares(e)}return H},H.realizeAndRun=(e,t,o)=>{H.realize(e,t,o).run()},H.run=()=>!H._bRunning&&(H._bRunning=!0,H.setup?H.setup():(ATON.FE.realize(),console.log("App [Warn]: your App should define a setup() routine")),H.update&&(ATON.addUpdateRoutine(H.update),console.log("App: update routine registered")),ATON._fRequired<=0&&ATON.fire("AllFlaresReady"),!0);const D=H;let x={PASS_BASE:"p_base",PASS_AA:"p_aa",PASS_AO:"p_ao",PASS_SSR:"p_ssr",PASS_BLOOM:"p_bloom",PASS_DOF:"p_dof",PASS_GAMMA:"p_gamma",PASS_SOBEL:"p_sobel",init:()=>{if(void 0===ATON._renderer)return;let e=ATON._renderer.getPixelRatio(),t=ATON._renderer.getSize(new THREE.Vector2);const o=new THREE.WebGLRenderTarget(t.width*e,t.height*e,{minFilter:THREE.LinearFilter,magFilter:THREE.LinearFilter,format:THREE.RGBAFormat,colorSpace:ATON._stdEncoding});o.texture.name="EffectComposer.rt1",x.composer=new THREE.EffectComposer(ATON._renderer,o),x.passes={},ATON._renderer.autoClear=!1;let i=window.innerWidth*ATON._stdpxd,r=window.innerHeight*ATON._stdpxd;x.passes[x.PASS_BASE]=new THREE.RenderPass(ATON._mainRoot,ATON.Nav._camera),x.composer.addPass(x.passes[x.PASS_BASE]),x.passes[x.PASS_AO]=new THREE.SAOPass(ATON._mainRoot,ATON.Nav._camera,i,r),x.passes[x.PASS_AO].params.saoBias=1,x.passes[x.PASS_AO].params.saoScale=100,x.passes[x.PASS_AO].params.saoIntensity=.2,x.passes[x.PASS_BLOOM]=new THREE.UnrealBloomPass(new THREE.Vector2(i,r),1.5,.4,.85),x.passes[x.PASS_BLOOM].threshold=.9,x.passes[x.PASS_BLOOM].strength=1,x.passes[x.PASS_BLOOM].radius=1.2,x.passes[x.PASS_DOF]=new THREE.BokehPass(ATON._mainRoot,ATON.Nav._camera,{focus:5,aperture:.001,maxblur:.01,width:i,height:r}),x.composer.addPass(x.passes[x.PASS_AO]),x.composer.addPass(x.passes[x.PASS_DOF]),x.composer.addPass(x.passes[x.PASS_BLOOM]),x.togglePass(x.PASS_AO,!1),x.togglePass(x.PASS_BLOOM,!1),x.togglePass(x.PASS_DOF,!1)},togglePass:(e,t)=>{void 0!==x.composer&&(ATON.device.lowGPU||void 0!==x.passes[e]&&(x.passes[e].enabled=void 0===t?!x.passes[e].enabled:t))},isPassEnabled:e=>void 0!==x.composer&&(void 0!==x.passes[e]&&x.passes[e].enabled),setAOintensity:e=>{void 0!==x.composer&&void 0!==x.passes[x.PASS_AO]&&(x.passes[x.PASS_AO].params.saoIntensity=e)},getAOintensity:()=>void 0===x.composer||void 0===x.passes[x.PASS_AO]?0:x.passes[x.PASS_AO].params.saoIntensity,setBloomStrength:e=>{void 0!==x.composer&&void 0!==x.passes[x.PASS_BLOOM]&&(x.passes[x.PASS_BLOOM].strength=e)},getBloomStrength:()=>void 0===x.composer||void 0===x.passes[x.PASS_BLOOM]?0:x.passes[x.PASS_BLOOM].strength,setBloomThreshold:e=>{void 0!==x.composer&&void 0!==x.passes[x.PASS_BLOOM]&&(x.passes[x.PASS_BLOOM].threshold=e)},getBloomThreshold:()=>void 0===x.composer||void 0===x.passes[x.PASS_BLOOM]?0:x.passes[x.PASS_BLOOM].threshold,setDOFfocus:e=>{if(void 0===x.composer)return;if(void 0===x.passes[x.PASS_DOF])return;let t=x.passes[x.PASS_DOF].uniforms;void 0!==t&&(t.focus.value=e)},getDOFfocus:()=>{if(void 0===x.composer)return 0;if(void 0===x.passes[x.PASS_DOF])return 0;let e=x.passes[x.PASS_DOF].uniforms;return void 0===e?0:e.focus.value},setDOFaperture:e=>{if(void 0===x.composer)return;if(void 0===x.passes[x.PASS_DOF])return;let t=x.passes[x.PASS_DOF].uniforms;void 0!==t&&(t.aperture.value=e)}};const F=x;let V={STD_XPF_TRANSITION_DURATION:1,SEM_PREFIX:"XPF",SEMGROUP_PREFIX:"GXPF",init:()=>{V._list=[],V._iCurr=void 0,V._iNext=void 0,V._geom=void 0,V._mesh=void 0,V._mat=void 0,V._size=50,V._gSem=[],V._semIMGMasks={},V._semCanvas=void 0,V._semCTX=void 0,V._semCurr=void 0,V._shColor=new THREE.Color(0,0,1),V._shOpacity=.2,V._txCache={},V._pathMod=void 0,V._realizeBaseMat(),V._elVid=void 0,V._vidPlaying=!1},_realizeBaseMat:()=>{V._uniforms={tBase:{type:"t"},tSem:{type:"t"},tSemHint:{type:"t"},semHL:{type:"vec4",value:new THREE.Vector4(0,1,0,.15)},opacity:{type:"float",value:1},shColor:{type:"vec4",value:new THREE.Vector4(0,0,1,.2)},time:{type:"float",value:0}},V._mat=new THREE.ShaderMaterial({uniforms:V._uniforms,vertexShader:"\n varying vec3 vPositionW;\n varying vec3 vNormalW;\n varying vec3 vNormalV;\n varying vec2 vUv;\n\n void main(){\n vUv = uv;\n\n vPositionW = vec3( vec4( position, 1.0 ) * modelMatrix);\n vNormalW = normalize( vec3( vec4( normal, 0.0 ) * modelMatrix ) );\n vNormalV = normalize( vec3( normalMatrix * normal ));\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n ",fragmentShader:"\n varying vec3 vPositionW;\n\t\t varying vec3 vNormalW;\n varying vec3 vNormalV;\n varying vec2 vUv;\n\n uniform float time;\n uniform sampler2D tBase;\n uniform sampler2D tSem;\n uniform sampler2D tSemHint;\n //uniform sampler2D tDepth;\n\n uniform vec4 semHL, shColor;\n uniform float opacity;\n\n\t\t void main(){\n vec4 frag = texture2D(tBase, vUv);\n vec4 sem = texture2D(tSem, vUv);\n vec4 semH = texture2D(tSemHint, vUv);\n float shv = max( max(semH.r,semH.g), semH.b);\n\n float t = (1.0 * cos(time*2.0));\n t = clamp(t, 0.0,1.0);\n\n frag = mix(frag, semHL, (sem.r * semHL.a));\n\n frag = mix(frag, shColor, (t * shv * shColor.a));\n\n frag.a = opacity;\n\n gl_FragColor = frag;\n\t\t }\n ",depthTest:!1,depthWrite:!1}),V.setSemanticHintMapOpacity(.2)},setPathModifier:e=>{if(void 0!==e){V._pathMod=e;for(let t in V.list)V.list[t].setPathModifier(e)}},update:()=>{if(ATON.Nav.isTransitioning())return;if(V._list.length<1)return;let e,t,o,i,r=V._list.length,a=ATON.Nav._currPOV.pos,n=ATON.Nav._vDir;V._uniforms.time.value+=ATON._dt,void 0===V._dirLNode&&(V._dirLNode=new THREE.Vector3);for(let s=0;s.8&&(void 0===o||l{void 0===V._geom&&(V._group=new THREE.Group,ATON._rootVisibleGlobal.add(V._group),V._geom=new THREE.SphereGeometry(1,40,40),V._geom.scale(-V._size,V._size,V._size),V._geom.castShadow=!1,V._geom.receiveShadow=!1,V._mesh=new THREE.Mesh(V._geom,V._mat),V._mesh.frustumCulled=!1,V._mesh.renderOrder=-100,V._mesh.layers.enable(ATON.NTYPES.SCENE),V._group.add(V._mesh),V._mesh.visible=!1)},setBaseGeometry:e=>{},add:e=>{if(void 0===e)return;V.realizeBaseGeometry();let t=V._list.length;V._list.push(e);let o=e.getMesh();o&&V._group.add(o);let i=ATON.getOrCreateSemanticNode(V.SEMGROUP_PREFIX+t);V._gSem.push(i),i.attachToRoot(),t>0||(ATON.Nav.toggleLocomotionValidator(!1),ATON._bqScene=!0)},clear:()=>{V._iCurr=void 0,V._iNext=void 0,V._semCurr=void 0;for(let e=0;eV._list.length,getMainGroup:()=>V._group,getSemanticGroup:e=>V._gSem[e],getCurrentSemanticGroup:()=>{if(void 0!==V._iCurr)return V._gSem[V._iCurr]},_preloadBaseLayer:(e,t)=>{if(void 0!==V._txCache[e])return V._txCache[e];let o=V._list[e]._pathbaselayer;V._pathMod&&(o=V._pathMod(o)),ATON.Utils.textureLoader.load(o,(o=>{o.colorSpace=ATON._stdEncoding,o.generateMipmaps=!0,V._txCache[e]=o,t&&t(o)}))},_clearTexCache:()=>{if(void 0!==V._iCurr)for(let e in V._txCache)V._txCache[e]&&e!==V._iCurr&&(V._txCache[e].dispose(),V._txCache[e]=void 0)},_setBaseLayerTexture:(e,t)=>{V._mat.map=t,V._mat.needsUpdate=!0,V._mesh.position.copy(e.getLocation()),V._mesh.rotation.set(e.getRotation().x,e.getRotation().y,e.getRotation().z)},updateCurrentXPFbaseLayer:e=>{if(void 0===V._iCurr)return;let t=V._list[V._iCurr];if(void 0===t)return;let o=t._pathbaselayer;if(V._pathMod&&(o=V._pathMod(o)),ATON.Utils.isVideo(o)){if(void 0===V._elVid){let e="",$(e).appendTo("body"),V._elVid=document.getElementById("idXPFVideo"),V._elVid.onplaying=()=>{console.log("XPF VideoPano playing"),V._vidPlaying=!0},V._elVid.onpause=()=>{console.log("XPF VideoPano paused"),V._vidPlaying=!1},V._elVid.addEventListener("touchstart",(function(){V._elVid.play()})),enableInlineVideo(V._elVid)}let i=new THREE.VideoTexture(V._elVid);return i.colorSpace=ATON._stdEncoding,V._mat.map=i,V._mat.needsUpdate=!0,V._uniforms.tBase.value=i,V._mesh.position.copy(t.getLocation()),V._mesh.rotation.set(t.getRotation().x,t.getRotation().y,t.getRotation().z),void(e&&e(i))}ATON.Utils.textureLoader.load(o,(o=>{o.colorSpace=ATON._stdEncoding,o.generateMipmaps=!0,V._mat.map=o,V._mat.needsUpdate=!0,V._uniforms.tBase.value=o,V._mesh.position.copy(t.getLocation()),V._mesh.rotation.set(t.getRotation().x,t.getRotation().y,t.getRotation().z),e&&e(o)}))},playOrPauseXPFVideoStream:()=>{void 0!==V._elVid&&(V._vidPlaying?V._elVid.pause():V._elVid.play())},updateCurrentXPFsemLayer:e=>{let t=V._list.indexOf(e);t<0||t===V._iCurr&&V.loadSemanticMasksIfAny(V._iCurr)},setCurrentXPF:(e,t)=>{V.toggleSUI(e,!1),V._iCurr=e,V._iNext=void 0,V._mesh.visible=!0,V._gSem[e].show(),V.updateCurrentXPFbaseLayer(t),ATON.fire("CurrentXPF",e),ATON.fire("NextXPF",void 0),V.loadSemanticMasksIfAny(e)},toggleSUI:(e,t)=>{if(void 0===e)return;let o=V._list[e];void 0!==o&&o._lnode.toggleSUI(t)},loadSemanticMasksIfAny:e=>{let t=V._list[e];if(void 0!==t){V._semIMGMasks={},V._uniforms.tSemHint.value=0,void 0!==t._semHintURL&&(V._uniforms.tSemHint.value=ATON.Utils.textureLoader.load(t._semHintURL));for(let e in t._semMasksURLs){void 0===V._semCanvas&&(V._semCanvas=document.createElement("canvas"),V._semCanvas.width=2048,V._semCanvas.height=2048,V._semCTX=V._semCanvas.getContext("2d",{willReadFrequently:!0}));let o=t._semMasksURLs[e],i=new Image;i.src=o,V._semIMGMasks[e]=i}}},getXPFbyIndex:e=>V._list[e],getCurrentXPFindex:()=>V._iCurr,getCurrentXPF:()=>{if(void 0!==V._iCurr)return V._list[V._iCurr]},getNextXPFindex:()=>V._iNext,getNextXPF:()=>{if(void 0!==V._iNext)return V._list[V._iNext]},getDistanceToXPFindex:e=>{if(void 0===e)return;let t=V._list[e];return void 0!==t?ATON.Nav._currPOV.pos.distanceTo(t.getLocation()):void 0},showSUIonlyForXPF:e=>{let t=V._list.length;if(!(t<1))for(let o=0;o{let o=V._list[e];void 0!==o&&(void 0===t&&(t=V.STD_XPF_TRANSITION_DURATION),ATON.XR._bPresenting&&(t=0),V.setCurrentXPF(e),ATON.Nav.requestTransitionToLocomotionNode(o.getLocomotionNode(),t))},requestTransitionToTarget:(e,t,o)=>{if(void 0===e)return;let i=new ATON.POV;i.setTarget(e),i.setPosition(ATON.Nav._currPOV.pos),t&&i.setFOV(t),ATON.Nav.requestPOV(i,o)},requestTransitionToDirection:(e,t,o)=>{if(void 0===e)return;let i=new THREE.Vector3;i.x=e.x+ATON.Nav._currPOV.pos.x,i.y=e.y+ATON.Nav._currPOV.pos.y,i.z=e.z+ATON.Nav._currPOV.pos.z,V.requestTransitionToTarget(i,t,o)},setHomeXPF:e=>{let t=V._list[e];if(void 0===t)return;let o=t.getLocomotionNode(),i=(new ATON.POV).setPosition(o.pos).setTarget(o.pos.x,o.pos.y,o.pos.z+1);ATON.Nav.setHomePOV(i)},getSemanticMaskURLfromXPFindex:(e,t)=>{let o=V._list[e];if(void 0!==o)return o.getSemanticMaskURL(t)},getSemanticMaskURLfromCurrentXPF:e=>{if(void 0!==V._iCurr)return V.getSemanticMaskURLfromXPFindex(V._iCurr,e)},setSemanticColor:(e,t)=>{void 0===t&&(t=.15),V._uniforms.semHL.value=new THREE.Vector4(e.r,e.g,e.b,t)},setSemanticOpacity:e=>{void 0===e&&(e=.15),V._uniforms.semHL.value.w=e},setSemanticHintMapOpacity:e=>{void 0===e&&(e=.2),V._shOpacity=e,V._uniforms.shColor.value.w=e},setSemanticHintMapColor:(e,t)=>{void 0!==e&&(V._shColor=e,V._uniforms.shColor.value.x=e.r,V._uniforms.shColor.value.y=e.g,V._uniforms.shColor.value.z=e.b,void 0!==t&&V.setSemanticHintMapOpacity(t))},querySemanticMasks:()=>{if(void 0===V._semCTX)return;if(void 0===ATON._queryDataScene)return;if(void 0===ATON._queryDataScene.uv)return;let e,t=V._semCTX,o=ATON._queryDataScene.uv;for(let i in V._semIMGMasks){let r=V._semIMGMasks[i],a=parseInt(r.width*o.x),n=parseInt(r.height*(1-o.y));if(t.drawImage(r,0,0),t.getImageData(a,n,1,1).data[0]>127){e=i;break}}if(void 0===e)return void 0!==V._semCurr&&ATON.fire("SemanticMaskLeave",V._semCurr),V._semCurr=void 0,V._uniforms.tSem.value=0,V._uniforms.shColor.value.w=V._shOpacity,void(V._mat.needsUpdate=!0);V.highlightSemanticMaskInCurrentXPF(e),V._semCurr=e},highlightSemanticMaskInCurrentXPF:e=>{if(void 0===e)return void 0!==V._semCurr&&ATON.fire("SemanticMaskLeave",V._semCurr),V._semCurr=void 0,V._uniforms.tSem.value=0,V._uniforms.shColor.value.w=V._shOpacity,void(V._mat.needsUpdate=!0);if(V._semCurr===e)return;let t=V.getSemanticMaskURLfromCurrentXPF(e);V._uniforms.tSem.value=ATON.Utils.textureLoader.load(t),V._mat.needsUpdate=!0,ATON.fire("SemanticMaskHover",e),V._uniforms.shColor.value.w=0,void 0!==V._semCurr&&ATON.fire("SemanticMaskLeave",V._semCurr)},loadFromPhotoscanFile:(e,t)=>{if(void 0===e)return;e=ATON.Utils.resolveCollectionURL(e);let o=ATON.Utils.getBaseFolder(e),i=0;$.ajax({url:e,dataType:"text",success:function(e){e=e.split(/\r\n|\n/);for(let t in e){let r=e[t];if(!r.startsWith("#")){let e=r.split(/\s{2,}|\t/);if(e.length>10){let t=new ATON.XPF,r=o+e[0],a=parseFloat(e[1]),n=parseFloat(e[2]),s=parseFloat(e[3]),l=ATON.DEG2RAD*parseFloat(e[4]);ATON.DEG2RAD,parseFloat(e[5]),ATON.DEG2RAD,parseFloat(e[6]),t.setLocation(a,s,-n),t.setBaseLayer(r),t.setRotation(0,-l,0),V.add(t),i++}}}console.log("Num panoramas parsed: "+i),t&&t()}})}};const I=V;let U={init:()=>{U.list=[]},anyCopyrightFound:()=>U.list.length>0,extract:e=>{if(void 0===e)return;if(void 0===e.asset)return;let t={};if(e.asset.copyright&&(t.copyright=e.asset.copyright),e.asset.extras)for(let o in e.asset.extras)"string"==typeof e.asset.extras[o]&&(t[o]=e.asset.extras[o]);if(U.extractXMP3DC(e,t),0!==Object.keys(t).length){e.asset.generator&&(t.generator=e.asset.generator);for(let e in U.list){let o=U.list[e];if(U.compare(t,o))return}U.list.push(t),console.log(t)}},compare:(e,t)=>{if(void 0===e||void 0===t)return!1;const o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(let i of o)if(e[i]!==t[i])return!1;return!0},extractXMP3DC:(e,t)=>{if(void 0===e||void 0===t)return;if(!e.userData)return;let o=e.userData.gltfExtensions;if(!o)return;if(!o.KHR_xmp)return;let i=o.KHR_xmp.packets;if(!i)return;let r=i[0],a="en-us";r["model3d:spdxLicense"]&&(t.license=r["model3d:spdxLicense"]),r["dc:date"]&&(t.date=r["dc:date"]),r["dc:title"]&&(t.title=r["dc:title"][a]),r["dc:description"]&&(t.description=r["dc:description"][a]),r["dc:rights"]&&(t.rights=r["dc:rights"][a]),r["dc:source"]&&(t.source=r["dc:source"]),r["dc:subject"]&&(t.subject=r["dc:subject"]),r["dc:type"]&&(t.type=r["dc:type"]),r["xmpRights:Owner"]&&(t.owner=r["xmpRights:Owner"]),r["xmp:CreatorTool"]&&(t.creatorTool=r["xmp:CreatorTool"])}};const k=U;let B={REST_API_CESIUMION_DEF_TOKEN:"https://api.cesium.com/v2/tokens/default",THRES_ORI:.01,THRES_POS:1e-6,init:()=>{B._tsets=[],B._tsET=20,B._tsB=!1,B._bTileBVH=!0,B._tsTasks=[],B.tsSchedCB=e=>{B._tsTasks.push(e)},B._tseBase=8,B.estimateTSErrorTarget(),B._tsuSync=0,B._bPCs=!1,B._pqLRU=void 0,B._pqDownload=void 0,B._pqParse=void 0,B._numTilesLoaded=0,B._numTSLoaded=0},clear:()=>{for(let e in B._tsets)B._tsets[e]=null;B._tsets=[],B._bPCs=!1},getTSetsErrorTarget:()=>B._tsET,setTSetsErrorTarget:e=>{B._tsET=e;const t=B._tsets.length;if(!(t<=0))for(let o=0;o{B._tsB=e;const t=B._tsets.length;if(!(t<=0))for(let o=0;o{void 0===e&&(e=ATON.Nav._camera);const t=B._tsets.length;if(!(t<=0))for(let o=0;o{B._tseBase=e,console.log(B._tseBase),B.estimateTSErrorTarget()},estimateTSErrorTarget:()=>{let e=B._tseBase;(ATON.device.lowGPU||ATON.device.isMobile)&&(e+=4),ATON.XR._bPresenting&&(e+=3),e<1&&(e=1),e>25&&(e=25),console.log("Estimated TSet error target: "+e),B.setTSetsErrorTarget(e)},loadTileSetFromURL:(e,t,o)=>{if(void 0===t)return;let i=new TILES.TilesRenderer(e);if(!i)return;ATON._assetReqNew(e),i.displayBoxBounds=B._tsB,i.fetchOptions.mode="cors",i.registerPlugin(new TILES.ImplicitTilingPlugin),o&&(i.fetchOptions.headers={},i.fetchOptions.headers.Authorization=`Bearer ${o.accessToken}`,i.preprocessURL=e=>(e=new URL(e),/^http/.test(e.protocol)&&e.searchParams.append("v",o.v),e.toString())),i.errorTarget=B._tsET,i.optimizeRaycast=!1,void 0===B._pqLRU?(i.downloadQueue.schedulingCallback=B.tsSchedCB,i.parseQueue.schedulingCallback=B.tsSchedCB,i.downloadQueue.maxJobs=6,i.parseQueue.maxJobs=1,B._pqLRU=i.lruCache,B._pqDownload=i.downloadQueue,B._pqParse=i.parseQueue):(i.lruCache=B._pqLRU,i.downloadQueue=B._pqDownload,i.parseQueue=B._pqParse),i.setCamera(ATON.Nav._camera),i.setResolutionFromRenderer(ATON.Nav._camera,ATON._renderer),i.manager.addHandler(/\.gltf$/,ATON._aLoader),i.manager.addHandler(/\.ktx2$/,ATON._ktx2Loader),i.manager.addHandler(/\.drc$/,ATON._dracoLoader),t.add(i.group),$.getJSON(e,(e=>{ATON.CC.extract(e)}));let r=new THREE.Box3,a=new THREE.Sphere;new THREE.Matrix4,new THREE.Vector3;let n=!1;i.addEventListener("load-tile-set",(()=>{if(console.log("TileSet loaded"),ATON._assetReqComplete(e),B._numTSLoaded++,o||t.bUseGeoCoords){console.log("TileSet using GeoCoords"),i.getBoundingSphere(a);const e=a.center.clone(),t=e.length(),o=e.normalize(),r=new THREE.Vector3(0,1,0),n=ATON.Utils.rotationBetweenDirections(o,r);i.group.quaternion.x=n.x,i.group.quaternion.y=n.y,i.group.quaternion.z=n.z,i.group.quaternion.w=n.w,i.group.position.y=-t}else i.getBoundingBox(r)?(r.getBoundingSphere(a),t.autocenter?(r.getCenter(i.group.position),i.group.position.multiplyScalar(-1)):void 0===ATON.Nav.homePOV&&ATON.Nav.computeAndRequestDefaultHome(.5,void 0,a)):i.getBoundingSphere(a)&&(t.autocenter?(i.group.position.copy(a.center),i.group.position.multiplyScalar(-1)):void 0===ATON.Nav.homePOV&&ATON.Nav.computeAndRequestDefaultHome(.5,void 0,a));ATON.Utils._visitorCP(i.group)})),i.addEventListener("load-model",(e=>{let o=e.scene;B._numTilesLoaded++,o.traverse((e=>{if(e.layers.enable(t.type),e.isMesh?(e.castShadow=!0,e.receiveShadow=!0,B._bTileBVH&&e.geometry&&(e.geometry.computeVertexNormals(),e.geometry.computeBoundsTree({}),ATON.Utils._bvhBounds>0&&ATON.Utils._addBVHbounds(e,ATON.Utils._bvhBounds)),ATON._bqScene=!0):(n=!0,B._bPCs=!0,e.layers.disable(t.type),e.raycast=ATON.Utils.VOID_CAST,e.material=ATON.MatHub.materials.point),t.userData.cMat&&(e.material=t.userData.cMat),e.material){let t=e.material.map;t&&(t.minFilter=THREE.LinearMipmapLinearFilter,t.magFilter=THREE.LinearFilter,t.colorSpace=ATON._stdEncoding)}})),ATON.fire("TileLoaded",o),ATON.Utils._visitorCP(o)})),i.addEventListener("dispose-model",((e,t)=>{ATON.Utils.cleanupVisitor(e.scene),e=null})),n||ATON.Utils.setPicking(t,t.type,!0),B._tsets.push(i)},loadCesiumIONAsset:(e,t)=>{let o=ATON.getAPIToken("cesium.ion");if(null==o&&(console.log("A valid Cesium ION token is required"),o=prompt("Please enter a valid Cesium ION token:"),null==o||""==o))return;let i=new URL(`https://api.cesium.com/v1/assets/${e}/endpoint`);i.searchParams.append("access_token",o),fetch(i,{mode:"cors"}).then((e=>e.ok?e.json():Promise.reject(`${e.status} : ${e.statusText}`))).then((e=>{i=new URL(e.url);const r=i.searchParams.get("v");B.loadTileSetFromURL(i.toString(),t,{accessToken:e.accessToken,v:r}),ATON.setAPIToken("cesium.ion",o)}))},update:()=>{const e=B._tsets.length;if(e<1)return;for(let t=0;t!!ATON.Nav._bControl&&(ATON.Nav._dOri>B.THRES_ORI||ATON.Nav._dPos>B.THRES_POS)};const q=B;let z={DELIM_CSV:",",DELIM_TSV:"\t",init:()=>{},loadTextFromURL:(e,t)=>($.get(e,(e=>{t&&t(e)})),z),loadValuesFromFile:(e,t,o,i)=>{let r={};void 0===o&&(o=-1),$.get(e,(e=>{let a=e.split("\n"),n=a.length,s=[],l=!1;for(let e=0;e0)if(l){let a=i.split(t),n=o>=0?a[o]:e;r[n]={};for(let e=0;e{z.loadValuesFromFile(e,z.DELIM_CSV,t,o)},loadTSV:(e,t,o)=>{z.loadValuesFromFile(e,z.DELIM_TSV,t,o)}};const X=z;let G={init:()=>{G._base=ATON.PATH_RESTAPI2},setBaseDomain:e=>e.startsWith("http")?(G._base=e,G):G,get:(e,t,o)=>(e.startsWith("http")||(e=G._base+e),fetch(e,{credentials:"include"}).then((e=>{e.ok?e.json().then(t).catch((e=>{console.log("ERROR: "+e),o&&o(e)})):o&&o()})),G),post:(e,t,o,i)=>(e.startsWith("http")||(e=G._base+e),fetch(e,{method:"POST",body:JSON.stringify(t),credentials:"include",headers:{"Content-type":"application/json; charset=UTF-8"}}).then((e=>{e.ok?e.json().then(o).catch((e=>{console.log("ERROR: "+e),i&&i(e)})):i&&i()})),G),put:(e,t,o,i)=>(e.startsWith("http")||(e=G._base+e),fetch(e,{method:"PUT",body:JSON.stringify(t),credentials:"include",headers:{"Content-type":"application/json; charset=UTF-8"}}).then((e=>{e.ok?e.json().then(o).catch((e=>{console.log("ERROR: "+e),i&&i(e)})):i&&i()})),G),patch:(e,t,o,i)=>(e.startsWith("http")||(e=G._base+e),fetch(e,{method:"PATCH",body:JSON.stringify(t),credentials:"include",headers:{"Content-type":"application/json; charset=UTF-8"}}).then((e=>{e.ok?e.json().then(o).catch((e=>{console.log("ERROR: "+e),i&&i(e)})):i&&i()})),G),delete:(e,t,o)=>(e.startsWith("http")||(e=G._base+e),fetch(e,{method:"DELETE",credentials:"include"}).then((e=>{e.ok?e.json().then(t).catch((e=>{console.log("ERROR: "+e),o&&o(e)})):o&&o()})),G),login:(e,t,o,i)=>G.post("login",{username:e,password:t},(e=>{e&&o?o(e):i&&i()}),(e=>{i&&i()})),logout:(e,t)=>G.get("logout",e,t)};const W=G;let j={};window.ATON=j,j.Node=t,j.POV=class{constructor(e){this.pos=new THREE.Vector3(1,0,0),this.target=new THREE.Vector3(0,0,0),this.up=ATON.STD_UPVECTOR,this.fov=void 0,this.nextPOV=void 0,this.prevPOV=void 0,this.as(e)}as(e){if(void 0!==e)return ATON.Nav.povlist[e]=this,this.id=e,this}setPosition(e,t,o){return e instanceof THREE.Vector3?this.pos.copy(e):this.pos.set(e,t,o),this}setTarget(e,t,o){return e instanceof THREE.Vector3?this.target.copy(e):this.target.set(e,t,o),this}setFOV(e){return this.fov=e,this}addKeywords(e){let t=e.split(",");void 0===this.kwords&&(this.kwords={});for(let e in t){let o=t[e].trim();o.length>0&&(this.kwords[o]=!0)}return this}hasKeyword(e){if(void 0!==this.kwords)return void 0!==this.kwords[e]}setNextPOV(e){if(e)return this.nextPOV=e,this}setPrevPOV(e){if(e)return this.prevPOV=e,this}},j.LightProbe=class{constructor(e,t,o){this.pos=new THREE.Vector3(0,0,0),this._res=void 0!==e?e:128,this._near=void 0!==t?t:1,this._far=void 0!==o?o:ATON.Nav.STD_FAR,this._envtex=void 0,this._CC=void 0,void 0===ATON._pmremGenerator&&(ATON._pmremGenerator=new THREE.PMREMGenerator(ATON._renderer),ATON._pmremGenerator.compileCubemapShader())}setPosition(e,t,o){return e instanceof THREE.Vector3?this.pos.copy(e):this.pos.set(e,t,o),this}setNear(e){return this._near=e,this}setFar(e){return this._far=e,this}_createCCtarget(){this._CCtarget||(this._CCtarget=new THREE.WebGLCubeRenderTarget(this._res,{format:THREE.RGBEFormat,generateMipmaps:!0,minFilter:THREE.LinearMipmapLinearFilter,colorSpace:ATON._stdEncoding}))}update(){return this._envtex&&this._envtex.dispose(),ATON._rootVisibleGlobal.position.set(-this.pos.x,-this.pos.y,-this.pos.z),ATON._render(),this._envtex=ATON._pmremGenerator.fromScene(ATON._mainRoot,0,this._near,this._far).texture,ATON._rootVisibleGlobal.position.set(0,0,0),ATON._renderer.shadowMap.enabled&&ATON._dMainL&&(ATON._dMainL.shadow.needsUpdate=!0),this}getEnvTex(){return this._envtex}assignToNode(e){}},j.XPF=class{constructor(e){this.id=e,this._geom=void 0,this._mesh=void 0,this._pathbaselayer=void 0,this._size=20,this._location=new THREE.Vector3(0,0,0),this._rotation=new THREE.Vector3(0,0,0),this._lnode=ATON.Nav.addLocomotionNode(this._location),this._pathMod=void 0,this._semMasksURLs={},this._semHintURL=void 0}setSize(e){this._size=e}realizeSUI(){return void 0===this._lnode||this._lnode.realizeSUI(),this}realizeGeometry(){return void 0!==this._geom||(this._geom=new THREE.SphereGeometry(1,60,60),this._geom.scale(-this._size,this._size,this._size),this._geom.castShadow=!1,this._geom.receiveShadow=!1,this._mat=new THREE.MeshBasicMaterial({depthTest:!1,depthWrite:!1}),this._mesh=new THREE.Mesh(this._geom,this._mat),this._mesh.frustumCulled=!1,this._mesh.renderOrder=-100),this}getMesh(){return this._mesh}getLocomotionNode(){return this._lnode}setRotation(e,t,o){return e instanceof THREE.Vector3?this._rotation.copy(e):this._rotation.set(e,t,o),void 0===this._mesh||this._mesh.rotation.copy(this._rotation),this}getRotation(){return this._rotation}setLocation(e,t,o){return e instanceof THREE.Vector3?this._location.copy(e):this._location.set(e,t,o),this._lnode&&this._lnode.setLocation(this._location),void 0===this._mesh||this._mesh.position.copy(this._location),this}getLocation(){return this._location}hasGeometry(){return void 0!==this._geom}setPathModifier=e=>(this._pathMod=e,this);updateBaseLayer(){}setBaseLayer(e){if(void 0===e)return this;this._pathbaselayer=ATON.Utils.resolveCollectionURL(e);let t=this;return this._pathMod&&(this._pathbaselayer=this._pathMod(this._pathbaselayer)),this.hasGeometry()?(ATON.Utils.isVideo(this._pathbaselayer)||ATON.Utils.textureLoader.load(t._pathbaselayer,(e=>{e.colorSpace=ATON._stdEncoding,e.generateMipmaps=!0,t._mat.map=e,t._mat.map.needsUpdate=!0,t._mat.needsUpdate=!0,console.log("XPF base layer "+t._pathbaselayer+" loaded")})),this):this}setSemanticMask(e,t){return void 0===e||(this._semMasksURLs[e]=ATON.Utils.resolveCollectionURL(t),ATON.XPFNetwork.updateCurrentXPFsemLayer(this)),this}removeSemanticMask(e){return void 0===e||(this._semMasksURLs[e]=void 0,ATON.XPFNetwork.updateCurrentXPFsemLayer(this)),this}removeAllSemanticMasks(){return this._semMasksURLs={},this}getSemanticMaskURL(e){return this._semMasksURLs[e]}setSemanticHintMap(e){return void 0===e||(this._semHintURL=ATON.Utils.resolveCollectionURL(e),ATON.XPFNetwork.updateCurrentXPFsemLayer(this)),this}removeSemanticHintMap(){return this._semHintURL=void 0,ATON.XPFNetwork.updateCurrentXPFsemLayer(this),this}},j.Flare=class{constructor(e){this._id=void 0,this._bDeployed=!1,e&&this.register(e)}register(e){return e&&(this._id=e),ATON.addFlare(this),this}getID(){return this._id}log(e){return this._id?console.log("[Flare "+this._id+"] "+e):console.log("[Flare]"+e),this}setSetup(e){return this.setup=e,this}setUpdate(e){return this.update=e,this}},j.EventHub=i,j.Utils=s,j.CC=k,j.SceneHub=d,j.MatHub=a,j.Nav=h,j.AudioHub=u,j.XR=v,j.SUI=N,j.UI=A,j.Photon=P,j.SemFactory=E,j.FE=y,j.MediaFlow=M,j.Phygital=C,j.App=D,j.FX=F,j.XPFNetwork=I,j.MRes=q,j.ASCII=X,j.REQ=W,j.STD_UPVECTOR=new THREE.Vector3(0,1,0),j.ROOT_NID=".",j.RAD2DEG=180/Math.PI,j.DEG2RAD=Math.PI/180,j.PATCH_ADD=0,j.PATCH_DEL=1,j.NTYPES={},j.NTYPES.SCENE=3,j.NTYPES.SEM=4,j.NTYPES.UI=5,j.SHADOWS_NEAR=.1,j.SHADOWS_FAR=100,j.SHADOWS_SIZE=50,j.SHADOWS_RES=1024,j.AMB_L=.2,j.SCALE_DEFAULT=0,j.SCALE_BIG=5,j.SCALE_VERYBIG=10,j.SCALE_SMALL=-5,j.SCALE_VERYSMALL=-10,j.Flares={},j._fReqList=[],j._bInitialized=!1,j._b2D=!1,j._resMappers=[],j._clipPlanes=[],j.setBaseURL=e=>{j.BASE_URL=e,j.PATH_RESTAPI=`${j.BASE_URL}/api/`,j.PATH_RESTAPI_SCENE=`${j.PATH_RESTAPI}scene/`,j.PATH_RESTAPI2=`${j.BASE_URL}/api/v2/`,j.PATH_WAPPS=`${j.BASE_URL}/a/`,j.PATH_FLARES=`${j.BASE_URL}/flares/`,j.PATH_DRACO_LIB=`${j.BASE_URL}/dist/draco/`,j.PATH_BASIS_LIB=`${j.BASE_URL}/dist/basis/`,j.PATH_COLLECTION=`${j.BASE_URL}/collections/`,j.PATH_SCENES=`${j.BASE_URL}/scenes/`,j.PATH_RES=`${j.BASE_URL}/res/`,j.PATH_FE=`${j.BASE_URL}/s/`},j.setBaseURL(window.location.origin),j.setPathCollection=e=>{j.PATH_COLLECTION=e},j.setPathScenes=e=>{j.PATH_SCENES=e},j.setAsStandalone=e=>{e||(e="../"),j.PATH_DRACO_LIB=e+"dist/draco/",j.PATH_BASIS_LIB=e+"dist/basis/",j.PATH_RES=e+"res/"},j.addResourceMapper=e=>{j._resMappers.push(e)},j._onUserInteraction=()=>{j._elPanoVideo&&!j._vpanoPlaying&&j._elPanoVideo.play(),j.XPFNetwork._elVid&&!j.XPFNetwork._vidPlaying&&j.XPFNetwork._elVid.play(),j.AudioHub._listener&&j.AudioHub._listener.context&&"suspended"===j.AudioHub._listener.context.state&&j.AudioHub._listener.context.resume();for(let e in j.MediaFlow._vStreams){let t=j.MediaFlow._vStreams[e].el;t.playing||t.uid||t.play()}},j.rewindAllPlayingMedia=()=>{j._elPanoVideo&&(j._elPanoVideo.currentTime=0),j.XPFNetwork._elVid&&(j.XPFNetwork.currentTime=0),j._auMain&&(j._auMain.stop(),j._auMain.play());for(let e in j.MediaFlow._vStreams){let t=j.MediaFlow._vStreams[e].el;t.playing&&!t.uid&&(t.stop(),t.play())}},j.checkAuth=(e,t)=>{j.REQ.get("user",(o=>{o&&e?e(o):t&&t()}),(e=>{t&&t()}))},j._setupBaseListeners=()=>{let e,t,o=j._renderer.domElement;window.addEventListener("resize",j._onResize,!1),window.onorientationchange=j._readDeviceOrientationMode,document.addEventListener("fullscreenchange",(e=>{j._bFS=!!document.fullscreenElement,j.fire("Fullscreen",j._bFS),j._bFS?console.log("Now fullscreen"):console.log("Exit fullscreen")})),void 0!==document.hidden?(e="hidden",t="visibilitychange"):void 0!==document.mozHidden?(e="mozHidden",t="mozvisibilitychange"):void 0!==document.msHidden?(e="msHidden",t="msvisibilitychange"):void 0!==document.webkitHidden&&(e="webkitHidden",t="webkitvisibilitychange"),void 0!==e&&document.addEventListener(t,(()=>{if(document[e]){if(j.XR._bPresenting)return;console.log("Suspend"),j.renderPause()}else{if(j.XR._bPresenting)return;console.log("Resume"),j.renderResume()}}),!1),o.addEventListener("mousemove",j._updateScreenMove,!1),o.addEventListener("mousedown",(e=>{1===e.button&&j.fire("MouseMidButton"),2===e.button&&j.fire("MouseRightButton")})),o.addEventListener("wheel",j._onMouseWheel,!1),j._bPointerDown=!1,Hammer(o).on("doubletap",(e=>{j._bPointerDown=!1,j._onUserInteraction(),j.fire("DoubleTap",e.srcEvent)})),Hammer(o).on("tap",(e=>{if(j._bPointerDown=!1,j._onUserInteraction(),j._updateScreenMove(e.srcEvent),j._handleQueries(),j.fire("Tap",e.srcEvent),void 0===j._hoveredUI)return;let t=j.getUINode(j._hoveredUI);t&&t.onSelect&&t.onSelect()})),j.on("DoubleTap",(e=>{j.defaultDoubleTapFromScreenCoords(e)})),j._kModShift=!1,j._kModCtrl=!1,j._bListenKeyboardEvents=!0,window.addEventListener("keydown",(e=>{j._onUserInteraction(),"Shift"===e.key&&(j._kModShift=!0),"Control"===e.key&&(j._kModCtrl=!0),j._bListenKeyboardEvents&&j.fire("KeyPress",e.key)}),!1),window.addEventListener("keyup",(e=>{"Shift"===e.key&&(j._kModShift=!1),"Control"===e.key&&(j._kModCtrl=!1),j._bListenKeyboardEvents&&j.fire("KeyUp",e.key)}),!1),j.on("KeyPress",(e=>{if("+"===e){let e=j.Nav.getFOV()+1;j.Nav.setFOV(e)}if("-"===e){let e=j.Nav.getFOV()-1;j.Nav.setFOV(e)}}))},j._onResize=()=>{if(j.Nav._camera.aspect=window.innerWidth/window.innerHeight,j.Nav._camera.updateProjectionMatrix(),j._renderer.setSize(window.innerWidth,window.innerHeight),j.FX.composer&&(j.FX.composer.setSize(window.innerWidth,window.innerHeight),j.FX.passes[j.FX.PASS_AA])){let e=j.FX.passes[j.FX.PASS_AA].material.uniforms;e&&e.resolution.value.set(1/window.innerWidth,1/window.innerHeight)}console.log("onResize")},j._onMouseWheel=e=>{e.preventDefault(),j.fire("MouseWheel",e.deltaY)},j.focusOn3DView=()=>{j._renderer.domElement.focus()},j._SUIactivation=()=>{const e=j.getUINode(j._hoveredUI);return void 0!==e&&void 0!==e.onSelect&&(e.onSelect(),!0)},j._stdActivation=()=>{if(j._SUIactivation())return;if(!j.Nav._bControl)return;if(void 0!==j.XPFNetwork._semCurr&&j.fire("SemanticMaskSelect",j.XPFNetwork._semCurr),j.XR._bPresenting){if(h.requestTransitionToLocomotionNodeInSightIfAny(j.XR.STD_TELEP_DURATION))return;return"immersive-vr"===j.XR._sessionType&&j.XR.teleportOnQueriedPoint(),void j.FE.playAudioFromSemanticNode(j._hoveredSemNode)}if(j.Nav.isFirstPerson()||j.Nav.isDevOri()){if(h.requestTransitionToLocomotionNodeInSightIfAny(.5))return;if(j.Nav.currentQueryValidForLocomotion()){let e=j._queryDataScene.p,t=j.Nav._vDir,o=new THREE.Vector3(e.x,e.y+j.userHeight,e.z),i=new THREE.Vector3(o.x+t.x,o.y+t.y,o.z+t.z),r=(new j.POV).setPosition(o).setTarget(i).setFOV(j.Nav._currPOV.fov);j.Nav.requestPOV(r,.5)}return}let e=j.getSemanticNode(j._hoveredSemNode);j._queryDataSem&&e?j.Nav.requestPOVbyNode(e,.5):j._queryDataScene&&j.Nav.requestRetarget(j._queryDataScene.p,void 0,.5)},j.defaultDoubleTapFromScreenCoords=e=>{j._updateScreenMove(e),j._handleQueryScene(),j._stdActivation()},j.isFullscreen=()=>j._bFS,j.toggleFullScreen=()=>{document.fullscreenElement?document.exitFullscreen&&document.exitFullscreen():document.documentElement.requestFullscreen()},j.realize=e=>{console.log("Initialize ATON..."),j.Utils.init(),j.Utils.profileDevice(),j._clock=new THREE.Clock(!0),j.bounds=new THREE.Sphere,j._worldScale=1,j._ws=0,j._bFS=!1,j._renderer=new THREE.WebGLRenderer({antialias:!0,alpha:!0}),j._renderer.setSize(window.innerWidth,window.innerHeight),j.Utils.profileRenderingCapabilities(),j._stdpxd=1,j._fps=60,j._dt=.01,j._dtAccum=0,j._dtCount=0,j._avgFPSaccum=0,j._avgFPS=60,j._dRenderBudgetMinFPS=20,j._dRenderBudgetMaxFPS=55,j._bAdaptiveDensity=!0,j._adMin=.4,j._adMax=1.5,j.device.lowGPU&&(j._adMax=1),j._aniMixers=[],j._stdEncoding=THREE.LinearSRGBColorSpace,j._renderer.outputColorSpace=j._stdEncoding,j._renderer.toneMapping=THREE.LinearToneMapping,j._renderer.toneMappingExposure=1,e||j._renderer.setAnimationLoop(j._onFrame),j._maxAnisotropy=j._renderer.capabilities.getMaxAnisotropy(),j.userHeight=1.7,e||document.body.appendChild(j._renderer.domElement);let t=j._renderer.domElement;t.id="idView3D",t.style.outline="none",t.style.border="none",j.UI.init(),j.REQ.init(),j._vpanoPlaying=!1,j._bUserInts=0,j.EventHub.init(),j.MatHub.init(),j.ASCII.init(),j._assetsManager={},j._aLoader=new THREE.GLTFLoader,j._numReqLoad=0,j._collMod=void 0,j._ktx2Loader=new THREE.KTX2Loader,j._ktx2Loader.setTranscoderPath(j.PATH_BASIS_LIB),j._ktx2Loader.detectSupport(j._renderer),j._dracoLoader=new THREE.DRACOLoader,j._dracoLoader.setDecoderPath(j.PATH_DRACO_LIB),j._dracoLoader.setWorkerLimit(2),j._dracoLoader.preload(),j._aLoader.setDRACOLoader(j._dracoLoader),j._aLoader.setKTX2Loader(j._ktx2Loader),THREE.DefaultLoadingManager.addHandler(/\.ktx2$/,j._ktx2Loader),j._updRoutines=[],j._pmremGenerator=void 0,j._lps=[],j._bAutoLP=!1,j._envMapInt=1,j._numLPbounces=2,j._lpbCount=0,j._bShadowsFixedBound=!1,j._shadowsFixedBoundCenter=void 0,j._shadowsNear=j.SHADOWS_NEAR,j._shadowsFar=j.SHADOWS_FAR,j._shadowsSize=j.SHADOWS_SIZE,j._shadowsRes=j.SHADOWS_RES,j.initGraphs(),j.SceneHub.init(),j.MRes.init(),j.CC.init(),j.AudioHub.init(),j.Nav.init(),j.XR.init(),j.SUI.init(),j.Photon.init(),j.VRoadcast=j.Photon,j.MediaFlow.init(),j.SemFactory.init(),j.Phygital.init(),j.XPFNetwork.init(),j.device.lowGPU||j.device.isMobile||j.FX.init(),j.FX.composer||(j._render=()=>{j._renderer.render(j._mainRoot,j.Nav._camera)}),j.setDefaultPixelDensity(1),j._queryDataScene=void 0,j._queryDataSem=void 0,j._queryDataUI=void 0,j._hoveredSemNode=void 0,j._hoveredUI=void 0,j._bq=!0,j._bQuerySemOcclusion=!0,j._bQueryNormals=!0,j._bPauseQuery=!1,j._bCenteredQuery=!1,j._bqScene=!1,j._bqSem=!1,j._qSync=0,j._qSyncInt=1,j._tgiDur=void 0,j._tgiPer=void 0,j._tHover=void 0,j._bMainPanoInfinite=!0,j._matMainPano=void 0,j._mMainPano=void 0,j._screenPointerCoords=new THREE.Vector2(0,0),j._rcScene=new THREE.Raycaster,j._rcScene.layers.set(j.NTYPES.SCENE),j._rcScene.firstHitOnly=!0,j._rcSemantics=new THREE.Raycaster,j._rcSemantics.layers.set(j.NTYPES.SEM),j._rcSemantics.firstHitOnly=!0,j._rcUI=new THREE.Raycaster,j._rcUI.layers.set(j.NTYPES.UI),j._rcUI.firstHitOnly=!0,j._setupBaseListeners(),j.device.isMobile&&j._readDeviceOrientationMode(),j._fLoading=0,j._fRequired=j._fReqList.length,j._loadFlares(),j._gizmo=void 0,j._bGizmo=!1,j.focusOn3DView(),j._bInitialized=!0},j.realize2D=()=>{j._b2D=!0,j.UI.init(),j.REQ.init(),document.body.classList.add("aton-body2D"),document.body.oncontextmenu=null,j.EventHub.init(),j._bInitialized=!0},j.addFlare=e=>{if(void 0===e)return;let t=Object.keys(j.Flares).length,o=e.getID();o?j.Flares[o]=e:j.Flares["F"+t]=e},j.registerFlare=j.addFlare,j.getFlare=e=>j.Flares[e],j.loadScript=(e,t,o)=>{let i=document.createElement("script");i.src=e,i.async=!1,document.head.appendChild(i),t&&(i.onload=t),o&&(i.onerror=o)},j._loadFlare=e=>{j._fLoading++,$.get(j.PATH_RESTAPI2+"flares/"+e,(t=>{let o=t.files;if(o){let t=o.length;for(let i in o)j.loadScript(j.PATH_FLARES+e+"/"+o[i],(()=>{t--,t<=0&&j._onFlareLoaded(e)}),(()=>{console.log("Missing flare '"+e+"' dependency: "+o[i]),t--,t<=0&&j._onFlareLoaded(e)}))}})).fail((()=>{console.log("Flare "+e+" not found."),j._onFlareError(e)}))},j._loadFlares=()=>{if(j._fRequired<=0)j.fire("AllFlaresReady");else for(let e in j._fReqList)j._loadFlare(j._fReqList[e])},j._onFlareLoaded=e=>{console.log("All deps loaded for flare '"+e+"'"),j._deployNewFlares(),j._fLoading--,j._fLoading<=0&&j._onAllFlaresLoaded()},j._onFlareError=e=>{j._fLoading--,j._fLoading<=0&&j._onAllFlaresLoaded()},j._onAllFlaresLoaded=()=>{console.log("All Flares ready!"),j.fire("AllFlaresReady")},j._deployFlare=e=>{e._bDeployed||(void 0!==e.setup&&e.setup(),void 0!==e.update&&j.addUpdateRoutine(e.update),e._bDeployed=!0)},j._deployNewFlares=()=>{for(let e in j.Flares)j._deployFlare(j.Flares[e])},j.setCollectionPathModifier=e=>{j._collMod=e},j.setTimedGazeDuration=e=>{j._tgiDur=e},j.getTimedGazeProgress=()=>{if(void 0!==j._tgiDur)return j._tgiPer},j.getElapsedTime=()=>j._clock.elapsedTime,j.renderPause=()=>{j._renderer.setAnimationLoop(void 0)},j.renderResume=()=>{j._renderer.setAnimationLoop(j._onFrame)},j._setupLoadManager=()=>{j._loadManager=new THREE.LoadingManager,j._loadManager.onStart=(e,t,o)=>{console.log("Started loading file: "+e+".\nLoaded "+t+" of "+o+" files."),j.fire("NodeRequestFired",e)},j._loadManager.onLoad=()=>{console.log("Loading complete!"),j.fire("AllNodeRequestsCompleted")},j._loadManager.onProgress=(e,t,o)=>{},j._loadManager.onError=e=>{console.log("There was an error loading "+e)}},j.setDefaultPixelDensity=e=>{j._stdpxd=e,j._renderer.setPixelRatio(e),j.FX.composer&&j.FX.composer.setPixelRatio(e),void 0!==j._renderer.xr&&(j.device.isMobile?j._renderer.xr.setFramebufferScaleFactor(j._stdpxd*j.XR.MOBILE_DENSITY_F):j._renderer.xr.setFramebufferScaleFactor(j._stdpxd))},j.resetPixelDensity=()=>{j._renderer.setPixelRatio(j._stdpxd)},j._readDeviceOrientationMode=()=>{90===Math.abs(window.orientation)?(console.log("Landscape Mode"),j.fire("MobileLandscapeMode")):(console.log("Portrait Mode"),j.fire("MobilePortraitMode")),setTimeout(j._onResize,500)},j.snodes={},j.semnodes={},j.uinodes={},j.createSceneNode=e=>new j.Node(e,j.NTYPES.SCENE),j.getSceneNode=e=>{if(void 0!==e)return j.snodes[e]},j.getOrCreateSceneNode=e=>{let t=j.getSceneNode(e);return void 0!==t?t:j.createSceneNode(e)},j.getRootScene=()=>j._rootVisible,j.createSemanticNode=e=>new j.Node(e,j.NTYPES.SEM),j.getSemanticNode=e=>{if(void 0!==e)return j.semnodes[e]},j.getOrCreateSemanticNode=e=>{let t=j.getSemanticNode(e);return void 0!==t?t:j.createSemanticNode(e)},j.getRootSemantics=()=>j._rootSem,j.createUINode=e=>new j.Node(e,j.NTYPES.UI),j.getUINode=e=>{if(void 0!==e)return j.uinodes[e]},j.getRootUI=()=>j._rootUI,j._unpackScale=e=>0==e?1:e>=0?1.1*e:1/(-1.1*e),j.setUserScaleLevel=e=>{j.setWorldScaleLevel(-e)},j.getUserScale=()=>1/j._worldScale,j.setWorldScaleLevel=e=>{void 0===e&&(e=0),e<-127&&(e=127),e>127&&(e=127),j._ws=e;let t=j._unpackScale(e);j._rootVisible.scale.set(t,t,t),j._rootSem.scale.set(t,t,t),N.gLocNodes.scale.set(t,t,t),N.gMeasures.scale.set(t,t,t),j.Photon.avaGroup&&j.Photon.avaGroup.scale.set(t,t,t),j.recomputeSceneBounds();let o=t/j._worldScale;j.Nav._currPOV.pos.x*=o,j.Nav._currPOV.pos.y*=o,j.Nav._currPOV.pos.z*=o,j.Nav._currPOV.target.x*=o,j.Nav._currPOV.target.y*=o,j.Nav._currPOV.target.z*=o,j.Nav.syncCurrCamera(),j.XR._bPresenting&&j.XR.setRefSpaceLocation(j.Nav._currPOV.pos),j._worldScale=t,console.log("World scale: "+t)},j.getWorldScaleLevel=()=>j._ws,j.getWorldScale=()=>j._worldScale,j._assetReqNew=e=>{j._numReqLoad++,j.fire("NodeRequestFired",e)},j._assetReqComplete=e=>{j.fire("NodeRequestCompleted",e),j._numReqLoad--,j._numReqLoad<=0&&j._onAllReqsCompleted()},j._onAllReqsCompleted=()=>{j.recomputeSceneBounds(),j.getRootScene().assignLightProbesByProximity(),j.fire("AllNodeRequestsCompleted"),j._postAllReqsCompleted(),setTimeout((()=>{j.updateLightProbes(),j._renderer.shadowMap.enabled&&j._bShadowsFixedBound&&0===j._aniMixers.length&&(j._dMainL.shadow.autoUpdate=!1,console.log("Lazy shadows"))}),1e3)},j._postAllReqsCompleted=e=>{void 0===e&&(e=j._rootVisible);for(let t in e.children){let o=e.children[t];o&&o.toggle&&(j._postAllReqsCompleted(o),o.toggle(o.visible))}ThreeMeshUI.update()},j.recomputeSceneBounds=e=>{e?j.bounds.union(e):(j.bounds.center.copy(j._rootVisible.getBound().center),j.bounds.radius=j._rootVisible.getBound().radius),j.bounds.radius<=0||(j._renderer.shadowMap.enabled&&(j._rootVisible.traverse((e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0)})),j.adjustShadowsParamsFromSceneBounds(),j._bShadowsFixedBound&&j.updateDirShadows()),j._bAutoLP&&(void 0===j._lps[0]?j.addLightProbe((new j.LightProbe).setPosition(j.bounds.center).setNear(j.bounds.radius)):j._lps[0].setPosition(j.bounds.center).setNear(j.bounds.radius),console.log("Auto LP")),j.FX.composer&&j.FX.setDOFaperture(1/(30*j.bounds.radius)),j._mMainPano&&j._mMainPano.position.copy(j.bounds.center))},j.registerNodeResourceHandler=(e,t)=>{j._resHandler||(j._resHandler={}),j._resHandler[e]=t,console.log("Registered resource handler '"+e+"'")},j.removeNodeResourceHanlder=e=>{j._resHandler&&j._resHandler[e]&&(j._resHandler[e]=void 0)},j.initGraphs=()=>{j._mainRoot=new THREE.Scene,j._mainRoot.background=new THREE.Color(.7,.7,.7),j._rootVisibleGlobal=new THREE.Scene,j._mainRoot.add(j._rootVisibleGlobal),j._rootVisible=j.createSceneNode().setAsRoot(),j._rootVisibleGlobal.add(j._rootVisible),j._rootSem=j.createSemanticNode().setAsRoot(),j._mainRoot.add(j._rootSem),j._rootUI=j.createUINode().setAsRoot(),j._mainRoot.add(j._rootUI),j.ambLight=new THREE.AmbientLight(new THREE.Color(1,1,1)),j.ambLight.intensity=3,j._rootVisibleGlobal.add(j.ambLight),j.plight=new THREE.PointLight,j.plight.intensity=0,j.plight.decay=.2,j._rootVisibleGlobal.add(j.plight)},j.enablePointLight=()=>{j.plight.intensity=3},j.disablePointLight=()=>{j.plight.intensity=0},j.setBackgroundColor=e=>{j._mainRoot.background=e},j.setFog=(e,t)=>{void 0!==e&&(void 0===t&&(t=200),j._rootVisibleGlobal.fog=new THREE.Fog(e,1,t),j.setBackgroundColor(e))},j.disableFog=()=>{j._rootVisibleGlobal.fog=null},j.setAutoLP=e=>{j._bAutoLP=e},j.setNeutralAmbientLight=e=>{j.ambLight.color=new THREE.Color(e,e,e)},j.addLightProbe=e=>{void 0!==e&&(j._lps.push(e),j.setNeutralAmbientLight(0),void 0!==j.SUI.gLPIcons&&N.addLPIcon(e))},j.getNumLightProbes=()=>j._lps.length,j._updLP=()=>{for(let e in j._lps)j._lps[e].update();j._rootVisible.traverse((e=>{let t=e.userData.LP;void 0!==t&&t instanceof j.LightProbe&&(e.material.envMap=t.getEnvTex(),e.material.envMapIntensity=j._envMapInt,e.material.needsUpdate=!0)}))},j.setLightProbesNumBounces=e=>{e<1||(j._numLPbounces=e)},j.dirtyLightProbes=e=>{void 0===e&&(e=j._numLPbounces),j._lpbCount=e},j.updateLightProbes=()=>{if(!j.XR._bPresenting&&0!==j._lps.length){for(let e=0;e{let t;if(e=j.Utils.resolveCollectionURL(e),void 0===j._mMainPano&&(j._gMainPano=new THREE.SphereGeometry(1,60,60),j._gMainPano.castShadow=!1,j._gMainPano.receiveShadow=!1,j._mMainPano=new THREE.Mesh(j._gMainPano,j._matMainPano),j._mMainPano.frustumCulled=!1,j._mMainPano.renderOrder=-100,j._mMainPano.layers.disable(j.NTYPES.SCENE),j._mMainPano.layers.disable(j.NTYPES.SEM),j._mMainPano.layers.disable(j.NTYPES.UI),j._mMainPano.raycast=j.Utils.VOID_CAST,j.setMainPanoramaRadius(.8*j.Nav.STD_FAR)),j.Utils.isVideo(e)){if(void 0===j._elPanoVideo){let t="",$(t).appendTo("body"),j._elPanoVideo=document.getElementById("idPanoVideo"),j._elPanoVideo.onplaying=()=>{console.log("VideoPano playing"),j._vpanoPlaying=!0},j._elPanoVideo.onpause=()=>{console.log("VideoPano paused"),j._vpanoPlaying=!1},j._elPanoVideo.addEventListener("touchstart",(function(){j._elPanoVideo.play()})),enableInlineVideo(j._elPanoVideo)}t=new THREE.VideoTexture(j._elPanoVideo),t.colorSpace=j._stdEncoding,j._realizeOrUpdateMainPano(t),j.fire("MainPanoVideo")}else{if(e.endsWith(".hdr"))return void(new THREE.RGBELoader).load(e,(e=>{e.minFilter=THREE.LinearMipmapLinearFilter,e.magFilter=THREE.LinearFilter,e.colorSpace=j._stdEncoding,j._realizeOrUpdateMainPano(e),j.fire("MainPanoHDR")}));if(e.endsWith(".exr"))return void(new THREE.EXRLoader).load(e,(e=>{e.minFilter=THREE.LinearMipmapLinearFilter,e.magFilter=THREE.LinearFilter,e.colorSpace=j._stdEncoding,j._realizeOrUpdateMainPano(e),j.fire("MainPanoHDR")}));j.Utils.textureLoader.load(e,(e=>{e.colorSpace=j._stdEncoding,e.generateMipmaps=!0,j._realizeOrUpdateMainPano(e),j.fire("MainPano")}))}},j.playMainPanorama=()=>{j._elPanoVideo&&(j._vpanoPlaying||j._elPanoVideo.play())},j.pauseMainPanorama=()=>{j._elPanoVideo&&j._vpanoPlaying&&j._elPanoVideo.pause()},j.playOrPauseMainPanorama=()=>{j._elPanoVideo&&(j._vpanoPlaying?j._elPanoVideo.pause():j._elPanoVideo.play())},j.stopAndRemoveMainPanorama=()=>{j._elPanoVideo&&(j._vpanoPlaying&&j._elPanoVideo.pause(),j._elPanoVideo.remove(),j._elPanoVideo=void 0,j._vpanoPlaying=!1)},j._realizeOrUpdateMainPano=e=>{if(void 0!==j._matMainPano)return j._matMainPano.map=e,void j.updateLightProbes();j._matMainPano=new THREE.MeshBasicMaterial({map:e,depthTest:!1,depthWrite:!1}),j._mMainPano.material=j._matMainPano,j._bMainPanoInfinite&&(j._mMainPano.onAfterRender=()=>{"immersive-ar"!==j.XR._sessionType&&j.Nav._currPOV&&j._mMainPano.position.copy(j.Nav._currPOV.pos)}),j._rootVisibleGlobal.add(j._mMainPano),j.updateLightProbes()},j.setMainPanoramaRadius=e=>{void 0!==j._gMainPano&&j._gMainPano.scale(-e,e,e)},j.setMainPanoramaRotation=e=>{void 0!==j._mMainPano&&j._mMainPano.rotation.set(0,e,0)},j.setMainPanoramaInfinite=e=>{j._bMainPanoInfinite=e,void 0!==j._mMainPano&&(j._mMainPano.onAfterRender=e?()=>{j.Nav._currPOV&&j._mMainPano.position.copy(j.Nav._currPOV.pos)}:void 0)},j.setMainPanoramaLocation=e=>{j._bMainPanoInfinite||void 0!==j._mMainPano&&j._mMainPano.position.copy(e)},j.setMainLightDirection=e=>{let t=e.clone();t.normalize(),t.x*=.5*j.SHADOWS_FAR,t.y*=.5*j.SHADOWS_FAR,t.z*=.5*j.SHADOWS_FAR,void 0===j._dMainL&&(j._dMainL=new THREE.DirectionalLight(new THREE.Color(1,1,1),1),j._dMainL.castShadow=!1,j._dMainL.intensity=2,j._dMainLtgt=new THREE.Object3D,j._rootVisibleGlobal.add(j._dMainLtgt),j._dMainL.target=j._dMainLtgt,j._rootVisibleGlobal.add(j._dMainL),j._dMainLpos=new THREE.Vector3),j._dMainLdir=t,j._dMainL.position.set(-t.x,-t.y,-t.z),j._renderer.shadowMap.enabled&&(j._dMainL.shadow.needsUpdate=!0),j.toggleMainLight(!0)},j.getMainLightDirection=()=>{if(void 0===j._dMainLdir)return;let e=j._dMainLdir.clone();return e.normalize(),e},j.toggleMainLight=e=>{if(void 0===j._dMainL)return;j._dMainL.visible=e;let t=j._lps.length;e?(t>0?j.setNeutralAmbientLight(0):j.setNeutralAmbientLight(j.AMB_L),j.updateDirShadows()):t>0?j.setNeutralAmbientLight(0):j.setNeutralAmbientLight(j.AMB_L)},j.isMainLightEnabled=()=>void 0!==j._dMainL&&!!j._dMainL.visible,j.setExposure=e=>{j._renderer.toneMappingExposure=e},j.getExposure=()=>j._renderer.toneMappingExposure,j.adjustShadowsParamsFromSceneBounds=()=>{if(void 0===j._dMainL)return;let e=j._rootVisible.getBound().radius,t=j._rootVisible.getBound().center;e<=0||e>=j.SHADOWS_SIZE?(j._bShadowsFixedBound=!1,j._shadowsSize=j.SHADOWS_SIZE):(j._bShadowsFixedBound=!0,j._shadowsFixedBoundCenter=t,j._shadowsSize=1.5*e),j._dMainL.shadow.map&&(j._dMainL.shadow.map.dispose(),j._dMainL.shadow.map=null),j._dMainL.shadow.camera.left=-j._shadowsSize,j._dMainL.shadow.camera.right=j._shadowsSize,j._dMainL.shadow.camera.bottom=-j._shadowsSize,j._dMainL.shadow.camera.top=j._shadowsSize,j._dMainL.shadow.mapSize.width=j._shadowsRes,j._dMainL.shadow.mapSize.height=j._shadowsRes,j._dMainL.shadow.camera.near=j._shadowsNear,j._dMainL.shadow.camera.far=j._shadowsFar;let o=-2e-4*e;o<-.001&&(o=-.001),j._dMainL.shadow.bias=o},j.toggleShadows=e=>{if(void 0!==j._dMainL)if(e){if(j.XR.isPresenting())return;if(j.device.lowGPU)return;j._dMainL.castShadow=!0,j._renderer.shadowMap.enabled=!0,j.device.isMobile?j._renderer.shadowMap.type=THREE.PCFShadowMap:j._renderer.shadowMap.type=THREE.PCFSoftShadowMap,j._rootVisible.traverse((e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0)})),j.adjustShadowsParamsFromSceneBounds(),j.updateDirShadows(),j._dMainL.shadow.needsUpdate=!0,console.log("Shadows ON")}else j._dMainL.castShadow=!1,j._renderer.shadowMap.enabled=!1,console.log("Shadows OFF")},j.updateDirShadows=()=>{if(void 0===j._dMainLdir)return;if(void 0===j._dMainLpos)return;let e=j._shadowsFixedBoundCenter;void 0===e?(e=j.Nav.getCurrentEyeLocation(),j._dMainLpos.x=e.x+j.Nav._vDir.x*j._shadowsSize,j._dMainLpos.y=e.y+j.Nav._vDir.y*j._shadowsSize,j._dMainLpos.z=e.z+j.Nav._vDir.z*j._shadowsSize):(j._dMainLpos.x=e.x,j._dMainLpos.y=e.y,j._dMainLpos.z=e.z),j._dMainL.position.set(j._dMainLpos.x-j._dMainLdir.x,j._dMainLpos.y-j._dMainLdir.y,j._dMainLpos.z-j._dMainLdir.z),j._dMainLtgt.position.copy(j._dMainLpos)},j._updateEnvironment=()=>{j._renderer.shadowMap.enabled&&(j._bShadowsFixedBound||j.updateDirShadows())},j.setGlobalAudio=(e,t)=>{void 0!==e&&(void 0===t&&(t=!0),e=j.Utils.resolveCollectionURL(e),void 0===j._auMain||null===j._auMain?j._auMain=new THREE.Audio(j.AudioHub._listener):j._auMain.isPlaying&&j._auMain.stop(),j.AudioHub._loader.load(e,(e=>{j._auMain.setBuffer(e),j._auMain.setLoop(t),j._auMain.play()})))},j._markFPS=()=>{j._numReqLoad>0||j._dt<0||(j._dtCount+=1,j._dtAccum+=j._dt,j._dtAccum<1||(j._fps=1/(j._dtAccum/j._dtCount),j._dtCount=0,j._dtAccum=0,j._handleDynamicRenderProfiles()))},j.toggleAdaptiveDensity=e=>{j._bAdaptiveDensity=e},j.setAdaptiveDensityRange=(e,t)=>{e>=t||(j._adMin=e,j._adMax=t)},j.setDynamicRenderingFPS=(e,t)=>{e>=t||(e&&(j._dRenderBudgetMinFPS=e),t&&(j._dRenderBudgetMaxFPS=t))},j._handleDynamicRenderProfiles=()=>{let e=j._renderer.getPixelRatio();j._fps=j._adMin&&(j._renderer.setPixelRatio(e),j.FX.composer&&j.FX.composer.setPixelRatio(e),console.log("Density: "+e.toPrecision(2)))),j.fire("RequestLowerRender")),j._fps>j._dRenderBudgetMaxFPS&&(j._bAdaptiveDensity&&!j.XR._bPresenting&&(e+=.1,e<=j._adMax&&(j._renderer.setPixelRatio(e),j.FX.composer&&j.FX.composer.setPixelRatio(e),console.log("Density: "+e.toPrecision(2)))),j.fire("RequestHigherRender"))},j._onFrame=()=>{j._dt=j._clock.getDelta(),j._markFPS(),j.XR._bPresenting?j.XR.update():j.Nav._controls.update(j._dt),j._handleQueries(),j.Nav.update(),j.Photon.update(),j.SUI.update(),j.MatHub.update(),j._updateEnvironment(),j._updateAniMixers(),j._updateRoutines(),j.MRes.update(),j.XPFNetwork.update(),j._render()},j._render=()=>{!j.FX.composer||j.XR._bPresenting?j._renderer.render(j._mainRoot,j.Nav._camera):j.FX.composer.render()},j.addUpdateRoutine=e=>{void 0!==e&&j._updRoutines.push(e)},j.deleteAllUpdateRoutines=()=>{j._updRoutines=[]},j._updateRoutines=()=>{let e=j._updRoutines.length;if(!(e<=0))for(let t=0;t{let e=j._aniMixers.length;if(!(e<1))for(let t=0;t{e.preventDefault&&e.preventDefault(),j._bCenteredQuery||(j._screenPointerCoords.x=e.clientX/window.innerWidth*2-1,j._screenPointerCoords.y=-e.clientY/window.innerHeight*2+1)},j.toggleCenteredQuery=e=>{j._bCenteredQuery=e,e&&(j._screenPointerCoords.x=0,j._screenPointerCoords.y=0)},j.toggleQueries=e=>{j._bq=e},j._registerRCS=()=>{j._rcRR=0,j._rcHandlers=[],j._rcHandlers.push(j._handleQueryScene),j._rcHandlers.push(j._handleQuerySemantics),j._rcHandlers.push(j._handleQueryUI)},j._handleQueries=()=>{if(!j._bq)return;if(j._bPauseQuery)return;if(j.Nav._bInteracting)return;if(j._numReqLoad>0)return;if(j.Nav.isTransitioning())return;if(j._handleQueryUI(),j._bqScene&&j._handleQueryScene(),j._bqSem&&j._handleQuerySemantics(),j.Nav._bLocValidator&&j.Nav.locomotionValidator(),void 0===j._tgiDur)return;if(void 0===j._tHover)return;const e=j._clock.elapsedTime-j._tHover;e>=j._tgiDur?(j._stdActivation(),j._tHover=void 0,j._tgiPer=void 0):j._tgiPer=e/j._tgiDur},j._handleQueryScene=()=>{if(j.XR.isPresenting()?j.XR.setupQueryRay(j._rcScene):j._rcScene.setFromCamera(j._screenPointerCoords,j.Nav._camera),j._hitsScene=[],j._rcScene.intersectObjects(j._mainRoot.children,!0,j._hitsScene),j._hitsScene.length<=0)return void(j._queryDataScene=void 0);const e=j._hitsScene[0];j._queryDataScene={},j._queryDataScene.p=e.point,j._queryDataScene.d=e.distance,j._queryDataScene.o=e.object,j._queryDataScene.uv=e.uv,j._bQueryNormals&&e.face&&e.face.normal&&(j._queryDataScene.matrixWorld=(new THREE.Matrix3).getNormalMatrix(e.object.matrixWorld),j._queryDataScene.n=e.face.normal.clone().applyMatrix3(j._queryDataScene.matrixWorld).normalize())},j.getSceneFocalPoint=()=>{if(void 0===j._queryDataScene)return;let e=j._queryDataScene.p,t=new THREE.Vector3;return t.lerpVectors(e,j.Nav._currPOV.pos,.02),t},j.getSceneQueriedPoint=()=>{if(void 0!==j._queryDataScene)return j._queryDataScene.p},j.getSceneQueriedDistance=()=>{if(void 0!==j._queryDataScene)return j._queryDataScene.d},j.getSceneQueriedNormal=()=>{if(void 0!==j._queryDataScene)return j._queryDataScene.n},j.getSceneQueriedObjectName=()=>{if(void 0!==j._queryDataScene&&void 0!==j._queryDataScene.o)return j._queryDataScene.o.name},j.getSceneQueriedUV=()=>{if(void 0!==j._queryDataScene)return j._queryDataScene.uv},j.setQueryRange=(e,t,o)=>{void 0!==o&&o!==j.NTYPES.SCENE||(j._rcScene.near=e,j._rcScene.far=t),void 0!==o&&o!==j.NTYPES.SEM||(j._rcSemantics.near=e,j._rcSemantics.far=t)},j._handleQuerySemantics=()=>{if(j.XR.isPresenting()?j.XR.setupQueryRay(j._rcSemantics):j._rcSemantics.setFromCamera(j._screenPointerCoords,j.Nav._camera),j._hitsSem=[],j._rcSemantics.intersectObjects(j._mainRoot.children,!0,j._hitsSem),j._hitsSem.length<=0){if(j._queryDataSem=void 0,j._hoveredSemNode){j.fire("SemanticNodeLeave",j._hoveredSemNode);let e=j.getSemanticNode(j._hoveredSemNode);e&&e.onLeave&&e.onLeave()}return j._hoveredSemNode=void 0,void(j._tHover=void 0)}const e=j._hitsSem[0];if(j._bQuerySemOcclusion&&j._queryDataScene&&j._queryDataScene.d{if(j.XR.isPresenting()?j.XR.setupQueryRay(j._rcUI):j._rcUI.setFromCamera(j._screenPointerCoords,j.Nav._camera),j._hitsUI=[],j._rcUI.intersectObjects(j._mainRoot.children,!0,j._hitsUI),j._hitsUI.length<=0){if(j._queryDataUI=void 0,j._hoveredUI){j.fire("UINodeLeave",j._hoveredUI);const e=j.getUINode(j._hoveredUI);e&&e.onLeave&&e.onLeave()}return j._hoveredUI=void 0,void(j._tHover=void 0)}const e=j._hitsUI[0];if(j._queryDataScene&&j._queryDataScene.d{if(void 0!==j._hoveredSemNode)return j.getSemanticNode(j._hoveredSemNode)},j.setAPIToken=(e,t)=>{window.sessionStorage.setItem("ATON.tokens."+e,t)},j.getAPIToken=e=>window.sessionStorage.getItem("ATON.tokens."+e),j.clearToken=e=>{window.sessionStorage.removeItem("ATON.tokens."+e)},j.enableClipPlanes=()=>{j._renderer&&(j._renderer.localClippingEnabled=!0)},j.disableClipPlanes=()=>{j._renderer&&(j._renderer.localClippingEnabled=!1,j._clipPlanes=[])},j.addClipPlane=(e,t)=>{j.enableClipPlanes();let o=new THREE.Plane;return o.setFromNormalAndCoplanarPoint(e,t),j._clipPlanes.push(o),j.Utils._visitorCP(),o},j.useGizmo=e=>{j._bGizmo=e,j._setupGizmo()},j._setupGizmo=()=>{}})(); \ No newline at end of file diff --git a/public/res/css/main.css b/public/res/css/main.css index 84b7f092..d9419d35 100644 --- a/public/res/css/main.css +++ b/public/res/css/main.css @@ -398,11 +398,24 @@ canvas:active { } .aton-scene-card:hover { - transform: scale(1.1); + /*transform: scale(1.1);*/ + /*border: 1px solid rgba(var(--bs-body-color-rgb), 1);*/ /*box-shadow: 0px 0px 10px rgba(var(--bs-body-color-rgb), 0.5);*/ } +.aton-card-cover { + overflow: hidden; +} + +.aton-card-cover img { + transform-origin: 50% 50%; + transition: transform .5s, visibility .5s ease-in; +} +.aton-card-cover img:hover { + transform: scale(1.5); +} + .aton-scene-card-small { margin: 8px; width: 150px; diff --git a/public/src/ATON.ui.js b/public/src/ATON.ui.js index 2a655b94..35c13ed0 100644 --- a/public/src/ATON.ui.js +++ b/public/src/ATON.ui.js @@ -757,7 +757,7 @@ UI.createSceneCard = (options)=>{ // Cover //if (options.onpress) el.innerHTML += ""; - el.innerHTML += ""; + el.innerHTML += "
    "; // Body let elbody = document.createElement('div'); diff --git a/services/views/v2/home.ejs b/services/views/v2/home.ejs index ca0c58e2..681f8268 100644 --- a/services/views/v2/home.ejs +++ b/services/views/v2/home.ejs @@ -45,7 +45,7 @@ window.addEventListener( 'load', ()=>{ ATON.UI.createPublicScenesGallery({ containerid: "pubscenes", - size:"small", + //size:"small", entries: entries, <% if (samples) { %> samples: true <% } %> }); @@ -129,11 +129,11 @@ window.addEventListener( 'load', ()=>{ - + <%- include('frags/navbar'); %> -
    +