| 111 | } |
| 112 | |
| 113 | void MeshConnectivity::init_vertex_adjacencies(Mesh* mesh) { |
| 114 | if (vertex_adjacencies_computed()) return; |
| 115 | |
| 116 | const size_t num_vertices = mesh->get_num_vertices(); |
| 117 | const size_t num_faces = mesh->get_num_faces(); |
| 118 | const size_t num_voxels = mesh->get_num_voxels(); |
| 119 | const size_t vertex_per_face = mesh->get_vertex_per_face(); |
| 120 | const size_t vertex_per_voxel = mesh->get_vertex_per_voxel(); |
| 121 | |
| 122 | std::vector<IndexSet> neighbor_vertices(num_vertices); |
| 123 | std::vector<IndexSet> neighbor_faces(num_vertices); |
| 124 | std::vector<IndexSet> neighbor_voxels(num_vertices); |
| 125 | |
| 126 | |
| 127 | if (vertex_per_face == 3) { |
| 128 | for (size_t i=0; i<num_faces; i++) { |
| 129 | VectorI face = mesh->get_face(i); |
| 130 | neighbor_vertices[face[0]].insert(face[1]); |
| 131 | neighbor_vertices[face[0]].insert(face[2]); |
| 132 | neighbor_vertices[face[1]].insert(face[0]); |
| 133 | neighbor_vertices[face[1]].insert(face[2]); |
| 134 | neighbor_vertices[face[2]].insert(face[0]); |
| 135 | neighbor_vertices[face[2]].insert(face[1]); |
| 136 | |
| 137 | neighbor_faces[face[0]].insert(i); |
| 138 | neighbor_faces[face[1]].insert(i); |
| 139 | neighbor_faces[face[2]].insert(i); |
| 140 | } |
| 141 | } else if (vertex_per_face == 4) { |
| 142 | for (size_t i=0; i<num_faces; i++) { |
| 143 | VectorI face = mesh->get_face(i); |
| 144 | neighbor_vertices[face[0]].insert(face[1]); |
| 145 | neighbor_vertices[face[0]].insert(face[3]); |
| 146 | neighbor_vertices[face[1]].insert(face[0]); |
| 147 | neighbor_vertices[face[1]].insert(face[2]); |
| 148 | neighbor_vertices[face[2]].insert(face[1]); |
| 149 | neighbor_vertices[face[2]].insert(face[3]); |
| 150 | neighbor_vertices[face[3]].insert(face[0]); |
| 151 | neighbor_vertices[face[3]].insert(face[2]); |
| 152 | |
| 153 | neighbor_faces[face[0]].insert(i); |
| 154 | neighbor_faces[face[1]].insert(i); |
| 155 | neighbor_faces[face[2]].insert(i); |
| 156 | neighbor_faces[face[3]].insert(i); |
| 157 | } |
| 158 | } else { |
| 159 | std::stringstream err_msg; |
| 160 | err_msg << "Unsupported face with " << vertex_per_face |
| 161 | << " vertices per face"; |
| 162 | throw RuntimeError(err_msg.str()); |
| 163 | } |
| 164 | |
| 165 | if (vertex_per_voxel == 4) { |
| 166 | for (size_t i=0; i<num_voxels; i++) { |
| 167 | VectorI voxel = mesh->get_voxel(i); |
| 168 | neighbor_vertices[voxel[0]].insert(voxel[1]); |
| 169 | neighbor_vertices[voxel[0]].insert(voxel[2]); |
| 170 | neighbor_vertices[voxel[0]].insert(voxel[3]); |
no test coverage detected