aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDiva Canto2013-07-20 12:20:35 -0700
committerDiva Canto2013-07-21 09:00:42 -0700
commitd5a1779465b6d875ebe5822ce6f15df3378b759f (patch)
tree6c794ccabc5c3cbbc27bdfe94c6f4147f2c2aa99
parentFixed the stats in show client stats. Also left some comments with observatio... (diff)
downloadopensim-SC-d5a1779465b6d875ebe5822ce6f15df3378b759f.zip
opensim-SC-d5a1779465b6d875ebe5822ce6f15df3378b759f.tar.gz
opensim-SC-d5a1779465b6d875ebe5822ce6f15df3378b759f.tar.bz2
opensim-SC-d5a1779465b6d875ebe5822ce6f15df3378b759f.tar.xz
Manage AgentUpdates more sanely:
- The existing event to scene has been split into 2: OnAgentUpdate and OnAgentCameraUpdate, to better reflect the two types of updates that the viewer sends. We can run one without the other, which is what happens when the avie is still but the user is camming around - Added thresholds (as opposed to equality) to determine whether the update is significant or not. I thin these thresholds are ok, but we can play with them later - Ignore updates of HeadRotation, which were problematic and aren't being used up stream
-rw-r--r--OpenSim/Framework/IClientAPI.cs2
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs214
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs110
-rw-r--r--OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs1
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs1
-rw-r--r--OpenSim/Tests/Common/Mock/TestClient.cs1
6 files changed, 183 insertions, 146 deletions
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index 65f8395..f39eb0c 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -825,6 +825,8 @@ namespace OpenSim.Framework
825 /// </remarks> 825 /// </remarks>
826 event UpdateAgent OnAgentUpdate; 826 event UpdateAgent OnAgentUpdate;
827 827
828 event UpdateAgent OnAgentCameraUpdate;
829
828 event AgentRequestSit OnAgentRequestSit; 830 event AgentRequestSit OnAgentRequestSit;
829 event AgentSit OnAgentSit; 831 event AgentSit OnAgentSit;
830 event AvatarPickerRequest OnAvatarPickerRequest; 832 event AvatarPickerRequest OnAvatarPickerRequest;
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
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 990ef6e..5543964 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -801,6 +801,7 @@ namespace OpenSim.Region.Framework.Scenes
801 { 801 {
802 ControllingClient.OnCompleteMovementToRegion += CompleteMovement; 802 ControllingClient.OnCompleteMovementToRegion += CompleteMovement;
803 ControllingClient.OnAgentUpdate += HandleAgentUpdate; 803 ControllingClient.OnAgentUpdate += HandleAgentUpdate;
804 ControllingClient.OnAgentCameraUpdate += HandleAgentCamerasUpdate;
804 ControllingClient.OnAgentRequestSit += HandleAgentRequestSit; 805 ControllingClient.OnAgentRequestSit += HandleAgentRequestSit;
805 ControllingClient.OnAgentSit += HandleAgentSit; 806 ControllingClient.OnAgentSit += HandleAgentSit;
806 ControllingClient.OnSetAlwaysRun += HandleSetAlwaysRun; 807 ControllingClient.OnSetAlwaysRun += HandleSetAlwaysRun;
@@ -1438,9 +1439,9 @@ namespace OpenSim.Region.Framework.Scenes
1438 /// </summary> 1439 /// </summary>
1439 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) 1440 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
1440 { 1441 {
1441// m_log.DebugFormat( 1442 //m_log.DebugFormat(
1442// "[SCENE PRESENCE]: In {0} received agent update from {1}, flags {2}", 1443 // "[SCENE PRESENCE]: In {0} received agent update from {1}, flags {2}",
1443// Scene.RegionInfo.RegionName, remoteClient.Name, (AgentManager.ControlFlags)agentData.ControlFlags); 1444 // Scene.RegionInfo.RegionName, remoteClient.Name, (AgentManager.ControlFlags)agentData.ControlFlags);
1444 1445
1445 if (IsChildAgent) 1446 if (IsChildAgent)
1446 { 1447 {
@@ -1448,10 +1449,6 @@ namespace OpenSim.Region.Framework.Scenes
1448 return; 1449 return;
1449 } 1450 }
1450 1451
1451 ++m_movementUpdateCount;
1452 if (m_movementUpdateCount < 1)
1453 m_movementUpdateCount = 1;
1454
1455 #region Sanity Checking 1452 #region Sanity Checking
1456 1453
1457 // This is irritating. Really. 1454 // This is irritating. Really.
@@ -1482,21 +1479,6 @@ namespace OpenSim.Region.Framework.Scenes
1482 1479
1483 AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags; 1480 AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
1484 1481
1485 // Camera location in world. We'll need to raytrace
1486 // from this location from time to time.
1487 CameraPosition = agentData.CameraCenter;
1488 if (Vector3.Distance(m_lastCameraPosition, CameraPosition) >= Scene.RootReprioritizationDistance)
1489 {
1490 ReprioritizeUpdates();
1491 m_lastCameraPosition = CameraPosition;
1492 }
1493
1494 // Use these three vectors to figure out what the agent is looking at
1495 // Convert it to a Matrix and/or Quaternion
1496 CameraAtAxis = agentData.CameraAtAxis;
1497 CameraLeftAxis = agentData.CameraLeftAxis;
1498 CameraUpAxis = agentData.CameraUpAxis;
1499
1500 // The Agent's Draw distance setting 1482 // The Agent's Draw distance setting
1501 // When we get to the point of re-computing neighbors everytime this 1483 // When we get to the point of re-computing neighbors everytime this
1502 // changes, then start using the agent's drawdistance rather than the 1484 // changes, then start using the agent's drawdistance rather than the
@@ -1504,12 +1486,6 @@ namespace OpenSim.Region.Framework.Scenes
1504 // DrawDistance = agentData.Far; 1486 // DrawDistance = agentData.Far;
1505 DrawDistance = Scene.DefaultDrawDistance; 1487 DrawDistance = Scene.DefaultDrawDistance;
1506 1488
1507 // Check if Client has camera in 'follow cam' or 'build' mode.
1508 Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation);
1509
1510 m_followCamAuto = ((CameraUpAxis.Z > 0.959f && CameraUpAxis.Z < 0.98f)
1511 && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
1512
1513 m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0; 1489 m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
1514 m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0; 1490 m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
1515 1491
@@ -1529,17 +1505,6 @@ namespace OpenSim.Region.Framework.Scenes
1529 StandUp(); 1505 StandUp();
1530 } 1506 }
1531 1507
1532 //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
1533 // Raycast from the avatar's head to the camera to see if there's anything blocking the view
1534 if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
1535 {
1536 if (m_followCamAuto)
1537 {
1538 Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
1539 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(CameraPosition - posAdjusted), Vector3.Distance(CameraPosition, posAdjusted) + 0.3f, RayCastCameraCallback);
1540 }
1541 }
1542
1543 uint flagsForScripts = (uint)flags; 1508 uint flagsForScripts = (uint)flags;
1544 flags = RemoveIgnoredControls(flags, IgnoredControls); 1509 flags = RemoveIgnoredControls(flags, IgnoredControls);
1545 1510
@@ -1764,9 +1729,74 @@ namespace OpenSim.Region.Framework.Scenes
1764 } 1729 }
1765 1730
1766 m_scene.EventManager.TriggerOnClientMovement(this); 1731 m_scene.EventManager.TriggerOnClientMovement(this);
1767 TriggerScenePresenceUpdated();
1768 } 1732 }
1769 1733
1734
1735 /// <summary>
1736 /// This is the event handler for client cameras. If a client is moving, or moving the camera, this event is triggering.
1737 /// </summary>
1738 public void HandleAgentCamerasUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
1739 {
1740 //m_log.DebugFormat(
1741 // "[SCENE PRESENCE]: In {0} received agent camera update from {1}, flags {2}",
1742 // Scene.RegionInfo.RegionName, remoteClient.Name, (AgentManager.ControlFlags)agentData.ControlFlags);
1743
1744 if (IsChildAgent)
1745 {
1746 // // m_log.Debug("DEBUG: HandleAgentUpdate: child agent");
1747 return;
1748 }
1749
1750 ++m_movementUpdateCount;
1751 if (m_movementUpdateCount < 1)
1752 m_movementUpdateCount = 1;
1753
1754
1755 AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
1756
1757 // Camera location in world. We'll need to raytrace
1758 // from this location from time to time.
1759 CameraPosition = agentData.CameraCenter;
1760 if (Vector3.Distance(m_lastCameraPosition, CameraPosition) >= Scene.RootReprioritizationDistance)
1761 {
1762 ReprioritizeUpdates();
1763 m_lastCameraPosition = CameraPosition;
1764 }
1765
1766 // Use these three vectors to figure out what the agent is looking at
1767 // Convert it to a Matrix and/or Quaternion
1768 CameraAtAxis = agentData.CameraAtAxis;
1769 CameraLeftAxis = agentData.CameraLeftAxis;
1770 CameraUpAxis = agentData.CameraUpAxis;
1771
1772 // The Agent's Draw distance setting
1773 // When we get to the point of re-computing neighbors everytime this
1774 // changes, then start using the agent's drawdistance rather than the
1775 // region's draw distance.
1776 // DrawDistance = agentData.Far;
1777 DrawDistance = Scene.DefaultDrawDistance;
1778
1779 // Check if Client has camera in 'follow cam' or 'build' mode.
1780 Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation);
1781
1782 m_followCamAuto = ((CameraUpAxis.Z > 0.959f && CameraUpAxis.Z < 0.98f)
1783 && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
1784
1785
1786 //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
1787 // Raycast from the avatar's head to the camera to see if there's anything blocking the view
1788 if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
1789 {
1790 if (m_followCamAuto)
1791 {
1792 Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
1793 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(CameraPosition - posAdjusted), Vector3.Distance(CameraPosition, posAdjusted) + 0.3f, RayCastCameraCallback);
1794 }
1795 }
1796
1797 TriggerScenePresenceUpdated();
1798 }
1799
1770 /// <summary> 1800 /// <summary>
1771 /// Calculate an update to move the presence to the set target. 1801 /// Calculate an update to move the presence to the set target.
1772 /// </summary> 1802 /// </summary>
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index 3726191..9b69da3 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -687,6 +687,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
687 public event Action<IClientAPI, bool> OnCompleteMovementToRegion; 687 public event Action<IClientAPI, bool> OnCompleteMovementToRegion;
688 public event UpdateAgent OnPreAgentUpdate; 688 public event UpdateAgent OnPreAgentUpdate;
689 public event UpdateAgent OnAgentUpdate; 689 public event UpdateAgent OnAgentUpdate;
690 public event UpdateAgent OnAgentCameraUpdate;
690 public event AgentRequestSit OnAgentRequestSit; 691 public event AgentRequestSit OnAgentRequestSit;
691 public event AgentSit OnAgentSit; 692 public event AgentSit OnAgentSit;
692 public event AvatarPickerRequest OnAvatarPickerRequest; 693 public event AvatarPickerRequest OnAvatarPickerRequest;
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 592e4e1..6c38b65 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -258,6 +258,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
258 public event Action<IClientAPI, bool> OnCompleteMovementToRegion; 258 public event Action<IClientAPI, bool> OnCompleteMovementToRegion;
259 public event UpdateAgent OnPreAgentUpdate; 259 public event UpdateAgent OnPreAgentUpdate;
260 public event UpdateAgent OnAgentUpdate; 260 public event UpdateAgent OnAgentUpdate;
261 public event UpdateAgent OnAgentCameraUpdate;
261 public event AgentRequestSit OnAgentRequestSit; 262 public event AgentRequestSit OnAgentRequestSit;
262 public event AgentSit OnAgentSit; 263 public event AgentSit OnAgentSit;
263 public event AvatarPickerRequest OnAvatarPickerRequest; 264 public event AvatarPickerRequest OnAvatarPickerRequest;
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index 2fc3f0b..5d7349a 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -106,6 +106,7 @@ namespace OpenSim.Tests.Common.Mock
106 public event Action<IClientAPI, bool> OnCompleteMovementToRegion; 106 public event Action<IClientAPI, bool> OnCompleteMovementToRegion;
107 public event UpdateAgent OnPreAgentUpdate; 107 public event UpdateAgent OnPreAgentUpdate;
108 public event UpdateAgent OnAgentUpdate; 108 public event UpdateAgent OnAgentUpdate;
109 public event UpdateAgent OnAgentCameraUpdate;
109 public event AgentRequestSit OnAgentRequestSit; 110 public event AgentRequestSit OnAgentRequestSit;
110 public event AgentSit OnAgentSit; 111 public event AgentSit OnAgentSit;
111 public event AvatarPickerRequest OnAvatarPickerRequest; 112 public event AvatarPickerRequest OnAvatarPickerRequest;