BulletSim: add ForEachMember(action) call for linkset.

integration
Robert Adams 2012-10-26 13:54:54 -07:00
parent 8fa83cf430
commit 2b75035aef
1 changed files with 28 additions and 8 deletions

View File

@ -167,9 +167,8 @@ public abstract class BSLinkset
bool ret = false; bool ret = false;
lock (m_linksetActivityLock) lock (m_linksetActivityLock)
{ {
if (m_children.Contains(child)) ret = m_children.Contains(child);
ret = true; /* Safer version but the above should work
/*
foreach (BSPhysObject bp in m_children) foreach (BSPhysObject bp in m_children)
{ {
if (child.LocalID == bp.LocalID) if (child.LocalID == bp.LocalID)
@ -183,6 +182,25 @@ public abstract class BSLinkset
return ret; return ret;
} }
// Perform an action on each member of the linkset including root prim.
// The action is performed only on the objects that are physically in the linkset.
// Depends on the action on whether this should be done at taint time.
public delegate bool ForEachMemberAction(BSPhysObject obj);
public virtual bool ForEachMember(ForEachMemberAction action)
{
bool ret = false;
lock (m_linksetActivityLock)
{
action(LinksetRoot);
foreach (BSPhysObject po in m_taintChildren)
{
if (action(po))
break;
}
}
return ret;
}
// When physical properties are changed the linkset needs to recalculate // When physical properties are changed the linkset needs to recalculate
// its internal properties. // its internal properties.
// May be called at runtime or taint-time (just pass the appropriate flag). // May be called at runtime or taint-time (just pass the appropriate flag).
@ -224,13 +242,15 @@ public abstract class BSLinkset
protected virtual float ComputeLinksetMass() protected virtual float ComputeLinksetMass()
{ {
float mass; float mass = LinksetRoot.MassRaw;
lock (m_linksetActivityLock) if (HasAnyChildren)
{ {
mass = LinksetRoot.MassRaw; lock (m_linksetActivityLock)
foreach (BSPhysObject bp in m_taintChildren)
{ {
mass += bp.MassRaw; foreach (BSPhysObject bp in m_children)
{
mass += bp.MassRaw;
}
} }
} }
return mass; return mass;