func WrapMesh(m *gomesh.Mesh) *Mesh { m.ReindexVerticesAndFaces() // also wrap vertices; i.e. replaces mesh.Vertex with shapeset.vertex for i := 0; i < m.Vertices.Len(); i++ { if v, ok := m.Vertices.Get(i)[0].(*gomesh.Vertex); ok { m.Vertices.Update(i, &Vertex{Vertex: *v}) } } // also wrap faces and update them to reference outer vertex object for i := 0; i < m.Faces.Len(); i++ { if fx, ok := m.Faces.Get(i)[0].(*gomesh.Face); ok { f := &Face{Face: *fx} f.SetA(m.Vertices.Get(f.GetA().GetLocationInMesh(m))[0]) f.SetB(m.Vertices.Get(f.GetB().GetLocationInMesh(m))[0]) f.SetC(m.Vertices.Get(f.GetC().GetLocationInMesh(m))[0]) m.Faces.Update(i, f) f.GetA().AddFace(f) f.GetB().AddFace(f) f.GetC().AddFace(f) } } // iterate faces, build set of edges vert_pairs := make(map[gomesh.VertexPair]*Edge) m.Faces.EachWithIndex(func(i int, f gomesh.FaceI) { pairs := [3]gomesh.VertexPair{ gomesh.MakeVertexPair(f.GetA(), f.GetB()), gomesh.MakeVertexPair(f.GetB(), f.GetC()), gomesh.MakeVertexPair(f.GetC(), f.GetA()), } for i, pair := range pairs { var e *Edge if e1, exists := vert_pairs[pair]; !exists { e = &Edge{VertexPair: pair} e.V1.(*Vertex).AddEdge(e) e.V2.(*Vertex).AddEdge(e) vert_pairs[pair] = e } else { e = e1 } e.AddFace(f.(*Face)) f.(*Face).Edges[i] = e } }) return &Mesh{ Mesh: *m, Borders: make(map[BorderId]*Border), BoundingBox: m.BoundingBox(), } }