architwin 1.0.39 → 1.0.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bundle/sdk.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  //@ts-ignore
2
2
  /// <reference types="webxr" />
3
3
 
4
+ //@ts-ignore
4
5
  import * as THREE from 'three';
6
+ //@ts-ignore
5
7
  import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer';
6
8
 
7
9
  export declare type Vector2 = {
@@ -1 +1 @@
1
- var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P((function(resolve){resolve(value)}))}return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))};import axios from"axios";import{planeType,planeFactory,gltfType,gltfFactory,boxType,boxFactory,textType,textFactory}from"./loaders";import{meterToMillimeter,generateRandomUniqueNumber}from"./convert";import JSZip from"jszip";import JSZipUtils from"jszip-utils";import ShortUniqueId from"short-unique-id";import*as minimap from"./minimap";import"../static/map.css";const _config={aws:{region:"ap-northeast-1",accessKeyId:"AKIAVVUXZ66KW7GBSW7A",secretAccessKey:"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'"},mp:{appKey:"a3ae8341bd8f44899eba16df86307d7d",urlParams:["help","play","nt","qs","brand","dh","tour","gt","hr","mls","mt","tagNav","pin","portal","f","fp","lang","kb","lp","st","title","tourcta","wts","ts","hl","vr","nozoom","search","wh"]},meet:{meetingKey:"caxaodrjl2sfxycnegzmxvkb4zp1fe"}};let _apiURL="http://localhost:5173/api";let _appKey=_config.mp.appKey;const urlParams=_config.mp.urlParams;let _iframe={};let _api;let _spaceId="";let _space=null;let _url="";let _mpConfig={};let _atwin={};let _tags=[];let _objects=[];let tags=[];let sweeps=[];let _allSlideShow=[];let _slideShowImage=[];let _currentSlideShowID=0;let _currentSlideIndex=0;let _currentSlideShow=null;var _timer=null;let _videos=[];let _currentViewMode="";let _3DXObjects=[];let _unrenderedObjects=[];let _transformControlNode;let _inputControlComponent;let selectedObject;let _previousTimeStamp=0;let _renderDistance=8;let _autoDetectNearbyObj=false;let _viewMode="public";let _transformMode="translate";let _transformComponent;let previousObjTransform={object_position:{x:0,y:0,z:0},object_rotation:{_x:0,_y:0,_z:0},object_scale:{x:0,y:0,z:0}};let currentObjTransform={object_position:{x:0,y:0,z:0},object_rotation:{_x:0,_y:0,_z:0},object_scale:{x:0,y:0,z:0}};let _previousAction;let actionHistory=[];let _currentSweep=null;let _currentCameraPose={};let _sweeps=[];let _isInitialLoad=true;let _hasRegisteredLoaders=false;let _showMinimap=false;let _sceneObject;let _assetLibrary=[];let _objectMarker;let _pointerSubscription;let _pointerCoord;let _urlComponentPaths=[];let _textDimensions={top:{node:null,component:null},bottom:{node:null,component:null},left:{node:null,component:null},right:{node:null,component:null}};let _textDimensionIds=[];let state={isLoading:false,loaded:false,error:"",data:null};const supportedMediaTypes=["WMV","MOV","JPG","PNG","JPEG","image","video","FRAME"];const supportedModelTypes=["GLB","GLTF","FBX"];const supportedFileTypes=["ZIP",...supportedMediaTypes,...supportedModelTypes];function connectSpace(url,auth,config){return __awaiter(this,void 0,void 0,(function*(){console.log("connectSpace()");console.log("__config",config);_mpConfig=config;_url=url;if("apiURL"in auth){console.log("'apiURL' in auth");const lastString=auth.apiURL.slice(-1);if(lastString!=="/"){auth.apiURL+="/"}_apiURL=auth.apiURL}if("appKey"in config){console.log("'appKey' in config");_appKey=config.appKey}console.log("_apiURL",_apiURL);const api=axios.create({baseURL:_apiURL,headers:{"Access-Control-Allow-Origin":"*","Content-Type":"multipart/form-data",Authorization:auth.apiKey}});_api=api;if(config.viewMode==="interactive"){_viewMode="interactive"}const showcase=document.getElementById(config.iframeId);_iframe=showcase;if(url.includes("https://my.matterport.com/show/")){console.log("URL IS MATTERPORT");yield loadDefaultMpSpace(url,config,showcase)}else{console.log("URL IS REV-KITTEN");yield loadAtwinSpace(url,auth,config,showcase)}}))}function loadDefaultMpSpace(url,config,showcase){return __awaiter(this,void 0,void 0,(function*(){console.log("loadDefaultMpSpace(url: string, showcase: HTMLIFrameElement)",url,showcase);const iframeSrc=getIframeSrc(config,url);console.log("__iframeSrc",iframeSrc);showcase.src=iframeSrc;const showcaseWindow=showcase.contentWindow;showcase.addEventListener("load",(()=>__awaiter(this,void 0,void 0,(function*(){console.log('iframe.addEventListener("load")');console.log("showcaseWindow",showcaseWindow);try{_atwin=yield showcaseWindow.MP_SDK.connect(showcaseWindow);console.log("Hello Bundle SDK",_atwin);_atwin.App.state.subscribe((appState=>__awaiter(this,void 0,void 0,(function*(){console.log("appState",appState);if(appState.phase===_atwin.App.Phase.LOADING){console.log("App is loading...");yield _setTags()}else if(appState.phase===_atwin.App.Phase.STARTING){console.log("App is starting...")}else if(appState.phase===_atwin.App.Phase.PLAYING){console.log("App is playing...");onShowcaseConnect()}}))))}catch(e){console.error(e)}}))));const _setTags=()=>__awaiter(this,void 0,void 0,(function*(){console.log("_setTags()");const mpTags=yield _atwin.Mattertag.getData();if(mpTags){const filteredMpTags=mpTags.map((i=>{const x={};x.id=i.sid;x.name=i.label;return x}));tags=filteredMpTags;console.log("tags",tags)}}))}))}function loadAtwinSpace(url,auth,config,showcase){var _a;return __awaiter(this,void 0,void 0,(function*(){console.log("loadAtwinSpace(url: string, auth: { apiKey: string; user: IUser },config: IMPConfig, showcase: HTMLIFrameElement)");const spaceId=getSpaceId(url);_spaceId=spaceId;if(!spaceId){console.error("spaceId is undefined");return}if(_isInitialLoad){yield loginUser(auth.user)}const space=yield getSpace(spaceId);if(!space){console.error("space is undefined");return}setSpace(space);const iframeSrc=getIframeSrc(config,space.space_url);console.log("__iframeSrc",iframeSrc);showcase.src=iframeSrc;const tags=yield getTags(space);if(!tags){console.log("tags is undefined");return}setTags(tags);if(_isInitialLoad){(_a=showcase.contentWindow)===null||_a===void 0?void 0:_a.location.reload()}_isInitialLoad=false;const showcaseWindow=showcase.contentWindow;showcase.addEventListener("load",(()=>__awaiter(this,void 0,void 0,(function*(){console.log('iframe.addEventListener("load")');console.log("showcaseWindow",showcaseWindow);if(showcaseWindow.MP_SDK){try{_atwin=yield showcaseWindow.MP_SDK.connect(showcaseWindow);console.log("Hello Bundle SDK",_atwin);onShowcaseConnect()}catch(e){console.error(e)}}else{console.log("No showcaseWindow.MP_SDK found")}}))))}))}function onShowcaseConnect(){return __awaiter(this,void 0,void 0,(function*(){console.log("onShowcaseConnect()");try{const modelData=yield _atwin.Model.getData();console.log("Model sid:"+modelData.sid);_atwin.App.state.subscribe((appState=>__awaiter(this,void 0,void 0,(function*(){console.log("appState",appState);if(appState.phase===_atwin.App.Phase.LOADING){console.log("App is loading...");yield get3DObjects(_spaceId)}else if(appState.phase===_atwin.App.Phase.STARTING){console.log("App is starting...");yield hideTags()}else if(appState.phase===_atwin.App.Phase.PLAYING){console.log("App is playing...");yield showTags(_tags);yield getSweeps();_sceneObject=yield createSceneObject();yield setLighting();yield registerCustomLoaders();yield _atwin.Asset.registerTexture("targetPointer","../static/objective.png");create3dMarker();_atwin.Sweep.current.subscribe((function(currentSweep){return __awaiter(this,void 0,void 0,(function*(){console.log("===currentSweep",currentSweep);if(currentSweep.sid===""){console.log("Not currently stationed at a sweep position")}else{_currentSweep=currentSweep;videoAutoPlay()}}))}));_atwin.Camera.pose.subscribe((function(pose){return __awaiter(this,void 0,void 0,(function*(){_currentCameraPose=pose;const hasElapsed=hasTimeElapsed(300);if(hasElapsed){console.log("_unrenderedObjects "+_unrenderedObjects.length);yield renderOnDemand()}if(hasTimeElapsed(1e3)&&_autoDetectNearbyObj){getNearbyObjects({type:"ALL",distance:2})}}))}));_atwin.Mode.current.subscribe((mode=>{_currentViewMode=mode}));if("mapId"in _mpConfig){yield minimap.setMap(_atwin,_appKey,_mpConfig.mapId)}}}))))}catch(e){console.error(e)}}))}function hasTimeElapsed(maxTime){const currentTimestamp=Date.now();const differenceInMilliseconds=(currentTimestamp-_previousTimeStamp)%1e3;_previousTimeStamp=currentTimestamp;if(differenceInMilliseconds>=maxTime){return true}else{return false}}function getNearbyUnrenderedObjects(payload){let toBeRendered=[];const currentPose={x:_currentCameraPose.position.x,y:_currentCameraPose.position.y,z:_currentCameraPose.position.z};toBeRendered=_unrenderedObjects.filter((obj=>{const obj_pos={x:obj.object_position.x,y:obj.object_position.y,z:obj.object_position.z};const distance=calculateDistance(currentPose,obj_pos);return distance<payload.distance}));const filtered=_unrenderedObjects.filter((obj=>toBeRendered.indexOf(obj)===-1));_unrenderedObjects=filtered;console.log("render toBeRendered "+toBeRendered.length);return toBeRendered}function getNearbyObjects(payload){if(payload.type===undefined||payload.type===""){payload.type="ALL"}if(payload.distance===undefined){payload.distance=2}const pos1={x:_currentCameraPose.position.x,y:_currentCameraPose.position.y,z:_currentCameraPose.position.z};let three_d=[];let videos=[];let slideshows=[];if(payload.type==="ALL"||"3DX"){three_d=_3DXObjects.filter((obj=>{const pos2={x:obj.node.position.x,y:obj.node.position.y,z:obj.node.position.z};const distance=calculateDistance(pos1,pos2);console.log("3DX Distance: "+distance);return distance<payload.distance}))}if(payload.type==="ALL"||"VIDEO"){videos=_videos.filter((vid=>{const pos2={x:vid.node.position.x,y:vid.node.position.y,z:vid.node.position.z};const distance=calculateDistance(pos1,pos2);console.log("Video Distance: "+distance);return distance<payload.distance}))}if(payload.type==="ALL"||"SLIDESHOW"){slideshows=_allSlideShow.filter((slide=>{const pos2={x:slide.node.position.x,y:slide.node.position.y,z:slide.node.position.z};const distance=calculateDistance(pos1,pos2);console.log("Slideshow Distance: "+distance);return distance<payload.distance}))}console.log("nearby3DXObjects "+three_d.length);console.log("nearbyVideos "+videos.length);console.log("nearbySlideshows "+slideshows.length);return{x3d:three_d,videos:videos,slideshows:slideshows}}function setRenderDistance(distance){if(!Number.isInteger(distance)){console.error("Render distance argument is not a valid number");return}_renderDistance=distance}function createSceneObject(){return __awaiter(this,void 0,void 0,(function*(){const[sceneObject]=yield _atwin.Scene.createObjects(1);return sceneObject}))}function show3DObjects(object,options=null,action="loading"){var _a;return __awaiter(this,void 0,void 0,(function*(){const modelNode=_sceneObject.addNode();if(options==null){options={url:(_a=object.object_data)===null||_a===void 0?void 0:_a.amazon_uri}}const component=modelNode.addComponent(getComponentLoader(object.object_data),options);if(!component.inputs){console.error("component.inputs is undefined");return}const objTransformation={object_position:typeof object.object_position!=="string"?object.object_position:JSON.parse(object.object_position),object_rotation:object.object_rotation,object_scale:object.object_scale};setObjectTransformation(modelNode,objTransformation);let type;if(object.object_data.object_type=="image"||object.object_data.object_type=="video"){type="FRAME"}else{type=object.object_data.object_type}modelNode.start();if(action==="adding"){console.log("Saving object...");const id=yield addShowcaseObject(object);if(id){console.log("Saved object",id);object.id}else{object.id=generateRandomUniqueNumber()}}_3DXObjects.push({object:object,component:component,node:modelNode,type:type});console.log("_3DXObjects ",component);if(_viewMode==="interactive"&&object.object_data.object_type=="GLB"){const eventPath=_sceneObject.addEmitPath(component,"gltfevents");_sceneObject.spyOnEvent(new ClickSpy(eventPath,modelNode,component,object));_sceneObject.addInputPath(component,"animationState",`animationState_${object.id}`)}else if(_viewMode==="interactive"&&object.object_data.object_type=="BOX"){const eventPath=_sceneObject.addEmitPath(component,"boxEvents");_sceneObject.spyOnEvent(new ClickSpy(eventPath,modelNode,component,object));_sceneObject.addInputPath(component,"basePosition",`basePosition_${object.id}`);_sceneObject.addInputPath(component,"localPosition",`localPosition_${object.id}`)}else if(supportedMediaTypes.includes(object.object_data.object_type)){const emitPath=_sceneObject.addEmitPath(component,"planeEvents");_sceneObject.spyOnEvent(new EmitSpy(emitPath,modelNode,component,object));_sceneObject.addInputPath(component,"url",`url_${object.object_data.id}`);_sceneObject.addInputPath(component,"type",`type_${object.object_data.id}`)}}))}function setAnimationState(action,modelId){const actions=["play","stop"];let animationStatePath;if(actions.includes(action)){if(modelId){for(const{desc:desc,path:path}of _sceneObject.pathIterator()){if(desc.id===`animationState_${modelId}`){animationStatePath=path}}animationStatePath.set(action);return}console.error("id of object is undefined");return}console.error("Argument for action is not valid");return}function show3dText(object,options=null,direction="top"){const modelNode=_sceneObject.addNode();const text=options.text;options={text:text,fontSize:.09,background:false,centered:true,height:.001,curveSegments:12,bevelEnabled:false,bevelThickness:10,bevelSize:8,bevelOffset:0,bevelSegments:5};const component=modelNode.addComponent(getComponentLoader(object.object_data),options);if(!component.inputs){console.error("component.inputs is undefined");return}const rotation={x:currentObjTransform.object_rotation._x,y:currentObjTransform.object_rotation._y,z:currentObjTransform.object_rotation._z};setTextDimensionPosition(modelNode,component,direction,currentObjTransform.object_position,rotation);modelNode.start();_textDimensionIds.push(modelNode.id);_sceneObject.addInputPath(component,"visible",`visible_${modelNode.id}`);if(direction=="left"){_sceneObject.addInputPath(component,"text",`textDepth_${modelNode.id}`)}else if(direction=="right"){_sceneObject.addInputPath(component,"text",`textHeight_${modelNode.id}`)}else if(direction=="bottom"){_sceneObject.addInputPath(component,"text",`textBottom_${modelNode.id}`)}return{node:modelNode,component:component}}function showObjectDimensions(selected){console.log("Selected object",selectedObject);const textObj=selected.object;textObj.object_data.object_type="TEXT";const THREE=selected.component.context.three;const objectModel=selected.component.mesh;const boundingBox=(new THREE.Box3).setFromObject(objectModel);const width=boundingBox.max.x-boundingBox.min.x;const depth=boundingBox.max.y-boundingBox.min.y;const height=boundingBox.max.z-boundingBox.min.z;_textDimensions.top=show3dText(textObj,{text:selected.object.object_data.name},"top");_textDimensions.bottom=show3dText(textObj,{text:`W: ${meterToMillimeter(width)}mm`},"bottom");_textDimensions.left=show3dText(textObj,{text:`D: ${meterToMillimeter(depth)}mm`},"left");_textDimensions.right=show3dText(textObj,{text:`H: ${meterToMillimeter(height)}mm`},"right");console.log("Selected object",selectedObject)}function hideObjectDimensions(){let visiblePath;if(!_textDimensions.top){console.error("_textDeminsion is undefined");return}_textDimensionIds.forEach((index=>{for(const{desc:desc,path:path}of _sceneObject.pathIterator()){if(desc.id===`visible_${_textDimensionIds[index]}`){visiblePath=path}}visiblePath.set(false)}))}function setTextDimensionLabel(node,size){let textPath;for(const{desc:desc,path:path}of _sceneObject.pathIterator()){if(desc.id===`textDepth_${node.id}`){textPath=path;textPath.set(`D: ${meterToMillimeter(size.z)}mm`)}if(desc.id===`textHeight_${node.id}`){textPath=path;textPath.set(`H: ${meterToMillimeter(size.y)}mm`)}if(desc.id===`textBottom_${node.id}`){textPath=path;textPath.set(`W: ${meterToMillimeter(size.x)}mm`)}}}function setTextDimensionPosition(node,component,direction,position,rotation){console.log("setTextDimensionPosition()");const THREE=selectedObject.component.context.three;const objectModel=selectedObject.component.mesh;const boundingBox=(new THREE.Box3).setFromObject(objectModel);const width=boundingBox.max.x-boundingBox.min.x;const depth=boundingBox.max.y-boundingBox.min.y;const height=boundingBox.max.z-boundingBox.min.z;let newPosition;if(direction==="top"){newPosition={x:position.x-rotation.y,y:position.y+height/2,z:position.z-depth+rotation.z}}else if(direction==="bottom"){newPosition={x:position.x,y:position.y-height/2,z:position.z-depth/3}}else if(direction==="left"){newPosition={x:position.x-width/1.3,y:position.y-height/2,z:position.z-depth+rotation.y}}else if(direction==="right"){newPosition={x:position.x+width/1.3-rotation.y,y:position.y,z:position.z-depth}}const objTransformation={object_position:{x:newPosition.x,y:newPosition.y,z:newPosition.z},object_rotation:rotation,object_scale:{x:.001,y:.001,z:.001}};setTextDimensionLabel(node,{x:width,y:depth,z:height});setObjectTransformation(node,objTransformation)}function renderOnDemand(){return __awaiter(this,void 0,void 0,(function*(){if(_unrenderedObjects.length!==0){console.log("renderOnDemand()");registerCustomLoaders();const objects=getNearbyUnrenderedObjects({type:"",distance:_renderDistance});objects.forEach((obj=>__awaiter(this,void 0,void 0,(function*(){var _a,_b,_c,_d;if(((_a=obj.object_data)===null||_a===void 0?void 0:_a.object_type)==="FBX"||((_b=obj.object_data)===null||_b===void 0?void 0:_b.object_type)==="GLB"||supportedMediaTypes.includes(obj.object_data.object_type)){yield show3DObjects(obj)}else if(((_c=obj.object_data)===null||_c===void 0?void 0:_c.object_type)==="MP4"){yield showVideoObjects(obj)}else if(((_d=obj.object_data)===null||_d===void 0?void 0:_d.object_type)==="ZIP"){yield showSlideScreenModel(obj)}}))))}}))}function getIframeSrc(config,url){console.log("getIframeSrc()",config,url);const modelId=url.split("?m=")[1];if(!modelId){console.error("modelId is undefined");return""}let src=``;if("bundlePath"in config){const lastString=config.bundlePath.slice(-1);if(lastString!=="/"){config.bundlePath+="/"}src+=`${config.bundlePath}showcase.html?m=${modelId}&applicationKey=${_appKey}&newtags=1`}else{if(config.prod===undefined||config.prod===null){config.prod=true}if(config.prod){src+=`node_modules/architwin/bundle/showcase.html?m=${modelId}&applicationKey=${_appKey}&newtags=1`}else{src+=`architwin/bundle/showcase.html?m=${modelId}&applicationKey=${_appKey}&newtags=1`}}console.log("__src",src);for(let param of urlParams){if(param in config){src+=`&${param}=${config[param]}`}}return src}function loginUser(user){return __awaiter(this,void 0,void 0,(function*(){console.log("loginUser(user)",user);const response=yield _api.post("/cas/tickets?email="+user.email+"&password="+user.password);console.log("loginUser, response",response.status,response.data);if(response.status==200){return response.data}else{return response}}))}function getSpace(spaceId){return __awaiter(this,void 0,void 0,(function*(){console.log("getShowcase(spaceId: string)",spaceId);const response=yield _api.get(`/v1/showcases/id/${spaceId}`);console.log("response",response);if(response.status===200){if(response.data.data.length===0){console.error("No data")}return response.data.data[0]}else{console.error("Error in fetchShowcase()"+response)}return null}))}function getSpaceId(url){const urlArray=url.split(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/);const path=urlArray[5];const spaceId=path.split("/")[3];console.log("urlArray",urlArray);console.log("path",path);if(!spaceId){console.error("spaceId is undefined");return}return spaceId}function setSpace(space){console.log("setSpace(space: ISpace)",space);_space=space}function getTags(space){return __awaiter(this,void 0,void 0,(function*(){console.log("getTags()");try{const response=yield _api.get(`/v1/tags/showcase-id/${space.id}`);console.log("response",response);if(response.status===200){const tags=response.data.data;if(!tags){console.error("tags is undefined")}return tags}else{console.error("Custom Error: Unable to fetch tags")}}catch(error){console.error(error)}return null}))}function setTags(tags){return __awaiter(this,void 0,void 0,(function*(){console.log("setTags()",tags);_tags=tags.map((tag=>{tag.json_data=JSON.parse(tag.json_data);tag.json_data.id=tag.json_data.sid;return tag}));mapTags(_tags)}))}function get3DObjects(showcase_id){return __awaiter(this,void 0,void 0,(function*(){if(showcase_id){try{const id=parseInt(showcase_id);console.log("showcase_id "+id);const response=yield _api.get(`/v1/showcase-objects/showcase-id/${id}`);const showcase_objects=response.data.data;console.log("showcase_objects "+JSON.stringify(showcase_objects));const object_ids=showcase_objects.map((obj=>obj.object_id));try{const response=yield _api.get(`/v1/objects`);console.log("Finished getting objects");const object_data=response.data.data.filter((obj=>object_ids.includes(obj.id)));_assetLibrary=object_data;console.log("object_data length "+object_data.length);const objectDataMap=object_data.reduce(((map,obj)=>{map[obj.id]=obj;return map}),{});console.log("object_data"+JSON.stringify(object_data));const threed_objects=showcase_objects.map((showcase=>{const target=objectDataMap[showcase.object_id];if(target){showcase.object_data=target}if(showcase.object_position){showcase.object_position=typeof showcase.object_position==="string"?JSON.parse(showcase.object_position):showcase.object_position}if(showcase.object_rotation){showcase.object_rotation=typeof showcase.object_rotation==="string"?JSON.parse(showcase.object_rotation):showcase.object_rotation}if(showcase.object_scale){showcase.object_scale=typeof showcase.object_scale==="string"?JSON.parse(showcase.object_scale):showcase.object_scale}return showcase}));console.log("get3DObjectsByShowcaseId "+JSON.stringify(threed_objects));_unrenderedObjects=threed_objects;const check=_unrenderedObjects.filter((obj=>obj.object_data.object_type==="PNG"));console.log("Check for media screen",check);return threed_objects}catch(error){console.error("threed_objects "+error)}}catch(error){console.error("get3DObjectsByShowcaseId "+error)}}return[]}))}function gotoTag(tag_id){return __awaiter(this,void 0,void 0,(function*(){console.log("gotoTag(tag: tag_id)",tag_id);if(!tag_id){console.error("tag is undefined");return}try{yield _atwin.Mattertag.navigateToTag(tag_id,_atwin.Mattertag.Transition.FLY)}catch(error){console.error(error)}}))}function showTags(tags){return __awaiter(this,void 0,void 0,(function*(){tags.forEach(((tag,indx)=>__awaiter(this,void 0,void 0,(function*(){const mpData=tag.json_data;if(!mpData){console.error("tag.json_data/mpData is undefined");return}const tagIds=yield _atwin.Tag.add({anchorPosition:mpData.anchorPosition,color:mpData.color,description:mpData.description,id:mpData.sid,label:mpData.label,stemVector:mpData.stemVector,stemVisible:mpData.stemVisible});if(tagIds){tag.json_data.id=tagIds[0];if(tag.json_data.media&&tag.json_data.media.src.trim()!==""){try{console.log("Attaching media...");const[attachmentId1]=yield _atwin.Tag.registerAttachment(tag.json_data.media.src);tag.json_data["attachments"]=[attachmentId1];yield _atwin.Tag.attach(tag.json_data.sid,attachmentId1);console.log("Media successfully attached")}catch(error){console.warn("Custom warn: Media not attached: Invalid media src link: "+error);console.warn(`mediaSrc: ${tag.json_data.media.src} | tag index: ${indx}`)}}}}))));console.log("tags",_tags)}))}function hideTags(){return __awaiter(this,void 0,void 0,(function*(){console.log("hideTags()");const tags=yield _atwin.Mattertag.getData();if(tags){const tagIds=tags.map((i=>i.sid));yield _atwin.Mattertag.remove(tagIds);console.log("Tags removed in space: ",tagIds)}}))}function mapTags($tags){console.log("mapTags()",$tags);tags=$tags.map((i=>{const x={};x.id=i.json_data.id;x.name=i.json_data.label;return x}));console.log("tags",tags)}function getCurrentSweep(){return _currentSweep}function getCurrentCameraPose(){return _currentCameraPose}function getCameraPosition(){return _currentCameraPose.position}function getCurrentSweepPosition(){return _currentSweep.position}function getSweeps(){return __awaiter(this,void 0,void 0,(function*(){console.log("Getting Sweeps in Space");_atwin.Sweep.data.subscribe({onCollectionUpdated:function(collection){console.log("Sweeps In Space",collection);if(!collection){console.log("No Sweeps in loaded Space")}_sweeps=collection;const sw=Object.values(_sweeps);sweeps=sw.map((item=>({id:item.uuid,position:item.position,neighbors:item.neighbors})))}});return sweeps}))}function moveToSweep(sweepId){return __awaiter(this,void 0,void 0,(function*(){const transition=_atwin.Sweep.Transition.FLY;const transitionTime=2e3;console.log("Sweep Move",sweepId);_atwin.Sweep.moveTo(sweepId,{transition:transition,transitionTime:transitionTime}).then((function(){console.log("Sweep Arrived at sweep "+sweepId)})).catch((function(error){console.log("Sweep Error on Arriving",error)}))}))}function getNearbySweeps(sweepId){return __awaiter(this,void 0,void 0,(function*(){if(sweepId){const nearby=yield sweeps.find((item=>item.id==sweepId)).neighbors;console.log("Nearby Sweeps",nearby);return nearby}else{console.log("No Nearby Sweeps")}}))}function getComponentLoader(object){console.log("getComponentLoader()",object);if(object){let index=object.object_type;if(supportedMediaTypes.includes(object.object_type)){console.log("====Loader planeType");return planeType}let component={FBX:_atwin.Scene.Component.FBX_LOADER,GLB:gltfType,MP4:"liveVideo",ZIP:"slideScreenModel",BOX:boxType,TEXT:textType};console.log("====Loader",component[index]);return component[index]||""}return""}function setSelectedObject(data,node,component,type){selectedObject={object:data,component:component,node:node,type:type};const previousCoords={object_position:selectedObject.node.obj3D.position,object_rotation:selectedObject.node.obj3D.rotation,object_scale:selectedObject.node.obj3D.scale};_previousAction=JSON.stringify(previousCoords);actionHistory.push(_previousAction);console.log("Previous transform "+JSON.stringify(previousObjTransform));console.log("setSelectedObject()")}function clearSelectedObject(){console.log("clearSelectedObject()");selectedObject=undefined}function setLighting(){return __awaiter(this,void 0,void 0,(function*(){const[sceneObject]=yield _atwin.Scene.createObjects(1);const lights=sceneObject.addNode();lights.addComponent("mp.directionalLight",{intensity:.6,color:{r:1,g:1,b:1}});lights.addComponent("mp.ambientLight",{intensity:.6,color:{r:1,g:1,b:1}});lights.start()}))}function removeTransformControls(){if(!_transformControlNode){console.error("_transformControlNode is undefined");return}if(!_inputControlComponent){console.error("!_inputControlComponent is undefined");return}_transformControlNode.stop();_inputControlComponent.cancel();console.log("removeTransformControls()")}function setTransformControls(selectedObject,mode="translate"){console.log("Object to be transformed "+selectedObject.object.object_data.name);removeTransformControls();const transformNode=_sceneObject.addNode();const transformComponent=transformNode.addComponent("mp.transformControls");_transformControlNode=transformNode;const inputComponent=transformNode.addComponent("mp.input",{eventsEnabled:true,userNavigationEnabled:true});_transformComponent=transformComponent;if(selectedObject.object.object_data.object_type=="GLB"){const eventPath=_sceneObject.addEmitPath(selectedObject.component,"gltfevents");_inputControlComponent=inputComponent.spyOnEvent(new DragSpy(eventPath,selectedObject.node,selectedObject.component,selectedObject.object))}else if(selectedObject.object.object_data.object_type=="BOX"){const eventPath=_sceneObject.addEmitPath(selectedObject.component,"boxEvents");_inputControlComponent=inputComponent.spyOnEvent(new DragSpy(eventPath,selectedObject.node,selectedObject.component,selectedObject.object))}else if(supportedMediaTypes.includes(selectedObject.object.object_data.object_type)){const eventPath=_sceneObject.addEmitPath(selectedObject.component,"planeEvents");_inputControlComponent=inputComponent.spyOnEvent(new DragSpy(eventPath,selectedObject.node,selectedObject.component,selectedObject.object))}transformNode.start();transformComponent.inputs.selection=selectedObject.node;transformComponent.inputs.mode=mode}function setTransformMode(mode){return __awaiter(this,void 0,void 0,(function*(){if(mode=="translate"){_transformMode="translate"}else if(mode=="rotate"){_transformMode="rotate"}else if(mode=="scale"){_transformMode="scale"}else{console.error("Transform mode not supported or incorrect")}_transformComponent.inputs.mode=_transformMode}))}function revertTransform(action="undo"){if(!selectedObject){console.error("selectedObject is undefined.");return}if(!currentObjTransform){console.error("currentObjTransform is undefined");return}if(actionHistory.length<=0){console.error("actionHistory is empty");return}let targetIndex;let nextIndex;const index=actionHistory.indexOf(JSON.stringify(currentObjTransform));console.log(`Action is ${action} and index is ${index}`);if(action==="undo"){if(index-1>=0){targetIndex=index-1;nextIndex=targetIndex-1}else{return false}}else if(action==="redo"){if(index+1<=actionHistory.length){targetIndex=index+1;nextIndex=targetIndex+1}else{return false}}else{console.error("Incorrect function argument for revertTransform");return false}previousObjTransform=JSON.parse(_previousAction);if(!actionHistory[targetIndex]){console.error("actionHistory is either empty or undefined");return}const objectTransform=JSON.parse(actionHistory[targetIndex]);const euler=convertToEuler(objectTransform.object_rotation);objectTransform.object_rotation={_x:euler.x,_y:euler.y,_z:euler.z};setObjectTransformation(selectedObject.node,objectTransform,true);console.log("Action history length "+actionHistory.length);console.log("Current history position "+index);console.log("Target history position "+targetIndex);currentObjTransform=JSON.parse(actionHistory[targetIndex]);if(action=="undo"&&nextIndex>=0){return false}else if(action=="redo"&&nextIndex<=actionHistory.length){return false}else{return true}}function clearActionHistory(){console.info("clearActionHistory()");actionHistory=[]}function convertToEuler(coords){const eulerX=Math.atan2(coords._x,coords._x);const eulerY=Math.atan2(-coords._x,Math.sqrt(coords._y*coords._y+coords._z*coords._z));const eulerZ=Math.atan2(coords._x,coords._x);const degreesX=eulerX*(180/Math.PI);const degreesY=eulerY*(180/Math.PI);const degreesZ=eulerZ*(180/Math.PI);const eulerCoords={x:degreesX,y:degreesY,z:degreesZ};console.log("Euler coords "+JSON.stringify(eulerCoords));return eulerCoords}function setObjectTransformation(node,transform,reverting=false){node.obj3D.scale.set(transform.object_scale.x,transform.object_scale.y,transform.object_scale.z);node.obj3D.position.set(transform.object_position.x,transform.object_position.y,transform.object_position.z);if(reverting){node.obj3D.rotation.set(transform.object_rotation._x,transform.object_rotation._y,transform.object_rotation._z)}else{node.obj3D.rotation.set(transform.object_rotation.x,transform.object_rotation.y,transform.object_rotation.z)}}function calculateDistance(pos1,pos2){const dx=pos2.x-pos1.x;const dy=pos2.y-pos1.y;const dz=pos2.z-pos1.z;return Math.sqrt(dx*dx+dy*dy+dz*dz)}function showVideoObjects(object,action="loading"){var _a,_b;return __awaiter(this,void 0,void 0,(function*(){const liveStreamNode=_sceneObject.addNode();var liveStreamComponent=liveStreamNode.addComponent(getComponentLoader(object.object_data),{url:(_a=object.object_data)===null||_a===void 0?void 0:_a.amazon_uri});liveStreamNode.position.set(object.object_position.x,object.object_position.y,object.object_position.z);liveStreamNode.obj3D.rotation.set(object.object_rotation.x,object.object_rotation.y,object.object_rotation.z);liveStreamNode.scale.set(object.object_scale.x,object.object_scale.y,object.object_scale.z);if(liveStreamComponent.outputs.loadingState!="Error"){liveStreamNode.start()}liveStreamComponent.inputs.src=(_b=object.object_data)===null||_b===void 0?void 0:_b.amazon_uri;if(action==="adding"){console.log("Saving object...");const id=yield addShowcaseObject(object);if(id){console.log("Saved object",id);object.id}}_videos.push({object:object,component:liveStreamComponent,node:liveStreamNode,collider:liveStreamComponent.outputs,type:"VIDEO"})}))}function playVideo(videoId){let videoObject=_videos.find((object=>object.object.id==videoId));if(videoObject){videoObject.component.video.play()}else{console.error("Unable to find video object using that id")}}function pauseVideo(videoId){let videoObject=_videos.find((object=>object.object.id==videoId));if(videoObject){videoObject.component.video.pause()}else{console.error("Unable to find video object using that id")}}function videoAutoPlay(){function nearestVideo(videoObject){return __awaiter(this,void 0,void 0,(function*(){let videoPosition=videoObject.object.object_position;let cameraPosition=getCurrentSweepPosition();const camPos={x:cameraPosition.x,y:cameraPosition.y,z:cameraPosition.z};const videoPos={x:videoPosition.x,y:videoPosition.y,z:videoPosition.z};const THREE=videoObject.component.context.three;const v3camPos=new THREE.Vector3(cameraPosition.x,cameraPosition.y,cameraPosition.z);const v3videoPos=new THREE.Vector3(videoPosition.x,videoPosition.y,videoPosition.z);const computedDistance=v3camPos.distanceTo(v3videoPos);try{if(videoObject.object.autoplay&&videoObject.object.autoplay_distance&&computedDistance<videoObject.object.autoplay_distance){setVideoPlayback("play",videoObject.component.video)}else{setVideoPlayback("pause",videoObject.component.video)}}catch(e){console.error("Unable to play or stop video")}}))}_videos.forEach((videoObject=>nearestVideo(videoObject)))}function createVideoComponent(){function videoRenderer(){this.inputs={visible:true,userNavigationEnabled:true,eventsEnabled:true,colliderEnabled:true,src:null};this.outputs={texture:null,video:null,aspect:720/480};this.onInit=function(){this.video;this.texture};this.events={"INTERACTION.CLICK":true};this.onEvent=function(eventType,eventData){return __awaiter(this,void 0,void 0,(function*(){if(eventType=="INTERACTION.CLICK"&&_viewMode==="interactive"){let video=_videos.filter((l=>{var _a,_b,_c,_d;return(_d=((_b=(_a=l.collider)===null||_a===void 0?void 0:_a.collider)===null||_b===void 0?void 0:_b.uuid)==((_c=eventData.collider)===null||_c===void 0?void 0:_c.uuid))!==null&&_d!==void 0?_d:false}))[0];console.log("Video object "+JSON.stringify(video.object));const selectedObj={object:video.object,node:video.node,component:video.component};clearActionHistory();setSelectedObject(video.object,video.node,video.component,"VIDEO");setTransformControls(selectedObj)}}))};this.onInputsUpdated=function(previous){this.releaseTexture();const THREE=this.context.three;if(!this.inputs.src){this.video.src="";return}if(this.inputs.src instanceof HTMLVideoElement){this.video=this.inputs.src}else{this.video=this.createVideoElement();if(typeof this.inputs.src==="string"){this.video.src=this.inputs.src}else{this.video.srcObject=this.inputs.src}this.video.load()}this.texture=new THREE.VideoTexture(this.video);this.texture.minFilter=THREE.LinearFilter;this.texture.magFilter=THREE.LinearFilter;this.texture.format=THREE.RGBFormat;var geometry=new THREE.PlaneGeometry(1,1);geometry.scale(1,480/720,1);geometry.translate(0,.33,0);this.material=new THREE.MeshBasicMaterial({map:this.texture,side:THREE.DoubleSide});var mesh=new THREE.Mesh(geometry,this.material);this.outputs.objectRoot=mesh;this.outputs.collider=mesh;mesh.visible=this.inputs.visible;this.outputs.texture=this.texture;this.outputs.video=this.video};this.releaseTexture=function(){if(this.texture){this.outputs.texture=null;this.texture.dispose()}};this.createVideoElement=function(){const video=document.createElement("video");video.setAttribute("id","htmlLivestreamVideo");video.crossOrigin="anonymous";video.setAttribute("height","480");video.setAttribute("width","720");video.setAttribute("webkit-playsinline","webkit-playsinline");video.setAttribute("controls","controls");video.muted=false;video.loop=true;video.volume=1;return video};this.onTick=function(tickDelta){};this.onDestroy=function(){this.material.dispose()};this.spyOnEvent=function(payload){console.log("payload",payload)}}function makeVideoRender(){return new videoRenderer}_atwin.Scene.register("liveVideo",makeVideoRender)}function createSlideScreenModel(){function SlideScreenModelRenderer(){this.inputs={src:null,userNavigationEnabled:true,eventsEnabled:true,colliderEnabled:true,visible:true};this.outputs={texture:null,t_image:null};this.onInit=function(){this.texture;this.t_image;this.material;this.mesh};this.events={"INTERACTION.CLICK":true};this.onEvent=function(eventType,eventData){return __awaiter(this,void 0,void 0,(function*(){console.log("onEventSlideShow",eventType,eventData);if(eventType=="INTERACTION.CLICK"){if(_allSlideShow.length>0){let slideshow=_allSlideShow.filter((l=>{var _a,_b,_c,_d;return(_d=((_b=(_a=l.collider)===null||_a===void 0?void 0:_a.collider)===null||_b===void 0?void 0:_b.uuid)==((_c=eventData.collider)===null||_c===void 0?void 0:_c.uuid))!==null&&_d!==void 0?_d:false}))[0];console.log("Slideshow object "+JSON.stringify(slideshow.object));if(_viewMode==="interactive"){const selectedObj={object:slideshow.object,node:slideshow.node,component:slideshow.component,type:"ZIP"};clearActionHistory();setSelectedObject(slideshow.object,slideshow.node,slideshow.component,"ZIP");setTransformControls(selectedObj)}console.log("slideShow eventData",slideshow);if(slideshow!=null){console.log("slideShow eventData",slideshow);var mousePosition=yield getMousePosition();var planePosition=slideshow.node.obj3D.position;console.log("MOUSE POSITION",mousePosition);console.log("PLANE POSITION",planePosition);if(slideshow.object.object_data.object_type=="ZIP"){if(slideshow.object.id!=_currentSlideShowID){_currentSlideIndex=_slideShowImage.find((elem=>elem.id===slideshow.object.id)).idx;console.log("CURRENT INDEX",_currentSlideIndex);_currentSlideShow=_slideShowImage.find((elem=>elem.id===slideshow.object.id)).images;console.log("CURRENT SLIDE",_currentSlideShow)}if(slideshow.object.id==_currentSlideShowID){console.log("ChangeImage",slideshow,_currentSlideShowID);if(planePosition.x<mousePosition.x){console.log("LEFT SIDE");clearInterval(_timer);this.inputs.src=imageStream("prev")}else if(planePosition.y<mousePosition.y){console.log("RIGHT SIDE");clearInterval(_timer);this.inputs.src=imageStream("next")}else if(planePosition.y>mousePosition.y){console.log("AUTOPLAY");_timer=setInterval((()=>{_currentSlideIndex=(_currentSlideIndex+1)%_currentSlideShow.length;console.log("CURRENT INDEX",_currentSlideIndex);this.inputs.src=imageStream("next")}),2e3)}}else{_currentSlideShowID=slideshow.object.id}}}}}}))};this.onInputsUpdated=function(previous){this.releaseTexture();const three=this.context.three;this.t_image=document.createElement("IMG");this.t_image.src=this.inputs.src;this.t_image.setAttribute("width","auto");this.t_image.setAttribute("height","auto");this.t_image.crossOrigin="anonymous";const planeGeo=new three.PlaneGeometry(1.5,1.5);planeGeo.translate(0,.33,0);if(previous.src!=this.inputs.src){this.texture=(new three.TextureLoader).load(this.t_image.src,((tex=this.texture)=>{tex.minFilter=three.LinearFilter;tex.magFilter=three.LinearFilter;tex.format=three.RGBAFormat;tex.needsUpdate=true;tex.onUpdate=this.textureUpdated;this.material=new three.MeshBasicMaterial({map:this.texture,side:three.DoubleSide,transparent:true,alphaTest:.5});this.mesh=new three.Mesh(planeGeo,this.material);this.mesh.scale.set(1,this.texture.image.height/this.texture.image.width,1);this.outputs.objectRoot=this.mesh;this.outputs.collider=this.mesh;this.outputs.texture=this.texture;this.outputs.t_image=this.t_image}))}if(this.mesh!=null){this.mesh.visible=this.inputs.visible}};this.textureUpdated=function(params){console.log("Update Callback",params)};this.releaseTexture=function(){if(this.texture){this.outputs.texture=null}};this.onTick=function(tickDelta){};this.onDestroy=function(){this.material.dispose();this.texture.dispose()}}function makeSlideScreenModelRenderer(){return new SlideScreenModelRenderer}_atwin.Scene.register("slideScreenModel",makeSlideScreenModelRenderer)}function registerCustomLoaders(){return __awaiter(this,void 0,void 0,(function*(){if(_hasRegisteredLoaders===false){console.log("registerCustomLoaders()");createVideoComponent();createSlideScreenModel();yield _atwin.Scene.registerComponents([{factory:planeFactory(_atwin),name:planeType},{factory:gltfFactory(_atwin),name:gltfType},{factory:boxFactory(_atwin),name:boxType},{factory:textFactory(_atwin),name:textType}]);_hasRegisteredLoaders=true}}))}function showSlideScreenModel(object,action="loading"){return __awaiter(this,void 0,void 0,(function*(){const modelNode=_sceneObject.addNode();const component=modelNode.addComponent("slideScreenModel");console.log("COMPONENT",component);const objTransformation={object_position:object.object_position,object_rotation:object.object_rotation,object_scale:object.object_scale};setObjectTransformation(modelNode,objTransformation);modelNode.start();yield addImageToSlideShow(object.object_data,component,object.id);console.log("SLIDE OUTPUT",component.outputs);if(action==="adding"){console.log("Saving object...");const id=yield addShowcaseObject(object);if(id){console.log("Saved object",id);object.id}}var slideShow={collider:component.outputs,object:object,node:modelNode,component:component,type:"ZIP"};_allSlideShow.push(slideShow);console.log("ALL SLIDESHOW",_allSlideShow)}))}function addImageToSlideShow(data,component,objectID){return __awaiter(this,void 0,void 0,(function*(){var dataList=[];yield new JSZip.external.Promise((function(resolve,reject){JSZipUtils.getBinaryContent(data.amazon_uri,(function(err,data){if(err){console.log("getBI error",err);reject(err)}else{console.log("getBI success",data);resolve(data)}}))})).then((function(data){console.log("data from getBI",data);return JSZip.loadAsync(data)})).then((data=>{console.log("data from loadAsync",data);for(let key in data.files){if(key.includes("__MACOSX"))continue;if(key.includes(".DS_Store"))continue;if(data.files[key].dir)continue;let base=data.file(data.files[key].name).async("base64");base.then((res=>{dataList.push({name:data.files[key].name,path:`data:image/png;base64,${res}`});if(dataList.length==1){component.inputs.src=`data:image/png;base64,${res}`}}))}_slideShowImage.push({id:objectID,images:dataList,idx:0,playID:null,play:false,comp:component})}))}))}function getMousePosition(){return __awaiter(this,void 0,void 0,(function*(){let planePosition;const pointer=_atwin.Pointer.intersection.subscribe((function(intersection){planePosition=intersection.position}));pointer.cancel();return planePosition}))}function imageStream(direction){let diff=direction==="prev"?-1:1;let length=_currentSlideShow.length;let index=_currentSlideIndex+diff;if(index===-1){index=length-1}if(index===length){index=0}_currentSlideIndex=index;_slideShowImage.find((elem=>elem.id===_currentSlideShowID)).idx=index;return _currentSlideShow[_currentSlideIndex].path}function cameraRotate(x,y,speed){return __awaiter(this,void 0,void 0,(function*(){yield _atwin.Camera.rotate(x,y,{speed:speed}).then((()=>{console.log("camera rotate success.",x,y)})).catch((error=>{console.log("camera rotate error.",error)}))}))}function cameraPan(x,z){return __awaiter(this,void 0,void 0,(function*(){let mode=getViewMode();if(mode==_atwin.Mode.Mode.FLOORPLAN||mode==_atwin.Mode.Mode.DOLLHOUSE){yield _atwin.Camera.pan({x:x,z:z}).then((()=>{console.log("camera pan success.")})).catch((error=>{console.log("camera rotate error:",error)}))}else{console.error("Incorrect view mode.")}}))}function cameraLookAt(x,y){return __awaiter(this,void 0,void 0,(function*(){yield _atwin.Camera.lookAtScreenCoords(x,y).then((function(){console.log("camera looking at...",x,y)})).catch((function(error){console.log("camera looking at error:",error)}))}))}function moveInDirection(direction){return __awaiter(this,void 0,void 0,(function*(){let nextDirection=_atwin.Camera.Direction.LEFT;switch(direction.toUpperCase()){case"LEFT":nextDirection=_atwin.Camera.Direction.LEFT;break;case"RIGHT":nextDirection=_atwin.Camera.Direction.RIGHT;break;case"UP":nextDirection=_atwin.Camera.Direction.UP;break;case"DOWN":nextDirection=_atwin.Camera.Direction.DOWN;break;case"BACK":nextDirection=_atwin.Camera.Direction.BACK;break;case"FORWARD":nextDirection=_atwin.Camera.Direction.FORWARD;break;default:nextDirection=_atwin.Camera.Direction.LEFT;break}yield _atwin.Camera.moveInDirection(nextDirection).then((function(){console.log("Move to...",nextDirection)})).catch((function(){console.warn("An error occured while moving in that direction.",nextDirection)}))}))}function dispose3dObjects(){console.log("dispose3dObjects");_3DXObjects.forEach((obj=>{console.log("_3DXObjects stop",obj);obj.node.stop()}));_videos.forEach((vid=>{console.log("_videos pause and node stop",vid);vid.component.video.pause();vid.node.stop()}));_allSlideShow.forEach((slide=>{console.log("_allSlideShow stop",slide);slide.node.stop()}))}function getViewMode(){return _currentViewMode}function setViewMode(mode){return __awaiter(this,void 0,void 0,(function*(){console.log("=== get Mode Type ===",_getModeType(mode));let modeType=_getModeType(mode);yield _atwin.Mode.moveTo(modeType).then((function(nextMode){console.log("Arrived at new view mode "+nextMode)})).catch((function(error){console.error("Error occur on:",error)}))}))}function _getModeType(mode){let modes={DOLLHOUSE:"mode.dollhouse",FLOORPLAN:"mode.floorplan",INSIDE:"mode.inside",OUTSIDE:"mode.outside",TRANSITIONING:"mode.transitioning"};return modes[mode.toUpperCase()]||""}function disconnectSpace(){return __awaiter(this,void 0,void 0,(function*(){console.log("disconnectSpace()");yield hideTags();dispose3dObjects();_atwin.disconnect();_iframe.src="";_api={};_atwin={};_tags=[];tags=[];sweeps=[];_allSlideShow=[];_slideShowImage=[];_currentSlideShowID=0;_currentSlideIndex=0;_currentSlideShow=null;_timer=null;_videos=[];_currentViewMode="";_3DXObjects=[];_unrenderedObjects=[];_previousTimeStamp=0;_currentSweep={};_currentCameraPose={};_sweeps=[]}))}function getTargetPosition(callback=undefined){return __awaiter(this,void 0,void 0,(function*(){console.log("getTargetPosition()");if(!_objectMarker){console.error("Object marker has not been created");return}const iframe=document.getElementById(_mpConfig.iframeId);const iframeSize={w:iframe.clientWidth,h:iframe.clientHeight};let pointerCoord;function onMouseClick(){return __awaiter(this,void 0,void 0,(function*(){_pointerSubscription.cancel();setElementVisibility(_objectMarker,false);yield _atwin.Pointer.resetTexture();_objectMarker.removeEventListener("click",onMouseClick);console.info("Pointer coordinate is",pointerCoord);setState({isLoading:false,loaded:true,data:pointerCoord});if(callback!==undefined){callback(pointerCoord)}}))}console.log("Initializing pointer intersection");_objectMarker.addEventListener("click",onMouseClick);yield _atwin.Pointer.editTexture("targetPointer");_pointerSubscription=_atwin.Pointer.intersection.subscribe((function name(intersection){pointerCoord=intersection.position;if(_currentCameraPose){const screenCoord=_atwin.Conversion.worldToScreen(intersection.position,_currentCameraPose,iframeSize);translateElementPosition(_objectMarker,screenCoord)}}))}))}function setPointerCoordinates(position){_pointerCoord=position}function addObjectToSpace(object,config=undefined){return __awaiter(this,void 0,void 0,(function*(){console.log("addObjectToSpace()");console.log("Object Data ",object);const iframe=document.getElementById(_mpConfig.iframeId);let showcase_object;let pointerSubscriptionActive=false;const iframeSize={w:iframe.clientWidth,h:iframe.clientHeight};if(!_objectMarker){console.error("Object marker has not been created");return}function onObjectPositionSet(object){return __awaiter(this,void 0,void 0,(function*(){console.log("Object positioned at: ",_pointerCoord);if(pointerSubscriptionActive){_pointerSubscription.cancel();setElementVisibility(_objectMarker,false);yield _atwin.Pointer.resetTexture()}if(config){showcase_object=createIShowcaseObjectData(object,config.position,config.scale,config.rotation)}else{showcase_object=createIShowcaseObjectData(object)}console.log("Created object",showcase_object);console.log("About to render object",showcase_object);if(object.object_type=="MP4"){yield showVideoObjects(showcase_object)}else if(object.object_type=="ZIP"){yield showSlideScreenModel(showcase_object)}else if(object.object_type=="TEXT"){showcase_object.object_position.y+=1;show3dText(showcase_object,config.options)}else{if(config){yield show3DObjects(showcase_object,config.options,"adding")}else{yield show3DObjects(showcase_object,null,"adding")}}_objectMarker.removeEventListener("click",handleClick);return showcase_object}))}const handleClick=()=>onObjectPositionSet(object);if(object!==undefined&&config===undefined||object!==undefined&&config.options&&!config.position){console.log("Positioning object to user pointer click coordinates");_objectMarker.addEventListener("click",handleClick);yield _atwin.Pointer.editTexture("targetPointer");pointerSubscriptionActive=true;_pointerSubscription=_atwin.Pointer.intersection.subscribe((function name(intersection){_pointerCoord=intersection.position;if(_currentCameraPose){const screenCoord=_atwin.Conversion.worldToScreen(intersection.position,_currentCameraPose,iframeSize);translateElementPosition(_objectMarker,screenCoord)}}));return}else if(object!==undefined&&config.position!=null){console.log("Positioning object to pre-defined coordinates");onObjectPositionSet(object);return}console.error("Object is either null or undefined");return}))}function translateElementPosition(element,coord){console.log("translateElementPosition()");if(coord){if(coord.x>0){element.style.left=`${Math.abs(coord.x-40)}px`;element.style.top=`${Math.abs(coord.y-45)}px`}else{element.style.left=`${Math.abs(coord.x+40)}px`;element.style.top=`${Math.abs(coord.y+45)}px`}const computedStyle=window.getComputedStyle(_objectMarker);const displayValue=computedStyle.getPropertyValue("display");if(displayValue=="none"){setElementVisibility(_objectMarker,true)}return}console.error("Argument for coord is undefined");return}function create3dMarker(){const container=document.getElementById("showcase-container");const checkMarker=document.getElementById("marker-3d");if(!checkMarker){console.log("Marker not found. Creating marker in DOM");_objectMarker=document.createElement("div");_objectMarker.setAttribute("id","marker-3d");_objectMarker.style.display="none";_objectMarker.style.width="90px";_objectMarker.style.height="90px";_objectMarker.style.cursor="pointer";_objectMarker.style.position="absolute";container.appendChild(_objectMarker);return}console.log("Marker found. Skipping marker creation")}function setElementVisibility(element,visible){if(visible){element.style.display="inline-block";return}element.style.display="none"}function createIShowcaseObjectData(object_data,position=undefined,scale=undefined,rotation=undefined){console.log("createIShowcaseObject()",object_data);const newObj=object_data;const showcase_object={};showcase_object.id=generateRandomUniqueNumber();showcase_object.object_id=object_data.id;showcase_object.user_id=1;showcase_object.showcase_id=parseInt(_spaceId);showcase_object.object_position=position!=undefined?position:_pointerCoord;showcase_object.object_rotation=rotation!=undefined?rotation:{x:0,y:0,z:0};showcase_object.object_scale=scale!=undefined?scale:{x:1,y:1,z:1};if(object_data.object_type=="MP4"){showcase_object.autoplay=true;showcase_object.autoplay_distance=2}showcase_object.offset_position=1;showcase_object.offset_rotation=1;showcase_object.position_unit="m";showcase_object.object_data=object_data;showcase_object.showcase_object_name=object_data.name;if(showcase_object.object_data){console.error("Empty object_data");showcase_object.object_data=newObj}console.log("Returned objects",showcase_object);return showcase_object}function copyObject(payload,position_offset=undefined,rotation_offset=undefined){return __awaiter(this,void 0,void 0,(function*(){console.log("copyObject()");if(payload){payload.id=payload.id+Math.round(Math.random()*200);if(position_offset==undefined){payload.object_position.x+=.5;payload.object_position.z+=.5}else{payload.object_position.x+=position_offset.x;payload.object_position.z+=position_offset.z}if(rotation_offset){payload.object_rotation.x+=rotation_offset.x;payload.object_rotation.y+=rotation_offset.y;payload.object_rotation.z+=rotation_offset.z}yield addObjectToSpace(payload.object_data,{position:payload.object_position,rotation:payload.object_rotation,scale:payload.object_scale});return}console.error("Payload for copyObject is undefined");return}))}function replaceObject(payload,target,options=null){return __awaiter(this,void 0,void 0,(function*(){console.log("replaceObject()");if(payload&&target){addObjectToSpace(payload,{options:options,position:target.object.object_position,rotation:target.object.object_rotation,scale:target.object.object_rotation});removeTransformControls();target.node.stop()}console.error("payload or target is undefined");return}))}function createMediaScreenObject(mediaUrl,mediaType="image"){return __awaiter(this,void 0,void 0,(function*(){console.log("=== createMediaScreenObject()");console.log("=== mediaUrl",mediaUrl);console.log("=== mediaType",mediaType);const fallbackMedia="https://roki-atwin-dev.s3.amazonaws.com/c28b748a-b740-4d37-bdac-bbcd557c9016.PNG?AWSAccessKeyId=AKIAVVUXZ66KW7GBSW7A&Signature=XOEZtGauyfFEYPxS0jSsSbyqQbU%3D&Expires=2005920767";const mediaUpload=yield createMediaObject(fallbackMedia,"Nomedia.png");const object_data=yield addObject(mediaUpload);const options={name:"canvasFrame",type:mediaType,url:object_data.amazon_uri,visible:true,aspectRatio:1};return{object_data:object_data,options:options}}))}function createFileFromURL(url,fileName){return __awaiter(this,void 0,void 0,(function*(){console.info("createFileFromURL()");try{const response=yield fetch(url);const fileContent=yield response.blob();const file=new File([fileContent],fileName);console.info("Successfuly created file",file);return file}catch(error){console.error("Error creating File object:",error);return null}}))}function createMediaObject(url,filename){return __awaiter(this,void 0,void 0,(function*(){console.info("createMediaObject()");if(url&&filename){const file=yield createFileFromURL(url,filename);const uid=new ShortUniqueId({length:10});const filePayload={};filePayload.name=filename;filePayload.filename=filename;filePayload.object_type=filename.slice((filename.lastIndexOf(".")-1>>>0)+2).toUpperCase();filePayload.user_id=1;filePayload.object_key=uid();filePayload.file=file;console.info("Successfuly created file payload",filePayload);return filePayload}}))}function addMediaScreen(mediaUrl,transform,readonly,autoplay){return __awaiter(this,void 0,void 0,(function*(){console.log("=== addMediaScreen");console.log("=== mediaUrl",mediaUrl);console.log("=== transform",transform);console.log("=== readonly",readonly);console.log("=== autoplay",autoplay);if(!mediaUrl||mediaUrl===""){mediaUrl="";console.log("=== mediaUrl is not set ")}const{object_data:object_data,options:options}=yield createMediaScreenObject(mediaUrl,"image");if(transform){console.log("=== Adding programmatically");yield addObjectToSpace(object_data,{options:options,position:transform.position,rotation:transform.rotation,scale:transform.scale})}else{console.log("=== Adding using cursor pointer");yield addObjectToSpace(object_data,{options:options})}return object_data.id}))}function attachMediaScreenContent(mediaScreenId,mediaUrl,mediaType="image"){return __awaiter(this,void 0,void 0,(function*(){let urlPath;let typePath;const fileTypes=["image","video"];if(!fileTypes.includes(mediaType)){console.error("Unsupported file type, please use a valid type");return}for(const{desc:desc,path:path}of _sceneObject.pathIterator()){if(desc.id===`url_${mediaScreenId}`){urlPath=path}if(desc.id===`type_${mediaScreenId}`){typePath=path}}if(mediaType!=="image"){typePath.set(mediaType)}if(urlPath){urlPath.set(mediaUrl);yield updateObjectUri(mediaScreenId,mediaUrl);return}console.error("Could not find input path for specified object");return}))}function setBasePointPosition(id,position){let basePointPath;for(const{desc:desc,path:path}of _sceneObject.pathIterator()){if(desc.id===`basePosition_${id}`){basePointPath=path}}if(position==="corner"){basePointPath.set("corner")}else{basePointPath.set("center")}}function setVideoPlayback(action,element){const actions=["play","pause","mute","unmute"];if(actions.includes(action)){if(action===actions[0]){element.play()}else if(action===actions[1]){element.pause()}else if(action===actions[2]){element.muted=true}else if(action===actions[3]){element.muted=false}return}console.error("Argument does not match known actions");return}function setState({isLoading:isLoading,loaded:loaded,error:error,data:data}){const newState={isLoading:isLoading,loaded:loaded,error:error!==undefined?error:"",data:data!==undefined?data:null};state=Object.assign({},newState)}function checkValidFileType(payload){if(payload){const fileName=payload.name;const fileExtension=fileName.substring(fileName.lastIndexOf(".")+1);console.log("File extension "+fileExtension);if(supportedFileTypes.includes(fileExtension.toUpperCase())){return{valid:true,type:fileExtension}}return{valid:false}}console.error("No file provided");return{valid:false}}function addObject(payload){return __awaiter(this,void 0,void 0,(function*(){setState({isLoading:true,loaded:false});const isValid=checkValidFileType(payload.file);if(isValid.valid){try{const response=yield _api.post("/s3/file.json",payload);console.log("S3 response is: ",response);if(response.data.status=="success"){const id=response.data.query_result.id;const object_data=yield getObject(id);setState({isLoading:false,loaded:true,data:object_data});return object_data}}catch(error){console.error("Object upload failed"+error)}}console.error("Unsupported file type");return}))}function addShowcaseObject(payload){return __awaiter(this,void 0,void 0,(function*(){console.log("addShowcaseObject()");if(payload){payload.object_position=JSON.stringify(payload.object_position);payload.object_rotation=JSON.stringify(payload.object_rotation);payload.object_scale=JSON.stringify(payload.object_scale);delete payload["id"];try{const response=yield _api.post("/v1/showcase-objects.json",payload);console.log("API response is: ",response);if(response.data.status=="success"){console.log("Add showcase data",response.data.data);return response.data.data.id}}catch(error){console.error("Object upload failed"+error);return}}return}))}function getObject(id){return __awaiter(this,void 0,void 0,(function*(){console.log("getObject()");setState({isLoading:true,loaded:false});if(id){try{const response=yield _api.get(`/v1/objects/id/${id}`);if(response.data.status=="success"){const object_data=response.data.data[0];console.log("Response"+JSON.stringify(object_data));return object_data}console.error("Failed to get requested object")}catch(error){console.error("Error getting object "+error)}}return}))}function getShowcaseObject(id){return __awaiter(this,void 0,void 0,(function*(){console.log("getShowcaseObject()");setState({isLoading:true,loaded:false});if(id){try{const response=yield _api.get(`/v1/showcase-objects/showcase-id/${id}`);if(response.data.status=="success"){const showcase_object=response.data.data[0];const object=yield getObject(showcase_object.object_id);showcase_object.object_data=object;setState({isLoading:false,loaded:true,data:showcase_object});console.log("Success ",showcase_object);return state}console.error("Failed to get requested showcase object")}catch(error){setState({isLoading:false,loaded:false,error:error});console.error("Error getting showcase object "+error)}}setState({isLoading:false,loaded:false,error:"id is undefined"});return state}))}function updateObject(id,payload){return __awaiter(this,void 0,void 0,(function*(){const isValid=checkValidFileType(payload.file);if(isValid.valid){try{const response=yield _api.put(`/s3/file/${id}.json`,payload);console.log("S3 response is: ",response);if(response.data.status=="success"){const id=response.data.query_result.id;const object_data=yield getObject(id);return object_data}}catch(error){console.error("Object upload failed"+error)}}console.log("Unsupported file type");return}))}function updateObjectUri(id,uri){return __awaiter(this,void 0,void 0,(function*(){if(id&&uri){const payload={};payload.amazon_uri=uri;try{const response=yield _api.put(`v1/objects/${id}.json`,payload);if(response.status==200){console.log("Successfuly updated URI")}}catch(error){}return}}))}function updateShowcaseObject(id,payload){return __awaiter(this,void 0,void 0,(function*(){console.log("updateShowcaseObject()");setState({isLoading:true,loaded:false});if(id&&payload){try{const response=yield _api.put(`/v1/showcase-objects/id/${id}`,payload);console.log("showcase-object response is: ",response);if(response.data.status=="success"){const id=response.data.query_result.id;const object_data=yield getObject(id);setState({isLoading:false,loaded:true,data:object_data});return state}setState({isLoading:false,loaded:false});return state}catch(error){setState({isLoading:false,loaded:false,error:error});console.error("Object upload failed"+error);return state}}setState({isLoading:false,loaded:false,error:"id or payload is undefined"});return state}))}function deleteObject(id){return __awaiter(this,void 0,void 0,(function*(){setState({isLoading:true,loaded:false});try{const response=yield _api.delete(`/s3/file/${id}.json`);console.log("S3 response is: ",response);if(response.data.status=="success"){setState({isLoading:false,loaded:true});return state}setState({isLoading:false,loaded:false,error:"Request failed"});return state}catch(error){setState({isLoading:false,loaded:false,error:error});console.error("Object upload failed"+error);return state}}))}function deleteObjectFromSpace(selected){return __awaiter(this,void 0,void 0,(function*(){if(selected){try{const response=yield _api.delete(`/v1/showcase-objects/${selected.object.id}.json`);console.log("Delete showcase object response is: ",response);if(response.data.status=="success"){removeTransformControls();selected.node.stop();selectedObject=null;const filteredRenderedObjects=_3DXObjects.filter((obj=>obj.object.id!==selected.object.id));_3DXObjects=filteredRenderedObjects}console.log("Deleted object from scene")}catch(error){console.log("Delete showcase object error",error)}}}))}function deleteMediaScreen(mediaScreenId){return __awaiter(this,void 0,void 0,(function*(){let selectedMediaScreen=_3DXObjects.find((obj=>obj.object.id===mediaScreenId&&obj.type==="FRAME"));console.log(selectedMediaScreen);deleteObjectFromSpace(selectedMediaScreen)}))}function getLibrary(refetch=false){return __awaiter(this,void 0,void 0,(function*(){setState({isLoading:true,loaded:false});if(refetch){try{const response=yield _api.get(`/s3/file.json`);console.log("S3 response is: ",response);if(response.data.status=="success"){const objects=response.data.data;_assetLibrary=objects;setState({isLoading:false,loaded:true,data:objects});return state}setState({isLoading:false,loaded:false,error:"Could not fetch data"});return state}catch(error){console.log("Error! Failed to fetch data",error);setState({isLoading:false,loaded:false,error:error});return state}}return _assetLibrary}))}function addTagToScene(tag){console.log("addTagToScene()");const iframe=document.getElementById(_mpConfig.iframeId);const iframeSize={w:iframe.clientWidth,h:iframe.clientHeight};if(!_objectMarker){console.error("Object marker has not been created");return}function onTagPositionSet(tag){return __awaiter(this,void 0,void 0,(function*(){console.log("Tag positioned at: ",_pointerCoord);_pointerSubscription.cancel();setElementVisibility(_objectMarker,false);_atwin.Pointer.setVisible(true);if(tag){if(tag.json_data.anchorPosition==undefined){}tag.json_data.anchorPosition=_pointerCoord;const tags=[];tags.push(tag);yield showTags(tags)}_objectMarker.removeEventListener("click",handleClick)}))}const handleClick=()=>onTagPositionSet(tag);if(tag!==undefined){_objectMarker.addEventListener("click",handleClick);_atwin.Pointer.setVisible(false);_pointerSubscription=_atwin.Pointer.intersection.subscribe((function name(intersection){_pointerCoord=intersection.position;if(_currentCameraPose){const screenCoord=_atwin.Conversion.worldToScreen(intersection.position,_currentCameraPose,iframeSize);translateElementPosition(_objectMarker,screenCoord)}}));return}console.error("Object is either null or undefined");return}function showMinimap(){minimap.showMinimap()}function hideMinimap(){minimap.hideMinimap()}class ClickSpy{constructor(path,node,component,object_data){this.path=path;this.node=node;this.component=component;this.object_data=object_data}onEvent(data){if(data.input.type=="click"){console.log("Clicked on 3D model");const selectedObj={object:this.object_data,node:this.node,component:this.component};if(this.object_data.object_data.object_type=="BOX"){}clearActionHistory();setSelectedObject(this.object_data,this.node,this.component,"3DX");setTransformControls(selectedObj)}}}class DragSpy{constructor(path,node,component,data){this.eventType="INTERACTION.DRAG_END";this.path=path;this.object_data=data;this.node=node;this.component=component}onEvent(payload){return __awaiter(this,void 0,void 0,(function*(){console.log("INTERACTION.DRAG_END",payload);const selectedObj={object:this.object_data,node:this.node,component:this.component};console.log("New Drag Position"+JSON.stringify(selectedObj.node.position));console.log("New Drag Rotation"+JSON.stringify(selectedObj.node.obj3D.rotation));console.log("New Drag Scale"+JSON.stringify(selectedObj.node.scale));const objectCoords={object_position:selectedObj.node.position,object_rotation:selectedObj.node.obj3D.rotation,object_scale:selectedObj.node.scale};currentObjTransform=objectCoords;const currentTranform=JSON.stringify(currentObjTransform);actionHistory.push(currentTranform);console.log("Actions count "+actionHistory.length);console.log("object type",this.object_data.object_data.object_type);if(this.object_data.object_data.object_type=="TEXT"&&_textDimensions.top!==null){const rotation={x:currentObjTransform.object_rotation._x,y:currentObjTransform.object_rotation._y,z:currentObjTransform.object_rotation._z};setTextDimensionPosition(_textDimensions.top.node,_textDimensions.top.component,"top",currentObjTransform.object_position,rotation);setTextDimensionPosition(_textDimensions.bottom.node,_textDimensions.bottom.component,"bottom",currentObjTransform.object_position,rotation);setTextDimensionPosition(_textDimensions.left.node,_textDimensions.left.component,"left",currentObjTransform.object_position,rotation);setTextDimensionPosition(_textDimensions.right.node,_textDimensions.right.component,"right",currentObjTransform.object_position,rotation)}}))}}class EmitSpy{constructor(path,node,component,object_data){this.path=path;this.node=node;this.component=component;this.object_data=object_data}onEvent(data){if(data.input.type=="click"){console.log("INTERACTION.CLICK",data);const selectedObj={object:this.object_data,node:this.node,component:this.component};clearActionHistory();setSelectedObject(this.object_data,this.node,this.component,"3DX");if(_viewMode==="interactive"){setTransformControls(selectedObj)}}}}export{_atwin,_config,tags,sweeps,selectedObject,previousObjTransform,currentObjTransform,actionHistory,state,_space,_spaceId,_api,_pointerCoord,_3DXObjects,connectSpace,disconnectSpace,getTags,gotoTag,getSweeps,getCurrentSweep,getCurrentSweepPosition,moveToSweep,getNearbySweeps,pauseVideo,playVideo,getCurrentCameraPose,getCameraPosition,moveInDirection,cameraLookAt,cameraPan,cameraRotate,getViewMode,setViewMode,getNearbyObjects,setTransformMode,setSelectedObject,clearSelectedObject,revertTransform,setTransformControls,removeTransformControls,setRenderDistance,clearActionHistory,addObject,getObject,addObjectToSpace,createMediaScreenObject,addMediaScreen,attachMediaScreenContent,addTagToScene,updateObject,updateShowcaseObject,deleteObject,deleteObjectFromSpace,deleteMediaScreen,getShowcaseObject,setBasePointPosition,showObjectDimensions,hideObjectDimensions,setVideoPlayback,setAnimationState,showMinimap,hideMinimap,copyObject,replaceObject,getTargetPosition,setObjectTransformation,setPointerCoordinates};
1
+ var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P((function(resolve){resolve(value)}))}return new(P||(P=Promise))((function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator["throw"](value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())}))};import axios from"axios";import{planeType,planeFactory,gltfType,gltfFactory,boxType,boxFactory,textType,textFactory}from"./loaders";import{meterToMillimeter,generateRandomUniqueNumber}from"./convert";import*as JSZip from"jszip";import*as JSZipUtils from"jszip-utils";import ShortUniqueId from"short-unique-id";import*as minimap from"./minimap";import"../static/map.css";const _config={aws:{region:"ap-northeast-1",accessKeyId:"AKIAVVUXZ66KW7GBSW7A",secretAccessKey:"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'"},mp:{appKey:"a3ae8341bd8f44899eba16df86307d7d",urlParams:["help","play","nt","qs","brand","dh","tour","gt","hr","mls","mt","tagNav","pin","portal","f","fp","lang","kb","lp","st","title","tourcta","wts","ts","hl","vr","nozoom","search","wh"]},meet:{meetingKey:"caxaodrjl2sfxycnegzmxvkb4zp1fe"}};let _apiURL="http://localhost:5173/api";let _appKey=_config.mp.appKey;const urlParams=_config.mp.urlParams;let _iframe={};let _api;let _spaceId="";let _space=null;let _url="";let _mpConfig={};let _atwin={};let _tags=[];let _objects=[];let tags=[];let sweeps=[];let _allSlideShow=[];let _slideShowImage=[];let _currentSlideShowID=0;let _currentSlideIndex=0;let _currentSlideShow=null;var _timer=null;let _videos=[];let _currentViewMode="";let _3DXObjects=[];let _unrenderedObjects=[];let _transformControlNode;let _inputControlComponent;let selectedObject;let _previousTimeStamp=0;let _renderDistance=8;let _autoDetectNearbyObj=false;let _viewMode="public";let _transformMode="translate";let _transformComponent;let previousObjTransform={object_position:{x:0,y:0,z:0},object_rotation:{_x:0,_y:0,_z:0},object_scale:{x:0,y:0,z:0}};let currentObjTransform={object_position:{x:0,y:0,z:0},object_rotation:{_x:0,_y:0,_z:0},object_scale:{x:0,y:0,z:0}};let _previousAction;let actionHistory=[];let _currentSweep=null;let _currentCameraPose={};let _sweeps=[];let _isInitialLoad=true;let _hasRegisteredLoaders=false;let _showMinimap=false;let _sceneObject;let _assetLibrary=[];let _objectMarker;let _pointerSubscription;let _pointerCoord;let _urlComponentPaths=[];let _textDimensions={top:{node:null,component:null},bottom:{node:null,component:null},left:{node:null,component:null},right:{node:null,component:null}};let _textDimensionIds=[];let state={isLoading:false,loaded:false,error:"",data:null};const supportedMediaTypes=["WMV","MOV","JPG","PNG","JPEG","image","video","FRAME"];const supportedModelTypes=["GLB","GLTF","FBX"];const supportedFileTypes=["ZIP",...supportedMediaTypes,...supportedModelTypes];function connectSpace(url,auth,config){return __awaiter(this,void 0,void 0,(function*(){console.log("connectSpace()");console.log("__config",config);_mpConfig=config;_url=url;if("apiURL"in auth){console.log("'apiURL' in auth");const lastString=auth.apiURL.slice(-1);if(lastString!=="/"){auth.apiURL+="/"}_apiURL=auth.apiURL}if("appKey"in config){console.log("'appKey' in config");_appKey=config.appKey}console.log("_apiURL",_apiURL);const api=axios.create({baseURL:_apiURL,headers:{"Access-Control-Allow-Origin":"*","Content-Type":"multipart/form-data",Authorization:auth.apiKey}});_api=api;if(config.viewMode==="interactive"){_viewMode="interactive"}const showcase=document.getElementById(config.iframeId);_iframe=showcase;if(url.includes("https://my.matterport.com/show/")){console.log("URL IS MATTERPORT");yield loadDefaultMpSpace(url,config,showcase)}else{console.log("URL IS REV-KITTEN");yield loadAtwinSpace(url,auth,config,showcase)}}))}function loadDefaultMpSpace(url,config,showcase){return __awaiter(this,void 0,void 0,(function*(){console.log("loadDefaultMpSpace(url: string, showcase: HTMLIFrameElement)",url,showcase);const iframeSrc=getIframeSrc(config,url);console.log("__iframeSrc",iframeSrc);showcase.src=iframeSrc;const showcaseWindow=showcase.contentWindow;showcase.addEventListener("load",(()=>__awaiter(this,void 0,void 0,(function*(){console.log('iframe.addEventListener("load")');console.log("showcaseWindow",showcaseWindow);try{_atwin=yield showcaseWindow.MP_SDK.connect(showcaseWindow);console.log("Hello Bundle SDK",_atwin);_atwin.App.state.subscribe((appState=>__awaiter(this,void 0,void 0,(function*(){console.log("appState",appState);if(appState.phase===_atwin.App.Phase.LOADING){console.log("App is loading...");yield _setTags()}else if(appState.phase===_atwin.App.Phase.STARTING){console.log("App is starting...")}else if(appState.phase===_atwin.App.Phase.PLAYING){console.log("App is playing...");onShowcaseConnect()}}))))}catch(e){console.error(e)}}))));const _setTags=()=>__awaiter(this,void 0,void 0,(function*(){console.log("_setTags()");const mpTags=yield _atwin.Mattertag.getData();if(mpTags){const filteredMpTags=mpTags.map((i=>{const x={};x.id=i.sid;x.name=i.label;return x}));tags=filteredMpTags;console.log("tags",tags)}}))}))}function loadAtwinSpace(url,auth,config,showcase){var _a;return __awaiter(this,void 0,void 0,(function*(){console.log("loadAtwinSpace(url: string, auth: { apiKey: string; user: IUser },config: IMPConfig, showcase: HTMLIFrameElement)");const spaceId=getSpaceId(url);_spaceId=spaceId;if(!spaceId){console.error("spaceId is undefined");return}if(_isInitialLoad){yield loginUser(auth.user)}const space=yield getSpace(spaceId);if(!space){console.error("space is undefined");return}setSpace(space);const iframeSrc=getIframeSrc(config,space.space_url);console.log("__iframeSrc",iframeSrc);showcase.src=iframeSrc;const tags=yield getTags(space);if(!tags){console.log("tags is undefined");return}setTags(tags);if(_isInitialLoad){(_a=showcase.contentWindow)===null||_a===void 0?void 0:_a.location.reload()}_isInitialLoad=false;const showcaseWindow=showcase.contentWindow;showcase.addEventListener("load",(()=>__awaiter(this,void 0,void 0,(function*(){console.log('iframe.addEventListener("load")');console.log("showcaseWindow",showcaseWindow);if(showcaseWindow.MP_SDK){try{_atwin=yield showcaseWindow.MP_SDK.connect(showcaseWindow);console.log("Hello Bundle SDK",_atwin);onShowcaseConnect()}catch(e){console.error(e)}}else{console.log("No showcaseWindow.MP_SDK found")}}))))}))}function onShowcaseConnect(){return __awaiter(this,void 0,void 0,(function*(){console.log("onShowcaseConnect()");try{const modelData=yield _atwin.Model.getData();console.log("Model sid:"+modelData.sid);_atwin.App.state.subscribe((appState=>__awaiter(this,void 0,void 0,(function*(){console.log("appState",appState);if(appState.phase===_atwin.App.Phase.LOADING){console.log("App is loading...");yield get3DObjects(_spaceId)}else if(appState.phase===_atwin.App.Phase.STARTING){console.log("App is starting...");yield hideTags()}else if(appState.phase===_atwin.App.Phase.PLAYING){console.log("App is playing...");yield showTags(_tags);yield getSweeps();_sceneObject=yield createSceneObject();yield setLighting();yield registerCustomLoaders();yield _atwin.Asset.registerTexture("targetPointer","../static/objective.png");create3dMarker();_atwin.Sweep.current.subscribe((function(currentSweep){return __awaiter(this,void 0,void 0,(function*(){console.log("===currentSweep",currentSweep);if(currentSweep.sid===""){console.log("Not currently stationed at a sweep position")}else{_currentSweep=currentSweep;videoAutoPlay()}}))}));_atwin.Camera.pose.subscribe((function(pose){return __awaiter(this,void 0,void 0,(function*(){_currentCameraPose=pose;const hasElapsed=hasTimeElapsed(300);if(hasElapsed){console.log("_unrenderedObjects "+_unrenderedObjects.length);yield renderOnDemand()}if(hasTimeElapsed(1e3)&&_autoDetectNearbyObj){getNearbyObjects({type:"ALL",distance:2})}}))}));_atwin.Mode.current.subscribe((mode=>{_currentViewMode=mode}));if("mapId"in _mpConfig){yield minimap.setMap(_atwin,_appKey,_mpConfig.mapId)}}}))))}catch(e){console.error(e)}}))}function hasTimeElapsed(maxTime){const currentTimestamp=Date.now();const differenceInMilliseconds=(currentTimestamp-_previousTimeStamp)%1e3;_previousTimeStamp=currentTimestamp;if(differenceInMilliseconds>=maxTime){return true}else{return false}}function getNearbyUnrenderedObjects(payload){let toBeRendered=[];const currentPose={x:_currentCameraPose.position.x,y:_currentCameraPose.position.y,z:_currentCameraPose.position.z};toBeRendered=_unrenderedObjects.filter((obj=>{const obj_pos={x:obj.object_position.x,y:obj.object_position.y,z:obj.object_position.z};const distance=calculateDistance(currentPose,obj_pos);return distance<payload.distance}));const filtered=_unrenderedObjects.filter((obj=>toBeRendered.indexOf(obj)===-1));_unrenderedObjects=filtered;console.log("render toBeRendered "+toBeRendered.length);return toBeRendered}function getNearbyObjects(payload){if(payload.type===undefined||payload.type===""){payload.type="ALL"}if(payload.distance===undefined){payload.distance=2}const pos1={x:_currentCameraPose.position.x,y:_currentCameraPose.position.y,z:_currentCameraPose.position.z};let three_d=[];let videos=[];let slideshows=[];if(payload.type==="ALL"||"3DX"){three_d=_3DXObjects.filter((obj=>{const pos2={x:obj.node.position.x,y:obj.node.position.y,z:obj.node.position.z};const distance=calculateDistance(pos1,pos2);console.log("3DX Distance: "+distance);return distance<payload.distance}))}if(payload.type==="ALL"||"VIDEO"){videos=_videos.filter((vid=>{const pos2={x:vid.node.position.x,y:vid.node.position.y,z:vid.node.position.z};const distance=calculateDistance(pos1,pos2);console.log("Video Distance: "+distance);return distance<payload.distance}))}if(payload.type==="ALL"||"SLIDESHOW"){slideshows=_allSlideShow.filter((slide=>{const pos2={x:slide.node.position.x,y:slide.node.position.y,z:slide.node.position.z};const distance=calculateDistance(pos1,pos2);console.log("Slideshow Distance: "+distance);return distance<payload.distance}))}console.log("nearby3DXObjects "+three_d.length);console.log("nearbyVideos "+videos.length);console.log("nearbySlideshows "+slideshows.length);return{x3d:three_d,videos:videos,slideshows:slideshows}}function setRenderDistance(distance){if(!Number.isInteger(distance)){console.error("Render distance argument is not a valid number");return}_renderDistance=distance}function createSceneObject(){return __awaiter(this,void 0,void 0,(function*(){const[sceneObject]=yield _atwin.Scene.createObjects(1);return sceneObject}))}function show3DObjects(object,options=null,action="loading"){var _a;return __awaiter(this,void 0,void 0,(function*(){const modelNode=_sceneObject.addNode();if(options==null){options={url:(_a=object.object_data)===null||_a===void 0?void 0:_a.amazon_uri}}const component=modelNode.addComponent(getComponentLoader(object.object_data),options);if(!component.inputs){console.error("component.inputs is undefined");return}const objTransformation={object_position:typeof object.object_position!=="string"?object.object_position:JSON.parse(object.object_position),object_rotation:object.object_rotation,object_scale:object.object_scale};setObjectTransformation(modelNode,objTransformation);let type;if(object.object_data.object_type=="image"||object.object_data.object_type=="video"){type="FRAME"}else{type=object.object_data.object_type}modelNode.start();if(action==="adding"){console.log("Saving object...");const id=yield addShowcaseObject(object);if(id){console.log("Saved object",id);object.id}else{object.id=generateRandomUniqueNumber()}}_3DXObjects.push({object:object,component:component,node:modelNode,type:type});console.log("_3DXObjects ",component);if(_viewMode==="interactive"&&object.object_data.object_type=="GLB"){const eventPath=_sceneObject.addEmitPath(component,"gltfevents");_sceneObject.spyOnEvent(new ClickSpy(eventPath,modelNode,component,object));_sceneObject.addInputPath(component,"animationState",`animationState_${object.id}`)}else if(_viewMode==="interactive"&&object.object_data.object_type=="BOX"){const eventPath=_sceneObject.addEmitPath(component,"boxEvents");_sceneObject.spyOnEvent(new ClickSpy(eventPath,modelNode,component,object));_sceneObject.addInputPath(component,"basePosition",`basePosition_${object.id}`);_sceneObject.addInputPath(component,"localPosition",`localPosition_${object.id}`)}else if(supportedMediaTypes.includes(object.object_data.object_type)){const emitPath=_sceneObject.addEmitPath(component,"planeEvents");_sceneObject.spyOnEvent(new EmitSpy(emitPath,modelNode,component,object));_sceneObject.addInputPath(component,"url",`url_${object.object_data.id}`);_sceneObject.addInputPath(component,"type",`type_${object.object_data.id}`)}}))}function setAnimationState(action,modelId){const actions=["play","stop"];let animationStatePath;if(actions.includes(action)){if(modelId){for(const{desc:desc,path:path}of _sceneObject.pathIterator()){if(desc.id===`animationState_${modelId}`){animationStatePath=path}}animationStatePath.set(action);return}console.error("id of object is undefined");return}console.error("Argument for action is not valid");return}function show3dText(object,options=null,direction="top"){const modelNode=_sceneObject.addNode();const text=options.text;options={text:text,fontSize:.09,background:false,centered:true,height:.001,curveSegments:12,bevelEnabled:false,bevelThickness:10,bevelSize:8,bevelOffset:0,bevelSegments:5};const component=modelNode.addComponent(getComponentLoader(object.object_data),options);if(!component.inputs){console.error("component.inputs is undefined");return}const rotation={x:currentObjTransform.object_rotation._x,y:currentObjTransform.object_rotation._y,z:currentObjTransform.object_rotation._z};setTextDimensionPosition(modelNode,component,direction,currentObjTransform.object_position,rotation);modelNode.start();_textDimensionIds.push(modelNode.id);_sceneObject.addInputPath(component,"visible",`visible_${modelNode.id}`);if(direction=="left"){_sceneObject.addInputPath(component,"text",`textDepth_${modelNode.id}`)}else if(direction=="right"){_sceneObject.addInputPath(component,"text",`textHeight_${modelNode.id}`)}else if(direction=="bottom"){_sceneObject.addInputPath(component,"text",`textBottom_${modelNode.id}`)}return{node:modelNode,component:component}}function showObjectDimensions(selected){console.log("Selected object",selectedObject);const textObj=selected.object;textObj.object_data.object_type="TEXT";const THREE=selected.component.context.three;const objectModel=selected.component.mesh;const boundingBox=(new THREE.Box3).setFromObject(objectModel);const width=boundingBox.max.x-boundingBox.min.x;const depth=boundingBox.max.y-boundingBox.min.y;const height=boundingBox.max.z-boundingBox.min.z;_textDimensions.top=show3dText(textObj,{text:selected.object.object_data.name},"top");_textDimensions.bottom=show3dText(textObj,{text:`W: ${meterToMillimeter(width)}mm`},"bottom");_textDimensions.left=show3dText(textObj,{text:`D: ${meterToMillimeter(depth)}mm`},"left");_textDimensions.right=show3dText(textObj,{text:`H: ${meterToMillimeter(height)}mm`},"right");console.log("Selected object",selectedObject)}function hideObjectDimensions(){let visiblePath;if(!_textDimensions.top){console.error("_textDeminsion is undefined");return}_textDimensionIds.forEach((index=>{for(const{desc:desc,path:path}of _sceneObject.pathIterator()){if(desc.id===`visible_${_textDimensionIds[index]}`){visiblePath=path}}visiblePath.set(false)}))}function setTextDimensionLabel(node,size){let textPath;for(const{desc:desc,path:path}of _sceneObject.pathIterator()){if(desc.id===`textDepth_${node.id}`){textPath=path;textPath.set(`D: ${meterToMillimeter(size.z)}mm`)}if(desc.id===`textHeight_${node.id}`){textPath=path;textPath.set(`H: ${meterToMillimeter(size.y)}mm`)}if(desc.id===`textBottom_${node.id}`){textPath=path;textPath.set(`W: ${meterToMillimeter(size.x)}mm`)}}}function setTextDimensionPosition(node,component,direction,position,rotation){console.log("setTextDimensionPosition()");const THREE=selectedObject.component.context.three;const objectModel=selectedObject.component.mesh;const boundingBox=(new THREE.Box3).setFromObject(objectModel);const width=boundingBox.max.x-boundingBox.min.x;const depth=boundingBox.max.y-boundingBox.min.y;const height=boundingBox.max.z-boundingBox.min.z;let newPosition;if(direction==="top"){newPosition={x:position.x-rotation.y,y:position.y+height/2,z:position.z-depth+rotation.z}}else if(direction==="bottom"){newPosition={x:position.x,y:position.y-height/2,z:position.z-depth/3}}else if(direction==="left"){newPosition={x:position.x-width/1.3,y:position.y-height/2,z:position.z-depth+rotation.y}}else if(direction==="right"){newPosition={x:position.x+width/1.3-rotation.y,y:position.y,z:position.z-depth}}const objTransformation={object_position:{x:newPosition.x,y:newPosition.y,z:newPosition.z},object_rotation:rotation,object_scale:{x:.001,y:.001,z:.001}};setTextDimensionLabel(node,{x:width,y:depth,z:height});setObjectTransformation(node,objTransformation)}function renderOnDemand(){return __awaiter(this,void 0,void 0,(function*(){if(_unrenderedObjects.length!==0){console.log("renderOnDemand()");registerCustomLoaders();const objects=getNearbyUnrenderedObjects({type:"",distance:_renderDistance});objects.forEach((obj=>__awaiter(this,void 0,void 0,(function*(){var _a,_b,_c,_d;if(((_a=obj.object_data)===null||_a===void 0?void 0:_a.object_type)==="FBX"||((_b=obj.object_data)===null||_b===void 0?void 0:_b.object_type)==="GLB"||supportedMediaTypes.includes(obj.object_data.object_type)){yield show3DObjects(obj)}else if(((_c=obj.object_data)===null||_c===void 0?void 0:_c.object_type)==="MP4"){yield showVideoObjects(obj)}else if(((_d=obj.object_data)===null||_d===void 0?void 0:_d.object_type)==="ZIP"){yield showSlideScreenModel(obj)}}))))}}))}function getIframeSrc(config,url){console.log("getIframeSrc()",config,url);const modelId=url.split("?m=")[1];if(!modelId){console.error("modelId is undefined");return""}let src=``;if("bundlePath"in config){const lastString=config.bundlePath.slice(-1);if(lastString!=="/"){config.bundlePath+="/"}src+=`${config.bundlePath}showcase.html?m=${modelId}&applicationKey=${_appKey}&newtags=1`}else{if(config.prod===undefined||config.prod===null){config.prod=true}if(config.prod){src+=`node_modules/architwin/bundle/showcase.html?m=${modelId}&applicationKey=${_appKey}&newtags=1`}else{src+=`architwin/bundle/showcase.html?m=${modelId}&applicationKey=${_appKey}&newtags=1`}}console.log("__src",src);for(let param of urlParams){if(param in config){src+=`&${param}=${config[param]}`}}return src}function loginUser(user){return __awaiter(this,void 0,void 0,(function*(){console.log("loginUser(user)",user);const response=yield _api.post("/cas/tickets?email="+user.email+"&password="+user.password);console.log("loginUser, response",response.status,response.data);if(response.status==200){return response.data}else{return response}}))}function getSpace(spaceId){return __awaiter(this,void 0,void 0,(function*(){console.log("getShowcase(spaceId: string)",spaceId);const response=yield _api.get(`/v1/showcases/id/${spaceId}`);console.log("response",response);if(response.status===200){if(response.data.data.length===0){console.error("No data")}return response.data.data[0]}else{console.error("Error in fetchShowcase()"+response)}return null}))}function getSpaceId(url){const urlArray=url.split(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/);const path=urlArray[5];const spaceId=path.split("/")[3];console.log("urlArray",urlArray);console.log("path",path);if(!spaceId){console.error("spaceId is undefined");return}return spaceId}function setSpace(space){console.log("setSpace(space: ISpace)",space);_space=space}function getTags(space){return __awaiter(this,void 0,void 0,(function*(){console.log("getTags()");try{const response=yield _api.get(`/v1/tags/showcase-id/${space.id}`);console.log("response",response);if(response.status===200){const tags=response.data.data;if(!tags){console.error("tags is undefined")}return tags}else{console.error("Custom Error: Unable to fetch tags")}}catch(error){console.error(error)}return null}))}function setTags(tags){return __awaiter(this,void 0,void 0,(function*(){console.log("setTags()",tags);_tags=tags.map((tag=>{tag.json_data=JSON.parse(tag.json_data);tag.json_data.id=tag.json_data.sid;return tag}));mapTags(_tags)}))}function get3DObjects(showcase_id){return __awaiter(this,void 0,void 0,(function*(){if(showcase_id){try{const id=parseInt(showcase_id);console.log("showcase_id "+id);const response=yield _api.get(`/v1/showcase-objects/showcase-id/${id}`);const showcase_objects=response.data.data;console.log("showcase_objects "+JSON.stringify(showcase_objects));const object_ids=showcase_objects.map((obj=>obj.object_id));try{const response=yield _api.get(`/v1/objects`);console.log("Finished getting objects");const object_data=response.data.data.filter((obj=>object_ids.includes(obj.id)));_assetLibrary=object_data;console.log("object_data length "+object_data.length);const objectDataMap=object_data.reduce(((map,obj)=>{map[obj.id]=obj;return map}),{});console.log("object_data"+JSON.stringify(object_data));const threed_objects=showcase_objects.map((showcase=>{const target=objectDataMap[showcase.object_id];if(target){showcase.object_data=target}if(showcase.object_position){showcase.object_position=typeof showcase.object_position==="string"?JSON.parse(showcase.object_position):showcase.object_position}if(showcase.object_rotation){showcase.object_rotation=typeof showcase.object_rotation==="string"?JSON.parse(showcase.object_rotation):showcase.object_rotation}if(showcase.object_scale){showcase.object_scale=typeof showcase.object_scale==="string"?JSON.parse(showcase.object_scale):showcase.object_scale}return showcase}));console.log("get3DObjectsByShowcaseId "+JSON.stringify(threed_objects));_unrenderedObjects=threed_objects;const check=_unrenderedObjects.filter((obj=>obj.object_data.object_type==="PNG"));console.log("Check for media screen",check);return threed_objects}catch(error){console.error("threed_objects "+error)}}catch(error){console.error("get3DObjectsByShowcaseId "+error)}}return[]}))}function gotoTag(tag_id){return __awaiter(this,void 0,void 0,(function*(){console.log("gotoTag(tag: tag_id)",tag_id);if(!tag_id){console.error("tag is undefined");return}try{yield _atwin.Mattertag.navigateToTag(tag_id,_atwin.Mattertag.Transition.FLY)}catch(error){console.error(error)}}))}function showTags(tags){return __awaiter(this,void 0,void 0,(function*(){tags.forEach(((tag,indx)=>__awaiter(this,void 0,void 0,(function*(){const mpData=tag.json_data;if(!mpData){console.error("tag.json_data/mpData is undefined");return}const tagIds=yield _atwin.Tag.add({anchorPosition:mpData.anchorPosition,color:mpData.color,description:mpData.description,id:mpData.sid,label:mpData.label,stemVector:mpData.stemVector,stemVisible:mpData.stemVisible});if(tagIds){tag.json_data.id=tagIds[0];if(tag.json_data.media&&tag.json_data.media.src.trim()!==""){try{console.log("Attaching media...");const[attachmentId1]=yield _atwin.Tag.registerAttachment(tag.json_data.media.src);tag.json_data["attachments"]=[attachmentId1];yield _atwin.Tag.attach(tag.json_data.sid,attachmentId1);console.log("Media successfully attached")}catch(error){console.warn("Custom warn: Media not attached: Invalid media src link: "+error);console.warn(`mediaSrc: ${tag.json_data.media.src} | tag index: ${indx}`)}}}}))));console.log("tags",_tags)}))}function hideTags(){return __awaiter(this,void 0,void 0,(function*(){console.log("hideTags()");const tags=yield _atwin.Mattertag.getData();if(tags){const tagIds=tags.map((i=>i.sid));yield _atwin.Mattertag.remove(tagIds);console.log("Tags removed in space: ",tagIds)}}))}function mapTags($tags){console.log("mapTags()",$tags);tags=$tags.map((i=>{const x={};x.id=i.json_data.id;x.name=i.json_data.label;return x}));console.log("tags",tags)}function getCurrentSweep(){return _currentSweep}function getCurrentCameraPose(){return _currentCameraPose}function getCameraPosition(){return _currentCameraPose.position}function getCurrentSweepPosition(){return _currentSweep.position}function getSweeps(){return __awaiter(this,void 0,void 0,(function*(){console.log("Getting Sweeps in Space");_atwin.Sweep.data.subscribe({onCollectionUpdated:function(collection){console.log("Sweeps In Space",collection);if(!collection){console.log("No Sweeps in loaded Space")}_sweeps=collection;const sw=Object.values(_sweeps);sweeps=sw.map((item=>({id:item.uuid,position:item.position,neighbors:item.neighbors})))}});return sweeps}))}function moveToSweep(sweepId){return __awaiter(this,void 0,void 0,(function*(){const transition=_atwin.Sweep.Transition.FLY;const transitionTime=2e3;console.log("Sweep Move",sweepId);_atwin.Sweep.moveTo(sweepId,{transition:transition,transitionTime:transitionTime}).then((function(){console.log("Sweep Arrived at sweep "+sweepId)})).catch((function(error){console.log("Sweep Error on Arriving",error)}))}))}function getNearbySweeps(sweepId){return __awaiter(this,void 0,void 0,(function*(){if(sweepId){const nearby=yield sweeps.find((item=>item.id==sweepId)).neighbors;console.log("Nearby Sweeps",nearby);return nearby}else{console.log("No Nearby Sweeps")}}))}function getComponentLoader(object){console.log("getComponentLoader()",object);if(object){let index=object.object_type;if(supportedMediaTypes.includes(object.object_type)){console.log("====Loader planeType");return planeType}let component={FBX:_atwin.Scene.Component.FBX_LOADER,GLB:gltfType,MP4:"liveVideo",ZIP:"slideScreenModel",BOX:boxType,TEXT:textType};console.log("====Loader",component[index]);return component[index]||""}return""}function setSelectedObject(data,node,component,type){selectedObject={object:data,component:component,node:node,type:type};const previousCoords={object_position:selectedObject.node.obj3D.position,object_rotation:selectedObject.node.obj3D.rotation,object_scale:selectedObject.node.obj3D.scale};_previousAction=JSON.stringify(previousCoords);actionHistory.push(_previousAction);console.log("Previous transform "+JSON.stringify(previousObjTransform));console.log("setSelectedObject()")}function clearSelectedObject(){console.log("clearSelectedObject()");selectedObject=undefined}function setLighting(){return __awaiter(this,void 0,void 0,(function*(){const[sceneObject]=yield _atwin.Scene.createObjects(1);const lights=sceneObject.addNode();lights.addComponent("mp.directionalLight",{intensity:.6,color:{r:1,g:1,b:1}});lights.addComponent("mp.ambientLight",{intensity:.6,color:{r:1,g:1,b:1}});lights.start()}))}function removeTransformControls(){if(!_transformControlNode){console.error("_transformControlNode is undefined");return}if(!_inputControlComponent){console.error("!_inputControlComponent is undefined");return}_transformControlNode.stop();_inputControlComponent.cancel();console.log("removeTransformControls()")}function setTransformControls(selectedObject,mode="translate"){console.log("Object to be transformed "+selectedObject.object.object_data.name);removeTransformControls();const transformNode=_sceneObject.addNode();const transformComponent=transformNode.addComponent("mp.transformControls");_transformControlNode=transformNode;const inputComponent=transformNode.addComponent("mp.input",{eventsEnabled:true,userNavigationEnabled:true});_transformComponent=transformComponent;if(selectedObject.object.object_data.object_type=="GLB"){const eventPath=_sceneObject.addEmitPath(selectedObject.component,"gltfevents");_inputControlComponent=inputComponent.spyOnEvent(new DragSpy(eventPath,selectedObject.node,selectedObject.component,selectedObject.object))}else if(selectedObject.object.object_data.object_type=="BOX"){const eventPath=_sceneObject.addEmitPath(selectedObject.component,"boxEvents");_inputControlComponent=inputComponent.spyOnEvent(new DragSpy(eventPath,selectedObject.node,selectedObject.component,selectedObject.object))}else if(supportedMediaTypes.includes(selectedObject.object.object_data.object_type)){const eventPath=_sceneObject.addEmitPath(selectedObject.component,"planeEvents");_inputControlComponent=inputComponent.spyOnEvent(new DragSpy(eventPath,selectedObject.node,selectedObject.component,selectedObject.object))}transformNode.start();transformComponent.inputs.selection=selectedObject.node;transformComponent.inputs.mode=mode}function setTransformMode(mode){return __awaiter(this,void 0,void 0,(function*(){if(mode=="translate"){_transformMode="translate"}else if(mode=="rotate"){_transformMode="rotate"}else if(mode=="scale"){_transformMode="scale"}else{console.error("Transform mode not supported or incorrect")}_transformComponent.inputs.mode=_transformMode}))}function revertTransform(action="undo"){if(!selectedObject){console.error("selectedObject is undefined.");return}if(!currentObjTransform){console.error("currentObjTransform is undefined");return}if(actionHistory.length<=0){console.error("actionHistory is empty");return}let targetIndex;let nextIndex;const index=actionHistory.indexOf(JSON.stringify(currentObjTransform));console.log(`Action is ${action} and index is ${index}`);if(action==="undo"){if(index-1>=0){targetIndex=index-1;nextIndex=targetIndex-1}else{return false}}else if(action==="redo"){if(index+1<=actionHistory.length){targetIndex=index+1;nextIndex=targetIndex+1}else{return false}}else{console.error("Incorrect function argument for revertTransform");return false}previousObjTransform=JSON.parse(_previousAction);if(!actionHistory[targetIndex]){console.error("actionHistory is either empty or undefined");return}const objectTransform=JSON.parse(actionHistory[targetIndex]);const euler=convertToEuler(objectTransform.object_rotation);objectTransform.object_rotation={_x:euler.x,_y:euler.y,_z:euler.z};setObjectTransformation(selectedObject.node,objectTransform,true);console.log("Action history length "+actionHistory.length);console.log("Current history position "+index);console.log("Target history position "+targetIndex);currentObjTransform=JSON.parse(actionHistory[targetIndex]);if(action=="undo"&&nextIndex>=0){return false}else if(action=="redo"&&nextIndex<=actionHistory.length){return false}else{return true}}function clearActionHistory(){console.info("clearActionHistory()");actionHistory=[]}function convertToEuler(coords){const eulerX=Math.atan2(coords._x,coords._x);const eulerY=Math.atan2(-coords._x,Math.sqrt(coords._y*coords._y+coords._z*coords._z));const eulerZ=Math.atan2(coords._x,coords._x);const degreesX=eulerX*(180/Math.PI);const degreesY=eulerY*(180/Math.PI);const degreesZ=eulerZ*(180/Math.PI);const eulerCoords={x:degreesX,y:degreesY,z:degreesZ};console.log("Euler coords "+JSON.stringify(eulerCoords));return eulerCoords}function setObjectTransformation(node,transform,reverting=false){node.obj3D.scale.set(transform.object_scale.x,transform.object_scale.y,transform.object_scale.z);node.obj3D.position.set(transform.object_position.x,transform.object_position.y,transform.object_position.z);if(reverting){node.obj3D.rotation.set(transform.object_rotation._x,transform.object_rotation._y,transform.object_rotation._z)}else{node.obj3D.rotation.set(transform.object_rotation.x,transform.object_rotation.y,transform.object_rotation.z)}}function calculateDistance(pos1,pos2){const dx=pos2.x-pos1.x;const dy=pos2.y-pos1.y;const dz=pos2.z-pos1.z;return Math.sqrt(dx*dx+dy*dy+dz*dz)}function showVideoObjects(object,action="loading"){var _a,_b;return __awaiter(this,void 0,void 0,(function*(){const liveStreamNode=_sceneObject.addNode();var liveStreamComponent=liveStreamNode.addComponent(getComponentLoader(object.object_data),{url:(_a=object.object_data)===null||_a===void 0?void 0:_a.amazon_uri});liveStreamNode.position.set(object.object_position.x,object.object_position.y,object.object_position.z);liveStreamNode.obj3D.rotation.set(object.object_rotation.x,object.object_rotation.y,object.object_rotation.z);liveStreamNode.scale.set(object.object_scale.x,object.object_scale.y,object.object_scale.z);if(liveStreamComponent.outputs.loadingState!="Error"){liveStreamNode.start()}liveStreamComponent.inputs.src=(_b=object.object_data)===null||_b===void 0?void 0:_b.amazon_uri;if(action==="adding"){console.log("Saving object...");const id=yield addShowcaseObject(object);if(id){console.log("Saved object",id);object.id}}_videos.push({object:object,component:liveStreamComponent,node:liveStreamNode,collider:liveStreamComponent.outputs,type:"VIDEO"})}))}function playVideo(videoId){let videoObject=_videos.find((object=>object.object.id==videoId));if(videoObject){videoObject.component.video.play()}else{console.error("Unable to find video object using that id")}}function pauseVideo(videoId){let videoObject=_videos.find((object=>object.object.id==videoId));if(videoObject){videoObject.component.video.pause()}else{console.error("Unable to find video object using that id")}}function videoAutoPlay(){function nearestVideo(videoObject){return __awaiter(this,void 0,void 0,(function*(){let videoPosition=videoObject.object.object_position;let cameraPosition=getCurrentSweepPosition();const camPos={x:cameraPosition.x,y:cameraPosition.y,z:cameraPosition.z};const videoPos={x:videoPosition.x,y:videoPosition.y,z:videoPosition.z};const THREE=videoObject.component.context.three;const v3camPos=new THREE.Vector3(cameraPosition.x,cameraPosition.y,cameraPosition.z);const v3videoPos=new THREE.Vector3(videoPosition.x,videoPosition.y,videoPosition.z);const computedDistance=v3camPos.distanceTo(v3videoPos);try{if(videoObject.object.autoplay&&videoObject.object.autoplay_distance&&computedDistance<videoObject.object.autoplay_distance){setVideoPlayback("play",videoObject.component.video)}else{setVideoPlayback("pause",videoObject.component.video)}}catch(e){console.error("Unable to play or stop video")}}))}_videos.forEach((videoObject=>nearestVideo(videoObject)))}function createVideoComponent(){function videoRenderer(){this.inputs={visible:true,userNavigationEnabled:true,eventsEnabled:true,colliderEnabled:true,src:null};this.outputs={texture:null,video:null,aspect:720/480};this.onInit=function(){this.video;this.texture};this.events={"INTERACTION.CLICK":true};this.onEvent=function(eventType,eventData){return __awaiter(this,void 0,void 0,(function*(){if(eventType=="INTERACTION.CLICK"&&_viewMode==="interactive"){let video=_videos.filter((l=>{var _a,_b,_c,_d;return(_d=((_b=(_a=l.collider)===null||_a===void 0?void 0:_a.collider)===null||_b===void 0?void 0:_b.uuid)==((_c=eventData.collider)===null||_c===void 0?void 0:_c.uuid))!==null&&_d!==void 0?_d:false}))[0];console.log("Video object "+JSON.stringify(video.object));const selectedObj={object:video.object,node:video.node,component:video.component};clearActionHistory();setSelectedObject(video.object,video.node,video.component,"VIDEO");setTransformControls(selectedObj)}}))};this.onInputsUpdated=function(previous){this.releaseTexture();const THREE=this.context.three;if(!this.inputs.src){this.video.src="";return}if(this.inputs.src instanceof HTMLVideoElement){this.video=this.inputs.src}else{this.video=this.createVideoElement();if(typeof this.inputs.src==="string"){this.video.src=this.inputs.src}else{this.video.srcObject=this.inputs.src}this.video.load()}this.texture=new THREE.VideoTexture(this.video);this.texture.minFilter=THREE.LinearFilter;this.texture.magFilter=THREE.LinearFilter;this.texture.format=THREE.RGBFormat;var geometry=new THREE.PlaneGeometry(1,1);geometry.scale(1,480/720,1);geometry.translate(0,.33,0);this.material=new THREE.MeshBasicMaterial({map:this.texture,side:THREE.DoubleSide});var mesh=new THREE.Mesh(geometry,this.material);this.outputs.objectRoot=mesh;this.outputs.collider=mesh;mesh.visible=this.inputs.visible;this.outputs.texture=this.texture;this.outputs.video=this.video};this.releaseTexture=function(){if(this.texture){this.outputs.texture=null;this.texture.dispose()}};this.createVideoElement=function(){const video=document.createElement("video");video.setAttribute("id","htmlLivestreamVideo");video.crossOrigin="anonymous";video.setAttribute("height","480");video.setAttribute("width","720");video.setAttribute("webkit-playsinline","webkit-playsinline");video.setAttribute("controls","controls");video.muted=false;video.loop=true;video.volume=1;return video};this.onTick=function(tickDelta){};this.onDestroy=function(){this.material.dispose()};this.spyOnEvent=function(payload){console.log("payload",payload)}}function makeVideoRender(){return new videoRenderer}_atwin.Scene.register("liveVideo",makeVideoRender)}function createSlideScreenModel(){function SlideScreenModelRenderer(){this.inputs={src:null,userNavigationEnabled:true,eventsEnabled:true,colliderEnabled:true,visible:true};this.outputs={texture:null,t_image:null};this.onInit=function(){this.texture;this.t_image;this.material;this.mesh};this.events={"INTERACTION.CLICK":true};this.onEvent=function(eventType,eventData){return __awaiter(this,void 0,void 0,(function*(){console.log("onEventSlideShow",eventType,eventData);if(eventType=="INTERACTION.CLICK"){if(_allSlideShow.length>0){let slideshow=_allSlideShow.filter((l=>{var _a,_b,_c,_d;return(_d=((_b=(_a=l.collider)===null||_a===void 0?void 0:_a.collider)===null||_b===void 0?void 0:_b.uuid)==((_c=eventData.collider)===null||_c===void 0?void 0:_c.uuid))!==null&&_d!==void 0?_d:false}))[0];console.log("Slideshow object "+JSON.stringify(slideshow.object));if(_viewMode==="interactive"){const selectedObj={object:slideshow.object,node:slideshow.node,component:slideshow.component,type:"ZIP"};clearActionHistory();setSelectedObject(slideshow.object,slideshow.node,slideshow.component,"ZIP");setTransformControls(selectedObj)}console.log("slideShow eventData",slideshow);if(slideshow!=null){console.log("slideShow eventData",slideshow);var mousePosition=yield getMousePosition();var planePosition=slideshow.node.obj3D.position;console.log("MOUSE POSITION",mousePosition);console.log("PLANE POSITION",planePosition);if(slideshow.object.object_data.object_type=="ZIP"){if(slideshow.object.id!=_currentSlideShowID){_currentSlideIndex=_slideShowImage.find((elem=>elem.id===slideshow.object.id)).idx;console.log("CURRENT INDEX",_currentSlideIndex);_currentSlideShow=_slideShowImage.find((elem=>elem.id===slideshow.object.id)).images;console.log("CURRENT SLIDE",_currentSlideShow)}if(slideshow.object.id==_currentSlideShowID){console.log("ChangeImage",slideshow,_currentSlideShowID);if(planePosition.x<mousePosition.x){console.log("LEFT SIDE");clearInterval(_timer);this.inputs.src=imageStream("prev")}else if(planePosition.y<mousePosition.y){console.log("RIGHT SIDE");clearInterval(_timer);this.inputs.src=imageStream("next")}else if(planePosition.y>mousePosition.y){console.log("AUTOPLAY");_timer=setInterval((()=>{_currentSlideIndex=(_currentSlideIndex+1)%_currentSlideShow.length;console.log("CURRENT INDEX",_currentSlideIndex);this.inputs.src=imageStream("next")}),2e3)}}else{_currentSlideShowID=slideshow.object.id}}}}}}))};this.onInputsUpdated=function(previous){this.releaseTexture();const three=this.context.three;this.t_image=document.createElement("IMG");this.t_image.src=this.inputs.src;this.t_image.setAttribute("width","auto");this.t_image.setAttribute("height","auto");this.t_image.crossOrigin="anonymous";const planeGeo=new three.PlaneGeometry(1.5,1.5);planeGeo.translate(0,.33,0);if(previous.src!=this.inputs.src){this.texture=(new three.TextureLoader).load(this.t_image.src,((tex=this.texture)=>{tex.minFilter=three.LinearFilter;tex.magFilter=three.LinearFilter;tex.format=three.RGBAFormat;tex.needsUpdate=true;tex.onUpdate=this.textureUpdated;this.material=new three.MeshBasicMaterial({map:this.texture,side:three.DoubleSide,transparent:true,alphaTest:.5});this.mesh=new three.Mesh(planeGeo,this.material);this.mesh.scale.set(1,this.texture.image.height/this.texture.image.width,1);this.outputs.objectRoot=this.mesh;this.outputs.collider=this.mesh;this.outputs.texture=this.texture;this.outputs.t_image=this.t_image}))}if(this.mesh!=null){this.mesh.visible=this.inputs.visible}};this.textureUpdated=function(params){console.log("Update Callback",params)};this.releaseTexture=function(){if(this.texture){this.outputs.texture=null}};this.onTick=function(tickDelta){};this.onDestroy=function(){this.material.dispose();this.texture.dispose()}}function makeSlideScreenModelRenderer(){return new SlideScreenModelRenderer}_atwin.Scene.register("slideScreenModel",makeSlideScreenModelRenderer)}function registerCustomLoaders(){return __awaiter(this,void 0,void 0,(function*(){if(_hasRegisteredLoaders===false){console.log("registerCustomLoaders()");createVideoComponent();createSlideScreenModel();yield _atwin.Scene.registerComponents([{factory:planeFactory(_atwin),name:planeType},{factory:gltfFactory(_atwin),name:gltfType},{factory:boxFactory(_atwin),name:boxType},{factory:textFactory(_atwin),name:textType}]);_hasRegisteredLoaders=true}}))}function showSlideScreenModel(object,action="loading"){return __awaiter(this,void 0,void 0,(function*(){const modelNode=_sceneObject.addNode();const component=modelNode.addComponent("slideScreenModel");console.log("COMPONENT",component);const objTransformation={object_position:object.object_position,object_rotation:object.object_rotation,object_scale:object.object_scale};setObjectTransformation(modelNode,objTransformation);modelNode.start();yield addImageToSlideShow(object.object_data,component,object.id);console.log("SLIDE OUTPUT",component.outputs);if(action==="adding"){console.log("Saving object...");const id=yield addShowcaseObject(object);if(id){console.log("Saved object",id);object.id}}var slideShow={collider:component.outputs,object:object,node:modelNode,component:component,type:"ZIP"};_allSlideShow.push(slideShow);console.log("ALL SLIDESHOW",_allSlideShow)}))}function addImageToSlideShow(data,component,objectID){return __awaiter(this,void 0,void 0,(function*(){var dataList=[];yield new JSZip.external.Promise((function(resolve,reject){JSZipUtils.getBinaryContent(data.amazon_uri,(function(err,data){if(err){console.log("getBI error",err);reject(err)}else{console.log("getBI success",data);resolve(data)}}))})).then((function(data){console.log("data from getBI",data);return JSZip.loadAsync(data)})).then((data=>{console.log("data from loadAsync",data);for(let key in data.files){if(key.includes("__MACOSX"))continue;if(key.includes(".DS_Store"))continue;if(data.files[key].dir)continue;let base=data.file(data.files[key].name).async("base64");base.then((res=>{dataList.push({name:data.files[key].name,path:`data:image/png;base64,${res}`});if(dataList.length==1){component.inputs.src=`data:image/png;base64,${res}`}}))}_slideShowImage.push({id:objectID,images:dataList,idx:0,playID:null,play:false,comp:component})}))}))}function getMousePosition(){return __awaiter(this,void 0,void 0,(function*(){let planePosition;const pointer=_atwin.Pointer.intersection.subscribe((function(intersection){planePosition=intersection.position}));pointer.cancel();return planePosition}))}function imageStream(direction){let diff=direction==="prev"?-1:1;let length=_currentSlideShow.length;let index=_currentSlideIndex+diff;if(index===-1){index=length-1}if(index===length){index=0}_currentSlideIndex=index;_slideShowImage.find((elem=>elem.id===_currentSlideShowID)).idx=index;return _currentSlideShow[_currentSlideIndex].path}function cameraRotate(x,y,speed){return __awaiter(this,void 0,void 0,(function*(){yield _atwin.Camera.rotate(x,y,{speed:speed}).then((()=>{console.log("camera rotate success.",x,y)})).catch((error=>{console.log("camera rotate error.",error)}))}))}function cameraPan(x,z){return __awaiter(this,void 0,void 0,(function*(){let mode=getViewMode();if(mode==_atwin.Mode.Mode.FLOORPLAN||mode==_atwin.Mode.Mode.DOLLHOUSE){yield _atwin.Camera.pan({x:x,z:z}).then((()=>{console.log("camera pan success.")})).catch((error=>{console.log("camera rotate error:",error)}))}else{console.error("Incorrect view mode.")}}))}function cameraLookAt(x,y){return __awaiter(this,void 0,void 0,(function*(){yield _atwin.Camera.lookAtScreenCoords(x,y).then((function(){console.log("camera looking at...",x,y)})).catch((function(error){console.log("camera looking at error:",error)}))}))}function moveInDirection(direction){return __awaiter(this,void 0,void 0,(function*(){let nextDirection=_atwin.Camera.Direction.LEFT;switch(direction.toUpperCase()){case"LEFT":nextDirection=_atwin.Camera.Direction.LEFT;break;case"RIGHT":nextDirection=_atwin.Camera.Direction.RIGHT;break;case"UP":nextDirection=_atwin.Camera.Direction.UP;break;case"DOWN":nextDirection=_atwin.Camera.Direction.DOWN;break;case"BACK":nextDirection=_atwin.Camera.Direction.BACK;break;case"FORWARD":nextDirection=_atwin.Camera.Direction.FORWARD;break;default:nextDirection=_atwin.Camera.Direction.LEFT;break}yield _atwin.Camera.moveInDirection(nextDirection).then((function(){console.log("Move to...",nextDirection)})).catch((function(){console.warn("An error occured while moving in that direction.",nextDirection)}))}))}function dispose3dObjects(){console.log("dispose3dObjects");_3DXObjects.forEach((obj=>{console.log("_3DXObjects stop",obj);obj.node.stop()}));_videos.forEach((vid=>{console.log("_videos pause and node stop",vid);vid.component.video.pause();vid.node.stop()}));_allSlideShow.forEach((slide=>{console.log("_allSlideShow stop",slide);slide.node.stop()}))}function getViewMode(){return _currentViewMode}function setViewMode(mode){return __awaiter(this,void 0,void 0,(function*(){console.log("=== get Mode Type ===",_getModeType(mode));let modeType=_getModeType(mode);yield _atwin.Mode.moveTo(modeType).then((function(nextMode){console.log("Arrived at new view mode "+nextMode)})).catch((function(error){console.error("Error occur on:",error)}))}))}function _getModeType(mode){let modes={DOLLHOUSE:"mode.dollhouse",FLOORPLAN:"mode.floorplan",INSIDE:"mode.inside",OUTSIDE:"mode.outside",TRANSITIONING:"mode.transitioning"};return modes[mode.toUpperCase()]||""}function disconnectSpace(){return __awaiter(this,void 0,void 0,(function*(){console.log("disconnectSpace()");yield hideTags();dispose3dObjects();_atwin.disconnect();_iframe.src="";_api={};_atwin={};_tags=[];tags=[];sweeps=[];_allSlideShow=[];_slideShowImage=[];_currentSlideShowID=0;_currentSlideIndex=0;_currentSlideShow=null;_timer=null;_videos=[];_currentViewMode="";_3DXObjects=[];_unrenderedObjects=[];_previousTimeStamp=0;_currentSweep={};_currentCameraPose={};_sweeps=[]}))}function getTargetPosition(callback=undefined){return __awaiter(this,void 0,void 0,(function*(){console.log("getTargetPosition()");if(!_objectMarker){console.error("Object marker has not been created");return}const iframe=document.getElementById(_mpConfig.iframeId);const iframeSize={w:iframe.clientWidth,h:iframe.clientHeight};let pointerCoord;function onMouseClick(){return __awaiter(this,void 0,void 0,(function*(){_pointerSubscription.cancel();setElementVisibility(_objectMarker,false);yield _atwin.Pointer.resetTexture();_objectMarker.removeEventListener("click",onMouseClick);console.info("Pointer coordinate is",pointerCoord);setState({isLoading:false,loaded:true,data:pointerCoord});if(callback!==undefined){callback(pointerCoord)}}))}console.log("Initializing pointer intersection");_objectMarker.addEventListener("click",onMouseClick);yield _atwin.Pointer.editTexture("targetPointer");_pointerSubscription=_atwin.Pointer.intersection.subscribe((function name(intersection){pointerCoord=intersection.position;if(_currentCameraPose){const screenCoord=_atwin.Conversion.worldToScreen(intersection.position,_currentCameraPose,iframeSize);translateElementPosition(_objectMarker,screenCoord)}}))}))}function setPointerCoordinates(position){_pointerCoord=position}function addObjectToSpace(object,config=undefined){return __awaiter(this,void 0,void 0,(function*(){console.log("addObjectToSpace()");console.log("Object Data ",object);const iframe=document.getElementById(_mpConfig.iframeId);let showcase_object;let pointerSubscriptionActive=false;const iframeSize={w:iframe.clientWidth,h:iframe.clientHeight};if(!_objectMarker){console.error("Object marker has not been created");return}function onObjectPositionSet(object){return __awaiter(this,void 0,void 0,(function*(){console.log("Object positioned at: ",_pointerCoord);if(pointerSubscriptionActive){_pointerSubscription.cancel();setElementVisibility(_objectMarker,false);yield _atwin.Pointer.resetTexture()}if(config){showcase_object=createIShowcaseObjectData(object,config.position,config.scale,config.rotation)}else{showcase_object=createIShowcaseObjectData(object)}console.log("Created object",showcase_object);console.log("About to render object",showcase_object);if(object.object_type=="MP4"){yield showVideoObjects(showcase_object)}else if(object.object_type=="ZIP"){yield showSlideScreenModel(showcase_object)}else if(object.object_type=="TEXT"){showcase_object.object_position.y+=1;show3dText(showcase_object,config.options)}else{if(config){yield show3DObjects(showcase_object,config.options,"adding")}else{yield show3DObjects(showcase_object,null,"adding")}}_objectMarker.removeEventListener("click",handleClick);return showcase_object}))}const handleClick=()=>onObjectPositionSet(object);if(object!==undefined&&config===undefined||object!==undefined&&config.options&&!config.position){console.log("Positioning object to user pointer click coordinates");_objectMarker.addEventListener("click",handleClick);yield _atwin.Pointer.editTexture("targetPointer");pointerSubscriptionActive=true;_pointerSubscription=_atwin.Pointer.intersection.subscribe((function name(intersection){_pointerCoord=intersection.position;if(_currentCameraPose){const screenCoord=_atwin.Conversion.worldToScreen(intersection.position,_currentCameraPose,iframeSize);translateElementPosition(_objectMarker,screenCoord)}}));return}else if(object!==undefined&&config.position!=null){console.log("Positioning object to pre-defined coordinates");onObjectPositionSet(object);return}console.error("Object is either null or undefined");return}))}function translateElementPosition(element,coord){console.log("translateElementPosition()");if(coord){if(coord.x>0){element.style.left=`${Math.abs(coord.x-40)}px`;element.style.top=`${Math.abs(coord.y-45)}px`}else{element.style.left=`${Math.abs(coord.x+40)}px`;element.style.top=`${Math.abs(coord.y+45)}px`}const computedStyle=window.getComputedStyle(_objectMarker);const displayValue=computedStyle.getPropertyValue("display");if(displayValue=="none"){setElementVisibility(_objectMarker,true)}return}console.error("Argument for coord is undefined");return}function create3dMarker(){const container=document.getElementById("showcase-container");const checkMarker=document.getElementById("marker-3d");if(!checkMarker){console.log("Marker not found. Creating marker in DOM");_objectMarker=document.createElement("div");_objectMarker.setAttribute("id","marker-3d");_objectMarker.style.display="none";_objectMarker.style.width="90px";_objectMarker.style.height="90px";_objectMarker.style.cursor="pointer";_objectMarker.style.position="absolute";container.appendChild(_objectMarker);return}console.log("Marker found. Skipping marker creation")}function setElementVisibility(element,visible){if(visible){element.style.display="inline-block";return}element.style.display="none"}function createIShowcaseObjectData(object_data,position=undefined,scale=undefined,rotation=undefined){console.log("createIShowcaseObject()",object_data);const newObj=object_data;const showcase_object={};showcase_object.id=generateRandomUniqueNumber();showcase_object.object_id=object_data.id;showcase_object.user_id=1;showcase_object.showcase_id=parseInt(_spaceId);showcase_object.object_position=position!=undefined?position:_pointerCoord;showcase_object.object_rotation=rotation!=undefined?rotation:{x:0,y:0,z:0};showcase_object.object_scale=scale!=undefined?scale:{x:1,y:1,z:1};if(object_data.object_type=="MP4"){showcase_object.autoplay=true;showcase_object.autoplay_distance=2}showcase_object.offset_position=1;showcase_object.offset_rotation=1;showcase_object.position_unit="m";showcase_object.object_data=object_data;showcase_object.showcase_object_name=object_data.name;if(showcase_object.object_data){console.error("Empty object_data");showcase_object.object_data=newObj}console.log("Returned objects",showcase_object);return showcase_object}function copyObject(payload,position_offset=undefined,rotation_offset=undefined){return __awaiter(this,void 0,void 0,(function*(){console.log("copyObject()");if(payload){payload.id=payload.id+Math.round(Math.random()*200);if(position_offset==undefined){payload.object_position.x+=.5;payload.object_position.z+=.5}else{payload.object_position.x+=position_offset.x;payload.object_position.z+=position_offset.z}if(rotation_offset){payload.object_rotation.x+=rotation_offset.x;payload.object_rotation.y+=rotation_offset.y;payload.object_rotation.z+=rotation_offset.z}yield addObjectToSpace(payload.object_data,{position:payload.object_position,rotation:payload.object_rotation,scale:payload.object_scale});return}console.error("Payload for copyObject is undefined");return}))}function replaceObject(payload,target,options=null){return __awaiter(this,void 0,void 0,(function*(){console.log("replaceObject()");if(payload&&target){addObjectToSpace(payload,{options:options,position:target.object.object_position,rotation:target.object.object_rotation,scale:target.object.object_rotation});removeTransformControls();target.node.stop()}console.error("payload or target is undefined");return}))}function createMediaScreenObject(mediaUrl,mediaType="image"){return __awaiter(this,void 0,void 0,(function*(){console.log("=== createMediaScreenObject()");console.log("=== mediaUrl",mediaUrl);console.log("=== mediaType",mediaType);const fallbackMedia="https://roki-atwin-dev.s3.amazonaws.com/c28b748a-b740-4d37-bdac-bbcd557c9016.PNG?AWSAccessKeyId=AKIAVVUXZ66KW7GBSW7A&Signature=XOEZtGauyfFEYPxS0jSsSbyqQbU%3D&Expires=2005920767";const mediaUpload=yield createMediaObject(fallbackMedia,"Nomedia.png");const object_data=yield addObject(mediaUpload);const options={name:"canvasFrame",type:mediaType,url:object_data.amazon_uri,visible:true,aspectRatio:1};return{object_data:object_data,options:options}}))}function createFileFromURL(url,fileName){return __awaiter(this,void 0,void 0,(function*(){console.info("createFileFromURL()");try{const response=yield fetch(url);const fileContent=yield response.blob();const file=new File([fileContent],fileName);console.info("Successfuly created file",file);return file}catch(error){console.error("Error creating File object:",error);return null}}))}function createMediaObject(url,filename){return __awaiter(this,void 0,void 0,(function*(){console.info("createMediaObject()");if(url&&filename){const file=yield createFileFromURL(url,filename);const uid=new ShortUniqueId({length:10});const filePayload={};filePayload.name=filename;filePayload.filename=filename;filePayload.object_type=filename.slice((filename.lastIndexOf(".")-1>>>0)+2).toUpperCase();filePayload.user_id=1;filePayload.object_key=uid();filePayload.file=file;console.info("Successfuly created file payload",filePayload);return filePayload}}))}function addMediaScreen(mediaUrl,transform,readonly,autoplay){return __awaiter(this,void 0,void 0,(function*(){console.log("=== addMediaScreen");console.log("=== mediaUrl",mediaUrl);console.log("=== transform",transform);console.log("=== readonly",readonly);console.log("=== autoplay",autoplay);if(!mediaUrl||mediaUrl===""){mediaUrl="";console.log("=== mediaUrl is not set ")}const{object_data:object_data,options:options}=yield createMediaScreenObject(mediaUrl,"image");if(transform){console.log("=== Adding programmatically");yield addObjectToSpace(object_data,{options:options,position:transform.position,rotation:transform.rotation,scale:transform.scale})}else{console.log("=== Adding using cursor pointer");yield addObjectToSpace(object_data,{options:options})}return object_data.id}))}function attachMediaScreenContent(mediaScreenId,mediaUrl,mediaType="image"){return __awaiter(this,void 0,void 0,(function*(){let urlPath;let typePath;const fileTypes=["image","video"];if(!fileTypes.includes(mediaType)){console.error("Unsupported file type, please use a valid type");return}for(const{desc:desc,path:path}of _sceneObject.pathIterator()){if(desc.id===`url_${mediaScreenId}`){urlPath=path}if(desc.id===`type_${mediaScreenId}`){typePath=path}}if(mediaType!=="image"){typePath.set(mediaType)}if(urlPath){urlPath.set(mediaUrl);yield updateObjectUri(mediaScreenId,mediaUrl);return}console.error("Could not find input path for specified object");return}))}function setBasePointPosition(id,position){let basePointPath;for(const{desc:desc,path:path}of _sceneObject.pathIterator()){if(desc.id===`basePosition_${id}`){basePointPath=path}}if(position==="corner"){basePointPath.set("corner")}else{basePointPath.set("center")}}function setVideoPlayback(action,element){const actions=["play","pause","mute","unmute"];if(actions.includes(action)){if(action===actions[0]){element.play()}else if(action===actions[1]){element.pause()}else if(action===actions[2]){element.muted=true}else if(action===actions[3]){element.muted=false}return}console.error("Argument does not match known actions");return}function setState({isLoading:isLoading,loaded:loaded,error:error,data:data}){const newState={isLoading:isLoading,loaded:loaded,error:error!==undefined?error:"",data:data!==undefined?data:null};state=Object.assign({},newState)}function checkValidFileType(payload){if(payload){const fileName=payload.name;const fileExtension=fileName.substring(fileName.lastIndexOf(".")+1);console.log("File extension "+fileExtension);if(supportedFileTypes.includes(fileExtension.toUpperCase())){return{valid:true,type:fileExtension}}return{valid:false}}console.error("No file provided");return{valid:false}}function addObject(payload){return __awaiter(this,void 0,void 0,(function*(){setState({isLoading:true,loaded:false});const isValid=checkValidFileType(payload.file);if(isValid.valid){try{const response=yield _api.post("/s3/file.json",payload);console.log("S3 response is: ",response);if(response.data.status=="success"){const id=response.data.query_result.id;const object_data=yield getObject(id);setState({isLoading:false,loaded:true,data:object_data});return object_data}}catch(error){console.error("Object upload failed"+error)}}console.error("Unsupported file type");return}))}function addShowcaseObject(payload){return __awaiter(this,void 0,void 0,(function*(){console.log("addShowcaseObject()");if(payload){payload.object_position=JSON.stringify(payload.object_position);payload.object_rotation=JSON.stringify(payload.object_rotation);payload.object_scale=JSON.stringify(payload.object_scale);delete payload["id"];try{const response=yield _api.post("/v1/showcase-objects.json",payload);console.log("API response is: ",response);if(response.data.status=="success"){console.log("Add showcase data",response.data.data);return response.data.data.id}}catch(error){console.error("Object upload failed"+error);return}}return}))}function getObject(id){return __awaiter(this,void 0,void 0,(function*(){console.log("getObject()");setState({isLoading:true,loaded:false});if(id){try{const response=yield _api.get(`/v1/objects/id/${id}`);if(response.data.status=="success"){const object_data=response.data.data[0];console.log("Response"+JSON.stringify(object_data));return object_data}console.error("Failed to get requested object")}catch(error){console.error("Error getting object "+error)}}return}))}function getShowcaseObject(id){return __awaiter(this,void 0,void 0,(function*(){console.log("getShowcaseObject()");setState({isLoading:true,loaded:false});if(id){try{const response=yield _api.get(`/v1/showcase-objects/showcase-id/${id}`);if(response.data.status=="success"){const showcase_object=response.data.data[0];const object=yield getObject(showcase_object.object_id);showcase_object.object_data=object;setState({isLoading:false,loaded:true,data:showcase_object});console.log("Success ",showcase_object);return state}console.error("Failed to get requested showcase object")}catch(error){setState({isLoading:false,loaded:false,error:error});console.error("Error getting showcase object "+error)}}setState({isLoading:false,loaded:false,error:"id is undefined"});return state}))}function updateObject(id,payload){return __awaiter(this,void 0,void 0,(function*(){const isValid=checkValidFileType(payload.file);if(isValid.valid){try{const response=yield _api.put(`/s3/file/${id}.json`,payload);console.log("S3 response is: ",response);if(response.data.status=="success"){const id=response.data.query_result.id;const object_data=yield getObject(id);return object_data}}catch(error){console.error("Object upload failed"+error)}}console.log("Unsupported file type");return}))}function updateObjectUri(id,uri){return __awaiter(this,void 0,void 0,(function*(){if(id&&uri){const payload={};payload.amazon_uri=uri;try{const response=yield _api.put(`v1/objects/${id}.json`,payload);if(response.status==200){console.log("Successfuly updated URI")}}catch(error){}return}}))}function updateShowcaseObject(id,payload){return __awaiter(this,void 0,void 0,(function*(){console.log("updateShowcaseObject()");setState({isLoading:true,loaded:false});if(id&&payload){try{const response=yield _api.put(`/v1/showcase-objects/id/${id}`,payload);console.log("showcase-object response is: ",response);if(response.data.status=="success"){const id=response.data.query_result.id;const object_data=yield getObject(id);setState({isLoading:false,loaded:true,data:object_data});return state}setState({isLoading:false,loaded:false});return state}catch(error){setState({isLoading:false,loaded:false,error:error});console.error("Object upload failed"+error);return state}}setState({isLoading:false,loaded:false,error:"id or payload is undefined"});return state}))}function deleteObject(id){return __awaiter(this,void 0,void 0,(function*(){setState({isLoading:true,loaded:false});try{const response=yield _api.delete(`/s3/file/${id}.json`);console.log("S3 response is: ",response);if(response.data.status=="success"){setState({isLoading:false,loaded:true});return state}setState({isLoading:false,loaded:false,error:"Request failed"});return state}catch(error){setState({isLoading:false,loaded:false,error:error});console.error("Object upload failed"+error);return state}}))}function deleteObjectFromSpace(selected){return __awaiter(this,void 0,void 0,(function*(){if(selected){try{const response=yield _api.delete(`/v1/showcase-objects/${selected.object.id}.json`);console.log("Delete showcase object response is: ",response);if(response.data.status=="success"){removeTransformControls();selected.node.stop();selectedObject=null;const filteredRenderedObjects=_3DXObjects.filter((obj=>obj.object.id!==selected.object.id));_3DXObjects=filteredRenderedObjects}console.log("Deleted object from scene")}catch(error){console.log("Delete showcase object error",error)}}}))}function deleteMediaScreen(mediaScreenId){return __awaiter(this,void 0,void 0,(function*(){let selectedMediaScreen=_3DXObjects.find((obj=>obj.object.id===mediaScreenId&&obj.type==="FRAME"));console.log(selectedMediaScreen);deleteObjectFromSpace(selectedMediaScreen)}))}function getLibrary(refetch=false){return __awaiter(this,void 0,void 0,(function*(){setState({isLoading:true,loaded:false});if(refetch){try{const response=yield _api.get(`/s3/file.json`);console.log("S3 response is: ",response);if(response.data.status=="success"){const objects=response.data.data;_assetLibrary=objects;setState({isLoading:false,loaded:true,data:objects});return state}setState({isLoading:false,loaded:false,error:"Could not fetch data"});return state}catch(error){console.log("Error! Failed to fetch data",error);setState({isLoading:false,loaded:false,error:error});return state}}return _assetLibrary}))}function addTagToScene(tag){console.log("addTagToScene()");const iframe=document.getElementById(_mpConfig.iframeId);const iframeSize={w:iframe.clientWidth,h:iframe.clientHeight};if(!_objectMarker){console.error("Object marker has not been created");return}function onTagPositionSet(tag){return __awaiter(this,void 0,void 0,(function*(){console.log("Tag positioned at: ",_pointerCoord);_pointerSubscription.cancel();setElementVisibility(_objectMarker,false);_atwin.Pointer.setVisible(true);if(tag){if(tag.json_data.anchorPosition==undefined){}tag.json_data.anchorPosition=_pointerCoord;const tags=[];tags.push(tag);yield showTags(tags)}_objectMarker.removeEventListener("click",handleClick)}))}const handleClick=()=>onTagPositionSet(tag);if(tag!==undefined){_objectMarker.addEventListener("click",handleClick);_atwin.Pointer.setVisible(false);_pointerSubscription=_atwin.Pointer.intersection.subscribe((function name(intersection){_pointerCoord=intersection.position;if(_currentCameraPose){const screenCoord=_atwin.Conversion.worldToScreen(intersection.position,_currentCameraPose,iframeSize);translateElementPosition(_objectMarker,screenCoord)}}));return}console.error("Object is either null or undefined");return}function showMinimap(){minimap.showMinimap()}function hideMinimap(){minimap.hideMinimap()}class ClickSpy{constructor(path,node,component,object_data){this.path=path;this.node=node;this.component=component;this.object_data=object_data}onEvent(data){if(data.input.type=="click"){console.log("Clicked on 3D model");const selectedObj={object:this.object_data,node:this.node,component:this.component};if(this.object_data.object_data.object_type=="BOX"){}clearActionHistory();setSelectedObject(this.object_data,this.node,this.component,"3DX");setTransformControls(selectedObj)}}}class DragSpy{constructor(path,node,component,data){this.eventType="INTERACTION.DRAG_END";this.path=path;this.object_data=data;this.node=node;this.component=component}onEvent(payload){return __awaiter(this,void 0,void 0,(function*(){console.log("INTERACTION.DRAG_END",payload);const selectedObj={object:this.object_data,node:this.node,component:this.component};console.log("New Drag Position"+JSON.stringify(selectedObj.node.position));console.log("New Drag Rotation"+JSON.stringify(selectedObj.node.obj3D.rotation));console.log("New Drag Scale"+JSON.stringify(selectedObj.node.scale));const objectCoords={object_position:selectedObj.node.position,object_rotation:selectedObj.node.obj3D.rotation,object_scale:selectedObj.node.scale};currentObjTransform=objectCoords;const currentTranform=JSON.stringify(currentObjTransform);actionHistory.push(currentTranform);console.log("Actions count "+actionHistory.length);console.log("object type",this.object_data.object_data.object_type);if(this.object_data.object_data.object_type=="TEXT"&&_textDimensions.top!==null){const rotation={x:currentObjTransform.object_rotation._x,y:currentObjTransform.object_rotation._y,z:currentObjTransform.object_rotation._z};setTextDimensionPosition(_textDimensions.top.node,_textDimensions.top.component,"top",currentObjTransform.object_position,rotation);setTextDimensionPosition(_textDimensions.bottom.node,_textDimensions.bottom.component,"bottom",currentObjTransform.object_position,rotation);setTextDimensionPosition(_textDimensions.left.node,_textDimensions.left.component,"left",currentObjTransform.object_position,rotation);setTextDimensionPosition(_textDimensions.right.node,_textDimensions.right.component,"right",currentObjTransform.object_position,rotation)}}))}}class EmitSpy{constructor(path,node,component,object_data){this.path=path;this.node=node;this.component=component;this.object_data=object_data}onEvent(data){if(data.input.type=="click"){console.log("INTERACTION.CLICK",data);const selectedObj={object:this.object_data,node:this.node,component:this.component};clearActionHistory();setSelectedObject(this.object_data,this.node,this.component,"3DX");if(_viewMode==="interactive"){setTransformControls(selectedObj)}}}}export{_atwin,_config,tags,sweeps,selectedObject,previousObjTransform,currentObjTransform,actionHistory,state,_space,_spaceId,_api,_pointerCoord,_3DXObjects,connectSpace,disconnectSpace,getTags,gotoTag,getSweeps,getCurrentSweep,getCurrentSweepPosition,moveToSweep,getNearbySweeps,pauseVideo,playVideo,getCurrentCameraPose,getCameraPosition,moveInDirection,cameraLookAt,cameraPan,cameraRotate,getViewMode,setViewMode,getNearbyObjects,setTransformMode,setSelectedObject,clearSelectedObject,revertTransform,setTransformControls,removeTransformControls,setRenderDistance,clearActionHistory,addObject,getObject,addObjectToSpace,createMediaScreenObject,addMediaScreen,attachMediaScreenContent,addTagToScene,updateObject,updateShowcaseObject,deleteObject,deleteObjectFromSpace,deleteMediaScreen,getShowcaseObject,setBasePointPosition,showObjectDimensions,hideObjectDimensions,setVideoPlayback,setAnimationState,showMinimap,hideMinimap,copyObject,replaceObject,getTargetPosition,setObjectTransformation,setPointerCoordinates};
@@ -0,0 +1,19 @@
1
+ declare let isMeetingInitialized: boolean;
2
+ declare function generateMeetingURL(meeting_id?: string): Promise<{
3
+ host: string;
4
+ guest: string;
5
+ meeting_id: string;
6
+ }>;
7
+ declare function createMeeting(spaceId?: any, hostName?: string, title?: string, meetingStart?: any, duration?: number, password?: string): Promise<{
8
+ host: string;
9
+ guest: string;
10
+ meeting_id: any;
11
+ }>;
12
+ declare function getMeeting(meetingId: string): Promise<import("axios").AxiosResponse<any, any>>;
13
+ declare function getSpaceMeetings(spaceId: number): Promise<import("axios").AxiosResponse<any, any>>;
14
+ declare function startMeeting(meetingApiKey: any): Promise<void>;
15
+ declare function getMeetingParticipants(): IMpParticipant[];
16
+ declare function stopMeeting(): Promise<void>;
17
+ declare function isMeetingExists(meetingId: string): Promise<boolean>;
18
+ declare function isMeetingActive(meetingId: string): Promise<boolean>;
19
+ export { isMeetingInitialized, getMeetingParticipants, createMeeting, startMeeting, stopMeeting, generateMeetingURL, getMeeting, getSpaceMeetings, isMeetingExists, isMeetingActive, };
@@ -0,0 +1,337 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import SuperVizSdk, { MeetingEvent } from '@superviz/sdk';
11
+ import { MatterportPlugin } from "@superviz/matterport-plugin";
12
+ //import {config,_atwin} from 'architwin'
13
+ import * as atwin from "./architwin";
14
+ import { v4 as uuidv4 } from 'uuid';
15
+ let baseURL = new URL(window.location.href);
16
+ let meetingLink = '';
17
+ let atwinObj;
18
+ let supervizSdk;
19
+ let pluginInstance;
20
+ let meetingInstanceApiKey;
21
+ let isMeetingInitialized = false;
22
+ let _participants = [];
23
+ const currentURL = window.location.href;
24
+ function generateMeetingURL(meeting_id = '') {
25
+ return __awaiter(this, void 0, void 0, function* () {
26
+ if (meeting_id !== '') {
27
+ let response = yield validateMeetingID(meeting_id);
28
+ if (response.status === "success") {
29
+ const urlSearchParams = baseURL.searchParams;
30
+ if (urlSearchParams.get('meetingId') === null || urlSearchParams.get('role') === null) {
31
+ meetingLink = baseURL + '?meetingId=' + meeting_id;
32
+ let meetingLinks = {
33
+ host: meetingLink + '&role=host',
34
+ guest: meetingLink + '&role=guest',
35
+ meeting_id: meeting_id,
36
+ };
37
+ console.log('=== MEETING LINK ===', meetingLinks);
38
+ return meetingLinks;
39
+ }
40
+ else {
41
+ console.error('Meeting ID and role parameters already exist!');
42
+ }
43
+ }
44
+ else {
45
+ console.error('Error: Meeting ID is invalid!');
46
+ }
47
+ }
48
+ else {
49
+ console.error('Meeting ID required!');
50
+ }
51
+ return;
52
+ });
53
+ }
54
+ function validateMeetingID(meetingId) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ try {
57
+ const response = yield atwin._api.get(`/v1/meetings?meeting_id=${meetingId}`);
58
+ if (response.data.status === "success") {
59
+ return response.data;
60
+ }
61
+ else {
62
+ console.error('Error: Meeting ID does not exist or match.');
63
+ return response.data;
64
+ }
65
+ }
66
+ catch (error) {
67
+ console.error(error);
68
+ }
69
+ });
70
+ }
71
+ function createMeeting(spaceId, hostName, title, meetingStart, duration, password) {
72
+ return __awaiter(this, void 0, void 0, function* () {
73
+ console.log('=== PASSED PARAMETERS ===', spaceId, hostName, title, meetingStart, duration, password);
74
+ let meeting_uid = uuidv4().toString();
75
+ if (atwin._spaceId != '' && atwin._space != null) {
76
+ let payload = {
77
+ space_id: spaceId,
78
+ meeting_id: meeting_uid,
79
+ host_name: hostName,
80
+ title: title,
81
+ meeting_start: meetingStart,
82
+ meeting_status: meetingStart === '' || meetingStart === undefined ? 1 /* MeetingStatus.STARTED */ : 0 /* MeetingStatus.SCHEDULED */,
83
+ duration: duration,
84
+ password: password
85
+ };
86
+ atwin._api.post('/v1/meetings', payload)
87
+ .then((response) => __awaiter(this, void 0, void 0, function* () {
88
+ console.log(response.data);
89
+ if (response.data.status == 'success') {
90
+ let meetingUrls = yield generateMeetingURL(meeting_uid);
91
+ return meetingUrls;
92
+ }
93
+ else {
94
+ console.log('=== Meeting not stored! ===');
95
+ }
96
+ }))
97
+ .catch(error => {
98
+ console.error(error);
99
+ });
100
+ }
101
+ else {
102
+ meetingLink = baseURL + '?meetingId=' + meeting_uid;
103
+ let meetingLinks = {
104
+ host: meetingLink + '&role=host',
105
+ guest: meetingLink + '&role=guest',
106
+ meeting_id: meeting_uid,
107
+ };
108
+ console.log('=== MEETING LINK ===', meetingLinks);
109
+ return meetingLinks;
110
+ }
111
+ });
112
+ }
113
+ function validateSpaceMeeting(spaceId, meetingId) {
114
+ return __awaiter(this, void 0, void 0, function* () {
115
+ try {
116
+ const response = yield atwin._api.get(`/v1/meetings?space_id=${spaceId}&meeting_id=${meetingId}`);
117
+ console.log('=== VALIDATE RESPONSE ===', response.data);
118
+ if (response.data.status === "success") {
119
+ return true;
120
+ }
121
+ else {
122
+ console.error('Error: Space ID and Meeting ID do not exist or match.');
123
+ return false;
124
+ }
125
+ }
126
+ catch (error) {
127
+ console.error(error);
128
+ return false;
129
+ }
130
+ });
131
+ }
132
+ function getMeeting(meetingId) {
133
+ return __awaiter(this, void 0, void 0, function* () {
134
+ try {
135
+ const response = yield atwin._api.get(`/v1/meetings?meeting_id=${meetingId}`);
136
+ if (response.status === 200) {
137
+ return response;
138
+ }
139
+ else {
140
+ throw new Error('Request failed with status code ' + response.status);
141
+ }
142
+ }
143
+ catch (error) {
144
+ console.error(error);
145
+ }
146
+ });
147
+ }
148
+ function getSpaceMeetings(spaceId) {
149
+ return __awaiter(this, void 0, void 0, function* () {
150
+ try {
151
+ const response = yield atwin._api.get(`/v1/meetings?space_id=${spaceId}`);
152
+ console.log('getSpaceMeetings response', response);
153
+ if (response.status === 200) {
154
+ return response;
155
+ }
156
+ else {
157
+ throw new Error('Request failed with status code ' + response.status);
158
+ }
159
+ }
160
+ catch (error) {
161
+ console.error(error);
162
+ }
163
+ });
164
+ }
165
+ function startMeeting(meetingApiKey) {
166
+ var _a, _b;
167
+ return __awaiter(this, void 0, void 0, function* () {
168
+ while (!((_b = (_a = atwinObj === null || atwinObj === void 0 ? void 0 : atwinObj.App) === null || _a === void 0 ? void 0 : _a.Phase) === null || _b === void 0 ? void 0 : _b.PLAYING)) {
169
+ console.log('== Wait for _atwin ==');
170
+ yield new Promise(resolve => setTimeout(resolve, 1000));
171
+ atwinObj = atwin._atwin;
172
+ }
173
+ if (currentURL.includes("meetingId")) {
174
+ let meetingIdParam = baseURL.searchParams.get('meetingId');
175
+ let userRole = baseURL.searchParams.get('role');
176
+ if (atwin._spaceId != '' && atwin._space != null) {
177
+ let shouldAtwinMeetingStart = yield preStartChecking(atwin._spaceId, meetingIdParam);
178
+ if (shouldAtwinMeetingStart == true) {
179
+ startMeetingSdk(meetingApiKey, meetingIdParam, userRole);
180
+ }
181
+ }
182
+ else {
183
+ startMeetingSdk(meetingApiKey, meetingIdParam, userRole);
184
+ }
185
+ }
186
+ else {
187
+ console.log('=== Meeting ID is required ===');
188
+ return;
189
+ }
190
+ });
191
+ }
192
+ function startMeetingSdk(meetingApiKey, meetingIdParam, userRole) {
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ yield atwinObj.App.state.waitUntil(state => state.phase === atwinObj.App.Phase.PLAYING);
195
+ console.log(`=== Initialize meeting in: Space ID ${atwin._spaceId}, Meeting ID ${meetingIdParam} ===`);
196
+ supervizSdk = yield SuperVizSdk.init(meetingApiKey, {
197
+ group: {
198
+ id: "<GROUP-ID>",
199
+ name: "<GROUP-NAME>"
200
+ },
201
+ participant: {
202
+ id: Date.now().toPrecision(20),
203
+ type: userRole,
204
+ },
205
+ roomId: meetingIdParam,
206
+ defaultAvatars: true,
207
+ enableFollow: true,
208
+ enableGoTo: true,
209
+ enableGather: true,
210
+ debug: true,
211
+ camerasOrientation: 'horizontal',
212
+ camerasPosition: 'left',
213
+ layoutPosition: 'center',
214
+ });
215
+ isMeetingInitialized = true;
216
+ const plugin = new MatterportPlugin(atwinObj);
217
+ atwin.setViewMode('DOLLHOUSE');
218
+ supervizSdk.subscribe(MeetingEvent.MY_PARTICIPANT_JOINED, () => {
219
+ //@ts-ignore
220
+ pluginInstance = supervizSdk.loadPlugin(plugin, {
221
+ avatarConfig: {
222
+ height: 0,
223
+ scale: 1,
224
+ laserOrigin: { x: 0, y: 0, z: 0 },
225
+ },
226
+ isAvatarsEnabled: true,
227
+ isLaserEnabled: true,
228
+ isNameEnabled: true,
229
+ });
230
+ console.log('== PLUGIN LOADED ==');
231
+ atwin.setViewMode('INSIDE');
232
+ });
233
+ supervizSdk.subscribe(MeetingEvent.MEETING_PARTICIPANT_LIST_UPDATE, (participants) => {
234
+ console.log('===MEETING_PARTICIPANT_LIST_UPDATE', participants);
235
+ _participants = participants;
236
+ });
237
+ });
238
+ }
239
+ // return list of participants and add color prop from getParticipantsOn3D()
240
+ function getMeetingParticipants() {
241
+ console.log('===superviz: getParticipants()');
242
+ if (_participants.length === 0)
243
+ return;
244
+ const participantsOn3d = pluginInstance.getParticipantsOn3D();
245
+ for (let p3d of participantsOn3d) {
246
+ const p = _participants.find(i => i.id === p3d.id);
247
+ if (!p) {
248
+ console.error('Participant not found on _participants array from _participantsOn3d', p3d);
249
+ continue;
250
+ }
251
+ p3d.color = p.color;
252
+ }
253
+ console.log('===_participantsOn3d', participantsOn3d);
254
+ return participantsOn3d;
255
+ }
256
+ function stopMeeting() {
257
+ return __awaiter(this, void 0, void 0, function* () {
258
+ supervizSdk.destroy();
259
+ });
260
+ }
261
+ //To be added:
262
+ function isMeetingExists(meetingId) {
263
+ return __awaiter(this, void 0, void 0, function* () {
264
+ let response = yield getMeeting(meetingId);
265
+ if (response.data.status == "success") {
266
+ return true;
267
+ }
268
+ else {
269
+ return false;
270
+ }
271
+ });
272
+ }
273
+ function isMeetingActive(meetingId) {
274
+ return __awaiter(this, void 0, void 0, function* () {
275
+ try {
276
+ const response = yield getMeeting(meetingId);
277
+ return response.data.status === "success" && (response.data.data.meeting_status === 0 || response.data.data.meeting_status === 1);
278
+ }
279
+ catch (error) {
280
+ console.error("== Error: ===", error);
281
+ return false;
282
+ }
283
+ });
284
+ }
285
+ function getMeetingStatus(meetingId) {
286
+ return __awaiter(this, void 0, void 0, function* () {
287
+ try {
288
+ const response = yield getMeeting(meetingId);
289
+ if (response.data.status === "success") {
290
+ const meetingStatus = response.data.data.meeting_status;
291
+ if (meetingStatus === 0 || meetingStatus === 1 || meetingStatus === 2 || meetingStatus === 3) {
292
+ return meetingStatus;
293
+ }
294
+ else {
295
+ console.error("=== Invalid meeting status: ===", meetingStatus);
296
+ return;
297
+ }
298
+ }
299
+ else {
300
+ console.error("=== Error ===", response);
301
+ return;
302
+ }
303
+ }
304
+ catch (error) {
305
+ console.error("=== Catch Error ===", error);
306
+ return;
307
+ }
308
+ });
309
+ }
310
+ function preStartChecking(spaceId, meetingId) {
311
+ return __awaiter(this, void 0, void 0, function* () {
312
+ let validMeeting = yield validateSpaceMeeting(spaceId, meetingId);
313
+ if (validMeeting) {
314
+ return true;
315
+ }
316
+ else {
317
+ return false;
318
+ }
319
+ // let meetingStatus = await getMeetingStatus(meetingId);
320
+ // let meetingData = await getMeeting(meetingId);
321
+ // if (validMeeting) {
322
+ // if (meetingStatus === 0) {
323
+ // const formatMeetingDateTime = new Date(meetingData.data.data.meeting_start);
324
+ // const dateTimeNow = new Date(Date.now());
325
+ // if (dateTimeNow > formatMeetingDateTime) {
326
+ // return true;
327
+ // }
328
+ // } else if (meetingStatus === 1) {
329
+ // return true;
330
+ // } else if (meetingStatus === 2 || 3){
331
+ // return false
332
+ // }
333
+ // }
334
+ // return false;
335
+ });
336
+ }
337
+ export { isMeetingInitialized, getMeetingParticipants, createMeeting, startMeeting, stopMeeting, generateMeetingURL, getMeeting, getSpaceMeetings, isMeetingExists, isMeetingActive, };
@@ -0,0 +1,95 @@
1
+ export var MeetingEvent;
2
+ (function (MeetingEvent) {
3
+ MeetingEvent["MEETING_START"] = "meeting.start";
4
+ MeetingEvent["MEETING_LEAVE"] = "meeting.leave";
5
+ MeetingEvent["MEETING_PARTICIPANT_AMOUNT_UPDATE"] = "meeting.amount-of-participants-update";
6
+ MeetingEvent["MEETING_PARTICIPANT_LIST_UPDATE"] = "meeting.participant-list-update";
7
+ MeetingEvent["MEETING_PARTICIPANT_JOINED"] = "meeting.participant-joined";
8
+ MeetingEvent["MEETING_PARTICIPANT_LEFT"] = "meeting.participant-left";
9
+ MeetingEvent["MEETING_JOIN"] = "meeting.join";
10
+ MeetingEvent["MEETING_PARTICIPANT_PROPERTIES"] = "meeting.participant-properties";
11
+ MeetingEvent["MEETING_HOST_CHANGE"] = "meeting.host-change";
12
+ MeetingEvent["MEETING_GRID_MODE_CHANGE"] = "meeting.grid-mode-change";
13
+ MeetingEvent["MEETING_SAME_PARTICIPANT_ERROR"] = "meeting.same-participant-error";
14
+ MeetingEvent["MEETING_DEVICES_CHANGE"] = "meeting.devices-change";
15
+ MeetingEvent["MEETING_KICK_PARTICIPANTS"] = "meeting.kick-all-participants";
16
+ MeetingEvent["MEETING_STATE_UPDATE"] = "meeting.state-update";
17
+ MeetingEvent["MEETING_CONNECTION_STATUS_CHANGE"] = "meeting.connection-status-change";
18
+ MeetingEvent["MEETING_AVATAR_LIST_UPDATE"] = "meeting.avatar-list-update";
19
+ MeetingEvent["MY_PARTICIPANT_UPDATED"] = "my-participant.update";
20
+ MeetingEvent["MY_PARTICIPANT_LEFT"] = "my-participant.left";
21
+ MeetingEvent["MY_PARTICIPANT_JOINED"] = "my-participant.joined";
22
+ MeetingEvent["HEARTBEAT"] = "heartbeat";
23
+ MeetingEvent["DESTROY"] = "destroy";
24
+ })(MeetingEvent || (MeetingEvent = {}));
25
+ export var FrameEvent;
26
+ (function (FrameEvent) {
27
+ FrameEvent["FRAME_CONFIG"] = "frame.config";
28
+ FrameEvent["FRAME_LOAD"] = "frame.load";
29
+ FrameEvent["FRAME_SIZE_UPDATE"] = "frame.size-update";
30
+ FrameEvent["FRAME_DIMENSIONS_UPDATE"] = "frame.dimensions-update";
31
+ FrameEvent["FRAME_PARENT_SIZE_UPDATE"] = "frame.parent-window-size-update";
32
+ FrameEvent["FRAME_LOCALE_UPDATE"] = "frame.locales-update";
33
+ FrameEvent["FRAME_AVATAR_LIST_UPDATE"] = "frame.avatar-list-update";
34
+ })(FrameEvent || (FrameEvent = {}));
35
+ export var RealtimeEvent;
36
+ (function (RealtimeEvent) {
37
+ RealtimeEvent["REALTIME_JOIN"] = "realtime.join";
38
+ RealtimeEvent["REALTIME_PARTICIPANT_LIST_UPDATE"] = "realtime.participant-list-update";
39
+ RealtimeEvent["REALTIME_HOST_CHANGE"] = "realtime.host-change";
40
+ RealtimeEvent["REALTIME_GRID_MODE_CHANGE"] = "realtime.grid-mode-change";
41
+ RealtimeEvent["REALTIME_WAIT_FOR_HOST"] = "realtime.wait-for-host";
42
+ RealtimeEvent["REALTIME_AUTHENTICATION_FAILED"] = "realtime.authentication-failed";
43
+ RealtimeEvent["REALTIME_GO_TO_PARTICIPANT"] = "realtime.go-to-participant";
44
+ RealtimeEvent["REALTIME_GATHER"] = "realtime.gather";
45
+ RealtimeEvent["REALTIME_FOLLOW_PARTICIPANT"] = "realtime.follow-participant";
46
+ RealtimeEvent["REALTIME_SET_AVATAR"] = "realtime.set-avatar";
47
+ })(RealtimeEvent || (RealtimeEvent = {}));
48
+ export var MeetingControlsEvent;
49
+ (function (MeetingControlsEvent) {
50
+ MeetingControlsEvent["TOGGLE_MEETING_CHAT"] = "meeting-controls.toggle-chat";
51
+ MeetingControlsEvent["TOGGLE_MEETING_SETUP"] = "meeting-controls.toggle-setup";
52
+ MeetingControlsEvent["TOGGLE_MICROPHONE"] = "meeting-controls.toggle-microphone";
53
+ MeetingControlsEvent["TOGGLE_CAM"] = "meeting-controls.toggle-cam";
54
+ MeetingControlsEvent["TOGGLE_SCREENSHARE"] = "meeting-controls.toggle-screenshare";
55
+ MeetingControlsEvent["HANG_UP"] = "hang-up";
56
+ })(MeetingControlsEvent || (MeetingControlsEvent = {}));
57
+ export var MeetingState;
58
+ (function (MeetingState) {
59
+ MeetingState[MeetingState["MEETING_FAILED"] = -1] = "MEETING_FAILED";
60
+ MeetingState[MeetingState["MEETING_DISCONNECTED"] = 0] = "MEETING_DISCONNECTED";
61
+ MeetingState[MeetingState["MEETING_INITIALIZING"] = 1] = "MEETING_INITIALIZING";
62
+ MeetingState[MeetingState["MEETING_READY_TO_JOIN"] = 2] = "MEETING_READY_TO_JOIN";
63
+ MeetingState[MeetingState["MEETING_CONNECTING"] = 3] = "MEETING_CONNECTING";
64
+ MeetingState[MeetingState["MEETING_CONNECTED"] = 4] = "MEETING_CONNECTED";
65
+ MeetingState[MeetingState["MEETING_RECONNECT"] = 5] = "MEETING_RECONNECT";
66
+ MeetingState[MeetingState["FRAME_INITIALIZING"] = 6] = "FRAME_INITIALIZING";
67
+ MeetingState[MeetingState["FRAME_INITIALIZED"] = 7] = "FRAME_INITIALIZED";
68
+ MeetingState[MeetingState["FRAME_UNINITIALIZED"] = 8] = "FRAME_UNINITIALIZED";
69
+ })(MeetingState || (MeetingState = {}));
70
+ export var MeetingConnectionStatus;
71
+ (function (MeetingConnectionStatus) {
72
+ MeetingConnectionStatus[MeetingConnectionStatus["NOT_AVAILABLE"] = 0] = "NOT_AVAILABLE";
73
+ MeetingConnectionStatus[MeetingConnectionStatus["GOOD"] = 1] = "GOOD";
74
+ MeetingConnectionStatus[MeetingConnectionStatus["BAD"] = 2] = "BAD";
75
+ MeetingConnectionStatus[MeetingConnectionStatus["POOR"] = 3] = "POOR";
76
+ MeetingConnectionStatus[MeetingConnectionStatus["DISCONNECTED"] = 4] = "DISCONNECTED";
77
+ MeetingConnectionStatus[MeetingConnectionStatus["RECONNECTING"] = 5] = "RECONNECTING";
78
+ MeetingConnectionStatus[MeetingConnectionStatus["LOST_CONNECTION"] = 6] = "LOST_CONNECTION";
79
+ })(MeetingConnectionStatus || (MeetingConnectionStatus = {}));
80
+ export var DeviceEvent;
81
+ (function (DeviceEvent) {
82
+ DeviceEvent["NO_CAM"] = "devices.no-cam";
83
+ DeviceEvent["NO_DEVICES"] = "devices.no-devices";
84
+ DeviceEvent["DEVICES_BLOCKED"] = "devices.blocked";
85
+ DeviceEvent["DEVICES_CAM_BLOCKED"] = "devices.cam-blocked";
86
+ DeviceEvent["DEVICES_INITIALIZATION_ERROR"] = "devices.inititalization-error";
87
+ DeviceEvent["DEVICES_UNKNOWN_ERROR"] = "devices.unknown-error";
88
+ })(DeviceEvent || (DeviceEvent = {}));
89
+ export var IParticipantType;
90
+ (function (IParticipantType) {
91
+ IParticipantType["HOST"] = "host";
92
+ IParticipantType["GUEST"] = "guest";
93
+ IParticipantType["AUDIENCE"] = "audience";
94
+ })(IParticipantType || (IParticipantType = {}));
95
+ ;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "architwin",
3
- "version": "1.0.39",
3
+ "version": "1.0.41",
4
4
  "description": "ArchiTwin Library for Matterport",
