From 8a73dc0f8a3a8606439b6f7217d2d14c22bfd43e Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Fri, 30 Oct 2009 03:01:15 -0700
Subject: * 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
commit
---
.../Region/ClientStack/LindenUDP/LLClientView.cs | 2 -
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 78 +++++++++++-----------
.../Framework/Scenes/Tests/ScenePresenceTests.cs | 4 +-
3 files changed, 42 insertions(+), 42 deletions(-)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index b8c99cf..bd75f0c 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -4952,8 +4952,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Throttling category for the packet
protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType)
{
- if (ChildAgentStatus())
- Thread.Sleep(200);
m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, true);
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 9730cd5..6c0d9f2 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -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);
+ ///
+ /// 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 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
}
///
- /// Absolute position of this avatar in 'region cordinates'
+ /// Position of this avatar relative to the region the avatar is in
///
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;
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
index 19c0fea..f495022 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
@@ -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);
--
cgit v1.1