/// <summary> /// Constructor to build a custom mesh from Rhino's mesh type /// </summary> /// <param name="source">the Rhino mesh</param> public Mesh(Rhino.Geometry.Mesh source) : this() { // Check that the mesh is oriented and manifold bool isOriented, hasBoundary; var isManifold = source.IsManifold(true, out isOriented, out hasBoundary); if (!isManifold || !isOriented) { return; } // Remove unused vertices source.Vertices.CullUnused(); //var faces = Enumerable.Range(0, source.Faces.Count).Select(i => source.TopologyVertices.IndicesFromFace(i)); //InitIndexed(source.TopologyVertices, faces); // Add vertices Vertices.Capacity = source.TopologyVertices.Count; foreach (Point3f p in source.TopologyVertices) { Vertices.Add(new Vertex(p)); } // Add faces (and construct halfedges and store in hash table) for (int i = 0; i < source.Faces.Count; i++) { var vertices = source.TopologyVertices.IndicesFromFace(i).Select(v => Vertices[v]); Faces.Add(vertices); } // Find and link halfedge pairs Halfedges.MatchPairs(); }