aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs214
1 files changed, 108 insertions, 106 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 66a8ea7..6c58aac 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -96,6 +96,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
96 public event Action<IClientAPI, bool> OnCompleteMovementToRegion; 96 public event Action<IClientAPI, bool> OnCompleteMovementToRegion;
97 public event UpdateAgent OnPreAgentUpdate; 97 public event UpdateAgent OnPreAgentUpdate;
98 public event UpdateAgent OnAgentUpdate; 98 public event UpdateAgent OnAgentUpdate;
99 public event UpdateAgent OnAgentCameraUpdate;
99 public event AgentRequestSit OnAgentRequestSit; 100 public event AgentRequestSit OnAgentRequestSit;
100 public event AgentSit OnAgentSit; 101 public event AgentSit OnAgentSit;
101 public event AvatarPickerRequest OnAvatarPickerRequest; 102 public event AvatarPickerRequest OnAvatarPickerRequest;
@@ -357,9 +358,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
357 /// This does mean that agent updates must be processed synchronously, at least for each client, and called methods 358 /// This does mean that agent updates must be processed synchronously, at least for each client, and called methods
358 /// cannot retain a reference to it outside of that method. 359 /// cannot retain a reference to it outside of that method.
359 /// </remarks> 360 /// </remarks>
360 private AgentUpdateArgs m_lastAgentUpdateArgs = new AgentUpdateArgs();
361
362 private AgentUpdateArgs m_thisAgentUpdateArgs = new AgentUpdateArgs(); 361 private AgentUpdateArgs m_thisAgentUpdateArgs = new AgentUpdateArgs();
362 private float qdelta1;
363 private float qdelta2;
364 private float vdelta1;
365 private float vdelta2;
366 private float vdelta3;
367 private float vdelta4;
363 368
364 protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); 369 protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>();
365 protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers 370 protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers
@@ -5571,57 +5576,75 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5571 5576
5572 #region Scene/Avatar 5577 #region Scene/Avatar
5573 5578
5579 private const float QDELTA = 0.01f;
5580 private const float VDELTA = 0.01f;
5581
5574 /// <summary> 5582 /// <summary>
5575 /// This checks the update significance against the last update made. 5583 /// This checks the update significance against the last update made.
5576 /// </summary> 5584 /// </summary>
5577 /// <remarks>Can only be called by one thread at a time</remarks> 5585 /// <remarks>Can only be called by one thread at a time</remarks>
5578 /// <returns>/returns> 5586 /// <returns></returns>
5579 /// <param name='x'></param> 5587 /// <param name='x'></param>
5580 public bool CheckAgentUpdateSignificance(AgentUpdatePacket.AgentDataBlock x) 5588 public bool CheckAgentUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
5581 { 5589 {
5582 // These should be ordered from most-likely to 5590 return CheckAgentMovementUpdateSignificance(x) || CheckAgentCameraUpdateSignificance(x);
5583 // least likely to change. I've made an initial 5591 }
5584 // guess at that. 5592
5593 /// <summary>
5594 /// This checks the movement/state update significance against the last update made.
5595 /// </summary>
5596 /// <remarks>Can only be called by one thread at a time</remarks>
5597 /// <returns></returns>
5598 /// <param name='x'></param>
5599 public bool CheckAgentMovementUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
5600 {
5601 qdelta1 = 1 - (float)Math.Pow(Quaternion.Dot(x.BodyRotation, m_thisAgentUpdateArgs.BodyRotation), 2);
5602 qdelta2 = 1 - (float)Math.Pow(Quaternion.Dot(x.HeadRotation, m_thisAgentUpdateArgs.HeadRotation), 2);
5603 if (
5604 (qdelta1 > QDELTA) ||
5605 // Ignoring head rotation altogether, because it's not being used for anything interesting up the stack
5606 //(qdelta2 > QDELTA * 10) ||
5607 (x.ControlFlags != m_thisAgentUpdateArgs.ControlFlags) ||
5608 (x.Far != m_thisAgentUpdateArgs.Far) ||
5609 (x.Flags != m_thisAgentUpdateArgs.Flags) ||
5610 (x.State != m_thisAgentUpdateArgs.State)
5611 )
5612 {
5613 //m_log.DebugFormat("[LLCLIENTVIEW]: Bod {0} {1}",
5614 // qdelta1, qdelta2);
5615 //m_log.DebugFormat("[LLCLIENTVIEW]: St {0} {1} {2} {3} (Thread {4})",
5616 // x.ControlFlags, x.Flags, x.Far, x.State, Thread.CurrentThread.Name);
5617 return true;
5618 }
5619
5620 return false;
5621 }
5622
5623 /// <summary>
5624 /// This checks the camera update significance against the last update made.
5625 /// </summary>
5626 /// <remarks>Can only be called by one thread at a time</remarks>
5627 /// <returns></returns>
5628 /// <param name='x'></param>
5629 public bool CheckAgentCameraUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
5630 {
5631 vdelta1 = Vector3.Distance(x.CameraAtAxis, m_thisAgentUpdateArgs.CameraAtAxis);
5632 vdelta2 = Vector3.Distance(x.CameraCenter, m_thisAgentUpdateArgs.CameraCenter);
5633 vdelta3 = Vector3.Distance(x.CameraLeftAxis, m_thisAgentUpdateArgs.CameraLeftAxis);
5634 vdelta4 = Vector3.Distance(x.CameraUpAxis, m_thisAgentUpdateArgs.CameraUpAxis);
5585 if ( 5635 if (
5586 /* These 4 are the worst offenders! We should consider ignoring most of them. 5636 /* These 4 are the worst offenders!
5587 * With Singularity, there is a bug where sometimes the spam on these doesn't stop */ 5637 * With Singularity, there is a bug where sometimes the spam on these doesn't stop */
5588 (x.CameraAtAxis != m_lastAgentUpdateArgs.CameraAtAxis) || 5638 (vdelta1 > VDELTA) ||
5589 (x.CameraCenter != m_lastAgentUpdateArgs.CameraCenter) || 5639 (vdelta2 > VDELTA) ||
5590 (x.CameraLeftAxis != m_lastAgentUpdateArgs.CameraLeftAxis) || 5640 (vdelta3 > VDELTA) ||
5591 (x.CameraUpAxis != m_lastAgentUpdateArgs.CameraUpAxis) || 5641 (vdelta4 > VDELTA)
5592 /* */
5593 (x.BodyRotation != m_lastAgentUpdateArgs.BodyRotation) ||
5594 (x.ControlFlags != m_lastAgentUpdateArgs.ControlFlags) ||
5595 (x.Far != m_lastAgentUpdateArgs.Far) ||
5596 (x.Flags != m_lastAgentUpdateArgs.Flags) ||
5597 (x.State != m_lastAgentUpdateArgs.State) ||
5598 (x.HeadRotation != m_lastAgentUpdateArgs.HeadRotation) ||
5599 (x.SessionID != m_lastAgentUpdateArgs.SessionID) ||
5600 (x.AgentID != m_lastAgentUpdateArgs.AgentID)
5601 ) 5642 )
5602 { 5643 {
5603 //m_log.DebugFormat("[LLCLIENTVIEW]: Cam1 {0} {1}", 5644 //m_log.DebugFormat("[LLCLIENTVIEW]: Cam1 {0} {1}",
5604 // x.CameraAtAxis, x.CameraCenter); 5645 // x.CameraAtAxis, x.CameraCenter);
5605 //m_log.DebugFormat("[LLCLIENTVIEW]: Cam2 {0} {1}", 5646 //m_log.DebugFormat("[LLCLIENTVIEW]: Cam2 {0} {1}",
5606 // x.CameraLeftAxis, x.CameraUpAxis); 5647 // x.CameraLeftAxis, x.CameraUpAxis);
5607 //m_log.DebugFormat("[LLCLIENTVIEW]: Bod {0} {1}",
5608 // x.BodyRotation, x.HeadRotation);
5609 //m_log.DebugFormat("[LLCLIENTVIEW]: St {0} {1} {2} {3}",
5610 // x.ControlFlags, x.Flags, x.Far, x.State);
5611
5612 m_lastAgentUpdateArgs.AgentID = x.AgentID;
5613 m_lastAgentUpdateArgs.BodyRotation = x.BodyRotation;
5614 m_lastAgentUpdateArgs.CameraAtAxis = x.CameraAtAxis;
5615 m_lastAgentUpdateArgs.CameraCenter = x.CameraCenter;
5616 m_lastAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis;
5617 m_lastAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis;
5618 m_lastAgentUpdateArgs.ControlFlags = x.ControlFlags;
5619 m_lastAgentUpdateArgs.Far = x.Far;
5620 m_lastAgentUpdateArgs.Flags = x.Flags;
5621 m_lastAgentUpdateArgs.HeadRotation = x.HeadRotation;
5622 m_lastAgentUpdateArgs.SessionID = x.SessionID;
5623 m_lastAgentUpdateArgs.State = x.State;
5624
5625 return true; 5648 return true;
5626 } 5649 }
5627 5650
@@ -5629,75 +5652,54 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5629 } 5652 }
5630 5653
5631 private bool HandleAgentUpdate(IClientAPI sener, Packet packet) 5654 private bool HandleAgentUpdate(IClientAPI sener, Packet packet)
5632 { 5655 {
5633 if (OnAgentUpdate != null) 5656 // We got here, which means that something in agent update was significant
5634 {
5635 AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet;
5636 5657
5637 // Now done earlier 5658 AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet;
5638// #region Packet Session and User Check 5659 AgentUpdatePacket.AgentDataBlock x = agentUpdate.AgentData;
5639// if (agentUpdate.AgentData.SessionID != SessionId || agentUpdate.AgentData.AgentID != AgentId) 5660
5640// { 5661 if (x.AgentID != AgentId || x.SessionID != SessionId)
5641// PacketPool.Instance.ReturnPacket(packet); 5662 return false;
5642// return false; 5663
5643// } 5664 // Before we update the current m_thisAgentUpdateArgs, let's check this again
5644// #endregion 5665 // to see what exactly changed
5645// 5666 bool movement = CheckAgentMovementUpdateSignificance(x);
5646// bool update = false; 5667 bool camera = CheckAgentCameraUpdateSignificance(x);
5647 AgentUpdatePacket.AgentDataBlock x = agentUpdate.AgentData; 5668
5648// 5669 m_thisAgentUpdateArgs.AgentID = x.AgentID;
5649// if (m_lastAgentUpdateArgs != null) 5670 m_thisAgentUpdateArgs.BodyRotation = x.BodyRotation;
5650// { 5671 m_thisAgentUpdateArgs.CameraAtAxis = x.CameraAtAxis;
5651// // These should be ordered from most-likely to 5672 m_thisAgentUpdateArgs.CameraCenter = x.CameraCenter;
5652// // least likely to change. I've made an initial 5673 m_thisAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis;
5653// // guess at that. 5674 m_thisAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis;
5654// update = 5675 m_thisAgentUpdateArgs.ControlFlags = x.ControlFlags;
5655// ( 5676 m_thisAgentUpdateArgs.Far = x.Far;
5656// (x.BodyRotation != m_lastAgentUpdateArgs.BodyRotation) || 5677 m_thisAgentUpdateArgs.Flags = x.Flags;
5657// (x.CameraAtAxis != m_lastAgentUpdateArgs.CameraAtAxis) || 5678 m_thisAgentUpdateArgs.HeadRotation = x.HeadRotation;
5658// (x.CameraCenter != m_lastAgentUpdateArgs.CameraCenter) || 5679 m_thisAgentUpdateArgs.SessionID = x.SessionID;
5659// (x.CameraLeftAxis != m_lastAgentUpdateArgs.CameraLeftAxis) || 5680 m_thisAgentUpdateArgs.State = x.State;
5660// (x.CameraUpAxis != m_lastAgentUpdateArgs.CameraUpAxis) || 5681
5661// (x.ControlFlags != m_lastAgentUpdateArgs.ControlFlags) || 5682 UpdateAgent handlerAgentUpdate = OnAgentUpdate;
5662// (x.Far != m_lastAgentUpdateArgs.Far) || 5683 UpdateAgent handlerPreAgentUpdate = OnPreAgentUpdate;
5663// (x.Flags != m_lastAgentUpdateArgs.Flags) || 5684 UpdateAgent handlerAgentCameraUpdate = OnAgentCameraUpdate;
5664// (x.State != m_lastAgentUpdateArgs.State) || 5685
5665// (x.HeadRotation != m_lastAgentUpdateArgs.HeadRotation) || 5686 // Was there a significant movement/state change?
5666// (x.SessionID != m_lastAgentUpdateArgs.SessionID) || 5687 if (movement)
5667// (x.AgentID != m_lastAgentUpdateArgs.AgentID) 5688 {
5668// ); 5689 if (handlerPreAgentUpdate != null)
5669// } 5690 OnPreAgentUpdate(this, m_thisAgentUpdateArgs);
5670// 5691
5671// if (update) 5692 if (handlerAgentUpdate != null)
5672// { 5693 OnAgentUpdate(this, m_thisAgentUpdateArgs);
5673//// m_log.DebugFormat("[LLCLIENTVIEW]: Triggered AgentUpdate for {0}", sener.Name); 5694 }
5674 5695 // Was there a significant camera(s) change?
5675 m_thisAgentUpdateArgs.AgentID = x.AgentID; 5696 if (camera)
5676 m_thisAgentUpdateArgs.BodyRotation = x.BodyRotation; 5697 if (handlerAgentCameraUpdate != null)
5677 m_thisAgentUpdateArgs.CameraAtAxis = x.CameraAtAxis; 5698 handlerAgentCameraUpdate(this, m_thisAgentUpdateArgs);
5678 m_thisAgentUpdateArgs.CameraCenter = x.CameraCenter; 5699
5679 m_thisAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis; 5700 handlerAgentUpdate = null;
5680 m_thisAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis; 5701 handlerPreAgentUpdate = null;
5681 m_thisAgentUpdateArgs.ControlFlags = x.ControlFlags; 5702 handlerAgentCameraUpdate = null;
5682 m_thisAgentUpdateArgs.Far = x.Far;
5683 m_thisAgentUpdateArgs.Flags = x.Flags;
5684 m_thisAgentUpdateArgs.HeadRotation = x.HeadRotation;
5685 m_thisAgentUpdateArgs.SessionID = x.SessionID;
5686 m_thisAgentUpdateArgs.State = x.State;
5687
5688 UpdateAgent handlerAgentUpdate = OnAgentUpdate;
5689 UpdateAgent handlerPreAgentUpdate = OnPreAgentUpdate;
5690
5691 if (handlerPreAgentUpdate != null)
5692 OnPreAgentUpdate(this, m_thisAgentUpdateArgs);
5693
5694 if (handlerAgentUpdate != null)
5695 OnAgentUpdate(this, m_thisAgentUpdateArgs);
5696
5697 handlerAgentUpdate = null;
5698 handlerPreAgentUpdate = null;
5699// }
5700 }
5701 5703
5702 PacketPool.Instance.ReturnPacket(packet); 5704 PacketPool.Instance.ReturnPacket(packet);
5703 5705