diff --git a/public/dist/ATON.min.js b/public/dist/ATON.min.js index 68dff914..1f2cb4bf 100644 --- a/public/dist/ATON.min.js +++ b/public/dist/ATON.min.js @@ -1,5 +1,5 @@ parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c(this.traverse(t=>{if(t.isMesh&&t.geometry){let e=t.userData.LP;void 0!==e&&(e.update(),t.material.envMap=e.getEnvTex())}}),this)),this.type=i||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.onHover=void 0,this.onLeave=void 0,this.onSelect=void 0}as(t){if(void 0!==t&&t!==ATON.ROOT_NID)return this._nodes[t]=this,this.nid=t,this.name=t,this}setAsRoot(){return this._nodes[ATON.ROOT_NID]=this,this.nid=ATON.ROOT_NID,this}setCloneOnLoadHit(t){return this._bCloneOnLoadHit=t,this}addKeywords(t){let e=t.split(",");void 0===this.kwords&&(this.kwords={});for(let i in e){let t=e[i].trim();t.length>0&&(this.kwords[t]=!0)}for(let i in this.children){let e=this.children[i];void 0!==e.type&&e.addKeywords(t)}return this}hasKeyword(t){if(void 0!==this.kwords)return void 0!==this.kwords[t]}setDescription(t){return this.userData.description=t,this}getDescription(){return this.userData.description}setAudio(t){return this.userData.audio=t,this}getAudio(){return this.userData.audio}hide(){return this.visible=!1,ATON.Utils.setPicking(this,this.type,!1),ATON._renderer.shadowMap.enabled&&(ATON._dMainL.shadow.needsUpdate=!0),this}show(){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),this}toggle(t){return void 0===t?this.visible?this.hide():this.show():t?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(t){return t?this.enablePicking():this.disablePicking(),this}setMaterial(t){this.userData.cMat=t,this.traverse(e=>{e.isMesh&&(e.material=t),e.type&&(this.userData.cMat=t)});for(let e in this.children){let i=this.children[e];i.setMaterial&&i.setMaterial(t)}return this}getMaterial(){return this.userData.cMat}setDefaultAndHighlightMaterials(t,e){return this.userData.matSTD=t,this.userData.matHL=e,this}highlight(){return this.userData.matHL&&this.setMaterial(this.userData.matHL),this}restoreDefaultMaterial(){return this.userData.matSTD&&this.setMaterial(this.userData.matSTD),this}setOpacity(t){return this.traverse(e=>{e.isMesh&&(e.material.opacity=t)}),this}setShadowCast(t){return this.castShadow=t,this.traverse(e=>{e.isMesh&&(e.castShadow=t)}),this}setShadowReceive(t){return this.receiveShadow=t,this.traverse(e=>{e.isMesh&&(e.receiveShadow=t)}),this}setEnvMap(t){return this.traverse(e=>{e.isMesh&&(e.material.envMap=t)}),this}assignLightProbe(t){return this.traverse(e=>{e.isMesh&&e.geometry&&ATON.Utils.assignLightProbeToMesh(t,e)}),this}assignLightProbesByProximity(){return 0===ATON._lps.length?this:(this.traverse(t=>{if(t.isMesh&&t.geometry){let e=new THREE.Vector3,i=((new THREE.Box3).setFromObject(t).getCenter(e),void 0),s=void 0;for(let t in ATON._lps){let r=ATON._lps[t],o=e.distanceToSquared(r.pos);(void 0===i||o{t.isMesh&&(t.material=t.material.clone())}),t}delete(){let t=this.parent;void 0!==t&&void 0!==t.nid&&t.removeChild(this)}removeChild(t){if(void 0===t)return;t.nid;return void 0!==t.nid&&(this._nodes[t.nid]=void 0),t.parent=void 0,t.traverse(t=>{t.geometry&&t.geometry.dispose(),t.material&&t.material.dispose()}),this.remove(t),this}removeChildren(){for(let t=this.children.length-1;t>=0;t--)this.removeChild(this.children[t]);return this}attachTo(t){let e="string"==typeof t?this._nodes[t]:t;return e&&(e.add(this),void 0!==e.userData.cMat&&(this.userData.cMat=e.userData.cMat),void 0!==e.bPickable&&(this.bPickable=e.bPickable)),e}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(){let t=(new THREE.Box3).setFromObject(this),e=new THREE.Sphere;return t.getBoundingSphere(e),e}setPosition(t,e,i){return t instanceof THREE.Vector3?this.position.copy(t):this.position.set(t,e,i),this}setScale(t,e,i){return t instanceof THREE.Vector3?this.scale.copy(t):(void 0===e&&(e=t,i=t),this.scale.set(t,e,i)),this}setRotation(t,e,i){return t instanceof THREE.Vector3?this.rotation.copy(t):this.rotation.set(t,e,i),this}orientToCamera(){return this.quaternion.copy(ATON.Nav._qOri),this}setYup(){return this.rotation.set(-1.57079632679,0,0),this}addTransform(t){let e=void 0;return"string"==typeof t&&(e=ATON.Utils.parseTransformString(t)),void 0===e?this:(void 0===this._tlist&&(this._tlist=[]),this._tlist.push(e),this)}load(t,e){if(void 0===t)return this;t=ATON.Utils.resolveCollectionURL(t);let i=this;if(t.endsWith("tileset.json"))return ATON.Utils.loadTileSet(t,i),ATON._bqScene=!0,e&&e(),i;if(i._bCloneOnLoadHit&&void 0!==ATON._assetsManager[t])return ATON._assetsManager[t].then(t=>{let s=t.clone();if(ATON.Utils.modelVisitor(i,s),void 0!==i._tlist)for(let e in i._tlist)i._tlist[e].add(s.clone()),i.add(i._tlist[e]);else i.add(s);e&&e()}),console.log("HIT!"),i;ATON._assetReqNew(t);let s=new Promise((s,r)=>{ATON._aLoader.load(t,r=>{let o=r.scene||r.scene[0];if(ATON.Utils.modelVisitor(i,o),void 0!==i._tlist)for(let t in i._tlist)i._tlist[t].add(o.clone()),i.add(i._tlist[t]);else i.add(o);ATON.Utils.registerAniMixers(i,r),ATON.Utils.ccExtract(r),s(o),console.log("Model "+t+" loaded"),ATON._assetReqComplete(t),i.type===ATON.NTYPES.SCENE&&(ATON._bqScene=!0),i.type===ATON.NTYPES.SEM&&(ATON._bqSem=!0),i.bPickable&&i.enablePicking(),e&&e()},void 0,i=>{ATON._assetReqComplete(t),e&&e()})});return i._bCloneOnLoadHit&&(ATON._assetsManager[t]=s),this}exportAs(t){return ATON.Utils.exportNode(this,t),this}setOnHover(t){return this.onHover=t,this}setOnLeave(t){return this.onLeave=t,this}setOnSelect(t){return this.onSelect=t,this}}var i=e;exports.default=i; +"use strict";function t(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;class e extends THREE.Group{constructor(e,i){super(),t(this,"updateLightProbes",()=>(this.traverse(t=>{if(t.isMesh&&t.geometry){let e=t.userData.LP;void 0!==e&&(e.update(),t.material.envMap=e.getEnvTex())}}),this)),this.type=i||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.onHover=void 0,this.onLeave=void 0,this.onSelect=void 0}as(t){if(void 0!==t&&t!==ATON.ROOT_NID)return this._nodes[t]=this,this.nid=t,this.name=t,this}setAsRoot(){return this._nodes[ATON.ROOT_NID]=this,this.nid=ATON.ROOT_NID,this}setCloneOnLoadHit(t){return this._bCloneOnLoadHit=t,this}addKeywords(t){let e=t.split(",");void 0===this.kwords&&(this.kwords={});for(let i in e){let t=e[i].trim();t.length>0&&(this.kwords[t]=!0)}for(let i in this.children){let e=this.children[i];void 0!==e.type&&e.addKeywords(t)}return this}hasKeyword(t){if(void 0!==this.kwords)return void 0!==this.kwords[t]}setDescription(t){return this.userData.description=t,this}getDescription(){return this.userData.description}setAudio(t){return this.userData.audio=t,this}getAudio(){return this.userData.audio}hide(){return this.visible=!1,ATON.Utils.setPicking(this,this.type,!1),ATON._renderer.shadowMap.enabled&&(ATON._dMainL.shadow.needsUpdate=!0),this}show(){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),this}toggle(t){return void 0===t?this.visible?this.hide():this.show():t?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(t){return t?this.enablePicking():this.disablePicking(),this}setMaterial(t){this.userData.cMat=t,this.traverse(e=>{e.isMesh&&(e.material=t),e.type&&(this.userData.cMat=t)});for(let e in this.children){let i=this.children[e];i.setMaterial&&i.setMaterial(t)}return this}getMaterial(){return this.userData.cMat}setDefaultAndHighlightMaterials(t,e){return this.userData.matSTD=t,this.userData.matHL=e,this}highlight(){return this.userData.matHL&&this.setMaterial(this.userData.matHL),this}restoreDefaultMaterial(){return this.userData.matSTD&&this.setMaterial(this.userData.matSTD),this}setOpacity(t){return this.traverse(e=>{e.isMesh&&(e.material.opacity=t)}),this}setShadowCast(t){return this.castShadow=t,this.traverse(e=>{e.isMesh&&(e.castShadow=t)}),this}setShadowReceive(t){return this.receiveShadow=t,this.traverse(e=>{e.isMesh&&(e.receiveShadow=t)}),this}setEnvMap(t){return this.traverse(e=>{e.isMesh&&(e.material.envMap=t)}),this}assignLightProbe(t){return this.traverse(e=>{e.isMesh&&e.geometry&&ATON.Utils.assignLightProbeToMesh(t,e)}),this}assignLightProbesByProximity(){return 0===ATON._lps.length?this:(this.traverse(t=>{if(t.isMesh&&t.geometry){let e=new THREE.Vector3,i=((new THREE.Box3).setFromObject(t).getCenter(e),void 0),s=void 0;for(let t in ATON._lps){let r=ATON._lps[t],o=e.distanceToSquared(r.pos);(void 0===i||o{t.isMesh&&(t.material=t.material.clone())}),t}delete(){let t=this.parent;void 0!==t&&void 0!==t.nid&&t.removeChild(this)}removeChild(t){if(void 0===t)return;t.nid;return void 0!==t.nid&&(this._nodes[t.nid]=void 0),t.parent=void 0,t.traverse(t=>{t.geometry&&t.geometry.dispose(),t.material&&t.material.dispose()}),this.remove(t),this}removeChildren(){for(let t=this.children.length-1;t>=0;t--)this.removeChild(this.children[t]);return this}attachTo(t){let e="string"==typeof t?this._nodes[t]:t;return e&&(e.add(this),void 0!==e.userData.cMat&&(this.userData.cMat=e.userData.cMat),void 0!==e.bPickable&&(this.bPickable=e.bPickable)),e}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(){let t=(new THREE.Box3).setFromObject(this),e=new THREE.Sphere;return t.getBoundingSphere(e),e}setPosition(t,e,i){return t instanceof THREE.Vector3?this.position.copy(t):this.position.set(t,e,i),this}setScale(t,e,i){return t instanceof THREE.Vector3?this.scale.copy(t):(void 0===e&&(e=t,i=t),this.scale.set(t,e,i)),this}setRotation(t,e,i){return t instanceof THREE.Vector3?this.rotation.copy(t):this.rotation.set(t,e,i),this}orientToCamera(){return this.quaternion.copy(ATON.Nav._qOri),this}setYup(){return this.rotation.set(-1.57079632679,0,0),this}addTransform(t){let e=void 0;return"string"==typeof t&&(e=ATON.Utils.parseTransformString(t)),void 0===e?this:(void 0===this._tlist&&(this._tlist=[]),this._tlist.push(e),this)}load(t,e){if(void 0===t)return this;t=ATON.Utils.resolveCollectionURL(t);let i=this;if(t.endsWith("tileset.json"))return ATON.Utils.loadTileSet(t,i),ATON._bqScene=!0,e&&e(),i;if(i._bCloneOnLoadHit&&void 0!==ATON._assetsManager[t])return ATON._assetsManager[t].then(t=>{let s=t.clone();if(ATON.Utils.modelVisitor(i,s),void 0!==i._tlist)for(let e in i._tlist)i._tlist[e].add(s.clone()),i.add(i._tlist[e]);else i.add(s);e&&e()}),console.log("HIT!"),i;ATON._assetReqNew(t);let s=new Promise((s,r)=>{ATON._aLoader.load(t,r=>{let o=r.scene||r.scene[0];if(ATON.Utils.modelVisitor(i,o),void 0!==i._tlist)for(let t in i._tlist)i._tlist[t].add(o.clone()),i.add(i._tlist[t]);else i.add(o);ATON.Utils.registerAniMixers(i,r),ATON.Utils.ccExtract(r),s(o),console.log("Model loaded"),ATON._assetReqComplete(t),i.type===ATON.NTYPES.SCENE&&(ATON._bqScene=!0),i.type===ATON.NTYPES.SEM&&(ATON._bqSem=!0),i.bPickable&&i.enablePicking(),e&&e()},void 0,i=>{console.log("Error loading model"),ATON._assetReqComplete(t),e&&e()})});return i._bCloneOnLoadHit&&(ATON._assetsManager[t]=s),this}exportAs(t){return ATON.Utils.exportNode(this,t),this}setOnHover(t){return this.onHover=t,this}setOnLeave(t){return this.onLeave=t,this}setOnSelect(t){return this.onSelect=t,this}}var i=e;exports.default=i; },{}],"CwXu":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;class t{constructor(t){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(t)}as(t){if(void 0!==t)return ATON.Nav.povlist[t]=this,this.id=t,this}setPosition(t,s,e){return t instanceof THREE.Vector3?this.pos.copy(t):this.pos.set(t,s,e),this}setTarget(t,s,e){return t instanceof THREE.Vector3?this.target.copy(t):this.target.set(t,s,e),this}setFOV(t){return this.fov=t,this}addKeywords(t){let s=t.split(",");void 0===this.kwords&&(this.kwords={});for(let e in s){let t=s[e].trim();t.length>0&&(this.kwords[t]=!0)}return this}hasKeyword(t){if(void 0!==this.kwords)return void 0!==this.kwords[t]}setNextPOV(t){if(t)return this.nextPOV=t,this}setPrevPOV(t){if(t)return this.prevPOV=t,this}}var s=t;exports.default=s; },{}],"MNcy":[function(require,module,exports) { @@ -9,7 +9,7 @@ parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcel },{}],"R8yv":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;let e={init:()=>{e.materials={},e.colors={},e._loader=new THREE.MaterialLoader,e._uSem={time:{type:"float",value:0},tint:{type:"vec4",value:new THREE.Vector4(.2,.2,1,.2)}},e.addDefaults()},getDefVertexShader:()=>"\n varying vec3 vPositionW;\n varying vec3 vNormalW;\n varying vec3 vNormalV;\n\n void main(){\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 ",addDefaults:()=>{e.colors.white=new THREE.Color(1,1,1),e.colors.black=new THREE.Color(0,0,0),e.colors.green=new THREE.Color(0,1,0),e.colors.yellow=new THREE.Color(1,1,0),e.colors.red=new THREE.Color(1,0,0),e.colors.blue=new THREE.Color(0,0,1),e.colors.orange=new THREE.Color(1,.5,0),e.colors.defUI=new THREE.Color(0,1,.5),e.colors.sem=new THREE.Color(0,1,.5),e.colors.darksem=new THREE.Color(0,0,.1),e.materials.fullyTransparent=new THREE.MeshBasicMaterial({transparent:!0,depthWrite:!1,opacity:0}),e.materials.defUI=new THREE.ShaderMaterial({uniforms:{color:{type:"vec3",value:e.colors.defUI},opacity:{type:"float",value:.8}},vertexShader:e.getDefVertexShader(),fragmentShader:"\n varying vec3 vPositionW;\n\t\t varying vec3 vNormalW;\n varying vec3 vNormalV;\n uniform vec3 color;\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(viewDirectionW, vNormalW);\n f = dot(vNormalV, vec3(0,0,1));\n\t\t f = clamp(1.0 - f, 0.2, 1.0);\n\n\t\t gl_FragColor = vec4(color.rgb, f * opacity);\n\t\t }\n ",transparent:!0,depthWrite:!1}),e.materials.selector=e.materials.defUI.clone(),e.materials.controllerRay=e.materials.defUI.clone(),e.materials.controllerRay.uniforms.color.value=e.colors.white,e.materials.teleportLoc=new THREE.MeshBasicMaterial({transparent:!0,opacity:1,depthWrite:!1,side:THREE.DoubleSide}),ATON.Utils.textureLoader.load(ATON.PATH_RES+"grad.png",t=>{e.materials.teleportLoc.map=t}),e.materials.measurement=new THREE.MeshBasicMaterial({color:e.colors.white,transparent:!0,depthWrite:!1,opacity:.5,depthTest:!1}),e.materials.semanticShape=new THREE.ShaderMaterial({uniforms:e._uSem,vertexShader:e.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}),e.materials.semanticShapeHL=new THREE.MeshBasicMaterial({color:e.colors.sem,transparent:!0,depthWrite:!1,opacity:.2}),e.materials.semanticShapeEdit=new THREE.MeshBasicMaterial({color:e.colors.orange,transparent:!0,depthWrite:!1,opacity:.5}),e.semIcon=new THREE.SpriteMaterial({map:(new THREE.TextureLoader).load(ATON.PATH_RES+"sui-sem.png"),transparent:!0,opacity:1,depthTest:!1}),e.materials.lp=new THREE.ShaderMaterial({vertexShader:e.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}),e.lpIcon=new THREE.SpriteMaterial({map:(new THREE.TextureLoader).load(ATON.PATH_RES+"sui-lp.png"),transparent:!0,opacity:1,depthWrite:!1}),e.semIcon.sizeAttenuation=!1,e.lpIcon.sizeAttenuation=!1},addMaterial:(t,a)=>{e.materials[t]?console.log("MatHub: material "+t+" already registered"):e.materials[t]=a},loadMaterial:(t,a)=>{e._loader.load(a,a=>{e.addMaterial(t,a)},void 0,e=>{console.log(e)})},getMaterial:t=>e.materials[t],update:()=>{e._uSem.time.value+=ATON._dt}};var t=e;exports.default=t; },{}],"P9TA":[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;let e={TSTRING_SEPARATOR:" ",init:()=>{ATON.device={},e.geomUnitSphere=new THREE.SphereGeometry(1,16,16),e.exporterGLTF=void 0,e.exporterOBJ=void 0,e._dlink=document.createElement("a"),e._dlink.style.display="none",document.body.appendChild(e._dlink),e.textureLoader=new THREE.TextureLoader},generateID:e=>(void 0===e&&(e="id"),e+"-"+Math.random().toString(36).substr(2,9)),goToURL:e=>{window.location.href=e},isConnectionSecure:()=>window.isSecureContext,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.fireEvent("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.fireEvent("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),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:r=>{let t=e.getFileExtension(r);return"mp4"===t||("webm"===t||void 0)},getBaseFolder:e=>{var r=e.lastIndexOf("/");return-1!==r?e.substring(0,r+1):""},isResourceURL:e=>!!e.startsWith("http://")||!!e.startsWith("https://"),URLify:e=>{const r=e.match(/(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)/g);return r&&r.forEach(function(r){e=e.replace(r,''+r+"")}),e},resolveCollectionURL:e=>e.startsWith("http")?e:ATON.PATH_COLLECTION+e,postJSON:(e,r,t,a)=>{$.ajax({url:e,type:"POST",xhrFields:{withCredentials:!0},data:JSON.stringify(r),contentType:"application/json; charset=utf-8",dataType:"json",success:e=>{t&&t(e)}}).fail(e=>{console.log(e),a&&a()})},mergeObject:e=>{e.updateMatrixWorld(!0);const r=[];e.traverse(e=>{if(e.isMesh){const t=e.geometry;t.applyMatrix4(e.matrixWorld),r.push(t.toNonIndexed())}});const t=THREE.BufferGeometryUtils.mergeBufferGeometries(r,!1),a=THREE.BufferGeometryUtils.mergeVertices(t).center(),o=new THREE.Group,i=new THREE.Mesh(a);return o.add(i),o},setPicking:(e,r,t)=>{void 0===t&&(t=!0),e.traverse(e=>{t?e.layers.enable(r):e.layers.disable(r)})},graphPostVisitor:r=>{r.visible?console.log(r):e.setPicking(r,r.type,!1)},updateTSetsCamera:e=>{void 0===e&&(e=ATON.Nav._camera);const r=ATON._tsets.length;if(!(r<=0))for(let t=0;t{let a=new TILES.TilesRenderer(r);if(!a)return;a.fetchOptions.mode="cors",a.setCamera(ATON.Nav._camera),a.setResolutionFromRenderer(ATON.Nav._camera,ATON._renderer);let o=!1;a.onLoadModel=(e=>{o||(ATON._onAllReqsCompleted(),o=!0),e.traverse(e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0),e.material&&(t.userData.cMat&&(e.material=t.userData.cMat),e.material.map&&(e.material.map.minFilter=THREE.LinearMipmapLinearFilter,e.material.map.magFilter=THREE.LinearFilter))})}),a.onDisposeModel=(e=>{e.traverse(e=>{e.isMesh&&e.material.dispose()})}),t.add(a.group),e.setPicking(t,t.type,!0),ATON._tsets.push(a)},modelVisitor:(e,r)=>{if(!r)return;let t=e,a=t.type;r.traverse(e=>{e.isMesh&&(a===ATON.NTYPES.SCENE&&(e.castShadow=!0,e.receiveShadow=!0,e.geometry&&(e.geometry.computeBoundsTree(),console.log("Computed visible BVH")),null!==e.material.map&&(e.material.map.generateMipmaps=!0,e.material.map.anisotropy=ATON.device.isMobile?0:ATON._maxAnisotropy,e.material.map.minFilter=THREE.LinearMipmapLinearFilter,e.material.map.magFilter=THREE.LinearFilter)),a===ATON.NTYPES.SEM&&(e.material=ATON.MatHub.materials.semanticShape,e.geometry&&(e.geometry.computeBoundsTree(),console.log("Computed semantic BVH"))),t.userData.cMat&&(e.material=t.userData.cMat))})},registerAniMixers:(e,r)=>{let t=r.scene||r.scene[0],a=!1;if(void 0===r.animations)return;let o=new THREE.AnimationMixer(t);r.animations.forEach(e=>{o.clipAction(e).play(),a=!0}),a&&(ATON._aniMixers.push(o),void 0===e._aniMixers&&(e._aniMixers=[]),e._aniMixers.push(o))},ccExtract:e=>{if(void 0===e)return;if(void 0===e.asset)return;let r={};if(e.asset.copyright&&(r.copyright=e.asset.copyright),e.asset.extras)for(let t in e.asset.extras)r[t]=e.asset.extras[t];e.asset.generator&&(r.generator=e.asset.generator),(e.asset.copyright||e.asset.extras)&&ATON._ccModels.push(r),console.log(r)},parseTransformString:r=>{let t=new THREE.Group,a=r.split(e.TSTRING_SEPARATOR),o=a.length;return o<3?t:(t.position.set(parseFloat(a[0]),parseFloat(a[1]),parseFloat(a[2])),o<6?t:(t.rotation.set(parseFloat(a[3]),parseFloat(a[4]),parseFloat(a[5])),o<9?t:(t.scale.set(parseFloat(a[6]),parseFloat(a[7]),parseFloat(a[8])),t)))},setVectorPrecision:(e,r)=>(e.x=parseFloat(e.x.toPrecision(r)),e.y=parseFloat(e.y.toPrecision(r)),e.z=parseFloat(e.z.toPrecision(r)),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=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:r=>{e(r)}})},getHumanReadableDistance:e=>{let r=" m";return e<.01?(r=" mm",r=(e*=1e3).toPrecision(3)+r):e<1?(r=" cm",r=(e*=100).toPrecision(3)+r):e>1e3?(r=" km",r=e.toPrecision(3)+r):r=e.toPrecision(3)+r},stripHTMLtagsFromString:e=>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:(r,t)=>{void 0!==t&&(e._dlink.href=URL.createObjectURL(r),e._dlink.download=t,e._dlink.click())},downloadText:(r,t)=>{e.downloadBlob(new Blob([r],{type:"text/plain"}),t)},downloadJSONobj:(r,t)=>{e.downloadText(JSON.stringify(r),t)},downloadArrayBuffer:(r,t)=>{e.downloadBlob(new Blob([r],{type:"application/octet-stream"}),t)},exportNode:(r,t)=>{let a=e.getFileExtension(t);if(!(a.length<1)){if("glb"===a||"gltf"===a){let o={binary:"glb"===a};void 0===e.exporterGLTF&&(e.exporterGLTF=new THREE.GLTFExporter),e.exporterGLTF.parse(r,r=>{r instanceof ArrayBuffer?e.downloadArrayBuffer(r,t):(console.log(r),e.downloadJSONobj(r,t))},o)}if("obj"===a){void 0===e.exporterOBJ&&(e.exporterOBJ=new THREE.OBJExporter);let a=e.exporterOBJ.parse(r);e.downloadText(a,t)}}},takeScreenshot:(r,t)=>{let a=new Image;console.log("Screenshot with size:"+r),ATON.Nav._camera.aspect=1,ATON.Nav._camera.updateProjectionMatrix(),ATON._renderer.setSize(r,r),ATON._renderer.render(ATON._mainRoot,ATON.Nav._camera);let o=ATON._renderer.domElement;if(ATON.FX.composer){ATON.FX.composer.setSize(r,r);let e=ATON.FX.passes[ATON.FX.PASS_AA].material.uniforms;e&&e.resolution.value.set(1/r,1/r),ATON.FX.composer.render(),o=ATON.FX.composer.renderer.domElement}let i=ATON._renderer.domElement.toDataURL();return a.src=i,t&&(e._dlink.href=i.replace("image/png","image/octet-stream"),e._dlink.download=t,e._dlink.click()),ATON._onResize(),a},assignLightProbeToMesh:(e,r)=>{void 0!==e&&void 0!==r&&(r.noLP||(r.userData.LP=e))},createATONCube:r=>{let t=new THREE.BoxBufferGeometry(1,1,1),a=new THREE.MeshStandardMaterial;e.textureLoader.load(ATON.PATH_RES+"models/aton-cube.jpg",e=>{e.encoding=THREE.sRGBEncoding,a.map=e});let o=ATON.createSceneNode(r);return o.add(new THREE.Mesh(t)),o.setMaterial(a),o.enablePicking(),o},createATONCubePBR:r=>{let t=new THREE.BoxBufferGeometry(1,1,1),a=new THREE.MeshStandardMaterial;a.metalness=1,e.textureLoader.load(ATON.PATH_RES+"models/aton-cube.jpg",e=>{e.encoding=THREE.sRGBEncoding,a.map=e}),e.textureLoader.load(ATON.PATH_RES+"models/aton-cube-pbr.jpg",e=>{e.encoding=THREE.sRGBEncoding,a.metalnessMap=e,a.roughnessMap=e}),e.textureLoader.load(ATON.PATH_RES+"models/aton-cube-nrm.png",e=>{e.encoding=THREE.sRGBEncoding,a.normalMap=e});let o=ATON.createSceneNode(r);return o.add(new THREE.Mesh(t)),o.setMaterial(a),o.enablePicking(),o},createGround:(r,t,a)=>{void 0===t&&(t=1),void 0===a&&(a=1);let o=new THREE.PlaneBufferGeometry(t,a),i=new THREE.MeshStandardMaterial;void 0!==r&&e.textureLoader.load(r,e=>{e.encoding=THREE.sRGBEncoding,i.map=e});let s=ATON.createSceneNode().rotateX(.5*-Math.PI);return s.add(new THREE.Mesh(o,i)),s.enablePicking(),s}};var r=e;exports.default=r; +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;let e={TSTRING_SEPARATOR:" ",init:()=>{ATON.device={},e.geomUnitSphere=new THREE.SphereGeometry(1,16,16),e.exporterGLTF=void 0,e.exporterOBJ=void 0,e._dlink=document.createElement("a"),e._dlink.style.display="none",document.body.appendChild(e._dlink),e.textureLoader=new THREE.TextureLoader},generateID:e=>(void 0===e&&(e="id"),e+"-"+Math.random().toString(36).substr(2,9)),goToURL:e=>{window.location.href=e},isConnectionSecure:()=>window.isSecureContext,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.fireEvent("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.fireEvent("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),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:r=>{let t=e.getFileExtension(r);return"mp4"===t||("webm"===t||void 0)},getBaseFolder:e=>{var r=e.lastIndexOf("/");return-1!==r?e.substring(0,r+1):""},isResourceURL:e=>!!e.startsWith("http://")||!!e.startsWith("https://"),URLify:e=>{const r=e.match(/(((ftp|https?):\/\/)[\-\w@:%_\+.~#?,&\/\/=]+)/g);return r&&r.forEach(function(r){e=e.replace(r,''+r+"")}),e},resolveCollectionURL:e=>e.startsWith("http")?e:ATON.PATH_COLLECTION+e,postJSON:(e,r,t,a)=>{$.ajax({url:e,type:"POST",xhrFields:{withCredentials:!0},data:JSON.stringify(r),contentType:"application/json; charset=utf-8",dataType:"json",success:e=>{t&&t(e)}}).fail(e=>{console.log(e),a&&a()})},mergeObject:e=>{e.updateMatrixWorld(!0);const r=[];e.traverse(e=>{if(e.isMesh){const t=e.geometry;t.applyMatrix4(e.matrixWorld),r.push(t.toNonIndexed())}});const t=THREE.BufferGeometryUtils.mergeBufferGeometries(r,!1),a=THREE.BufferGeometryUtils.mergeVertices(t).center(),o=new THREE.Group,i=new THREE.Mesh(a);return o.add(i),o},setPicking:(e,r,t)=>{void 0===t&&(t=!0),e.traverse(e=>{t?e.layers.enable(r):e.layers.disable(r)})},graphPostVisitor:r=>{r.visible?console.log(r):e.setPicking(r,r.type,!1)},updateTSetsCamera:e=>{void 0===e&&(e=ATON.Nav._camera);const r=ATON._tsets.length;if(!(r<=0))for(let t=0;t{let a=new TILES.TilesRenderer(r);if(!a)return;a.fetchOptions.mode="cors",a.setCamera(ATON.Nav._camera),a.setResolutionFromRenderer(ATON.Nav._camera,ATON._renderer);let o=!1;a.onLoadModel=(e=>{o||(ATON._onAllReqsCompleted(),o=!0),e.traverse(e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0),e.material&&(t.userData.cMat&&(e.material=t.userData.cMat),e.material.map&&(e.material.map.minFilter=THREE.LinearMipmapLinearFilter,e.material.map.magFilter=THREE.LinearFilter))})}),a.onDisposeModel=(e=>{e.traverse(e=>{e.isMesh&&e.material.dispose()})}),t.add(a.group),e.setPicking(t,t.type,!0),ATON._tsets.push(a)},modelVisitor:(e,r)=>{if(void 0===r)return;if(void 0===e)return;let t=e.type;r.traverse(r=>{r.isMesh&&(t===ATON.NTYPES.SCENE&&(r.castShadow=!0,r.receiveShadow=!0,r.geometry&&(r.geometry.computeBoundsTree(),console.log("Computed visible BVH")),null!==r.material.map&&(r.material.map.generateMipmaps=!0,r.material.map.anisotropy=ATON.device.isMobile?0:ATON._maxAnisotropy,r.material.map.minFilter=THREE.LinearMipmapLinearFilter,r.material.map.magFilter=THREE.LinearFilter)),t===ATON.NTYPES.SEM&&(r.material=ATON.MatHub.materials.semanticShape,r.geometry&&(r.geometry.computeBoundsTree(),console.log("Computed semantic BVH"))),e.userData.cMat&&(r.material=e.userData.cMat))})},registerAniMixers:(e,r)=>{let t=r.scene||r.scene[0],a=!1;if(void 0===r.animations)return;let o=new THREE.AnimationMixer(t);r.animations.forEach(e=>{o.clipAction(e).play(),a=!0}),a&&(ATON._aniMixers.push(o),void 0===e._aniMixers&&(e._aniMixers=[]),e._aniMixers.push(o))},ccExtract:e=>{if(void 0===e)return;if(void 0===e.asset)return;let r={};if(e.asset.copyright&&(r.copyright=e.asset.copyright),e.asset.extras)for(let t in e.asset.extras)r[t]=e.asset.extras[t];e.asset.generator&&(r.generator=e.asset.generator),(e.asset.copyright||e.asset.extras)&&ATON._ccModels.push(r),console.log(r)},parseTransformString:r=>{let t=new THREE.Group,a=r.split(e.TSTRING_SEPARATOR),o=a.length;return o<3?t:(t.position.set(parseFloat(a[0]),parseFloat(a[1]),parseFloat(a[2])),o<6?t:(t.rotation.set(parseFloat(a[3]),parseFloat(a[4]),parseFloat(a[5])),o<9?t:(t.scale.set(parseFloat(a[6]),parseFloat(a[7]),parseFloat(a[8])),t)))},setVectorPrecision:(e,r)=>(e.x=parseFloat(e.x.toPrecision(r)),e.y=parseFloat(e.y.toPrecision(r)),e.z=parseFloat(e.z.toPrecision(r)),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=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:r=>{e(r)}})},getHumanReadableDistance:e=>{let r=" m";return e<.01?(r=" mm",r=(e*=1e3).toPrecision(3)+r):e<1?(r=" cm",r=(e*=100).toPrecision(3)+r):e>1e3?(r=" km",r=e.toPrecision(3)+r):r=e.toPrecision(3)+r},stripHTMLtagsFromString:e=>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:(r,t)=>{void 0!==t&&(e._dlink.href=URL.createObjectURL(r),e._dlink.download=t,e._dlink.click())},downloadText:(r,t)=>{e.downloadBlob(new Blob([r],{type:"text/plain"}),t)},downloadJSONobj:(r,t)=>{e.downloadText(JSON.stringify(r),t)},downloadArrayBuffer:(r,t)=>{e.downloadBlob(new Blob([r],{type:"application/octet-stream"}),t)},exportNode:(r,t)=>{let a=e.getFileExtension(t);if(!(a.length<1)){if("glb"===a||"gltf"===a){let o={binary:"glb"===a};void 0===e.exporterGLTF&&(e.exporterGLTF=new THREE.GLTFExporter),e.exporterGLTF.parse(r,r=>{r instanceof ArrayBuffer?e.downloadArrayBuffer(r,t):(console.log(r),e.downloadJSONobj(r,t))},o)}if("obj"===a){void 0===e.exporterOBJ&&(e.exporterOBJ=new THREE.OBJExporter);let a=e.exporterOBJ.parse(r);e.downloadText(a,t)}}},takeScreenshot:(r,t)=>{let a=new Image;console.log("Screenshot with size:"+r),ATON.Nav._camera.aspect=1,ATON.Nav._camera.updateProjectionMatrix(),ATON._renderer.setSize(r,r),ATON._renderer.render(ATON._mainRoot,ATON.Nav._camera);let o=ATON._renderer.domElement;if(ATON.FX.composer){ATON.FX.composer.setSize(r,r);let e=ATON.FX.passes[ATON.FX.PASS_AA].material.uniforms;e&&e.resolution.value.set(1/r,1/r),ATON.FX.composer.render(),o=ATON.FX.composer.renderer.domElement}let i=ATON._renderer.domElement.toDataURL();return a.src=i,t&&(e._dlink.href=i.replace("image/png","image/octet-stream"),e._dlink.download=t,e._dlink.click()),ATON._onResize(),a},assignLightProbeToMesh:(e,r)=>{void 0!==e&&void 0!==r&&(r.noLP||(r.userData.LP=e))},createATONCube:r=>{let t=new THREE.BoxBufferGeometry(1,1,1),a=new THREE.MeshStandardMaterial;e.textureLoader.load(ATON.PATH_RES+"models/aton-cube.jpg",e=>{e.encoding=THREE.sRGBEncoding,a.map=e});let o=ATON.createSceneNode(r);return o.add(new THREE.Mesh(t)),o.setMaterial(a),o.enablePicking(),o},createATONCubePBR:r=>{let t=new THREE.BoxBufferGeometry(1,1,1),a=new THREE.MeshStandardMaterial;a.metalness=1,e.textureLoader.load(ATON.PATH_RES+"models/aton-cube.jpg",e=>{e.encoding=THREE.sRGBEncoding,a.map=e}),e.textureLoader.load(ATON.PATH_RES+"models/aton-cube-pbr.jpg",e=>{e.encoding=THREE.sRGBEncoding,a.metalnessMap=e,a.roughnessMap=e}),e.textureLoader.load(ATON.PATH_RES+"models/aton-cube-nrm.png",e=>{e.encoding=THREE.sRGBEncoding,a.normalMap=e});let o=ATON.createSceneNode(r);return o.add(new THREE.Mesh(t)),o.setMaterial(a),o.enablePicking(),o},createGround:(r,t,a)=>{void 0===t&&(t=1),void 0===a&&(a=1);let o=new THREE.PlaneBufferGeometry(t,a),i=new THREE.MeshStandardMaterial;void 0!==r&&e.textureLoader.load(r,e=>{e.encoding=THREE.sRGBEncoding,i.map=e});let s=ATON.createSceneNode().rotateX(.5*-Math.PI);return s.add(new THREE.Mesh(o,i)),s.enablePicking(),s}};var r=e;exports.default=r; },{}],"qC8Z":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;let e={MODE_ADD:0,MODE_DEL:1,FLOAT_PREC:5,init:()=>{e.currID=void 0,e.currData=void 0,e._bEdit=!1,e._bLoading=!1,e._title=void 0,e._descr=void 0,e.initBaseParsers()},setEditMode:o=>{e._bEdit=o,console.log("Edit mode:"+o)},load:(o,t,i)=>(e._bLoading=!0,console.log("Loading Scene: "+t),$.getJSON(o,o=>{e.currData=o,e.currID=t,e._bLoading=!1,e.parseScene(o),i&&i(),ATON.fireEvent("SceneJSONLoaded",t)})),parseScene:o=>{if(void 0!==(o=void 0===o?e.currData:o))for(let t in o)e._jsonParsers[t]&&e._jsonParsers[t](o[t])},getJSONchildren:(e,o)=>{void 0===o&&(o=ATON.NTYPES.SCENE);let t=void 0,i=[];if(o===ATON.NTYPES.SEM&&(t=ATON.getSemanticNode(e)),o===ATON.NTYPES.SCENE&&(t=ATON.getSceneNode(e)),void 0!==t){for(let e in t.children){let o=t.children[e];void 0!==o.nid&&i.push(o.nid)}return i}},getJSONgraphEdges:e=>{void 0===e&&(e=ATON.NTYPES.SCENE);let o=ATON.snodes;e===ATON.NTYPES.SEM&&(o=ATON.semnodes),e===ATON.NTYPES.UI&&(o=ATON.uinodes);let t={};for(let i in o){let e=o[i];e&&e.parent&&e.parent.nid&&(void 0===t[e.parent.nid]&&(t[e.parent.nid]=[]),t[e.parent.nid].push(e.nid))}return t},getJSONsemanticSpheresList:o=>{let t=ATON.getSemanticNode(o);if(void 0===t)return;let i=[];for(let s in t.children){let o=t.children[s];o.type&&i.push([parseFloat(o.position.x.toPrecision(e.FLOAT_PREC)),parseFloat(o.position.y.toPrecision(e.FLOAT_PREC)),parseFloat(o.position.z.toPrecision(e.FLOAT_PREC)),parseFloat(o.scale.x.toPrecision(e.FLOAT_PREC))])}return i},getJSONsemanticConvexShapes:e=>{let o=ATON.getSemanticNode(e);if(void 0===o)return;let t=[];for(let i in o.children){let e=o.children[i];e.userData._convexPoints&&t.push(e.userData._convexPoints)}return t},initBaseParsers:()=>{e._jsonParsers={},e._jsonParsers.title=(o=>{void 0!==o&&e.setTitle(o)}),e._jsonParsers.description=(o=>{void 0!==o&&e.setDescription(o)}),e._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)))}),e._jsonParsers.environment=(e=>{let o=e.mainpano;e.mainpano&&(o.url&&ATON.setMainPanorama(o.url),o.rotation&&ATON.setMainPanoramaRotation(o.rotation)),e.bgcolor&&ATON.setBackgroundColor(new THREE.Color(e.bgcolor[0],e.bgcolor[1],e.bgcolor[2]));let t=e.mainlight;t?(t.direction&&ATON.setMainLightDirection(new THREE.Vector3(t.direction[0],t.direction[1],t.direction[2])),ATON._dMainL?(t.color&&(ATON._dMainL.color=new THREE.Color(t.color[0],t.color[1],t.color[2])),t.intensity&&(ATON._dMainL.intensity=t.intensity),void 0!==t.shadows?ATON.toggleShadows(t.shadows):ATON.toggleShadows(!1)):ATON.toggleMainLight(!1)):ATON.toggleMainLight(!1);let i=e.lightprobes;i&&i.auto&&ATON.setAutoLP(!0),e.exposure&&ATON.setExposure(e.exposure)}),e._jsonParsers.soundscape=(e=>{void 0!==e&&e.global&&ATON.setGlobalAudio(e.global.url,e.global.loop)}),e._jsonParsers.navmode=(e=>{void 0!==e&&ATON.Nav.setNavMode(e)}),e._jsonParsers.measurements=(e=>{if(void 0!==e)for(let o in e){let t=e[o];if(t.points&&6===t.points.length){let e=new THREE.Vector3(parseFloat(t.points[0]),parseFloat(t.points[1]),parseFloat(t.points[2])),o=new THREE.Vector3(parseFloat(t.points[3]),parseFloat(t.points[4]),parseFloat(t.points[5]));ATON.SUI.addMeasurementPoint(e),ATON.SUI.addMeasurementPoint(o)}}}),e._jsonParsers.viewpoints=(e=>{if(void 0!==e)for(let o in e){let t=e[o];"home"===o?ATON.Nav.setHomePOV((new ATON.POV).setPosition(t.position[0],t.position[1],t.position[2]).setTarget(t.target[0],t.target[1],t.target[2]).setFOV(t.fov)):new ATON.POV(o).setPosition(t.position[0],t.position[1],t.position[2]).setTarget(t.target[0],t.target[1],t.target[2]).setFOV(t.fov)}}),e._jsonParsers.scenegraph=(e=>{if(void 0===e)return;let o=e.nodes,t=e.edges;for(let i in o){let e=o[i],t=ATON.getOrCreateSceneNode(i).removeChildren(),s=e.transform;s&&(s.position&&t.setPosition(s.position[0],s.position[1],s.position[2]),s.rotation&&t.setRotation(s.rotation[0],s.rotation[1],s.rotation[2]),s.scale&&t.setScale(s.scale[0],s.scale[1],s.scale[2]),s.list&&Array.isArray(s.list));let r=e.urls;r&&(Array.isArray(r)?r.forEach(e=>{ATON.createSceneNode().load(e).attachTo(t)}):t.load(r)),e.shadowcast&&t.setShadowCast(e.shadowcast),e.shadowreceive&&t.setShadowCast(e.shadowreceive),e.toYup&&t.setYup(),e.keywords&&(t.kwords=e.keywords)}for(let i in t){let e=t[i],o=ATON.getSceneNode(i);if(void 0!==o)for(let t in e){let i=e[t],s=ATON.getSceneNode(i);void 0!==s&&s.attachTo(o)}}for(let i in o){let e=o[i],t=ATON.getSceneNode(i);if(void 0!==t&&(void 0!==e.show&&(e.show?(t.show(),console.log("show "+i)):(t.hide(),console.log("hide "+i))),e.material)){let o=new THREE.MeshStandardMaterial(e.material);t.setMaterial(o)}}}),e._jsonParsers.semanticgraph=(e=>{if(void 0===e)return;let o=e.nodes,t=e.edges;for(let i in o){let e=o[i],t=ATON.getOrCreateSemanticNode(i).removeChildren(),s=e.urls;s&&(Array.isArray(s)?s.forEach(e=>{ATON.createSemanticNode().load(e).attachTo(t)}):t.load(s)),e.toYup&&t.setYup(),e.description&&t.setDescription(e.description),e.audio&&t.setAudio(e.audio),e.keywords&&(t.kwords=e.keywords);let r=e.spheres;if(Array.isArray(r))for(let o in r){let e=r[o],t=new THREE.Vector3(parseFloat(e[0]),parseFloat(e[1]),parseFloat(e[2]));ATON.SemFactory.createSphere(i,t,parseFloat(e[3]))}let a=e.convexshapes;if(Array.isArray(a))for(let o in a){let e=a[o],t=[];for(let o=0;o{e._jsonParsers[o]=t},sendEdit:(o,t,i)=>{if(e._bLoading||!e._bEdit)return;if(void 0===o)return;void 0===t&&(t=e.MODE_ADD);let s=e.currID,r={};r.sid=s,r.data=o,r.mode=t===e.MODE_DEL?"DEL":"ADD";let a=JSON.stringify(r);o=null,r=null,$.ajax({url:ATON.PATH_RESTAPI+"edit/scene",type:"POST",data:a,contentType:"application/json; charset=utf-8",dataType:"json",success:o=>{o&&(e.currData=o),i&&i()}})},setTitle:o=>{e._title=o},getTitle:()=>e._title,setDescription:o=>{e._descr=o},getDescription:()=>e._descr};var o=e;exports.default=o; },{}],"mYhb":[function(require,module,exports) { @@ -41,6 +41,6 @@ parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcel },{}],"lJ6J":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;let s={PASS_BASE:0,PASS_AA:1,PASS_AO:2,PASS_SSR:3,PASS_BLOOM:4,PASS_DOF:5,PASS_GAMMA:6,init:()=>{if(void 0===ATON._renderer)return;s.composer=new THREE.EffectComposer(ATON._renderer),s.passes=[],ATON._renderer.autoClear=!1;let e=window.innerWidth*ATON._stdpxd,o=window.innerHeight*ATON._stdpxd;s.passes[s.PASS_BASE]=new THREE.RenderPass(ATON._mainRoot,ATON.Nav._camera),s.composer.addPass(s.passes[s.PASS_BASE]),s.passes[s.PASS_AO]=new THREE.SAOPass(ATON._mainRoot,ATON.Nav._camera,!1,!0),s.passes[s.PASS_AO].params.saoBias=1,s.passes[s.PASS_AO].params.saoScale=100,s.passes[s.PASS_AO].params.saoIntensity=.2,s.passes[s.PASS_BLOOM]=new THREE.UnrealBloomPass(new THREE.Vector2(e,o),1.5,.4,.85),s.passes[s.PASS_BLOOM].threshold=.9,s.passes[s.PASS_BLOOM].strength=1,s.passes[s.PASS_BLOOM].radius=0;s.passes[s.PASS_DOF]=new THREE.BokehPass(ATON._mainRoot,ATON.Nav._camera,{focus:5,aperture:.001,maxblur:.01,width:e,height:o}),s.passes[s.PASS_GAMMA]=new THREE.ShaderPass(THREE.GammaCorrectionShader),s.passes[s.PASS_AA]=new THREE.ShaderPass(THREE.FXAAShader),s.passes[s.PASS_AA].material.uniforms.resolution.value.set(1/e,1/o),s.composer.addPass(s.passes[s.PASS_AO]),s.composer.addPass(s.passes[s.PASS_BLOOM]),s.composer.addPass(s.passes[s.PASS_GAMMA]),s.composer.addPass(s.passes[s.PASS_AA]),s.composer.addPass(s.passes[s.PASS_DOF]),s.togglePass(s.PASS_AO,!1),s.togglePass(s.PASS_BLOOM,!1),s.togglePass(s.PASS_DOF,!1),console.log(s.composer)},togglePass:(e,o)=>{if(void 0===s.composer)return;if(ATON.device.lowGPU)return;void 0!==s.passes[e]&&(s.passes[e].enabled=void 0===o?!s.passes[e].enabled:o)},isPassEnabled:e=>{if(void 0===s.composer)return!1;return void 0!==s.passes[e]&&s.passes[e].enabled},setAOintensity:e=>{void 0!==s.composer&&void 0!==s.passes[s.PASS_AO]&&(s.passes[s.PASS_AO].params.saoIntensity=e)},getAOintensity:()=>void 0===s.composer?0:void 0===s.passes[s.PASS_AO]?0:s.passes[s.PASS_AO].params.saoIntensity,setBloomStrength:e=>{void 0!==s.composer&&void 0!==s.passes[s.PASS_BLOOM]&&(s.passes[s.PASS_BLOOM].strength=e)},getBloomStrength:()=>void 0===s.composer?0:void 0===s.passes[s.PASS_BLOOM]?0:s.passes[s.PASS_BLOOM].strength,setBloomThreshold:e=>{void 0!==s.composer&&void 0!==s.passes[s.PASS_BLOOM]&&(s.passes[s.PASS_BLOOM].threshold=e)},getBloomThreshold:()=>void 0===s.composer?0:void 0===s.passes[s.PASS_BLOOM]?0:s.passes[s.PASS_BLOOM].threshold,setDOFfocus:e=>{if(void 0===s.composer)return;if(void 0===s.passes[s.PASS_DOF])return;let o=s.passes[s.PASS_DOF].uniforms;void 0!==o&&(o.focus.value=e)},getDOFfocus:()=>{if(void 0===s.composer)return 0;if(void 0===s.passes[s.PASS_DOF])return 0;let e=s.passes[s.PASS_DOF].uniforms;return void 0===e?0:e.focus.value},setDOFaperture:e=>{if(void 0===s.composer)return;if(void 0===s.passes[s.PASS_DOF])return;let o=s.passes[s.PASS_DOF].uniforms;void 0!==o&&(o.aperture.value=e)}};var e=s;exports.default=e; },{}],"yaoK":[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=g(require("./ATON.node.js")),o=g(require("./ATON.pov.js")),n=g(require("./ATON.lightprobe.js")),t=g(require("./ATON.eventhub.js")),a=g(require("./ATON.mathub.js")),i=g(require("./ATON.utils.js")),r=g(require("./ATON.scenehub.js")),d=g(require("./ATON.audiohub.js")),s=g(require("./ATON.nav.js")),_=g(require("./ATON.xr.js")),l=g(require("./ATON.sui.js")),c=g(require("./ATON.vroadcast.js")),u=g(require("./ATON.semfactory.js")),v=g(require("./ATON.fe.js")),S=g(require("./ATON.mediarec.js")),m=g(require("./ATON.geoloc.js")),p=g(require("./ATON.apphub.js")),h=g(require("./ATON.fx.js"));function g(e){return e&&e.__esModule?e:{default:e}}let P={};window.ATON=P,P.Node=e.default,P.POV=o.default,P.LightProbe=n.default,P.EventHub=t.default,P.Utils=i.default,P.SceneHub=r.default,P.MatHub=a.default,P.Nav=s.default,P.AudioHub=d.default,P.XR=_.default,P.SUI=l.default,P.VRoadcast=c.default,P.SemFactory=u.default,P.FE=v.default,P.MediaRec=S.default,P.GeoLoc=m.default,P.AppHub=p.default,P.FX=h.default,P.STD_UPVECTOR=new THREE.Vector3(0,1,0),P.ROOT_NID=".",P.RAD2DEG=180/Math.PI,P.DEG2RAD=Math.PI/180,P.PATCH_ADD=0,P.PATCH_DEL=1,P.NTYPES={},P.NTYPES.SCENE=3,P.NTYPES.SEM=4,P.NTYPES.UI=5,P.PATH_RESTAPI=window.location.origin+"/api/",P.PATH_RESTAPI_SCENE=P.PATH_RESTAPI+"scene/",P.PATH_WAPPS=window.location.origin+"/a/",P.PATH_MODS=window.location.origin+"/mods/",P.PATH_DRACO_LIB=window.location.origin+"/dist/draco/",P.PATH_BASIS_LIB=window.location.origin+"/dist/basis/",P.PATH_IFC_LIB=window.location.origin+"/dist/ifc/",P.PATH_COLLECTION=window.location.origin+"/collections/",P.PATH_SCENES=window.location.origin+"/scenes/",P.PATH_RES=window.location.origin+"/res/",P.PATH_FE=window.location.origin+"/fe/",P.SHADOWS_NEAR=.1,P.SHADOWS_FAR=50,P.SHADOWS_SIZE=15,P.SHADOWS_RES=1024,P.AMB_L=.1,P.setPathCollection=(e=>{P.PATH_COLLECTION=e}),P.setPathScenes=(e=>{P.PATH_SCENES=e}),P._onUserInteraction=(()=>{P._elPanoVideo&&!P._vpanoPlaying&&P._elPanoVideo.play(),"suspended"===P.AudioHub._listener.context.state&&P.AudioHub._listener.context.resume()}),P._setupBaseListeners=(()=>{let e=P._renderer.domElement;window.addEventListener("resize",P._onResize,!1),window.onorientationchange=P._readDeviceOrientationMode,screenfull.isEnabled&&screenfull.on("change",()=>{P._bFS=screenfull.isFullscreen,P.fireEvent("Fullscreen",P._bFS),P._bFS?console.log("Now fullscreen"):console.log("Exit fullscreen")}),e.addEventListener("mousemove",P._updateScreenMove,!1),e.addEventListener("mousedown",e=>{1===e.button&&P.fireEvent("MouseMidButton"),2===e.button&&P.fireEvent("MouseRightButton")}),e.addEventListener("wheel",P._onMouseWheel,!1),P._bPointerDown=!1,window.addEventListener("pointerdown",e=>{P._bPointerDown=!0,P._onUserInteraction()}),window.addEventListener("pointerup",e=>{P._bPointerDown=!1}),window.addEventListener("pointermove",e=>{P._bPointerDown&&(P._updateScreenMove(e),P._handleQueries())}),window.addEventListener("touchstart",e=>{P._bPointerDown=!0,P._onUserInteraction()}),window.addEventListener("touchend",e=>{P._bPointerDown=!1}),window.addEventListener("touchmove",e=>{P._bPointerDown&&(P._updateScreenMove(e.touches[0]),P._handleQueries())}),Hammer(e).on("doubletap",e=>{P._bPointerDown=!1,P.fireEvent("DoubleTap",e.srcEvent)}),Hammer(e).on("tap",e=>{if(P._bPointerDown=!1,P._onUserInteraction(),P._updateScreenMove(e.srcEvent),P._handleQueries(),P.fireEvent("Tap",e.srcEvent),void 0===P._hoveredUI)return;let o=P.getUINode(P._hoveredUI);o&&o.onSelect&&o.onSelect()}),P.on("DoubleTap",e=>{P.defaultDoubleTapFromScreenCoords(e)}),P._kModShift=!1,P._kModCtrl=!1,P._bListenKeyboardEvents=!0,window.addEventListener("keydown",e=>{P._onUserInteraction(),"Shift"===e.key&&(P._kModShift=!0),"Control"===e.key&&(P._kModCtrl=!0),P._bListenKeyboardEvents&&P.fireEvent("KeyPress",e.key)},!1),window.addEventListener("keyup",e=>{"Shift"===e.key&&(P._kModShift=!1),"Control"===e.key&&(P._kModCtrl=!1),P._bListenKeyboardEvents&&P.fireEvent("KeyUp",e.key)},!1),P.on("KeyPress",e=>{if("+"===e){let e=P.Nav.getFOV()+1;P.Nav.setFOV(e)}if("-"===e){let e=P.Nav.getFOV()-1;P.Nav.setFOV(e)}if("PageUp"===e){let e=P.SUI.mainSelector.scale.x+.02;P.SUI.setSelectorRadius(e)}if("PageDown"===e){let e=P.SUI.mainSelector.scale.x-.02;e=Math.max(e,.01),P.SUI.setSelectorRadius(e)}})}),P._onResize=(()=>{if(P.Nav._camera.aspect=window.innerWidth/window.innerHeight,P.Nav._camera.updateProjectionMatrix(),P._renderer.setSize(window.innerWidth,window.innerHeight),P.FX.composer){P.FX.composer.setSize(window.innerWidth,window.innerHeight);let e=P.FX.passes[P.FX.PASS_AA].material.uniforms;e&&e.resolution.value.set(1/window.innerWidth,1/window.innerHeight)}console.log("onResize")}),P._onMouseWheel=(e=>{e.preventDefault(),P.fireEvent("MouseWheel",e.deltaY)}),P.focusOn3DView=(()=>{P._renderer.domElement.focus()}),P._SUIactivation=(()=>{const e=P.getUINode(P._hoveredUI);return void 0!==e&&(void 0!==e.onSelect&&(e.onSelect(),!0))}),P._stdActivation=(()=>{if(P._SUIactivation())return;if(!P.Nav._bControl)return;if(P.XR._bPresenting)return"immersive-vr"===_.default._sessionType&&_.default.teleportOnQueriedPoint(),void P.FE.playAudioFromSemanticNode(P._hoveredSemNode);if(P.Nav.isFirstPerson()||P.Nav.isDevOri()){if(P.Nav.currentQueryValidForLocomotion()){let e=P._queryDataScene.p,o=P.Nav._vDir,n=new THREE.Vector3(e.x,e.y+P.userHeight,e.z),t=new THREE.Vector3(n.x+o.x,n.y+o.y,n.z+o.z),a=(new P.POV).setPosition(n).setTarget(t).setFOV(P.Nav._currPOV.fov);P.Nav.requestPOV(a,.5)}return}let e=P.getSemanticNode(P._hoveredSemNode);P._queryDataSem&&e?P.Nav.requestPOVbyNode(e,.5):P._queryDataScene&&P.Nav.requestRetarget(P._queryDataScene.p,void 0,.5)}),P.defaultDoubleTapFromScreenCoords=(e=>{P._updateScreenMove(e),P._handleQueryScene(),P._stdActivation()}),P.isFullscreen=(()=>P._bFS),P.toggleFullScreen=(()=>{screenfull.toggle()}),P.realize=(()=>{console.log("Initialize ATON..."),P.Utils.init(),P.Utils.profileDevice(),P._clock=new THREE.Clock(!0),P._bFS=!1;P._renderer=new THREE.WebGLRenderer({antialias:!0,alpha:!1,powerPreference:"high-performance"}),P._renderer.setSize(window.innerWidth,window.innerHeight),P.Utils.profileRenderingCapabilities(),P._stdpxd=1,P._renderer.setPixelRatio(P._stdpxd),P._fps=60,P._dt=.01,P._dtAccum=0,P._avgFPScount=0,P._avgFPSaccum=0,P._avgFPS=60,P._bDynamicDensity=!1,P._dRenderBudgetMinFPS=30,P._dRenderBudgetMaxFPS=55,P._aniMixers=[],P._renderer.outputEncoding=THREE.sRGBEncoding,P._renderer.toneMapping=THREE.LinearToneMapping,P._renderer.toneMappingExposure=1,P._renderer.setAnimationLoop(P._onFrame),P._maxAnisotropy=P._renderer.capabilities.getMaxAnisotropy(),THREE.Cache.enabled=!0,P.userHeight=1.7,document.body.appendChild(P._renderer.domElement);let e=P._renderer.domElement;e.style.outline="none",e.style.border="none",P._vpanoPlaying=!1,P._bUserInts=0,P.EventHub.init(),P.MatHub.init(),P._assetsManager={},P._aLoader=new THREE.GLTFLoader,P._numReqLoad=0,P._dracoLoader=new THREE.DRACOLoader,P._dracoLoader.setDecoderConfig({type:"wasm"}),P._dracoLoader.setDecoderPath(P.PATH_DRACO_LIB),P._dracoLoader.setWorkerLimit(2),P._dracoLoader.preload(),P._aLoader.setDRACOLoader(P._dracoLoader),P._ccModels=[],P._updRoutines=[],P._lps=[],P._bAutoLP=!1,P._envMapInt=1,P._bShadowsFixedBound=!1,P._shadowsFixedBoundCenter=void 0,P._shadowsNear=P.SHADOWS_NEAR,P._shadowsFar=P.SHADOWS_FAR,P._shadowsSize=P.SHADOWS_SIZE,P._shadowsRes=P.SHADOWS_RES,P.initGraphs(),P.SceneHub.init(),P._tsets=[],P.AudioHub.init(),P.Nav.init(),P.XR.init(),P.SUI.init(),P.VRoadcast.init(),P.MediaRec.init(),P.SemFactory.init(),P.AppHub.init(),P.GeoLoc.init(),P.device.lowGPU||P.FX.init(),P._queryDataScene=void 0,P._queryDataSem=void 0,P._queryDataUI=void 0,P._hoveredSemNode=void 0,P._hoveredUI=void 0,P._bQuerySemOcclusion=!0,P._bQueryNormals=!0,P._bPauseQuery=!1,P._bCenteredQuery=!1,P._bqScene=!1,P._bqSem=!1,P._tgiDur=void 0,P._tgiPer=void 0,P._tHover=void 0,P._bMainPanoInfinite=!0,P._matMainPano=void 0,P._mMainPano=void 0,P._screenPointerCoords=new THREE.Vector2(0,0),P._rcScene=new THREE.Raycaster,P._rcScene.layers.set(P.NTYPES.SCENE),P._rcSemantics=new THREE.Raycaster,P._rcSemantics.layers.set(P.NTYPES.SEM),P._rcUI=new THREE.Raycaster,P._rcUI.layers.set(P.NTYPES.UI),P._registerRCS(),P._setupBaseListeners(),P.device.isMobile&&P._readDeviceOrientationMode(),P._wappID=void 0,P._extAPItokens={},P.focusOn3DView()}),P.setTimedGazeDuration=(e=>{P._tgiDur=e}),P.getTimedGazeProgress=(()=>{if(void 0!==P._tgiDur)return P._tgiPer}),P.getElapsedTime=(()=>P._clock.elapsedTime),P.renderPause=(()=>{P._renderer.setAnimationLoop(void 0)}),P.renderResume=(()=>{P._renderer.setAnimationLoop(P._onFrame)}),P._setupLoadManager=(()=>{P._loadManager=new THREE.LoadingManager,P._loadManager.onStart=((e,o,n)=>{console.log("Started loading file: "+e+".\nLoaded "+o+" of "+n+" files."),P.fireEvent("NodeRequestFired",e)}),P._loadManager.onLoad=(()=>{console.log("Loading complete!"),P.fireEvent("AllNodeRequestsCompleted")}),P._loadManager.onProgress=((e,o,n)=>{}),P._loadManager.onError=(e=>{console.log("There was an error loading "+e)})}),P.setDefaultPixelDensity=(e=>{P._stdpxd=e,P._renderer.setPixelRatio(e),P.FX.composer&&P.FX.composer.setPixelRatio(e),void 0!==P._renderer.xr&&(P.device.isMobile?P._renderer.xr.setFramebufferScaleFactor(P._stdpxd*P.XR.MOBILE_DENSITY_F):P._renderer.xr.setFramebufferScaleFactor(P._stdpxd))}),P.resetPixelDensity=(()=>{P._renderer.setPixelRatio(P._stdpxd)}),P._readDeviceOrientationMode=(()=>{90===Math.abs(window.orientation)?(console.log("Landscape Mode"),P.fireEvent("MobileLandscapeMode")):(console.log("Portrait Mode"),P.fireEvent("MobilePortraitMode")),setTimeout(P._onResize,500)}),P.snodes={},P.semnodes={},P.uinodes={},P.createSceneNode=(e=>new P.Node(e,P.NTYPES.SCENE)),P.getSceneNode=(e=>{if(void 0!==e)return P.snodes[e]}),P.getOrCreateSceneNode=(e=>{let o=P.getSceneNode(e);return void 0!==o?o:P.createSceneNode(e)}),P.getRootScene=(()=>P._rootVisible),P.createSemanticNode=(e=>new P.Node(e,P.NTYPES.SEM)),P.getSemanticNode=(e=>{if(void 0!==e)return P.semnodes[e]}),P.getOrCreateSemanticNode=(e=>{let o=P.getSemanticNode(e);return void 0!==o?o:P.createSemanticNode(e)}),P.getRootSemantics=(()=>P._rootSem),P.createUINode=(e=>new P.Node(e,P.NTYPES.UI)),P.getUINode=(e=>{if(void 0!==e)return P.uinodes[e]}),P.getRootUI=(()=>P._rootUI),P._assetReqNew=(e=>{P._numReqLoad++,P.fireEvent("NodeRequestFired",e)}),P._assetReqComplete=(e=>{P.fireEvent("NodeRequestCompleted",e),P._numReqLoad--,P._numReqLoad<=0&&P._onAllReqsCompleted()}),P._onAllReqsCompleted=(()=>{let e=P._rootVisible.getBound().center,o=P._rootVisible.getBound().radius;P._renderer.shadowMap.enabled&&(P._rootVisible.traverse(e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0)}),P.adjustShadowsParamsFromSceneBounds(),P._bShadowsFixedBound&&P.updateDirShadows()),P._bAutoLP&&(void 0===P._lps[0]?P.addLightProbe((new P.LightProbe).setPosition(e).setNear(o)):P._lps[0].setPosition(e.x,e.y,e.z).setNear(o),console.log("Auto LP")),P.FX.composer&&P.FX.setDOFaperture(1/(30*o)),e&&P._mMainPano&&P._mMainPano.position.copy(e),P.getRootScene().assignLightProbesByProximity(),P.fireEvent("AllNodeRequestsCompleted"),P._postAllReqsCompleted(),setTimeout(()=>{P.updateLightProbes(),P._renderer.shadowMap.enabled&&P._bShadowsFixedBound&&0===P._aniMixers.length&&(P._dMainL.shadow.autoUpdate=!1,console.log("Lazy shadows"))},1e3)}),P._postAllReqsCompleted=(e=>{void 0===e&&(e=P._rootVisible);for(let o in e.children){let n=e.children[o];n&&n.toggle&&(P._postAllReqsCompleted(n),n.toggle(n.visible))}}),P.initGraphs=(()=>{P._mainRoot=new THREE.Scene,P._mainRoot.background=new THREE.Color(.7,.7,.7),P._rootVisibleGlobal=new THREE.Group,P._mainRoot.add(P._rootVisibleGlobal),P._rootVisible=P.createSceneNode().setAsRoot(),P._rootVisibleGlobal.add(P._rootVisible),P._rootSem=P.createSemanticNode().setAsRoot(),P._mainRoot.add(P._rootSem),P._rootUI=P.createUINode().setAsRoot(),P._mainRoot.add(P._rootUI),P.ambLight=new THREE.AmbientLight(new THREE.Color(1,1,1)),P._rootVisibleGlobal.add(P.ambLight)}),P.setBackgroundColor=(e=>{P._mainRoot.background=e}),P.setAutoLP=(e=>{P._bAutoLP=e}),P.setNeutralAmbientLight=(e=>{P.ambLight.color=new THREE.Color(e,e,e)}),P.addLightProbe=(e=>{void 0!==e&&(0===P._lps.length&&P.setNeutralAmbientLight(P.AMB_L),P._lps.push(e),void 0!==P.SUI.gLPIcons&&l.default.addLPIcon(e))}),P.updateLightProbes=(()=>{if(0!==P._lps.length){for(let e in P._lps)P._lps[e].update();P._lps[0]&&(P._indLP&&P._mainRoot.remove(P._indLP),P._indLP=THREE.LightProbeGenerator.fromCubeRenderTarget(P._renderer,P._lps[0]._prevCCtarget),P._indLP.intensity=1,P._mainRoot.add(P._indLP)),P._rootVisible.traverse(e=>{let o=e.userData.LP;void 0!==o&&o instanceof P.LightProbe&&(e.material.envMap=o.getEnvTex(),e.material.combine=THREE.AddOperation,e.material.envMapIntensity=P._envMapInt)}),console.log("LPs updated.")}}),P.setMainPanorama=(e=>{let o=void 0;e=P.Utils.resolveCollectionURL(e),void 0===P._mMainPano&&(P._gMainPano=new THREE.SphereBufferGeometry(1,60,60),P._gMainPano.castShadow=!1,P._gMainPano.receiveShadow=!1,P._mMainPano=new THREE.Mesh(P._gMainPano,P._matMainPano),P._mMainPano.frustumCulled=!1,P._mMainPano.renderOrder=-100,P.setMainPanoramaRadius(.8*P.Nav.STD_FAR)),P.Utils.isVideo(e)?(void 0===P._elPanoVideo&&(P._elPanoVideo=document.createElement("video"),P._elPanoVideo.id="idPanoVideo",P._elPanoVideo.innerHTML="",P._elPanoVideo.crossOrigin="anonymous",P._elPanoVideo.loop=!0,P._elPanoVideo.playsinline=!0,P._elPanoVideo.style.cssText="display:none;",P._elPanoVideo.autoplay=!0,P._elPanoVideo.onplaying=(()=>{console.log("VideoPano playing"),P._vpanoPlaying=!0})),(o=new THREE.VideoTexture(P._elPanoVideo)).encoding=THREE.sRGBEncoding,P._realizeOrUpdateMainPano(o)):P.Utils.textureLoader.load(e,e=>{e.encoding=THREE.sRGBEncoding,e.generateMipmaps=!0,P._realizeOrUpdateMainPano(e)})}),P._realizeOrUpdateMainPano=(e=>{if(void 0!==P._matMainPano)return P._matMainPano.map=e,void P.updateLightProbes();P._matMainPano=new THREE.MeshBasicMaterial({map:e,depthTest:!1,depthWrite:!1}),P._mMainPano.material=P._matMainPano,P._bMainPanoInfinite&&(P._mMainPano.onAfterRender=(()=>{P.Nav._currPOV&&P._mMainPano.position.copy(P.Nav._currPOV.pos)})),P._rootVisibleGlobal.add(P._mMainPano),P.updateLightProbes()}),P.setMainPanoramaRadius=(e=>{void 0!==P._gMainPano&&P._gMainPano.scale(-e,e,e)}),P.setMainPanoramaRotation=(e=>{void 0!==P._mMainPano&&P._mMainPano.rotation.set(0,e,0)}),P.setMainPanoramaInfinite=(e=>{P._bMainPanoInfinite=e,void 0!==P._mMainPano&&(P._mMainPano.onAfterRender=e?()=>{P.Nav._currPOV&&P._mMainPano.position.copy(P.Nav._currPOV.pos)}:void 0)}),P.setMainPanoramaLocation=(e=>{P._bMainPanoInfinite||void 0!==P._mMainPano&&P._mMainPano.position.copy(e)}),P.setMainLightDirection=(e=>{let o=e.clone();o.normalize(),o.x*=.5*P.SHADOWS_FAR,o.y*=.5*P.SHADOWS_FAR,o.z*=.5*P.SHADOWS_FAR,void 0===P._dMainL&&(P._dMainL=new THREE.DirectionalLight(new THREE.Color(1,1,1),1),P._dMainL.castShadow=!1,P._dMainLtgt=new THREE.Object3D,P._rootVisibleGlobal.add(P._dMainLtgt),P._dMainL.target=P._dMainLtgt,P._rootVisibleGlobal.add(P._dMainL),P._dMainLpos=new THREE.Vector3),P._dMainLdir=o,P._dMainL.position.set(-o.x,-o.y,-o.z),P._renderer.shadowMap.enabled&&(P._dMainL.shadow.needsUpdate=!0),P.toggleMainLight(!0)}),P.getMainLightDirection=(()=>{if(void 0===P._dMainLdir)return;let e=P._dMainLdir.clone();return e.normalize(),e}),P.toggleMainLight=(e=>{void 0!==P._dMainL&&(P._dMainL.visible=e,e?(P.setNeutralAmbientLight(P.AMB_L),P.updateDirShadows()):P.setNeutralAmbientLight(1))}),P.isMainLightEnabled=(()=>void 0!==P._dMainL&&!!P._dMainL.visible),P.setExposure=(e=>{P._renderer.toneMappingExposure=e}),P.getExposure=(()=>P._renderer.toneMappingExposure),P.adjustShadowsParamsFromSceneBounds=(()=>{if(void 0===P._dMainL)return;let e=P._rootVisible.getBound().radius,o=P._rootVisible.getBound().center;e<=0||e>=P.SHADOWS_SIZE?(P._bShadowsFixedBound=!1,P._shadowsSize=P.SHADOWS_SIZE):(P._bShadowsFixedBound=!0,P._shadowsFixedBoundCenter=o,P._shadowsSize=1.5*e),P._dMainL.shadow.map&&(P._dMainL.shadow.map.dispose(),P._dMainL.shadow.map=null),P._dMainL.shadow.camera.left=-P._shadowsSize,P._dMainL.shadow.camera.right=P._shadowsSize,P._dMainL.shadow.camera.bottom=-P._shadowsSize,P._dMainL.shadow.camera.top=P._shadowsSize,P._dMainL.shadow.mapSize.width=P._shadowsRes,P._dMainL.shadow.mapSize.height=P._shadowsRes,P._dMainL.shadow.camera.near=P._shadowsNear,P._dMainL.shadow.camera.far=P._shadowsFar;let n=-e/5e3;n<-5e-4&&(n=-5e-4),P._dMainL.shadow.bias=n}),P.toggleShadows=(e=>{void 0!==P._dMainL&&(e?(P._dMainL.castShadow=!0,P._renderer.shadowMap.enabled=!0,P.device.isMobile?P._renderer.shadowMap.type=THREE.PCFShadowMap:P._renderer.shadowMap.type=THREE.PCFSoftShadowMap,P._rootVisible.traverse(e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0)}),P.adjustShadowsParamsFromSceneBounds(),P.updateDirShadows(),P._dMainL.shadow.needsUpdate=!0,console.log("Shadows ON")):(P._dMainL.castShadow=!1,P._renderer.shadowMap.enabled=!1,console.log("Shadows OFF")))}),P.updateDirShadows=(()=>{if(void 0===P._dMainLdir)return;let e=P._shadowsFixedBoundCenter;void 0===e?(e=P.Nav.getCurrentEyeLocation(),P._dMainLpos.x=e.x+P.Nav._vDir.x*P._shadowsSize,P._dMainLpos.y=e.y+P.Nav._vDir.y*P._shadowsSize,P._dMainLpos.z=e.z+P.Nav._vDir.z*P._shadowsSize):(P._dMainLpos.x=e.x,P._dMainLpos.y=e.y,P._dMainLpos.z=e.z),P._dMainL.position.set(P._dMainLpos.x-P._dMainLdir.x,P._dMainLpos.y-P._dMainLdir.y,P._dMainLpos.z-P._dMainLdir.z),P._dMainLtgt.position.copy(P._dMainLpos)}),P._updateEnvironment=(()=>{P._renderer.shadowMap.enabled&&(P._bShadowsFixedBound||P.updateDirShadows())}),P.setGlobalAudio=((e,o)=>{void 0!==e&&(void 0===o&&(o=!0),e=P.Utils.resolveCollectionURL(e),void 0===P._auMain||null===P._auMain?P._auMain=new THREE.Audio(P.AudioHub._listener):P._auMain.isPlaying&&P._auMain.stop(),P.AudioHub._loader.load(e,e=>{P._auMain.setBuffer(e),P._auMain.setLoop(o),P._auMain.play()}))}),P._markFPS=(()=>{if(P._numReqLoad>0)return;const e=1/P._dt;P._avgFPScount+=1,P._dtAccum+=P._dt,P._avgFPSaccum+=e,P._dtAccum<1||(P._fps=P._avgFPSaccum/P._avgFPScount,P._avgFPSaccum=0,P._avgFPScount=0,P._dtAccum=0,P._handleDynamicRenderProfiles())}),P.toggleDynamicDensity=(e=>{P._bDynamicDensity=e}),P.setDynamicRenderingFPS=((e,o)=>{e>=o||(e&&(P._dRenderBudgetMinFPS=e),o&&(P._dRenderBudgetMaxFPS=o))}),P._handleDynamicRenderProfiles=(()=>{let e=P._renderer.getPixelRatio();P._fps=.1&&(P._renderer.setPixelRatio(e),P.FX.composer&&P.FX.composer.setPixelRatio(e),console.log(e)),P.fireEvent("RequestLowerRender")),P._fps>P._dRenderBudgetMaxFPS&&(P._bDynamicDensity&&(e*=1.33)<=P._stdpxd&&(P._renderer.setPixelRatio(e),P.FX.composer&&P.FX.composer.setPixelRatio(e),console.log(e)),P.fireEvent("RequestHigherRender"))}),P._onFrame=(()=>{P._dt=P._clock.getDelta(),P._markFPS(),P.XR._bPresenting?P.XR.update():P.Nav._controls.update(P._dt),P._handleQueries(),P.Nav.update(),P.VRoadcast.update(),P.SUI.update(),P.MatHub.update(),P._updateEnvironment(),P._updateAniMixers(),P._updateRoutines(),P._updateTSets(),!P.FX.composer||P.XR._bPresenting?P._renderer.render(P._mainRoot,P.Nav._camera):P.FX.composer.render()}),P.addUpdateRoutine=(e=>{void 0!==e&&P._updRoutines.push(e)}),P.deleteAllUpdateRoutines=(()=>{P._updRoutines=[]}),P._updateRoutines=(()=>{let e=P._updRoutines.length;if(!(e<=0))for(let o=0;o{const e=P._tsets.length;if(!(e<=0)){P.Nav._camera.updateMatrixWorld();for(let o=0;o{let e=P._aniMixers.length;if(!(e<1))for(let o=0;o{e.preventDefault&&e.preventDefault(),P._bCenteredQuery||(P._screenPointerCoords.x=e.clientX/window.innerWidth*2-1,P._screenPointerCoords.y=-e.clientY/window.innerHeight*2+1)}),P.toggleCenteredQuery=(e=>{P._bCenteredQuery=e,e&&(P._screenPointerCoords.x=0,P._screenPointerCoords.y=0)}),P._registerRCS=(()=>{P._rcRR=0,P._rcHandlers=[],P._rcHandlers.push(P._handleQueryScene),P._rcHandlers.push(P._handleQuerySemantics),P._rcHandlers.push(P._handleQueryUI)}),P._handleQueries=(()=>{if(P._bPauseQuery)return;if(P.Nav._bInteracting)return;if(P._numReqLoad>0)return;if(P.Nav.isTransitioning())return;if(P._handleQueryUI(),P._bqScene&&P._handleQueryScene(),P._bqSem&&P._handleQuerySemantics(),P.Nav.locomotionValidator(),void 0===P._tgiDur)return;if(void 0===P._tHover)return;const e=P._clock.elapsedTime-P._tHover;e>=P._tgiDur?(P._stdActivation(),P._tHover=void 0,P._tgiPer=void 0):P._tgiPer=e/P._tgiDur}),P._handleQueryScene=(()=>{if(P.XR.isPresenting()?P.XR.setupQueryRay(P._rcScene):P._rcScene.setFromCamera(P._screenPointerCoords,P.Nav._camera),P._hitsScene=[],P._rcScene.intersectObjects(P._mainRoot.children,!0,P._hitsScene),P._hitsScene.length<=0)return void(P._queryDataScene=void 0);const e=P._hitsScene[0];P._queryDataScene={},P._queryDataScene.p=e.point,P._queryDataScene.d=e.distance,P._queryDataScene.o=e.object,P._bQueryNormals&&null!==e.face&&void 0!==e.face.normal&&(P._queryDataScene.matrixWorld=(new THREE.Matrix3).getNormalMatrix(e.object.matrixWorld),P._queryDataScene.n=e.face.normal.clone().applyMatrix3(P._queryDataScene.matrixWorld).normalize())}),P.getSceneQueriedPoint=(()=>{if(void 0!==P._queryDataScene)return P._queryDataScene.p}),P.getSceneQueriedDistance=(()=>{if(void 0!==P._queryDataScene)return P._queryDataScene.d}),P.getSceneQueriedNormal=(()=>{if(void 0!==P._queryDataScene)return P._queryDataScene.n}),P._handleQuerySemantics=(()=>{if(P.XR.isPresenting()?P.XR.setupQueryRay(P._rcSemantics):P._rcSemantics.setFromCamera(P._screenPointerCoords,P.Nav._camera),P._hitsSem=[],P._rcSemantics.intersectObjects(P._mainRoot.children,!0,P._hitsSem),P._hitsSem.length<=0){if(P._queryDataSem=void 0,P._hoveredSemNode){P.fireEvent("SemanticNodeLeave",P._hoveredSemNode);let e=P.getSemanticNode(P._hoveredSemNode);e&&e.onLeave&&e.onLeave()}return P._hoveredSemNode=void 0,void(P._tHover=void 0)}const e=P._hitsSem[0];if(P._bQuerySemOcclusion&&P._queryDataScene&&P._queryDataScene.d{if(P.XR.isPresenting()?P.XR.setupQueryRay(P._rcUI):P._rcUI.setFromCamera(P._screenPointerCoords,P.Nav._camera),P._hitsUI=[],P._rcUI.intersectObjects(P._mainRoot.children,!0,P._hitsUI),P._hitsUI.length<=0){if(P._queryDataUI=void 0,P._hoveredUI){P.fireEvent("UINodeLeave",P._hoveredUI);const e=P.getUINode(P._hoveredUI);e&&e.onLeave&&e.onLeave()}return P._hoveredUI=void 0,void(P._tHover=void 0)}const e=P._hitsUI[0];if(P._queryDataScene&&P._queryDataScene.d{P._extAPItokens.sketchfab=e});var M=P;exports.default=M; +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=g(require("./ATON.node.js")),o=g(require("./ATON.pov.js")),n=g(require("./ATON.lightprobe.js")),t=g(require("./ATON.eventhub.js")),a=g(require("./ATON.mathub.js")),i=g(require("./ATON.utils.js")),r=g(require("./ATON.scenehub.js")),d=g(require("./ATON.audiohub.js")),s=g(require("./ATON.nav.js")),_=g(require("./ATON.xr.js")),l=g(require("./ATON.sui.js")),c=g(require("./ATON.vroadcast.js")),u=g(require("./ATON.semfactory.js")),v=g(require("./ATON.fe.js")),S=g(require("./ATON.mediarec.js")),m=g(require("./ATON.geoloc.js")),p=g(require("./ATON.apphub.js")),h=g(require("./ATON.fx.js"));function g(e){return e&&e.__esModule?e:{default:e}}let P={};window.ATON=P,P.Node=e.default,P.POV=o.default,P.LightProbe=n.default,P.EventHub=t.default,P.Utils=i.default,P.SceneHub=r.default,P.MatHub=a.default,P.Nav=s.default,P.AudioHub=d.default,P.XR=_.default,P.SUI=l.default,P.VRoadcast=c.default,P.SemFactory=u.default,P.FE=v.default,P.MediaRec=S.default,P.GeoLoc=m.default,P.AppHub=p.default,P.FX=h.default,P.STD_UPVECTOR=new THREE.Vector3(0,1,0),P.ROOT_NID=".",P.RAD2DEG=180/Math.PI,P.DEG2RAD=Math.PI/180,P.PATCH_ADD=0,P.PATCH_DEL=1,P.NTYPES={},P.NTYPES.SCENE=3,P.NTYPES.SEM=4,P.NTYPES.UI=5,P.PATH_RESTAPI=window.location.origin+"/api/",P.PATH_RESTAPI_SCENE=P.PATH_RESTAPI+"scene/",P.PATH_WAPPS=window.location.origin+"/a/",P.PATH_MODS=window.location.origin+"/mods/",P.PATH_DRACO_LIB=window.location.origin+"/dist/draco/",P.PATH_BASIS_LIB=window.location.origin+"/dist/basis/",P.PATH_IFC_LIB=window.location.origin+"/dist/ifc/",P.PATH_COLLECTION=window.location.origin+"/collections/",P.PATH_SCENES=window.location.origin+"/scenes/",P.PATH_RES=window.location.origin+"/res/",P.PATH_FE=window.location.origin+"/fe/",P.SHADOWS_NEAR=.1,P.SHADOWS_FAR=50,P.SHADOWS_SIZE=15,P.SHADOWS_RES=1024,P.AMB_L=.1,P.setPathCollection=(e=>{P.PATH_COLLECTION=e}),P.setPathScenes=(e=>{P.PATH_SCENES=e}),P._onUserInteraction=(()=>{P._elPanoVideo&&!P._vpanoPlaying&&P._elPanoVideo.play(),"suspended"===P.AudioHub._listener.context.state&&P.AudioHub._listener.context.resume()}),P._setupBaseListeners=(()=>{let e=P._renderer.domElement;window.addEventListener("resize",P._onResize,!1),window.onorientationchange=P._readDeviceOrientationMode,screenfull.isEnabled&&screenfull.on("change",()=>{P._bFS=screenfull.isFullscreen,P.fireEvent("Fullscreen",P._bFS),P._bFS?console.log("Now fullscreen"):console.log("Exit fullscreen")}),e.addEventListener("mousemove",P._updateScreenMove,!1),e.addEventListener("mousedown",e=>{1===e.button&&P.fireEvent("MouseMidButton"),2===e.button&&P.fireEvent("MouseRightButton")}),e.addEventListener("wheel",P._onMouseWheel,!1),P._bPointerDown=!1,window.addEventListener("pointerdown",e=>{P._bPointerDown=!0,P._onUserInteraction()}),window.addEventListener("pointerup",e=>{P._bPointerDown=!1}),window.addEventListener("pointermove",e=>{P._bPointerDown&&(P._updateScreenMove(e),P._handleQueries())}),window.addEventListener("touchstart",e=>{P._bPointerDown=!0,P._onUserInteraction()}),window.addEventListener("touchend",e=>{P._bPointerDown=!1}),window.addEventListener("touchmove",e=>{P._bPointerDown&&(P._updateScreenMove(e.touches[0]),P._handleQueries())}),Hammer(e).on("doubletap",e=>{P._bPointerDown=!1,P.fireEvent("DoubleTap",e.srcEvent)}),Hammer(e).on("tap",e=>{if(P._bPointerDown=!1,P._onUserInteraction(),P._updateScreenMove(e.srcEvent),P._handleQueries(),P.fireEvent("Tap",e.srcEvent),void 0===P._hoveredUI)return;let o=P.getUINode(P._hoveredUI);o&&o.onSelect&&o.onSelect()}),P.on("DoubleTap",e=>{P.defaultDoubleTapFromScreenCoords(e)}),P._kModShift=!1,P._kModCtrl=!1,P._bListenKeyboardEvents=!0,window.addEventListener("keydown",e=>{P._onUserInteraction(),"Shift"===e.key&&(P._kModShift=!0),"Control"===e.key&&(P._kModCtrl=!0),P._bListenKeyboardEvents&&P.fireEvent("KeyPress",e.key)},!1),window.addEventListener("keyup",e=>{"Shift"===e.key&&(P._kModShift=!1),"Control"===e.key&&(P._kModCtrl=!1),P._bListenKeyboardEvents&&P.fireEvent("KeyUp",e.key)},!1),P.on("KeyPress",e=>{if("+"===e){let e=P.Nav.getFOV()+1;P.Nav.setFOV(e)}if("-"===e){let e=P.Nav.getFOV()-1;P.Nav.setFOV(e)}if("PageUp"===e){let e=P.SUI.mainSelector.scale.x+.02;P.SUI.setSelectorRadius(e)}if("PageDown"===e){let e=P.SUI.mainSelector.scale.x-.02;e=Math.max(e,.01),P.SUI.setSelectorRadius(e)}})}),P._onResize=(()=>{if(P.Nav._camera.aspect=window.innerWidth/window.innerHeight,P.Nav._camera.updateProjectionMatrix(),P._renderer.setSize(window.innerWidth,window.innerHeight),P.FX.composer){P.FX.composer.setSize(window.innerWidth,window.innerHeight);let e=P.FX.passes[P.FX.PASS_AA].material.uniforms;e&&e.resolution.value.set(1/window.innerWidth,1/window.innerHeight)}console.log("onResize")}),P._onMouseWheel=(e=>{e.preventDefault(),P.fireEvent("MouseWheel",e.deltaY)}),P.focusOn3DView=(()=>{P._renderer.domElement.focus()}),P._SUIactivation=(()=>{const e=P.getUINode(P._hoveredUI);return void 0!==e&&(void 0!==e.onSelect&&(e.onSelect(),!0))}),P._stdActivation=(()=>{if(P._SUIactivation())return;if(!P.Nav._bControl)return;if(P.XR._bPresenting)return"immersive-vr"===_.default._sessionType&&_.default.teleportOnQueriedPoint(),void P.FE.playAudioFromSemanticNode(P._hoveredSemNode);if(P.Nav.isFirstPerson()||P.Nav.isDevOri()){if(P.Nav.currentQueryValidForLocomotion()){let e=P._queryDataScene.p,o=P.Nav._vDir,n=new THREE.Vector3(e.x,e.y+P.userHeight,e.z),t=new THREE.Vector3(n.x+o.x,n.y+o.y,n.z+o.z),a=(new P.POV).setPosition(n).setTarget(t).setFOV(P.Nav._currPOV.fov);P.Nav.requestPOV(a,.5)}return}let e=P.getSemanticNode(P._hoveredSemNode);P._queryDataSem&&e?P.Nav.requestPOVbyNode(e,.5):P._queryDataScene&&P.Nav.requestRetarget(P._queryDataScene.p,void 0,.5)}),P.defaultDoubleTapFromScreenCoords=(e=>{P._updateScreenMove(e),P._handleQueryScene(),P._stdActivation()}),P.isFullscreen=(()=>P._bFS),P.toggleFullScreen=(()=>{screenfull.toggle()}),P.realize=(()=>{console.log("Initialize ATON..."),P.Utils.init(),P.Utils.profileDevice(),P._clock=new THREE.Clock(!0),P._bFS=!1;P._renderer=new THREE.WebGLRenderer({antialias:!0,alpha:!1,powerPreference:"high-performance"}),P._renderer.setSize(window.innerWidth,window.innerHeight),P.Utils.profileRenderingCapabilities(),P._stdpxd=1,P._renderer.setPixelRatio(P._stdpxd),P._fps=60,P._dt=.01,P._dtAccum=0,P._avgFPScount=0,P._avgFPSaccum=0,P._avgFPS=60,P._bDynamicDensity=!1,P._dRenderBudgetMinFPS=30,P._dRenderBudgetMaxFPS=55,P._aniMixers=[],P._renderer.outputEncoding=THREE.sRGBEncoding,P._renderer.toneMapping=THREE.LinearToneMapping,P._renderer.toneMappingExposure=1,P._renderer.setAnimationLoop(P._onFrame),P._maxAnisotropy=P._renderer.capabilities.getMaxAnisotropy(),THREE.Cache.enabled=!0,P.userHeight=1.7,document.body.appendChild(P._renderer.domElement);let e=P._renderer.domElement;e.style.outline="none",e.style.border="none",P._vpanoPlaying=!1,P._bUserInts=0,P.EventHub.init(),P.MatHub.init(),P._assetsManager={},P._aLoader=new THREE.GLTFLoader,P._numReqLoad=0,P._dracoLoader=new THREE.DRACOLoader,P._dracoLoader.setDecoderConfig({type:"wasm"}),P._dracoLoader.setDecoderPath(P.PATH_DRACO_LIB),P._dracoLoader.setWorkerLimit(2),P._dracoLoader.preload(),P._aLoader.setDRACOLoader(P._dracoLoader),P._ccModels=[],P._updRoutines=[],P._lps=[],P._bAutoLP=!1,P._envMapInt=1,P._bShadowsFixedBound=!1,P._shadowsFixedBoundCenter=void 0,P._shadowsNear=P.SHADOWS_NEAR,P._shadowsFar=P.SHADOWS_FAR,P._shadowsSize=P.SHADOWS_SIZE,P._shadowsRes=P.SHADOWS_RES,P.initGraphs(),P.SceneHub.init(),P._tsets=[],P.AudioHub.init(),P.Nav.init(),P.XR.init(),P.SUI.init(),P.VRoadcast.init(),P.MediaRec.init(),P.SemFactory.init(),P.AppHub.init(),P.GeoLoc.init(),P.device.lowGPU||P.FX.init(),P._queryDataScene=void 0,P._queryDataSem=void 0,P._queryDataUI=void 0,P._hoveredSemNode=void 0,P._hoveredUI=void 0,P._bQuerySemOcclusion=!0,P._bQueryNormals=!0,P._bPauseQuery=!1,P._bCenteredQuery=!1,P._bqScene=!1,P._bqSem=!1,P._tgiDur=void 0,P._tgiPer=void 0,P._tHover=void 0,P._bMainPanoInfinite=!0,P._matMainPano=void 0,P._mMainPano=void 0,P._screenPointerCoords=new THREE.Vector2(0,0),P._rcScene=new THREE.Raycaster,P._rcScene.layers.set(P.NTYPES.SCENE),P._rcSemantics=new THREE.Raycaster,P._rcSemantics.layers.set(P.NTYPES.SEM),P._rcUI=new THREE.Raycaster,P._rcUI.layers.set(P.NTYPES.UI),P._registerRCS(),P._setupBaseListeners(),P.device.isMobile&&P._readDeviceOrientationMode(),P._wappID=void 0,P._extAPItokens={},P.focusOn3DView()}),P.setTimedGazeDuration=(e=>{P._tgiDur=e}),P.getTimedGazeProgress=(()=>{if(void 0!==P._tgiDur)return P._tgiPer}),P.getElapsedTime=(()=>P._clock.elapsedTime),P.renderPause=(()=>{P._renderer.setAnimationLoop(void 0)}),P.renderResume=(()=>{P._renderer.setAnimationLoop(P._onFrame)}),P._setupLoadManager=(()=>{P._loadManager=new THREE.LoadingManager,P._loadManager.onStart=((e,o,n)=>{console.log("Started loading file: "+e+".\nLoaded "+o+" of "+n+" files."),P.fireEvent("NodeRequestFired",e)}),P._loadManager.onLoad=(()=>{console.log("Loading complete!"),P.fireEvent("AllNodeRequestsCompleted")}),P._loadManager.onProgress=((e,o,n)=>{}),P._loadManager.onError=(e=>{console.log("There was an error loading "+e)})}),P.setDefaultPixelDensity=(e=>{P._stdpxd=e,P._renderer.setPixelRatio(e),P.FX.composer&&P.FX.composer.setPixelRatio(e),void 0!==P._renderer.xr&&(P.device.isMobile?P._renderer.xr.setFramebufferScaleFactor(P._stdpxd*P.XR.MOBILE_DENSITY_F):P._renderer.xr.setFramebufferScaleFactor(P._stdpxd))}),P.resetPixelDensity=(()=>{P._renderer.setPixelRatio(P._stdpxd)}),P._readDeviceOrientationMode=(()=>{90===Math.abs(window.orientation)?(console.log("Landscape Mode"),P.fireEvent("MobileLandscapeMode")):(console.log("Portrait Mode"),P.fireEvent("MobilePortraitMode")),setTimeout(P._onResize,500)}),P.snodes={},P.semnodes={},P.uinodes={},P.createSceneNode=(e=>new P.Node(e,P.NTYPES.SCENE)),P.getSceneNode=(e=>{if(void 0!==e)return P.snodes[e]}),P.getOrCreateSceneNode=(e=>{let o=P.getSceneNode(e);return void 0!==o?o:P.createSceneNode(e)}),P.getRootScene=(()=>P._rootVisible),P.createSemanticNode=(e=>new P.Node(e,P.NTYPES.SEM)),P.getSemanticNode=(e=>{if(void 0!==e)return P.semnodes[e]}),P.getOrCreateSemanticNode=(e=>{let o=P.getSemanticNode(e);return void 0!==o?o:P.createSemanticNode(e)}),P.getRootSemantics=(()=>P._rootSem),P.createUINode=(e=>new P.Node(e,P.NTYPES.UI)),P.getUINode=(e=>{if(void 0!==e)return P.uinodes[e]}),P.getRootUI=(()=>P._rootUI),P._assetReqNew=(e=>{P._numReqLoad++,P.fireEvent("NodeRequestFired",e)}),P._assetReqComplete=(e=>{P.fireEvent("NodeRequestCompleted",e),P._numReqLoad--,P._numReqLoad<=0&&P._onAllReqsCompleted()}),P._onAllReqsCompleted=(()=>{let e=P._rootVisible.getBound().center,o=P._rootVisible.getBound().radius;P._renderer.shadowMap.enabled&&(P._rootVisible.traverse(e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0)}),P.adjustShadowsParamsFromSceneBounds(),P._bShadowsFixedBound&&P.updateDirShadows()),P._bAutoLP&&(void 0===P._lps[0]?P.addLightProbe((new P.LightProbe).setPosition(e).setNear(o)):P._lps[0].setPosition(e.x,e.y,e.z).setNear(o),console.log("Auto LP")),P.FX.composer&&P.FX.setDOFaperture(1/(30*o)),e&&P._mMainPano&&P._mMainPano.position.copy(e),P.getRootScene().assignLightProbesByProximity(),P.fireEvent("AllNodeRequestsCompleted"),P._postAllReqsCompleted(),setTimeout(()=>{P.updateLightProbes(),P._renderer.shadowMap.enabled&&P._bShadowsFixedBound&&0===P._aniMixers.length&&(P._dMainL.shadow.autoUpdate=!1,console.log("Lazy shadows"))},1e3)}),P._postAllReqsCompleted=(e=>{void 0===e&&(e=P._rootVisible);for(let o in e.children){let n=e.children[o];n&&n.toggle&&(P._postAllReqsCompleted(n),n.toggle(n.visible))}}),P.initGraphs=(()=>{P._mainRoot=new THREE.Scene,P._mainRoot.background=new THREE.Color(.7,.7,.7),P._rootVisibleGlobal=new THREE.Group,P._mainRoot.add(P._rootVisibleGlobal),P._rootVisible=P.createSceneNode().setAsRoot(),P._rootVisibleGlobal.add(P._rootVisible),P._rootSem=P.createSemanticNode().setAsRoot(),P._mainRoot.add(P._rootSem),P._rootUI=P.createUINode().setAsRoot(),P._mainRoot.add(P._rootUI),P.ambLight=new THREE.AmbientLight(new THREE.Color(1,1,1)),P._rootVisibleGlobal.add(P.ambLight)}),P.setBackgroundColor=(e=>{P._mainRoot.background=e}),P.setAutoLP=(e=>{P._bAutoLP=e}),P.setNeutralAmbientLight=(e=>{P.ambLight.color=new THREE.Color(e,e,e)}),P.addLightProbe=(e=>{void 0!==e&&(0===P._lps.length&&P.setNeutralAmbientLight(P.AMB_L),P._lps.push(e),void 0!==P.SUI.gLPIcons&&l.default.addLPIcon(e))}),P.updateLightProbes=(()=>{if(0!==P._lps.length){for(let e in P._lps)P._lps[e].update();P._lps[0]&&(P._indLP&&P._mainRoot.remove(P._indLP),P._indLP=THREE.LightProbeGenerator.fromCubeRenderTarget(P._renderer,P._lps[0]._prevCCtarget),P._indLP.intensity=1,P._mainRoot.add(P._indLP)),P._rootVisible.traverse(e=>{let o=e.userData.LP;void 0!==o&&o instanceof P.LightProbe&&(e.material.envMap=o.getEnvTex(),e.material.combine=THREE.AddOperation,e.material.envMapIntensity=P._envMapInt)}),console.log("LPs updated.")}}),P.setMainPanorama=(e=>{let o=void 0;e=P.Utils.resolveCollectionURL(e),void 0===P._mMainPano&&(P._gMainPano=new THREE.SphereBufferGeometry(1,60,60),P._gMainPano.castShadow=!1,P._gMainPano.receiveShadow=!1,P._mMainPano=new THREE.Mesh(P._gMainPano,P._matMainPano),P._mMainPano.frustumCulled=!1,P._mMainPano.renderOrder=-100,P.setMainPanoramaRadius(.8*P.Nav.STD_FAR)),P.Utils.isVideo(e)?(void 0===P._elPanoVideo&&(P._elPanoVideo=document.createElement("video"),P._elPanoVideo.id="idPanoVideo",P._elPanoVideo.innerHTML="",P._elPanoVideo.crossOrigin="anonymous",P._elPanoVideo.loop=!0,P._elPanoVideo.playsinline=!0,P._elPanoVideo.style.cssText="display:none;",P._elPanoVideo.autoplay=!0,P._elPanoVideo.onplaying=(()=>{console.log("VideoPano playing"),P._vpanoPlaying=!0})),(o=new THREE.VideoTexture(P._elPanoVideo)).encoding=THREE.sRGBEncoding,P._realizeOrUpdateMainPano(o)):P.Utils.textureLoader.load(e,e=>{e.encoding=THREE.sRGBEncoding,e.generateMipmaps=!0,P._realizeOrUpdateMainPano(e)})}),P._realizeOrUpdateMainPano=(e=>{if(void 0!==P._matMainPano)return P._matMainPano.map=e,void P.updateLightProbes();P._matMainPano=new THREE.MeshBasicMaterial({map:e,depthTest:!1,depthWrite:!1}),P._mMainPano.material=P._matMainPano,P._bMainPanoInfinite&&(P._mMainPano.onAfterRender=(()=>{P.Nav._currPOV&&P._mMainPano.position.copy(P.Nav._currPOV.pos)})),P._rootVisibleGlobal.add(P._mMainPano),P.updateLightProbes()}),P.setMainPanoramaRadius=(e=>{void 0!==P._gMainPano&&P._gMainPano.scale(-e,e,e)}),P.setMainPanoramaRotation=(e=>{void 0!==P._mMainPano&&P._mMainPano.rotation.set(0,e,0)}),P.setMainPanoramaInfinite=(e=>{P._bMainPanoInfinite=e,void 0!==P._mMainPano&&(P._mMainPano.onAfterRender=e?()=>{P.Nav._currPOV&&P._mMainPano.position.copy(P.Nav._currPOV.pos)}:void 0)}),P.setMainPanoramaLocation=(e=>{P._bMainPanoInfinite||void 0!==P._mMainPano&&P._mMainPano.position.copy(e)}),P.setMainLightDirection=(e=>{let o=e.clone();o.normalize(),o.x*=.5*P.SHADOWS_FAR,o.y*=.5*P.SHADOWS_FAR,o.z*=.5*P.SHADOWS_FAR,void 0===P._dMainL&&(P._dMainL=new THREE.DirectionalLight(new THREE.Color(1,1,1),1),P._dMainL.castShadow=!1,P._dMainLtgt=new THREE.Object3D,P._rootVisibleGlobal.add(P._dMainLtgt),P._dMainL.target=P._dMainLtgt,P._rootVisibleGlobal.add(P._dMainL),P._dMainLpos=new THREE.Vector3),P._dMainLdir=o,P._dMainL.position.set(-o.x,-o.y,-o.z),P._renderer.shadowMap.enabled&&(P._dMainL.shadow.needsUpdate=!0),P.toggleMainLight(!0)}),P.getMainLightDirection=(()=>{if(void 0===P._dMainLdir)return;let e=P._dMainLdir.clone();return e.normalize(),e}),P.toggleMainLight=(e=>{void 0!==P._dMainL&&(P._dMainL.visible=e,e?(P.setNeutralAmbientLight(P.AMB_L),P.updateDirShadows()):P.setNeutralAmbientLight(1))}),P.isMainLightEnabled=(()=>void 0!==P._dMainL&&!!P._dMainL.visible),P.setExposure=(e=>{P._renderer.toneMappingExposure=e}),P.getExposure=(()=>P._renderer.toneMappingExposure),P.adjustShadowsParamsFromSceneBounds=(()=>{if(void 0===P._dMainL)return;let e=P._rootVisible.getBound().radius,o=P._rootVisible.getBound().center;e<=0||e>=P.SHADOWS_SIZE?(P._bShadowsFixedBound=!1,P._shadowsSize=P.SHADOWS_SIZE):(P._bShadowsFixedBound=!0,P._shadowsFixedBoundCenter=o,P._shadowsSize=1.5*e),P._dMainL.shadow.map&&(P._dMainL.shadow.map.dispose(),P._dMainL.shadow.map=null),P._dMainL.shadow.camera.left=-P._shadowsSize,P._dMainL.shadow.camera.right=P._shadowsSize,P._dMainL.shadow.camera.bottom=-P._shadowsSize,P._dMainL.shadow.camera.top=P._shadowsSize,P._dMainL.shadow.mapSize.width=P._shadowsRes,P._dMainL.shadow.mapSize.height=P._shadowsRes,P._dMainL.shadow.camera.near=P._shadowsNear,P._dMainL.shadow.camera.far=P._shadowsFar;let n=-2e-4*e;n<-.001&&(n=-.001),P._dMainL.shadow.bias=n}),P.toggleShadows=(e=>{void 0!==P._dMainL&&(e?(P._dMainL.castShadow=!0,P._renderer.shadowMap.enabled=!0,P.device.isMobile?P._renderer.shadowMap.type=THREE.PCFShadowMap:P._renderer.shadowMap.type=THREE.PCFSoftShadowMap,P._rootVisible.traverse(e=>{e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0)}),P.adjustShadowsParamsFromSceneBounds(),P.updateDirShadows(),P._dMainL.shadow.needsUpdate=!0,console.log("Shadows ON")):(P._dMainL.castShadow=!1,P._renderer.shadowMap.enabled=!1,console.log("Shadows OFF")))}),P.updateDirShadows=(()=>{if(void 0===P._dMainLdir)return;let e=P._shadowsFixedBoundCenter;void 0===e?(e=P.Nav.getCurrentEyeLocation(),P._dMainLpos.x=e.x+P.Nav._vDir.x*P._shadowsSize,P._dMainLpos.y=e.y+P.Nav._vDir.y*P._shadowsSize,P._dMainLpos.z=e.z+P.Nav._vDir.z*P._shadowsSize):(P._dMainLpos.x=e.x,P._dMainLpos.y=e.y,P._dMainLpos.z=e.z),P._dMainL.position.set(P._dMainLpos.x-P._dMainLdir.x,P._dMainLpos.y-P._dMainLdir.y,P._dMainLpos.z-P._dMainLdir.z),P._dMainLtgt.position.copy(P._dMainLpos)}),P._updateEnvironment=(()=>{P._renderer.shadowMap.enabled&&(P._bShadowsFixedBound||P.updateDirShadows())}),P.setGlobalAudio=((e,o)=>{void 0!==e&&(void 0===o&&(o=!0),e=P.Utils.resolveCollectionURL(e),void 0===P._auMain||null===P._auMain?P._auMain=new THREE.Audio(P.AudioHub._listener):P._auMain.isPlaying&&P._auMain.stop(),P.AudioHub._loader.load(e,e=>{P._auMain.setBuffer(e),P._auMain.setLoop(o),P._auMain.play()}))}),P._markFPS=(()=>{if(P._numReqLoad>0)return;const e=1/P._dt;P._avgFPScount+=1,P._dtAccum+=P._dt,P._avgFPSaccum+=e,P._dtAccum<1||(P._fps=P._avgFPSaccum/P._avgFPScount,P._avgFPSaccum=0,P._avgFPScount=0,P._dtAccum=0,P._handleDynamicRenderProfiles())}),P.toggleDynamicDensity=(e=>{P._bDynamicDensity=e}),P.setDynamicRenderingFPS=((e,o)=>{e>=o||(e&&(P._dRenderBudgetMinFPS=e),o&&(P._dRenderBudgetMaxFPS=o))}),P._handleDynamicRenderProfiles=(()=>{let e=P._renderer.getPixelRatio();P._fps=.1&&(P._renderer.setPixelRatio(e),P.FX.composer&&P.FX.composer.setPixelRatio(e),console.log(e)),P.fireEvent("RequestLowerRender")),P._fps>P._dRenderBudgetMaxFPS&&(P._bDynamicDensity&&(e*=1.33)<=P._stdpxd&&(P._renderer.setPixelRatio(e),P.FX.composer&&P.FX.composer.setPixelRatio(e),console.log(e)),P.fireEvent("RequestHigherRender"))}),P._onFrame=(()=>{P._dt=P._clock.getDelta(),P._markFPS(),P.XR._bPresenting?P.XR.update():P.Nav._controls.update(P._dt),P._handleQueries(),P.Nav.update(),P.VRoadcast.update(),P.SUI.update(),P.MatHub.update(),P._updateEnvironment(),P._updateAniMixers(),P._updateRoutines(),P._updateTSets(),!P.FX.composer||P.XR._bPresenting?P._renderer.render(P._mainRoot,P.Nav._camera):P.FX.composer.render()}),P.addUpdateRoutine=(e=>{void 0!==e&&P._updRoutines.push(e)}),P.deleteAllUpdateRoutines=(()=>{P._updRoutines=[]}),P._updateRoutines=(()=>{let e=P._updRoutines.length;if(!(e<=0))for(let o=0;o{const e=P._tsets.length;if(!(e<=0)){P.Nav._camera.updateMatrixWorld();for(let o=0;o{let e=P._aniMixers.length;if(!(e<1))for(let o=0;o{e.preventDefault&&e.preventDefault(),P._bCenteredQuery||(P._screenPointerCoords.x=e.clientX/window.innerWidth*2-1,P._screenPointerCoords.y=-e.clientY/window.innerHeight*2+1)}),P.toggleCenteredQuery=(e=>{P._bCenteredQuery=e,e&&(P._screenPointerCoords.x=0,P._screenPointerCoords.y=0)}),P._registerRCS=(()=>{P._rcRR=0,P._rcHandlers=[],P._rcHandlers.push(P._handleQueryScene),P._rcHandlers.push(P._handleQuerySemantics),P._rcHandlers.push(P._handleQueryUI)}),P._handleQueries=(()=>{if(P._bPauseQuery)return;if(P.Nav._bInteracting)return;if(P._numReqLoad>0)return;if(P.Nav.isTransitioning())return;if(P._handleQueryUI(),P._bqScene&&P._handleQueryScene(),P._bqSem&&P._handleQuerySemantics(),P.Nav.locomotionValidator(),void 0===P._tgiDur)return;if(void 0===P._tHover)return;const e=P._clock.elapsedTime-P._tHover;e>=P._tgiDur?(P._stdActivation(),P._tHover=void 0,P._tgiPer=void 0):P._tgiPer=e/P._tgiDur}),P._handleQueryScene=(()=>{if(P.XR.isPresenting()?P.XR.setupQueryRay(P._rcScene):P._rcScene.setFromCamera(P._screenPointerCoords,P.Nav._camera),P._hitsScene=[],P._rcScene.intersectObjects(P._mainRoot.children,!0,P._hitsScene),P._hitsScene.length<=0)return void(P._queryDataScene=void 0);const e=P._hitsScene[0];P._queryDataScene={},P._queryDataScene.p=e.point,P._queryDataScene.d=e.distance,P._queryDataScene.o=e.object,P._bQueryNormals&&null!==e.face&&void 0!==e.face.normal&&(P._queryDataScene.matrixWorld=(new THREE.Matrix3).getNormalMatrix(e.object.matrixWorld),P._queryDataScene.n=e.face.normal.clone().applyMatrix3(P._queryDataScene.matrixWorld).normalize())}),P.getSceneQueriedPoint=(()=>{if(void 0!==P._queryDataScene)return P._queryDataScene.p}),P.getSceneQueriedDistance=(()=>{if(void 0!==P._queryDataScene)return P._queryDataScene.d}),P.getSceneQueriedNormal=(()=>{if(void 0!==P._queryDataScene)return P._queryDataScene.n}),P._handleQuerySemantics=(()=>{if(P.XR.isPresenting()?P.XR.setupQueryRay(P._rcSemantics):P._rcSemantics.setFromCamera(P._screenPointerCoords,P.Nav._camera),P._hitsSem=[],P._rcSemantics.intersectObjects(P._mainRoot.children,!0,P._hitsSem),P._hitsSem.length<=0){if(P._queryDataSem=void 0,P._hoveredSemNode){P.fireEvent("SemanticNodeLeave",P._hoveredSemNode);let e=P.getSemanticNode(P._hoveredSemNode);e&&e.onLeave&&e.onLeave()}return P._hoveredSemNode=void 0,void(P._tHover=void 0)}const e=P._hitsSem[0];if(P._bQuerySemOcclusion&&P._queryDataScene&&P._queryDataScene.d{if(P.XR.isPresenting()?P.XR.setupQueryRay(P._rcUI):P._rcUI.setFromCamera(P._screenPointerCoords,P.Nav._camera),P._hitsUI=[],P._rcUI.intersectObjects(P._mainRoot.children,!0,P._hitsUI),P._hitsUI.length<=0){if(P._queryDataUI=void 0,P._hoveredUI){P.fireEvent("UINodeLeave",P._hoveredUI);const e=P.getUINode(P._hoveredUI);e&&e.onLeave&&e.onLeave()}return P._hoveredUI=void 0,void(P._tHover=void 0)}const e=P._hitsUI[0];if(P._queryDataScene&&P._queryDataScene.d{P._extAPItokens.sketchfab=e});var M=P;exports.default=M; },{"./ATON.node.js":"XTSP","./ATON.pov.js":"CwXu","./ATON.lightprobe.js":"MNcy","./ATON.eventhub.js":"LryX","./ATON.mathub.js":"R8yv","./ATON.utils.js":"P9TA","./ATON.scenehub.js":"qC8Z","./ATON.audiohub.js":"mYhb","./ATON.nav.js":"nomA","./ATON.xr.js":"jROx","./ATON.sui.js":"xSlA","./ATON.vroadcast.js":"mY3J","./ATON.semfactory.js":"dQQK","./ATON.fe.js":"Z6YW","./ATON.mediarec.js":"jdcn","./ATON.geoloc.js":"uZX1","./ATON.apphub.js":"Iy9y","./ATON.fx.js":"lJ6J"}]},{},["yaoK"], null) //# sourceMappingURL=/ATON.min.js.map \ No newline at end of file diff --git a/public/dist/ATON.min.js.map b/public/dist/ATON.min.js.map index dac50514..f76765fe 100644 --- a/public/dist/ATON.min.js.map +++ b/public/dist/ATON.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["ATON.node.js","ATON.pov.js","ATON.lightprobe.js","ATON.eventhub.js","ATON.mathub.js","ATON.utils.js","ATON.scenehub.js","ATON.audiohub.js","ATON.nav.js","ATON.xr.js","ATON.sui.button.js","ATON.sui.label.js","ATON.sui.js","ATON.avatar.js","ATON.vroadcast.js","ATON.semfactory.js","ATON.fe.js","ATON.mediarec.js","ATON.geoloc.js","ATON.apphub.js","ATON.fx.js","ATON.js"],"names":["Node","THREE","Group","constructor","id","type","traverse","o","isMesh","geometry","LP","userData","undefined","update","material","envMap","getEnvTex","ATON","NTYPES","SCENE","enablePicking","_rootG","_rootVisible","_nodes","snodes","SEM","_rootSem","semnodes","UI","_rootUI","uinodes","as","kwords","_bCloneOnLoadHit","_tlist","_aniMixers","castShadow","receiveShadow","onHover","onLeave","onSelect","ROOT_NID","nid","name","setAsRoot","setCloneOnLoadHit","b","addKeywords","kw","K","split","k","trim","length","c","children","C","hasKeyword","setDescription","s","description","getDescription","setAudio","au","audio","getAudio","hide","visible","Utils","setPicking","_renderer","shadowMap","enabled","_dMainL","shadow","needsUpdate","show","bPickable","toggle","disablePicking","setPickable","setMaterial","M","cMat","getMaterial","setDefaultAndHighlightMaterials","matSTD","matHL","highlight","restoreDefaultMaterial","setOpacity","f","opacity","setShadowCast","setShadowReceive","setEnvMap","envtex","assignLightProbe","assignLightProbeToMesh","assignLightProbesByProximity","_lps","Vector3","cLP","Box3","setFromObject","getCenter","mdist","i","d","distanceToSquared","pos","duplicate","clone","delete","p","parent","removeChild","dispose","remove","removeChildren","attachTo","node","N","add","attachToRoot","getBound","bb","bs","Sphere","getBoundingSphere","setPosition","x","y","z","position","copy","set","setScale","sx","sy","sz","scale","setRotation","rx","ry","rz","rotation","orientToCamera","quaternion","Nav","_qOri","setYup","addTransform","T","TT","parseTransformString","push","load","url","onComplete","resolveCollectionURL","endsWith","loadTileSet","_bqScene","_assetsManager","then","modelVisitor","t","console","log","_assetReqNew","P","Promise","resolve","reject","_aLoader","data","model","scene","registerAniMixers","ccExtract","_assetReqComplete","_bqSem","err","exportAs","filename","exportNode","setOnHover","setOnLeave","setOnSelect","POV","target","up","STD_UPVECTOR","fov","nextPOV","prevPOV","povlist","setTarget","setFOV","setNextPOV","pov","setPrevPOV","LightProbe","res","near","far","_res","_near","_far","STD_FAR","_envtex","_prevCCtarget","setNear","setFar","CCtarget","WebGLCubeRenderTarget","format","RGBEFormat","generateMipmaps","minFilter","LinearMipmapLinearFilter","encoding","sRGBEncoding","CC","CubeCamera","_rootVisibleGlobal","texture","assignToNode","EventHub","evLocal","evNetwork","on","fireEvent","clearEventHandlers","evtname","ehList","h","handler","handlerLocal","handlerNetwork","evhLocal","VRoadcast","bReplicate","executeHandlers","MatHub","materials","colors","_loader","MaterialLoader","_uSem","time","value","tint","Vector4","addDefaults","white","Color","black","green","yellow","red","blue","orange","defUI","sem","darksem","fullyTransparent","MeshBasicMaterial","transparent","depthWrite","ShaderMaterial","uniforms","color","vertexShader","getDefVertexShader","fragmentShader","selector","controllerRay","teleportLoc","side","DoubleSide","textureLoader","PATH_RES","map","measurement","depthTest","semanticShape","semanticShapeHL","semanticShapeEdit","semIcon","SpriteMaterial","TextureLoader","lp","lpIcon","sizeAttenuation","mat","jsonfile","addMaterial","_dt","device","geomUnitSphere","SphereGeometry","exporterGLTF","exporterOBJ","_dlink","document","createElement","style","display","body","appendChild","prefix","Math","random","toString","substr","window","location","href","isSecureContext","isMobile","test","navigator","userAgent","detectMobile","xrSupported","xr","isSessionSupported","v","rcc","capabilities","lowGPU","isWebGL2","maxTextureSize","filepath","lastIndexOf","toLowerCase","replace","ext","getFileExtension","index","substring","startsWith","string","urls","match","forEach","PATH_COLLECTION","endpoint","obj","onReceive","onFail","$","ajax","xhrFields","withCredentials","JSON","stringify","contentType","dataType","success","fail","object","updateMatrixWorld","g","applyMatrix4","matrixWorld","toNonIndexed","mergedGeometries","BufferGeometryUtils","mergeBufferGeometries","mergedGeometry","mergeVertices","center","group","mesh","Mesh","layers","enable","disable","cam","_camera","nts","_tsets","ts","TS","cameras","deleteCamera","setCamera","setResolution","tsurl","TILES","TilesRenderer","fetchOptions","mode","setResolutionFromRenderer","bFirst","onLoadModel","_onAllReqsCompleted","magFilter","LinearFilter","onDisposeModel","parentNode","computeBoundsTree","anisotropy","_maxAnisotropy","bAnimations","animations","mixer","AnimationMixer","clip","clipAction","play","asset","cc","copyright","extras","e","generator","_ccModels","tstr","values","TSTRING_SEPARATOR","numValues","parseFloat","prec","toPrecision","md","m","PATH_RESTAPI","mstr","str","elem","documentElement","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","blob","URL","createObjectURL","download","click","downloadBlob","Blob","jsonobj","downloadText","buffer","bBin","opts","binary","GLTFExporter","parse","output","ArrayBuffer","downloadArrayBuffer","downloadJSONobj","OBJExporter","size","img","Image","aspect","updateProjectionMatrix","setSize","render","_mainRoot","elDom","domElement","FX","composer","UU","passes","PASS_AA","resolution","renderer","b64img","toDataURL","src","_onResize","noLP","BoxBufferGeometry","MeshStandardMaterial","tex","createSceneNode","metalness","metalnessMap","roughnessMap","normalMap","dx","dz","PlaneBufferGeometry","rotateX","PI","SceneHub","currID","currData","_bEdit","_bLoading","_title","_descr","initBaseParsers","reqpath","sid","onSuccess","getJSON","parseScene","sobj","_jsonParsers","getSemanticNode","getSceneNode","child","nodes","edges","n","semid","S","SL","sphere","FLOAT_PREC","CL","semesh","_convexPoints","title","setTitle","descr","fx","ao","togglePass","PASS_AO","setAOintensity","bloom","PASS_BLOOM","setBloomStrength","setBloomThreshold","dof","PASS_DOF","setDOFfocus","environment","env","pano","mainpano","setMainPanorama","setMainPanoramaRotation","bgcolor","setBackgroundColor","L","mainlight","direction","setMainLightDirection","intensity","shadows","toggleShadows","toggleMainLight","lps","lightprobes","auto","setAutoLP","exposure","setExposure","soundscape","global","setGlobalAudio","loop","navmode","setNavMode","measurements","measure","points","A","B","SUI","addMeasurementPoint","viewpoints","povs","setHomePOV","scenegraph","sg","G","getOrCreateSceneNode","transform","list","Array","isArray","u","shadowcast","shadowreceive","toYup","keywords","parid","childid","semanticgraph","getOrCreateSemanticNode","createSemanticNode","spheres","loc","SemFactory","createSphere","convexshapes","createConvexShape","nopicking","key","parser","patch","MODE_ADD","O","MODE_DEL","jstr","r","AudioHub","_listener","AudioListener","AudioLoader","audioURL","Audio","setBuffer","COSINOIDAL_DIST","cos","_mode","POVtransitionDuration","STD_POV_TRANS_DURATION","_rotSpeedOrbit","_rotSpeedFP","_inertia","_bControl","_bInteracting","_prevMode","setOrbitControl","_currPOV","STD_FOV","_fromPOV","_reqPOV","homePOV","_tPOVcall","_tPOVprogress","_vDir","Quaternion","_motionAmt","_motionDir","_bValidLocomotion","_queryDataScene","_controls","_cOrbit","_cFirstPerson","setUserControl","MODE_ORBIT","MODE_FP","MODE_DEVORI","setFirstPersonControl","setDeviceOrientationControl","PP","camera","updateTSetsCamera","XR","isPresenting","_camOrbit","PerspectiveCamera","innerWidth","innerHeight","STD_NEAR","enableAll","OrbitControls","rotateSpeed","enablePan","enableDamping","dampingFactor","screenSpacePanning","enableZoom","minDistance","maxDistance","addEventListener","_updCamera","syncCurrCamera","toggleCenteredQuery","getSelectorRadius","setSelectorRadius","_camFP","_screenPointerCoords","_cDevOri","_camDevOri","DeviceOrientationControls","alphaOffset","_cam","getCamera","getWorldPosition","getWorldQuaternion","getWorldDirection","ctrl","handleXRtransition","handlePOVtransition","isTransitioning","controller0","negate","fv","multiplyScalar","_clock","elapsedTime","lerpVectors","MathUtils","lerp","_currPos","_reqPos","_fromPos","tgt","subVectors","normalize","FP_EPS","syncCurrPOV","handlePOV","duration","E","radius","requestPOV","requestPOVbyBound","point","normal","distanceTo","dd","dv","sceneBS","getRootScene","eye","computeDefaultHome","scope","reorder","deviceOrientation","screenOrientation","absolute","alphaOffsetDevice","alphaOffsetScreen","onDeviceOrientationChangeEvent","event","onDeviceOrientationAbsoluteChangeEvent","onScreenOrientationChangeEvent","orientation","setObjectQuaternion","zee","euler","Euler","q0","q1","sqrt","alpha","beta","gamma","orient","setFromEuler","multiply","setFromAxisAngle","connect","disconnect","removeEventListener","getDirection","degToRad","iOSOrientationPermission","DeviceOrientationEvent","requestPermission","permissionState","catch","error","webkitCompassHeading","getDirectionMap","setReferenceSpaceType","setFramebufferScaleFactor","_stdpxd","MOBILE_DENSITY_F","_bPresenting","currSession","_sessionType","rig","gControllers","controller1","controller0pos","controller1pos","controller0dir","controller1dir","_lastPosR","_lastPosL","_pointerLineGeom","_pointerLineMesh","gpad0","gpad1","_urlHand","HAND_R","_stdActivation","uid","rh","getUINode","lh","avMats","avatars","am","currentQueryValidForLocomotion","userHeight","STD_TELEP_DURATION","rc","getCurrentEyeLocation","getCurrentDirection","bAddRep","setupControllerUI","HAND_L","session","onSessionEnded","MediaRec","stopMediaStreaming","setSession","background","_mMainPano","getController","bXRconfig","hand","handedness","_setupControllerL","_setupControllerR","setRefSpaceLocation","setTimeout","requestHome","sessiontype","setSessionType","sessionInit","optionalFeatures","requestSession","onSessionStarted","end","raytick","rhand","lhand","createUINode","CylinderBufferGeometry","translate","raylen","H","getControllerGrip","prev","lengthSq","Button","uiid","ratio","fsize","baseColor","switchColor","baseOpacity","hoverOpacity","_bSwitched","container","ThreeMeshUI","Block","width","height","padding","borderRadius","backgroundColor","backgroundOpacity","fontFamily","PATH_FONT_JSON","fontTexture","PATH_FONT_TEX","justifyContent","alignContent","uiText","Text","content","fontSize","fontColor","trw","STD_BTN_SIZE","trh","_trigger","PlaneGeometry","setBaseColor","setSwitchColor","setBackgroundOpacity","setText","text","switch","setIcon","bNoBackground","Label","setTextColor","init","mainSelector","_mSelectorSphere","renderOrder","fpTeleport","gTeleport","mTeleport","gMeasures","_prevMPoint","_measLabels","mLine","BufferGeometry","setFromPoints","_measLine","Line","gPoints","buildInfoNode","bShowInfo","_labelScale","_labelScaleVR","setInfoNodeText","gSemIcons","_sync","enableLPIcons","gLPIcons","enableSemIcons","_selectorRad","setSelectorModel","path","bUseStdMat","setSelectorColor","addSemIcon","meshape","semicon","Sprite","addLPIcon","rn","lpicon","setSemIconsOpacity","infoNode","infoContainer","infoNodeText","getInfoNode","txt","createToolbar","buttonlist","num","cont","button","linetick","mlArr","attributes","array","gLine","getHumanReadableDistance","R","clearMeasurements","_updateMeasurements","ml","_bPauseQuery","_hoveredSemNode","isOrbit","_queryDataUI","_queryDataSem","ls","_bStreamFocus","ss","Avatar","userid","username","message","_auTalk","PositionalAudio","setRefDistance","_bPlayingAudio","_auChunks","_tStateCall","_tProgress","_tFocCall","_currFocusPos","_tgtFocusPos","_currState","_tgtState","realize","setTalkDistance","getAvatarMaterialByUID","avaMats","usermaterial","smesh","usermeshnode","userauinode","uspritemats","userfpnode","ufocmats","userlabelnode","labelcontainer","usernametext","ucolors","usermessagetext","_focNodes","focGroup","destroy","loadRepresentation","setUsername","getUsername","setMessage","msg","setTalkVolume","vol","hideFocalPoint","requestFocus","fp","_tgtFocusRad","handleFocusTransition","D","USER_STATE_FREQ","requestStateTransition","handleStateTransition","cs","slerp","avol","_handleTalk","shift","onended","address","origin","initMaterials","socket","_connected","_username","_numUsers","avatarList","avaGroup","bSendState","setInterval","sendState","_lastStateSent","_bShowAvaG","enableChatLog","_elChat","getNumUsers","ucolorsdark","ucolorhex","MM","texAUI","smat","texFocP","sock","emit","REPLICATED_EVT","evhNetwork","isConnected","hasID","joinSession","ssid","requestSceneState","setAvatarsVisibility","protocol","secure","rejectUnauthorized","io","connected","_registerSocketHandlers","_onConnected","append","_msg","scrollTop","scrollHeight","numUsers","touchAvatar","decodeState","uname","isPlaying","stop","setLoop","encodeState","Float32Array","binData","Int8Array","w","view","a","setFocusStreaming","cpov","getSceneQueriedPoint","fy","fz","lastPos","lastOri","dPos","dOri","angleTo","THRES_STATE_POS","THRES_STATE_ORI","getAvatar","destroyAvatar","clearAllAvatars","bConvexBuilding","convexPoints","convexNode","currConvexMesh","currSemNode","resetMaterial","_numShapes","currMaterial","pp","equals","numPoints","geom","ConvexGeometry","currSemesh","setVectorPrecision","pop","udMesh","offset","addConvexPoint","Object3D","FE","PATH_RES_ICONS","_bPopup","popupBlurBG","_userAuth","_bControlLight","_bControlSelScale","_cLightDir","_auSemNode","_auSemNodePlaying","_bReqHome","_vrcAddr","_bVRCsetup","urlParams","URLSearchParams","search","_uiSetupBase","_uiProfiles","_uiCurrProfile","_selRanges","_selRefRadius","uiSwitchButton","ddens","get","setDefaultPixelDensity","dynd","toggleDynamicDensity","computeAndRequestDefaultHome","computeSelectorRanges","_handleHomeReq","addUpdateRoutine","_update","_kModCtrl","ff","getFOV","_kModShift","reqstr","PATH_RESTAPI_SCENE","attr","PATH_SCENES","sin","uiAddButton","toggleFullScreen","isConnectionSecure","popupClose","html","idcontainer","icon","onPress","tooltip","iconurl","iconid","slice","elid","el","addClass","removeClass","isFirstPerson","isDevOri","restorePreviousNavMode","popupNav","isAudioRecording","startMediaStreaming","popupQR","popupScreenShot","popupSceneInfo","isFullscreen","kwList","onAddKeyword","onRemoveKeyword","htmlcode","uiAttachInputFilterID","ht","kwsObj","addKWtoBox","val","keypress","keycode","keyCode","which","getVRCclassFromID","checkAuth","sstate","popupVRC","_setupVRCevents","popupUser","uiFunction","idbutton","inputid","regReplace","RegExp","htmlcontent","chk","auLib","cssClasses","clstr","htcont","stopPropagation","fadeIn","POPUP_DELAY","_bListenKeyboardEvents","filter","bNoAnim","fadeOut","focusOn3DView","popupFunc","popupShow","QRCode","getElementById","cover","takeScreenshot","parseInt","postJSON","Object","keys","uip","setEditMode","goToURL","uiLoadProfile","password","head","getTitle","rad","hr","uiAddButtonFirstPerson","uiAddButtonDeviceOrientation","uiAddButtonVR","_bAudioRecording","_bStreaming","recorder","reset","mediaDevices","_ds","_streamChunk","auStreamInterval","getUserMedia","video","channelCount","echoCancellation","stream","RecordRTC","mimeType","auType","bitsPerSecond","auBitsPerSecond","audioBitsPerSecond","sampleRate","desiredSampRate","disableLogs","numberOfAudioChannels","onFinish","stopRecording","getDataURL","b64","compress","rblob","_auAVGvolume","realizeAudioRecorder","startRecording","getBlob","reader","FileReader","readAsDataURL","onloadend","base64data","result","_stopRecAndSend","GeoLoc","EARTH_D_KM","EARTH_R_KM","_bActive","_wpid","Vector2","_POIs","_currPOI","_closestPOI","_maxError","enableTracking","geolocation","watchPosition","_onPosition","_onError","enableHighAccuracy","disableTracking","clearWatch","setMaxError","coords","acc","accuracy","latitude","longitude","_handlePOIs","numPOIs","_closestPOIdist","POI","distance","getCurrentLocation","locationFromLatLon","lat","lon","distance_orig","latlonA","latlonB","dLat","DEG2RAD","dLon","atan2","asin","addPOI","getPOIbyIndex","getClosestPOI","getClosestPOIdistance","AppHub","_appid","_appdata","PATCH_ADD","wappid","fid","PATCH_DEL","_sendDataPatch","PATH_WAPPS","EffectComposer","autoClear","CW","CH","PASS_BASE","RenderPass","addPass","SAOPass","params","saoBias","saoScale","saoIntensity","UnrealBloomPass","threshold","strength","BokehPass","focus","aperture","maxblur","PASS_GAMMA","ShaderPass","GammaCorrectionShader","FXAAShader","pass","RAD2DEG","PATH_MODS","PATH_DRACO_LIB","PATH_BASIS_LIB","PATH_IFC_LIB","PATH_FE","SHADOWS_NEAR","SHADOWS_FAR","SHADOWS_SIZE","SHADOWS_RES","AMB_L","setPathCollection","setPathScenes","_onUserInteraction","_elPanoVideo","_vpanoPlaying","context","state","resume","_setupBaseListeners","onorientationchange","_readDeviceOrientationMode","screenfull","isEnabled","_bFS","_updateScreenMove","_onMouseWheel","_bPointerDown","_handleQueries","touches","Hammer","srcEvent","_hoveredUI","defaultDoubleTapFromScreenCoords","max","preventDefault","deltaY","_SUIactivation","U","teleportOnQueriedPoint","playAudioFromSemanticNode","bFPtrans","currDir","feye","ftgt","hsn","requestPOVbyNode","requestRetarget","_handleQueryScene","profileDevice","Clock","WebGLRenderer","antialias","powerPreference","profileRenderingCapabilities","setPixelRatio","_fps","_dtAccum","_avgFPScount","_avgFPSaccum","_avgFPS","_bDynamicDensity","_dRenderBudgetMinFPS","_dRenderBudgetMaxFPS","outputEncoding","toneMapping","LinearToneMapping","toneMappingExposure","setAnimationLoop","_onFrame","getMaxAnisotropy","Cache","canvas","outline","border","_bUserInts","GLTFLoader","_numReqLoad","_dracoLoader","DRACOLoader","setDecoderConfig","setDecoderPath","setWorkerLimit","preload","setDRACOLoader","_updRoutines","_bAutoLP","_envMapInt","_bShadowsFixedBound","_shadowsFixedBoundCenter","_shadowsNear","_shadowsFar","_shadowsSize","_shadowsRes","initGraphs","_bQuerySemOcclusion","_bQueryNormals","_bCenteredQuery","_tgiDur","_tgiPer","_tHover","_bMainPanoInfinite","_matMainPano","_rcScene","Raycaster","_rcSemantics","_rcUI","_registerRCS","_wappID","_extAPItokens","setTimedGazeDuration","dt","getTimedGazeProgress","getElapsedTime","renderPause","renderResume","_setupLoadManager","_loadManager","LoadingManager","onStart","itemsLoaded","itemsTotal","onLoad","onProgress","onError","resetPixelDensity","abs","getRootSemantics","getRootUI","adjustShadowsParamsFromSceneBounds","updateDirShadows","addLightProbe","setDOFaperture","_postAllReqsCompleted","updateLightProbes","autoUpdate","Scene","ambLight","AmbientLight","bg","setNeutralAmbientLight","_indLP","LightProbeGenerator","fromCubeRenderTarget","combine","AddOperation","envMapIntensity","tpano","_gMainPano","SphereBufferGeometry","frustumCulled","setMainPanoramaRadius","isVideo","innerHTML","crossOrigin","playsinline","cssText","autoplay","onplaying","VideoTexture","_realizeOrUpdateMainPano","onAfterRender","setMainPanoramaInfinite","setMainPanoramaLocation","DirectionalLight","_dMainLtgt","_dMainLpos","_dMainLdir","getMainLightDirection","ld","isMainLightEnabled","getExposure","left","right","bottom","top","mapSize","shb","bias","PCFShadowMap","PCFSoftShadowMap","_updateEnvironment","bLoop","_auMain","_markFPS","fps","_handleDynamicRenderProfiles","setDynamicRenderingFPS","minBudget","maxBudget","getPixelRatio","getDelta","_updateAniMixers","_updateRoutines","_updateTSets","deleteAllUpdateRoutines","clientX","clientY","_rcRR","_rcHandlers","_handleQuerySemantics","_handleQueryUI","locomotionValidator","hitsnum","setupQueryRay","setFromCamera","_hitsScene","intersectObjects","face","Matrix3","getNormalMatrix","applyMatrix3","getSceneQueriedDistance","getSceneQueriedNormal","_hitsSem","sp","_hitsUI","hui","setSketchFabAPIToken","tok","sketchfab"],"mappings":"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","file":"ATON.min.js","sourceRoot":"..\\src","sourcesContent":["/*\r\n ATON Node Class\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n//import Period from \"./ATON.period.js\";\r\n\r\n\r\n/**\r\nClass representing an ATON node.\r\nConstructor allows to create different types (scene nodes, semantic nodes and UI nodes)\r\n@class Node\r\n@example \r\nlet myNode = new ATON.Node(\"someID\")\r\n*/\r\nclass Node extends THREE.Group {\r\n\r\nconstructor(id, type){\r\n super();\r\n\r\n this.type = type? type : ATON.NTYPES.SCENE;\r\n \r\n this.enablePicking();\r\n\r\n if (this.type === ATON.NTYPES.SCENE){\r\n this._rootG = ATON._rootVisible;\r\n this._nodes = ATON.snodes;\r\n //this.period = undefined; // TODO: assign period object (read-only, centralized) - NOT USED FOR NOW\r\n }\r\n if (this.type === ATON.NTYPES.SEM){\r\n this._rootG = ATON._rootSem;\r\n this._nodes = ATON.semnodes;\r\n //this.period = undefined;\r\n }\r\n\r\n if (this.type === ATON.NTYPES.UI){\r\n this._rootG = ATON._rootUI;\r\n this._nodes = ATON.uinodes;\r\n }\r\n\r\n // Register\r\n this.as(id);\r\n\r\n this.kwords = undefined;\r\n\r\n this._bCloneOnLoadHit = true;\r\n\r\n // Transform list (instancing)\r\n this._tlist = undefined;\r\n\r\n // Animation mixers\r\n this._aniMixers = undefined;\r\n\r\n // Shadows\r\n this.castShadow = false;\r\n this.receiveShadow = false;\r\n\r\n // Local handlers\r\n this.onHover = undefined;\r\n this.onLeave = undefined;\r\n this.onSelect = undefined;\r\n}\r\n\r\n/**\r\n(Re)assign node ID\r\n@param {string} id - the new ID\r\n@example\r\nmyNode.as(\"newID\")\r\n*/\r\nas(id){\r\n if (id === undefined) return;\r\n if (id === ATON.ROOT_NID) return;\r\n\r\n this._nodes[id] = this;\r\n this.nid = id;\r\n this.name = id;\r\n\r\n return this;\r\n}\r\n\r\nsetAsRoot(){\r\n this._nodes[ATON.ROOT_NID] = this;\r\n this.nid = ATON.ROOT_NID;\r\n\r\n return this;\r\n}\r\n\r\nsetCloneOnLoadHit(b){\r\n this._bCloneOnLoadHit = b;\r\n return this;\r\n}\r\n\r\n/**\r\nAdd keyword(s) to this node. Keywords are also recursively added into the sub-graph\r\n@param {string} kw - the keyword or comma-separated list of keywords\r\n@example\r\nmyNode.addKeywords(\"heritage,reconstruction\");\r\n*/\r\naddKeywords(kw){\r\n let K = kw.split(\",\");\r\n\r\n if (this.kwords === undefined) this.kwords = {};\r\n for (let k in K){\r\n let kw = K[k].trim();\r\n if (kw.length > 0) this.kwords[kw] = true;\r\n }\r\n\r\n // recurse into ATON nodes\r\n for (let c in this.children){\r\n let C = this.children[c];\r\n if (C.type !== undefined) C.addKeywords(kw);\r\n }\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nReturns true if this node has specific keyword\r\n@param {string} kw - the keyword\r\n@returns {boolean}\r\n@example\r\nif (myNode.hasKeyword(\"heritage\")){ ... }\r\n*/\r\nhasKeyword(kw){\r\n if (this.kwords === undefined) return;\r\n return (this.kwords[kw] !== undefined);\r\n}\r\n\r\n/**\r\nSet custom description (string) to the node\r\n@param {string} s - content\r\n@example\r\nmyNode.setDescription(\"This is a small description\");\r\n*/\r\nsetDescription(s){\r\n this.userData.description = s;\r\n return this;\r\n}\r\n\r\n/**\r\nGet node description (string) if any\r\n@returns {string}\r\n@example\r\nlet desc = myNode.getDescription();\r\n*/\r\ngetDescription(){\r\n return this.userData.description;\r\n}\r\n\r\nsetAudio(au){\r\n this.userData.audio = au;\r\n return this;\r\n}\r\n\r\ngetAudio(){\r\n return this.userData.audio;\r\n}\r\n\r\n/**\r\nHide this node (and sub-graph), also invisible to queries (ray casting, picking)\r\n@example\r\nmyNode.hide()\r\n*/\r\nhide(){\r\n this.visible = false;\r\n\r\n //this.traverse((o) => { o.layers.disable(this.type); });\r\n ATON.Utils.setPicking(this, this.type, false);\r\n\r\n if (ATON._renderer.shadowMap.enabled){\r\n ATON._dMainL.shadow.needsUpdate = true;\r\n }\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nShow this node (and sub-graph). If pickable, becomes sensible to queries (ray casting)\r\n@example\r\nmyNode.show()\r\n*/\r\nshow(){\r\n this.visible = true;\r\n\r\n //if (this.bPickable) ATON.Utils.setPicking(this, this.type, true); //this.traverse((o) => { o.layers.enable(this.type); });\r\n ATON.Utils.setPicking(this, this.type, this.bPickable);\r\n\r\n if (ATON._renderer.shadowMap.enabled){\r\n if (ATON._dMainL!==undefined && ATON._dMainL.shadow!==undefined) ATON._dMainL.shadow.needsUpdate = true;\r\n }\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nToggle node visibility. If visible, becomes invisible, and viceversa.\r\n@example\r\nmyNode.toggle()\r\n*/\r\ntoggle(b){\r\n if (b === undefined){\r\n if (this.visible) return this.hide();\r\n else return this.show();\r\n }\r\n\r\n if (b) return this.show();\r\n else return this.hide();\r\n}\r\n\r\n/**\r\nDisable this node for runtime queries (ray casters). Useful for instance on vegetation, etc...\r\n@example\r\nmyNode.load(\"somevegetation.gltf\").disablePicking()\r\n*/\r\ndisablePicking(){\r\n this.bPickable = false;\r\n ATON.Utils.setPicking(this, this.type, this.bPickable);\r\n\r\n return this; \r\n}\r\n\r\n/**\r\nEnable this node for runtime queries (ray casters)\r\n@example\r\nmyNode.enablePicking()\r\n*/\r\nenablePicking(){\r\n this.bPickable = true;\r\n ATON.Utils.setPicking(this, this.type, this.bPickable);\r\n\r\n return this;\r\n}\r\n\r\nsetPickable(b){\r\n if (b) this.enablePicking();\r\n else this.disablePicking();\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet cascading material. Note this applies to this node and all children (even all those still loading)\r\n@param {THREE.Material} M - the Material\r\n@example\r\nmyNode.setMaterial( new THREE.MeshBasicMaterial({ transparent: true, opacity: 0.2, wireframe: true }) )\r\n*/\r\nsetMaterial(M){\r\n this.userData.cMat = M;\r\n\r\n this.traverse((o) => {\r\n if (o.isMesh){\r\n o.material = M;\r\n ///o.material.needsUpdate = true;\r\n //console.log(o);\r\n }\r\n\r\n if (o.type) this.userData.cMat = M;\r\n });\r\n\r\n // children\r\n for (let c in this.children){\r\n let C = this.children[c];\r\n if (C.setMaterial) C.setMaterial(M);\r\n }\r\n\r\n return this;\r\n}\r\n\r\n/** \r\nGet cascading material\r\n@returns {THREE.Material}\r\n*/\r\ngetMaterial(){\r\n return this.userData.cMat;\r\n}\r\n\r\n// Set default and highlight materials\r\nsetDefaultAndHighlightMaterials(matSTD, matHL){\r\n this.userData.matSTD = matSTD;\r\n this.userData.matHL = matHL;\r\n\r\n return this;\r\n}\r\nhighlight(){\r\n if (this.userData.matHL) this.setMaterial(this.userData.matHL);\r\n return this;\r\n}\r\nrestoreDefaultMaterial(){\r\n if (this.userData.matSTD) this.setMaterial(this.userData.matSTD);\r\n return this;\r\n}\r\n\r\n// Set cascading opacity\r\nsetOpacity(f){\r\n this.traverse((o) => {\r\n if (o.isMesh){\r\n o.material.opacity = f;\r\n //o.material.needsUpdate = true;\r\n }\r\n });\r\n\r\n return this;\r\n}\r\n\r\n// FIXME: not working\r\nsetShadowCast(b){\r\n this.castShadow = b;\r\n\r\n this.traverse((o) => {\r\n if (o.isMesh){\r\n o.castShadow = b;\r\n }\r\n });\r\n\r\n return this;\r\n};\r\nsetShadowReceive(b){\r\n this.receiveShadow = b;\r\n\r\n this.traverse((o) => {\r\n if (o.isMesh){\r\n o.receiveShadow = b;\r\n }\r\n });\r\n\r\n return this;\r\n};\r\n\r\nsetEnvMap(envtex){\r\n this.traverse((o) => {\r\n if (o.isMesh){\r\n\t\t\to.material.envMap = envtex;\r\n\t\t\t//o.material.combine = THREE.MultiplyOperation;\r\n //o.material.needsUpdate = true;\r\n }\r\n });\r\n\r\n return this;\r\n}\r\n\r\nassignLightProbe(LP){\r\n this.traverse((o) => {\r\n if (o.isMesh && o.geometry) ATON.Utils.assignLightProbeToMesh(LP, o);\r\n });\r\n\r\n return this;\r\n}\r\n\r\n// (re)assign LPs for each mesh depending on proximity\r\nassignLightProbesByProximity(){\r\n if (ATON._lps.length === 0) return this;\r\n\r\n this.traverse((o) => {\r\n if (o.isMesh && o.geometry){\r\n let c = new THREE.Vector3();\r\n let bbox = new THREE.Box3().setFromObject(o).getCenter(c);\r\n\r\n let cLP = undefined;\r\n let mdist = undefined;\r\n\r\n for (let i in ATON._lps){\r\n let LP = ATON._lps[i];\r\n let d = c.distanceToSquared(LP.pos);\r\n\r\n if (cLP === undefined || d < mdist){\r\n mdist = d;\r\n cLP = LP;\r\n }\r\n }\r\n\r\n if (cLP) ATON.Utils.assignLightProbeToMesh(cLP, o);\r\n }\r\n });\r\n\r\n return this;\r\n};\r\n\r\n// Find & update all LPs under this subgraph\r\n// FIXME: not working\r\nupdateLightProbes = ()=>{\r\n this.traverse((o) => {\r\n if (o.isMesh && o.geometry){\r\n let LP = o.userData.LP;\r\n\r\n if (LP !== undefined){\r\n LP.update();\r\n o.material.envMap = LP.getEnvTex();\r\n //o.material.envMapIntensity = 5.0;\r\n //console.log(\"x\");\r\n }\r\n }\r\n });\r\n\r\n return this;\r\n};\r\n\r\n// Deep clone\r\nduplicate(){\r\n let C = this.clone();\r\n\r\n C.traverse((o)=>{\r\n if (o.isMesh){\r\n o.material = o.material.clone();\r\n }\r\n });\r\n\r\n return C;\r\n}\r\n\r\n\r\n// FIXME: xxx\r\ndelete(){\r\n let p = this.parent;\r\n\r\n if (p !== undefined && p.nid !== undefined) p.removeChild( this );\r\n}\r\n\r\nremoveChild(c){\r\n if (c === undefined) return;\r\n\r\n let nid = c.nid;\r\n if (c.nid !== undefined) this._nodes[c.nid] = undefined;\r\n\r\n c.parent = undefined;\r\n\r\n c.traverse((o) => {\r\n if (o.geometry) o.geometry.dispose();\r\n if (o.material) o.material.dispose();\r\n });\r\n\r\n this.remove(c);\r\n\r\n return this;\r\n}\r\n/**\r\nDelete all children of this node\r\n*/\r\nremoveChildren(){\r\n let num = this.children.length;\r\n for (let i=(num-1); i>=0; i--) this.removeChild(this.children[i]);\r\n\r\n return this;\r\n}\r\n\r\n\r\n/**\r\nAttach this node to parent by providing ID (string) or node object\r\n@param {string|Node} node - the parent node\r\n@example\r\nmyNode.attachTo(\"someGroupID\")\r\n@example\r\nmyNode.attachTo(myParentGroup)\r\n*/\r\nattachTo(node){\r\n let N = (typeof node === 'string')? this._nodes[node] : node;\r\n if (N){\r\n N.add(this);\r\n if (N.userData.cMat !== undefined) this.userData.cMat = N.userData.cMat; // this.setMaterial(N.userData.cMat);\r\n if (N.bPickable !== undefined) this.bPickable = N.bPickable;\r\n\r\n //this.toggle(N.visible);\r\n }\r\n \r\n return N;\r\n}\r\n\r\n/**\r\nAttach this node to main root. This is usually mandatory in order to visualize the node and all its descendants.\r\nDepending on node type this will be the scene root (visible scene-graph), the semantic-graph root or UI root\r\n@example\r\nmyNode.attachToRoot()\r\n*/\r\nattachToRoot(){\r\n this._rootG.add(this);\r\n if (this._rootG.userData.cMat !== undefined) this.userData.cMat = this._rootG.userData.cMat;\r\n if (this._rootG.bPickable !== undefined) this.bPickable = this._rootG.bPickable;\r\n\r\n //this.toggle(this._rootG.visible);\r\n \r\n return this._rootG;\r\n}\r\n\r\n/**\r\nReturn bounding sphere of this node\r\n@returns {THREE.Sphere}\r\n@example\r\nlet bs = myNode.getBound()\r\n*/\r\ngetBound(){\r\n let bb = new THREE.Box3().setFromObject( this );\r\n let bs = new THREE.Sphere();\r\n bb.getBoundingSphere(bs);\r\n\r\n return bs;\r\n}\r\n\r\n/**\r\nSet location (translation) of this node\r\n@example\r\nmyNode.setPosition(1.0,3.0,0.0)\r\n@example\r\nmyNode.setPosition( new THREE.Vector3(1.0,3.0,0.0) )\r\n*/\r\nsetPosition(x,y,z){\r\n if (x instanceof THREE.Vector3) this.position.copy(x);\r\n else this.position.set(x,y,z);\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet scale of this node\r\n@example\r\nmyNode.setScale(3.0,2.0,1.0)\r\n@example\r\nmyNode.setScale(2.0)\r\n@example\r\nmyNode.setScale( new THREE.Vector3(3.0,2.0,1.0) )\r\n*/\r\nsetScale(sx,sy,sz){\r\n if (sx instanceof THREE.Vector3) this.scale.copy(sx);\r\n else {\r\n if (sy === undefined){ sy = sx; sz = sx; }\r\n this.scale.set(sx,sy,sz);\r\n }\r\n \r\n return this;\r\n}\r\n\r\n/**\r\nSet rotation of this node (Euler rx,ry,rz) in radians\r\n@example\r\nmyNode.setRotation(3.0,2.0,1.0)\r\n@example\r\nmyNode.setRotation( new THREE.Vector3(3.0,2.0,1.0) )\r\n*/\r\nsetRotation(rx,ry,rz){\r\n if (rx instanceof THREE.Vector3) this.rotation.copy(rx);\r\n else this.rotation.set(rx,ry,rz);\r\n \r\n return this;\r\n}\r\n/**\r\nOrient this node to current camera\r\n*/\r\norientToCamera(){\r\n this.quaternion.copy( ATON.Nav._qOri );\r\n return this;\r\n}\r\n\r\nsetYup(){\r\n this.rotation.set(-1.57079632679,0.0,0.0);\r\n return this; \r\n}\r\n\r\n/**\r\nAdd a transform for this node.\r\nAdding multiple transforms before loading a 3D model will result in instancing these resources\r\n@param {string} T - the transform string to be added\r\n@example\r\nmyNode.addTransform(\"10 0 0\").addTransform(\"-5 0 0\").load(\"mymodel.gltf\").attachToRoot()\r\n*/\r\naddTransform(T){\r\n let TT = undefined;\r\n\r\n if (typeof T === \"string\"){\r\n TT = ATON.Utils.parseTransformString(T);\r\n }\r\n\r\n if (TT === undefined) return this;\r\n\r\n if (this._tlist === undefined) this._tlist = [];\r\n this._tlist.push(TT);\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nLoad a 3D model under this node, with optional onComplete handler.\r\nNote the system will take care of loading the resources in background, and will manage duplicate requests to same resources avoiding waste of bandwidth\r\n@param {string} url - the url of the 3D model (local to collection or complete)\r\n@param {function} onComplete - the optional handler to be fired on completion\r\n@example\r\nmyNode.load(\"mymodel.gltf\", ()=>{ console.log(\"completed!\") })\r\n*/\r\nload(url, onComplete){\r\n if (url === undefined) return this;\r\n\r\n url = ATON.Utils.resolveCollectionURL(url);\r\n\r\n let N = this;\r\n\r\n if (url.endsWith(\"tileset.json\")){\r\n ATON.Utils.loadTileSet(url, N);\r\n ATON._bqScene = true;\r\n if (onComplete) onComplete();\r\n return N;\r\n }\r\n\r\n // [C] Promise already requested\r\n if ( N._bCloneOnLoadHit && ATON._assetsManager[url] !== undefined ){\r\n ATON._assetsManager[url].then(( o ) =>{\r\n let C = o.clone();\r\n\r\n ATON.Utils.modelVisitor(N, C);\r\n \r\n if (N._tlist !== undefined){\r\n for (let t in N._tlist){\r\n N._tlist[t].add(C.clone());\r\n N.add(N._tlist[t]);\r\n }\r\n }\r\n else N.add( C );\r\n\r\n // animations\r\n //ATON.Utils.registerAniMixers(N, data);\r\n\r\n //N.setPickable(N.bPickable);\r\n //N.toggle(N.visible);\r\n\r\n if (onComplete) onComplete();\r\n });\r\n\r\n console.log(\"HIT!\");\r\n return N;\r\n }\r\n\r\n // Fire request\r\n /*if (N.type === ATON.NTYPES.SCENE)*/ ATON._assetReqNew(url);\r\n\r\n let P = new Promise( ( resolve, reject ) => {\r\n ATON._aLoader.load( url, (data)=>{\r\n let model = data.scene || data.scene[0];\r\n\r\n // Visit loaded model\r\n ATON.Utils.modelVisitor(N, model);\r\n\r\n if (N._tlist !== undefined){\r\n for (let t in N._tlist){\r\n N._tlist[t].add(model.clone());\r\n N.add(N._tlist[t]);\r\n }\r\n }\r\n else N.add( model );\r\n\r\n // animations\r\n ATON.Utils.registerAniMixers(N, data);\r\n\r\n // CC manager\r\n ATON.Utils.ccExtract(data);\r\n\r\n resolve(model);\r\n console.log(\"Model \"+url+\" loaded\");\r\n \r\n /*if (N.type === ATON.NTYPES.SCENE)*/ ATON._assetReqComplete(url);\r\n\r\n // post-visit (FIXME:)\r\n //N.setPickable(N.bPickable);\r\n //N.toggle(N.visible);\r\n\r\n if (N.type === ATON.NTYPES.SCENE) ATON._bqScene = true;\r\n if (N.type === ATON.NTYPES.SEM) ATON._bqSem = true;\r\n\r\n //\r\n if (N.bPickable) N.enablePicking();\r\n\r\n if (onComplete) onComplete();\r\n },\r\n undefined,\r\n (err)=>{\r\n //console.log(err);\r\n //reject(model);\r\n\r\n /*if (N.type === ATON.NTYPES.SCENE)*/ ATON._assetReqComplete(url);\r\n if (onComplete) onComplete();\r\n });\r\n\r\n/*\r\n ATON._aLoader.load( url+\"__LOD2-d.gltf\", (data)=>{\r\n let model = data.scene || data.scene[0];\r\n ATON._modelVisitor(model);\r\n\r\n let C = new THREE.Vector3();\r\n let bb = new THREE.Box3().setFromObject( model ).getCenter(C);\r\n model.position.set(-C.x,-C.y,-C.z);\r\n\r\n let lod = new THREE.LOD();\r\n lod.position.set(C.x,C.y,C.z);\r\n lod.matrixAutoUpdate = true;\r\n lod.addLevel(model, 40.0);\r\n N.add(lod);\r\n\r\n //N.add( model );\r\n\r\n resolve(model);\r\n console.log(\"ATON model \"+url+\" loaded\");\r\n\r\n ATON._aLoader.load( url+\"__LOD1-d.gltf\", (data2)=>{\r\n let model2 = data2.scene || data2.scene[0];\r\n ATON._modelVisitor(model2);\r\n\r\n model2.position.set(-C.x,-C.y,-C.z);\r\n \r\n lod.addLevel(model2, 0.0);\r\n });\r\n \r\n ATON._assetReqComplete(url);\r\n });\r\n*/\r\n });\r\n\r\n // Register\r\n if (N._bCloneOnLoadHit) ATON._assetsManager[url] = P;\r\n\r\n return this;\r\n}\r\n\r\nexportAs( filename ){\r\n ATON.Utils.exportNode(this, filename);\r\n\r\n return this;\r\n}\r\n\r\nsetOnHover( f ){\r\n this.onHover = f;\r\n return this;\r\n}\r\nsetOnLeave( f ){\r\n this.onLeave = f;\r\n return this;\r\n}\r\nsetOnSelect( f ){\r\n this.onSelect = f;\r\n return this;\r\n}\r\n\r\n// Assign a period to this node\r\n// TODO: \r\n/*\r\nsetPeriod(p){\r\n if (this.type === ATON.NTYPES.UI) return this; // not on UI nodes\r\n\r\n let P = (typeof p === 'string')? ATON.periods[p] : p;\r\n if (P === undefined) return this;\r\n\r\n this.period = P;\r\n return this;\r\n}\r\n\r\nfilterByPeriodID(id){\r\n if (this.period === undefined) return this;\r\n\r\n if (this.period.id !== id){\r\n this.hide();\r\n return this;\r\n }\r\n else {\r\n this.show();\r\n return this;\r\n }\r\n\r\n this.traverse((o) => {\r\n if (o.period){\r\n if (o.period.id === id) this.show();\r\n else this.hide();\r\n }\r\n });\r\n\r\n return this;\r\n}\r\n*/\r\n\r\n}\r\n\r\nexport default Node;","/*\r\n ATON Viewpoint Class\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nClass representing a Viewpoint (POV) in the 3D space, abstracting from device used (mobile, desktop or immersive XR).\r\nConstructor allows to assign the POV a unique ID (`string`)\r\n@class POV\r\n@example \r\nnew ATON.POV(\"myView\")\r\n*/\r\nclass POV {\r\n\r\nconstructor(id){\r\n this.pos = new THREE.Vector3(1,0,0);\r\n this.target = new THREE.Vector3(0,0,0);\r\n this.up = ATON.STD_UPVECTOR;\r\n this.fov = undefined; //ATON.Nav.STD_FOV;\r\n\r\n this.nextPOV = undefined;\r\n this.prevPOV = undefined;\r\n\r\n // Register\r\n this.as(id);\r\n}\r\n\r\n/**\r\n(Re)assign POV ID\r\n@param {string} id - the new ID\r\n@example\r\nmypov.as(\"newID\")\r\n*/\r\nas(id){\r\n if (id === undefined) return;\r\n\r\n ATON.Nav.povlist[id] = this;\r\n this.id = id;\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet eye position\r\n@example\r\nnew ATON.POV(\"myView\").setPosition(2.0,6.0,1.5)\r\n@example\r\nmypov.setPosition( new THREE.Vector3(2.0,6.0,1.5) )\r\n*/\r\nsetPosition(x,y,z){\r\n if (x instanceof THREE.Vector3) this.pos.copy(x);\r\n else this.pos.set(x,y,z);\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet target position\r\n@example\r\nnew ATON.POV(\"myView\").setTarget(8.0,6.0,1.5)\r\n@example\r\nmypov.setTarget( new THREE.Vector3(8.0,6.0,1.5) ).setPosition(2.0,6.0,1.5)\r\n*/\r\nsetTarget(x,y,z){\r\n if (x instanceof THREE.Vector3) this.target.copy(x);\r\n else this.target.set(x,y,z);\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet field of view (FOV) in degrees\r\n@param {number} f\r\n@example\r\nnew ATON.POV(\"myView\").setFOV(70.0)\r\n*/\r\nsetFOV(f){\r\n this.fov = f;\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nAdd keyword(s) to this viewpoint\r\n@param {string} kw - a keyword or comma-separated list of keywords\r\n@example\r\nmypov.addKeywords(\"heritage,architecture\")\r\n*/\r\naddKeywords(kw){\r\n let K = kw.split(\",\");\r\n\r\n if (this.kwords === undefined) this.kwords = {};\r\n for (let k in K){\r\n let kw = K[k].trim();\r\n if (kw.length > 0) this.kwords[kw] = true;\r\n }\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nReturns true if this viewpoint has specific keyword\r\n@param {string} kw - the keyword\r\n@returns {boolean}\r\n@example\r\nif (myPOV.hasKeyword(\"heritage\")){ ... }\r\n*/\r\nhasKeyword(kw){\r\n if (this.kwords === undefined) return;\r\n return (this.kwords[kw] !== undefined);\r\n}\r\n\r\n/**\r\nSet an optional next POV\r\n@param {POV} pov - the next POV\r\n*/\r\nsetNextPOV(pov){\r\n if (!pov) return;\r\n this.nextPOV = pov;\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet an optional previous POV\r\n@param {POV} pov - the previous POV\r\n*/\r\nsetPrevPOV(pov){\r\n if (!pov) return;\r\n this.prevPOV = pov;\r\n\r\n return this;\r\n}\r\n\r\n}\r\n\r\nexport default POV;","/*\r\n ATON Light Probe Class\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nClass representing a light probe (LP), can be static or updated at runtime\r\n@class LightProbe\r\n@param {number} res - Resolution in pixel of lightprobe (default 64)\r\n@param {number} near - Capture near (default 1m)\r\n@param {number} far - Capture far (default 1Km)\r\n@example \r\nlet LP = new ATON.LightProbe()\r\n*/\r\nclass LightProbe {\r\n\r\nconstructor(res, near, far){\r\n this.pos = new THREE.Vector3(0,0,0);\r\n\r\n this._res = (res !== undefined)? res : 64;\r\n this._near = (near !== undefined)? near : 1.0;\r\n this._far = (far !== undefined)? far : ATON.Nav.STD_FAR;\r\n/*\r\n this._LPtarget0 = undefined;\r\n this._LPtarget1 = undefined;\r\n\r\n this._LP0 = undefined;\r\n this._LP1 = undefined;\r\n\r\n this._flipLP = false;\r\n*/\r\n this._envtex = undefined;\r\n this._prevCCtarget = undefined;\r\n/*\r\n this._LP = new THREE.LightProbe();\r\n this._LP.intensity = 10;\r\n ATON._mainRoot.add( this._LP );\r\n*/\r\n \r\n //this._pmremGenerator = new THREE.PMREMGenerator(ATON._renderer);\r\n\r\n //this.realize();\r\n}\r\n\r\n/*\r\nrealize(){\r\n this._LPtarget0 = new THREE.WebGLCubeRenderTarget( this._res, {\r\n format: THREE.RGBFormat,\r\n generateMipmaps: true,\r\n minFilter: THREE.LinearMipmapLinearFilter,\r\n encoding: THREE.sRGBEncoding // prevent the material's shader from recompiling every frame\r\n });\r\n\r\n this._LPtarget1 = new THREE.WebGLCubeRenderTarget( this._res, {\r\n format: THREE.RGBFormat,\r\n generateMipmaps: true,\r\n minFilter: THREE.LinearMipmapLinearFilter,\r\n encoding: THREE.sRGBEncoding\r\n });\r\n\r\n this._LP0 = new THREE.CubeCamera( this._near, this._far, this._LPtarget0 );\r\n this._LP1 = new THREE.CubeCamera( this._near, this._far, this._LPtarget1 );\r\n\r\n return this;\r\n}\r\n*/\r\n\r\n/**\r\nSet LP position\r\n@example\r\nLP.setPosition(2.0,6.0,1.5)\r\n@example\r\nLP.setPosition( new THREE.Vector3(2.0,6.0,1.5) )\r\n*/\r\nsetPosition(x,y,z){\r\n if (x instanceof THREE.Vector3) this.pos.copy(x);\r\n else this.pos.set(x,y,z);\r\n\r\n //this._LP.position.copy(this.pos);\r\n\r\n return this;\r\n}\r\n\r\nsetNear(near){\r\n this._near = near;\r\n return this;\r\n}\r\nsetFar(far){ \r\n this._far = far;\r\n return this;\r\n}\r\n\r\n/**\r\nUpdate LP capture. Typically called when all 3D models are loaded and arranged into the scene.\r\nCan be called at runtime or whenever there is some change in the 3D scene\r\n@example\r\nLP.update()\r\n*/\r\nupdate(){\r\n if (this._envtex) this._envtex.dispose();\r\n if (this._prevCCtarget) this._prevCCtarget.dispose();\r\n\r\n let CCtarget = new THREE.WebGLCubeRenderTarget( this._res, {\r\n format: THREE.RGBEFormat, //THREE.RGBEFormat,\r\n generateMipmaps: true,\r\n minFilter: THREE.LinearMipmapLinearFilter,\r\n encoding: THREE.sRGBEncoding // prevent the material's shader from recompiling every frame\r\n });\r\n\r\n let CC = new THREE.CubeCamera( this._near, this._far, CCtarget );\r\n CC.position.copy(this.pos);\r\n //CC.layers.set(ATON.NTYPES.SCENE);\r\n\r\n CC.update( ATON._renderer, ATON._rootVisibleGlobal/*ATON._mainRoot*/ );\r\n this._envtex = CCtarget.texture;\r\n\r\n // new\r\n //this._LP.copy( THREE.LightProbeGenerator.fromCubeRenderTarget(ATON._renderer, CCtarget) );\r\n //this._envtex = this._LP;\r\n \r\n \r\n/*\r\n console.log(CC);\r\n console.log(CCtarget);\r\n\r\n let CCtargetX = new THREE.WebGLCubeRenderTarget( this._res, {\r\n format: THREE.RGBFormat,\r\n //generateMipmaps: true,\r\n minFilter: THREE.LinearMipmapLinearFilter,\r\n encoding: THREE.sRGBEncoding\r\n });\r\n\r\n let CCX = new THREE.CubeCamera( this._near, this._far, CCtargetX );\r\n CCX.position.copy(this.pos);\r\n\r\n CCX.update( ATON._renderer, ATON._rootVisible );\r\n this._envtex = this._pmremGenerator.fromCubemap(CCtargetX.texture).texture;\r\n*/\r\n\r\n this._prevCCtarget = CCtarget;\r\n\r\n\r\n/*\r\n if (this._LP0 === undefined || this._LP1 === undefined) return this;\r\n\r\n this._flipLP = !this._flipLP;\r\n //ATON._flipLP = !ATON._flipLP;\r\n\r\n if (this._flipLP){\r\n this._LP0.update( ATON._renderer, ATON._mainRoot );\r\n this._envtex = this._LPtarget0.texture;\r\n }\r\n else {\r\n this._LP1.update( ATON._renderer, ATON._mainRoot );\r\n this._envtex = this._LPtarget1.texture;\r\n }\r\n*/\r\n return this;\r\n}\r\n\r\n\r\ngetEnvTex(){\r\n return this._envtex;\r\n}\r\n\r\nassignToNode(N){\r\n if (N === undefined) return;\r\n //TODO:\r\n}\r\n\r\n}\r\n\r\nexport default LightProbe;","/*\r\n ATON Event Hub\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Event Hub\r\n@namespace EventHub\r\n*/\r\nlet EventHub = {};\r\n\r\n//Initializes the component\r\nEventHub.init = ()=>{\r\n\r\n EventHub.evLocal = {};\r\n EventHub.evNetwork = {};\r\n\r\n // Expose\r\n ATON.on = EventHub.on;\r\n ATON.fireEvent = EventHub.fireEvent;\r\n ATON.clearEventHandlers = EventHub.clearEventHandlers\r\n};\r\n\r\n/**\r\nClear all event handlers for a given event\r\n@param {string} evtname - event name\r\n*/\r\nEventHub.clearEventHandlers = (evtname)=>{\r\n EventHub.evLocal[evtname] = [];\r\n EventHub.evNetwork[evtname] = [];\r\n};\r\n\r\n// Execute all handlers from list with given data\r\nEventHub.executeHandlers = (ehList, data)=>{\r\n if (!ehList) return;\r\n\r\n for (let h = 0; h < ehList.length; h++) {\r\n const handler = ehList[h];\r\n if (handler) handler(data);\r\n }\r\n};\r\n\r\n/**\r\nSubscribe to a given event, with local handler and optional network handler.\r\nThis is also accessible as ATON.on()\r\n@param {string} evtname - event name\r\n@param {function} handlerLocal - local event handler\r\n@param {function} handlerNetwork - optional network (see VRoadcast) event handler\r\n@example\r\nATON.EventHub.on(\"myEvent\", function(data){ console.log(\"received local event\"); })\r\n@example\r\nATON.on(\"myEvent\", function(data){ console.log(\"received local event\"); })\r\n*/\r\nEventHub.on = (evtname, handlerLocal, handlerNetwork)=>{\r\n // Local event (default)\r\n if (handlerLocal !== undefined){\r\n const evhLocal = EventHub.evLocal;\r\n\r\n if (evhLocal[evtname] === undefined) evhLocal[evtname] = []; // First time (event not registered)\r\n evhLocal[evtname].push(handlerLocal);\r\n }\r\n\r\n // Received event (network)\r\n if (handlerNetwork !== undefined){\r\n ATON.VRoadcast.on(evtname, handlerNetwork);\r\n }\r\n\r\n};\r\n\r\n/**\r\nFire a local (and optionally network) event, with data.\r\nThis is also accessible as ATON.fireEvent()\r\n@param {string} evtname - event name\r\n@param {object} data - object containing data to be transmitted with this event\r\n@param {bool} bReplicate - if true, it will replicate (broadcast) the event to other connected peers in the same scene (see VRoadcast)\r\n@example\r\nATON.EventHub.fireEvent(\"myEvent\", data)\r\n@example\r\nATON.fireEvent(\"myEvent\", data)\r\n*/\r\nEventHub.fireEvent = (evtname, data, bReplicate)=>{\r\n const ehList = EventHub.evLocal[evtname];\r\n EventHub.executeHandlers(ehList, data);\r\n\r\n if (!bReplicate) return;\r\n ATON.VRoadcast.fireEvent(evtname, data);\r\n};\r\n\r\nexport default EventHub;","/*\r\n ATON Materials Hub\r\n Centralized material manager\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Material Hub\r\n@namespace MatHub\r\n*/\r\nlet MatHub = {};\r\n\r\nMatHub.init = ()=>{\r\n MatHub.materials = {};\r\n MatHub.colors = {};\r\n\r\n MatHub._loader = new THREE.MaterialLoader();\r\n\r\n // Uniforms\r\n MatHub._uSem = {\r\n time: { type:'float', value: 0.0 },\r\n tint: { type:'vec4', value: new THREE.Vector4(0.2,0.2,1.0, 0.2) }\r\n };\r\n\r\n MatHub.addDefaults();\r\n};\r\n\r\nMatHub.getDefVertexShader = ()=>{\r\n return `\r\n varying vec3 vPositionW;\r\n varying vec3 vNormalW;\r\n varying vec3 vNormalV;\r\n\r\n void main(){\r\n vPositionW = vec3( vec4( position, 1.0 ) * modelMatrix);\r\n vNormalW = normalize( vec3( vec4( normal, 0.0 ) * modelMatrix ) );\r\n vNormalV = normalize( vec3( normalMatrix * normal ));\r\n\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\r\n }\r\n `;\r\n};\r\n\r\nMatHub.addDefaults = ()=>{\r\n\r\n // Colors\r\n MatHub.colors.white = new THREE.Color(1,1,1);\r\n MatHub.colors.black = new THREE.Color(0,0,0);\r\n MatHub.colors.green = new THREE.Color(0,1,0);\r\n MatHub.colors.yellow = new THREE.Color(1,1,0);\r\n MatHub.colors.red = new THREE.Color(1,0,0);\r\n MatHub.colors.blue = new THREE.Color(0,0,1);\r\n MatHub.colors.orange = new THREE.Color(1,0.5,0);\r\n\r\n MatHub.colors.defUI = new THREE.Color(0,1,0.5);\r\n \r\n MatHub.colors.sem = new THREE.Color(0,1,0.5);\r\n MatHub.colors.darksem = new THREE.Color(0,0,0.1);\r\n\r\n // Materials\r\n MatHub.materials.fullyTransparent = new THREE.MeshBasicMaterial({ \r\n transparent: true, \r\n depthWrite: false, \r\n opacity: 0.0\r\n });\r\n\r\n // Default UI\r\n MatHub.materials.defUI = new THREE.ShaderMaterial({\r\n uniforms: {\r\n color: { type:'vec3', value: MatHub.colors.defUI },\r\n opacity: { type:'float', value: 0.8 }\r\n },\r\n\r\n vertexShader: MatHub.getDefVertexShader(),\r\n fragmentShader:`\r\n varying vec3 vPositionW;\r\n\t\t varying vec3 vNormalW;\r\n varying vec3 vNormalV;\r\n uniform vec3 color;\r\n uniform float opacity;\r\n\r\n\t\t void main(){\r\n\t\t //vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\r\n\r\n float f;\r\n\t\t //f = dot(viewDirectionW, vNormalW);\r\n f = dot(vNormalV, vec3(0,0,1));\r\n\t\t f = clamp(1.0 - f, 0.2, 1.0);\r\n\r\n\t\t gl_FragColor = vec4(color.rgb, f * opacity);\r\n\t\t }\r\n `,\r\n transparent: true,\r\n depthWrite: false,\r\n }); \r\n \r\n // Selector\r\n MatHub.materials.selector = MatHub.materials.defUI.clone();\r\n\r\n/*\r\n MatHub.materials.selector = new THREE.MeshBasicMaterial({\r\n color: MatHub.colors.green,\r\n transparent: true,\r\n depthWrite: false,\r\n opacity: 0.2 \r\n //flatShading: true\r\n });\r\n*/\r\n // XR/VR ray\r\n MatHub.materials.controllerRay = MatHub.materials.defUI.clone();\r\n MatHub.materials.controllerRay.uniforms.color.value = MatHub.colors.white;\r\n/*\r\n MatHub.materials.controllerRay = new THREE.MeshBasicMaterial({ \r\n color: MatHub.colors.white, \r\n transparent: true, \r\n opacity: 0.2,\r\n depthWrite: false\r\n //flatShading: true\r\n });\r\n*/\r\n // Teleport locator\r\n MatHub.materials.teleportLoc = new THREE.MeshBasicMaterial({ \r\n transparent: true, \r\n opacity: 1.0,\r\n depthWrite: false,\r\n //flatShading: true,\r\n side: THREE.DoubleSide\r\n });\r\n ATON.Utils.textureLoader.load(ATON.PATH_RES+\"grad.png\", (texture) => {\r\n MatHub.materials.teleportLoc.map = texture;\r\n });\r\n\r\n // Measurements\r\n MatHub.materials.measurement = new THREE.MeshBasicMaterial({\r\n color: MatHub.colors.white,\r\n //linewidth: 5,\r\n transparent: true,\r\n depthWrite: false,\r\n opacity: 0.5, \r\n depthTest: false\r\n //flatShading: true\r\n });\r\n\r\n // Semantic shapes\r\n/*\r\n MatHub.materials.semanticShape = new THREE.MeshBasicMaterial({ \r\n //color: MatHub.colors.white, \r\n transparent: true,\r\n depthWrite: false, \r\n opacity: 0.0,\r\n //flatShading: true\r\n });\r\n*/\r\n\r\n MatHub.materials.semanticShape = new THREE.ShaderMaterial({\r\n uniforms: MatHub._uSem,\r\n\r\n vertexShader: MatHub.getDefVertexShader(),\r\n fragmentShader:`\r\n varying vec3 vPositionW;\r\n\t\t varying vec3 vNormalW;\r\n varying vec3 vNormalV;\r\n\r\n uniform float time;\r\n uniform vec4 tint;\r\n\r\n\t\t void main(){\r\n\t\t //vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\r\n\r\n //float ff = dot(vNormalV, vec3(0,0,1));\r\n\t\t //ff = clamp(1.0-ff, 0.0, 1.0);\r\n\r\n float f = (1.0 * cos(time*2.0)); // - 0.5;\r\n //f = cos(time + (vPositionW.y*10.0));\r\n f = clamp(f, 0.0,1.0);\r\n\r\n\t\t gl_FragColor = vec4(tint.rgb, tint.a * f);\r\n //gl_FragColor = vec4(tint.rgb, ff);\r\n\t\t }\r\n `,\r\n transparent: true,\r\n depthWrite: false,\r\n //flatShading: false\r\n //opacity: 0.0,\r\n });\r\n\r\n MatHub.materials.semanticShapeHL = new THREE.MeshBasicMaterial({ \r\n color: MatHub.colors.sem, \r\n transparent: true,\r\n depthWrite: false, \r\n opacity: 0.2\r\n //flatShading: true\r\n });\r\n MatHub.materials.semanticShapeEdit = new THREE.MeshBasicMaterial({ \r\n color: MatHub.colors.orange, \r\n transparent: true,\r\n depthWrite: false, \r\n opacity: 0.5\r\n //flatShading: true\r\n });\r\n\r\n MatHub.semIcon = new THREE.SpriteMaterial({ \r\n map: new THREE.TextureLoader().load( ATON.PATH_RES+\"sui-sem.png\" ), \r\n //color: MatHub.colors.sem, // multiply\r\n transparent: true,\r\n opacity: 1.0,\r\n //depthWrite: false, \r\n depthTest: false\r\n });\r\n\r\n MatHub.materials.lp = new THREE.ShaderMaterial({ \r\n vertexShader: MatHub.getDefVertexShader(),\r\n fragmentShader:`\r\n varying vec3 vPositionW;\r\n\t\t varying vec3 vNormalW;\r\n varying vec3 vNormalV;\r\n\r\n\t\t void main(){\r\n\t\t vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\r\n\r\n float f;\r\n\t\t //f = dot(viewDirectionW, vNormalW);\r\n f = dot(vNormalV, vec3(0,0,1));\r\n\t\t f = clamp(1.0 - f, 0.0, 1.0);\r\n\r\n\t\t gl_FragColor = vec4(1.0,1.0,1.0, f);\r\n\t\t }\r\n `,\r\n transparent: true,\r\n depthWrite: false,\r\n //flatShading: false\r\n }); \r\n\r\n MatHub.lpIcon = new THREE.SpriteMaterial({ \r\n map: new THREE.TextureLoader().load( ATON.PATH_RES+\"sui-lp.png\" ), \r\n //color: MatHub.colors.sem, // multiply\r\n transparent: true,\r\n opacity: 1.0,\r\n depthWrite: false, \r\n //depthTest: false\r\n });\r\n\r\n MatHub.semIcon.sizeAttenuation = false;\r\n MatHub.lpIcon.sizeAttenuation = false;\r\n};\r\n\r\nMatHub.addMaterial = (id, mat)=>{\r\n if (MatHub.materials[id]){\r\n console.log(\"MatHub: material \"+id+\" already registered\");\r\n return;\r\n }\r\n\r\n MatHub.materials[id] = mat;\r\n};\r\n\r\nMatHub.loadMaterial = (id, jsonfile)=>{\r\n MatHub._loader.load(jsonfile, (mat)=>{\r\n MatHub.addMaterial(id, mat);\r\n },\r\n undefined,\r\n (err)=>{\r\n console.log(err);\r\n });\r\n};\r\n\r\nMatHub.getMaterial = (id)=>{\r\n return MatHub.materials[id];\r\n};\r\n\r\nMatHub.update = ()=>{\r\n MatHub._uSem.time.value += ATON._dt;\r\n};\r\n\r\nexport default MatHub;","/*\r\n ATON Utils\r\n various utilities for device profiling, graph visiting, etc.\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Utils\r\n@namespace Utils\r\n*/\r\nlet Utils = {};\r\n\r\nUtils.TSTRING_SEPARATOR = \" \";\r\n\r\n\r\nUtils.init = ()=>{\r\n // read-only object to inspect device capabilities\r\n ATON.device = {};\r\n\r\n //Utils.geomUnitSphere = new THREE.SphereBufferGeometry( 1.0, 16, 16 );\r\n Utils.geomUnitSphere = new THREE.SphereGeometry( 1.0, 16, 16 );\r\n\r\n // Export/Download utils\r\n Utils.exporterGLTF = undefined;\r\n Utils.exporterOBJ = undefined;\r\n\r\n Utils._dlink = document.createElement('a');\r\n Utils._dlink.style.display = 'none';\r\n document.body.appendChild( Utils._dlink ); // Firefox workaround, see #6594\r\n\r\n Utils.textureLoader = new THREE.TextureLoader();\r\n};\r\n\r\nUtils.generateID = (prefix)=>{\r\n if (prefix === undefined) prefix = \"id\";\r\n //let currDate = new Date();\r\n //let ts = currDate.getYear()+\":\"+currDate.getMonth()+\":\"+currDate.getDay()+\":\"+currDate.getHours()+\":\"+currDate.getMinutes() +\":\"+ currDate.getSeconds();\r\n return prefix+'-' + Math.random().toString(36).substr(2,9);\r\n};\r\n\r\nUtils.goToURL = (url)=>{\r\n window.location.href = url;\r\n};\r\n\r\n/**\r\nIf current connection is secure\r\n@returns {boolean}\r\n*/\r\nUtils.isConnectionSecure = ()=>{\r\n return window.isSecureContext;\r\n}\r\n\r\n\r\n// Profile device capabilities\r\nUtils.profileDevice = ()=>{\r\n\r\n // Detect mobile\r\n ATON.device.isMobile = false;\r\n let detectMobile = ()=>{\r\n if(/(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)\r\n || /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))){\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n ATON.device.isMobile = detectMobile();\r\n\r\n // XR profiling\r\n ATON.device.xrSupported = {};\r\n ATON.device.xrSupported['immersive-vr'] = false;\r\n ATON.device.xrSupported['immersive-ar'] = false;\r\n\r\n if ( 'xr' in navigator ){\r\n\t navigator.xr.isSessionSupported( 'immersive-vr' ).then(( b )=>{\r\n if (b) ATON.device.xrSupported['immersive-vr'] = true;\r\n else ATON.device.xrSupported['immersive-vr'] = false;\r\n\r\n console.log(\"WebXR VR session support: \"+ATON.device.xrSupported['immersive-vr']);\r\n ATON.fireEvent(\"XR_support\", {type: 'immersive-vr', v: ATON.device.xrSupported['immersive-vr']});\r\n\t\t});\r\n\r\n\t navigator.xr.isSessionSupported( 'immersive-ar' ).then(( b )=>{\r\n if (b) ATON.device.xrSupported['immersive-ar'] = true;\r\n else ATON.device.xrSupported['immersive-ar'] = false;\r\n\r\n console.log(\"WebXR AR session support: \"+ATON.device.xrSupported['immersive-ar']);\r\n ATON.fireEvent(\"XR_support\", {type: 'immersive-ar', v: ATON.device.xrSupported['immersive-ar']});\r\n\t\t});\r\n }\r\n};\r\n\r\n\r\nUtils.profileRenderingCapabilities = ()=>{\r\n if (ATON._renderer === undefined) return;\r\n\r\n let rcc = ATON._renderer.capabilities;\r\n if (rcc === undefined) return;\r\n\r\n ATON.device.lowGPU = false;\r\n\r\n if (!rcc.isWebGL2) ATON.device.lowGPU = true;\r\n if (rcc.maxTextureSize < 8192) ATON.device.lowGPU = true;\r\n\r\n console.log(rcc);\r\n};\r\n\r\n/**\r\nIf current device is mobile (e.g. smartphone, tablet, Oculus Quest)\r\n@returns {boolean}\r\n*/\r\nUtils.isMobile = ()=>{\r\n return ATON.device.isMobile;\r\n}\r\n\r\n/**\r\nIf current device supports WebXR immersive VR sessions\r\n@returns {boolean}\r\n*/\r\nUtils.isVRsupported = ()=>{\r\n return ATON.device.xrSupported['immersive-vr'];\r\n}\r\n\r\n/**\r\nIf current device supports WebXR immersive AR sessions\r\n@returns {boolean}\r\n*/\r\nUtils.isARsupported = ()=>{\r\n return ATON.device.xrSupported['immersive-ar'];\r\n}\r\n\r\n\r\n// Path utils\r\nUtils.getFileExtension = ( filepath )=>{\r\n\treturn filepath.substr(filepath.lastIndexOf('.')+1).toLowerCase();\r\n};\r\n\r\nUtils.removeFileExtension = ( filepath )=>{\r\n return filepath.replace(/\\.[^/.]+$/, \"\");\r\n};\r\n\r\nUtils.isVideo = ( filepath )=>{\r\n let ext = Utils.getFileExtension(filepath);\r\n\r\n if (ext === \"mp4\") return true;\r\n if (ext === \"webm\") return true;\r\n};\r\n\r\nUtils.getBaseFolder = ( filepath )=>{\r\n var index = filepath.lastIndexOf('/');\r\n if (index !== -1) return filepath.substring( 0, index + 1 );\r\n \r\n return '';\r\n};\r\n\r\nUtils.isResourceURL = (s)=>{\r\n if (s.startsWith(\"http://\")) return true;\r\n if (s.startsWith(\"https://\")) return true;\r\n return false;\r\n};\r\n\r\nUtils.URLify =(string)=>{\r\n const urls = string.match(/(((ftp|https?):\\/\\/)[\\-\\w@:%_\\+.~#?,&\\/\\/=]+)/g);\r\n if (urls){\r\n urls.forEach(function(url){\r\n string = string.replace(url, '' + url + \"\");\r\n });\r\n }\r\n\r\n return string;\r\n};\r\n\r\nUtils.resolveCollectionURL = (url)=>{\r\n if (url.startsWith(\"http\")) return url;\r\n \r\n return ATON.PATH_COLLECTION+url;\r\n};\r\n\r\n// JSON post utility\r\nUtils.postJSON = (endpoint, obj, onReceive, onFail)=>{\r\n $.ajax({\r\n url: endpoint,\r\n type:\"POST\",\r\n xhrFields: { withCredentials: true },\r\n data: JSON.stringify(obj),\r\n contentType:\"application/json; charset=utf-8\",\r\n dataType:\"json\",\r\n\r\n success: (data)=>{\r\n if (onReceive) onReceive(data);\r\n }\r\n }).fail((err)=>{\r\n console.log(err);\r\n if (onFail) onFail();\r\n });\r\n};\r\n\r\n\r\nUtils.mergeObject = ( object )=>{\r\n object.updateMatrixWorld( true );\r\n\r\n const geometry = [];\r\n object.traverse( c => {\r\n if ( c.isMesh ){\r\n const g = c.geometry;\r\n g.applyMatrix4( c.matrixWorld );\r\n geometry.push( g.toNonIndexed() );\r\n }\r\n\r\n });\r\n\r\n const mergedGeometries = THREE.BufferGeometryUtils.mergeBufferGeometries( geometry, false );\r\n const mergedGeometry = THREE.BufferGeometryUtils.mergeVertices( mergedGeometries ).center();\r\n\r\n const group = new THREE.Group();\r\n const mesh = new THREE.Mesh( mergedGeometry );\r\n group.add( mesh );\r\n return group;\r\n};\r\n\r\nUtils.setPicking = (node, type, b)=>{\r\n if (b === undefined) b = true;\r\n\r\n //console.log(b);\r\n \r\n node.traverse((o) => {\r\n if (b) o.layers.enable(type);\r\n else o.layers.disable(type);\r\n });\r\n\r\n // children\r\n/*\r\n for (let c in node.children){\r\n let C = node.children[c];\r\n Utils.setPicking(C, type, b);\r\n }\r\n*/\r\n};\r\n\r\nUtils.graphPostVisitor = (N)=>{\r\n //if (N.type === undefined) return;\r\n\r\n if (!N.visible){\r\n Utils.setPicking(N, N.type, false);\r\n return;\r\n }\r\n/*\r\n for (let c in N.children){\r\n let C = N.children[c];\r\n Utils.graphPostVisitor(C);\r\n }\r\n*/\r\n console.log(N);\r\n};\r\n\r\n// TileSets utils\r\nUtils.updateTSetsCamera = (cam)=>{\r\n if (cam === undefined) cam = ATON.Nav._camera;\r\n\r\n const nts = ATON._tsets.length;\r\n if (nts <= 0) return;\r\n\r\n/*\r\n // Immersive VR mode\r\n if (ATON.XR._bPresenting){\r\n //console.log(ATON._tsets)\r\n\r\n for (let ts=0; ts TS.deleteCamera( cam ) );\r\n\r\n let currCamera = ATON._renderer.xr.getCamera(); // cam\r\n if (currCamera){\r\n TS.setCamera( currCamera );\r\n\r\n TS.setResolution( currCamera, 8000, 8000 );\r\n\r\n let leftCam = currCamera.cameras[0];\r\n if ( leftCam ){\r\n //TS.setResolution( currCamera, leftCam.viewport.z, leftCam.viewport.w );\r\n //console.log(leftCam);\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n*/\r\n\r\n for (let ts=0; ts{\r\n\r\n let ts = new TILES.TilesRenderer(tsurl);\r\n if (!ts) return;\r\n\r\n //ATON._assetReqNew(tsurl);\r\n\r\n ts.fetchOptions.mode = 'cors';\r\n\r\n ts.setCamera( ATON.Nav._camera );\r\n ts.setResolutionFromRenderer( ATON.Nav._camera, ATON._renderer );\r\n\r\n //ts.errorTarget = ;\r\n\r\n let bFirst = false;\r\n\r\n //ATON._assetReqComplete(tsurl);\r\n\r\n ts.onLoadModel = ( scene )=>{\r\n //Utils.modelVisitor( N, scene );\r\n //ATON._onAllReqsCompleted();\r\n\r\n if (!bFirst){\r\n ///ATON._assetReqComplete(tsurl);\r\n ATON._onAllReqsCompleted();\r\n bFirst = true;\r\n }\r\n\r\n scene.traverse( c => {\r\n //c.layers.enable(N.type);\r\n\r\n if (c.isMesh){\r\n c.castShadow = true; //N.castShadow;\r\n c.receiveShadow = true; //N.receiveShadow;\r\n }\r\n\r\n if ( c.material ) {\r\n //c.originalMaterial = c.material;\r\n //c.material = wireMat;\r\n if (N.userData.cMat) c.material = N.userData.cMat;\r\n\r\n if (c.material.map){\r\n c.material.map.minFilter = THREE.LinearMipmapLinearFilter;\r\n c.material.map.magFilter = THREE.LinearFilter;\r\n }\r\n }\r\n });\r\n\r\n };\r\n\r\n ts.onDisposeModel = (scene)=>{\r\n scene.traverse( c => {\r\n if ( c.isMesh ) {\r\n c.material.dispose();\r\n }\r\n });\r\n };\r\n\r\n N.add(ts.group);\r\n\r\n Utils.setPicking(N, N.type, true);\r\n\r\n //console.log(ts);\r\n\r\n ATON._tsets.push(ts);\r\n};\r\n\r\n// Helper visitor routine\r\n// Note: parentNode is not connected to model\r\nUtils.modelVisitor = (parentNode, model)=>{\r\n if (!model) return this;\r\n\r\n //model = Utils.mergeObject(model);\r\n \r\n let N = parentNode;\r\n let type = N.type; // Differentiate visit depending on node type\r\n\r\n model.traverse( ( o ) => {\r\n/*\r\n if (N.bPickable !== undefined){\r\n if (N.bPickable) o.layers.enable(type);\r\n else o.layers.disable(type);\r\n //Utils.setPicking(N, type, N.bPickable);\r\n }\r\n //else o.layers.enable(type); //Utils.setPicking(N, type, true);\r\n*/\r\n\r\n //Utils.setPicking(model, type, N.bPickable);\r\n //if (!N.visible) Utils.setPicking(model, type, false);\r\n\r\n // perf.\r\n // TODO: manually call object.updateMatrix()\r\n //o.matrixAutoUpdate = false;\r\n\r\n if (o.isMesh){\r\n //let numVertices = o.geometry.attributes.position.count;\r\n //console.log(numVertices);\r\n\r\n if (type === ATON.NTYPES.SCENE){\r\n // TODO: \r\n o.castShadow = true; //N.castShadow;\r\n o.receiveShadow = true; //N.receiveShadow;\r\n\r\n // Build accelerated ray casting\r\n if (o.geometry){\r\n o.geometry.computeBoundsTree();\r\n console.log(\"Computed visible BVH\");\r\n\r\n // visualize BVH bounds\r\n/*\r\n let BVHVis = new ThreeMeshBVH.MeshBVHVisualizer(o, 10);\r\n BVHVis.update();\r\n o.parent.add(BVHVis);\r\n*/\r\n }\r\n\r\n // Fix mipmapping\r\n\r\n if ( o.material.map !== null){\r\n //console.log(object.material.map);\r\n \r\n // Why do I have to do this?\r\n o.material.map.generateMipmaps = true;\r\n o.material.map.anisotropy = ATON.device.isMobile? 0 : ATON._maxAnisotropy;\r\n o.material.map.minFilter = THREE.LinearMipmapLinearFilter;\r\n o.material.map.magFilter = THREE.LinearFilter;\r\n //o.material.map.needsUpdate = true;\r\n }\r\n }\r\n\r\n if (type === ATON.NTYPES.SEM){\r\n o.material = ATON.MatHub.materials.semanticShape;\r\n\r\n // Build accelerated ray casting\r\n if (o.geometry){\r\n o.geometry.computeBoundsTree();\r\n console.log(\"Computed semantic BVH\");\r\n }\r\n\r\n //N.setDefaultAndHighlightMaterials(ATON.MatHub.materials.semanticShape, ATON.MatHub.materials.semanticShapeHL);\r\n }\r\n\r\n // Cascading material\r\n if (N.userData.cMat){\r\n o.material = N.userData.cMat;\r\n //o.material.needsUpdate = true;\r\n }\r\n\r\n }\r\n/*\r\n if (N.userData.cMat){\r\n o.material = N.userData.cMat;\r\n //o.cMat = N.userData.cMat;\r\n //o.material.needsUpdate = true;\r\n }\r\n*/\r\n });\r\n\r\n //Utils.setPicking(N, type, N.bPickable);\r\n\r\n/*\r\n for (let c in model.children){\r\n let C = model.children[c];\r\n Utils.modelVisitor(model, C);\r\n }\r\n*/\r\n};\r\n\r\nUtils.registerAniMixers = (N, data)=>{\r\n let model = data.scene || data.scene[0];\r\n let bAnimations = false;\r\n\r\n if (data.animations === undefined) return;\r\n\r\n let mixer = new THREE.AnimationMixer( model );\r\n data.animations.forEach((clip)=>{\r\n mixer.clipAction( clip ).play();\r\n //console.log(mixer.clipAction( clip ));\r\n //console.log(N);\r\n bAnimations = true;\r\n });\r\n\r\n if (!bAnimations) return;\r\n\r\n ATON._aniMixers.push(mixer);\r\n\r\n if (N._aniMixers === undefined) N._aniMixers = [];\r\n N._aniMixers.push(mixer);\r\n};\r\n\r\n// Copyright extraction\r\nUtils.ccExtract = (data)=>{\r\n if (data === undefined) return;\r\n if (data.asset === undefined) return;\r\n\r\n let cc = {};\r\n\r\n if (data.asset.copyright) cc.copyright = data.asset.copyright;\r\n if (data.asset.extras){\r\n for (let e in data.asset.extras) cc[e] = data.asset.extras[e];\r\n }\r\n if (data.asset.generator) cc.generator = data.asset.generator;\r\n\r\n if (data.asset.copyright || data.asset.extras) ATON._ccModels.push(cc);\r\n \r\n console.log(cc);\r\n};\r\n\r\nUtils.parseTransformString = (tstr)=>{\r\n let T = new THREE.Group();\r\n\r\n let values = tstr.split(Utils.TSTRING_SEPARATOR);\r\n let numValues = values.length;\r\n\r\n if (numValues < 3) return T; // nothing to do\r\n\r\n // Translation\r\n T.position.set( parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]) );\r\n if (numValues < 6) return T;\r\n\r\n // Rotation\r\n T.rotation.set( parseFloat(values[3]), parseFloat(values[4]), parseFloat(values[5]) );\r\n if (numValues < 9) return T;\r\n\r\n // Scale\r\n T.scale.set( parseFloat(values[6]), parseFloat(values[7]), parseFloat(values[8]) );\r\n return T;\r\n};\r\n\r\nUtils.setVectorPrecision = (v, prec)=>{\r\n v.x = parseFloat( v.x.toPrecision(prec) );\r\n v.y = parseFloat( v.y.toPrecision(prec) );\r\n v.z = parseFloat( v.z.toPrecision(prec) );\r\n \r\n return v;\r\n};\r\n\r\n// Parse markdown (md) content\r\n// readapted from https://codepen.io/kvendrik/pen/Gmefv\r\nUtils.parseMD = (md)=>{\r\n //ul\r\n md = md.replace(/^\\s*\\n\\*/gm, '
      \\n*');\r\n md = md.replace(/^(\\*.+)\\s*\\n([^\\*])/gm, '$1\\n
    \\n\\n$2');\r\n md = md.replace(/^\\*(.+)/gm, '
  • $1
  • ');\r\n\r\n //ol\r\n md = md.replace(/^\\s*\\n\\d\\./gm, '
      \\n1.');\r\n md = md.replace(/^(\\d\\..+)\\s*\\n([^\\d\\.])/gm, '$1\\n
    \\n\\n$2');\r\n md = md.replace(/^\\d\\.(.+)/gm, '
  • $1
  • ');\r\n\r\n //blockquote\r\n md = md.replace(/^\\>(.+)/gm, '
    $1
    ');\r\n\r\n //h\r\n md = md.replace(/[\\#]{6}(.+)/g, '
    $1
    ');\r\n md = md.replace(/[\\#]{5}(.+)/g, '
    $1
    ');\r\n md = md.replace(/[\\#]{4}(.+)/g, '

    $1

    ');\r\n md = md.replace(/[\\#]{3}(.+)/g, '

    $1

    ');\r\n md = md.replace(/[\\#]{2}(.+)/g, '

    $1

    ');\r\n md = md.replace(/[\\#]{1}(.+)/g, '

    $1

    ');\r\n\r\n //alt h\r\n md = md.replace(/^(.+)\\n\\=+/gm, '

    $1

    ');\r\n md = md.replace(/^(.+)\\n\\-+/gm, '

    $1

    ');\r\n\r\n //images\r\n md = md.replace(/\\!\\[([^\\]]+)\\]\\(([^\\)]+)\\)/g, '\"$1\"');\r\n\r\n //links\r\n md = md.replace(/[\\[]{1}([^\\]]+)[\\]]{1}[\\(]{1}([^\\)\\\"]+)(\\\"(.+)\\\")?[\\)]{1}/g, '$1');\r\n\r\n //font styles\r\n md = md.replace(/[\\*\\_]{2}([^\\*\\_]+)[\\*\\_]{2}/g, '$1');\r\n md = md.replace(/[\\*\\_]{1}([^\\*\\_]+)[\\*\\_]{1}/g, '$1');\r\n md = md.replace(/[\\~]{2}([^\\~]+)[\\~]{2}/g, '$1');\r\n\r\n //pre\r\n md = md.replace(/^\\s*\\n\\`\\`\\`(([^\\s]+))?/gm, '
    ');\r\n    md = md.replace(/^\\`\\`\\`\\s*\\n/gm, '
    \\n\\n');\r\n\r\n //code\r\n md = md.replace(/[\\`]{1}([^\\`]+)[\\`]{1}/g, '$1');\r\n\r\n //p\r\n md = md.replace(/^\\s*(\\n)?(.+)/gm, function(m){\r\n return /\\<(\\/)?(h\\d|ul|ol|li|blockquote|pre|img)/.test(m) ? m : '

    '+m+'

    ';\r\n });\r\n\r\n //strip p from pre\r\n md = md.replace(/(\\)\\s*\\n\\(.+)\\<\\/p\\>/gm, '$1$2');\r\n\r\n return md;\r\n}\r\n\r\n// User auth\r\nUtils.checkAuth = (onReceive)=>{\r\n $.ajax({\r\n type: 'GET',\r\n url: ATON.PATH_RESTAPI+\"user\",\r\n xhrFields: { withCredentials: true }, \r\n dataType: 'json',\r\n\r\n success: (data)=>{ onReceive(data); }\r\n //error: ()=>{ onReceive(undefined) }\r\n });\r\n};\r\n\r\n\r\n/**\r\nGet human-readable length (distances, measures, etc...)\r\n@param {number} d - the distance\r\n@returns {string}\r\n*/\r\nUtils.getHumanReadableDistance = (d)=>{\r\n let mstr = \" m\";\r\n\r\n if (d < 0.01){\r\n d *= 1000.0; mstr= \" mm\";\r\n mstr = d.toPrecision(3) + mstr;\r\n return mstr;\r\n }\r\n if (d < 1.0){\r\n d *= 100.0; mstr= \" cm\";\r\n mstr = d.toPrecision(3) + mstr;\r\n return mstr;\r\n }\r\n if (d > 1000.0){\r\n d * 0.001; mstr=\" km\";\r\n mstr = d.toPrecision(3) + mstr;\r\n return mstr;\r\n }\r\n\r\n mstr = d.toPrecision(3) + mstr;\r\n return mstr;\r\n};\r\n\r\n// Extract clean text from HTML\r\nUtils.stripHTMLtagsFromString = (str)=>{\r\n str = str.replace(/(<([^>]+)>)/gi, \"\");\r\n return str;\r\n};\r\n\r\n// Fullscreen (NOT USED)\r\nUtils.requestFullscreen = ()=>{\r\n let elem = document.documentElement;\r\n\r\n if (elem.requestFullscreen) elem.requestFullscreen();\r\n\r\n else if (elem.mozRequestFullScreen){ // Firefox\r\n elem.mozRequestFullScreen();\r\n }\r\n else if (elem.webkitRequestFullscreen){ // Chrome, Safari & Opera\r\n elem.webkitRequestFullscreen();\r\n }\r\n else if (elem.msRequestFullscreen){ // IE/Edge\r\n elem.msRequestFullscreen();\r\n }\r\n return true;\r\n};\r\n\r\n\r\n// Export routines\r\nUtils.downloadBlob = (blob, filename)=>{\r\n if (filename === undefined) return;\r\n\r\n Utils._dlink.href = URL.createObjectURL( blob );\r\n Utils._dlink.download = filename;\r\n Utils._dlink.click();\r\n};\r\n\r\n// Download text ASCII data\r\nUtils.downloadText = ( str, filename )=>{\r\n Utils.downloadBlob( new Blob( [ str ], { type: 'text/plain' } ), filename );\r\n};\r\n\r\n// Download json object\r\nUtils.downloadJSONobj = (jsonobj, filename)=>{\r\n Utils.downloadText( JSON.stringify(jsonobj), filename );\r\n};\r\n\r\nUtils.downloadArrayBuffer = ( buffer, filename )=>{\r\n Utils.downloadBlob( new Blob( [ buffer ], { type: 'application/octet-stream' } ), filename );\r\n};\r\n\r\n// Export ATON node\r\nUtils.exportNode = (node, filename)=>{\r\n let ext = Utils.getFileExtension(filename);\r\n if (ext.length < 1) return;\r\n\r\n // GLTF\r\n if (ext === \"glb\" || ext === \"gltf\"){\r\n let bBin = (ext === \"glb\")? true : false;\r\n\r\n let opts = {\r\n //trs: true, // Export position, rotation and scale instead of matrix per node. Default is false\r\n binary: bBin, // Export in binary (.glb) format, returning an ArrayBuffer. Default is false\r\n //onlyVisible: false,\r\n //truncateDrawRange: true\r\n };\r\n\r\n if (Utils.exporterGLTF === undefined) Utils.exporterGLTF = new THREE.GLTFExporter();\r\n\r\n Utils.exporterGLTF.parse( node, ( output )=>{\r\n if ( output instanceof ArrayBuffer ){\r\n Utils.downloadArrayBuffer( output, filename);\r\n }\r\n else {\r\n console.log( output );\r\n Utils.downloadJSONobj(output, filename);\r\n }\r\n }, opts);\r\n }\r\n\r\n // OBJ format\r\n if (ext === \"obj\"){\r\n if (Utils.exporterOBJ === undefined) Utils.exporterOBJ = new THREE.OBJExporter();\r\n\r\n let output = Utils.exporterOBJ.parse(node);\r\n //console.log(output);\r\n Utils.downloadText(output, filename);\r\n }\r\n};\r\n\r\nUtils.takeScreenshot = (size, filename)=>{\r\n let img = new Image();\r\n\r\n console.log(\"Screenshot with size:\"+size);\r\n\r\n ATON.Nav._camera.aspect = 1.0;\r\n ATON.Nav._camera.updateProjectionMatrix();\r\n \r\n ATON._renderer.setSize(size,size);\r\n ATON._renderer.render( ATON._mainRoot, ATON.Nav._camera );\r\n let elDom = ATON._renderer.domElement;\r\n\r\n // We have multi-pass FX composer enabled\r\n if (ATON.FX.composer){\r\n ATON.FX.composer.setSize(size,size);\r\n let UU = ATON.FX.passes[ATON.FX.PASS_AA].material.uniforms;\r\n if (UU) UU.resolution.value.set( (1/size), (1/size) );\r\n\r\n ATON.FX.composer.render();\r\n\r\n elDom = ATON.FX.composer.renderer.domElement;\r\n }\r\n\r\n let b64img = ATON._renderer.domElement.toDataURL();\r\n img.src = b64img;\r\n\r\n if (filename){\r\n Utils._dlink.href = b64img.replace(\"image/png\", \"image/octet-stream\");\r\n Utils._dlink.download = filename;\r\n Utils._dlink.click();\r\n }\r\n\r\n ATON._onResize();\r\n return img;\r\n};\r\n\r\nUtils.assignLightProbeToMesh = (LP, mesh)=>{\r\n if (LP === undefined || mesh === undefined) return;\r\n\r\n if (mesh.noLP) return;\r\n\r\n mesh.userData.LP = LP;\r\n //LP.update();\r\n //mesh.material.envMap = LP.getEnvTex();\r\n \r\n //mesh.material.combine = THREE.MultiplyOperation;\r\n //mesh.material.needsUpdate = true;\r\n\r\n //console.log(mesh.userData);\r\n};\r\n\r\nUtils.createATONCube = (id)=>{\r\n let g = new THREE.BoxBufferGeometry( 1,1,1 );\r\n\r\n let mat = new THREE.MeshStandardMaterial();\r\n\r\n Utils.textureLoader.load((ATON.PATH_RES+\"models/aton-cube.jpg\"), (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n mat.map = tex;\r\n });\r\n\r\n let N = ATON.createSceneNode(id);\r\n N.add( new THREE.Mesh(g) );\r\n N.setMaterial(mat);\r\n\r\n N.enablePicking();\r\n return N;\r\n};\r\n\r\n\r\nUtils.createATONCubePBR = (id)=>{\r\n let g = new THREE.BoxBufferGeometry( 1,1,1 );\r\n\r\n let mat = new THREE.MeshStandardMaterial();\r\n mat.metalness = 1.0;\r\n\r\n Utils.textureLoader.load((ATON.PATH_RES+\"models/aton-cube.jpg\"), (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n mat.map = tex;\r\n });\r\n\r\n Utils.textureLoader.load((ATON.PATH_RES+\"models/aton-cube-pbr.jpg\"), (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n mat.metalnessMap = tex;\r\n mat.roughnessMap = tex;\r\n });\r\n\r\n Utils.textureLoader.load((ATON.PATH_RES+\"models/aton-cube-nrm.png\"), (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n mat.normalMap = tex;\r\n\r\n //mat.bumpMap.anisotropy = ATON._maxAnisotropy;\r\n //mat.bumpMap.minFilter = THREE.LinearMipmapLinearFilter;\r\n //mat.bumpMap.magFilter = THREE.LinearFilter;\r\n });\r\n\r\n let N = ATON.createSceneNode(id);\r\n N.add( new THREE.Mesh(g) );\r\n N.setMaterial(mat);\r\n\r\n N.enablePicking();\r\n return N;\r\n};\r\n\r\n\r\nUtils.createGround = (texture, dx,dz)=>{\r\n if (dx === undefined) dx = 1.0;\r\n if (dz === undefined) dz = 1.0;\r\n\r\n let g = new THREE.PlaneBufferGeometry( dx, dz );\r\n\r\n let mat = new THREE.MeshStandardMaterial();\r\n if (texture !== undefined) Utils.textureLoader.load(texture, (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n mat.map = tex;\r\n });\r\n\r\n let N = ATON.createSceneNode().rotateX(-Math.PI * 0.5);\r\n N.add( new THREE.Mesh(g, mat) );\r\n N.enablePicking();\r\n\r\n return N;\r\n};\r\n\r\n\r\nexport default Utils;","/*\r\n ATON Scene Hub\r\n scene JSON routines\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Scene Hub\r\n@namespace SceneHub\r\n*/\r\nlet SceneHub = {};\r\n\r\nSceneHub.MODE_ADD = 0;\r\nSceneHub.MODE_DEL = 1;\r\n\r\nSceneHub.FLOAT_PREC = 5;\r\n\r\n/**\r\nInitializes the component\r\n*/\r\nSceneHub.init = ()=>{\r\n SceneHub.currID = undefined; // Scene ID (sid) - FIXME: rename to \"SID\"\r\n SceneHub.currData = undefined; // holds compact object describing our ATON scene\r\n SceneHub._bEdit = false; // edit mode (client can modify json on the server)\r\n\r\n SceneHub._bLoading = false;\r\n\r\n // Current scene title & description\r\n SceneHub._title = undefined;\r\n SceneHub._descr = undefined;\r\n\r\n SceneHub.initBaseParsers();\r\n};\r\n\r\n/**\r\nThis enables/disables edit mode - i.e. changes to the scene are sent to server and become persistent\r\n@param {bool} b - true or false\r\n@example\r\nATON.SceneHub.setEditMode(true)\r\n*/\r\nSceneHub.setEditMode = (b)=>{\r\n SceneHub._bEdit = b;\r\n console.log(\"Edit mode:\"+b);\r\n};\r\n\r\n\r\n/**\r\n Loads a scene by providing JSON path\r\n @param {string} reqpath - JSON url\r\n @param {string} sid - Scene ID\r\n @param {function} onSuccess - (Optional) function to be called on success\r\n @example\r\n ATON.SceneHub.load(\"http://path/to/scene.json\", \"sample\", ()=>{ console.log(\"Done!\"); });\r\n*/\r\nSceneHub.load = (reqpath, sid, onSuccess/*, onFail*/)=>{\r\n //let args = reqpath.split(',');\r\n\r\n SceneHub._bLoading = true;\r\n console.log(\"Loading Scene: \"+sid);\r\n\r\n return $.getJSON( reqpath, ( data )=>{\r\n SceneHub.currData = data;\r\n SceneHub.currID = sid; //scenejson.substring(scenejson.lastIndexOf('/')+1);\r\n SceneHub._bLoading = false;\r\n\r\n //console.log(ATON.currScene);\r\n\r\n SceneHub.parseScene(data);\r\n\r\n if (onSuccess) onSuccess();\r\n ATON.fireEvent(\"SceneJSONLoaded\", sid);\r\n });\r\n/*\r\n .fail(()=>{\r\n SceneHub._bLoading = false;\r\n console.log(\"Fail to load \"+reqpath);\r\n\r\n if (onFail) onFail();\r\n });\r\n*/\r\n};\r\n\r\n// Parse JSON scene obj\r\nSceneHub.parseScene = (sobj)=>{\r\n sobj = (sobj === undefined)? SceneHub.currData : sobj;\r\n if (sobj === undefined) return;\r\n\r\n for (let k in sobj)\r\n if (SceneHub._jsonParsers[k]) SceneHub._jsonParsers[k]( sobj[k] );\r\n};\r\n\r\nSceneHub.getJSONchildren = (nid, type)=>{\r\n if (type === undefined) type = ATON.NTYPES.SCENE;\r\n\r\n let P = undefined;\r\n let children = [];\r\n\r\n if (type === ATON.NTYPES.SEM) P = ATON.getSemanticNode(nid);\r\n if (type === ATON.NTYPES.SCENE) P = ATON.getSceneNode(nid);\r\n\r\n if (P === undefined) return undefined;\r\n\r\n for (let c in P.children){\r\n let child = P.children[c];\r\n\r\n if (child.nid !== undefined) children.push( child.nid );\r\n }\r\n\r\n return children;\r\n};\r\n\r\nSceneHub.getJSONgraphEdges = (type)=>{\r\n if (type === undefined) type = ATON.NTYPES.SCENE;\r\n let nodes = ATON.snodes;\r\n \r\n if (type === ATON.NTYPES.SEM) nodes = ATON.semnodes;\r\n if (type === ATON.NTYPES.UI) nodes = ATON.uinodes;\r\n\r\n let edges = {};\r\n\r\n for (let n in nodes){\r\n let N = nodes[n];\r\n\r\n //if (N && N.children) edges[n] = SceneHub.getJSONchildren(n, type);\r\n\r\n let E = {};\r\n if (N && N.parent && N.parent.nid){\r\n //edges.push([N.parent.nid, N.nid]);\r\n if (edges[N.parent.nid] === undefined) edges[N.parent.nid] = [];\r\n edges[N.parent.nid].push(N.nid);\r\n //edges[N.parent.nid].filter((v,i) => edges[N.parent.nid].indexOf(v) === i);\r\n }\r\n }\r\n\r\n //console.log(edges);\r\n return edges;\r\n};\r\n\r\nSceneHub.getJSONsemanticSpheresList = (semid)=>{\r\n let S = ATON.getSemanticNode(semid);\r\n if (S === undefined) return undefined;\r\n\r\n let SL = [];\r\n\r\n for (let s in S.children){\r\n let sphere = S.children[s];\r\n if (sphere.type){\r\n SL.push([\r\n parseFloat(sphere.position.x.toPrecision(SceneHub.FLOAT_PREC)), \r\n parseFloat(sphere.position.y.toPrecision(SceneHub.FLOAT_PREC)), \r\n parseFloat(sphere.position.z.toPrecision(SceneHub.FLOAT_PREC)), \r\n parseFloat(sphere.scale.x.toPrecision(SceneHub.FLOAT_PREC))\r\n ]);\r\n }\r\n }\r\n\r\n return SL;\r\n};\r\n\r\nSceneHub.getJSONsemanticConvexShapes = (semid)=>{\r\n let S = ATON.getSemanticNode(semid);\r\n if (S === undefined) return undefined;\r\n\r\n let CL = [];\r\n\r\n for (let s in S.children){\r\n let semesh = S.children[s];\r\n if (semesh.userData._convexPoints){\r\n CL.push(semesh.userData._convexPoints);\r\n }\r\n }\r\n\r\n //console.log(CL);\r\n \r\n return CL;\r\n};\r\n\r\n// Top-level scene-JSON parsers\r\nSceneHub.initBaseParsers = ()=>{\r\n SceneHub._jsonParsers = {};\r\n\r\n // Scene Title & Description\r\n SceneHub._jsonParsers.title = (title)=>{\r\n if (title === undefined) return;\r\n\r\n SceneHub.setTitle(title);\r\n };\r\n\r\n SceneHub._jsonParsers.description = (descr)=>{\r\n if (descr === undefined) return;\r\n\r\n SceneHub.setDescription(descr);\r\n };\r\n\r\n // FX / post-process\r\n SceneHub._jsonParsers.fx = (fx)=>{\r\n if (fx.ao){\r\n ATON.FX.togglePass(ATON.FX.PASS_AO, true);\r\n if (fx.ao.i) ATON.FX.setAOintensity( parseFloat(fx.ao.i));\r\n }\r\n\r\n if (fx.bloom){\r\n ATON.FX.togglePass(ATON.FX.PASS_BLOOM, true);\r\n if (fx.bloom.i) ATON.FX.setBloomStrength( parseFloat(fx.bloom.i));\r\n if (fx.bloom.t) ATON.FX.setBloomThreshold( parseFloat(fx.bloom.t));\r\n }\r\n\r\n if (fx.dof){\r\n ATON.FX.togglePass(ATON.FX.PASS_DOF, true);\r\n if (fx.dof.f) ATON.FX.setDOFfocus( parseFloat(fx.dof.f) );\r\n }\r\n };\r\n\r\n // Environment\r\n SceneHub._jsonParsers.environment = (env)=>{\r\n\r\n let pano = env.mainpano;\r\n if (env.mainpano){\r\n if (pano.url) ATON.setMainPanorama(pano.url);\r\n if (pano.rotation) ATON.setMainPanoramaRotation(pano.rotation);\r\n }\r\n\r\n if (env.bgcolor){\r\n ATON.setBackgroundColor( new THREE.Color(env.bgcolor[0],env.bgcolor[1],env.bgcolor[2]) );\r\n }\r\n\r\n let L = env.mainlight;\r\n if (L){\r\n if (L.direction) ATON.setMainLightDirection( new THREE.Vector3(L.direction[0],L.direction[1],L.direction[2]) );\r\n\r\n if (ATON._dMainL){\r\n if (L.color) ATON._dMainL.color = new THREE.Color(L.color[0],L.color[1],L.color[2]);\r\n if (L.intensity) ATON._dMainL.intensity = L.intensity;\r\n\r\n if (L.shadows !== undefined) ATON.toggleShadows(L.shadows);\r\n else ATON.toggleShadows(false);\r\n }\r\n else {\r\n //ATON.toggleShadows(false);\r\n ATON.toggleMainLight(false);\r\n }\r\n }\r\n else {\r\n //ATON.toggleShadows(false);\r\n ATON.toggleMainLight(false);\r\n }\r\n\r\n let lps = env.lightprobes;\r\n if (lps){\r\n if (lps.auto) ATON.setAutoLP(true);\r\n }\r\n\r\n if (env.exposure) ATON.setExposure(env.exposure);\r\n\r\n };\r\n\r\n // Soundscape\r\n SceneHub._jsonParsers.soundscape = (soundscape)=>{\r\n if (soundscape === undefined) return;\r\n\r\n if (soundscape.global){\r\n ATON.setGlobalAudio(soundscape.global.url, soundscape.global.loop);\r\n }\r\n };\r\n\r\n // NavMode\r\n SceneHub._jsonParsers.navmode = (navmode)=>{\r\n if (navmode === undefined) return;\r\n\r\n ATON.Nav.setNavMode(navmode);\r\n };\r\n\r\n // Measurements\r\n SceneHub._jsonParsers.measurements = (M)=>{\r\n if (M === undefined) return;\r\n\r\n for (let m in M){\r\n let measure = M[m];\r\n\r\n if (measure.points && measure.points.length === 6){\r\n let A = new THREE.Vector3(\r\n parseFloat(measure.points[0]),\r\n parseFloat(measure.points[1]),\r\n parseFloat(measure.points[2])\r\n );\r\n let B = new THREE.Vector3(\r\n parseFloat(measure.points[3]),\r\n parseFloat(measure.points[4]),\r\n parseFloat(measure.points[5])\r\n );\r\n ATON.SUI.addMeasurementPoint(A);\r\n ATON.SUI.addMeasurementPoint(B);\r\n }\r\n }\r\n };\r\n\r\n // Viewpoints\r\n SceneHub._jsonParsers.viewpoints = (povs)=>{\r\n if (povs === undefined) return;\r\n\r\n for (let p in povs){\r\n let pov = povs[p];\r\n \r\n if (p === \"home\"){\r\n ATON.Nav.setHomePOV( \r\n new ATON.POV()\r\n .setPosition(pov.position[0],pov.position[1],pov.position[2])\r\n .setTarget(pov.target[0],pov.target[1],pov.target[2])\r\n .setFOV(pov.fov)\r\n );\r\n }\r\n else {\r\n new ATON.POV(p)\r\n .setPosition(pov.position[0],pov.position[1],pov.position[2])\r\n .setTarget(pov.target[0],pov.target[1],pov.target[2])\r\n .setFOV(pov.fov)\r\n //.setKeywords(pov.keywords);\r\n }\r\n }\r\n };\r\n\r\n // Visible scene-graph\r\n SceneHub._jsonParsers.scenegraph = (sg)=>{\r\n if (sg === undefined) return;\r\n\r\n let nodes = sg.nodes;\r\n let edges = sg.edges;\r\n\r\n // nodes\r\n for (let nid in nodes){\r\n let N = nodes[nid]; // JSON node\r\n\r\n //let G = ATON.createSceneNode(nid); // ATON node\r\n let G = ATON.getOrCreateSceneNode(nid).removeChildren();\r\n\r\n // Transform node\r\n let transform = N.transform;\r\n let tlist = undefined;\r\n if (transform){\r\n if (transform.position) G.setPosition(transform.position[0],transform.position[1],transform.position[2]);\r\n if (transform.rotation) G.setRotation(transform.rotation[0],transform.rotation[1],transform.rotation[2]);\r\n if (transform.scale) G.setScale(transform.scale[0],transform.scale[1],transform.scale[2]);\r\n\r\n if (transform.list && Array.isArray(transform.list)){\r\n //TODO:\r\n }\r\n }\r\n \r\n // load models by urls list\r\n let urls = N.urls;\r\n if (urls){\r\n if (Array.isArray(urls)){\r\n urls.forEach(u => {\r\n ATON.createSceneNode().load(u).attachTo(G);\r\n });\r\n }\r\n else {\r\n G.load(urls);\r\n }\r\n }\r\n\r\n // FIXME: not working\r\n if (N.shadowcast) G.setShadowCast(N.shadowcast);\r\n if (N.shadowreceive) G.setShadowCast(N.shadowreceive);\r\n\r\n if (N.toYup) G.setYup();\r\n\r\n //if (N.nopicking){ G.disablePicking(); } // FIXME: not working\r\n/*\r\n if (N.color){\r\n let C = ATON.MatHub.colors[N.color];\r\n\r\n G.setMaterial( new THREE.MeshBasicMaterial({ \r\n color: C, \r\n transparent: true,\r\n depthWrite: false, \r\n opacity: 0.1,\r\n }));\r\n\r\n console.log(G);\r\n }\r\n*/\r\n // Keywords\r\n if (N.keywords) G.kwords = N.keywords;\r\n/*\r\n if (N.show !== undefined){\r\n if (N.show){ G.show(); console.log(\"show \"+nid); }\r\n else { G.hide(); console.log(\"hide \"+nid); }\r\n }\r\n*/\r\n }\r\n\r\n // Build graph through relationships\r\n for (let parid in edges){\r\n let children = edges[parid];\r\n\r\n let P = ATON.getSceneNode(parid);\r\n\r\n if (P !== undefined){\r\n for (let c in children){\r\n let childid = children[c];\r\n let C = ATON.getSceneNode(childid);\r\n if (C !== undefined) C.attachTo(P);\r\n }\r\n }\r\n }\r\n\r\n // After connection\r\n for (let nid in nodes){\r\n let N = nodes[nid]; // JSON node\r\n let G = ATON.getSceneNode(nid);\r\n\r\n if (G !== undefined){\r\n if (N.show !== undefined){\r\n //console.log(N.show);\r\n\r\n if (N.show){ G.show(); console.log(\"show \"+nid); }\r\n else { G.hide(); console.log(\"hide \"+nid); }\r\n //console.log(ATON.getSceneNode(nid));\r\n }\r\n //else G.show();\r\n\r\n //if (N.nopicking){ G.disablePicking(); }\r\n //else G.enablePicking();\r\n\r\n if (N.material){\r\n let mat = new THREE.MeshStandardMaterial(N.material);\r\n G.setMaterial( mat );\r\n }\r\n }\r\n }\r\n\r\n/*\r\n for (let e = 0; e < edges.length; e++){\r\n let E = edges[e];\r\n\r\n let from = E[0];\r\n let to = E[1];\r\n\r\n if (from && to){\r\n let child = ATON.getSceneNode(to);\r\n if (child) child.attachTo(from);\r\n }\r\n }\r\n*/\r\n };\r\n\r\n // Semantic scene-graph\r\n SceneHub._jsonParsers.semanticgraph = (sg)=>{\r\n if (sg === undefined) return;\r\n\r\n let nodes = sg.nodes;\r\n let edges = sg.edges;\r\n\r\n // nodes\r\n for (let nid in nodes){\r\n let N = nodes[nid]; // JSON node\r\n\r\n //let G = ATON.createSemanticNode(nid);\r\n let G = ATON.getOrCreateSemanticNode(nid).removeChildren();\r\n \r\n // load shapes by urls list\r\n let urls = N.urls;\r\n if (urls){\r\n if (Array.isArray(urls)){\r\n urls.forEach(u => {\r\n ATON.createSemanticNode().load(u).attachTo(G);\r\n });\r\n }\r\n else {\r\n G.load(urls);\r\n }\r\n }\r\n\r\n if (N.toYup) G.setYup();\r\n\r\n if (N.description) G.setDescription(N.description);\r\n if (N.audio) G.setAudio(N.audio);\r\n\r\n // Keywords\r\n if (N.keywords) G.kwords = N.keywords;\r\n\r\n // Sphere [x,y,z, r]\r\n let spheres = N.spheres;\r\n if (Array.isArray(spheres)){\r\n for (let s in spheres){\r\n let S = spheres[s];\r\n let loc = new THREE.Vector3(parseFloat(S[0]),parseFloat(S[1]),parseFloat(S[2]));\r\n ATON.SemFactory.createSphere(nid, loc, parseFloat(S[3]));\r\n }\r\n }\r\n\r\n let convexshapes = N.convexshapes;\r\n if (Array.isArray(convexshapes)){\r\n for (let s in convexshapes){\r\n let S = convexshapes[s];\r\n\r\n let points = [];\r\n for (let i=0; i{\r\n SceneHub._jsonParsers[key] = parser;\r\n};\r\n\r\n// [C] Sends JSON edit to server node\r\n// previously used: https://tools.ietf.org/html/rfc6902\r\nSceneHub.sendEdit = (patch, mode, onComplete)=>{\r\n if (SceneHub._bLoading || !SceneHub._bEdit) return;\r\n if (patch === undefined) return;\r\n if (mode === undefined) mode = SceneHub.MODE_ADD;\r\n\r\n let sid = SceneHub.currID;\r\n\r\n let O = {};\r\n O.sid = sid;\r\n O.data = patch;\r\n O.mode = (mode === SceneHub.MODE_DEL)? \"DEL\" : \"ADD\";\r\n\r\n let jstr = JSON.stringify(O);\r\n //console.log(jstr);\r\n\r\n patch = null;\r\n O = null;\r\n\r\n $.ajax({\r\n url: ATON.PATH_RESTAPI+\"edit/scene\",\r\n type:\"POST\",\r\n data: jstr,\r\n contentType:\"application/json; charset=utf-8\",\r\n dataType:\"json\",\r\n\r\n // Update local scene JSON\r\n // TODO: improve traffic by applying patch to local json, and NOT by receiving entire JSON \r\n success: (r)=>{\r\n //console.log(r);\r\n if (r) SceneHub.currData = r;\r\n //console.log(ATON.currSceneHub.data);\r\n\r\n if (onComplete) onComplete();\r\n }\r\n });\r\n};\r\n\r\nSceneHub.setTitle = (title)=>{\r\n SceneHub._title = title;\r\n};\r\nSceneHub.getTitle = ()=>{\r\n return SceneHub._title;\r\n}\r\n\r\nSceneHub.setDescription = (descr)=>{\r\n SceneHub._descr = descr;\r\n};\r\nSceneHub.getDescription = ()=>{\r\n return SceneHub._descr;\r\n};\r\n\r\n\r\nexport default SceneHub;","/*\r\n ATON Audio Hub\r\n Centralized Audio/Soundscape\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Audio Hub\r\n@namespace AudioHub\r\n*/\r\nlet AudioHub = {};\r\n\r\n// Realize the hub\r\nAudioHub.init = ()=>{\r\n\r\n AudioHub._listener = new THREE.AudioListener();\r\n AudioHub._loader = new THREE.AudioLoader();\r\n};\r\n\r\nAudioHub.playOnceGlobally = (audioURL)=>{\r\n audioURL = ATON.Utils.resolveCollectionURL(audioURL);\r\n\r\n let au = new THREE.Audio( ATON.AudioHub._listener );\r\n\r\n AudioHub._loader.load( audioURL, (buffer)=>{\r\n au.setBuffer( buffer );\r\n //au.setVolume( 2.0 );\r\n //au.setPlaybackRate(0.9);\r\n au.play();\r\n });\r\n};\r\n\r\n/* TODO:\r\nAudioHub.addToSoundscape = (auid, audioURL, position, radius)=>{\r\n\r\n AudioHub._loader.load( audioURL, (buffer)=>{\r\n A._auTalk.setBuffer( buffer );\r\n A._auTalk.setLoop( false );\r\n //A._auTalk.setVolume( 0.5 );\r\n //A._auTalk.setPlaybackRate(0.9);\r\n A._auTalk.play();\r\n });\r\n};\r\n*/\r\nexport default AudioHub;","/*\r\n ATON Navigation system\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\nconst COSINOIDAL_DIST = function(x){ return (1.0 - Math.cos(x * Math.PI)) / 2.0; };\r\n\r\n/**\r\nATON Navigation system\r\n@namespace Nav\r\n*/\r\nlet Nav = {};\r\n\r\n// Consts\r\nNav.STD_FOV = 50.0;\r\nNav.STD_NEAR = 0.01; //0.05;\r\nNav.STD_FAR = 800.0; // 1000\r\n\r\nNav.FP_EPS = 0.01;\r\nNav.STD_POV_TRANS_DURATION = 2.0;\r\n\r\n// Non-immersive navigation controls\r\nNav.MODE_ORBIT = 0;\r\nNav.MODE_FP = 1;\r\nNav.MODE_DEVORI = 2;\r\n\r\n\r\n//Initialize nav system\r\nNav.init = ()=>{\r\n Nav._mode = undefined;\r\n Nav.POVtransitionDuration = Nav.STD_POV_TRANS_DURATION;\r\n\r\n Nav._rotSpeedOrbit = 0.4;\r\n Nav._rotSpeedFP = -0.2;\r\n Nav._inertia = 0.08; // 0.0 = disabled\r\n\r\n Nav._bControl = true; // user control\r\n\r\n Nav._bInteracting = false;\r\n\r\n // Setup controls\r\n //Nav._camera = new THREE.PerspectiveCamera( Nav.STD_FOV, window.innerWidth / window.innerHeight, Nav.STD_NEAR, Nav.STD_FAR );\r\n //Nav._camera.layers.enableAll();\r\n //Nav._controls = new THREE.OrbitControls( Nav._camera, ATON._renderer.domElement);\r\n\r\n Nav._prevMode = undefined;\r\n Nav.setOrbitControl();\r\n\r\n // POV data\r\n Nav._currPOV = new ATON.POV().setFOV(ATON.Nav.STD_FOV); // holds current viewpoint data (eye, target, etc...)\r\n Nav._fromPOV = new ATON.POV(); // initial POV when requesting a transition\r\n Nav._reqPOV = new ATON.POV(); // requested POV for transition\r\n\r\n Nav.homePOV = undefined; //new ATON.POV();\r\n\r\n Nav._tPOVcall = -1.0;\r\n Nav._tPOVprogress = 0.0;\r\n\r\n Nav.povlist = {}; // This will handle registered POVs\r\n\r\n // World direction and orientation (quat)\r\n // consistent within standard and immersive XR\r\n Nav._vDir = new THREE.Vector3(1,0,0);\r\n Nav._qOri = new THREE.Quaternion();\r\n\r\n // Motion\r\n Nav._motionAmt = 0.0;\r\n Nav._motionDir = new THREE.Vector3(0,1,0);\r\n\r\n // Queried scene location is valid for locomotion\r\n Nav._bValidLocomotion = false;\r\n};\r\n\r\n/**\r\nGet current eye location, consistent within standard and immersive XR sessions.\r\n@returns {THREE.Vector3}\r\n@example\r\nlet p = ATON.Nav.getCurrentEyeLocation();\r\n*/\r\nNav.getCurrentEyeLocation = ()=>{\r\n return Nav._currPOV.pos;\r\n};\r\n\r\n/**\r\nGet current view direction (normalized). Consistent within standard and immersive XR sessions.\r\n@returns {THREE.Vector3}\r\n@example\r\nlet d = ATON.Nav.getCurrentDirection();\r\n*/\r\nNav.getCurrentDirection = ()=>{\r\n return Nav._vDir;\r\n};\r\n\r\n/**\r\nGrab current POV and return a copy.\r\n@returns {POV}\r\n@example\r\nlet pov = ATON.Nav.copyCurrentPOV();\r\n*/\r\nNav.copyCurrentPOV = ()=>{\r\n let pov = new ATON.POV();\r\n pov.pos.copy(Nav._currPOV.pos);\r\n pov.target.copy(Nav._currPOV.target);\r\n pov.fov = Nav._currPOV.fov;\r\n\r\n return pov;\r\n};\r\n\r\nNav.addPOV = (pov, id)=>{\r\n if (pov === undefined) return;\r\n\r\n pov.as(id);\r\n return pov;\r\n};\r\n\r\n/**\r\nReturn true if the navigation system is currently performing a transition\r\n@returns {boolean}\r\n*/\r\nNav.isTransitioning = ()=>{\r\n if (Nav._tPOVcall >= 0.0) return true;\r\n return false;\r\n};\r\n\r\n/**\r\nReturn true if currently queried scene location is valid for locomotion\r\n@returns {boolean}\r\n*/\r\nNav.currentQueryValidForLocomotion = ()=>{\r\n return Nav._bValidLocomotion;\r\n};\r\n\r\n/**\r\nThis is used to validate current queried location for locomotion.\r\nBy default, we exploit surface normal to determine if we can move there or not.\r\nYou can replace this function with your own locomotion validator.\r\n*/\r\nNav.locomotionValidator = ()=>{\r\n if (ATON._queryDataScene === undefined){\r\n Nav._bValidLocomotion = false;\r\n return;\r\n }\r\n\r\n let P = ATON._queryDataScene.p;\r\n let N = ATON._queryDataScene.n;\r\n\r\n if (!N){\r\n Nav._bValidLocomotion = false;\r\n return; \r\n }\r\n\r\n if (N.y <= 0.7){\r\n Nav._bValidLocomotion = false;\r\n return;\r\n }\r\n\r\n Nav._bValidLocomotion = true;\r\n}\r\n\r\n/**\r\nEnable/disable user navigation control\r\n@param {boolean} b - false to lock controls, true to unlock\r\n*/\r\nNav.setUserControl = (b)=>{\r\n if (b === undefined) return;\r\n if (b === Nav._bControl) return;\r\n\r\n Nav._bControl = b;\r\n\r\n if (Nav._controls !== undefined) Nav._controls.enabled = b;\r\n\r\n if (Nav._cOrbit) Nav._cOrbit.enabled = b;\r\n if (Nav._cFirstPerson) Nav._cFirstPerson.enabled = b;\r\n\r\n console.log(\"Nav controls: \"+Nav._bControl);\r\n};\r\n\r\n/**\r\nToggle user control\r\n*/\r\nNav.toggleUserControl = ()=>{\r\n Nav.setUserControl(!Nav._bControl);\r\n};\r\n\r\n/**\r\nReturn true if navigation controls are enabled (i.e. the user can control the camera)\r\n@returns {boolean}\r\n*/\r\nNav.isUserControlEnabled = ()=>{\r\n return Nav._bControl;\r\n};\r\n\r\n/**\r\nReturn true if the navigation system is in Orbit mode\r\n@returns {boolean}\r\n*/\r\nNav.isOrbit = ()=>{ return (Nav._mode === Nav.MODE_ORBIT); };\r\n\r\n/**\r\nReturn true if the navigation system is in First-person mode\r\n@returns {boolean}\r\n*/\r\nNav.isFirstPerson = ()=>{ return (Nav._mode === Nav.MODE_FP); };\r\n\r\n/**\r\nReturn true if the navigation system is in Device-orientation mode\r\n@returns {boolean}\r\n*/\r\nNav.isDevOri = ()=>{ return (Nav._mode === Nav.MODE_DEVORI); };\r\n\r\n/**\r\nSet Navigation mode\r\n@param {number} navmode - navigation mode (0: Orbit, 1: FirstPerson, 2: DeviceOrientation)\r\n*/\r\nNav.setNavMode = (navmode)=>{\r\n if (navmode === undefined) return;\r\n\r\n if (navmode === Nav.MODE_ORBIT) Nav.setOrbitControl();\r\n if (navmode === Nav.MODE_FP) Nav.setFirstPersonControl();\r\n if (navmode === Nav.MODE_DEVORI) Nav.setDeviceOrientationControl();\r\n};\r\n\r\n/**\r\nRestore previously used navigation mode.\r\nIf no previous nav mode is found, defaults to Orbit Control\r\n*/\r\nNav.restorePreviousNavMode = ()=>{\r\n if (Nav._prevMode === undefined) Nav.setOrbitControl();\r\n\r\n Nav.setNavMode(Nav._prevMode);\r\n};\r\n\r\n// Helper routine\r\nNav._updCamera = (c)=>{\r\n if (c === undefined) c = Nav._camera; \r\n\r\n if (ATON.FX.composer){\r\n let PP = ATON.FX.composer.passes;\r\n if (PP){\r\n for (let p=0; p{\r\n if (ATON.XR.isPresenting()) return;\r\n\r\n Nav._prevMode = Nav._mode; // store previous nav mode\r\n\r\n Nav._mode = Nav.MODE_ORBIT;\r\n Nav._bInteracting = false;\r\n\r\n // One-time setup\r\n if (Nav._cOrbit === undefined){\r\n Nav._camOrbit = new THREE.PerspectiveCamera( Nav.STD_FOV, window.innerWidth / window.innerHeight, Nav.STD_NEAR, Nav.STD_FAR );\r\n Nav._camOrbit.layers.enableAll();\r\n\r\n Nav._cOrbit = new THREE.OrbitControls( Nav._camOrbit, ATON._renderer.domElement);\r\n\r\n let C = Nav._cOrbit;\r\n\r\n C.rotateSpeed = Nav._rotSpeedOrbit;\r\n C.enablePan = true;\r\n \r\n if (Nav._inertia > 0.0){\r\n C.enableDamping = true;\r\n C.dampingFactor = Nav._inertia;\r\n }\r\n \r\n C.screenSpacePanning = true;\r\n \r\n C.enableZoom = true;\r\n C.minDistance = 0.03;\r\n C.maxDistance = 100.0;\r\n\r\n if (!Nav._bControl) C.enabled = false;\r\n\r\n //C.addEventListener(\"change\", () => { Nav._bChanged = true; });\r\n C.addEventListener(\"start\",()=>{\r\n Nav._bInteracting = true;\r\n });\r\n C.addEventListener(\"end\",()=>{\r\n Nav._bInteracting = false;\r\n });\r\n\r\n }\r\n\r\n Nav._controls = Nav._cOrbit;\r\n //Nav._controls.target.copy(Nav._camera.position);\r\n Nav._camera = Nav._camOrbit;\r\n\r\n // reparent audio listener\r\n if (ATON.AudioHub._listener && Nav._camera.children.length<1) Nav._camera.add( ATON.AudioHub._listener );\r\n\r\n // Update camera\r\n Nav._updCamera();\r\n \r\n Nav._controls.update();\r\n if (Nav._currPOV) Nav.syncCurrCamera();\r\n\r\n ATON._onResize();\r\n\r\n ATON.toggleCenteredQuery(false);\r\n\r\n ATON.fireEvent(\"NavMode\", Nav._mode);\r\n};\r\n\r\n/**\r\nSet First-Person navigation mode\r\n*/\r\nNav.setFirstPersonControl = ()=>{\r\n if (ATON.XR.isPresenting()) return;\r\n\r\n Nav._prevMode = Nav._mode; // store previous nav mode\r\n\r\n if (ATON.SUI.getSelectorRadius()>0.5) ATON.SUI.setSelectorRadius(0.5); // we (re)set selector radius to 50cm\r\n\r\n Nav._mode = Nav.MODE_FP;\r\n Nav._bInteracting = false;\r\n\r\n // One-time setup\r\n if (Nav._cFirstPerson === undefined){\r\n Nav._camFP = new THREE.PerspectiveCamera( Nav.STD_FOV, window.innerWidth / window.innerHeight, Nav.STD_NEAR, Nav.STD_FAR );\r\n Nav._camFP.layers.enableAll();\r\n\r\n Nav._cFirstPerson = new THREE.OrbitControls( Nav._camFP, ATON._renderer.domElement);\r\n\r\n let C = Nav._cFirstPerson;\r\n\r\n C.enableZoom = false;\r\n C.enablePan = false;\r\n C.rotateSpeed = Nav._rotSpeedFP;\r\n \r\n if (Nav._inertia > 0.0){\r\n C.enableDamping = true;\r\n C.dampingFactor = Nav._inertia;\r\n }\r\n \r\n //C.screenSpacePanning = true;\r\n\r\n C.target.copy(Nav._camera.position);\r\n\r\n C.minDistance = 0.01;\r\n C.maxDistance = 0.01;\r\n\r\n if (!Nav._bControl) C.enabled = false;\r\n }\r\n\r\n Nav._controls = Nav._cFirstPerson;\r\n //Nav._controls.target.copy(Nav._camera.position);\r\n Nav._camera = Nav._camFP;\r\n\r\n // reparent audio listener\r\n if (ATON.AudioHub._listener && Nav._camera.children.length<1) Nav._camera.add( ATON.AudioHub._listener );\r\n \r\n // Update camera\r\n Nav._updCamera();\r\n\r\n Nav._controls.update();\r\n if (Nav._currPOV) Nav.syncCurrCamera();\r\n\r\n ATON._onResize();\r\n\r\n ATON.toggleCenteredQuery(false);\r\n\r\n ATON.fireEvent(\"NavMode\", Nav._mode);\r\n/*\r\n if (Nav._controls) ATON._controls.dispose();\r\n ATON._controls = new THREE.FirstPersonControls( ATON._camera, ATON._renderer.domElement);\r\n ATON._controls.lookSpeed = 0.1;\r\n ATON._controls.movementSpeed = 10;\r\n ATON._controls.noFly = true;\r\n ATON._controls.lookVertical = false;\r\n\r\n //ATON._camera.position.set( 20.0, 5.0, 0 );\r\n ATON._controls.lookAt(0,4,0);\r\n\r\n ATON._controls.update();\r\n console.log(ATON._controls);\r\n*/\r\n};\r\n\r\n/**\r\nSet device-orientation navigation mode\r\n*/\r\nNav.setDeviceOrientationControl = ()=>{\r\n if (!ATON.Utils.isMobile()) return;\r\n\r\n Nav._prevMode = Nav._mode; // store previous nav mode\r\n\r\n Nav._mode = Nav.MODE_DEVORI;\r\n Nav._bInteracting = false;\r\n ATON._screenPointerCoords.set(0.0,0.0);\r\n\r\n // One-time setup\r\n if (Nav._cDevOri === undefined){\r\n Nav._camDevOri = new THREE.PerspectiveCamera( Nav.STD_FOV, window.innerWidth / window.innerHeight, Nav.STD_NEAR, Nav.STD_FAR );\r\n Nav._camDevOri.layers.enableAll();\r\n\r\n Nav._cDevOri = new THREE.DeviceOrientationControls(Nav._camDevOri, ATON._renderer.domElement);\r\n //Nav._cDevOri = new Nav.DeviceOrientationControls(Nav._camDevOri, ATON._renderer.domElement);\r\n\r\n Nav._cDevOri.alphaOffset = 0.0; //The alpha offset in radians\r\n }\r\n\r\n Nav._controls = Nav._cDevOri;\r\n Nav._camera = Nav._camDevOri;\r\n\r\n // reparent audio listener\r\n if (ATON.AudioHub._listener && Nav._camera.children.length<1) Nav._camera.add( ATON.AudioHub._listener );\r\n\r\n // Update camera\r\n Nav._updCamera();\r\n\r\n Nav._controls.update();\r\n if (Nav._currPOV) Nav.syncCurrCamera();\r\n\r\n ATON._onResize();\r\n\r\n ATON.toggleCenteredQuery(true);\r\n \r\n ATON.fireEvent(\"NavMode\", Nav._mode);\r\n};\r\n\r\n/**\r\nSet a motion amount\r\n@param {number} f - the motion amount\r\n@example\r\nATON.Nav.setMotionAmount(0.1);\r\n*/\r\nNav.setMotionAmount = (f)=>{\r\n Nav._motionAmt = f;\r\n};\r\n\r\n/**\r\nSet a motion direction\r\n@param {THREE.Vector3} f - the motion direction\r\n@example\r\nATON.Nav.setMotionDirection( new THREE.Vector(1,0,0) );\r\n*/\r\nNav.setMotionDirection = (v)=>{\r\n Nav._motionDir.copy(v);\r\n}\r\n\r\n/**\r\nStop current motion\r\n*/\r\nNav.stop = ()=>{\r\n Nav._motionAmt = 0.0;\r\n //TODO: stop any transition\r\n};\r\n\r\n/**\r\nSet field-of-view (FoV) in degrees\r\n@param {number} f\r\n@example\r\nATON.Nav.setFOV(30.0);\r\n*/\r\nNav.setFOV = (f)=>{\r\n if (ATON.XR.isPresenting()) return; // skip for immersive sessions\r\n\r\n Nav._currPOV.fov = f;\r\n\r\n let cam = Nav._camera;\r\n cam.fov = f;\r\n cam.updateProjectionMatrix();\r\n};\r\n\r\n/**\r\nGet current field-of-view (FoV) in degrees\r\n@returns {number}\r\n*/\r\nNav.getFOV = ()=>{\r\n return Nav._currPOV.fov;\r\n};\r\n\r\n\r\n// Retrieve currPOV from camera and controls\r\nNav.syncCurrPOV = ()=>{\r\n if (ATON.XR.isPresenting()){\r\n \r\n ATON.XR._cam = ATON._renderer.xr.getCamera(Nav._camera);\r\n //console.log(ATON.XR._cam);\r\n\r\n ATON.XR._cam.getWorldPosition( Nav._currPOV.pos );\r\n ATON.XR._cam.getWorldQuaternion( Nav._qOri );\r\n ATON.XR._cam.getWorldDirection( Nav._vDir );\r\n\r\n\r\n //Nav._currPOV.pos.copy(ATON.XR._cam.position);\r\n //Nav._qOri.copy(ATON.XR._cam.quaternion);\r\n\r\n //console.log(Nav._hmdPos);\r\n\r\n //ATON.XR.hmdPos.copy(Nav._currPOV.pos);\r\n //ATON.XR.hmdDir.copy(Nav._vDir);\r\n \r\n //ATON._renderer.xr.getCamera(Nav._camera);\r\n //ATON._renderer.xr.getCamera(Nav._camera).getWorldDirection(Nav._vDir);\r\n //Nav._camera.getWorldDirection(Nav._vDir);\r\n \r\n //Nav._currPOV.pos.copy(Nav._camera.position);\r\n return;\r\n }\r\n\r\n const ctrl = Nav._controls;\r\n const cam = Nav._camera;\r\n\r\n cam.getWorldDirection(Nav._vDir);\r\n cam.getWorldQuaternion(Nav._qOri);\r\n\r\n if (Nav._mode === Nav.MODE_DEVORI){\r\n Nav._currPOV.pos.copy(cam.position);\r\n return;\r\n }\r\n\r\n if (Nav._mode === Nav.MODE_FP){\r\n Nav._currPOV.pos.copy(ctrl.target);\r\n\r\n Nav._currPOV.target.x = Nav._currPOV.pos.x + Nav._vDir.x; //ctrl.target.x - cam.position.x;\r\n Nav._currPOV.target.y = Nav._currPOV.pos.y + Nav._vDir.y; //ctrl.target.y - cam.position.y;\r\n Nav._currPOV.target.z = Nav._currPOV.pos.z + Nav._vDir.z; //ctrl.target.z - cam.position.z;\r\n return;\r\n }\r\n \r\n Nav._currPOV.pos.copy(cam.position);\r\n Nav._currPOV.target.copy(ctrl.target);\r\n};\r\n\r\n// After syncCurrPOV and before updateCamera, we maniuplate currPOV\r\n//==================================================================================\r\nNav.handlePOV = ()=>{\r\n //console.log(Nav._currPOV.pos);\r\n\r\n if (ATON.XR.isPresenting()) Nav.handleXRtransition();\r\n else Nav.handlePOVtransition();\r\n\r\n //Nav.handleMotion();\r\n\r\n //if (ATON.XR.isPresenting()) console.log(ATON._renderer.xr);\r\n\r\n // Handle constraints\r\n\r\n};\r\n\r\n// Not used for now\r\nNav.handleMotion = ()=>{\r\n if (Nav.isTransitioning()) return;\r\n\r\n if (Nav._motionAmt != 0.0){\r\n\r\n //if ()\r\n\r\n\r\n if (ATON.XR.controller0 && ATON.XR.controller0.visible){\r\n ATON.XR.controller0.getWorldDirection(Nav._motionDir);\r\n Nav._motionDir.negate();\r\n }\r\n else Nav._motionDir.copy(Nav._vDir);\r\n\r\n let fv = Nav._motionDir.clone();\r\n fv.multiplyScalar(Nav._motionAmt * ATON._dt);\r\n\r\n Nav._currPOV.pos.add(fv);\r\n Nav._currPOV.target.add(fv); // check if needed\r\n }\r\n};\r\n\r\nNav.handlePOVtransition = ()=>{\r\n if (Nav._tPOVcall < 0.0) return;\r\n\r\n if (Nav.POVtransitionDuration <= 0.0) Nav._tPOVprogress = 1.0;\r\n else Nav._tPOVprogress = (ATON._clock.elapsedTime - Nav._tPOVcall) / Nav.POVtransitionDuration;\r\n\r\n // End\r\n if (Nav._tPOVprogress >= 1.0){\r\n\r\n Nav._tPOVcall = -1.0;\r\n //Nav._controls.enabled = true;\r\n\r\n Nav._currPOV.pos.copy(Nav._reqPOV.pos);\r\n Nav._currPOV.target.copy(Nav._reqPOV.target);\r\n Nav._currPOV.fov = Nav._reqPOV.fov;\r\n\r\n ATON.fireEvent(\"POVTransitionCompleted\", Nav._reqPOV.id);\r\n return;\r\n }\r\n\r\n Nav._tPOVprogress = COSINOIDAL_DIST(Nav._tPOVprogress);\r\n\r\n Nav._currPOV.pos.lerpVectors(Nav._fromPOV.pos, Nav._reqPOV.pos, Nav._tPOVprogress);\r\n Nav._currPOV.target.lerpVectors(Nav._fromPOV.target, Nav._reqPOV.target, Nav._tPOVprogress);\r\n\r\n if (!Nav._fromPOV.fov || !Nav._reqPOV.fov) return;\r\n Nav._currPOV.fov = THREE.MathUtils.lerp(Nav._fromPOV.fov, Nav._reqPOV.fov, Nav._tPOVprogress);\r\n\r\n //console.log(Nav._camera);\r\n\r\n Nav._camera.fov = Nav._currPOV.fov;\r\n Nav._camera.updateProjectionMatrix();\r\n};\r\n\r\n// Immersive XR transitions\r\nNav.handleXRtransition = ()=>{\r\n if (Nav._tPOVcall < 0.0) return;\r\n\r\n if (Nav.POVtransitionDuration <= 0.0) Nav._tPOVprogress = 1.0;\r\n else Nav._tPOVprogress = (ATON._clock.elapsedTime - Nav._tPOVcall) / Nav.POVtransitionDuration;\r\n\r\n // End\r\n if (Nav._tPOVprogress >= 1.0){\r\n\r\n Nav._tPOVcall = -1.0;\r\n //Nav._controls.enabled = true;\r\n\r\n //ATON.XR.setRefSpaceLocation(Nav._reqXRpos);\r\n ATON.XR._currPos.copy(ATON.XR._reqPos);\r\n\r\n console.log(\"XR height\"+ATON.XR._currPos.y);\r\n console.log(\"HMD height\"+Nav._currPOV.pos.y);\r\n\r\n ATON.fireEvent(\"POVTransitionCompleted\", Nav._reqPOV.id);\r\n return;\r\n }\r\n\r\n ATON.XR._currPos.lerpVectors(ATON.XR._fromPos, ATON.XR._reqPos, Nav._tPOVprogress);\r\n //ATON.XR._currPos.lerpVectors(Nav._fromPOV.pos, Nav._reqPOV.pos, Nav._tPOVprogress);\r\n\r\n};\r\n\r\n// Update internal camera from currPOV \r\nNav.syncCurrCamera = ()=>{\r\n if (ATON.XR.isPresenting()) return;\r\n\r\n let ctrl = Nav._controls;\r\n let cam = Nav._camera;\r\n \r\n let pos = Nav._currPOV.pos;\r\n let tgt = Nav._currPOV.target;\r\n\r\n // We are in VR\r\n/*\r\n if (ATON.XR.isPresenting()){\r\n ///let vrcam = ATON.XR.rig;\r\n ///vrcam.position.copy(pos);\r\n \r\n ///ATON.XR.setRefSpaceLocation(pos);\r\n\r\n //let C = ATON._renderer.xr.getCamera(cam);\r\n //C.getWorldDirection(Nav._vDir);\r\n return;\r\n }\r\n*/\r\n if (Nav._mode === Nav.MODE_DEVORI){\r\n cam.position.copy(pos);\r\n return;\r\n }\r\n\r\n // Common controls\r\n //let d = new THREE.Vector3();\r\n Nav._vDir.subVectors(tgt, pos);\r\n Nav._vDir.normalize();\r\n\r\n if (Nav._mode === Nav.MODE_FP){\r\n ctrl.target.copy(pos);\r\n\r\n cam.position.x = ctrl.target.x - (Nav._vDir.x * Nav.FP_EPS);\r\n cam.position.y = ctrl.target.y - (Nav._vDir.y * Nav.FP_EPS);\r\n cam.position.z = ctrl.target.z - (Nav._vDir.z * Nav.FP_EPS);\r\n }\r\n else {\r\n cam.position.copy(pos);\r\n ctrl.target.copy(tgt);\r\n }\r\n};\r\n\r\n// Main update routine\r\nNav.update = ()=>{\r\n\r\n //Nav._bXR = ATON.XR.isPresenting();\r\n\r\n Nav.syncCurrPOV();\r\n Nav.handlePOV();\r\n Nav.syncCurrCamera();\r\n};\r\n\r\n\r\n/**\r\nRequest transition to viewpoint (POV)\r\n@param {POV} pov - the target POV\r\n@param {number} duration - duration of transition in seconds (optional), otherwise use standard duration\r\n@example\r\nATON.Nav.requestPOV( myTargetPOV );\r\n*/\r\nNav.requestPOV = (pov, duration)=>{\r\n if (ATON._tPOVcall >= 0.0) return; // already requested\r\n if (pov === undefined) return;\r\n\r\n ATON.fireEvent(\"POVTransitionRequested\", pov.id);\r\n\r\n if (duration !== undefined) Nav.POVtransitionDuration = duration;\r\n \r\n //Nav._controls.enabled = false;\r\n\r\n Nav._tPOVcall = ATON._clock.elapsedTime;\r\n \r\n if (ATON.XR.isPresenting()){\r\n Nav._reqPOV.pos.copy(pov.pos? pov.pos : Nav._currPOV.pos);\r\n Nav._fromPOV.pos.copy(Nav._currPOV.pos);\r\n\r\n ATON.XR._reqPos.copy(pov.pos? pov.pos : Nav._currPOV.pos);\r\n ATON.XR._fromPos.copy(ATON.XR._currPos);\r\n }\r\n else {\r\n Nav._reqPOV.pos.copy(pov.pos? pov.pos : Nav._currPOV.pos);\r\n Nav._reqPOV.target.copy( pov.target? pov.target : Nav._currPOV.target);\r\n Nav._reqPOV.fov = pov.fov? pov.fov : Nav._currPOV.fov;\r\n\r\n Nav._fromPOV.pos.copy(Nav._currPOV.pos);\r\n Nav._fromPOV.target.copy(Nav._currPOV.target);\r\n Nav._fromPOV.fov = Nav._currPOV.fov;\r\n }\r\n};\r\n\r\n\r\nNav.requestPOVbyBound = (bs, duration)=>{\r\n if (bs === undefined) return;\r\n\r\n //let T = new THREE.Vector3();\r\n let E = new THREE.Vector3();\r\n\r\n //T.copy(bs.center);\r\n \r\n let r = bs.radius * 3.0;\r\n E.x = bs.center.x - (r * Nav._vDir.x);\r\n E.y = bs.center.y - (r * Nav._vDir.y);\r\n E.z = bs.center.z - (r * Nav._vDir.z);\r\n\r\n let pov = new ATON.POV().setPosition(E).setTarget(bs.center); \r\n Nav.requestPOV(pov, duration);\r\n};\r\n\r\n/**\r\nRequest transition to specific ATON Node\r\n@param {Node} n - the target ATON Node\r\n@param {number} duration - duration of transition in seconds (optional), otherwise use standard duration\r\n@example\r\nATON.Nav.requestPOVbyNode( myNode );\r\n*/\r\nNav.requestPOVbyNode = (n, duration)=>{\r\n if (n === undefined) return;\r\n \r\n let bs = n.getBound();\r\n\r\n Nav.requestPOVbyBound(bs,duration);\r\n};\r\n\r\n// Internal routine to re-target on specific 3D point given optional normal\r\nNav.requestRetarget = (point, normal, duration)=>{\r\n let M = new THREE.Vector3();\r\n if (normal === undefined){\r\n M.lerpVectors(point, Nav._currPOV.pos, 0.8);\r\n }\r\n else {\r\n let d = point.distanceTo(Nav._currPOV.pos);\r\n d *= 0.5;\r\n M.x = point.x + (normal.x * d);\r\n M.y = point.y + (normal.y * d);\r\n M.z = point.z + (normal.z * d);\r\n }\r\n\r\n // Adjust DoF if FX enabled\r\n let dd = point.distanceTo(M);\r\n ATON.FX.setDOFfocus( dd );\r\n\r\n let pov = new ATON.POV().setPosition(M).setTarget(point).setFOV(Nav._currPOV.fov);\r\n Nav.requestPOV(pov, duration);\r\n\r\n console.log(pov);\r\n};\r\n\r\n\r\n/**\r\nCompute a default home, depending on visibile bounding sphere. Typically called after all assets are loaded\r\n@param {THREE.Vector3} dv - the normalized offset direction (optional)\r\n@example\r\nATON.Nav.computeDefaultHome();\r\n*/\r\nNav.computeDefaultHome = (dv)=>{\r\n if (dv === undefined) dv = new THREE.Vector3(1,0.7,1);\r\n\r\n let sceneBS = ATON.getRootScene().getBound();\r\n\r\n let eye = new THREE.Vector3(\r\n sceneBS.center.x + (sceneBS.radius * dv.x * 1.5), \r\n sceneBS.center.y + (sceneBS.radius * dv.y * 1.5), \r\n sceneBS.center.z + (sceneBS.radius * dv.z * 1.5)\r\n );\r\n\r\n Nav.homePOV = new ATON.POV().setPosition(eye).setTarget(sceneBS.center);\r\n};\r\n\r\n/** \r\nSet the home viewpoint (POV)\r\n@param {POV} pov - the home POV\r\n*/\r\nNav.setHomePOV = (pov)=>{\r\n Nav.homePOV = pov;\r\n};\r\n\r\nNav.computeAndRequestDefaultHome = (duration, dv)=>{\r\n Nav.computeDefaultHome(dv);\r\n Nav.requestPOV(Nav.homePOV, duration);\r\n};\r\n\r\n/** \r\nRequest home viewpoint\r\n@param {number} duration - transition duration\r\n*/\r\nNav.requestHome = (duration)=>{\r\n Nav.requestPOV(Nav.homePOV, duration);\r\n};\r\n\r\n/** \r\nSet and request home viewpoint\r\n@param {POV} pov - the home POV\r\n@param {number} duration - transition duration\r\n*/\r\nNav.setAndRequestHomePOV = (pov, duration)=>{\r\n Nav.setHomePOV(pov);\r\n Nav.requestPOV(pov, duration);\r\n};\r\n\r\n\r\n/*\r\nMobile devori (modified for absolute compass - UNSTABLE)\r\nauthor richt / http://richt.me\r\nauthor WestLangley / http://github.com/WestLangley\r\nW3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)\r\n*/\r\nNav.DeviceOrientationControls = function ( object ) {\r\n let scope = this;\r\n\r\n this.object = object;\r\n this.object.rotation.reorder( 'YXZ' );\r\n this.enabled = true;\r\n\r\n this.deviceOrientation = {};\r\n this.screenOrientation = 0;\r\n\r\n this.alphaOffset = 0; // radians\r\n this.absolute = false;\r\n this.alphaOffsetDevice = undefined;\r\n this.alphaOffsetScreen = undefined;\r\n\r\n let onDeviceOrientationChangeEvent = function ( event ) {\r\n if(scope.absolute) return;\r\n scope.deviceOrientation = event;\r\n };\r\n\r\n let onDeviceOrientationAbsoluteChangeEvent = function ( event ) {\r\n scope.deviceOrientation = event;\r\n scope.absolute = true;\r\n };\r\n\r\n let onScreenOrientationChangeEvent = function () {\r\n scope.screenOrientation = window.orientation || 0;\r\n };\r\n\r\n // The angles alpha, beta and gamma form a set of intrinsic Tait-Bryan angles of type Z-X'-Y''\r\n let setObjectQuaternion = function () {\r\n let zee = new THREE.Vector3( 0, 0, 1 );\r\n let euler = new THREE.Euler();\r\n\r\n let q0 = new THREE.Quaternion();\r\n let q1 = new THREE.Quaternion( - Math.sqrt( 0.5 ), 0, 0, Math.sqrt( 0.5 ) ); // - PI/2 around the x-axis\r\n\r\n return function ( quaternion, alpha, beta, gamma, orient ) {\r\n euler.set( beta, alpha, - gamma, 'YXZ' ); // 'ZXY' for the device, but 'YXZ' for us\r\n quaternion.setFromEuler( euler ); // orient the device\r\n quaternion.multiply( q1 ); // camera looks out the back of the device, not the top\r\n quaternion.multiply( q0.setFromAxisAngle( zee, - orient ) ); // adjust for screen orientation\r\n };\r\n\r\n }();\r\n\r\n this.connect = function () {\r\n onScreenOrientationChangeEvent(); // run once on load\r\n\r\n window.addEventListener( 'orientationchange', onScreenOrientationChangeEvent, false );\r\n window.addEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false );\r\n window.addEventListener( 'deviceorientationabsolute', onDeviceOrientationAbsoluteChangeEvent, false );\r\n\r\n scope.enabled = true;\r\n };\r\n\r\n this.disconnect = function () {\r\n window.removeEventListener( 'orientationchange', onScreenOrientationChangeEvent, false );\r\n window.removeEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false );\r\n window.removeEventListener( 'deviceorientationabsolute', onDeviceOrientationAbsoluteChangeEvent, false );\r\n\r\n scope.enabled = false;\r\n };\r\n\r\n this.update = function () {\r\n if ( scope.enabled === false ) return;\r\n\r\n let device;\r\n device = scope.deviceOrientation;\r\n\r\n if ( device ) {\r\n let alpha = this.getDirection() ? THREE.Math.degToRad( this.getDirection() ) + scope.alphaOffset : 0; // Z\r\n let beta = device.beta ? THREE.Math.degToRad( device.beta ) : 0; // X'\r\n\r\n let gamma = device.gamma ? THREE.Math.degToRad( device.gamma ) : 0; // Y''\r\n let orient = scope.screenOrientation ? THREE.Math.degToRad( scope.screenOrientation ) : 0; // O\r\n\r\n setObjectQuaternion( scope.object.quaternion, alpha, beta, gamma, orient );\r\n }\r\n\r\n };\r\n\r\n this.dispose = ()=>{\r\n scope.disconnect();\r\n };\r\n\r\n this.iOSOrientationPermission = ()=>{\r\n if (typeof DeviceOrientationEvent.requestPermission === 'function') {\r\n DeviceOrientationEvent.requestPermission().then(permissionState => {\r\n if (permissionState === 'granted') {\r\n\r\n }\r\n\r\n console.log(permissionState);\r\n }).catch(console.error);\r\n }\r\n }\r\n\r\n this.getDirection = ()=>{\r\n return (typeof scope.deviceOrientation.webkitCompassHeading != \"undefined\") ? scope.deviceOrientation.webkitCompassHeading : scope.deviceOrientation.alpha;\r\n }\r\n\r\n this.getDirectionMap = ()=>{\r\n return (typeof scope.deviceOrientation.webkitCompassHeading != \"undefined\") ? (360 - scope.deviceOrientation.webkitCompassHeading) : scope.deviceOrientation.alpha;\r\n }\r\n\r\n this.connect();\r\n};\r\n\r\n\r\nexport default Nav;","/*\r\n ATON immersive XR module\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Immersive XR\r\n@namespace XR\r\n*/\r\nlet XR = {};\r\n\r\nXR.STD_TELEP_DURATION = 0.03;\r\nXR.HAND_R = 0;\r\nXR.HAND_L = 1;\r\n\r\nXR.MOBILE_DENSITY_F = 0.5;\r\n\r\n\r\n//Initializes XR component\r\nXR.init = ()=>{\r\n ATON._renderer.xr.enabled = true;\r\n ATON._renderer.xr.setReferenceSpaceType( 'local' );\r\n \r\n // WebXR density\r\n if (ATON.device.isMobile) ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd * XR.MOBILE_DENSITY_F);\r\n else ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd);\r\n\r\n XR._bPresenting = false;\r\n XR.currSession = null;\r\n XR._sessionType = \"immersive-vr\";\r\n\r\n XR.rig = new THREE.Group();\r\n //XR.rig.position.set(0,0,0);\r\n XR.rig.add( ATON.Nav._camera );\r\n ATON._rootUI.add(XR.rig);\r\n\r\n //XR.hmdOri = new THREE.Quaternion();\r\n //XR.hmdPos = new THREE.Vector3();\r\n\r\n XR._cam = undefined;\r\n\r\n XR._currPos = XR.rig.position; //new THREE.Vector3();\r\n XR._fromPos = new THREE.Vector3();\r\n XR._reqPos = new THREE.Vector3();\r\n\r\n XR.gControllers = undefined;\r\n\r\n XR.controller0 = undefined;\r\n XR.controller1 = undefined;\r\n\r\n XR.controller0pos = new THREE.Vector3();\r\n XR.controller1pos = new THREE.Vector3();\r\n XR.controller0dir = new THREE.Vector3();\r\n XR.controller1dir = new THREE.Vector3();\r\n\r\n XR._lastPosR = undefined;\r\n XR._lastPosL = undefined;\r\n\r\n XR._pointerLineGeom = undefined;\r\n XR._pointerLineMesh = undefined;\r\n\r\n XR.gpad0 = undefined;\r\n XR.gpad1 = undefined;\r\n\r\n XR._urlHand = ATON.PATH_RES+\"models/hand/hand.glb\";\r\n\r\n // Base ev\r\n ATON.on(\"XRselectStart\", (c)=>{\r\n if (c === XR.HAND_R) ATON._stdActivation(); //XR.defaultSelectHandler(c);\r\n });\r\n ATON.on(\"XRselectEnd\", (c)=>{\r\n //ATON.Nav.stop();\r\n //console.log(\"Sel end \"+c);\r\n });\r\n\r\n ATON.on(\"XRsqueezeStart\", (c)=>{\r\n console.log(\"Squeeze \"+c);\r\n });\r\n\r\n ATON.on(\"VRC_IDassigned\", (uid)=>{\r\n let rh = ATON.getUINode(\"Rhand\");\r\n let lh = ATON.getUINode(\"Lhand\");\r\n\r\n let avMats = ATON.MatHub.materials.avatars;\r\n let am = avMats[uid % avMats.length];\r\n if (lh) lh.setMaterial(am);\r\n if (rh) rh.setMaterial(am);\r\n });\r\n};\r\n\r\n\r\n/**\r\nSet session type\r\n@param {string} type - Can be \"immersive-vr\" or \"immersive-ar\"\r\n*/\r\nXR.setSessionType = (type)=>{\r\n if (type === undefined) return;\r\n if (type !== \"immersive-vr\" && type !== \"immersive-ar\") return;\r\n\r\n XR._sessionType = type;\r\n console.log(\"Session type: \"+type);\r\n};\r\n\r\n/**\r\nReturn true if we are presenting (immersive VR or AR)\r\n@returns {boolean}\r\n*/\r\nXR.isPresenting = ()=>{\r\n return XR._bPresenting;\r\n};\r\n\r\n\r\nXR.teleportOnQueriedPoint = ()=>{\r\n if (!ATON.Nav.currentQueryValidForLocomotion()) return false;\r\n\r\n const P = ATON._queryDataScene.p;\r\n //const N = ATON._queryDataScene.n;\r\n\r\n // FIXME: height offset needed for \"local\", fill this automatically\r\n ATON.Nav.requestPOV( new ATON.POV().setPosition(P.x, P.y + ATON.userHeight, P.z), XR.STD_TELEP_DURATION );\r\n //ATON.Nav.requestPOV( new ATON.POV().setPosition(P.x, P.y, P.z), XR.STD_TELEP_DURATION );\r\n\r\n return true;\r\n};\r\n\r\n/* Deprecated\r\nXR.defaultSelectHandler = (c)=>{\r\n\r\n if (XR._sessionType === \"immersive-vr\") XR.teleportOnQueriedPoint();\r\n\r\n ATON.FE.playAudioFromSemanticNode(ATON._hoveredSemNode);\r\n \r\n //ATON.Nav.setMotionAmount(3.0);\r\n};\r\n\r\nXR._handleUISelection = ()=>{\r\n if (ATON._hoveredUI === undefined) return false;\r\n\r\n let H = ATON.getUINode(ATON._hoveredUI);\r\n if (H && H.onSelect) H.onSelect();\r\n \r\n return true;\r\n}\r\n*/\r\n\r\n// Helper routine to setup a ray-caster\r\nXR.setupQueryRay = (rc)=>{\r\n if (rc === undefined) return;\r\n\r\n // We have at least one 6DOF controller\r\n if (XR.controller0) rc.set( XR.controller0pos, XR.controller0dir );\r\n\r\n // else use HMD-aligned query\r\n else rc.set( ATON.Nav.getCurrentEyeLocation(), ATON.Nav.getCurrentDirection() );\r\n};\r\n\r\n\r\n/**\r\nSet reference-space location (not the actual HMD camera location).\r\nThis can be used to move around the user, given a proper locomotion technique\r\n@param {THREE.Vector3} p - the new location of reference space\r\n*/\r\nXR.setRefSpaceLocation = (p)=>{\r\n XR.rig.position.copy(p);\r\n};\r\n\r\n\r\n// Right\r\nXR._setupControllerR = (C, bAddRep)=>{\r\n if (XR.controller0) return;\r\n\r\n XR.controller0 = C;\r\n console.log(\"R controller\");\r\n\r\n // Main trigger\r\n C.addEventListener( 'selectstart', ()=>{\r\n //if (XR._handleUISelection()) return;\r\n\r\n ATON.fireEvent(\"XRselectStart\", XR.HAND_R);\r\n });\r\n C.addEventListener( 'selectend', ()=>{ \r\n ATON.fireEvent(\"XRselectEnd\", XR.HAND_R);\r\n });\r\n\r\n // Squeeze\r\n C.addEventListener( 'squeezestart', ()=>{\r\n ATON.fireEvent(\"XRsqueezeStart\", XR.HAND_R);\r\n });\r\n C.addEventListener( 'squeezeend', ()=>{\r\n ATON.fireEvent(\"XRsqueezeEnd\", XR.HAND_R);\r\n });\r\n\r\n XR.setupControllerUI(XR.HAND_R, bAddRep);\r\n\r\n ATON.fireEvent(\"XRcontrollerConnected\", XR.HAND_R);\r\n};\r\n\r\n// Left\r\nXR._setupControllerL = (C, bAddRep)=>{\r\n if (XR.controller1) return;\r\n\r\n XR.controller1 = C;\r\n console.log(\"L controller\");\r\n\r\n // Main trigger\r\n C.addEventListener( 'selectstart', ()=>{\r\n //if (XR._handleUISelection()) return;\r\n ATON.fireEvent(\"XRselectStart\", XR.HAND_L);\r\n });\r\n C.addEventListener( 'selectend', ()=>{ \r\n ATON.fireEvent(\"XRselectEnd\", XR.HAND_L);\r\n });\r\n\r\n // Squeeze\r\n C.addEventListener( 'squeezestart', ()=>{\r\n ATON.fireEvent(\"XRsqueezeStart\", XR.HAND_L);\r\n });\r\n C.addEventListener( 'squeezeend', ()=>{\r\n ATON.fireEvent(\"XRsqueezeEnd\", XR.HAND_L);\r\n });\r\n\r\n XR.setupControllerUI(XR.HAND_L, bAddRep);\r\n \r\n ATON.fireEvent(\"XRcontrollerConnected\", XR.HAND_L);\r\n};\r\n\r\n// On XR session started\r\nXR.onSessionStarted = ( session )=>{\r\n if (XR.currSession) return; // Already running\r\n\r\n\tsession.addEventListener( 'end', XR.onSessionEnded );\r\n\r\n console.log(XR._sessionType + \" session started.\");\r\n\r\n //console.log(session);\r\n\r\n // If any streaming is ongoing, terminate it\r\n ATON.MediaRec.stopMediaStreaming();\r\n\r\n // Promised\r\n\tATON._renderer.xr.setSession( session ).then(()=>{\r\n XR.currSession = session;\r\n console.log(XR.currSession);\r\n\r\n // Disable panorama on AR sessions\r\n if (XR._sessionType === \"immersive-ar\"){\r\n ATON._mainRoot.background = null;\r\n if (ATON._mMainPano) ATON._mMainPano.visible = false;\r\n }\r\n\r\n // get xrRefSpace\r\n /*\r\n session.requestReferenceSpace('local').then((refSpace) => {\r\n xrRefSpace = refSpace.getOffsetReferenceSpace(new XRRigidTransform({x: 0, y: 1.5, z: 0}));\r\n });\r\n */\r\n\r\n for (let c = 0; c < 2; c++){\r\n const C = ATON._renderer.xr.getController(c);\r\n\r\n if (C !== undefined && !C.userData.bXRconfig){\r\n //console.log(C);\r\n\r\n C.visible = false;\r\n C.userData.bXRconfig = true;\r\n\r\n C.addEventListener( 'connected', (e) => {\r\n //console.log( e.data.handedness );\r\n let hand = e.data.handedness;\r\n \r\n //console.log(e.data);\r\n console.log(\"Hand \"+hand);\r\n\r\n if (hand === \"left\") XR._setupControllerL(C, true);\r\n else {\r\n if (hand === \"right\") XR._setupControllerR(C, true);\r\n else { // FIXME:\r\n\r\n //XR._setupControllerR(C, false);\r\n \r\n C.addEventListener('selectstart', ()=>{\r\n //if (XR._handleUISelection()) return;\r\n ATON.fireEvent(\"XRselectStart\", XR.HAND_R);\r\n \r\n console.log(\"Head-aligned select\");\r\n });\r\n C.addEventListener('selectend', ()=>{ \r\n ATON.fireEvent(\"XRselectEnd\", XR.HAND_R);\r\n });\r\n\r\n ATON.fireEvent(\"XRcontrollerConnected\", XR.HAND_R);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n /*\r\n let C0 = ATON._renderer.xr.getController(0);\r\n let C1 = ATON._renderer.xr.getController(1);\r\n\r\n console.log(C0);\r\n //ATON.VRoadcast.log(JSON.stringify(C0));\r\n\r\n // Controller 0\r\n if (C0){\r\n C0.visible = false;\r\n\r\n C0.addEventListener( 'connected', (e) => {\r\n\r\n //console.log( e.data.handedness );\r\n\r\n if (e.data.handedness === \"left\") XR._setupControllerL(C0);\r\n else XR._setupControllerR(C0);\r\n\r\n //C0.gamepad = e.data.gamepad;\r\n //console.log(XR.controller0.gamepad);\r\n\r\n //ATON.VRoadcast.log(JSON.stringify(e));\r\n\r\n //let gp = C0.gamepad;\r\n //if (gp.pose && gp.pose.hasPosition) C0.visible = true;\r\n\r\n });\r\n }\r\n\r\n // Controller 1\r\n if (C1){\r\n C1.visible = false;\r\n\r\n C1.addEventListener( 'connected', (e) => {\r\n //console.log( e.data.handedness );\r\n\r\n if (e.data.handedness === \"left\") XR._setupControllerL(C1);\r\n else XR._setupControllerR(C1);\r\n\r\n //C1.gamepad = e.data.gamepad;\r\n \r\n //let gp = C1.gamepad;\r\n //if (gp.pose && gp.pose.hasPosition) C1.visible = true;\r\n\r\n });\r\n }\r\n */\r\n\r\n // reparent current camera to the XR rig\r\n XR.rig.add( ATON.Nav._camera );\r\n\r\n XR.setRefSpaceLocation(ATON.Nav._currPOV.pos);\r\n console.log(ATON.Nav._currPOV.pos);\r\n\r\n XR._bPresenting = true;\r\n console.log(\"XR now presenting\");\r\n\r\n //XR.setupControllersUI();\r\n\r\n ATON.fireEvent(\"XRmode\", true);\r\n\r\n // for immersive sessions we (re)set selector radius to 50cm\r\n if (ATON.SUI.getSelectorRadius()>0.5) ATON.SUI.setSelectorRadius(0.5);\r\n\r\n //console.log(session);\r\n\r\n let C = ATON._renderer.xr.getCamera();\r\n //ATON.Utils.updateTSetsCamera( C );\r\n ATON.Nav._updCamera( C );\r\n\r\n // FIXME: needed bc selector 0.5 radius is not applied\r\n setTimeout( ()=>{\r\n //ATON.Utils.updateTSetsCamera();\r\n if (ATON.SUI.getSelectorRadius()>0.5) ATON.SUI.setSelectorRadius(0.5);\r\n }, 2000);\r\n });\r\n};\r\n\r\n// On XR session terminated\r\nXR.onSessionEnded = ( /*event*/ )=>{\r\n XR.currSession.removeEventListener( 'end', XR.onSessionEnded );\r\n XR.currSession = null;\r\n\r\n XR._bPresenting = false;\r\n //XR.rig.position.set(0.0,0.0,0.0);\r\n XR.setRefSpaceLocation( new THREE.Vector3(0,0,0) );\r\n\r\n ATON.fireEvent(\"XRmode\", false);\r\n\r\n // If any streaming is ongoing, terminate it\r\n ATON.MediaRec.stopMediaStreaming();\r\n\r\n ATON.Nav.requestHome();\r\n\r\n //ATON.Utils.updateTSetsCamera();\r\n ATON.Nav._updCamera();\r\n\r\n console.log(\"Quit XR\");\r\n};\r\n\r\n/**\r\nToggle immersive VR/AR mode\r\n@param {string} sessiontype - Can be \"immersive-vr\" or \"immersive-ar\", if undefined defaults to immersive VR\r\n*/\r\nXR.toggle = (sessiontype)=>{\r\n XR.setSessionType(sessiontype);\r\n\r\n if (!ATON.device.xrSupported[XR._sessionType]) return;\r\n\r\n // Enter XR\r\n if (XR.currSession === null){\r\n let sessionInit = {\r\n optionalFeatures: [\r\n //\"local\",\r\n //\"local-floor\",\r\n ///\"bounded-floor\",\r\n\r\n //\"hand-tracking\",\r\n\r\n //\"high-refresh-rate\",\r\n //\"high-fixed-foveation-level\",\r\n ]\r\n\r\n };\r\n navigator.xr.requestSession( XR._sessionType, sessionInit ).then( XR.onSessionStarted );\r\n //console.log(navigator.xr);\r\n }\r\n // Exit XR\r\n else {\r\n XR.currSession.end();\r\n }\r\n};\r\n\r\nXR.setupControllerUI = (h, bAddRep)=>{\r\n let raytick = 0.003;\r\n let raylen = 1.0;\r\n\r\n let rhand = undefined;\r\n let lhand = undefined;\r\n\r\n //console.log(\"Setup controller \"+h);\r\n\r\n if (XR.gControllers === undefined){\r\n XR.gControllers = ATON.createUINode();\r\n\r\n XR.gControllers.disablePicking();\r\n XR.rig.add(XR.gControllers);\r\n }\r\n\r\n // Left\r\n if (h === XR.HAND_L){\r\n XR.gControllers.add( XR.controller1 );\r\n\r\n if (bAddRep){\r\n lhand = ATON.createUINode(\"Lhand\").load(XR._urlHand).setMaterial(ATON.MatHub.materials.controllerRay).setScale(-1,1,1);\r\n XR.controller1.add(lhand);\r\n }\r\n }\r\n // Right\r\n else {\r\n XR.gControllers.add( XR.controller0 );\r\n\r\n if (bAddRep){\r\n XR._pointerLineGeom = new THREE.CylinderBufferGeometry( raytick,raytick, raylen, 4 );\r\n //XR._pointerLineGeom = new THREE.CylinderGeometry( raytick,raytick, raylen, 4 );\r\n\r\n XR._pointerLineGeom.rotateX( -Math.PI / 2 );\r\n XR._pointerLineGeom.translate(0,0,-(raylen*0.5));\r\n\r\n XR._pointerLineMesh = new THREE.Mesh( XR._pointerLineGeom, ATON.MatHub.materials.controllerRay );\r\n XR.controller0.add( /*mesh.clone()*/ XR._pointerLineMesh );\r\n XR._pointerLineMesh.visible = false;\r\n \r\n rhand = ATON.createUINode(\"Rhand\").load(XR._urlHand).setMaterial(ATON.MatHub.materials.controllerRay);\r\n XR.controller0.add(rhand);\r\n }\r\n }\r\n\r\n // We are connected to VRoadcast\r\n if (ATON.VRoadcast.uid !== undefined && bAddRep){\r\n let avMats = ATON.MatHub.materials.avatars;\r\n let am = avMats[ATON.VRoadcast.uid % avMats.length];\r\n if (h === XR.HAND_L) lhand.setMaterial(am);\r\n else rhand.setMaterial(am);\r\n }\r\n};\r\n\r\n// FIXME:\r\nXR.switchHands = ()=>{\r\n\r\n/*\r\n let C0 = new THREE.Group();\r\n for (let cr in XR.controller0.children){\r\n C0.add(XR.controller0.children[cr]);\r\n }\r\n\r\n let C1 = new THREE.Group();\r\n for (let cl in XR.controller1.children){\r\n C1.add(XR.controller1.children[cl]);\r\n }\r\n\r\n //XR.controller1.removeChildren();\r\n //XR.controller0.removeChildren();\r\n\r\n return;\r\n\r\n for (let c in C1.children){\r\n XR.controller0.add(C1.children[c]);\r\n }\r\n for (let c in C0.children){\r\n XR.controller1.add(C0.children[c]);\r\n }\r\n*/\r\n let H = XR.controller1;\r\n XR.controller1 = XR.controller0;\r\n XR.controller0 = H;\r\n\r\n //XR.controller0 = ATON._renderer.xr.getController(1);\r\n //XR.controller1 = ATON._renderer.xr.getController(0);\r\n\r\n for (let c in XR.controller0.children) XR.controller0.remove(XR.controller0.children[c]);\r\n for (let c in XR.controller1.children) XR.controller1.remove(XR.controller1.children[c]);\r\n XR.gControllers.removeChildren();\r\n\r\n XR.setupControllerUI(XR.HAND_L);\r\n XR.setupControllerUI(XR.HAND_R);\r\n\r\n console.log(\"VR controllers switched\");\r\n};\r\n\r\n\r\n/* DEPRECATED\r\nXR.setupControllersUI = ()=>{\r\n if (XR.gControllers) return; // already set\r\n\r\n let raytick = 0.003;\r\n let raylen = 5.0;\r\n var geometry = new THREE.CylinderBufferGeometry( raytick,raytick, raylen, 4 );\r\n geometry.rotateX( -Math.PI / 2 );\r\n geometry.translate(0,0,-(raylen*0.5));\r\n\r\n var mesh = new THREE.Mesh( geometry, ATON.MatHub.materials.controllerRay );\r\n\r\n XR.controller0.add( mesh.clone() );\r\n //XR.controller1.add( mesh.clone() );\r\n\r\n let vrcMatHands = (uid)=>{\r\n let avMats = ATON.MatHub.materials.avatars;\r\n if (avMats === undefined || uid === undefined) return;\r\n \r\n let am = avMats[uid % avMats.length];\r\n rhand.setMaterial( am );\r\n lhand.setMaterial( am );\r\n };\r\n\r\n // Hands\r\n let handurl = ATON.PATH_RES+\"models/hand/hand.glb\";\r\n let rhand = ATON.createUINode(\"Rhand\").load(handurl).setMaterial(ATON.MatHub.materials.controllerRay);\r\n let lhand = ATON.createUINode(\"Lhand\").load(handurl).setMaterial(ATON.MatHub.materials.controllerRay).setScale(-1,1,1);\r\n XR.controller0.add(rhand);\r\n XR.controller1.add(lhand);\r\n\r\n if (ATON.VRoadcast.uid) vrcMatHands(ATON.VRoadcast.uid);\r\n ATON.on(\"VRC_IDassigned\", vrcMatHands);\r\n\r\n XR.gControllers = ATON.createUINode();\r\n XR.gControllers.add( XR.controller0 );\r\n XR.gControllers.add( XR.controller1 );\r\n\r\n XR.controller0.visible = false;\r\n XR.controller1.visible = false;\r\n\r\n XR.gControllers.disablePicking();\r\n\r\n XR.rig.add(XR.gControllers);\r\n};\r\n*/\r\n\r\n// Not working\r\nXR.getControllerSpace = (i)=>{\r\n if (i === 1) XR.getControllerGrip(1);\r\n else XR.getControllerGrip(0);\r\n};\r\n\r\n/**\r\nGet controller world location\r\n@param {number} i - the controller ID (0 or 1)\r\n@returns {THREE.Vector3}\r\n*/\r\nXR.getControllerWorldLocation = (i)=>{\r\n if (i === 1) return XR.controller1pos;\r\n else return XR.controller0pos;\r\n};\r\n\r\n/**\r\nGet controller world direction\r\n@param {number} i - the controller ID (0 or 1)\r\n@returns {THREE.Vector3}\r\n*/\r\nXR.getControllerWorldDirection = (i)=>{\r\n if (i === 1) return XR.controller1dir;\r\n else return XR.controller0dir;\r\n};\r\n\r\nXR._deltaMotionController = (C)=>{\r\n if (C === XR.HAND_L && XR._lastPosL === undefined) return;\r\n if (C === XR.HAND_R && XR._lastPosR === undefined) return;\r\n\r\n let p = (C === XR.HAND_L)? XR.controller1pos : XR.controller0pos;\r\n let prev = (C === XR.HAND_L)? XR._lastPosL : XR._lastPosR;\r\n\r\n let D = THREE.Vector3(\r\n p.x - prev.x,\r\n p.y - prev.y,\r\n p.z - prev.z\r\n );\r\n\r\n let m = D.lengthSq();\r\n\r\n if (C === XR.HAND_L) XR._lastPosL = p;\r\n else XR._lastPosR = p;\r\n};\r\n\r\nXR.update = ()=>{\r\n\r\n/*\r\n //if (XR._bPresenting) ATON.Utils.updateTSetsCamera();\r\n if (XR._bPresenting){\r\n let C = ATON._renderer.xr.getCamera();\r\n ATON.Utils.updateTSetsCamera( C );\r\n }\r\n*/\r\n // R controller\r\n if (XR.controller0 && XR.controller0.visible){\r\n XR.controller0.getWorldPosition(XR.controller0pos);\r\n XR.controller0.getWorldDirection(XR.controller0dir);\r\n XR.controller0dir.negate();\r\n\r\n //XR._deltaMotionController(XR.HAND_R);\r\n }\r\n // L controller\r\n if (XR.controller1 && XR.controller1.visible){\r\n XR.controller1.getWorldPosition(XR.controller1pos);\r\n XR.controller1.getWorldDirection(XR.controller1dir);\r\n XR.controller1dir.negate(); \r\n\r\n //XR._deltaMotionController(XR.HAND_L);\r\n }\r\n\r\n/*\r\n if (XR.gpad0 && XR.gpad0.buttons){\r\n //if (XR.gpad0.buttons[1] && XR.gpad0.buttons[1].pressed) ATON.fireEvent(\"XRsqueezePressed\", 0);\r\n if (XR.gpad0.buttons[4] && XR.gpad0.buttons[4].pressed) ATON.fireEvent(\"XRbuttonAPressed\");\r\n if (XR.gpad0.buttons[5] && XR.gpad0.buttons[5].pressed) ATON.fireEvent(\"XRbuttonBPressed\");\r\n }\r\n\r\n if (XR.gpad1 && XR.gpad1.buttons){\r\n //if (XR.gpad1.buttons[1] && XR.gpad1.buttons[1].pressed) ATON.fireEvent(\"XRsqueezePressed\", 1);\r\n if (XR.gpad1.buttons[4] && XR.gpad1.buttons[4].pressed) ATON.fireEvent(\"XRbuttonXPressed\");\r\n if (XR.gpad1.buttons[5] && XR.gpad1.buttons[5].pressed) ATON.fireEvent(\"XRbuttonYPressed\");\r\n }\r\n*/\r\n};\r\n\r\n\r\nexport default XR;","/*\r\n ATON spatial UI Button class\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\nimport Node from \"./ATON.node.js\";\r\n\r\n/**\r\nClass representing a SpatialUI Button.\r\nConstructor requires a uiid (UI Node ID)\r\n@class Button\r\n@example \r\nnew ATON.SUI.Button(\"myButton\")\r\n*/\r\nclass Button extends Node {\r\n\r\nconstructor(uiid, ratio=1.0, fsize=1.0){\r\n super(uiid, ATON.NTYPES.UI);\r\n\r\n this.baseColor = ATON.MatHub.colors.black;\r\n this.switchColor = ATON.MatHub.colors.green;\r\n\r\n this.baseOpacity = 0.5;\r\n this.hoverOpacity = 0.8;\r\n\r\n this._bSwitched = false;\r\n\r\n this.container = new ThreeMeshUI.Block({\r\n width: 0.1*ratio,\r\n height: 0.1,\r\n padding: 0.01,\r\n borderRadius: 0.02,\r\n backgroundColor: this.baseColor,\r\n backgroundOpacity: this.baseOpacity,\r\n\r\n fontFamily: ATON.SUI.PATH_FONT_JSON,\r\n fontTexture: ATON.SUI.PATH_FONT_TEX,\r\n\r\n justifyContent: 'center',\r\n alignContent: 'center'\r\n });\r\n this.add(this.container);\r\n\r\n this.uiText = new ThreeMeshUI.Text({ \r\n content: \"\",\r\n fontSize: 0.02*fsize,\r\n fontColor: ATON.MatHub.colors.white\r\n });\r\n //this.uiText.position.set(0,0,-0.01);\r\n this.container.add(this.uiText);\r\n\r\n // Trigger geom\r\n let trw = ATON.SUI.STD_BTN_SIZE * 0.9 * ratio;\r\n let trh = ATON.SUI.STD_BTN_SIZE * 0.9;\r\n this._trigger = new THREE.Mesh(\r\n new THREE.PlaneGeometry( trw, trh, 2 ), \r\n ATON.MatHub.materials.fullyTransparent\r\n );\r\n this._trigger.position.set(0,0,0.002);\r\n\r\n this.add( this._trigger );\r\n\r\n this.onHover = ()=>{\r\n this.container.set({ \r\n backgroundOpacity: this.hoverOpacity\r\n });\r\n };\r\n this.onLeave = ()=>{\r\n this.container.set({ \r\n backgroundOpacity: this.baseOpacity \r\n });\r\n };\r\n\r\n this.enablePicking();\r\n}\r\n\r\n/**\r\nSet base color of the button\r\n@param {THREE.Color} c - the color\r\n*/\r\nsetBaseColor(c){\r\n this.baseColor = c;\r\n if (!this._bSwitched) this.container.set({ backgroundColor: this.baseColor });\r\n return this;\r\n}\r\n\r\n/**\r\nSet button switch color (when activated)\r\n@param {THREE.Color} c - the color\r\n*/\r\nsetSwitchColor(c){\r\n this.switchColor = c;\r\n if (this._bSwitched) this.container.set({ backgroundColor: this.switchColor });\r\n return this;\r\n}\r\n\r\nsetBackgroundOpacity(f){\r\n this.container.set({ backgroundOpacity: f });\r\n this.baseOpacity = f;\r\n return this;\r\n}\r\n\r\n/**\r\nSet button text\r\n@param {string} text\r\n*/\r\nsetText(text){\r\n this.uiText.set({ content: text });\r\n return this;\r\n}\r\n\r\n/**\r\nSwitch the button (ON/OFF)\r\n@param {boolean} b\r\n*/\r\nswitch(b){\r\n this._bSwitched = b;\r\n if (b) this.container.set({ backgroundColor: this.switchColor });\r\n else this.container.set({ backgroundColor: this.baseColor });\r\n \r\n return this;\r\n}\r\n\r\n/**\r\nSet button icon\r\n@param {string} url - the url to the icon (tipically a PNG file)\r\n*/\r\nsetIcon(url, bNoBackground){\r\n ATON.Utils.textureLoader.load(url, (texture) => {\r\n\r\n this._trigger.material = new THREE.MeshStandardMaterial({\r\n map: texture,\r\n transparent: true,\r\n depthWrite: false\r\n });\r\n\r\n if (bNoBackground){\r\n this.setBackgroundOpacity(0.0);\r\n this.hoverOpacity = 0.0;\r\n }\r\n\r\n/*\r\n this.container.set({ \r\n backgroundTexture: texture,\r\n backgroundOpacity: 1.0,\r\n backgroundColor: undefined \r\n });\r\n*/\r\n this.uiText.position.set(0,-0.035,0);\r\n });\r\n\r\n return this;\r\n}\r\n\r\n}\r\n\r\nexport default Button;","/*\r\n ATON spatial UI Label class\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\nimport Node from \"./ATON.node.js\";\r\n\r\n/**\r\nClass representing a SpatialUI Button.\r\nConstructor requires a uiid (UI Node ID)\r\n@class Label\r\n@example \r\nnew ATON.SUI.Button(\"myButton\")\r\n*/\r\nclass Label extends Node {\r\n\r\nconstructor(uiid){\r\n super(uiid, ATON.NTYPES.UI);\r\n\r\n this.baseColor = ATON.MatHub.colors.black;\r\n\r\n this.container = new ThreeMeshUI.Block({\r\n width: 0.2,\r\n height: 0.05,\r\n padding: 0.001,\r\n borderRadius: 0.01,\r\n backgroundColor: this.baseColor,\r\n backgroundOpacity: 0.5,\r\n\r\n fontFamily: ATON.SUI.PATH_FONT_JSON,\r\n fontTexture: ATON.SUI.PATH_FONT_TEX,\r\n\r\n justifyContent: 'center',\r\n alignContent: 'center'\r\n });\r\n this.container.position.z = 0.05;\r\n this.add(this.container);\r\n\r\n this.uiText = new ThreeMeshUI.Text({ \r\n content: \"Label\",\r\n fontSize: 0.03,\r\n fontColor: ATON.MatHub.colors.white\r\n });\r\n this.container.add(this.uiText);\r\n\r\n/*\r\n this._trigger = new THREE.Mesh( \r\n new THREE.PlaneGeometry( ATON.SUI.STD_BTN_SIZE*0.9, ATON.SUI.STD_BTN_SIZE*0.9, 2 ), \r\n ATON.MatHub.materials.fullyTransparent\r\n );\r\n this._trigger.position.set(0,0,0.002);\r\n\r\n this.add( this._trigger );\r\n\r\n this.onHover = ()=>{\r\n this.container.set({ \r\n backgroundOpacity: 0.8\r\n });\r\n };\r\n this.onLeave = ()=>{\r\n this.container.set({ \r\n backgroundOpacity: 0.5 \r\n });\r\n };\r\n\r\n this.enablePicking();\r\n*/\r\n}\r\n\r\n/**\r\nSet base color of the label\r\n@param {THREE.Color} c - the color\r\n*/\r\nsetBaseColor(c){\r\n this.baseColor = c;\r\n this.container.set({ backgroundColor: this.baseColor });\r\n return this;\r\n}\r\n\r\nsetTextColor(c){\r\n this.uiText.set({ fontColor: c });\r\n return this;\r\n}\r\n\r\n/**\r\nSet button text\r\n@param {string} text\r\n*/\r\nsetText(text){\r\n this.uiText.set({ content: text });\r\n return this;\r\n}\r\n\r\n/*\r\nsetAutoOrientation(b){\r\n if (b === true){\r\n let self = this;\r\n\r\n this.onAfterRender = ()=>{\r\n self.quaternion.copy( ATON.Nav._qOri );\r\n console.log(\"x\");\r\n };\r\n }\r\n else this.onAfterRender = undefined;\r\n}\r\n*/\r\n\r\n\r\n}\r\n\r\nexport default Label;","/*\r\n ATON spatial UI\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\nimport Button from \"./ATON.sui.button.js\";\r\nimport Label from \"./ATON.sui.label.js\";\r\n\r\n/**\r\nATON Spatial UI\r\n@namespace SUI\r\n*/\r\nlet SUI = {};\r\n\r\nSUI.STD_BTN_SIZE = 0.1;\r\n\r\nSUI.Button = Button;\r\nSUI.Label = Label;\r\n\r\n\r\n//Initializes Spatial UI module\r\nSUI.init = ()=>{\r\n SUI.mainSelector = ATON.createUINode();\r\n SUI._mSelectorSphere = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.getMaterial(\"selector\") );\r\n SUI._mSelectorSphere.renderOrder = 100;\r\n SUI.mainSelector.add( SUI._mSelectorSphere );\r\n SUI.mainSelector.disablePicking();\r\n\r\n SUI.setSelectorRadius(0.05);\r\n SUI.mainSelector.visible = false;\r\n ATON._rootUI.add(SUI.mainSelector);\r\n\r\n SUI.fpTeleport = ATON.createUINode();\r\n \r\n let gTeleport = new THREE.CylinderBufferGeometry(0.4,0.4, 0.9, 32,1, true);\r\n //let gTeleport = new THREE.CylinderGeometry(0.4,0.4, 0.9, 32,1, true);\r\n\r\n let mTeleport = new THREE.Mesh( gTeleport, ATON.MatHub.getMaterial(\"teleportLoc\") );\r\n mTeleport.renderOrder = 100;\r\n SUI.fpTeleport.add( mTeleport );\r\n SUI.fpTeleport.disablePicking();\r\n SUI.fpTeleport.visible = false;\r\n ATON._rootUI.add(SUI.fpTeleport);\r\n\r\n // Sem-shapes icons\r\n //SUI.enableSemIcons();\r\n\r\n // Main Font\r\n //SUI.PATH_FONT_JSON = ATON.PATH_MODS+\"three-mesh-ui/examples/assets/Roboto-msdf.json\"; // ATON.PATH_RES+\"fonts/custom-msdf.json\"\r\n //SUI.PATH_FONT_TEX = ATON.PATH_MODS+\"three-mesh-ui/examples/assets/Roboto-msdf.png\"; // ATON.PATH_RES+\"fonts/custom.png\"\r\n SUI.PATH_FONT_JSON = ATON.PATH_RES+\"fonts/custom-msdf.json\"\r\n SUI.PATH_FONT_TEX = ATON.PATH_RES+\"fonts/custom.png\"\r\n/*\r\n ThreeMeshUI.FontLibrary.addFont(\"mainFont\", \r\n SUI.PATH_FONT_JSON, \r\n new THREE.TextureLoader().load(SUI.PATH_FONT_TEX)\r\n );\r\n*/\r\n // Measurements\r\n SUI.gMeasures = ATON.createUINode();\r\n SUI._prevMPoint = undefined;\r\n SUI._measLabels = [];\r\n ATON._rootUI.add(SUI.gMeasures);\r\n\r\n // runtime measurement-line indicator\r\n let mLine = new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(),new THREE.Vector3()]);\r\n SUI._measLine = new THREE.Line( mLine, ATON.MatHub.getMaterial(\"measurement\"));\r\n SUI._measLine.visible = false;\r\n ATON._rootUI.add(SUI._measLine);\r\n\r\n // Sem convex-shapes edit points \r\n SUI.gPoints = ATON.createUINode();\r\n ATON._rootUI.add(SUI.gPoints);\r\n\r\n SUI.buildInfoNode();\r\n SUI.bShowInfo = true;\r\n\r\n // InfoNode scale\r\n SUI._labelScale = ATON.Utils.isMobile()? 50.0 : 60.0; //note: inverse. Orginally 1.2 : 1.0;\r\n SUI._labelScaleVR = 2.0;\r\n\r\n ATON.on(\"SemanticNodeHover\", (semid)=>{\r\n SUI.setInfoNodeText(semid);\r\n if (SUI.gSemIcons) SUI.gSemIcons.hide();\r\n });\r\n ATON.on(\"SemanticNodeLeave\", (semid)=>{\r\n if (SUI.gSemIcons) SUI.gSemIcons.show();\r\n });\r\n\r\n //SUI.setSemIconsOpacity(0.5);\r\n\r\n/*\r\n ATON.on(\"UINodeHover\", (uiid)=>{\r\n console.log(\"Hover UI node: \"+uiid);\r\n });\r\n ATON.on(\"UINodeLeave\", (uiid)=>{\r\n console.log(\"Leave UI node: \"+uiid);\r\n });\r\n*/\r\n\r\n SUI._sync = 0;\r\n};\r\n\r\n// note: before adding LPs\r\nSUI.enableLPIcons = ()=>{\r\n SUI.gLPIcons = ATON.createUINode();\r\n SUI.gLPIcons.disablePicking();\r\n ATON._rootUI.add(SUI.gLPIcons);\r\n};\r\n\r\n\r\nSUI.enableSemIcons = ()=>{\r\n SUI.gSemIcons = ATON.createUINode();\r\n SUI.gSemIcons.disablePicking();\r\n ATON._rootUI.add(SUI.gSemIcons);\r\n};\r\n\r\n/**\r\nSet selector radius\r\n@param {number} r - the radius\r\n*/\r\nSUI.setSelectorRadius = (r)=>{\r\n SUI._selectorRad = r;\r\n SUI.mainSelector.scale.set(r,r,r);\r\n //console.log(r);\r\n};\r\n\r\n/**\r\nGet selector current radius\r\n@returns {number}\r\n*/\r\nSUI.getSelectorRadius = ()=>{\r\n //return SUI.mainSelector.scale.x;\r\n return SUI._selectorRad;\r\n};\r\n\r\n/**\r\nSet selector 3D model\r\n@param {string} path - the model path (usually gltf or glb)\r\n@param {boolean} bUseStdMat - (optional) overwrites 3D model materials with standard selector material \r\n*/\r\nSUI.setSelectorModel = (path, bUseStdMat)=>{\r\n if (path === undefined) return;\r\n\r\n SUI.mainSelector.removeChildren();\r\n\r\n SUI.mainSelector.load(path).disablePicking();\r\n if (bUseStdMat) SUI.mainSelector.setMaterial( ATON.MatHub.getMaterial(\"selector\") );\r\n};\r\n\r\n/**\r\nSet selector color\r\n@param {THREE.Color} color - color\r\n@param {number} opacity - (optional) opacity \r\n*/\r\nSUI.setSelectorColor = (color, opacity)=>{\r\n ATON.MatHub.materials.selector.uniforms.color.value = color;\r\n if (opacity !== undefined) ATON.MatHub.materials.selector.uniforms.opacity.value = opacity;\r\n};\r\n\r\n// Sem-shape icons\r\nSUI.addSemIcon = (semid, meshape)=>{\r\n if (SUI.gSemIcons === undefined) return;\r\n\r\n let bb = new THREE.Box3().setFromObject( meshape );\r\n let bs = new THREE.Sphere();\r\n bb.getBoundingSphere(bs);\r\n\r\n // icon sprite\r\n let semicon = new THREE.Sprite( ATON.MatHub.semIcon );\r\n semicon.position.copy(bs.center);\r\n\r\n let ss = 0.035; //bs.radius * 0.3;\r\n semicon.scale.set(ss,ss,1.0);\r\n semicon.name = semid;\r\n\r\n SUI.gSemIcons.add(semicon);\r\n};\r\n\r\nSUI.addLPIcon = (LP)=>{\r\n if (SUI.gLPIcons === undefined) return;\r\n\r\n let rn = LP._near;\r\n let isize = 0.1; //rn * 0.3;\r\n\r\n let lpicon = new THREE.Sprite( ATON.MatHub.lpIcon );\r\n lpicon.position.copy(LP.pos);\r\n lpicon.scale.set(isize,isize,isize);\r\n\r\n let s = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.materials.lp );\r\n s.scale.set(rn,rn,rn);\r\n s.position.copy(LP.pos);\r\n\r\n SUI.gLPIcons.add( lpicon );\r\n SUI.gLPIcons.add( s );\r\n};\r\n\r\nSUI.setSemIconsOpacity = (f)=>{\r\n if (f === undefined) ATON.MatHub.semIcon.opacity = 1.0;\r\n else ATON.MatHub.semIcon.opacity = f;\r\n};\r\n\r\n\r\nSUI.buildInfoNode = ()=>{\r\n SUI.infoNode = ATON.createUINode();\r\n SUI.infoNode.attachToRoot();\r\n\r\n SUI.infoContainer = new ThreeMeshUI.Block({\r\n width: 0.15,\r\n height: 0.05, //0.07,\r\n padding: 0.01,\r\n borderRadius: 0.02,\r\n backgroundColor: ATON.MatHub.colors.black, //darksem,\r\n //backgroundOpacity: 0.2,\r\n\r\n fontFamily: SUI.PATH_FONT_JSON,\r\n fontTexture: SUI.PATH_FONT_TEX,\r\n //fontFamily: \"mainFont\",\r\n //fontTexture: \"mainFont\",\r\n\r\n alignContent: 'center', // could be 'center' or 'left'\r\n justifyContent: 'center', // could be 'center' or 'start'\r\n });\r\n SUI.infoNode.add(SUI.infoContainer);\r\n\r\n SUI.infoNodeText = new ThreeMeshUI.Text({ \r\n content: \"Info\",\r\n fontSize: 0.02,\r\n fontColor: ATON.MatHub.colors.white\r\n });\r\n SUI.infoContainer.add(SUI.infoNodeText);\r\n //SUI.infoNode.scale.set(0.07,0.07,0.07);\r\n\r\n //ThreeMeshUI.update();\r\n};\r\n\r\n/**\r\nGet main UI Info Node\r\n@returns {Node}\r\n*/\r\nSUI.getInfoNode = ()=>{\r\n return SUI.infoNode;\r\n};\r\n\r\n/**\r\nSet text for main info node\r\n@param {string} txt - the text\r\n*/\r\nSUI.setInfoNodeText = (txt)=>{\r\n if (!SUI.bShowInfo) return;\r\n SUI.infoNodeText.set({ content: txt });\r\n \r\n ThreeMeshUI.update(); \r\n};\r\n\r\n/**\r\nCreate a SpatialUI toolbar from a list of SUI buttons\r\nThis can be arranged anywhere in the scene or attached to other UI nodes\r\n@param {array} buttonlist - a list (array) of SUI buttons\r\n@param {THREE.Color} color - (optional) base color for the toolbar\r\n@returns {Node}\r\n*/\r\nSUI.createToolbar = (buttonlist, color)=>{\r\n let T = ATON.createUINode();\r\n\r\n let num = buttonlist.length;\r\n let padding = SUI.STD_BTN_SIZE * 0.3;\r\n let marginf = 1.1;\r\n\r\n let cont = new ThreeMeshUI.Block({\r\n width: (SUI.STD_BTN_SIZE * num * marginf) + padding,\r\n height: SUI.STD_BTN_SIZE + padding,\r\n padding: 0.01,\r\n borderRadius: 0.02,\r\n backgroundColor: color? color : ATON.MatHub.colors.black,\r\n backgroundOpacity: 0.3,\r\n\r\n fontFamily: SUI.PATH_FONT_JSON,\r\n fontTexture: SUI.PATH_FONT_TEX,\r\n\r\n alignContent: 'center', // could be 'center' or 'left'\r\n justifyContent: 'center', // could be 'center' or 'start'\r\n });\r\n //cont.position.set(0,0,0);\r\n\r\n let m = (num*0.5) * SUI.STD_BTN_SIZE * marginf;\r\n m -= (SUI.STD_BTN_SIZE*0.5);\r\n\r\n for (let i=0; i{\r\n if (P === undefined) return undefined;\r\n\r\n let s = 0.01;\r\n let linetick = 0.001;\r\n/*\r\n let M = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.getMaterial(\"measurement\"));\r\n M.position.copy(P);\r\n M.scale.set(s,s,s);\r\n SUI.gMeasures.add(M);\r\n*/\r\n\r\n // First time\r\n if (SUI._prevMPoint === undefined){\r\n SUI._prevMPoint = P;\r\n \r\n let mlArr = SUI._measLine.geometry.attributes.position.array;\r\n mlArr[0] = P.x;\r\n mlArr[1] = P.y;\r\n mlArr[2] = P.z;\r\n //mlArr[3] = P.x;\r\n //mlArr[4] = P.y;\r\n //mlArr[5] = P.z;\r\n\r\n //SUI._measLine.geometry.attributes.position.needsUpdate = true;\r\n\r\n //SUI._measLine.visible = true;\r\n return undefined;\r\n }\r\n\r\n SUI._measLine.visible = false;\r\n\r\n // Second point\r\n let d = SUI._prevMPoint.distanceTo(P);\r\n //console.log(d);\r\n\r\n s *= d;\r\n linetick *= d;\r\n\r\n let A = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.getMaterial(\"measurement\"));\r\n A.position.copy(SUI._prevMPoint);\r\n A.scale.set(s,s,s);\r\n SUI.gMeasures.add(A);\r\n\r\n let B = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.getMaterial(\"measurement\"));\r\n B.position.copy(P);\r\n B.scale.set(s,s,s);\r\n SUI.gMeasures.add(B);\r\n \r\n let scale = d * 2.0; //1.5; //Math.max(d*1.5, 1.0);\r\n\r\n //let gLine = new THREE.CylinderBufferGeometry( linetick,linetick, d, 4 );\r\n let gLine = new THREE.BufferGeometry().setFromPoints([SUI._prevMPoint,P]);\r\n \r\n SUI.gMeasures.add( new THREE.Line( gLine, ATON.MatHub.getMaterial(\"measurement\")) );\r\n\r\n let L = new SUI.Label();\r\n L.setBaseColor(ATON.MatHub.colors.white).setTextColor(ATON.MatHub.colors.black);\r\n\r\n L.setPosition(\r\n (SUI._prevMPoint.x + P.x)*0.5,\r\n (SUI._prevMPoint.y + P.y)*0.5,\r\n (SUI._prevMPoint.z + P.z)*0.5,\r\n );\r\n\r\n L.setScale(scale).setText( ATON.Utils.getHumanReadableDistance(d) ); // setScale(d*2.0)\r\n\r\n SUI.gMeasures.add(L);\r\n\r\n SUI._measLabels.push(L);\r\n\r\n // return obj\r\n let R = {};\r\n R.A = SUI._prevMPoint.clone();\r\n R.B = P.clone();\r\n\r\n SUI._prevMPoint = undefined;\r\n\r\n return R; \r\n};\r\n\r\nSUI.clearMeasurements = ()=>{\r\n SUI.gMeasures.removeChildren();\r\n SUI._measLabels = [];\r\n};\r\n\r\nSUI._updateMeasurements = ()=>{\r\n if (SUI._measLabels.length <= 0) return;\r\n\r\n for (let ml in SUI._measLabels){\r\n SUI._measLabels[ml].orientToCamera();\r\n }\r\n};\r\n\r\n// Main update routine\r\nSUI.update = ()=>{\r\n if (ATON.Nav.isTransitioning() || ATON._bPauseQuery){\r\n SUI.infoNode.visible = false;\r\n return;\r\n }\r\n/*\r\n SUI._sync = (SUI._sync+1) % 10;\r\n if (SUI._sync===0){\r\n ThreeMeshUI.update();\r\n //console.log(\"sync\");\r\n } \r\n*/\r\n ThreeMeshUI.update();\r\n\r\n // Meas-line indicator\r\n if (SUI._prevMPoint){\r\n if (ATON._queryDataScene){\r\n let mlArr = SUI._measLine.geometry.attributes.position.array;\r\n mlArr[3] = ATON._queryDataScene.p.x;\r\n mlArr[4] = ATON._queryDataScene.p.y;\r\n mlArr[5] = ATON._queryDataScene.p.z;\r\n SUI._measLine.geometry.attributes.position.needsUpdate = true;\r\n }\r\n \r\n SUI._measLine.visible = true;\r\n }\r\n else SUI._measLine.visible = false;\r\n\r\n // Selector\r\n if (ATON._queryDataScene && !ATON.Nav._bInteracting){\r\n SUI.mainSelector.visible = true;\r\n SUI.mainSelector.position.copy(ATON._queryDataScene.p);\r\n }\r\n else {\r\n SUI.mainSelector.visible = false;\r\n //SUI.fpTeleport.visible = false;\r\n }\r\n\r\n // SemIcons\r\n if (SUI.gSemIcons){\r\n if (ATON.Nav._bInteracting){\r\n SUI.gSemIcons.hide();\r\n }\r\n else {\r\n if (ATON._hoveredSemNode === undefined) SUI.gSemIcons.show();\r\n }\r\n }\r\n\r\n // Teleport SUI\r\n if ((!ATON.Nav.isOrbit() || ATON.XR._bPresenting) && ATON.Nav.currentQueryValidForLocomotion()){\r\n SUI.fpTeleport.visible = true;\r\n SUI.fpTeleport.position.copy(ATON._queryDataScene.p);\r\n }\r\n else SUI.fpTeleport.visible = false;\r\n\r\n // Pointer-line\r\n if (ATON.XR._pointerLineMesh){\r\n\r\n let d = 0.0;\r\n if (ATON._queryDataScene) d = ATON._queryDataScene.d;\r\n if (ATON._queryDataUI && (d <= 0.0 || ATON._queryDataUI.d0.0){\r\n ATON.XR._pointerLineMesh.visible = true;\r\n ATON.XR._pointerLineMesh.scale.set(1,1,d);\r\n }\r\n else ATON.XR._pointerLineMesh.visible = false;\r\n }\r\n\r\n // Measures\r\n SUI._updateMeasurements();\r\n\r\n // InfoNode (semantics)\r\n if (ATON._queryDataSem){\r\n\r\n // Immersive Session\r\n if (ATON.XR._bPresenting){\r\n if (ATON.XR.controller0){\r\n SUI.infoNode.position.copy(ATON.XR.controller0pos); //.lerpVectors(ATON._queryDataSem.p, ATON.XR.controller0pos, 0.8);\r\n SUI.infoNode.position.x -= (ATON.XR.controller0dir.x * 0.1);\r\n SUI.infoNode.position.y -= (ATON.XR.controller0dir.y * 0.1); // + 0.1;\r\n SUI.infoNode.position.z -= (ATON.XR.controller0dir.z * 0.1);\r\n SUI.infoNode.setScale(SUI._labelScaleVR);\r\n }\r\n else {\r\n SUI.infoNode.position.lerpVectors(ATON._queryDataSem.p, ATON.Nav._currPOV.pos, 0.5);\r\n SUI.infoNode.setScale(ATON._queryDataSem.d * SUI._labelScaleVR);\r\n }\r\n }\r\n // Default session\r\n else {\r\n SUI.infoNode.position.lerpVectors(ATON._queryDataSem.p, ATON.Nav._currPOV.pos, 0.2);\r\n const ls = ATON._queryDataSem.d * (ATON.Nav._currPOV.fov / SUI._labelScale);\r\n SUI.infoNode.setScale(ls);\r\n }\r\n SUI.infoNode.orientToCamera();\r\n\r\n if (SUI.bShowInfo) SUI.infoNode.visible = true;\r\n \r\n if (!ATON.VRoadcast._bStreamFocus) SUI.mainSelector.visible = false;\r\n }\r\n else {\r\n SUI.infoNode.visible = false;\r\n }\r\n\r\n if (SUI.mainSelector.visible && ATON.VRoadcast._bStreamFocus){\r\n let ss = SUI._selectorRad * (1.0 + (Math.cos(ATON._clock.elapsedTime*10.0) * 0.2) );\r\n SUI.mainSelector.scale.set(ss,ss,ss);\r\n }\r\n\r\n};\r\n\r\nexport default SUI;","/*\r\n ATON Avatar Class\r\n used in VRoadcast system\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\nimport Node from \"./ATON.node.js\";\r\n\r\nexport default class Avatar extends Node {\r\n\r\nconstructor(uid){\r\n super(undefined /*uid*/, ATON.NTYPES.UI);\r\n\r\n this.userid = uid;\r\n this.username = undefined; //\"User #\"+uid;\r\n this.message = \"...\";\r\n \r\n //this.bTalking = false;\r\n\r\n //this._auTalk = undefined;\r\n\r\n // Positional audio (talk)\r\n this._auTalk = new THREE.PositionalAudio( ATON.AudioHub._listener );\r\n this._auTalk.setRefDistance(30.0);\r\n this.add(this._auTalk); // move with avatar\r\n\r\n this._bPlayingAudio = false;\r\n this._auChunks = [];\r\n\r\n this._tStateCall = -1.0;\r\n //this._tStateDur = 0.1;\r\n this._tProgress = 0.0;\r\n\r\n // Focal point\r\n this._tFocCall = -1.0;\r\n this._currFocusPos = new THREE.Vector3();\r\n this._tgtFocusPos = undefined;\r\n\r\n this._currState = {};\r\n this._currState.position = new THREE.Vector3();\r\n this._currState.quaternion = new THREE.Quaternion();\r\n\r\n this._tgtState = undefined;\r\n\r\n //console.log(this);\r\n\r\n this.realize();\r\n}\r\n\r\nsetTalkDistance(r){\r\n if (r > 0.0) this._auTalk.setRefDistance(r);\r\n}\r\n\r\ngetAvatarMaterialByUID(uid){\r\n //if (uid === undefined) return 0;\r\n\r\n let avaMats = ATON.MatHub.materials.avatars;\r\n let mi = (uid % avaMats.length); //uid? (uid % avaMats.length) : 0;\r\n \r\n return avaMats[mi];\r\n}\r\n\r\nrealize(){\r\n // build minimal representation\r\n let g = new THREE.SphereGeometry( 0.2, 16, 16 );\r\n\r\n this.usermaterial = this.getAvatarMaterialByUID(this.userid);\r\n\r\n let smesh = new THREE.Mesh( g, this.usermaterial );\r\n\r\n this.usermeshnode = ATON.createUINode();\r\n this.usermeshnode.add(smesh);\r\n this.usermeshnode.setMaterial(this.usermaterial);\r\n\r\n // CHECK / FIXME: this is to avoid cloning of the same mesh when using same representation for all avatars\r\n this.usermeshnode.setCloneOnLoadHit(false);\r\n\r\n // Talk UI\r\n this.userauinode = new THREE.Sprite( ATON.VRoadcast.uspritemats[this.userid % ATON.VRoadcast.uspritemats.length] );\r\n this.userauinode.position.set(0,0,0);\r\n this.userauinode.visible = false;\r\n\r\n // Focus\r\n this.userfpnode = new THREE.Sprite( ATON.VRoadcast.ufocmats[this.userid % ATON.VRoadcast.ufocmats.length] );\r\n this.userfpnode.position.set(0,0,0);\r\n //this.userfpnode.scale.set(10,10,10);\r\n this.userfpnode.visible = false;\r\n\r\n // Build Label\r\n this.userlabelnode = ATON.createUINode();\r\n this.labelcontainer = new ThreeMeshUI.Block({\r\n width: 0.7,\r\n height: 0.25,\r\n padding: 0.03,\r\n borderRadius: 0.05,\r\n //backgroundColor: ATON.VRoadcast.ucolorsdark[this.userid % ATON.VRoadcast.ucolorsdark.length],\r\n backgroundColor: ATON.MatHub.colors.black,\r\n\r\n fontFamily: ATON.PATH_RES+\"fonts/custom-msdf.json\", //ATON.PATH_MODS+'three-mesh-ui/examples/assets/Roboto-msdf.json',\r\n fontTexture: ATON.PATH_RES+\"fonts/custom.png\" //ATON.PATH_MODS+'three-mesh-ui/examples/assets/Roboto-msdf.png',\r\n\r\n //alignContent: 'right', // could be 'center' or 'left'\r\n //justifyContent: 'end', // could be 'center' or 'start'\r\n });\r\n\r\n this.userlabelnode.position.y = 0.4;\r\n this.userlabelnode.add(this.labelcontainer);\r\n\r\n // username text\r\n this.usernametext = new ThreeMeshUI.Text({ \r\n content: \"User #\"+this.userid,\r\n fontSize: 0.09,\r\n //fontColor: ATON.MatHub.colors.white\r\n fontColor: ATON.VRoadcast.ucolors[this.userid % ATON.VRoadcast.ucolors.length]\r\n });\r\n this.usernametext.position.y = 0.0;\r\n\r\n // message text\r\n this.usermessagetext = new ThreeMeshUI.Text({ \r\n content: \"\\nHello World!\",\r\n fontSize: 0.03,\r\n fontColor: ATON.MatHub.colors.white\r\n });\r\n this.usermessagetext.position.y = -0.03;\r\n\r\n this.labelcontainer.add(this.usernametext);\r\n this.labelcontainer.add(this.usermessagetext);\r\n \r\n this.add(this.usermeshnode);\r\n this.add(this.userlabelnode);\r\n this.add(this.userauinode);\r\n\r\n //this.add(this.userfpnode);\r\n \r\n // Focus is centralized for better location accuracy\r\n if (ATON.VRoadcast._focNodes[this.userid] === undefined){\r\n ATON.VRoadcast._focNodes[this.userid] = this.userfpnode;\r\n ATON.VRoadcast.focGroup.add( this.userfpnode );\r\n }\r\n};\r\n\r\n// TODO:\r\ndestroy(){\r\n if (this.usermaterial) this.usermaterial.dispose();\r\n if (this.usermeshnode) this.usermeshnode.dispose();\r\n if (this.userauinode) this.userauinode.dispose();\r\n\r\n if (this.userfpnode) this.userfpnode.dispose();\r\n if (ATON.VRoadcast._focNodes[this.userid]) ATON.VRoadcast._focNodes[this.userid].dispose();\r\n\r\n if (this.userlabelnode) this.userlabelnode.dispose();\r\n if (this.labelcontainer) this.labelcontainer.dispose();\r\n if (this.usernametext) this.usernametext.dispose();\r\n if (this.usermessagetext) this.usermessagetext.dispose();\r\n\r\n this.dispose();\r\n}\r\n\r\n// Loads custom avatar representation (3D model)\r\nloadRepresentation(url){\r\n let A = this;\r\n\r\n if (A.usermeshnode.children[0] !== undefined){\r\n A.usermeshnode.remove(A.usermeshnode.children[0]);\r\n }\r\n\r\n A.usermeshnode.load(url); //.setMaterial(A.usermaterial);\r\n\r\n return this;\r\n}\r\n\r\nsetUsername(username){\r\n this.username = username;\r\n\r\n this.usernametext.set({ \r\n content: username\r\n });\r\n\r\n return this;\r\n}\r\n\r\ngetUsername(){\r\n if (this.userid === undefined) return undefined;\r\n if (this.username === undefined) return \"User #\"+this.userid;\r\n return this.username;\r\n}\r\n\r\nsetMessage(msg){\r\n this.message = msg;\r\n\r\n // TODO: check for text length\r\n this.usermessagetext.set({ \r\n content: \"\\n\"+msg\r\n });\r\n\r\n return this;\r\n}\r\n\r\nsetTalkVolume(vol){\r\n if (vol === undefined){\r\n this.userauinode.visible = false;\r\n return;\r\n }\r\n if (vol > 0){\r\n this.userauinode.visible = true;\r\n let v = 0.1 + (vol * 0.03);\r\n this.userauinode.scale.set(v,v,v);\r\n }\r\n else this.userauinode.visible = false;\r\n}\r\n\r\nhideFocalPoint(){\r\n this.userfpnode.visible = false;\r\n}\r\n\r\nrequestFocus(fp){\r\n if (this._tFocCall >= 0.0) return; // already requested\r\n\r\n this._tFocCall = ATON._clock.elapsedTime;\r\n\r\n this._currFocusPos.copy(this.userfpnode.position);\r\n\r\n this._tgtFocusPos = new THREE.Vector3( parseFloat(fp[0]), parseFloat(fp[1]), parseFloat(fp[2]));\r\n this._tgtFocusRad = parseFloat(fp[3])*2.0;\r\n\r\n this.userfpnode.scale.set(this._tgtFocusRad,this._tgtFocusRad,this._tgtFocusRad);\r\n\r\n this.userfpnode.visible = true;\r\n}\r\n\r\nhandleFocusTransition(){\r\n if (this._tFocCall < 0.0) return;\r\n\r\n let D = ATON.VRoadcast.USER_STATE_FREQ; //this._tStateDur;\r\n\r\n let t = (ATON._clock.elapsedTime - this._tFocCall) / D;\r\n\r\n // End\r\n if (t >= 1.0){\r\n this._tFocCall = -1.0;\r\n\r\n this.userfpnode.position.copy(this._tgtFocusPos);\r\n this.userfpnode.scale.set(this._tgtFocusRad,this._tgtFocusRad,this._tgtFocusRad);\r\n \r\n this.userfpnode.visible = true;\r\n\r\n //console.log(this.userfpnode.position);\r\n\r\n return;\r\n }\r\n\r\n this.userfpnode.position.lerpVectors(this._currFocusPos, this._tgtFocusPos, t);\r\n\r\n //let s = this._tgtFocusRad;\r\n //this.userfpnode.scale.set(s,s,s);\r\n this.userfpnode.visible = true;\r\n\r\n //console.log(this.userfpnode.position);\r\n}\r\n\r\nrequestStateTransition(S){\r\n if (this._tStateCall >= 0.0) return; // already requested\r\n\r\n this._tStateCall = ATON._clock.elapsedTime;\r\n\r\n this._currState.position.copy(this.position);\r\n this._currState.quaternion.copy(this.quaternion);\r\n\r\n this._tgtState = S;\r\n \r\n //this._sDistance = this.position.distanceTo(S.position);\r\n}\r\n\r\nhandleStateTransition(){\r\n if (this._tStateCall < 0.0) return;\r\n\r\n let D = ATON.VRoadcast.USER_STATE_FREQ; //this._tStateDur;\r\n\r\n if (D <= 0.0) this._tProgress = 1.0;\r\n else this._tProgress = (ATON._clock.elapsedTime - this._tStateCall) / D;\r\n\r\n let cs = this._currState;\r\n let ts = this._tgtState;\r\n\r\n // End\r\n if (this._tProgress >= 1.0){\r\n this._tStateCall = -1.0;\r\n\r\n this.position.copy(ts.position);\r\n //this.quaternion.copy(ts.quaternion);\r\n this.usermeshnode.quaternion.copy(ts.quaternion);\r\n\r\n return;\r\n }\r\n\r\n this.position.lerpVectors(cs.position, ts.position, this._tProgress);\r\n this.usermeshnode.quaternion.slerp(ts.quaternion, this._tProgress);\r\n //THREE.Quaternion.slerp( cs.quaternion, ts.quaternion, this.usermeshnode.quaternion, this._tProgress);\r\n}\r\n\r\nupdate(){\r\n this.handleStateTransition();\r\n if (this.userfpnode.visible){\r\n this.handleFocusTransition();\r\n\r\n let s = this.userfpnode.scale.x;\r\n if (s>0.001) this.userfpnode.scale.set(s*0.99,s*0.99,s*0.99);\r\n else this.userfpnode.visible = false;\r\n }\r\n\r\n let cam = ATON.Nav._camera;\r\n let eye = ATON.Nav._currPOV.pos;\r\n if (cam === undefined || eye === undefined) return;\r\n\r\n //this.userlabelnode.lookAt( eye );\r\n\r\n //this.userlabelnode.setRotationFromMatrix(cam.matrix); // quaternion.setFromRotationMatrix( cam.matrix );\r\n //this.userlabelnode.rotation.copy(cam.rotation);\r\n\r\n this.userlabelnode.orientToCamera(); //quaternion.copy( ATON.Nav._qOri );\r\n\r\n // Talk UI\r\n //this._handleTalk();\r\n\r\n let avol = this.userauinode.scale.x;\r\n avol *= 0.99; // shrinking rate\r\n\r\n if (avol > 0.01) this.userauinode.scale.set(avol, avol, avol);\r\n else this.userauinode.visible = false;\r\n\r\n/*\r\n this.userlabelnode.rotation.y = Math.atan2(\r\n ( cam.position.x - this.userlabelnode.position.x ),\r\n ( cam.position.z - this.userlabelnode.position.z )\r\n );\r\n*/\r\n //this.userlabelnode.matrix.copy( cam.matrix );\r\n}\r\n\r\n_handleTalk(){\r\n if (this._bPlayingAudio) return;\r\n if (this._auChunks.length < 1) return;\r\n\r\n let d = this._auChunks.shift();\r\n\r\n let au = new Audio();\r\n au.src = d.data;\r\n\r\n au.play();\r\n this._bPlayingAudio = true;\r\n\r\n au.onended = ()=>{\r\n this._bPlayingAudio = false;\r\n //console.log(\"finished playing chunk\");\r\n };\r\n\r\n //this.setTalkVolume(d.volume);\r\n this.setTalkVolume(5.0);\r\n}\r\n\r\n\r\n};","/*\r\n ATON VRoadcast\r\n real-time collaborative networking\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\nimport Avatar from \"./ATON.avatar.js\";\r\n\r\n/**\r\nATON VRoadcast component\r\n@namespace VRoadcast\r\n*/\r\nlet VRoadcast = {};\r\n\r\nVRoadcast.USER_STATE_FREQ = 0.25; // sec\r\nVRoadcast.REPLICATED_EVT = \"EREP\";\r\n\r\n// Thresholds state sending\r\nVRoadcast.THRES_STATE_POS = 0.01;\r\nVRoadcast.THRES_STATE_ORI = 0.08; // radians\r\n\r\nVRoadcast.Avatar = Avatar;\r\n\r\n\r\n/**\r\nInitialize the component\r\n*/\r\nVRoadcast.init = ()=>{\r\n VRoadcast.address = window.location.origin;\r\n\r\n VRoadcast.initMaterials();\r\n\r\n VRoadcast.socket = undefined;\r\n VRoadcast._connected = false;\r\n\r\n VRoadcast._username = undefined;\r\n\r\n VRoadcast.uid = undefined; // my userID (0,1,....)\r\n VRoadcast._bStreamFocus = false; // stream focal point\r\n \r\n VRoadcast._numUsers = 1;\r\n\r\n VRoadcast.avatarList = [];\r\n\r\n VRoadcast.avaGroup = ATON.createUINode(\"avatars\"); // holds all avatars representations\r\n VRoadcast.avaGroup.attachToRoot();\r\n\r\n VRoadcast.focGroup = ATON.createUINode(\"focus\"); // holds all avatars focal points\r\n VRoadcast.focGroup.attachTo(VRoadcast.avaGroup);\r\n VRoadcast._focNodes = [];\r\n\r\n // send own state with given freq\r\n VRoadcast.bSendState = true;\r\n window.setInterval( VRoadcast.sendState, VRoadcast.USER_STATE_FREQ*1000.0 );\r\n VRoadcast._lastStateSent = undefined;\r\n\r\n VRoadcast._bShowAvaG = true;\r\n\r\n console.log(\"VRoadcast initialized\");\r\n VRoadcast.enableChatLog();\r\n};\r\n\r\nVRoadcast.enableChatLog = ()=>{\r\n VRoadcast._elChat = $(\"
    \").text(\"\");\r\n};\r\n\r\nVRoadcast.getNumUsers = ()=>{\r\n return VRoadcast._numUsers;\r\n};\r\n\r\n// Register materials (avatars/users)\r\nVRoadcast.initMaterials = ()=>{\r\n\r\n VRoadcast.ucolors = [];\r\n VRoadcast.ucolors.push( new THREE.Color(1,0,0) );\r\n VRoadcast.ucolors.push( new THREE.Color(1,1,0) );\r\n VRoadcast.ucolors.push( new THREE.Color(0,1,0) );\r\n VRoadcast.ucolors.push( new THREE.Color(0,1,1) );\r\n VRoadcast.ucolors.push( new THREE.Color(0,0,1) );\r\n VRoadcast.ucolors.push( new THREE.Color(1,0,1) );\r\n\r\n VRoadcast.ucolorsdark = [];\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.2,0.0,0.0) );\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.2,0.2,0.0) );\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.0,0.2,0.0) );\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.0,0.2,0.2) );\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.0,0.0,0.2) );\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.2,0.0,0.2) );\r\n\r\n VRoadcast.ucolorhex = [];\r\n VRoadcast.ucolorhex.push(\"#F00\");\r\n VRoadcast.ucolorhex.push(\"#FF0\");\r\n VRoadcast.ucolorhex.push(\"#0F0\");\r\n VRoadcast.ucolorhex.push(\"#0FF\");\r\n VRoadcast.ucolorhex.push(\"#00F\");\r\n VRoadcast.ucolorhex.push(\"#F0F\");\r\n\r\n let MM = ATON.MatHub.materials;\r\n MM.avatars = [];\r\n\r\n let mat = ATON.MatHub.materials.defUI.clone();\r\n mat.uniforms.color.value = VRoadcast.ucolors[0];\r\n/*\r\n let mat = new THREE.MeshBasicMaterial({\r\n color: VRoadcast.ucolors[0], \r\n transparent: true, \r\n opacity: 0.4, \r\n depthWrite: false,\r\n flatShading: true\r\n });\r\n*/\r\n MM.avatars.push(mat);\r\n\r\n for (let c=1; c{\r\n if (!VRoadcast._connected) return;\r\n let sock = VRoadcast.socket;\r\n\r\n if (sock) sock.emit(VRoadcast.REPLICATED_EVT, {e: evtname, d: data});\r\n //else ATON.on(\"VRC_Connected\", ()=>{ sock.on(evtname, onReceive); });\r\n};\r\n\r\n/**\r\nSubscribe to a given network event, through given handler\r\n@param {string} evtname - the event name\r\n@param {function} handler - network event handler (how we handle incoming event)\r\n\r\n@example\r\nATON.VRoadcast.on(\"test\", function(data){ console.log(\"Received: \"+data); });\r\n*/\r\nVRoadcast.on = (evtname, handler)=>{\r\n if (handler === undefined) return;\r\n\r\n let evhNetwork = ATON.EventHub.evNetwork;\r\n\r\n if (evhNetwork[evtname] === undefined) evhNetwork[evtname] = []; // First time (event not registered)\r\n evhNetwork[evtname].push(handler);\r\n};\r\n\r\n/**\r\nReturn true if VRoadcast is connected to the service\r\n@returns {boolean}\r\n*/\r\nVRoadcast.isConnected = ()=>{\r\n if (VRoadcast.socket === undefined) return false;\r\n return VRoadcast._connected;\r\n};\r\n\r\n/**\r\nReturn true if we have a VRoadcast ID assigned\r\n@returns {boolean}\r\n*/\r\nVRoadcast.hasID = ()=>{\r\n if (VRoadcast.uid === undefined) return false;\r\n return true;\r\n};\r\n\r\n/**\r\nUtility for server-side logging\r\n@param {string} d - string data to be logged\r\n*/\r\nVRoadcast.log = (d)=>{\r\n if (!VRoadcast._connected) return;\r\n let sock = VRoadcast.socket;\r\n\r\n if (sock) sock.emit(\"LOG\", d);\r\n};\r\n\r\n/**\r\nRequest to join a given VRoadcast session (typically, the scene ID)\r\n@param {string} ssid - the session id (room or scene ID)\r\n@example\r\nATON.VRoadcast.joinSession(\"testscene\");\r\n*/\r\nVRoadcast.joinSession = (ssid)=>{\r\n if (!VRoadcast.socket) return;\r\n if (ssid === undefined) ssid = ATON.SceneHub.currID;\r\n\r\n if (ssid === undefined){\r\n console.log(\"VRC ERROR: current session ID is undefined\");\r\n return;\r\n }\r\n\r\n console.log(\"Joining VRC session \"+ssid+\"...\");\r\n VRoadcast.socket.emit(\"SENTER\", ssid );\r\n};\r\n\r\nVRoadcast.requestSceneState = ()=>{\r\n if (!VRoadcast.socket) return;\r\n\r\n VRoadcast.socket.emit(\"SSTATE\");\r\n};\r\n\r\nVRoadcast.setAvatarsVisibility = (b)=>{\r\n VRoadcast._bShowAvaG = b;\r\n\r\n if (b) VRoadcast.avaGroup.show();\r\n else VRoadcast.avaGroup.hide();\r\n};\r\n\r\n/**\r\nConnect to VRoadcast service\r\n@param {string} address - the address of the service (optional). Default is same server where main service is running\r\n@example\r\nATON.VRoadcast.connect();\r\n*/\r\nVRoadcast.connect = (address)=>{\r\n if (VRoadcast._connected) return;\r\n if (address) VRoadcast.address = address;\r\n\r\n let opts = {};\r\n\r\n // Secure connection\r\n if (window.location.protocol === \"https:\"){\r\n opts.path = '/svrc/socket.io';\r\n opts.secure = true;\r\n opts.rejectUnauthorized = false;\r\n //opts.transports = ['websocket']; \r\n //opts.upgrade = false \r\n }\r\n else {\r\n opts.path = '/vrc/socket.io';\r\n //opts.transports = ['websocket'];\r\n //opts.upgrade = false;\r\n }\r\n\r\n VRoadcast.socket = io.connect(VRoadcast.address, opts); //, { 'force new connection': true });\r\n\r\n if (VRoadcast.socket === undefined) return;\r\n VRoadcast._connected = VRoadcast.socket.connected;\r\n\r\n VRoadcast._registerSocketHandlers();\r\n};\r\n\r\nVRoadcast.disconnect = ()=>{\r\n if (VRoadcast.socket === undefined) return;\r\n\r\n VRoadcast._numUsers = 1;\r\n\r\n VRoadcast.socket.disconnect();\r\n VRoadcast._connected = false;\r\n};\r\n\r\n\r\nVRoadcast._onConnected = ()=>{\r\n //\r\n};\r\n\r\nVRoadcast.setUsername = (username)=>{\r\n VRoadcast._username = username;\r\n if (VRoadcast.socket === undefined) return;\r\n if (VRoadcast.uid === undefined) return;\r\n\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"Your username is now: \"+username+\"
    \");\r\n VRoadcast.socket.emit(\"UNAME\", username);\r\n};\r\nVRoadcast.setMessage = (msg)=>{\r\n VRoadcast._msg = msg;\r\n if (VRoadcast.socket === undefined) return;\r\n if (VRoadcast.uid === undefined) return;\r\n\r\n if (VRoadcast._elChat){\r\n VRoadcast._elChat.append(\"YOU: \"+msg+\"
    \");\r\n VRoadcast._elChat.scrollTop(VRoadcast._elChat.scrollHeight);\r\n }\r\n\r\n VRoadcast.socket.emit(\"UMSG\", msg);\r\n};\r\n\r\n\r\n// Handle incoming server msgs\r\nVRoadcast._registerSocketHandlers = ()=>{\r\n\r\n // We connected to server\r\n VRoadcast.socket.on('connect', ()=>{\r\n VRoadcast._connected = true;\r\n\r\n // If we have a valid Scene ID join corresponding session\r\n if (ATON.SceneHub.currID !== undefined){\r\n VRoadcast.joinSession();\r\n }\r\n \r\n console.log(\"Connected to VRC service!\");\r\n ATON.fireEvent(\"VRC_Connected\");\r\n\r\n VRoadcast._onConnected();\r\n });\r\n\r\n VRoadcast.socket.on('disconnect', ()=>{\r\n VRoadcast._connected = false;\r\n VRoadcast.uid = undefined;\r\n\r\n VRoadcast.avaGroup.hide();\r\n\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"YOU disconnected from VRoadcast service
    \");\r\n\r\n console.log(\"VRC disconnected!\");\r\n ATON.fireEvent(\"VRC_Disconnected\");\r\n });\r\n\r\n // Incoming replicated event\r\n VRoadcast.socket.on(VRoadcast.REPLICATED_EVT, (data)=>{\r\n let evtname = data.e;\r\n let d = data.d;\r\n\r\n let ehList = ATON.EventHub.evNetwork[evtname];\r\n ATON.EventHub.executeHandlers(ehList, d);\r\n });\r\n\r\n VRoadcast.socket.on('ID', (data)=>{\r\n console.log(\"Your ID is \" + data);\r\n VRoadcast.uid = data;\r\n\r\n if (VRoadcast._bShowAvaG) VRoadcast.avaGroup.show();\r\n\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"Your ID is #\"+data+\"
    \");\r\n\r\n // Request scene state\r\n VRoadcast.requestSceneState();\r\n\r\n ATON.fireEvent(\"VRC_IDassigned\", data);\r\n });\r\n\r\n VRoadcast.socket.on('SSTATE', (data)=>{\r\n VRoadcast._numUsers = data.numUsers;\r\n console.log(\"Num. users: \"+VRoadcast._numUsers);\r\n\r\n ATON.fireEvent(\"VRC_SceneState\", data);\r\n });\r\n\r\n VRoadcast.socket.on('UENTER', (data)=>{\r\n let uid = data;\r\n //if (uid === VRoadcast.uid) return; // myself\r\n\r\n console.log(\"User #\" +uid+\" entered the scene\");\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"User #\"+uid+\" entered the scene
    \");\r\n\r\n VRoadcast.touchAvatar(uid);\r\n \r\n //VRoadcast._numUsers++;\r\n VRoadcast.requestSceneState();\r\n ATON.fireEvent(\"VRC_UserEnter\", uid);\r\n });\r\n\r\n VRoadcast.socket.on('ULEAVE', (data)=>{\r\n let uid = data;\r\n if (uid === undefined) return;\r\n \r\n let A = VRoadcast.avatarList[uid];\r\n if (A) A.hide();\r\n //VRoadcast.destroyAvatar(uid);\r\n\r\n // TODO: hide also focus\r\n\r\n console.log(\"User #\" +uid+\" left the scene\");\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"User #\"+uid+\" left the scene
    \");\r\n\r\n //if (VRoadcast._numUsers>1) VRoadcast._numUsers--;\r\n VRoadcast.requestSceneState();\r\n ATON.fireEvent(\"VRC_UserLeave\", uid);\r\n });\r\n\r\n VRoadcast.socket.on('USTATE', (data)=>{\r\n if (!VRoadcast._bShowAvaG) return;\r\n\r\n let S = VRoadcast.decodeState(data);\r\n\r\n //console.log(data);\r\n\r\n let uid = S.userid;\r\n let A = VRoadcast.touchAvatar(uid);\r\n\r\n //A.position.copy(S.position);\r\n //A.quaternion.copy(S.quaternion);\r\n \r\n A.requestStateTransition(S);\r\n //A.hideFocalPoint();\r\n });\r\n\r\n VRoadcast.socket.on('UFOCUS', (data)=>{\r\n let uid = data.uid;\r\n let fp = data.fp;\r\n\r\n let A = VRoadcast.touchAvatar(uid);\r\n\r\n A.requestFocus(fp);\r\n });\r\n\r\n VRoadcast.socket.on('UNAME', (data)=>{\r\n let uid = data.uid;\r\n let uname = data.name;\r\n\r\n if (uid === undefined) return;\r\n\r\n let A = VRoadcast.touchAvatar(uid);\r\n A.setUsername(uname);\r\n\r\n console.log(\"User #\" +uid+\" changed username to: \"+uname);\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"User #\"+uid+\" changed username to: \"+uname+\"
    \");\r\n });\r\n\r\n VRoadcast.socket.on('UMSG', (data)=>{\r\n let uid = data.uid;\r\n let msg = data.msg;\r\n\r\n if (uid === undefined) return;\r\n\r\n let A = VRoadcast.touchAvatar(uid);\r\n A.setMessage(msg);\r\n\r\n console.log(\"User #\" +uid+\": \"+msg);\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"\"+A.getUsername()+\": \"+msg+\"
    \");\r\n });\r\n\r\n VRoadcast.socket.on('UTALK', (data)=>{\r\n let uid = data.uid;\r\n if (uid === undefined) return;\r\n\r\n let audioURL = data.audio;\r\n let A = VRoadcast.touchAvatar(uid);\r\n\r\n //A.setTalkVolume(data.vol);\r\n A.setTalkVolume(5.0);\r\n\r\n/*\r\n if (A._auTalk === undefined || A._auTalk === null){\r\n A._auTalk = new THREE.PositionalAudio( ATON.AudioHub._listener );\r\n A._auTalk.setRefDistance(50.0);\r\n A.add(A._auTalk);\r\n }\r\n else A._auTalk.stop();\r\n*/\r\n if (A._auTalk.isPlaying) A._auTalk.stop();\r\n\r\n ATON.AudioHub._loader.load( audioURL, (buffer)=>{\r\n A._auTalk.setBuffer( buffer );\r\n A._auTalk.setLoop( false );\r\n //A._auTalk.setVolume( 0.5 );\r\n //A._auTalk.setPlaybackRate(0.9);\r\n A._auTalk.play();\r\n });\r\n\r\n audioURL = null;\r\n \r\n/*\r\n //let newblob = new File([data.blob], \"blob\"+ATON.MediaRec.auExt, { type: ATON.MediaRec.auType });\r\n //let audioURL = window.URL.createObjectURL(newblob);\r\n \r\n if (A._auTalk === undefined){\r\n A._auTalk = new Audio();\r\n //A._auTalk.type = ATON.MediaRec.auType;\r\n }\r\n else {\r\n //A._auTalk.pause();\r\n A._auTalk.currentTime = 0; \r\n }\r\n\r\n A._auTalk.src = audioURL;\r\n A._auTalk.play();\r\n*/\r\n\r\n/*\r\n A._auChunks.push({\r\n data: audioURL,\r\n volume: data.vol\r\n });\r\n*/\r\n });\r\n};\r\n\r\n// Encode state\r\nVRoadcast.encodeState = (S)=>{\r\n if (!S) return;\r\n\r\n let A = new Float32Array(6); // make sufficient room\r\n A[0] = S.position.x;\r\n A[1] = S.position.y;\r\n A[2] = S.position.z;\r\n\r\n // Convert to byte array, we use last float storage (4 bytes)\r\n var binData = new Int8Array(A.buffer);\r\n\r\n binData[16] = (S.quaternion.x * 128.0);\r\n binData[17] = (S.quaternion.y * 128.0);\r\n binData[18] = (S.quaternion.z * 128.0);\r\n binData[19] = (S.quaternion.w * 128.0);\r\n\r\n binData[20] = S.userid;\r\n\r\n //binData[21] = parseInt(S.rank);\r\n\r\n //console.log(binData);\r\n return binData;\r\n}\r\n\r\n// Decode state\r\nVRoadcast.decodeState = (binData)=>{\r\n let S = {};\r\n let view = new Int8Array(binData);\r\n\r\n //S.userid = binData[20];\r\n S.userid = view[20];\r\n\r\n //console.log(view);\r\n\r\n // First decode quat\r\n S.quaternion = new THREE.Quaternion(\r\n view[16] / 128.0,\r\n view[17] / 128.0,\r\n view[18] / 128.0,\r\n view[19] / 128.0\r\n );\r\n\r\n // Now decode floats\r\n view = new Float32Array(binData);\r\n S.position = new THREE.Vector3(view[0],view[1],view[2]);\r\n //S.scale = A[3];\r\n\r\n/*\r\n // First decode quat\r\n S.quaternion = new THREE.Quaternion(\r\n binData[16] / 128.0,\r\n binData[17] / 128.0,\r\n binData[18] / 128.0,\r\n binData[19] / 128.0\r\n );\r\n\r\n // Now decode floats\r\n let a8 = new Int8Array(16);\r\n for (var i=0; i<16; i++) a8[i] = binData[i];\r\n let A = new Float32Array(a8.buffer);\r\n\r\n S.position = new THREE.Vector3(A[0],A[1],A[2]);\r\n\r\n //S.scale = A[3];\r\n*/\r\n return S;\r\n}\r\n\r\n\r\n// Update\r\nVRoadcast.update = ()=>{\r\n if (!VRoadcast._connected) return;\r\n\r\n // State interpolation\r\n for (let a=0; a{\r\n if (b === undefined) return;\r\n\r\n if (b){\r\n if (!VRoadcast._bStreamFocus){\r\n\r\n ATON.fireEvent(\"VRC_FocusStreamingStarted\");\r\n }\r\n\r\n VRoadcast._bStreamFocus = true;\r\n return;\r\n }\r\n else {\r\n if (VRoadcast._bStreamFocus){\r\n\r\n ATON.fireEvent(\"VRC_FocusStreamingStopped\");\r\n }\r\n\r\n // Restore selector radius\r\n let r = ATON.SUI._selectorRad;\r\n ATON.SUI.mainSelector.scale.set(r,r,r);\r\n\r\n VRoadcast._bStreamFocus = false;\r\n }\r\n};\r\n\r\nVRoadcast.sendState = ()=>{\r\n if (!VRoadcast.bSendState) return;\r\n if (VRoadcast.uid === undefined) return;\r\n if (!VRoadcast.socket || !VRoadcast._connected) return;\r\n \r\n let cpov = ATON.Nav._currPOV;\r\n if (!cpov) return;\r\n //console.log(cpov);\r\n\r\n // Focus streaming\r\n let fp = ATON.getSceneQueriedPoint();\r\n if (VRoadcast._bStreamFocus && fp !== undefined){\r\n //let F = new THREE.Vector3();\r\n let fx = (fp.x /*- cpov.pos.x*/).toPrecision(5);\r\n let fy = (fp.y /*- cpov.pos.y*/).toPrecision(5);\r\n let fz = (fp.z /*- cpov.pos.z*/).toPrecision(5);\r\n let r = ATON.SUI.getSelectorRadius().toPrecision(5);\r\n \r\n VRoadcast.socket.emit(\"UFOCUS\", [fx,fy,fz, r]);\r\n }\r\n\r\n // Compose state\r\n let S = {};\r\n S.position = new THREE.Vector3();\r\n S.quaternion = new THREE.Quaternion();\r\n\r\n S.position.copy(cpov.pos);\r\n S.quaternion.copy(ATON.Nav._qOri);\r\n S.userid = VRoadcast.uid;\r\n\r\n // Save bandwidth\r\n if (VRoadcast._lastStateSent !== undefined){\r\n let lastPos = VRoadcast._lastStateSent.position;\r\n let lastOri = VRoadcast._lastStateSent.quaternion;\r\n\r\n let dPos = lastPos.distanceToSquared(cpov.pos);\r\n let dOri = lastOri.angleTo(ATON.Nav._qOri);\r\n\r\n if ( dPos < VRoadcast.THRES_STATE_POS && dOri < VRoadcast.THRES_STATE_ORI) return;\r\n }\r\n\r\n // Encode and send\r\n let binData = VRoadcast.encodeState(S);\r\n VRoadcast.socket.emit(\"USTATE\", binData/*.buffer*/ );\r\n VRoadcast._lastStateSent = S;\r\n\r\n //console.log(\"State sent\");\r\n};\r\n\r\n\r\n// Avatars\r\nVRoadcast.getAvatar = (uid)=>{\r\n return VRoadcast.avatarList[uid];\r\n};\r\n\r\nVRoadcast.touchAvatar = (uid)=>{\r\n // First time\r\n if (VRoadcast.avatarList[uid] === undefined){\r\n let A = new VRoadcast.Avatar(uid);\r\n A.attachTo(VRoadcast.avaGroup);\r\n \r\n A.loadRepresentation(ATON.PATH_RES+\"models/vrc/head.gltf\");\r\n //console.log(VRoadcast.avaGroup);\r\n\r\n VRoadcast.avatarList[uid] = A;\r\n\r\n //console.log(VRoadcast.avatarList);\r\n //console.log(ATON.MatHub.materials.avatars);\r\n //console.log(A);\r\n \r\n //VRoadcast._numUsers++;\r\n //ATON.fireEvent(\"VRC_UserEnter\", uid);\r\n }\r\n\r\n let A = VRoadcast.avatarList[uid];\r\n\r\n // Reclaim of previously used slot\r\n if (!A.visible){\r\n VRoadcast._numUsers++;\r\n ATON.fireEvent(\"VRC_UserEnter\", uid);\r\n }\r\n\r\n if (VRoadcast._bShowAvaG) A.show();\r\n\r\n return A;\r\n}\r\n\r\nVRoadcast.destroyAvatar = (uid)=>{\r\n let A = VRoadcast.avatarList[uid];\r\n if (A === undefined) return;\r\n\r\n A.destroy();\r\n};\r\n\r\nVRoadcast.clearAllAvatars = ()=>{\r\n for (let i in VRoadcast.avatarList){\r\n let A = VRoadcast.avatarList[i];\r\n A.hide();\r\n //A.dispose();\r\n }\r\n};\r\n\r\nexport default VRoadcast;","/*\r\n ATON Semantic shapes factory\r\n TODO: rename in SemHub\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Semantic Factory\r\n@namespace SemFactory\r\n*/\r\nlet SemFactory = {};\r\n\r\nSemFactory.FLOAT_PREC = 5;\r\n\r\nSemFactory.init = ()=>{\r\n SemFactory.bConvexBuilding = false;\r\n SemFactory.convexPoints = [];\r\n //SemFactory.convexMeshes = [];\r\n SemFactory.convexNode = undefined; // keeps track of current convex semnode\r\n SemFactory.currConvexMesh = undefined;\r\n \r\n // Temp sem node to hold developing convex mesh\r\n SemFactory.currSemNode = ATON.createSemanticNode();\r\n SemFactory.currSemNode.disablePicking();\r\n SemFactory.currSemNode.attachToRoot();\r\n\r\n SemFactory.resetMaterial();\r\n\r\n SemFactory._numShapes = 0; // counter of shapes produced\r\n};\r\n\r\n\r\n// Current material\r\nSemFactory.resetMaterial = ()=>{\r\n SemFactory.currMaterial = ATON.MatHub.getMaterial(\"semanticShapeHL\"); // current sem material we are using. Was \"semanticShape\"\r\n};\r\n\r\nSemFactory.setMaterial = (m)=>{\r\n if (m === undefined) return;\r\n SemFactory.currMaterial = m;\r\n};\r\n\r\n\r\n// Convex shapes\r\n// NOTE: if semid exists, add mesh under the same id\r\nSemFactory.addConvexPoint = (/*semid,*/ p)=>{\r\n if (p === undefined) return false;\r\n\r\n if (SemFactory.convexPoints.length>0){\r\n let pp = SemFactory.convexPoints[SemFactory.convexPoints.length-1];\r\n if (p.equals(pp)) return false;\r\n }\r\n\r\n SemFactory.convexPoints.push(p);\r\n let numPoints = SemFactory.convexPoints.length;\r\n\r\n // Spatial UI\r\n let M = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.getMaterial(\"semanticShapeEdit\"));\r\n M.position.copy(p);\r\n M.scale.set(0.001,0.001,0.001);\r\n ATON.SUI.gPoints.add( M );\r\n\r\n if (numPoints < 4) return false;\r\n\r\n // lets build convex shape\r\n let geom = new THREE.ConvexGeometry( SemFactory.convexPoints ); // new THREE.ConvexBufferGeometry( SemFactory.convexPoints );\r\n let semesh = new THREE.Mesh( geom, ATON.MatHub.getMaterial(\"semanticShapeEdit\") );\r\n\r\n //let numMeshes = SemFactory.convexMeshes.length;\r\n\r\n // First time: create semnode and add it to current sem group\r\n if (!SemFactory.bConvexBuilding){\r\n //if (semid === undefined) semid = \"sem\"+SemFactory._numShapes;\r\n\r\n //SemFactory.convexNode = ATON.getSemanticNode(semid) || ATON.createSemanticNode(semid);\r\n //SemFactory.convexNode = ATON.createSemanticNode();\r\n //SemFactory.convexNode.add(semesh);\r\n SemFactory.currSemNode.add(semesh);\r\n \r\n // Store\r\n semesh.userData._convexPoints = [];\r\n for (let i=0; i{\r\n let numPoints = SemFactory.convexPoints.length;\r\n if (numPoints === 0) return;\r\n\r\n //if (!SemFactory.bConvexBuilding) return;\r\n\r\n SemFactory.convexPoints.pop();\r\n\r\n if (SemFactory.currConvexMesh){\r\n let udMesh = SemFactory.currConvexMesh.userData;\r\n if (udMesh._convexPoints) udMesh._convexPoints.pop();\r\n }\r\n};\r\n\r\nSemFactory.stopCurrentConvex = ()=>{\r\n SemFactory.convexPoints = [];\r\n SemFactory.bConvexBuilding = false;\r\n\r\n SemFactory.currSemNode.removeChildren();\r\n ATON.SUI.gPoints.removeChildren();\r\n};\r\n\r\nSemFactory.getCurrentConvexShape = ()=>{\r\n return SemFactory.currSemNode;\r\n};\r\n\r\nSemFactory.isBuildingShape = ()=>{\r\n if (SemFactory.convexPoints.length>0) return true;\r\n\r\n return false;\r\n};\r\n\r\nSemFactory.completeConvexShape = (semid)=>{\r\n SemFactory.convexPoints = [];\r\n SemFactory.bConvexBuilding = false;\r\n\r\n //if (SemFactory.convexNode === undefined) return undefined;\r\n //if (SemFactory.currConvexMesh === undefined) return undefined;\r\n if (SemFactory.currSemNode === undefined) return;\r\n\r\n if (semid === undefined) semid = \"sem\"+SemFactory._numShapes;\r\n\r\n let S = ATON.getSemanticNode(semid) || ATON.createSemanticNode(semid);\r\n \r\n let meshape = SemFactory.currSemNode.children[0];\r\n \r\n ATON.SUI.addSemIcon(semid, meshape);\r\n\r\n S.add( meshape );\r\n S.setMaterial( /*SemFactory.currMaterial*/ATON.MatHub.materials.semanticShape);\r\n S.setDefaultAndHighlightMaterials(/*SemFactory.currMaterial*/ ATON.MatHub.materials.semanticShape, /*ATON.MatHub.materials.semanticShapeHL*/SemFactory.currMaterial);\r\n S.enablePicking();\r\n\r\n SemFactory.currSemNode.removeChildren();\r\n\r\n/*\r\n SemFactory.convexNode = ATON.getSemanticNode(semid) || ATON.createSemanticNode(semid);\r\n SemFactory.convexNode.add(SemFactory.currConvexMesh);\r\n\r\n SemFactory.convexNode.setMaterial( SemFactory.currMaterial );\r\n SemFactory.convexNode.setDefaultMaterial(SemFactory.currMaterial);\r\n SemFactory.convexNode.enablePicking();\r\n*/\r\n SemFactory._numShapes++;\r\n\r\n //console.log(SemFactory.convexNode);\r\n //console.log(SemFactory.convexNode.userData._convexPoints);\r\n\r\n //return SemFactory.convexNode;\r\n\r\n // Spatial UI\r\n ATON.SUI.gPoints.removeChildren();\r\n ATON._bqSem = true;\r\n\r\n return S;\r\n};\r\n\r\nSemFactory.createConvexShape = (semid, points)=>{\r\n let geom = new THREE.ConvexGeometry( points ); // CHECK: it was THREE.ConvexBufferGeometry( points );\r\n let semesh = new THREE.Mesh( geom, /*SemFactory.currMaterial*/ATON.MatHub.materials.semanticShape );\r\n\r\n semesh.userData._convexPoints = [];\r\n for (let i=0; i{\r\n if (ATON._queryDataScene === undefined) return false;\r\n\r\n if (offset === undefined) offset = 0.02;\r\n\r\n let p = ATON._queryDataScene.p;\r\n let eye = ATON.Nav.getCurrentEyeLocation();\r\n/*\r\n let n = ATON._queryDataScene.n;\r\n p.x += (n.x * offset);\r\n p.y += (n.y * offset);\r\n p.z += (n.z * offset);\r\n*/\r\n p.lerpVectors(p, eye, offset);\r\n\r\n SemFactory.addConvexPoint(p);\r\n return p;\r\n};\r\n\r\n\r\n// Spherical semantic shapes\r\n// NOTE: if semid exists, add mesh under the same id\r\nSemFactory.createSphere = (semid, location, radius)=>{\r\n if (location === undefined) return undefined;\r\n if (radius === undefined) return undefined;\r\n\r\n/*\r\n if (ATON.getSemanticNode(semid)){\r\n console.log(\"ERROR SemFactory: semantic node \"+semid+\" already exists.\");\r\n return false;\r\n }\r\n*/\r\n if (semid === undefined) semid = \"sem\"+SemFactory._numShapes;\r\n\r\n let S = ATON.getOrCreateSemanticNode(semid);\r\n\r\n //let g = new THREE.SphereGeometry( 1.0, 16, 16 );\r\n let M = new THREE.Mesh( ATON.Utils.geomUnitSphere, /*SemFactory.currMaterial*/ATON.MatHub.materials.semanticShape );\r\n \r\n // Note: we add multiple spheres to the same node\r\n let sphere = new THREE.Object3D();\r\n sphere.position.copy(location);\r\n sphere.scale.set(radius, radius, radius);\r\n sphere.add(M);\r\n\r\n ATON.SUI.addSemIcon(semid, sphere);\r\n\r\n S.add( sphere );\r\n S.enablePicking();\r\n S.setDefaultAndHighlightMaterials(/*SemFactory.currMaterial*/ATON.MatHub.materials.semanticShape, SemFactory.currMaterial/*ATON.MatHub.materials.semanticShapeHL*/);\r\n\r\n //SemFactory.currParent.add( S );\r\n\r\n SemFactory._numShapes++;\r\n ATON._bqSem = true;\r\n\r\n return S;\r\n};\r\n\r\nSemFactory.createSurfaceSphere = (semid)=>{\r\n if (!ATON._queryDataScene) return undefined;\r\n\r\n let p = ATON._queryDataScene.p;\r\n let r = ATON.SUI.getSelectorRadius();\r\n\r\n return SemFactory.createSphere(semid, p,r);\r\n};\r\n\r\nSemFactory.deleteSemanticNode = (semid)=>{\r\n let S = ATON.getSemanticNode(semid);\r\n\r\n if (S === undefined) return false;\r\n S.removeChildren();\r\n\r\n if (ATON.SUI.gSemIcons === undefined) return true;\r\n\r\n for (let s in ATON.SUI.gSemIcons.children){\r\n let C = ATON.SUI.gSemIcons.children[s];\r\n if (C && C.name === semid) ATON.SUI.gSemIcons.removeChild(C);\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport default SemFactory;","/*\r\n ATON Front-end blueprint\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nGeneric front-end routines for ATON-based web-apps. \r\nA set of blueprints to facilitate or support creation of a front-end\r\n@namespace FE\r\n*/\r\nlet FE = {};\r\n\r\n// Semantic-shapes types\r\nFE.SEMSHAPE_SPHERE = 0;\r\nFE.SEMSHAPE_CONVEX = 1;\r\n\r\nFE.POPUP_DELAY = 300;\r\n\r\n/**\r\nInitialize Front-end\r\n*/\r\nFE.realize = ()=>{\r\n FE.PATH_RES_ICONS = ATON.PATH_RES+\"icons/\";\r\n\r\n FE._bPopup = false; // showing popup\r\n FE.popupBlurBG = 0; // blur 3D canvas on popup show (in pixels), 0 to disable\r\n \r\n FE._userAuth = {};\r\n\r\n FE._bControlLight = false;\r\n FE._bControlSelScale = false;\r\n FE._cLightDir = new THREE.Vector3();\r\n\r\n FE._auSemNode = undefined;\r\n FE._auSemNodePlaying = false;\r\n\r\n FE._bReqHome = false; // auto-compute home\r\n\r\n FE._vrcAddr = undefined;\r\n FE._bVRCsetup = false;\r\n\r\n FE.urlParams = new URLSearchParams(window.location.search);\r\n\r\n FE._uiSetupBase();\r\n\r\n // UI profiles\r\n FE._uiProfiles = {};\r\n FE._uiCurrProfile = undefined;\r\n\r\n FE._selRanges = [0.01, 50.0]; // 3D Selector ranges\r\n FE._selRefRadius = 0.5;\r\n\r\n ATON.realize();\r\n\r\n // Built-in events\r\n ATON.on(\"Fullscreen\", (b)=>{\r\n FE.uiSwitchButton(\"fullscreen\",b);\r\n });\r\n\r\n // built-in base front-end parameters\r\n let ddens = ATON.FE.urlParams.get('d');\r\n if (ddens && ddens>0.0) ATON.setDefaultPixelDensity(ddens);\r\n\r\n let dynd = ATON.FE.urlParams.get('dd');\r\n if (dynd && dynd > 0) ATON.toggleDynamicDensity(true);\r\n};\r\n\r\nFE._handleHomeReq = ()=>{\r\n if (FE._bReqHome) return;\r\n\r\n FE._bReqHome = true;\r\n\r\n if (ATON.Nav.homePOV === undefined){\r\n ATON.Nav.computeAndRequestDefaultHome(0.5);\r\n return;\r\n }\r\n \r\n ATON.Nav.requestHome(1.0);\r\n //console.log(ATON.Nav.homePOV);\r\n};\r\n\r\n/**\r\nAdd basic front-end events such as showing spinner while loading assets and home viewpoint setup\r\n*/\r\nFE.addBasicLoaderEvents = ()=>{\r\n ATON.on(\"NodeRequestFired\", ()=>{ $(\"#idLoader\").show(); });\r\n\r\n ATON.on(\"SceneJSONLoaded\",()=>{\r\n if (ATON.SceneHub.getDescription()) $(\"#btn-info\").show();\r\n if (ATON.Nav.homePOV !== undefined) ATON.Nav.requestHome(1.0);\r\n });\r\n\r\n ATON.on(\"AllNodeRequestsCompleted\", ()=>{ \r\n $(\"#idLoader\").hide();\r\n if (ATON._ccModels.length>0) $(\"#btn-cc\").show();\r\n \r\n FE.computeSelectorRanges();\r\n if (ATON.Nav.isOrbit()) ATON.SUI.setSelectorRadius( FE._selRefRadius );\r\n\r\n FE._handleHomeReq();\r\n });\r\n/*\r\n ATON.on(\"XR_support\", (o)=>{\r\n if (o.type === \"immersive-vr\"){\r\n if (!o.v) $(\"#btn-vr\").hide();\r\n }\r\n if (o.type === \"immersive-ar\"){\r\n if (!o.v) $(\"#btn-ar\").hide();\r\n }\r\n });\r\n*/\r\n //ATON.on(\"frame\", FE._update);\r\n ATON.addUpdateRoutine(FE._update);\r\n};\r\n\r\nFE.controlLight = (b)=>{\r\n FE._bControlLight = b;\r\n ATON.Nav.setUserControl(!b);\r\n};\r\n\r\nFE.controlSelectorScale = (b)=>{\r\n FE._bControlSelScale = b;\r\n ATON._bPauseQuery = b;\r\n ATON.Nav.setUserControl(!b);\r\n};\r\n\r\nFE.useMouseWheelToScaleSelector = (f)=>{\r\n if (f === undefined) f = 0.9; \r\n\r\n ATON.on(\"MouseWheel\", (d)=>{\r\n\r\n if (ATON._kModCtrl){\r\n let ff = ATON.Nav.getFOV();\r\n \r\n if (d > 0.0) ff += 1.0;\r\n else ff -= 1.0;\r\n\r\n ATON.Nav.setFOV(ff);\r\n return;\r\n }\r\n\r\n if (ATON._kModShift){\r\n let r = ATON.SUI.mainSelector.scale.x;\r\n\r\n if (d > 0.0) r *= f;\r\n else r /= f;\r\n\r\n if (r < FE._selRanges[0]) r = FE._selRanges[0];\r\n if (r > FE._selRanges[1]) r = FE._selRanges[1];\r\n\r\n ATON.SUI.setSelectorRadius(r);\r\n return;\r\n }\r\n });\r\n};\r\n\r\n\r\n/**\r\nLoad a scene. \r\nYou can use ATON.on(\"SceneJSONLoaded\", ...) to perform additional tasks when the scene JSON is fully loaded\r\n@param {string} sid - the scene ID (e.g.: 'sample/venus')\r\n*/\r\nFE.loadSceneID = (sid)=>{\r\n if (sid === undefined) return;\r\n\r\n let reqstr = ATON.PATH_RESTAPI_SCENE + sid;\r\n //if (ATON.SceneHub._bEdit) reqstr += \",edit\";\r\n\r\n ATON.SceneHub.load(reqstr, sid);\r\n\r\n $(\"meta[property=og\\\\:image]\").attr(\"content\", ATON.PATH_SCENES+sid+'/cover.png');\r\n $(\"meta[property=og\\\\:image\\\\:secure_url]\").attr(\"content\", ATON.PATH_SCENES+sid+'/cover.png');\r\n $(\"meta[property=og\\\\:image\\\\:type]\").attr(\"content\", \"image/png\");\r\n $(\"meta[property=og\\\\:image\\\\:width]\").attr(\"content\", \"200\");\r\n $(\"meta[property=og\\\\:image\\\\:height]\").attr(\"content\", \"200\");\r\n\r\n console.log(reqstr);\r\n};\r\n\r\nFE._update = ()=>{\r\n //if (ATON.XR._bPresenting) return;\r\n\r\n if (FE._bControlLight){\r\n // Normalized\r\n const sx = ATON._screenPointerCoords.x;\r\n const sy = ATON._screenPointerCoords.y;\r\n //console.log(sx,sy);\r\n\r\n FE._cLightDir.x = -Math.cos(sx * Math.PI);\r\n FE._cLightDir.y = -sy * 4.0;\r\n FE._cLightDir.z = -Math.sin(sx * Math.PI);\r\n\r\n //FE._cLightDir.x = ATON.Nav._vDir.x + (sx);\r\n\r\n FE._cLightDir.normalize();\r\n\r\n ATON.setMainLightDirection(FE._cLightDir);\r\n //ATON.updateDirShadows();\r\n }\r\n/*\r\n if (FE._bControlSelScale){\r\n //const sx = ATON._screenPointerCoords.x;\r\n const f = ATON._screenPointerCoords.y;\r\n\r\n const r = ATON.SUI.mainSelector.scale.x + f;\r\n if (r > 0.0001) ATON.SUI.setSelectorRadius(r);\r\n }\r\n*/\r\n};\r\n\r\n\r\n// HTML UI\r\n//=======================================\r\n// Sample basic UI setup\r\nFE.uiBasicSetup = ()=>{\r\n FE.uiAddButton(\"idTopToolbar\",\"fullscreen\", ATON.toggleFullScreen );\r\n if (ATON.Utils.isConnectionSecure()) FE.uiAddButton(\"idTopToolbar\",\"vr\", ATON.XR.toggle );\r\n\r\n FE.uiAddButton(\"idBottomToolbar\",\"home\", ()=>{ ATON.Nav.requestHome(0.1); });\r\n};\r\n\r\nFE._uiSetupBase = ()=>{\r\n $(\"#idPopup\").click( FE.popupClose );\r\n $(\"#idLoader\").html(\"\");\r\n};\r\n\r\n/**\r\nAdd generic icon button inside a specific div container\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n@param {string} icon - the icon. Can be shortname for default icons in /res/icons/ or URL to .png image\r\n@param {function} onPress - function triggered when pressing the button\r\n@param {string} tooltip - (optional) tooltip\r\n*/\r\nFE.uiAddButton = (idcontainer, icon, onPress, tooltip)=>{\r\n let iconurl;\r\n let iconid;\r\n\r\n if (icon.endsWith(\".png\")){\r\n iconurl = icon;\r\n iconid = icon.slice(0,-4);\r\n }\r\n else {\r\n iconurl = FE.PATH_RES_ICONS+icon+\".png\";\r\n iconid = icon;\r\n }\r\n\r\n let elid = \"btn-\"+iconid;\r\n //let htmlcode = \"
    \";\r\n let el = $(\"
    \");\r\n \r\n $(\"#\"+idcontainer).append(el);\r\n\r\n if (onPress) el.click( onPress ); //$(\"#\"+elid).click( onPress );\r\n if (tooltip) el.attr(\"title\", tooltip); //$(\"#\"+elid).attr(\"title\", tooltip);\r\n};\r\n\r\nFE.uiSwitchButton = (iconid, b)=>{\r\n if (b) $(\"#btn-\"+iconid).addClass(\"switchedON\");\r\n else $(\"#btn-\"+iconid).removeClass(\"switchedON\");\r\n};\r\n\r\n/**\r\nAdd home button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonHome = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"home\", ()=>{ \r\n ATON.Nav.requestHome(0.3);\r\n }, \"Home viewpoint\");\r\n};\r\n\r\n/**\r\nAdd first-person button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonFirstPerson = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"fp\", ()=>{\r\n if (ATON.Nav.isFirstPerson()){\r\n ATON.Nav.setOrbitControl();\r\n //ATON.Nav.restorePreviousNavMode();\r\n FE.uiSwitchButton(\"fp\",false);\r\n }\r\n else {\r\n ATON.Nav.setFirstPersonControl();\r\n FE.uiSwitchButton(\"fp\",true);\r\n }\r\n }, \"First-person navigation mode\");\r\n\r\n if (ATON.Nav.isFirstPerson()) FE.uiSwitchButton(\"fp\",true);\r\n else FE.uiSwitchButton(\"fp\",false);\r\n};\r\n\r\n/**\r\nAdd immersive-VR button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonVR = (idcontainer)=>{\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n //if (!ATON.Utils.isVRsupported()) return; //Not showing on mobile\r\n\r\n FE.uiAddButton(idcontainer, \"vr\", ()=>{\r\n ATON.XR.toggle(\"immersive-vr\");\r\n },\r\n \"Immersive VR mode\" );\r\n};\r\n\r\n/**\r\nAdd immersive-AR button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonAR = (idcontainer)=>{\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n //if (!ATON.Utils.isARsupported()) return; //Not showing on mobile\r\n\r\n FE.uiAddButton(idcontainer, \"ar\", ()=>{ \r\n ATON.XR.toggle(\"immersive-ar\");\r\n }, \r\n \"Immersive AR mode\" );\r\n};\r\n\r\n/**\r\nAdd device-orientation button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonDeviceOrientation = (idcontainer)=>{\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n if (!ATON.Utils.isMobile()) return;\r\n\r\n FE.uiAddButton(idcontainer,\"devori\", ()=>{\r\n if (ATON.Nav.isDevOri()){\r\n //ATON.Nav.setOrbitControl();\r\n ATON.Nav.restorePreviousNavMode();\r\n FE.uiSwitchButton(\"devori\",false);\r\n }\r\n else {\r\n ATON.Nav.setDeviceOrientationControl();\r\n FE.uiSwitchButton(\"devori\",true);\r\n }\r\n }, \"Device-orientation mode\");\r\n\r\n if (ATON.Nav.isDevOri()) FE.uiSwitchButton(\"devori\",true);\r\n else FE.uiSwitchButton(\"devori\",false);\r\n};\r\n\r\n/**\r\nAdd Navigation button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonNav = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer,\"nav\", ()=>{\r\n FE.popupNav();\r\n }, \"Navigation\");\r\n};\r\n\r\n/**\r\nAdd talk button (VRoadcast)\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonTalk = (idcontainer)=>{\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n\r\n FE.uiAddButton(idcontainer, \"talk\", ()=>{\r\n if (ATON.MediaRec.isAudioRecording()){\r\n ATON.MediaRec.stopMediaStreaming();\r\n //FE.uiSwitchButton(\"talk\",false);\r\n $(\"#btn-talk\").removeClass(\"atonBTN-rec\");\r\n }\r\n else {\r\n ATON.MediaRec.startMediaStreaming();\r\n //FE.uiSwitchButton(\"talk\",true);\r\n $(\"#btn-talk\").addClass(\"atonBTN-rec\");\r\n }\r\n }, \"Talk ON/OFF\");\r\n\r\n if (ATON.MediaRec.isAudioRecording()) $(\"#btn-talk\").addClass(\"atonBTN-rec\");\r\n else $(\"#btn-talk\").removeClass(\"atonBTN-rec\");\r\n};\r\n\r\n/**\r\nAdd focus stream button (VRoadcast)\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonStreamFocus = (idcontainer)=>{\r\n\r\n FE.uiAddButton(idcontainer, \"focus\", ()=>{\r\n if (ATON.VRoadcast._bStreamFocus){\r\n ATON.VRoadcast.setFocusStreaming(false);\r\n $(\"#btn-focus\").removeClass(\"atonBTN-rec\");\r\n }\r\n else {\r\n ATON.VRoadcast.setFocusStreaming(true);\r\n $(\"#btn-focus\").addClass(\"atonBTN-rec\");\r\n }\r\n }, \"Focus streaming ON/OFF\");\r\n\r\n if (ATON.VRoadcast._bStreamFocus) $(\"#btn-focus\").addClass(\"atonBTN-rec\");\r\n else $(\"#btn-focus\").removeClass(\"atonBTN-rec\");\r\n};\r\n\r\n/**\r\nAdd QR-code button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonQR = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer,\"qr\", FE.popupQR, \"QR-code\" );\r\n};\r\n\r\n/**\r\nAdd screenshot button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonScreenshot = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer,\"sshot\", FE.popupScreenShot, \"Screenshot\" );\r\n};\r\n\r\n/**\r\nAdd scene information button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonInfo = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"info\", ATON.FE.popupSceneInfo, \"Scene information\");\r\n $(\"#btn-info\").hide();\r\n};\r\n\r\n/**\r\nAdd fullscreen button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonFullScreen = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"fullscreen\", ()=>{\r\n ATON.toggleFullScreen();\r\n }, \"Fullscreen\");\r\n\r\n FE.uiSwitchButton(\"fullscreen\", ATON.isFullscreen());\r\n};\r\n\r\n//TODO:\r\nFE.uiAddKeywordsArea = (idcontainer, kwList, onAddKeyword, onRemoveKeyword)=>{\r\n let htmlcode = \"\";\r\n htmlcode += \"Add keyword:

    \";\r\n htmlcode += \"
    \";\r\n\r\n $(\"#\"+idcontainer).html(htmlcode);\r\n\r\n FE.uiAttachInputFilterID(\"idKWordInput\");\r\n\r\n // Request global keywords list\r\n $.getJSON( ATON.PATH_RESTAPI+\"keywords/\", ( data )=>{\r\n let ht = \"\";\r\n for (let s in data) ht += \"\";\r\n ht += \"\";\r\n\r\n $(\"#\"+idcontainer).append(ht);\r\n });\r\n\r\n\r\n let kwsObj = {};\r\n\r\n let addKWtoBox = (kw)=>{\r\n if (kwsObj[kw]) return; // check duplicate\r\n\r\n kw = kw.toLowerCase().trim();\r\n\r\n $(\"#idKWordInput\").val(\"\"); // clear\r\n\r\n kwsObj[kw] = 1;\r\n\r\n console.log(\"Added keyword \"+kw);\r\n if (onAddKeyword) onAddKeyword(kw);\r\n\r\n // Populate box with remove handlers\r\n $(\"#idKWords\").append(\"
    \"+kw+\"
    \");\r\n $(\"#idkw-\"+kw).click(()=>{\r\n $(\"#idkw-\"+kw).remove();\r\n\r\n kwsObj[kw] = undefined;\r\n\r\n console.log(\"Removed keyword \"+kw);\r\n if (onRemoveKeyword) onRemoveKeyword(kw);\r\n });\r\n };\r\n\r\n if (kwList){\r\n for (let k in kwList) addKWtoBox( kwList[k] );\r\n }\r\n\r\n $(\"#idKWordInput\").keypress(function(event){\r\n let keycode = (event.keyCode ? event.keyCode : event.which);\r\n if (keycode != '13') return;\r\n\r\n let kw = $(\"#idKWordInput\").val().toLowerCase().trim();\r\n if (!kw || kw.length < 3) return;\r\n\r\n addKWtoBox(kw);\r\n });\r\n\r\n $(\"#idKWadd\").click(()=>{\r\n let kw = $(\"#idKWordInput\").val().toLowerCase().trim();\r\n if (!kw || kw.length < 3) return;\r\n\r\n addKWtoBox(kw);\r\n });\r\n};\r\n\r\n// Get css class from vrc ID\r\nFE.getVRCclassFromID = (uid)=>{\r\n let i = (uid%6);\r\n return \"atonVRCu\"+i;\r\n};\r\n\r\n// Setup VRC events\r\nFE._setupVRCevents = ()=>{\r\n if (FE._bVRCsetup) return;\r\n\r\n ATON.on(\"VRC_IDassigned\", (uid)=>{\r\n $(\"#btn-vrc\").addClass( FE.getVRCclassFromID(uid) );\r\n\r\n // Selector color\r\n //ATON.MatHub.materials.selector.color = ATON.VRoadcast.ucolors[uid%6];\r\n ATON.SUI.setSelectorColor(ATON.VRoadcast.ucolors[uid%6]);\r\n\r\n FE.checkAuth((data)=>{\r\n if (data.username!==undefined /*&& ATON.VRoadcast._username===undefined*/) ATON.VRoadcast.setUsername(data.username);\r\n });\r\n });\r\n\r\n ATON.on(\"VRC_SceneState\", (sstate)=>{\r\n let numUsers = ATON.VRoadcast.getNumUsers();\r\n if (numUsers>1) $(\"#idVRCnumusers\").html(numUsers);\r\n else $(\"#idVRCnumusers\").html(\"\");\r\n\r\n console.log(\"Users: \"+numUsers);\r\n });\r\n/*\r\n ATON.on(\"VRC_UserEnter\", (uid)=>{\r\n let numUsers = ATON.VRoadcast.getNumUsers();\r\n $(\"#idVRCnumusers\").html(numUsers);\r\n console.log(\"Users: \"+numUsers);\r\n });\r\n ATON.on(\"VRC_UserLeave\", (uid)=>{\r\n let numUsers = ATON.VRoadcast.getNumUsers();\r\n $(\"#idVRCnumusers\").html(numUsers);\r\n console.log(\"Users: \"+numUsers);\r\n });\r\n*/\r\n ATON.on(\"VRC_Disconnected\", ()=>{\r\n $(\"#btn-vrc\").attr(\"class\",\"atonBTN\");\r\n // Selector color\r\n //ATON.MatHub.materials.selector.color = ATON.MatHub.colors.green;\r\n ATON.SUI.setSelectorColor(ATON.MatHub.colors.defUI);\r\n\r\n $(\"#idVRCnumusers\").html(\"\");\r\n });\r\n\r\n FE._bVRCsetup = true;\r\n};\r\n\r\n/**\r\nAdd VRoadcast button (to connect/disconnect from collaborative sessions)\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonVRC = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"vrc\", ()=>{\r\n if (ATON.VRoadcast.isConnected()){\r\n FE.popupVRC();\r\n }\r\n else {\r\n ATON.VRoadcast.connect(FE._vrcAddr);\r\n }\r\n }, \"VRoadcast (collaborative session)\");\r\n\r\n $(\"#btn-vrc\").append(\"\");\r\n\r\n //$(\"
    xxx
    \").appendTo(document.body);\r\n //$(\"#idVRCchatPanel\").append(ATON.VRoadcast._elChat);\r\n FE._setupVRCevents();\r\n\r\n if (ATON.VRoadcast.uid !== undefined) $(\"#btn-vrc\").addClass( FE.getVRCclassFromID(ATON.VRoadcast.uid) );\r\n else $(\"#btn-vrc\").attr(\"class\",\"atonBTN\");\r\n};\r\n\r\n/**\r\nAdd user button (login/logout)\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonUser = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"user\", ()=>{\r\n FE.popupUser();\r\n }, \"User\");\r\n\r\n FE.checkAuth((r)=>{\r\n if (r.username !== undefined) $(\"#btn-user\").addClass(\"switchedON\");\r\n else $(\"#btn-user\").removeClass(\"switchedON\");\r\n });\r\n};\r\n\r\n/**\r\nAdd persistent editing mode button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonEditMode = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"edit\", ()=>{\r\n FE.checkAuth((data)=>{\r\n if (data.username !== undefined){\r\n ATON.SceneHub._bEdit = !ATON.SceneHub._bEdit;\r\n FE.uiSwitchButton(\"edit\",ATON.SceneHub._bEdit);\r\n }\r\n\r\n else {\r\n FE.popupUser(); \r\n }\r\n });\r\n });\r\n};\r\n\r\n/**\r\nAdd UI Profile to the front-end\r\n@param {string} id - profile ID\r\n@param {function} uiFunction - function that creates UI (HTML or SUI elements) for that profile\r\n*/\r\nFE.uiAddProfile = (id, uiFunction)=>{\r\n if (typeof uiFunction !== 'function') return;\r\n\r\n FE._uiProfiles[id] = uiFunction;\r\n};\r\n\r\n/**\r\nLoad specific UI Profile for the front-end\r\n@param {string} id - profile ID\r\n*/\r\nFE.uiLoadProfile = (id)=>{\r\n let f = FE._uiProfiles[id];\r\n if (f === undefined) return;\r\n\r\n f();\r\n FE._uiCurrProfile = id;\r\n console.log(\"Loaded UI Profile: \"+FE._uiCurrProfile);\r\n};\r\n\r\nFE.attachHandlerToButton = (idbutton, h)=>{\r\n if (h === undefined) return;\r\n\r\n $(\"#\"+idbutton).click(()=>{ h(); });\r\n};\r\n\r\n// Attach ID validator to given input field\r\nFE.uiAttachInputFilterID = (inputid)=>{\r\n $(\"#\"+inputid).on('keyup change input', ()=>{\r\n let value = $(\"#\"+inputid).val();\r\n let regReplace = new RegExp('[^A-Za-z0-9-_]', 'ig');\r\n $(\"#\"+inputid).val( value.replace(regReplace, '') );\r\n\r\n });\r\n};\r\n\r\n// Utility to switch a node in a graph\r\nFE.switchNode = (nid, value, type)=>{\r\n let N = undefined;\r\n \r\n if (type === ATON.NTYPES.SEM) N = ATON.getSemanticNode(nid);\r\n else N = ATON.getSceneNode(nid);\r\n\r\n if (N === undefined) return;\r\n\r\n N.toggle(value);\r\n\r\n ATON.fireEvent(\"FE_NodeSwitch\", {nid: nid, t: type, v: value});\r\n //console.log(\"XXX\");\r\n};\r\n\r\n// Graphs\r\nFE.uiCreateGraph = (type)=>{\r\n let nodes = ATON.snodes;\r\n if (type === ATON.NTYPES.SEM) nodes = ATON.semnodes;\r\n\r\n let htmlcontent = \"\";\r\n for (let nid in nodes){\r\n let N = nodes[nid];\r\n \r\n let chk = N.visible? \"checked\" : \"\";\r\n if (nid !== \".\") htmlcontent += \"\"+nid+\"
    \";\r\n }\r\n\r\n return htmlcontent;\r\n};\r\n\r\nFE.setupBasicUISounds = ()=>{\r\n FE.auLib = {};\r\n\r\n FE.auLib.switch = new Audio(ATON.PATH_RES+\"audio/switch.wav\");\r\n FE.auLib.switch.loop = false;\r\n};\r\n\r\nFE.playAudioFromSemanticNode = (semid)=>{\r\n //if (FE._auSemNodePlaying) return;\r\n if (semid === undefined) return;\r\n\r\n let S = ATON.getSemanticNode(semid);\r\n if (S === undefined) return;\r\n\r\n let au = S.getAudio();\r\n if (au === undefined) return;\r\n\r\n if (FE._auSemNode === undefined || FE._auSemNode === null) FE._auSemNode = new THREE.Audio( ATON.AudioHub._listener );\r\n else FE._auSemNode.stop();\r\n\r\n ATON.AudioHub._loader.load( au, (buffer)=>{\r\n FE._auSemNode.setBuffer( buffer );\r\n FE._auSemNode.setLoop( false );\r\n //FE._auSemNode.setVolume( 0.5 );\r\n //FE._auSemNode.setPlaybackRate(0.9);\r\n FE._auSemNode.play();\r\n });\r\n\r\n/*\r\n if (FE._auSemNode === undefined) FE._auSemNode = new Audio();\r\n \r\n FE._auSemNodePlaying = true;\r\n FE._auSemNode.src = au;\r\n //FE._auSemNode.type = ATON.MediaRec.auType;\r\n FE._auSemNode.play();\r\n\r\n FE._auSemNode.onended = ()=>{\r\n FE._auSemNodePlaying = false;\r\n };\r\n*/\r\n};\r\n\r\n\r\n// Popups\r\n//===================================================================\r\n\r\n/**\r\nShow a modal popup.\r\n@param {string} htmlcontent - The HTML5 content for the popup\r\n@param {string} cssClasses - (optional) css classes for the popup\r\n*/\r\nFE.popupShow = (htmlcontent, cssClasses)=>{\r\n if (FE._bPopup) return false;\r\n\r\n let clstr = \"atonPopup \";\r\n if (cssClasses) clstr += cssClasses;\r\n\r\n let htcont = \"
    \";\r\n htcont += htmlcontent+\"
    \"\r\n\r\n $('#idPopup').html(htcont);\r\n $('#idPopupContent').click((e)=>{ e.stopPropagation(); });\r\n $('#idPopup').fadeIn(FE.POPUP_DELAY);\r\n\r\n FE._bPopup = true;\r\n\r\n ATON._bListenKeyboardEvents = false;\r\n\r\n if (FE.popupBlurBG > 0){\r\n //ATON._renderer.setPixelRatio( FE.popupBlurBG );\r\n ATON._renderer.domElement.style.filter = \"blur(\"+FE.popupBlurBG+\"px)\"; //`blur(${blur * 5}px)`;\r\n //ATON._renderer.render( ATON._mainRoot, ATON.Nav._camera );\r\n }\r\n\r\n ATON._bPauseQuery = true;\r\n \r\n //ATON.renderPause();\r\n\r\n $(\"#idTopToolbar\").hide();\r\n $(\"#idBottomToolbar\").hide();\r\n $(\"#idBottomRToolbar\").hide();\r\n $(\"#idPoweredBy\").hide();\r\n\r\n return true;\r\n};\r\n\r\n/**\r\nClose current popup\r\n*/\r\nFE.popupClose = (bNoAnim)=>{\r\n FE._bPopup = false;\r\n\r\n //ATON.renderResume();\r\n ATON._bListenKeyboardEvents = true;\r\n \r\n if (FE.popupBlurBG > 0){\r\n //ATON.resetPixelDensity();\r\n ATON._renderer.domElement.style.filter = \"none\";\r\n }\r\n\r\n if (bNoAnim === true) $(\"#idPopup\").hide();\r\n else $(\"#idPopup\").fadeOut(FE.POPUP_DELAY);\r\n //$(\"#idPopup\").empty();\r\n\r\n ATON._bPauseQuery = false;\r\n\r\n $(\"#idTopToolbar\").show();\r\n $(\"#idBottomToolbar\").show();\r\n $(\"#idBottomRToolbar\").show();\r\n $(\"#idPoweredBy\").show();\r\n\r\n ATON.focusOn3DView();\r\n};\r\n\r\nFE.subPopup = ( popupFunc )=>{\r\n ATON.FE.popupClose();\r\n setTimeout( popupFunc, ATON.FE.POPUP_DELAY);\r\n};\r\n\r\nFE.popupQR = ()=>{\r\n let htmlcontent = \"
    Share
    \";\r\n htmlcontent += \"


    \";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n let url = window.location.href;\r\n new QRCode(document.getElementById(\"idQRcode\"), url);\r\n};\r\n\r\nFE.popupScreenShot = ()=>{\r\n let cover = ATON.Utils.takeScreenshot(200);\r\n\r\n FE.checkAuth((r)=>{\r\n\r\n let htmlcontent = \"
    Screenshot
    \";\r\n htmlcontent += \"This is a preview of what your screenshot will look like:

    \";\r\n htmlcontent += \"
    \";\r\n htmlcontent += \"Resolution: px
    \";\r\n\r\n htmlcontent += \"
    SHOT
    \";\r\n\r\n if (r.username !== undefined){\r\n htmlcontent += \"
    Set as Cover
    \";\r\n /*\r\n htmlcontent += \"
    \";\r\n htmlcontent += \"
    \";\r\n htmlcontent += \"Set as Cover
    \";\r\n */\r\n }\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n $(\"#btnScreenShot\").click(()=>{\r\n ATON.FE.popupClose();\r\n\r\n let s = parseInt( $('#isShotSize').val() );\r\n let img = ATON.Utils.takeScreenshot(s,\"shot.png\");\r\n });\r\n\r\n $(\"#btnSetCover\").click(()=>{\r\n ATON.FE.popupClose();\r\n\r\n ATON.Utils.postJSON(ATON.PATH_RESTAPI+\"cover/scene/\", {sid: ATON.SceneHub.currID, img: cover.src }, (r)=>{\r\n console.log(r);\r\n });\r\n\r\n });\r\n });\r\n};\r\n\r\nFE.popupVRC = ()=>{\r\n let htmlcontent = \"\";\r\n let numUsers = ATON.VRoadcast.getNumUsers();\r\n\r\n if (numUsers>1) htmlcontent += \"
    Collaborative Session (\"+numUsers+\" users)
    \";\r\n else htmlcontent += \"
    Collaborative Session
    \";\r\n\r\n // Username\r\n //htmlcontent += \"Your username in this collaborative session is:
    \";\r\n htmlcontent += \"\";\r\n htmlcontent += \"\";\r\n\r\n htmlcontent += \"
    \";\r\n\r\n //htmlcontent += \"
    \";\r\n htmlcontent += \"\";\r\n //htmlcontent += \"
    \";\r\n\r\n htmlcontent += \"
    LEAVE
    \";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent, \"atonPopupLarge\") ) return;\r\n\r\n if (ATON.VRoadcast._username === undefined){\r\n $('#idVRCusername').show();\r\n $('#idVRCusernameBTN').hide();\r\n }\r\n else {\r\n $('#idVRCusername').val(ATON.VRoadcast._username);\r\n $('#idVRCusername').hide();\r\n $('#idVRCusernameBTN').show();\r\n }\r\n\r\n if (ATON.VRoadcast.uid !== undefined) $('#idVRCusernameBTN').addClass(\"atonVRCu\"+(ATON.VRoadcast.uid % 6));\r\n\r\n $(\"#idChatBox\").append(ATON.VRoadcast._elChat);\r\n\r\n $(\"#idVRCmsg\").keypress((e)=>{\r\n let keycode = (e.keyCode ? e.keyCode : e.which);\r\n if (keycode == '13'){\r\n let str = $(\"#idVRCmsg\").val();\r\n ATON.VRoadcast.setMessage( str );\r\n $(\"#idVRCmsg\").val(\"\");\r\n //$(\"#idChatBox:first-child\").scrollTop( $(\"#idChatBox:first-child\").height() );\r\n }\r\n });\r\n\r\n $(\"#idVRCusername\").keypress((e)=>{\r\n let keycode = (e.keyCode ? e.keyCode : e.which);\r\n if (keycode == '13'){\r\n let str = $(\"#idVRCusername\").val();\r\n ATON.VRoadcast.setUsername( str );\r\n \r\n $('#idVRCusername').hide();\r\n $('#idVRCusernameBTN').html(ATON.VRoadcast._username);\r\n $('#idVRCusernameBTN').show();\r\n }\r\n });\r\n\r\n $(\"#idVRCusernameBTN\").click(()=>{\r\n $('#idVRCusername').show();\r\n $('#idVRCusernameBTN').hide();\r\n });\r\n\r\n $(\"#idVRCdisconnect\").click(()=>{\r\n ATON.VRoadcast.disconnect();\r\n ATON.FE.popupClose();\r\n });\r\n\r\n};\r\n\r\n// User auth\r\nFE.checkAuth = (onReceive)=>{\r\n ATON.Utils.checkAuth((data)=>{\r\n FE._userAuth = data;\r\n //console.log(FE._userAuth);\r\n\r\n if (data.username !== undefined){\r\n $(\"#btn-user\").addClass(\"switchedON\");\r\n if (ATON.VRoadcast._username === undefined) ATON.VRoadcast.setUsername(data.username);\r\n }\r\n else {\r\n $(\"#btn-user\").removeClass(\"switchedON\");\r\n }\r\n\r\n if (onReceive) onReceive(data);\r\n });\r\n};\r\n\r\n/*\r\nFE.checkAuth = (onReceive)=>{\r\n $.ajax({\r\n type: 'GET',\r\n url: ATON.PATH_RESTAPI+\"user\",\r\n xhrFields: { withCredentials: true }, \r\n dataType: 'json',\r\n\r\n success: (data)=>{\r\n FE._userAuth = data;\r\n //console.log(FE._userAuth);\r\n\r\n if (data.username !== undefined){\r\n $(\"#btn-user\").addClass(\"switchedON\");\r\n if (ATON.VRoadcast._username === undefined) ATON.VRoadcast.setUsername(data.username);\r\n }\r\n else {\r\n $(\"#btn-user\").removeClass(\"switchedON\");\r\n }\r\n\r\n onReceive(data);\r\n }\r\n });\r\n};\r\n*/\r\n\r\nFE.popupUser = ()=>{\r\n\r\n FE.checkAuth((r)=>{\r\n \r\n // We are already logged\r\n if (r.username !== undefined){\r\n let htmlcontent = \"
    \";\r\n htmlcontent += \"'\"+r.username+\"'

    \";\r\n\r\n if (Object.keys(FE._uiProfiles)){\r\n htmlcontent += \"UI Profile:


    \";\r\n }\r\n\r\n htmlcontent += \"
    LOGOUT
    \";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n if (FE._uiCurrProfile){\r\n console.log(FE._uiCurrProfile);\r\n $(\"#idUIProfiles\").val(FE._uiCurrProfile);\r\n }\r\n\r\n $(\"#idLogoutBTN\").click(()=>{\r\n $.get(ATON.PATH_RESTAPI+\"logout\", (r)=>{\r\n console.log(r);\r\n ATON.SceneHub.setEditMode(false);\r\n ATON.fireEvent(\"Logout\");\r\n $(\"#btn-user\").removeClass(\"switchedON\");\r\n });\r\n\r\n ATON.FE.popupClose();\r\n });\r\n\r\n $(\"#idSHUscenes\").click(()=>{\r\n ATON.Utils.goToURL(\"/shu/scenes/\");\r\n });\r\n $(\"#idSHUuser\").click(()=>{\r\n ATON.Utils.goToURL(\"/shu/auth/\");\r\n });\r\n\r\n $(\"#idUIProfiles\").on(\"change\", ()=>{\r\n let uip = $(\"#idUIProfiles\").val();\r\n FE.uiLoadProfile(uip);\r\n ATON.FE.popupClose();\r\n });\r\n\r\n }\r\n\r\n // Not logged in\r\n else {\r\n let htmlcontent = \"
    \";\r\n htmlcontent += \"username:
    \";\r\n htmlcontent += \"password:
    \";\r\n\r\n htmlcontent += \"
    LOGIN
    \";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n $(\"#idLoginBTN\").click(()=>{\r\n let jstr = JSON.stringify({\r\n username: $(\"#idUsername\").val(),\r\n password: $(\"#idPassword\").val()\r\n });\r\n\r\n $.ajax({\r\n url: ATON.PATH_RESTAPI+\"login\",\r\n type:\"POST\",\r\n data: jstr,\r\n contentType:\"application/json; charset=utf-8\",\r\n dataType:\"json\",\r\n\r\n success: (r)=>{\r\n console.log(r);\r\n if (r){\r\n ATON.fireEvent(\"Login\", r);\r\n $(\"#btn-user\").addClass(\"switchedON\");\r\n ATON.FE.popupClose();\r\n }\r\n }\r\n\r\n }).fail((err)=>{\r\n //console.log(err);\r\n $(\"#idLoginBTN\").html(\"LOGIN FAILED\");\r\n $(\"#idLoginBTN\").attr(\"class\",\"atonBTN atonBTN-red\");\r\n });\r\n });\r\n }\r\n });\r\n};\r\n\r\n/*\r\nFE.popupPOV = ()=>{\r\n let htmlcontent = \"

    Viewpoint

    \";\r\n\r\n htmlcontent += \"
    \";\r\n\r\n htmlcontent += \"
    OK
    \"; // \r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n let mode = $(\"#idPOVmode\").val();\r\n};\r\n*/\r\n\r\nFE.popupSceneInfo = ()=>{\r\n let head = ATON.SceneHub.getTitle();\r\n if (head === undefined) head = ATON.SceneHub.currID;\r\n\r\n let descr = ATON.SceneHub.getDescription();\r\n\r\n let htmlcontent = \"
    \"+head+\"
    \";\r\n if (descr) htmlcontent += \"
    \" + JSON.parse(descr) + \"
    \";\r\n\r\n htmlcontent += \"
    OK
    \";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n $(\"#btnOK\").click(()=>{\r\n ATON.FE.popupClose();\r\n });\r\n};\r\n\r\nFE.computeSelectorRanges = ()=>{\r\n let sceneBS = ATON.getRootScene().getBound();\r\n let r = sceneBS.radius;\r\n\r\n if (r <= 0.0) return;\r\n\r\n FE._selRanges[0] = r * 0.001;\r\n FE._selRefRadius = r * 0.02;\r\n FE._selRanges[1] = r * 0.5;\r\n\r\n //console.log(\"3D Selector ranges: \"+FE._selRanges[0]+\", \"+FE._selRanges[1]);\r\n};\r\n\r\nFE.popupSelector = ()=>{\r\n let htmlcontent = \"
    3D Selector
    \";\r\n\r\n let rad = ATON.SUI.getSelectorRadius();\r\n let hr = ATON.Utils.getHumanReadableDistance( rad );\r\n\r\n FE.computeSelectorRanges();\r\n\r\n htmlcontent += \"Radius (\"+hr+\"):
    \";\r\n htmlcontent += \"\";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent, \"atonPopupLarge\") ) return;\r\n\r\n $(\"#idSelRad\").val(rad);\r\n\r\n $(\"#idSelRad\").on(\"input change\",()=>{\r\n let r = parseFloat( $(\"#idSelRad\").val() );\r\n\r\n ATON.SUI.setSelectorRadius(r);\r\n $(\"#idSelRadTxt\").html( ATON.Utils.getHumanReadableDistance(r) );\r\n });\r\n};\r\n\r\nFE.popupNav = ()=>{\r\n let htmlcontent = \"
    Navigation
    \";\r\n\r\n //htmlcontent += \"
    \";\r\n\r\n htmlcontent += \"
    \";\r\n htmlcontent +=\"
    \";\r\n htmlcontent +=\"
    Switch between first-person and orbit navigation mode
    \";\r\n htmlcontent += \"
    \";\r\n\r\n if (ATON.Utils.isConnectionSecure()){\r\n htmlcontent += \"
    \";\r\n htmlcontent +=\"
    \";\r\n htmlcontent +=\"
    Immersive VR mode
    \";\r\n htmlcontent += \"
    \";\r\n\r\n if (ATON.Utils.isMobile()){\r\n htmlcontent += \"
    \";\r\n htmlcontent +=\"
    \";\r\n htmlcontent +=\"
    Enable or disable device-orientation mode
    \";\r\n htmlcontent += \"
    \";\r\n }\r\n }\r\n\r\n if ( !FE.popupShow(htmlcontent) ) return;\r\n\r\n FE.uiAddButtonFirstPerson(\"idNMfp\");\r\n FE.uiAddButtonDeviceOrientation(\"idNMdevori\");\r\n FE.uiAddButtonVR(\"idNMvr\");\r\n\r\n};\r\n\r\nexport default FE;","/*\r\n ATON Media Recorder\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Media Recorder\r\n@namespace MediaRec\r\n*/\r\nlet MediaRec = {};\r\nMediaRec.auType = \"audio/wav\";\r\nMediaRec.auExt = \".wav\";\r\n//MediaRec.auType = \"audio/webm\";\r\n//MediaRec.auExt = \".webm\";\r\n\r\nMediaRec.auBitsPerSecond = 9000; //9000;\r\nMediaRec.auStreamInterval = 1000;\r\nMediaRec.auMinVol = 1;\r\n\r\n\r\nMediaRec.init = ()=>{\r\n MediaRec._bAudioRecording = false;\r\n MediaRec._bStreaming = false;\r\n\r\n MediaRec.recorder = undefined;\r\n};\r\n\r\nMediaRec.realizeAudioRecorder = ( onComplete )=>{\r\n if (MediaRec.recorder !== undefined){\r\n MediaRec.recorder.reset();\r\n if (onComplete) onComplete();\r\n }\r\n\r\n // First time\r\n else {\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n if (!navigator.mediaDevices) return;\r\n\r\n if (MediaRec._ds === undefined) MediaRec._ds = setInterval( MediaRec._streamChunk, MediaRec.auStreamInterval);\r\n\r\n let UM = navigator.mediaDevices.getUserMedia({ \r\n video: false, \r\n audio: true, \r\n channelCount: 1,\r\n echoCancellation: true,\r\n });\r\n\r\n UM.then(async function(stream){\r\n MediaRec.recorder = RecordRTC(stream, { \r\n type: 'audio',\r\n mimeType: MediaRec.auType,\r\n \r\n bitsPerSecond: MediaRec.auBitsPerSecond,\r\n audioBitsPerSecond: MediaRec.auBitsPerSecond,\r\n\r\n sampleRate: 22050,\r\n desiredSampRate: 22050,\r\n \r\n disableLogs: true,\r\n \r\n //recorderType: MediaStreamRecorder,\r\n numberOfAudioChannels: 1,\r\n //bufferSize: 16384,\r\n\r\n //timeSlice: MediaRec.auStreamInterval,\r\n //ondataavailable: MediaRec._onAuBlob,\r\n });\r\n\r\n // Audio analyser\r\n /*\r\n MediaRec._auAVGvolume = 0;\r\n\r\n MediaRec._auCTX = new AudioContext();\r\n const input = MediaRec._auCTX.createMediaStreamSource(stream);\r\n const analyser = MediaRec._auCTX.createAnalyser();\r\n const scriptProcessor = MediaRec._auCTX.createScriptProcessor();\r\n\r\n // Some analyser setup\r\n analyser.smoothingTimeConstant = 0.3;\r\n analyser.fftSize = 1024;\r\n \r\n input.connect(analyser);\r\n analyser.connect(scriptProcessor);\r\n scriptProcessor.connect(MediaRec._auCTX.destination);\r\n\r\n const getAverageVolume = array => {\r\n const L = array.length;\r\n if (L <= 0) return 0; \r\n \r\n let values = 0;\r\n for (let i=0; i {\r\n if (!MediaRec._bAudioRecording) return;\r\n\r\n const tempArray = new Uint8Array(analyser.frequencyBinCount);\r\n\r\n analyser.getByteFrequencyData(tempArray);\r\n MediaRec._auAVGvolume = parseInt(getAverageVolume(tempArray));\r\n \r\n //console.log(MediaRec._auAVGvolume);\r\n };\r\n */\r\n if (onComplete) onComplete();\r\n });\r\n }\r\n};\r\n\r\nMediaRec.isAudioRecording = ()=>{\r\n return MediaRec._bAudioRecording;\r\n};\r\n\r\n// helper routines\r\nMediaRec._stopRecAndSend = ( onFinish )=>{\r\n if (MediaRec.recorder === undefined){\r\n if (onFinish) onFinish();\r\n return;\r\n }\r\n\r\n MediaRec.recorder.stopRecording(()=>{\r\n/*\r\n let rblob = MediaRec.recorder.getBlob();\r\n\r\n if (!rblob || rblob.size < 5 || !ATON.VRoadcast.socket || ATON.VRoadcast.uid === undefined){ // || MediaRec._auAVGvolume <= MediaRec.auMinVol\r\n if (onFinish) onFinish();\r\n return;\r\n }\r\n\r\n let reader = new FileReader();\r\n reader.readAsDataURL(rblob); \r\n reader.onloadend = ()=>{\r\n let b64 = reader.result;\r\n //let b64 = reader.result.split(',')[1];\r\n //b64 = \"data:audio/wav;base64,\" + b64;\r\n*/\r\n MediaRec.recorder.getDataURL((b64)=>{\r\n\r\n if (!ATON.VRoadcast.socket || ATON.VRoadcast.uid === undefined){ // || MediaRec._auAVGvolume <= MediaRec.auMinVol\r\n if (onFinish) onFinish();\r\n return;\r\n }\r\n\r\n ATON.VRoadcast.socket.compress(false).emit(\"UTALK\", {\r\n audio: b64,\r\n uid: ATON.VRoadcast.uid,\r\n //vol: MediaRec._auAVGvolume\r\n }); \r\n \r\n if (onFinish) onFinish();\r\n return;\r\n });\r\n/*\r\n console.log(\"sending blob...\"+rblob.size);\r\n\r\n ATON.VRoadcast.socket.compress(false).emit(\"UTALK\", {\r\n blob: rblob,\r\n uid: ATON.VRoadcast.uid,\r\n vol: MediaRec._auAVGvolume\r\n });\r\n\r\n if (onFinish) onFinish();\r\n*/\r\n //if (onFinish) onFinish();\r\n });\r\n};\r\n\r\nMediaRec._onAuBlob = (rblob)=>{\r\n if (!rblob) return;\r\n if (!ATON.VRoadcast.socket) return;\r\n //if (ATON.vroadcast._auAVGvolume <= ATON.vroadcast.minAuVol) return;\r\n\r\n //console.log(\"sending blob...\"+rblob.size);\r\n\r\n ATON.VRoadcast.socket.emit(\"UTALK\", {\r\n blob: rblob,\r\n uid: ATON.VRoadcast.uid,\r\n vol: MediaRec._auAVGvolume\r\n });\r\n};\r\n\r\n// Audio Recording\r\nMediaRec.startRecording = ()=>{\r\n MediaRec.realizeAudioRecorder(()=>{\r\n\r\n if (!MediaRec.recorder) return;\r\n if (MediaRec._bAudioRecording) return;\r\n\r\n console.log(\"Recording...\");\r\n\r\n MediaRec.recorder.startRecording();\r\n MediaRec._bAudioRecording = true;\r\n });\r\n};\r\n\r\nMediaRec.stopRecording = ()=>{\r\n if (!MediaRec.recorder) return;\r\n\r\n MediaRec.recorder.stopRecording(()=>{\r\n let rblob = MediaRec.recorder.getBlob();\r\n //let du = MediaRec.recorder.toURL();\r\n //console.log(du);\r\n\r\n console.log(\"Stop recording.\");\r\n\r\n let reader = new FileReader();\r\n reader.readAsDataURL(rblob); \r\n reader.onloadend = ()=>{\r\n let base64data = reader.result; \r\n //console.log(base64data);\r\n ATON.fireEvent(\"AudioRecordCompleted\", base64data);\r\n }\r\n\r\n MediaRec._bAudioRecording = false;\r\n });\r\n};\r\n\r\nMediaRec.startOrStopRecording = ()=>{\r\n if (MediaRec._bAudioRecording) MediaRec.stopRecording();\r\n else MediaRec.startRecording();\r\n};\r\n\r\nMediaRec._streamChunk = ()=>{\r\n if (!MediaRec.recorder) return;\r\n if (!MediaRec._bStreaming) return;\r\n\r\n MediaRec._stopRecAndSend(()=>{ \r\n MediaRec.recorder.startRecording();\r\n });\r\n};\r\n\r\n// Audio Streaming\r\nMediaRec.startMediaStreaming = ()=>{\r\n MediaRec.realizeAudioRecorder(()=>{\r\n if (!MediaRec.recorder) return;\r\n if (MediaRec._bAudioRecording) return;\r\n\r\n //MediaRec.recorder.stopRecording(()=>{\r\n console.log(\"Start MediaStreaming\");\r\n\r\n MediaRec.recorder.startRecording();\r\n MediaRec._bAudioRecording = true;\r\n MediaRec._bStreaming = true;\r\n //});\r\n });\r\n};\r\n\r\nMediaRec.stopMediaStreaming = ()=>{\r\n if (!MediaRec.recorder) return;\r\n if (!MediaRec._bAudioRecording) return;\r\n\r\n console.log(\"Stop MediaStreaming\");\r\n\r\n MediaRec._stopRecAndSend(()=>{\r\n //MediaRec._bStreaming = false;\r\n //MediaRec._bAudioRecording = false;\r\n });\r\n\r\n MediaRec._bStreaming = false;\r\n MediaRec._bAudioRecording = false;\r\n\r\n/*\r\n MediaRec._stopRecAndSend(()=>{\r\n clearInterval(MediaRec._dMediaRecorder);\r\n MediaRec._bAudioRecording = false;\r\n });\r\n*/\r\n};\r\n\r\nMediaRec.startOrStopMediaStreaming = ()=>{\r\n if (MediaRec._bAudioRecording) MediaRec.stopMediaStreaming();\r\n else MediaRec.startMediaStreaming();\r\n};\r\n\r\nexport default MediaRec;","/*\r\n ATON GeoLoc\r\n Outdoor geolocation tracking and Geo-POI handling\r\n TODO: rename\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nOutdoor geolocation tracking and Geo-POI handling\r\n@namespace GeoLoc\r\n*/\r\nlet GeoLoc = {};\r\n\r\n//GeoLoc.INTERVAL = 1000;\r\nGeoLoc.EARTH_R_KM = 6371.0;\r\nGeoLoc.EARTH_D_KM = GeoLoc.EARTH_R_KM * 2.0;\r\n\r\n\r\nGeoLoc.init = ()=>{\r\n GeoLoc._bActive = false;\r\n\r\n GeoLoc._wpid = undefined;\r\n GeoLoc._currPos = new THREE.Vector2();\r\n\r\n // POIs\r\n GeoLoc._POIs = [];\r\n GeoLoc._currPOI = undefined; // POI we are inside if any\r\n GeoLoc._closestPOI = undefined; // closest POI\r\n\r\n GeoLoc._maxError = 40.0; // max accuracy error allowed\r\n};\r\n\r\n/**\r\nEnable geolocation tracking\r\n*/\r\nGeoLoc.enableTracking = ()=>{\r\n if (GeoLoc._bActive) return;\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n if (!navigator.geolocation) return;\r\n\r\n GeoLoc._wpid = navigator.geolocation.watchPosition(\r\n GeoLoc._onPosition,\r\n GeoLoc._onError,\r\n {\r\n enableHighAccuracy: true,\r\n //maximumAge : 30000,\r\n //timeout : 27000\r\n } \r\n );\r\n\r\n //window.setInterval( GeoLoc.update, GeoLoc.INTERVAL);\r\n \r\n GeoLoc._bActive = true;\r\n};\r\n\r\n/**\r\nDisable geolocation tracking\r\n*/\r\nGeoLoc.disableTracking = ()=>{\r\n if (!GeoLoc._bActive) return;\r\n \r\n navigator.geolocation.clearWatch(GeoLoc._wpid);\r\n GeoLoc._bActive = false;\r\n};\r\n\r\n/**\r\nSet max error allowed for location tracking\r\n@param {number} - the error (meters)\r\n*/\r\nGeoLoc.setMaxError = (r)=>{\r\n if (r > 0.0) GeoLoc._maxError = r;\r\n};\r\n\r\nGeoLoc._onError = ()=>{\r\n console.log(\"Geolocation error\");\r\n};\r\n\r\nGeoLoc._onPosition = (pos)=>{\r\n if (!GeoLoc._bActive) return;\r\n if (!pos.coords) return;\r\n\r\n // filter locations\r\n let acc = pos.coords.accuracy;\r\n if (acc && acc > GeoLoc._maxError) return;\r\n\r\n // update current location\r\n GeoLoc._currPos.x = pos.coords.latitude;\r\n GeoLoc._currPos.y = pos.coords.longitude;\r\n\r\n //console.log(pos.coords.latitude+\",\"+pos.coords.longitude);\r\n //console.log(pos);\r\n\r\n ATON.fireEvent(\"GeoLocation\", pos);\r\n\r\n GeoLoc._handlePOIs();\r\n};\r\n\r\nGeoLoc._handlePOIs = ()=>{\r\n let numPOIs = GeoLoc._POIs.length;\r\n if (numPOIs <= 0) return;\r\n\r\n GeoLoc._closestPOIdist = undefined;\r\n GeoLoc._closestPOI = undefined;\r\n\r\n for (let i=0; i{\r\n if (!GeoLoc._bActive) return undefined;\r\n\r\n return GeoLoc._currPos;\r\n};\r\n\r\nGeoLoc.locationFromLatLon = (lat, lon)=>{\r\n return new THREE.Vector2( lat, lon );\r\n};\r\n\r\n// Distance between two locations (in meters)\r\nGeoLoc.distance_orig = (latlonA, latlonB)=>{\r\n let dLat = ATON.DEG2RAD * (latlonB.x - latlonA.x); // deg2rad\r\n let dLon = ATON.DEG2RAD * (latlonB.y - latlonA.y); \r\n let a = \r\n Math.sin(dLat/2) * Math.sin(dLat/2) +\r\n Math.cos(ATON.DEG2RAD * latlonA.x) * Math.cos(ATON.DEG2RAD * latlonB.x) * \r\n Math.sin(dLon/2) * Math.sin(dLon/2);\r\n\r\n let c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); \r\n let d = GeoLoc.EARTH_R_KM * c; // Distance in km\r\n \r\n return d * 1000.0;\r\n};\r\n\r\n/**\r\nGet distance (meters) between two geo-locations\r\nre-adapted from https://stackoverflow.com/questions/27928/calculate-distance-between-two-latitude-longitude-points-haversine-formula\r\n@param {THREE.Vector2} latlonA - location A (lat,lon)\r\n@param {THREE.Vector2} latlonB - location B (lat,lon)\r\n@returns {number} - distance (meters)\r\n*/\r\nGeoLoc.distance = (latlonA, latlonB)=>{\r\n let a = 0.5 - Math.cos((latlonB.x - latlonA.x) * ATON.DEG2RAD)/2.0 + \r\n Math.cos(latlonA.x * ATON.DEG2RAD) * Math.cos(latlonB.x * ATON.DEG2RAD) * \r\n (1.0 - Math.cos((latlonB.y - latlonA.y) * ATON.DEG2RAD))/2.0;\r\n\r\n let d = GeoLoc.EARTH_D_KM * Math.asin(Math.sqrt(a));\r\n\r\n return d * 1000.0;\r\n};\r\n\r\n/**\r\nAdd a Geo-POI (point-of-interest) in given location (lat,lon) and radius.\r\nYou can handle enter/leave POI events using ATON.on(\"EnterPOI\") and ATON.on(\"LeavePOI\")\r\n@param {THREE.Vector2} P - the (lat,lon) pair\r\n@param {number} r - the radius (meters)\r\n*/\r\nGeoLoc.addPOI = (P, r)=>{\r\n let POI = {};\r\n POI.pos = new THREE.Vector2(P.x,P.y);\r\n POI.radius = r;\r\n\r\n GeoLoc._POIs.push(POI);\r\n\r\n if (!GeoLoc._bActive) GeoLoc.enableTracking();\r\n\r\n //console.log(\"Added POI:\");\r\n //console.log(POI);\r\n\r\n GeoLoc._handlePOIs();\r\n\r\n return (GeoLoc._POIs.length - 1);\r\n};\r\n\r\nGeoLoc.getPOIbyIndex = (i)=>{\r\n return GeoLoc._POIs[i];\r\n};\r\n\r\n/**\r\nGet index of closest Geo-POI\r\n@returns {number} - index\r\n*/\r\nGeoLoc.getClosestPOI = ()=>{\r\n return GeoLoc._closestPOI;\r\n};\r\n\r\n/**\r\nGet distance (meters) to the closest Geo-POI\r\n@returns {number} - distance (meters)\r\n*/\r\nGeoLoc.getClosestPOIdistance = ()=>{\r\n return GeoLoc._closestPOIdist;\r\n};\r\n\r\n\r\n// Main update routine\r\n/*\r\nGeoLoc.update = ()=>{\r\n if (!GeoLoc._bActive) return;\r\n\r\n //navigator.geolocation.watchPosition(GeoLoc._onPosition);\r\n\r\n //let P = GeoLoc.locationFromLatLon(42.06047573760282, 12.588698649224982);\r\n //console.log( GeoLoc.distance(GeoLoc._currPos, P) );\r\n};\r\n*/\r\n\r\nexport default GeoLoc;","/*\r\n ATON App Hub\r\n Web-Apps\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n//import AppData from \"./ATON.appdata.js\";\r\n\r\n/**\r\nATON App Hub\r\n@namespace AppHub\r\n*/\r\nlet AppHub = {};\r\n\r\n// Realize the hub\r\nAppHub.init = ()=>{\r\n AppHub._appid = $(\"meta[name='aton\\\\:appid']\").attr(\"content\");\r\n AppHub._appdata = {};\r\n};\r\n\r\n// Send JSON patch\r\n// TODO: https://tools.ietf.org/html/rfc6902\r\nAppHub._sendDataPatch = (id, patch, mode)=>{\r\n return new Promise((resolve, reject)=>{\r\n if (id === undefined){\r\n reject(\"No storage ID specified\");\r\n return;\r\n }\r\n if (id.length < 3){\r\n reject(\"Storage ID too short\");\r\n return;\r\n }\r\n if (patch === undefined){\r\n reject(\"No storage patch\");\r\n return;\r\n }\r\n if (AppHub._appid === undefined){\r\n reject(\"No app-ID\");\r\n return;\r\n }\r\n\r\n if (mode === undefined) mode = ATON.PATCH_ADD;\r\n\r\n let O = {};\r\n O.wappid = AppHub._appid;\r\n O.fid = id;\r\n O.data = patch;\r\n O.mode = (mode === ATON.PATCH_DEL)? \"DEL\" : \"ADD\";\r\n\r\n let jstr = JSON.stringify(O);\r\n //console.log(jstr);\r\n\r\n $.ajax({\r\n url: ATON.PATH_RESTAPI+\"patch/wapp\",\r\n type:\"POST\",\r\n data: jstr,\r\n contentType:\"application/json; charset=utf-8\",\r\n dataType:\"json\",\r\n\r\n success: (r)=>{\r\n if (r === undefined){\r\n reject(\"Error writing on server\");\r\n return;\r\n }\r\n\r\n AppHub._appdata[id] = r;\r\n resolve(r);\r\n }\r\n });\r\n });\r\n};\r\n\r\n/**\r\nGet current web-app ID\r\n@returns {string} - web-app ID\r\n*/\r\nAppHub.getAppID = ()=>{\r\n return AppHub._appid;\r\n};\r\n\r\n/**\r\nAdd data to persistent, server-side storage of current web-app\r\n@param {object} id - server-side storage ID\r\n@param {object} patch - a javascript object patch\r\n@example\r\nATON.AppHub.addToStorage(\"myStorage\", {score: 20}).then(...)\r\n*/\r\nAppHub.addToStorage = (id, patch)=>{\r\n //AppHub._sendDataPatch(id, patch, ATON.PATCH_ADD, onComplete);\r\n return AppHub._sendDataPatch(id, patch, ATON.PATCH_ADD);\r\n};\r\n\r\n/**\r\nDelete data from server-side storage of current web-app\r\n@param {object} id - server-side storage ID\r\n@param {object} patch - a javascript object patch\r\n@example\r\nATON.AppHub.deleteFromStorage(\"myStorage\", {score: {}}).then(...)\r\n*/\r\nAppHub.deleteFromStorage = (id, patch)=>{\r\n //AppHub._sendDataPatch(id, patch, ATON.PATCH_DEL, onComplete);\r\n return AppHub._sendDataPatch(id, patch, ATON.PATCH_DEL);\r\n};\r\n\r\n/**\r\nGet content of server-side storage for current web-app\r\n@param {object} id - server-side storage ID\r\n@example\r\nATON.AppHub.getStorage(\"myStorage\").then((s)=>{ console.log(s); })\r\n*/\r\nAppHub.getStorage = (id)=>{\r\n return new Promise((resolve, reject)=>{\r\n if (AppHub._appid === undefined){\r\n reject();\r\n return;\r\n }\r\n if (id === undefined){\r\n reject(\"No storage ID specified\");\r\n return;\r\n }\r\n\r\n $.getJSON( ATON.PATH_WAPPS+AppHub._appid+\"/data/\"+id+\".json\", (data)=>{\r\n console.log(data);\r\n AppHub._appdata[id] = data;\r\n resolve(data);\r\n });\r\n });\r\n\r\n};\r\n\r\n\r\nexport default AppHub;","/*\r\n ATON post-process FX\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON post-process FX\r\n@namespace FX\r\n*/\r\nlet FX = {};\r\n\r\nFX.PASS_BASE = 0;\r\nFX.PASS_AA = 1;\r\nFX.PASS_AO = 2;\r\nFX.PASS_SSR = 3;\r\nFX.PASS_BLOOM = 4;\r\nFX.PASS_DOF = 5;\r\nFX.PASS_GAMMA = 6;\r\n\r\n\r\n// Initialization (main renderer must be initialized already)\r\nFX.init = ()=>{\r\n if (ATON._renderer === undefined) return;\r\n\r\n FX.composer = new THREE.EffectComposer( ATON._renderer );\r\n FX.passes = [];\r\n\r\n ATON._renderer.autoClear = false;\r\n\r\n let CW = window.innerWidth * ATON._stdpxd;\r\n let CH = window.innerHeight * ATON._stdpxd;\r\n\r\n // Base pass\r\n FX.passes[FX.PASS_BASE] = new THREE.RenderPass( ATON._mainRoot, ATON.Nav._camera );\r\n FX.composer.addPass( FX.passes[FX.PASS_BASE] );\r\n //console.log(FX.passes[FX.PASS_BASE]);\r\n\r\n\r\n // SSR - TODO: check for variable rou implementation\r\n/*\r\n FX.passes[ATON.FXPASS_SSR] = new THREE.SSRPass({\r\n renderer: ATON._renderer,\r\n scene: ATON._mainRoot, \r\n camera: ATON.Nav._camera,\r\n //width: window.innerWidth * 0.1,\r\n //height: window.innerHeight * 0.1,\r\n //encoding: THREE.sRGBEncoding\r\n });\r\n\r\n FX.passes[ATON.FXPASS_SSR].thickness = 0.018;\r\n FX.passes[ATON.FXPASS_SSR].infiniteThick = false; //true;\r\n FX.passes[ATON.FXPASS_SSR].maxDistance = 1.0; //0.1;\r\n console.log(FX.passes[ATON.FXPASS_SSR]);\r\n\r\n FX.composer.addPass( FX.passes[ATON.FXPASS_SSR] );\r\n*/\r\n\r\n\r\n // Ambient Occlusion\r\n FX.passes[FX.PASS_AO] = new THREE.SAOPass( ATON._mainRoot, ATON.Nav._camera, false, true );\r\n FX.passes[FX.PASS_AO].params.saoBias = 1.0;\r\n FX.passes[FX.PASS_AO].params.saoScale = 100;\r\n FX.passes[FX.PASS_AO].params.saoIntensity = 0.2; //0.2 //0.005;\r\n //FX.passes[FX.PASS_AO].params.saoBlurRadius = 5;\r\n \r\n //FX.passes[FX.PASS_AO].params.saoKernelRadius = 200;\r\n \r\n //FX.passes[FX.PASS_AO].params.saoBlurStdDev = 10.0;\r\n //FX.passes[FX.PASS_AO].params.saoBlurDepthCutoff = 0.2;\r\n //FX.passes[FX.PASS_AO].params.saoMinResolution = 0.01;\r\n\r\n //console.log(FX.passes[FX.PASS_AO]);\r\n\r\n // Sobel\r\n/*\r\n const effectSobel = new THREE.ShaderPass( THREE.SobelOperatorShader );\r\n effectSobel.uniforms[ 'resolution' ].value.x = window.innerWidth * ATON._stdpxd;\r\n effectSobel.uniforms[ 'resolution' ].value.y = window.innerHeight * ATON._stdpxd;\r\n*/\r\n\r\n // Bloom\r\n FX.passes[FX.PASS_BLOOM] = new THREE.UnrealBloomPass( new THREE.Vector2( CW,CH ), 1.5, 0.4, 0.85 );\r\n FX.passes[FX.PASS_BLOOM].threshold = 0.9\r\n FX.passes[FX.PASS_BLOOM].strength = 1.0; //0.5;\r\n FX.passes[FX.PASS_BLOOM].radius = 0.0;\r\n //console.log(FX.passes[FX.PASS_BLOOM])\r\n\r\n\r\n // DOF\r\n let fa = 7.0;\r\n FX.passes[FX.PASS_DOF] = new THREE.BokehPass( ATON._mainRoot, ATON.Nav._camera, {\r\n focus: 5.0,\r\n aperture: 0.001, //1.0/(fa*100.0),\r\n maxblur: 0.01,\r\n\r\n width: CW, //window.innerWidth,\r\n height: CH //window.innerHeight\r\n });\r\n //console.log(FX.passes[FX.PASS_DOF]);\r\n\r\n\r\n // Gamma correction\r\n FX.passes[FX.PASS_GAMMA] = new THREE.ShaderPass( THREE.GammaCorrectionShader );\r\n\r\n // Antialiasing\r\n FX.passes[FX.PASS_AA] = new THREE.ShaderPass( THREE.FXAAShader );\r\n //FX.passes[FX.PASS_AA].renderToScreen = false;\r\n let UU = FX.passes[FX.PASS_AA].material.uniforms;\r\n UU.resolution.value.set( (1/CW), (1/CH) );\r\n/*\r\n FX.passes[FX.PASS_AA] = new THREE.SSAARenderPass( ATON._mainRoot, ATON.Nav._camera, 0x000000, 0);\r\n FX.passes[FX.PASS_AA].sampleLevel = 4;\r\n FX.passes[FX.PASS_AA].unbiased = true;\r\n FX.passes[FX.PASS_AA].setSize(CW,CH);\r\n*/\r\n/*\r\n FX.passes[FX.PASS_AA] = new THREE.TAARenderPass( ATON._mainRoot, ATON.Nav._camera );\r\n\tFX.passes[FX.PASS_AA].unbiased = true;\r\n FX.passes[FX.PASS_AA].accumulate = false;\r\n*/\r\n //FX.passes[FX.PASS_AA] = new THREE.SMAAPass( CW,CH );\r\n\r\n\r\n // Order\r\n FX.composer.addPass( FX.passes[FX.PASS_AO] );\r\n FX.composer.addPass( FX.passes[FX.PASS_BLOOM] );\r\n // tone-mapping passes here (if any)\r\n FX.composer.addPass( FX.passes[FX.PASS_GAMMA] );\r\n FX.composer.addPass( FX.passes[FX.PASS_AA] );\r\n //FX.composer.addPass( effectSobel );\r\n FX.composer.addPass( FX.passes[FX.PASS_DOF] );\r\n\r\n //FX.composer.addPass( FX.passes[FX.PASS_AA] );\r\n\r\n // Defaults\r\n FX.togglePass(FX.PASS_AO, false);\r\n FX.togglePass(FX.PASS_BLOOM, false);\r\n FX.togglePass(FX.PASS_DOF, false);\r\n\r\n //for (let p in FX.passes) FX.passes[p].renderToScreen = true;\r\n console.log(FX.composer);\r\n};\r\n\r\n// Switch on off passes\r\nFX.togglePass = (pass, b)=>{\r\n if (FX.composer === undefined) return;\r\n if (ATON.device.lowGPU) return; // no fx passes on low GPU for now\r\n\r\n let P = FX.passes[pass];\r\n if (P === undefined) return;\r\n\r\n if (b === undefined) FX.passes[pass].enabled = !FX.passes[pass].enabled;\r\n else FX.passes[pass].enabled = b;\r\n};\r\n\r\nFX.isPassEnabled = (pass)=>{\r\n if (FX.composer === undefined) return false;\r\n\r\n let P = FX.passes[pass];\r\n if (P === undefined) return false;\r\n\r\n return FX.passes[pass].enabled; \r\n};\r\n\r\n\r\n// FX Passes params\r\n//======================================================\r\n\r\nFX.setAOintensity = (f)=>{\r\n if (FX.composer === undefined) return;\r\n if (FX.passes[FX.PASS_AO] === undefined) return;\r\n\r\n FX.passes[FX.PASS_AO].params.saoIntensity = f;\r\n};\r\nFX.getAOintensity = ()=>{\r\n if (FX.composer === undefined) return 0.0;\r\n if (FX.passes[FX.PASS_AO] === undefined) return 0.0;\r\n return FX.passes[FX.PASS_AO].params.saoIntensity;\r\n};\r\n\r\nFX.setBloomStrength = (f)=>{\r\n if (FX.composer === undefined) return;\r\n if (FX.passes[FX.PASS_BLOOM] === undefined) return;\r\n\r\n FX.passes[FX.PASS_BLOOM].strength = f;\r\n};\r\nFX.getBloomStrength = ()=>{\r\n if (FX.composer === undefined) return 0.0;\r\n if (FX.passes[FX.PASS_BLOOM] === undefined) return 0.0;\r\n return FX.passes[FX.PASS_BLOOM].strength;\r\n};\r\n\r\nFX.setBloomThreshold = (f)=>{\r\n if (FX.composer === undefined) return;\r\n if (FX.passes[FX.PASS_BLOOM] === undefined) return;\r\n\r\n FX.passes[FX.PASS_BLOOM].threshold = f;\r\n};\r\nFX.getBloomThreshold = ()=>{\r\n if (FX.composer === undefined) return 0.0;\r\n if (FX.passes[FX.PASS_BLOOM] === undefined) return 0.0;\r\n return FX.passes[FX.PASS_BLOOM].threshold;\r\n};\r\n\r\nFX.setDOFfocus = (f)=>{\r\n if (FX.composer === undefined) return;\r\n if (FX.passes[FX.PASS_DOF] === undefined) return;\r\n\r\n let UU = FX.passes[FX.PASS_DOF].uniforms;\r\n if (UU === undefined) return;\r\n\r\n UU['focus'].value = f;\r\n};\r\nFX.getDOFfocus = ()=>{\r\n if (FX.composer === undefined) return 0.0;\r\n if (FX.passes[FX.PASS_DOF] === undefined) return 0.0;\r\n\r\n let UU = FX.passes[FX.PASS_DOF].uniforms;\r\n if (UU === undefined) return 0.0;\r\n\r\n return UU['focus'].value;\r\n};\r\n\r\nFX.setDOFaperture = (f)=>{\r\n if (FX.composer === undefined) return;\r\n if (FX.passes[FX.PASS_DOF] === undefined) return;\r\n\r\n let UU = FX.passes[FX.PASS_DOF].uniforms;\r\n if (UU === undefined) return;\r\n\r\n UU['aperture'].value = f;\r\n};\r\n\r\nexport default FX;","/*!\r\n @preserve\r\n\r\n \tATON\r\n\r\n \t@author Bruno Fanini\r\n\tVHLab, CNR ISPC\r\n\r\n==================================================================================*/\r\n\r\n'use strict';\r\n\r\n/**\r\n@namespace ATON\r\n*/\r\nlet ATON = {};\r\nwindow.ATON = ATON;\r\n\r\n// Import\r\nimport Node from \"./ATON.node.js\";\r\nimport POV from \"./ATON.pov.js\";\r\n//import Period from \"./ATON.period.js\";\r\nimport LightProbe from \"./ATON.lightprobe.js\";\r\n\r\nimport EventHub from \"./ATON.eventhub.js\";\r\nimport MatHub from \"./ATON.mathub.js\";\r\nimport Utils from \"./ATON.utils.js\";\r\nimport SceneHub from \"./ATON.scenehub.js\";\r\nimport AudioHub from \"./ATON.audiohub.js\";\r\nimport Nav from \"./ATON.nav.js\";\r\nimport XR from \"./ATON.xr.js\";\r\nimport SUI from \"./ATON.sui.js\";\r\nimport VRoadcast from \"./ATON.vroadcast.js\";\r\nimport SemFactory from \"./ATON.semfactory.js\";\r\nimport FE from \"./ATON.fe.js\";\r\nimport MediaRec from \"./ATON.mediarec.js\";\r\nimport GeoLoc from \"./ATON.geoloc.js\";\r\nimport AppHub from \"./ATON.apphub.js\";\r\nimport FX from \"./ATON.fx.js\";\r\n\r\n// Classes\r\nATON.Node = Node;\r\nATON.POV = POV;\r\nATON.LightProbe = LightProbe;\r\n//ATON.Period = Period;\r\n\r\n// NS\r\nATON.EventHub = EventHub;\r\nATON.Utils = Utils;\r\nATON.SceneHub = SceneHub;\r\nATON.MatHub = MatHub;\r\nATON.Nav = Nav;\r\nATON.AudioHub = AudioHub;\r\nATON.XR = XR;\r\nATON.SUI = SUI;\r\nATON.VRoadcast = VRoadcast;\r\nATON.SemFactory = SemFactory;\r\nATON.FE = FE;\r\nATON.MediaRec = MediaRec;\r\nATON.GeoLoc = GeoLoc;\r\nATON.AppHub = AppHub;\r\nATON.FX = FX;\r\n\r\n//==============================================================\r\n// Consts\r\n//==============================================================\r\nATON.STD_UPVECTOR = new THREE.Vector3(0,1,0);\r\nATON.ROOT_NID = \".\"; // reserved node ID for graph-roots\r\n\r\nATON.RAD2DEG = (180.0 / Math.PI);\r\nATON.DEG2RAD = (Math.PI / 180.0);\r\n\r\nATON.PATCH_ADD = 0;\r\nATON.PATCH_DEL = 1;\r\n\r\n// Node types\r\nATON.NTYPES = {};\r\n// 1 and 2 are reserved\r\nATON.NTYPES.SCENE = 3;\r\nATON.NTYPES.SEM = 4;\r\nATON.NTYPES.UI = 5;\r\n\r\n// Folders\r\nATON.PATH_RESTAPI = window.location.origin + \"/api/\"; // \"../api/\";\r\nATON.PATH_RESTAPI_SCENE = ATON.PATH_RESTAPI + \"scene/\";\r\nATON.PATH_WAPPS = window.location.origin + \"/a/\";\r\nATON.PATH_MODS = window.location.origin + \"/mods/\"; // \"../mods/\";\r\n//ATON.PATH_THREE = ATON.PATH_MODS + \"three/\";\r\nATON.PATH_DRACO_LIB = window.location.origin + \"/dist/draco/\"; //ATON.PATH_THREE+\"examples/js/libs/draco/\";\r\nATON.PATH_BASIS_LIB = window.location.origin + \"/dist/basis/\"; //ATON.PATH_THREE+\"examples/js/libs/basis/\";\r\nATON.PATH_IFC_LIB = window.location.origin + \"/dist/ifc/\";\r\n\r\nATON.PATH_COLLECTION = window.location.origin + \"/collections/\"; // \"../collection/\";\r\nATON.PATH_SCENES = window.location.origin + \"/scenes/\"; // \"../scenes/\";\r\nATON.PATH_RES = window.location.origin + \"/res/\"; // \"../res/\";\r\nATON.PATH_FE = window.location.origin + \"/fe/\"; // \"../res/\";\r\n\r\nATON.SHADOWS_NEAR = 0.1;\r\nATON.SHADOWS_FAR = 50.0; //50.0;\r\nATON.SHADOWS_SIZE = 15.0;\r\nATON.SHADOWS_RES = 1024; // 512\r\n\r\nATON.AMB_L = 0.1; // Ambient when using direct lighting\r\n\r\n\r\n/**\r\nSet path collection (3D models, audio, panoramas, ...)\r\n@param {string} path - path\r\n*/\r\nATON.setPathCollection = (path)=>{\r\n ATON.PATH_COLLECTION = /*window.location.origin + */path;\r\n //ATON.PATH_MODELS = ATON.PATH_COLLECTION+\"models/\";\r\n};\r\n\r\n/**\r\nSet path scenes\r\n@param {string} path - path\r\n*/\r\nATON.setPathScenes = (path)=>{\r\n ATON.PATH_SCENES = /*window.location.origin +*/ path;\r\n};\r\n\r\n// For resuming suspended audio/video streams\r\nATON._onUserInteraction = ()=>{\r\n if (ATON._elPanoVideo && !ATON._vpanoPlaying) ATON._elPanoVideo.play();\r\n if (ATON.AudioHub._listener.context.state === 'suspended') ATON.AudioHub._listener.context.resume();\r\n};\r\n\r\nATON._setupBaseListeners = ()=>{\r\n let el = ATON._renderer.domElement;\r\n\r\n window.addEventListener( 'resize', ATON._onResize, false );\r\n window.onorientationchange = ATON._readDeviceOrientationMode;\r\n\r\n if (screenfull.isEnabled){\r\n\t screenfull.on('change', ()=>{\r\n ATON._bFS = screenfull.isFullscreen;\r\n ATON.fireEvent(\"Fullscreen\", ATON._bFS);\r\n\r\n\t\t if (ATON._bFS) console.log(\"Now fullscreen\");\r\n else console.log(\"Exit fullscreen\");\r\n\t });\r\n }\r\n\r\n/*\r\n document.addEventListener('webkitfullscreenchange', ATON._onFSchange, false);\r\n document.addEventListener('mozfullscreenchange', ATON._onFSchange, false);\r\n document.addEventListener('fullscreenchange', ATON._onFSchange, false);\r\n document.addEventListener('MSFullscreenChange', ATON._onFSchange, false);\r\n*/\r\n el.addEventListener( 'mousemove', ATON._updateScreenMove, false );\r\n ///el.addEventListener('dblclick', ATON._doubleTap, false);\r\n\r\n el.addEventListener('mousedown', (e)=>{\r\n if (e.button === 1) ATON.fireEvent(\"MouseMidButton\"); // middle-click\r\n if (e.button === 2) ATON.fireEvent(\"MouseRightButton\"); // right-click\r\n });\r\n\r\n el.addEventListener( 'wheel', ATON._onMouseWheel, false );\r\n\r\n // Generic pointer\r\n ATON._bPointerDown = false;\r\n window.addEventListener('pointerdown', (e)=>{\r\n ATON._bPointerDown = true;\r\n ATON._onUserInteraction();\r\n });\r\n window.addEventListener('pointerup', (e)=>{\r\n ATON._bPointerDown = false;\r\n });\r\n window.addEventListener('pointermove', (e)=>{\r\n if (!ATON._bPointerDown) return;\r\n\r\n ATON._updateScreenMove(e);\r\n ATON._handleQueries();\r\n });\r\n\r\n window.addEventListener('touchstart', (e)=>{\r\n ATON._bPointerDown = true;\r\n ATON._onUserInteraction();\r\n });\r\n window.addEventListener('touchend', (e)=>{\r\n ATON._bPointerDown = false;\r\n });\r\n window.addEventListener('touchmove', (e)=>{\r\n if (!ATON._bPointerDown) return;\r\n\r\n ATON._updateScreenMove(e.touches[0]);\r\n ATON._handleQueries();\r\n });\r\n\r\n/*\r\n Hammer(el).on(\"press pressup\", (ev)=>{\r\n\r\n // Hold gesture start (press)\r\n if (ev.type == \"press\") {\r\n console.log(\"Hold active\");\r\n }\r\n\r\n // Hold gesture stop (pressup)\r\n if (ev.type == \"pressup\") {\r\n console.log(\"Hold inactive\");\r\n }\r\n });\r\n*/\r\n // Touch events\r\n Hammer(el).on(\"doubletap\", (e)=>{\r\n ATON._bPointerDown = false;\r\n ATON.fireEvent(\"DoubleTap\", e.srcEvent);\r\n //console.log(e.srcEvent);\r\n });\r\n\r\n Hammer(el).on(\"tap\", (e)=>{\r\n //ATON._evPointer = e.srcEvent;\r\n ATON._bPointerDown = false;\r\n\r\n ATON._onUserInteraction();\r\n\r\n ATON._updateScreenMove(e.srcEvent);\r\n ATON._handleQueries();\r\n\r\n ATON.fireEvent(\"Tap\", e.srcEvent);\r\n //console.log(e.srcEvent);\r\n\r\n // UI selection\r\n if (ATON._hoveredUI === undefined) return;\r\n let H = ATON.getUINode(ATON._hoveredUI);\r\n if (H && H.onSelect) H.onSelect();\r\n });\r\n\r\n ATON.on(\"DoubleTap\", (e)=>{\r\n //console.log(e);\r\n ATON.defaultDoubleTapFromScreenCoords(e);\r\n });\r\n\r\n\r\n // Keyboard\r\n ATON._kModShift = false;\r\n ATON._kModCtrl = false;\r\n\r\n ATON._bListenKeyboardEvents = true; // FIXME: check if there's a better way\r\n\r\n window.addEventListener(\"keydown\", (e)=>{\r\n //e.preventDefault();\r\n ATON._onUserInteraction();\r\n\r\n if (e.key === \"Shift\") ATON._kModShift = true;\r\n if (e.key === \"Control\") ATON._kModCtrl = true;\r\n \r\n if (!ATON._bListenKeyboardEvents) return;\r\n\r\n ATON.fireEvent(\"KeyPress\", e.key);\r\n //ATON.fireEvent(\"KeyPress/\"+e.key);\r\n }, false);\r\n\r\n window.addEventListener(\"keyup\", (e)=>{\r\n //e.preventDefault();\r\n\r\n if (e.key === \"Shift\") ATON._kModShift = false;\r\n if (e.key === \"Control\") ATON._kModCtrl = false;\r\n\r\n if (!ATON._bListenKeyboardEvents) return;\r\n\r\n ATON.fireEvent(\"KeyUp\", e.key);\r\n //ATON.fireEvent(\"KeyUp/\"+e.key);\r\n }, false);\r\n\r\n // Defaults\r\n ATON.on(\"KeyPress\", (k)=>{\r\n\r\n if (k==='+'){\r\n let f = ATON.Nav.getFOV() + 1.0;\r\n ATON.Nav.setFOV(f);\r\n }\r\n if (k==='-'){\r\n let f = ATON.Nav.getFOV() - 1.0;\r\n ATON.Nav.setFOV(f);\r\n }\r\n\r\n if (k==='PageUp'){\r\n let r = ATON.SUI.mainSelector.scale.x + 0.02;\r\n ATON.SUI.setSelectorRadius(r);\r\n }\r\n if (k==='PageDown'){\r\n let r = ATON.SUI.mainSelector.scale.x - 0.02;\r\n r = Math.max(r, 0.01);\r\n ATON.SUI.setSelectorRadius(r); \r\n }\r\n });\r\n\r\n // Default semantic highlight\r\n/*\r\n ATON.on(\"SemanticNodeLeave\", (semid)=>{\r\n let S = ATON.getSemanticNode(semid);\r\n if (S) S.restoreDefaultMaterial();\r\n });\r\n ATON.on(\"SemanticNodeHover\", (semid)=>{\r\n let S = ATON.getSemanticNode(semid);\r\n if (S) S.highlight();\r\n });\r\n*/ \r\n};\r\n\r\nATON._onResize = ()=>{\r\n ATON.Nav._camera.aspect = window.innerWidth / window.innerHeight;\r\n ATON.Nav._camera.updateProjectionMatrix();\r\n\r\n ATON._renderer.setSize( window.innerWidth, window.innerHeight );\r\n\r\n if (ATON.FX.composer){\r\n ATON.FX.composer.setSize( window.innerWidth, window.innerHeight );\r\n let UU = ATON.FX.passes[ATON.FX.PASS_AA].material.uniforms;\r\n if (UU) UU.resolution.value.set( (1/window.innerWidth), (1/window.innerHeight) );\r\n }\r\n \r\n console.log(\"onResize\");\r\n};\r\n\r\nATON._onMouseWheel = (e)=>{\r\n e.preventDefault();\r\n\r\n ATON.fireEvent(\"MouseWheel\", e.deltaY);\r\n};\r\n\r\nATON.focusOn3DView = ()=>{\r\n ATON._renderer.domElement.focus();\r\n};\r\n\r\n// Base/default routine on generic user activation\r\n// E.g. double-tap, VR controller trigger, etc.\r\nATON._SUIactivation = ()=>{\r\n const U = ATON.getUINode(ATON._hoveredUI);\r\n \r\n if (U === undefined) return false;\r\n if (U.onSelect === undefined) return false;\r\n\r\n U.onSelect();\r\n return true;\r\n};\r\n\r\n\r\nATON._stdActivation = ()=>{\r\n //if (!ATON.Nav._bControl) return;\r\n\r\n // Handle SUI nodes\r\n if (ATON._SUIactivation()) return;\r\n\r\n if (!ATON.Nav._bControl) return;\r\n\r\n // Handle active immersive AR/VR session\r\n if (ATON.XR._bPresenting){\r\n if (XR._sessionType === \"immersive-vr\") XR.teleportOnQueriedPoint();\r\n ATON.FE.playAudioFromSemanticNode(ATON._hoveredSemNode);\r\n return;\r\n }\r\n\r\n // Non-immersive sessions\r\n let bFPtrans = ATON.Nav.isFirstPerson() || ATON.Nav.isDevOri();\r\n\r\n // When first-person mode, teleport (non immersive)\r\n if (bFPtrans){\r\n if (ATON.Nav.currentQueryValidForLocomotion()){\r\n let P = ATON._queryDataScene.p;\r\n //let N = ATON._queryDataScene.n;\r\n\r\n let currDir = ATON.Nav._vDir;\r\n let feye = new THREE.Vector3(P.x, P.y+ATON.userHeight, P.z);\r\n let ftgt = new THREE.Vector3(\r\n feye.x + currDir.x,\r\n feye.y + currDir.y,\r\n feye.z + currDir.z,\r\n );\r\n\r\n let POV = new ATON.POV().setPosition(feye).setTarget(ftgt).setFOV(ATON.Nav._currPOV.fov);\r\n\r\n ATON.Nav.requestPOV(POV, 0.5);\r\n }\r\n return;\r\n }\r\n\r\n // In orbit mode, focus on selected SemNode...\r\n let hsn = ATON.getSemanticNode(ATON._hoveredSemNode);\r\n if (ATON._queryDataSem && hsn){\r\n ATON.Nav.requestPOVbyNode( hsn, 0.5);\r\n return;\r\n }\r\n // ...or perform standard retarget on picked surface point\r\n if (ATON._queryDataScene){\r\n ATON.Nav.requestRetarget(ATON._queryDataScene.p, /*ATON._queryDataScene.n*/undefined, 0.5);\r\n }\r\n\r\n // TODO: go POV in sight if any (panorama only mode)\r\n};\r\n\r\n// Default retarget from screen coordinates (eg.: on double tap)\r\nATON.defaultDoubleTapFromScreenCoords = (e)=>{\r\n ATON._updateScreenMove(e);\r\n ATON._handleQueryScene();\r\n\r\n ATON._stdActivation();\r\n}\r\n\r\n// Fullscreen\r\nATON.isFullscreen = ()=>{\r\n return ATON._bFS;\r\n/*\r\n if (document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement !== undefined){\r\n return true;\r\n }\r\n\r\n return false;\r\n*/\r\n};\r\n\r\n\r\nATON.toggleFullScreen = ()=>{\r\n screenfull.toggle();\r\n};\r\n\r\n\r\n//============================================================================\r\n// ATON init routines\r\n//============================================================================\r\n/**\r\nMain ATON initialization, it will take care of all sub-components initialization, device profiling and much more\r\n@example\r\nATON.realize()\r\n*/\r\nATON.realize = ()=>{\r\n console.log(\"Initialize ATON...\");\r\n\r\n ATON.Utils.init();\r\n ATON.Utils.profileDevice();\r\n \r\n //THREE.Object3D.DefaultUp = new THREE.Vector3(0,0,1); // mismatches WebXR y-up\r\n\r\n // Timing\r\n ATON._clock = new THREE.Clock(true);\r\n\r\n ATON._bFS = false; // fullscreen\r\n\r\n const wglopts = {\r\n //canvas: document.getElementById(\"View3D\"),\r\n antialias: true, //ATON.device.isMobile? false : true,\r\n alpha: false, //true,\r\n\r\n powerPreference: \"high-performance\",\r\n ///pecision: \"lowp\", //\"mediump\"\r\n //preserveDrawingBuffer: true\r\n };\r\n\r\n ATON._renderer = new THREE.WebGLRenderer(wglopts);\r\n ATON._renderer.setSize( window.innerWidth, window.innerHeight );\r\n //console.log(ATON._renderer);\r\n\r\n //ATON._renderer.domElement.style.filter = \"blur(10px)\";\r\n\r\n // Capabilities from initialized renderer\r\n ATON.Utils.profileRenderingCapabilities();\r\n\r\n ATON._stdpxd = 1.0;\r\n //ATON._stdpxd = window.devicePixelRatio? (window.devicePixelRatio) : 1.0;\r\n ATON._renderer.setPixelRatio( ATON._stdpxd );\r\n //console.log(ATON._stdpxd);\r\n\r\n // Framerate management\r\n ATON._fps = 60.0;\r\n ATON._dt = 0.01;\r\n ATON._dtAccum = 0.0;\r\n ATON._avgFPScount = 0.0;\r\n ATON._avgFPSaccum = 0.0;\r\n ATON._avgFPS = 60.0;\r\n\r\n ATON._bDynamicDensity = false; //true;\r\n ATON._dRenderBudgetMinFPS = 30.0;\r\n ATON._dRenderBudgetMaxFPS = 55.0;\r\n\r\n ATON._aniMixers = [];\r\n \r\n ATON._renderer.outputEncoding = THREE.sRGBEncoding;\r\n ATON._renderer.toneMapping = THREE.LinearToneMapping; // THREE.ACESFilmicToneMapping\r\n ATON._renderer.toneMappingExposure = 1.0;\r\n\r\n //console.log(ATON._renderer.getPixelRatio());\r\n\r\n ATON._renderer.setAnimationLoop( ATON._onFrame );\r\n //ATON._bDirtyLP = false;\r\n\r\n ATON._maxAnisotropy = ATON._renderer.capabilities.getMaxAnisotropy();\r\n //console.log(ATON._renderer.capabilities);\r\n\r\n THREE.Cache.enabled = true;\r\n\r\n ATON.userHeight = 1.7;\r\n \r\n document.body.appendChild( ATON._renderer.domElement );\r\n //console.log(ATON._renderer);\r\n \r\n let canvas = ATON._renderer.domElement;\r\n canvas.style.outline = \"none\";\r\n canvas.style.border = \"none\";\r\n //canvas.style.padding = \"0px\";\r\n //canvas.style.margin = \"0px\";\r\n //canvas.style.width = \"100%\";\r\n //canvas.style.height = \"100%\";\r\n\r\n // Multimedia\r\n ATON._vpanoPlaying = false;\r\n ATON._bUserInts = 0;\r\n\r\n ATON.EventHub.init();\r\n ATON.MatHub.init();\r\n\r\n //ATON._setupLoadManager();\r\n ATON._assetsManager = {};\r\n ATON._aLoader = new THREE.GLTFLoader(/*ATON._loadManager*/);\r\n ATON._numReqLoad = 0;\r\n \r\n ATON._dracoLoader = new THREE.DRACOLoader();\r\n ATON._dracoLoader.setDecoderConfig({type: \"wasm\"});\r\n ATON._dracoLoader.setDecoderPath( ATON.PATH_DRACO_LIB );\r\n ATON._dracoLoader.setWorkerLimit(2);\r\n ATON._dracoLoader.preload();\r\n ATON._aLoader.setDRACOLoader( ATON._dracoLoader );\r\n\r\n // CC Manager\r\n ATON._ccModels = [];\r\n\r\n // Update routines\r\n ATON._updRoutines = [];\r\n\r\n // Periods (TODO:)\r\n //ATON.periods = [];\r\n\r\n ATON._lps = []; // lightprobes\r\n ATON._bAutoLP = false;\r\n ATON._envMapInt = 1.0;\r\n //ATON._dirtyLPs = true;\r\n ATON._bShadowsFixedBound = false;\r\n ATON._shadowsFixedBoundCenter = undefined;\r\n\r\n ATON._shadowsNear = ATON.SHADOWS_NEAR;\r\n ATON._shadowsFar = ATON.SHADOWS_FAR;\r\n ATON._shadowsSize = ATON.SHADOWS_SIZE;\r\n ATON._shadowsRes = ATON.SHADOWS_RES;\r\n\r\n ATON.initGraphs();\r\n ATON.SceneHub.init();\r\n\r\n // TileSets (3D Tiles)\r\n ATON._tsets = [];\r\n\r\n // Init audio hub\r\n ATON.AudioHub.init();\r\n\r\n // Init nav system\r\n ATON.Nav.init();\r\n\r\n // XR\r\n ATON.XR.init();\r\n\r\n // Spatial UI\r\n ATON.SUI.init();\r\n\r\n // VRoadcast\r\n ATON.VRoadcast.init();\r\n\r\n // Media Recorder\r\n ATON.MediaRec.init();\r\n\r\n // Semantic Factory\r\n ATON.SemFactory.init();\r\n\r\n // App Hub\r\n ATON.AppHub.init();\r\n\r\n // GeoLoc\r\n ATON.GeoLoc.init();\r\n\r\n\r\n // FX Composer setup\r\n if (!ATON.device.lowGPU) ATON.FX.init();\r\n\r\n // Query / picked data\r\n ATON._queryDataScene = undefined;\r\n ATON._queryDataSem = undefined;\r\n ATON._queryDataUI = undefined;\r\n\r\n ATON._hoveredSemNode = undefined;\r\n ATON._hoveredUI = undefined;\r\n\r\n ATON._bQuerySemOcclusion = true;\r\n ATON._bQueryNormals = true;\r\n ATON._bPauseQuery = false;\r\n ATON._bCenteredQuery = false;\r\n \r\n ATON._bqScene = false;\r\n ATON._bqSem = false;\r\n\r\n // Timed Gaze Input\r\n ATON._tgiDur = undefined; // set to seconds (e.g. 2.0 to enable)\r\n ATON._tgiPer = undefined; // tgi percentage\r\n ATON._tHover = undefined;\r\n\r\n // Main Panorama\r\n ATON._bMainPanoInfinite = true;\r\n ATON._matMainPano = undefined;\r\n ATON._mMainPano = undefined;\r\n\r\n //window.setInterval(()=>{ if (!ATON._bPauseQuery) ATON._handleQueries(); }, 500 );\r\n\r\n\r\n // IFC\r\n/*\r\n ATON._ifcLoader = new IFCLoader();\r\n ATON._ifcLoader.setWasmPath( ATON.PATH_IFC_LIB );\r\n*/\r\n\r\n // Basis\r\n/*\r\n ATON._basisLoader = new BasisTextureLoader();\r\n ATON._basisLoader.setTranscoderPath( ATON.PATH_BASIS_LIB );\r\n ATON._basisLoader.detectSupport( ATON._renderer );\r\n \r\n // Register BasisTextureLoader for .basis extension.\r\n THREE.DefaultLoadingManager.addHandler( /\\.basis$/, ATON._basisLoader );\r\n*/\r\n\r\n\r\n // Mouse/Touch screen coords\r\n ATON._screenPointerCoords = new THREE.Vector2(0.0,0.0);\r\n\r\n // Ray casters\r\n ATON._rcScene = new THREE.Raycaster();\r\n ATON._rcScene.layers.set(ATON.NTYPES.SCENE);\r\n ATON._rcSemantics = new THREE.Raycaster();\r\n ATON._rcSemantics.layers.set(ATON.NTYPES.SEM);\r\n ATON._rcUI = new THREE.Raycaster();\r\n ATON._rcUI.layers.set(ATON.NTYPES.UI);\r\n\r\n ATON._registerRCS(); // not used for now\r\n\r\n ATON._setupBaseListeners();\r\n\r\n if (ATON.device.isMobile) ATON._readDeviceOrientationMode();\r\n\r\n ATON._wappID = undefined;\r\n\r\n // External API/services\r\n ATON._extAPItokens = {};\r\n\r\n ATON.focusOn3DView();\r\n};\r\n\r\n/**\r\nSet timed-gaze duration\r\n@param {number} dt - time to trigger activation\r\n*/\r\nATON.setTimedGazeDuration = (dt)=>{\r\n ATON._tgiDur = dt;\r\n};\r\n\r\n/**\r\nGet timed-gaze current progress (percentage)\r\n@returns {number}\r\n*/\r\nATON.getTimedGazeProgress = ()=>{\r\n if (ATON._tgiDur === undefined) return undefined;\r\n return ATON._tgiPer;\r\n};\r\n\r\n/**\r\nGet current elapsed time (global clock) since ATON initialization\r\n@returns {number}\r\n*/\r\nATON.getElapsedTime = ()=>{\r\n return ATON._clock.elapsedTime;\r\n};\r\n\r\n/**\r\nPause rendering\r\n*/\r\nATON.renderPause = ()=>{\r\n ATON._renderer.setAnimationLoop( undefined );\r\n};\r\n\r\n/**\r\nResume rendering (if paused)\r\n*/\r\nATON.renderResume = ()=>{\r\n ATON._renderer.setAnimationLoop( ATON._onFrame );\r\n};\r\n\r\nATON._setupLoadManager = ()=>{\r\n ATON._loadManager = new THREE.LoadingManager();\r\n ATON._loadManager.onStart = ( url, itemsLoaded, itemsTotal )=>{\r\n\t console.log( 'Started loading file: ' + url + '.\\nLoaded ' + itemsLoaded + ' of ' + itemsTotal + ' files.' );\r\n ATON.fireEvent(\"NodeRequestFired\", url);\r\n };\r\n\r\n ATON._loadManager.onLoad = ()=>{\r\n\t console.log( 'Loading complete!');\r\n ATON.fireEvent(\"AllNodeRequestsCompleted\");\r\n };\r\n\r\n ATON._loadManager.onProgress = ( url, itemsLoaded, itemsTotal )=>{\r\n\t //console.log( 'Loading file: ' + url + '.\\nLoaded ' + itemsLoaded + ' of ' + itemsTotal + ' files.' );\r\n };\r\n\r\n ATON._loadManager.onError = ( url )=>{\r\n\t console.log( 'There was an error loading ' + url );\r\n };\r\n};\r\n\r\n/**\r\nSet the default pixel density (standard is 1.0)\r\n@example\r\nATON.setDefaultPixelDensity(0.5)\r\n*/\r\nATON.setDefaultPixelDensity = (d)=>{\r\n ATON._stdpxd = d;\r\n\r\n ATON._renderer.setPixelRatio( d );\r\n\r\n if (ATON.FX.composer) ATON.FX.composer.setPixelRatio(d);\r\n\r\n // WebXR density\r\n if (ATON._renderer.xr === undefined) return;\r\n\r\n if (ATON.device.isMobile) ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd * ATON.XR.MOBILE_DENSITY_F);\r\n else ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd);\r\n //ATON._renderer.xr.setFramebufferScaleFactor(1.0);\r\n};\r\n\r\n/**\r\nReset pixel density to default\r\n*/\r\nATON.resetPixelDensity = ()=>{\r\n ATON._renderer.setPixelRatio( ATON._stdpxd );\r\n};\r\n\r\nATON._readDeviceOrientationMode = ()=>{\r\n if (Math.abs(window.orientation) === 90){\r\n console.log(\"Landscape Mode\");\r\n ATON.fireEvent(\"MobileLandscapeMode\");\r\n }\r\n else {\r\n console.log(\"Portrait Mode\");\r\n ATON.fireEvent(\"MobilePortraitMode\");\r\n }\r\n\r\n setTimeout( ATON._onResize, 500);\r\n};\r\n\r\n\r\n//============================================================================\r\n// Scene-graphs\r\n//============================================================================\r\nATON.snodes = {}; // Visible scene-graph\r\nATON.semnodes = {}; // Semantics graph\r\nATON.uinodes = {}; // UI graph\r\n\r\n// Visible scene-graph\r\n//=============================================\r\n/**\r\nCreate a scene node (visible scene-graph)\r\n@param {string} id - a string representing unique ID of the node (optional)\r\n@returns {Node}\r\n*/\r\nATON.createSceneNode = (id)=>{\r\n return new ATON.Node(id, ATON.NTYPES.SCENE);\r\n};\r\n\r\n/**\r\nGet a previously created scene node (visible scene-graph)\r\n@param {string} id - the node ID\r\n@returns {Node}\r\n*/\r\nATON.getSceneNode = (id)=>{ \r\n if (id === undefined) return undefined; \r\n return ATON.snodes[id];\r\n};\r\n\r\n/**\r\nGet or create a scene node (visible scene-graph)\r\n@param {string} id - the node ID\r\n@returns {Node}\r\n*/\r\nATON.getOrCreateSceneNode = (id)=>{\r\n let N = ATON.getSceneNode(id);\r\n if (N !== undefined) return N;\r\n return ATON.createSceneNode(id);\r\n};\r\n\r\n/**\r\nGet root (visible scene-graph)\r\n@returns {Node}\r\n*/\r\nATON.getRootScene = ()=>{\r\n return ATON._rootVisible;\r\n};\r\n\r\n// Semantics, shape descriptors\r\n//=============================================\r\n\r\n/**\r\nCreate a semantic node\r\n@param {string} id - a string representing unique ID of the node (optional)\r\n@returns {Node}\r\n*/\r\nATON.createSemanticNode = (id)=>{\r\n return new ATON.Node(id, ATON.NTYPES.SEM);\r\n};\r\n\r\n/**\r\nGet a previously created semantic node\r\n@param {string} id - the node ID\r\n@returns {Node}\r\n*/\r\nATON.getSemanticNode = (id)=>{\r\n if (id === undefined) return undefined; \r\n return ATON.semnodes[id];\r\n};\r\n\r\n/**\r\nGet or create a semantic node\r\n@param {string} id - the node ID\r\n@returns {Node}\r\n*/\r\nATON.getOrCreateSemanticNode = (id)=>{\r\n let S = ATON.getSemanticNode(id);\r\n if (S !== undefined) return S;\r\n return ATON.createSemanticNode(id);\r\n};\r\n\r\n/**\r\nGet root of semantic graph\r\n@returns {Node}\r\n*/\r\nATON.getRootSemantics = ()=>{\r\n return ATON._rootSem;\r\n};\r\n\r\n// UI graph\r\n//=============================================\r\n\r\n/**\r\nCreate a UI node\r\n@param {string} id - a string representing unique ID of the node (optional)\r\n@returns {Node}\r\n*/\r\nATON.createUINode = (id)=>{\r\n return new ATON.Node(id, ATON.NTYPES.UI);\r\n};\r\n\r\n/**\r\nGet a previously created UI node\r\n@param {string} id - the node ID\r\n@returns {Node}\r\n*/\r\nATON.getUINode = (id)=>{\r\n if (id === undefined) return undefined; \r\n return ATON.uinodes[id];\r\n};\r\n\r\n/**\r\nGet root of UI graph\r\n@returns {Node}\r\n*/\r\nATON.getRootUI = ()=>{\r\n return ATON._rootUI;\r\n};\r\n\r\n// Asset loading routines\r\nATON._assetReqNew = (url)=>{\r\n ATON._numReqLoad++;\r\n ATON.fireEvent(\"NodeRequestFired\", url);\r\n};\r\n\r\nATON._assetReqComplete = (url)=>{\r\n ATON.fireEvent(\"NodeRequestCompleted\", url);\r\n ATON._numReqLoad--;\r\n\r\n if (ATON._numReqLoad <= 0) ATON._onAllReqsCompleted();\r\n};\r\n\r\nATON._onAllReqsCompleted = ()=>{\r\n // Bounds\r\n let c = ATON._rootVisible.getBound().center;\r\n let r = ATON._rootVisible.getBound().radius;\r\n\r\n if (ATON._renderer.shadowMap.enabled){\r\n\r\n ATON._rootVisible.traverse((o) => {\r\n if (o.isMesh){\r\n o.castShadow = true;\r\n o.receiveShadow = true;\r\n }\r\n });\r\n\r\n ATON.adjustShadowsParamsFromSceneBounds();\r\n\r\n if (ATON._bShadowsFixedBound){\r\n ATON.updateDirShadows(/*c*/);\r\n }\r\n }\r\n\r\n if (ATON._bAutoLP){\r\n if (ATON._lps[0] === undefined) ATON.addLightProbe( new ATON.LightProbe().setPosition(c).setNear(r) );\r\n else {\r\n ATON._lps[0].setPosition(c.x, c.y, c.z).setNear(r);\r\n }\r\n console.log(\"Auto LP\");\r\n }\r\n\r\n // Post FX\r\n if (ATON.FX.composer){\r\n // Estimate DOF aperture from bound radius\r\n ATON.FX.setDOFaperture( 1.0 / (r*30.0));\r\n }\r\n\r\n //ATON.Utils.graphPostVisitor(ATON._rootVisible);\r\n\r\n // re-center main pano\r\n if (c && ATON._mMainPano) ATON._mMainPano.position.copy(c);\r\n\r\n ATON.getRootScene().assignLightProbesByProximity();\r\n //ATON.updateLightProbes();\r\n\r\n //ATON._bDirtyLP = true;\r\n\r\n ATON.fireEvent(\"AllNodeRequestsCompleted\");\r\n\r\n ATON._postAllReqsCompleted();\r\n\r\n // FIXME: dirty\r\n setTimeout( ()=>{\r\n //if (c && ATON._mMainPano) ATON._mMainPano.position.copy(c);\r\n ATON.updateLightProbes();\r\n\r\n // Lazy shadows updates (performances)\r\n if (ATON._renderer.shadowMap.enabled && ATON._bShadowsFixedBound && ATON._aniMixers.length === 0){\r\n ATON._dMainL.shadow.autoUpdate = false;\r\n console.log(\"Lazy shadows\");\r\n }\r\n }, 1000);\r\n};\r\n\r\nATON._postAllReqsCompleted = (R)=>{\r\n if (R === undefined) R = ATON._rootVisible;\r\n\r\n for (let n in R.children){\r\n let N = R.children[n];\r\n\r\n if (N && N.toggle){\r\n ATON._postAllReqsCompleted(N);\r\n N.toggle(N.visible);\r\n //if (N.bPickable !== undefined) N.setPickable(N.bPickable);\r\n }\r\n }\r\n};\r\n\r\n\r\nATON.initGraphs = ()=>{\r\n // Global root\r\n ATON._mainRoot = new THREE.Scene();\r\n ATON._mainRoot.background = new THREE.Color( 0.7,0.7,0.7 );\r\n //ATON._mainRoot.fog = new THREE.Fog(new THREE.Color( 0.7,0.7,0.7 ), 5, 200);\r\n\r\n // visible scene-graph\r\n ATON._rootVisibleGlobal = new THREE.Group();\r\n ATON._mainRoot.add(ATON._rootVisibleGlobal);\r\n\r\n ATON._rootVisible = ATON.createSceneNode().setAsRoot();\r\n ATON._rootVisibleGlobal.add(ATON._rootVisible);\r\n\r\n\r\n // semantics graph\r\n ATON._rootSem = ATON.createSemanticNode().setAsRoot();\r\n ATON._mainRoot.add(ATON._rootSem);\r\n\r\n // UI graph\r\n ATON._rootUI = ATON.createUINode().setAsRoot();\r\n //ATON._rootUI.renderOrder = 10;\r\n ATON._mainRoot.add(ATON._rootUI);\r\n\r\n // Uniform lighting\r\n ATON.ambLight = new THREE.AmbientLight( new THREE.Color(1,1,1) /*ATON._mainRoot.background*/ );\r\n ATON._rootVisibleGlobal.add(ATON.ambLight);\r\n};\r\n\r\nATON.setBackgroundColor = (bg)=>{\r\n ATON._mainRoot.background = bg;\r\n //ATON._mainRoot.fog = new THREE.Fog(bg, 5, 200);\r\n};\r\n\r\n//==============================================================\r\n// LightProbes (LPs)\r\n//==============================================================\r\nATON.setAutoLP = (b)=>{\r\n ATON._bAutoLP = b;\r\n};\r\n\r\nATON.setNeutralAmbientLight = (a)=>{\r\n ATON.ambLight.color = new THREE.Color( a,a,a );\r\n};\r\n\r\n/**\r\nAdd a LightProbe to the scene\r\n@param {LightProbe} LP - the light probe being added \r\n*/\r\nATON.addLightProbe = (LP)=>{\r\n if (LP === undefined) return;\r\n\r\n if (ATON._lps.length === 0) ATON.setNeutralAmbientLight(ATON.AMB_L);\r\n\r\n ATON._lps.push(LP);\r\n\r\n // SUI\r\n if (ATON.SUI.gLPIcons === undefined) return;\r\n SUI.addLPIcon(LP);\r\n};\r\n\r\n/**\r\nUpdate all LightProbes in the scene\r\n*/\r\nATON.updateLightProbes = ()=>{\r\n if (ATON._lps.length === 0) return;\r\n\r\n for (let i in ATON._lps){\r\n ATON._lps[i].update();\r\n/*\r\n if (ATON._indLPs === undefined) ATON._indLPs = [];\r\n if (ATON._indLPs[i]) ATON._mainRoot.remove(ATON._indLPs[i]);\r\n\r\n ATON._indLPs[i] = THREE.LightProbeGenerator.fromCubeRenderTarget( ATON._renderer, ATON._lps[i]._prevCCtarget );\r\n ATON._indLPs[i].intensity = 1.0;\r\n\r\n ATON._mainRoot.add( ATON._indLPs[i] );\r\n\r\n console.log(ATON._mainRoot);\r\n*/\r\n }\r\n\r\n // FIXME: indirect LP based on first LP (for now)\r\n if (ATON._lps[0]){\r\n if (ATON._indLP) ATON._mainRoot.remove(ATON._indLP);\r\n\r\n ATON._indLP = THREE.LightProbeGenerator.fromCubeRenderTarget( ATON._renderer, ATON._lps[0]._prevCCtarget );\r\n ATON._indLP.intensity = 1.0;\r\n\r\n ATON._mainRoot.add( ATON._indLP );\r\n }\r\n\r\n //for (let i in ATON._lps) ATON._lps[i].update();\r\n\r\n ATON._rootVisible.traverse((o) => {\r\n let LP = o.userData.LP;\r\n if (LP !== undefined && LP instanceof ATON.LightProbe){\r\n o.material.envMap = LP.getEnvTex();\r\n o.material.combine = THREE.AddOperation;\r\n o.material.envMapIntensity = ATON._envMapInt;\r\n }\r\n });\r\n\r\n console.log(\"LPs updated.\");\r\n};\r\n\r\n//==============================================================\r\n// Environment\r\n//==============================================================\r\n\r\n/**\r\nSet the main panorama (360)\r\n@param {string} path - url to equirectangular image\r\n@example\r\nATON.setMainPanorama(\"my/pano.jpg\");\r\n*/\r\nATON.setMainPanorama = (path)=>{\r\n let tpano = undefined;\r\n\r\n path = ATON.Utils.resolveCollectionURL(path);\r\n\r\n //const pmremGenerator = new THREE.PMREMGenerator( ATON._renderer );\r\n //pmremGenerator.compileEquirectangularShader();\r\n/*\r\n if (path.endsWith(\".hdr\")){\r\n new THREE.RGBELoader().setDataType( THREE.UnsignedByteType ).load(path, (hdr)=>{\r\n //const envMap = pmremGenerator.fromEquirectangular( hdr ).texture;\r\n \r\n tpano = hdr;\r\n if (ATON._matMainPano) ATON._matMainPano.map = hdr;\r\n });\r\n\r\n //return;\r\n }\r\n*/\r\n\r\n // Geometry\r\n if (ATON._mMainPano === undefined){\r\n ATON._gMainPano = new THREE.SphereBufferGeometry( /*ATON.Nav.STD_FAR * 0.8*/1.0, 60,60 );\r\n //ATON._gMainPano = new THREE.SphereGeometry( ATON.Nav.STD_FAR * 0.8, 60,60 );\r\n \r\n ATON._gMainPano.castShadow = false;\r\n ATON._gMainPano.receiveShadow = false;\r\n\r\n ATON._mMainPano = new THREE.Mesh(ATON._gMainPano, ATON._matMainPano);\r\n ATON._mMainPano.frustumCulled = false;\r\n ATON._mMainPano.renderOrder = -100;\r\n \r\n ATON.setMainPanoramaRadius(ATON.Nav.STD_FAR * 0.8);\r\n ///ATON.setMainPanoramaRadius(100.0);\r\n }\r\n\r\n // Panoramic Video\r\n if (ATON.Utils.isVideo(path)){\r\n // First time\r\n if (ATON._elPanoVideo === undefined){\r\n ATON._elPanoVideo = document.createElement('video');\r\n ATON._elPanoVideo.id = \"idPanoVideo\";\r\n ATON._elPanoVideo.innerHTML = \"\";\r\n ATON._elPanoVideo.crossOrigin = \"anonymous\";\r\n ATON._elPanoVideo.loop = true;\r\n ATON._elPanoVideo.playsinline = true;\r\n ATON._elPanoVideo.style.cssText = \"display:none;\";\r\n //ATON._elPanoVideo.src = path;\r\n ATON._elPanoVideo.autoplay = true;\r\n\r\n ATON._elPanoVideo.onplaying = ()=>{\r\n console.log(\"VideoPano playing\");\r\n ATON._vpanoPlaying = true;\r\n };\r\n }\r\n\r\n tpano = new THREE.VideoTexture( ATON._elPanoVideo );\r\n tpano.encoding = THREE.sRGBEncoding;\r\n //tpano.minFilter = THREE.NearestFilter;\r\n\t\t//tpano.generateMipmaps = false;\r\n //console.log(ATON._elPanoVideo);\r\n\r\n ATON._realizeOrUpdateMainPano(tpano);\r\n }\r\n // Static Panorama\r\n else {\r\n /*\r\n tpano = new THREE.TextureLoader().load(path);\r\n tpano.encoding = THREE.sRGBEncoding;\r\n //tpano.minFilter = THREE.NearestFilter;\r\n\t\ttpano.generateMipmaps = true;\r\n */\r\n ATON.Utils.textureLoader.load(path, (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n //tex.minFilter = THREE.NearestFilter;\r\n\t\t tex.generateMipmaps = true;\r\n\r\n ATON._realizeOrUpdateMainPano(tex);\r\n });\r\n }\r\n};\r\n\r\nATON._realizeOrUpdateMainPano = (tpano)=>{\r\n // We already created a main pano\r\n if (ATON._matMainPano !== undefined){\r\n ATON._matMainPano.map = tpano;\r\n //ATON._matMainPano.emissive = tpano;\r\n\r\n ATON.updateLightProbes();\r\n return;\r\n }\r\n\r\n ATON._matMainPano = new THREE.MeshBasicMaterial({ \r\n map: tpano,\r\n ///emissive: tpano,\r\n //fog: false,\r\n \r\n depthTest: false,\r\n depthWrite: false,\r\n \r\n ///depthFunc: THREE.AlwaysDepth,\r\n //side: THREE.BackSide, // THREE.DoubleSide\r\n });\r\n\r\n ATON._mMainPano.material = ATON._matMainPano;\r\n\r\n/*\r\n ATON._mMainPano = new THREE.Mesh(ATON._gMainPano, ATON._matMainPano);\r\n ATON._mMainPano.frustumCulled = false;\r\n ATON._mMainPano.renderOrder = -100;\r\n \r\n ATON.setMainPanoramaRadius(ATON.Nav.STD_FAR * 0.8);\r\n ///ATON.setMainPanoramaRadius(100.0);\r\n*/\r\n // FIXME: dirty, find another way\r\n if (ATON._bMainPanoInfinite){\r\n ATON._mMainPano.onAfterRender = ()=>{\r\n //if (ATON._numReqLoad > 0) return;\r\n if (ATON.Nav._currPOV) ATON._mMainPano.position.copy(ATON.Nav._currPOV.pos);\r\n };\r\n }\r\n\r\n ATON._rootVisibleGlobal.add(ATON._mMainPano);\r\n \r\n ATON.updateLightProbes();\r\n};\r\n\r\n\r\nATON.setMainPanoramaRadius = (r)=>{\r\n if (ATON._gMainPano === undefined) return;\r\n ATON._gMainPano.scale( -r,r,r );\r\n};\r\n\r\n/**\r\nSet main panorama rotation (radians) around up vector\r\n@param {number} r - rotation\r\n@example\r\nATON.setMainPanoramaRotation(1.5);\r\n*/\r\nATON.setMainPanoramaRotation = (r)=>{\r\n if (ATON._mMainPano === undefined) return;\r\n ATON._mMainPano.rotation.set( 0,r,0 );\r\n};\r\n\r\n/**\r\nEnable or disable main panorama infinite distance\r\n@param {boolean} b\r\n@example\r\nATON.setMainPanoramaInfinite(false);\r\n*/\r\nATON.setMainPanoramaInfinite = (b)=>{\r\n ATON._bMainPanoInfinite = b;\r\n\r\n if (ATON._mMainPano === undefined) return;\r\n\r\n if (b){\r\n ATON._mMainPano.onAfterRender = ()=>{\r\n //if (ATON._numReqLoad > 0) return;\r\n if (ATON.Nav._currPOV) ATON._mMainPano.position.copy(ATON.Nav._currPOV.pos);\r\n };\r\n }\r\n else {\r\n ATON._mMainPano.onAfterRender = undefined;\r\n }\r\n};\r\n\r\nATON.setMainPanoramaLocation = (c)=>{\r\n if (ATON._bMainPanoInfinite) return;\r\n if (ATON._mMainPano === undefined) return;\r\n\r\n ATON._mMainPano.position.copy(c); \r\n};\r\n\r\n/**\r\nSet and activate main directional light\r\n@param {THREE.Vector3} v - light direction\r\n@example\r\nATON.setMainLightDirection( new THREE.Vector(0.1,-1.0,0.0) );\r\n*/\r\nATON.setMainLightDirection = (v)=>{\r\n\r\n let d = v.clone();\r\n d.normalize();\r\n\r\n d.x *= ATON.SHADOWS_FAR * 0.5;\r\n d.y *= ATON.SHADOWS_FAR * 0.5;\r\n d.z *= ATON.SHADOWS_FAR * 0.5;\r\n\r\n if (ATON._dMainL === undefined){\r\n ATON._dMainL = new THREE.DirectionalLight( new THREE.Color(1,1,1), 1.0 );\r\n ATON._dMainL.castShadow = false;\r\n\r\n ATON._dMainLtgt = new THREE.Object3D();\r\n ATON._rootVisibleGlobal.add(ATON._dMainLtgt);\r\n ATON._dMainL.target = ATON._dMainLtgt;\r\n\r\n ATON._rootVisibleGlobal.add(ATON._dMainL);\r\n ATON._dMainLpos = new THREE.Vector3();\r\n }\r\n\r\n ATON._dMainLdir = d;\r\n\r\n ATON._dMainL.position.set(-d.x,-d.y,-d.z);\r\n\r\n if (ATON._renderer.shadowMap.enabled) ATON._dMainL.shadow.needsUpdate = true;\r\n\r\n ATON.toggleMainLight(true);\r\n};\r\n\r\nATON.getMainLightDirection = ()=>{\r\n if (ATON._dMainLdir === undefined) return undefined;\r\n\r\n let ld = ATON._dMainLdir.clone();\r\n ld.normalize();\r\n return ld;\r\n};\r\n\r\nATON.toggleMainLight = (b)=>{\r\n if (ATON._dMainL === undefined) return;\r\n ATON._dMainL.visible = b;\r\n \r\n if (b){\r\n ATON.setNeutralAmbientLight(ATON.AMB_L);\r\n ATON.updateDirShadows();\r\n }\r\n else ATON.setNeutralAmbientLight(1.0);\r\n};\r\n\r\nATON.isMainLightEnabled = ()=>{\r\n if (ATON._dMainL === undefined) return false;\r\n if (!ATON._dMainL.visible) return false;\r\n\r\n return true;\r\n};\r\n\r\nATON.setExposure = (d)=>{\r\n ATON._renderer.toneMappingExposure = d;\r\n};\r\nATON.getExposure = ()=>{\r\n return ATON._renderer.toneMappingExposure;\r\n};\r\n\r\n// Shadows\r\n// Smart adjustment of shadows params\r\nATON.adjustShadowsParamsFromSceneBounds = ()=>{\r\n if (ATON._dMainL === undefined) return;\r\n\r\n let r = ATON._rootVisible.getBound().radius;\r\n let c = ATON._rootVisible.getBound().center;\r\n \r\n if (r <= 0.0 || r >= ATON.SHADOWS_SIZE){\r\n ATON._bShadowsFixedBound = false;\r\n ATON._shadowsSize = ATON.SHADOWS_SIZE;\r\n //ATON._shadowsNear = ATON.SHADOWS_NEAR;\r\n //ATON._shadowsFar = ATON.SHADOWS_FAR;\r\n }\r\n else {\r\n ATON._bShadowsFixedBound = true;\r\n ATON._shadowsFixedBoundCenter = c;\r\n ATON._shadowsSize = r * 1.5;\r\n\r\n //console.log(ATON._shadowsNear,ATON._shadowsFar);\r\n }\r\n\r\n // must dispose when changing shadow params\r\n if (ATON._dMainL.shadow.map){\r\n ATON._dMainL.shadow.map.dispose();\r\n ATON._dMainL.shadow.map = null;\r\n }\r\n\r\n //console.log(ATON._dMainL.shadow.camera);\r\n\r\n ATON._dMainL.shadow.camera.left = -ATON._shadowsSize;\r\n ATON._dMainL.shadow.camera.right = ATON._shadowsSize;\r\n ATON._dMainL.shadow.camera.bottom = -ATON._shadowsSize;\r\n ATON._dMainL.shadow.camera.top = ATON._shadowsSize;\r\n\r\n ATON._dMainL.shadow.mapSize.width = ATON._shadowsRes;\r\n ATON._dMainL.shadow.mapSize.height = ATON._shadowsRes;\r\n ATON._dMainL.shadow.camera.near = ATON._shadowsNear;\r\n ATON._dMainL.shadow.camera.far = ATON._shadowsFar;\r\n\r\n //ATON._dMainL.shadow.camera.updateProjectionMatrix();\r\n\r\n let shb = -(r / 5000.0);\r\n if (shb < -0.0005) shb = -0.0005;\r\n\r\n ATON._dMainL.shadow.bias = shb;\r\n //ATON._dMainL.shadow.normalBias = 0.05;\r\n //ATON._dMainL.shadow.radius = 8;\r\n};\r\n\r\n\r\nATON.toggleShadows = (b)=>{\r\n if (ATON._dMainL === undefined) return;\r\n\r\n if (b){\r\n ATON._dMainL.castShadow = true;\r\n ATON._renderer.shadowMap.enabled = true;\r\n\r\n if (ATON.device.isMobile) ATON._renderer.shadowMap.type = THREE.PCFShadowMap;\r\n else ATON._renderer.shadowMap.type = THREE.PCFSoftShadowMap; // THREE.VSMShadowMap; \r\n\r\n //ATON._renderer.shadowMap.type = THREE.BasicShadowMap;\r\n //ATON._renderer.shadowMap.type = THREE.PCFShadowMap;\r\n //ATON._renderer.shadowMap.type = THREE.PCFSoftShadowMap; //\r\n //ATON._renderer.shadowMap.type = THREE.VSMShadowMap;\r\n\r\n ATON._rootVisible.traverse((o) => {\r\n if (o.isMesh){\r\n o.castShadow = true;\r\n o.receiveShadow = true;\r\n }\r\n });\r\n\r\n ATON.adjustShadowsParamsFromSceneBounds();\r\n\r\n ATON.updateDirShadows();\r\n/*\r\n if (ATON._bShadowsFixedBound){\r\n let c = ATON._rootVisible.getBound().center;\r\n ATON.updateDirShadows(c);\r\n }\r\n else ATON.updateDirShadows();\r\n*/\r\n ATON._dMainL.shadow.needsUpdate = true;\r\n\r\n console.log(\"Shadows ON\");\r\n }\r\n else {\r\n ATON._dMainL.castShadow = false;\r\n ATON._renderer.shadowMap.enabled = false;\r\n console.log(\"Shadows OFF\");\r\n }\r\n};\r\n\r\nATON.updateDirShadows = (/*p*/)=>{\r\n if (ATON._dMainLdir === undefined) return;\r\n\r\n let p = ATON._shadowsFixedBoundCenter;\r\n\r\n if (p === undefined){\r\n p = ATON.Nav.getCurrentEyeLocation();\r\n\r\n ATON._dMainLpos.x = p.x + (ATON.Nav._vDir.x * ATON._shadowsSize);\r\n ATON._dMainLpos.y = p.y + (ATON.Nav._vDir.y * ATON._shadowsSize);\r\n ATON._dMainLpos.z = p.z + (ATON.Nav._vDir.z * ATON._shadowsSize);\r\n }\r\n else {\r\n ATON._dMainLpos.x = p.x;\r\n ATON._dMainLpos.y = p.y;\r\n ATON._dMainLpos.z = p.z;\r\n }\r\n\r\n ATON._dMainL.position.set(\r\n ATON._dMainLpos.x - ATON._dMainLdir.x, \r\n ATON._dMainLpos.y - ATON._dMainLdir.y, \r\n ATON._dMainLpos.z - ATON._dMainLdir.z\r\n );\r\n\r\n ATON._dMainLtgt.position.copy(ATON._dMainLpos);\r\n};\r\n\r\nATON._updateEnvironment = ()=>{\r\n if (!ATON._renderer.shadowMap.enabled) return;\r\n if (ATON._bShadowsFixedBound) return;\r\n\r\n ATON.updateDirShadows();\r\n};\r\n\r\n// main audio\r\nATON.setGlobalAudio = (audioURL, bLoop)=>{\r\n if (audioURL === undefined) return;\r\n if (bLoop === undefined) bLoop = true;\r\n\r\n audioURL = ATON.Utils.resolveCollectionURL(audioURL);\r\n\r\n if (ATON._auMain === undefined || ATON._auMain === null) ATON._auMain = new THREE.Audio( ATON.AudioHub._listener );\r\n else if (ATON._auMain.isPlaying) ATON._auMain.stop();\r\n\r\n ATON.AudioHub._loader.load( audioURL, (buffer)=>{\r\n ATON._auMain.setBuffer( buffer );\r\n ATON._auMain.setLoop( bLoop );\r\n //ATON._auMain.setVolume( 2.0 );\r\n //A._auTalk.setPlaybackRate(0.9);\r\n ATON._auMain.play();\r\n });\r\n};\r\n\r\n// FPS monitoring\r\nATON._markFPS = ()=>{\r\n if (ATON._numReqLoad > 0) return;\r\n\r\n const fps = (1.0 / ATON._dt);\r\n\r\n ATON._avgFPScount += 1.0;\r\n ATON._dtAccum += ATON._dt;\r\n ATON._avgFPSaccum += fps;\r\n\r\n if (ATON._dtAccum < 1.0) return;\r\n\r\n ATON._fps = ATON._avgFPSaccum / ATON._avgFPScount;\r\n //console.log(ATON._fps);\r\n\r\n ATON._avgFPSaccum = 0.0;\r\n ATON._avgFPScount = 0.0;\r\n ATON._dtAccum = 0.0;\r\n\r\n // Handle dynamic render profiles\r\n ATON._handleDynamicRenderProfiles();\r\n};\r\n\r\n/**\r\nEnable or disable dynamic density for renderer\r\n@param {function} b - bool\r\n*/\r\nATON.toggleDynamicDensity = (b)=>{\r\n ATON._bDynamicDensity = b;\r\n};\r\n\r\n/**\r\nSet dynamic rendering FPS budgets. Default values are 30 and 55\r\n@param {number} minBudget - the lower bound to trigger a lower rendering profile\r\n@param {number} maxBudget - the upper bound to trigger a higher rendering profile\r\n*/\r\nATON.setDynamicRenderingFPS = (minBudget, maxBudget)=>{\r\n if (minBudget >= maxBudget) return;\r\n\r\n if (minBudget) ATON._dRenderBudgetMinFPS = minBudget;\r\n if (maxBudget) ATON._dRenderBudgetMaxFPS = maxBudget;\r\n};\r\n\r\n// Dynamic Render Profiles\r\nATON._handleDynamicRenderProfiles = ()=>{\r\n let d = ATON._renderer.getPixelRatio();\r\n\r\n // We need lower RP\r\n if (ATON._fps < ATON._dRenderBudgetMinFPS){\r\n\r\n if (ATON._bDynamicDensity){ // Dynamic density\r\n d *= 0.75;\r\n if (d >= 0.1){\r\n ATON._renderer.setPixelRatio( d );\r\n\r\n // change res to each pass\r\n //ATON.updateFXPassesResolution(d);\r\n if (ATON.FX.composer) ATON.FX.composer.setPixelRatio(d);\r\n\r\n console.log(d);\r\n }\r\n }\r\n\r\n ATON.fireEvent(\"RequestLowerRender\");\r\n //console.log(\"Need lower render profile\");\r\n }\r\n\r\n // Can go higher RP\r\n if (ATON._fps > ATON._dRenderBudgetMaxFPS){\r\n\r\n if (ATON._bDynamicDensity){ // Dynamic density\r\n d *= 1.33;\r\n if (d <= ATON._stdpxd){\r\n ATON._renderer.setPixelRatio( d );\r\n\r\n // change res to each pass\r\n //ATON.updateFXPassesResolution(d);\r\n if (ATON.FX.composer) ATON.FX.composer.setPixelRatio(d);\r\n\r\n console.log(d);\r\n }\r\n }\r\n\r\n ATON.fireEvent(\"RequestHigherRender\");\r\n //console.log(\"Can request higher render profile\");\r\n }\r\n};\r\n\r\n//==============================================================\r\n// Update routines\r\n//==============================================================\r\nATON._onFrame = ()=>{\r\n // TODO: add pause render\r\n\r\n ATON._dt = ATON._clock.getDelta();\r\n //ATON._fps = (1.0 / ATON._dt);\r\n \r\n ATON._markFPS();\r\n\r\n //ATON.fireEvent(\"preframe\");\r\n\r\n // Render\r\n //ATON._renderer.render( ATON._mainRoot, ATON.Nav._camera );\r\n\r\n\r\n if (ATON.XR._bPresenting) ATON.XR.update();\r\n else ATON.Nav._controls.update(ATON._dt);\r\n\r\n // Spatial queries\r\n ATON._handleQueries(); // k\r\n\r\n // Navigation system\r\n ATON.Nav.update(); // k\r\n\r\n // VRoadcast\r\n ATON.VRoadcast.update();\r\n\r\n // SUI\r\n ATON.SUI.update(); // k\r\n\r\n // Mat\r\n ATON.MatHub.update(); // k\r\n\r\n // Environment/lighting\r\n ATON._updateEnvironment();\r\n\r\n // 3D models animations\r\n ATON._updateAniMixers();\r\n\r\n ATON._updateRoutines();\r\n\r\n // TileSets\r\n ATON._updateTSets();\r\n\r\n // Render frame\r\n if (!ATON.FX.composer || ATON.XR._bPresenting)\r\n ATON._renderer.render( ATON._mainRoot, ATON.Nav._camera );\r\n else \r\n ATON.FX.composer.render();\r\n\r\n //ATON.fireEvent(\"frame\");\r\n};\r\n\r\n/**\r\nAdd an update routine (continuosly executed)\r\n@param {function} U - function\r\n*/\r\nATON.addUpdateRoutine = (U)=>{\r\n if (U === undefined) return;\r\n ATON._updRoutines.push(U);\r\n};\r\n\r\n/**\r\nRemoves all update routines\r\n*/\r\nATON.deleteAllUpdateRoutines = ()=>{\r\n ATON._updRoutines = [];\r\n};\r\n\r\nATON._updateRoutines = ()=>{\r\n let n = ATON._updRoutines.length;\r\n if (n <= 0) return;\r\n\r\n for (let u=0; u{\r\n const nts = ATON._tsets.length;\r\n if (nts <= 0) return;\r\n\r\n ATON.Nav._camera.updateMatrixWorld();\r\n //if (Nav._camOrbit) Nav._camOrbit.updateMatrixWorld();\r\n //if (Nav._camFP) Nav._camFP.updateMatrixWorld();\r\n\r\n for (let ts=0; ts{\r\n let num = ATON._aniMixers.length;\r\n if (num < 1) return;\r\n\r\n for (let m=0; m{\r\n if (e.preventDefault) e.preventDefault();\r\n\r\n if (ATON._bCenteredQuery) return;\r\n\r\n/*\r\n if (ATON.Nav._mode === ATON.Nav.MODE_DEVORI){\r\n ATON._screenPointerCoords.x = 0.0;\r\n ATON._screenPointerCoords.y = 0.0;\r\n return;\r\n }\r\n*/\r\n\tATON._screenPointerCoords.x = ( e.clientX / window.innerWidth ) * 2 - 1;\r\n\tATON._screenPointerCoords.y = -( e.clientY / window.innerHeight ) * 2 + 1;\r\n\r\n //console.log(ATON._screenPointerCoords);\r\n};\r\n\r\nATON.toggleCenteredQuery = (b)=>{\r\n ATON._bCenteredQuery = b;\r\n \r\n if (b){\r\n ATON._screenPointerCoords.x = 0.0;\r\n ATON._screenPointerCoords.y = 0.0;\r\n }\r\n};\r\n\r\n//==============================================================\r\n// Query rountines\r\n//==============================================================\r\nATON._registerRCS = ()=>{\r\n ATON._rcRR = 0;\r\n ATON._rcHandlers = [];\r\n\r\n ATON._rcHandlers.push( ATON._handleQueryScene );\r\n ATON._rcHandlers.push( ATON._handleQuerySemantics );\r\n ATON._rcHandlers.push( ATON._handleQueryUI );\r\n};\r\n\r\nATON._handleQueries = ()=>{\r\n if (ATON._bPauseQuery) return;\r\n if (ATON.Nav._bInteracting) return;\r\n if (ATON._numReqLoad > 0) return;\r\n\r\n if (ATON.Nav.isTransitioning()) return; // do not query during POV transitions\r\n //if (ATON.device.isMobile || !ATON.XR.isPresenting()) return; \r\n\r\n // interleaving mode\r\n //ATON._rcHandlers[ATON._rcRR]();\r\n //ATON._rcRR = (ATON._rcRR+1) % 3;\r\n\r\n ATON._handleQueryUI();\r\n\r\n if (ATON._bqScene) ATON._handleQueryScene();\r\n if (ATON._bqSem) ATON._handleQuerySemantics();\r\n \r\n //ATON._handleQueryUI();\r\n\r\n ATON.Nav.locomotionValidator();\r\n\r\n // Timed gaze input\r\n if (ATON._tgiDur === undefined) return;\r\n if (ATON._tHover === undefined) return;\r\n //console.log(ATON._tHover);\r\n\r\n const d = ATON._clock.elapsedTime - ATON._tHover;\r\n if (d >= ATON._tgiDur){\r\n ATON._stdActivation();\r\n\r\n ATON._tHover = undefined;\r\n ATON._tgiPer = undefined;\r\n }\r\n else ATON._tgiPer = (d/ATON._tgiDur);\r\n\r\n};\r\n\r\n// Ray casting visible scenegraph\r\nATON._handleQueryScene = ()=>{\r\n if (ATON.XR.isPresenting()){\r\n ATON.XR.setupQueryRay(ATON._rcScene);\r\n }\r\n else \r\n ATON._rcScene.setFromCamera( ATON._screenPointerCoords, ATON.Nav._camera );\r\n\r\n ATON._hitsScene = [];\r\n //ATON._rcScene.intersectObjects( ATON._rootVisible.children, true, ATON._hitsScene );\r\n ATON._rcScene.intersectObjects( ATON._mainRoot.children, true, ATON._hitsScene );\r\n\r\n //ATON._hitsOperator(ATON._hits);\r\n\r\n // Process hits\r\n const hitsnum = ATON._hitsScene.length;\r\n if (hitsnum <= 0){\r\n ATON._queryDataScene = undefined;\r\n return;\r\n }\r\n\r\n const h = ATON._hitsScene[0];\r\n\r\n ATON._queryDataScene = {};\r\n ATON._queryDataScene.p = h.point;\r\n ATON._queryDataScene.d = h.distance;\r\n ATON._queryDataScene.o = h.object;\r\n \r\n //console.log(ATON._queryDataScene.o);\r\n\r\n // Normals\r\n if (!ATON._bQueryNormals) return;\r\n if (h.face === null) return;\r\n if (h.face.normal === undefined) return;\r\n\r\n ATON._queryDataScene.matrixWorld = new THREE.Matrix3().getNormalMatrix( h.object.matrixWorld );\r\n ATON._queryDataScene.n = h.face.normal.clone().applyMatrix3( ATON._queryDataScene.matrixWorld ).normalize();\r\n};\r\n\r\n/**\r\nGet location of current queried point (if any) on visible scene.\r\nIf no point is queried, return undefined\r\n@returns {THREE.Vector3}\r\n@example\r\nlet p = ATON.getSceneQueriedPoint()\r\n*/\r\nATON.getSceneQueriedPoint = ()=>{\r\n if (ATON._queryDataScene === undefined) return undefined;\r\n return ATON._queryDataScene.p;\r\n};\r\n\r\n/**\r\nGet distance to queried location (if any) on visible scene.\r\nIf no point is queried, return undefined\r\n@returns {number}\r\n@example\r\nlet d = ATON.getSceneQueriedDistance()\r\n*/\r\nATON.getSceneQueriedDistance = ()=>{\r\n if (ATON._queryDataScene === undefined) return undefined;\r\n return ATON._queryDataScene.d;\r\n};\r\n\r\n/**\r\nGet queried location normal (if any) on visible scene.\r\nIf no point is queried, return undefined\r\n@returns {THREE.Vector3}\r\n@example\r\nlet n = ATON.getSceneQueriedNormal()\r\n*/\r\nATON.getSceneQueriedNormal = ()=>{\r\n if (ATON._queryDataScene === undefined) return undefined;\r\n return ATON._queryDataScene.n;\r\n};\r\n\r\n\r\n// Ray casting semantic-graph\r\nATON._handleQuerySemantics = ()=>{\r\n if (ATON.XR.isPresenting()){\r\n ATON.XR.setupQueryRay(ATON._rcSemantics);\r\n }\r\n else \r\n ATON._rcSemantics.setFromCamera( ATON._screenPointerCoords, ATON.Nav._camera );\r\n\r\n ATON._hitsSem = [];\r\n ATON._rcSemantics.intersectObjects( ATON._mainRoot.children, true, ATON._hitsSem );\r\n\r\n //console.log(ATON._hitsSem);\r\n\r\n // Process hits\r\n const hitsnum = ATON._hitsSem.length;\r\n if (hitsnum <= 0){\r\n ATON._queryDataSem = undefined;\r\n\r\n if (ATON._hoveredSemNode){\r\n ATON.fireEvent(\"SemanticNodeLeave\", ATON._hoveredSemNode);\r\n let S = ATON.getSemanticNode(ATON._hoveredSemNode);\r\n if (S && S.onLeave) S.onLeave();\r\n }\r\n \r\n ATON._hoveredSemNode = undefined;\r\n ATON._tHover = undefined;\r\n return;\r\n }\r\n\r\n const h = ATON._hitsSem[0];\r\n\r\n // Occlusion\r\n if (ATON._bQuerySemOcclusion && ATON._queryDataScene){\r\n if (ATON._queryDataScene.d < h.distance){\r\n\r\n ATON._queryDataSem = undefined;\r\n\r\n if (ATON._hoveredSemNode){\r\n ATON.fireEvent(\"SemanticNodeLeave\", ATON._hoveredSemNode);\r\n let S = ATON.getSemanticNode(ATON._hoveredSemNode);\r\n if (S && S.onLeave) S.onLeave();\r\n }\r\n\r\n ATON._hoveredSemNode = undefined;\r\n ATON._tHover = undefined;\r\n return;\r\n }\r\n }\r\n\r\n ATON._queryDataSem = {};\r\n ATON._queryDataSem.p = h.point;\r\n ATON._queryDataSem.d = h.distance;\r\n ATON._queryDataSem.o = h.object;\r\n ATON._queryDataSem.list = []; // holds sem-nodes parental list\r\n\r\n // traverse parents\r\n const L = ATON._queryDataSem.list;\r\n let sp = h.object.parent;\r\n while (sp){\r\n if (sp.nid && sp.nid !== ATON.ROOT_NID) L.push(sp.nid);\r\n sp = sp.parent;\r\n }\r\n\r\n const hsn = L[0];\r\n if (hsn){\r\n if (ATON._hoveredSemNode !== hsn){\r\n if (ATON._hoveredSemNode){\r\n ATON.fireEvent(\"SemanticNodeLeave\", ATON._hoveredSemNode);\r\n let S = ATON.getSemanticNode(ATON._hoveredSemNode);\r\n if (S && S.onLeave) S.onLeave();\r\n \r\n ATON._tHover = undefined;\r\n }\r\n\r\n ATON._hoveredSemNode = hsn;\r\n ATON.fireEvent(\"SemanticNodeHover\", hsn);\r\n let S = ATON.getSemanticNode(hsn);\r\n if (S && S.onHover) S.onHover();\r\n\r\n ATON._tHover = ATON._clock.elapsedTime;\r\n }\r\n }\r\n\r\n //console.log(L);\r\n};\r\n\r\nATON._handleQueryUI = ()=>{\r\n if (ATON.XR.isPresenting()){\r\n ATON.XR.setupQueryRay(ATON._rcUI);\r\n }\r\n else \r\n ATON._rcUI.setFromCamera( ATON._screenPointerCoords, ATON.Nav._camera );\r\n\r\n ATON._hitsUI = [];\r\n ATON._rcUI.intersectObjects( ATON._mainRoot.children, true, ATON._hitsUI );\r\n\r\n // Process hits\r\n const hitsnum = ATON._hitsUI.length;\r\n if (hitsnum <= 0){\r\n ATON._queryDataUI = undefined;\r\n\r\n if (ATON._hoveredUI){\r\n ATON.fireEvent(\"UINodeLeave\", ATON._hoveredUI);\r\n const S = ATON.getUINode(ATON._hoveredUI);\r\n if (S && S.onLeave) S.onLeave();\r\n }\r\n \r\n ATON._hoveredUI = undefined;\r\n ATON._tHover = undefined;\r\n return;\r\n }\r\n\r\n const h = ATON._hitsUI[0];\r\n\r\n // Occlusion\r\n if (ATON._queryDataScene){\r\n if (ATON._queryDataScene.d < h.distance){\r\n\r\n ATON._queryDataUI = undefined;\r\n\r\n if (ATON._hoveredUI){\r\n ATON.fireEvent(\"UINodeLeave\", ATON._hoveredUI);\r\n const S = ATON.getUINode(ATON._hoveredUI);\r\n if (S && S.onLeave) S.onLeave();\r\n }\r\n\r\n ATON._hoveredUI = undefined;\r\n ATON._tHover = undefined;\r\n return;\r\n }\r\n }\r\n\r\n ATON._queryDataUI = {};\r\n ATON._queryDataUI.p = h.point;\r\n ATON._queryDataUI.d = h.distance;\r\n ATON._queryDataUI.o = h.object;\r\n ATON._queryDataUI.list = []; // holds ui-nodes parental list\r\n\r\n // traverse parents\r\n const L = ATON._queryDataUI.list;\r\n let sp = h.object.parent;\r\n while (sp){\r\n if (sp.nid && sp.nid !== ATON.ROOT_NID) L.push(sp.nid);\r\n sp = sp.parent;\r\n }\r\n\r\n const hui = L[0];\r\n if (hui){\r\n if (ATON._hoveredUI !== hui){\r\n if (ATON._hoveredUI){\r\n ATON.fireEvent(\"UINodeLeave\", ATON._hoveredUI);\r\n const S = ATON.getUINode(ATON._hoveredUI);\r\n if (S && S.onLeave) S.onLeave();\r\n \r\n ATON._tHover = undefined;\r\n }\r\n\r\n ATON._hoveredUI = hui;\r\n ATON.fireEvent(\"UINodeHover\", hui);\r\n const S = ATON.getUINode(hui);\r\n if (S && S.onHover) S.onHover();\r\n\r\n ATON._tHover = ATON._clock.elapsedTime;\r\n }\r\n }\r\n};\r\n\r\n// Tokens for external API/services \r\n// TODO:\r\nATON.setSketchFabAPIToken = (tok)=>{\r\n ATON._extAPItokens.sketchfab = tok;\r\n};\r\n\r\n\r\nexport default ATON;\r\n\r\n\r\n"]} \ No newline at end of file +{"version":3,"sources":["ATON.node.js","ATON.pov.js","ATON.lightprobe.js","ATON.eventhub.js","ATON.mathub.js","ATON.utils.js","ATON.scenehub.js","ATON.audiohub.js","ATON.nav.js","ATON.xr.js","ATON.sui.button.js","ATON.sui.label.js","ATON.sui.js","ATON.avatar.js","ATON.vroadcast.js","ATON.semfactory.js","ATON.fe.js","ATON.mediarec.js","ATON.geoloc.js","ATON.apphub.js","ATON.fx.js","ATON.js"],"names":["Node","THREE","Group","constructor","id","type","traverse","o","isMesh","geometry","LP","userData","undefined","update","material","envMap","getEnvTex","ATON","NTYPES","SCENE","enablePicking","_rootG","_rootVisible","_nodes","snodes","SEM","_rootSem","semnodes","UI","_rootUI","uinodes","as","kwords","_bCloneOnLoadHit","_tlist","_aniMixers","castShadow","receiveShadow","onHover","onLeave","onSelect","ROOT_NID","nid","name","setAsRoot","setCloneOnLoadHit","b","addKeywords","kw","K","split","k","trim","length","c","children","C","hasKeyword","setDescription","s","description","getDescription","setAudio","au","audio","getAudio","hide","visible","Utils","setPicking","_renderer","shadowMap","enabled","_dMainL","shadow","needsUpdate","show","bPickable","toggle","disablePicking","setPickable","setMaterial","M","cMat","getMaterial","setDefaultAndHighlightMaterials","matSTD","matHL","highlight","restoreDefaultMaterial","setOpacity","f","opacity","setShadowCast","setShadowReceive","setEnvMap","envtex","assignLightProbe","assignLightProbeToMesh","assignLightProbesByProximity","_lps","Vector3","cLP","Box3","setFromObject","getCenter","mdist","i","d","distanceToSquared","pos","duplicate","clone","delete","p","parent","removeChild","dispose","remove","removeChildren","attachTo","node","N","add","attachToRoot","getBound","bb","bs","Sphere","getBoundingSphere","setPosition","x","y","z","position","copy","set","setScale","sx","sy","sz","scale","setRotation","rx","ry","rz","rotation","orientToCamera","quaternion","Nav","_qOri","setYup","addTransform","T","TT","parseTransformString","push","load","url","onComplete","resolveCollectionURL","endsWith","loadTileSet","_bqScene","_assetsManager","then","modelVisitor","t","console","log","_assetReqNew","P","Promise","resolve","reject","_aLoader","data","model","scene","registerAniMixers","ccExtract","_assetReqComplete","_bqSem","err","exportAs","filename","exportNode","setOnHover","setOnLeave","setOnSelect","POV","target","up","STD_UPVECTOR","fov","nextPOV","prevPOV","povlist","setTarget","setFOV","setNextPOV","pov","setPrevPOV","LightProbe","res","near","far","_res","_near","_far","STD_FAR","_envtex","_prevCCtarget","setNear","setFar","CCtarget","WebGLCubeRenderTarget","format","RGBEFormat","generateMipmaps","minFilter","LinearMipmapLinearFilter","encoding","sRGBEncoding","CC","CubeCamera","_rootVisibleGlobal","texture","assignToNode","EventHub","evLocal","evNetwork","on","fireEvent","clearEventHandlers","evtname","ehList","h","handler","handlerLocal","handlerNetwork","evhLocal","VRoadcast","bReplicate","executeHandlers","MatHub","materials","colors","_loader","MaterialLoader","_uSem","time","value","tint","Vector4","addDefaults","white","Color","black","green","yellow","red","blue","orange","defUI","sem","darksem","fullyTransparent","MeshBasicMaterial","transparent","depthWrite","ShaderMaterial","uniforms","color","vertexShader","getDefVertexShader","fragmentShader","selector","controllerRay","teleportLoc","side","DoubleSide","textureLoader","PATH_RES","map","measurement","depthTest","semanticShape","semanticShapeHL","semanticShapeEdit","semIcon","SpriteMaterial","TextureLoader","lp","lpIcon","sizeAttenuation","mat","jsonfile","addMaterial","_dt","device","geomUnitSphere","SphereGeometry","exporterGLTF","exporterOBJ","_dlink","document","createElement","style","display","body","appendChild","prefix","Math","random","toString","substr","window","location","href","isSecureContext","isMobile","test","navigator","userAgent","detectMobile","xrSupported","xr","isSessionSupported","v","rcc","capabilities","lowGPU","isWebGL2","maxTextureSize","filepath","lastIndexOf","toLowerCase","replace","ext","getFileExtension","index","substring","startsWith","string","urls","match","forEach","PATH_COLLECTION","endpoint","obj","onReceive","onFail","$","ajax","xhrFields","withCredentials","JSON","stringify","contentType","dataType","success","fail","object","updateMatrixWorld","g","applyMatrix4","matrixWorld","toNonIndexed","mergedGeometries","BufferGeometryUtils","mergeBufferGeometries","mergedGeometry","mergeVertices","center","group","mesh","Mesh","layers","enable","disable","cam","_camera","nts","_tsets","ts","TS","cameras","deleteCamera","setCamera","setResolution","tsurl","TILES","TilesRenderer","fetchOptions","mode","setResolutionFromRenderer","bFirst","onLoadModel","_onAllReqsCompleted","magFilter","LinearFilter","onDisposeModel","computeBoundsTree","anisotropy","_maxAnisotropy","bAnimations","animations","mixer","AnimationMixer","clip","clipAction","play","asset","cc","copyright","extras","e","generator","_ccModels","tstr","values","TSTRING_SEPARATOR","numValues","parseFloat","prec","toPrecision","md","m","PATH_RESTAPI","mstr","str","elem","documentElement","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","blob","URL","createObjectURL","download","click","downloadBlob","Blob","jsonobj","downloadText","buffer","bBin","opts","binary","GLTFExporter","parse","output","ArrayBuffer","downloadArrayBuffer","downloadJSONobj","OBJExporter","size","img","Image","aspect","updateProjectionMatrix","setSize","render","_mainRoot","elDom","domElement","FX","composer","UU","passes","PASS_AA","resolution","renderer","b64img","toDataURL","src","_onResize","noLP","BoxBufferGeometry","MeshStandardMaterial","tex","createSceneNode","metalness","metalnessMap","roughnessMap","normalMap","dx","dz","PlaneBufferGeometry","rotateX","PI","SceneHub","currID","currData","_bEdit","_bLoading","_title","_descr","initBaseParsers","reqpath","sid","onSuccess","getJSON","parseScene","sobj","_jsonParsers","getSemanticNode","getSceneNode","child","nodes","edges","n","semid","S","SL","sphere","FLOAT_PREC","CL","semesh","_convexPoints","title","setTitle","descr","fx","ao","togglePass","PASS_AO","setAOintensity","bloom","PASS_BLOOM","setBloomStrength","setBloomThreshold","dof","PASS_DOF","setDOFfocus","environment","env","pano","mainpano","setMainPanorama","setMainPanoramaRotation","bgcolor","setBackgroundColor","L","mainlight","direction","setMainLightDirection","intensity","shadows","toggleShadows","toggleMainLight","lps","lightprobes","auto","setAutoLP","exposure","setExposure","soundscape","global","setGlobalAudio","loop","navmode","setNavMode","measurements","measure","points","A","B","SUI","addMeasurementPoint","viewpoints","povs","setHomePOV","scenegraph","sg","G","getOrCreateSceneNode","transform","list","Array","isArray","u","shadowcast","shadowreceive","toYup","keywords","parid","childid","semanticgraph","getOrCreateSemanticNode","createSemanticNode","spheres","loc","SemFactory","createSphere","convexshapes","createConvexShape","nopicking","key","parser","patch","MODE_ADD","O","MODE_DEL","jstr","r","AudioHub","_listener","AudioListener","AudioLoader","audioURL","Audio","setBuffer","COSINOIDAL_DIST","cos","_mode","POVtransitionDuration","STD_POV_TRANS_DURATION","_rotSpeedOrbit","_rotSpeedFP","_inertia","_bControl","_bInteracting","_prevMode","setOrbitControl","_currPOV","STD_FOV","_fromPOV","_reqPOV","homePOV","_tPOVcall","_tPOVprogress","_vDir","Quaternion","_motionAmt","_motionDir","_bValidLocomotion","_queryDataScene","_controls","_cOrbit","_cFirstPerson","setUserControl","MODE_ORBIT","MODE_FP","MODE_DEVORI","setFirstPersonControl","setDeviceOrientationControl","PP","camera","updateTSetsCamera","XR","isPresenting","_camOrbit","PerspectiveCamera","innerWidth","innerHeight","STD_NEAR","enableAll","OrbitControls","rotateSpeed","enablePan","enableDamping","dampingFactor","screenSpacePanning","enableZoom","minDistance","maxDistance","addEventListener","_updCamera","syncCurrCamera","toggleCenteredQuery","getSelectorRadius","setSelectorRadius","_camFP","_screenPointerCoords","_cDevOri","_camDevOri","DeviceOrientationControls","alphaOffset","_cam","getCamera","getWorldPosition","getWorldQuaternion","getWorldDirection","ctrl","handleXRtransition","handlePOVtransition","isTransitioning","controller0","negate","fv","multiplyScalar","_clock","elapsedTime","lerpVectors","MathUtils","lerp","_currPos","_reqPos","_fromPos","tgt","subVectors","normalize","FP_EPS","syncCurrPOV","handlePOV","duration","E","radius","requestPOV","requestPOVbyBound","point","normal","distanceTo","dd","dv","sceneBS","getRootScene","eye","computeDefaultHome","scope","reorder","deviceOrientation","screenOrientation","absolute","alphaOffsetDevice","alphaOffsetScreen","onDeviceOrientationChangeEvent","event","onDeviceOrientationAbsoluteChangeEvent","onScreenOrientationChangeEvent","orientation","setObjectQuaternion","zee","euler","Euler","q0","q1","sqrt","alpha","beta","gamma","orient","setFromEuler","multiply","setFromAxisAngle","connect","disconnect","removeEventListener","getDirection","degToRad","iOSOrientationPermission","DeviceOrientationEvent","requestPermission","permissionState","catch","error","webkitCompassHeading","getDirectionMap","setReferenceSpaceType","setFramebufferScaleFactor","_stdpxd","MOBILE_DENSITY_F","_bPresenting","currSession","_sessionType","rig","gControllers","controller1","controller0pos","controller1pos","controller0dir","controller1dir","_lastPosR","_lastPosL","_pointerLineGeom","_pointerLineMesh","gpad0","gpad1","_urlHand","HAND_R","_stdActivation","uid","rh","getUINode","lh","avMats","avatars","am","currentQueryValidForLocomotion","userHeight","STD_TELEP_DURATION","rc","getCurrentEyeLocation","getCurrentDirection","bAddRep","setupControllerUI","HAND_L","session","onSessionEnded","MediaRec","stopMediaStreaming","setSession","background","_mMainPano","getController","bXRconfig","hand","handedness","_setupControllerL","_setupControllerR","setRefSpaceLocation","setTimeout","requestHome","sessiontype","setSessionType","sessionInit","optionalFeatures","requestSession","onSessionStarted","end","raytick","rhand","lhand","createUINode","CylinderBufferGeometry","translate","raylen","H","getControllerGrip","prev","lengthSq","Button","uiid","ratio","fsize","baseColor","switchColor","baseOpacity","hoverOpacity","_bSwitched","container","ThreeMeshUI","Block","width","height","padding","borderRadius","backgroundColor","backgroundOpacity","fontFamily","PATH_FONT_JSON","fontTexture","PATH_FONT_TEX","justifyContent","alignContent","uiText","Text","content","fontSize","fontColor","trw","STD_BTN_SIZE","trh","_trigger","PlaneGeometry","setBaseColor","setSwitchColor","setBackgroundOpacity","setText","text","switch","setIcon","bNoBackground","Label","setTextColor","init","mainSelector","_mSelectorSphere","renderOrder","fpTeleport","gTeleport","mTeleport","gMeasures","_prevMPoint","_measLabels","mLine","BufferGeometry","setFromPoints","_measLine","Line","gPoints","buildInfoNode","bShowInfo","_labelScale","_labelScaleVR","setInfoNodeText","gSemIcons","_sync","enableLPIcons","gLPIcons","enableSemIcons","_selectorRad","setSelectorModel","path","bUseStdMat","setSelectorColor","addSemIcon","meshape","semicon","Sprite","addLPIcon","rn","lpicon","setSemIconsOpacity","infoNode","infoContainer","infoNodeText","getInfoNode","txt","createToolbar","buttonlist","num","cont","button","linetick","mlArr","attributes","array","gLine","getHumanReadableDistance","R","clearMeasurements","_updateMeasurements","ml","_bPauseQuery","_hoveredSemNode","isOrbit","_queryDataUI","_queryDataSem","ls","_bStreamFocus","ss","Avatar","userid","username","message","_auTalk","PositionalAudio","setRefDistance","_bPlayingAudio","_auChunks","_tStateCall","_tProgress","_tFocCall","_currFocusPos","_tgtFocusPos","_currState","_tgtState","realize","setTalkDistance","getAvatarMaterialByUID","avaMats","usermaterial","smesh","usermeshnode","userauinode","uspritemats","userfpnode","ufocmats","userlabelnode","labelcontainer","usernametext","ucolors","usermessagetext","_focNodes","focGroup","destroy","loadRepresentation","setUsername","getUsername","setMessage","msg","setTalkVolume","vol","hideFocalPoint","requestFocus","fp","_tgtFocusRad","handleFocusTransition","D","USER_STATE_FREQ","requestStateTransition","handleStateTransition","cs","slerp","avol","_handleTalk","shift","onended","address","origin","initMaterials","socket","_connected","_username","_numUsers","avatarList","avaGroup","bSendState","setInterval","sendState","_lastStateSent","_bShowAvaG","enableChatLog","_elChat","getNumUsers","ucolorsdark","ucolorhex","MM","texAUI","smat","texFocP","sock","emit","REPLICATED_EVT","evhNetwork","isConnected","hasID","joinSession","ssid","requestSceneState","setAvatarsVisibility","protocol","secure","rejectUnauthorized","io","connected","_registerSocketHandlers","_onConnected","append","_msg","scrollTop","scrollHeight","numUsers","touchAvatar","decodeState","uname","isPlaying","stop","setLoop","encodeState","Float32Array","binData","Int8Array","w","view","a","setFocusStreaming","cpov","getSceneQueriedPoint","fy","fz","lastPos","lastOri","dPos","dOri","angleTo","THRES_STATE_POS","THRES_STATE_ORI","getAvatar","destroyAvatar","clearAllAvatars","bConvexBuilding","convexPoints","convexNode","currConvexMesh","currSemNode","resetMaterial","_numShapes","currMaterial","pp","equals","numPoints","geom","ConvexGeometry","currSemesh","setVectorPrecision","pop","udMesh","offset","addConvexPoint","Object3D","FE","PATH_RES_ICONS","_bPopup","popupBlurBG","_userAuth","_bControlLight","_bControlSelScale","_cLightDir","_auSemNode","_auSemNodePlaying","_bReqHome","_vrcAddr","_bVRCsetup","urlParams","URLSearchParams","search","_uiSetupBase","_uiProfiles","_uiCurrProfile","_selRanges","_selRefRadius","uiSwitchButton","ddens","get","setDefaultPixelDensity","dynd","toggleDynamicDensity","computeAndRequestDefaultHome","computeSelectorRanges","_handleHomeReq","addUpdateRoutine","_update","_kModCtrl","ff","getFOV","_kModShift","reqstr","PATH_RESTAPI_SCENE","attr","PATH_SCENES","sin","uiAddButton","toggleFullScreen","isConnectionSecure","popupClose","html","idcontainer","icon","onPress","tooltip","iconurl","iconid","slice","elid","el","addClass","removeClass","isFirstPerson","isDevOri","restorePreviousNavMode","popupNav","isAudioRecording","startMediaStreaming","popupQR","popupScreenShot","popupSceneInfo","isFullscreen","kwList","onAddKeyword","onRemoveKeyword","htmlcode","uiAttachInputFilterID","ht","kwsObj","addKWtoBox","val","keypress","keycode","keyCode","which","getVRCclassFromID","checkAuth","sstate","popupVRC","_setupVRCevents","popupUser","uiFunction","idbutton","inputid","regReplace","RegExp","htmlcontent","chk","auLib","cssClasses","clstr","htcont","stopPropagation","fadeIn","POPUP_DELAY","_bListenKeyboardEvents","filter","bNoAnim","fadeOut","focusOn3DView","popupFunc","popupShow","QRCode","getElementById","cover","takeScreenshot","parseInt","postJSON","Object","keys","uip","setEditMode","goToURL","uiLoadProfile","password","head","getTitle","rad","hr","uiAddButtonFirstPerson","uiAddButtonDeviceOrientation","uiAddButtonVR","_bAudioRecording","_bStreaming","recorder","reset","mediaDevices","_ds","_streamChunk","auStreamInterval","getUserMedia","video","channelCount","echoCancellation","stream","RecordRTC","mimeType","auType","bitsPerSecond","auBitsPerSecond","audioBitsPerSecond","sampleRate","desiredSampRate","disableLogs","numberOfAudioChannels","onFinish","stopRecording","getDataURL","b64","compress","rblob","_auAVGvolume","realizeAudioRecorder","startRecording","getBlob","reader","FileReader","readAsDataURL","onloadend","base64data","result","_stopRecAndSend","GeoLoc","EARTH_D_KM","EARTH_R_KM","_bActive","_wpid","Vector2","_POIs","_currPOI","_closestPOI","_maxError","enableTracking","geolocation","watchPosition","_onPosition","_onError","enableHighAccuracy","disableTracking","clearWatch","setMaxError","coords","acc","accuracy","latitude","longitude","_handlePOIs","numPOIs","_closestPOIdist","POI","distance","getCurrentLocation","locationFromLatLon","lat","lon","distance_orig","latlonA","latlonB","dLat","DEG2RAD","dLon","atan2","asin","addPOI","getPOIbyIndex","getClosestPOI","getClosestPOIdistance","AppHub","_appid","_appdata","PATCH_ADD","wappid","fid","PATCH_DEL","_sendDataPatch","PATH_WAPPS","EffectComposer","autoClear","CW","CH","PASS_BASE","RenderPass","addPass","SAOPass","params","saoBias","saoScale","saoIntensity","UnrealBloomPass","threshold","strength","BokehPass","focus","aperture","maxblur","PASS_GAMMA","ShaderPass","GammaCorrectionShader","FXAAShader","pass","RAD2DEG","PATH_MODS","PATH_DRACO_LIB","PATH_BASIS_LIB","PATH_IFC_LIB","PATH_FE","SHADOWS_NEAR","SHADOWS_FAR","SHADOWS_SIZE","SHADOWS_RES","AMB_L","setPathCollection","setPathScenes","_onUserInteraction","_elPanoVideo","_vpanoPlaying","context","state","resume","_setupBaseListeners","onorientationchange","_readDeviceOrientationMode","screenfull","isEnabled","_bFS","_updateScreenMove","_onMouseWheel","_bPointerDown","_handleQueries","touches","Hammer","srcEvent","_hoveredUI","defaultDoubleTapFromScreenCoords","max","preventDefault","deltaY","_SUIactivation","U","teleportOnQueriedPoint","playAudioFromSemanticNode","bFPtrans","currDir","feye","ftgt","hsn","requestPOVbyNode","requestRetarget","_handleQueryScene","profileDevice","Clock","WebGLRenderer","antialias","powerPreference","profileRenderingCapabilities","setPixelRatio","_fps","_dtAccum","_avgFPScount","_avgFPSaccum","_avgFPS","_bDynamicDensity","_dRenderBudgetMinFPS","_dRenderBudgetMaxFPS","outputEncoding","toneMapping","LinearToneMapping","toneMappingExposure","setAnimationLoop","_onFrame","getMaxAnisotropy","Cache","canvas","outline","border","_bUserInts","GLTFLoader","_numReqLoad","_dracoLoader","DRACOLoader","setDecoderConfig","setDecoderPath","setWorkerLimit","preload","setDRACOLoader","_updRoutines","_bAutoLP","_envMapInt","_bShadowsFixedBound","_shadowsFixedBoundCenter","_shadowsNear","_shadowsFar","_shadowsSize","_shadowsRes","initGraphs","_bQuerySemOcclusion","_bQueryNormals","_bCenteredQuery","_tgiDur","_tgiPer","_tHover","_bMainPanoInfinite","_matMainPano","_rcScene","Raycaster","_rcSemantics","_rcUI","_registerRCS","_wappID","_extAPItokens","setTimedGazeDuration","dt","getTimedGazeProgress","getElapsedTime","renderPause","renderResume","_setupLoadManager","_loadManager","LoadingManager","onStart","itemsLoaded","itemsTotal","onLoad","onProgress","onError","resetPixelDensity","abs","getRootSemantics","getRootUI","adjustShadowsParamsFromSceneBounds","updateDirShadows","addLightProbe","setDOFaperture","_postAllReqsCompleted","updateLightProbes","autoUpdate","Scene","ambLight","AmbientLight","bg","setNeutralAmbientLight","_indLP","LightProbeGenerator","fromCubeRenderTarget","combine","AddOperation","envMapIntensity","tpano","_gMainPano","SphereBufferGeometry","frustumCulled","setMainPanoramaRadius","isVideo","innerHTML","crossOrigin","playsinline","cssText","autoplay","onplaying","VideoTexture","_realizeOrUpdateMainPano","onAfterRender","setMainPanoramaInfinite","setMainPanoramaLocation","DirectionalLight","_dMainLtgt","_dMainLpos","_dMainLdir","getMainLightDirection","ld","isMainLightEnabled","getExposure","left","right","bottom","top","mapSize","shb","bias","PCFShadowMap","PCFSoftShadowMap","_updateEnvironment","bLoop","_auMain","_markFPS","fps","_handleDynamicRenderProfiles","setDynamicRenderingFPS","minBudget","maxBudget","getPixelRatio","getDelta","_updateAniMixers","_updateRoutines","_updateTSets","deleteAllUpdateRoutines","clientX","clientY","_rcRR","_rcHandlers","_handleQuerySemantics","_handleQueryUI","locomotionValidator","hitsnum","setupQueryRay","setFromCamera","_hitsScene","intersectObjects","face","Matrix3","getNormalMatrix","applyMatrix3","getSceneQueriedDistance","getSceneQueriedNormal","_hitsSem","sp","_hitsUI","hui","setSketchFabAPIToken","tok","sketchfab"],"mappings":"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","file":"ATON.min.js","sourceRoot":"..\\src","sourcesContent":["/*\r\n ATON Node Class\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n//import Period from \"./ATON.period.js\";\r\n\r\n\r\n/**\r\nClass representing an ATON node.\r\nConstructor allows to create different types (scene nodes, semantic nodes and UI nodes)\r\n@class Node\r\n@example \r\nlet myNode = new ATON.Node(\"someID\")\r\n*/\r\nclass Node extends THREE.Group {\r\n\r\nconstructor(id, type){\r\n super();\r\n\r\n this.type = type? type : ATON.NTYPES.SCENE;\r\n \r\n this.enablePicking();\r\n\r\n if (this.type === ATON.NTYPES.SCENE){\r\n this._rootG = ATON._rootVisible;\r\n this._nodes = ATON.snodes;\r\n //this.period = undefined; // TODO: assign period object (read-only, centralized) - NOT USED FOR NOW\r\n }\r\n if (this.type === ATON.NTYPES.SEM){\r\n this._rootG = ATON._rootSem;\r\n this._nodes = ATON.semnodes;\r\n //this.period = undefined;\r\n }\r\n\r\n if (this.type === ATON.NTYPES.UI){\r\n this._rootG = ATON._rootUI;\r\n this._nodes = ATON.uinodes;\r\n }\r\n\r\n // Register\r\n this.as(id);\r\n\r\n this.kwords = undefined;\r\n\r\n this._bCloneOnLoadHit = true;\r\n\r\n // Transform list (instancing)\r\n this._tlist = undefined;\r\n\r\n // Animation mixers\r\n this._aniMixers = undefined;\r\n\r\n // Shadows\r\n this.castShadow = false;\r\n this.receiveShadow = false;\r\n\r\n // Local handlers\r\n this.onHover = undefined;\r\n this.onLeave = undefined;\r\n this.onSelect = undefined;\r\n}\r\n\r\n/**\r\n(Re)assign node ID\r\n@param {string} id - the new ID\r\n@example\r\nmyNode.as(\"newID\")\r\n*/\r\nas(id){\r\n if (id === undefined) return;\r\n if (id === ATON.ROOT_NID) return;\r\n\r\n this._nodes[id] = this;\r\n this.nid = id;\r\n this.name = id;\r\n\r\n return this;\r\n}\r\n\r\nsetAsRoot(){\r\n this._nodes[ATON.ROOT_NID] = this;\r\n this.nid = ATON.ROOT_NID;\r\n\r\n return this;\r\n}\r\n\r\nsetCloneOnLoadHit(b){\r\n this._bCloneOnLoadHit = b;\r\n return this;\r\n}\r\n\r\n/**\r\nAdd keyword(s) to this node. Keywords are also recursively added into the sub-graph\r\n@param {string} kw - the keyword or comma-separated list of keywords\r\n@example\r\nmyNode.addKeywords(\"heritage,reconstruction\");\r\n*/\r\naddKeywords(kw){\r\n let K = kw.split(\",\");\r\n\r\n if (this.kwords === undefined) this.kwords = {};\r\n for (let k in K){\r\n let kw = K[k].trim();\r\n if (kw.length > 0) this.kwords[kw] = true;\r\n }\r\n\r\n // recurse into ATON nodes\r\n for (let c in this.children){\r\n let C = this.children[c];\r\n if (C.type !== undefined) C.addKeywords(kw);\r\n }\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nReturns true if this node has specific keyword\r\n@param {string} kw - the keyword\r\n@returns {boolean}\r\n@example\r\nif (myNode.hasKeyword(\"heritage\")){ ... }\r\n*/\r\nhasKeyword(kw){\r\n if (this.kwords === undefined) return;\r\n return (this.kwords[kw] !== undefined);\r\n}\r\n\r\n/**\r\nSet custom description (string) to the node\r\n@param {string} s - content\r\n@example\r\nmyNode.setDescription(\"This is a small description\");\r\n*/\r\nsetDescription(s){\r\n this.userData.description = s;\r\n return this;\r\n}\r\n\r\n/**\r\nGet node description (string) if any\r\n@returns {string}\r\n@example\r\nlet desc = myNode.getDescription();\r\n*/\r\ngetDescription(){\r\n return this.userData.description;\r\n}\r\n\r\nsetAudio(au){\r\n this.userData.audio = au;\r\n return this;\r\n}\r\n\r\ngetAudio(){\r\n return this.userData.audio;\r\n}\r\n\r\n/**\r\nHide this node (and sub-graph), also invisible to queries (ray casting, picking)\r\n@example\r\nmyNode.hide()\r\n*/\r\nhide(){\r\n this.visible = false;\r\n\r\n //this.traverse((o) => { o.layers.disable(this.type); });\r\n ATON.Utils.setPicking(this, this.type, false);\r\n\r\n if (ATON._renderer.shadowMap.enabled){\r\n ATON._dMainL.shadow.needsUpdate = true;\r\n }\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nShow this node (and sub-graph). If pickable, becomes sensible to queries (ray casting)\r\n@example\r\nmyNode.show()\r\n*/\r\nshow(){\r\n this.visible = true;\r\n\r\n //if (this.bPickable) ATON.Utils.setPicking(this, this.type, true); //this.traverse((o) => { o.layers.enable(this.type); });\r\n ATON.Utils.setPicking(this, this.type, this.bPickable);\r\n\r\n if (ATON._renderer.shadowMap.enabled){\r\n if (ATON._dMainL!==undefined && ATON._dMainL.shadow!==undefined) ATON._dMainL.shadow.needsUpdate = true;\r\n }\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nToggle node visibility. If visible, becomes invisible, and viceversa.\r\n@example\r\nmyNode.toggle()\r\n*/\r\ntoggle(b){\r\n if (b === undefined){\r\n if (this.visible) return this.hide();\r\n else return this.show();\r\n }\r\n\r\n if (b) return this.show();\r\n else return this.hide();\r\n}\r\n\r\n/**\r\nDisable this node for runtime queries (ray casters). Useful for instance on vegetation, etc...\r\n@example\r\nmyNode.load(\"somevegetation.gltf\").disablePicking()\r\n*/\r\ndisablePicking(){\r\n this.bPickable = false;\r\n ATON.Utils.setPicking(this, this.type, this.bPickable);\r\n\r\n return this; \r\n}\r\n\r\n/**\r\nEnable this node for runtime queries (ray casters)\r\n@example\r\nmyNode.enablePicking()\r\n*/\r\nenablePicking(){\r\n this.bPickable = true;\r\n ATON.Utils.setPicking(this, this.type, this.bPickable);\r\n\r\n return this;\r\n}\r\n\r\nsetPickable(b){\r\n if (b) this.enablePicking();\r\n else this.disablePicking();\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet cascading material. Note this applies to this node and all children (even all those still loading)\r\n@param {THREE.Material} M - the Material\r\n@example\r\nmyNode.setMaterial( new THREE.MeshBasicMaterial({ transparent: true, opacity: 0.2, wireframe: true }) )\r\n*/\r\nsetMaterial(M){\r\n this.userData.cMat = M;\r\n\r\n this.traverse((o) => {\r\n if (o.isMesh){\r\n o.material = M;\r\n ///o.material.needsUpdate = true;\r\n //console.log(o);\r\n }\r\n\r\n if (o.type) this.userData.cMat = M;\r\n });\r\n\r\n // children\r\n for (let c in this.children){\r\n let C = this.children[c];\r\n if (C.setMaterial) C.setMaterial(M);\r\n }\r\n\r\n return this;\r\n}\r\n\r\n/** \r\nGet cascading material\r\n@returns {THREE.Material}\r\n*/\r\ngetMaterial(){\r\n return this.userData.cMat;\r\n}\r\n\r\n// Set default and highlight materials\r\nsetDefaultAndHighlightMaterials(matSTD, matHL){\r\n this.userData.matSTD = matSTD;\r\n this.userData.matHL = matHL;\r\n\r\n return this;\r\n}\r\nhighlight(){\r\n if (this.userData.matHL) this.setMaterial(this.userData.matHL);\r\n return this;\r\n}\r\nrestoreDefaultMaterial(){\r\n if (this.userData.matSTD) this.setMaterial(this.userData.matSTD);\r\n return this;\r\n}\r\n\r\n// Set cascading opacity\r\nsetOpacity(f){\r\n this.traverse((o) => {\r\n if (o.isMesh){\r\n o.material.opacity = f;\r\n //o.material.needsUpdate = true;\r\n }\r\n });\r\n\r\n return this;\r\n}\r\n\r\n// FIXME: not working\r\nsetShadowCast(b){\r\n this.castShadow = b;\r\n\r\n this.traverse((o) => {\r\n if (o.isMesh){\r\n o.castShadow = b;\r\n }\r\n });\r\n\r\n return this;\r\n};\r\nsetShadowReceive(b){\r\n this.receiveShadow = b;\r\n\r\n this.traverse((o) => {\r\n if (o.isMesh){\r\n o.receiveShadow = b;\r\n }\r\n });\r\n\r\n return this;\r\n};\r\n\r\nsetEnvMap(envtex){\r\n this.traverse((o) => {\r\n if (o.isMesh){\r\n\t\t\to.material.envMap = envtex;\r\n\t\t\t//o.material.combine = THREE.MultiplyOperation;\r\n //o.material.needsUpdate = true;\r\n }\r\n });\r\n\r\n return this;\r\n}\r\n\r\nassignLightProbe(LP){\r\n this.traverse((o) => {\r\n if (o.isMesh && o.geometry) ATON.Utils.assignLightProbeToMesh(LP, o);\r\n });\r\n\r\n return this;\r\n}\r\n\r\n// (re)assign LPs for each mesh depending on proximity\r\nassignLightProbesByProximity(){\r\n if (ATON._lps.length === 0) return this;\r\n\r\n this.traverse((o) => {\r\n if (o.isMesh && o.geometry){\r\n let c = new THREE.Vector3();\r\n let bbox = new THREE.Box3().setFromObject(o).getCenter(c);\r\n\r\n let cLP = undefined;\r\n let mdist = undefined;\r\n\r\n for (let i in ATON._lps){\r\n let LP = ATON._lps[i];\r\n let d = c.distanceToSquared(LP.pos);\r\n\r\n if (cLP === undefined || d < mdist){\r\n mdist = d;\r\n cLP = LP;\r\n }\r\n }\r\n\r\n if (cLP) ATON.Utils.assignLightProbeToMesh(cLP, o);\r\n }\r\n });\r\n\r\n return this;\r\n};\r\n\r\n// Find & update all LPs under this subgraph\r\n// FIXME: not working\r\nupdateLightProbes = ()=>{\r\n this.traverse((o) => {\r\n if (o.isMesh && o.geometry){\r\n let LP = o.userData.LP;\r\n\r\n if (LP !== undefined){\r\n LP.update();\r\n o.material.envMap = LP.getEnvTex();\r\n //o.material.envMapIntensity = 5.0;\r\n //console.log(\"x\");\r\n }\r\n }\r\n });\r\n\r\n return this;\r\n};\r\n\r\n// Deep clone\r\nduplicate(){\r\n let C = this.clone();\r\n\r\n C.traverse((o)=>{\r\n if (o.isMesh){\r\n o.material = o.material.clone();\r\n }\r\n });\r\n\r\n return C;\r\n}\r\n\r\n\r\n// FIXME: xxx\r\ndelete(){\r\n let p = this.parent;\r\n\r\n if (p !== undefined && p.nid !== undefined) p.removeChild( this );\r\n}\r\n\r\nremoveChild(c){\r\n if (c === undefined) return;\r\n\r\n let nid = c.nid;\r\n if (c.nid !== undefined) this._nodes[c.nid] = undefined;\r\n\r\n c.parent = undefined;\r\n\r\n c.traverse((o) => {\r\n if (o.geometry) o.geometry.dispose();\r\n if (o.material) o.material.dispose();\r\n });\r\n\r\n this.remove(c);\r\n\r\n return this;\r\n}\r\n/**\r\nDelete all children of this node\r\n*/\r\nremoveChildren(){\r\n let num = this.children.length;\r\n for (let i=(num-1); i>=0; i--) this.removeChild(this.children[i]);\r\n\r\n return this;\r\n}\r\n\r\n\r\n/**\r\nAttach this node to parent by providing ID (string) or node object\r\n@param {string|Node} node - the parent node\r\n@example\r\nmyNode.attachTo(\"someGroupID\")\r\n@example\r\nmyNode.attachTo(myParentGroup)\r\n*/\r\nattachTo(node){\r\n let N = (typeof node === 'string')? this._nodes[node] : node;\r\n if (N){\r\n N.add(this);\r\n if (N.userData.cMat !== undefined) this.userData.cMat = N.userData.cMat; // this.setMaterial(N.userData.cMat);\r\n if (N.bPickable !== undefined) this.bPickable = N.bPickable;\r\n\r\n //this.toggle(N.visible);\r\n }\r\n \r\n return N;\r\n}\r\n\r\n/**\r\nAttach this node to main root. This is usually mandatory in order to visualize the node and all its descendants.\r\nDepending on node type this will be the scene root (visible scene-graph), the semantic-graph root or UI root\r\n@example\r\nmyNode.attachToRoot()\r\n*/\r\nattachToRoot(){\r\n this._rootG.add(this);\r\n if (this._rootG.userData.cMat !== undefined) this.userData.cMat = this._rootG.userData.cMat;\r\n if (this._rootG.bPickable !== undefined) this.bPickable = this._rootG.bPickable;\r\n\r\n //this.toggle(this._rootG.visible);\r\n \r\n return this._rootG;\r\n}\r\n\r\n/**\r\nReturn bounding sphere of this node\r\n@returns {THREE.Sphere}\r\n@example\r\nlet bs = myNode.getBound()\r\n*/\r\ngetBound(){\r\n let bb = new THREE.Box3().setFromObject( this );\r\n let bs = new THREE.Sphere();\r\n bb.getBoundingSphere(bs);\r\n\r\n return bs;\r\n}\r\n\r\n/**\r\nSet location (translation) of this node\r\n@example\r\nmyNode.setPosition(1.0,3.0,0.0)\r\n@example\r\nmyNode.setPosition( new THREE.Vector3(1.0,3.0,0.0) )\r\n*/\r\nsetPosition(x,y,z){\r\n if (x instanceof THREE.Vector3) this.position.copy(x);\r\n else this.position.set(x,y,z);\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet scale of this node\r\n@example\r\nmyNode.setScale(3.0,2.0,1.0)\r\n@example\r\nmyNode.setScale(2.0)\r\n@example\r\nmyNode.setScale( new THREE.Vector3(3.0,2.0,1.0) )\r\n*/\r\nsetScale(sx,sy,sz){\r\n if (sx instanceof THREE.Vector3) this.scale.copy(sx);\r\n else {\r\n if (sy === undefined){ sy = sx; sz = sx; }\r\n this.scale.set(sx,sy,sz);\r\n }\r\n \r\n return this;\r\n}\r\n\r\n/**\r\nSet rotation of this node (Euler rx,ry,rz) in radians\r\n@example\r\nmyNode.setRotation(3.0,2.0,1.0)\r\n@example\r\nmyNode.setRotation( new THREE.Vector3(3.0,2.0,1.0) )\r\n*/\r\nsetRotation(rx,ry,rz){\r\n if (rx instanceof THREE.Vector3) this.rotation.copy(rx);\r\n else this.rotation.set(rx,ry,rz);\r\n \r\n return this;\r\n}\r\n/**\r\nOrient this node to current camera\r\n*/\r\norientToCamera(){\r\n this.quaternion.copy( ATON.Nav._qOri );\r\n return this;\r\n}\r\n\r\nsetYup(){\r\n this.rotation.set(-1.57079632679,0.0,0.0);\r\n return this; \r\n}\r\n\r\n/**\r\nAdd a transform for this node.\r\nAdding multiple transforms before loading a 3D model will result in instancing these resources\r\n@param {string} T - the transform string to be added\r\n@example\r\nmyNode.addTransform(\"10 0 0\").addTransform(\"-5 0 0\").load(\"mymodel.gltf\").attachToRoot()\r\n*/\r\naddTransform(T){\r\n let TT = undefined;\r\n\r\n if (typeof T === \"string\"){\r\n TT = ATON.Utils.parseTransformString(T);\r\n }\r\n\r\n if (TT === undefined) return this;\r\n\r\n if (this._tlist === undefined) this._tlist = [];\r\n this._tlist.push(TT);\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nLoad a 3D model under this node, with optional onComplete handler.\r\nNote the system will take care of loading the resources in background, and will manage duplicate requests to same resources avoiding waste of bandwidth\r\n@param {string} url - the url of the 3D model (local to collection or complete)\r\n@param {function} onComplete - the optional handler to be fired on completion\r\n@example\r\nmyNode.load(\"mymodel.gltf\", ()=>{ console.log(\"completed!\") })\r\n*/\r\nload(url, onComplete){\r\n if (url === undefined) return this;\r\n\r\n url = ATON.Utils.resolveCollectionURL(url);\r\n\r\n let N = this;\r\n\r\n if (url.endsWith(\"tileset.json\")){\r\n ATON.Utils.loadTileSet(url, N);\r\n ATON._bqScene = true;\r\n if (onComplete) onComplete();\r\n return N;\r\n }\r\n\r\n // [C] Promise already requested\r\n if ( N._bCloneOnLoadHit && ATON._assetsManager[url] !== undefined ){\r\n ATON._assetsManager[url].then(( o ) =>{\r\n let C = o.clone();\r\n\r\n ATON.Utils.modelVisitor(N, C);\r\n \r\n if (N._tlist !== undefined){\r\n for (let t in N._tlist){\r\n N._tlist[t].add(C.clone());\r\n N.add(N._tlist[t]);\r\n }\r\n }\r\n else N.add( C );\r\n\r\n // animations\r\n //ATON.Utils.registerAniMixers(N, data);\r\n\r\n //N.setPickable(N.bPickable);\r\n //N.toggle(N.visible);\r\n\r\n if (onComplete) onComplete();\r\n });\r\n\r\n console.log(\"HIT!\");\r\n return N;\r\n }\r\n\r\n // Fire request\r\n /*if (N.type === ATON.NTYPES.SCENE)*/ ATON._assetReqNew(url);\r\n\r\n let P = new Promise( ( resolve, reject ) => {\r\n ATON._aLoader.load( url, (data)=>{\r\n let model = data.scene || data.scene[0];\r\n\r\n // Visit loaded model\r\n ATON.Utils.modelVisitor(N, model);\r\n\r\n if (N._tlist !== undefined){\r\n for (let t in N._tlist){\r\n N._tlist[t].add(model.clone());\r\n N.add(N._tlist[t]);\r\n }\r\n }\r\n else N.add( model );\r\n\r\n // animations\r\n ATON.Utils.registerAniMixers(N, data);\r\n\r\n // CC manager\r\n ATON.Utils.ccExtract(data);\r\n\r\n resolve(model);\r\n //console.log(\"Model \"+url+\" loaded\");\r\n console.log(\"Model loaded\");\r\n \r\n /*if (N.type === ATON.NTYPES.SCENE)*/ ATON._assetReqComplete(url);\r\n\r\n // post-visit (FIXME:)\r\n //N.setPickable(N.bPickable);\r\n //N.toggle(N.visible);\r\n\r\n if (N.type === ATON.NTYPES.SCENE) ATON._bqScene = true;\r\n if (N.type === ATON.NTYPES.SEM) ATON._bqSem = true;\r\n\r\n //\r\n if (N.bPickable) N.enablePicking();\r\n\r\n if (onComplete) onComplete();\r\n },\r\n undefined,\r\n (err)=>{\r\n //console.log(err);\r\n //reject(model);\r\n console.log(\"Error loading model\");\r\n\r\n /*if (N.type === ATON.NTYPES.SCENE)*/ ATON._assetReqComplete(url);\r\n if (onComplete) onComplete();\r\n });\r\n\r\n/*\r\n ATON._aLoader.load( url+\"__LOD2-d.gltf\", (data)=>{\r\n let model = data.scene || data.scene[0];\r\n ATON._modelVisitor(model);\r\n\r\n let C = new THREE.Vector3();\r\n let bb = new THREE.Box3().setFromObject( model ).getCenter(C);\r\n model.position.set(-C.x,-C.y,-C.z);\r\n\r\n let lod = new THREE.LOD();\r\n lod.position.set(C.x,C.y,C.z);\r\n lod.matrixAutoUpdate = true;\r\n lod.addLevel(model, 40.0);\r\n N.add(lod);\r\n\r\n //N.add( model );\r\n\r\n resolve(model);\r\n console.log(\"ATON model \"+url+\" loaded\");\r\n\r\n ATON._aLoader.load( url+\"__LOD1-d.gltf\", (data2)=>{\r\n let model2 = data2.scene || data2.scene[0];\r\n ATON._modelVisitor(model2);\r\n\r\n model2.position.set(-C.x,-C.y,-C.z);\r\n \r\n lod.addLevel(model2, 0.0);\r\n });\r\n \r\n ATON._assetReqComplete(url);\r\n });\r\n*/\r\n });\r\n\r\n // Register\r\n if (N._bCloneOnLoadHit) ATON._assetsManager[url] = P;\r\n\r\n return this;\r\n}\r\n\r\nexportAs( filename ){\r\n ATON.Utils.exportNode(this, filename);\r\n\r\n return this;\r\n}\r\n\r\nsetOnHover( f ){\r\n this.onHover = f;\r\n return this;\r\n}\r\nsetOnLeave( f ){\r\n this.onLeave = f;\r\n return this;\r\n}\r\nsetOnSelect( f ){\r\n this.onSelect = f;\r\n return this;\r\n}\r\n\r\n// Assign a period to this node\r\n// TODO: \r\n/*\r\nsetPeriod(p){\r\n if (this.type === ATON.NTYPES.UI) return this; // not on UI nodes\r\n\r\n let P = (typeof p === 'string')? ATON.periods[p] : p;\r\n if (P === undefined) return this;\r\n\r\n this.period = P;\r\n return this;\r\n}\r\n\r\nfilterByPeriodID(id){\r\n if (this.period === undefined) return this;\r\n\r\n if (this.period.id !== id){\r\n this.hide();\r\n return this;\r\n }\r\n else {\r\n this.show();\r\n return this;\r\n }\r\n\r\n this.traverse((o) => {\r\n if (o.period){\r\n if (o.period.id === id) this.show();\r\n else this.hide();\r\n }\r\n });\r\n\r\n return this;\r\n}\r\n*/\r\n\r\n}\r\n\r\nexport default Node;","/*\r\n ATON Viewpoint Class\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nClass representing a Viewpoint (POV) in the 3D space, abstracting from device used (mobile, desktop or immersive XR).\r\nConstructor allows to assign the POV a unique ID (`string`)\r\n@class POV\r\n@example \r\nnew ATON.POV(\"myView\")\r\n*/\r\nclass POV {\r\n\r\nconstructor(id){\r\n this.pos = new THREE.Vector3(1,0,0);\r\n this.target = new THREE.Vector3(0,0,0);\r\n this.up = ATON.STD_UPVECTOR;\r\n this.fov = undefined; //ATON.Nav.STD_FOV;\r\n\r\n this.nextPOV = undefined;\r\n this.prevPOV = undefined;\r\n\r\n // Register\r\n this.as(id);\r\n}\r\n\r\n/**\r\n(Re)assign POV ID\r\n@param {string} id - the new ID\r\n@example\r\nmypov.as(\"newID\")\r\n*/\r\nas(id){\r\n if (id === undefined) return;\r\n\r\n ATON.Nav.povlist[id] = this;\r\n this.id = id;\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet eye position\r\n@example\r\nnew ATON.POV(\"myView\").setPosition(2.0,6.0,1.5)\r\n@example\r\nmypov.setPosition( new THREE.Vector3(2.0,6.0,1.5) )\r\n*/\r\nsetPosition(x,y,z){\r\n if (x instanceof THREE.Vector3) this.pos.copy(x);\r\n else this.pos.set(x,y,z);\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet target position\r\n@example\r\nnew ATON.POV(\"myView\").setTarget(8.0,6.0,1.5)\r\n@example\r\nmypov.setTarget( new THREE.Vector3(8.0,6.0,1.5) ).setPosition(2.0,6.0,1.5)\r\n*/\r\nsetTarget(x,y,z){\r\n if (x instanceof THREE.Vector3) this.target.copy(x);\r\n else this.target.set(x,y,z);\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet field of view (FOV) in degrees\r\n@param {number} f\r\n@example\r\nnew ATON.POV(\"myView\").setFOV(70.0)\r\n*/\r\nsetFOV(f){\r\n this.fov = f;\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nAdd keyword(s) to this viewpoint\r\n@param {string} kw - a keyword or comma-separated list of keywords\r\n@example\r\nmypov.addKeywords(\"heritage,architecture\")\r\n*/\r\naddKeywords(kw){\r\n let K = kw.split(\",\");\r\n\r\n if (this.kwords === undefined) this.kwords = {};\r\n for (let k in K){\r\n let kw = K[k].trim();\r\n if (kw.length > 0) this.kwords[kw] = true;\r\n }\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nReturns true if this viewpoint has specific keyword\r\n@param {string} kw - the keyword\r\n@returns {boolean}\r\n@example\r\nif (myPOV.hasKeyword(\"heritage\")){ ... }\r\n*/\r\nhasKeyword(kw){\r\n if (this.kwords === undefined) return;\r\n return (this.kwords[kw] !== undefined);\r\n}\r\n\r\n/**\r\nSet an optional next POV\r\n@param {POV} pov - the next POV\r\n*/\r\nsetNextPOV(pov){\r\n if (!pov) return;\r\n this.nextPOV = pov;\r\n\r\n return this;\r\n}\r\n\r\n/**\r\nSet an optional previous POV\r\n@param {POV} pov - the previous POV\r\n*/\r\nsetPrevPOV(pov){\r\n if (!pov) return;\r\n this.prevPOV = pov;\r\n\r\n return this;\r\n}\r\n\r\n}\r\n\r\nexport default POV;","/*\r\n ATON Light Probe Class\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nClass representing a light probe (LP), can be static or updated at runtime\r\n@class LightProbe\r\n@param {number} res - Resolution in pixel of lightprobe (default 64)\r\n@param {number} near - Capture near (default 1m)\r\n@param {number} far - Capture far (default 1Km)\r\n@example \r\nlet LP = new ATON.LightProbe()\r\n*/\r\nclass LightProbe {\r\n\r\nconstructor(res, near, far){\r\n this.pos = new THREE.Vector3(0,0,0);\r\n\r\n this._res = (res !== undefined)? res : 64;\r\n this._near = (near !== undefined)? near : 1.0;\r\n this._far = (far !== undefined)? far : ATON.Nav.STD_FAR;\r\n/*\r\n this._LPtarget0 = undefined;\r\n this._LPtarget1 = undefined;\r\n\r\n this._LP0 = undefined;\r\n this._LP1 = undefined;\r\n\r\n this._flipLP = false;\r\n*/\r\n this._envtex = undefined;\r\n this._prevCCtarget = undefined;\r\n/*\r\n this._LP = new THREE.LightProbe();\r\n this._LP.intensity = 10;\r\n ATON._mainRoot.add( this._LP );\r\n*/\r\n \r\n //this._pmremGenerator = new THREE.PMREMGenerator(ATON._renderer);\r\n\r\n //this.realize();\r\n}\r\n\r\n/*\r\nrealize(){\r\n this._LPtarget0 = new THREE.WebGLCubeRenderTarget( this._res, {\r\n format: THREE.RGBFormat,\r\n generateMipmaps: true,\r\n minFilter: THREE.LinearMipmapLinearFilter,\r\n encoding: THREE.sRGBEncoding // prevent the material's shader from recompiling every frame\r\n });\r\n\r\n this._LPtarget1 = new THREE.WebGLCubeRenderTarget( this._res, {\r\n format: THREE.RGBFormat,\r\n generateMipmaps: true,\r\n minFilter: THREE.LinearMipmapLinearFilter,\r\n encoding: THREE.sRGBEncoding\r\n });\r\n\r\n this._LP0 = new THREE.CubeCamera( this._near, this._far, this._LPtarget0 );\r\n this._LP1 = new THREE.CubeCamera( this._near, this._far, this._LPtarget1 );\r\n\r\n return this;\r\n}\r\n*/\r\n\r\n/**\r\nSet LP position\r\n@example\r\nLP.setPosition(2.0,6.0,1.5)\r\n@example\r\nLP.setPosition( new THREE.Vector3(2.0,6.0,1.5) )\r\n*/\r\nsetPosition(x,y,z){\r\n if (x instanceof THREE.Vector3) this.pos.copy(x);\r\n else this.pos.set(x,y,z);\r\n\r\n //this._LP.position.copy(this.pos);\r\n\r\n return this;\r\n}\r\n\r\nsetNear(near){\r\n this._near = near;\r\n return this;\r\n}\r\nsetFar(far){ \r\n this._far = far;\r\n return this;\r\n}\r\n\r\n/**\r\nUpdate LP capture. Typically called when all 3D models are loaded and arranged into the scene.\r\nCan be called at runtime or whenever there is some change in the 3D scene\r\n@example\r\nLP.update()\r\n*/\r\nupdate(){\r\n if (this._envtex) this._envtex.dispose();\r\n if (this._prevCCtarget) this._prevCCtarget.dispose();\r\n\r\n let CCtarget = new THREE.WebGLCubeRenderTarget( this._res, {\r\n format: THREE.RGBEFormat, //THREE.RGBEFormat,\r\n generateMipmaps: true,\r\n minFilter: THREE.LinearMipmapLinearFilter,\r\n encoding: THREE.sRGBEncoding // prevent the material's shader from recompiling every frame\r\n });\r\n\r\n let CC = new THREE.CubeCamera( this._near, this._far, CCtarget );\r\n CC.position.copy(this.pos);\r\n //CC.layers.set(ATON.NTYPES.SCENE);\r\n\r\n CC.update( ATON._renderer, ATON._rootVisibleGlobal/*ATON._mainRoot*/ );\r\n this._envtex = CCtarget.texture;\r\n\r\n // new\r\n //this._LP.copy( THREE.LightProbeGenerator.fromCubeRenderTarget(ATON._renderer, CCtarget) );\r\n //this._envtex = this._LP;\r\n \r\n \r\n/*\r\n console.log(CC);\r\n console.log(CCtarget);\r\n\r\n let CCtargetX = new THREE.WebGLCubeRenderTarget( this._res, {\r\n format: THREE.RGBFormat,\r\n //generateMipmaps: true,\r\n minFilter: THREE.LinearMipmapLinearFilter,\r\n encoding: THREE.sRGBEncoding\r\n });\r\n\r\n let CCX = new THREE.CubeCamera( this._near, this._far, CCtargetX );\r\n CCX.position.copy(this.pos);\r\n\r\n CCX.update( ATON._renderer, ATON._rootVisible );\r\n this._envtex = this._pmremGenerator.fromCubemap(CCtargetX.texture).texture;\r\n*/\r\n\r\n this._prevCCtarget = CCtarget;\r\n\r\n\r\n/*\r\n if (this._LP0 === undefined || this._LP1 === undefined) return this;\r\n\r\n this._flipLP = !this._flipLP;\r\n //ATON._flipLP = !ATON._flipLP;\r\n\r\n if (this._flipLP){\r\n this._LP0.update( ATON._renderer, ATON._mainRoot );\r\n this._envtex = this._LPtarget0.texture;\r\n }\r\n else {\r\n this._LP1.update( ATON._renderer, ATON._mainRoot );\r\n this._envtex = this._LPtarget1.texture;\r\n }\r\n*/\r\n return this;\r\n}\r\n\r\n\r\ngetEnvTex(){\r\n return this._envtex;\r\n}\r\n\r\nassignToNode(N){\r\n if (N === undefined) return;\r\n //TODO:\r\n}\r\n\r\n}\r\n\r\nexport default LightProbe;","/*\r\n ATON Event Hub\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Event Hub\r\n@namespace EventHub\r\n*/\r\nlet EventHub = {};\r\n\r\n//Initializes the component\r\nEventHub.init = ()=>{\r\n\r\n EventHub.evLocal = {};\r\n EventHub.evNetwork = {};\r\n\r\n // Expose\r\n ATON.on = EventHub.on;\r\n ATON.fireEvent = EventHub.fireEvent;\r\n ATON.clearEventHandlers = EventHub.clearEventHandlers\r\n};\r\n\r\n/**\r\nClear all event handlers for a given event\r\n@param {string} evtname - event name\r\n*/\r\nEventHub.clearEventHandlers = (evtname)=>{\r\n EventHub.evLocal[evtname] = [];\r\n EventHub.evNetwork[evtname] = [];\r\n};\r\n\r\n// Execute all handlers from list with given data\r\nEventHub.executeHandlers = (ehList, data)=>{\r\n if (!ehList) return;\r\n\r\n for (let h = 0; h < ehList.length; h++) {\r\n const handler = ehList[h];\r\n if (handler) handler(data);\r\n }\r\n};\r\n\r\n/**\r\nSubscribe to a given event, with local handler and optional network handler.\r\nThis is also accessible as ATON.on()\r\n@param {string} evtname - event name\r\n@param {function} handlerLocal - local event handler\r\n@param {function} handlerNetwork - optional network (see VRoadcast) event handler\r\n@example\r\nATON.EventHub.on(\"myEvent\", function(data){ console.log(\"received local event\"); })\r\n@example\r\nATON.on(\"myEvent\", function(data){ console.log(\"received local event\"); })\r\n*/\r\nEventHub.on = (evtname, handlerLocal, handlerNetwork)=>{\r\n // Local event (default)\r\n if (handlerLocal !== undefined){\r\n const evhLocal = EventHub.evLocal;\r\n\r\n if (evhLocal[evtname] === undefined) evhLocal[evtname] = []; // First time (event not registered)\r\n evhLocal[evtname].push(handlerLocal);\r\n }\r\n\r\n // Received event (network)\r\n if (handlerNetwork !== undefined){\r\n ATON.VRoadcast.on(evtname, handlerNetwork);\r\n }\r\n\r\n};\r\n\r\n/**\r\nFire a local (and optionally network) event, with data.\r\nThis is also accessible as ATON.fireEvent()\r\n@param {string} evtname - event name\r\n@param {object} data - object containing data to be transmitted with this event\r\n@param {bool} bReplicate - if true, it will replicate (broadcast) the event to other connected peers in the same scene (see VRoadcast)\r\n@example\r\nATON.EventHub.fireEvent(\"myEvent\", data)\r\n@example\r\nATON.fireEvent(\"myEvent\", data)\r\n*/\r\nEventHub.fireEvent = (evtname, data, bReplicate)=>{\r\n const ehList = EventHub.evLocal[evtname];\r\n EventHub.executeHandlers(ehList, data);\r\n\r\n if (!bReplicate) return;\r\n ATON.VRoadcast.fireEvent(evtname, data);\r\n};\r\n\r\nexport default EventHub;","/*\r\n ATON Materials Hub\r\n Centralized material manager\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Material Hub\r\n@namespace MatHub\r\n*/\r\nlet MatHub = {};\r\n\r\nMatHub.init = ()=>{\r\n MatHub.materials = {};\r\n MatHub.colors = {};\r\n\r\n MatHub._loader = new THREE.MaterialLoader();\r\n\r\n // Uniforms\r\n MatHub._uSem = {\r\n time: { type:'float', value: 0.0 },\r\n tint: { type:'vec4', value: new THREE.Vector4(0.2,0.2,1.0, 0.2) }\r\n };\r\n\r\n MatHub.addDefaults();\r\n};\r\n\r\nMatHub.getDefVertexShader = ()=>{\r\n return `\r\n varying vec3 vPositionW;\r\n varying vec3 vNormalW;\r\n varying vec3 vNormalV;\r\n\r\n void main(){\r\n vPositionW = vec3( vec4( position, 1.0 ) * modelMatrix);\r\n vNormalW = normalize( vec3( vec4( normal, 0.0 ) * modelMatrix ) );\r\n vNormalV = normalize( vec3( normalMatrix * normal ));\r\n\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\r\n }\r\n `;\r\n};\r\n\r\nMatHub.addDefaults = ()=>{\r\n\r\n // Colors\r\n MatHub.colors.white = new THREE.Color(1,1,1);\r\n MatHub.colors.black = new THREE.Color(0,0,0);\r\n MatHub.colors.green = new THREE.Color(0,1,0);\r\n MatHub.colors.yellow = new THREE.Color(1,1,0);\r\n MatHub.colors.red = new THREE.Color(1,0,0);\r\n MatHub.colors.blue = new THREE.Color(0,0,1);\r\n MatHub.colors.orange = new THREE.Color(1,0.5,0);\r\n\r\n MatHub.colors.defUI = new THREE.Color(0,1,0.5);\r\n \r\n MatHub.colors.sem = new THREE.Color(0,1,0.5);\r\n MatHub.colors.darksem = new THREE.Color(0,0,0.1);\r\n\r\n // Materials\r\n MatHub.materials.fullyTransparent = new THREE.MeshBasicMaterial({ \r\n transparent: true, \r\n depthWrite: false, \r\n opacity: 0.0\r\n });\r\n\r\n // Default UI\r\n MatHub.materials.defUI = new THREE.ShaderMaterial({\r\n uniforms: {\r\n color: { type:'vec3', value: MatHub.colors.defUI },\r\n opacity: { type:'float', value: 0.8 }\r\n },\r\n\r\n vertexShader: MatHub.getDefVertexShader(),\r\n fragmentShader:`\r\n varying vec3 vPositionW;\r\n\t\t varying vec3 vNormalW;\r\n varying vec3 vNormalV;\r\n uniform vec3 color;\r\n uniform float opacity;\r\n\r\n\t\t void main(){\r\n\t\t //vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\r\n\r\n float f;\r\n\t\t //f = dot(viewDirectionW, vNormalW);\r\n f = dot(vNormalV, vec3(0,0,1));\r\n\t\t f = clamp(1.0 - f, 0.2, 1.0);\r\n\r\n\t\t gl_FragColor = vec4(color.rgb, f * opacity);\r\n\t\t }\r\n `,\r\n transparent: true,\r\n depthWrite: false,\r\n }); \r\n \r\n // Selector\r\n MatHub.materials.selector = MatHub.materials.defUI.clone();\r\n\r\n/*\r\n MatHub.materials.selector = new THREE.MeshBasicMaterial({\r\n color: MatHub.colors.green,\r\n transparent: true,\r\n depthWrite: false,\r\n opacity: 0.2 \r\n //flatShading: true\r\n });\r\n*/\r\n // XR/VR ray\r\n MatHub.materials.controllerRay = MatHub.materials.defUI.clone();\r\n MatHub.materials.controllerRay.uniforms.color.value = MatHub.colors.white;\r\n/*\r\n MatHub.materials.controllerRay = new THREE.MeshBasicMaterial({ \r\n color: MatHub.colors.white, \r\n transparent: true, \r\n opacity: 0.2,\r\n depthWrite: false\r\n //flatShading: true\r\n });\r\n*/\r\n // Teleport locator\r\n MatHub.materials.teleportLoc = new THREE.MeshBasicMaterial({ \r\n transparent: true, \r\n opacity: 1.0,\r\n depthWrite: false,\r\n //flatShading: true,\r\n side: THREE.DoubleSide\r\n });\r\n ATON.Utils.textureLoader.load(ATON.PATH_RES+\"grad.png\", (texture) => {\r\n MatHub.materials.teleportLoc.map = texture;\r\n });\r\n\r\n // Measurements\r\n MatHub.materials.measurement = new THREE.MeshBasicMaterial({\r\n color: MatHub.colors.white,\r\n //linewidth: 5,\r\n transparent: true,\r\n depthWrite: false,\r\n opacity: 0.5, \r\n depthTest: false\r\n //flatShading: true\r\n });\r\n\r\n // Semantic shapes\r\n/*\r\n MatHub.materials.semanticShape = new THREE.MeshBasicMaterial({ \r\n //color: MatHub.colors.white, \r\n transparent: true,\r\n depthWrite: false, \r\n opacity: 0.0,\r\n //flatShading: true\r\n });\r\n*/\r\n\r\n MatHub.materials.semanticShape = new THREE.ShaderMaterial({\r\n uniforms: MatHub._uSem,\r\n\r\n vertexShader: MatHub.getDefVertexShader(),\r\n fragmentShader:`\r\n varying vec3 vPositionW;\r\n\t\t varying vec3 vNormalW;\r\n varying vec3 vNormalV;\r\n\r\n uniform float time;\r\n uniform vec4 tint;\r\n\r\n\t\t void main(){\r\n\t\t //vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\r\n\r\n //float ff = dot(vNormalV, vec3(0,0,1));\r\n\t\t //ff = clamp(1.0-ff, 0.0, 1.0);\r\n\r\n float f = (1.0 * cos(time*2.0)); // - 0.5;\r\n //f = cos(time + (vPositionW.y*10.0));\r\n f = clamp(f, 0.0,1.0);\r\n\r\n\t\t gl_FragColor = vec4(tint.rgb, tint.a * f);\r\n //gl_FragColor = vec4(tint.rgb, ff);\r\n\t\t }\r\n `,\r\n transparent: true,\r\n depthWrite: false,\r\n //flatShading: false\r\n //opacity: 0.0,\r\n });\r\n\r\n MatHub.materials.semanticShapeHL = new THREE.MeshBasicMaterial({ \r\n color: MatHub.colors.sem, \r\n transparent: true,\r\n depthWrite: false, \r\n opacity: 0.2\r\n //flatShading: true\r\n });\r\n MatHub.materials.semanticShapeEdit = new THREE.MeshBasicMaterial({ \r\n color: MatHub.colors.orange, \r\n transparent: true,\r\n depthWrite: false, \r\n opacity: 0.5\r\n //flatShading: true\r\n });\r\n\r\n MatHub.semIcon = new THREE.SpriteMaterial({ \r\n map: new THREE.TextureLoader().load( ATON.PATH_RES+\"sui-sem.png\" ), \r\n //color: MatHub.colors.sem, // multiply\r\n transparent: true,\r\n opacity: 1.0,\r\n //depthWrite: false, \r\n depthTest: false\r\n });\r\n\r\n MatHub.materials.lp = new THREE.ShaderMaterial({ \r\n vertexShader: MatHub.getDefVertexShader(),\r\n fragmentShader:`\r\n varying vec3 vPositionW;\r\n\t\t varying vec3 vNormalW;\r\n varying vec3 vNormalV;\r\n\r\n\t\t void main(){\r\n\t\t vec3 viewDirectionW = normalize(cameraPosition - vPositionW);\r\n\r\n float f;\r\n\t\t //f = dot(viewDirectionW, vNormalW);\r\n f = dot(vNormalV, vec3(0,0,1));\r\n\t\t f = clamp(1.0 - f, 0.0, 1.0);\r\n\r\n\t\t gl_FragColor = vec4(1.0,1.0,1.0, f);\r\n\t\t }\r\n `,\r\n transparent: true,\r\n depthWrite: false,\r\n //flatShading: false\r\n }); \r\n\r\n MatHub.lpIcon = new THREE.SpriteMaterial({ \r\n map: new THREE.TextureLoader().load( ATON.PATH_RES+\"sui-lp.png\" ), \r\n //color: MatHub.colors.sem, // multiply\r\n transparent: true,\r\n opacity: 1.0,\r\n depthWrite: false, \r\n //depthTest: false\r\n });\r\n\r\n MatHub.semIcon.sizeAttenuation = false;\r\n MatHub.lpIcon.sizeAttenuation = false;\r\n};\r\n\r\nMatHub.addMaterial = (id, mat)=>{\r\n if (MatHub.materials[id]){\r\n console.log(\"MatHub: material \"+id+\" already registered\");\r\n return;\r\n }\r\n\r\n MatHub.materials[id] = mat;\r\n};\r\n\r\nMatHub.loadMaterial = (id, jsonfile)=>{\r\n MatHub._loader.load(jsonfile, (mat)=>{\r\n MatHub.addMaterial(id, mat);\r\n },\r\n undefined,\r\n (err)=>{\r\n console.log(err);\r\n });\r\n};\r\n\r\nMatHub.getMaterial = (id)=>{\r\n return MatHub.materials[id];\r\n};\r\n\r\nMatHub.update = ()=>{\r\n MatHub._uSem.time.value += ATON._dt;\r\n};\r\n\r\nexport default MatHub;","/*\r\n ATON Utils\r\n various utilities for device profiling, graph visiting, etc.\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Utils\r\n@namespace Utils\r\n*/\r\nlet Utils = {};\r\n\r\nUtils.TSTRING_SEPARATOR = \" \";\r\n\r\n\r\nUtils.init = ()=>{\r\n // read-only object to inspect device capabilities\r\n ATON.device = {};\r\n\r\n //Utils.geomUnitSphere = new THREE.SphereBufferGeometry( 1.0, 16, 16 );\r\n Utils.geomUnitSphere = new THREE.SphereGeometry( 1.0, 16, 16 );\r\n\r\n // Export/Download utils\r\n Utils.exporterGLTF = undefined;\r\n Utils.exporterOBJ = undefined;\r\n\r\n Utils._dlink = document.createElement('a');\r\n Utils._dlink.style.display = 'none';\r\n document.body.appendChild( Utils._dlink ); // Firefox workaround, see #6594\r\n\r\n Utils.textureLoader = new THREE.TextureLoader();\r\n};\r\n\r\nUtils.generateID = (prefix)=>{\r\n if (prefix === undefined) prefix = \"id\";\r\n //let currDate = new Date();\r\n //let ts = currDate.getYear()+\":\"+currDate.getMonth()+\":\"+currDate.getDay()+\":\"+currDate.getHours()+\":\"+currDate.getMinutes() +\":\"+ currDate.getSeconds();\r\n return prefix+'-' + Math.random().toString(36).substr(2,9);\r\n};\r\n\r\nUtils.goToURL = (url)=>{\r\n window.location.href = url;\r\n};\r\n\r\n/**\r\nIf current connection is secure\r\n@returns {boolean}\r\n*/\r\nUtils.isConnectionSecure = ()=>{\r\n return window.isSecureContext;\r\n}\r\n\r\n\r\n// Profile device capabilities\r\nUtils.profileDevice = ()=>{\r\n\r\n // Detect mobile\r\n ATON.device.isMobile = false;\r\n let detectMobile = ()=>{\r\n if(/(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)\r\n || /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))){\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n ATON.device.isMobile = detectMobile();\r\n\r\n // XR profiling\r\n ATON.device.xrSupported = {};\r\n ATON.device.xrSupported['immersive-vr'] = false;\r\n ATON.device.xrSupported['immersive-ar'] = false;\r\n\r\n if ( 'xr' in navigator ){\r\n\t navigator.xr.isSessionSupported( 'immersive-vr' ).then(( b )=>{\r\n if (b) ATON.device.xrSupported['immersive-vr'] = true;\r\n else ATON.device.xrSupported['immersive-vr'] = false;\r\n\r\n console.log(\"WebXR VR session support: \"+ATON.device.xrSupported['immersive-vr']);\r\n ATON.fireEvent(\"XR_support\", {type: 'immersive-vr', v: ATON.device.xrSupported['immersive-vr']});\r\n\t\t});\r\n\r\n\t navigator.xr.isSessionSupported( 'immersive-ar' ).then(( b )=>{\r\n if (b) ATON.device.xrSupported['immersive-ar'] = true;\r\n else ATON.device.xrSupported['immersive-ar'] = false;\r\n\r\n console.log(\"WebXR AR session support: \"+ATON.device.xrSupported['immersive-ar']);\r\n ATON.fireEvent(\"XR_support\", {type: 'immersive-ar', v: ATON.device.xrSupported['immersive-ar']});\r\n\t\t});\r\n }\r\n};\r\n\r\n\r\nUtils.profileRenderingCapabilities = ()=>{\r\n if (ATON._renderer === undefined) return;\r\n\r\n let rcc = ATON._renderer.capabilities;\r\n if (rcc === undefined) return;\r\n\r\n ATON.device.lowGPU = false;\r\n\r\n if (!rcc.isWebGL2) ATON.device.lowGPU = true;\r\n if (rcc.maxTextureSize < 8192) ATON.device.lowGPU = true;\r\n\r\n console.log(rcc);\r\n};\r\n\r\n/**\r\nIf current device is mobile (e.g. smartphone, tablet, Oculus Quest)\r\n@returns {boolean}\r\n*/\r\nUtils.isMobile = ()=>{\r\n return ATON.device.isMobile;\r\n}\r\n\r\n/**\r\nIf current device supports WebXR immersive VR sessions\r\n@returns {boolean}\r\n*/\r\nUtils.isVRsupported = ()=>{\r\n return ATON.device.xrSupported['immersive-vr'];\r\n}\r\n\r\n/**\r\nIf current device supports WebXR immersive AR sessions\r\n@returns {boolean}\r\n*/\r\nUtils.isARsupported = ()=>{\r\n return ATON.device.xrSupported['immersive-ar'];\r\n}\r\n\r\n\r\n// Path utils\r\nUtils.getFileExtension = ( filepath )=>{\r\n\treturn filepath.substr(filepath.lastIndexOf('.')+1).toLowerCase();\r\n};\r\n\r\nUtils.removeFileExtension = ( filepath )=>{\r\n return filepath.replace(/\\.[^/.]+$/, \"\");\r\n};\r\n\r\nUtils.isVideo = ( filepath )=>{\r\n let ext = Utils.getFileExtension(filepath);\r\n\r\n if (ext === \"mp4\") return true;\r\n if (ext === \"webm\") return true;\r\n};\r\n\r\nUtils.getBaseFolder = ( filepath )=>{\r\n var index = filepath.lastIndexOf('/');\r\n if (index !== -1) return filepath.substring( 0, index + 1 );\r\n \r\n return '';\r\n};\r\n\r\nUtils.isResourceURL = (s)=>{\r\n if (s.startsWith(\"http://\")) return true;\r\n if (s.startsWith(\"https://\")) return true;\r\n return false;\r\n};\r\n\r\nUtils.URLify =(string)=>{\r\n const urls = string.match(/(((ftp|https?):\\/\\/)[\\-\\w@:%_\\+.~#?,&\\/\\/=]+)/g);\r\n if (urls){\r\n urls.forEach(function(url){\r\n string = string.replace(url, '' + url + \"\");\r\n });\r\n }\r\n\r\n return string;\r\n};\r\n\r\nUtils.resolveCollectionURL = (url)=>{\r\n if (url.startsWith(\"http\")) return url;\r\n \r\n return ATON.PATH_COLLECTION+url;\r\n};\r\n\r\n// JSON post utility\r\nUtils.postJSON = (endpoint, obj, onReceive, onFail)=>{\r\n $.ajax({\r\n url: endpoint,\r\n type:\"POST\",\r\n xhrFields: { withCredentials: true },\r\n data: JSON.stringify(obj),\r\n contentType:\"application/json; charset=utf-8\",\r\n dataType:\"json\",\r\n\r\n success: (data)=>{\r\n if (onReceive) onReceive(data);\r\n }\r\n }).fail((err)=>{\r\n console.log(err);\r\n if (onFail) onFail();\r\n });\r\n};\r\n\r\n\r\nUtils.mergeObject = ( object )=>{\r\n object.updateMatrixWorld( true );\r\n\r\n const geometry = [];\r\n object.traverse( c => {\r\n if ( c.isMesh ){\r\n const g = c.geometry;\r\n g.applyMatrix4( c.matrixWorld );\r\n geometry.push( g.toNonIndexed() );\r\n }\r\n\r\n });\r\n\r\n const mergedGeometries = THREE.BufferGeometryUtils.mergeBufferGeometries( geometry, false );\r\n const mergedGeometry = THREE.BufferGeometryUtils.mergeVertices( mergedGeometries ).center();\r\n\r\n const group = new THREE.Group();\r\n const mesh = new THREE.Mesh( mergedGeometry );\r\n group.add( mesh );\r\n return group;\r\n};\r\n\r\nUtils.setPicking = (node, type, b)=>{\r\n if (b === undefined) b = true;\r\n\r\n //console.log(b);\r\n \r\n node.traverse((o) => {\r\n if (b) o.layers.enable(type);\r\n else o.layers.disable(type);\r\n });\r\n\r\n // children\r\n/*\r\n for (let c in node.children){\r\n let C = node.children[c];\r\n Utils.setPicking(C, type, b);\r\n }\r\n*/\r\n};\r\n\r\nUtils.graphPostVisitor = (N)=>{\r\n //if (N.type === undefined) return;\r\n\r\n if (!N.visible){\r\n Utils.setPicking(N, N.type, false);\r\n return;\r\n }\r\n/*\r\n for (let c in N.children){\r\n let C = N.children[c];\r\n Utils.graphPostVisitor(C);\r\n }\r\n*/\r\n console.log(N);\r\n};\r\n\r\n// TileSets utils\r\nUtils.updateTSetsCamera = (cam)=>{\r\n if (cam === undefined) cam = ATON.Nav._camera;\r\n\r\n const nts = ATON._tsets.length;\r\n if (nts <= 0) return;\r\n\r\n/*\r\n // Immersive VR mode\r\n if (ATON.XR._bPresenting){\r\n //console.log(ATON._tsets)\r\n\r\n for (let ts=0; ts TS.deleteCamera( cam ) );\r\n\r\n let currCamera = ATON._renderer.xr.getCamera(); // cam\r\n if (currCamera){\r\n TS.setCamera( currCamera );\r\n\r\n TS.setResolution( currCamera, 8000, 8000 );\r\n\r\n let leftCam = currCamera.cameras[0];\r\n if ( leftCam ){\r\n //TS.setResolution( currCamera, leftCam.viewport.z, leftCam.viewport.w );\r\n //console.log(leftCam);\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n*/\r\n\r\n for (let ts=0; ts{\r\n\r\n let ts = new TILES.TilesRenderer(tsurl);\r\n if (!ts) return;\r\n\r\n //ATON._assetReqNew(tsurl);\r\n\r\n ts.fetchOptions.mode = 'cors';\r\n\r\n ts.setCamera( ATON.Nav._camera );\r\n ts.setResolutionFromRenderer( ATON.Nav._camera, ATON._renderer );\r\n\r\n //ts.errorTarget = ;\r\n\r\n let bFirst = false;\r\n\r\n //ATON._assetReqComplete(tsurl);\r\n\r\n ts.onLoadModel = ( scene )=>{\r\n //Utils.modelVisitor( N, scene );\r\n //ATON._onAllReqsCompleted();\r\n\r\n if (!bFirst){\r\n ///ATON._assetReqComplete(tsurl);\r\n ATON._onAllReqsCompleted();\r\n bFirst = true;\r\n }\r\n\r\n scene.traverse( c => {\r\n //c.layers.enable(N.type);\r\n\r\n if (c.isMesh){\r\n c.castShadow = true; //N.castShadow;\r\n c.receiveShadow = true; //N.receiveShadow;\r\n }\r\n\r\n if ( c.material ) {\r\n //c.originalMaterial = c.material;\r\n //c.material = wireMat;\r\n if (N.userData.cMat) c.material = N.userData.cMat;\r\n\r\n if (c.material.map){\r\n c.material.map.minFilter = THREE.LinearMipmapLinearFilter;\r\n c.material.map.magFilter = THREE.LinearFilter;\r\n }\r\n }\r\n });\r\n\r\n };\r\n\r\n ts.onDisposeModel = (scene)=>{\r\n scene.traverse( c => {\r\n if ( c.isMesh ) {\r\n c.material.dispose();\r\n }\r\n });\r\n };\r\n\r\n N.add(ts.group);\r\n\r\n Utils.setPicking(N, N.type, true);\r\n\r\n //console.log(ts);\r\n\r\n ATON._tsets.push(ts);\r\n};\r\n\r\n// Helper visitor routine\r\n// Note: N (parent node) is not yet connected to model\r\nUtils.modelVisitor = (N, model)=>{\r\n if (model===undefined) return this;\r\n if (N===undefined) return this;\r\n\r\n //model = Utils.mergeObject(model);\r\n \r\n //let N = parentNode;\r\n let type = N.type; // Differentiate visit depending on node type\r\n\r\n model.traverse( ( o ) => {\r\n/*\r\n if (N.bPickable !== undefined){\r\n if (N.bPickable) o.layers.enable(type);\r\n else o.layers.disable(type);\r\n //Utils.setPicking(N, type, N.bPickable);\r\n }\r\n //else o.layers.enable(type); //Utils.setPicking(N, type, true);\r\n*/\r\n\r\n //Utils.setPicking(model, type, N.bPickable);\r\n //if (!N.visible) Utils.setPicking(model, type, false);\r\n\r\n // perf.\r\n // TODO: manually call object.updateMatrix()\r\n //o.matrixAutoUpdate = false;\r\n\r\n if (o.isMesh){\r\n //let numVertices = o.geometry.attributes.position.count;\r\n //console.log(numVertices);\r\n\r\n if (type === ATON.NTYPES.SCENE){\r\n // TODO: \r\n o.castShadow = true; //N.castShadow;\r\n o.receiveShadow = true; //N.receiveShadow;\r\n\r\n // Build accelerated ray casting\r\n if (o.geometry){\r\n o.geometry.computeBoundsTree();\r\n console.log(\"Computed visible BVH\");\r\n\r\n // visualize BVH bounds\r\n/*\r\n let BVHVis = new ThreeMeshBVH.MeshBVHVisualizer(o, 10);\r\n BVHVis.update();\r\n o.parent.add(BVHVis);\r\n*/\r\n }\r\n\r\n // Fix mipmapping\r\n\r\n if ( o.material.map !== null){\r\n //console.log(object.material.map);\r\n \r\n // Why do I have to do this?\r\n o.material.map.generateMipmaps = true;\r\n o.material.map.anisotropy = ATON.device.isMobile? 0 : ATON._maxAnisotropy;\r\n o.material.map.minFilter = THREE.LinearMipmapLinearFilter;\r\n o.material.map.magFilter = THREE.LinearFilter;\r\n //o.material.map.needsUpdate = true;\r\n }\r\n }\r\n\r\n if (type === ATON.NTYPES.SEM){\r\n o.material = ATON.MatHub.materials.semanticShape;\r\n\r\n // Build accelerated ray casting\r\n if (o.geometry){\r\n o.geometry.computeBoundsTree();\r\n console.log(\"Computed semantic BVH\");\r\n }\r\n\r\n //N.setDefaultAndHighlightMaterials(ATON.MatHub.materials.semanticShape, ATON.MatHub.materials.semanticShapeHL);\r\n }\r\n\r\n // Cascading material\r\n if (N.userData.cMat){\r\n o.material = N.userData.cMat;\r\n //o.material.needsUpdate = true;\r\n }\r\n\r\n }\r\n/*\r\n if (N.userData.cMat){\r\n o.material = N.userData.cMat;\r\n //o.cMat = N.userData.cMat;\r\n //o.material.needsUpdate = true;\r\n }\r\n*/\r\n });\r\n\r\n //Utils.setPicking(N, type, N.bPickable);\r\n\r\n/*\r\n for (let c in model.children){\r\n let C = model.children[c];\r\n Utils.modelVisitor(model, C);\r\n }\r\n*/\r\n};\r\n\r\nUtils.registerAniMixers = (N, data)=>{\r\n let model = data.scene || data.scene[0];\r\n let bAnimations = false;\r\n\r\n if (data.animations === undefined) return;\r\n\r\n let mixer = new THREE.AnimationMixer( model );\r\n data.animations.forEach((clip)=>{\r\n mixer.clipAction( clip ).play();\r\n //console.log(mixer.clipAction( clip ));\r\n //console.log(N);\r\n bAnimations = true;\r\n });\r\n\r\n if (!bAnimations) return;\r\n\r\n ATON._aniMixers.push(mixer);\r\n\r\n if (N._aniMixers === undefined) N._aniMixers = [];\r\n N._aniMixers.push(mixer);\r\n};\r\n\r\n// Copyright extraction\r\nUtils.ccExtract = (data)=>{\r\n if (data === undefined) return;\r\n if (data.asset === undefined) return;\r\n\r\n let cc = {};\r\n\r\n if (data.asset.copyright) cc.copyright = data.asset.copyright;\r\n if (data.asset.extras){\r\n for (let e in data.asset.extras) cc[e] = data.asset.extras[e];\r\n }\r\n if (data.asset.generator) cc.generator = data.asset.generator;\r\n\r\n if (data.asset.copyright || data.asset.extras) ATON._ccModels.push(cc);\r\n \r\n console.log(cc);\r\n};\r\n\r\nUtils.parseTransformString = (tstr)=>{\r\n let T = new THREE.Group();\r\n\r\n let values = tstr.split(Utils.TSTRING_SEPARATOR);\r\n let numValues = values.length;\r\n\r\n if (numValues < 3) return T; // nothing to do\r\n\r\n // Translation\r\n T.position.set( parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]) );\r\n if (numValues < 6) return T;\r\n\r\n // Rotation\r\n T.rotation.set( parseFloat(values[3]), parseFloat(values[4]), parseFloat(values[5]) );\r\n if (numValues < 9) return T;\r\n\r\n // Scale\r\n T.scale.set( parseFloat(values[6]), parseFloat(values[7]), parseFloat(values[8]) );\r\n return T;\r\n};\r\n\r\nUtils.setVectorPrecision = (v, prec)=>{\r\n v.x = parseFloat( v.x.toPrecision(prec) );\r\n v.y = parseFloat( v.y.toPrecision(prec) );\r\n v.z = parseFloat( v.z.toPrecision(prec) );\r\n \r\n return v;\r\n};\r\n\r\n// Parse markdown (md) content\r\n// readapted from https://codepen.io/kvendrik/pen/Gmefv\r\nUtils.parseMD = (md)=>{\r\n //ul\r\n md = md.replace(/^\\s*\\n\\*/gm, '
      \\n*');\r\n md = md.replace(/^(\\*.+)\\s*\\n([^\\*])/gm, '$1\\n
    \\n\\n$2');\r\n md = md.replace(/^\\*(.+)/gm, '
  • $1
  • ');\r\n\r\n //ol\r\n md = md.replace(/^\\s*\\n\\d\\./gm, '
      \\n1.');\r\n md = md.replace(/^(\\d\\..+)\\s*\\n([^\\d\\.])/gm, '$1\\n
    \\n\\n$2');\r\n md = md.replace(/^\\d\\.(.+)/gm, '
  • $1
  • ');\r\n\r\n //blockquote\r\n md = md.replace(/^\\>(.+)/gm, '
    $1
    ');\r\n\r\n //h\r\n md = md.replace(/[\\#]{6}(.+)/g, '
    $1
    ');\r\n md = md.replace(/[\\#]{5}(.+)/g, '
    $1
    ');\r\n md = md.replace(/[\\#]{4}(.+)/g, '

    $1

    ');\r\n md = md.replace(/[\\#]{3}(.+)/g, '

    $1

    ');\r\n md = md.replace(/[\\#]{2}(.+)/g, '

    $1

    ');\r\n md = md.replace(/[\\#]{1}(.+)/g, '

    $1

    ');\r\n\r\n //alt h\r\n md = md.replace(/^(.+)\\n\\=+/gm, '

    $1

    ');\r\n md = md.replace(/^(.+)\\n\\-+/gm, '

    $1

    ');\r\n\r\n //images\r\n md = md.replace(/\\!\\[([^\\]]+)\\]\\(([^\\)]+)\\)/g, '\"$1\"');\r\n\r\n //links\r\n md = md.replace(/[\\[]{1}([^\\]]+)[\\]]{1}[\\(]{1}([^\\)\\\"]+)(\\\"(.+)\\\")?[\\)]{1}/g, '$1');\r\n\r\n //font styles\r\n md = md.replace(/[\\*\\_]{2}([^\\*\\_]+)[\\*\\_]{2}/g, '$1');\r\n md = md.replace(/[\\*\\_]{1}([^\\*\\_]+)[\\*\\_]{1}/g, '$1');\r\n md = md.replace(/[\\~]{2}([^\\~]+)[\\~]{2}/g, '$1');\r\n\r\n //pre\r\n md = md.replace(/^\\s*\\n\\`\\`\\`(([^\\s]+))?/gm, '
    ');\r\n    md = md.replace(/^\\`\\`\\`\\s*\\n/gm, '
    \\n\\n');\r\n\r\n //code\r\n md = md.replace(/[\\`]{1}([^\\`]+)[\\`]{1}/g, '$1');\r\n\r\n //p\r\n md = md.replace(/^\\s*(\\n)?(.+)/gm, function(m){\r\n return /\\<(\\/)?(h\\d|ul|ol|li|blockquote|pre|img)/.test(m) ? m : '

    '+m+'

    ';\r\n });\r\n\r\n //strip p from pre\r\n md = md.replace(/(\\)\\s*\\n\\(.+)\\<\\/p\\>/gm, '$1$2');\r\n\r\n return md;\r\n}\r\n\r\n// User auth\r\nUtils.checkAuth = (onReceive)=>{\r\n $.ajax({\r\n type: 'GET',\r\n url: ATON.PATH_RESTAPI+\"user\",\r\n xhrFields: { withCredentials: true }, \r\n dataType: 'json',\r\n\r\n success: (data)=>{ onReceive(data); }\r\n //error: ()=>{ onReceive(undefined) }\r\n });\r\n};\r\n\r\n\r\n/**\r\nGet human-readable length (distances, measures, etc...)\r\n@param {number} d - the distance\r\n@returns {string}\r\n*/\r\nUtils.getHumanReadableDistance = (d)=>{\r\n let mstr = \" m\";\r\n\r\n if (d < 0.01){\r\n d *= 1000.0; mstr= \" mm\";\r\n mstr = d.toPrecision(3) + mstr;\r\n return mstr;\r\n }\r\n if (d < 1.0){\r\n d *= 100.0; mstr= \" cm\";\r\n mstr = d.toPrecision(3) + mstr;\r\n return mstr;\r\n }\r\n if (d > 1000.0){\r\n d * 0.001; mstr=\" km\";\r\n mstr = d.toPrecision(3) + mstr;\r\n return mstr;\r\n }\r\n\r\n mstr = d.toPrecision(3) + mstr;\r\n return mstr;\r\n};\r\n\r\n// Extract clean text from HTML\r\nUtils.stripHTMLtagsFromString = (str)=>{\r\n str = str.replace(/(<([^>]+)>)/gi, \"\");\r\n return str;\r\n};\r\n\r\n// Fullscreen (NOT USED)\r\nUtils.requestFullscreen = ()=>{\r\n let elem = document.documentElement;\r\n\r\n if (elem.requestFullscreen) elem.requestFullscreen();\r\n\r\n else if (elem.mozRequestFullScreen){ // Firefox\r\n elem.mozRequestFullScreen();\r\n }\r\n else if (elem.webkitRequestFullscreen){ // Chrome, Safari & Opera\r\n elem.webkitRequestFullscreen();\r\n }\r\n else if (elem.msRequestFullscreen){ // IE/Edge\r\n elem.msRequestFullscreen();\r\n }\r\n return true;\r\n};\r\n\r\n\r\n// Export routines\r\nUtils.downloadBlob = (blob, filename)=>{\r\n if (filename === undefined) return;\r\n\r\n Utils._dlink.href = URL.createObjectURL( blob );\r\n Utils._dlink.download = filename;\r\n Utils._dlink.click();\r\n};\r\n\r\n// Download text ASCII data\r\nUtils.downloadText = ( str, filename )=>{\r\n Utils.downloadBlob( new Blob( [ str ], { type: 'text/plain' } ), filename );\r\n};\r\n\r\n// Download json object\r\nUtils.downloadJSONobj = (jsonobj, filename)=>{\r\n Utils.downloadText( JSON.stringify(jsonobj), filename );\r\n};\r\n\r\nUtils.downloadArrayBuffer = ( buffer, filename )=>{\r\n Utils.downloadBlob( new Blob( [ buffer ], { type: 'application/octet-stream' } ), filename );\r\n};\r\n\r\n// Export ATON node\r\nUtils.exportNode = (node, filename)=>{\r\n let ext = Utils.getFileExtension(filename);\r\n if (ext.length < 1) return;\r\n\r\n // GLTF\r\n if (ext === \"glb\" || ext === \"gltf\"){\r\n let bBin = (ext === \"glb\")? true : false;\r\n\r\n let opts = {\r\n //trs: true, // Export position, rotation and scale instead of matrix per node. Default is false\r\n binary: bBin, // Export in binary (.glb) format, returning an ArrayBuffer. Default is false\r\n //onlyVisible: false,\r\n //truncateDrawRange: true\r\n };\r\n\r\n if (Utils.exporterGLTF === undefined) Utils.exporterGLTF = new THREE.GLTFExporter();\r\n\r\n Utils.exporterGLTF.parse( node, ( output )=>{\r\n if ( output instanceof ArrayBuffer ){\r\n Utils.downloadArrayBuffer( output, filename);\r\n }\r\n else {\r\n console.log( output );\r\n Utils.downloadJSONobj(output, filename);\r\n }\r\n }, opts);\r\n }\r\n\r\n // OBJ format\r\n if (ext === \"obj\"){\r\n if (Utils.exporterOBJ === undefined) Utils.exporterOBJ = new THREE.OBJExporter();\r\n\r\n let output = Utils.exporterOBJ.parse(node);\r\n //console.log(output);\r\n Utils.downloadText(output, filename);\r\n }\r\n};\r\n\r\nUtils.takeScreenshot = (size, filename)=>{\r\n let img = new Image();\r\n\r\n console.log(\"Screenshot with size:\"+size);\r\n\r\n ATON.Nav._camera.aspect = 1.0;\r\n ATON.Nav._camera.updateProjectionMatrix();\r\n \r\n ATON._renderer.setSize(size,size);\r\n ATON._renderer.render( ATON._mainRoot, ATON.Nav._camera );\r\n let elDom = ATON._renderer.domElement;\r\n\r\n // We have multi-pass FX composer enabled\r\n if (ATON.FX.composer){\r\n ATON.FX.composer.setSize(size,size);\r\n let UU = ATON.FX.passes[ATON.FX.PASS_AA].material.uniforms;\r\n if (UU) UU.resolution.value.set( (1/size), (1/size) );\r\n\r\n ATON.FX.composer.render();\r\n\r\n elDom = ATON.FX.composer.renderer.domElement;\r\n }\r\n\r\n let b64img = ATON._renderer.domElement.toDataURL();\r\n img.src = b64img;\r\n\r\n if (filename){\r\n Utils._dlink.href = b64img.replace(\"image/png\", \"image/octet-stream\");\r\n Utils._dlink.download = filename;\r\n Utils._dlink.click();\r\n }\r\n\r\n ATON._onResize();\r\n return img;\r\n};\r\n\r\nUtils.assignLightProbeToMesh = (LP, mesh)=>{\r\n if (LP === undefined || mesh === undefined) return;\r\n\r\n if (mesh.noLP) return;\r\n\r\n mesh.userData.LP = LP;\r\n //LP.update();\r\n //mesh.material.envMap = LP.getEnvTex();\r\n \r\n //mesh.material.combine = THREE.MultiplyOperation;\r\n //mesh.material.needsUpdate = true;\r\n\r\n //console.log(mesh.userData);\r\n};\r\n\r\nUtils.createATONCube = (id)=>{\r\n let g = new THREE.BoxBufferGeometry( 1,1,1 );\r\n\r\n let mat = new THREE.MeshStandardMaterial();\r\n\r\n Utils.textureLoader.load((ATON.PATH_RES+\"models/aton-cube.jpg\"), (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n mat.map = tex;\r\n });\r\n\r\n let N = ATON.createSceneNode(id);\r\n N.add( new THREE.Mesh(g) );\r\n N.setMaterial(mat);\r\n\r\n N.enablePicking();\r\n return N;\r\n};\r\n\r\n\r\nUtils.createATONCubePBR = (id)=>{\r\n let g = new THREE.BoxBufferGeometry( 1,1,1 );\r\n\r\n let mat = new THREE.MeshStandardMaterial();\r\n mat.metalness = 1.0;\r\n\r\n Utils.textureLoader.load((ATON.PATH_RES+\"models/aton-cube.jpg\"), (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n mat.map = tex;\r\n });\r\n\r\n Utils.textureLoader.load((ATON.PATH_RES+\"models/aton-cube-pbr.jpg\"), (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n mat.metalnessMap = tex;\r\n mat.roughnessMap = tex;\r\n });\r\n\r\n Utils.textureLoader.load((ATON.PATH_RES+\"models/aton-cube-nrm.png\"), (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n mat.normalMap = tex;\r\n\r\n //mat.bumpMap.anisotropy = ATON._maxAnisotropy;\r\n //mat.bumpMap.minFilter = THREE.LinearMipmapLinearFilter;\r\n //mat.bumpMap.magFilter = THREE.LinearFilter;\r\n });\r\n\r\n let N = ATON.createSceneNode(id);\r\n N.add( new THREE.Mesh(g) );\r\n N.setMaterial(mat);\r\n\r\n N.enablePicking();\r\n return N;\r\n};\r\n\r\n\r\nUtils.createGround = (texture, dx,dz)=>{\r\n if (dx === undefined) dx = 1.0;\r\n if (dz === undefined) dz = 1.0;\r\n\r\n let g = new THREE.PlaneBufferGeometry( dx, dz );\r\n\r\n let mat = new THREE.MeshStandardMaterial();\r\n if (texture !== undefined) Utils.textureLoader.load(texture, (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n mat.map = tex;\r\n });\r\n\r\n let N = ATON.createSceneNode().rotateX(-Math.PI * 0.5);\r\n N.add( new THREE.Mesh(g, mat) );\r\n N.enablePicking();\r\n\r\n return N;\r\n};\r\n\r\n\r\nexport default Utils;","/*\r\n ATON Scene Hub\r\n scene JSON routines\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Scene Hub\r\n@namespace SceneHub\r\n*/\r\nlet SceneHub = {};\r\n\r\nSceneHub.MODE_ADD = 0;\r\nSceneHub.MODE_DEL = 1;\r\n\r\nSceneHub.FLOAT_PREC = 5;\r\n\r\n/**\r\nInitializes the component\r\n*/\r\nSceneHub.init = ()=>{\r\n SceneHub.currID = undefined; // Scene ID (sid) - FIXME: rename to \"SID\"\r\n SceneHub.currData = undefined; // holds compact object describing our ATON scene\r\n SceneHub._bEdit = false; // edit mode (client can modify json on the server)\r\n\r\n SceneHub._bLoading = false;\r\n\r\n // Current scene title & description\r\n SceneHub._title = undefined;\r\n SceneHub._descr = undefined;\r\n\r\n SceneHub.initBaseParsers();\r\n};\r\n\r\n/**\r\nThis enables/disables edit mode - i.e. changes to the scene are sent to server and become persistent\r\n@param {bool} b - true or false\r\n@example\r\nATON.SceneHub.setEditMode(true)\r\n*/\r\nSceneHub.setEditMode = (b)=>{\r\n SceneHub._bEdit = b;\r\n console.log(\"Edit mode:\"+b);\r\n};\r\n\r\n\r\n/**\r\n Loads a scene by providing JSON path\r\n @param {string} reqpath - JSON url\r\n @param {string} sid - Scene ID\r\n @param {function} onSuccess - (Optional) function to be called on success\r\n @example\r\n ATON.SceneHub.load(\"http://path/to/scene.json\", \"sample\", ()=>{ console.log(\"Done!\"); });\r\n*/\r\nSceneHub.load = (reqpath, sid, onSuccess/*, onFail*/)=>{\r\n //let args = reqpath.split(',');\r\n\r\n SceneHub._bLoading = true;\r\n console.log(\"Loading Scene: \"+sid);\r\n\r\n return $.getJSON( reqpath, ( data )=>{\r\n SceneHub.currData = data;\r\n SceneHub.currID = sid; //scenejson.substring(scenejson.lastIndexOf('/')+1);\r\n SceneHub._bLoading = false;\r\n\r\n //console.log(ATON.currScene);\r\n\r\n SceneHub.parseScene(data);\r\n\r\n if (onSuccess) onSuccess();\r\n ATON.fireEvent(\"SceneJSONLoaded\", sid);\r\n });\r\n/*\r\n .fail(()=>{\r\n SceneHub._bLoading = false;\r\n console.log(\"Fail to load \"+reqpath);\r\n\r\n if (onFail) onFail();\r\n });\r\n*/\r\n};\r\n\r\n// Parse JSON scene obj\r\nSceneHub.parseScene = (sobj)=>{\r\n sobj = (sobj === undefined)? SceneHub.currData : sobj;\r\n if (sobj === undefined) return;\r\n\r\n for (let k in sobj)\r\n if (SceneHub._jsonParsers[k]) SceneHub._jsonParsers[k]( sobj[k] );\r\n};\r\n\r\nSceneHub.getJSONchildren = (nid, type)=>{\r\n if (type === undefined) type = ATON.NTYPES.SCENE;\r\n\r\n let P = undefined;\r\n let children = [];\r\n\r\n if (type === ATON.NTYPES.SEM) P = ATON.getSemanticNode(nid);\r\n if (type === ATON.NTYPES.SCENE) P = ATON.getSceneNode(nid);\r\n\r\n if (P === undefined) return undefined;\r\n\r\n for (let c in P.children){\r\n let child = P.children[c];\r\n\r\n if (child.nid !== undefined) children.push( child.nid );\r\n }\r\n\r\n return children;\r\n};\r\n\r\nSceneHub.getJSONgraphEdges = (type)=>{\r\n if (type === undefined) type = ATON.NTYPES.SCENE;\r\n let nodes = ATON.snodes;\r\n \r\n if (type === ATON.NTYPES.SEM) nodes = ATON.semnodes;\r\n if (type === ATON.NTYPES.UI) nodes = ATON.uinodes;\r\n\r\n let edges = {};\r\n\r\n for (let n in nodes){\r\n let N = nodes[n];\r\n\r\n //if (N && N.children) edges[n] = SceneHub.getJSONchildren(n, type);\r\n\r\n let E = {};\r\n if (N && N.parent && N.parent.nid){\r\n //edges.push([N.parent.nid, N.nid]);\r\n if (edges[N.parent.nid] === undefined) edges[N.parent.nid] = [];\r\n edges[N.parent.nid].push(N.nid);\r\n //edges[N.parent.nid].filter((v,i) => edges[N.parent.nid].indexOf(v) === i);\r\n }\r\n }\r\n\r\n //console.log(edges);\r\n return edges;\r\n};\r\n\r\nSceneHub.getJSONsemanticSpheresList = (semid)=>{\r\n let S = ATON.getSemanticNode(semid);\r\n if (S === undefined) return undefined;\r\n\r\n let SL = [];\r\n\r\n for (let s in S.children){\r\n let sphere = S.children[s];\r\n if (sphere.type){\r\n SL.push([\r\n parseFloat(sphere.position.x.toPrecision(SceneHub.FLOAT_PREC)), \r\n parseFloat(sphere.position.y.toPrecision(SceneHub.FLOAT_PREC)), \r\n parseFloat(sphere.position.z.toPrecision(SceneHub.FLOAT_PREC)), \r\n parseFloat(sphere.scale.x.toPrecision(SceneHub.FLOAT_PREC))\r\n ]);\r\n }\r\n }\r\n\r\n return SL;\r\n};\r\n\r\nSceneHub.getJSONsemanticConvexShapes = (semid)=>{\r\n let S = ATON.getSemanticNode(semid);\r\n if (S === undefined) return undefined;\r\n\r\n let CL = [];\r\n\r\n for (let s in S.children){\r\n let semesh = S.children[s];\r\n if (semesh.userData._convexPoints){\r\n CL.push(semesh.userData._convexPoints);\r\n }\r\n }\r\n\r\n //console.log(CL);\r\n \r\n return CL;\r\n};\r\n\r\n// Top-level scene-JSON parsers\r\nSceneHub.initBaseParsers = ()=>{\r\n SceneHub._jsonParsers = {};\r\n\r\n // Scene Title & Description\r\n SceneHub._jsonParsers.title = (title)=>{\r\n if (title === undefined) return;\r\n\r\n SceneHub.setTitle(title);\r\n };\r\n\r\n SceneHub._jsonParsers.description = (descr)=>{\r\n if (descr === undefined) return;\r\n\r\n SceneHub.setDescription(descr);\r\n };\r\n\r\n // FX / post-process\r\n SceneHub._jsonParsers.fx = (fx)=>{\r\n if (fx.ao){\r\n ATON.FX.togglePass(ATON.FX.PASS_AO, true);\r\n if (fx.ao.i) ATON.FX.setAOintensity( parseFloat(fx.ao.i));\r\n }\r\n\r\n if (fx.bloom){\r\n ATON.FX.togglePass(ATON.FX.PASS_BLOOM, true);\r\n if (fx.bloom.i) ATON.FX.setBloomStrength( parseFloat(fx.bloom.i));\r\n if (fx.bloom.t) ATON.FX.setBloomThreshold( parseFloat(fx.bloom.t));\r\n }\r\n\r\n if (fx.dof){\r\n ATON.FX.togglePass(ATON.FX.PASS_DOF, true);\r\n if (fx.dof.f) ATON.FX.setDOFfocus( parseFloat(fx.dof.f) );\r\n }\r\n };\r\n\r\n // Environment\r\n SceneHub._jsonParsers.environment = (env)=>{\r\n\r\n let pano = env.mainpano;\r\n if (env.mainpano){\r\n if (pano.url) ATON.setMainPanorama(pano.url);\r\n if (pano.rotation) ATON.setMainPanoramaRotation(pano.rotation);\r\n }\r\n\r\n if (env.bgcolor){\r\n ATON.setBackgroundColor( new THREE.Color(env.bgcolor[0],env.bgcolor[1],env.bgcolor[2]) );\r\n }\r\n\r\n let L = env.mainlight;\r\n if (L){\r\n if (L.direction) ATON.setMainLightDirection( new THREE.Vector3(L.direction[0],L.direction[1],L.direction[2]) );\r\n\r\n if (ATON._dMainL){\r\n if (L.color) ATON._dMainL.color = new THREE.Color(L.color[0],L.color[1],L.color[2]);\r\n if (L.intensity) ATON._dMainL.intensity = L.intensity;\r\n\r\n if (L.shadows !== undefined) ATON.toggleShadows(L.shadows);\r\n else ATON.toggleShadows(false);\r\n }\r\n else {\r\n //ATON.toggleShadows(false);\r\n ATON.toggleMainLight(false);\r\n }\r\n }\r\n else {\r\n //ATON.toggleShadows(false);\r\n ATON.toggleMainLight(false);\r\n }\r\n\r\n let lps = env.lightprobes;\r\n if (lps){\r\n if (lps.auto) ATON.setAutoLP(true);\r\n }\r\n\r\n if (env.exposure) ATON.setExposure(env.exposure);\r\n\r\n };\r\n\r\n // Soundscape\r\n SceneHub._jsonParsers.soundscape = (soundscape)=>{\r\n if (soundscape === undefined) return;\r\n\r\n if (soundscape.global){\r\n ATON.setGlobalAudio(soundscape.global.url, soundscape.global.loop);\r\n }\r\n };\r\n\r\n // NavMode\r\n SceneHub._jsonParsers.navmode = (navmode)=>{\r\n if (navmode === undefined) return;\r\n\r\n ATON.Nav.setNavMode(navmode);\r\n };\r\n\r\n // Measurements\r\n SceneHub._jsonParsers.measurements = (M)=>{\r\n if (M === undefined) return;\r\n\r\n for (let m in M){\r\n let measure = M[m];\r\n\r\n if (measure.points && measure.points.length === 6){\r\n let A = new THREE.Vector3(\r\n parseFloat(measure.points[0]),\r\n parseFloat(measure.points[1]),\r\n parseFloat(measure.points[2])\r\n );\r\n let B = new THREE.Vector3(\r\n parseFloat(measure.points[3]),\r\n parseFloat(measure.points[4]),\r\n parseFloat(measure.points[5])\r\n );\r\n ATON.SUI.addMeasurementPoint(A);\r\n ATON.SUI.addMeasurementPoint(B);\r\n }\r\n }\r\n };\r\n\r\n // Viewpoints\r\n SceneHub._jsonParsers.viewpoints = (povs)=>{\r\n if (povs === undefined) return;\r\n\r\n for (let p in povs){\r\n let pov = povs[p];\r\n \r\n if (p === \"home\"){\r\n ATON.Nav.setHomePOV( \r\n new ATON.POV()\r\n .setPosition(pov.position[0],pov.position[1],pov.position[2])\r\n .setTarget(pov.target[0],pov.target[1],pov.target[2])\r\n .setFOV(pov.fov)\r\n );\r\n }\r\n else {\r\n new ATON.POV(p)\r\n .setPosition(pov.position[0],pov.position[1],pov.position[2])\r\n .setTarget(pov.target[0],pov.target[1],pov.target[2])\r\n .setFOV(pov.fov)\r\n //.setKeywords(pov.keywords);\r\n }\r\n }\r\n };\r\n\r\n // Visible scene-graph\r\n SceneHub._jsonParsers.scenegraph = (sg)=>{\r\n if (sg === undefined) return;\r\n\r\n let nodes = sg.nodes;\r\n let edges = sg.edges;\r\n\r\n // nodes\r\n for (let nid in nodes){\r\n let N = nodes[nid]; // JSON node\r\n\r\n //let G = ATON.createSceneNode(nid); // ATON node\r\n let G = ATON.getOrCreateSceneNode(nid).removeChildren();\r\n\r\n // Transform node\r\n let transform = N.transform;\r\n let tlist = undefined;\r\n if (transform){\r\n if (transform.position) G.setPosition(transform.position[0],transform.position[1],transform.position[2]);\r\n if (transform.rotation) G.setRotation(transform.rotation[0],transform.rotation[1],transform.rotation[2]);\r\n if (transform.scale) G.setScale(transform.scale[0],transform.scale[1],transform.scale[2]);\r\n\r\n if (transform.list && Array.isArray(transform.list)){\r\n //TODO:\r\n }\r\n }\r\n \r\n // load models by urls list\r\n let urls = N.urls;\r\n if (urls){\r\n if (Array.isArray(urls)){\r\n urls.forEach(u => {\r\n ATON.createSceneNode().load(u).attachTo(G);\r\n });\r\n }\r\n else {\r\n G.load(urls);\r\n }\r\n }\r\n\r\n // FIXME: not working\r\n if (N.shadowcast) G.setShadowCast(N.shadowcast);\r\n if (N.shadowreceive) G.setShadowCast(N.shadowreceive);\r\n\r\n if (N.toYup) G.setYup();\r\n\r\n //if (N.nopicking){ G.disablePicking(); } // FIXME: not working\r\n/*\r\n if (N.color){\r\n let C = ATON.MatHub.colors[N.color];\r\n\r\n G.setMaterial( new THREE.MeshBasicMaterial({ \r\n color: C, \r\n transparent: true,\r\n depthWrite: false, \r\n opacity: 0.1,\r\n }));\r\n\r\n console.log(G);\r\n }\r\n*/\r\n // Keywords\r\n if (N.keywords) G.kwords = N.keywords;\r\n/*\r\n if (N.show !== undefined){\r\n if (N.show){ G.show(); console.log(\"show \"+nid); }\r\n else { G.hide(); console.log(\"hide \"+nid); }\r\n }\r\n*/\r\n }\r\n\r\n // Build graph through relationships\r\n for (let parid in edges){\r\n let children = edges[parid];\r\n\r\n let P = ATON.getSceneNode(parid);\r\n\r\n if (P !== undefined){\r\n for (let c in children){\r\n let childid = children[c];\r\n let C = ATON.getSceneNode(childid);\r\n if (C !== undefined) C.attachTo(P);\r\n }\r\n }\r\n }\r\n\r\n // After connection\r\n for (let nid in nodes){\r\n let N = nodes[nid]; // JSON node\r\n let G = ATON.getSceneNode(nid);\r\n\r\n if (G !== undefined){\r\n if (N.show !== undefined){\r\n //console.log(N.show);\r\n\r\n if (N.show){ G.show(); console.log(\"show \"+nid); }\r\n else { G.hide(); console.log(\"hide \"+nid); }\r\n //console.log(ATON.getSceneNode(nid));\r\n }\r\n //else G.show();\r\n\r\n //if (N.nopicking){ G.disablePicking(); }\r\n //else G.enablePicking();\r\n\r\n if (N.material){\r\n let mat = new THREE.MeshStandardMaterial(N.material);\r\n G.setMaterial( mat );\r\n }\r\n }\r\n }\r\n\r\n/*\r\n for (let e = 0; e < edges.length; e++){\r\n let E = edges[e];\r\n\r\n let from = E[0];\r\n let to = E[1];\r\n\r\n if (from && to){\r\n let child = ATON.getSceneNode(to);\r\n if (child) child.attachTo(from);\r\n }\r\n }\r\n*/\r\n };\r\n\r\n // Semantic scene-graph\r\n SceneHub._jsonParsers.semanticgraph = (sg)=>{\r\n if (sg === undefined) return;\r\n\r\n let nodes = sg.nodes;\r\n let edges = sg.edges;\r\n\r\n // nodes\r\n for (let nid in nodes){\r\n let N = nodes[nid]; // JSON node\r\n\r\n //let G = ATON.createSemanticNode(nid);\r\n let G = ATON.getOrCreateSemanticNode(nid).removeChildren();\r\n \r\n // load shapes by urls list\r\n let urls = N.urls;\r\n if (urls){\r\n if (Array.isArray(urls)){\r\n urls.forEach(u => {\r\n ATON.createSemanticNode().load(u).attachTo(G);\r\n });\r\n }\r\n else {\r\n G.load(urls);\r\n }\r\n }\r\n\r\n if (N.toYup) G.setYup();\r\n\r\n if (N.description) G.setDescription(N.description);\r\n if (N.audio) G.setAudio(N.audio);\r\n\r\n // Keywords\r\n if (N.keywords) G.kwords = N.keywords;\r\n\r\n // Sphere [x,y,z, r]\r\n let spheres = N.spheres;\r\n if (Array.isArray(spheres)){\r\n for (let s in spheres){\r\n let S = spheres[s];\r\n let loc = new THREE.Vector3(parseFloat(S[0]),parseFloat(S[1]),parseFloat(S[2]));\r\n ATON.SemFactory.createSphere(nid, loc, parseFloat(S[3]));\r\n }\r\n }\r\n\r\n let convexshapes = N.convexshapes;\r\n if (Array.isArray(convexshapes)){\r\n for (let s in convexshapes){\r\n let S = convexshapes[s];\r\n\r\n let points = [];\r\n for (let i=0; i{\r\n SceneHub._jsonParsers[key] = parser;\r\n};\r\n\r\n// [C] Sends JSON edit to server node\r\n// previously used: https://tools.ietf.org/html/rfc6902\r\nSceneHub.sendEdit = (patch, mode, onComplete)=>{\r\n if (SceneHub._bLoading || !SceneHub._bEdit) return;\r\n if (patch === undefined) return;\r\n if (mode === undefined) mode = SceneHub.MODE_ADD;\r\n\r\n let sid = SceneHub.currID;\r\n\r\n let O = {};\r\n O.sid = sid;\r\n O.data = patch;\r\n O.mode = (mode === SceneHub.MODE_DEL)? \"DEL\" : \"ADD\";\r\n\r\n let jstr = JSON.stringify(O);\r\n //console.log(jstr);\r\n\r\n patch = null;\r\n O = null;\r\n\r\n $.ajax({\r\n url: ATON.PATH_RESTAPI+\"edit/scene\",\r\n type:\"POST\",\r\n data: jstr,\r\n contentType:\"application/json; charset=utf-8\",\r\n dataType:\"json\",\r\n\r\n // Update local scene JSON\r\n // TODO: improve traffic by applying patch to local json, and NOT by receiving entire JSON \r\n success: (r)=>{\r\n //console.log(r);\r\n if (r) SceneHub.currData = r;\r\n //console.log(ATON.currSceneHub.data);\r\n\r\n if (onComplete) onComplete();\r\n }\r\n });\r\n};\r\n\r\nSceneHub.setTitle = (title)=>{\r\n SceneHub._title = title;\r\n};\r\nSceneHub.getTitle = ()=>{\r\n return SceneHub._title;\r\n}\r\n\r\nSceneHub.setDescription = (descr)=>{\r\n SceneHub._descr = descr;\r\n};\r\nSceneHub.getDescription = ()=>{\r\n return SceneHub._descr;\r\n};\r\n\r\n\r\nexport default SceneHub;","/*\r\n ATON Audio Hub\r\n Centralized Audio/Soundscape\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Audio Hub\r\n@namespace AudioHub\r\n*/\r\nlet AudioHub = {};\r\n\r\n// Realize the hub\r\nAudioHub.init = ()=>{\r\n\r\n AudioHub._listener = new THREE.AudioListener();\r\n AudioHub._loader = new THREE.AudioLoader();\r\n};\r\n\r\nAudioHub.playOnceGlobally = (audioURL)=>{\r\n audioURL = ATON.Utils.resolveCollectionURL(audioURL);\r\n\r\n let au = new THREE.Audio( ATON.AudioHub._listener );\r\n\r\n AudioHub._loader.load( audioURL, (buffer)=>{\r\n au.setBuffer( buffer );\r\n //au.setVolume( 2.0 );\r\n //au.setPlaybackRate(0.9);\r\n au.play();\r\n });\r\n};\r\n\r\n/* TODO:\r\nAudioHub.addToSoundscape = (auid, audioURL, position, radius)=>{\r\n\r\n AudioHub._loader.load( audioURL, (buffer)=>{\r\n A._auTalk.setBuffer( buffer );\r\n A._auTalk.setLoop( false );\r\n //A._auTalk.setVolume( 0.5 );\r\n //A._auTalk.setPlaybackRate(0.9);\r\n A._auTalk.play();\r\n });\r\n};\r\n*/\r\nexport default AudioHub;","/*\r\n ATON Navigation system\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\nconst COSINOIDAL_DIST = function(x){ return (1.0 - Math.cos(x * Math.PI)) / 2.0; };\r\n\r\n/**\r\nATON Navigation system\r\n@namespace Nav\r\n*/\r\nlet Nav = {};\r\n\r\n// Consts\r\nNav.STD_FOV = 50.0;\r\nNav.STD_NEAR = 0.01; //0.05;\r\nNav.STD_FAR = 800.0; // 1000\r\n\r\nNav.FP_EPS = 0.01;\r\nNav.STD_POV_TRANS_DURATION = 2.0;\r\n\r\n// Non-immersive navigation controls\r\nNav.MODE_ORBIT = 0;\r\nNav.MODE_FP = 1;\r\nNav.MODE_DEVORI = 2;\r\n\r\n\r\n//Initialize nav system\r\nNav.init = ()=>{\r\n Nav._mode = undefined;\r\n Nav.POVtransitionDuration = Nav.STD_POV_TRANS_DURATION;\r\n\r\n Nav._rotSpeedOrbit = 0.4;\r\n Nav._rotSpeedFP = -0.2;\r\n Nav._inertia = 0.08; // 0.0 = disabled\r\n\r\n Nav._bControl = true; // user control\r\n\r\n Nav._bInteracting = false;\r\n\r\n // Setup controls\r\n //Nav._camera = new THREE.PerspectiveCamera( Nav.STD_FOV, window.innerWidth / window.innerHeight, Nav.STD_NEAR, Nav.STD_FAR );\r\n //Nav._camera.layers.enableAll();\r\n //Nav._controls = new THREE.OrbitControls( Nav._camera, ATON._renderer.domElement);\r\n\r\n Nav._prevMode = undefined;\r\n Nav.setOrbitControl();\r\n\r\n // POV data\r\n Nav._currPOV = new ATON.POV().setFOV(ATON.Nav.STD_FOV); // holds current viewpoint data (eye, target, etc...)\r\n Nav._fromPOV = new ATON.POV(); // initial POV when requesting a transition\r\n Nav._reqPOV = new ATON.POV(); // requested POV for transition\r\n\r\n Nav.homePOV = undefined; //new ATON.POV();\r\n\r\n Nav._tPOVcall = -1.0;\r\n Nav._tPOVprogress = 0.0;\r\n\r\n Nav.povlist = {}; // This will handle registered POVs\r\n\r\n // World direction and orientation (quat)\r\n // consistent within standard and immersive XR\r\n Nav._vDir = new THREE.Vector3(1,0,0);\r\n Nav._qOri = new THREE.Quaternion();\r\n\r\n // Motion\r\n Nav._motionAmt = 0.0;\r\n Nav._motionDir = new THREE.Vector3(0,1,0);\r\n\r\n // Queried scene location is valid for locomotion\r\n Nav._bValidLocomotion = false;\r\n};\r\n\r\n/**\r\nGet current eye location, consistent within standard and immersive XR sessions.\r\n@returns {THREE.Vector3}\r\n@example\r\nlet p = ATON.Nav.getCurrentEyeLocation();\r\n*/\r\nNav.getCurrentEyeLocation = ()=>{\r\n return Nav._currPOV.pos;\r\n};\r\n\r\n/**\r\nGet current view direction (normalized). Consistent within standard and immersive XR sessions.\r\n@returns {THREE.Vector3}\r\n@example\r\nlet d = ATON.Nav.getCurrentDirection();\r\n*/\r\nNav.getCurrentDirection = ()=>{\r\n return Nav._vDir;\r\n};\r\n\r\n/**\r\nGrab current POV and return a copy.\r\n@returns {POV}\r\n@example\r\nlet pov = ATON.Nav.copyCurrentPOV();\r\n*/\r\nNav.copyCurrentPOV = ()=>{\r\n let pov = new ATON.POV();\r\n pov.pos.copy(Nav._currPOV.pos);\r\n pov.target.copy(Nav._currPOV.target);\r\n pov.fov = Nav._currPOV.fov;\r\n\r\n return pov;\r\n};\r\n\r\nNav.addPOV = (pov, id)=>{\r\n if (pov === undefined) return;\r\n\r\n pov.as(id);\r\n return pov;\r\n};\r\n\r\n/**\r\nReturn true if the navigation system is currently performing a transition\r\n@returns {boolean}\r\n*/\r\nNav.isTransitioning = ()=>{\r\n if (Nav._tPOVcall >= 0.0) return true;\r\n return false;\r\n};\r\n\r\n/**\r\nReturn true if currently queried scene location is valid for locomotion\r\n@returns {boolean}\r\n*/\r\nNav.currentQueryValidForLocomotion = ()=>{\r\n return Nav._bValidLocomotion;\r\n};\r\n\r\n/**\r\nThis is used to validate current queried location for locomotion.\r\nBy default, we exploit surface normal to determine if we can move there or not.\r\nYou can replace this function with your own locomotion validator.\r\n*/\r\nNav.locomotionValidator = ()=>{\r\n if (ATON._queryDataScene === undefined){\r\n Nav._bValidLocomotion = false;\r\n return;\r\n }\r\n\r\n let P = ATON._queryDataScene.p;\r\n let N = ATON._queryDataScene.n;\r\n\r\n if (!N){\r\n Nav._bValidLocomotion = false;\r\n return; \r\n }\r\n\r\n if (N.y <= 0.7){\r\n Nav._bValidLocomotion = false;\r\n return;\r\n }\r\n\r\n Nav._bValidLocomotion = true;\r\n}\r\n\r\n/**\r\nEnable/disable user navigation control\r\n@param {boolean} b - false to lock controls, true to unlock\r\n*/\r\nNav.setUserControl = (b)=>{\r\n if (b === undefined) return;\r\n if (b === Nav._bControl) return;\r\n\r\n Nav._bControl = b;\r\n\r\n if (Nav._controls !== undefined) Nav._controls.enabled = b;\r\n\r\n if (Nav._cOrbit) Nav._cOrbit.enabled = b;\r\n if (Nav._cFirstPerson) Nav._cFirstPerson.enabled = b;\r\n\r\n console.log(\"Nav controls: \"+Nav._bControl);\r\n};\r\n\r\n/**\r\nToggle user control\r\n*/\r\nNav.toggleUserControl = ()=>{\r\n Nav.setUserControl(!Nav._bControl);\r\n};\r\n\r\n/**\r\nReturn true if navigation controls are enabled (i.e. the user can control the camera)\r\n@returns {boolean}\r\n*/\r\nNav.isUserControlEnabled = ()=>{\r\n return Nav._bControl;\r\n};\r\n\r\n/**\r\nReturn true if the navigation system is in Orbit mode\r\n@returns {boolean}\r\n*/\r\nNav.isOrbit = ()=>{ return (Nav._mode === Nav.MODE_ORBIT); };\r\n\r\n/**\r\nReturn true if the navigation system is in First-person mode\r\n@returns {boolean}\r\n*/\r\nNav.isFirstPerson = ()=>{ return (Nav._mode === Nav.MODE_FP); };\r\n\r\n/**\r\nReturn true if the navigation system is in Device-orientation mode\r\n@returns {boolean}\r\n*/\r\nNav.isDevOri = ()=>{ return (Nav._mode === Nav.MODE_DEVORI); };\r\n\r\n/**\r\nSet Navigation mode\r\n@param {number} navmode - navigation mode (0: Orbit, 1: FirstPerson, 2: DeviceOrientation)\r\n*/\r\nNav.setNavMode = (navmode)=>{\r\n if (navmode === undefined) return;\r\n\r\n if (navmode === Nav.MODE_ORBIT) Nav.setOrbitControl();\r\n if (navmode === Nav.MODE_FP) Nav.setFirstPersonControl();\r\n if (navmode === Nav.MODE_DEVORI) Nav.setDeviceOrientationControl();\r\n};\r\n\r\n/**\r\nRestore previously used navigation mode.\r\nIf no previous nav mode is found, defaults to Orbit Control\r\n*/\r\nNav.restorePreviousNavMode = ()=>{\r\n if (Nav._prevMode === undefined) Nav.setOrbitControl();\r\n\r\n Nav.setNavMode(Nav._prevMode);\r\n};\r\n\r\n// Helper routine\r\nNav._updCamera = (c)=>{\r\n if (c === undefined) c = Nav._camera; \r\n\r\n if (ATON.FX.composer){\r\n let PP = ATON.FX.composer.passes;\r\n if (PP){\r\n for (let p=0; p{\r\n if (ATON.XR.isPresenting()) return;\r\n\r\n Nav._prevMode = Nav._mode; // store previous nav mode\r\n\r\n Nav._mode = Nav.MODE_ORBIT;\r\n Nav._bInteracting = false;\r\n\r\n // One-time setup\r\n if (Nav._cOrbit === undefined){\r\n Nav._camOrbit = new THREE.PerspectiveCamera( Nav.STD_FOV, window.innerWidth / window.innerHeight, Nav.STD_NEAR, Nav.STD_FAR );\r\n Nav._camOrbit.layers.enableAll();\r\n\r\n Nav._cOrbit = new THREE.OrbitControls( Nav._camOrbit, ATON._renderer.domElement);\r\n\r\n let C = Nav._cOrbit;\r\n\r\n C.rotateSpeed = Nav._rotSpeedOrbit;\r\n C.enablePan = true;\r\n \r\n if (Nav._inertia > 0.0){\r\n C.enableDamping = true;\r\n C.dampingFactor = Nav._inertia;\r\n }\r\n \r\n C.screenSpacePanning = true;\r\n \r\n C.enableZoom = true;\r\n C.minDistance = 0.03;\r\n C.maxDistance = 100.0;\r\n\r\n if (!Nav._bControl) C.enabled = false;\r\n\r\n //C.addEventListener(\"change\", () => { Nav._bChanged = true; });\r\n C.addEventListener(\"start\",()=>{\r\n Nav._bInteracting = true;\r\n });\r\n C.addEventListener(\"end\",()=>{\r\n Nav._bInteracting = false;\r\n });\r\n\r\n }\r\n\r\n Nav._controls = Nav._cOrbit;\r\n //Nav._controls.target.copy(Nav._camera.position);\r\n Nav._camera = Nav._camOrbit;\r\n\r\n // reparent audio listener\r\n if (ATON.AudioHub._listener && Nav._camera.children.length<1) Nav._camera.add( ATON.AudioHub._listener );\r\n\r\n // Update camera\r\n Nav._updCamera();\r\n \r\n Nav._controls.update();\r\n if (Nav._currPOV) Nav.syncCurrCamera();\r\n\r\n ATON._onResize();\r\n\r\n ATON.toggleCenteredQuery(false);\r\n\r\n ATON.fireEvent(\"NavMode\", Nav._mode);\r\n};\r\n\r\n/**\r\nSet First-Person navigation mode\r\n*/\r\nNav.setFirstPersonControl = ()=>{\r\n if (ATON.XR.isPresenting()) return;\r\n\r\n Nav._prevMode = Nav._mode; // store previous nav mode\r\n\r\n if (ATON.SUI.getSelectorRadius()>0.5) ATON.SUI.setSelectorRadius(0.5); // we (re)set selector radius to 50cm\r\n\r\n Nav._mode = Nav.MODE_FP;\r\n Nav._bInteracting = false;\r\n\r\n // One-time setup\r\n if (Nav._cFirstPerson === undefined){\r\n Nav._camFP = new THREE.PerspectiveCamera( Nav.STD_FOV, window.innerWidth / window.innerHeight, Nav.STD_NEAR, Nav.STD_FAR );\r\n Nav._camFP.layers.enableAll();\r\n\r\n Nav._cFirstPerson = new THREE.OrbitControls( Nav._camFP, ATON._renderer.domElement);\r\n\r\n let C = Nav._cFirstPerson;\r\n\r\n C.enableZoom = false;\r\n C.enablePan = false;\r\n C.rotateSpeed = Nav._rotSpeedFP;\r\n \r\n if (Nav._inertia > 0.0){\r\n C.enableDamping = true;\r\n C.dampingFactor = Nav._inertia;\r\n }\r\n \r\n //C.screenSpacePanning = true;\r\n\r\n C.target.copy(Nav._camera.position);\r\n\r\n C.minDistance = 0.01;\r\n C.maxDistance = 0.01;\r\n\r\n if (!Nav._bControl) C.enabled = false;\r\n }\r\n\r\n Nav._controls = Nav._cFirstPerson;\r\n //Nav._controls.target.copy(Nav._camera.position);\r\n Nav._camera = Nav._camFP;\r\n\r\n // reparent audio listener\r\n if (ATON.AudioHub._listener && Nav._camera.children.length<1) Nav._camera.add( ATON.AudioHub._listener );\r\n \r\n // Update camera\r\n Nav._updCamera();\r\n\r\n Nav._controls.update();\r\n if (Nav._currPOV) Nav.syncCurrCamera();\r\n\r\n ATON._onResize();\r\n\r\n ATON.toggleCenteredQuery(false);\r\n\r\n ATON.fireEvent(\"NavMode\", Nav._mode);\r\n/*\r\n if (Nav._controls) ATON._controls.dispose();\r\n ATON._controls = new THREE.FirstPersonControls( ATON._camera, ATON._renderer.domElement);\r\n ATON._controls.lookSpeed = 0.1;\r\n ATON._controls.movementSpeed = 10;\r\n ATON._controls.noFly = true;\r\n ATON._controls.lookVertical = false;\r\n\r\n //ATON._camera.position.set( 20.0, 5.0, 0 );\r\n ATON._controls.lookAt(0,4,0);\r\n\r\n ATON._controls.update();\r\n console.log(ATON._controls);\r\n*/\r\n};\r\n\r\n/**\r\nSet device-orientation navigation mode\r\n*/\r\nNav.setDeviceOrientationControl = ()=>{\r\n if (!ATON.Utils.isMobile()) return;\r\n\r\n Nav._prevMode = Nav._mode; // store previous nav mode\r\n\r\n Nav._mode = Nav.MODE_DEVORI;\r\n Nav._bInteracting = false;\r\n ATON._screenPointerCoords.set(0.0,0.0);\r\n\r\n // One-time setup\r\n if (Nav._cDevOri === undefined){\r\n Nav._camDevOri = new THREE.PerspectiveCamera( Nav.STD_FOV, window.innerWidth / window.innerHeight, Nav.STD_NEAR, Nav.STD_FAR );\r\n Nav._camDevOri.layers.enableAll();\r\n\r\n Nav._cDevOri = new THREE.DeviceOrientationControls(Nav._camDevOri, ATON._renderer.domElement);\r\n //Nav._cDevOri = new Nav.DeviceOrientationControls(Nav._camDevOri, ATON._renderer.domElement);\r\n\r\n Nav._cDevOri.alphaOffset = 0.0; //The alpha offset in radians\r\n }\r\n\r\n Nav._controls = Nav._cDevOri;\r\n Nav._camera = Nav._camDevOri;\r\n\r\n // reparent audio listener\r\n if (ATON.AudioHub._listener && Nav._camera.children.length<1) Nav._camera.add( ATON.AudioHub._listener );\r\n\r\n // Update camera\r\n Nav._updCamera();\r\n\r\n Nav._controls.update();\r\n if (Nav._currPOV) Nav.syncCurrCamera();\r\n\r\n ATON._onResize();\r\n\r\n ATON.toggleCenteredQuery(true);\r\n \r\n ATON.fireEvent(\"NavMode\", Nav._mode);\r\n};\r\n\r\n/**\r\nSet a motion amount\r\n@param {number} f - the motion amount\r\n@example\r\nATON.Nav.setMotionAmount(0.1);\r\n*/\r\nNav.setMotionAmount = (f)=>{\r\n Nav._motionAmt = f;\r\n};\r\n\r\n/**\r\nSet a motion direction\r\n@param {THREE.Vector3} f - the motion direction\r\n@example\r\nATON.Nav.setMotionDirection( new THREE.Vector(1,0,0) );\r\n*/\r\nNav.setMotionDirection = (v)=>{\r\n Nav._motionDir.copy(v);\r\n}\r\n\r\n/**\r\nStop current motion\r\n*/\r\nNav.stop = ()=>{\r\n Nav._motionAmt = 0.0;\r\n //TODO: stop any transition\r\n};\r\n\r\n/**\r\nSet field-of-view (FoV) in degrees\r\n@param {number} f\r\n@example\r\nATON.Nav.setFOV(30.0);\r\n*/\r\nNav.setFOV = (f)=>{\r\n if (ATON.XR.isPresenting()) return; // skip for immersive sessions\r\n\r\n Nav._currPOV.fov = f;\r\n\r\n let cam = Nav._camera;\r\n cam.fov = f;\r\n cam.updateProjectionMatrix();\r\n};\r\n\r\n/**\r\nGet current field-of-view (FoV) in degrees\r\n@returns {number}\r\n*/\r\nNav.getFOV = ()=>{\r\n return Nav._currPOV.fov;\r\n};\r\n\r\n\r\n// Retrieve currPOV from camera and controls\r\nNav.syncCurrPOV = ()=>{\r\n if (ATON.XR.isPresenting()){\r\n \r\n ATON.XR._cam = ATON._renderer.xr.getCamera(Nav._camera);\r\n //console.log(ATON.XR._cam);\r\n\r\n ATON.XR._cam.getWorldPosition( Nav._currPOV.pos );\r\n ATON.XR._cam.getWorldQuaternion( Nav._qOri );\r\n ATON.XR._cam.getWorldDirection( Nav._vDir );\r\n\r\n\r\n //Nav._currPOV.pos.copy(ATON.XR._cam.position);\r\n //Nav._qOri.copy(ATON.XR._cam.quaternion);\r\n\r\n //console.log(Nav._hmdPos);\r\n\r\n //ATON.XR.hmdPos.copy(Nav._currPOV.pos);\r\n //ATON.XR.hmdDir.copy(Nav._vDir);\r\n \r\n //ATON._renderer.xr.getCamera(Nav._camera);\r\n //ATON._renderer.xr.getCamera(Nav._camera).getWorldDirection(Nav._vDir);\r\n //Nav._camera.getWorldDirection(Nav._vDir);\r\n \r\n //Nav._currPOV.pos.copy(Nav._camera.position);\r\n return;\r\n }\r\n\r\n const ctrl = Nav._controls;\r\n const cam = Nav._camera;\r\n\r\n cam.getWorldDirection(Nav._vDir);\r\n cam.getWorldQuaternion(Nav._qOri);\r\n\r\n if (Nav._mode === Nav.MODE_DEVORI){\r\n Nav._currPOV.pos.copy(cam.position);\r\n return;\r\n }\r\n\r\n if (Nav._mode === Nav.MODE_FP){\r\n Nav._currPOV.pos.copy(ctrl.target);\r\n\r\n Nav._currPOV.target.x = Nav._currPOV.pos.x + Nav._vDir.x; //ctrl.target.x - cam.position.x;\r\n Nav._currPOV.target.y = Nav._currPOV.pos.y + Nav._vDir.y; //ctrl.target.y - cam.position.y;\r\n Nav._currPOV.target.z = Nav._currPOV.pos.z + Nav._vDir.z; //ctrl.target.z - cam.position.z;\r\n return;\r\n }\r\n \r\n Nav._currPOV.pos.copy(cam.position);\r\n Nav._currPOV.target.copy(ctrl.target);\r\n};\r\n\r\n// After syncCurrPOV and before updateCamera, we maniuplate currPOV\r\n//==================================================================================\r\nNav.handlePOV = ()=>{\r\n //console.log(Nav._currPOV.pos);\r\n\r\n if (ATON.XR.isPresenting()) Nav.handleXRtransition();\r\n else Nav.handlePOVtransition();\r\n\r\n //Nav.handleMotion();\r\n\r\n //if (ATON.XR.isPresenting()) console.log(ATON._renderer.xr);\r\n\r\n // Handle constraints\r\n\r\n};\r\n\r\n// Not used for now\r\nNav.handleMotion = ()=>{\r\n if (Nav.isTransitioning()) return;\r\n\r\n if (Nav._motionAmt != 0.0){\r\n\r\n //if ()\r\n\r\n\r\n if (ATON.XR.controller0 && ATON.XR.controller0.visible){\r\n ATON.XR.controller0.getWorldDirection(Nav._motionDir);\r\n Nav._motionDir.negate();\r\n }\r\n else Nav._motionDir.copy(Nav._vDir);\r\n\r\n let fv = Nav._motionDir.clone();\r\n fv.multiplyScalar(Nav._motionAmt * ATON._dt);\r\n\r\n Nav._currPOV.pos.add(fv);\r\n Nav._currPOV.target.add(fv); // check if needed\r\n }\r\n};\r\n\r\nNav.handlePOVtransition = ()=>{\r\n if (Nav._tPOVcall < 0.0) return;\r\n\r\n if (Nav.POVtransitionDuration <= 0.0) Nav._tPOVprogress = 1.0;\r\n else Nav._tPOVprogress = (ATON._clock.elapsedTime - Nav._tPOVcall) / Nav.POVtransitionDuration;\r\n\r\n // End\r\n if (Nav._tPOVprogress >= 1.0){\r\n\r\n Nav._tPOVcall = -1.0;\r\n //Nav._controls.enabled = true;\r\n\r\n Nav._currPOV.pos.copy(Nav._reqPOV.pos);\r\n Nav._currPOV.target.copy(Nav._reqPOV.target);\r\n Nav._currPOV.fov = Nav._reqPOV.fov;\r\n\r\n ATON.fireEvent(\"POVTransitionCompleted\", Nav._reqPOV.id);\r\n return;\r\n }\r\n\r\n Nav._tPOVprogress = COSINOIDAL_DIST(Nav._tPOVprogress);\r\n\r\n Nav._currPOV.pos.lerpVectors(Nav._fromPOV.pos, Nav._reqPOV.pos, Nav._tPOVprogress);\r\n Nav._currPOV.target.lerpVectors(Nav._fromPOV.target, Nav._reqPOV.target, Nav._tPOVprogress);\r\n\r\n if (!Nav._fromPOV.fov || !Nav._reqPOV.fov) return;\r\n Nav._currPOV.fov = THREE.MathUtils.lerp(Nav._fromPOV.fov, Nav._reqPOV.fov, Nav._tPOVprogress);\r\n\r\n //console.log(Nav._camera);\r\n\r\n Nav._camera.fov = Nav._currPOV.fov;\r\n Nav._camera.updateProjectionMatrix();\r\n};\r\n\r\n// Immersive XR transitions\r\nNav.handleXRtransition = ()=>{\r\n if (Nav._tPOVcall < 0.0) return;\r\n\r\n if (Nav.POVtransitionDuration <= 0.0) Nav._tPOVprogress = 1.0;\r\n else Nav._tPOVprogress = (ATON._clock.elapsedTime - Nav._tPOVcall) / Nav.POVtransitionDuration;\r\n\r\n // End\r\n if (Nav._tPOVprogress >= 1.0){\r\n\r\n Nav._tPOVcall = -1.0;\r\n //Nav._controls.enabled = true;\r\n\r\n //ATON.XR.setRefSpaceLocation(Nav._reqXRpos);\r\n ATON.XR._currPos.copy(ATON.XR._reqPos);\r\n\r\n console.log(\"XR height\"+ATON.XR._currPos.y);\r\n console.log(\"HMD height\"+Nav._currPOV.pos.y);\r\n\r\n ATON.fireEvent(\"POVTransitionCompleted\", Nav._reqPOV.id);\r\n return;\r\n }\r\n\r\n ATON.XR._currPos.lerpVectors(ATON.XR._fromPos, ATON.XR._reqPos, Nav._tPOVprogress);\r\n //ATON.XR._currPos.lerpVectors(Nav._fromPOV.pos, Nav._reqPOV.pos, Nav._tPOVprogress);\r\n\r\n};\r\n\r\n// Update internal camera from currPOV \r\nNav.syncCurrCamera = ()=>{\r\n if (ATON.XR.isPresenting()) return;\r\n\r\n let ctrl = Nav._controls;\r\n let cam = Nav._camera;\r\n \r\n let pos = Nav._currPOV.pos;\r\n let tgt = Nav._currPOV.target;\r\n\r\n // We are in VR\r\n/*\r\n if (ATON.XR.isPresenting()){\r\n ///let vrcam = ATON.XR.rig;\r\n ///vrcam.position.copy(pos);\r\n \r\n ///ATON.XR.setRefSpaceLocation(pos);\r\n\r\n //let C = ATON._renderer.xr.getCamera(cam);\r\n //C.getWorldDirection(Nav._vDir);\r\n return;\r\n }\r\n*/\r\n if (Nav._mode === Nav.MODE_DEVORI){\r\n cam.position.copy(pos);\r\n return;\r\n }\r\n\r\n // Common controls\r\n //let d = new THREE.Vector3();\r\n Nav._vDir.subVectors(tgt, pos);\r\n Nav._vDir.normalize();\r\n\r\n if (Nav._mode === Nav.MODE_FP){\r\n ctrl.target.copy(pos);\r\n\r\n cam.position.x = ctrl.target.x - (Nav._vDir.x * Nav.FP_EPS);\r\n cam.position.y = ctrl.target.y - (Nav._vDir.y * Nav.FP_EPS);\r\n cam.position.z = ctrl.target.z - (Nav._vDir.z * Nav.FP_EPS);\r\n }\r\n else {\r\n cam.position.copy(pos);\r\n ctrl.target.copy(tgt);\r\n }\r\n};\r\n\r\n// Main update routine\r\nNav.update = ()=>{\r\n\r\n //Nav._bXR = ATON.XR.isPresenting();\r\n\r\n Nav.syncCurrPOV();\r\n Nav.handlePOV();\r\n Nav.syncCurrCamera();\r\n};\r\n\r\n\r\n/**\r\nRequest transition to viewpoint (POV)\r\n@param {POV} pov - the target POV\r\n@param {number} duration - duration of transition in seconds (optional), otherwise use standard duration\r\n@example\r\nATON.Nav.requestPOV( myTargetPOV );\r\n*/\r\nNav.requestPOV = (pov, duration)=>{\r\n if (ATON._tPOVcall >= 0.0) return; // already requested\r\n if (pov === undefined) return;\r\n\r\n ATON.fireEvent(\"POVTransitionRequested\", pov.id);\r\n\r\n if (duration !== undefined) Nav.POVtransitionDuration = duration;\r\n \r\n //Nav._controls.enabled = false;\r\n\r\n Nav._tPOVcall = ATON._clock.elapsedTime;\r\n \r\n if (ATON.XR.isPresenting()){\r\n Nav._reqPOV.pos.copy(pov.pos? pov.pos : Nav._currPOV.pos);\r\n Nav._fromPOV.pos.copy(Nav._currPOV.pos);\r\n\r\n ATON.XR._reqPos.copy(pov.pos? pov.pos : Nav._currPOV.pos);\r\n ATON.XR._fromPos.copy(ATON.XR._currPos);\r\n }\r\n else {\r\n Nav._reqPOV.pos.copy(pov.pos? pov.pos : Nav._currPOV.pos);\r\n Nav._reqPOV.target.copy( pov.target? pov.target : Nav._currPOV.target);\r\n Nav._reqPOV.fov = pov.fov? pov.fov : Nav._currPOV.fov;\r\n\r\n Nav._fromPOV.pos.copy(Nav._currPOV.pos);\r\n Nav._fromPOV.target.copy(Nav._currPOV.target);\r\n Nav._fromPOV.fov = Nav._currPOV.fov;\r\n }\r\n};\r\n\r\n\r\nNav.requestPOVbyBound = (bs, duration)=>{\r\n if (bs === undefined) return;\r\n\r\n //let T = new THREE.Vector3();\r\n let E = new THREE.Vector3();\r\n\r\n //T.copy(bs.center);\r\n \r\n let r = bs.radius * 3.0;\r\n E.x = bs.center.x - (r * Nav._vDir.x);\r\n E.y = bs.center.y - (r * Nav._vDir.y);\r\n E.z = bs.center.z - (r * Nav._vDir.z);\r\n\r\n let pov = new ATON.POV().setPosition(E).setTarget(bs.center); \r\n Nav.requestPOV(pov, duration);\r\n};\r\n\r\n/**\r\nRequest transition to specific ATON Node\r\n@param {Node} n - the target ATON Node\r\n@param {number} duration - duration of transition in seconds (optional), otherwise use standard duration\r\n@example\r\nATON.Nav.requestPOVbyNode( myNode );\r\n*/\r\nNav.requestPOVbyNode = (n, duration)=>{\r\n if (n === undefined) return;\r\n \r\n let bs = n.getBound();\r\n\r\n Nav.requestPOVbyBound(bs,duration);\r\n};\r\n\r\n// Internal routine to re-target on specific 3D point given optional normal\r\nNav.requestRetarget = (point, normal, duration)=>{\r\n let M = new THREE.Vector3();\r\n if (normal === undefined){\r\n M.lerpVectors(point, Nav._currPOV.pos, 0.8);\r\n }\r\n else {\r\n let d = point.distanceTo(Nav._currPOV.pos);\r\n d *= 0.5;\r\n M.x = point.x + (normal.x * d);\r\n M.y = point.y + (normal.y * d);\r\n M.z = point.z + (normal.z * d);\r\n }\r\n\r\n // Adjust DoF if FX enabled\r\n let dd = point.distanceTo(M);\r\n ATON.FX.setDOFfocus( dd );\r\n\r\n let pov = new ATON.POV().setPosition(M).setTarget(point).setFOV(Nav._currPOV.fov);\r\n Nav.requestPOV(pov, duration);\r\n\r\n console.log(pov);\r\n};\r\n\r\n\r\n/**\r\nCompute a default home, depending on visibile bounding sphere. Typically called after all assets are loaded\r\n@param {THREE.Vector3} dv - the normalized offset direction (optional)\r\n@example\r\nATON.Nav.computeDefaultHome();\r\n*/\r\nNav.computeDefaultHome = (dv)=>{\r\n if (dv === undefined) dv = new THREE.Vector3(1,0.7,1);\r\n\r\n let sceneBS = ATON.getRootScene().getBound();\r\n\r\n let eye = new THREE.Vector3(\r\n sceneBS.center.x + (sceneBS.radius * dv.x * 1.5), \r\n sceneBS.center.y + (sceneBS.radius * dv.y * 1.5), \r\n sceneBS.center.z + (sceneBS.radius * dv.z * 1.5)\r\n );\r\n\r\n Nav.homePOV = new ATON.POV().setPosition(eye).setTarget(sceneBS.center);\r\n};\r\n\r\n/** \r\nSet the home viewpoint (POV)\r\n@param {POV} pov - the home POV\r\n*/\r\nNav.setHomePOV = (pov)=>{\r\n Nav.homePOV = pov;\r\n};\r\n\r\nNav.computeAndRequestDefaultHome = (duration, dv)=>{\r\n Nav.computeDefaultHome(dv);\r\n Nav.requestPOV(Nav.homePOV, duration);\r\n};\r\n\r\n/** \r\nRequest home viewpoint\r\n@param {number} duration - transition duration\r\n*/\r\nNav.requestHome = (duration)=>{\r\n Nav.requestPOV(Nav.homePOV, duration);\r\n};\r\n\r\n/** \r\nSet and request home viewpoint\r\n@param {POV} pov - the home POV\r\n@param {number} duration - transition duration\r\n*/\r\nNav.setAndRequestHomePOV = (pov, duration)=>{\r\n Nav.setHomePOV(pov);\r\n Nav.requestPOV(pov, duration);\r\n};\r\n\r\n\r\n/*\r\nMobile devori (modified for absolute compass - UNSTABLE)\r\nauthor richt / http://richt.me\r\nauthor WestLangley / http://github.com/WestLangley\r\nW3C Device Orientation control (http://w3c.github.io/deviceorientation/spec-source-orientation.html)\r\n*/\r\nNav.DeviceOrientationControls = function ( object ) {\r\n let scope = this;\r\n\r\n this.object = object;\r\n this.object.rotation.reorder( 'YXZ' );\r\n this.enabled = true;\r\n\r\n this.deviceOrientation = {};\r\n this.screenOrientation = 0;\r\n\r\n this.alphaOffset = 0; // radians\r\n this.absolute = false;\r\n this.alphaOffsetDevice = undefined;\r\n this.alphaOffsetScreen = undefined;\r\n\r\n let onDeviceOrientationChangeEvent = function ( event ) {\r\n if(scope.absolute) return;\r\n scope.deviceOrientation = event;\r\n };\r\n\r\n let onDeviceOrientationAbsoluteChangeEvent = function ( event ) {\r\n scope.deviceOrientation = event;\r\n scope.absolute = true;\r\n };\r\n\r\n let onScreenOrientationChangeEvent = function () {\r\n scope.screenOrientation = window.orientation || 0;\r\n };\r\n\r\n // The angles alpha, beta and gamma form a set of intrinsic Tait-Bryan angles of type Z-X'-Y''\r\n let setObjectQuaternion = function () {\r\n let zee = new THREE.Vector3( 0, 0, 1 );\r\n let euler = new THREE.Euler();\r\n\r\n let q0 = new THREE.Quaternion();\r\n let q1 = new THREE.Quaternion( - Math.sqrt( 0.5 ), 0, 0, Math.sqrt( 0.5 ) ); // - PI/2 around the x-axis\r\n\r\n return function ( quaternion, alpha, beta, gamma, orient ) {\r\n euler.set( beta, alpha, - gamma, 'YXZ' ); // 'ZXY' for the device, but 'YXZ' for us\r\n quaternion.setFromEuler( euler ); // orient the device\r\n quaternion.multiply( q1 ); // camera looks out the back of the device, not the top\r\n quaternion.multiply( q0.setFromAxisAngle( zee, - orient ) ); // adjust for screen orientation\r\n };\r\n\r\n }();\r\n\r\n this.connect = function () {\r\n onScreenOrientationChangeEvent(); // run once on load\r\n\r\n window.addEventListener( 'orientationchange', onScreenOrientationChangeEvent, false );\r\n window.addEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false );\r\n window.addEventListener( 'deviceorientationabsolute', onDeviceOrientationAbsoluteChangeEvent, false );\r\n\r\n scope.enabled = true;\r\n };\r\n\r\n this.disconnect = function () {\r\n window.removeEventListener( 'orientationchange', onScreenOrientationChangeEvent, false );\r\n window.removeEventListener( 'deviceorientation', onDeviceOrientationChangeEvent, false );\r\n window.removeEventListener( 'deviceorientationabsolute', onDeviceOrientationAbsoluteChangeEvent, false );\r\n\r\n scope.enabled = false;\r\n };\r\n\r\n this.update = function () {\r\n if ( scope.enabled === false ) return;\r\n\r\n let device;\r\n device = scope.deviceOrientation;\r\n\r\n if ( device ) {\r\n let alpha = this.getDirection() ? THREE.Math.degToRad( this.getDirection() ) + scope.alphaOffset : 0; // Z\r\n let beta = device.beta ? THREE.Math.degToRad( device.beta ) : 0; // X'\r\n\r\n let gamma = device.gamma ? THREE.Math.degToRad( device.gamma ) : 0; // Y''\r\n let orient = scope.screenOrientation ? THREE.Math.degToRad( scope.screenOrientation ) : 0; // O\r\n\r\n setObjectQuaternion( scope.object.quaternion, alpha, beta, gamma, orient );\r\n }\r\n\r\n };\r\n\r\n this.dispose = ()=>{\r\n scope.disconnect();\r\n };\r\n\r\n this.iOSOrientationPermission = ()=>{\r\n if (typeof DeviceOrientationEvent.requestPermission === 'function') {\r\n DeviceOrientationEvent.requestPermission().then(permissionState => {\r\n if (permissionState === 'granted') {\r\n\r\n }\r\n\r\n console.log(permissionState);\r\n }).catch(console.error);\r\n }\r\n }\r\n\r\n this.getDirection = ()=>{\r\n return (typeof scope.deviceOrientation.webkitCompassHeading != \"undefined\") ? scope.deviceOrientation.webkitCompassHeading : scope.deviceOrientation.alpha;\r\n }\r\n\r\n this.getDirectionMap = ()=>{\r\n return (typeof scope.deviceOrientation.webkitCompassHeading != \"undefined\") ? (360 - scope.deviceOrientation.webkitCompassHeading) : scope.deviceOrientation.alpha;\r\n }\r\n\r\n this.connect();\r\n};\r\n\r\n\r\nexport default Nav;","/*\r\n ATON immersive XR module\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Immersive XR\r\n@namespace XR\r\n*/\r\nlet XR = {};\r\n\r\nXR.STD_TELEP_DURATION = 0.03;\r\nXR.HAND_R = 0;\r\nXR.HAND_L = 1;\r\n\r\nXR.MOBILE_DENSITY_F = 0.5;\r\n\r\n\r\n//Initializes XR component\r\nXR.init = ()=>{\r\n ATON._renderer.xr.enabled = true;\r\n ATON._renderer.xr.setReferenceSpaceType( 'local' );\r\n \r\n // WebXR density\r\n if (ATON.device.isMobile) ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd * XR.MOBILE_DENSITY_F);\r\n else ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd);\r\n\r\n XR._bPresenting = false;\r\n XR.currSession = null;\r\n XR._sessionType = \"immersive-vr\";\r\n\r\n XR.rig = new THREE.Group();\r\n //XR.rig.position.set(0,0,0);\r\n XR.rig.add( ATON.Nav._camera );\r\n ATON._rootUI.add(XR.rig);\r\n\r\n //XR.hmdOri = new THREE.Quaternion();\r\n //XR.hmdPos = new THREE.Vector3();\r\n\r\n XR._cam = undefined;\r\n\r\n XR._currPos = XR.rig.position; //new THREE.Vector3();\r\n XR._fromPos = new THREE.Vector3();\r\n XR._reqPos = new THREE.Vector3();\r\n\r\n XR.gControllers = undefined;\r\n\r\n XR.controller0 = undefined;\r\n XR.controller1 = undefined;\r\n\r\n XR.controller0pos = new THREE.Vector3();\r\n XR.controller1pos = new THREE.Vector3();\r\n XR.controller0dir = new THREE.Vector3();\r\n XR.controller1dir = new THREE.Vector3();\r\n\r\n XR._lastPosR = undefined;\r\n XR._lastPosL = undefined;\r\n\r\n XR._pointerLineGeom = undefined;\r\n XR._pointerLineMesh = undefined;\r\n\r\n XR.gpad0 = undefined;\r\n XR.gpad1 = undefined;\r\n\r\n XR._urlHand = ATON.PATH_RES+\"models/hand/hand.glb\";\r\n\r\n // Base ev\r\n ATON.on(\"XRselectStart\", (c)=>{\r\n if (c === XR.HAND_R) ATON._stdActivation(); //XR.defaultSelectHandler(c);\r\n });\r\n ATON.on(\"XRselectEnd\", (c)=>{\r\n //ATON.Nav.stop();\r\n //console.log(\"Sel end \"+c);\r\n });\r\n\r\n ATON.on(\"XRsqueezeStart\", (c)=>{\r\n console.log(\"Squeeze \"+c);\r\n });\r\n\r\n ATON.on(\"VRC_IDassigned\", (uid)=>{\r\n let rh = ATON.getUINode(\"Rhand\");\r\n let lh = ATON.getUINode(\"Lhand\");\r\n\r\n let avMats = ATON.MatHub.materials.avatars;\r\n let am = avMats[uid % avMats.length];\r\n if (lh) lh.setMaterial(am);\r\n if (rh) rh.setMaterial(am);\r\n });\r\n};\r\n\r\n\r\n/**\r\nSet session type\r\n@param {string} type - Can be \"immersive-vr\" or \"immersive-ar\"\r\n*/\r\nXR.setSessionType = (type)=>{\r\n if (type === undefined) return;\r\n if (type !== \"immersive-vr\" && type !== \"immersive-ar\") return;\r\n\r\n XR._sessionType = type;\r\n console.log(\"Session type: \"+type);\r\n};\r\n\r\n/**\r\nReturn true if we are presenting (immersive VR or AR)\r\n@returns {boolean}\r\n*/\r\nXR.isPresenting = ()=>{\r\n return XR._bPresenting;\r\n};\r\n\r\n\r\nXR.teleportOnQueriedPoint = ()=>{\r\n if (!ATON.Nav.currentQueryValidForLocomotion()) return false;\r\n\r\n const P = ATON._queryDataScene.p;\r\n //const N = ATON._queryDataScene.n;\r\n\r\n // FIXME: height offset needed for \"local\", fill this automatically\r\n ATON.Nav.requestPOV( new ATON.POV().setPosition(P.x, P.y + ATON.userHeight, P.z), XR.STD_TELEP_DURATION );\r\n //ATON.Nav.requestPOV( new ATON.POV().setPosition(P.x, P.y, P.z), XR.STD_TELEP_DURATION );\r\n\r\n return true;\r\n};\r\n\r\n/* Deprecated\r\nXR.defaultSelectHandler = (c)=>{\r\n\r\n if (XR._sessionType === \"immersive-vr\") XR.teleportOnQueriedPoint();\r\n\r\n ATON.FE.playAudioFromSemanticNode(ATON._hoveredSemNode);\r\n \r\n //ATON.Nav.setMotionAmount(3.0);\r\n};\r\n\r\nXR._handleUISelection = ()=>{\r\n if (ATON._hoveredUI === undefined) return false;\r\n\r\n let H = ATON.getUINode(ATON._hoveredUI);\r\n if (H && H.onSelect) H.onSelect();\r\n \r\n return true;\r\n}\r\n*/\r\n\r\n// Helper routine to setup a ray-caster\r\nXR.setupQueryRay = (rc)=>{\r\n if (rc === undefined) return;\r\n\r\n // We have at least one 6DOF controller\r\n if (XR.controller0) rc.set( XR.controller0pos, XR.controller0dir );\r\n\r\n // else use HMD-aligned query\r\n else rc.set( ATON.Nav.getCurrentEyeLocation(), ATON.Nav.getCurrentDirection() );\r\n};\r\n\r\n\r\n/**\r\nSet reference-space location (not the actual HMD camera location).\r\nThis can be used to move around the user, given a proper locomotion technique\r\n@param {THREE.Vector3} p - the new location of reference space\r\n*/\r\nXR.setRefSpaceLocation = (p)=>{\r\n XR.rig.position.copy(p);\r\n};\r\n\r\n\r\n// Right\r\nXR._setupControllerR = (C, bAddRep)=>{\r\n if (XR.controller0) return;\r\n\r\n XR.controller0 = C;\r\n console.log(\"R controller\");\r\n\r\n // Main trigger\r\n C.addEventListener( 'selectstart', ()=>{\r\n //if (XR._handleUISelection()) return;\r\n\r\n ATON.fireEvent(\"XRselectStart\", XR.HAND_R);\r\n });\r\n C.addEventListener( 'selectend', ()=>{ \r\n ATON.fireEvent(\"XRselectEnd\", XR.HAND_R);\r\n });\r\n\r\n // Squeeze\r\n C.addEventListener( 'squeezestart', ()=>{\r\n ATON.fireEvent(\"XRsqueezeStart\", XR.HAND_R);\r\n });\r\n C.addEventListener( 'squeezeend', ()=>{\r\n ATON.fireEvent(\"XRsqueezeEnd\", XR.HAND_R);\r\n });\r\n\r\n XR.setupControllerUI(XR.HAND_R, bAddRep);\r\n\r\n ATON.fireEvent(\"XRcontrollerConnected\", XR.HAND_R);\r\n};\r\n\r\n// Left\r\nXR._setupControllerL = (C, bAddRep)=>{\r\n if (XR.controller1) return;\r\n\r\n XR.controller1 = C;\r\n console.log(\"L controller\");\r\n\r\n // Main trigger\r\n C.addEventListener( 'selectstart', ()=>{\r\n //if (XR._handleUISelection()) return;\r\n ATON.fireEvent(\"XRselectStart\", XR.HAND_L);\r\n });\r\n C.addEventListener( 'selectend', ()=>{ \r\n ATON.fireEvent(\"XRselectEnd\", XR.HAND_L);\r\n });\r\n\r\n // Squeeze\r\n C.addEventListener( 'squeezestart', ()=>{\r\n ATON.fireEvent(\"XRsqueezeStart\", XR.HAND_L);\r\n });\r\n C.addEventListener( 'squeezeend', ()=>{\r\n ATON.fireEvent(\"XRsqueezeEnd\", XR.HAND_L);\r\n });\r\n\r\n XR.setupControllerUI(XR.HAND_L, bAddRep);\r\n \r\n ATON.fireEvent(\"XRcontrollerConnected\", XR.HAND_L);\r\n};\r\n\r\n// On XR session started\r\nXR.onSessionStarted = ( session )=>{\r\n if (XR.currSession) return; // Already running\r\n\r\n\tsession.addEventListener( 'end', XR.onSessionEnded );\r\n\r\n console.log(XR._sessionType + \" session started.\");\r\n\r\n //console.log(session);\r\n\r\n // If any streaming is ongoing, terminate it\r\n ATON.MediaRec.stopMediaStreaming();\r\n\r\n // Promised\r\n\tATON._renderer.xr.setSession( session ).then(()=>{\r\n XR.currSession = session;\r\n console.log(XR.currSession);\r\n\r\n // Disable panorama on AR sessions\r\n if (XR._sessionType === \"immersive-ar\"){\r\n ATON._mainRoot.background = null;\r\n if (ATON._mMainPano) ATON._mMainPano.visible = false;\r\n }\r\n\r\n // get xrRefSpace\r\n /*\r\n session.requestReferenceSpace('local').then((refSpace) => {\r\n xrRefSpace = refSpace.getOffsetReferenceSpace(new XRRigidTransform({x: 0, y: 1.5, z: 0}));\r\n });\r\n */\r\n\r\n for (let c = 0; c < 2; c++){\r\n const C = ATON._renderer.xr.getController(c);\r\n\r\n if (C !== undefined && !C.userData.bXRconfig){\r\n //console.log(C);\r\n\r\n C.visible = false;\r\n C.userData.bXRconfig = true;\r\n\r\n C.addEventListener( 'connected', (e) => {\r\n //console.log( e.data.handedness );\r\n let hand = e.data.handedness;\r\n \r\n //console.log(e.data);\r\n console.log(\"Hand \"+hand);\r\n\r\n if (hand === \"left\") XR._setupControllerL(C, true);\r\n else {\r\n if (hand === \"right\") XR._setupControllerR(C, true);\r\n else { // FIXME:\r\n\r\n //XR._setupControllerR(C, false);\r\n \r\n C.addEventListener('selectstart', ()=>{\r\n //if (XR._handleUISelection()) return;\r\n ATON.fireEvent(\"XRselectStart\", XR.HAND_R);\r\n \r\n console.log(\"Head-aligned select\");\r\n });\r\n C.addEventListener('selectend', ()=>{ \r\n ATON.fireEvent(\"XRselectEnd\", XR.HAND_R);\r\n });\r\n\r\n ATON.fireEvent(\"XRcontrollerConnected\", XR.HAND_R);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n /*\r\n let C0 = ATON._renderer.xr.getController(0);\r\n let C1 = ATON._renderer.xr.getController(1);\r\n\r\n console.log(C0);\r\n //ATON.VRoadcast.log(JSON.stringify(C0));\r\n\r\n // Controller 0\r\n if (C0){\r\n C0.visible = false;\r\n\r\n C0.addEventListener( 'connected', (e) => {\r\n\r\n //console.log( e.data.handedness );\r\n\r\n if (e.data.handedness === \"left\") XR._setupControllerL(C0);\r\n else XR._setupControllerR(C0);\r\n\r\n //C0.gamepad = e.data.gamepad;\r\n //console.log(XR.controller0.gamepad);\r\n\r\n //ATON.VRoadcast.log(JSON.stringify(e));\r\n\r\n //let gp = C0.gamepad;\r\n //if (gp.pose && gp.pose.hasPosition) C0.visible = true;\r\n\r\n });\r\n }\r\n\r\n // Controller 1\r\n if (C1){\r\n C1.visible = false;\r\n\r\n C1.addEventListener( 'connected', (e) => {\r\n //console.log( e.data.handedness );\r\n\r\n if (e.data.handedness === \"left\") XR._setupControllerL(C1);\r\n else XR._setupControllerR(C1);\r\n\r\n //C1.gamepad = e.data.gamepad;\r\n \r\n //let gp = C1.gamepad;\r\n //if (gp.pose && gp.pose.hasPosition) C1.visible = true;\r\n\r\n });\r\n }\r\n */\r\n\r\n // reparent current camera to the XR rig\r\n XR.rig.add( ATON.Nav._camera );\r\n\r\n XR.setRefSpaceLocation(ATON.Nav._currPOV.pos);\r\n console.log(ATON.Nav._currPOV.pos);\r\n\r\n XR._bPresenting = true;\r\n console.log(\"XR now presenting\");\r\n\r\n //XR.setupControllersUI();\r\n\r\n ATON.fireEvent(\"XRmode\", true);\r\n\r\n // for immersive sessions we (re)set selector radius to 50cm\r\n if (ATON.SUI.getSelectorRadius()>0.5) ATON.SUI.setSelectorRadius(0.5);\r\n\r\n //console.log(session);\r\n\r\n let C = ATON._renderer.xr.getCamera();\r\n //ATON.Utils.updateTSetsCamera( C );\r\n ATON.Nav._updCamera( C );\r\n\r\n // FIXME: needed bc selector 0.5 radius is not applied\r\n setTimeout( ()=>{\r\n //ATON.Utils.updateTSetsCamera();\r\n if (ATON.SUI.getSelectorRadius()>0.5) ATON.SUI.setSelectorRadius(0.5);\r\n }, 2000);\r\n });\r\n};\r\n\r\n// On XR session terminated\r\nXR.onSessionEnded = ( /*event*/ )=>{\r\n XR.currSession.removeEventListener( 'end', XR.onSessionEnded );\r\n XR.currSession = null;\r\n\r\n XR._bPresenting = false;\r\n //XR.rig.position.set(0.0,0.0,0.0);\r\n XR.setRefSpaceLocation( new THREE.Vector3(0,0,0) );\r\n\r\n ATON.fireEvent(\"XRmode\", false);\r\n\r\n // If any streaming is ongoing, terminate it\r\n ATON.MediaRec.stopMediaStreaming();\r\n\r\n ATON.Nav.requestHome();\r\n\r\n //ATON.Utils.updateTSetsCamera();\r\n ATON.Nav._updCamera();\r\n\r\n console.log(\"Quit XR\");\r\n};\r\n\r\n/**\r\nToggle immersive VR/AR mode\r\n@param {string} sessiontype - Can be \"immersive-vr\" or \"immersive-ar\", if undefined defaults to immersive VR\r\n*/\r\nXR.toggle = (sessiontype)=>{\r\n XR.setSessionType(sessiontype);\r\n\r\n if (!ATON.device.xrSupported[XR._sessionType]) return;\r\n\r\n // Enter XR\r\n if (XR.currSession === null){\r\n let sessionInit = {\r\n optionalFeatures: [\r\n //\"local\",\r\n //\"local-floor\",\r\n ///\"bounded-floor\",\r\n\r\n //\"hand-tracking\",\r\n\r\n //\"high-refresh-rate\",\r\n //\"high-fixed-foveation-level\",\r\n ]\r\n\r\n };\r\n navigator.xr.requestSession( XR._sessionType, sessionInit ).then( XR.onSessionStarted );\r\n //console.log(navigator.xr);\r\n }\r\n // Exit XR\r\n else {\r\n XR.currSession.end();\r\n }\r\n};\r\n\r\nXR.setupControllerUI = (h, bAddRep)=>{\r\n let raytick = 0.003;\r\n let raylen = 1.0;\r\n\r\n let rhand = undefined;\r\n let lhand = undefined;\r\n\r\n //console.log(\"Setup controller \"+h);\r\n\r\n if (XR.gControllers === undefined){\r\n XR.gControllers = ATON.createUINode();\r\n\r\n XR.gControllers.disablePicking();\r\n XR.rig.add(XR.gControllers);\r\n }\r\n\r\n // Left\r\n if (h === XR.HAND_L){\r\n XR.gControllers.add( XR.controller1 );\r\n\r\n if (bAddRep){\r\n lhand = ATON.createUINode(\"Lhand\").load(XR._urlHand).setMaterial(ATON.MatHub.materials.controllerRay).setScale(-1,1,1);\r\n XR.controller1.add(lhand);\r\n }\r\n }\r\n // Right\r\n else {\r\n XR.gControllers.add( XR.controller0 );\r\n\r\n if (bAddRep){\r\n XR._pointerLineGeom = new THREE.CylinderBufferGeometry( raytick,raytick, raylen, 4 );\r\n //XR._pointerLineGeom = new THREE.CylinderGeometry( raytick,raytick, raylen, 4 );\r\n\r\n XR._pointerLineGeom.rotateX( -Math.PI / 2 );\r\n XR._pointerLineGeom.translate(0,0,-(raylen*0.5));\r\n\r\n XR._pointerLineMesh = new THREE.Mesh( XR._pointerLineGeom, ATON.MatHub.materials.controllerRay );\r\n XR.controller0.add( /*mesh.clone()*/ XR._pointerLineMesh );\r\n XR._pointerLineMesh.visible = false;\r\n \r\n rhand = ATON.createUINode(\"Rhand\").load(XR._urlHand).setMaterial(ATON.MatHub.materials.controllerRay);\r\n XR.controller0.add(rhand);\r\n }\r\n }\r\n\r\n // We are connected to VRoadcast\r\n if (ATON.VRoadcast.uid !== undefined && bAddRep){\r\n let avMats = ATON.MatHub.materials.avatars;\r\n let am = avMats[ATON.VRoadcast.uid % avMats.length];\r\n if (h === XR.HAND_L) lhand.setMaterial(am);\r\n else rhand.setMaterial(am);\r\n }\r\n};\r\n\r\n// FIXME:\r\nXR.switchHands = ()=>{\r\n\r\n/*\r\n let C0 = new THREE.Group();\r\n for (let cr in XR.controller0.children){\r\n C0.add(XR.controller0.children[cr]);\r\n }\r\n\r\n let C1 = new THREE.Group();\r\n for (let cl in XR.controller1.children){\r\n C1.add(XR.controller1.children[cl]);\r\n }\r\n\r\n //XR.controller1.removeChildren();\r\n //XR.controller0.removeChildren();\r\n\r\n return;\r\n\r\n for (let c in C1.children){\r\n XR.controller0.add(C1.children[c]);\r\n }\r\n for (let c in C0.children){\r\n XR.controller1.add(C0.children[c]);\r\n }\r\n*/\r\n let H = XR.controller1;\r\n XR.controller1 = XR.controller0;\r\n XR.controller0 = H;\r\n\r\n //XR.controller0 = ATON._renderer.xr.getController(1);\r\n //XR.controller1 = ATON._renderer.xr.getController(0);\r\n\r\n for (let c in XR.controller0.children) XR.controller0.remove(XR.controller0.children[c]);\r\n for (let c in XR.controller1.children) XR.controller1.remove(XR.controller1.children[c]);\r\n XR.gControllers.removeChildren();\r\n\r\n XR.setupControllerUI(XR.HAND_L);\r\n XR.setupControllerUI(XR.HAND_R);\r\n\r\n console.log(\"VR controllers switched\");\r\n};\r\n\r\n\r\n/* DEPRECATED\r\nXR.setupControllersUI = ()=>{\r\n if (XR.gControllers) return; // already set\r\n\r\n let raytick = 0.003;\r\n let raylen = 5.0;\r\n var geometry = new THREE.CylinderBufferGeometry( raytick,raytick, raylen, 4 );\r\n geometry.rotateX( -Math.PI / 2 );\r\n geometry.translate(0,0,-(raylen*0.5));\r\n\r\n var mesh = new THREE.Mesh( geometry, ATON.MatHub.materials.controllerRay );\r\n\r\n XR.controller0.add( mesh.clone() );\r\n //XR.controller1.add( mesh.clone() );\r\n\r\n let vrcMatHands = (uid)=>{\r\n let avMats = ATON.MatHub.materials.avatars;\r\n if (avMats === undefined || uid === undefined) return;\r\n \r\n let am = avMats[uid % avMats.length];\r\n rhand.setMaterial( am );\r\n lhand.setMaterial( am );\r\n };\r\n\r\n // Hands\r\n let handurl = ATON.PATH_RES+\"models/hand/hand.glb\";\r\n let rhand = ATON.createUINode(\"Rhand\").load(handurl).setMaterial(ATON.MatHub.materials.controllerRay);\r\n let lhand = ATON.createUINode(\"Lhand\").load(handurl).setMaterial(ATON.MatHub.materials.controllerRay).setScale(-1,1,1);\r\n XR.controller0.add(rhand);\r\n XR.controller1.add(lhand);\r\n\r\n if (ATON.VRoadcast.uid) vrcMatHands(ATON.VRoadcast.uid);\r\n ATON.on(\"VRC_IDassigned\", vrcMatHands);\r\n\r\n XR.gControllers = ATON.createUINode();\r\n XR.gControllers.add( XR.controller0 );\r\n XR.gControllers.add( XR.controller1 );\r\n\r\n XR.controller0.visible = false;\r\n XR.controller1.visible = false;\r\n\r\n XR.gControllers.disablePicking();\r\n\r\n XR.rig.add(XR.gControllers);\r\n};\r\n*/\r\n\r\n// Not working\r\nXR.getControllerSpace = (i)=>{\r\n if (i === 1) XR.getControllerGrip(1);\r\n else XR.getControllerGrip(0);\r\n};\r\n\r\n/**\r\nGet controller world location\r\n@param {number} i - the controller ID (0 or 1)\r\n@returns {THREE.Vector3}\r\n*/\r\nXR.getControllerWorldLocation = (i)=>{\r\n if (i === 1) return XR.controller1pos;\r\n else return XR.controller0pos;\r\n};\r\n\r\n/**\r\nGet controller world direction\r\n@param {number} i - the controller ID (0 or 1)\r\n@returns {THREE.Vector3}\r\n*/\r\nXR.getControllerWorldDirection = (i)=>{\r\n if (i === 1) return XR.controller1dir;\r\n else return XR.controller0dir;\r\n};\r\n\r\nXR._deltaMotionController = (C)=>{\r\n if (C === XR.HAND_L && XR._lastPosL === undefined) return;\r\n if (C === XR.HAND_R && XR._lastPosR === undefined) return;\r\n\r\n let p = (C === XR.HAND_L)? XR.controller1pos : XR.controller0pos;\r\n let prev = (C === XR.HAND_L)? XR._lastPosL : XR._lastPosR;\r\n\r\n let D = THREE.Vector3(\r\n p.x - prev.x,\r\n p.y - prev.y,\r\n p.z - prev.z\r\n );\r\n\r\n let m = D.lengthSq();\r\n\r\n if (C === XR.HAND_L) XR._lastPosL = p;\r\n else XR._lastPosR = p;\r\n};\r\n\r\nXR.update = ()=>{\r\n\r\n/*\r\n //if (XR._bPresenting) ATON.Utils.updateTSetsCamera();\r\n if (XR._bPresenting){\r\n let C = ATON._renderer.xr.getCamera();\r\n ATON.Utils.updateTSetsCamera( C );\r\n }\r\n*/\r\n // R controller\r\n if (XR.controller0 && XR.controller0.visible){\r\n XR.controller0.getWorldPosition(XR.controller0pos);\r\n XR.controller0.getWorldDirection(XR.controller0dir);\r\n XR.controller0dir.negate();\r\n\r\n //XR._deltaMotionController(XR.HAND_R);\r\n }\r\n // L controller\r\n if (XR.controller1 && XR.controller1.visible){\r\n XR.controller1.getWorldPosition(XR.controller1pos);\r\n XR.controller1.getWorldDirection(XR.controller1dir);\r\n XR.controller1dir.negate(); \r\n\r\n //XR._deltaMotionController(XR.HAND_L);\r\n }\r\n\r\n/*\r\n if (XR.gpad0 && XR.gpad0.buttons){\r\n //if (XR.gpad0.buttons[1] && XR.gpad0.buttons[1].pressed) ATON.fireEvent(\"XRsqueezePressed\", 0);\r\n if (XR.gpad0.buttons[4] && XR.gpad0.buttons[4].pressed) ATON.fireEvent(\"XRbuttonAPressed\");\r\n if (XR.gpad0.buttons[5] && XR.gpad0.buttons[5].pressed) ATON.fireEvent(\"XRbuttonBPressed\");\r\n }\r\n\r\n if (XR.gpad1 && XR.gpad1.buttons){\r\n //if (XR.gpad1.buttons[1] && XR.gpad1.buttons[1].pressed) ATON.fireEvent(\"XRsqueezePressed\", 1);\r\n if (XR.gpad1.buttons[4] && XR.gpad1.buttons[4].pressed) ATON.fireEvent(\"XRbuttonXPressed\");\r\n if (XR.gpad1.buttons[5] && XR.gpad1.buttons[5].pressed) ATON.fireEvent(\"XRbuttonYPressed\");\r\n }\r\n*/\r\n};\r\n\r\n\r\nexport default XR;","/*\r\n ATON spatial UI Button class\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\nimport Node from \"./ATON.node.js\";\r\n\r\n/**\r\nClass representing a SpatialUI Button.\r\nConstructor requires a uiid (UI Node ID)\r\n@class Button\r\n@example \r\nnew ATON.SUI.Button(\"myButton\")\r\n*/\r\nclass Button extends Node {\r\n\r\nconstructor(uiid, ratio=1.0, fsize=1.0){\r\n super(uiid, ATON.NTYPES.UI);\r\n\r\n this.baseColor = ATON.MatHub.colors.black;\r\n this.switchColor = ATON.MatHub.colors.green;\r\n\r\n this.baseOpacity = 0.5;\r\n this.hoverOpacity = 0.8;\r\n\r\n this._bSwitched = false;\r\n\r\n this.container = new ThreeMeshUI.Block({\r\n width: 0.1*ratio,\r\n height: 0.1,\r\n padding: 0.01,\r\n borderRadius: 0.02,\r\n backgroundColor: this.baseColor,\r\n backgroundOpacity: this.baseOpacity,\r\n\r\n fontFamily: ATON.SUI.PATH_FONT_JSON,\r\n fontTexture: ATON.SUI.PATH_FONT_TEX,\r\n\r\n justifyContent: 'center',\r\n alignContent: 'center'\r\n });\r\n this.add(this.container);\r\n\r\n this.uiText = new ThreeMeshUI.Text({ \r\n content: \"\",\r\n fontSize: 0.02*fsize,\r\n fontColor: ATON.MatHub.colors.white\r\n });\r\n //this.uiText.position.set(0,0,-0.01);\r\n this.container.add(this.uiText);\r\n\r\n // Trigger geom\r\n let trw = ATON.SUI.STD_BTN_SIZE * 0.9 * ratio;\r\n let trh = ATON.SUI.STD_BTN_SIZE * 0.9;\r\n this._trigger = new THREE.Mesh(\r\n new THREE.PlaneGeometry( trw, trh, 2 ), \r\n ATON.MatHub.materials.fullyTransparent\r\n );\r\n this._trigger.position.set(0,0,0.002);\r\n\r\n this.add( this._trigger );\r\n\r\n this.onHover = ()=>{\r\n this.container.set({ \r\n backgroundOpacity: this.hoverOpacity\r\n });\r\n };\r\n this.onLeave = ()=>{\r\n this.container.set({ \r\n backgroundOpacity: this.baseOpacity \r\n });\r\n };\r\n\r\n this.enablePicking();\r\n}\r\n\r\n/**\r\nSet base color of the button\r\n@param {THREE.Color} c - the color\r\n*/\r\nsetBaseColor(c){\r\n this.baseColor = c;\r\n if (!this._bSwitched) this.container.set({ backgroundColor: this.baseColor });\r\n return this;\r\n}\r\n\r\n/**\r\nSet button switch color (when activated)\r\n@param {THREE.Color} c - the color\r\n*/\r\nsetSwitchColor(c){\r\n this.switchColor = c;\r\n if (this._bSwitched) this.container.set({ backgroundColor: this.switchColor });\r\n return this;\r\n}\r\n\r\nsetBackgroundOpacity(f){\r\n this.container.set({ backgroundOpacity: f });\r\n this.baseOpacity = f;\r\n return this;\r\n}\r\n\r\n/**\r\nSet button text\r\n@param {string} text\r\n*/\r\nsetText(text){\r\n this.uiText.set({ content: text });\r\n return this;\r\n}\r\n\r\n/**\r\nSwitch the button (ON/OFF)\r\n@param {boolean} b\r\n*/\r\nswitch(b){\r\n this._bSwitched = b;\r\n if (b) this.container.set({ backgroundColor: this.switchColor });\r\n else this.container.set({ backgroundColor: this.baseColor });\r\n \r\n return this;\r\n}\r\n\r\n/**\r\nSet button icon\r\n@param {string} url - the url to the icon (tipically a PNG file)\r\n*/\r\nsetIcon(url, bNoBackground){\r\n ATON.Utils.textureLoader.load(url, (texture) => {\r\n\r\n this._trigger.material = new THREE.MeshStandardMaterial({\r\n map: texture,\r\n transparent: true,\r\n depthWrite: false\r\n });\r\n\r\n if (bNoBackground){\r\n this.setBackgroundOpacity(0.0);\r\n this.hoverOpacity = 0.0;\r\n }\r\n\r\n/*\r\n this.container.set({ \r\n backgroundTexture: texture,\r\n backgroundOpacity: 1.0,\r\n backgroundColor: undefined \r\n });\r\n*/\r\n this.uiText.position.set(0,-0.035,0);\r\n });\r\n\r\n return this;\r\n}\r\n\r\n}\r\n\r\nexport default Button;","/*\r\n ATON spatial UI Label class\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\nimport Node from \"./ATON.node.js\";\r\n\r\n/**\r\nClass representing a SpatialUI Button.\r\nConstructor requires a uiid (UI Node ID)\r\n@class Label\r\n@example \r\nnew ATON.SUI.Button(\"myButton\")\r\n*/\r\nclass Label extends Node {\r\n\r\nconstructor(uiid){\r\n super(uiid, ATON.NTYPES.UI);\r\n\r\n this.baseColor = ATON.MatHub.colors.black;\r\n\r\n this.container = new ThreeMeshUI.Block({\r\n width: 0.2,\r\n height: 0.05,\r\n padding: 0.001,\r\n borderRadius: 0.01,\r\n backgroundColor: this.baseColor,\r\n backgroundOpacity: 0.5,\r\n\r\n fontFamily: ATON.SUI.PATH_FONT_JSON,\r\n fontTexture: ATON.SUI.PATH_FONT_TEX,\r\n\r\n justifyContent: 'center',\r\n alignContent: 'center'\r\n });\r\n this.container.position.z = 0.05;\r\n this.add(this.container);\r\n\r\n this.uiText = new ThreeMeshUI.Text({ \r\n content: \"Label\",\r\n fontSize: 0.03,\r\n fontColor: ATON.MatHub.colors.white\r\n });\r\n this.container.add(this.uiText);\r\n\r\n/*\r\n this._trigger = new THREE.Mesh( \r\n new THREE.PlaneGeometry( ATON.SUI.STD_BTN_SIZE*0.9, ATON.SUI.STD_BTN_SIZE*0.9, 2 ), \r\n ATON.MatHub.materials.fullyTransparent\r\n );\r\n this._trigger.position.set(0,0,0.002);\r\n\r\n this.add( this._trigger );\r\n\r\n this.onHover = ()=>{\r\n this.container.set({ \r\n backgroundOpacity: 0.8\r\n });\r\n };\r\n this.onLeave = ()=>{\r\n this.container.set({ \r\n backgroundOpacity: 0.5 \r\n });\r\n };\r\n\r\n this.enablePicking();\r\n*/\r\n}\r\n\r\n/**\r\nSet base color of the label\r\n@param {THREE.Color} c - the color\r\n*/\r\nsetBaseColor(c){\r\n this.baseColor = c;\r\n this.container.set({ backgroundColor: this.baseColor });\r\n return this;\r\n}\r\n\r\nsetTextColor(c){\r\n this.uiText.set({ fontColor: c });\r\n return this;\r\n}\r\n\r\n/**\r\nSet button text\r\n@param {string} text\r\n*/\r\nsetText(text){\r\n this.uiText.set({ content: text });\r\n return this;\r\n}\r\n\r\n/*\r\nsetAutoOrientation(b){\r\n if (b === true){\r\n let self = this;\r\n\r\n this.onAfterRender = ()=>{\r\n self.quaternion.copy( ATON.Nav._qOri );\r\n console.log(\"x\");\r\n };\r\n }\r\n else this.onAfterRender = undefined;\r\n}\r\n*/\r\n\r\n\r\n}\r\n\r\nexport default Label;","/*\r\n ATON spatial UI\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\nimport Button from \"./ATON.sui.button.js\";\r\nimport Label from \"./ATON.sui.label.js\";\r\n\r\n/**\r\nATON Spatial UI\r\n@namespace SUI\r\n*/\r\nlet SUI = {};\r\n\r\nSUI.STD_BTN_SIZE = 0.1;\r\n\r\nSUI.Button = Button;\r\nSUI.Label = Label;\r\n\r\n\r\n//Initializes Spatial UI module\r\nSUI.init = ()=>{\r\n SUI.mainSelector = ATON.createUINode();\r\n SUI._mSelectorSphere = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.getMaterial(\"selector\") );\r\n SUI._mSelectorSphere.renderOrder = 100;\r\n SUI.mainSelector.add( SUI._mSelectorSphere );\r\n SUI.mainSelector.disablePicking();\r\n\r\n SUI.setSelectorRadius(0.05);\r\n SUI.mainSelector.visible = false;\r\n ATON._rootUI.add(SUI.mainSelector);\r\n\r\n SUI.fpTeleport = ATON.createUINode();\r\n \r\n let gTeleport = new THREE.CylinderBufferGeometry(0.4,0.4, 0.9, 32,1, true);\r\n //let gTeleport = new THREE.CylinderGeometry(0.4,0.4, 0.9, 32,1, true);\r\n\r\n let mTeleport = new THREE.Mesh( gTeleport, ATON.MatHub.getMaterial(\"teleportLoc\") );\r\n mTeleport.renderOrder = 100;\r\n SUI.fpTeleport.add( mTeleport );\r\n SUI.fpTeleport.disablePicking();\r\n SUI.fpTeleport.visible = false;\r\n ATON._rootUI.add(SUI.fpTeleport);\r\n\r\n // Sem-shapes icons\r\n //SUI.enableSemIcons();\r\n\r\n // Main Font\r\n //SUI.PATH_FONT_JSON = ATON.PATH_MODS+\"three-mesh-ui/examples/assets/Roboto-msdf.json\"; // ATON.PATH_RES+\"fonts/custom-msdf.json\"\r\n //SUI.PATH_FONT_TEX = ATON.PATH_MODS+\"three-mesh-ui/examples/assets/Roboto-msdf.png\"; // ATON.PATH_RES+\"fonts/custom.png\"\r\n SUI.PATH_FONT_JSON = ATON.PATH_RES+\"fonts/custom-msdf.json\"\r\n SUI.PATH_FONT_TEX = ATON.PATH_RES+\"fonts/custom.png\"\r\n/*\r\n ThreeMeshUI.FontLibrary.addFont(\"mainFont\", \r\n SUI.PATH_FONT_JSON, \r\n new THREE.TextureLoader().load(SUI.PATH_FONT_TEX)\r\n );\r\n*/\r\n // Measurements\r\n SUI.gMeasures = ATON.createUINode();\r\n SUI._prevMPoint = undefined;\r\n SUI._measLabels = [];\r\n ATON._rootUI.add(SUI.gMeasures);\r\n\r\n // runtime measurement-line indicator\r\n let mLine = new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(),new THREE.Vector3()]);\r\n SUI._measLine = new THREE.Line( mLine, ATON.MatHub.getMaterial(\"measurement\"));\r\n SUI._measLine.visible = false;\r\n ATON._rootUI.add(SUI._measLine);\r\n\r\n // Sem convex-shapes edit points \r\n SUI.gPoints = ATON.createUINode();\r\n ATON._rootUI.add(SUI.gPoints);\r\n\r\n SUI.buildInfoNode();\r\n SUI.bShowInfo = true;\r\n\r\n // InfoNode scale\r\n SUI._labelScale = ATON.Utils.isMobile()? 50.0 : 60.0; //note: inverse. Orginally 1.2 : 1.0;\r\n SUI._labelScaleVR = 2.0;\r\n\r\n ATON.on(\"SemanticNodeHover\", (semid)=>{\r\n SUI.setInfoNodeText(semid);\r\n if (SUI.gSemIcons) SUI.gSemIcons.hide();\r\n });\r\n ATON.on(\"SemanticNodeLeave\", (semid)=>{\r\n if (SUI.gSemIcons) SUI.gSemIcons.show();\r\n });\r\n\r\n //SUI.setSemIconsOpacity(0.5);\r\n\r\n/*\r\n ATON.on(\"UINodeHover\", (uiid)=>{\r\n console.log(\"Hover UI node: \"+uiid);\r\n });\r\n ATON.on(\"UINodeLeave\", (uiid)=>{\r\n console.log(\"Leave UI node: \"+uiid);\r\n });\r\n*/\r\n\r\n SUI._sync = 0;\r\n};\r\n\r\n// note: before adding LPs\r\nSUI.enableLPIcons = ()=>{\r\n SUI.gLPIcons = ATON.createUINode();\r\n SUI.gLPIcons.disablePicking();\r\n ATON._rootUI.add(SUI.gLPIcons);\r\n};\r\n\r\n\r\nSUI.enableSemIcons = ()=>{\r\n SUI.gSemIcons = ATON.createUINode();\r\n SUI.gSemIcons.disablePicking();\r\n ATON._rootUI.add(SUI.gSemIcons);\r\n};\r\n\r\n/**\r\nSet selector radius\r\n@param {number} r - the radius\r\n*/\r\nSUI.setSelectorRadius = (r)=>{\r\n SUI._selectorRad = r;\r\n SUI.mainSelector.scale.set(r,r,r);\r\n //console.log(r);\r\n};\r\n\r\n/**\r\nGet selector current radius\r\n@returns {number}\r\n*/\r\nSUI.getSelectorRadius = ()=>{\r\n //return SUI.mainSelector.scale.x;\r\n return SUI._selectorRad;\r\n};\r\n\r\n/**\r\nSet selector 3D model\r\n@param {string} path - the model path (usually gltf or glb)\r\n@param {boolean} bUseStdMat - (optional) overwrites 3D model materials with standard selector material \r\n*/\r\nSUI.setSelectorModel = (path, bUseStdMat)=>{\r\n if (path === undefined) return;\r\n\r\n SUI.mainSelector.removeChildren();\r\n\r\n SUI.mainSelector.load(path).disablePicking();\r\n if (bUseStdMat) SUI.mainSelector.setMaterial( ATON.MatHub.getMaterial(\"selector\") );\r\n};\r\n\r\n/**\r\nSet selector color\r\n@param {THREE.Color} color - color\r\n@param {number} opacity - (optional) opacity \r\n*/\r\nSUI.setSelectorColor = (color, opacity)=>{\r\n ATON.MatHub.materials.selector.uniforms.color.value = color;\r\n if (opacity !== undefined) ATON.MatHub.materials.selector.uniforms.opacity.value = opacity;\r\n};\r\n\r\n// Sem-shape icons\r\nSUI.addSemIcon = (semid, meshape)=>{\r\n if (SUI.gSemIcons === undefined) return;\r\n\r\n let bb = new THREE.Box3().setFromObject( meshape );\r\n let bs = new THREE.Sphere();\r\n bb.getBoundingSphere(bs);\r\n\r\n // icon sprite\r\n let semicon = new THREE.Sprite( ATON.MatHub.semIcon );\r\n semicon.position.copy(bs.center);\r\n\r\n let ss = 0.035; //bs.radius * 0.3;\r\n semicon.scale.set(ss,ss,1.0);\r\n semicon.name = semid;\r\n\r\n SUI.gSemIcons.add(semicon);\r\n};\r\n\r\nSUI.addLPIcon = (LP)=>{\r\n if (SUI.gLPIcons === undefined) return;\r\n\r\n let rn = LP._near;\r\n let isize = 0.1; //rn * 0.3;\r\n\r\n let lpicon = new THREE.Sprite( ATON.MatHub.lpIcon );\r\n lpicon.position.copy(LP.pos);\r\n lpicon.scale.set(isize,isize,isize);\r\n\r\n let s = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.materials.lp );\r\n s.scale.set(rn,rn,rn);\r\n s.position.copy(LP.pos);\r\n\r\n SUI.gLPIcons.add( lpicon );\r\n SUI.gLPIcons.add( s );\r\n};\r\n\r\nSUI.setSemIconsOpacity = (f)=>{\r\n if (f === undefined) ATON.MatHub.semIcon.opacity = 1.0;\r\n else ATON.MatHub.semIcon.opacity = f;\r\n};\r\n\r\n\r\nSUI.buildInfoNode = ()=>{\r\n SUI.infoNode = ATON.createUINode();\r\n SUI.infoNode.attachToRoot();\r\n\r\n SUI.infoContainer = new ThreeMeshUI.Block({\r\n width: 0.15,\r\n height: 0.05, //0.07,\r\n padding: 0.01,\r\n borderRadius: 0.02,\r\n backgroundColor: ATON.MatHub.colors.black, //darksem,\r\n //backgroundOpacity: 0.2,\r\n\r\n fontFamily: SUI.PATH_FONT_JSON,\r\n fontTexture: SUI.PATH_FONT_TEX,\r\n //fontFamily: \"mainFont\",\r\n //fontTexture: \"mainFont\",\r\n\r\n alignContent: 'center', // could be 'center' or 'left'\r\n justifyContent: 'center', // could be 'center' or 'start'\r\n });\r\n SUI.infoNode.add(SUI.infoContainer);\r\n\r\n SUI.infoNodeText = new ThreeMeshUI.Text({ \r\n content: \"Info\",\r\n fontSize: 0.02,\r\n fontColor: ATON.MatHub.colors.white\r\n });\r\n SUI.infoContainer.add(SUI.infoNodeText);\r\n //SUI.infoNode.scale.set(0.07,0.07,0.07);\r\n\r\n //ThreeMeshUI.update();\r\n};\r\n\r\n/**\r\nGet main UI Info Node\r\n@returns {Node}\r\n*/\r\nSUI.getInfoNode = ()=>{\r\n return SUI.infoNode;\r\n};\r\n\r\n/**\r\nSet text for main info node\r\n@param {string} txt - the text\r\n*/\r\nSUI.setInfoNodeText = (txt)=>{\r\n if (!SUI.bShowInfo) return;\r\n SUI.infoNodeText.set({ content: txt });\r\n \r\n ThreeMeshUI.update(); \r\n};\r\n\r\n/**\r\nCreate a SpatialUI toolbar from a list of SUI buttons\r\nThis can be arranged anywhere in the scene or attached to other UI nodes\r\n@param {array} buttonlist - a list (array) of SUI buttons\r\n@param {THREE.Color} color - (optional) base color for the toolbar\r\n@returns {Node}\r\n*/\r\nSUI.createToolbar = (buttonlist, color)=>{\r\n let T = ATON.createUINode();\r\n\r\n let num = buttonlist.length;\r\n let padding = SUI.STD_BTN_SIZE * 0.3;\r\n let marginf = 1.1;\r\n\r\n let cont = new ThreeMeshUI.Block({\r\n width: (SUI.STD_BTN_SIZE * num * marginf) + padding,\r\n height: SUI.STD_BTN_SIZE + padding,\r\n padding: 0.01,\r\n borderRadius: 0.02,\r\n backgroundColor: color? color : ATON.MatHub.colors.black,\r\n backgroundOpacity: 0.3,\r\n\r\n fontFamily: SUI.PATH_FONT_JSON,\r\n fontTexture: SUI.PATH_FONT_TEX,\r\n\r\n alignContent: 'center', // could be 'center' or 'left'\r\n justifyContent: 'center', // could be 'center' or 'start'\r\n });\r\n //cont.position.set(0,0,0);\r\n\r\n let m = (num*0.5) * SUI.STD_BTN_SIZE * marginf;\r\n m -= (SUI.STD_BTN_SIZE*0.5);\r\n\r\n for (let i=0; i{\r\n if (P === undefined) return undefined;\r\n\r\n let s = 0.01;\r\n let linetick = 0.001;\r\n/*\r\n let M = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.getMaterial(\"measurement\"));\r\n M.position.copy(P);\r\n M.scale.set(s,s,s);\r\n SUI.gMeasures.add(M);\r\n*/\r\n\r\n // First time\r\n if (SUI._prevMPoint === undefined){\r\n SUI._prevMPoint = P;\r\n \r\n let mlArr = SUI._measLine.geometry.attributes.position.array;\r\n mlArr[0] = P.x;\r\n mlArr[1] = P.y;\r\n mlArr[2] = P.z;\r\n //mlArr[3] = P.x;\r\n //mlArr[4] = P.y;\r\n //mlArr[5] = P.z;\r\n\r\n //SUI._measLine.geometry.attributes.position.needsUpdate = true;\r\n\r\n //SUI._measLine.visible = true;\r\n return undefined;\r\n }\r\n\r\n SUI._measLine.visible = false;\r\n\r\n // Second point\r\n let d = SUI._prevMPoint.distanceTo(P);\r\n //console.log(d);\r\n\r\n s *= d;\r\n linetick *= d;\r\n\r\n let A = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.getMaterial(\"measurement\"));\r\n A.position.copy(SUI._prevMPoint);\r\n A.scale.set(s,s,s);\r\n SUI.gMeasures.add(A);\r\n\r\n let B = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.getMaterial(\"measurement\"));\r\n B.position.copy(P);\r\n B.scale.set(s,s,s);\r\n SUI.gMeasures.add(B);\r\n \r\n let scale = d * 2.0; //1.5; //Math.max(d*1.5, 1.0);\r\n\r\n //let gLine = new THREE.CylinderBufferGeometry( linetick,linetick, d, 4 );\r\n let gLine = new THREE.BufferGeometry().setFromPoints([SUI._prevMPoint,P]);\r\n \r\n SUI.gMeasures.add( new THREE.Line( gLine, ATON.MatHub.getMaterial(\"measurement\")) );\r\n\r\n let L = new SUI.Label();\r\n L.setBaseColor(ATON.MatHub.colors.white).setTextColor(ATON.MatHub.colors.black);\r\n\r\n L.setPosition(\r\n (SUI._prevMPoint.x + P.x)*0.5,\r\n (SUI._prevMPoint.y + P.y)*0.5,\r\n (SUI._prevMPoint.z + P.z)*0.5,\r\n );\r\n\r\n L.setScale(scale).setText( ATON.Utils.getHumanReadableDistance(d) ); // setScale(d*2.0)\r\n\r\n SUI.gMeasures.add(L);\r\n\r\n SUI._measLabels.push(L);\r\n\r\n // return obj\r\n let R = {};\r\n R.A = SUI._prevMPoint.clone();\r\n R.B = P.clone();\r\n\r\n SUI._prevMPoint = undefined;\r\n\r\n return R; \r\n};\r\n\r\nSUI.clearMeasurements = ()=>{\r\n SUI.gMeasures.removeChildren();\r\n SUI._measLabels = [];\r\n};\r\n\r\nSUI._updateMeasurements = ()=>{\r\n if (SUI._measLabels.length <= 0) return;\r\n\r\n for (let ml in SUI._measLabels){\r\n SUI._measLabels[ml].orientToCamera();\r\n }\r\n};\r\n\r\n// Main update routine\r\nSUI.update = ()=>{\r\n if (ATON.Nav.isTransitioning() || ATON._bPauseQuery){\r\n SUI.infoNode.visible = false;\r\n return;\r\n }\r\n/*\r\n SUI._sync = (SUI._sync+1) % 10;\r\n if (SUI._sync===0){\r\n ThreeMeshUI.update();\r\n //console.log(\"sync\");\r\n } \r\n*/\r\n ThreeMeshUI.update();\r\n\r\n // Meas-line indicator\r\n if (SUI._prevMPoint){\r\n if (ATON._queryDataScene){\r\n let mlArr = SUI._measLine.geometry.attributes.position.array;\r\n mlArr[3] = ATON._queryDataScene.p.x;\r\n mlArr[4] = ATON._queryDataScene.p.y;\r\n mlArr[5] = ATON._queryDataScene.p.z;\r\n SUI._measLine.geometry.attributes.position.needsUpdate = true;\r\n }\r\n \r\n SUI._measLine.visible = true;\r\n }\r\n else SUI._measLine.visible = false;\r\n\r\n // Selector\r\n if (ATON._queryDataScene && !ATON.Nav._bInteracting){\r\n SUI.mainSelector.visible = true;\r\n SUI.mainSelector.position.copy(ATON._queryDataScene.p);\r\n }\r\n else {\r\n SUI.mainSelector.visible = false;\r\n //SUI.fpTeleport.visible = false;\r\n }\r\n\r\n // SemIcons\r\n if (SUI.gSemIcons){\r\n if (ATON.Nav._bInteracting){\r\n SUI.gSemIcons.hide();\r\n }\r\n else {\r\n if (ATON._hoveredSemNode === undefined) SUI.gSemIcons.show();\r\n }\r\n }\r\n\r\n // Teleport SUI\r\n if ((!ATON.Nav.isOrbit() || ATON.XR._bPresenting) && ATON.Nav.currentQueryValidForLocomotion()){\r\n SUI.fpTeleport.visible = true;\r\n SUI.fpTeleport.position.copy(ATON._queryDataScene.p);\r\n }\r\n else SUI.fpTeleport.visible = false;\r\n\r\n // Pointer-line\r\n if (ATON.XR._pointerLineMesh){\r\n\r\n let d = 0.0;\r\n if (ATON._queryDataScene) d = ATON._queryDataScene.d;\r\n if (ATON._queryDataUI && (d <= 0.0 || ATON._queryDataUI.d0.0){\r\n ATON.XR._pointerLineMesh.visible = true;\r\n ATON.XR._pointerLineMesh.scale.set(1,1,d);\r\n }\r\n else ATON.XR._pointerLineMesh.visible = false;\r\n }\r\n\r\n // Measures\r\n SUI._updateMeasurements();\r\n\r\n // InfoNode (semantics)\r\n if (ATON._queryDataSem){\r\n\r\n // Immersive Session\r\n if (ATON.XR._bPresenting){\r\n if (ATON.XR.controller0){\r\n SUI.infoNode.position.copy(ATON.XR.controller0pos); //.lerpVectors(ATON._queryDataSem.p, ATON.XR.controller0pos, 0.8);\r\n SUI.infoNode.position.x -= (ATON.XR.controller0dir.x * 0.1);\r\n SUI.infoNode.position.y -= (ATON.XR.controller0dir.y * 0.1); // + 0.1;\r\n SUI.infoNode.position.z -= (ATON.XR.controller0dir.z * 0.1);\r\n SUI.infoNode.setScale(SUI._labelScaleVR);\r\n }\r\n else {\r\n SUI.infoNode.position.lerpVectors(ATON._queryDataSem.p, ATON.Nav._currPOV.pos, 0.5);\r\n SUI.infoNode.setScale(ATON._queryDataSem.d * SUI._labelScaleVR);\r\n }\r\n }\r\n // Default session\r\n else {\r\n SUI.infoNode.position.lerpVectors(ATON._queryDataSem.p, ATON.Nav._currPOV.pos, 0.2);\r\n const ls = ATON._queryDataSem.d * (ATON.Nav._currPOV.fov / SUI._labelScale);\r\n SUI.infoNode.setScale(ls);\r\n }\r\n SUI.infoNode.orientToCamera();\r\n\r\n if (SUI.bShowInfo) SUI.infoNode.visible = true;\r\n \r\n if (!ATON.VRoadcast._bStreamFocus) SUI.mainSelector.visible = false;\r\n }\r\n else {\r\n SUI.infoNode.visible = false;\r\n }\r\n\r\n if (SUI.mainSelector.visible && ATON.VRoadcast._bStreamFocus){\r\n let ss = SUI._selectorRad * (1.0 + (Math.cos(ATON._clock.elapsedTime*10.0) * 0.2) );\r\n SUI.mainSelector.scale.set(ss,ss,ss);\r\n }\r\n\r\n};\r\n\r\nexport default SUI;","/*\r\n ATON Avatar Class\r\n used in VRoadcast system\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\nimport Node from \"./ATON.node.js\";\r\n\r\nexport default class Avatar extends Node {\r\n\r\nconstructor(uid){\r\n super(undefined /*uid*/, ATON.NTYPES.UI);\r\n\r\n this.userid = uid;\r\n this.username = undefined; //\"User #\"+uid;\r\n this.message = \"...\";\r\n \r\n //this.bTalking = false;\r\n\r\n //this._auTalk = undefined;\r\n\r\n // Positional audio (talk)\r\n this._auTalk = new THREE.PositionalAudio( ATON.AudioHub._listener );\r\n this._auTalk.setRefDistance(30.0);\r\n this.add(this._auTalk); // move with avatar\r\n\r\n this._bPlayingAudio = false;\r\n this._auChunks = [];\r\n\r\n this._tStateCall = -1.0;\r\n //this._tStateDur = 0.1;\r\n this._tProgress = 0.0;\r\n\r\n // Focal point\r\n this._tFocCall = -1.0;\r\n this._currFocusPos = new THREE.Vector3();\r\n this._tgtFocusPos = undefined;\r\n\r\n this._currState = {};\r\n this._currState.position = new THREE.Vector3();\r\n this._currState.quaternion = new THREE.Quaternion();\r\n\r\n this._tgtState = undefined;\r\n\r\n //console.log(this);\r\n\r\n this.realize();\r\n}\r\n\r\nsetTalkDistance(r){\r\n if (r > 0.0) this._auTalk.setRefDistance(r);\r\n}\r\n\r\ngetAvatarMaterialByUID(uid){\r\n //if (uid === undefined) return 0;\r\n\r\n let avaMats = ATON.MatHub.materials.avatars;\r\n let mi = (uid % avaMats.length); //uid? (uid % avaMats.length) : 0;\r\n \r\n return avaMats[mi];\r\n}\r\n\r\nrealize(){\r\n // build minimal representation\r\n let g = new THREE.SphereGeometry( 0.2, 16, 16 );\r\n\r\n this.usermaterial = this.getAvatarMaterialByUID(this.userid);\r\n\r\n let smesh = new THREE.Mesh( g, this.usermaterial );\r\n\r\n this.usermeshnode = ATON.createUINode();\r\n this.usermeshnode.add(smesh);\r\n this.usermeshnode.setMaterial(this.usermaterial);\r\n\r\n // CHECK / FIXME: this is to avoid cloning of the same mesh when using same representation for all avatars\r\n this.usermeshnode.setCloneOnLoadHit(false);\r\n\r\n // Talk UI\r\n this.userauinode = new THREE.Sprite( ATON.VRoadcast.uspritemats[this.userid % ATON.VRoadcast.uspritemats.length] );\r\n this.userauinode.position.set(0,0,0);\r\n this.userauinode.visible = false;\r\n\r\n // Focus\r\n this.userfpnode = new THREE.Sprite( ATON.VRoadcast.ufocmats[this.userid % ATON.VRoadcast.ufocmats.length] );\r\n this.userfpnode.position.set(0,0,0);\r\n //this.userfpnode.scale.set(10,10,10);\r\n this.userfpnode.visible = false;\r\n\r\n // Build Label\r\n this.userlabelnode = ATON.createUINode();\r\n this.labelcontainer = new ThreeMeshUI.Block({\r\n width: 0.7,\r\n height: 0.25,\r\n padding: 0.03,\r\n borderRadius: 0.05,\r\n //backgroundColor: ATON.VRoadcast.ucolorsdark[this.userid % ATON.VRoadcast.ucolorsdark.length],\r\n backgroundColor: ATON.MatHub.colors.black,\r\n\r\n fontFamily: ATON.PATH_RES+\"fonts/custom-msdf.json\", //ATON.PATH_MODS+'three-mesh-ui/examples/assets/Roboto-msdf.json',\r\n fontTexture: ATON.PATH_RES+\"fonts/custom.png\" //ATON.PATH_MODS+'three-mesh-ui/examples/assets/Roboto-msdf.png',\r\n\r\n //alignContent: 'right', // could be 'center' or 'left'\r\n //justifyContent: 'end', // could be 'center' or 'start'\r\n });\r\n\r\n this.userlabelnode.position.y = 0.4;\r\n this.userlabelnode.add(this.labelcontainer);\r\n\r\n // username text\r\n this.usernametext = new ThreeMeshUI.Text({ \r\n content: \"User #\"+this.userid,\r\n fontSize: 0.09,\r\n //fontColor: ATON.MatHub.colors.white\r\n fontColor: ATON.VRoadcast.ucolors[this.userid % ATON.VRoadcast.ucolors.length]\r\n });\r\n this.usernametext.position.y = 0.0;\r\n\r\n // message text\r\n this.usermessagetext = new ThreeMeshUI.Text({ \r\n content: \"\\nHello World!\",\r\n fontSize: 0.03,\r\n fontColor: ATON.MatHub.colors.white\r\n });\r\n this.usermessagetext.position.y = -0.03;\r\n\r\n this.labelcontainer.add(this.usernametext);\r\n this.labelcontainer.add(this.usermessagetext);\r\n \r\n this.add(this.usermeshnode);\r\n this.add(this.userlabelnode);\r\n this.add(this.userauinode);\r\n\r\n //this.add(this.userfpnode);\r\n \r\n // Focus is centralized for better location accuracy\r\n if (ATON.VRoadcast._focNodes[this.userid] === undefined){\r\n ATON.VRoadcast._focNodes[this.userid] = this.userfpnode;\r\n ATON.VRoadcast.focGroup.add( this.userfpnode );\r\n }\r\n};\r\n\r\n// TODO:\r\ndestroy(){\r\n if (this.usermaterial) this.usermaterial.dispose();\r\n if (this.usermeshnode) this.usermeshnode.dispose();\r\n if (this.userauinode) this.userauinode.dispose();\r\n\r\n if (this.userfpnode) this.userfpnode.dispose();\r\n if (ATON.VRoadcast._focNodes[this.userid]) ATON.VRoadcast._focNodes[this.userid].dispose();\r\n\r\n if (this.userlabelnode) this.userlabelnode.dispose();\r\n if (this.labelcontainer) this.labelcontainer.dispose();\r\n if (this.usernametext) this.usernametext.dispose();\r\n if (this.usermessagetext) this.usermessagetext.dispose();\r\n\r\n this.dispose();\r\n}\r\n\r\n// Loads custom avatar representation (3D model)\r\nloadRepresentation(url){\r\n let A = this;\r\n\r\n if (A.usermeshnode.children[0] !== undefined){\r\n A.usermeshnode.remove(A.usermeshnode.children[0]);\r\n }\r\n\r\n A.usermeshnode.load(url); //.setMaterial(A.usermaterial);\r\n\r\n return this;\r\n}\r\n\r\nsetUsername(username){\r\n this.username = username;\r\n\r\n this.usernametext.set({ \r\n content: username\r\n });\r\n\r\n return this;\r\n}\r\n\r\ngetUsername(){\r\n if (this.userid === undefined) return undefined;\r\n if (this.username === undefined) return \"User #\"+this.userid;\r\n return this.username;\r\n}\r\n\r\nsetMessage(msg){\r\n this.message = msg;\r\n\r\n // TODO: check for text length\r\n this.usermessagetext.set({ \r\n content: \"\\n\"+msg\r\n });\r\n\r\n return this;\r\n}\r\n\r\nsetTalkVolume(vol){\r\n if (vol === undefined){\r\n this.userauinode.visible = false;\r\n return;\r\n }\r\n if (vol > 0){\r\n this.userauinode.visible = true;\r\n let v = 0.1 + (vol * 0.03);\r\n this.userauinode.scale.set(v,v,v);\r\n }\r\n else this.userauinode.visible = false;\r\n}\r\n\r\nhideFocalPoint(){\r\n this.userfpnode.visible = false;\r\n}\r\n\r\nrequestFocus(fp){\r\n if (this._tFocCall >= 0.0) return; // already requested\r\n\r\n this._tFocCall = ATON._clock.elapsedTime;\r\n\r\n this._currFocusPos.copy(this.userfpnode.position);\r\n\r\n this._tgtFocusPos = new THREE.Vector3( parseFloat(fp[0]), parseFloat(fp[1]), parseFloat(fp[2]));\r\n this._tgtFocusRad = parseFloat(fp[3])*2.0;\r\n\r\n this.userfpnode.scale.set(this._tgtFocusRad,this._tgtFocusRad,this._tgtFocusRad);\r\n\r\n this.userfpnode.visible = true;\r\n}\r\n\r\nhandleFocusTransition(){\r\n if (this._tFocCall < 0.0) return;\r\n\r\n let D = ATON.VRoadcast.USER_STATE_FREQ; //this._tStateDur;\r\n\r\n let t = (ATON._clock.elapsedTime - this._tFocCall) / D;\r\n\r\n // End\r\n if (t >= 1.0){\r\n this._tFocCall = -1.0;\r\n\r\n this.userfpnode.position.copy(this._tgtFocusPos);\r\n this.userfpnode.scale.set(this._tgtFocusRad,this._tgtFocusRad,this._tgtFocusRad);\r\n \r\n this.userfpnode.visible = true;\r\n\r\n //console.log(this.userfpnode.position);\r\n\r\n return;\r\n }\r\n\r\n this.userfpnode.position.lerpVectors(this._currFocusPos, this._tgtFocusPos, t);\r\n\r\n //let s = this._tgtFocusRad;\r\n //this.userfpnode.scale.set(s,s,s);\r\n this.userfpnode.visible = true;\r\n\r\n //console.log(this.userfpnode.position);\r\n}\r\n\r\nrequestStateTransition(S){\r\n if (this._tStateCall >= 0.0) return; // already requested\r\n\r\n this._tStateCall = ATON._clock.elapsedTime;\r\n\r\n this._currState.position.copy(this.position);\r\n this._currState.quaternion.copy(this.quaternion);\r\n\r\n this._tgtState = S;\r\n \r\n //this._sDistance = this.position.distanceTo(S.position);\r\n}\r\n\r\nhandleStateTransition(){\r\n if (this._tStateCall < 0.0) return;\r\n\r\n let D = ATON.VRoadcast.USER_STATE_FREQ; //this._tStateDur;\r\n\r\n if (D <= 0.0) this._tProgress = 1.0;\r\n else this._tProgress = (ATON._clock.elapsedTime - this._tStateCall) / D;\r\n\r\n let cs = this._currState;\r\n let ts = this._tgtState;\r\n\r\n // End\r\n if (this._tProgress >= 1.0){\r\n this._tStateCall = -1.0;\r\n\r\n this.position.copy(ts.position);\r\n //this.quaternion.copy(ts.quaternion);\r\n this.usermeshnode.quaternion.copy(ts.quaternion);\r\n\r\n return;\r\n }\r\n\r\n this.position.lerpVectors(cs.position, ts.position, this._tProgress);\r\n this.usermeshnode.quaternion.slerp(ts.quaternion, this._tProgress);\r\n //THREE.Quaternion.slerp( cs.quaternion, ts.quaternion, this.usermeshnode.quaternion, this._tProgress);\r\n}\r\n\r\nupdate(){\r\n this.handleStateTransition();\r\n if (this.userfpnode.visible){\r\n this.handleFocusTransition();\r\n\r\n let s = this.userfpnode.scale.x;\r\n if (s>0.001) this.userfpnode.scale.set(s*0.99,s*0.99,s*0.99);\r\n else this.userfpnode.visible = false;\r\n }\r\n\r\n let cam = ATON.Nav._camera;\r\n let eye = ATON.Nav._currPOV.pos;\r\n if (cam === undefined || eye === undefined) return;\r\n\r\n //this.userlabelnode.lookAt( eye );\r\n\r\n //this.userlabelnode.setRotationFromMatrix(cam.matrix); // quaternion.setFromRotationMatrix( cam.matrix );\r\n //this.userlabelnode.rotation.copy(cam.rotation);\r\n\r\n this.userlabelnode.orientToCamera(); //quaternion.copy( ATON.Nav._qOri );\r\n\r\n // Talk UI\r\n //this._handleTalk();\r\n\r\n let avol = this.userauinode.scale.x;\r\n avol *= 0.99; // shrinking rate\r\n\r\n if (avol > 0.01) this.userauinode.scale.set(avol, avol, avol);\r\n else this.userauinode.visible = false;\r\n\r\n/*\r\n this.userlabelnode.rotation.y = Math.atan2(\r\n ( cam.position.x - this.userlabelnode.position.x ),\r\n ( cam.position.z - this.userlabelnode.position.z )\r\n );\r\n*/\r\n //this.userlabelnode.matrix.copy( cam.matrix );\r\n}\r\n\r\n_handleTalk(){\r\n if (this._bPlayingAudio) return;\r\n if (this._auChunks.length < 1) return;\r\n\r\n let d = this._auChunks.shift();\r\n\r\n let au = new Audio();\r\n au.src = d.data;\r\n\r\n au.play();\r\n this._bPlayingAudio = true;\r\n\r\n au.onended = ()=>{\r\n this._bPlayingAudio = false;\r\n //console.log(\"finished playing chunk\");\r\n };\r\n\r\n //this.setTalkVolume(d.volume);\r\n this.setTalkVolume(5.0);\r\n}\r\n\r\n\r\n};","/*\r\n ATON VRoadcast\r\n real-time collaborative networking\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\nimport Avatar from \"./ATON.avatar.js\";\r\n\r\n/**\r\nATON VRoadcast component\r\n@namespace VRoadcast\r\n*/\r\nlet VRoadcast = {};\r\n\r\nVRoadcast.USER_STATE_FREQ = 0.25; // sec\r\nVRoadcast.REPLICATED_EVT = \"EREP\";\r\n\r\n// Thresholds state sending\r\nVRoadcast.THRES_STATE_POS = 0.01;\r\nVRoadcast.THRES_STATE_ORI = 0.08; // radians\r\n\r\nVRoadcast.Avatar = Avatar;\r\n\r\n\r\n/**\r\nInitialize the component\r\n*/\r\nVRoadcast.init = ()=>{\r\n VRoadcast.address = window.location.origin;\r\n\r\n VRoadcast.initMaterials();\r\n\r\n VRoadcast.socket = undefined;\r\n VRoadcast._connected = false;\r\n\r\n VRoadcast._username = undefined;\r\n\r\n VRoadcast.uid = undefined; // my userID (0,1,....)\r\n VRoadcast._bStreamFocus = false; // stream focal point\r\n \r\n VRoadcast._numUsers = 1;\r\n\r\n VRoadcast.avatarList = [];\r\n\r\n VRoadcast.avaGroup = ATON.createUINode(\"avatars\"); // holds all avatars representations\r\n VRoadcast.avaGroup.attachToRoot();\r\n\r\n VRoadcast.focGroup = ATON.createUINode(\"focus\"); // holds all avatars focal points\r\n VRoadcast.focGroup.attachTo(VRoadcast.avaGroup);\r\n VRoadcast._focNodes = [];\r\n\r\n // send own state with given freq\r\n VRoadcast.bSendState = true;\r\n window.setInterval( VRoadcast.sendState, VRoadcast.USER_STATE_FREQ*1000.0 );\r\n VRoadcast._lastStateSent = undefined;\r\n\r\n VRoadcast._bShowAvaG = true;\r\n\r\n console.log(\"VRoadcast initialized\");\r\n VRoadcast.enableChatLog();\r\n};\r\n\r\nVRoadcast.enableChatLog = ()=>{\r\n VRoadcast._elChat = $(\"
    \").text(\"\");\r\n};\r\n\r\nVRoadcast.getNumUsers = ()=>{\r\n return VRoadcast._numUsers;\r\n};\r\n\r\n// Register materials (avatars/users)\r\nVRoadcast.initMaterials = ()=>{\r\n\r\n VRoadcast.ucolors = [];\r\n VRoadcast.ucolors.push( new THREE.Color(1,0,0) );\r\n VRoadcast.ucolors.push( new THREE.Color(1,1,0) );\r\n VRoadcast.ucolors.push( new THREE.Color(0,1,0) );\r\n VRoadcast.ucolors.push( new THREE.Color(0,1,1) );\r\n VRoadcast.ucolors.push( new THREE.Color(0,0,1) );\r\n VRoadcast.ucolors.push( new THREE.Color(1,0,1) );\r\n\r\n VRoadcast.ucolorsdark = [];\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.2,0.0,0.0) );\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.2,0.2,0.0) );\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.0,0.2,0.0) );\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.0,0.2,0.2) );\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.0,0.0,0.2) );\r\n VRoadcast.ucolorsdark.push( new THREE.Color(0.2,0.0,0.2) );\r\n\r\n VRoadcast.ucolorhex = [];\r\n VRoadcast.ucolorhex.push(\"#F00\");\r\n VRoadcast.ucolorhex.push(\"#FF0\");\r\n VRoadcast.ucolorhex.push(\"#0F0\");\r\n VRoadcast.ucolorhex.push(\"#0FF\");\r\n VRoadcast.ucolorhex.push(\"#00F\");\r\n VRoadcast.ucolorhex.push(\"#F0F\");\r\n\r\n let MM = ATON.MatHub.materials;\r\n MM.avatars = [];\r\n\r\n let mat = ATON.MatHub.materials.defUI.clone();\r\n mat.uniforms.color.value = VRoadcast.ucolors[0];\r\n/*\r\n let mat = new THREE.MeshBasicMaterial({\r\n color: VRoadcast.ucolors[0], \r\n transparent: true, \r\n opacity: 0.4, \r\n depthWrite: false,\r\n flatShading: true\r\n });\r\n*/\r\n MM.avatars.push(mat);\r\n\r\n for (let c=1; c{\r\n if (!VRoadcast._connected) return;\r\n let sock = VRoadcast.socket;\r\n\r\n if (sock) sock.emit(VRoadcast.REPLICATED_EVT, {e: evtname, d: data});\r\n //else ATON.on(\"VRC_Connected\", ()=>{ sock.on(evtname, onReceive); });\r\n};\r\n\r\n/**\r\nSubscribe to a given network event, through given handler\r\n@param {string} evtname - the event name\r\n@param {function} handler - network event handler (how we handle incoming event)\r\n\r\n@example\r\nATON.VRoadcast.on(\"test\", function(data){ console.log(\"Received: \"+data); });\r\n*/\r\nVRoadcast.on = (evtname, handler)=>{\r\n if (handler === undefined) return;\r\n\r\n let evhNetwork = ATON.EventHub.evNetwork;\r\n\r\n if (evhNetwork[evtname] === undefined) evhNetwork[evtname] = []; // First time (event not registered)\r\n evhNetwork[evtname].push(handler);\r\n};\r\n\r\n/**\r\nReturn true if VRoadcast is connected to the service\r\n@returns {boolean}\r\n*/\r\nVRoadcast.isConnected = ()=>{\r\n if (VRoadcast.socket === undefined) return false;\r\n return VRoadcast._connected;\r\n};\r\n\r\n/**\r\nReturn true if we have a VRoadcast ID assigned\r\n@returns {boolean}\r\n*/\r\nVRoadcast.hasID = ()=>{\r\n if (VRoadcast.uid === undefined) return false;\r\n return true;\r\n};\r\n\r\n/**\r\nUtility for server-side logging\r\n@param {string} d - string data to be logged\r\n*/\r\nVRoadcast.log = (d)=>{\r\n if (!VRoadcast._connected) return;\r\n let sock = VRoadcast.socket;\r\n\r\n if (sock) sock.emit(\"LOG\", d);\r\n};\r\n\r\n/**\r\nRequest to join a given VRoadcast session (typically, the scene ID)\r\n@param {string} ssid - the session id (room or scene ID)\r\n@example\r\nATON.VRoadcast.joinSession(\"testscene\");\r\n*/\r\nVRoadcast.joinSession = (ssid)=>{\r\n if (!VRoadcast.socket) return;\r\n if (ssid === undefined) ssid = ATON.SceneHub.currID;\r\n\r\n if (ssid === undefined){\r\n console.log(\"VRC ERROR: current session ID is undefined\");\r\n return;\r\n }\r\n\r\n console.log(\"Joining VRC session \"+ssid+\"...\");\r\n VRoadcast.socket.emit(\"SENTER\", ssid );\r\n};\r\n\r\nVRoadcast.requestSceneState = ()=>{\r\n if (!VRoadcast.socket) return;\r\n\r\n VRoadcast.socket.emit(\"SSTATE\");\r\n};\r\n\r\nVRoadcast.setAvatarsVisibility = (b)=>{\r\n VRoadcast._bShowAvaG = b;\r\n\r\n if (b) VRoadcast.avaGroup.show();\r\n else VRoadcast.avaGroup.hide();\r\n};\r\n\r\n/**\r\nConnect to VRoadcast service\r\n@param {string} address - the address of the service (optional). Default is same server where main service is running\r\n@example\r\nATON.VRoadcast.connect();\r\n*/\r\nVRoadcast.connect = (address)=>{\r\n if (VRoadcast._connected) return;\r\n if (address) VRoadcast.address = address;\r\n\r\n let opts = {};\r\n\r\n // Secure connection\r\n if (window.location.protocol === \"https:\"){\r\n opts.path = '/svrc/socket.io';\r\n opts.secure = true;\r\n opts.rejectUnauthorized = false;\r\n //opts.transports = ['websocket']; \r\n //opts.upgrade = false \r\n }\r\n else {\r\n opts.path = '/vrc/socket.io';\r\n //opts.transports = ['websocket'];\r\n //opts.upgrade = false;\r\n }\r\n\r\n VRoadcast.socket = io.connect(VRoadcast.address, opts); //, { 'force new connection': true });\r\n\r\n if (VRoadcast.socket === undefined) return;\r\n VRoadcast._connected = VRoadcast.socket.connected;\r\n\r\n VRoadcast._registerSocketHandlers();\r\n};\r\n\r\nVRoadcast.disconnect = ()=>{\r\n if (VRoadcast.socket === undefined) return;\r\n\r\n VRoadcast._numUsers = 1;\r\n\r\n VRoadcast.socket.disconnect();\r\n VRoadcast._connected = false;\r\n};\r\n\r\n\r\nVRoadcast._onConnected = ()=>{\r\n //\r\n};\r\n\r\nVRoadcast.setUsername = (username)=>{\r\n VRoadcast._username = username;\r\n if (VRoadcast.socket === undefined) return;\r\n if (VRoadcast.uid === undefined) return;\r\n\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"Your username is now: \"+username+\"
    \");\r\n VRoadcast.socket.emit(\"UNAME\", username);\r\n};\r\nVRoadcast.setMessage = (msg)=>{\r\n VRoadcast._msg = msg;\r\n if (VRoadcast.socket === undefined) return;\r\n if (VRoadcast.uid === undefined) return;\r\n\r\n if (VRoadcast._elChat){\r\n VRoadcast._elChat.append(\"YOU: \"+msg+\"
    \");\r\n VRoadcast._elChat.scrollTop(VRoadcast._elChat.scrollHeight);\r\n }\r\n\r\n VRoadcast.socket.emit(\"UMSG\", msg);\r\n};\r\n\r\n\r\n// Handle incoming server msgs\r\nVRoadcast._registerSocketHandlers = ()=>{\r\n\r\n // We connected to server\r\n VRoadcast.socket.on('connect', ()=>{\r\n VRoadcast._connected = true;\r\n\r\n // If we have a valid Scene ID join corresponding session\r\n if (ATON.SceneHub.currID !== undefined){\r\n VRoadcast.joinSession();\r\n }\r\n \r\n console.log(\"Connected to VRC service!\");\r\n ATON.fireEvent(\"VRC_Connected\");\r\n\r\n VRoadcast._onConnected();\r\n });\r\n\r\n VRoadcast.socket.on('disconnect', ()=>{\r\n VRoadcast._connected = false;\r\n VRoadcast.uid = undefined;\r\n\r\n VRoadcast.avaGroup.hide();\r\n\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"YOU disconnected from VRoadcast service
    \");\r\n\r\n console.log(\"VRC disconnected!\");\r\n ATON.fireEvent(\"VRC_Disconnected\");\r\n });\r\n\r\n // Incoming replicated event\r\n VRoadcast.socket.on(VRoadcast.REPLICATED_EVT, (data)=>{\r\n let evtname = data.e;\r\n let d = data.d;\r\n\r\n let ehList = ATON.EventHub.evNetwork[evtname];\r\n ATON.EventHub.executeHandlers(ehList, d);\r\n });\r\n\r\n VRoadcast.socket.on('ID', (data)=>{\r\n console.log(\"Your ID is \" + data);\r\n VRoadcast.uid = data;\r\n\r\n if (VRoadcast._bShowAvaG) VRoadcast.avaGroup.show();\r\n\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"Your ID is #\"+data+\"
    \");\r\n\r\n // Request scene state\r\n VRoadcast.requestSceneState();\r\n\r\n ATON.fireEvent(\"VRC_IDassigned\", data);\r\n });\r\n\r\n VRoadcast.socket.on('SSTATE', (data)=>{\r\n VRoadcast._numUsers = data.numUsers;\r\n console.log(\"Num. users: \"+VRoadcast._numUsers);\r\n\r\n ATON.fireEvent(\"VRC_SceneState\", data);\r\n });\r\n\r\n VRoadcast.socket.on('UENTER', (data)=>{\r\n let uid = data;\r\n //if (uid === VRoadcast.uid) return; // myself\r\n\r\n console.log(\"User #\" +uid+\" entered the scene\");\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"User #\"+uid+\" entered the scene
    \");\r\n\r\n VRoadcast.touchAvatar(uid);\r\n \r\n //VRoadcast._numUsers++;\r\n VRoadcast.requestSceneState();\r\n ATON.fireEvent(\"VRC_UserEnter\", uid);\r\n });\r\n\r\n VRoadcast.socket.on('ULEAVE', (data)=>{\r\n let uid = data;\r\n if (uid === undefined) return;\r\n \r\n let A = VRoadcast.avatarList[uid];\r\n if (A) A.hide();\r\n //VRoadcast.destroyAvatar(uid);\r\n\r\n // TODO: hide also focus\r\n\r\n console.log(\"User #\" +uid+\" left the scene\");\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"User #\"+uid+\" left the scene
    \");\r\n\r\n //if (VRoadcast._numUsers>1) VRoadcast._numUsers--;\r\n VRoadcast.requestSceneState();\r\n ATON.fireEvent(\"VRC_UserLeave\", uid);\r\n });\r\n\r\n VRoadcast.socket.on('USTATE', (data)=>{\r\n if (!VRoadcast._bShowAvaG) return;\r\n\r\n let S = VRoadcast.decodeState(data);\r\n\r\n //console.log(data);\r\n\r\n let uid = S.userid;\r\n let A = VRoadcast.touchAvatar(uid);\r\n\r\n //A.position.copy(S.position);\r\n //A.quaternion.copy(S.quaternion);\r\n \r\n A.requestStateTransition(S);\r\n //A.hideFocalPoint();\r\n });\r\n\r\n VRoadcast.socket.on('UFOCUS', (data)=>{\r\n let uid = data.uid;\r\n let fp = data.fp;\r\n\r\n let A = VRoadcast.touchAvatar(uid);\r\n\r\n A.requestFocus(fp);\r\n });\r\n\r\n VRoadcast.socket.on('UNAME', (data)=>{\r\n let uid = data.uid;\r\n let uname = data.name;\r\n\r\n if (uid === undefined) return;\r\n\r\n let A = VRoadcast.touchAvatar(uid);\r\n A.setUsername(uname);\r\n\r\n console.log(\"User #\" +uid+\" changed username to: \"+uname);\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"User #\"+uid+\" changed username to: \"+uname+\"
    \");\r\n });\r\n\r\n VRoadcast.socket.on('UMSG', (data)=>{\r\n let uid = data.uid;\r\n let msg = data.msg;\r\n\r\n if (uid === undefined) return;\r\n\r\n let A = VRoadcast.touchAvatar(uid);\r\n A.setMessage(msg);\r\n\r\n console.log(\"User #\" +uid+\": \"+msg);\r\n if (VRoadcast._elChat) VRoadcast._elChat.append(\"\"+A.getUsername()+\": \"+msg+\"
    \");\r\n });\r\n\r\n VRoadcast.socket.on('UTALK', (data)=>{\r\n let uid = data.uid;\r\n if (uid === undefined) return;\r\n\r\n let audioURL = data.audio;\r\n let A = VRoadcast.touchAvatar(uid);\r\n\r\n //A.setTalkVolume(data.vol);\r\n A.setTalkVolume(5.0);\r\n\r\n/*\r\n if (A._auTalk === undefined || A._auTalk === null){\r\n A._auTalk = new THREE.PositionalAudio( ATON.AudioHub._listener );\r\n A._auTalk.setRefDistance(50.0);\r\n A.add(A._auTalk);\r\n }\r\n else A._auTalk.stop();\r\n*/\r\n if (A._auTalk.isPlaying) A._auTalk.stop();\r\n\r\n ATON.AudioHub._loader.load( audioURL, (buffer)=>{\r\n A._auTalk.setBuffer( buffer );\r\n A._auTalk.setLoop( false );\r\n //A._auTalk.setVolume( 0.5 );\r\n //A._auTalk.setPlaybackRate(0.9);\r\n A._auTalk.play();\r\n });\r\n\r\n audioURL = null;\r\n \r\n/*\r\n //let newblob = new File([data.blob], \"blob\"+ATON.MediaRec.auExt, { type: ATON.MediaRec.auType });\r\n //let audioURL = window.URL.createObjectURL(newblob);\r\n \r\n if (A._auTalk === undefined){\r\n A._auTalk = new Audio();\r\n //A._auTalk.type = ATON.MediaRec.auType;\r\n }\r\n else {\r\n //A._auTalk.pause();\r\n A._auTalk.currentTime = 0; \r\n }\r\n\r\n A._auTalk.src = audioURL;\r\n A._auTalk.play();\r\n*/\r\n\r\n/*\r\n A._auChunks.push({\r\n data: audioURL,\r\n volume: data.vol\r\n });\r\n*/\r\n });\r\n};\r\n\r\n// Encode state\r\nVRoadcast.encodeState = (S)=>{\r\n if (!S) return;\r\n\r\n let A = new Float32Array(6); // make sufficient room\r\n A[0] = S.position.x;\r\n A[1] = S.position.y;\r\n A[2] = S.position.z;\r\n\r\n // Convert to byte array, we use last float storage (4 bytes)\r\n var binData = new Int8Array(A.buffer);\r\n\r\n binData[16] = (S.quaternion.x * 128.0);\r\n binData[17] = (S.quaternion.y * 128.0);\r\n binData[18] = (S.quaternion.z * 128.0);\r\n binData[19] = (S.quaternion.w * 128.0);\r\n\r\n binData[20] = S.userid;\r\n\r\n //binData[21] = parseInt(S.rank);\r\n\r\n //console.log(binData);\r\n return binData;\r\n}\r\n\r\n// Decode state\r\nVRoadcast.decodeState = (binData)=>{\r\n let S = {};\r\n let view = new Int8Array(binData);\r\n\r\n //S.userid = binData[20];\r\n S.userid = view[20];\r\n\r\n //console.log(view);\r\n\r\n // First decode quat\r\n S.quaternion = new THREE.Quaternion(\r\n view[16] / 128.0,\r\n view[17] / 128.0,\r\n view[18] / 128.0,\r\n view[19] / 128.0\r\n );\r\n\r\n // Now decode floats\r\n view = new Float32Array(binData);\r\n S.position = new THREE.Vector3(view[0],view[1],view[2]);\r\n //S.scale = A[3];\r\n\r\n/*\r\n // First decode quat\r\n S.quaternion = new THREE.Quaternion(\r\n binData[16] / 128.0,\r\n binData[17] / 128.0,\r\n binData[18] / 128.0,\r\n binData[19] / 128.0\r\n );\r\n\r\n // Now decode floats\r\n let a8 = new Int8Array(16);\r\n for (var i=0; i<16; i++) a8[i] = binData[i];\r\n let A = new Float32Array(a8.buffer);\r\n\r\n S.position = new THREE.Vector3(A[0],A[1],A[2]);\r\n\r\n //S.scale = A[3];\r\n*/\r\n return S;\r\n}\r\n\r\n\r\n// Update\r\nVRoadcast.update = ()=>{\r\n if (!VRoadcast._connected) return;\r\n\r\n // State interpolation\r\n for (let a=0; a{\r\n if (b === undefined) return;\r\n\r\n if (b){\r\n if (!VRoadcast._bStreamFocus){\r\n\r\n ATON.fireEvent(\"VRC_FocusStreamingStarted\");\r\n }\r\n\r\n VRoadcast._bStreamFocus = true;\r\n return;\r\n }\r\n else {\r\n if (VRoadcast._bStreamFocus){\r\n\r\n ATON.fireEvent(\"VRC_FocusStreamingStopped\");\r\n }\r\n\r\n // Restore selector radius\r\n let r = ATON.SUI._selectorRad;\r\n ATON.SUI.mainSelector.scale.set(r,r,r);\r\n\r\n VRoadcast._bStreamFocus = false;\r\n }\r\n};\r\n\r\nVRoadcast.sendState = ()=>{\r\n if (!VRoadcast.bSendState) return;\r\n if (VRoadcast.uid === undefined) return;\r\n if (!VRoadcast.socket || !VRoadcast._connected) return;\r\n \r\n let cpov = ATON.Nav._currPOV;\r\n if (!cpov) return;\r\n //console.log(cpov);\r\n\r\n // Focus streaming\r\n let fp = ATON.getSceneQueriedPoint();\r\n if (VRoadcast._bStreamFocus && fp !== undefined){\r\n //let F = new THREE.Vector3();\r\n let fx = (fp.x /*- cpov.pos.x*/).toPrecision(5);\r\n let fy = (fp.y /*- cpov.pos.y*/).toPrecision(5);\r\n let fz = (fp.z /*- cpov.pos.z*/).toPrecision(5);\r\n let r = ATON.SUI.getSelectorRadius().toPrecision(5);\r\n \r\n VRoadcast.socket.emit(\"UFOCUS\", [fx,fy,fz, r]);\r\n }\r\n\r\n // Compose state\r\n let S = {};\r\n S.position = new THREE.Vector3();\r\n S.quaternion = new THREE.Quaternion();\r\n\r\n S.position.copy(cpov.pos);\r\n S.quaternion.copy(ATON.Nav._qOri);\r\n S.userid = VRoadcast.uid;\r\n\r\n // Save bandwidth\r\n if (VRoadcast._lastStateSent !== undefined){\r\n let lastPos = VRoadcast._lastStateSent.position;\r\n let lastOri = VRoadcast._lastStateSent.quaternion;\r\n\r\n let dPos = lastPos.distanceToSquared(cpov.pos);\r\n let dOri = lastOri.angleTo(ATON.Nav._qOri);\r\n\r\n if ( dPos < VRoadcast.THRES_STATE_POS && dOri < VRoadcast.THRES_STATE_ORI) return;\r\n }\r\n\r\n // Encode and send\r\n let binData = VRoadcast.encodeState(S);\r\n VRoadcast.socket.emit(\"USTATE\", binData/*.buffer*/ );\r\n VRoadcast._lastStateSent = S;\r\n\r\n //console.log(\"State sent\");\r\n};\r\n\r\n\r\n// Avatars\r\nVRoadcast.getAvatar = (uid)=>{\r\n return VRoadcast.avatarList[uid];\r\n};\r\n\r\nVRoadcast.touchAvatar = (uid)=>{\r\n // First time\r\n if (VRoadcast.avatarList[uid] === undefined){\r\n let A = new VRoadcast.Avatar(uid);\r\n A.attachTo(VRoadcast.avaGroup);\r\n \r\n A.loadRepresentation(ATON.PATH_RES+\"models/vrc/head.gltf\");\r\n //console.log(VRoadcast.avaGroup);\r\n\r\n VRoadcast.avatarList[uid] = A;\r\n\r\n //console.log(VRoadcast.avatarList);\r\n //console.log(ATON.MatHub.materials.avatars);\r\n //console.log(A);\r\n \r\n //VRoadcast._numUsers++;\r\n //ATON.fireEvent(\"VRC_UserEnter\", uid);\r\n }\r\n\r\n let A = VRoadcast.avatarList[uid];\r\n\r\n // Reclaim of previously used slot\r\n if (!A.visible){\r\n VRoadcast._numUsers++;\r\n ATON.fireEvent(\"VRC_UserEnter\", uid);\r\n }\r\n\r\n if (VRoadcast._bShowAvaG) A.show();\r\n\r\n return A;\r\n}\r\n\r\nVRoadcast.destroyAvatar = (uid)=>{\r\n let A = VRoadcast.avatarList[uid];\r\n if (A === undefined) return;\r\n\r\n A.destroy();\r\n};\r\n\r\nVRoadcast.clearAllAvatars = ()=>{\r\n for (let i in VRoadcast.avatarList){\r\n let A = VRoadcast.avatarList[i];\r\n A.hide();\r\n //A.dispose();\r\n }\r\n};\r\n\r\nexport default VRoadcast;","/*\r\n ATON Semantic shapes factory\r\n TODO: rename in SemHub\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Semantic Factory\r\n@namespace SemFactory\r\n*/\r\nlet SemFactory = {};\r\n\r\nSemFactory.FLOAT_PREC = 5;\r\n\r\nSemFactory.init = ()=>{\r\n SemFactory.bConvexBuilding = false;\r\n SemFactory.convexPoints = [];\r\n //SemFactory.convexMeshes = [];\r\n SemFactory.convexNode = undefined; // keeps track of current convex semnode\r\n SemFactory.currConvexMesh = undefined;\r\n \r\n // Temp sem node to hold developing convex mesh\r\n SemFactory.currSemNode = ATON.createSemanticNode();\r\n SemFactory.currSemNode.disablePicking();\r\n SemFactory.currSemNode.attachToRoot();\r\n\r\n SemFactory.resetMaterial();\r\n\r\n SemFactory._numShapes = 0; // counter of shapes produced\r\n};\r\n\r\n\r\n// Current material\r\nSemFactory.resetMaterial = ()=>{\r\n SemFactory.currMaterial = ATON.MatHub.getMaterial(\"semanticShapeHL\"); // current sem material we are using. Was \"semanticShape\"\r\n};\r\n\r\nSemFactory.setMaterial = (m)=>{\r\n if (m === undefined) return;\r\n SemFactory.currMaterial = m;\r\n};\r\n\r\n\r\n// Convex shapes\r\n// NOTE: if semid exists, add mesh under the same id\r\nSemFactory.addConvexPoint = (/*semid,*/ p)=>{\r\n if (p === undefined) return false;\r\n\r\n if (SemFactory.convexPoints.length>0){\r\n let pp = SemFactory.convexPoints[SemFactory.convexPoints.length-1];\r\n if (p.equals(pp)) return false;\r\n }\r\n\r\n SemFactory.convexPoints.push(p);\r\n let numPoints = SemFactory.convexPoints.length;\r\n\r\n // Spatial UI\r\n let M = new THREE.Mesh( ATON.Utils.geomUnitSphere, ATON.MatHub.getMaterial(\"semanticShapeEdit\"));\r\n M.position.copy(p);\r\n M.scale.set(0.001,0.001,0.001);\r\n ATON.SUI.gPoints.add( M );\r\n\r\n if (numPoints < 4) return false;\r\n\r\n // lets build convex shape\r\n let geom = new THREE.ConvexGeometry( SemFactory.convexPoints ); // new THREE.ConvexBufferGeometry( SemFactory.convexPoints );\r\n let semesh = new THREE.Mesh( geom, ATON.MatHub.getMaterial(\"semanticShapeEdit\") );\r\n\r\n //let numMeshes = SemFactory.convexMeshes.length;\r\n\r\n // First time: create semnode and add it to current sem group\r\n if (!SemFactory.bConvexBuilding){\r\n //if (semid === undefined) semid = \"sem\"+SemFactory._numShapes;\r\n\r\n //SemFactory.convexNode = ATON.getSemanticNode(semid) || ATON.createSemanticNode(semid);\r\n //SemFactory.convexNode = ATON.createSemanticNode();\r\n //SemFactory.convexNode.add(semesh);\r\n SemFactory.currSemNode.add(semesh);\r\n \r\n // Store\r\n semesh.userData._convexPoints = [];\r\n for (let i=0; i{\r\n let numPoints = SemFactory.convexPoints.length;\r\n if (numPoints === 0) return;\r\n\r\n //if (!SemFactory.bConvexBuilding) return;\r\n\r\n SemFactory.convexPoints.pop();\r\n\r\n if (SemFactory.currConvexMesh){\r\n let udMesh = SemFactory.currConvexMesh.userData;\r\n if (udMesh._convexPoints) udMesh._convexPoints.pop();\r\n }\r\n};\r\n\r\nSemFactory.stopCurrentConvex = ()=>{\r\n SemFactory.convexPoints = [];\r\n SemFactory.bConvexBuilding = false;\r\n\r\n SemFactory.currSemNode.removeChildren();\r\n ATON.SUI.gPoints.removeChildren();\r\n};\r\n\r\nSemFactory.getCurrentConvexShape = ()=>{\r\n return SemFactory.currSemNode;\r\n};\r\n\r\nSemFactory.isBuildingShape = ()=>{\r\n if (SemFactory.convexPoints.length>0) return true;\r\n\r\n return false;\r\n};\r\n\r\nSemFactory.completeConvexShape = (semid)=>{\r\n SemFactory.convexPoints = [];\r\n SemFactory.bConvexBuilding = false;\r\n\r\n //if (SemFactory.convexNode === undefined) return undefined;\r\n //if (SemFactory.currConvexMesh === undefined) return undefined;\r\n if (SemFactory.currSemNode === undefined) return;\r\n\r\n if (semid === undefined) semid = \"sem\"+SemFactory._numShapes;\r\n\r\n let S = ATON.getSemanticNode(semid) || ATON.createSemanticNode(semid);\r\n \r\n let meshape = SemFactory.currSemNode.children[0];\r\n \r\n ATON.SUI.addSemIcon(semid, meshape);\r\n\r\n S.add( meshape );\r\n S.setMaterial( /*SemFactory.currMaterial*/ATON.MatHub.materials.semanticShape);\r\n S.setDefaultAndHighlightMaterials(/*SemFactory.currMaterial*/ ATON.MatHub.materials.semanticShape, /*ATON.MatHub.materials.semanticShapeHL*/SemFactory.currMaterial);\r\n S.enablePicking();\r\n\r\n SemFactory.currSemNode.removeChildren();\r\n\r\n/*\r\n SemFactory.convexNode = ATON.getSemanticNode(semid) || ATON.createSemanticNode(semid);\r\n SemFactory.convexNode.add(SemFactory.currConvexMesh);\r\n\r\n SemFactory.convexNode.setMaterial( SemFactory.currMaterial );\r\n SemFactory.convexNode.setDefaultMaterial(SemFactory.currMaterial);\r\n SemFactory.convexNode.enablePicking();\r\n*/\r\n SemFactory._numShapes++;\r\n\r\n //console.log(SemFactory.convexNode);\r\n //console.log(SemFactory.convexNode.userData._convexPoints);\r\n\r\n //return SemFactory.convexNode;\r\n\r\n // Spatial UI\r\n ATON.SUI.gPoints.removeChildren();\r\n ATON._bqSem = true;\r\n\r\n return S;\r\n};\r\n\r\nSemFactory.createConvexShape = (semid, points)=>{\r\n let geom = new THREE.ConvexGeometry( points ); // CHECK: it was THREE.ConvexBufferGeometry( points );\r\n let semesh = new THREE.Mesh( geom, /*SemFactory.currMaterial*/ATON.MatHub.materials.semanticShape );\r\n\r\n semesh.userData._convexPoints = [];\r\n for (let i=0; i{\r\n if (ATON._queryDataScene === undefined) return false;\r\n\r\n if (offset === undefined) offset = 0.02;\r\n\r\n let p = ATON._queryDataScene.p;\r\n let eye = ATON.Nav.getCurrentEyeLocation();\r\n/*\r\n let n = ATON._queryDataScene.n;\r\n p.x += (n.x * offset);\r\n p.y += (n.y * offset);\r\n p.z += (n.z * offset);\r\n*/\r\n p.lerpVectors(p, eye, offset);\r\n\r\n SemFactory.addConvexPoint(p);\r\n return p;\r\n};\r\n\r\n\r\n// Spherical semantic shapes\r\n// NOTE: if semid exists, add mesh under the same id\r\nSemFactory.createSphere = (semid, location, radius)=>{\r\n if (location === undefined) return undefined;\r\n if (radius === undefined) return undefined;\r\n\r\n/*\r\n if (ATON.getSemanticNode(semid)){\r\n console.log(\"ERROR SemFactory: semantic node \"+semid+\" already exists.\");\r\n return false;\r\n }\r\n*/\r\n if (semid === undefined) semid = \"sem\"+SemFactory._numShapes;\r\n\r\n let S = ATON.getOrCreateSemanticNode(semid);\r\n\r\n //let g = new THREE.SphereGeometry( 1.0, 16, 16 );\r\n let M = new THREE.Mesh( ATON.Utils.geomUnitSphere, /*SemFactory.currMaterial*/ATON.MatHub.materials.semanticShape );\r\n \r\n // Note: we add multiple spheres to the same node\r\n let sphere = new THREE.Object3D();\r\n sphere.position.copy(location);\r\n sphere.scale.set(radius, radius, radius);\r\n sphere.add(M);\r\n\r\n ATON.SUI.addSemIcon(semid, sphere);\r\n\r\n S.add( sphere );\r\n S.enablePicking();\r\n S.setDefaultAndHighlightMaterials(/*SemFactory.currMaterial*/ATON.MatHub.materials.semanticShape, SemFactory.currMaterial/*ATON.MatHub.materials.semanticShapeHL*/);\r\n\r\n //SemFactory.currParent.add( S );\r\n\r\n SemFactory._numShapes++;\r\n ATON._bqSem = true;\r\n\r\n return S;\r\n};\r\n\r\nSemFactory.createSurfaceSphere = (semid)=>{\r\n if (!ATON._queryDataScene) return undefined;\r\n\r\n let p = ATON._queryDataScene.p;\r\n let r = ATON.SUI.getSelectorRadius();\r\n\r\n return SemFactory.createSphere(semid, p,r);\r\n};\r\n\r\nSemFactory.deleteSemanticNode = (semid)=>{\r\n let S = ATON.getSemanticNode(semid);\r\n\r\n if (S === undefined) return false;\r\n S.removeChildren();\r\n\r\n if (ATON.SUI.gSemIcons === undefined) return true;\r\n\r\n for (let s in ATON.SUI.gSemIcons.children){\r\n let C = ATON.SUI.gSemIcons.children[s];\r\n if (C && C.name === semid) ATON.SUI.gSemIcons.removeChild(C);\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport default SemFactory;","/*\r\n ATON Front-end blueprint\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nGeneric front-end routines for ATON-based web-apps. \r\nA set of blueprints to facilitate or support creation of a front-end\r\n@namespace FE\r\n*/\r\nlet FE = {};\r\n\r\n// Semantic-shapes types\r\nFE.SEMSHAPE_SPHERE = 0;\r\nFE.SEMSHAPE_CONVEX = 1;\r\n\r\nFE.POPUP_DELAY = 300;\r\n\r\n/**\r\nInitialize Front-end\r\n*/\r\nFE.realize = ()=>{\r\n FE.PATH_RES_ICONS = ATON.PATH_RES+\"icons/\";\r\n\r\n FE._bPopup = false; // showing popup\r\n FE.popupBlurBG = 0; // blur 3D canvas on popup show (in pixels), 0 to disable\r\n \r\n FE._userAuth = {};\r\n\r\n FE._bControlLight = false;\r\n FE._bControlSelScale = false;\r\n FE._cLightDir = new THREE.Vector3();\r\n\r\n FE._auSemNode = undefined;\r\n FE._auSemNodePlaying = false;\r\n\r\n FE._bReqHome = false; // auto-compute home\r\n\r\n FE._vrcAddr = undefined;\r\n FE._bVRCsetup = false;\r\n\r\n FE.urlParams = new URLSearchParams(window.location.search);\r\n\r\n FE._uiSetupBase();\r\n\r\n // UI profiles\r\n FE._uiProfiles = {};\r\n FE._uiCurrProfile = undefined;\r\n\r\n FE._selRanges = [0.01, 50.0]; // 3D Selector ranges\r\n FE._selRefRadius = 0.5;\r\n\r\n ATON.realize();\r\n\r\n // Built-in events\r\n ATON.on(\"Fullscreen\", (b)=>{\r\n FE.uiSwitchButton(\"fullscreen\",b);\r\n });\r\n\r\n // built-in base front-end parameters\r\n let ddens = ATON.FE.urlParams.get('d');\r\n if (ddens && ddens>0.0) ATON.setDefaultPixelDensity(ddens);\r\n\r\n let dynd = ATON.FE.urlParams.get('dd');\r\n if (dynd && dynd > 0) ATON.toggleDynamicDensity(true);\r\n};\r\n\r\nFE._handleHomeReq = ()=>{\r\n if (FE._bReqHome) return;\r\n\r\n FE._bReqHome = true;\r\n\r\n if (ATON.Nav.homePOV === undefined){\r\n ATON.Nav.computeAndRequestDefaultHome(0.5);\r\n return;\r\n }\r\n \r\n ATON.Nav.requestHome(1.0);\r\n //console.log(ATON.Nav.homePOV);\r\n};\r\n\r\n/**\r\nAdd basic front-end events such as showing spinner while loading assets and home viewpoint setup\r\n*/\r\nFE.addBasicLoaderEvents = ()=>{\r\n ATON.on(\"NodeRequestFired\", ()=>{ $(\"#idLoader\").show(); });\r\n\r\n ATON.on(\"SceneJSONLoaded\",()=>{\r\n if (ATON.SceneHub.getDescription()) $(\"#btn-info\").show();\r\n if (ATON.Nav.homePOV !== undefined) ATON.Nav.requestHome(1.0);\r\n });\r\n\r\n ATON.on(\"AllNodeRequestsCompleted\", ()=>{ \r\n $(\"#idLoader\").hide();\r\n if (ATON._ccModels.length>0) $(\"#btn-cc\").show();\r\n \r\n FE.computeSelectorRanges();\r\n if (ATON.Nav.isOrbit()) ATON.SUI.setSelectorRadius( FE._selRefRadius );\r\n\r\n FE._handleHomeReq();\r\n });\r\n/*\r\n ATON.on(\"XR_support\", (o)=>{\r\n if (o.type === \"immersive-vr\"){\r\n if (!o.v) $(\"#btn-vr\").hide();\r\n }\r\n if (o.type === \"immersive-ar\"){\r\n if (!o.v) $(\"#btn-ar\").hide();\r\n }\r\n });\r\n*/\r\n //ATON.on(\"frame\", FE._update);\r\n ATON.addUpdateRoutine(FE._update);\r\n};\r\n\r\nFE.controlLight = (b)=>{\r\n FE._bControlLight = b;\r\n ATON.Nav.setUserControl(!b);\r\n};\r\n\r\nFE.controlSelectorScale = (b)=>{\r\n FE._bControlSelScale = b;\r\n ATON._bPauseQuery = b;\r\n ATON.Nav.setUserControl(!b);\r\n};\r\n\r\nFE.useMouseWheelToScaleSelector = (f)=>{\r\n if (f === undefined) f = 0.9; \r\n\r\n ATON.on(\"MouseWheel\", (d)=>{\r\n\r\n if (ATON._kModCtrl){\r\n let ff = ATON.Nav.getFOV();\r\n \r\n if (d > 0.0) ff += 1.0;\r\n else ff -= 1.0;\r\n\r\n ATON.Nav.setFOV(ff);\r\n return;\r\n }\r\n\r\n if (ATON._kModShift){\r\n let r = ATON.SUI.mainSelector.scale.x;\r\n\r\n if (d > 0.0) r *= f;\r\n else r /= f;\r\n\r\n if (r < FE._selRanges[0]) r = FE._selRanges[0];\r\n if (r > FE._selRanges[1]) r = FE._selRanges[1];\r\n\r\n ATON.SUI.setSelectorRadius(r);\r\n return;\r\n }\r\n });\r\n};\r\n\r\n\r\n/**\r\nLoad a scene. \r\nYou can use ATON.on(\"SceneJSONLoaded\", ...) to perform additional tasks when the scene JSON is fully loaded\r\n@param {string} sid - the scene ID (e.g.: 'sample/venus')\r\n*/\r\nFE.loadSceneID = (sid)=>{\r\n if (sid === undefined) return;\r\n\r\n let reqstr = ATON.PATH_RESTAPI_SCENE + sid;\r\n //if (ATON.SceneHub._bEdit) reqstr += \",edit\";\r\n\r\n ATON.SceneHub.load(reqstr, sid);\r\n\r\n $(\"meta[property=og\\\\:image]\").attr(\"content\", ATON.PATH_SCENES+sid+'/cover.png');\r\n $(\"meta[property=og\\\\:image\\\\:secure_url]\").attr(\"content\", ATON.PATH_SCENES+sid+'/cover.png');\r\n $(\"meta[property=og\\\\:image\\\\:type]\").attr(\"content\", \"image/png\");\r\n $(\"meta[property=og\\\\:image\\\\:width]\").attr(\"content\", \"200\");\r\n $(\"meta[property=og\\\\:image\\\\:height]\").attr(\"content\", \"200\");\r\n\r\n console.log(reqstr);\r\n};\r\n\r\nFE._update = ()=>{\r\n //if (ATON.XR._bPresenting) return;\r\n\r\n if (FE._bControlLight){\r\n // Normalized\r\n const sx = ATON._screenPointerCoords.x;\r\n const sy = ATON._screenPointerCoords.y;\r\n //console.log(sx,sy);\r\n\r\n FE._cLightDir.x = -Math.cos(sx * Math.PI);\r\n FE._cLightDir.y = -sy * 4.0;\r\n FE._cLightDir.z = -Math.sin(sx * Math.PI);\r\n\r\n //FE._cLightDir.x = ATON.Nav._vDir.x + (sx);\r\n\r\n FE._cLightDir.normalize();\r\n\r\n ATON.setMainLightDirection(FE._cLightDir);\r\n //ATON.updateDirShadows();\r\n }\r\n/*\r\n if (FE._bControlSelScale){\r\n //const sx = ATON._screenPointerCoords.x;\r\n const f = ATON._screenPointerCoords.y;\r\n\r\n const r = ATON.SUI.mainSelector.scale.x + f;\r\n if (r > 0.0001) ATON.SUI.setSelectorRadius(r);\r\n }\r\n*/\r\n};\r\n\r\n\r\n// HTML UI\r\n//=======================================\r\n// Sample basic UI setup\r\nFE.uiBasicSetup = ()=>{\r\n FE.uiAddButton(\"idTopToolbar\",\"fullscreen\", ATON.toggleFullScreen );\r\n if (ATON.Utils.isConnectionSecure()) FE.uiAddButton(\"idTopToolbar\",\"vr\", ATON.XR.toggle );\r\n\r\n FE.uiAddButton(\"idBottomToolbar\",\"home\", ()=>{ ATON.Nav.requestHome(0.1); });\r\n};\r\n\r\nFE._uiSetupBase = ()=>{\r\n $(\"#idPopup\").click( FE.popupClose );\r\n $(\"#idLoader\").html(\"\");\r\n};\r\n\r\n/**\r\nAdd generic icon button inside a specific div container\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n@param {string} icon - the icon. Can be shortname for default icons in /res/icons/ or URL to .png image\r\n@param {function} onPress - function triggered when pressing the button\r\n@param {string} tooltip - (optional) tooltip\r\n*/\r\nFE.uiAddButton = (idcontainer, icon, onPress, tooltip)=>{\r\n let iconurl;\r\n let iconid;\r\n\r\n if (icon.endsWith(\".png\")){\r\n iconurl = icon;\r\n iconid = icon.slice(0,-4);\r\n }\r\n else {\r\n iconurl = FE.PATH_RES_ICONS+icon+\".png\";\r\n iconid = icon;\r\n }\r\n\r\n let elid = \"btn-\"+iconid;\r\n //let htmlcode = \"
    \";\r\n let el = $(\"
    \");\r\n \r\n $(\"#\"+idcontainer).append(el);\r\n\r\n if (onPress) el.click( onPress ); //$(\"#\"+elid).click( onPress );\r\n if (tooltip) el.attr(\"title\", tooltip); //$(\"#\"+elid).attr(\"title\", tooltip);\r\n};\r\n\r\nFE.uiSwitchButton = (iconid, b)=>{\r\n if (b) $(\"#btn-\"+iconid).addClass(\"switchedON\");\r\n else $(\"#btn-\"+iconid).removeClass(\"switchedON\");\r\n};\r\n\r\n/**\r\nAdd home button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonHome = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"home\", ()=>{ \r\n ATON.Nav.requestHome(0.3);\r\n }, \"Home viewpoint\");\r\n};\r\n\r\n/**\r\nAdd first-person button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonFirstPerson = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"fp\", ()=>{\r\n if (ATON.Nav.isFirstPerson()){\r\n ATON.Nav.setOrbitControl();\r\n //ATON.Nav.restorePreviousNavMode();\r\n FE.uiSwitchButton(\"fp\",false);\r\n }\r\n else {\r\n ATON.Nav.setFirstPersonControl();\r\n FE.uiSwitchButton(\"fp\",true);\r\n }\r\n }, \"First-person navigation mode\");\r\n\r\n if (ATON.Nav.isFirstPerson()) FE.uiSwitchButton(\"fp\",true);\r\n else FE.uiSwitchButton(\"fp\",false);\r\n};\r\n\r\n/**\r\nAdd immersive-VR button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonVR = (idcontainer)=>{\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n //if (!ATON.Utils.isVRsupported()) return; //Not showing on mobile\r\n\r\n FE.uiAddButton(idcontainer, \"vr\", ()=>{\r\n ATON.XR.toggle(\"immersive-vr\");\r\n },\r\n \"Immersive VR mode\" );\r\n};\r\n\r\n/**\r\nAdd immersive-AR button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonAR = (idcontainer)=>{\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n //if (!ATON.Utils.isARsupported()) return; //Not showing on mobile\r\n\r\n FE.uiAddButton(idcontainer, \"ar\", ()=>{ \r\n ATON.XR.toggle(\"immersive-ar\");\r\n }, \r\n \"Immersive AR mode\" );\r\n};\r\n\r\n/**\r\nAdd device-orientation button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonDeviceOrientation = (idcontainer)=>{\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n if (!ATON.Utils.isMobile()) return;\r\n\r\n FE.uiAddButton(idcontainer,\"devori\", ()=>{\r\n if (ATON.Nav.isDevOri()){\r\n //ATON.Nav.setOrbitControl();\r\n ATON.Nav.restorePreviousNavMode();\r\n FE.uiSwitchButton(\"devori\",false);\r\n }\r\n else {\r\n ATON.Nav.setDeviceOrientationControl();\r\n FE.uiSwitchButton(\"devori\",true);\r\n }\r\n }, \"Device-orientation mode\");\r\n\r\n if (ATON.Nav.isDevOri()) FE.uiSwitchButton(\"devori\",true);\r\n else FE.uiSwitchButton(\"devori\",false);\r\n};\r\n\r\n/**\r\nAdd Navigation button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonNav = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer,\"nav\", ()=>{\r\n FE.popupNav();\r\n }, \"Navigation\");\r\n};\r\n\r\n/**\r\nAdd talk button (VRoadcast)\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonTalk = (idcontainer)=>{\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n\r\n FE.uiAddButton(idcontainer, \"talk\", ()=>{\r\n if (ATON.MediaRec.isAudioRecording()){\r\n ATON.MediaRec.stopMediaStreaming();\r\n //FE.uiSwitchButton(\"talk\",false);\r\n $(\"#btn-talk\").removeClass(\"atonBTN-rec\");\r\n }\r\n else {\r\n ATON.MediaRec.startMediaStreaming();\r\n //FE.uiSwitchButton(\"talk\",true);\r\n $(\"#btn-talk\").addClass(\"atonBTN-rec\");\r\n }\r\n }, \"Talk ON/OFF\");\r\n\r\n if (ATON.MediaRec.isAudioRecording()) $(\"#btn-talk\").addClass(\"atonBTN-rec\");\r\n else $(\"#btn-talk\").removeClass(\"atonBTN-rec\");\r\n};\r\n\r\n/**\r\nAdd focus stream button (VRoadcast)\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonStreamFocus = (idcontainer)=>{\r\n\r\n FE.uiAddButton(idcontainer, \"focus\", ()=>{\r\n if (ATON.VRoadcast._bStreamFocus){\r\n ATON.VRoadcast.setFocusStreaming(false);\r\n $(\"#btn-focus\").removeClass(\"atonBTN-rec\");\r\n }\r\n else {\r\n ATON.VRoadcast.setFocusStreaming(true);\r\n $(\"#btn-focus\").addClass(\"atonBTN-rec\");\r\n }\r\n }, \"Focus streaming ON/OFF\");\r\n\r\n if (ATON.VRoadcast._bStreamFocus) $(\"#btn-focus\").addClass(\"atonBTN-rec\");\r\n else $(\"#btn-focus\").removeClass(\"atonBTN-rec\");\r\n};\r\n\r\n/**\r\nAdd QR-code button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonQR = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer,\"qr\", FE.popupQR, \"QR-code\" );\r\n};\r\n\r\n/**\r\nAdd screenshot button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonScreenshot = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer,\"sshot\", FE.popupScreenShot, \"Screenshot\" );\r\n};\r\n\r\n/**\r\nAdd scene information button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonInfo = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"info\", ATON.FE.popupSceneInfo, \"Scene information\");\r\n $(\"#btn-info\").hide();\r\n};\r\n\r\n/**\r\nAdd fullscreen button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonFullScreen = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"fullscreen\", ()=>{\r\n ATON.toggleFullScreen();\r\n }, \"Fullscreen\");\r\n\r\n FE.uiSwitchButton(\"fullscreen\", ATON.isFullscreen());\r\n};\r\n\r\n//TODO:\r\nFE.uiAddKeywordsArea = (idcontainer, kwList, onAddKeyword, onRemoveKeyword)=>{\r\n let htmlcode = \"\";\r\n htmlcode += \"Add keyword:

    \";\r\n htmlcode += \"
    \";\r\n\r\n $(\"#\"+idcontainer).html(htmlcode);\r\n\r\n FE.uiAttachInputFilterID(\"idKWordInput\");\r\n\r\n // Request global keywords list\r\n $.getJSON( ATON.PATH_RESTAPI+\"keywords/\", ( data )=>{\r\n let ht = \"\";\r\n for (let s in data) ht += \"\";\r\n ht += \"\";\r\n\r\n $(\"#\"+idcontainer).append(ht);\r\n });\r\n\r\n\r\n let kwsObj = {};\r\n\r\n let addKWtoBox = (kw)=>{\r\n if (kwsObj[kw]) return; // check duplicate\r\n\r\n kw = kw.toLowerCase().trim();\r\n\r\n $(\"#idKWordInput\").val(\"\"); // clear\r\n\r\n kwsObj[kw] = 1;\r\n\r\n console.log(\"Added keyword \"+kw);\r\n if (onAddKeyword) onAddKeyword(kw);\r\n\r\n // Populate box with remove handlers\r\n $(\"#idKWords\").append(\"
    \"+kw+\"
    \");\r\n $(\"#idkw-\"+kw).click(()=>{\r\n $(\"#idkw-\"+kw).remove();\r\n\r\n kwsObj[kw] = undefined;\r\n\r\n console.log(\"Removed keyword \"+kw);\r\n if (onRemoveKeyword) onRemoveKeyword(kw);\r\n });\r\n };\r\n\r\n if (kwList){\r\n for (let k in kwList) addKWtoBox( kwList[k] );\r\n }\r\n\r\n $(\"#idKWordInput\").keypress(function(event){\r\n let keycode = (event.keyCode ? event.keyCode : event.which);\r\n if (keycode != '13') return;\r\n\r\n let kw = $(\"#idKWordInput\").val().toLowerCase().trim();\r\n if (!kw || kw.length < 3) return;\r\n\r\n addKWtoBox(kw);\r\n });\r\n\r\n $(\"#idKWadd\").click(()=>{\r\n let kw = $(\"#idKWordInput\").val().toLowerCase().trim();\r\n if (!kw || kw.length < 3) return;\r\n\r\n addKWtoBox(kw);\r\n });\r\n};\r\n\r\n// Get css class from vrc ID\r\nFE.getVRCclassFromID = (uid)=>{\r\n let i = (uid%6);\r\n return \"atonVRCu\"+i;\r\n};\r\n\r\n// Setup VRC events\r\nFE._setupVRCevents = ()=>{\r\n if (FE._bVRCsetup) return;\r\n\r\n ATON.on(\"VRC_IDassigned\", (uid)=>{\r\n $(\"#btn-vrc\").addClass( FE.getVRCclassFromID(uid) );\r\n\r\n // Selector color\r\n //ATON.MatHub.materials.selector.color = ATON.VRoadcast.ucolors[uid%6];\r\n ATON.SUI.setSelectorColor(ATON.VRoadcast.ucolors[uid%6]);\r\n\r\n FE.checkAuth((data)=>{\r\n if (data.username!==undefined /*&& ATON.VRoadcast._username===undefined*/) ATON.VRoadcast.setUsername(data.username);\r\n });\r\n });\r\n\r\n ATON.on(\"VRC_SceneState\", (sstate)=>{\r\n let numUsers = ATON.VRoadcast.getNumUsers();\r\n if (numUsers>1) $(\"#idVRCnumusers\").html(numUsers);\r\n else $(\"#idVRCnumusers\").html(\"\");\r\n\r\n console.log(\"Users: \"+numUsers);\r\n });\r\n/*\r\n ATON.on(\"VRC_UserEnter\", (uid)=>{\r\n let numUsers = ATON.VRoadcast.getNumUsers();\r\n $(\"#idVRCnumusers\").html(numUsers);\r\n console.log(\"Users: \"+numUsers);\r\n });\r\n ATON.on(\"VRC_UserLeave\", (uid)=>{\r\n let numUsers = ATON.VRoadcast.getNumUsers();\r\n $(\"#idVRCnumusers\").html(numUsers);\r\n console.log(\"Users: \"+numUsers);\r\n });\r\n*/\r\n ATON.on(\"VRC_Disconnected\", ()=>{\r\n $(\"#btn-vrc\").attr(\"class\",\"atonBTN\");\r\n // Selector color\r\n //ATON.MatHub.materials.selector.color = ATON.MatHub.colors.green;\r\n ATON.SUI.setSelectorColor(ATON.MatHub.colors.defUI);\r\n\r\n $(\"#idVRCnumusers\").html(\"\");\r\n });\r\n\r\n FE._bVRCsetup = true;\r\n};\r\n\r\n/**\r\nAdd VRoadcast button (to connect/disconnect from collaborative sessions)\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonVRC = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"vrc\", ()=>{\r\n if (ATON.VRoadcast.isConnected()){\r\n FE.popupVRC();\r\n }\r\n else {\r\n ATON.VRoadcast.connect(FE._vrcAddr);\r\n }\r\n }, \"VRoadcast (collaborative session)\");\r\n\r\n $(\"#btn-vrc\").append(\"\");\r\n\r\n //$(\"
    xxx
    \").appendTo(document.body);\r\n //$(\"#idVRCchatPanel\").append(ATON.VRoadcast._elChat);\r\n FE._setupVRCevents();\r\n\r\n if (ATON.VRoadcast.uid !== undefined) $(\"#btn-vrc\").addClass( FE.getVRCclassFromID(ATON.VRoadcast.uid) );\r\n else $(\"#btn-vrc\").attr(\"class\",\"atonBTN\");\r\n};\r\n\r\n/**\r\nAdd user button (login/logout)\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonUser = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"user\", ()=>{\r\n FE.popupUser();\r\n }, \"User\");\r\n\r\n FE.checkAuth((r)=>{\r\n if (r.username !== undefined) $(\"#btn-user\").addClass(\"switchedON\");\r\n else $(\"#btn-user\").removeClass(\"switchedON\");\r\n });\r\n};\r\n\r\n/**\r\nAdd persistent editing mode button\r\n@param {string} idcontainer - the id of html container (e.g.: \"idTopToolbar\")\r\n*/\r\nFE.uiAddButtonEditMode = (idcontainer)=>{\r\n FE.uiAddButton(idcontainer, \"edit\", ()=>{\r\n FE.checkAuth((data)=>{\r\n if (data.username !== undefined){\r\n ATON.SceneHub._bEdit = !ATON.SceneHub._bEdit;\r\n FE.uiSwitchButton(\"edit\",ATON.SceneHub._bEdit);\r\n }\r\n\r\n else {\r\n FE.popupUser(); \r\n }\r\n });\r\n });\r\n};\r\n\r\n/**\r\nAdd UI Profile to the front-end\r\n@param {string} id - profile ID\r\n@param {function} uiFunction - function that creates UI (HTML or SUI elements) for that profile\r\n*/\r\nFE.uiAddProfile = (id, uiFunction)=>{\r\n if (typeof uiFunction !== 'function') return;\r\n\r\n FE._uiProfiles[id] = uiFunction;\r\n};\r\n\r\n/**\r\nLoad specific UI Profile for the front-end\r\n@param {string} id - profile ID\r\n*/\r\nFE.uiLoadProfile = (id)=>{\r\n let f = FE._uiProfiles[id];\r\n if (f === undefined) return;\r\n\r\n f();\r\n FE._uiCurrProfile = id;\r\n console.log(\"Loaded UI Profile: \"+FE._uiCurrProfile);\r\n};\r\n\r\nFE.attachHandlerToButton = (idbutton, h)=>{\r\n if (h === undefined) return;\r\n\r\n $(\"#\"+idbutton).click(()=>{ h(); });\r\n};\r\n\r\n// Attach ID validator to given input field\r\nFE.uiAttachInputFilterID = (inputid)=>{\r\n $(\"#\"+inputid).on('keyup change input', ()=>{\r\n let value = $(\"#\"+inputid).val();\r\n let regReplace = new RegExp('[^A-Za-z0-9-_]', 'ig');\r\n $(\"#\"+inputid).val( value.replace(regReplace, '') );\r\n\r\n });\r\n};\r\n\r\n// Utility to switch a node in a graph\r\nFE.switchNode = (nid, value, type)=>{\r\n let N = undefined;\r\n \r\n if (type === ATON.NTYPES.SEM) N = ATON.getSemanticNode(nid);\r\n else N = ATON.getSceneNode(nid);\r\n\r\n if (N === undefined) return;\r\n\r\n N.toggle(value);\r\n\r\n ATON.fireEvent(\"FE_NodeSwitch\", {nid: nid, t: type, v: value});\r\n //console.log(\"XXX\");\r\n};\r\n\r\n// Graphs\r\nFE.uiCreateGraph = (type)=>{\r\n let nodes = ATON.snodes;\r\n if (type === ATON.NTYPES.SEM) nodes = ATON.semnodes;\r\n\r\n let htmlcontent = \"\";\r\n for (let nid in nodes){\r\n let N = nodes[nid];\r\n \r\n let chk = N.visible? \"checked\" : \"\";\r\n if (nid !== \".\") htmlcontent += \"\"+nid+\"
    \";\r\n }\r\n\r\n return htmlcontent;\r\n};\r\n\r\nFE.setupBasicUISounds = ()=>{\r\n FE.auLib = {};\r\n\r\n FE.auLib.switch = new Audio(ATON.PATH_RES+\"audio/switch.wav\");\r\n FE.auLib.switch.loop = false;\r\n};\r\n\r\nFE.playAudioFromSemanticNode = (semid)=>{\r\n //if (FE._auSemNodePlaying) return;\r\n if (semid === undefined) return;\r\n\r\n let S = ATON.getSemanticNode(semid);\r\n if (S === undefined) return;\r\n\r\n let au = S.getAudio();\r\n if (au === undefined) return;\r\n\r\n if (FE._auSemNode === undefined || FE._auSemNode === null) FE._auSemNode = new THREE.Audio( ATON.AudioHub._listener );\r\n else FE._auSemNode.stop();\r\n\r\n ATON.AudioHub._loader.load( au, (buffer)=>{\r\n FE._auSemNode.setBuffer( buffer );\r\n FE._auSemNode.setLoop( false );\r\n //FE._auSemNode.setVolume( 0.5 );\r\n //FE._auSemNode.setPlaybackRate(0.9);\r\n FE._auSemNode.play();\r\n });\r\n\r\n/*\r\n if (FE._auSemNode === undefined) FE._auSemNode = new Audio();\r\n \r\n FE._auSemNodePlaying = true;\r\n FE._auSemNode.src = au;\r\n //FE._auSemNode.type = ATON.MediaRec.auType;\r\n FE._auSemNode.play();\r\n\r\n FE._auSemNode.onended = ()=>{\r\n FE._auSemNodePlaying = false;\r\n };\r\n*/\r\n};\r\n\r\n\r\n// Popups\r\n//===================================================================\r\n\r\n/**\r\nShow a modal popup.\r\n@param {string} htmlcontent - The HTML5 content for the popup\r\n@param {string} cssClasses - (optional) css classes for the popup\r\n*/\r\nFE.popupShow = (htmlcontent, cssClasses)=>{\r\n if (FE._bPopup) return false;\r\n\r\n let clstr = \"atonPopup \";\r\n if (cssClasses) clstr += cssClasses;\r\n\r\n let htcont = \"
    \";\r\n htcont += htmlcontent+\"
    \"\r\n\r\n $('#idPopup').html(htcont);\r\n $('#idPopupContent').click((e)=>{ e.stopPropagation(); });\r\n $('#idPopup').fadeIn(FE.POPUP_DELAY);\r\n\r\n FE._bPopup = true;\r\n\r\n ATON._bListenKeyboardEvents = false;\r\n\r\n if (FE.popupBlurBG > 0){\r\n //ATON._renderer.setPixelRatio( FE.popupBlurBG );\r\n ATON._renderer.domElement.style.filter = \"blur(\"+FE.popupBlurBG+\"px)\"; //`blur(${blur * 5}px)`;\r\n //ATON._renderer.render( ATON._mainRoot, ATON.Nav._camera );\r\n }\r\n\r\n ATON._bPauseQuery = true;\r\n \r\n //ATON.renderPause();\r\n\r\n $(\"#idTopToolbar\").hide();\r\n $(\"#idBottomToolbar\").hide();\r\n $(\"#idBottomRToolbar\").hide();\r\n $(\"#idPoweredBy\").hide();\r\n\r\n return true;\r\n};\r\n\r\n/**\r\nClose current popup\r\n*/\r\nFE.popupClose = (bNoAnim)=>{\r\n FE._bPopup = false;\r\n\r\n //ATON.renderResume();\r\n ATON._bListenKeyboardEvents = true;\r\n \r\n if (FE.popupBlurBG > 0){\r\n //ATON.resetPixelDensity();\r\n ATON._renderer.domElement.style.filter = \"none\";\r\n }\r\n\r\n if (bNoAnim === true) $(\"#idPopup\").hide();\r\n else $(\"#idPopup\").fadeOut(FE.POPUP_DELAY);\r\n //$(\"#idPopup\").empty();\r\n\r\n ATON._bPauseQuery = false;\r\n\r\n $(\"#idTopToolbar\").show();\r\n $(\"#idBottomToolbar\").show();\r\n $(\"#idBottomRToolbar\").show();\r\n $(\"#idPoweredBy\").show();\r\n\r\n ATON.focusOn3DView();\r\n};\r\n\r\nFE.subPopup = ( popupFunc )=>{\r\n ATON.FE.popupClose();\r\n setTimeout( popupFunc, ATON.FE.POPUP_DELAY);\r\n};\r\n\r\nFE.popupQR = ()=>{\r\n let htmlcontent = \"
    Share
    \";\r\n htmlcontent += \"


    \";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n let url = window.location.href;\r\n new QRCode(document.getElementById(\"idQRcode\"), url);\r\n};\r\n\r\nFE.popupScreenShot = ()=>{\r\n let cover = ATON.Utils.takeScreenshot(200);\r\n\r\n FE.checkAuth((r)=>{\r\n\r\n let htmlcontent = \"
    Screenshot
    \";\r\n htmlcontent += \"This is a preview of what your screenshot will look like:

    \";\r\n htmlcontent += \"
    \";\r\n htmlcontent += \"Resolution: px
    \";\r\n\r\n htmlcontent += \"
    SHOT
    \";\r\n\r\n if (r.username !== undefined){\r\n htmlcontent += \"
    Set as Cover
    \";\r\n /*\r\n htmlcontent += \"
    \";\r\n htmlcontent += \"
    \";\r\n htmlcontent += \"Set as Cover
    \";\r\n */\r\n }\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n $(\"#btnScreenShot\").click(()=>{\r\n ATON.FE.popupClose();\r\n\r\n let s = parseInt( $('#isShotSize').val() );\r\n let img = ATON.Utils.takeScreenshot(s,\"shot.png\");\r\n });\r\n\r\n $(\"#btnSetCover\").click(()=>{\r\n ATON.FE.popupClose();\r\n\r\n ATON.Utils.postJSON(ATON.PATH_RESTAPI+\"cover/scene/\", {sid: ATON.SceneHub.currID, img: cover.src }, (r)=>{\r\n console.log(r);\r\n });\r\n\r\n });\r\n });\r\n};\r\n\r\nFE.popupVRC = ()=>{\r\n let htmlcontent = \"\";\r\n let numUsers = ATON.VRoadcast.getNumUsers();\r\n\r\n if (numUsers>1) htmlcontent += \"
    Collaborative Session (\"+numUsers+\" users)
    \";\r\n else htmlcontent += \"
    Collaborative Session
    \";\r\n\r\n // Username\r\n //htmlcontent += \"Your username in this collaborative session is:
    \";\r\n htmlcontent += \"\";\r\n htmlcontent += \"\";\r\n\r\n htmlcontent += \"
    \";\r\n\r\n //htmlcontent += \"
    \";\r\n htmlcontent += \"\";\r\n //htmlcontent += \"
    \";\r\n\r\n htmlcontent += \"
    LEAVE
    \";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent, \"atonPopupLarge\") ) return;\r\n\r\n if (ATON.VRoadcast._username === undefined){\r\n $('#idVRCusername').show();\r\n $('#idVRCusernameBTN').hide();\r\n }\r\n else {\r\n $('#idVRCusername').val(ATON.VRoadcast._username);\r\n $('#idVRCusername').hide();\r\n $('#idVRCusernameBTN').show();\r\n }\r\n\r\n if (ATON.VRoadcast.uid !== undefined) $('#idVRCusernameBTN').addClass(\"atonVRCu\"+(ATON.VRoadcast.uid % 6));\r\n\r\n $(\"#idChatBox\").append(ATON.VRoadcast._elChat);\r\n\r\n $(\"#idVRCmsg\").keypress((e)=>{\r\n let keycode = (e.keyCode ? e.keyCode : e.which);\r\n if (keycode == '13'){\r\n let str = $(\"#idVRCmsg\").val();\r\n ATON.VRoadcast.setMessage( str );\r\n $(\"#idVRCmsg\").val(\"\");\r\n //$(\"#idChatBox:first-child\").scrollTop( $(\"#idChatBox:first-child\").height() );\r\n }\r\n });\r\n\r\n $(\"#idVRCusername\").keypress((e)=>{\r\n let keycode = (e.keyCode ? e.keyCode : e.which);\r\n if (keycode == '13'){\r\n let str = $(\"#idVRCusername\").val();\r\n ATON.VRoadcast.setUsername( str );\r\n \r\n $('#idVRCusername').hide();\r\n $('#idVRCusernameBTN').html(ATON.VRoadcast._username);\r\n $('#idVRCusernameBTN').show();\r\n }\r\n });\r\n\r\n $(\"#idVRCusernameBTN\").click(()=>{\r\n $('#idVRCusername').show();\r\n $('#idVRCusernameBTN').hide();\r\n });\r\n\r\n $(\"#idVRCdisconnect\").click(()=>{\r\n ATON.VRoadcast.disconnect();\r\n ATON.FE.popupClose();\r\n });\r\n\r\n};\r\n\r\n// User auth\r\nFE.checkAuth = (onReceive)=>{\r\n ATON.Utils.checkAuth((data)=>{\r\n FE._userAuth = data;\r\n //console.log(FE._userAuth);\r\n\r\n if (data.username !== undefined){\r\n $(\"#btn-user\").addClass(\"switchedON\");\r\n if (ATON.VRoadcast._username === undefined) ATON.VRoadcast.setUsername(data.username);\r\n }\r\n else {\r\n $(\"#btn-user\").removeClass(\"switchedON\");\r\n }\r\n\r\n if (onReceive) onReceive(data);\r\n });\r\n};\r\n\r\n/*\r\nFE.checkAuth = (onReceive)=>{\r\n $.ajax({\r\n type: 'GET',\r\n url: ATON.PATH_RESTAPI+\"user\",\r\n xhrFields: { withCredentials: true }, \r\n dataType: 'json',\r\n\r\n success: (data)=>{\r\n FE._userAuth = data;\r\n //console.log(FE._userAuth);\r\n\r\n if (data.username !== undefined){\r\n $(\"#btn-user\").addClass(\"switchedON\");\r\n if (ATON.VRoadcast._username === undefined) ATON.VRoadcast.setUsername(data.username);\r\n }\r\n else {\r\n $(\"#btn-user\").removeClass(\"switchedON\");\r\n }\r\n\r\n onReceive(data);\r\n }\r\n });\r\n};\r\n*/\r\n\r\nFE.popupUser = ()=>{\r\n\r\n FE.checkAuth((r)=>{\r\n \r\n // We are already logged\r\n if (r.username !== undefined){\r\n let htmlcontent = \"
    \";\r\n htmlcontent += \"'\"+r.username+\"'

    \";\r\n\r\n if (Object.keys(FE._uiProfiles)){\r\n htmlcontent += \"UI Profile:


    \";\r\n }\r\n\r\n htmlcontent += \"
    LOGOUT
    \";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n if (FE._uiCurrProfile){\r\n console.log(FE._uiCurrProfile);\r\n $(\"#idUIProfiles\").val(FE._uiCurrProfile);\r\n }\r\n\r\n $(\"#idLogoutBTN\").click(()=>{\r\n $.get(ATON.PATH_RESTAPI+\"logout\", (r)=>{\r\n console.log(r);\r\n ATON.SceneHub.setEditMode(false);\r\n ATON.fireEvent(\"Logout\");\r\n $(\"#btn-user\").removeClass(\"switchedON\");\r\n });\r\n\r\n ATON.FE.popupClose();\r\n });\r\n\r\n $(\"#idSHUscenes\").click(()=>{\r\n ATON.Utils.goToURL(\"/shu/scenes/\");\r\n });\r\n $(\"#idSHUuser\").click(()=>{\r\n ATON.Utils.goToURL(\"/shu/auth/\");\r\n });\r\n\r\n $(\"#idUIProfiles\").on(\"change\", ()=>{\r\n let uip = $(\"#idUIProfiles\").val();\r\n FE.uiLoadProfile(uip);\r\n ATON.FE.popupClose();\r\n });\r\n\r\n }\r\n\r\n // Not logged in\r\n else {\r\n let htmlcontent = \"
    \";\r\n htmlcontent += \"username:
    \";\r\n htmlcontent += \"password:
    \";\r\n\r\n htmlcontent += \"
    LOGIN
    \";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n $(\"#idLoginBTN\").click(()=>{\r\n let jstr = JSON.stringify({\r\n username: $(\"#idUsername\").val(),\r\n password: $(\"#idPassword\").val()\r\n });\r\n\r\n $.ajax({\r\n url: ATON.PATH_RESTAPI+\"login\",\r\n type:\"POST\",\r\n data: jstr,\r\n contentType:\"application/json; charset=utf-8\",\r\n dataType:\"json\",\r\n\r\n success: (r)=>{\r\n console.log(r);\r\n if (r){\r\n ATON.fireEvent(\"Login\", r);\r\n $(\"#btn-user\").addClass(\"switchedON\");\r\n ATON.FE.popupClose();\r\n }\r\n }\r\n\r\n }).fail((err)=>{\r\n //console.log(err);\r\n $(\"#idLoginBTN\").html(\"LOGIN FAILED\");\r\n $(\"#idLoginBTN\").attr(\"class\",\"atonBTN atonBTN-red\");\r\n });\r\n });\r\n }\r\n });\r\n};\r\n\r\n/*\r\nFE.popupPOV = ()=>{\r\n let htmlcontent = \"

    Viewpoint

    \";\r\n\r\n htmlcontent += \"
    \";\r\n\r\n htmlcontent += \"
    OK
    \"; // \r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n let mode = $(\"#idPOVmode\").val();\r\n};\r\n*/\r\n\r\nFE.popupSceneInfo = ()=>{\r\n let head = ATON.SceneHub.getTitle();\r\n if (head === undefined) head = ATON.SceneHub.currID;\r\n\r\n let descr = ATON.SceneHub.getDescription();\r\n\r\n let htmlcontent = \"
    \"+head+\"
    \";\r\n if (descr) htmlcontent += \"
    \" + JSON.parse(descr) + \"
    \";\r\n\r\n htmlcontent += \"
    OK
    \";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent) ) return;\r\n\r\n $(\"#btnOK\").click(()=>{\r\n ATON.FE.popupClose();\r\n });\r\n};\r\n\r\nFE.computeSelectorRanges = ()=>{\r\n let sceneBS = ATON.getRootScene().getBound();\r\n let r = sceneBS.radius;\r\n\r\n if (r <= 0.0) return;\r\n\r\n FE._selRanges[0] = r * 0.001;\r\n FE._selRefRadius = r * 0.02;\r\n FE._selRanges[1] = r * 0.5;\r\n\r\n //console.log(\"3D Selector ranges: \"+FE._selRanges[0]+\", \"+FE._selRanges[1]);\r\n};\r\n\r\nFE.popupSelector = ()=>{\r\n let htmlcontent = \"
    3D Selector
    \";\r\n\r\n let rad = ATON.SUI.getSelectorRadius();\r\n let hr = ATON.Utils.getHumanReadableDistance( rad );\r\n\r\n FE.computeSelectorRanges();\r\n\r\n htmlcontent += \"Radius (\"+hr+\"):
    \";\r\n htmlcontent += \"\";\r\n\r\n if ( !ATON.FE.popupShow(htmlcontent, \"atonPopupLarge\") ) return;\r\n\r\n $(\"#idSelRad\").val(rad);\r\n\r\n $(\"#idSelRad\").on(\"input change\",()=>{\r\n let r = parseFloat( $(\"#idSelRad\").val() );\r\n\r\n ATON.SUI.setSelectorRadius(r);\r\n $(\"#idSelRadTxt\").html( ATON.Utils.getHumanReadableDistance(r) );\r\n });\r\n};\r\n\r\nFE.popupNav = ()=>{\r\n let htmlcontent = \"
    Navigation
    \";\r\n\r\n //htmlcontent += \"
    \";\r\n\r\n htmlcontent += \"
    \";\r\n htmlcontent +=\"
    \";\r\n htmlcontent +=\"
    Switch between first-person and orbit navigation mode
    \";\r\n htmlcontent += \"
    \";\r\n\r\n if (ATON.Utils.isConnectionSecure()){\r\n htmlcontent += \"
    \";\r\n htmlcontent +=\"
    \";\r\n htmlcontent +=\"
    Immersive VR mode
    \";\r\n htmlcontent += \"
    \";\r\n\r\n if (ATON.Utils.isMobile()){\r\n htmlcontent += \"
    \";\r\n htmlcontent +=\"
    \";\r\n htmlcontent +=\"
    Enable or disable device-orientation mode
    \";\r\n htmlcontent += \"
    \";\r\n }\r\n }\r\n\r\n if ( !FE.popupShow(htmlcontent) ) return;\r\n\r\n FE.uiAddButtonFirstPerson(\"idNMfp\");\r\n FE.uiAddButtonDeviceOrientation(\"idNMdevori\");\r\n FE.uiAddButtonVR(\"idNMvr\");\r\n\r\n};\r\n\r\nexport default FE;","/*\r\n ATON Media Recorder\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON Media Recorder\r\n@namespace MediaRec\r\n*/\r\nlet MediaRec = {};\r\nMediaRec.auType = \"audio/wav\";\r\nMediaRec.auExt = \".wav\";\r\n//MediaRec.auType = \"audio/webm\";\r\n//MediaRec.auExt = \".webm\";\r\n\r\nMediaRec.auBitsPerSecond = 9000; //9000;\r\nMediaRec.auStreamInterval = 1000;\r\nMediaRec.auMinVol = 1;\r\n\r\n\r\nMediaRec.init = ()=>{\r\n MediaRec._bAudioRecording = false;\r\n MediaRec._bStreaming = false;\r\n\r\n MediaRec.recorder = undefined;\r\n};\r\n\r\nMediaRec.realizeAudioRecorder = ( onComplete )=>{\r\n if (MediaRec.recorder !== undefined){\r\n MediaRec.recorder.reset();\r\n if (onComplete) onComplete();\r\n }\r\n\r\n // First time\r\n else {\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n if (!navigator.mediaDevices) return;\r\n\r\n if (MediaRec._ds === undefined) MediaRec._ds = setInterval( MediaRec._streamChunk, MediaRec.auStreamInterval);\r\n\r\n let UM = navigator.mediaDevices.getUserMedia({ \r\n video: false, \r\n audio: true, \r\n channelCount: 1,\r\n echoCancellation: true,\r\n });\r\n\r\n UM.then(async function(stream){\r\n MediaRec.recorder = RecordRTC(stream, { \r\n type: 'audio',\r\n mimeType: MediaRec.auType,\r\n \r\n bitsPerSecond: MediaRec.auBitsPerSecond,\r\n audioBitsPerSecond: MediaRec.auBitsPerSecond,\r\n\r\n sampleRate: 22050,\r\n desiredSampRate: 22050,\r\n \r\n disableLogs: true,\r\n \r\n //recorderType: MediaStreamRecorder,\r\n numberOfAudioChannels: 1,\r\n //bufferSize: 16384,\r\n\r\n //timeSlice: MediaRec.auStreamInterval,\r\n //ondataavailable: MediaRec._onAuBlob,\r\n });\r\n\r\n // Audio analyser\r\n /*\r\n MediaRec._auAVGvolume = 0;\r\n\r\n MediaRec._auCTX = new AudioContext();\r\n const input = MediaRec._auCTX.createMediaStreamSource(stream);\r\n const analyser = MediaRec._auCTX.createAnalyser();\r\n const scriptProcessor = MediaRec._auCTX.createScriptProcessor();\r\n\r\n // Some analyser setup\r\n analyser.smoothingTimeConstant = 0.3;\r\n analyser.fftSize = 1024;\r\n \r\n input.connect(analyser);\r\n analyser.connect(scriptProcessor);\r\n scriptProcessor.connect(MediaRec._auCTX.destination);\r\n\r\n const getAverageVolume = array => {\r\n const L = array.length;\r\n if (L <= 0) return 0; \r\n \r\n let values = 0;\r\n for (let i=0; i {\r\n if (!MediaRec._bAudioRecording) return;\r\n\r\n const tempArray = new Uint8Array(analyser.frequencyBinCount);\r\n\r\n analyser.getByteFrequencyData(tempArray);\r\n MediaRec._auAVGvolume = parseInt(getAverageVolume(tempArray));\r\n \r\n //console.log(MediaRec._auAVGvolume);\r\n };\r\n */\r\n if (onComplete) onComplete();\r\n });\r\n }\r\n};\r\n\r\nMediaRec.isAudioRecording = ()=>{\r\n return MediaRec._bAudioRecording;\r\n};\r\n\r\n// helper routines\r\nMediaRec._stopRecAndSend = ( onFinish )=>{\r\n if (MediaRec.recorder === undefined){\r\n if (onFinish) onFinish();\r\n return;\r\n }\r\n\r\n MediaRec.recorder.stopRecording(()=>{\r\n/*\r\n let rblob = MediaRec.recorder.getBlob();\r\n\r\n if (!rblob || rblob.size < 5 || !ATON.VRoadcast.socket || ATON.VRoadcast.uid === undefined){ // || MediaRec._auAVGvolume <= MediaRec.auMinVol\r\n if (onFinish) onFinish();\r\n return;\r\n }\r\n\r\n let reader = new FileReader();\r\n reader.readAsDataURL(rblob); \r\n reader.onloadend = ()=>{\r\n let b64 = reader.result;\r\n //let b64 = reader.result.split(',')[1];\r\n //b64 = \"data:audio/wav;base64,\" + b64;\r\n*/\r\n MediaRec.recorder.getDataURL((b64)=>{\r\n\r\n if (!ATON.VRoadcast.socket || ATON.VRoadcast.uid === undefined){ // || MediaRec._auAVGvolume <= MediaRec.auMinVol\r\n if (onFinish) onFinish();\r\n return;\r\n }\r\n\r\n ATON.VRoadcast.socket.compress(false).emit(\"UTALK\", {\r\n audio: b64,\r\n uid: ATON.VRoadcast.uid,\r\n //vol: MediaRec._auAVGvolume\r\n }); \r\n \r\n if (onFinish) onFinish();\r\n return;\r\n });\r\n/*\r\n console.log(\"sending blob...\"+rblob.size);\r\n\r\n ATON.VRoadcast.socket.compress(false).emit(\"UTALK\", {\r\n blob: rblob,\r\n uid: ATON.VRoadcast.uid,\r\n vol: MediaRec._auAVGvolume\r\n });\r\n\r\n if (onFinish) onFinish();\r\n*/\r\n //if (onFinish) onFinish();\r\n });\r\n};\r\n\r\nMediaRec._onAuBlob = (rblob)=>{\r\n if (!rblob) return;\r\n if (!ATON.VRoadcast.socket) return;\r\n //if (ATON.vroadcast._auAVGvolume <= ATON.vroadcast.minAuVol) return;\r\n\r\n //console.log(\"sending blob...\"+rblob.size);\r\n\r\n ATON.VRoadcast.socket.emit(\"UTALK\", {\r\n blob: rblob,\r\n uid: ATON.VRoadcast.uid,\r\n vol: MediaRec._auAVGvolume\r\n });\r\n};\r\n\r\n// Audio Recording\r\nMediaRec.startRecording = ()=>{\r\n MediaRec.realizeAudioRecorder(()=>{\r\n\r\n if (!MediaRec.recorder) return;\r\n if (MediaRec._bAudioRecording) return;\r\n\r\n console.log(\"Recording...\");\r\n\r\n MediaRec.recorder.startRecording();\r\n MediaRec._bAudioRecording = true;\r\n });\r\n};\r\n\r\nMediaRec.stopRecording = ()=>{\r\n if (!MediaRec.recorder) return;\r\n\r\n MediaRec.recorder.stopRecording(()=>{\r\n let rblob = MediaRec.recorder.getBlob();\r\n //let du = MediaRec.recorder.toURL();\r\n //console.log(du);\r\n\r\n console.log(\"Stop recording.\");\r\n\r\n let reader = new FileReader();\r\n reader.readAsDataURL(rblob); \r\n reader.onloadend = ()=>{\r\n let base64data = reader.result; \r\n //console.log(base64data);\r\n ATON.fireEvent(\"AudioRecordCompleted\", base64data);\r\n }\r\n\r\n MediaRec._bAudioRecording = false;\r\n });\r\n};\r\n\r\nMediaRec.startOrStopRecording = ()=>{\r\n if (MediaRec._bAudioRecording) MediaRec.stopRecording();\r\n else MediaRec.startRecording();\r\n};\r\n\r\nMediaRec._streamChunk = ()=>{\r\n if (!MediaRec.recorder) return;\r\n if (!MediaRec._bStreaming) return;\r\n\r\n MediaRec._stopRecAndSend(()=>{ \r\n MediaRec.recorder.startRecording();\r\n });\r\n};\r\n\r\n// Audio Streaming\r\nMediaRec.startMediaStreaming = ()=>{\r\n MediaRec.realizeAudioRecorder(()=>{\r\n if (!MediaRec.recorder) return;\r\n if (MediaRec._bAudioRecording) return;\r\n\r\n //MediaRec.recorder.stopRecording(()=>{\r\n console.log(\"Start MediaStreaming\");\r\n\r\n MediaRec.recorder.startRecording();\r\n MediaRec._bAudioRecording = true;\r\n MediaRec._bStreaming = true;\r\n //});\r\n });\r\n};\r\n\r\nMediaRec.stopMediaStreaming = ()=>{\r\n if (!MediaRec.recorder) return;\r\n if (!MediaRec._bAudioRecording) return;\r\n\r\n console.log(\"Stop MediaStreaming\");\r\n\r\n MediaRec._stopRecAndSend(()=>{\r\n //MediaRec._bStreaming = false;\r\n //MediaRec._bAudioRecording = false;\r\n });\r\n\r\n MediaRec._bStreaming = false;\r\n MediaRec._bAudioRecording = false;\r\n\r\n/*\r\n MediaRec._stopRecAndSend(()=>{\r\n clearInterval(MediaRec._dMediaRecorder);\r\n MediaRec._bAudioRecording = false;\r\n });\r\n*/\r\n};\r\n\r\nMediaRec.startOrStopMediaStreaming = ()=>{\r\n if (MediaRec._bAudioRecording) MediaRec.stopMediaStreaming();\r\n else MediaRec.startMediaStreaming();\r\n};\r\n\r\nexport default MediaRec;","/*\r\n ATON GeoLoc\r\n Outdoor geolocation tracking and Geo-POI handling\r\n TODO: rename\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nOutdoor geolocation tracking and Geo-POI handling\r\n@namespace GeoLoc\r\n*/\r\nlet GeoLoc = {};\r\n\r\n//GeoLoc.INTERVAL = 1000;\r\nGeoLoc.EARTH_R_KM = 6371.0;\r\nGeoLoc.EARTH_D_KM = GeoLoc.EARTH_R_KM * 2.0;\r\n\r\n\r\nGeoLoc.init = ()=>{\r\n GeoLoc._bActive = false;\r\n\r\n GeoLoc._wpid = undefined;\r\n GeoLoc._currPos = new THREE.Vector2();\r\n\r\n // POIs\r\n GeoLoc._POIs = [];\r\n GeoLoc._currPOI = undefined; // POI we are inside if any\r\n GeoLoc._closestPOI = undefined; // closest POI\r\n\r\n GeoLoc._maxError = 40.0; // max accuracy error allowed\r\n};\r\n\r\n/**\r\nEnable geolocation tracking\r\n*/\r\nGeoLoc.enableTracking = ()=>{\r\n if (GeoLoc._bActive) return;\r\n if (!ATON.Utils.isConnectionSecure()) return;\r\n if (!navigator.geolocation) return;\r\n\r\n GeoLoc._wpid = navigator.geolocation.watchPosition(\r\n GeoLoc._onPosition,\r\n GeoLoc._onError,\r\n {\r\n enableHighAccuracy: true,\r\n //maximumAge : 30000,\r\n //timeout : 27000\r\n } \r\n );\r\n\r\n //window.setInterval( GeoLoc.update, GeoLoc.INTERVAL);\r\n \r\n GeoLoc._bActive = true;\r\n};\r\n\r\n/**\r\nDisable geolocation tracking\r\n*/\r\nGeoLoc.disableTracking = ()=>{\r\n if (!GeoLoc._bActive) return;\r\n \r\n navigator.geolocation.clearWatch(GeoLoc._wpid);\r\n GeoLoc._bActive = false;\r\n};\r\n\r\n/**\r\nSet max error allowed for location tracking\r\n@param {number} - the error (meters)\r\n*/\r\nGeoLoc.setMaxError = (r)=>{\r\n if (r > 0.0) GeoLoc._maxError = r;\r\n};\r\n\r\nGeoLoc._onError = ()=>{\r\n console.log(\"Geolocation error\");\r\n};\r\n\r\nGeoLoc._onPosition = (pos)=>{\r\n if (!GeoLoc._bActive) return;\r\n if (!pos.coords) return;\r\n\r\n // filter locations\r\n let acc = pos.coords.accuracy;\r\n if (acc && acc > GeoLoc._maxError) return;\r\n\r\n // update current location\r\n GeoLoc._currPos.x = pos.coords.latitude;\r\n GeoLoc._currPos.y = pos.coords.longitude;\r\n\r\n //console.log(pos.coords.latitude+\",\"+pos.coords.longitude);\r\n //console.log(pos);\r\n\r\n ATON.fireEvent(\"GeoLocation\", pos);\r\n\r\n GeoLoc._handlePOIs();\r\n};\r\n\r\nGeoLoc._handlePOIs = ()=>{\r\n let numPOIs = GeoLoc._POIs.length;\r\n if (numPOIs <= 0) return;\r\n\r\n GeoLoc._closestPOIdist = undefined;\r\n GeoLoc._closestPOI = undefined;\r\n\r\n for (let i=0; i{\r\n if (!GeoLoc._bActive) return undefined;\r\n\r\n return GeoLoc._currPos;\r\n};\r\n\r\nGeoLoc.locationFromLatLon = (lat, lon)=>{\r\n return new THREE.Vector2( lat, lon );\r\n};\r\n\r\n// Distance between two locations (in meters)\r\nGeoLoc.distance_orig = (latlonA, latlonB)=>{\r\n let dLat = ATON.DEG2RAD * (latlonB.x - latlonA.x); // deg2rad\r\n let dLon = ATON.DEG2RAD * (latlonB.y - latlonA.y); \r\n let a = \r\n Math.sin(dLat/2) * Math.sin(dLat/2) +\r\n Math.cos(ATON.DEG2RAD * latlonA.x) * Math.cos(ATON.DEG2RAD * latlonB.x) * \r\n Math.sin(dLon/2) * Math.sin(dLon/2);\r\n\r\n let c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); \r\n let d = GeoLoc.EARTH_R_KM * c; // Distance in km\r\n \r\n return d * 1000.0;\r\n};\r\n\r\n/**\r\nGet distance (meters) between two geo-locations\r\nre-adapted from https://stackoverflow.com/questions/27928/calculate-distance-between-two-latitude-longitude-points-haversine-formula\r\n@param {THREE.Vector2} latlonA - location A (lat,lon)\r\n@param {THREE.Vector2} latlonB - location B (lat,lon)\r\n@returns {number} - distance (meters)\r\n*/\r\nGeoLoc.distance = (latlonA, latlonB)=>{\r\n let a = 0.5 - Math.cos((latlonB.x - latlonA.x) * ATON.DEG2RAD)/2.0 + \r\n Math.cos(latlonA.x * ATON.DEG2RAD) * Math.cos(latlonB.x * ATON.DEG2RAD) * \r\n (1.0 - Math.cos((latlonB.y - latlonA.y) * ATON.DEG2RAD))/2.0;\r\n\r\n let d = GeoLoc.EARTH_D_KM * Math.asin(Math.sqrt(a));\r\n\r\n return d * 1000.0;\r\n};\r\n\r\n/**\r\nAdd a Geo-POI (point-of-interest) in given location (lat,lon) and radius.\r\nYou can handle enter/leave POI events using ATON.on(\"EnterPOI\") and ATON.on(\"LeavePOI\")\r\n@param {THREE.Vector2} P - the (lat,lon) pair\r\n@param {number} r - the radius (meters)\r\n*/\r\nGeoLoc.addPOI = (P, r)=>{\r\n let POI = {};\r\n POI.pos = new THREE.Vector2(P.x,P.y);\r\n POI.radius = r;\r\n\r\n GeoLoc._POIs.push(POI);\r\n\r\n if (!GeoLoc._bActive) GeoLoc.enableTracking();\r\n\r\n //console.log(\"Added POI:\");\r\n //console.log(POI);\r\n\r\n GeoLoc._handlePOIs();\r\n\r\n return (GeoLoc._POIs.length - 1);\r\n};\r\n\r\nGeoLoc.getPOIbyIndex = (i)=>{\r\n return GeoLoc._POIs[i];\r\n};\r\n\r\n/**\r\nGet index of closest Geo-POI\r\n@returns {number} - index\r\n*/\r\nGeoLoc.getClosestPOI = ()=>{\r\n return GeoLoc._closestPOI;\r\n};\r\n\r\n/**\r\nGet distance (meters) to the closest Geo-POI\r\n@returns {number} - distance (meters)\r\n*/\r\nGeoLoc.getClosestPOIdistance = ()=>{\r\n return GeoLoc._closestPOIdist;\r\n};\r\n\r\n\r\n// Main update routine\r\n/*\r\nGeoLoc.update = ()=>{\r\n if (!GeoLoc._bActive) return;\r\n\r\n //navigator.geolocation.watchPosition(GeoLoc._onPosition);\r\n\r\n //let P = GeoLoc.locationFromLatLon(42.06047573760282, 12.588698649224982);\r\n //console.log( GeoLoc.distance(GeoLoc._currPos, P) );\r\n};\r\n*/\r\n\r\nexport default GeoLoc;","/*\r\n ATON App Hub\r\n Web-Apps\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n//import AppData from \"./ATON.appdata.js\";\r\n\r\n/**\r\nATON App Hub\r\n@namespace AppHub\r\n*/\r\nlet AppHub = {};\r\n\r\n// Realize the hub\r\nAppHub.init = ()=>{\r\n AppHub._appid = $(\"meta[name='aton\\\\:appid']\").attr(\"content\");\r\n AppHub._appdata = {};\r\n};\r\n\r\n// Send JSON patch\r\n// TODO: https://tools.ietf.org/html/rfc6902\r\nAppHub._sendDataPatch = (id, patch, mode)=>{\r\n return new Promise((resolve, reject)=>{\r\n if (id === undefined){\r\n reject(\"No storage ID specified\");\r\n return;\r\n }\r\n if (id.length < 3){\r\n reject(\"Storage ID too short\");\r\n return;\r\n }\r\n if (patch === undefined){\r\n reject(\"No storage patch\");\r\n return;\r\n }\r\n if (AppHub._appid === undefined){\r\n reject(\"No app-ID\");\r\n return;\r\n }\r\n\r\n if (mode === undefined) mode = ATON.PATCH_ADD;\r\n\r\n let O = {};\r\n O.wappid = AppHub._appid;\r\n O.fid = id;\r\n O.data = patch;\r\n O.mode = (mode === ATON.PATCH_DEL)? \"DEL\" : \"ADD\";\r\n\r\n let jstr = JSON.stringify(O);\r\n //console.log(jstr);\r\n\r\n $.ajax({\r\n url: ATON.PATH_RESTAPI+\"patch/wapp\",\r\n type:\"POST\",\r\n data: jstr,\r\n contentType:\"application/json; charset=utf-8\",\r\n dataType:\"json\",\r\n\r\n success: (r)=>{\r\n if (r === undefined){\r\n reject(\"Error writing on server\");\r\n return;\r\n }\r\n\r\n AppHub._appdata[id] = r;\r\n resolve(r);\r\n }\r\n });\r\n });\r\n};\r\n\r\n/**\r\nGet current web-app ID\r\n@returns {string} - web-app ID\r\n*/\r\nAppHub.getAppID = ()=>{\r\n return AppHub._appid;\r\n};\r\n\r\n/**\r\nAdd data to persistent, server-side storage of current web-app\r\n@param {object} id - server-side storage ID\r\n@param {object} patch - a javascript object patch\r\n@example\r\nATON.AppHub.addToStorage(\"myStorage\", {score: 20}).then(...)\r\n*/\r\nAppHub.addToStorage = (id, patch)=>{\r\n //AppHub._sendDataPatch(id, patch, ATON.PATCH_ADD, onComplete);\r\n return AppHub._sendDataPatch(id, patch, ATON.PATCH_ADD);\r\n};\r\n\r\n/**\r\nDelete data from server-side storage of current web-app\r\n@param {object} id - server-side storage ID\r\n@param {object} patch - a javascript object patch\r\n@example\r\nATON.AppHub.deleteFromStorage(\"myStorage\", {score: {}}).then(...)\r\n*/\r\nAppHub.deleteFromStorage = (id, patch)=>{\r\n //AppHub._sendDataPatch(id, patch, ATON.PATCH_DEL, onComplete);\r\n return AppHub._sendDataPatch(id, patch, ATON.PATCH_DEL);\r\n};\r\n\r\n/**\r\nGet content of server-side storage for current web-app\r\n@param {object} id - server-side storage ID\r\n@example\r\nATON.AppHub.getStorage(\"myStorage\").then((s)=>{ console.log(s); })\r\n*/\r\nAppHub.getStorage = (id)=>{\r\n return new Promise((resolve, reject)=>{\r\n if (AppHub._appid === undefined){\r\n reject();\r\n return;\r\n }\r\n if (id === undefined){\r\n reject(\"No storage ID specified\");\r\n return;\r\n }\r\n\r\n $.getJSON( ATON.PATH_WAPPS+AppHub._appid+\"/data/\"+id+\".json\", (data)=>{\r\n console.log(data);\r\n AppHub._appdata[id] = data;\r\n resolve(data);\r\n });\r\n });\r\n\r\n};\r\n\r\n\r\nexport default AppHub;","/*\r\n ATON post-process FX\r\n\r\n author: bruno.fanini_AT_gmail.com\r\n\r\n===========================================================*/\r\n\r\n/**\r\nATON post-process FX\r\n@namespace FX\r\n*/\r\nlet FX = {};\r\n\r\nFX.PASS_BASE = 0;\r\nFX.PASS_AA = 1;\r\nFX.PASS_AO = 2;\r\nFX.PASS_SSR = 3;\r\nFX.PASS_BLOOM = 4;\r\nFX.PASS_DOF = 5;\r\nFX.PASS_GAMMA = 6;\r\n\r\n\r\n// Initialization (main renderer must be initialized already)\r\nFX.init = ()=>{\r\n if (ATON._renderer === undefined) return;\r\n\r\n FX.composer = new THREE.EffectComposer( ATON._renderer );\r\n FX.passes = [];\r\n\r\n ATON._renderer.autoClear = false;\r\n\r\n let CW = window.innerWidth * ATON._stdpxd;\r\n let CH = window.innerHeight * ATON._stdpxd;\r\n\r\n // Base pass\r\n FX.passes[FX.PASS_BASE] = new THREE.RenderPass( ATON._mainRoot, ATON.Nav._camera );\r\n FX.composer.addPass( FX.passes[FX.PASS_BASE] );\r\n //console.log(FX.passes[FX.PASS_BASE]);\r\n\r\n\r\n // SSR - TODO: check for variable rou implementation\r\n/*\r\n FX.passes[ATON.FXPASS_SSR] = new THREE.SSRPass({\r\n renderer: ATON._renderer,\r\n scene: ATON._mainRoot, \r\n camera: ATON.Nav._camera,\r\n //width: window.innerWidth * 0.1,\r\n //height: window.innerHeight * 0.1,\r\n //encoding: THREE.sRGBEncoding\r\n });\r\n\r\n FX.passes[ATON.FXPASS_SSR].thickness = 0.018;\r\n FX.passes[ATON.FXPASS_SSR].infiniteThick = false; //true;\r\n FX.passes[ATON.FXPASS_SSR].maxDistance = 1.0; //0.1;\r\n console.log(FX.passes[ATON.FXPASS_SSR]);\r\n\r\n FX.composer.addPass( FX.passes[ATON.FXPASS_SSR] );\r\n*/\r\n\r\n\r\n // Ambient Occlusion\r\n FX.passes[FX.PASS_AO] = new THREE.SAOPass( ATON._mainRoot, ATON.Nav._camera, false, true );\r\n FX.passes[FX.PASS_AO].params.saoBias = 1.0;\r\n FX.passes[FX.PASS_AO].params.saoScale = 100;\r\n FX.passes[FX.PASS_AO].params.saoIntensity = 0.2; //0.2 //0.005;\r\n //FX.passes[FX.PASS_AO].params.saoBlurRadius = 5;\r\n \r\n //FX.passes[FX.PASS_AO].params.saoKernelRadius = 200;\r\n \r\n //FX.passes[FX.PASS_AO].params.saoBlurStdDev = 10.0;\r\n //FX.passes[FX.PASS_AO].params.saoBlurDepthCutoff = 0.2;\r\n //FX.passes[FX.PASS_AO].params.saoMinResolution = 0.01;\r\n\r\n //console.log(FX.passes[FX.PASS_AO]);\r\n\r\n // Sobel\r\n/*\r\n const effectSobel = new THREE.ShaderPass( THREE.SobelOperatorShader );\r\n effectSobel.uniforms[ 'resolution' ].value.x = window.innerWidth * ATON._stdpxd;\r\n effectSobel.uniforms[ 'resolution' ].value.y = window.innerHeight * ATON._stdpxd;\r\n*/\r\n\r\n // Bloom\r\n FX.passes[FX.PASS_BLOOM] = new THREE.UnrealBloomPass( new THREE.Vector2( CW,CH ), 1.5, 0.4, 0.85 );\r\n FX.passes[FX.PASS_BLOOM].threshold = 0.9\r\n FX.passes[FX.PASS_BLOOM].strength = 1.0; //0.5;\r\n FX.passes[FX.PASS_BLOOM].radius = 0.0;\r\n //console.log(FX.passes[FX.PASS_BLOOM])\r\n\r\n\r\n // DOF\r\n let fa = 7.0;\r\n FX.passes[FX.PASS_DOF] = new THREE.BokehPass( ATON._mainRoot, ATON.Nav._camera, {\r\n focus: 5.0,\r\n aperture: 0.001, //1.0/(fa*100.0),\r\n maxblur: 0.01,\r\n\r\n width: CW, //window.innerWidth,\r\n height: CH //window.innerHeight\r\n });\r\n //console.log(FX.passes[FX.PASS_DOF]);\r\n\r\n\r\n // Gamma correction\r\n FX.passes[FX.PASS_GAMMA] = new THREE.ShaderPass( THREE.GammaCorrectionShader );\r\n\r\n // Antialiasing\r\n FX.passes[FX.PASS_AA] = new THREE.ShaderPass( THREE.FXAAShader );\r\n //FX.passes[FX.PASS_AA].renderToScreen = false;\r\n let UU = FX.passes[FX.PASS_AA].material.uniforms;\r\n UU.resolution.value.set( (1/CW), (1/CH) );\r\n/*\r\n FX.passes[FX.PASS_AA] = new THREE.SSAARenderPass( ATON._mainRoot, ATON.Nav._camera, 0x000000, 0);\r\n FX.passes[FX.PASS_AA].sampleLevel = 4;\r\n FX.passes[FX.PASS_AA].unbiased = true;\r\n FX.passes[FX.PASS_AA].setSize(CW,CH);\r\n*/\r\n/*\r\n FX.passes[FX.PASS_AA] = new THREE.TAARenderPass( ATON._mainRoot, ATON.Nav._camera );\r\n\tFX.passes[FX.PASS_AA].unbiased = true;\r\n FX.passes[FX.PASS_AA].accumulate = false;\r\n*/\r\n //FX.passes[FX.PASS_AA] = new THREE.SMAAPass( CW,CH );\r\n\r\n\r\n // Order\r\n FX.composer.addPass( FX.passes[FX.PASS_AO] );\r\n FX.composer.addPass( FX.passes[FX.PASS_BLOOM] );\r\n // tone-mapping passes here (if any)\r\n FX.composer.addPass( FX.passes[FX.PASS_GAMMA] );\r\n FX.composer.addPass( FX.passes[FX.PASS_AA] );\r\n //FX.composer.addPass( effectSobel );\r\n FX.composer.addPass( FX.passes[FX.PASS_DOF] );\r\n\r\n //FX.composer.addPass( FX.passes[FX.PASS_AA] );\r\n\r\n // Defaults\r\n FX.togglePass(FX.PASS_AO, false);\r\n FX.togglePass(FX.PASS_BLOOM, false);\r\n FX.togglePass(FX.PASS_DOF, false);\r\n\r\n //for (let p in FX.passes) FX.passes[p].renderToScreen = true;\r\n console.log(FX.composer);\r\n};\r\n\r\n// Switch on off passes\r\nFX.togglePass = (pass, b)=>{\r\n if (FX.composer === undefined) return;\r\n if (ATON.device.lowGPU) return; // no fx passes on low GPU for now\r\n\r\n let P = FX.passes[pass];\r\n if (P === undefined) return;\r\n\r\n if (b === undefined) FX.passes[pass].enabled = !FX.passes[pass].enabled;\r\n else FX.passes[pass].enabled = b;\r\n};\r\n\r\nFX.isPassEnabled = (pass)=>{\r\n if (FX.composer === undefined) return false;\r\n\r\n let P = FX.passes[pass];\r\n if (P === undefined) return false;\r\n\r\n return FX.passes[pass].enabled; \r\n};\r\n\r\n\r\n// FX Passes params\r\n//======================================================\r\n\r\nFX.setAOintensity = (f)=>{\r\n if (FX.composer === undefined) return;\r\n if (FX.passes[FX.PASS_AO] === undefined) return;\r\n\r\n FX.passes[FX.PASS_AO].params.saoIntensity = f;\r\n};\r\nFX.getAOintensity = ()=>{\r\n if (FX.composer === undefined) return 0.0;\r\n if (FX.passes[FX.PASS_AO] === undefined) return 0.0;\r\n return FX.passes[FX.PASS_AO].params.saoIntensity;\r\n};\r\n\r\nFX.setBloomStrength = (f)=>{\r\n if (FX.composer === undefined) return;\r\n if (FX.passes[FX.PASS_BLOOM] === undefined) return;\r\n\r\n FX.passes[FX.PASS_BLOOM].strength = f;\r\n};\r\nFX.getBloomStrength = ()=>{\r\n if (FX.composer === undefined) return 0.0;\r\n if (FX.passes[FX.PASS_BLOOM] === undefined) return 0.0;\r\n return FX.passes[FX.PASS_BLOOM].strength;\r\n};\r\n\r\nFX.setBloomThreshold = (f)=>{\r\n if (FX.composer === undefined) return;\r\n if (FX.passes[FX.PASS_BLOOM] === undefined) return;\r\n\r\n FX.passes[FX.PASS_BLOOM].threshold = f;\r\n};\r\nFX.getBloomThreshold = ()=>{\r\n if (FX.composer === undefined) return 0.0;\r\n if (FX.passes[FX.PASS_BLOOM] === undefined) return 0.0;\r\n return FX.passes[FX.PASS_BLOOM].threshold;\r\n};\r\n\r\nFX.setDOFfocus = (f)=>{\r\n if (FX.composer === undefined) return;\r\n if (FX.passes[FX.PASS_DOF] === undefined) return;\r\n\r\n let UU = FX.passes[FX.PASS_DOF].uniforms;\r\n if (UU === undefined) return;\r\n\r\n UU['focus'].value = f;\r\n};\r\nFX.getDOFfocus = ()=>{\r\n if (FX.composer === undefined) return 0.0;\r\n if (FX.passes[FX.PASS_DOF] === undefined) return 0.0;\r\n\r\n let UU = FX.passes[FX.PASS_DOF].uniforms;\r\n if (UU === undefined) return 0.0;\r\n\r\n return UU['focus'].value;\r\n};\r\n\r\nFX.setDOFaperture = (f)=>{\r\n if (FX.composer === undefined) return;\r\n if (FX.passes[FX.PASS_DOF] === undefined) return;\r\n\r\n let UU = FX.passes[FX.PASS_DOF].uniforms;\r\n if (UU === undefined) return;\r\n\r\n UU['aperture'].value = f;\r\n};\r\n\r\nexport default FX;","/*!\r\n @preserve\r\n\r\n \tATON\r\n\r\n \t@author Bruno Fanini\r\n\tVHLab, CNR ISPC\r\n\r\n==================================================================================*/\r\n\r\n'use strict';\r\n\r\n/**\r\n@namespace ATON\r\n*/\r\nlet ATON = {};\r\nwindow.ATON = ATON;\r\n\r\n// Import\r\nimport Node from \"./ATON.node.js\";\r\nimport POV from \"./ATON.pov.js\";\r\n//import Period from \"./ATON.period.js\";\r\nimport LightProbe from \"./ATON.lightprobe.js\";\r\n\r\nimport EventHub from \"./ATON.eventhub.js\";\r\nimport MatHub from \"./ATON.mathub.js\";\r\nimport Utils from \"./ATON.utils.js\";\r\nimport SceneHub from \"./ATON.scenehub.js\";\r\nimport AudioHub from \"./ATON.audiohub.js\";\r\nimport Nav from \"./ATON.nav.js\";\r\nimport XR from \"./ATON.xr.js\";\r\nimport SUI from \"./ATON.sui.js\";\r\nimport VRoadcast from \"./ATON.vroadcast.js\";\r\nimport SemFactory from \"./ATON.semfactory.js\";\r\nimport FE from \"./ATON.fe.js\";\r\nimport MediaRec from \"./ATON.mediarec.js\";\r\nimport GeoLoc from \"./ATON.geoloc.js\";\r\nimport AppHub from \"./ATON.apphub.js\";\r\nimport FX from \"./ATON.fx.js\";\r\n\r\n// Classes\r\nATON.Node = Node;\r\nATON.POV = POV;\r\nATON.LightProbe = LightProbe;\r\n//ATON.Period = Period;\r\n\r\n// NS\r\nATON.EventHub = EventHub;\r\nATON.Utils = Utils;\r\nATON.SceneHub = SceneHub;\r\nATON.MatHub = MatHub;\r\nATON.Nav = Nav;\r\nATON.AudioHub = AudioHub;\r\nATON.XR = XR;\r\nATON.SUI = SUI;\r\nATON.VRoadcast = VRoadcast;\r\nATON.SemFactory = SemFactory;\r\nATON.FE = FE;\r\nATON.MediaRec = MediaRec;\r\nATON.GeoLoc = GeoLoc;\r\nATON.AppHub = AppHub;\r\nATON.FX = FX;\r\n\r\n//==============================================================\r\n// Consts\r\n//==============================================================\r\nATON.STD_UPVECTOR = new THREE.Vector3(0,1,0);\r\nATON.ROOT_NID = \".\"; // reserved node ID for graph-roots\r\n\r\nATON.RAD2DEG = (180.0 / Math.PI);\r\nATON.DEG2RAD = (Math.PI / 180.0);\r\n\r\nATON.PATCH_ADD = 0;\r\nATON.PATCH_DEL = 1;\r\n\r\n// Node types\r\nATON.NTYPES = {};\r\n// 1 and 2 are reserved\r\nATON.NTYPES.SCENE = 3;\r\nATON.NTYPES.SEM = 4;\r\nATON.NTYPES.UI = 5;\r\n\r\n// Folders\r\nATON.PATH_RESTAPI = window.location.origin + \"/api/\"; // \"../api/\";\r\nATON.PATH_RESTAPI_SCENE = ATON.PATH_RESTAPI + \"scene/\";\r\nATON.PATH_WAPPS = window.location.origin + \"/a/\";\r\nATON.PATH_MODS = window.location.origin + \"/mods/\"; // \"../mods/\";\r\n//ATON.PATH_THREE = ATON.PATH_MODS + \"three/\";\r\nATON.PATH_DRACO_LIB = window.location.origin + \"/dist/draco/\"; //ATON.PATH_THREE+\"examples/js/libs/draco/\";\r\nATON.PATH_BASIS_LIB = window.location.origin + \"/dist/basis/\"; //ATON.PATH_THREE+\"examples/js/libs/basis/\";\r\nATON.PATH_IFC_LIB = window.location.origin + \"/dist/ifc/\";\r\n\r\nATON.PATH_COLLECTION = window.location.origin + \"/collections/\"; // \"../collection/\";\r\nATON.PATH_SCENES = window.location.origin + \"/scenes/\"; // \"../scenes/\";\r\nATON.PATH_RES = window.location.origin + \"/res/\"; // \"../res/\";\r\nATON.PATH_FE = window.location.origin + \"/fe/\"; // \"../res/\";\r\n\r\nATON.SHADOWS_NEAR = 0.1;\r\nATON.SHADOWS_FAR = 50.0; //50.0;\r\nATON.SHADOWS_SIZE = 15.0;\r\nATON.SHADOWS_RES = 1024; // 512\r\n\r\nATON.AMB_L = 0.1; // Ambient when using direct lighting\r\n\r\n\r\n/**\r\nSet path collection (3D models, audio, panoramas, ...)\r\n@param {string} path - path\r\n*/\r\nATON.setPathCollection = (path)=>{\r\n ATON.PATH_COLLECTION = /*window.location.origin + */path;\r\n //ATON.PATH_MODELS = ATON.PATH_COLLECTION+\"models/\";\r\n};\r\n\r\n/**\r\nSet path scenes\r\n@param {string} path - path\r\n*/\r\nATON.setPathScenes = (path)=>{\r\n ATON.PATH_SCENES = /*window.location.origin +*/ path;\r\n};\r\n\r\n// For resuming suspended audio/video streams\r\nATON._onUserInteraction = ()=>{\r\n if (ATON._elPanoVideo && !ATON._vpanoPlaying) ATON._elPanoVideo.play();\r\n if (ATON.AudioHub._listener.context.state === 'suspended') ATON.AudioHub._listener.context.resume();\r\n};\r\n\r\nATON._setupBaseListeners = ()=>{\r\n let el = ATON._renderer.domElement;\r\n\r\n window.addEventListener( 'resize', ATON._onResize, false );\r\n window.onorientationchange = ATON._readDeviceOrientationMode;\r\n\r\n if (screenfull.isEnabled){\r\n\t screenfull.on('change', ()=>{\r\n ATON._bFS = screenfull.isFullscreen;\r\n ATON.fireEvent(\"Fullscreen\", ATON._bFS);\r\n\r\n\t\t if (ATON._bFS) console.log(\"Now fullscreen\");\r\n else console.log(\"Exit fullscreen\");\r\n\t });\r\n }\r\n\r\n/*\r\n document.addEventListener('webkitfullscreenchange', ATON._onFSchange, false);\r\n document.addEventListener('mozfullscreenchange', ATON._onFSchange, false);\r\n document.addEventListener('fullscreenchange', ATON._onFSchange, false);\r\n document.addEventListener('MSFullscreenChange', ATON._onFSchange, false);\r\n*/\r\n el.addEventListener( 'mousemove', ATON._updateScreenMove, false );\r\n ///el.addEventListener('dblclick', ATON._doubleTap, false);\r\n\r\n el.addEventListener('mousedown', (e)=>{\r\n if (e.button === 1) ATON.fireEvent(\"MouseMidButton\"); // middle-click\r\n if (e.button === 2) ATON.fireEvent(\"MouseRightButton\"); // right-click\r\n });\r\n\r\n el.addEventListener( 'wheel', ATON._onMouseWheel, false );\r\n\r\n // Generic pointer\r\n ATON._bPointerDown = false;\r\n window.addEventListener('pointerdown', (e)=>{\r\n ATON._bPointerDown = true;\r\n ATON._onUserInteraction();\r\n });\r\n window.addEventListener('pointerup', (e)=>{\r\n ATON._bPointerDown = false;\r\n });\r\n window.addEventListener('pointermove', (e)=>{\r\n if (!ATON._bPointerDown) return;\r\n\r\n ATON._updateScreenMove(e);\r\n ATON._handleQueries();\r\n });\r\n\r\n window.addEventListener('touchstart', (e)=>{\r\n ATON._bPointerDown = true;\r\n ATON._onUserInteraction();\r\n });\r\n window.addEventListener('touchend', (e)=>{\r\n ATON._bPointerDown = false;\r\n });\r\n window.addEventListener('touchmove', (e)=>{\r\n if (!ATON._bPointerDown) return;\r\n\r\n ATON._updateScreenMove(e.touches[0]);\r\n ATON._handleQueries();\r\n });\r\n\r\n/*\r\n Hammer(el).on(\"press pressup\", (ev)=>{\r\n\r\n // Hold gesture start (press)\r\n if (ev.type == \"press\") {\r\n console.log(\"Hold active\");\r\n }\r\n\r\n // Hold gesture stop (pressup)\r\n if (ev.type == \"pressup\") {\r\n console.log(\"Hold inactive\");\r\n }\r\n });\r\n*/\r\n // Touch events\r\n Hammer(el).on(\"doubletap\", (e)=>{\r\n ATON._bPointerDown = false;\r\n ATON.fireEvent(\"DoubleTap\", e.srcEvent);\r\n //console.log(e.srcEvent);\r\n });\r\n\r\n Hammer(el).on(\"tap\", (e)=>{\r\n //ATON._evPointer = e.srcEvent;\r\n ATON._bPointerDown = false;\r\n\r\n ATON._onUserInteraction();\r\n\r\n ATON._updateScreenMove(e.srcEvent);\r\n ATON._handleQueries();\r\n\r\n ATON.fireEvent(\"Tap\", e.srcEvent);\r\n //console.log(e.srcEvent);\r\n\r\n // UI selection\r\n if (ATON._hoveredUI === undefined) return;\r\n let H = ATON.getUINode(ATON._hoveredUI);\r\n if (H && H.onSelect) H.onSelect();\r\n });\r\n\r\n ATON.on(\"DoubleTap\", (e)=>{\r\n //console.log(e);\r\n ATON.defaultDoubleTapFromScreenCoords(e);\r\n });\r\n\r\n\r\n // Keyboard\r\n ATON._kModShift = false;\r\n ATON._kModCtrl = false;\r\n\r\n ATON._bListenKeyboardEvents = true; // FIXME: check if there's a better way\r\n\r\n window.addEventListener(\"keydown\", (e)=>{\r\n //e.preventDefault();\r\n ATON._onUserInteraction();\r\n\r\n if (e.key === \"Shift\") ATON._kModShift = true;\r\n if (e.key === \"Control\") ATON._kModCtrl = true;\r\n \r\n if (!ATON._bListenKeyboardEvents) return;\r\n\r\n ATON.fireEvent(\"KeyPress\", e.key);\r\n //ATON.fireEvent(\"KeyPress/\"+e.key);\r\n }, false);\r\n\r\n window.addEventListener(\"keyup\", (e)=>{\r\n //e.preventDefault();\r\n\r\n if (e.key === \"Shift\") ATON._kModShift = false;\r\n if (e.key === \"Control\") ATON._kModCtrl = false;\r\n\r\n if (!ATON._bListenKeyboardEvents) return;\r\n\r\n ATON.fireEvent(\"KeyUp\", e.key);\r\n //ATON.fireEvent(\"KeyUp/\"+e.key);\r\n }, false);\r\n\r\n // Defaults\r\n ATON.on(\"KeyPress\", (k)=>{\r\n\r\n if (k==='+'){\r\n let f = ATON.Nav.getFOV() + 1.0;\r\n ATON.Nav.setFOV(f);\r\n }\r\n if (k==='-'){\r\n let f = ATON.Nav.getFOV() - 1.0;\r\n ATON.Nav.setFOV(f);\r\n }\r\n\r\n if (k==='PageUp'){\r\n let r = ATON.SUI.mainSelector.scale.x + 0.02;\r\n ATON.SUI.setSelectorRadius(r);\r\n }\r\n if (k==='PageDown'){\r\n let r = ATON.SUI.mainSelector.scale.x - 0.02;\r\n r = Math.max(r, 0.01);\r\n ATON.SUI.setSelectorRadius(r); \r\n }\r\n });\r\n\r\n // Default semantic highlight\r\n/*\r\n ATON.on(\"SemanticNodeLeave\", (semid)=>{\r\n let S = ATON.getSemanticNode(semid);\r\n if (S) S.restoreDefaultMaterial();\r\n });\r\n ATON.on(\"SemanticNodeHover\", (semid)=>{\r\n let S = ATON.getSemanticNode(semid);\r\n if (S) S.highlight();\r\n });\r\n*/ \r\n};\r\n\r\nATON._onResize = ()=>{\r\n ATON.Nav._camera.aspect = window.innerWidth / window.innerHeight;\r\n ATON.Nav._camera.updateProjectionMatrix();\r\n\r\n ATON._renderer.setSize( window.innerWidth, window.innerHeight );\r\n\r\n if (ATON.FX.composer){\r\n ATON.FX.composer.setSize( window.innerWidth, window.innerHeight );\r\n let UU = ATON.FX.passes[ATON.FX.PASS_AA].material.uniforms;\r\n if (UU) UU.resolution.value.set( (1/window.innerWidth), (1/window.innerHeight) );\r\n }\r\n \r\n console.log(\"onResize\");\r\n};\r\n\r\nATON._onMouseWheel = (e)=>{\r\n e.preventDefault();\r\n\r\n ATON.fireEvent(\"MouseWheel\", e.deltaY);\r\n};\r\n\r\nATON.focusOn3DView = ()=>{\r\n ATON._renderer.domElement.focus();\r\n};\r\n\r\n// Base/default routine on generic user activation\r\n// E.g. double-tap, VR controller trigger, etc.\r\nATON._SUIactivation = ()=>{\r\n const U = ATON.getUINode(ATON._hoveredUI);\r\n \r\n if (U === undefined) return false;\r\n if (U.onSelect === undefined) return false;\r\n\r\n U.onSelect();\r\n return true;\r\n};\r\n\r\n\r\nATON._stdActivation = ()=>{\r\n //if (!ATON.Nav._bControl) return;\r\n\r\n // Handle SUI nodes\r\n if (ATON._SUIactivation()) return;\r\n\r\n if (!ATON.Nav._bControl) return;\r\n\r\n // Handle active immersive AR/VR session\r\n if (ATON.XR._bPresenting){\r\n if (XR._sessionType === \"immersive-vr\") XR.teleportOnQueriedPoint();\r\n ATON.FE.playAudioFromSemanticNode(ATON._hoveredSemNode);\r\n return;\r\n }\r\n\r\n // Non-immersive sessions\r\n let bFPtrans = ATON.Nav.isFirstPerson() || ATON.Nav.isDevOri();\r\n\r\n // When first-person mode, teleport (non immersive)\r\n if (bFPtrans){\r\n if (ATON.Nav.currentQueryValidForLocomotion()){\r\n let P = ATON._queryDataScene.p;\r\n //let N = ATON._queryDataScene.n;\r\n\r\n let currDir = ATON.Nav._vDir;\r\n let feye = new THREE.Vector3(P.x, P.y+ATON.userHeight, P.z);\r\n let ftgt = new THREE.Vector3(\r\n feye.x + currDir.x,\r\n feye.y + currDir.y,\r\n feye.z + currDir.z,\r\n );\r\n\r\n let POV = new ATON.POV().setPosition(feye).setTarget(ftgt).setFOV(ATON.Nav._currPOV.fov);\r\n\r\n ATON.Nav.requestPOV(POV, 0.5);\r\n }\r\n return;\r\n }\r\n\r\n // In orbit mode, focus on selected SemNode...\r\n let hsn = ATON.getSemanticNode(ATON._hoveredSemNode);\r\n if (ATON._queryDataSem && hsn){\r\n ATON.Nav.requestPOVbyNode( hsn, 0.5);\r\n return;\r\n }\r\n // ...or perform standard retarget on picked surface point\r\n if (ATON._queryDataScene){\r\n ATON.Nav.requestRetarget(ATON._queryDataScene.p, /*ATON._queryDataScene.n*/undefined, 0.5);\r\n }\r\n\r\n // TODO: go POV in sight if any (panorama only mode)\r\n};\r\n\r\n// Default retarget from screen coordinates (eg.: on double tap)\r\nATON.defaultDoubleTapFromScreenCoords = (e)=>{\r\n ATON._updateScreenMove(e);\r\n ATON._handleQueryScene();\r\n\r\n ATON._stdActivation();\r\n}\r\n\r\n// Fullscreen\r\nATON.isFullscreen = ()=>{\r\n return ATON._bFS;\r\n/*\r\n if (document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement !== undefined){\r\n return true;\r\n }\r\n\r\n return false;\r\n*/\r\n};\r\n\r\n\r\nATON.toggleFullScreen = ()=>{\r\n screenfull.toggle();\r\n};\r\n\r\n\r\n//============================================================================\r\n// ATON init routines\r\n//============================================================================\r\n/**\r\nMain ATON initialization, it will take care of all sub-components initialization, device profiling and much more\r\n@example\r\nATON.realize()\r\n*/\r\nATON.realize = ()=>{\r\n console.log(\"Initialize ATON...\");\r\n\r\n ATON.Utils.init();\r\n ATON.Utils.profileDevice();\r\n \r\n //THREE.Object3D.DefaultUp = new THREE.Vector3(0,0,1); // mismatches WebXR y-up\r\n\r\n // Timing\r\n ATON._clock = new THREE.Clock(true);\r\n\r\n ATON._bFS = false; // fullscreen\r\n\r\n const wglopts = {\r\n //canvas: document.getElementById(\"View3D\"),\r\n antialias: true, //ATON.device.isMobile? false : true,\r\n alpha: false, //true,\r\n\r\n powerPreference: \"high-performance\",\r\n ///pecision: \"lowp\", //\"mediump\"\r\n //preserveDrawingBuffer: true\r\n };\r\n\r\n ATON._renderer = new THREE.WebGLRenderer(wglopts);\r\n ATON._renderer.setSize( window.innerWidth, window.innerHeight );\r\n //console.log(ATON._renderer);\r\n\r\n //ATON._renderer.domElement.style.filter = \"blur(10px)\";\r\n\r\n // Capabilities from initialized renderer\r\n ATON.Utils.profileRenderingCapabilities();\r\n\r\n ATON._stdpxd = 1.0;\r\n //ATON._stdpxd = window.devicePixelRatio? (window.devicePixelRatio) : 1.0;\r\n ATON._renderer.setPixelRatio( ATON._stdpxd );\r\n //console.log(ATON._stdpxd);\r\n\r\n // Framerate management\r\n ATON._fps = 60.0;\r\n ATON._dt = 0.01;\r\n ATON._dtAccum = 0.0;\r\n ATON._avgFPScount = 0.0;\r\n ATON._avgFPSaccum = 0.0;\r\n ATON._avgFPS = 60.0;\r\n\r\n ATON._bDynamicDensity = false; //true;\r\n ATON._dRenderBudgetMinFPS = 30.0;\r\n ATON._dRenderBudgetMaxFPS = 55.0;\r\n\r\n ATON._aniMixers = [];\r\n \r\n ATON._renderer.outputEncoding = THREE.sRGBEncoding;\r\n ATON._renderer.toneMapping = THREE.LinearToneMapping; // THREE.ACESFilmicToneMapping\r\n ATON._renderer.toneMappingExposure = 1.0;\r\n\r\n //console.log(ATON._renderer.getPixelRatio());\r\n\r\n ATON._renderer.setAnimationLoop( ATON._onFrame );\r\n //ATON._bDirtyLP = false;\r\n\r\n ATON._maxAnisotropy = ATON._renderer.capabilities.getMaxAnisotropy();\r\n //console.log(ATON._renderer.capabilities);\r\n\r\n THREE.Cache.enabled = true;\r\n\r\n ATON.userHeight = 1.7;\r\n \r\n document.body.appendChild( ATON._renderer.domElement );\r\n //console.log(ATON._renderer);\r\n \r\n let canvas = ATON._renderer.domElement;\r\n canvas.style.outline = \"none\";\r\n canvas.style.border = \"none\";\r\n //canvas.style.padding = \"0px\";\r\n //canvas.style.margin = \"0px\";\r\n //canvas.style.width = \"100%\";\r\n //canvas.style.height = \"100%\";\r\n\r\n // Multimedia\r\n ATON._vpanoPlaying = false;\r\n ATON._bUserInts = 0;\r\n\r\n ATON.EventHub.init();\r\n ATON.MatHub.init();\r\n\r\n //ATON._setupLoadManager();\r\n ATON._assetsManager = {};\r\n ATON._aLoader = new THREE.GLTFLoader(/*ATON._loadManager*/);\r\n ATON._numReqLoad = 0;\r\n \r\n ATON._dracoLoader = new THREE.DRACOLoader();\r\n ATON._dracoLoader.setDecoderConfig({type: \"wasm\"});\r\n ATON._dracoLoader.setDecoderPath( ATON.PATH_DRACO_LIB );\r\n ATON._dracoLoader.setWorkerLimit(2);\r\n ATON._dracoLoader.preload();\r\n ATON._aLoader.setDRACOLoader( ATON._dracoLoader );\r\n\r\n // CC Manager\r\n ATON._ccModels = [];\r\n\r\n // Update routines\r\n ATON._updRoutines = [];\r\n\r\n // Periods (TODO:)\r\n //ATON.periods = [];\r\n\r\n ATON._lps = []; // lightprobes\r\n ATON._bAutoLP = false;\r\n ATON._envMapInt = 1.0;\r\n //ATON._dirtyLPs = true;\r\n ATON._bShadowsFixedBound = false;\r\n ATON._shadowsFixedBoundCenter = undefined;\r\n\r\n ATON._shadowsNear = ATON.SHADOWS_NEAR;\r\n ATON._shadowsFar = ATON.SHADOWS_FAR;\r\n ATON._shadowsSize = ATON.SHADOWS_SIZE;\r\n ATON._shadowsRes = ATON.SHADOWS_RES;\r\n\r\n ATON.initGraphs();\r\n ATON.SceneHub.init();\r\n\r\n // TileSets (3D Tiles)\r\n ATON._tsets = [];\r\n\r\n // Init audio hub\r\n ATON.AudioHub.init();\r\n\r\n // Init nav system\r\n ATON.Nav.init();\r\n\r\n // XR\r\n ATON.XR.init();\r\n\r\n // Spatial UI\r\n ATON.SUI.init();\r\n\r\n // VRoadcast\r\n ATON.VRoadcast.init();\r\n\r\n // Media Recorder\r\n ATON.MediaRec.init();\r\n\r\n // Semantic Factory\r\n ATON.SemFactory.init();\r\n\r\n // App Hub\r\n ATON.AppHub.init();\r\n\r\n // GeoLoc\r\n ATON.GeoLoc.init();\r\n\r\n\r\n // FX Composer setup\r\n if (!ATON.device.lowGPU) ATON.FX.init();\r\n\r\n // Query / picked data\r\n ATON._queryDataScene = undefined;\r\n ATON._queryDataSem = undefined;\r\n ATON._queryDataUI = undefined;\r\n\r\n ATON._hoveredSemNode = undefined;\r\n ATON._hoveredUI = undefined;\r\n\r\n ATON._bQuerySemOcclusion = true;\r\n ATON._bQueryNormals = true;\r\n ATON._bPauseQuery = false;\r\n ATON._bCenteredQuery = false;\r\n \r\n ATON._bqScene = false;\r\n ATON._bqSem = false;\r\n\r\n // Timed Gaze Input\r\n ATON._tgiDur = undefined; // set to seconds (e.g. 2.0 to enable)\r\n ATON._tgiPer = undefined; // tgi percentage\r\n ATON._tHover = undefined;\r\n\r\n // Main Panorama\r\n ATON._bMainPanoInfinite = true;\r\n ATON._matMainPano = undefined;\r\n ATON._mMainPano = undefined;\r\n\r\n //window.setInterval(()=>{ if (!ATON._bPauseQuery) ATON._handleQueries(); }, 500 );\r\n\r\n\r\n // IFC\r\n/*\r\n ATON._ifcLoader = new IFCLoader();\r\n ATON._ifcLoader.setWasmPath( ATON.PATH_IFC_LIB );\r\n*/\r\n\r\n // Basis\r\n/*\r\n ATON._basisLoader = new BasisTextureLoader();\r\n ATON._basisLoader.setTranscoderPath( ATON.PATH_BASIS_LIB );\r\n ATON._basisLoader.detectSupport( ATON._renderer );\r\n \r\n // Register BasisTextureLoader for .basis extension.\r\n THREE.DefaultLoadingManager.addHandler( /\\.basis$/, ATON._basisLoader );\r\n*/\r\n\r\n\r\n // Mouse/Touch screen coords\r\n ATON._screenPointerCoords = new THREE.Vector2(0.0,0.0);\r\n\r\n // Ray casters\r\n ATON._rcScene = new THREE.Raycaster();\r\n ATON._rcScene.layers.set(ATON.NTYPES.SCENE);\r\n ATON._rcSemantics = new THREE.Raycaster();\r\n ATON._rcSemantics.layers.set(ATON.NTYPES.SEM);\r\n ATON._rcUI = new THREE.Raycaster();\r\n ATON._rcUI.layers.set(ATON.NTYPES.UI);\r\n\r\n ATON._registerRCS(); // not used for now\r\n\r\n ATON._setupBaseListeners();\r\n\r\n if (ATON.device.isMobile) ATON._readDeviceOrientationMode();\r\n\r\n ATON._wappID = undefined;\r\n\r\n // External API/services\r\n ATON._extAPItokens = {};\r\n\r\n ATON.focusOn3DView();\r\n};\r\n\r\n/**\r\nSet timed-gaze duration\r\n@param {number} dt - time to trigger activation\r\n*/\r\nATON.setTimedGazeDuration = (dt)=>{\r\n ATON._tgiDur = dt;\r\n};\r\n\r\n/**\r\nGet timed-gaze current progress (percentage)\r\n@returns {number}\r\n*/\r\nATON.getTimedGazeProgress = ()=>{\r\n if (ATON._tgiDur === undefined) return undefined;\r\n return ATON._tgiPer;\r\n};\r\n\r\n/**\r\nGet current elapsed time (global clock) since ATON initialization\r\n@returns {number}\r\n*/\r\nATON.getElapsedTime = ()=>{\r\n return ATON._clock.elapsedTime;\r\n};\r\n\r\n/**\r\nPause rendering\r\n*/\r\nATON.renderPause = ()=>{\r\n ATON._renderer.setAnimationLoop( undefined );\r\n};\r\n\r\n/**\r\nResume rendering (if paused)\r\n*/\r\nATON.renderResume = ()=>{\r\n ATON._renderer.setAnimationLoop( ATON._onFrame );\r\n};\r\n\r\nATON._setupLoadManager = ()=>{\r\n ATON._loadManager = new THREE.LoadingManager();\r\n ATON._loadManager.onStart = ( url, itemsLoaded, itemsTotal )=>{\r\n\t console.log( 'Started loading file: ' + url + '.\\nLoaded ' + itemsLoaded + ' of ' + itemsTotal + ' files.' );\r\n ATON.fireEvent(\"NodeRequestFired\", url);\r\n };\r\n\r\n ATON._loadManager.onLoad = ()=>{\r\n\t console.log( 'Loading complete!');\r\n ATON.fireEvent(\"AllNodeRequestsCompleted\");\r\n };\r\n\r\n ATON._loadManager.onProgress = ( url, itemsLoaded, itemsTotal )=>{\r\n\t //console.log( 'Loading file: ' + url + '.\\nLoaded ' + itemsLoaded + ' of ' + itemsTotal + ' files.' );\r\n };\r\n\r\n ATON._loadManager.onError = ( url )=>{\r\n\t console.log( 'There was an error loading ' + url );\r\n };\r\n};\r\n\r\n/**\r\nSet the default pixel density (standard is 1.0)\r\n@example\r\nATON.setDefaultPixelDensity(0.5)\r\n*/\r\nATON.setDefaultPixelDensity = (d)=>{\r\n ATON._stdpxd = d;\r\n\r\n ATON._renderer.setPixelRatio( d );\r\n\r\n if (ATON.FX.composer) ATON.FX.composer.setPixelRatio(d);\r\n\r\n // WebXR density\r\n if (ATON._renderer.xr === undefined) return;\r\n\r\n if (ATON.device.isMobile) ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd * ATON.XR.MOBILE_DENSITY_F);\r\n else ATON._renderer.xr.setFramebufferScaleFactor(ATON._stdpxd);\r\n //ATON._renderer.xr.setFramebufferScaleFactor(1.0);\r\n};\r\n\r\n/**\r\nReset pixel density to default\r\n*/\r\nATON.resetPixelDensity = ()=>{\r\n ATON._renderer.setPixelRatio( ATON._stdpxd );\r\n};\r\n\r\nATON._readDeviceOrientationMode = ()=>{\r\n if (Math.abs(window.orientation) === 90){\r\n console.log(\"Landscape Mode\");\r\n ATON.fireEvent(\"MobileLandscapeMode\");\r\n }\r\n else {\r\n console.log(\"Portrait Mode\");\r\n ATON.fireEvent(\"MobilePortraitMode\");\r\n }\r\n\r\n setTimeout( ATON._onResize, 500);\r\n};\r\n\r\n\r\n//============================================================================\r\n// Scene-graphs\r\n//============================================================================\r\nATON.snodes = {}; // Visible scene-graph\r\nATON.semnodes = {}; // Semantics graph\r\nATON.uinodes = {}; // UI graph\r\n\r\n// Visible scene-graph\r\n//=============================================\r\n/**\r\nCreate a scene node (visible scene-graph)\r\n@param {string} id - a string representing unique ID of the node (optional)\r\n@returns {Node}\r\n*/\r\nATON.createSceneNode = (id)=>{\r\n return new ATON.Node(id, ATON.NTYPES.SCENE);\r\n};\r\n\r\n/**\r\nGet a previously created scene node (visible scene-graph)\r\n@param {string} id - the node ID\r\n@returns {Node}\r\n*/\r\nATON.getSceneNode = (id)=>{ \r\n if (id === undefined) return undefined; \r\n return ATON.snodes[id];\r\n};\r\n\r\n/**\r\nGet or create a scene node (visible scene-graph)\r\n@param {string} id - the node ID\r\n@returns {Node}\r\n*/\r\nATON.getOrCreateSceneNode = (id)=>{\r\n let N = ATON.getSceneNode(id);\r\n if (N !== undefined) return N;\r\n return ATON.createSceneNode(id);\r\n};\r\n\r\n/**\r\nGet root (visible scene-graph)\r\n@returns {Node}\r\n*/\r\nATON.getRootScene = ()=>{\r\n return ATON._rootVisible;\r\n};\r\n\r\n// Semantics, shape descriptors\r\n//=============================================\r\n\r\n/**\r\nCreate a semantic node\r\n@param {string} id - a string representing unique ID of the node (optional)\r\n@returns {Node}\r\n*/\r\nATON.createSemanticNode = (id)=>{\r\n return new ATON.Node(id, ATON.NTYPES.SEM);\r\n};\r\n\r\n/**\r\nGet a previously created semantic node\r\n@param {string} id - the node ID\r\n@returns {Node}\r\n*/\r\nATON.getSemanticNode = (id)=>{\r\n if (id === undefined) return undefined; \r\n return ATON.semnodes[id];\r\n};\r\n\r\n/**\r\nGet or create a semantic node\r\n@param {string} id - the node ID\r\n@returns {Node}\r\n*/\r\nATON.getOrCreateSemanticNode = (id)=>{\r\n let S = ATON.getSemanticNode(id);\r\n if (S !== undefined) return S;\r\n return ATON.createSemanticNode(id);\r\n};\r\n\r\n/**\r\nGet root of semantic graph\r\n@returns {Node}\r\n*/\r\nATON.getRootSemantics = ()=>{\r\n return ATON._rootSem;\r\n};\r\n\r\n// UI graph\r\n//=============================================\r\n\r\n/**\r\nCreate a UI node\r\n@param {string} id - a string representing unique ID of the node (optional)\r\n@returns {Node}\r\n*/\r\nATON.createUINode = (id)=>{\r\n return new ATON.Node(id, ATON.NTYPES.UI);\r\n};\r\n\r\n/**\r\nGet a previously created UI node\r\n@param {string} id - the node ID\r\n@returns {Node}\r\n*/\r\nATON.getUINode = (id)=>{\r\n if (id === undefined) return undefined; \r\n return ATON.uinodes[id];\r\n};\r\n\r\n/**\r\nGet root of UI graph\r\n@returns {Node}\r\n*/\r\nATON.getRootUI = ()=>{\r\n return ATON._rootUI;\r\n};\r\n\r\n// Asset loading routines\r\nATON._assetReqNew = (url)=>{\r\n ATON._numReqLoad++;\r\n ATON.fireEvent(\"NodeRequestFired\", url);\r\n};\r\n\r\nATON._assetReqComplete = (url)=>{\r\n ATON.fireEvent(\"NodeRequestCompleted\", url);\r\n ATON._numReqLoad--;\r\n\r\n if (ATON._numReqLoad <= 0) ATON._onAllReqsCompleted();\r\n};\r\n\r\nATON._onAllReqsCompleted = ()=>{\r\n // Bounds\r\n let c = ATON._rootVisible.getBound().center;\r\n let r = ATON._rootVisible.getBound().radius;\r\n\r\n if (ATON._renderer.shadowMap.enabled){\r\n\r\n ATON._rootVisible.traverse((o) => {\r\n if (o.isMesh){\r\n o.castShadow = true;\r\n o.receiveShadow = true;\r\n }\r\n });\r\n\r\n ATON.adjustShadowsParamsFromSceneBounds();\r\n\r\n if (ATON._bShadowsFixedBound){\r\n ATON.updateDirShadows(/*c*/);\r\n }\r\n }\r\n\r\n if (ATON._bAutoLP){\r\n if (ATON._lps[0] === undefined) ATON.addLightProbe( new ATON.LightProbe().setPosition(c).setNear(r) );\r\n else {\r\n ATON._lps[0].setPosition(c.x, c.y, c.z).setNear(r);\r\n }\r\n console.log(\"Auto LP\");\r\n }\r\n\r\n // Post FX\r\n if (ATON.FX.composer){\r\n // Estimate DOF aperture from bound radius\r\n ATON.FX.setDOFaperture( 1.0 / (r*30.0));\r\n }\r\n\r\n //ATON.Utils.graphPostVisitor(ATON._rootVisible);\r\n\r\n // re-center main pano\r\n if (c && ATON._mMainPano) ATON._mMainPano.position.copy(c);\r\n\r\n ATON.getRootScene().assignLightProbesByProximity();\r\n //ATON.updateLightProbes();\r\n\r\n //ATON._bDirtyLP = true;\r\n\r\n ATON.fireEvent(\"AllNodeRequestsCompleted\");\r\n\r\n ATON._postAllReqsCompleted();\r\n\r\n // FIXME: dirty\r\n setTimeout( ()=>{\r\n //if (c && ATON._mMainPano) ATON._mMainPano.position.copy(c);\r\n ATON.updateLightProbes();\r\n\r\n // Lazy shadows updates (performances)\r\n if (ATON._renderer.shadowMap.enabled && ATON._bShadowsFixedBound && ATON._aniMixers.length === 0){\r\n ATON._dMainL.shadow.autoUpdate = false;\r\n console.log(\"Lazy shadows\");\r\n }\r\n }, 1000);\r\n};\r\n\r\nATON._postAllReqsCompleted = (R)=>{\r\n if (R === undefined) R = ATON._rootVisible;\r\n\r\n for (let n in R.children){\r\n let N = R.children[n];\r\n\r\n if (N && N.toggle){\r\n ATON._postAllReqsCompleted(N);\r\n N.toggle(N.visible);\r\n\r\n //if (N.bPickable !== undefined) N.setPickable(N.bPickable);\r\n }\r\n }\r\n};\r\n\r\n\r\nATON.initGraphs = ()=>{\r\n // Global root\r\n ATON._mainRoot = new THREE.Scene();\r\n ATON._mainRoot.background = new THREE.Color( 0.7,0.7,0.7 );\r\n //ATON._mainRoot.fog = new THREE.Fog(new THREE.Color( 0.7,0.7,0.7 ), 5, 200);\r\n\r\n // visible scene-graph\r\n ATON._rootVisibleGlobal = new THREE.Group();\r\n ATON._mainRoot.add(ATON._rootVisibleGlobal);\r\n\r\n ATON._rootVisible = ATON.createSceneNode().setAsRoot();\r\n ATON._rootVisibleGlobal.add(ATON._rootVisible);\r\n\r\n\r\n // semantics graph\r\n ATON._rootSem = ATON.createSemanticNode().setAsRoot();\r\n ATON._mainRoot.add(ATON._rootSem);\r\n\r\n // UI graph\r\n ATON._rootUI = ATON.createUINode().setAsRoot();\r\n //ATON._rootUI.renderOrder = 10;\r\n ATON._mainRoot.add(ATON._rootUI);\r\n\r\n // Uniform lighting\r\n ATON.ambLight = new THREE.AmbientLight( new THREE.Color(1,1,1) /*ATON._mainRoot.background*/ );\r\n ATON._rootVisibleGlobal.add(ATON.ambLight);\r\n};\r\n\r\nATON.setBackgroundColor = (bg)=>{\r\n ATON._mainRoot.background = bg;\r\n //ATON._mainRoot.fog = new THREE.Fog(bg, 5, 200);\r\n};\r\n\r\n//==============================================================\r\n// LightProbes (LPs)\r\n//==============================================================\r\nATON.setAutoLP = (b)=>{\r\n ATON._bAutoLP = b;\r\n};\r\n\r\nATON.setNeutralAmbientLight = (a)=>{\r\n ATON.ambLight.color = new THREE.Color( a,a,a );\r\n};\r\n\r\n/**\r\nAdd a LightProbe to the scene\r\n@param {LightProbe} LP - the light probe being added \r\n*/\r\nATON.addLightProbe = (LP)=>{\r\n if (LP === undefined) return;\r\n\r\n if (ATON._lps.length === 0) ATON.setNeutralAmbientLight(ATON.AMB_L);\r\n\r\n ATON._lps.push(LP);\r\n\r\n // SUI\r\n if (ATON.SUI.gLPIcons === undefined) return;\r\n SUI.addLPIcon(LP);\r\n};\r\n\r\n/**\r\nUpdate all LightProbes in the scene\r\n*/\r\nATON.updateLightProbes = ()=>{\r\n if (ATON._lps.length === 0) return;\r\n\r\n for (let i in ATON._lps){\r\n ATON._lps[i].update();\r\n/*\r\n if (ATON._indLPs === undefined) ATON._indLPs = [];\r\n if (ATON._indLPs[i]) ATON._mainRoot.remove(ATON._indLPs[i]);\r\n\r\n ATON._indLPs[i] = THREE.LightProbeGenerator.fromCubeRenderTarget( ATON._renderer, ATON._lps[i]._prevCCtarget );\r\n ATON._indLPs[i].intensity = 1.0;\r\n\r\n ATON._mainRoot.add( ATON._indLPs[i] );\r\n\r\n console.log(ATON._mainRoot);\r\n*/\r\n }\r\n\r\n // FIXME: indirect LP based on first LP (for now)\r\n if (ATON._lps[0]){\r\n if (ATON._indLP) ATON._mainRoot.remove(ATON._indLP);\r\n\r\n ATON._indLP = THREE.LightProbeGenerator.fromCubeRenderTarget( ATON._renderer, ATON._lps[0]._prevCCtarget );\r\n ATON._indLP.intensity = 1.0;\r\n\r\n ATON._mainRoot.add( ATON._indLP );\r\n }\r\n\r\n //for (let i in ATON._lps) ATON._lps[i].update();\r\n\r\n ATON._rootVisible.traverse((o) => {\r\n let LP = o.userData.LP;\r\n if (LP !== undefined && LP instanceof ATON.LightProbe){\r\n o.material.envMap = LP.getEnvTex();\r\n o.material.combine = THREE.AddOperation;\r\n o.material.envMapIntensity = ATON._envMapInt;\r\n }\r\n });\r\n\r\n console.log(\"LPs updated.\");\r\n};\r\n\r\n//==============================================================\r\n// Environment\r\n//==============================================================\r\n\r\n/**\r\nSet the main panorama (360)\r\n@param {string} path - url to equirectangular image\r\n@example\r\nATON.setMainPanorama(\"my/pano.jpg\");\r\n*/\r\nATON.setMainPanorama = (path)=>{\r\n let tpano = undefined;\r\n\r\n path = ATON.Utils.resolveCollectionURL(path);\r\n\r\n //const pmremGenerator = new THREE.PMREMGenerator( ATON._renderer );\r\n //pmremGenerator.compileEquirectangularShader();\r\n/*\r\n if (path.endsWith(\".hdr\")){\r\n new THREE.RGBELoader().setDataType( THREE.UnsignedByteType ).load(path, (hdr)=>{\r\n //const envMap = pmremGenerator.fromEquirectangular( hdr ).texture;\r\n \r\n tpano = hdr;\r\n if (ATON._matMainPano) ATON._matMainPano.map = hdr;\r\n });\r\n\r\n //return;\r\n }\r\n*/\r\n\r\n // Geometry\r\n if (ATON._mMainPano === undefined){\r\n ATON._gMainPano = new THREE.SphereBufferGeometry( /*ATON.Nav.STD_FAR * 0.8*/1.0, 60,60 );\r\n //ATON._gMainPano = new THREE.SphereGeometry( ATON.Nav.STD_FAR * 0.8, 60,60 );\r\n \r\n ATON._gMainPano.castShadow = false;\r\n ATON._gMainPano.receiveShadow = false;\r\n\r\n ATON._mMainPano = new THREE.Mesh(ATON._gMainPano, ATON._matMainPano);\r\n ATON._mMainPano.frustumCulled = false;\r\n ATON._mMainPano.renderOrder = -100;\r\n \r\n ATON.setMainPanoramaRadius(ATON.Nav.STD_FAR * 0.8);\r\n ///ATON.setMainPanoramaRadius(100.0);\r\n }\r\n\r\n // Panoramic Video\r\n if (ATON.Utils.isVideo(path)){\r\n // First time\r\n if (ATON._elPanoVideo === undefined){\r\n ATON._elPanoVideo = document.createElement('video');\r\n ATON._elPanoVideo.id = \"idPanoVideo\";\r\n ATON._elPanoVideo.innerHTML = \"\";\r\n ATON._elPanoVideo.crossOrigin = \"anonymous\";\r\n ATON._elPanoVideo.loop = true;\r\n ATON._elPanoVideo.playsinline = true;\r\n ATON._elPanoVideo.style.cssText = \"display:none;\";\r\n //ATON._elPanoVideo.src = path;\r\n ATON._elPanoVideo.autoplay = true;\r\n\r\n ATON._elPanoVideo.onplaying = ()=>{\r\n console.log(\"VideoPano playing\");\r\n ATON._vpanoPlaying = true;\r\n };\r\n }\r\n\r\n tpano = new THREE.VideoTexture( ATON._elPanoVideo );\r\n tpano.encoding = THREE.sRGBEncoding;\r\n //tpano.minFilter = THREE.NearestFilter;\r\n\t\t//tpano.generateMipmaps = false;\r\n //console.log(ATON._elPanoVideo);\r\n\r\n ATON._realizeOrUpdateMainPano(tpano);\r\n }\r\n // Static Panorama\r\n else {\r\n /*\r\n tpano = new THREE.TextureLoader().load(path);\r\n tpano.encoding = THREE.sRGBEncoding;\r\n //tpano.minFilter = THREE.NearestFilter;\r\n\t\ttpano.generateMipmaps = true;\r\n */\r\n ATON.Utils.textureLoader.load(path, (tex)=>{\r\n tex.encoding = THREE.sRGBEncoding;\r\n //tex.minFilter = THREE.NearestFilter;\r\n\t\t tex.generateMipmaps = true;\r\n\r\n ATON._realizeOrUpdateMainPano(tex);\r\n });\r\n }\r\n};\r\n\r\nATON._realizeOrUpdateMainPano = (tpano)=>{\r\n // We already created a main pano\r\n if (ATON._matMainPano !== undefined){\r\n ATON._matMainPano.map = tpano;\r\n //ATON._matMainPano.emissive = tpano;\r\n\r\n ATON.updateLightProbes();\r\n return;\r\n }\r\n\r\n ATON._matMainPano = new THREE.MeshBasicMaterial({ \r\n map: tpano,\r\n ///emissive: tpano,\r\n //fog: false,\r\n \r\n depthTest: false,\r\n depthWrite: false,\r\n \r\n ///depthFunc: THREE.AlwaysDepth,\r\n //side: THREE.BackSide, // THREE.DoubleSide\r\n });\r\n\r\n ATON._mMainPano.material = ATON._matMainPano;\r\n\r\n/*\r\n ATON._mMainPano = new THREE.Mesh(ATON._gMainPano, ATON._matMainPano);\r\n ATON._mMainPano.frustumCulled = false;\r\n ATON._mMainPano.renderOrder = -100;\r\n \r\n ATON.setMainPanoramaRadius(ATON.Nav.STD_FAR * 0.8);\r\n ///ATON.setMainPanoramaRadius(100.0);\r\n*/\r\n // FIXME: dirty, find another way\r\n if (ATON._bMainPanoInfinite){\r\n ATON._mMainPano.onAfterRender = ()=>{\r\n //if (ATON._numReqLoad > 0) return;\r\n if (ATON.Nav._currPOV) ATON._mMainPano.position.copy(ATON.Nav._currPOV.pos);\r\n };\r\n }\r\n\r\n ATON._rootVisibleGlobal.add(ATON._mMainPano);\r\n \r\n ATON.updateLightProbes();\r\n};\r\n\r\n\r\nATON.setMainPanoramaRadius = (r)=>{\r\n if (ATON._gMainPano === undefined) return;\r\n ATON._gMainPano.scale( -r,r,r );\r\n};\r\n\r\n/**\r\nSet main panorama rotation (radians) around up vector\r\n@param {number} r - rotation\r\n@example\r\nATON.setMainPanoramaRotation(1.5);\r\n*/\r\nATON.setMainPanoramaRotation = (r)=>{\r\n if (ATON._mMainPano === undefined) return;\r\n ATON._mMainPano.rotation.set( 0,r,0 );\r\n};\r\n\r\n/**\r\nEnable or disable main panorama infinite distance\r\n@param {boolean} b\r\n@example\r\nATON.setMainPanoramaInfinite(false);\r\n*/\r\nATON.setMainPanoramaInfinite = (b)=>{\r\n ATON._bMainPanoInfinite = b;\r\n\r\n if (ATON._mMainPano === undefined) return;\r\n\r\n if (b){\r\n ATON._mMainPano.onAfterRender = ()=>{\r\n //if (ATON._numReqLoad > 0) return;\r\n if (ATON.Nav._currPOV) ATON._mMainPano.position.copy(ATON.Nav._currPOV.pos);\r\n };\r\n }\r\n else {\r\n ATON._mMainPano.onAfterRender = undefined;\r\n }\r\n};\r\n\r\nATON.setMainPanoramaLocation = (c)=>{\r\n if (ATON._bMainPanoInfinite) return;\r\n if (ATON._mMainPano === undefined) return;\r\n\r\n ATON._mMainPano.position.copy(c); \r\n};\r\n\r\n/**\r\nSet and activate main directional light\r\n@param {THREE.Vector3} v - light direction\r\n@example\r\nATON.setMainLightDirection( new THREE.Vector(0.1,-1.0,0.0) );\r\n*/\r\nATON.setMainLightDirection = (v)=>{\r\n\r\n let d = v.clone();\r\n d.normalize();\r\n\r\n d.x *= ATON.SHADOWS_FAR * 0.5;\r\n d.y *= ATON.SHADOWS_FAR * 0.5;\r\n d.z *= ATON.SHADOWS_FAR * 0.5;\r\n\r\n if (ATON._dMainL === undefined){\r\n ATON._dMainL = new THREE.DirectionalLight( new THREE.Color(1,1,1), 1.0 );\r\n ATON._dMainL.castShadow = false;\r\n\r\n ATON._dMainLtgt = new THREE.Object3D();\r\n ATON._rootVisibleGlobal.add(ATON._dMainLtgt);\r\n ATON._dMainL.target = ATON._dMainLtgt;\r\n\r\n ATON._rootVisibleGlobal.add(ATON._dMainL);\r\n ATON._dMainLpos = new THREE.Vector3();\r\n }\r\n\r\n ATON._dMainLdir = d;\r\n\r\n ATON._dMainL.position.set(-d.x,-d.y,-d.z);\r\n\r\n if (ATON._renderer.shadowMap.enabled) ATON._dMainL.shadow.needsUpdate = true;\r\n\r\n ATON.toggleMainLight(true);\r\n};\r\n\r\nATON.getMainLightDirection = ()=>{\r\n if (ATON._dMainLdir === undefined) return undefined;\r\n\r\n let ld = ATON._dMainLdir.clone();\r\n ld.normalize();\r\n return ld;\r\n};\r\n\r\nATON.toggleMainLight = (b)=>{\r\n if (ATON._dMainL === undefined) return;\r\n ATON._dMainL.visible = b;\r\n \r\n if (b){\r\n ATON.setNeutralAmbientLight(ATON.AMB_L);\r\n ATON.updateDirShadows();\r\n }\r\n else ATON.setNeutralAmbientLight(1.0);\r\n};\r\n\r\nATON.isMainLightEnabled = ()=>{\r\n if (ATON._dMainL === undefined) return false;\r\n if (!ATON._dMainL.visible) return false;\r\n\r\n return true;\r\n};\r\n\r\nATON.setExposure = (d)=>{\r\n ATON._renderer.toneMappingExposure = d;\r\n};\r\nATON.getExposure = ()=>{\r\n return ATON._renderer.toneMappingExposure;\r\n};\r\n\r\n// Shadows\r\n// Smart adjustment of shadows params\r\nATON.adjustShadowsParamsFromSceneBounds = ()=>{\r\n if (ATON._dMainL === undefined) return;\r\n\r\n let r = ATON._rootVisible.getBound().radius;\r\n let c = ATON._rootVisible.getBound().center;\r\n \r\n if (r <= 0.0 || r >= ATON.SHADOWS_SIZE){\r\n ATON._bShadowsFixedBound = false;\r\n ATON._shadowsSize = ATON.SHADOWS_SIZE;\r\n //ATON._shadowsNear = ATON.SHADOWS_NEAR;\r\n //ATON._shadowsFar = ATON.SHADOWS_FAR;\r\n }\r\n else {\r\n ATON._bShadowsFixedBound = true;\r\n ATON._shadowsFixedBoundCenter = c;\r\n ATON._shadowsSize = r * 1.5;\r\n\r\n //console.log(ATON._shadowsNear,ATON._shadowsFar);\r\n }\r\n\r\n // must dispose when changing shadow params\r\n if (ATON._dMainL.shadow.map){\r\n ATON._dMainL.shadow.map.dispose();\r\n ATON._dMainL.shadow.map = null;\r\n }\r\n\r\n //console.log(ATON._dMainL.shadow.camera);\r\n\r\n ATON._dMainL.shadow.camera.left = -ATON._shadowsSize;\r\n ATON._dMainL.shadow.camera.right = ATON._shadowsSize;\r\n ATON._dMainL.shadow.camera.bottom = -ATON._shadowsSize;\r\n ATON._dMainL.shadow.camera.top = ATON._shadowsSize;\r\n\r\n ATON._dMainL.shadow.mapSize.width = ATON._shadowsRes;\r\n ATON._dMainL.shadow.mapSize.height = ATON._shadowsRes;\r\n ATON._dMainL.shadow.camera.near = ATON._shadowsNear;\r\n ATON._dMainL.shadow.camera.far = ATON._shadowsFar;\r\n\r\n //ATON._dMainL.shadow.camera.updateProjectionMatrix();\r\n\r\n let shb = -(r * 0.0002);\r\n if (shb < -0.001) shb = -0.001; // -0.0005\r\n ATON._dMainL.shadow.bias = shb;\r\n\r\n //ATON._dMainL.shadow.normalBias = 0.05;\r\n //ATON._dMainL.shadow.radius = 8;\r\n};\r\n\r\n\r\nATON.toggleShadows = (b)=>{\r\n if (ATON._dMainL === undefined) return;\r\n\r\n if (b){\r\n ATON._dMainL.castShadow = true;\r\n ATON._renderer.shadowMap.enabled = true;\r\n\r\n if (ATON.device.isMobile) ATON._renderer.shadowMap.type = THREE.PCFShadowMap;\r\n else ATON._renderer.shadowMap.type = THREE.PCFSoftShadowMap; // THREE.VSMShadowMap; \r\n\r\n //ATON._renderer.shadowMap.type = THREE.BasicShadowMap;\r\n //ATON._renderer.shadowMap.type = THREE.PCFShadowMap;\r\n //ATON._renderer.shadowMap.type = THREE.PCFSoftShadowMap; //\r\n //ATON._renderer.shadowMap.type = THREE.VSMShadowMap;\r\n\r\n ATON._rootVisible.traverse((o) => {\r\n if (o.isMesh){\r\n o.castShadow = true;\r\n o.receiveShadow = true;\r\n }\r\n });\r\n\r\n ATON.adjustShadowsParamsFromSceneBounds();\r\n\r\n ATON.updateDirShadows();\r\n/*\r\n if (ATON._bShadowsFixedBound){\r\n let c = ATON._rootVisible.getBound().center;\r\n ATON.updateDirShadows(c);\r\n }\r\n else ATON.updateDirShadows();\r\n*/\r\n ATON._dMainL.shadow.needsUpdate = true;\r\n\r\n console.log(\"Shadows ON\");\r\n }\r\n else {\r\n ATON._dMainL.castShadow = false;\r\n ATON._renderer.shadowMap.enabled = false;\r\n console.log(\"Shadows OFF\");\r\n }\r\n};\r\n\r\nATON.updateDirShadows = (/*p*/)=>{\r\n if (ATON._dMainLdir === undefined) return;\r\n\r\n let p = ATON._shadowsFixedBoundCenter;\r\n\r\n if (p === undefined){\r\n p = ATON.Nav.getCurrentEyeLocation();\r\n\r\n ATON._dMainLpos.x = p.x + (ATON.Nav._vDir.x * ATON._shadowsSize);\r\n ATON._dMainLpos.y = p.y + (ATON.Nav._vDir.y * ATON._shadowsSize);\r\n ATON._dMainLpos.z = p.z + (ATON.Nav._vDir.z * ATON._shadowsSize);\r\n }\r\n else {\r\n ATON._dMainLpos.x = p.x;\r\n ATON._dMainLpos.y = p.y;\r\n ATON._dMainLpos.z = p.z;\r\n }\r\n\r\n ATON._dMainL.position.set(\r\n ATON._dMainLpos.x - ATON._dMainLdir.x, \r\n ATON._dMainLpos.y - ATON._dMainLdir.y, \r\n ATON._dMainLpos.z - ATON._dMainLdir.z\r\n );\r\n\r\n ATON._dMainLtgt.position.copy(ATON._dMainLpos);\r\n};\r\n\r\nATON._updateEnvironment = ()=>{\r\n if (!ATON._renderer.shadowMap.enabled) return;\r\n if (ATON._bShadowsFixedBound) return;\r\n\r\n ATON.updateDirShadows();\r\n};\r\n\r\n// main audio\r\nATON.setGlobalAudio = (audioURL, bLoop)=>{\r\n if (audioURL === undefined) return;\r\n if (bLoop === undefined) bLoop = true;\r\n\r\n audioURL = ATON.Utils.resolveCollectionURL(audioURL);\r\n\r\n if (ATON._auMain === undefined || ATON._auMain === null) ATON._auMain = new THREE.Audio( ATON.AudioHub._listener );\r\n else if (ATON._auMain.isPlaying) ATON._auMain.stop();\r\n\r\n ATON.AudioHub._loader.load( audioURL, (buffer)=>{\r\n ATON._auMain.setBuffer( buffer );\r\n ATON._auMain.setLoop( bLoop );\r\n //ATON._auMain.setVolume( 2.0 );\r\n //A._auTalk.setPlaybackRate(0.9);\r\n ATON._auMain.play();\r\n });\r\n};\r\n\r\n// FPS monitoring\r\nATON._markFPS = ()=>{\r\n if (ATON._numReqLoad > 0) return;\r\n\r\n const fps = (1.0 / ATON._dt);\r\n\r\n ATON._avgFPScount += 1.0;\r\n ATON._dtAccum += ATON._dt;\r\n ATON._avgFPSaccum += fps;\r\n\r\n if (ATON._dtAccum < 1.0) return;\r\n\r\n ATON._fps = ATON._avgFPSaccum / ATON._avgFPScount;\r\n //console.log(ATON._fps);\r\n\r\n ATON._avgFPSaccum = 0.0;\r\n ATON._avgFPScount = 0.0;\r\n ATON._dtAccum = 0.0;\r\n\r\n // Handle dynamic render profiles\r\n ATON._handleDynamicRenderProfiles();\r\n};\r\n\r\n/**\r\nEnable or disable dynamic density for renderer\r\n@param {function} b - bool\r\n*/\r\nATON.toggleDynamicDensity = (b)=>{\r\n ATON._bDynamicDensity = b;\r\n};\r\n\r\n/**\r\nSet dynamic rendering FPS budgets. Default values are 30 and 55\r\n@param {number} minBudget - the lower bound to trigger a lower rendering profile\r\n@param {number} maxBudget - the upper bound to trigger a higher rendering profile\r\n*/\r\nATON.setDynamicRenderingFPS = (minBudget, maxBudget)=>{\r\n if (minBudget >= maxBudget) return;\r\n\r\n if (minBudget) ATON._dRenderBudgetMinFPS = minBudget;\r\n if (maxBudget) ATON._dRenderBudgetMaxFPS = maxBudget;\r\n};\r\n\r\n// Dynamic Render Profiles\r\nATON._handleDynamicRenderProfiles = ()=>{\r\n let d = ATON._renderer.getPixelRatio();\r\n\r\n // We need lower RP\r\n if (ATON._fps < ATON._dRenderBudgetMinFPS){\r\n\r\n if (ATON._bDynamicDensity){ // Dynamic density\r\n d *= 0.75;\r\n if (d >= 0.1){\r\n ATON._renderer.setPixelRatio( d );\r\n\r\n // change res to each pass\r\n //ATON.updateFXPassesResolution(d);\r\n if (ATON.FX.composer) ATON.FX.composer.setPixelRatio(d);\r\n\r\n console.log(d);\r\n }\r\n }\r\n\r\n ATON.fireEvent(\"RequestLowerRender\");\r\n //console.log(\"Need lower render profile\");\r\n }\r\n\r\n // Can go higher RP\r\n if (ATON._fps > ATON._dRenderBudgetMaxFPS){\r\n\r\n if (ATON._bDynamicDensity){ // Dynamic density\r\n d *= 1.33;\r\n if (d <= ATON._stdpxd){\r\n ATON._renderer.setPixelRatio( d );\r\n\r\n // change res to each pass\r\n //ATON.updateFXPassesResolution(d);\r\n if (ATON.FX.composer) ATON.FX.composer.setPixelRatio(d);\r\n\r\n console.log(d);\r\n }\r\n }\r\n\r\n ATON.fireEvent(\"RequestHigherRender\");\r\n //console.log(\"Can request higher render profile\");\r\n }\r\n};\r\n\r\n//==============================================================\r\n// Update routines\r\n//==============================================================\r\nATON._onFrame = ()=>{\r\n // TODO: add pause render\r\n\r\n ATON._dt = ATON._clock.getDelta();\r\n //ATON._fps = (1.0 / ATON._dt);\r\n \r\n ATON._markFPS();\r\n\r\n //ATON.fireEvent(\"preframe\");\r\n\r\n // Render\r\n //ATON._renderer.render( ATON._mainRoot, ATON.Nav._camera );\r\n\r\n\r\n if (ATON.XR._bPresenting) ATON.XR.update();\r\n else ATON.Nav._controls.update(ATON._dt);\r\n\r\n // Spatial queries\r\n ATON._handleQueries(); // k\r\n\r\n // Navigation system\r\n ATON.Nav.update(); // k\r\n\r\n // VRoadcast\r\n ATON.VRoadcast.update();\r\n\r\n // SUI\r\n ATON.SUI.update(); // k\r\n\r\n // Mat\r\n ATON.MatHub.update(); // k\r\n\r\n // Environment/lighting\r\n ATON._updateEnvironment();\r\n\r\n // 3D models animations\r\n ATON._updateAniMixers();\r\n\r\n ATON._updateRoutines();\r\n\r\n // TileSets\r\n ATON._updateTSets();\r\n\r\n // Render frame\r\n if (!ATON.FX.composer || ATON.XR._bPresenting)\r\n ATON._renderer.render( ATON._mainRoot, ATON.Nav._camera );\r\n else \r\n ATON.FX.composer.render();\r\n\r\n //ATON.fireEvent(\"frame\");\r\n};\r\n\r\n/**\r\nAdd an update routine (continuosly executed)\r\n@param {function} U - function\r\n*/\r\nATON.addUpdateRoutine = (U)=>{\r\n if (U === undefined) return;\r\n ATON._updRoutines.push(U);\r\n};\r\n\r\n/**\r\nRemoves all update routines\r\n*/\r\nATON.deleteAllUpdateRoutines = ()=>{\r\n ATON._updRoutines = [];\r\n};\r\n\r\nATON._updateRoutines = ()=>{\r\n let n = ATON._updRoutines.length;\r\n if (n <= 0) return;\r\n\r\n for (let u=0; u{\r\n const nts = ATON._tsets.length;\r\n if (nts <= 0) return;\r\n\r\n ATON.Nav._camera.updateMatrixWorld();\r\n //if (Nav._camOrbit) Nav._camOrbit.updateMatrixWorld();\r\n //if (Nav._camFP) Nav._camFP.updateMatrixWorld();\r\n\r\n for (let ts=0; ts{\r\n let num = ATON._aniMixers.length;\r\n if (num < 1) return;\r\n\r\n for (let m=0; m{\r\n if (e.preventDefault) e.preventDefault();\r\n\r\n if (ATON._bCenteredQuery) return;\r\n\r\n/*\r\n if (ATON.Nav._mode === ATON.Nav.MODE_DEVORI){\r\n ATON._screenPointerCoords.x = 0.0;\r\n ATON._screenPointerCoords.y = 0.0;\r\n return;\r\n }\r\n*/\r\n\tATON._screenPointerCoords.x = ( e.clientX / window.innerWidth ) * 2 - 1;\r\n\tATON._screenPointerCoords.y = -( e.clientY / window.innerHeight ) * 2 + 1;\r\n\r\n //console.log(ATON._screenPointerCoords);\r\n};\r\n\r\nATON.toggleCenteredQuery = (b)=>{\r\n ATON._bCenteredQuery = b;\r\n \r\n if (b){\r\n ATON._screenPointerCoords.x = 0.0;\r\n ATON._screenPointerCoords.y = 0.0;\r\n }\r\n};\r\n\r\n//==============================================================\r\n// Query rountines\r\n//==============================================================\r\nATON._registerRCS = ()=>{\r\n ATON._rcRR = 0;\r\n ATON._rcHandlers = [];\r\n\r\n ATON._rcHandlers.push( ATON._handleQueryScene );\r\n ATON._rcHandlers.push( ATON._handleQuerySemantics );\r\n ATON._rcHandlers.push( ATON._handleQueryUI );\r\n};\r\n\r\nATON._handleQueries = ()=>{\r\n if (ATON._bPauseQuery) return;\r\n if (ATON.Nav._bInteracting) return;\r\n if (ATON._numReqLoad > 0) return;\r\n\r\n if (ATON.Nav.isTransitioning()) return; // do not query during POV transitions\r\n //if (ATON.device.isMobile || !ATON.XR.isPresenting()) return; \r\n\r\n // interleaving mode\r\n //ATON._rcHandlers[ATON._rcRR]();\r\n //ATON._rcRR = (ATON._rcRR+1) % 3;\r\n\r\n ATON._handleQueryUI();\r\n\r\n if (ATON._bqScene) ATON._handleQueryScene();\r\n if (ATON._bqSem) ATON._handleQuerySemantics();\r\n \r\n //ATON._handleQueryUI();\r\n\r\n ATON.Nav.locomotionValidator();\r\n\r\n // Timed gaze input\r\n if (ATON._tgiDur === undefined) return;\r\n if (ATON._tHover === undefined) return;\r\n //console.log(ATON._tHover);\r\n\r\n const d = ATON._clock.elapsedTime - ATON._tHover;\r\n if (d >= ATON._tgiDur){\r\n ATON._stdActivation();\r\n\r\n ATON._tHover = undefined;\r\n ATON._tgiPer = undefined;\r\n }\r\n else ATON._tgiPer = (d/ATON._tgiDur);\r\n\r\n};\r\n\r\n// Ray casting visible scenegraph\r\nATON._handleQueryScene = ()=>{\r\n if (ATON.XR.isPresenting()){\r\n ATON.XR.setupQueryRay(ATON._rcScene);\r\n }\r\n else \r\n ATON._rcScene.setFromCamera( ATON._screenPointerCoords, ATON.Nav._camera );\r\n\r\n ATON._hitsScene = [];\r\n //ATON._rcScene.intersectObjects( ATON._rootVisible.children, true, ATON._hitsScene );\r\n ATON._rcScene.intersectObjects( ATON._mainRoot.children, true, ATON._hitsScene );\r\n\r\n //ATON._hitsOperator(ATON._hits);\r\n\r\n // Process hits\r\n const hitsnum = ATON._hitsScene.length;\r\n if (hitsnum <= 0){\r\n ATON._queryDataScene = undefined;\r\n return;\r\n }\r\n\r\n const h = ATON._hitsScene[0];\r\n\r\n ATON._queryDataScene = {};\r\n ATON._queryDataScene.p = h.point;\r\n ATON._queryDataScene.d = h.distance;\r\n ATON._queryDataScene.o = h.object;\r\n \r\n //console.log(ATON._queryDataScene.o);\r\n\r\n // Normals\r\n if (!ATON._bQueryNormals) return;\r\n if (h.face === null) return;\r\n if (h.face.normal === undefined) return;\r\n\r\n ATON._queryDataScene.matrixWorld = new THREE.Matrix3().getNormalMatrix( h.object.matrixWorld );\r\n ATON._queryDataScene.n = h.face.normal.clone().applyMatrix3( ATON._queryDataScene.matrixWorld ).normalize();\r\n};\r\n\r\n/**\r\nGet location of current queried point (if any) on visible scene.\r\nIf no point is queried, return undefined\r\n@returns {THREE.Vector3}\r\n@example\r\nlet p = ATON.getSceneQueriedPoint()\r\n*/\r\nATON.getSceneQueriedPoint = ()=>{\r\n if (ATON._queryDataScene === undefined) return undefined;\r\n return ATON._queryDataScene.p;\r\n};\r\n\r\n/**\r\nGet distance to queried location (if any) on visible scene.\r\nIf no point is queried, return undefined\r\n@returns {number}\r\n@example\r\nlet d = ATON.getSceneQueriedDistance()\r\n*/\r\nATON.getSceneQueriedDistance = ()=>{\r\n if (ATON._queryDataScene === undefined) return undefined;\r\n return ATON._queryDataScene.d;\r\n};\r\n\r\n/**\r\nGet queried location normal (if any) on visible scene.\r\nIf no point is queried, return undefined\r\n@returns {THREE.Vector3}\r\n@example\r\nlet n = ATON.getSceneQueriedNormal()\r\n*/\r\nATON.getSceneQueriedNormal = ()=>{\r\n if (ATON._queryDataScene === undefined) return undefined;\r\n return ATON._queryDataScene.n;\r\n};\r\n\r\n\r\n// Ray casting semantic-graph\r\nATON._handleQuerySemantics = ()=>{\r\n if (ATON.XR.isPresenting()){\r\n ATON.XR.setupQueryRay(ATON._rcSemantics);\r\n }\r\n else \r\n ATON._rcSemantics.setFromCamera( ATON._screenPointerCoords, ATON.Nav._camera );\r\n\r\n ATON._hitsSem = [];\r\n ATON._rcSemantics.intersectObjects( ATON._mainRoot.children, true, ATON._hitsSem );\r\n\r\n //console.log(ATON._hitsSem);\r\n\r\n // Process hits\r\n const hitsnum = ATON._hitsSem.length;\r\n if (hitsnum <= 0){\r\n ATON._queryDataSem = undefined;\r\n\r\n if (ATON._hoveredSemNode){\r\n ATON.fireEvent(\"SemanticNodeLeave\", ATON._hoveredSemNode);\r\n let S = ATON.getSemanticNode(ATON._hoveredSemNode);\r\n if (S && S.onLeave) S.onLeave();\r\n }\r\n \r\n ATON._hoveredSemNode = undefined;\r\n ATON._tHover = undefined;\r\n return;\r\n }\r\n\r\n const h = ATON._hitsSem[0];\r\n\r\n // Occlusion\r\n if (ATON._bQuerySemOcclusion && ATON._queryDataScene){\r\n if (ATON._queryDataScene.d < h.distance){\r\n\r\n ATON._queryDataSem = undefined;\r\n\r\n if (ATON._hoveredSemNode){\r\n ATON.fireEvent(\"SemanticNodeLeave\", ATON._hoveredSemNode);\r\n let S = ATON.getSemanticNode(ATON._hoveredSemNode);\r\n if (S && S.onLeave) S.onLeave();\r\n }\r\n\r\n ATON._hoveredSemNode = undefined;\r\n ATON._tHover = undefined;\r\n return;\r\n }\r\n }\r\n\r\n ATON._queryDataSem = {};\r\n ATON._queryDataSem.p = h.point;\r\n ATON._queryDataSem.d = h.distance;\r\n ATON._queryDataSem.o = h.object;\r\n ATON._queryDataSem.list = []; // holds sem-nodes parental list\r\n\r\n // traverse parents\r\n const L = ATON._queryDataSem.list;\r\n let sp = h.object.parent;\r\n while (sp){\r\n if (sp.nid && sp.nid !== ATON.ROOT_NID) L.push(sp.nid);\r\n sp = sp.parent;\r\n }\r\n\r\n const hsn = L[0];\r\n if (hsn){\r\n if (ATON._hoveredSemNode !== hsn){\r\n if (ATON._hoveredSemNode){\r\n ATON.fireEvent(\"SemanticNodeLeave\", ATON._hoveredSemNode);\r\n let S = ATON.getSemanticNode(ATON._hoveredSemNode);\r\n if (S && S.onLeave) S.onLeave();\r\n \r\n ATON._tHover = undefined;\r\n }\r\n\r\n ATON._hoveredSemNode = hsn;\r\n ATON.fireEvent(\"SemanticNodeHover\", hsn);\r\n let S = ATON.getSemanticNode(hsn);\r\n if (S && S.onHover) S.onHover();\r\n\r\n ATON._tHover = ATON._clock.elapsedTime;\r\n }\r\n }\r\n\r\n //console.log(L);\r\n};\r\n\r\nATON._handleQueryUI = ()=>{\r\n if (ATON.XR.isPresenting()){\r\n ATON.XR.setupQueryRay(ATON._rcUI);\r\n }\r\n else \r\n ATON._rcUI.setFromCamera( ATON._screenPointerCoords, ATON.Nav._camera );\r\n\r\n ATON._hitsUI = [];\r\n ATON._rcUI.intersectObjects( ATON._mainRoot.children, true, ATON._hitsUI );\r\n\r\n // Process hits\r\n const hitsnum = ATON._hitsUI.length;\r\n if (hitsnum <= 0){\r\n ATON._queryDataUI = undefined;\r\n\r\n if (ATON._hoveredUI){\r\n ATON.fireEvent(\"UINodeLeave\", ATON._hoveredUI);\r\n const S = ATON.getUINode(ATON._hoveredUI);\r\n if (S && S.onLeave) S.onLeave();\r\n }\r\n \r\n ATON._hoveredUI = undefined;\r\n ATON._tHover = undefined;\r\n return;\r\n }\r\n\r\n const h = ATON._hitsUI[0];\r\n\r\n // Occlusion\r\n if (ATON._queryDataScene){\r\n if (ATON._queryDataScene.d < h.distance){\r\n\r\n ATON._queryDataUI = undefined;\r\n\r\n if (ATON._hoveredUI){\r\n ATON.fireEvent(\"UINodeLeave\", ATON._hoveredUI);\r\n const S = ATON.getUINode(ATON._hoveredUI);\r\n if (S && S.onLeave) S.onLeave();\r\n }\r\n\r\n ATON._hoveredUI = undefined;\r\n ATON._tHover = undefined;\r\n return;\r\n }\r\n }\r\n\r\n ATON._queryDataUI = {};\r\n ATON._queryDataUI.p = h.point;\r\n ATON._queryDataUI.d = h.distance;\r\n ATON._queryDataUI.o = h.object;\r\n ATON._queryDataUI.list = []; // holds ui-nodes parental list\r\n\r\n // traverse parents\r\n const L = ATON._queryDataUI.list;\r\n let sp = h.object.parent;\r\n while (sp){\r\n if (sp.nid && sp.nid !== ATON.ROOT_NID) L.push(sp.nid);\r\n sp = sp.parent;\r\n }\r\n\r\n const hui = L[0];\r\n if (hui){\r\n if (ATON._hoveredUI !== hui){\r\n if (ATON._hoveredUI){\r\n ATON.fireEvent(\"UINodeLeave\", ATON._hoveredUI);\r\n const S = ATON.getUINode(ATON._hoveredUI);\r\n if (S && S.onLeave) S.onLeave();\r\n \r\n ATON._tHover = undefined;\r\n }\r\n\r\n ATON._hoveredUI = hui;\r\n ATON.fireEvent(\"UINodeHover\", hui);\r\n const S = ATON.getUINode(hui);\r\n if (S && S.onHover) S.onHover();\r\n\r\n ATON._tHover = ATON._clock.elapsedTime;\r\n }\r\n }\r\n};\r\n\r\n// Tokens for external API/services \r\n// TODO:\r\nATON.setSketchFabAPIToken = (tok)=>{\r\n ATON._extAPItokens.sketchfab = tok;\r\n};\r\n\r\n\r\nexport default ATON;\r\n\r\n\r\n"]} \ No newline at end of file diff --git a/public/examples/pbr-basic-shadow/index.html b/public/examples/pbr-basic-shadow/index.html index 98994342..60cda67d 100644 --- a/public/examples/pbr-basic-shadow/index.html +++ b/public/examples/pbr-basic-shadow/index.html @@ -23,8 +23,7 @@ - - +