diff options
author | Justin Clark-Casey (justincc) | 2012-03-09 02:38:11 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-03-09 02:38:11 +0000 |
commit | 94e58ff6b9368975925cea4697077a8e59162bc0 (patch) | |
tree | 1798f25a23316e71182aca5634fcd5eebb4133bf /OpenSim/Region | |
parent | refactor: cleanup SP.HandleAgentSit so that everything is done within one if ... (diff) | |
download | opensim-SC-94e58ff6b9368975925cea4697077a8e59162bc0.zip opensim-SC-94e58ff6b9368975925cea4697077a8e59162bc0.tar.gz opensim-SC-94e58ff6b9368975925cea4697077a8e59162bc0.tar.bz2 opensim-SC-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.
Diffstat (limited to 'OpenSim/Region')
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; |