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;
}