aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes
diff options
context:
space:
mode:
authorJohn Hurliman2009-10-30 03:01:15 -0700
committerJohn Hurliman2009-10-30 03:01:15 -0700
commit8a73dc0f8a3a8606439b6f7217d2d14c22bfd43e (patch)
tree2e364c6fbcbabb5cf920bb2782b426bee2f5bb01 /OpenSim/Region/Framework/Scenes
parent* Moving parcel media and avatar update packets from the unthrottled category... (diff)
downloadopensim-SC-8a73dc0f8a3a8606439b6f7217d2d14c22bfd43e.zip
opensim-SC-8a73dc0f8a3a8606439b6f7217d2d14c22bfd43e.tar.gz
opensim-SC-8a73dc0f8a3a8606439b6f7217d2d14c22bfd43e.tar.bz2
opensim-SC-8a73dc0f8a3a8606439b6f7217d2d14c22bfd43e.tar.xz
* 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
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs78
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs4
2 files changed, 42 insertions, 40 deletions
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
79 private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes(); 79 private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
80 private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags)); 80 private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
81 private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f); 81 private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
82 /// <summary>
83 /// Experimentally determined "fudge factor" to make sit-target positions
84 /// the same as in SecondLife. Fudge factor was tested for 36 different
85 /// test cases including prims of type box, sphere, cylinder, and torus,
86 /// with varying parameters for sit target location, prim size, prim
87 /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
88 /// issue #1716
89 /// </summary>
90 private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
82 91
83 public UUID currentParcelUUID = UUID.Zero; 92 public UUID currentParcelUUID = UUID.Zero;
84 93
@@ -115,18 +124,12 @@ namespace OpenSim.Region.Framework.Scenes
115 124
116 private float m_sitAvatarHeight = 2.0f; 125 private float m_sitAvatarHeight = 2.0f;
117 126
118 // experimentally determined "fudge factor" to make sit-target positions
119 // the same as in SecondLife. Fudge factor was tested for 36 different
120 // test cases including prims of type box, sphere, cylinder, and torus,
121 // with varying parameters for sit target location, prim size, prim
122 // rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
123 // issue #1716
124 private static readonly Vector3 m_sitTargetCorrectionOffset = new Vector3(0.1f, 0.0f, 0.3f);
125 private float m_godlevel; 127 private float m_godlevel;
126 128
127 private bool m_invulnerable = true; 129 private bool m_invulnerable = true;
128 130
129 private Vector3 m_LastChildAgentUpdatePosition; 131 private Vector3 m_lastChildAgentUpdatePosition;
132 private Vector3 m_lastChildAgentUpdateCamPosition;
130 133
131 private int m_perfMonMS; 134 private int m_perfMonMS;
132 135
@@ -271,11 +274,9 @@ namespace OpenSim.Region.Framework.Scenes
271 get { return m_godlevel; } 274 get { return m_godlevel; }
272 } 275 }
273 276
274 private readonly ulong m_regionHandle;
275
276 public ulong RegionHandle 277 public ulong RegionHandle
277 { 278 {
278 get { return m_regionHandle; } 279 get { return m_rootRegionHandle; }
279 } 280 }
280 281
281 public Vector3 CameraPosition 282 public Vector3 CameraPosition
@@ -414,31 +415,27 @@ namespace OpenSim.Region.Framework.Scenes
414 } 415 }
415 416
416 /// <summary> 417 /// <summary>
417 /// Absolute position of this avatar in 'region cordinates' 418 /// Position of this avatar relative to the region the avatar is in
418 /// </summary> 419 /// </summary>
419 public override Vector3 AbsolutePosition 420 public override Vector3 AbsolutePosition
420 { 421 {
421 get 422 get
422 { 423 {
423 if (m_physicsActor != null) 424 PhysicsActor actor = m_physicsActor;
424 { 425 if (actor != null)
425 m_pos.X = m_physicsActor.Position.X; 426 m_pos = actor.Position;
426 m_pos.Y = m_physicsActor.Position.Y;
427 m_pos.Z = m_physicsActor.Position.Z;
428 }
429 427
430 return m_parentPosition + m_pos; 428 return m_parentPosition + m_pos;
431 } 429 }
432 set 430 set
433 { 431 {
434 if (m_physicsActor != null) 432 PhysicsActor actor = m_physicsActor;
433 if (actor != null)
435 { 434 {
436 try 435 try
437 { 436 {
438 lock (m_scene.SyncRoot) 437 lock (m_scene.SyncRoot)
439 {
440 m_physicsActor.Position = value; 438 m_physicsActor.Position = value;
441 }
442 } 439 }
443 catch (Exception e) 440 catch (Exception e)
444 { 441 {
@@ -466,8 +463,6 @@ namespace OpenSim.Region.Framework.Scenes
466 } 463 }
467 set 464 set
468 { 465 {
469 //m_log.DebugFormat("In {0} setting velocity of {1} to {2}", m_scene.RegionInfo.RegionName, Name, value);
470
471 PhysicsActor actor = m_physicsActor; 466 PhysicsActor actor = m_physicsActor;
472 if (actor != null) 467 if (actor != null)
473 { 468 {
@@ -626,7 +621,7 @@ namespace OpenSim.Region.Framework.Scenes
626 { 621 {
627 m_sendCourseLocationsMethod = SendCoarseLocationsDefault; 622 m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
628 CreateSceneViewer(); 623 CreateSceneViewer();
629 m_regionHandle = reginfo.RegionHandle; 624 m_rootRegionHandle = reginfo.RegionHandle;
630 m_controllingClient = client; 625 m_controllingClient = client;
631 m_firstname = m_controllingClient.FirstName; 626 m_firstname = m_controllingClient.FirstName;
632 m_lastname = m_controllingClient.LastName; 627 m_lastname = m_controllingClient.LastName;
@@ -780,6 +775,8 @@ namespace OpenSim.Region.Framework.Scenes
780 if (gm != null) 775 if (gm != null)
781 m_grouptitle = gm.GetGroupTitle(m_uuid); 776 m_grouptitle = gm.GetGroupTitle(m_uuid);
782 777
778 m_rootRegionHandle = m_scene.RegionInfo.RegionHandle;
779
783 m_scene.SetRootAgentScene(m_uuid); 780 m_scene.SetRootAgentScene(m_uuid);
784 781
785 // Moved this from SendInitialData to ensure that m_appearance is initialized 782 // Moved this from SendInitialData to ensure that m_appearance is initialized
@@ -810,7 +807,6 @@ namespace OpenSim.Region.Framework.Scenes
810 pos = emergencyPos; 807 pos = emergencyPos;
811 } 808 }
812 809
813
814 float localAVHeight = 1.56f; 810 float localAVHeight = 1.56f;
815 if (m_avHeight != 127.0f) 811 if (m_avHeight != 127.0f)
816 { 812 {
@@ -905,6 +901,8 @@ namespace OpenSim.Region.Framework.Scenes
905 m_isChildAgent = true; 901 m_isChildAgent = true;
906 m_scene.SwapRootAgentCount(true); 902 m_scene.SwapRootAgentCount(true);
907 RemoveFromPhysicalScene(); 903 RemoveFromPhysicalScene();
904
905 // FIXME: Set m_rootRegionHandle to the region handle of the scene this agent is moving into
908 906
909 m_scene.EventManager.TriggerOnMakeChildAgent(this); 907 m_scene.EventManager.TriggerOnMakeChildAgent(this);
910 } 908 }
@@ -1823,7 +1821,7 @@ namespace OpenSim.Region.Framework.Scenes
1823 //Quaternion result = (sitTargetOrient * vq) * nq; 1821 //Quaternion result = (sitTargetOrient * vq) * nq;
1824 1822
1825 m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z); 1823 m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
1826 m_pos += m_sitTargetCorrectionOffset; 1824 m_pos += SIT_TARGET_ADJUSTMENT;
1827 m_bodyRot = sitTargetOrient; 1825 m_bodyRot = sitTargetOrient;
1828 //Rotation = sitTargetOrient; 1826 //Rotation = sitTargetOrient;
1829 m_parentPosition = part.AbsolutePosition; 1827 m_parentPosition = part.AbsolutePosition;
@@ -2374,7 +2372,7 @@ namespace OpenSim.Region.Framework.Scenes
2374 2372
2375 //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity); 2373 //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
2376 2374
2377 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, 2375 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
2378 pos, velocity, Vector3.Zero, m_bodyRot, CollisionPlane, m_uuid, null, GetUpdatePriority(remoteClient))); 2376 pos, velocity, Vector3.Zero, m_bodyRot, CollisionPlane, m_uuid, null, GetUpdatePriority(remoteClient)));
2379 2377
2380 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); 2378 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
@@ -2739,7 +2737,8 @@ namespace OpenSim.Region.Framework.Scenes
2739 } 2737 }
2740 2738
2741 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m 2739 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
2742 if (Util.GetDistanceTo(AbsolutePosition, m_LastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance) 2740 if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance ||
2741 Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
2743 { 2742 {
2744 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); 2743 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
2745 cadu.ActiveGroupID = UUID.Zero.Guid; 2744 cadu.ActiveGroupID = UUID.Zero.Guid;
@@ -2753,7 +2752,7 @@ namespace OpenSim.Region.Framework.Scenes
2753 cadu.godlevel = m_godlevel; 2752 cadu.godlevel = m_godlevel;
2754 cadu.GroupAccess = 0; 2753 cadu.GroupAccess = 0;
2755 cadu.Position = new sLLVector3(AbsolutePosition); 2754 cadu.Position = new sLLVector3(AbsolutePosition);
2756 cadu.regionHandle = m_scene.RegionInfo.RegionHandle; 2755 cadu.regionHandle = m_rootRegionHandle;
2757 float multiplier = 1; 2756 float multiplier = 1;
2758 int innacurateNeighbors = m_scene.GetInaccurateNeighborCount(); 2757 int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
2759 if (innacurateNeighbors != 0) 2758 if (innacurateNeighbors != 0)
@@ -2774,7 +2773,8 @@ namespace OpenSim.Region.Framework.Scenes
2774 2773
2775 m_scene.SendOutChildAgentUpdates(agentpos, this); 2774 m_scene.SendOutChildAgentUpdates(agentpos, this);
2776 2775
2777 m_LastChildAgentUpdatePosition = AbsolutePosition; 2776 m_lastChildAgentUpdatePosition = AbsolutePosition;
2777 m_lastChildAgentUpdateCamPosition = CameraPosition;
2778 } 2778 }
2779 } 2779 }
2780 2780
@@ -3027,9 +3027,11 @@ namespace OpenSim.Region.Framework.Scenes
3027 int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize; 3027 int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize;
3028 int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize; 3028 int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize;
3029 3029
3030 Vector3 offset = new Vector3(shiftx, shifty, 0f);
3031
3030 m_DrawDistance = cAgentData.Far; 3032 m_DrawDistance = cAgentData.Far;
3031 if (cAgentData.Position != new Vector3(-1, -1, -1)) // UGH!! 3033 if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!!
3032 m_pos = new Vector3(cAgentData.Position.X + shiftx, cAgentData.Position.Y + shifty, cAgentData.Position.Z); 3034 m_pos = cAgentData.Position + offset;
3033 3035
3034 if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance) 3036 if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance)
3035 { 3037 {
@@ -3037,8 +3039,7 @@ namespace OpenSim.Region.Framework.Scenes
3037 ReprioritizeUpdates(); 3039 ReprioritizeUpdates();
3038 } 3040 }
3039 3041
3040 // 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 3042 m_CameraCenter = cAgentData.Center + offset;
3041 m_CameraCenter = cAgentData.Center;
3042 3043
3043 m_avHeight = cAgentData.Size.Z; 3044 m_avHeight = cAgentData.Size.Z;
3044 //SetHeight(cAgentData.AVHeight); 3045 //SetHeight(cAgentData.AVHeight);
@@ -3051,16 +3052,16 @@ namespace OpenSim.Region.Framework.Scenes
3051 m_sceneViewer.Reset(); 3052 m_sceneViewer.Reset();
3052 3053
3053 //cAgentData.AVHeight; 3054 //cAgentData.AVHeight;
3054 //cAgentData.regionHandle; 3055 m_rootRegionHandle = cAgentData.RegionHandle;
3055 //m_velocity = cAgentData.Velocity; 3056 //m_velocity = cAgentData.Velocity;
3056 } 3057 }
3057 3058
3058 public void CopyTo(AgentData cAgent) 3059 public void CopyTo(AgentData cAgent)
3059 { 3060 {
3060 cAgent.AgentID = UUID; 3061 cAgent.AgentID = UUID;
3061 cAgent.RegionHandle = m_scene.RegionInfo.RegionHandle; 3062 cAgent.RegionHandle = m_rootRegionHandle;
3062 3063
3063 cAgent.Position = m_pos; 3064 cAgent.Position = AbsolutePosition;
3064 cAgent.Velocity = m_velocity; 3065 cAgent.Velocity = m_velocity;
3065 cAgent.Center = m_CameraCenter; 3066 cAgent.Center = m_CameraCenter;
3066 // Don't copy the size; it is inferred from apearance parameters 3067 // Don't copy the size; it is inferred from apearance parameters
@@ -3157,7 +3158,8 @@ namespace OpenSim.Region.Framework.Scenes
3157 3158
3158 public void CopyFrom(AgentData cAgent) 3159 public void CopyFrom(AgentData cAgent)
3159 { 3160 {
3160 m_rootRegionHandle= cAgent.RegionHandle; 3161 m_rootRegionHandle = cAgent.RegionHandle;
3162
3161 m_callbackURI = cAgent.CallbackURI; 3163 m_callbackURI = cAgent.CallbackURI;
3162 3164
3163 m_pos = cAgent.Position; 3165 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
219 Assert.That(presence.IsChildAgent, Is.True, "Did not change to child agent after MakeChildAgent"); 219 Assert.That(presence.IsChildAgent, Is.True, "Did not change to child agent after MakeChildAgent");
220 220
221 // Accepts 0 but rejects Constants.RegionSize 221 // Accepts 0 but rejects Constants.RegionSize
222 Vector3 pos = new Vector3(0,Constants.RegionSize-1,0); 222 Vector3 pos = new Vector3(0,unchecked(Constants.RegionSize-1),0);
223 presence.MakeRootAgent(pos,true); 223 presence.MakeRootAgent(pos,true);
224 Assert.That(presence.IsChildAgent, Is.False, "Did not go back to root agent"); 224 Assert.That(presence.IsChildAgent, Is.False, "Did not go back to root agent");
225 Assert.That(presence.AbsolutePosition, Is.EqualTo(pos), "Position is not the same one entered"); 225 Assert.That(presence.AbsolutePosition, Is.EqualTo(pos), "Position is not the same one entered");
@@ -246,7 +246,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
246 scene2.AddNewClient(testclient); 246 scene2.AddNewClient(testclient);
247 247
248 ScenePresence presence = scene.GetScenePresence(agent1); 248 ScenePresence presence = scene.GetScenePresence(agent1);
249 presence.MakeRootAgent(new Vector3(0,Constants.RegionSize-1,0), true); 249 presence.MakeRootAgent(new Vector3(0,unchecked(Constants.RegionSize-1),0), true);
250 250
251 ScenePresence presence2 = scene2.GetScenePresence(agent1); 251 ScenePresence presence2 = scene2.GetScenePresence(agent1);
252 252