public static void InverseFace(TriMesh mesh) { List<TriMesh.Vertex[]> faces = new List<HalfEdgeMesh.Vertex[]>(); foreach (TriMesh.Face face in mesh.Faces) { TriMesh.HalfEdge hf = face.HalfEdge; TriMesh.Vertex[] arr = new TriMesh.Vertex[]{ hf.Next.ToVertex, hf.ToVertex, hf.FromVertex }; faces.Add(arr); } TriMesh.Vertex[] vertices = new TriMesh.Vertex[mesh.Vertices.Count]; for (int i = 0; i < mesh.Vertices.Count; i++) { vertices[i] = mesh.Vertices[i]; vertices[i].HalfEdge = null; } mesh.Clear(); foreach (var v in vertices) { mesh.AppendToVertexList(v); } foreach (var face in faces) { mesh.Faces.AddTriangles(face); } }
private TriMesh ChangeTopologyLoop(TriMesh sourceMesh) { TriMesh newMesh = new TriMesh(); newMesh.Clear(); vMap = new HalfEdgeMesh.Vertex[sourceMesh.Vertices.Count]; eMap = new HalfEdgeMesh.Vertex[sourceMesh.Edges.Count]; foreach (var v in sourceMesh.Vertices) { vMap[v.Index] = newMesh.Vertices.Add(new VertexTraits(v.Traits.Position)); } foreach (var edge in sourceMesh.Edges) { eMap[edge.Index] = newMesh.Vertices.Add( new VertexTraits(TriMeshUtil.GetMidPoint(edge))); } foreach (TriMesh.Face face in sourceMesh.Faces) { foreach (var hf in face.Halfedges) { newMesh.Faces.AddTriangles(eMap[hf.Edge.Index], vMap[hf.ToVertex.Index], eMap[hf.Next.Edge.Index]); } newMesh.Faces.AddTriangles( eMap[face.HalfEdge.Previous.Edge.Index], eMap[face.HalfEdge.Edge.Index], eMap[face.HalfEdge.Next.Edge.Index]); } return(newMesh); }
private TriMesh ChangeTopologyLoop(TriMesh sourceMesh) { TriMesh newMesh = new TriMesh(); newMesh.Clear(); vMap = new HalfEdgeMesh.Vertex[sourceMesh.Vertices.Count]; eMap = new HalfEdgeMesh.Vertex[sourceMesh.Edges.Count]; foreach (var v in sourceMesh.Vertices) { vMap[v.Index] = newMesh.Vertices.Add(new VertexTraits(v.Traits.Position)); } foreach (var edge in sourceMesh.Edges) { eMap[edge.Index] = newMesh.Vertices.Add( new VertexTraits(TriMeshUtil.GetMidPoint(edge))); } foreach(TriMesh.Face face in sourceMesh.Faces) { foreach (var hf in face.Halfedges) { newMesh.Faces.AddTriangles(eMap[hf.Edge.Index], vMap[hf.ToVertex.Index], eMap[hf.Next.Edge.Index]); } newMesh.Faces.AddTriangles( eMap[face.HalfEdge.Previous.Edge.Index], eMap[face.HalfEdge.Edge.Index], eMap[face.HalfEdge.Next.Edge.Index]); } return newMesh; }
public static void InverseFace(TriMesh mesh) { List <TriMesh.Vertex[]> faces = new List <HalfEdgeMesh.Vertex[]>(); foreach (TriMesh.Face face in mesh.Faces) { TriMesh.HalfEdge hf = face.HalfEdge; TriMesh.Vertex[] arr = new TriMesh.Vertex[] { hf.Next.ToVertex, hf.ToVertex, hf.FromVertex }; faces.Add(arr); } TriMesh.Vertex[] vertices = new TriMesh.Vertex[mesh.Vertices.Count]; for (int i = 0; i < mesh.Vertices.Count; i++) { vertices[i] = mesh.Vertices[i]; vertices[i].HalfEdge = null; } mesh.Clear(); foreach (var v in vertices) { mesh.AppendToVertexList(v); } foreach (var face in faces) { mesh.Faces.AddTriangles(face); } }
private TriMesh ChangeTopologyLoopSelected(TriMesh sourceMesh) { TriMesh newMesh = new TriMesh(); newMesh.Clear(); vMap = new HalfEdgeMesh.Vertex[sourceMesh.Vertices.Count]; eMap = new HalfEdgeMesh.Vertex[Mesh.Edges.Count]; foreach (var v in sourceMesh.Vertices) { vMap[v.Index] = newMesh.Vertices.Add(new VertexTraits(v.Traits.Position)); } foreach (var edge in sourceMesh.Edges) { if (edge.Vertex0.Traits.SelectedFlag != 0 && edge.Vertex1.Traits.SelectedFlag != 0) { eMap[edge.Index] = newMesh.Vertices.Add(new VertexTraits(TriMeshUtil.GetMidPoint(edge))); } } foreach (TriMesh.Face face in sourceMesh.Faces) { List<TriMesh.HalfEdge> list = new List<HalfEdgeMesh.HalfEdge>(); foreach (var hf in face.Halfedges) { if (hf.ToVertex.Traits.SelectedFlag != 0 && hf.FromVertex.Traits.SelectedFlag != 0) { list.Add(hf); } } switch (list.Count) { case 0: newMesh.Faces.AddTriangles( vMap[face.GetVertex(0).Index], vMap[face.GetVertex(1).Index], vMap[face.GetVertex(2).Index]); break; case 1: TriMesh.HalfEdge h = list[0]; newMesh.Faces.AddTriangles( eMap[h.Edge.Index], vMap[h.ToVertex.Index], vMap[h.Next.ToVertex.Index]); newMesh.Faces.AddTriangles( eMap[h.Edge.Index], vMap[h.Next.ToVertex.Index], vMap[h.FromVertex.Index]); break; case 3: foreach (var hf in face.Halfedges) { newMesh.Faces.AddTriangles(eMap[hf.Edge.Index], vMap[hf.ToVertex.Index], eMap[hf.Next.Edge.Index]); } newMesh.Faces.AddTriangles( eMap[face.HalfEdge.Previous.Edge.Index], eMap[face.HalfEdge.Edge.Index], eMap[face.HalfEdge.Next.Edge.Index]); break; default: break; } } return newMesh; }
private TriMesh ChangeTopologyLoopSelected(TriMesh sourceMesh) { TriMesh newMesh = new TriMesh(); newMesh.Clear(); vMap = new HalfEdgeMesh.Vertex[sourceMesh.Vertices.Count]; eMap = new HalfEdgeMesh.Vertex[Mesh.Edges.Count]; foreach (var v in sourceMesh.Vertices) { vMap[v.Index] = newMesh.Vertices.Add(new VertexTraits(v.Traits.Position)); } foreach (var edge in sourceMesh.Edges) { if (edge.Vertex0.Traits.SelectedFlag != 0 && edge.Vertex1.Traits.SelectedFlag != 0) { eMap[edge.Index] = newMesh.Vertices.Add(new VertexTraits(TriMeshUtil.GetMidPoint(edge))); } } foreach (TriMesh.Face face in sourceMesh.Faces) { List <TriMesh.HalfEdge> list = new List <HalfEdgeMesh.HalfEdge>(); foreach (var hf in face.Halfedges) { if (hf.ToVertex.Traits.SelectedFlag != 0 && hf.FromVertex.Traits.SelectedFlag != 0) { list.Add(hf); } } switch (list.Count) { case 0: newMesh.Faces.AddTriangles( vMap[face.GetVertex(0).Index], vMap[face.GetVertex(1).Index], vMap[face.GetVertex(2).Index]); break; case 1: TriMesh.HalfEdge h = list[0]; newMesh.Faces.AddTriangles( eMap[h.Edge.Index], vMap[h.ToVertex.Index], vMap[h.Next.ToVertex.Index]); newMesh.Faces.AddTriangles( eMap[h.Edge.Index], vMap[h.Next.ToVertex.Index], vMap[h.FromVertex.Index]); break; case 3: foreach (var hf in face.Halfedges) { newMesh.Faces.AddTriangles(eMap[hf.Edge.Index], vMap[hf.ToVertex.Index], eMap[hf.Next.Edge.Index]); } newMesh.Faces.AddTriangles( eMap[face.HalfEdge.Previous.Edge.Index], eMap[face.HalfEdge.Edge.Index], eMap[face.HalfEdge.Next.Edge.Index]); break; default: break; } } return(newMesh); }