Example #1
0
        private IEnumerator Restore_Relocalize(string pcfCFUID)
        {
            MagicLeapNativeBindings.MLCoordinateFrameUID cfuid = SerializationUtilities.StringToCFUID(pcfCFUID);

            while (true)
            {
                MLPersistentCoordinateFrames.FindPCFByCFUID(cfuid, out pcfAnchor);

                if (pcfAnchor == null)
                {
                    //we didn't find the pcf we needed this time:
                    _restoreAttempt++;
                    if (_restoreAttempt < _maxRestoreAttempts)
                    {
                        //retry:
                        Debug.Log($"Previous PCF not located.  Trying again.  Attempt: {_restoreAttempt}/{_maxRestoreAttempts}");
                        yield return(new WaitForSeconds(_restoreRetryDelay));
                    }
                    else
                    {
                        //failed:
                        Debug.Log($"Failed to locate PCF attempt: {_restoreAttempt}/{_maxRestoreAttempts}.  Creating new Playspace.");
                        ChangeState(State.FindPCF);
                        yield break;
                    }
                    yield return(null);
                }
                else
                {
                    //deserialize meshes:
                    string[]  meshData     = PlayerPrefs.GetString(_sessionMeshKey).Split('|');
                    Vector3[] wallVerts    = SerializationUtilities.Deserialize <Vector3[]>(meshData[0]);
                    int[]     wallTris     = SerializationUtilities.Deserialize <int[]>(meshData[1]);
                    Vector3[] floorVerts   = SerializationUtilities.Deserialize <Vector3[]>(meshData[2]);
                    int[]     floorTris    = SerializationUtilities.Deserialize <int[]>(meshData[3]);
                    Vector3[] ceilingVerts = SerializationUtilities.Deserialize <Vector3[]>(meshData[4]);

                    BuildGeometry(wallVerts, wallTris, floorVerts, floorTris, ceilingVerts);

                    ChangeState(State.ConfirmAreaReload);
                    yield break;
                }
            }
        }
        private IEnumerator LocalizeToSharedPCF()
        {
            _cfuid = SerializationUtilities.StringToCFUID(Transmission.GetGlobalString(_sharedPCFKey));

            //find shared pcf:
            while (_sharedPCF == null)
            {
                //locate:
                MLPersistentCoordinateFrames.FindPCFByCFUID(_cfuid, out _sharedPCF);

                //keep looking:
                yield return(new WaitForSeconds(_pcfSearchTimeout));
            }

            //we have our shared pcf!
            Reorient();
            Localized = true;
            OnLocalized?.Invoke();
        }
Example #3
0
        private void BuildGeometry(Vector3[] wallVerticies, int[] wallTriangles, Vector3[] floorVerticies, int[] floorTriangles, Vector3[] ceilingVerticies)
        {
            //setup geometry:
            WallGeometry    = new GameObject("(PlayspaceWalls)", typeof(MeshFilter), typeof(MeshRenderer));
            FloorGeometry   = new GameObject("(PlayspaceFloor)", typeof(MeshFilter), typeof(MeshRenderer));
            CeilingGeometry = new GameObject("(PlayspaceCeiling)", typeof(MeshFilter), typeof(MeshRenderer));

            AnchorToPCF();

            //setup renderers:
            MeshRenderer wallsRenderer = WallGeometry.GetComponent <MeshRenderer>();

            if (wallMaterial != null)
            {
                wallsRenderer.material = wallMaterial;
            }
            else
            {
                wallsRenderer.enabled = false;
            }

            MeshRenderer floorRenderer = FloorGeometry.GetComponent <MeshRenderer>();

            if (floorMaterial != null)
            {
                floorRenderer.material = floorMaterial;
            }
            else
            {
                floorRenderer.enabled = false;
            }

            MeshRenderer ceilingRenderer = CeilingGeometry.GetComponent <MeshRenderer>();

            if (ceilingMaterial != null)
            {
                ceilingRenderer.material = ceilingMaterial;
            }
            else
            {
                ceilingRenderer.enabled = false;
            }

            //apply mesh:
            Mesh wallMesh = new Mesh();

            wallMesh.vertices  = wallVerticies;
            wallMesh.triangles = wallTriangles;
            WallGeometry.GetComponent <MeshFilter>().mesh = wallMesh;

            Mesh floorMesh = new Mesh();

            floorMesh.vertices  = floorVerticies;
            floorMesh.triangles = floorTriangles;
            FloorGeometry.GetComponent <MeshFilter>().mesh = floorMesh;

            Mesh ceilingMesh = new Mesh();

            ceilingMesh.vertices  = ceilingVerticies;
            ceilingMesh.triangles = floorTriangles.Reverse().ToArray();
            CeilingGeometry.GetComponent <MeshFilter>().mesh = ceilingMesh;

            //apply colliders:
            WallGeometry.AddComponent <MeshCollider>();
            FloorGeometry.AddComponent <MeshCollider>();
            CeilingGeometry.AddComponent <MeshCollider>();

            //serialize mesh:
            string wallVertsSerialized    = SerializationUtilities.Serialize(wallMesh.vertices);
            string wallTrisSerialized     = SerializationUtilities.Serialize(wallMesh.triangles);
            string floorVertsSerialized   = SerializationUtilities.Serialize(floorMesh.vertices);
            string floorTrisSerialized    = SerializationUtilities.Serialize(floorMesh.triangles);
            string ceilingVertsSerialized = SerializationUtilities.Serialize(ceilingMesh.vertices);

            _serializedMeshes = wallVertsSerialized + "|" + wallTrisSerialized + "|" + floorVertsSerialized + "|" + floorTrisSerialized + "|" + ceilingVertsSerialized;
        }