void tContact::_newtonContactProcess(const NewtonJoint * contactJoint, dFloat timeStep, int threadIndex) { Vec3 contactPosit, contactNormal; float contactBestSpeed = 0.5f; tContact * mtl = NULL; const NewtonBody * body0 = NewtonJointGetBody0(contactJoint); void * contact = NewtonContactJointGetFirstContact (contactJoint); while (contact) { float contactNormalSpeed; NewtonMaterial * material; // get the material for this contact; material = NewtonContactGetMaterial (contact); contactNormalSpeed = NewtonMaterialGetContactNormalSpeed (material); if (contactNormalSpeed > contactBestSpeed){ contactBestSpeed = contactNormalSpeed; contactBestSpeed = contactNormalSpeed; NewtonMaterialGetContactPositionAndNormal(material, &contactPosit.x, &contactNormal[0]); mtl = (tContact *)NewtonMaterialGetMaterialPairUserData(material); } contact = NewtonContactJointGetNextContact (contactJoint, contact); } if (mtl) mtl->OnContactProcess(&contactPosit, &contactNormal); }
void _CDECL ContactCallback::contactEnd( const NewtonMaterial* material ) { ContactCallback* me; me = (ContactCallback*)NewtonMaterialGetMaterialPairUserData( material ); me->m_material = (NewtonMaterial*)material; me->userEnd(); }
int _CDECL MaterialPair::collisionCallback_onAABBOverlap( const NewtonMaterial* material, const NewtonBody* newtonBody0, const NewtonBody* newtonBody1, int threadIndex ) { MaterialPair* me; me = (MaterialPair*)NewtonMaterialGetMaterialPairUserData( material ); Body* body0 = (OgreNewt::Body*)NewtonBodyGetUserData( newtonBody0 ); Body* body1 = (OgreNewt::Body*)NewtonBodyGetUserData( newtonBody1 ); return me->m_contactcallback->onAABBOverlap( body0, body1, threadIndex ); }
int PhysWorld3D::OnAABBOverlap(const NewtonMaterial* const material, const NewtonBody* const body0, const NewtonBody* const body1, int threadIndex) { RigidBody3D* bodyA = static_cast<RigidBody3D*>(NewtonBodyGetUserData(body0)); RigidBody3D* bodyB = static_cast<RigidBody3D*>(NewtonBodyGetUserData(body1)); assert(bodyA && bodyB); Callback* callbackData = static_cast<Callback*>(NewtonMaterialGetMaterialPairUserData(material)); assert(callbackData); assert(callbackData->aabbOverlapCallback); return callbackData->aabbOverlapCallback(*bodyA, *bodyB); }
int _CDECL ContactCallback::contactProcess( const NewtonMaterial* material, const NewtonContact* contact ) { ContactCallback *me; me = (ContactCallback*)NewtonMaterialGetMaterialPairUserData( material ); me->m_material = (NewtonMaterial*)material; me->m_contact = (NewtonContact*)contact; // call the user-defined callback function! return me->userProcess(); }
int _CDECL ContactCallback::contactBegin( const NewtonMaterial* material, const NewtonBody* body0, const NewtonBody* body1 ) { ContactCallback* me; me = (ContactCallback*)NewtonMaterialGetMaterialPairUserData( material ); me->m_material = (NewtonMaterial*)material; //save the bodies... me->m_body0 = (OgreNewt::Body*)NewtonBodyGetUserData( body0 ); me->m_body1 = (OgreNewt::Body*)NewtonBodyGetUserData( body1 ); return me->userBegin(); }
// this callback is called when the two aabb boxes of the colliding objects overlap int Physics::genericContactBegin( const NewtonMaterial* p_material, const NewtonBody* p_body0, const NewtonBody* p_body1 ) { // get the pointer to collision struture s_colStruct = ( CollisionStruct* )NewtonMaterialGetMaterialPairUserData( p_material ); // save the colliding bodies s_colStruct->_p_body0 = const_cast< NewtonBody* >( p_body0 ); s_colStruct->_p_body1 = const_cast< NewtonBody* >( p_body1 ); // clear the contact normal speed s_colStruct->_contactMaxNormalSpeed = 0.0f; // clear the contact sliding speed s_colStruct->_contactMaxTangentSpeed = 0.0f; // return one to tell Newton the application wants to proccess this contact return 1; }
int entityContactBegin( const NewtonMaterial* p_material, const NewtonBody* p_body0, const NewtonBody* p_body1 ) { // get the pointer to collision struture s_entityColStruct = static_cast< yaf3d::CollisionStruct* >( NewtonMaterialGetMaterialPairUserData( p_material ) ); // save the colliding bodies s_entityColStruct->_p_body0 = const_cast< NewtonBody* >( p_body0 ); s_entityColStruct->_p_body1 = const_cast< NewtonBody* >( p_body1 ); // clear the contact normal speed s_entityColStruct->_contactMaxNormalSpeed = 0.0f; // clear the contact sliding speed s_entityColStruct->_contactMaxTangentSpeed = 0.0f; // set also Physics' col struct as we may need some useful Physics' callbacks during contanct processing // see implementation of "entityContactProcessLevel" yaf3d::Physics::setCollisionStruct( s_entityColStruct ); return 1; }
static void GenericContactProcess (const NewtonJoint* contactJoint, dFloat timestep, int threadIndex) { dFloat contactBestSpeed; dVector contactPosit; SoundEffect* bestSound; bestSound = NULL; contactBestSpeed = 0.5f; NewtonBody* const body0 = NewtonJointGetBody0(contactJoint); for (void* contact = NewtonContactJointGetFirstContact (contactJoint); contact; contact = NewtonContactJointGetNextContact (contactJoint, contact)) { dFloat contactNormalSpeed; NewtonMaterial* material; // get the material for this contact; material = NewtonContactGetMaterial (contact); contactNormalSpeed = NewtonMaterialGetContactNormalSpeed (material); if (contactNormalSpeed > contactBestSpeed){ dVector normal; contactBestSpeed = contactNormalSpeed; NewtonMaterialGetContactPositionAndNormal (material, body0, &contactPosit[0], &normal[0]); bestSound = (SoundEffect *)NewtonMaterialGetMaterialPairUserData (material); } } // now that we found we can play then if (bestSound) { // calculate the volume; dFloat volume; dFloat dist2; dVector eyePoint (GetCameraEyePoint() - contactPosit); dist2 = eyePoint % eyePoint; if (dist2 < (MAX_SOUND_DISTANCE * MAX_SOUND_DISTANCE)) { volume = 1.0f; if (dist2 > (MIN_SOUND_DISTANCE * MIN_SOUND_DISTANCE)) { volume = 1.0f - (dSqrt (dist2) - MIN_SOUND_DISTANCE) / (MAX_SOUND_DISTANCE - MIN_SOUND_DISTANCE); } bestSound->m_manager->Play(bestSound->m_sound, volume, 0); } } }
void PhysWorld3D::ProcessContact(const NewtonJoint* const contactJoint, float timestep, int threadIndex) { RigidBody3D* bodyA = static_cast<RigidBody3D*>(NewtonBodyGetUserData(NewtonJointGetBody0(contactJoint))); RigidBody3D* bodyB = static_cast<RigidBody3D*>(NewtonBodyGetUserData(NewtonJointGetBody1(contactJoint))); assert(bodyA && bodyB); using ContactJoint = void*; // Query all joints first, to prevent removing a joint from the list while iterating on it StackVector<ContactJoint> contacts = NazaraStackVector(ContactJoint, NewtonContactJointGetContactCount(contactJoint)); for (ContactJoint contact = NewtonContactJointGetFirstContact(contactJoint); contact; contact = NewtonContactJointGetNextContact(contactJoint, contact)) contacts.push_back(contact); for (ContactJoint contact : contacts) { NewtonMaterial* material = NewtonContactGetMaterial(contact); Callback* callbackData = static_cast<Callback*>(NewtonMaterialGetMaterialPairUserData(material)); assert(callbackData); assert(callbackData->collisionCallback); if (!callbackData->collisionCallback(*bodyA, *bodyB)) NewtonContactJointRemoveContact(contactJoint, contact); } }
void GenericContactProcess (const NewtonJoint* contactJoint, dFloat timestep, int threadIndex) { #if 0 dFloat speed0; dFloat speed1; SpecialEffectStruct* currectEffect; // get the pointer to the special effect structure currectEffect = (SpecialEffectStruct *)NewtonMaterialGetMaterialPairUserData (material); // save the contact information NewtonMaterialGetContactPositionAndNormal (material, &currectEffect->m_position.m_x, &currectEffect->m_normal.m_x); NewtonMaterialGetContactTangentDirections (material, &currectEffect->m_tangentDir0.m_x, &currectEffect->m_tangentDir1.m_x); // Get the maximum normal speed of this impact. this can be used for positioning collision sound speed0 = NewtonMaterialGetContactNormalSpeed (material); if (speed0 > currectEffect->m_contactMaxNormalSpeed) { // save the position of the contact (for 3d sound of particles effects) currectEffect->m_contactMaxNormalSpeed = speed0; } // get the maximum of the two sliding contact speed speed0 = NewtonMaterialGetContactTangentSpeed (material, 0); speed1 = NewtonMaterialGetContactTangentSpeed (material, 1); if (speed1 > speed0) { speed0 = speed1; } // Get the maximum tangent speed of this contact. this can be used for particles(sparks) of playing scratch sounds if (speed0 > currectEffect->m_contactMaxTangentSpeed) { // save the position of the contact (for 3d sound of particles effects) currectEffect->m_contactMaxTangentSpeed = speed0; } #endif // read the table direction // dVector dir (tableDir); // dVector updir (TableDir); // NewtonBody* const body = NewtonJointGetBody0(contactJoint); // for (void* contact = NewtonContactJointGetFirstContact (contactJoint); contact; contact = NewtonContactJointGetNextContact (contactJoint, contact)) { // dFloat speed; // dVector point; // dVector normal; // dVector dir0; // dVector dir1; // dVector force; // NewtonMaterial* material; // // material = NewtonContactGetMaterial (contact); // NewtonMaterialGetContactPositionAndNormal (material, body, &point.m_x, &normal.m_x); // // // if the normal is vertical is large the say 40 degrees // if (fabsf (normal % upDir) > 0.7f) { // // rotate the normal to be aligned with the table direction // NewtonMaterialContactRotateTangentDirections (material, dir); // } // } NewtonBody* const body = NewtonJointGetBody0(contactJoint); for (void* contact = NewtonContactJointGetFirstContact (contactJoint); contact; contact = NewtonContactJointGetNextContact (contactJoint, contact)) { dVector point; dVector normal; dVector dir0; dVector dir1; dVector force; NewtonMaterial* const material = NewtonContactGetMaterial (contact); NewtonMaterialGetContactForce (material, body, &force.m_x); NewtonMaterialGetContactPositionAndNormal (material, body, &point.m_x, &normal.m_x); NewtonMaterialGetContactTangentDirections (material, body, &dir0.m_x, &dir1.m_x); //dFloat speed = NewtonMaterialGetContactNormalSpeed(material); //speed = NewtonMaterialGetContactNormalSpeed(material); // play sound base of the contact speed. // } }
void GenericContactProcessCompatible(const void* const newtonContactJoint, float64 timestep, int threadIndex) { con_assert(newtonContactJoint != nullptr, "zero pointer") NewtonBody* body0 = NewtonJointGetBody0(static_cast<const NewtonJoint*>(newtonContactJoint)); NewtonBody* body1 = NewtonJointGetBody1(static_cast<const NewtonJoint*>(newtonContactJoint)); con_assert(body0 != nullptr && body1 != nullptr, "zero pointers") if (body0 != nullptr && body1 != nullptr) { iPhysicsBody* physicsBody0 = static_cast<iPhysicsBody*>(NewtonBodyGetUserData(static_cast<const NewtonBody*>(body0))); iPhysicsBody* physicsBody1 = static_cast<iPhysicsBody*>(NewtonBodyGetUserData(static_cast<const NewtonBody*>(body1))); con_assert(physicsBody0 != nullptr && physicsBody1 != nullptr, "zero pointers"); void* contact = NewtonContactJointGetFirstContact(static_cast<const NewtonJoint*>(newtonContactJoint)); NewtonMaterial* materialCombo = NewtonContactGetMaterial(contact); iPhysicsMaterialCombo* physicsMaterialCombo = static_cast<iPhysicsMaterialCombo*>(NewtonMaterialGetMaterialPairUserData(materialCombo)); if (physicsMaterialCombo != nullptr && physicsBody0 != nullptr && physicsBody1 != nullptr) { physicsMaterialCombo->contact(physicsBody0, physicsBody1); } } }