aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2012-03-09 02:38:11 +0000
committerJustin Clark-Casey (justincc)2012-03-09 02:38:11 +0000
commit94e58ff6b9368975925cea4697077a8e59162bc0 (patch)
tree1798f25a23316e71182aca5634fcd5eebb4133bf
parentrefactor: cleanup SP.HandleAgentSit so that everything is done within one if ... (diff)
downloadopensim-SC_OLD-94e58ff6b9368975925cea4697077a8e59162bc0.zip
opensim-SC_OLD-94e58ff6b9368975925cea4697077a8e59162bc0.tar.gz
opensim-SC_OLD-94e58ff6b9368975925cea4697077a8e59162bc0.tar.bz2
opensim-SC_OLD-94e58ff6b9368975925cea4697077a8e59162bc0.tar.xz
Use SP.ParentPart instead of ParentID in places where it's more efficient (saving extra null checks, etc.)
However, it looks like we should retain SP.ParentID since it's much easier to use that in places where another thread could change ParentPart to null. Otherwise one has to clumsily put ParentPart in a reference, etc. to avoid a race.
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs24
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs26
-rw-r--r--OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs26
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs24
4 files changed, 32 insertions, 68 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 66fb493..dd0ca43 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -215,27 +215,13 @@ namespace OpenSim.Region.Framework.Scenes
215 if (sp.IsChildAgent) 215 if (sp.IsChildAgent)
216 continue; 216 continue;
217 217
218 if (sp.ParentID != 0) 218 SceneObjectPart sitPart = sp.ParentPart;
219 { 219 if (sitPart != null)
220 // sitting avatar 220 coarseLocations.Add(sitPart.AbsolutePosition + sp.OffsetPosition);
221 SceneObjectPart sop = m_parentScene.GetSceneObjectPart(sp.ParentID);
222 if (sop != null)
223 {
224 coarseLocations.Add(sop.AbsolutePosition + sp.OffsetPosition);
225 avatarUUIDs.Add(sp.UUID);
226 }
227 else
228 {
229 // we can't find the parent.. ! arg!
230 coarseLocations.Add(sp.AbsolutePosition);
231 avatarUUIDs.Add(sp.UUID);
232 }
233 }
234 else 221 else
235 {
236 coarseLocations.Add(sp.AbsolutePosition); 222 coarseLocations.Add(sp.AbsolutePosition);
237 avatarUUIDs.Add(sp.UUID); 223
238 } 224 avatarUUIDs.Add(sp.UUID);
239 } 225 }
240 } 226 }
241 227
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index c9dc7fd..aab0bf0 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -432,7 +432,7 @@ namespace OpenSim.Region.Framework.Scenes
432 { 432 {
433 get 433 get
434 { 434 {
435 if (PhysicsActor != null && m_parentID == 0) 435 if (PhysicsActor != null && ParentID == 0)
436 { 436 {
437 m_pos = PhysicsActor.Position; 437 m_pos = PhysicsActor.Position;
438 438
@@ -504,6 +504,7 @@ namespace OpenSim.Region.Framework.Scenes
504 // There is no offset position when not seated 504 // There is no offset position when not seated
505 if (ParentID == 0) 505 if (ParentID == 0)
506 return; 506 return;
507
507 m_pos = value; 508 m_pos = value;
508 } 509 }
509 } 510 }
@@ -562,19 +563,18 @@ namespace OpenSim.Region.Framework.Scenes
562 563
563 public bool IsChildAgent { get; set; } 564 public bool IsChildAgent { get; set; }
564 565
565 public uint ParentID 566 /// <summary>
566 { 567 /// If the avatar is sitting, the local ID of the prim that it's sitting on. If not sitting then zero.
567 get { return m_parentID; } 568 /// </summary>
568 set { m_parentID = value; } 569 public uint ParentID { get; set; }
569 }
570 private uint m_parentID;
571 570
572 public SceneObjectPart ParentPart 571 /// <summary>
573 { 572 /// If the avatar is sitting, the prim that it's sitting on. If not sitting then null.
574 get { return m_parentPart; } 573 /// </summary>
575 set { m_parentPart = value; } 574 /// <remarks>
576 } 575 /// If you use this property then you must take a reference since another thread could set it to null.
577 private SceneObjectPart m_parentPart = null; 576 /// </remarks>
577 public SceneObjectPart ParentPart { get; set; }
578 578
579 public float Health 579 public float Health
580 { 580 {
diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs
index 09da97a..a2e3ac2 100644
--- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs
+++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs
@@ -716,29 +716,17 @@ namespace OpenSim.Region.RegionCombinerModule
716 { 716 {
717 if (sp.UUID != presence.UUID) 717 if (sp.UUID != presence.UUID)
718 { 718 {
719 if (sp.ParentID != 0) 719 SceneObjectPart sitPart = sp.ParentPart;
720 { 720
721 // sitting avatar 721 if (sitPart != null)
722 SceneObjectPart sop = connectiondata.RegionScene.GetSceneObjectPart(sp.ParentID); 722 CoarseLocations.Add(sitPart.AbsolutePosition + sp.AbsolutePosition);
723 if (sop != null)
724 {
725 CoarseLocations.Add(sop.AbsolutePosition + sp.AbsolutePosition);
726 AvatarUUIDs.Add(sp.UUID);
727 }
728 else
729 {
730 // we can't find the parent.. ! arg!
731 CoarseLocations.Add(sp.AbsolutePosition);
732 AvatarUUIDs.Add(sp.UUID);
733 }
734 }
735 else 723 else
736 {
737 CoarseLocations.Add(sp.AbsolutePosition); 724 CoarseLocations.Add(sp.AbsolutePosition);
738 AvatarUUIDs.Add(sp.UUID); 725
739 } 726 AvatarUUIDs.Add(sp.UUID);
740 } 727 }
741 }); 728 });
729
742 DistributeCourseLocationUpdates(CoarseLocations, AvatarUUIDs, connectiondata, presence); 730 DistributeCourseLocationUpdates(CoarseLocations, AvatarUUIDs, connectiondata, presence);
743 } 731 }
744 732
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 786ae6e..bb374ed 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -3825,7 +3825,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3825 List<String> nametable = new List<String>(); 3825 List<String> nametable = new List<String>();
3826 World.ForEachRootScenePresence(delegate(ScenePresence presence) 3826 World.ForEachRootScenePresence(delegate(ScenePresence presence)
3827 { 3827 {
3828 if (presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID)) 3828 SceneObjectPart sitPart = presence.ParentPart;
3829 if (sitPart != null && m_host.ParentGroup.HasChildPrim(sitPart.LocalId))
3829 nametable.Add(presence.ControllingClient.Name); 3830 nametable.Add(presence.ControllingClient.Name);
3830 }); 3831 });
3831 3832
@@ -4393,22 +4394,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4393 4394
4394 // Find pushee position 4395 // Find pushee position
4395 // Pushee Linked? 4396 // Pushee Linked?
4396 if (pusheeav.ParentID != 0) 4397 SceneObjectPart sitPart = pusheeav.ParentPart;
4397 { 4398 if (sitPart != null)
4398 SceneObjectPart parentobj = World.GetSceneObjectPart(pusheeav.ParentID); 4399 PusheePos = sitPart.AbsolutePosition;
4399 if (parentobj != null)
4400 {
4401 PusheePos = parentobj.AbsolutePosition;
4402 }
4403 else
4404 {
4405 PusheePos = pusheeav.AbsolutePosition;
4406 }
4407 }
4408 else 4400 else
4409 {
4410 PusheePos = pusheeav.AbsolutePosition; 4401 PusheePos = pusheeav.AbsolutePosition;
4411 }
4412 } 4402 }
4413 4403
4414 if (!pusheeIsAvatar) 4404 if (!pusheeIsAvatar)
@@ -5603,7 +5593,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5603 flags |= ScriptBaseClass.AGENT_IN_AIR; 5593 flags |= ScriptBaseClass.AGENT_IN_AIR;
5604 } 5594 }
5605 5595
5606 if (agent.ParentID != 0) 5596 if (agent.ParentPart != null)
5607 { 5597 {
5608 flags |= ScriptBaseClass.AGENT_ON_OBJECT; 5598 flags |= ScriptBaseClass.AGENT_ON_OBJECT;
5609 flags |= ScriptBaseClass.AGENT_SITTING; 5599 flags |= ScriptBaseClass.AGENT_SITTING;
@@ -7692,7 +7682,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7692 World.ForEachRootScenePresence(delegate(ScenePresence presence) 7682 World.ForEachRootScenePresence(delegate(ScenePresence presence)
7693 { 7683 {
7694 if (presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID)) 7684 if (presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID))
7695 avatarCount++; 7685 avatarCount++;
7696 }); 7686 });
7697 7687
7698 return m_host.ParentGroup.PrimCount + avatarCount; 7688 return m_host.ParentGroup.PrimCount + avatarCount;