예제 #1
0
        private void BuildWedges(List <Wedge> wedges, List <Vector3> verts, List <int> tris)
        {
            Vertex[] vertices = new Vertex[verts.Count];

            //First sort vertices into wedges
            for (int i = 0; i != verts.Count; i++)
            {
                Vertex vertex = new Vertex(verts[i], i);
                vertices[i] = vertex;

                Wedge wedge = WedgeForPosition(wedges, verts[i]);
                if (wedge != null)
                {
                    wedge.AddVertex(vertex);
                }
                else
                {
                    wedge = new Wedge(verts[i], wedges.Count);
                    wedge.AddVertex(vertex);
                    wedges.Add(wedge);
                }
            }

            //Build neighbourly relations between vertices and wedges using the triangles of the model
            BuildNeighbourlyRelations(wedges, vertices, tris);

            //Determine which triangles are adjacent to each wedge
            //for (int i = 0; i != m_wedges.Count; i++)
            //{
            //    m_wedges[i].InvalidateAdjacentTriangles();
            //}
        }
예제 #2
0
        /**
         * Collapse all vertices in this wedge using the m_mappedVertices list
         **/
        public void CollapseOnWedge(Wedge w)
        {
            //w = m_collapse;

            //collapsed vertices
            Vertex[] collapseVertices  = new Vertex[m_collapsedVertices.Count];
            int      collapseVertexIdx = 0;

            foreach (KeyValuePair <int, int> kvp in m_collapsedVertices)
            {
                Vertex vertex = GetVertexForID(kvp.Key);

                Vertex collapseVertex = w.GetVertexForID(kvp.Value);
                vertex.CollapseOnWedgeVertex(collapseVertex);

                collapseVertices[collapseVertexIdx] = collapseVertex;
                collapseVertexIdx++;
            }

            for (int i = 0; i != collapseVertices.Length; i++)
            {
                Vertex collapseVertex = collapseVertices[i];

                //the collapse vertex does not have any adjacent triangles even after collapsing operation, delete it
                if (collapseVertex.AdjacentTriangles.Count == 0)
                {
                    w.RemoveVertex(collapseVertex);
                    this.m_deletedVertices.Add(collapseVertex.ID);
                }
            }

            //for (int i = 0; i != m_collapsedVertices.Count; i++)
            //{
            //    Vertex vertex = GetVertexForID(m_collapsedVertices[i].m_initialIndex);

            //    //if (vertex != null) //vertex has been deleted
            //    Vertex collapseVertex = w.GetVertexForID(m_collapsedVertices[i].m_collapsedIndex);
            //    vertex.CollapseOnWedgeVertex(collapseVertex);

            //    //the collapse vertex does not have any adjacent triangles even after collapsing operation, delete it
            //    if (collapseVertex.AdjacentTriangles.Count == 0)
            //    {
            //        w.RemoveVertex(collapseVertex);
            //        this.m_deletedVertices.Add(collapseVertex.ID);
            //    }
            //}

            //displaced vertices
            for (int i = 0; i != m_displacedVertices.Count; i++)
            {
                Vertex vertex = GetVertexForID(m_displacedVertices[i].m_index);

                //if (vertex != null)
                w.AddVertex(vertex);
                this.RemoveVertex(vertex);
            }
        }
예제 #3
0
        private void BuildWedges(List <Wedge> wedges, ModelData data)
        {
            Vertex[] vertices = new Vertex[data.Verts.Length];

            //First sort vertices into wedges
            for (int i = 0; i != data.Verts.Length; i++)
            {
                Vertex vertex = new Vertex(data.Verts[i], i);
                if (data.Colors != null && data.Colors.Length > 0)
                {
                    vertex.m_color = data.Colors[i];
                }
                if (data.UVs != null && data.UVs.Length > 0)
                {
                    vertex.m_uv = data.UVs[i];
                }
                vertices[i] = vertex;

                Wedge wedge = WedgeForPosition(wedges, data.Verts[i]);
                if (wedge != null)
                {
                    wedge.AddVertex(vertex);
                }
                else
                {
                    wedge = new Wedge(data.Verts[i], wedges.Count);
                    wedge.AddVertex(vertex);
                    wedges.Add(wedge);
                }
            }

            //Build neighbourly relations between vertices and wedges using the triangles of the model
            BuildNeighbourlyRelations(wedges, vertices, data.Tris);

            //Determine which triangles are adjacent to each wedge
            for (int i = 0; i != m_wedges.Count; i++)
            {
                m_wedges[i].InvalidateAdjacentTriangles();
            }
        }