* Fixed the Ghost physical hull on deleting a physical Prim
* Fixed a deadlock when there is an exception in the collision and stepping parts of Simulate.ThreadPoolClientBranch
parent
19e0ada93a
commit
e33a0c5fc0
|
@ -755,74 +755,77 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
prim.disableBody();
|
prim.disableBody();
|
||||||
}
|
}
|
||||||
// we don't want to remove the main space
|
// we don't want to remove the main space
|
||||||
if (prim.m_targetSpace != space && prim.IsPhysical == false)
|
|
||||||
|
// If the geometry is in the targetspace, remove it from the target space
|
||||||
|
//m_log.Warn(prim.m_targetSpace);
|
||||||
|
|
||||||
|
|
||||||
|
if (prim.m_targetSpace != (IntPtr)0)
|
||||||
{
|
{
|
||||||
// If the geometry is in the targetspace, remove it from the target space
|
if (d.SpaceQuery(prim.m_targetSpace, prim.prim_geom))
|
||||||
//m_log.Warn(prim.m_targetSpace);
|
|
||||||
|
|
||||||
|
|
||||||
if (prim.m_targetSpace != (IntPtr)0)
|
|
||||||
{
|
{
|
||||||
if (d.SpaceQuery(prim.m_targetSpace, prim.prim_geom))
|
|
||||||
|
if (d.GeomIsSpace(prim.m_targetSpace))
|
||||||
{
|
{
|
||||||
|
waitForSpaceUnlock(prim.m_targetSpace);
|
||||||
if (d.GeomIsSpace(prim.m_targetSpace))
|
d.SpaceRemove(prim.m_targetSpace, prim.prim_geom);
|
||||||
{
|
prim.m_targetSpace = space;
|
||||||
waitForSpaceUnlock(prim.m_targetSpace);
|
|
||||||
d.SpaceRemove(prim.m_targetSpace, prim.prim_geom);
|
|
||||||
prim.m_targetSpace = space;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" +
|
|
||||||
((OdePrim)prim).m_targetSpace.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
//m_log.Warn(prim.prim_geom);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (prim.prim_geom != (IntPtr)0)
|
|
||||||
{
|
{
|
||||||
d.GeomDestroy(prim.prim_geom);
|
m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" +
|
||||||
prim.prim_geom = (IntPtr)0;
|
((OdePrim)prim).m_targetSpace.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (System.AccessViolationException)
|
|
||||||
{
|
|
||||||
m_log.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed.");
|
|
||||||
}
|
|
||||||
_prims.Remove(prim);
|
|
||||||
|
|
||||||
//If there are no more geometries in the sub-space, we don't need it in the main space anymore
|
|
||||||
//if (d.SpaceGetNumGeoms(prim.m_targetSpace) == 0)
|
|
||||||
//{
|
|
||||||
//if (!(prim.m_targetSpace.Equals(null)))
|
|
||||||
//{
|
|
||||||
//if (d.GeomIsSpace(prim.m_targetSpace))
|
|
||||||
//{
|
|
||||||
//waitForSpaceUnlock(prim.m_targetSpace);
|
|
||||||
//d.SpaceRemove(space, prim.m_targetSpace);
|
|
||||||
// free up memory used by the space.
|
|
||||||
//d.SpaceDestroy(prim.m_targetSpace);
|
|
||||||
//int[] xyspace = calculateSpaceArrayItemFromPos(prim.Position);
|
|
||||||
//resetSpaceArrayItemToZero(xyspace[0], xyspace[1]);
|
|
||||||
//}
|
|
||||||
//else
|
|
||||||
//{
|
|
||||||
//m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" +
|
|
||||||
//((OdePrim) prim).m_targetSpace.ToString());
|
|
||||||
//}
|
|
||||||
//}
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
//m_log.Warn(prim.prim_geom);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (prim.prim_geom != (IntPtr)0)
|
||||||
|
{
|
||||||
|
d.GeomDestroy(prim.prim_geom);
|
||||||
|
prim.prim_geom = (IntPtr)0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.Warn("[PHYSICS]: Unable to remove prim from physics scene");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (System.AccessViolationException)
|
||||||
|
{
|
||||||
|
m_log.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed.");
|
||||||
|
}
|
||||||
|
_prims.Remove(prim);
|
||||||
|
|
||||||
|
//If there are no more geometries in the sub-space, we don't need it in the main space anymore
|
||||||
ode.dunlock(world);
|
//if (d.SpaceGetNumGeoms(prim.m_targetSpace) == 0)
|
||||||
|
//{
|
||||||
|
//if (!(prim.m_targetSpace.Equals(null)))
|
||||||
|
//{
|
||||||
|
//if (d.GeomIsSpace(prim.m_targetSpace))
|
||||||
|
//{
|
||||||
|
//waitForSpaceUnlock(prim.m_targetSpace);
|
||||||
|
//d.SpaceRemove(space, prim.m_targetSpace);
|
||||||
|
// free up memory used by the space.
|
||||||
|
//d.SpaceDestroy(prim.m_targetSpace);
|
||||||
|
//int[] xyspace = calculateSpaceArrayItemFromPos(prim.Position);
|
||||||
|
//resetSpaceArrayItemToZero(xyspace[0], xyspace[1]);
|
||||||
|
//}
|
||||||
|
//else
|
||||||
|
//{
|
||||||
|
//m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" +
|
||||||
|
//((OdePrim) prim).m_targetSpace.ToString());
|
||||||
|
//}
|
||||||
|
//}
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ode.dunlock(world);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -1261,20 +1264,31 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (!ode.lockquery())
|
if (!ode.lockquery())
|
||||||
{
|
{
|
||||||
ode.dlock(world);
|
ode.dlock(world);
|
||||||
foreach (OdeCharacter actor in _characters)
|
try
|
||||||
{
|
{
|
||||||
actor.Move(timeStep);
|
foreach (OdeCharacter actor in _characters)
|
||||||
|
{
|
||||||
|
actor.Move(timeStep);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
collision_optimized(timeStep);
|
||||||
|
|
||||||
|
d.WorldQuickStep(world, ODE_STEPSIZE);
|
||||||
|
|
||||||
|
d.JointGroupEmpty(contactgroup);
|
||||||
|
ode.dunlock(world);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.Error("[PHYSICS]: " + e.Message.ToString() + e.TargetSite.ToString());
|
||||||
|
ode.dunlock(world);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
collision_optimized(timeStep);
|
|
||||||
|
|
||||||
d.WorldQuickStep(world, ODE_STEPSIZE);
|
|
||||||
|
|
||||||
d.JointGroupEmpty(contactgroup);
|
|
||||||
ode.dunlock(world);
|
|
||||||
|
|
||||||
step_time -= ODE_STEPSIZE;
|
step_time -= ODE_STEPSIZE;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue