/// <summary> /// Combine all peaces of mesh of the root, and return a byte array containing its serialization. Please notice that the root must be an empty gameObject /// </summary> /// <param name="root"></param> /// <returns></returns> public byte[] combineMeshAsByte(GameObject root, GameObject anchor) { GameObject parallelSceneRoot = Instantiate(root); parallelSceneRoot.transform.parent = anchor.transform; //Vector3 realPosition = parallelSceneRoot.transform.localPosition; //Quaternion realRotation = parallelSceneRoot.transform.localRotation; parallelSceneRoot.name = "parallelSceneroot"; parallelSceneRoot.transform.localPosition = Vector3.zero; parallelSceneRoot.transform.localRotation = Quaternion.identity; MeshFilter[] meshFilters = parallelSceneRoot.GetComponentsInChildren <MeshFilter>(); CombineInstance[] combine = new CombineInstance[meshFilters.Length]; Mesh finalMesh = new Mesh(); for (int i = 0; i < meshFilters.Length; i++) { if (meshFilters[i] != null) { combine[i].mesh = meshFilters[i].sharedMesh; //Debug.Log("parent mesh ser name" + meshFilters[i].transform.parent.name); // I have to specify the mesh transform w.r.t. a reference frame (different from the object's mesh), in this case I use the anchor frame since the parallelSceneRoot // is a child of anchor and I m creating the local transform matrix. combine[i].transform = Matrix4x4.TRS(meshFilters[i].transform.localPosition, meshFilters[i].transform.localRotation, meshFilters[i].transform.localScale); meshFilters[i].gameObject.SetActive(false); } } MeshFilter rootMesh = parallelSceneRoot.transform.GetComponent <MeshFilter>(); //Because the scene root has no MeshFilter component but only its childs, so we need to add it if (rootMesh != null) { Debug.Log("reset mesh parallelSceneRoot"); rootMesh.mesh = new Mesh(); } else { Debug.Log("parallelSceneRoot has no Mesh component, I add it"); rootMesh = parallelSceneRoot.AddComponent(typeof(MeshFilter)) as MeshFilter; MeshRenderer rootMeshRender = parallelSceneRoot.AddComponent <MeshRenderer>() as MeshRenderer; rootMeshRender.material = material; } finalMesh.CombineMeshes(combine); byte[] meshByte = MeshSerializer.SerializeMesh(finalMesh); Debug.Log("combine mesh position" + rootMesh.transform.position); DestroyImmediate(parallelSceneRoot); return(meshByte); }
public void SaveLayerAsAsset(Mesh mesh, string folder, string fileName) { if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } //Write the mesh to disk again File.WriteAllBytes(folder + fileName, MeshSerializer.SerializeMesh(mesh)); }
public void SaveLayerAsAsset(Mesh mesh, string name) { if (!Directory.Exists(FolderToExportTo)) { Directory.CreateDirectory(FolderToExportTo); } //Write the mesh to disk again mesh.name = name; File.WriteAllBytes(FolderToExportTo + name + ".mesh", MeshSerializer.SerializeMesh(mesh));// GOAAAL }
public MeshData(SpatialAwarenessMeshObject aMesh) { if (aMesh != null) { data = MeshSerializer.SerializeMesh(aMesh.Filter.sharedMesh); transform = new TransformS(aMesh.Renderer.transform); } else { data = new byte[0]; transform = new TransformS(null); } }
public void SaveMesh() { //string path = Path.Combine(Application.persistentDataPath, url); //combineMesh(SceneRoot); #if WINDOWS_UWP var folder = WindowsStorage.ApplicationData.Current.LocalFolder; string path = folder.Path + "/meshMap.bin"; byte[] bytes = MeshSerializer.SerializeMesh(rootMesh.mesh); File.WriteAllBytes(path, bytes); #else Debug.Log("Load on Device is only supported in Universal Windows Applications"); #endif }
public MeshSerializable(Mesh mesh) : base(mesh) { data = MeshSerializer.SerializeMesh(mesh); }