示例#1
0
            /// <summary>
            /// Reads this buffer to the given graph.
            /// </summary>
            /// <param name="mesh"></param>
            public void ReadTo <TV, TE, TF>(HeMeshBase <TV, TE, TF> mesh, Action <TV, object[]> setVertexAttributes = null, Action <TE, object[]> setHedgeAttributes = null, Action <TF, object[]> setFaceAttributes = null)
                where TV : HeMeshBase <TV, TE, TF> .Vertex
                where TE : HeMeshBase <TV, TE, TF> .Halfedge
                where TF : HeMeshBase <TV, TE, TF> .Face
            {
                var verts  = mesh.Vertices;
                var hedges = mesh.Halfedges;
                var faces  = mesh.Faces;

                int nv  = verts.Count;
                int nhe = hedges.Count;
                int nf  = faces.Count;

                // add new vertices
                for (int i = 0; i < _vertexRefs.Length; i++)
                {
                    mesh.AddVertex();
                }

                // add new halfedges
                for (int i = 0; i < _hedgeRefs.Length; i++)
                {
                    mesh.AddEdge();
                }

                // add new faces
                for (int i = 0; i < _faceRefs.Length; i++)
                {
                    mesh.AddFace();
                }

                // link up vertices
                for (int i = 0; i < _vertexRefs.Length; i++)
                {
                    var v = verts[i + nv];

                    var first = _vertexRefs[i];
                    if (first > -1)
                    {
                        v.First = hedges[first + nhe];
                    }
                }

                // link up halfedges
                for (int i = 0; i < _hedgeRefs.Length; i++)
                {
                    var he   = hedges[i + nhe];
                    var refs = _hedgeRefs[i];

                    he.PreviousInFace = hedges[refs[0] + nhe];
                    he.NextInFace     = hedges[refs[1] + nhe];

                    var start = refs[2];
                    if (start > -1)
                    {
                        he.Start = verts[start + nhe];
                    }

                    var face = refs[3];
                    if (face > -1)
                    {
                        he.Face = faces[face + nf];
                    }
                }

                // link up faces
                for (int i = 0; i < _faceRefs.Length; i++)
                {
                    var f = faces[i + nf];

                    var first = _faceRefs[i];
                    if (first > -1)
                    {
                        f.First = hedges[first + nhe];
                    }
                }

                // TODO validate topology?

                // set vertex attributes
                if (setVertexAttributes != null)
                {
                    for (int i = 0; i < _vertexAttributes.Length; i++)
                    {
                        setVertexAttributes(verts[i + nv], _vertexAttributes[i]);
                    }
                }

                // set vertex attributes
                if (setHedgeAttributes != null)
                {
                    for (int i = 0; i < _hedgeAttributes.Length; i++)
                    {
                        setHedgeAttributes(hedges[i + nhe], _hedgeAttributes[i]);
                    }
                }

                // set vertex attributes
                if (setFaceAttributes != null)
                {
                    for (int i = 0; i < _faceAttributes.Length; i++)
                    {
                        setFaceAttributes(faces[i + nf], _faceAttributes[i]);
                    }
                }
            }