try to make crossings work better. chode no longer prevents crossings i hope
parent
04279e36d1
commit
a758abaa9f
|
@ -1655,35 +1655,38 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
}
|
}
|
||||||
|
|
||||||
// Offset the positions for the new region across the border
|
// Offset the positions for the new region across the border
|
||||||
Vector3 oldGroupPosition = grp.RootPart.GroupPosition;
|
// NOT here
|
||||||
grp.RootPart.GroupPosition = pos;
|
|
||||||
|
|
||||||
// If we fail to cross the border, then reset the position of the scene object on that border.
|
// If we fail to cross the border, then reset the position of the scene object on that border.
|
||||||
uint x = 0, y = 0;
|
uint x = 0, y = 0;
|
||||||
Utils.LongToUInts(newRegionHandle, out x, out y);
|
Utils.LongToUInts(newRegionHandle, out x, out y);
|
||||||
GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
|
GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
|
||||||
|
|
||||||
if (destination == null || !CrossPrimGroupIntoNewRegion(destination, grp, silent))
|
Vector3 oldGroupPosition = grp.RootPart.GroupPosition;
|
||||||
|
|
||||||
|
if (destination != null)
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}",grp.UUID);
|
grp.RootPart.GroupPosition = pos; // only change this if we think there is anywhere to go
|
||||||
|
if (CrossPrimGroupIntoNewRegion(destination, grp, silent))
|
||||||
// Need to turn off the physics flags, otherwise the object will continue to attempt to
|
return; // we did it
|
||||||
// move out of the region creating an infinite loop of failed attempts to cross
|
|
||||||
grp.UpdatePrimFlags(grp.RootPart.LocalId,false,grp.IsTemporary,grp.IsPhantom,false);
|
|
||||||
|
|
||||||
// We are going to move the object back to the old position so long as the old position
|
|
||||||
// is in the region
|
|
||||||
oldGroupPosition.X = Util.Clamp<float>(oldGroupPosition.X,1.0f,(float)Constants.RegionSize-1);
|
|
||||||
oldGroupPosition.Y = Util.Clamp<float>(oldGroupPosition.Y,1.0f,(float)Constants.RegionSize-1);
|
|
||||||
oldGroupPosition.Z = Util.Clamp<float>(oldGroupPosition.Z,1.0f,4096.0f);
|
|
||||||
|
|
||||||
grp.AbsolutePosition = oldGroupPosition;
|
|
||||||
|
|
||||||
grp.ScheduleGroupForFullUpdate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// no one or failed lets go back and tell physics to go on
|
||||||
|
oldGroupPosition.X = Util.Clamp<float>(oldGroupPosition.X, 0.5f, (float)Constants.RegionSize - 0.5f);
|
||||||
|
oldGroupPosition.Y = Util.Clamp<float>(oldGroupPosition.Y, 0.5f, (float)Constants.RegionSize - 0.5f);
|
||||||
|
oldGroupPosition.Z = Util.Clamp<float>(oldGroupPosition.Z, 0.5f, 4096.0f);
|
||||||
|
|
||||||
|
grp.AbsolutePosition = oldGroupPosition;
|
||||||
|
grp.Velocity = Vector3.Zero;
|
||||||
|
|
||||||
|
if (grp.RootPart.PhysActor != null)
|
||||||
|
grp.RootPart.PhysActor.CrossingFailure();
|
||||||
|
|
||||||
|
grp.ScheduleGroupForFullUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Move the given scene object into a new region
|
/// Move the given scene object into a new region
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -461,8 +461,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
if (Scene != null)
|
if (Scene != null)
|
||||||
{
|
{
|
||||||
if ((Scene.TestBorderCross(val - Vector3.UnitX, Cardinals.E) || Scene.TestBorderCross(val + Vector3.UnitX, Cardinals.W)
|
// if ((Scene.TestBorderCross(val - Vector3.UnitX, Cardinals.E) || Scene.TestBorderCross(val + Vector3.UnitX, Cardinals.W)
|
||||||
|| Scene.TestBorderCross(val - Vector3.UnitY, Cardinals.N) || Scene.TestBorderCross(val + Vector3.UnitY, Cardinals.S))
|
// || Scene.TestBorderCross(val - Vector3.UnitY, Cardinals.N) || Scene.TestBorderCross(val + Vector3.UnitY, Cardinals.S))
|
||||||
|
// && !IsAttachmentCheckFull() && (!Scene.LoadingPrims))
|
||||||
|
if ((Scene.TestBorderCross(val, Cardinals.E) || Scene.TestBorderCross(val, Cardinals.W)
|
||||||
|
|| Scene.TestBorderCross(val, Cardinals.N) || Scene.TestBorderCross(val, Cardinals.S))
|
||||||
&& !IsAttachmentCheckFull() && (!Scene.LoadingPrims))
|
&& !IsAttachmentCheckFull() && (!Scene.LoadingPrims))
|
||||||
{
|
{
|
||||||
IEntityTransferModule entityTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>();
|
IEntityTransferModule entityTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>();
|
||||||
|
|
|
@ -2620,9 +2620,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
Vector3 newpos = new Vector3(PhysActor.Position.GetBytes(), 0);
|
Vector3 newpos = new Vector3(PhysActor.Position.GetBytes(), 0);
|
||||||
|
|
||||||
if (ParentGroup.Scene.TestBorderCross(newpos, Cardinals.N)
|
if (ParentGroup.Scene.TestBorderCross(newpos, Cardinals.N)
|
||||||
| ParentGroup.Scene.TestBorderCross(newpos, Cardinals.S)
|
|| ParentGroup.Scene.TestBorderCross(newpos, Cardinals.S)
|
||||||
| ParentGroup.Scene.TestBorderCross(newpos, Cardinals.E)
|
|| ParentGroup.Scene.TestBorderCross(newpos, Cardinals.E)
|
||||||
| ParentGroup.Scene.TestBorderCross(newpos, Cardinals.W))
|
|| ParentGroup.Scene.TestBorderCross(newpos, Cardinals.W))
|
||||||
{
|
{
|
||||||
ParentGroup.AbsolutePosition = newpos;
|
ParentGroup.AbsolutePosition = newpos;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -732,13 +732,13 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public override void CrossingFailure()
|
public override void CrossingFailure()
|
||||||
{
|
{
|
||||||
m_crossingfailures++;
|
int tmp = Interlocked.Increment(ref m_crossingfailures);
|
||||||
if (m_crossingfailures > _parent_scene.geomCrossingFailuresBeforeOutofbounds)
|
if (tmp > _parent_scene.geomCrossingFailuresBeforeOutofbounds)
|
||||||
{
|
{
|
||||||
base.RaiseOutOfBounds(_position);
|
base.RaiseOutOfBounds(_position);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (m_crossingfailures == _parent_scene.geomCrossingFailuresBeforeOutofbounds)
|
else if (tmp == _parent_scene.geomCrossingFailuresBeforeOutofbounds)
|
||||||
{
|
{
|
||||||
m_log.Warn("[PHYSICS]: Too many crossing failures for: " + m_primName);
|
m_log.Warn("[PHYSICS]: Too many crossing failures for: " + m_primName);
|
||||||
}
|
}
|
||||||
|
@ -3042,10 +3042,9 @@ Console.WriteLine("ODEPrim JointCreateFixed !!!");
|
||||||
d.Vector3 torque = d.BodyGetTorque(Body);
|
d.Vector3 torque = d.BodyGetTorque(Body);
|
||||||
_torque = new Vector3(torque.X, torque.Y, torque.Z);
|
_torque = new Vector3(torque.X, torque.Y, torque.Z);
|
||||||
|
|
||||||
base.RequestPhysicsterseUpdate();
|
|
||||||
|
|
||||||
//Console.WriteLine("Move {0} at {1}", m_primName, l_position);
|
//Console.WriteLine("Move {0} at {1}", m_primName, l_position);
|
||||||
|
/*
|
||||||
// Check if outside region
|
// Check if outside region
|
||||||
// In Scene.cs/CrossPrimGroupIntoNewRegion the object is checked for 0.1M from border!
|
// In Scene.cs/CrossPrimGroupIntoNewRegion the object is checked for 0.1M from border!
|
||||||
if (l_position.X > ((float)_parent_scene.WorldExtents.X - fence))
|
if (l_position.X > ((float)_parent_scene.WorldExtents.X - fence))
|
||||||
|
@ -3112,7 +3111,52 @@ Console.WriteLine("ODEPrim JointCreateFixed !!!");
|
||||||
return; // Dont process any other motion?
|
return; // Dont process any other motion?
|
||||||
} // end various methods
|
} // end various methods
|
||||||
} // end outside region horizontally
|
} // end outside region horizontally
|
||||||
|
*/
|
||||||
|
if (_position.X < 0f || _position.X > _parent_scene.WorldExtents.X
|
||||||
|
|| _position.Y < 0f || _position.Y > _parent_scene.WorldExtents.Y
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// we are outside current region
|
||||||
|
// clip position to a stop just outside region and stop it only internally
|
||||||
|
// do it only once using m_crossingfailures as control
|
||||||
|
_position.X = Util.Clip(l_position.X, -0.2f, _parent_scene.WorldExtents.X + .2f);
|
||||||
|
_position.Y = Util.Clip(l_position.Y, -0.2f, _parent_scene.WorldExtents.Y + .2f);
|
||||||
|
_position.Z = Util.Clip(l_position.Z, -100f, 50000f);
|
||||||
|
d.BodySetPosition(Body, _position.X, _position.Y, _position.Z);
|
||||||
|
d.BodySetLinearVel(Body, 0, 0, 0);
|
||||||
|
|
||||||
|
if (Interlocked.Exchange(ref m_crossingfailures, 0) == 0)
|
||||||
|
{ // tell base code only once
|
||||||
|
Interlocked.Increment(ref m_crossingfailures);
|
||||||
|
base.RequestPhysicsterseUpdate();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Interlocked.Exchange(ref m_crossingfailures, 0) > 1)
|
||||||
|
{
|
||||||
|
// main simulator had a crossing failure
|
||||||
|
// park it inside region
|
||||||
|
_position.X = Util.Clip(l_position.X, 0.5f, _parent_scene.WorldExtents.X - 0.5f);
|
||||||
|
_position.Y = Util.Clip(l_position.Y, 0.5f, _parent_scene.WorldExtents.Y - 0.5f);
|
||||||
|
_position.Z = Util.Clip(l_position.Z, -100f, 50000f);
|
||||||
|
d.BodySetPosition(Body, _position.X, _position.Y, _position.Z);
|
||||||
|
|
||||||
|
m_lastposition = _position;
|
||||||
|
|
||||||
|
_velocity = Vector3.Zero;
|
||||||
|
m_lastVelocity = _velocity;
|
||||||
|
|
||||||
|
|
||||||
|
if (m_type != Vehicle.TYPE_NONE)
|
||||||
|
Halt();
|
||||||
|
|
||||||
|
d.BodySetLinearVel(Body, 0, 0, 0);
|
||||||
|
base.RequestPhysicsterseUpdate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
base.RequestPhysicsterseUpdate();
|
||||||
|
|
||||||
if (l_position.Z < 0)
|
if (l_position.Z < 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue