/// <summary> /// /// </summary> /// <typeparam name="M"></typeparam> /// <typeparam name="V"></typeparam> /// <typeparam name="E"></typeparam> /// <typeparam name="F"></typeparam> /// <param name="factory"></param> /// <param name="polylines"></param> /// <param name="setPosition"></param> /// <param name="tolerance"></param> /// <returns></returns> public static M CreateFromPolylines <M, V, E, F>(this HeMeshFactoryBase <M, V, E, F> factory, IEnumerable <Polyline> polylines, Action <V, Vec3d> setPosition, double tolerance = 1.0e-8) where M : HeMeshBase <V, E, F> where V : HeVertex <V, E, F> where E : Halfedge <V, E, F> where F : HeFace <V, E, F> { List <Vec3d> points = new List <Vec3d>(); List <int> sizes = new List <int>(); // get all polyline points foreach (Polyline p in polylines) { int n = p.Count - 1; if (!p.IsClosed || n < 3) { continue; // skip open or invalid loops } // collect all points in the loop for (int i = 0; i < n; i++) { points.Add(p[i].ToVec3d()); } sizes.Add(n); } var vertPos = points.RemoveCoincident(out int[] indexMap, tolerance); return(factory.CreateFromFaceVertexData(vertPos, indexMap.Segment(sizes), setPosition)); }
/// <summary> /// /// </summary> /// <typeparam name="M"></typeparam> /// <typeparam name="V"></typeparam> /// <typeparam name="E"></typeparam> /// <typeparam name="F"></typeparam> /// <param name="factory"></param> /// <param name="polylines"></param> /// <param name="tolerance"></param> /// <returns></returns> public static M CreateFromPolylines <M, V, E, F>(this HeMeshFactoryBase <M, V, E, F> factory, IEnumerable <Polyline> polylines, double tolerance = 1.0e-8) where M : HeMeshBase <V, E, F> where V : HeVertex <V, E, F>, IVertex3d where E : Halfedge <V, E, F> where F : HeFace <V, E, F> { return(factory.CreateFromPolylines(polylines, (v, p) => v.Position = p, tolerance)); }
/// <summary> /// /// </summary> /// <typeparam name="M"></typeparam> /// <typeparam name="V"></typeparam> /// <typeparam name="E"></typeparam> /// <typeparam name="F"></typeparam> /// <param name="factory"></param> /// <param name="mesh"></param> /// <param name="setPosition"></param> /// <param name="setNormal"></param> /// <param name="setTexture"></param> /// <param name="setColor"></param> /// <returns></returns> public static M CreateFromMesh <M, V, E, F>(this HeMeshFactoryBase <M, V, E, F> factory, Mesh mesh, Action <V, Point3f> setPosition, Action <V, Vector3f> setNormal, Action <V, Point2f> setTexture, Action <V, Color> setColor) where M : HeMeshBase <V, E, F> where V : HeVertex <V, E, F> where E : Halfedge <V, E, F> where F : HeFace <V, E, F> { var verts = mesh.Vertices; var faces = mesh.Faces; var norms = mesh.Normals; var texCoords = mesh.TextureCoordinates; var colors = mesh.VertexColors; var result = factory.Create(verts.Count, verts.Count << 3, faces.Count); bool hasNorms = (norms.Count == verts.Count); bool hasTexCoords = (texCoords.Count == verts.Count); bool hasColors = (colors.Count == verts.Count); // add vertices for (int i = 0; i < verts.Count; i++) { var v = result.AddVertex(); setPosition(v, verts[i]); if (hasNorms) { setNormal(v, norms[i]); } if (hasTexCoords) { setTexture(v, texCoords[i]); } if (hasColors) { setColor(v, colors[i]); } } // add faces for (int i = 0; i < faces.Count; i++) { MeshFace f = faces[i]; if (f.IsQuad) { result.AddFace(f.A, f.B, f.C, f.D); } else { result.AddFace(f.A, f.B, f.C); } } return(result); }
/// <summary> /// /// </summary> /// <typeparam name="M"></typeparam> /// <typeparam name="V"></typeparam> /// <typeparam name="E"></typeparam> /// <typeparam name="F"></typeparam> /// <param name="factory"></param> /// <param name="mesh"></param> /// <returns></returns> public static M CreateFromMesh <M, V, E, F>(this HeMeshFactoryBase <M, V, E, F> factory, Mesh mesh) where M : HeMeshBase <V, E, F> where V : HeVertex <V, E, F>, IVertex3d where E : Halfedge <V, E, F> where F : HeFace <V, E, F> { return(factory.CreateFromMesh(mesh, (v, p) => v.Position = p.ToVec3d(), (v, n) => v.Normal = n.ToVec3d(), (v, t) => v.Texture = t.ToVec2d(), delegate { })); }