Allow to remove soft body anchors, using pybullet.removeConstraint (untested).

Usage example:
anchors = []
anchors.append(p.createSoftBodyAnchor(clothId  ,0,-1,-1))
anchors.append(p.createSoftBodyAnchor(clothId ,3,boxId,-1, [0.5,-0.5,0]))
for a in anchors:
  p.removeConstraint(a)
This commit is contained in:
Erwin Coumans 2020-06-04 00:00:19 -07:00
parent 84cb577622
commit e6a0206d47
3 changed files with 55 additions and 1 deletions

View File

@ -310,9 +310,16 @@ struct InteralUserConstraintData
b3UserConstraint m_userConstraintData; b3UserConstraint m_userConstraintData;
int m_sbHandle;
int m_sbNodeIndex;
btScalar m_sbNodeMass;
InteralUserConstraintData() InteralUserConstraintData()
: m_rbConstraint(0), : m_rbConstraint(0),
m_mbConstraint(0) m_mbConstraint(0),
m_sbHandle(-1),
m_sbNodeIndex(-1),
m_sbNodeMass(-1)
{ {
} }
}; };
@ -11226,8 +11233,13 @@ bool PhysicsServerCommandProcessor::processCreateUserConstraintCommand(const str
if (bodyUniqueId<=0) if (bodyUniqueId<=0)
{ {
//fixed anchor (mass = 0) //fixed anchor (mass = 0)
InteralUserConstraintData userConstraintData;
userConstraintData.m_sbHandle = clientCmd.m_userConstraintArguments.m_parentBodyIndex;
userConstraintData.m_sbNodeIndex = nodeIndex;
userConstraintData.m_sbNodeMass = sbodyHandle->m_softBody->getMass(nodeIndex);
sbodyHandle->m_softBody->setMass(nodeIndex,0.0); sbodyHandle->m_softBody->setMass(nodeIndex,0.0);
int uid = m_data->m_userConstraintUIDGenerator++; int uid = m_data->m_userConstraintUIDGenerator++;
m_data->m_userConstraints.insert(uid, userConstraintData);
serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId = uid; serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId = uid;
serverCmd.m_type = CMD_USER_CONSTRAINT_COMPLETED; serverCmd.m_type = CMD_USER_CONSTRAINT_COMPLETED;
} else } else
@ -11278,6 +11290,10 @@ bool PhysicsServerCommandProcessor::processCreateUserConstraintCommand(const str
} }
int uid = m_data->m_userConstraintUIDGenerator++; int uid = m_data->m_userConstraintUIDGenerator++;
serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId = uid; serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId = uid;
InteralUserConstraintData userConstraintData;
userConstraintData.m_sbHandle = clientCmd.m_userConstraintArguments.m_parentBodyIndex;
userConstraintData.m_sbNodeIndex = nodeIndex;
m_data->m_userConstraints.insert(uid, userConstraintData);
serverCmd.m_type = CMD_USER_CONSTRAINT_COMPLETED; serverCmd.m_type = CMD_USER_CONSTRAINT_COMPLETED;
} }
@ -11740,6 +11756,24 @@ bool PhysicsServerCommandProcessor::processCreateUserConstraintCommand(const str
delete userConstraintPtr->m_rbConstraint; delete userConstraintPtr->m_rbConstraint;
m_data->m_userConstraints.remove(userConstraintUidRemove); m_data->m_userConstraints.remove(userConstraintUidRemove);
} }
if (userConstraintPtr->m_sbHandle >= 0)
{
InternalBodyHandle* sbodyHandle = m_data->m_bodyHandles.getHandle(clientCmd.m_userConstraintArguments.m_parentBodyIndex);
if (sbodyHandle)
{
if (sbodyHandle->m_softBody)
{
if (userConstraintPtr->m_sbNodeMass >= 0)
{
sbodyHandle->m_softBody->setMass(userConstraintPtr->m_sbNodeIndex, userConstraintPtr->m_sbNodeMass);
}
else
{
sbodyHandle->m_softBody->removeAnchor(userConstraintPtr->m_sbNodeIndex);
}
}
}
}
serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId = userConstraintUidRemove; serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId = userConstraintUidRemove;
serverCmd.m_type = CMD_REMOVE_USER_CONSTRAINT_COMPLETED; serverCmd.m_type = CMD_REMOVE_USER_CONSTRAINT_COMPLETED;
} }

View File

@ -558,6 +558,25 @@ void btSoftBody::appendDeformableAnchor(int node, btRigidBody* body)
m_deformableAnchors.push_back(c); m_deformableAnchors.push_back(c);
} }
void btSoftBody::removeAnchor(int node)
{
const btSoftBody::Node& n = m_nodes[node];
for (int i = 0; i < m_deformableAnchors.size(); )
{
const DeformableNodeRigidAnchor& c = m_deformableAnchors[i];
if (c.m_node == &n)
{
m_deformableAnchors.removeAtIndex(i);
}
else
{
i++;
}
}
}
// //
void btSoftBody::appendDeformableAnchor(int node, btMultiBodyLinkCollider* link) void btSoftBody::appendDeformableAnchor(int node, btMultiBodyLinkCollider* link)
{ {

View File

@ -927,6 +927,7 @@ public:
void appendAnchor(int node, void appendAnchor(int node,
btRigidBody* body, bool disableCollisionBetweenLinkedBodies = false, btScalar influence = 1); btRigidBody* body, bool disableCollisionBetweenLinkedBodies = false, btScalar influence = 1);
void appendAnchor(int node, btRigidBody* body, const btVector3& localPivot, bool disableCollisionBetweenLinkedBodies = false, btScalar influence = 1); void appendAnchor(int node, btRigidBody* body, const btVector3& localPivot, bool disableCollisionBetweenLinkedBodies = false, btScalar influence = 1);
void removeAnchor(int node);
/* Append linear joint */ /* Append linear joint */
void appendLinearJoint(const LJoint::Specs& specs, Cluster* body0, Body body1); void appendLinearJoint(const LJoint::Specs& specs, Cluster* body0, Body body1);
void appendLinearJoint(const LJoint::Specs& specs, Body body = Body()); void appendLinearJoint(const LJoint::Specs& specs, Body body = Body());