static void UserContactRestitution (const NewtonJoint* contactJoint, dFloat timestep, int threadIndex) { dFloat Ixx; dFloat Iyy; dFloat Izz; dFloat mass; NewtonBody* body; NewtonBody* body0; NewtonBody* body1; // call the basic call back GenericContactProcess (contactJoint, timestep, threadIndex); body0 = NewtonJointGetBody0(contactJoint); body1 = NewtonJointGetBody1(contactJoint); body = body0; NewtonBodyGetMassMatrix (body, &mass, &Ixx, &Iyy, &Izz); if (mass == 0.0f) { body = body1; } NewtonCollision* const collision = NewtonBodyGetCollision(body); void* userData = NewtonCollisionGetUserData (collision); dFloat restitution = *((float*)&userData); for (void* contact = NewtonContactJointGetFirstContact (contactJoint); contact; contact = NewtonContactJointGetNextContact (contactJoint, contact)) { NewtonMaterial* const material = NewtonContactGetMaterial (contact); NewtonMaterialSetContactElasticity (material, restitution); } }
static void UserContactFriction (const NewtonJoint* contactJoint, dFloat timestep, int threadIndex) { dFloat Ixx; dFloat Iyy; dFloat Izz; dFloat mass; // call the basic call back GenericContactProcess (contactJoint, timestep, threadIndex); const NewtonBody* const body0 = NewtonJointGetBody0(contactJoint); const NewtonBody* const body1 = NewtonJointGetBody1(contactJoint); const NewtonBody* body = body0; NewtonBodyGetMass (body, &mass, &Ixx, &Iyy, &Izz); if (mass == 0.0f) { body = body1; } //now core 300 can have per collision user data NewtonCollision* const collision = NewtonBodyGetCollision(body); void* userData = NewtonCollisionGetUserData (collision); dFloat frictionValue = *((dFloat*)&userData); for (void* contact = NewtonContactJointGetFirstContact (contactJoint); contact; contact = NewtonContactJointGetNextContact (contactJoint, contact)) { NewtonMaterial* const material = NewtonContactGetMaterial (contact); NewtonMaterialSetContactFrictionCoef (material, frictionValue + 0.1f, frictionValue, 0); NewtonMaterialSetContactFrictionCoef (material, frictionValue + 0.1f, frictionValue, 1); } }
static void UserContactRestitution (const NewtonJoint* contactJoint, dFloat timestep, int threadIndex) { // call the basic call back GenericContactProcess (contactJoint, timestep, threadIndex); const NewtonBody* const body0 = NewtonJointGetBody0(contactJoint); const NewtonBody* const body1 = NewtonJointGetBody1(contactJoint); //now core 3.14 can have per collision user data const NewtonCollision* const collision0 = NewtonBodyGetCollision(body0); const NewtonCollision* const collision1 = NewtonBodyGetCollision(body1); NewtonCollisionMaterial material0; NewtonCollisionMaterial material1; NewtonCollisionGetMaterial(collision0, &material0); NewtonCollisionGetMaterial(collision1, &material1); dAssert((material0.m_userId == 1) || (material1.m_userId == 1)); dFloat restitution = dMax(material0.m_userParam[0], material1.m_userParam[0]); for (void* contact = NewtonContactJointGetFirstContact (contactJoint); contact; contact = NewtonContactJointGetNextContact (contactJoint, contact)) { NewtonMaterial* const material = NewtonContactGetMaterial (contact); NewtonMaterialSetContactElasticity (material, restitution); } }