Implemented callbacks to customize combining algorithm of Friction, Restitution, etc..
This commit is contained in:
@@ -22,7 +22,12 @@ subject to the following restrictions:
|
|||||||
///This is to allow MaterialCombiner/Custom Friction/Restitution values
|
///This is to allow MaterialCombiner/Custom Friction/Restitution values
|
||||||
ContactAddedCallback gContactAddedCallback=0;
|
ContactAddedCallback gContactAddedCallback=0;
|
||||||
|
|
||||||
|
CalculateCombinedCallback gCalculateCombinedRestitutionCallback = &btManifoldResult::calculateCombinedRestitution;
|
||||||
|
CalculateCombinedCallback gCalculateCombinedFrictionCallback = &btManifoldResult::calculateCombinedFriction;
|
||||||
|
CalculateCombinedCallback gCalculateCombinedRollingFrictionCallback = &btManifoldResult::calculateCombinedRollingFriction;
|
||||||
|
CalculateCombinedCallback gCalculateCombinedSpinningFrictionCallback = &btManifoldResult::calculateCombinedSpinningFriction;
|
||||||
|
CalculateCombinedCallback gCalculateCombinedContactDampingCallback = &btManifoldResult::calculateCombinedContactDamping;
|
||||||
|
CalculateCombinedCallback gCalculateCombinedContactStiffnessCallback = &btManifoldResult::calculateCombinedContactStiffness;
|
||||||
|
|
||||||
btScalar btManifoldResult::calculateCombinedRollingFriction(const btCollisionObject* body0,const btCollisionObject* body1)
|
btScalar btManifoldResult::calculateCombinedRollingFriction(const btCollisionObject* body0,const btCollisionObject* body1)
|
||||||
{
|
{
|
||||||
@@ -134,16 +139,16 @@ void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const b
|
|||||||
|
|
||||||
int insertIndex = m_manifoldPtr->getCacheEntry(newPt);
|
int insertIndex = m_manifoldPtr->getCacheEntry(newPt);
|
||||||
|
|
||||||
newPt.m_combinedFriction = calculateCombinedFriction(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
newPt.m_combinedFriction = gCalculateCombinedFrictionCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
||||||
newPt.m_combinedRestitution = calculateCombinedRestitution(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
newPt.m_combinedRestitution = gCalculateCombinedRestitutionCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
||||||
newPt.m_combinedRollingFriction = calculateCombinedRollingFriction(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
newPt.m_combinedRollingFriction = gCalculateCombinedRollingFrictionCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
||||||
newPt.m_combinedSpinningFriction = calculateCombinedSpinningFriction(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
newPt.m_combinedSpinningFriction = gCalculateCombinedSpinningFrictionCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
||||||
|
|
||||||
if ( (m_body0Wrap->getCollisionObject()->getCollisionFlags()& btCollisionObject::CF_HAS_CONTACT_STIFFNESS_DAMPING) ||
|
if ( (m_body0Wrap->getCollisionObject()->getCollisionFlags()& btCollisionObject::CF_HAS_CONTACT_STIFFNESS_DAMPING) ||
|
||||||
(m_body1Wrap->getCollisionObject()->getCollisionFlags()& btCollisionObject::CF_HAS_CONTACT_STIFFNESS_DAMPING))
|
(m_body1Wrap->getCollisionObject()->getCollisionFlags()& btCollisionObject::CF_HAS_CONTACT_STIFFNESS_DAMPING))
|
||||||
{
|
{
|
||||||
newPt.m_combinedContactDamping1 = calculateCombinedContactDamping(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
newPt.m_combinedContactDamping1 = gCalculateCombinedContactDampingCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
||||||
newPt.m_combinedContactStiffness1 = calculateCombinedContactStiffness(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
newPt.m_combinedContactStiffness1 = gCalculateCombinedContactStiffnessCallback(m_body0Wrap->getCollisionObject(),m_body1Wrap->getCollisionObject());
|
||||||
newPt.m_contactPointFlags |= BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING;
|
newPt.m_contactPointFlags |= BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,15 @@ extern ContactAddedCallback gContactAddedCallback;
|
|||||||
|
|
||||||
//#define DEBUG_PART_INDEX 1
|
//#define DEBUG_PART_INDEX 1
|
||||||
|
|
||||||
|
/// These callbacks are used to customize the algorith that combine restitution, friction, damping, Stiffness
|
||||||
|
typedef btScalar (*CalculateCombinedCallback)(const btCollisionObject* body0,const btCollisionObject* body1);
|
||||||
|
|
||||||
|
extern CalculateCombinedCallback gCalculateCombinedRestitutionCallback;
|
||||||
|
extern CalculateCombinedCallback gCalculateCombinedFrictionCallback;
|
||||||
|
extern CalculateCombinedCallback gCalculateCombinedRollingFrictionCallback;
|
||||||
|
extern CalculateCombinedCallback gCalculateCombinedSpinningFrictionCallback;
|
||||||
|
extern CalculateCombinedCallback gCalculateCombinedContactDampingCallback;
|
||||||
|
extern CalculateCombinedCallback gCalculateCombinedContactStiffnessCallback;
|
||||||
|
|
||||||
///btManifoldResult is a helper class to manage contact results.
|
///btManifoldResult is a helper class to manage contact results.
|
||||||
class btManifoldResult : public btDiscreteCollisionDetectorInterface::Result
|
class btManifoldResult : public btDiscreteCollisionDetectorInterface::Result
|
||||||
|
|||||||
@@ -952,7 +952,7 @@ void btDiscreteDynamicsWorld::createPredictiveContactsInternal( btRigidBody** bo
|
|||||||
int index = manifold->addManifoldPoint(newPoint, isPredictive);
|
int index = manifold->addManifoldPoint(newPoint, isPredictive);
|
||||||
btManifoldPoint& pt = manifold->getContactPoint(index);
|
btManifoldPoint& pt = manifold->getContactPoint(index);
|
||||||
pt.m_combinedRestitution = 0;
|
pt.m_combinedRestitution = 0;
|
||||||
pt.m_combinedFriction = btManifoldResult::calculateCombinedFriction(body,sweepResults.m_hitCollisionObject);
|
pt.m_combinedFriction = gCalculateCombinedFrictionCallback(body,sweepResults.m_hitCollisionObject);
|
||||||
pt.m_positionWorldOnA = body->getWorldTransform().getOrigin();
|
pt.m_positionWorldOnA = body->getWorldTransform().getOrigin();
|
||||||
pt.m_positionWorldOnB = worldPointB;
|
pt.m_positionWorldOnB = worldPointB;
|
||||||
|
|
||||||
@@ -1113,7 +1113,7 @@ void btDiscreteDynamicsWorld::integrateTransforms(btScalar timeStep)
|
|||||||
for (int p=0;p<manifold->getNumContacts();p++)
|
for (int p=0;p<manifold->getNumContacts();p++)
|
||||||
{
|
{
|
||||||
const btManifoldPoint& pt = manifold->getContactPoint(p);
|
const btManifoldPoint& pt = manifold->getContactPoint(p);
|
||||||
btScalar combinedRestitution = btManifoldResult::calculateCombinedRestitution(body0, body1);
|
btScalar combinedRestitution = gCalculateCombinedRestitutionCallback(body0, body1);
|
||||||
|
|
||||||
if (combinedRestitution>0 && pt.m_appliedImpulse != 0.f)
|
if (combinedRestitution>0 && pt.m_appliedImpulse != 0.f)
|
||||||
//if (pt.getDistance()>0 && combinedRestitution>0 && pt.m_appliedImpulse != 0.f)
|
//if (pt.getDistance()>0 && combinedRestitution>0 && pt.m_appliedImpulse != 0.f)
|
||||||
|
|||||||
Reference in New Issue
Block a user