Exemplo n.º 1
0
 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);
     }
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
        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;
        }
Exemplo n.º 6
0
        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);
        }