bug fix: crash when too many collisions on a ode step

avinationmerge
UbitUmarov 2013-01-26 06:12:26 +00:00
parent c58ec342ff
commit bfac09849f
1 changed files with 43 additions and 39 deletions

View File

@ -995,63 +995,67 @@ namespace OpenSim.Region.Physics.OdePlugin
d.ContactGeom maxContact = curContact; d.ContactGeom maxContact = curContact;
// if (IgnoreNegSides && curContact.side1 < 0) // if (IgnoreNegSides && curContact.side1 < 0)
// maxContact.depth = float.MinValue; // maxContact.depth = float.MinValue;
d.ContactGeom minContact = curContact; d.ContactGeom minContact = curContact;
// if (IgnoreNegSides && curContact.side1 < 0) // if (IgnoreNegSides && curContact.side1 < 0)
// minContact.depth = float.MaxValue; // minContact.depth = float.MaxValue;
IntPtr Joint; IntPtr Joint;
bool FeetCollision = false; bool FeetCollision = false;
int ncontacts = 0; int ncontacts = 0;
int i = 0; int i = 0;
while (true) while (true)
{ {
if (m_global_contactcount >= maxContactsbeforedeath)
break;
// if (!(IgnoreNegSides && curContact.side1 < 0)) // if (!(IgnoreNegSides && curContact.side1 < 0))
{
bool noskip = true;
if (dop1ava)
{ {
bool noskip = true; if (!(((OdeCharacter)p1).Collide(g1, false, ref curContact, ref FeetCollision)))
if (dop1ava)
{
if (!(((OdeCharacter)p1).Collide(g1,false, ref curContact, ref FeetCollision)))
noskip = false; noskip = false;
} }
else if (dop2ava) else if (dop2ava)
{ {
if (!(((OdeCharacter)p2).Collide(g2,true, ref curContact, ref FeetCollision))) if (!(((OdeCharacter)p2).Collide(g2, true, ref curContact, ref FeetCollision)))
noskip = false; noskip = false;
}
if (noskip)
{
m_global_contactcount++;
ncontacts++;
Joint = CreateContacJoint(ref curContact, mu, bounce, cfm, erpscale, dscale);
d.JointAttach(Joint, b1, b2);
if (curContact.depth > maxContact.depth)
maxContact = curContact;
if (curContact.depth < minContact.depth)
minContact = curContact;
}
} }
if (++i >= count) if (noskip)
break; {
m_global_contactcount++;
if (m_global_contactcount >= maxContactsbeforedeath)
break;
if (!GetCurContactGeom(i, ref curContact)) ncontacts++;
break;
Joint = CreateContacJoint(ref curContact, mu, bounce, cfm, erpscale, dscale);
if (Joint == IntPtr.Zero)
break;
d.JointAttach(Joint, b1, b2);
if (curContact.depth > maxContact.depth)
maxContact = curContact;
if (curContact.depth < minContact.depth)
minContact = curContact;
}
} }
if (++i >= count)
break;
if (!GetCurContactGeom(i, ref curContact))
break;
}
if (ncontacts > 0) if (ncontacts > 0)
{ {
ContactPoint maxDepthContact = new ContactPoint( ContactPoint maxDepthContact = new ContactPoint(