/// <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]); } } }