int FindNeighborCornerVert( CCoreDispInfo *pDisp, const Vector &vTest ) { CDispUtilsHelper *pDispHelper = pDisp; int iClosest = 0; float flClosest = 1e24; for ( int iCorner=0; iCorner < 4; iCorner++ ) { // Has it been touched? CVertIndex cornerVert = pDispHelper->GetPowerInfo()->GetCornerPointIndex( iCorner ); int iCornerVert = pDispHelper->VertIndexToInt( cornerVert ); const Vector &vCornerVert = pDisp->GetVert( iCornerVert ); float flDist = vCornerVert.DistTo( vTest ); if ( flDist < flClosest ) { iClosest = iCorner; flClosest = flDist; } } if ( flClosest <= 0.1f ) return iClosest; else return -1; }
void SetupAllowedVerts( CCoreDispInfo *pListBase, int listSize ) { // Set all verts to allowed to start with. for ( int i=0; i < listSize; i++ ) { pListBase[i].GetAllowedVerts().SetAll(); } // Disable verts that need to be disabled so higher-powered displacements remove // the necessary triangles when bordering lower-powered displacements. // It is necessary to loop around here because disabling verts can accumulate into // neighbors. bool bContinue; do { bContinue = false; for( i=0; i < listSize; i++ ) { CDispUtilsHelper *pDisp = &pListBase[i]; int nUnallowed = 0; DisableUnallowedVerts_R( pDisp, pDisp->GetPowerInfo()->m_RootNode, 0, nUnallowed ); if ( nUnallowed ) bContinue = true; } } while( bContinue ); }
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 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 ) ); }