* ODE Tweak. See if this helps.

0.6.0-stable
Teravus Ovares 2008-05-01 00:54:21 +00:00
parent 4dfc9bdd0b
commit 1d9c68969e
1 changed files with 23 additions and 71 deletions

View File

@ -377,7 +377,7 @@ namespace OpenSim.Region.Physics.OdePlugin
int count = 0; int count = 0;
try try
{ {
//m_log.Warn(g1.ToString() + "|" + g2.ToString());
// Colliding Geom To Geom // Colliding Geom To Geom
// This portion of the function 'was' blatantly ripped off from BoxStack.cs // This portion of the function 'was' blatantly ripped off from BoxStack.cs
@ -392,10 +392,7 @@ namespace OpenSim.Region.Physics.OdePlugin
lock (contacts) lock (contacts)
{ {
//if (g1 == (IntPtr)0)
//m_log.Info("g1=0");
//if (g2 == (IntPtr)0)
//m_log.Info("g2=0");
count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf); count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf);
} }
@ -435,8 +432,8 @@ namespace OpenSim.Region.Physics.OdePlugin
// We only need to test p2 for 'jump crouch purposes' // We only need to test p2 for 'jump crouch purposes'
p2.IsColliding = true; p2.IsColliding = true;
if ((framecount % m_returncollisions) == 0) //if ((framecount % m_returncollisions) == 0)
collision_accounting_events(p1, p2); //collision_accounting_events(p1, p2);
switch (p1.PhysicsActorType) switch (p1.PhysicsActorType)
@ -903,16 +900,13 @@ namespace OpenSim.Region.Physics.OdePlugin
} }
// If the sim is running slow this frame,
// don't process collision for prim!
//if (timeStep < (m_SkipFramesAtms/3))
//{
lock (_activeprims) lock (_activeprims)
{ {
foreach (OdePrim chr in _activeprims) foreach (OdePrim chr in _activeprims)
{ {
// This if may not need to be there.. it might be skipped anyway.
if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled)) if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled))
{ {
try try
@ -921,6 +915,8 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
if (space != (IntPtr)0 && chr.prim_geom != (IntPtr)0 && chr.m_taintremove == false) if (space != (IntPtr)0 && chr.prim_geom != (IntPtr)0 && chr.m_taintremove == false)
d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback); d.SpaceCollide2(space, chr.prim_geom, IntPtr.Zero, nearCallback);
else
m_log.Debug("[PHYSICS]: unable to collide test active prim against space. The space was zero, the geom was zero or it was in the process of being removed");
} }
} }
@ -928,57 +924,12 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
m_log.Warn("[PHYSICS]: Unable to space collide"); m_log.Warn("[PHYSICS]: Unable to space collide");
} }
//calculateSpaceForGeom(chr.Position)
//foreach (OdePrim ch2 in _prims)
/// should be a separate space -- lots of avatars will be N**2 slow
//{
//if (ch2.IsPhysical && d.BodyIsEnabled(ch2.Body))
//{
// Only test prim that are 0.03 meters away in one direction.
// This should be Optimized!
//if ((Math.Abs(ch2.Position.X - chr.Position.X) < 0.03) || (Math.Abs(ch2.Position.Y - chr.Position.Y) < 0.03) || (Math.Abs(ch2.Position.X - chr.Position.X) < 0.03))
//{
//d.SpaceCollide2(chr.prim_geom, ch2.prim_geom, IntPtr.Zero, nearCallback);
//}
//}
//}
} }
//try
//{
//lock (chr)
//{
//if (LandGeom != (IntPtr)0 && chr.prim_geom != (IntPtr)0)
//d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback);
//}
//}
//catch (AccessViolationException)
// {
//m_log.Warn("[PHYSICS]: Unable to space collide");
//}
} }
} }
#region disabled code
//}
//else
//{
// Everything is going slow, so we're skipping object to object collisions
// At least collide test against the ground.
//foreach (OdePrim chr in _activeprims)
//{
// This if may not need to be there.. it might be skipped anyway.
//if (d.BodyIsEnabled(chr.Body))
//{
// Collide test the prims with the terrain.. since if you don't do this,
// next frame, all of the physical prim in the scene will awaken and explode upwards
//tmpSpace = calculateSpaceForGeom(chr.Position);
//if (tmpSpace != (IntPtr) 0 && d.GeomIsSpace(tmpSpace))
//d.SpaceCollide2(calculateSpaceForGeom(chr.Position), chr.prim_geom, IntPtr.Zero, nearCallback);
//d.SpaceCollide2(LandGeom, chr.prim_geom, IntPtr.Zero, nearCallback);
//}
//}
//}
#endregion
} }
#endregion #endregion
@ -1006,6 +957,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
lock (OdeLock) lock (OdeLock)
{ {
m_log.Debug("[PHYSICS]:ODELOCK");
((OdeCharacter) actor).Destroy(); ((OdeCharacter) actor).Destroy();
_characters.Remove((OdeCharacter) actor); _characters.Remove((OdeCharacter) actor);
} }
@ -1524,16 +1476,16 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
// Process 10 frames if the sim is running normal.. // Process 10 frames if the sim is running normal..
// process 5 frames if the sim is running slow // process 5 frames if the sim is running slow
try //try
{ //{
d.WorldSetQuickStepNumIterations(world, m_physicsiterations); //d.WorldSetQuickStepNumIterations(world, m_physicsiterations);
} //}
catch (StackOverflowException) //catch (StackOverflowException)
{ //{
m_log.Error("[PHYSICS]: The operating system wasn't able to allocate enough memory for the simulation. Restarting the sim."); // m_log.Error("[PHYSICS]: The operating system wasn't able to allocate enough memory for the simulation. Restarting the sim.");
ode.drelease(world); // ode.drelease(world);
base.TriggerPhysicsBasedRestart(); //base.TriggerPhysicsBasedRestart();
} //}
int i = 0; int i = 0;
@ -1602,7 +1554,7 @@ namespace OpenSim.Region.Physics.OdePlugin
d.WorldQuickStep(world, ODE_STEPSIZE); d.WorldQuickStep(world, ODE_STEPSIZE);
d.JointGroupEmpty(contactgroup); d.JointGroupEmpty(contactgroup);
ode.dunlock(world); //ode.dunlock(world);
} }
catch (Exception e) catch (Exception e)
{ {