private static HashSet <CommonEdge> GetEdgesDistinct(PolyMesh m, Dictionary <int, int> lookup, out List <CommonEdge> duplicates) { int[] tris = m.GetTriangles(); int count = tris.Length; HashSet <CommonEdge> edges = new HashSet <CommonEdge>(); duplicates = new List <CommonEdge>(); for (int i = 0; i < count; i += 3) { CommonEdge a = new CommonEdge(tris[i + 0], tris[i + 1], lookup[tris[i + 0]], lookup[tris[i + 1]]); CommonEdge b = new CommonEdge(tris[i + 1], tris[i + 2], lookup[tris[i + 1]], lookup[tris[i + 2]]); CommonEdge c = new CommonEdge(tris[i + 2], tris[i + 0], lookup[tris[i + 2]], lookup[tris[i + 0]]); if (!edges.Add(a)) { duplicates.Add(a); } if (!edges.Add(b)) { duplicates.Add(b); } if (!edges.Add(c)) { duplicates.Add(c); } } return(edges); }
/// <summary> /// Returns all vertex indices that are on an open edge. /// </summary> /// <param name="mesh"></param> /// <returns></returns> internal static HashSet <int> GetNonManifoldIndices(PolyMesh mesh) { if (mesh == null) { return(null); } List <CommonEdge> duplicates; HashSet <CommonEdge> edges = GetEdgesDistinct(mesh, out duplicates); edges.ExceptWith(duplicates); HashSet <int> hash = CommonEdge.ToHashSet(edges); return(hash); }