| 324 | } |
| 325 | |
| 326 | void MeshConnectivity::init_voxel_adjacencies(Mesh* mesh) { |
| 327 | if (voxel_adjacencies_computed()) return; |
| 328 | if (!vertex_adjacencies_computed()) |
| 329 | init_vertex_adjacencies(mesh); |
| 330 | |
| 331 | const size_t num_voxels = mesh->get_num_voxels(); |
| 332 | const size_t vertex_per_face = mesh->get_vertex_per_face(); |
| 333 | const size_t vertex_per_voxel = mesh->get_vertex_per_voxel(); |
| 334 | |
| 335 | std::vector<IndexSet> neighbor_faces(num_voxels); |
| 336 | std::vector<IndexSet> neighbor_voxels(num_voxels); |
| 337 | |
| 338 | for (size_t i=0; i<num_voxels; i++) { |
| 339 | const VectorI voxel = mesh->get_voxel(i); |
| 340 | IndexSet& voxel_neighbors = neighbor_faces[i]; |
| 341 | |
| 342 | assert(voxel.size() == vertex_per_voxel); |
| 343 | std::map<int, int> face_counter; |
| 344 | for (size_t j=0; j<vertex_per_voxel; j++) { |
| 345 | const VectorI neighbors = get_vertex_adjacent_faces(voxel[j]); |
| 346 | const size_t num_neighbors = neighbors.size(); |
| 347 | for (size_t k=0; k<num_neighbors; k++) { |
| 348 | if (face_counter.find(neighbors[k]) == face_counter.end()) { |
| 349 | face_counter[neighbors[k]] = 1; |
| 350 | } else { |
| 351 | face_counter[neighbors[k]] += 1; |
| 352 | } |
| 353 | } |
| 354 | } |
| 355 | for (const auto& entry : face_counter) { |
| 356 | if (entry.second == vertex_per_face) { |
| 357 | voxel_neighbors.insert(entry.first); |
| 358 | } |
| 359 | } |
| 360 | } |
| 361 | |
| 362 | for (size_t i=0; i<num_voxels; i++) { |
| 363 | VectorI voxel = mesh->get_voxel(i); |
| 364 | IndexSet& voxel_neighbors = neighbor_voxels[i]; |
| 365 | |
| 366 | std::map<int, int> voxel_counter; |
| 367 | for (size_t j=0; j<vertex_per_voxel; j++) { |
| 368 | VectorI neighbors = get_vertex_adjacent_voxels(voxel[j]); |
| 369 | size_t num_neighbors = neighbors.size(); |
| 370 | for (size_t k=0; k<num_neighbors; k++) { |
| 371 | if (voxel_counter.find(neighbors[k]) == voxel_counter.end()) { |
| 372 | voxel_counter[neighbors[k]] = 1; |
| 373 | } else { |
| 374 | voxel_counter[neighbors[k]] += 1; |
| 375 | } |
| 376 | } |
| 377 | } |
| 378 | for (const auto& entry : voxel_counter) { |
| 379 | if (entry.second == vertex_per_face) { |
| 380 | voxel_neighbors.insert(entry.first); |
| 381 | } |
| 382 | } |
| 383 | } |
no test coverage detected