Some changes to the sending of updates of SceneObjects to clients, that I did a few weeks ago but never committed (and never completely finished what I had planned).
							parent
							
								
									e7869d0666
								
							
						
					
					
						commit
						86e5f82cb1
					
				|  | @ -189,7 +189,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
| 
 | ||||
|             m_eventManager.OnPermissionError += SendPermissionAlert; | ||||
| 
 | ||||
|             QuadTree = new BasicQuadTreeNode(null, 0, 0, 256, 256); | ||||
|             QuadTree = new BasicQuadTreeNode(null, "/0/", 0, 0, 256, 256); | ||||
|             QuadTree.Subdivide(); | ||||
|             QuadTree.Subdivide(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ using OpenSim.Framework.Utilities; | |||
| using OpenSim.Region.Environment.Interfaces; | ||||
| using OpenSim.Region.Environment.Scenes.Scripting; | ||||
| using OpenSim.Region.Physics.Manager; | ||||
| using OpenSim.Region.Environment.Types; | ||||
| 
 | ||||
| namespace OpenSim.Region.Environment.Scenes | ||||
| { | ||||
|  | @ -681,15 +682,13 @@ namespace OpenSim.Region.Environment.Scenes | |||
|             List<ScenePresence> avatars = m_parentGroup.GetScenePresences(); | ||||
|             for (int i = 0; i < avatars.Count; i++) | ||||
|             { | ||||
|                 avatars[i].AddFullPart(this); | ||||
|                 // avatars[i].QueuePartForUpdate(this); | ||||
|                  avatars[i].QueuePartForUpdate(this); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void AddFullUpdateToAvatar(ScenePresence presence) | ||||
|         { | ||||
|             presence.AddFullPart(this); | ||||
|             //presence.QueuePartForUpdate(this); | ||||
|             presence.QueuePartForUpdate(this); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|  | @ -745,15 +744,13 @@ namespace OpenSim.Region.Environment.Scenes | |||
|             List<ScenePresence> avatars = m_parentGroup.GetScenePresences(); | ||||
|             for (int i = 0; i < avatars.Count; i++) | ||||
|             { | ||||
|                 avatars[i].AddTersePart(this); | ||||
|                 // avatars[i].QueuePartForUpdate(this); | ||||
|                  avatars[i].QueuePartForUpdate(this); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void AddTerseUpdateToAvatar(ScenePresence presence) | ||||
|         { | ||||
|             presence.AddTersePart(this); | ||||
|             // presence.QueuePartForUpdate(this); | ||||
|              presence.QueuePartForUpdate(this); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|  |  | |||
|  | @ -35,6 +35,7 @@ using OpenSim.Framework.Interfaces; | |||
| using OpenSim.Framework.Types; | ||||
| using OpenSim.Framework.Utilities; | ||||
| using OpenSim.Region.Physics.Manager; | ||||
| using OpenSim.Region.Environment.Types; | ||||
| 
 | ||||
| namespace OpenSim.Region.Environment.Scenes | ||||
| { | ||||
|  | @ -89,11 +90,13 @@ namespace OpenSim.Region.Environment.Scenes | |||
| 
 | ||||
|         //public List<SceneObjectGroup> InterestList = new List<SceneObjectGroup>(); | ||||
| 
 | ||||
|         // private Queue<SceneObjectGroup> m_fullGroupUpdates = new Queue<SceneObjectGroup>(); | ||||
|         // private Queue<SceneObjectGroup> m_terseGroupUpdates = new Queue<SceneObjectGroup>(); | ||||
|        // private string m_currentQuadNode = " "; | ||||
| 
 | ||||
|         private readonly Queue<SceneObjectPart> m_fullPartUpdates = new Queue<SceneObjectPart>(); | ||||
|         private readonly Queue<SceneObjectPart> m_tersePartUpdates = new Queue<SceneObjectPart>(); | ||||
|        // private Queue<SceneObjectPart> m_fullPartUpdates = new Queue<SceneObjectPart>(); | ||||
|        //private Queue<SceneObjectPart> m_tersePartUpdates = new Queue<SceneObjectPart>(); | ||||
| 
 | ||||
|         private UpdateQueue m_partsUpdateQueue = new UpdateQueue(); | ||||
|         private Dictionary<LLUUID, ScenePartUpdate> m_updateTimes = new Dictionary<LLUUID, ScenePartUpdate>(); | ||||
| 
 | ||||
|         #region Properties | ||||
| 
 | ||||
|  | @ -277,52 +280,68 @@ namespace OpenSim.Region.Environment.Scenes | |||
| 
 | ||||
|         #endregion | ||||
| 
 | ||||
|         public void AddTersePart(SceneObjectPart part) | ||||
|         public void QueuePartForUpdate(SceneObjectPart part) | ||||
|         { | ||||
|             m_tersePartUpdates.Enqueue(part); | ||||
|             //if (InterestList.Contains(part.ParentGroup)) | ||||
|             //{ | ||||
|             lock (m_partsUpdateQueue) | ||||
|             { | ||||
|                 m_partsUpdateQueue.Enqueue(part); | ||||
|             } | ||||
| 
 | ||||
|         public void AddFullPart(SceneObjectPart part) | ||||
|         { | ||||
|             m_fullPartUpdates.Enqueue(part); | ||||
|             // } | ||||
|         } | ||||
| 
 | ||||
|         public void SendPrimUpdates() | ||||
|         { | ||||
|             if (m_tersePartUpdates.Count > 0) | ||||
|             { | ||||
|                 bool terse = true; | ||||
|                 int terseCount = 0; | ||||
|             // if (m_scene.QuadTree.GetNodeID(this.AbsolutePosition.X, this.AbsolutePosition.Y) != m_currentQuadNode) | ||||
|             //{ | ||||
|             //  this.UpdateQuadTreeNode(); | ||||
|             //this.RefreshQuadObject(); | ||||
|             //} | ||||
| 
 | ||||
|                 while (terse) | ||||
|             if (m_partsUpdateQueue.Count > 0) | ||||
|             { | ||||
|                     SceneObjectPart part = m_tersePartUpdates.Dequeue(); | ||||
|                     part.SendTerseUpdate(m_controllingClient); | ||||
|                     terseCount++; | ||||
|                 bool runUpdate = true; | ||||
|                 int updateCount = 0; | ||||
|                 while (runUpdate) | ||||
|                 { | ||||
|                     SceneObjectPart part = m_partsUpdateQueue.Dequeue(); | ||||
|                     if (m_updateTimes.ContainsKey(part.UUID)) | ||||
|                     { | ||||
|                         ScenePartUpdate update = m_updateTimes[part.UUID]; | ||||
|                         if (update.LastFullUpdateTime < part.TimeStampFull) | ||||
|                         { | ||||
|                             //need to do a full update | ||||
|                             part.SendFullUpdate(this.ControllingClient); | ||||
|                             update.LastFullUpdateTime = (uint)Util.UnixTimeSinceEpoch(); | ||||
|                             updateCount++; | ||||
|                         } | ||||
|                         else if (update.LastTerseUpdateTime < part.TimeStampTerse) | ||||
|                         { | ||||
|                             part.SendTerseUpdate(this.ControllingClient); | ||||
|                             update.LastTerseUpdateTime = (uint)Util.UnixTimeSinceEpoch(); | ||||
|                             updateCount++; | ||||
|                         } | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         //never been sent to client before so do full update | ||||
|                         part.SendFullUpdate(this.ControllingClient); | ||||
|                         ScenePartUpdate update = new ScenePartUpdate(); | ||||
|                         update.FullID = part.UUID; | ||||
|                         update.LastFullUpdateTime = (uint)Util.UnixTimeSinceEpoch(); | ||||
|                         m_updateTimes.Add(part.UUID, update); | ||||
|                         updateCount++; | ||||
|                     } | ||||
| 
 | ||||
|                     if ((m_tersePartUpdates.Count < 1) | (terseCount > 30)) | ||||
|                     if (m_partsUpdateQueue.Count < 1 | updateCount > 60) | ||||
|                     { | ||||
|                         terse = false; | ||||
|                         runUpdate = false; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|             if (m_fullPartUpdates.Count > 0) | ||||
|             { | ||||
|                 bool full = true; | ||||
|                 int fullCount = 0; | ||||
| 
 | ||||
|                 while (full) | ||||
|                 { | ||||
|                     SceneObjectPart part = m_fullPartUpdates.Dequeue(); | ||||
|                     part.SendFullUpdate(m_controllingClient); | ||||
|                     fullCount++; | ||||
|                     if ((m_fullPartUpdates.Count < 1) | (fullCount > 40)) | ||||
|                     { | ||||
|                         full = false; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #region Status Methods | ||||
| 
 | ||||
|  | @ -901,6 +920,22 @@ namespace OpenSim.Region.Environment.Scenes | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public class ScenePartUpdate | ||||
|         { | ||||
|             public LLUUID FullID; | ||||
|             public uint LastFullUpdateTime; | ||||
|             public uint LastTerseUpdateTime; | ||||
| 
 | ||||
|             public ScenePartUpdate() | ||||
|             { | ||||
|                 FullID = LLUUID.Zero; | ||||
|                 LastFullUpdateTime = 0; | ||||
|                 LastTerseUpdateTime = 0; | ||||
|             } | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public override void SetText(string text, Vector3 color, double alpha) | ||||
|         { | ||||
|             throw new Exception("Can't set Text on avatar."); | ||||
|  |  | |||
|  | @ -13,14 +13,18 @@ namespace OpenSim.Region.Environment.Types | |||
|         private short m_leftY; | ||||
|         private short m_width; | ||||
|         private short m_height; | ||||
|         //private int m_quadNumber; | ||||
|         private string m_quadID; | ||||
| 
 | ||||
|         public BasicQuadTreeNode(BasicQuadTreeNode parent, short leftX, short leftY, short width, short height) | ||||
|         public BasicQuadTreeNode(BasicQuadTreeNode parent, string quadID, short leftX, short leftY, short width, short height) | ||||
|         { | ||||
|             m_parent = parent; | ||||
|             m_quadID = quadID; | ||||
|             m_leftX = leftX; | ||||
|             m_leftY = leftY; | ||||
|             m_width = width; | ||||
|             m_height = height; | ||||
|             // Console.WriteLine("creating quadtree node " + m_quadID); | ||||
|         } | ||||
| 
 | ||||
|         public void AddObject(SceneObjectGroup obj) | ||||
|  | @ -64,17 +68,10 @@ namespace OpenSim.Region.Environment.Types | |||
|             if (m_childNodes == null) | ||||
|             { | ||||
|                 m_childNodes = new BasicQuadTreeNode[4]; | ||||
|                 m_childNodes[0] = | ||||
|                     new BasicQuadTreeNode(this, m_leftX, m_leftY, (short) (m_width/2), (short) (m_height/2)); | ||||
|                 m_childNodes[1] = | ||||
|                     new BasicQuadTreeNode(this, (short) (m_leftX + (m_width/2)), m_leftY, (short) (m_width/2), | ||||
|                                           (short) (m_height/2)); | ||||
|                 m_childNodes[2] = | ||||
|                     new BasicQuadTreeNode(this, m_leftX, (short) (m_leftY + (m_height/2)), (short) (m_width/2), | ||||
|                                           (short) (m_height/2)); | ||||
|                 m_childNodes[3] = | ||||
|                     new BasicQuadTreeNode(this, (short) (m_leftX + (m_width/2)), (short) (m_height + (m_height/2)), | ||||
|                                           (short) (m_width/2), (short) (m_height/2)); | ||||
|                 m_childNodes[0] = new BasicQuadTreeNode(this, m_quadID + "1/", m_leftX, m_leftY, (short)(m_width / 2), (short)(m_height / 2)); | ||||
|                 m_childNodes[1] = new BasicQuadTreeNode(this, m_quadID + "2/", (short)(m_leftX + (m_width / 2)), m_leftY, (short)(m_width / 2), (short)(m_height / 2)); | ||||
|                 m_childNodes[2] = new BasicQuadTreeNode(this, m_quadID + "3/", m_leftX, (short)(m_leftY + (m_height / 2)), (short)(m_width / 2), (short)(m_height / 2)); | ||||
|                 m_childNodes[3] = new BasicQuadTreeNode(this, m_quadID + "4/", (short)(m_leftX + (m_width / 2)), (short)(m_height + (m_height / 2)), (short)(m_width / 2), (short)(m_height / 2)); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  | @ -85,17 +82,17 @@ namespace OpenSim.Region.Environment.Types | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public List<SceneObjectGroup> GetObjectsFrom(int x, int y) | ||||
|         public List<SceneObjectGroup> GetObjectsFrom(float x, float y) | ||||
|         { | ||||
|             if (m_childNodes == null) | ||||
|             { | ||||
|                 return m_objects; | ||||
|                 return new List<SceneObjectGroup>(m_objects); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (x < (m_leftX + (m_width/2))) | ||||
|                 if (x < m_leftX + (m_width / 2)) | ||||
|                 { | ||||
|                     if (y < (m_leftY + (m_height/2))) | ||||
|                     if (y < m_leftY + (m_height / 2)) | ||||
|                     { | ||||
|                         return m_childNodes[0].GetObjectsFrom(x, y); | ||||
|                     } | ||||
|  | @ -106,7 +103,7 @@ namespace OpenSim.Region.Environment.Types | |||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     if (y < (m_leftY + (m_height/2))) | ||||
|                     if (y < m_leftY + (m_height / 2)) | ||||
|                     { | ||||
|                         return m_childNodes[1].GetObjectsFrom(x, y); | ||||
|                     } | ||||
|  | @ -118,6 +115,60 @@ namespace OpenSim.Region.Environment.Types | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public List<SceneObjectGroup> GetObjectsFrom(string nodeName) | ||||
|         { | ||||
|             if (nodeName == m_quadID) | ||||
|             { | ||||
|                 return new List<SceneObjectGroup>(m_objects); | ||||
|             } | ||||
|             else if (m_childNodes != null) | ||||
|             { | ||||
|                 for (int i = 0; i < 4; i++) | ||||
|                 { | ||||
|                     List<SceneObjectGroup> retVal; | ||||
|                     retVal = m_childNodes[i].GetObjectsFrom(nodeName); | ||||
|                     if (retVal != null) | ||||
|                     { | ||||
|                         return retVal; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         public string GetNodeID(float x, float y) | ||||
|         { | ||||
|             if (m_childNodes == null) | ||||
|             { | ||||
|                 return m_quadID; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (x < m_leftX + (m_width / 2)) | ||||
|                 { | ||||
|                     if (y < m_leftY + (m_height / 2)) | ||||
|                     { | ||||
|                         return m_childNodes[0].GetNodeID(x, y); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         return m_childNodes[2].GetNodeID(x, y); | ||||
|                     } | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     if (y < m_leftY + (m_height / 2)) | ||||
|                     { | ||||
|                         return m_childNodes[1].GetNodeID(x, y); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         return m_childNodes[3].GetNodeID(x, y); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void Update() | ||||
|         { | ||||
|             if (m_childNodes != null) | ||||
|  | @ -132,8 +183,7 @@ namespace OpenSim.Region.Environment.Types | |||
|                 List<SceneObjectGroup> outBounds = new List<SceneObjectGroup>(); | ||||
|                 foreach (SceneObjectGroup group in m_objects) | ||||
|                 { | ||||
|                     if (((group.AbsolutePosition.X > m_leftX) && (group.AbsolutePosition.X < (m_leftX + m_width))) && | ||||
|                         ((group.AbsolutePosition.Y > m_leftY) && (group.AbsolutePosition.Y < (m_leftY + m_height)))) | ||||
|                     if (((group.AbsolutePosition.X > m_leftX) && (group.AbsolutePosition.X < (m_leftX + m_width))) && ((group.AbsolutePosition.Y > m_leftY) && (group.AbsolutePosition.Y < (m_leftY + m_height)))) | ||||
|                     { | ||||
|                         //still in bounds | ||||
|                     } | ||||
|  | @ -157,8 +207,7 @@ namespace OpenSim.Region.Environment.Types | |||
| 
 | ||||
|         public void PassUp(SceneObjectGroup group) | ||||
|         { | ||||
|             if (((group.AbsolutePosition.X > m_leftX) && (group.AbsolutePosition.X < (m_leftX + m_width))) && | ||||
|                 ((group.AbsolutePosition.Y > m_leftY) && (group.AbsolutePosition.Y < (m_leftY + m_height)))) | ||||
|             if (((group.AbsolutePosition.X > m_leftX) && (group.AbsolutePosition.X < (m_leftX + m_width))) && ((group.AbsolutePosition.Y > m_leftY) && (group.AbsolutePosition.Y < (m_leftY + m_height)))) | ||||
|             { | ||||
|                 AddObject(group); | ||||
|             } | ||||
|  | @ -170,5 +219,12 @@ namespace OpenSim.Region.Environment.Types | |||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public string[] GetNeighbours(string nodeName) | ||||
|         { | ||||
|             string[] retVal = new string[1]; | ||||
|             retVal[0] = ""; | ||||
|             return retVal; | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	 MW
						MW