解决构建虚拟面邻居图时的一个崩溃Bug
This commit is contained in:
1 parent
617f8ea2b5
commit
982106fec2
1 file changed
+22
-4
@@ -6308,6 +6308,8 @@ bool MeshTexture::CreateVirtualFaces65(
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG_EXTRA("结束稳定的虚拟面片创建逻辑");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -8640,6 +8642,7 @@ bool MeshTexture::FaceViewSelection3( unsigned minCommonCameras, float fOutlierT
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG_EXTRA("FaceViewSelection3.1");
|
||||
// printf("perFaceFaces.size = %d\n", perFaceFaces.size());
|
||||
|
||||
ASSERT(controlCounter == faces.size());
|
||||
@@ -8657,16 +8660,22 @@ bool MeshTexture::FaceViewSelection3( unsigned minCommonCameras, float fOutlierT
|
||||
const FIndex fAdj(adjFaces[i]);
|
||||
if (fAdj == NO_ID)
|
||||
continue;
|
||||
if (mapFaceToVirtualFace[fAdj] == idxVF)
|
||||
const FIndex virtualAdj = mapFaceToVirtualFace[fAdj];
|
||||
if (virtualAdj == NO_ID)
|
||||
continue;
|
||||
if (fAdj != idxFace && vfNeighbors.Find(mapFaceToVirtualFace[fAdj]) == Mesh::FaceIdxArr::NO_INDEX) {
|
||||
vfNeighbors.emplace_back(mapFaceToVirtualFace[fAdj]);
|
||||
if (virtualAdj >= virtualFaces.size())
|
||||
continue;
|
||||
if (virtualAdj == idxVF)
|
||||
continue;
|
||||
if (vfNeighbors.Find(virtualAdj) == Mesh::FaceIdxArr::NO_INDEX) {
|
||||
vfNeighbors.emplace_back(virtualAdj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//*/
|
||||
}
|
||||
DEBUG_EXTRA("FaceViewSelection3.2");
|
||||
// 3) use virtual faces to build the graph
|
||||
// 4) assign images to virtual faces
|
||||
// 5) spread image ID to each mesh face from virtual face
|
||||
@@ -8674,21 +8683,30 @@ bool MeshTexture::FaceViewSelection3( unsigned minCommonCameras, float fOutlierT
|
||||
MAYBEUNUSED const Mesh::FIndex idx((Mesh::FIndex)boost::add_vertex(graph));
|
||||
ASSERT(idx == idxFace);
|
||||
}
|
||||
DEBUG_EXTRA("FaceViewSelection3.3");
|
||||
//*
|
||||
FOREACH(idxVirtualFace, virtualFaces) {
|
||||
const Mesh::FaceIdxArr& afaces = virtualFaceNeighbors[idxVirtualFace];
|
||||
for (FIndex idxVirtualFaceAdj: afaces) {
|
||||
for (FIndex idxVirtualFaceAdj : afaces) {
|
||||
// ✅ 防御性检查
|
||||
if (idxVirtualFaceAdj == NO_ID)
|
||||
continue;
|
||||
if (idxVirtualFaceAdj >= virtualFaces.size())
|
||||
continue;
|
||||
if (idxVirtualFace >= idxVirtualFaceAdj)
|
||||
continue;
|
||||
|
||||
const bool bInvisibleFace(virtualFacesDatas[idxVirtualFace].empty());
|
||||
const bool bInvisibleFaceAdj(virtualFacesDatas[idxVirtualFaceAdj].empty());
|
||||
if (bInvisibleFace || bInvisibleFaceAdj)
|
||||
continue;
|
||||
|
||||
boost::add_edge(idxVirtualFace, idxVirtualFaceAdj, graph);
|
||||
}
|
||||
}
|
||||
//*/
|
||||
|
||||
DEBUG_EXTRA("FaceViewSelection3.4");
|
||||
// 这里通过深度图判断virtualFaces是否要为invalid
|
||||
// CheckInvalidFaces(virtualFacesDatas, fOutlierThreshold, nIgnoreMaskLabel, views, bUseVirtualFaces))
|
||||
|
||||
|
||||
Reference in new issue
Block a user