* Fix for a potential race condition in ScenePresence.AbsolutePosition
* Unified the way region handles are stored and used in ScenePresence * Fixed camera position for child agents * CheckForSignificantMovement now checks avatar and camera position (both are important for scene prioritization) * Removing debug code from the previous commit0.6.8-post-fixes
parent
7965b6eb61
commit
8a73dc0f8a
|
@ -4952,8 +4952,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
/// <param name="throttlePacketType">Throttling category for the packet</param>
|
||||
protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType)
|
||||
{
|
||||
if (ChildAgentStatus())
|
||||
Thread.Sleep(200);
|
||||
m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, true);
|
||||
}
|
||||
|
||||
|
|
|
@ -79,6 +79,15 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
|
||||
private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
|
||||
private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
|
||||
/// <summary>
|
||||
/// Experimentally determined "fudge factor" to make sit-target positions
|
||||
/// the same as in SecondLife. Fudge factor was tested for 36 different
|
||||
/// test cases including prims of type box, sphere, cylinder, and torus,
|
||||
/// with varying parameters for sit target location, prim size, prim
|
||||
/// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
|
||||
/// issue #1716
|
||||
/// </summary>
|
||||
private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
|
||||
|
||||
public UUID currentParcelUUID = UUID.Zero;
|
||||
|
||||
|
@ -115,18 +124,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
private float m_sitAvatarHeight = 2.0f;
|
||||
|
||||
// experimentally determined "fudge factor" to make sit-target positions
|
||||
// the same as in SecondLife. Fudge factor was tested for 36 different
|
||||
// test cases including prims of type box, sphere, cylinder, and torus,
|
||||
// with varying parameters for sit target location, prim size, prim
|
||||
// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
|
||||
// issue #1716
|
||||
private static readonly Vector3 m_sitTargetCorrectionOffset = new Vector3(0.1f, 0.0f, 0.3f);
|
||||
private float m_godlevel;
|
||||
|
||||
private bool m_invulnerable = true;
|
||||
|
||||
private Vector3 m_LastChildAgentUpdatePosition;
|
||||
private Vector3 m_lastChildAgentUpdatePosition;
|
||||
private Vector3 m_lastChildAgentUpdateCamPosition;
|
||||
|
||||
private int m_perfMonMS;
|
||||
|
||||
|
@ -271,11 +274,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
get { return m_godlevel; }
|
||||
}
|
||||
|
||||
private readonly ulong m_regionHandle;
|
||||
|
||||
public ulong RegionHandle
|
||||
{
|
||||
get { return m_regionHandle; }
|
||||
get { return m_rootRegionHandle; }
|
||||
}
|
||||
|
||||
public Vector3 CameraPosition
|
||||
|
@ -414,31 +415,27 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Absolute position of this avatar in 'region cordinates'
|
||||
/// Position of this avatar relative to the region the avatar is in
|
||||
/// </summary>
|
||||
public override Vector3 AbsolutePosition
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_physicsActor != null)
|
||||
{
|
||||
m_pos.X = m_physicsActor.Position.X;
|
||||
m_pos.Y = m_physicsActor.Position.Y;
|
||||
m_pos.Z = m_physicsActor.Position.Z;
|
||||
}
|
||||
PhysicsActor actor = m_physicsActor;
|
||||
if (actor != null)
|
||||
m_pos = actor.Position;
|
||||
|
||||
return m_parentPosition + m_pos;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (m_physicsActor != null)
|
||||
PhysicsActor actor = m_physicsActor;
|
||||
if (actor != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
lock (m_scene.SyncRoot)
|
||||
{
|
||||
m_physicsActor.Position = value;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -466,8 +463,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
set
|
||||
{
|
||||
//m_log.DebugFormat("In {0} setting velocity of {1} to {2}", m_scene.RegionInfo.RegionName, Name, value);
|
||||
|
||||
PhysicsActor actor = m_physicsActor;
|
||||
if (actor != null)
|
||||
{
|
||||
|
@ -626,7 +621,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
|
||||
CreateSceneViewer();
|
||||
m_regionHandle = reginfo.RegionHandle;
|
||||
m_rootRegionHandle = reginfo.RegionHandle;
|
||||
m_controllingClient = client;
|
||||
m_firstname = m_controllingClient.FirstName;
|
||||
m_lastname = m_controllingClient.LastName;
|
||||
|
@ -780,6 +775,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (gm != null)
|
||||
m_grouptitle = gm.GetGroupTitle(m_uuid);
|
||||
|
||||
m_rootRegionHandle = m_scene.RegionInfo.RegionHandle;
|
||||
|
||||
m_scene.SetRootAgentScene(m_uuid);
|
||||
|
||||
// Moved this from SendInitialData to ensure that m_appearance is initialized
|
||||
|
@ -810,7 +807,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
pos = emergencyPos;
|
||||
}
|
||||
|
||||
|
||||
float localAVHeight = 1.56f;
|
||||
if (m_avHeight != 127.0f)
|
||||
{
|
||||
|
@ -905,6 +901,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_isChildAgent = true;
|
||||
m_scene.SwapRootAgentCount(true);
|
||||
RemoveFromPhysicalScene();
|
||||
|
||||
// FIXME: Set m_rootRegionHandle to the region handle of the scene this agent is moving into
|
||||
|
||||
m_scene.EventManager.TriggerOnMakeChildAgent(this);
|
||||
}
|
||||
|
@ -1823,7 +1821,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//Quaternion result = (sitTargetOrient * vq) * nq;
|
||||
|
||||
m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
|
||||
m_pos += m_sitTargetCorrectionOffset;
|
||||
m_pos += SIT_TARGET_ADJUSTMENT;
|
||||
m_bodyRot = sitTargetOrient;
|
||||
//Rotation = sitTargetOrient;
|
||||
m_parentPosition = part.AbsolutePosition;
|
||||
|
@ -2374,7 +2372,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
//m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
|
||||
|
||||
remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
|
||||
remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
|
||||
pos, velocity, Vector3.Zero, m_bodyRot, CollisionPlane, m_uuid, null, GetUpdatePriority(remoteClient)));
|
||||
|
||||
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
|
||||
|
@ -2739,7 +2737,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
// Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
|
||||
if (Util.GetDistanceTo(AbsolutePosition, m_LastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance)
|
||||
if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance ||
|
||||
Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
|
||||
{
|
||||
ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
|
||||
cadu.ActiveGroupID = UUID.Zero.Guid;
|
||||
|
@ -2753,7 +2752,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
cadu.godlevel = m_godlevel;
|
||||
cadu.GroupAccess = 0;
|
||||
cadu.Position = new sLLVector3(AbsolutePosition);
|
||||
cadu.regionHandle = m_scene.RegionInfo.RegionHandle;
|
||||
cadu.regionHandle = m_rootRegionHandle;
|
||||
float multiplier = 1;
|
||||
int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
|
||||
if (innacurateNeighbors != 0)
|
||||
|
@ -2774,7 +2773,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
m_scene.SendOutChildAgentUpdates(agentpos, this);
|
||||
|
||||
m_LastChildAgentUpdatePosition = AbsolutePosition;
|
||||
m_lastChildAgentUpdatePosition = AbsolutePosition;
|
||||
m_lastChildAgentUpdateCamPosition = CameraPosition;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3027,9 +3027,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize;
|
||||
int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize;
|
||||
|
||||
Vector3 offset = new Vector3(shiftx, shifty, 0f);
|
||||
|
||||
m_DrawDistance = cAgentData.Far;
|
||||
if (cAgentData.Position != new Vector3(-1, -1, -1)) // UGH!!
|
||||
m_pos = new Vector3(cAgentData.Position.X + shiftx, cAgentData.Position.Y + shifty, cAgentData.Position.Z);
|
||||
if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!!
|
||||
m_pos = cAgentData.Position + offset;
|
||||
|
||||
if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance)
|
||||
{
|
||||
|
@ -3037,8 +3039,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
ReprioritizeUpdates();
|
||||
}
|
||||
|
||||
// It's hard to say here.. We can't really tell where the camera position is unless it's in world cordinates from the sending region
|
||||
m_CameraCenter = cAgentData.Center;
|
||||
m_CameraCenter = cAgentData.Center + offset;
|
||||
|
||||
m_avHeight = cAgentData.Size.Z;
|
||||
//SetHeight(cAgentData.AVHeight);
|
||||
|
@ -3051,16 +3052,16 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_sceneViewer.Reset();
|
||||
|
||||
//cAgentData.AVHeight;
|
||||
//cAgentData.regionHandle;
|
||||
m_rootRegionHandle = cAgentData.RegionHandle;
|
||||
//m_velocity = cAgentData.Velocity;
|
||||
}
|
||||
|
||||
public void CopyTo(AgentData cAgent)
|
||||
{
|
||||
cAgent.AgentID = UUID;
|
||||
cAgent.RegionHandle = m_scene.RegionInfo.RegionHandle;
|
||||
cAgent.RegionHandle = m_rootRegionHandle;
|
||||
|
||||
cAgent.Position = m_pos;
|
||||
cAgent.Position = AbsolutePosition;
|
||||
cAgent.Velocity = m_velocity;
|
||||
cAgent.Center = m_CameraCenter;
|
||||
// Don't copy the size; it is inferred from apearance parameters
|
||||
|
@ -3157,7 +3158,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public void CopyFrom(AgentData cAgent)
|
||||
{
|
||||
m_rootRegionHandle= cAgent.RegionHandle;
|
||||
m_rootRegionHandle = cAgent.RegionHandle;
|
||||
|
||||
m_callbackURI = cAgent.CallbackURI;
|
||||
|
||||
m_pos = cAgent.Position;
|
||||
|
|
|
@ -219,7 +219,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
Assert.That(presence.IsChildAgent, Is.True, "Did not change to child agent after MakeChildAgent");
|
||||
|
||||
// Accepts 0 but rejects Constants.RegionSize
|
||||
Vector3 pos = new Vector3(0,Constants.RegionSize-1,0);
|
||||
Vector3 pos = new Vector3(0,unchecked(Constants.RegionSize-1),0);
|
||||
presence.MakeRootAgent(pos,true);
|
||||
Assert.That(presence.IsChildAgent, Is.False, "Did not go back to root agent");
|
||||
Assert.That(presence.AbsolutePosition, Is.EqualTo(pos), "Position is not the same one entered");
|
||||
|
@ -246,7 +246,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
|||
scene2.AddNewClient(testclient);
|
||||
|
||||
ScenePresence presence = scene.GetScenePresence(agent1);
|
||||
presence.MakeRootAgent(new Vector3(0,Constants.RegionSize-1,0), true);
|
||||
presence.MakeRootAgent(new Vector3(0,unchecked(Constants.RegionSize-1),0), true);
|
||||
|
||||
ScenePresence presence2 = scene2.GetScenePresence(agent1);
|
||||
|
||||
|
|
Loading…
Reference in New Issue