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