BGE bug #18883: Softbodies being hit by ghost objects. Added a one liner fix in Bullet. I will also report the fix to Erwin so that it can be added to next Bullet version.

This commit is contained in:
Benoit Bolsee 2012-02-05 13:04:13 +00:00
parent 35c8226d28
commit d8d5bb6b9a

View File

@ -2780,21 +2780,23 @@ void btSoftBody::PSolve_RContacts(btSoftBody* psb, btScalar kst, btScalar ti)
{ {
const RContact& c = psb->m_rcontacts[i]; const RContact& c = psb->m_rcontacts[i];
const sCti& cti = c.m_cti; const sCti& cti = c.m_cti;
btRigidBody* tmpRigid = btRigidBody::upcast(cti.m_colObj);
const btVector3 va = tmpRigid ? tmpRigid->getVelocityInLocalPoint(c.m_c1)*dt : btVector3(0,0,0); if (cti.m_colObj->hasContactResponse()) {
const btVector3 vb = c.m_node->m_x-c.m_node->m_q; btRigidBody* tmpRigid = btRigidBody::upcast(cti.m_colObj);
const btVector3 vr = vb-va; const btVector3 va = tmpRigid ? tmpRigid->getVelocityInLocalPoint(c.m_c1)*dt : btVector3(0,0,0);
const btScalar dn = btDot(vr, cti.m_normal); const btVector3 vb = c.m_node->m_x-c.m_node->m_q;
if(dn<=SIMD_EPSILON) const btVector3 vr = vb-va;
{ const btScalar dn = btDot(vr, cti.m_normal);
const btScalar dp = btMin( (btDot(c.m_node->m_x, cti.m_normal) + cti.m_offset), mrg ); if(dn<=SIMD_EPSILON)
const btVector3 fv = vr - (cti.m_normal * dn); {
// c0 is the impulse matrix, c3 is 1 - the friction coefficient or 0, c4 is the contact hardness coefficient const btScalar dp = btMin( (btDot(c.m_node->m_x, cti.m_normal) + cti.m_offset), mrg );
const btVector3 impulse = c.m_c0 * ( (vr - (fv * c.m_c3) + (cti.m_normal * (dp * c.m_c4))) * kst ); const btVector3 fv = vr - (cti.m_normal * dn);
c.m_node->m_x -= impulse * c.m_c2; // c0 is the impulse matrix, c3 is 1 - the friction coefficient or 0, c4 is the contact hardness coefficient
if (tmpRigid) const btVector3 impulse = c.m_c0 * ( (vr - (fv * c.m_c3) + (cti.m_normal * (dp * c.m_c4))) * kst );
tmpRigid->applyImpulse(impulse,c.m_c1); c.m_node->m_x -= impulse * c.m_c2;
if (tmpRigid)
tmpRigid->applyImpulse(impulse,c.m_c1);
}
} }
} }
} }