Beispiel #1
0
        /// <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));
        }
Beispiel #2
0
 /// <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));
 }
Beispiel #3
0
        /// <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);
        }
Beispiel #4
0
 /// <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 { }));
 }