Last (hopefully) soft body fixes:
Enable soft body collision clusters by default. Add option to 'disable collision' button between soft body and rigid body connected by constraint (option was already available between two rigid bodies)
This commit is contained in:
10
extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
vendored
10
extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
vendored
@@ -306,8 +306,16 @@ void btSoftBody::appendFace(int node0,int node1,int node2,Material* mat)
|
||||
}
|
||||
|
||||
//
|
||||
void btSoftBody::appendAnchor(int node,btRigidBody* body)
|
||||
void btSoftBody::appendAnchor(int node,btRigidBody* body,bool disableCollisionWithBody=false)
|
||||
{
|
||||
if (disableCollisionWithBody)
|
||||
{
|
||||
if (m_collisionDisabledObjects.findLinearSearch(body)==m_collisionDisabledObjects.size())
|
||||
{
|
||||
m_collisionDisabledObjects.push_back(body);
|
||||
}
|
||||
}
|
||||
|
||||
Anchor a;
|
||||
a.m_node = &m_nodes[node];
|
||||
a.m_body = body;
|
||||
|
||||
@@ -49,6 +49,8 @@ struct btSoftBodyWorldInfo
|
||||
class btSoftBody : public btCollisionObject
|
||||
{
|
||||
public:
|
||||
btAlignedObjectArray<class btCollisionObject*> m_collisionDisabledObjects;
|
||||
|
||||
//
|
||||
// Enumerations
|
||||
//
|
||||
@@ -667,7 +669,7 @@ public:
|
||||
Material* mat=0);
|
||||
/* Append anchor */
|
||||
void appendAnchor( int node,
|
||||
btRigidBody* body);
|
||||
btRigidBody* body,bool disableCollision);
|
||||
/* Append linear joint */
|
||||
void appendLinearJoint(const LJoint::Specs& specs,Cluster* body0,Body body1);
|
||||
void appendLinearJoint(const LJoint::Specs& specs,Body body=Body());
|
||||
|
||||
@@ -59,7 +59,10 @@ void btSoftRigidCollisionAlgorithm::processCollision (btCollisionObject* body0,b
|
||||
btSoftBody* softBody = m_isSwapped? (btSoftBody*)body1 : (btSoftBody*)body0;
|
||||
btCollisionObject* rigidCollisionObject = m_isSwapped? body0 : body1;
|
||||
|
||||
softBody->defaultCollisionHandler(rigidCollisionObject);
|
||||
if (softBody->m_collisionDisabledObjects.findLinearSearch(rigidCollisionObject)==softBody->m_collisionDisabledObjects.size())
|
||||
{
|
||||
softBody->defaultCollisionHandler(rigidCollisionObject);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -78,6 +78,7 @@ BulletSoftBody *bsbNew(void)
|
||||
|
||||
bsb->kSHR = 1.0f;
|
||||
bsb->kAHR = 0.7f;
|
||||
|
||||
bsb->collisionflags = 0;
|
||||
//bsb->collisionflags = OB_BSB_COL_CL_RS + OB_BSB_COL_CL_SS;
|
||||
bsb->numclusteriterations = 64;
|
||||
|
||||
@@ -1581,7 +1581,7 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
|
||||
{
|
||||
if (rb1)
|
||||
{
|
||||
sb0->appendAnchor(node,rb1);
|
||||
sb0->appendAnchor(node,rb1,disableCollisionBetweenLinkedBodies);
|
||||
} else
|
||||
{
|
||||
sb0->setMass(node,0.f);
|
||||
@@ -1643,7 +1643,7 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
|
||||
{
|
||||
if (rb0)
|
||||
{
|
||||
sb1->appendAnchor(node,rb0);
|
||||
sb1->appendAnchor(node,rb0,disableCollisionBetweenLinkedBodies);
|
||||
} else
|
||||
{
|
||||
sb1->setMass(node,0.f);
|
||||
|
||||
Reference in New Issue
Block a user