inline int _ProcessLocalContacts() { if (ctContacts == 0) { return 0; } #ifdef OPTIMIZE_CONTACTS if (ctContacts > 1 && !(iFlags & CONTACTS_UNIMPORTANT)) { // Can be optimized... _OptimizeLocalContacts(); } #endif unsigned int iContact = 0; dContactGeom* Contact = 0; unsigned int nFinalContact = 0; for (iContact = 0; iContact < ctContacts; iContact ++) { // Ensure that we haven't created too many contacts if( nFinalContact >= (iFlags & NUMC_MASK)) { break; } if (1 == gLocalContacts[iContact].nFlags) { Contact = SAFECONTACT(iFlags, ContactGeoms, nFinalContact, iStride); Contact->depth = gLocalContacts[iContact].fDepth; SET(Contact->normal,gLocalContacts[iContact].vNormal); SET(Contact->pos,gLocalContacts[iContact].vPos); Contact->g1 = gTriMesh; Contact->g2 = gCylinder; Contact->side2 = gLocalContacts[iContact].triIndex; nFinalContact++; } } // debug //if (nFinalContact != ctContacts) //{ // printf("[Info] %d contacts generated,%d filtered.\n",ctContacts,ctContacts-nFinalContact); //} return nFinalContact; }
int sTrimeshCapsuleColliderData::_ProcessLocalContacts(dContactGeom *contact, dxTriMesh *TriMesh, dxGeom *Capsule) { #if OPTIMIZE_CONTACTS if (m_ctContacts > 1 && !(m_iFlags & CONTACTS_UNIMPORTANT)) { // Can be optimized... _OptimizeLocalContacts(); } #endif unsigned int iContact = 0; dContactGeom* Contact = 0; unsigned int nFinalContact = 0; for (iContact = 0; iContact < m_ctContacts; iContact ++) { // Ensure that we haven't created too many contacts if( nFinalContact >= (m_iFlags & NUMC_MASK)) { break; } if (1 == m_gLocalContacts[iContact].nFlags) { Contact = SAFECONTACT(m_iFlags, contact, nFinalContact, m_iStride); Contact->depth = m_gLocalContacts[iContact].fDepth; SET(Contact->normal,m_gLocalContacts[iContact].vNormal); SET(Contact->pos,m_gLocalContacts[iContact].vPos); Contact->g1 = TriMesh; Contact->g2 = Capsule; Contact->side1 = m_gLocalContacts[iContact].triIndex; Contact->side2 = -1; nFinalContact++; } } // debug //if (nFinalContact != m_ctContacts) //{ // printf("[Info] %d contacts generated,%d filtered.\n",m_ctContacts,m_ctContacts-nFinalContact); //} return nFinalContact; }
inline int _ProcessLocalContacts(sData& cData) { if (cData.nContacts == 0) { return 0; } #ifdef OPTIMIZE_CONTACTS if (cData.nContacts > 1 && !(cData.iFlags & CONTACTS_UNIMPORTANT)) { // Can be optimized... _OptimizeLocalContacts(cData); } #endif int iContact = 0; dContactGeom* Contact = 0; int nFinalContact = 0; for (iContact = 0; iContact < cData.nContacts; iContact ++) { if (1 == cData.gLocalContacts[iContact].nFlags) { Contact = SAFECONTACT(cData.iFlags, cData.gContact, nFinalContact, cData.iSkip); Contact->depth = cData.gLocalContacts[iContact].fDepth; dVector3Copy(cData.gLocalContacts[iContact].vNormal,Contact->normal); dVector3Copy(cData.gLocalContacts[iContact].vPos,Contact->pos); Contact->g1 = cData.gCylinder; Contact->g2 = cData.gTrimesh; Contact->side2 = cData.gLocalContacts[iContact].triIndex; dVector3Inv(Contact->normal); nFinalContact++; } } // debug //if (nFinalContact != cData.nContacts) //{ // printf("[Info] %d contacts generated,%d filtered.\n",cData.nContacts,cData.nContacts-nFinalContact); //} return nFinalContact; }