Пример #1
0
 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");
     }
 }
Пример #2
0
    // === 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);;
    }
Пример #3
0
    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);
            }
        }
    }
Пример #4
0
    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;
        }
    }
Пример #5
0
    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);
    }
Пример #6
0
    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);
    }