コード例 #1
0
    public static void GetCombinedMesh(List <BXDAMesh.BXDASubMesh> meshes, HandleMesh handleMesh)
    {
        BXDAMesh.BXDASubMesh combinedMesh = new BXDAMesh.BXDASubMesh();
        combinedMesh.verts    = new double[0];
        combinedMesh.norms    = new double[0];
        combinedMesh.surfaces = new List <BXDAMesh.BXDASurface>();

        foreach (BXDAMesh.BXDASubMesh mesh in meshes)
        {
            double[] oldVertices = combinedMesh.verts;
            double[] newVertices = new double[oldVertices.Length + mesh.verts.Length];
            oldVertices.CopyTo(newVertices, 0);
            mesh.verts.CopyTo(newVertices, oldVertices.Length);

            combinedMesh.verts = newVertices;

            double[] oldNorms = combinedMesh.verts;
            double[] newNorms = new double[oldNorms.Length + mesh.norms.Length];
            oldNorms.CopyTo(newNorms, 0);
            mesh.norms.CopyTo(newNorms, oldNorms.Length);

            combinedMesh.norms = newNorms;

            combinedMesh.surfaces.AddRange(mesh.surfaces);
        }

        List <BXDAMesh.BXDASubMesh> combinedMeshes = new List <BXDAMesh.BXDASubMesh>();

        combinedMeshes.Add(combinedMesh);

        ReadMeshSet(combinedMeshes, delegate(int id, BXDAMesh.BXDASubMesh subMesh, Mesh mesh)
        {
            handleMesh(id, subMesh, mesh);
        });
    }
コード例 #2
0
    public static void ReadMeshSet(List <BXDAMesh.BXDASubMesh> meshes, HandleMesh handleMesh, bool mirror = false)
    {
        for (int j = 0; j < meshes.Count; j++)
        {
            BXDAMesh.BXDASubMesh sub = meshes[j];
            //takes all of the required information from the API (the API information is within "sub" above)
            Vector3[] vertices = sub.verts == null ? null : ArrayUtilities.WrapArray <Vector3>(
                delegate(double x, double y, double z)
            {
                return(new Vector3((float)x * (mirror ? -0.01f : 0.01f), (float)y * 0.01f, (float)z * 0.01f));
            }, sub.verts);
            Vector3[] normals = sub.norms == null ? null : ArrayUtilities.WrapArray <Vector3>(
                delegate(double x, double y, double z)
            {
                return(new Vector3((float)x, (float)y, (float)z));
            }, sub.norms);

            Mesh unityMesh = new Mesh();
            unityMesh.vertices     = vertices;
            unityMesh.normals      = normals;
            unityMesh.uv           = new Vector2[vertices.Length];
            unityMesh.subMeshCount = sub.surfaces.Count;
            for (int i = 0; i < sub.surfaces.Count; i++)
            {
                int[] cpy = new int[sub.surfaces[i].indicies.Length];
                Array.Copy(sub.surfaces[i].indicies, cpy, cpy.Length);
                if (mirror)
                {
                    Array.Reverse(cpy);
                }
                unityMesh.SetTriangles(cpy, i);
            }
            if (normals != null)
            {
                unityMesh.RecalculateNormals();
            }

            handleMesh(j, sub, unityMesh);
        }
    }