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(); }
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; }