| 116 | } |
| 117 | |
| 118 | void IndexedFaceMesh::buildNeighbors() |
| 119 | { |
| 120 | typedef std::vector<unsigned int> PEdges; |
| 121 | |
| 122 | PEdges* pEdges = new PEdges[numVertices()]; |
| 123 | |
| 124 | // build vertex-face structure |
| 125 | m_verticesFaces.clear(); // to delete old pointers |
| 126 | m_verticesFaces.resize(numVertices()); |
| 127 | m_verticesEdges.clear(); // to delete old pointers |
| 128 | m_verticesEdges.resize(numVertices()); |
| 129 | m_facesEdges.clear(); |
| 130 | m_facesEdges.resize(numFaces()); |
| 131 | |
| 132 | m_edges.clear(); |
| 133 | |
| 134 | unsigned int *v = new unsigned int[m_verticesPerFace]; |
| 135 | unsigned int *edges = new unsigned int[m_verticesPerFace*2]; |
| 136 | for(unsigned int i=0; i < numFaces(); i++) |
| 137 | { |
| 138 | m_facesEdges[i].resize(m_verticesPerFace); |
| 139 | for (unsigned int j=0u; j < m_verticesPerFace; j++) |
| 140 | v[j] = m_indices[m_verticesPerFace*i+j]; |
| 141 | |
| 142 | for (unsigned int j=0u; j < m_verticesPerFace-1u; j++) |
| 143 | { |
| 144 | edges[2*j] = v[j]; |
| 145 | edges[2*j+1] = v[j+1]; |
| 146 | } |
| 147 | edges[2*(m_verticesPerFace-1)] = v[m_verticesPerFace-1]; |
| 148 | edges[2*(m_verticesPerFace-1)+1] = v[0]; |
| 149 | |
| 150 | for(unsigned int j=0u; j < m_verticesPerFace; j++) |
| 151 | { |
| 152 | // add vertex-face connection |
| 153 | const unsigned int vIndex = m_indices[m_verticesPerFace*i+j]; |
| 154 | bool found = false; |
| 155 | for(unsigned int k=0; k < m_verticesFaces[vIndex].size(); k++) |
| 156 | { |
| 157 | if (m_verticesFaces[vIndex][k] == i) |
| 158 | { |
| 159 | found = true; |
| 160 | break; |
| 161 | } |
| 162 | } |
| 163 | if (!found) |
| 164 | { |
| 165 | m_verticesFaces[vIndex].push_back(i); |
| 166 | } |
| 167 | |
| 168 | // add edge information |
| 169 | const unsigned int a = edges[j*2+0]; |
| 170 | const unsigned int b = edges[j*2+1]; |
| 171 | unsigned int edge = 0xffffffff; |
| 172 | // find edge |
| 173 | for(unsigned int k=0; k < pEdges[a].size(); k++) |
| 174 | { |
| 175 | const Edge& e = m_edges[pEdges[a][k]]; |