void Mesh::finish() { // Finish up the mesh, clear the vertex_hash_map, as it's no longer needed from this point on and uses quite a bit of memory. vertex_hash_map.clear(); // For each face, store which other face is connected with it. for(unsigned int i=0; i<faces.size(); i++) { MeshFace& face = faces[i]; face.connected_face_index[0] = getFaceIdxWithPoints(face.vertex_index[0], face.vertex_index[1], i); // faces are connected via the outside face.connected_face_index[1] = getFaceIdxWithPoints(face.vertex_index[1], face.vertex_index[2], i); face.connected_face_index[2] = getFaceIdxWithPoints(face.vertex_index[2], face.vertex_index[0], i); } }
OptimizedVolume::OptimizedVolume(SimpleVolume* volume, OptimizedModel* model) : model(model) { points.reserve(volume->faces.size() * 3); faces.reserve(volume->faces.size()); std::map<uint32_t, std::vector<uint32_t> > indexMap; double t = getTime(); for(uint32_t i=0; i<volume->faces.size(); i++) { OptimizedFace f; if((i%1000==0) && (getTime()-t)>2.0) logProgress("optimized", i + 1, volume->faces.size()); for(uint32_t j=0; j<3; j++) { Point3 p = volume->faces[i].v[j]; int hash = ((p.x + MELD_DIST/2) / MELD_DIST) ^ (((p.y + MELD_DIST/2) / MELD_DIST) << 10) ^ (((p.z + MELD_DIST/2) / MELD_DIST) << 20); uint32_t idx; bool add = true; for(unsigned int n = 0; n < indexMap[hash].size(); n++) { if ((points[indexMap[hash][n]].p - p).testLength(MELD_DIST)) { idx = indexMap[hash][n]; add = false; break; } } if (add) { indexMap[hash].push_back(points.size()); idx = points.size(); points.push_back(p); } f.index[j] = idx; } if (f.index[0] != f.index[1] && f.index[0] != f.index[2] && f.index[1] != f.index[2]) { //Check if there is a face with the same points bool duplicate = false; for(unsigned int _idx0 = 0; _idx0 < points[f.index[0]].faceIndexList.size(); _idx0++) { for(unsigned int _idx1 = 0; _idx1 < points[f.index[1]].faceIndexList.size(); _idx1++) { for(unsigned int _idx2 = 0; _idx2 < points[f.index[2]].faceIndexList.size(); _idx2++) { if (points[f.index[0]].faceIndexList[_idx0] == points[f.index[1]].faceIndexList[_idx1] && points[f.index[0]].faceIndexList[_idx0] == points[f.index[2]].faceIndexList[_idx2]) duplicate = true; } } } if (!duplicate) { points[f.index[0]].faceIndexList.push_back(faces.size()); points[f.index[1]].faceIndexList.push_back(faces.size()); points[f.index[2]].faceIndexList.push_back(faces.size()); faces.push_back(f); } } } //fprintf(stdout, "\rAll faces are optimized in %5.1fs.\n",timeElapsed(t)); int openFacesCount = 0; for(unsigned int i=0;i<faces.size();i++) { OptimizedFace* f = &faces[i]; f->touching[0] = getFaceIdxWithPoints(f->index[0], f->index[1], i); f->touching[1] = getFaceIdxWithPoints(f->index[1], f->index[2], i); f->touching[2] = getFaceIdxWithPoints(f->index[2], f->index[0], i); if (f->touching[0] == -1) openFacesCount++; if (f->touching[1] == -1) openFacesCount++; if (f->touching[2] == -1) openFacesCount++; } //fprintf(stdout, " Number of open faces: %i\n", openFacesCount); }