Ejemplo n.º 1
0
        public static float CalculateMinTriangleShape(BaseMesh mesh)
        {
            int faceCount = mesh.faceCount();

            Vector3[] tr       = new Vector3[3];
            float     minShape = 10.0f;

            for (int i = 0; i < faceCount; ++i)
            {
                Face f = mesh.faces[i];
                if (f.valid)
                {
                    for (int j = 0; j < 3; ++j)
                    {
                        tr[j] = mesh.vertices[f.v[j]].coords;
                    }
                    float val = KrablMesh.UnityUtils.TriangleCompactnessSqr(tr);
                    if (val < minShape)
                    {
                        minShape = val;
                    }
                }
            }
            return(minShape);
        }
Ejemplo n.º 2
0
        public static void Triangulate(BaseMesh mesh)
        {
            if (mesh.topology == MeshTopology.Triangles)
            {
                return;
            }

            int faceIndex, cornerIndex;

            int numFaces = mesh.faceCount();

            Vector3[] coords = new Vector3[4];
            for (faceIndex = 0; faceIndex < numFaces; ++faceIndex)
            {
                Face f = mesh.faces[faceIndex];
                if (f.valid && f.cornerCount == 4)
                {
                    Face fnew = new Face(3);
                    // copy face parameters
                    fnew.material = f.material;
                    for (cornerIndex = 0; cornerIndex < 4; ++cornerIndex)
                    {
                        coords[cornerIndex] = mesh.vertices[f.v[cornerIndex]].coords;
                    }

                    Vector3 diag02 = coords[0] - coords[2];
                    Vector3 diag13 = coords[1] - coords[3];
                    if (diag02.sqrMagnitude < diag13.sqrMagnitude)
                    {
                        // Create triangles 201 and 023 .. use diag as first edge as a hint
                        fnew.CopyVertexInfoFromFace(f, 0, 0);
                        fnew.CopyVertexInfoFromFace(f, 2, 1);
                        fnew.CopyVertexInfoFromFace(f, 3, 2);
                    }
                    else
                    {
                        // Create triangles 312 and 013 .. use diag as first edge as a hint
                        fnew.CopyVertexInfoFromFace(f, 3, 0);
                        fnew.CopyVertexInfoFromFace(f, 1, 1);
                        fnew.CopyVertexInfoFromFace(f, 2, 2);
                        f.CopyVertexInfoFromFace(f, 3, 2);
                    }
                    mesh.AddFace(fnew);
                    // First face needs to become a triangle
                    f.cornerCount = 3;
                }
            }
            // Rebuild linkedFaces for Verts
            int numVerts = mesh.vertCount();

            for (int vertIndex = 0; vertIndex < numVerts; ++vertIndex)
            {
                mesh.vertices[vertIndex].linkedFaces = new IndexList(18);
            }
            numFaces = mesh.faceCount();

            for (faceIndex = 0; faceIndex < numFaces; ++faceIndex)
            {
                Face f = mesh.faces[faceIndex];
                for (cornerIndex = 0; cornerIndex < f.cornerCount; ++cornerIndex)
                {
                    mesh.vertices[f.v[cornerIndex]].linkedFaces.Add(faceIndex);
                }
            }
            mesh.topology = MeshTopology.Triangles;
        }