BGE bug #18883: Softbodies being hit by ghost objects. Added a one liner fix in...
authorBenoit Bolsee <benoit.bolsee@online.be>
Sun, 5 Feb 2012 13:04:13 +0000 (13:04 +0000)
committerBenoit Bolsee <benoit.bolsee@online.be>
Sun, 5 Feb 2012 13:04:13 +0000 (13:04 +0000)
extern/bullet2/src/BulletSoftBody/btSoftBody.cpp

index a90acb9..0d19fd1 100644 (file)
@@ -2780,21 +2780,23 @@ void btSoftBody::PSolve_RContacts(btSoftBody* psb, btScalar kst, btScalar ti)
        {
                const RContact&         c = psb->m_rcontacts[i];
                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);
-               const btVector3         vb = c.m_node->m_x-c.m_node->m_q;       
-               const btVector3         vr = vb-va;
-               const btScalar          dn = btDot(vr, cti.m_normal);           
-               if(dn<=SIMD_EPSILON)
-               {
-                       const btScalar          dp = btMin( (btDot(c.m_node->m_x, cti.m_normal) + cti.m_offset), mrg );
-                       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 btVector3         impulse = c.m_c0 * ( (vr - (fv * c.m_c3) + (cti.m_normal * (dp * c.m_c4))) * kst );
-                       c.m_node->m_x -= impulse * c.m_c2;
-                       if (tmpRigid)
-                               tmpRigid->applyImpulse(impulse,c.m_c1);
+
+               if (cti.m_colObj->hasContactResponse()) {
+                       btRigidBody* tmpRigid = btRigidBody::upcast(cti.m_colObj);
+                       const btVector3         va = tmpRigid ? tmpRigid->getVelocityInLocalPoint(c.m_c1)*dt : btVector3(0,0,0);
+                       const btVector3         vb = c.m_node->m_x-c.m_node->m_q;       
+                       const btVector3         vr = vb-va;
+                       const btScalar          dn = btDot(vr, cti.m_normal);           
+                       if(dn<=SIMD_EPSILON)
+                       {
+                               const btScalar          dp = btMin( (btDot(c.m_node->m_x, cti.m_normal) + cti.m_offset), mrg );
+                               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 btVector3         impulse = c.m_c0 * ( (vr - (fv * c.m_c3) + (cti.m_normal * (dp * c.m_c4))) * kst );
+                               c.m_node->m_x -= impulse * c.m_c2;
+                               if (tmpRigid)
+                                       tmpRigid->applyImpulse(impulse,c.m_c1);
+                       }
                }
        }
 }