|
|
|
@ -6308,6 +6308,8 @@ bool MeshTexture::CreateVirtualFaces65( |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEBUG_EXTRA("结束稳定的虚拟面片创建逻辑"); |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -8640,6 +8642,7 @@ bool MeshTexture::FaceViewSelection3( unsigned minCommonCameras, float fOutlierT |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEBUG_EXTRA("FaceViewSelection3.1"); |
|
|
|
// printf("perFaceFaces.size = %d\n", perFaceFaces.size());
|
|
|
|
// printf("perFaceFaces.size = %d\n", perFaceFaces.size());
|
|
|
|
|
|
|
|
|
|
|
|
ASSERT(controlCounter == faces.size()); |
|
|
|
ASSERT(controlCounter == faces.size()); |
|
|
|
@ -8657,16 +8660,22 @@ bool MeshTexture::FaceViewSelection3( unsigned minCommonCameras, float fOutlierT |
|
|
|
const FIndex fAdj(adjFaces[i]); |
|
|
|
const FIndex fAdj(adjFaces[i]); |
|
|
|
if (fAdj == NO_ID) |
|
|
|
if (fAdj == NO_ID) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
if (mapFaceToVirtualFace[fAdj] == idxVF) |
|
|
|
const FIndex virtualAdj = mapFaceToVirtualFace[fAdj]; |
|
|
|
|
|
|
|
if (virtualAdj == NO_ID) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
if (fAdj != idxFace && vfNeighbors.Find(mapFaceToVirtualFace[fAdj]) == Mesh::FaceIdxArr::NO_INDEX) { |
|
|
|
if (virtualAdj >= virtualFaces.size()) |
|
|
|
vfNeighbors.emplace_back(mapFaceToVirtualFace[fAdj]); |
|
|
|
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
|
|
|
|
// 3) use virtual faces to build the graph
|
|
|
|
// 4) assign images to virtual faces
|
|
|
|
// 4) assign images to virtual faces
|
|
|
|
// 5) spread image ID to each mesh face from virtual face
|
|
|
|
// 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)); |
|
|
|
MAYBEUNUSED const Mesh::FIndex idx((Mesh::FIndex)boost::add_vertex(graph)); |
|
|
|
ASSERT(idx == idxFace); |
|
|
|
ASSERT(idx == idxFace); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
DEBUG_EXTRA("FaceViewSelection3.3"); |
|
|
|
//*
|
|
|
|
//*
|
|
|
|
FOREACH(idxVirtualFace, virtualFaces) { |
|
|
|
FOREACH(idxVirtualFace, virtualFaces) { |
|
|
|
const Mesh::FaceIdxArr& afaces = virtualFaceNeighbors[idxVirtualFace]; |
|
|
|
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) |
|
|
|
if (idxVirtualFace >= idxVirtualFaceAdj) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
const bool bInvisibleFace(virtualFacesDatas[idxVirtualFace].empty()); |
|
|
|
const bool bInvisibleFace(virtualFacesDatas[idxVirtualFace].empty()); |
|
|
|
const bool bInvisibleFaceAdj(virtualFacesDatas[idxVirtualFaceAdj].empty()); |
|
|
|
const bool bInvisibleFaceAdj(virtualFacesDatas[idxVirtualFaceAdj].empty()); |
|
|
|
if (bInvisibleFace || bInvisibleFaceAdj) |
|
|
|
if (bInvisibleFace || bInvisibleFaceAdj) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
boost::add_edge(idxVirtualFace, idxVirtualFaceAdj, graph); |
|
|
|
boost::add_edge(idxVirtualFace, idxVirtualFaceAdj, graph); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
//*/
|
|
|
|
//*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEBUG_EXTRA("FaceViewSelection3.4"); |
|
|
|
// 这里通过深度图判断virtualFaces是否要为invalid
|
|
|
|
// 这里通过深度图判断virtualFaces是否要为invalid
|
|
|
|
// CheckInvalidFaces(virtualFacesDatas, fOutlierThreshold, nIgnoreMaskLabel, views, bUseVirtualFaces))
|
|
|
|
// CheckInvalidFaces(virtualFacesDatas, fOutlierThreshold, nIgnoreMaskLabel, views, bUseVirtualFaces))
|
|
|
|
|
|
|
|
|
|
|
|
|