public void PrevisModelLoaded(PrevisTag tag) { previsTag = tag; CurrentModelEditMode = ModelEditType.Move; if (previsTag.type == "mesh") { UpdateText("mesh loaded, mode: move"); } else if (previsTag.type == "point") { UpdateText("pointcloud loaded, mode: move"); } }
// === POINT CLOUD === IEnumerator fetchPrevisPointCloud(PrevisTag prevTag) { string previsTag = prevTag.tag; previsGroup = new GameObject(); previsGroup.name = prevTag.tag; previsGroup.tag = "PrevisCurrentModel"; previsGroup.transform.parent = this.transform; string cloudPath = localDataFolder + "/potree/"; cloudPath = cloudPath.Replace("\\", "/"); PrevisPotreeHelper potreeHelper = GetComponent <PrevisPotreeHelper>(); yield return(StartCoroutine(potreeHelper.LoadPointCloud(cloudPath, previsGroup, 3, 6))); AllObjectsLoaded(prevTag, 1.5f);; }
void AllObjectsLoaded(PrevisTag prevTag, float defaultScale = 0.5f) { Debug.Log("Finished loading"); if (previsGroup) { //reset scale GetComponent <UNetSharedHologram>().ResetScale(); // enable renderer and collider new MyUnityHelpers().EnableGameObject(previsGroup, true); // place object Vector3 center = GetGameObjectBound(previsGroup).center; Vector3 extends = GetGameObjectBound(previsGroup).extents; Debug.Log("center: " + center.ToString() + " extend: " + extends.ToString()); float maxExtend = Mathf.Max(extends.x, extends.y, extends.z); float scale = defaultScale / maxExtend; UpdateObjectTransform(previsGroup, Vector3.zero, new Vector3(scale, scale, scale)); previsGroup.transform.localPosition = scale * (-1 * center); if (PlayerController.Instance != null) { PlayerController.Instance.UpdateMovementOffset(new Vector3(0, scale * extends.y, 0)); } if (directionalIndicatorPrefab != null) { GameObject indicator = Instantiate(directionalIndicatorPrefab, Vector3.zero, Quaternion.identity); indicator.GetComponent <DirectionIndicator>().Cursor = GameObject.Find("Cursor"); indicator.transform.parent = this.transform; indicator.transform.localPosition = Vector3.zero; indicator.GetComponent <DirectionIndicator>().enabled = true; } //model loaded if (MyUIManager.Instance) { MyUIManager.Instance.PrevisModelLoaded(prevTag); } } }
public void PrevisModelUnloaded(string err) { if (err != "") { UpdateText(err); previsTag = null; return; } if (previsTag != null) { if (previsTag.type == "mesh") { UpdateText("mesh unloaded"); } else if (previsTag.type == "point") { UpdateText("pointcloud unloaded"); } previsTag = null; } }
IEnumerator fetchPrevisMesh(PrevisTag prevTag, string meshParams) { List <string> objectNames = new List <string>(); List <string> OBJNames = new List <string>(); // previs object holder previsGroup = new GameObject(); previsGroup.name = prevTag.tag; previsGroup.tag = "PrevisCurrentModel"; previsGroup.transform.parent = this.transform; PrevisSceneParams meshParamsJson = JsonUtility.FromJson <PrevisSceneParams>(meshParams); if (meshParamsJson != null) { for (int pmpIndex = 0; pmpIndex < meshParamsJson.objects.Length; pmpIndex++) //for (int pmpIndex = 0; pmpIndex < 2; pmpIndex++) { PrevisMeshParamsNew pmp = meshParamsJson.objects[pmpIndex]; //Debug.Log(pmp); GameObject groupParentNode = new GameObject(); groupParentNode.name = pmp.name; groupParentNode.transform.parent = previsGroup.transform; if (prevTag.tag == "4194b4") // TODO: only enable highlight for heart model. Need a better way to enable/disable this { groupParentNode.AddComponent <Interactible>(); } AddMeshProperties(pmp.name, new Color(pmp.colour[0] / 255.0f, pmp.colour[1] / 255.0f, pmp.colour[2] / 255.0f), Vector3.zero, pmp.name); for (int pmgIndex = 0; pmgIndex < pmp.objects.Length; pmgIndex++) { PrevisMeshGroupNew pmg = pmp.objects[pmgIndex]; // string targetPath = Application.dataPath + "/../" + folderName + "/" + OBJName; string targetPath = localDataFolder + "/" + pmp.name + "/" + pmg.obj; targetPath = targetPath.Replace("\\", "/"); if (!File.Exists(targetPath)) { Debug.Log(targetPath + " is not exist!"); continue; } // FIXME: this may be overkill, but need to skip sending any non-OBJ files to the OBJ loader if (Path.GetExtension(targetPath).ToUpper() != ".OBJ") { continue; } GameObject meshModel = new OBJLoader().Load(targetPath); meshModel.transform.parent = groupParentNode.transform; meshModel.name = pmg.obj; meshModel.transform.localPosition = Vector3.zero; ObjLoaded(pmp.name, meshModel); yield return(null); } } if (prevTag.tag == "4194b4") // heart { AllObjectsLoaded(prevTag); } else { AllObjectsLoaded(prevTag, 1.0f); } } yield return(null); }
private IEnumerator LoadPrevisData() { Debug.Log("LoadPrevisData"); if (previsTag == "") { Debug.Log("empty previsTag!"); yield break; } // 1. get json data from web // DEBUG: load json file from storage var jsonFileName = Path.Combine(Application.streamingAssetsPath, previsTag); jsonFileName = Path.Combine(jsonFileName, "info.json"); Debug.Log("info json : " + jsonFileName); if (MyUIManager.Instance) { MyUIManager.Instance.UpdateText("LOADING INFO..."); } bool localCacheAvailable = File.Exists(jsonFileName); // check if data available in StreamingAssets folder string jsonText = ""; if (localCacheAvailable) { jsonText = GetTextFileContent(jsonFileName); } else // need to get from web { string tagURL = previsURL + "rest/info?tag=" + previsTag; Debug.Log("download json text from " + tagURL); yield return(StartCoroutine(downloadTextFromURL(tagURL, (value) => { jsonText = value; Debug.Log(jsonText); }))); } if (jsonText == "") { Debug.Log("Failed to load info"); if (PlayerController.Instance) { PlayerController.Instance.UnloadModel("ERROR: FAILED TO LOAD INFO..."); } yield break; } // 2. parse json data for the tag PrevisTag prevTag = JsonUtility.FromJson <PrevisTag>(jsonText); Debug.Log("Tag: " + prevTag.tag); Debug.Log("Type: " + prevTag.type); // 3. create directory to store uncompressed data localDataFolder = Application.persistentDataPath + "/" + previsTag; Debug.Log("local data folder: " + localDataFolder); Directory.CreateDirectory(localDataFolder); // 4. download processed data to localDataFolder if (localCacheAvailable == false) { if (MyUIManager.Instance) { MyUIManager.Instance.UpdateText("DOWNLOADING..."); } if (prevTag.type == "mesh") { Debug.Log("Load mesh_processed.zip file from previs server"); string meshURL = previsURL + "data/tags/" + previsTag + "/mesh_processed.zip"; string zipFileName = localDataFolder + "/mesh_processed.zip"; yield return(StartCoroutine(downloadFileFromURL(meshURL, zipFileName))); } else if (prevTag.type == "point") { Debug.Log("Load point_processed.zip file from previs server"); string pointURL = previsURL + "data/tags/" + previsTag + "/point_processed.zip"; string zipFileName = localDataFolder + "/point_processed.zip"; yield return(StartCoroutine(downloadFileFromURL(pointURL, zipFileName))); } else if (prevTag.type == "volume") { // TODO Debug.Log("Volume - Under development"); if (PlayerController.Instance) { PlayerController.Instance.UnloadModel("ERROR: VOLUME IS NOT SUPPORTED"); } yield break; } else { Debug.Log("Invalid data type"); if (PlayerController.Instance) { PlayerController.Instance.UnloadModel("ERROR: INVALID TYPE"); } yield break; } } // 5. uncompress and load models // launch the mesh loader function as a coroutine so that the program will be semi-interactive while loading meshes :) // StartCoroutine(loadMeshes()); if (prevTag.type == "mesh") { string meshParamsFile = localDataFolder + "/mesh.json"; meshParamsFile = meshParamsFile.Replace("\\", "/"); bool fileAvailable = File.Exists(meshParamsFile); if (fileAvailable == false) { Debug.Log("Unzip mesh data..."); string zipFileName; if (localCacheAvailable == true) { zipFileName = Application.streamingAssetsPath + "/" + previsTag + "/mesh_processed.zip"; } else { zipFileName = localDataFolder + "/mesh_processed.zip"; } zipFileName = zipFileName.Replace("\\", "/"); if (MyUIManager.Instance) { MyUIManager.Instance.UpdateText("EXTRACTING..."); } new MyUnityHelpers().ExtractZipFile(zipFileName, localDataFolder); } Debug.Log("Loading a mesh..."); string meshParams = ""; if (localCacheAvailable == true) { string paramFile = Application.streamingAssetsPath + "/" + previsTag + "/mesh.json"; paramFile = paramFile.Replace("\\", "/"); Debug.Log("Get mesh params " + paramFile); meshParams = GetTextFileContent(paramFile); } else { string paramURL = previsURL + "data/tags/" + previsTag + "/mesh_result/mesh.json"; yield return(StartCoroutine(downloadTextFromURL(paramURL, (value) => { meshParams = value; }))); } //Debug.Log(meshParams); if (MyUIManager.Instance) { MyUIManager.Instance.UpdateText("LOADING..."); } StartCoroutine(fetchPrevisMesh(prevTag, meshParams)); } else if (prevTag.type == "point") { string pointCloudFile = localDataFolder + "/potree/cloud.js"; pointCloudFile = pointCloudFile.Replace("\\", "/"); bool fileAvailable = File.Exists(pointCloudFile); if (fileAvailable == false) { string zipFileName; if (localCacheAvailable == true) { zipFileName = Application.streamingAssetsPath + "/" + previsTag + "/point_processed.zip"; } else { zipFileName = localDataFolder + "/point_processed.zip"; } zipFileName = zipFileName.Replace("\\", "/"); Debug.Log("Unzip point data..."); if (MyUIManager.Instance) { MyUIManager.Instance.UpdateText("EXTRACTING..."); } new MyUnityHelpers().ExtractZipFile(zipFileName, localDataFolder); } Debug.Log("Loading a point..."); if (MyUIManager.Instance) { MyUIManager.Instance.UpdateText("LOADING..."); } StartCoroutine(fetchPrevisPointCloud(prevTag)); } else if (prevTag.type == "volume") { // TODO Debug.Log("Volume - Under development"); if (PlayerController.Instance) { PlayerController.Instance.UnloadModel("ERROR: VOLUME IS NOT SUPPORTED"); } yield break; } else { Debug.Log("Invalid data type"); if (PlayerController.Instance) { PlayerController.Instance.UnloadModel("ERROR: INVALID TYPE"); } yield break; } yield return(null); }