void GenericContactProcess (const NewtonJoint* contactJoint, dFloat timestep, int threadIndex) { int isHightField; NewtonBody* body; NewtonCollision* collision; NewtonCollisionInfoRecord info; isHightField = 1; body = NewtonJointGetBody0 (contactJoint); collision = NewtonBodyGetCollision(body); NewtonCollisionGetInfo(collision, &info); if (info.m_collisionType != SERIALIZE_ID_HEIGHTFIELD) { body = NewtonJointGetBody1 (contactJoint); collision = NewtonBodyGetCollision(body); NewtonCollisionGetInfo(collision, &info); isHightField = (info.m_collisionType == SERIALIZE_ID_HEIGHTFIELD); } #define HOLE_IN_TERRAIN 10 if (isHightField) { void* nextContact; for (void* contact = NewtonContactJointGetFirstContact (contactJoint); contact; contact = nextContact) { int faceID; NewtonMaterial* material; nextContact = NewtonContactJointGetNextContact (contactJoint, contact); material = NewtonContactGetMaterial (contact); faceID = NewtonMaterialGetContactFaceAttribute (material); if (faceID == HOLE_INTERRAIN) { NewtonContactJointRemoveContact (contactJoint, contact); } } } }
int Physics::levelContactProcess( const NewtonMaterial* p_material, const NewtonContact* /*p_contact*/ ) { // handle level submaterials unsigned int materialType = static_cast< unsigned int >( NewtonMaterialGetContactFaceAttribute( p_material ) ); switch ( materialType ) { case Physics::MAT_DEFAULT: NewtonMaterialSetContactElasticity( p_material, 0.3f ); NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.6f, 0 ); NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.3f, 0 ); break; case Physics::MAT_WOOD: NewtonMaterialSetContactElasticity( p_material, 0.5f ); NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.6f, 0 ); NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.4f, 0 ); break; case Physics::MAT_STONE: NewtonMaterialSetContactElasticity( p_material, 0.4f ); NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.55f, 0 ); NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.35f, 0 ); break; case Physics::MAT_METALL: NewtonMaterialSetContactElasticity( p_material, 0.6f ); NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.5f, 0 ); NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.4f, 0 ); break; case Physics::MAT_GRASS: NewtonMaterialSetContactElasticity( p_material, 0.4f ); NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.8f, 0 ); NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.6f, 0 ); break; case Physics::MAT_WALL: NewtonMaterialSetContactElasticity( p_material, 0.8f ); NewtonMaterialSetContactStaticFrictionCoef( p_material, 0.1f, 0 ); NewtonMaterialSetContactKineticFrictionCoef( p_material, 0.1f, 0 ); break; // simply return 0 for non-colliding pairs case Physics::MAT_NOCOL: return 0; break; default: ; } return 1; }
unsigned Material::GetContactFaceAttribute () { return NewtonMaterialGetContactFaceAttribute( m_material ); }