コード例 #1
0
    /// <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);
    }
コード例 #2
0
    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));
    }
コード例 #3
0
    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
    }
コード例 #4
0
 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);
     }
 }
コード例 #5
0
    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
    }
コード例 #6
0
 public MeshSerializable(Mesh mesh) : base(mesh)
 {
     data = MeshSerializer.SerializeMesh(mesh);
 }