aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs457
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs33
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs6
-rw-r--r--prebuild.xml1
4 files changed, 257 insertions, 240 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 6a76069..196ac50 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -328,7 +328,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
328 /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an 328 /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an
329 /// ownerless phantom. 329 /// ownerless phantom.
330 /// 330 ///
331 /// All manipulation of this set has to occur under an m_entityUpdates.SyncRoot lock 331 /// All manipulation of this set has to occur under a lock
332 /// 332 ///
333 /// </value> 333 /// </value>
334 protected HashSet<uint> m_killRecord; 334 protected HashSet<uint> m_killRecord;
@@ -1536,11 +1536,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1536 OutPacket(kill, ThrottleOutPacketType.State); 1536 OutPacket(kill, ThrottleOutPacketType.State);
1537 return; 1537 return;
1538 } 1538 }
1539 m_killRecord.Add(localIDs[0]); 1539 lock (m_killRecord)
1540 {
1541 m_killRecord.Add(localIDs[0]);
1542 }
1540 } 1543 }
1541 else 1544 else
1542 { 1545 {
1543 lock (m_entityUpdates.SyncRoot) 1546 lock (m_killRecord)
1544 { 1547 {
1545 foreach (uint localID in localIDs) 1548 foreach (uint localID in localIDs)
1546 m_killRecord.Add(localID); 1549 m_killRecord.Add(localID);
@@ -3595,248 +3598,254 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3595 int updatesThisCall = 0; 3598 int updatesThisCall = 0;
3596 3599
3597 EntityUpdate update; 3600 EntityUpdate update;
3598 while (updatesThisCall < maxUpdates) 3601 lock (m_killRecord)
3599 { 3602 {
3600 lock (m_entityUpdates.SyncRoot) 3603 while (updatesThisCall < maxUpdates)
3601 if (!m_entityUpdates.TryDequeue(out update)) 3604 {
3602 break; 3605 lock (m_entityUpdates.SyncRoot)
3606 if (!m_entityUpdates.TryDequeue(out update))
3607 break;
3603 3608
3604 if (update.Entity is SceneObjectPart) 3609 if (update.Entity is SceneObjectPart)
3605 { 3610 {
3606 SceneObjectPart part = (SceneObjectPart)update.Entity; 3611 SceneObjectPart part = (SceneObjectPart)update.Entity;
3607 3612
3608 // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client 3613 // Please do not remove this unless you can demonstrate on the OpenSim mailing list that a client
3609 // will never receive an update after a prim kill. Even then, keeping the kill record may be a good 3614 // will never receive an update after a prim kill. Even then, keeping the kill record may be a good
3610 // safety measure. 3615 // safety measure.
3611 // 3616 //
3612 // If a Linden Lab 1.23.5 client (and possibly later and earlier) receives an object update 3617 // If a Linden Lab 1.23.5 client (and possibly later and earlier) receives an object update
3613 // after a kill, it will keep displaying the deleted object until relog. OpenSim currently performs 3618 // after a kill, it will keep displaying the deleted object until relog. OpenSim currently performs
3614 // updates and kills on different threads with different scheduling strategies, hence this protection. 3619 // updates and kills on different threads with different scheduling strategies, hence this protection.
3615 // 3620 //
3616 // This doesn't appear to apply to child prims - a client will happily ignore these updates 3621 // This doesn't appear to apply to child prims - a client will happily ignore these updates
3617 // after the root prim has been deleted. 3622 // after the root prim has been deleted.
3618 if (m_killRecord.Contains(part.LocalId)) 3623 if (m_killRecord.Contains(part.LocalId))
3619 continue;
3620 if (m_killRecord.Contains(part.ParentGroup.RootPart.LocalId))
3621 continue;
3622
3623 if (part.ParentGroup.IsDeleted)
3624 continue;
3625
3626 if (part.ParentGroup.IsAttachment)
3627 { // Someone else's HUD, why are we getting these?
3628 if (part.ParentGroup.OwnerID != AgentId &&
3629 part.ParentGroup.RootPart.Shape.State >= 30)
3630 continue; 3624 continue;
3631 ScenePresence sp; 3625 if (m_killRecord.Contains(part.ParentGroup.RootPart.LocalId))
3632 // Owner is not in the sim, don't update it to
3633 // anyone
3634 if (!m_scene.TryGetScenePresence(part.OwnerID, out sp))
3635 continue; 3626 continue;
3636 3627
3637 List<SceneObjectGroup> atts = sp.Attachments; 3628 if (part.ParentGroup.IsDeleted)
3638 bool found = false; 3629 continue;
3639 foreach (SceneObjectGroup att in atts) 3630
3640 { 3631 if (part.ParentGroup.IsAttachment)
3641 if (att == part.ParentGroup) 3632 { // Someone else's HUD, why are we getting these?
3633 if (part.ParentGroup.OwnerID != AgentId &&
3634 part.ParentGroup.RootPart.Shape.State >= 30)
3635 continue;
3636 ScenePresence sp;
3637 // Owner is not in the sim, don't update it to
3638 // anyone
3639 if (!m_scene.TryGetScenePresence(part.OwnerID, out sp))
3640 continue;
3641
3642 List<SceneObjectGroup> atts = sp.Attachments;
3643 bool found = false;
3644 foreach (SceneObjectGroup att in atts)
3642 { 3645 {
3643 found = true; 3646 if (att == part.ParentGroup)
3644 break; 3647 {
3648 found = true;
3649 break;
3650 }
3645 } 3651 }
3646 }
3647 3652
3648 // It's an attachment of a valid avatar, but 3653 // It's an attachment of a valid avatar, but
3649 // doesn't seem to be attached, skip 3654 // doesn't seem to be attached, skip
3650 if (!found) 3655 if (!found)
3651 continue; 3656 continue;
3652 } 3657 }
3653 3658
3654 if (part.ParentGroup.IsAttachment && m_disableFacelights) 3659 if (part.ParentGroup.IsAttachment && m_disableFacelights)
3655 {
3656 if (part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.LeftHand &&
3657 part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.RightHand)
3658 { 3660 {
3659 part.Shape.LightEntry = false; 3661 if (part.ParentGroup.IsAttachment && m_disableFacelights)
3662 {
3663 if (part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.LeftHand &&
3664 part.ParentGroup.RootPart.Shape.State != (byte)AttachmentPoint.RightHand)
3665 {
3666 part.Shape.LightEntry = false;
3667 }
3668 }
3669 }
3670
3671 ++updatesThisCall;
3672
3673 #region UpdateFlags to packet type conversion
3674
3675 PrimUpdateFlags updateFlags = update.Flags;
3676
3677 bool canUseCompressed = true;
3678 bool canUseImproved = true;
3679
3680 // Compressed object updates only make sense for LL primitives
3681 if (!(update.Entity is SceneObjectPart))
3682 {
3683 canUseCompressed = false;
3660 } 3684 }
3685
3686 if (updateFlags.HasFlag(PrimUpdateFlags.FullUpdate))
3687 {
3688 canUseCompressed = false;
3689 canUseImproved = false;
3690 }
3691 else
3692 {
3693 if (updateFlags.HasFlag(PrimUpdateFlags.Velocity) ||
3694 updateFlags.HasFlag(PrimUpdateFlags.Acceleration) ||
3695 updateFlags.HasFlag(PrimUpdateFlags.CollisionPlane) ||
3696 updateFlags.HasFlag(PrimUpdateFlags.Joint))
3697 {
3698 canUseCompressed = false;
3699 }
3700
3701 if (updateFlags.HasFlag(PrimUpdateFlags.PrimFlags) ||
3702 updateFlags.HasFlag(PrimUpdateFlags.ParentID) ||
3703 updateFlags.HasFlag(PrimUpdateFlags.Scale) ||
3704 updateFlags.HasFlag(PrimUpdateFlags.PrimData) ||
3705 updateFlags.HasFlag(PrimUpdateFlags.Text) ||
3706 updateFlags.HasFlag(PrimUpdateFlags.NameValue) ||
3707 updateFlags.HasFlag(PrimUpdateFlags.ExtraData) ||
3708 updateFlags.HasFlag(PrimUpdateFlags.TextureAnim) ||
3709 updateFlags.HasFlag(PrimUpdateFlags.Sound) ||
3710 updateFlags.HasFlag(PrimUpdateFlags.Particles) ||
3711 updateFlags.HasFlag(PrimUpdateFlags.Material) ||
3712 updateFlags.HasFlag(PrimUpdateFlags.ClickAction) ||
3713 updateFlags.HasFlag(PrimUpdateFlags.MediaURL) ||
3714 updateFlags.HasFlag(PrimUpdateFlags.Joint))
3715 {
3716 canUseImproved = false;
3717 }
3718 }
3719
3720 #endregion UpdateFlags to packet type conversion
3721
3722 #region Block Construction
3723
3724 // TODO: Remove this once we can build compressed updates
3725 canUseCompressed = false;
3726
3727 if (!canUseImproved && !canUseCompressed)
3728 {
3729 if (update.Entity is ScenePresence)
3730 {
3731 objectUpdateBlocks.Value.Add(CreateAvatarUpdateBlock((ScenePresence)update.Entity));
3732 }
3733 else
3734 {
3735 // if (update.Entity is SceneObjectPart && ((SceneObjectPart)update.Entity).IsAttachment)
3736 // {
3737 // SceneObjectPart sop = (SceneObjectPart)update.Entity;
3738 // string text = sop.Text;
3739 // if (text.IndexOf("\n") >= 0)
3740 // text = text.Remove(text.IndexOf("\n"));
3741 //
3742 // if (m_attachmentsSent.Contains(sop.ParentID))
3743 // {
3744 //// m_log.DebugFormat(
3745 //// "[CLIENT]: Sending full info about attached prim {0} text {1}",
3746 //// sop.LocalId, text);
3747 //
3748 // objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock(sop, this.m_agentId));
3749 //
3750 // m_attachmentsSent.Add(sop.LocalId);
3751 // }
3752 // else
3753 // {
3754 // m_log.DebugFormat(
3755 // "[CLIENT]: Requeueing full update of prim {0} text {1} since we haven't sent its parent {2} yet",
3756 // sop.LocalId, text, sop.ParentID);
3757 //
3758 // m_entityUpdates.Enqueue(double.MaxValue, update, sop.LocalId);
3759 // }
3760 // }
3761 // else
3762 // {
3763 objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId));
3764 // }
3765 }
3766 }
3767 else if (!canUseImproved)
3768 {
3769 compressedUpdateBlocks.Value.Add(CreateCompressedUpdateBlock((SceneObjectPart)update.Entity, updateFlags));
3770 }
3771 else
3772 {
3773 if (update.Entity is ScenePresence && ((ScenePresence)update.Entity).UUID == AgentId)
3774 // Self updates go into a special list
3775 terseAgentUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)));
3776 else
3777 // Everything else goes here
3778 terseUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)));
3779 }
3780
3781 #endregion Block Construction
3661 } 3782 }
3662 } 3783
3663 3784 #region Packet Sending
3664 ++updatesThisCall; 3785
3665 3786 const float TIME_DILATION = 1.0f;
3666 #region UpdateFlags to packet type conversion 3787 ushort timeDilation = Utils.FloatToUInt16(TIME_DILATION, 0.0f, 1.0f);
3667 3788
3668 PrimUpdateFlags updateFlags = update.Flags; 3789 if (terseAgentUpdateBlocks.IsValueCreated)
3669
3670 bool canUseCompressed = true;
3671 bool canUseImproved = true;
3672
3673 // Compressed object updates only make sense for LL primitives
3674 if (!(update.Entity is SceneObjectPart))
3675 {
3676 canUseCompressed = false;
3677 }
3678
3679 if (updateFlags.HasFlag(PrimUpdateFlags.FullUpdate))
3680 {
3681 canUseCompressed = false;
3682 canUseImproved = false;
3683 }
3684 else
3685 {
3686 if (updateFlags.HasFlag(PrimUpdateFlags.Velocity) ||
3687 updateFlags.HasFlag(PrimUpdateFlags.Acceleration) ||
3688 updateFlags.HasFlag(PrimUpdateFlags.CollisionPlane) ||
3689 updateFlags.HasFlag(PrimUpdateFlags.Joint))
3690 { 3790 {
3691 canUseCompressed = false; 3791 List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> blocks = terseAgentUpdateBlocks.Value;
3792
3793 ImprovedTerseObjectUpdatePacket packet = new ImprovedTerseObjectUpdatePacket();
3794 packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
3795 packet.RegionData.TimeDilation = timeDilation;
3796 packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count];
3797
3798 for (int i = 0; i < blocks.Count; i++)
3799 packet.ObjectData[i] = blocks[i];
3800
3801 OutPacket(packet, ThrottleOutPacketType.Unknown, true);
3692 } 3802 }
3693 3803
3694 if (updateFlags.HasFlag(PrimUpdateFlags.PrimFlags) || 3804 if (objectUpdateBlocks.IsValueCreated)
3695 updateFlags.HasFlag(PrimUpdateFlags.ParentID) ||
3696 updateFlags.HasFlag(PrimUpdateFlags.Scale) ||
3697 updateFlags.HasFlag(PrimUpdateFlags.PrimData) ||
3698 updateFlags.HasFlag(PrimUpdateFlags.Text) ||
3699 updateFlags.HasFlag(PrimUpdateFlags.NameValue) ||
3700 updateFlags.HasFlag(PrimUpdateFlags.ExtraData) ||
3701 updateFlags.HasFlag(PrimUpdateFlags.TextureAnim) ||
3702 updateFlags.HasFlag(PrimUpdateFlags.Sound) ||
3703 updateFlags.HasFlag(PrimUpdateFlags.Particles) ||
3704 updateFlags.HasFlag(PrimUpdateFlags.Material) ||
3705 updateFlags.HasFlag(PrimUpdateFlags.ClickAction) ||
3706 updateFlags.HasFlag(PrimUpdateFlags.MediaURL) ||
3707 updateFlags.HasFlag(PrimUpdateFlags.Joint))
3708 { 3805 {
3709 canUseImproved = false; 3806 List<ObjectUpdatePacket.ObjectDataBlock> blocks = objectUpdateBlocks.Value;
3807
3808 ObjectUpdatePacket packet = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
3809 packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
3810 packet.RegionData.TimeDilation = timeDilation;
3811 packet.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[blocks.Count];
3812
3813 for (int i = 0; i < blocks.Count; i++)
3814 packet.ObjectData[i] = blocks[i];
3815
3816 OutPacket(packet, ThrottleOutPacketType.Task, true);
3710 } 3817 }
3711 } 3818
3712 3819 if (compressedUpdateBlocks.IsValueCreated)
3713 #endregion UpdateFlags to packet type conversion
3714
3715 #region Block Construction
3716
3717 // TODO: Remove this once we can build compressed updates
3718 canUseCompressed = false;
3719
3720 if (!canUseImproved && !canUseCompressed)
3721 {
3722 if (update.Entity is ScenePresence)
3723 { 3820 {
3724 objectUpdateBlocks.Value.Add(CreateAvatarUpdateBlock((ScenePresence)update.Entity)); 3821 List<ObjectUpdateCompressedPacket.ObjectDataBlock> blocks = compressedUpdateBlocks.Value;
3822
3823 ObjectUpdateCompressedPacket packet = (ObjectUpdateCompressedPacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdateCompressed);
3824 packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
3825 packet.RegionData.TimeDilation = timeDilation;
3826 packet.ObjectData = new ObjectUpdateCompressedPacket.ObjectDataBlock[blocks.Count];
3827
3828 for (int i = 0; i < blocks.Count; i++)
3829 packet.ObjectData[i] = blocks[i];
3830
3831 OutPacket(packet, ThrottleOutPacketType.Task, true);
3725 } 3832 }
3726 else 3833
3834 if (terseUpdateBlocks.IsValueCreated)
3727 { 3835 {
3728// if (update.Entity is SceneObjectPart && ((SceneObjectPart)update.Entity).IsAttachment) 3836 List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> blocks = terseUpdateBlocks.Value;
3729// { 3837
3730// SceneObjectPart sop = (SceneObjectPart)update.Entity; 3838 ImprovedTerseObjectUpdatePacket packet = new ImprovedTerseObjectUpdatePacket();
3731// string text = sop.Text; 3839 packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
3732// if (text.IndexOf("\n") >= 0) 3840 packet.RegionData.TimeDilation = timeDilation;
3733// text = text.Remove(text.IndexOf("\n")); 3841 packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count];
3734// 3842
3735// if (m_attachmentsSent.Contains(sop.ParentID)) 3843 for (int i = 0; i < blocks.Count; i++)
3736// { 3844 packet.ObjectData[i] = blocks[i];
3737//// m_log.DebugFormat( 3845
3738//// "[CLIENT]: Sending full info about attached prim {0} text {1}", 3846 OutPacket(packet, ThrottleOutPacketType.Task, true);
3739//// sop.LocalId, text);
3740//
3741// objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock(sop, this.m_agentId));
3742//
3743// m_attachmentsSent.Add(sop.LocalId);
3744// }
3745// else
3746// {
3747// m_log.DebugFormat(
3748// "[CLIENT]: Requeueing full update of prim {0} text {1} since we haven't sent its parent {2} yet",
3749// sop.LocalId, text, sop.ParentID);
3750//
3751// m_entityUpdates.Enqueue(double.MaxValue, update, sop.LocalId);
3752// }
3753// }
3754// else
3755// {
3756 objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId));
3757// }
3758 } 3847 }
3759 } 3848 }
3760 else if (!canUseImproved)
3761 {
3762 compressedUpdateBlocks.Value.Add(CreateCompressedUpdateBlock((SceneObjectPart)update.Entity, updateFlags));
3763 }
3764 else
3765 {
3766 if (update.Entity is ScenePresence && ((ScenePresence)update.Entity).UUID == AgentId)
3767 // Self updates go into a special list
3768 terseAgentUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)));
3769 else
3770 // Everything else goes here
3771 terseUpdateBlocks.Value.Add(CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)));
3772 }
3773
3774 #endregion Block Construction
3775 }
3776
3777 #region Packet Sending
3778
3779 const float TIME_DILATION = 1.0f;
3780 ushort timeDilation = Utils.FloatToUInt16(TIME_DILATION, 0.0f, 1.0f);
3781
3782 if (terseAgentUpdateBlocks.IsValueCreated)
3783 {
3784 List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> blocks = terseAgentUpdateBlocks.Value;
3785
3786 ImprovedTerseObjectUpdatePacket packet = new ImprovedTerseObjectUpdatePacket();
3787 packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
3788 packet.RegionData.TimeDilation = timeDilation;
3789 packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count];
3790
3791 for (int i = 0; i < blocks.Count; i++)
3792 packet.ObjectData[i] = blocks[i];
3793
3794 OutPacket(packet, ThrottleOutPacketType.Unknown, true);
3795 }
3796
3797 if (objectUpdateBlocks.IsValueCreated)
3798 {
3799 List<ObjectUpdatePacket.ObjectDataBlock> blocks = objectUpdateBlocks.Value;
3800
3801 ObjectUpdatePacket packet = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
3802 packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
3803 packet.RegionData.TimeDilation = timeDilation;
3804 packet.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[blocks.Count];
3805
3806 for (int i = 0; i < blocks.Count; i++)
3807 packet.ObjectData[i] = blocks[i];
3808
3809 OutPacket(packet, ThrottleOutPacketType.Task, true);
3810 }
3811
3812 if (compressedUpdateBlocks.IsValueCreated)
3813 {
3814 List<ObjectUpdateCompressedPacket.ObjectDataBlock> blocks = compressedUpdateBlocks.Value;
3815
3816 ObjectUpdateCompressedPacket packet = (ObjectUpdateCompressedPacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdateCompressed);
3817 packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
3818 packet.RegionData.TimeDilation = timeDilation;
3819 packet.ObjectData = new ObjectUpdateCompressedPacket.ObjectDataBlock[blocks.Count];
3820
3821 for (int i = 0; i < blocks.Count; i++)
3822 packet.ObjectData[i] = blocks[i];
3823
3824 OutPacket(packet, ThrottleOutPacketType.Task, true);
3825 }
3826
3827 if (terseUpdateBlocks.IsValueCreated)
3828 {
3829 List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> blocks = terseUpdateBlocks.Value;
3830
3831 ImprovedTerseObjectUpdatePacket packet = new ImprovedTerseObjectUpdatePacket();
3832 packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
3833 packet.RegionData.TimeDilation = timeDilation;
3834 packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count];
3835
3836 for (int i = 0; i < blocks.Count; i++)
3837 packet.ObjectData[i] = blocks[i];
3838
3839 OutPacket(packet, ThrottleOutPacketType.Task, true);
3840 } 3849 }
3841 3850
3842 #endregion Packet Sending 3851 #endregion Packet Sending
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index f81030c..45625d6 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -152,7 +152,7 @@ namespace OpenSim.Region.Framework.Scenes
152 private int m_update_backup = 200; 152 private int m_update_backup = 200;
153 private int m_update_terrain = 50; 153 private int m_update_terrain = 50;
154 private int m_update_land = 1; 154 private int m_update_land = 1;
155 private int m_update_coarse_locations = 50; 155 private int m_update_coarse_locations = 80;
156 156
157 private int frameMS; 157 private int frameMS;
158 private int physicsMS2; 158 private int physicsMS2;
@@ -181,6 +181,8 @@ namespace OpenSim.Region.Framework.Scenes
181 private object m_deleting_scene_object = new object(); 181 private object m_deleting_scene_object = new object();
182 private object m_cleaningAttachments = new object(); 182 private object m_cleaningAttachments = new object();
183 183
184 private bool m_cleaningTemps = false;
185
184 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; 186 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time;
185 private bool m_reprioritizationEnabled = true; 187 private bool m_reprioritizationEnabled = true;
186 private double m_reprioritizationInterval = 5000.0; 188 private double m_reprioritizationInterval = 5000.0;
@@ -1296,10 +1298,11 @@ namespace OpenSim.Region.Framework.Scenes
1296 physicsMS = Util.EnvironmentTickCountSubtract(tmpPhysicsMS); 1298 physicsMS = Util.EnvironmentTickCountSubtract(tmpPhysicsMS);
1297 1299
1298 // Delete temp-on-rez stuff 1300 // Delete temp-on-rez stuff
1299 if (m_frame % m_update_backup == 0) 1301 if (m_frame % 1000 == 0 && !m_cleaningTemps)
1300 { 1302 {
1301 int tmpTempOnRezMS = Util.EnvironmentTickCount(); 1303 int tmpTempOnRezMS = Util.EnvironmentTickCount();
1302 CleanTempObjects(); 1304 m_cleaningTemps = true;
1305 Util.FireAndForget(delegate { CleanTempObjects(); m_cleaningTemps = false; });
1303 tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpTempOnRezMS); 1306 tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpTempOnRezMS);
1304 } 1307 }
1305 1308
@@ -1326,12 +1329,12 @@ namespace OpenSim.Region.Framework.Scenes
1326 terrainMS = Util.EnvironmentTickCountSubtract(terMS); 1329 terrainMS = Util.EnvironmentTickCountSubtract(terMS);
1327 } 1330 }
1328 1331
1329 if (m_frame % m_update_land == 0) 1332 //if (m_frame % m_update_land == 0)
1330 { 1333 //{
1331 int ldMS = Util.EnvironmentTickCount(); 1334 // int ldMS = Util.EnvironmentTickCount();
1332 UpdateLand(); 1335 // UpdateLand();
1333 landMS = Util.EnvironmentTickCountSubtract(ldMS); 1336 // landMS = Util.EnvironmentTickCountSubtract(ldMS);
1334 } 1337 //}
1335 1338
1336 frameMS = Util.EnvironmentTickCountSubtract(tmpFrameMS); 1339 frameMS = Util.EnvironmentTickCountSubtract(tmpFrameMS);
1337 otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; 1340 otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS;
@@ -1424,13 +1427,12 @@ namespace OpenSim.Region.Framework.Scenes
1424 1427
1425 private void CheckAtTargets() 1428 private void CheckAtTargets()
1426 { 1429 {
1430 Dictionary<UUID, SceneObjectGroup>.ValueCollection objs;
1427 lock (m_groupsWithTargets) 1431 lock (m_groupsWithTargets)
1428 { 1432 objs = m_groupsWithTargets.Values;
1429 foreach (SceneObjectGroup entry in m_groupsWithTargets.Values) 1433
1430 { 1434 foreach (SceneObjectGroup entry in objs)
1431 entry.checkAtTargets(); 1435 entry.checkAtTargets();
1432 }
1433 }
1434 } 1436 }
1435 1437
1436 1438
@@ -4539,6 +4541,7 @@ namespace OpenSim.Region.Framework.Scenes
4539 } 4541 }
4540 } 4542 }
4541 } 4543 }
4544
4542 } 4545 }
4543 4546
4544 public void DeleteFromStorage(UUID uuid) 4547 public void DeleteFromStorage(UUID uuid)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index d83ff51..254fe37 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2635,6 +2635,8 @@ namespace OpenSim.Region.Framework.Scenes
2635 2635
2636 #region Overridden Methods 2636 #region Overridden Methods
2637 2637
2638 private bool sendingPrims = false;
2639
2638 public override void Update() 2640 public override void Update()
2639 { 2641 {
2640 const float ROTATION_TOLERANCE = 0.01f; 2642 const float ROTATION_TOLERANCE = 0.01f;
@@ -2642,7 +2644,8 @@ namespace OpenSim.Region.Framework.Scenes
2642 const float POSITION_TOLERANCE = 0.05f; 2644 const float POSITION_TOLERANCE = 0.05f;
2643 //const int TIME_MS_TOLERANCE = 3000; 2645 //const int TIME_MS_TOLERANCE = 3000;
2644 2646
2645 2647 if (!sendingPrims)
2648 Util.FireAndForget(delegate { sendingPrims = true; SendPrimUpdates(); sendingPrims = false; });
2646 2649
2647 if (m_isChildAgent == false) 2650 if (m_isChildAgent == false)
2648 { 2651 {
@@ -2670,6 +2673,7 @@ namespace OpenSim.Region.Framework.Scenes
2670 // followed suggestion from mic bowman. reversed the two lines below. 2673 // followed suggestion from mic bowman. reversed the two lines below.
2671 if (m_parentID == 0 && m_physicsActor != null || m_parentID != 0) // Check that we have a physics actor or we're sitting on something 2674 if (m_parentID == 0 && m_physicsActor != null || m_parentID != 0) // Check that we have a physics actor or we're sitting on something
2672 CheckForBorderCrossing(); 2675 CheckForBorderCrossing();
2676
2673 CheckForSignificantMovement(); // sends update to the modules. 2677 CheckForSignificantMovement(); // sends update to the modules.
2674 } 2678 }
2675 2679
diff --git a/prebuild.xml b/prebuild.xml
index 7dd7b67..380e98b 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -3037,6 +3037,7 @@
3037 <Reference name="OpenSim.Framework.Statistics"/> 3037 <Reference name="OpenSim.Framework.Statistics"/>
3038 <Reference name="OpenSim.Region.Framework"/> 3038 <Reference name="OpenSim.Region.Framework"/>
3039 <Reference name="OpenSim.Region.CoreModules"/> 3039 <Reference name="OpenSim.Region.CoreModules"/>
3040 <Reference name="OpenSim.Region.OptionalModules"/>
3040 <Reference name="OpenSim.Region.Physics.Manager"/> 3041 <Reference name="OpenSim.Region.Physics.Manager"/>
3041 <Reference name="OpenSim.Services.Interfaces"/> 3042 <Reference name="OpenSim.Services.Interfaces"/>
3042 3043