bool CProgressiveMesh::IsProgressiveMeshToplogicValid()

in UVAtlas/isochart/progressivemesh.cpp [387:474]


bool CProgressiveMesh::IsProgressiveMeshToplogicValid(
    PMISOCHARTEDGE* pEdge,
    PMISOCHARTVERTEX* pReserveVertex,
    PMISOCHARTVERTEX* pDeleteVertex) const
{
    for (size_t k = 0; k < 2; k++)
    {
        if (pEdge->dwOppositVertID[k] == INVALID_VERT_ID)
        {
            break;
        }

        PMISOCHARTVERTEX* pThirdVertex =
            m_pVertArray + pEdge->dwOppositVertID[k];
        for (size_t j = 0; j < pThirdVertex->edgeAdjacent.size(); j++)
        {
            PMISOCHARTEDGE* pEdge1 = m_pEdgeArray + pThirdVertex->edgeAdjacent[j];
            if (IsEdgeOppositeToVertex(pEdge1, pReserveVertex)
                && (IsEdgeOppositeToVertex(pEdge1, pDeleteVertex)))
            {
                return false;
            }
        }
    }

    PMISOCHARTFACE* pFace1 =
        m_pFaceArray + pEdge->dwFaceID[0];

    PMISOCHARTFACE* pFace2 = nullptr;
    if (!pEdge->bIsBoundary)
    {
        pFace2 = m_pFaceArray + pEdge->dwFaceID[1];
    }

    for (size_t j = 0; j < pReserveVertex->edgeAdjacent.size(); j++)
    {
        PMISOCHARTEDGE* pEdge1 = m_pEdgeArray + pReserveVertex->edgeAdjacent[j];
        if (pEdge1->dwID == pFace1->dwEdgeID[0]
            || pEdge1->dwID == pFace1->dwEdgeID[1]
            || pEdge1->dwID == pFace1->dwEdgeID[2])
        {
            continue;
        }

        if (pFace2)
        {
            if (pEdge1->dwID == pFace2->dwEdgeID[0]
                || pEdge1->dwID == pFace2->dwEdgeID[1]
                || pEdge1->dwID == pFace2->dwEdgeID[2])
            {
                continue;
            }
        }

        for (size_t k = 0; k < pDeleteVertex->edgeAdjacent.size(); k++)
        {
            PMISOCHARTEDGE* pEdge2 = m_pEdgeArray + pDeleteVertex->edgeAdjacent[k];
            if (pEdge2->dwID == pFace1->dwEdgeID[0]
                || pEdge2->dwID == pFace1->dwEdgeID[1]
                || pEdge2->dwID == pFace1->dwEdgeID[2])
            {
                continue;
            }

            if (pFace2)
            {
                if (pEdge2->dwID == pFace2->dwEdgeID[0]
                    || pEdge2->dwID == pFace2->dwEdgeID[1]
                    || pEdge2->dwID == pFace2->dwEdgeID[2])
                {
                    continue;
                }
            }

            // If true, the face (pReserveVertex, pDeleteVertex, pEdge1->dwVertexID[0])
            // or face (pReserveVertex, pDeleteVertex, pEdge1->dwVertexID[1) will 
            // degenerate to a segment.
            if (pEdge2->dwVertexID[0] == pEdge1->dwVertexID[0]
                || pEdge2->dwVertexID[0] == pEdge1->dwVertexID[1]
                || pEdge2->dwVertexID[1] == pEdge1->dwVertexID[0]
                || pEdge2->dwVertexID[1] == pEdge1->dwVertexID[1])
            {
                return false;
            }
        }
    }
    return true;
}