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