5
5
  "main": "./lib/architwin.min.js",
6
6
  "types": "./lib/architwin.d.ts",
@@ -17,12 +17,11 @@
17
17
  "default": "./lib/architwin.min.js"
18
18
  }
19
19
  },
20
- "./lib/types": "./lib/types.d.ts",
21
- "./lib/common": "./lib/common/architwin.min.js"
20
+ "./lib/types": "./lib/types.d.ts"
22
21
  },
23
22
  "scripts": {
24
23
  "test": "echo \"Error: no test specified\" && exit 1",
25
- "build": "tsc && terser lib/architwin.js -o lib/architwin.min.js && webpack"
24
+ "build": "tsc && terser lib/architwin.js -o lib/architwin.min.js"
26
25
  },
27
26
  "author": "",
28
27
  "license": "ISC",
@@ -33,7 +32,6 @@
33
32
  "axios": "^1.4.0",
34
33
  "jszip": "^3.10.1",
35
34
  "jszip-utils": "^0.1.0",
36
- "mathjs": "^11.8.0",
37
35
  "short-unique-id": "^4.4.4",
38
36
  "ts-loader": "^9.4.3"
39
37
  },
@@ -45,6 +43,7 @@
45
43
  "css-loader": "^6.8.1",
46
44
  "javascript-obfuscator": "^4.0.2",
47
45
  "terser-webpack-plugin": "^5.3.9",
46
+ "ts-node": "^10.9.1",
48
47
  "typescript": "5.0.4",
49
48
  "webpack": "^5.85.1",
50
49
  "webpack-cli": "^5.1.3"
package/tsconfig.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "target": "ES2015",
4
- "module": "ESNext",
4
+ "module": "ES6",
5
5
  "moduleResolution": "node",
6
6
  "esModuleInterop": true,
7
7
  "declaration": true,
8
8
  "outDir": "./lib",
9
- "strict": false
9
+ "strict": false,
10
+ "allowSyntheticDefaultImports": true
10
11
  },
11
12
  "include": ["../architwin/src"],
12
13
  "exclude": ["node_modules", "**/__tests__/*"],