bool VerifyNeighborVertConnection( CDispUtilsHelper *pDisp, const CVertIndex &nodeIndex, const CDispUtilsHelper *pTestNeighbor, const CVertIndex &testNeighborIndex, int mySide ) { CVertIndex nbIndex; CDispUtilsHelper *pNeighbor; if( pNeighbor = TransformIntoNeighbor( pDisp, mySide, nodeIndex, nbIndex ) ) { if ( pTestNeighbor != pNeighbor || nbIndex != testNeighborIndex ) return false; CVertIndex testIndex; int iSide = GetEdgeIndexFromPoint( nbIndex, pNeighbor->GetPowerInfo()->m_Power ); if ( iSide == -1 ) { return false; } CDispUtilsHelper *pTest = TransformIntoNeighbor( pNeighbor, iSide, nbIndex, testIndex ); if( pTest != pDisp || nodeIndex != testIndex ) { return false; } } return true; }
static void AddDependency( CVertInfo *dependencies, int sideLength, CVertIndex const &nodeIndex, CVertIndex const &dependency, int iMaxPower, bool bCheckNeighborDependency, bool bAddReverseDependency ) { int iNodeIndex = VertIndex( nodeIndex, iMaxPower ); CVertInfo *pNode = &dependencies[iNodeIndex]; int iDep = GetFreeDependency( pNode->m_Dependencies, sizeof(pNode->m_Dependencies)/sizeof(pNode->m_Dependencies[0]) ); pNode->m_Dependencies[iDep].m_iVert = dependency; pNode->m_Dependencies[iDep].m_iNeighbor = -1; if( bAddReverseDependency ) { CVertInfo *pDep = &dependencies[VertIndex( dependency, iMaxPower )]; iDep = GetFreeDependency( pDep->m_ReverseDependencies, CVertInfo::NUM_REVERSE_DEPENDENCIES ); pDep->m_ReverseDependencies[iDep].m_iVert = nodeIndex; pDep->m_ReverseDependencies[iDep].m_iNeighbor = -1; } // Edge verts automatically add a dependency for the neighbor. // Internal verts wind up in here twice anyway so it doesn't need to if( bCheckNeighborDependency ) { int iConnection = GetEdgeIndexFromPoint( nodeIndex, iMaxPower ); if( iConnection != -1 ) { Assert( !pNode->m_Dependencies[1].IsValid() ); CVertIndex delta( nodeIndex.x - dependency.x, nodeIndex.y - dependency.y ); CVertIndex newIndex( nodeIndex.x + delta.x, nodeIndex.y + delta.y ); int fullSideLength = (1 << iMaxPower) + 1; pNode->m_Dependencies[1].m_iVert = WrapVertIndex( CVertIndex( newIndex.x, newIndex.y ), fullSideLength ); pNode->m_Dependencies[1].m_iNeighbor = iConnection; } } }
static bool IsVertAllowed( CDispUtilsHelper *pDisp, CVertIndex const &sideVert, int iLevel ) { if( IsCorner( sideVert, pDisp->GetPowerInfo()->GetSideLength() ) ) return true; int iSide = GetEdgeIndexFromPoint( sideVert, pDisp->GetPowerInfo()->GetPower() ); if( iSide == -1 ) return true; int iSub = GetSubNeighborIndex( pDisp, iSide, sideVert ); if ( iSub == -1 ) return true; CDispSubNeighbor *pSub = &pDisp->GetEdgeNeighbor( iSide )->m_SubNeighbors[iSub]; CDispUtilsHelper *pNeighbor = pDisp->GetDispUtilsByIndex( pSub->m_iNeighbor ); Assert( pNeighbor ); // Ok, there is a neighbor.. see if this vertex exists in the neighbor. CShiftInfo *pShiftInfo = &g_ShiftInfos[pSub->m_Span][pSub->m_NeighborSpan]; Assert( pShiftInfo->m_bValid ); if( (pNeighbor->GetPowerInfo()->GetPower() + pShiftInfo->m_PowerShiftAdd) < (iLevel+1) ) { return false; } // Ok, it exists. Make sure the neighbor hasn't disallowed it. CVertIndex nbIndex; TransformIntoSubNeighbor( pDisp, iSide, iSub, sideVert, nbIndex ); CBitVec<MAX_DISPVERTS> &allowedVerts = CCoreDispInfo::FromDispUtils( pNeighbor )->GetAllowedVerts(); return !!allowedVerts.Get( pNeighbor->VertIndexToInt( nbIndex ) ); }