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;
|
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();
|
||||||
QuadTree.Subdivide();
|
QuadTree.Subdivide();
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ using OpenSim.Framework.Utilities;
|
||||||
using OpenSim.Region.Environment.Interfaces;
|
using OpenSim.Region.Environment.Interfaces;
|
||||||
using OpenSim.Region.Environment.Scenes.Scripting;
|
using OpenSim.Region.Environment.Scenes.Scripting;
|
||||||
using OpenSim.Region.Physics.Manager;
|
using OpenSim.Region.Physics.Manager;
|
||||||
|
using OpenSim.Region.Environment.Types;
|
||||||
|
|
||||||
namespace OpenSim.Region.Environment.Scenes
|
namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
|
@ -681,15 +682,13 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
|
List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
|
||||||
for (int i = 0; i < avatars.Count; i++)
|
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)
|
public void AddFullUpdateToAvatar(ScenePresence presence)
|
||||||
{
|
{
|
||||||
presence.AddFullPart(this);
|
presence.QueuePartForUpdate(this);
|
||||||
//presence.QueuePartForUpdate(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -745,15 +744,13 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
|
List<ScenePresence> avatars = m_parentGroup.GetScenePresences();
|
||||||
for (int i = 0; i < avatars.Count; i++)
|
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)
|
public void AddTerseUpdateToAvatar(ScenePresence presence)
|
||||||
{
|
{
|
||||||
presence.AddTersePart(this);
|
presence.QueuePartForUpdate(this);
|
||||||
// presence.QueuePartForUpdate(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -35,6 +35,7 @@ using OpenSim.Framework.Interfaces;
|
||||||
using OpenSim.Framework.Types;
|
using OpenSim.Framework.Types;
|
||||||
using OpenSim.Framework.Utilities;
|
using OpenSim.Framework.Utilities;
|
||||||
using OpenSim.Region.Physics.Manager;
|
using OpenSim.Region.Physics.Manager;
|
||||||
|
using OpenSim.Region.Environment.Types;
|
||||||
|
|
||||||
namespace OpenSim.Region.Environment.Scenes
|
namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
|
@ -89,11 +90,13 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
|
|
||||||
//public List<SceneObjectGroup> InterestList = new List<SceneObjectGroup>();
|
//public List<SceneObjectGroup> InterestList = new List<SceneObjectGroup>();
|
||||||
|
|
||||||
// private Queue<SceneObjectGroup> m_fullGroupUpdates = new Queue<SceneObjectGroup>();
|
// private string m_currentQuadNode = " ";
|
||||||
// private Queue<SceneObjectGroup> m_terseGroupUpdates = new Queue<SceneObjectGroup>();
|
|
||||||
|
|
||||||
private readonly Queue<SceneObjectPart> m_fullPartUpdates = new Queue<SceneObjectPart>();
|
// private Queue<SceneObjectPart> m_fullPartUpdates = new Queue<SceneObjectPart>();
|
||||||
private readonly Queue<SceneObjectPart> m_tersePartUpdates = 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
|
#region Properties
|
||||||
|
|
||||||
|
@ -277,53 +280,69 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public void AddTersePart(SceneObjectPart part)
|
public void QueuePartForUpdate(SceneObjectPart part)
|
||||||
{
|
{
|
||||||
m_tersePartUpdates.Enqueue(part);
|
//if (InterestList.Contains(part.ParentGroup))
|
||||||
}
|
//{
|
||||||
|
lock (m_partsUpdateQueue)
|
||||||
public void AddFullPart(SceneObjectPart part)
|
{
|
||||||
{
|
m_partsUpdateQueue.Enqueue(part);
|
||||||
m_fullPartUpdates.Enqueue(part);
|
}
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendPrimUpdates()
|
public void SendPrimUpdates()
|
||||||
{
|
{
|
||||||
if (m_tersePartUpdates.Count > 0)
|
// if (m_scene.QuadTree.GetNodeID(this.AbsolutePosition.X, this.AbsolutePosition.Y) != m_currentQuadNode)
|
||||||
|
//{
|
||||||
|
// this.UpdateQuadTreeNode();
|
||||||
|
//this.RefreshQuadObject();
|
||||||
|
//}
|
||||||
|
|
||||||
|
if (m_partsUpdateQueue.Count > 0)
|
||||||
{
|
{
|
||||||
bool terse = true;
|
bool runUpdate = true;
|
||||||
int terseCount = 0;
|
int updateCount = 0;
|
||||||
|
while (runUpdate)
|
||||||
while (terse)
|
|
||||||
{
|
{
|
||||||
SceneObjectPart part = m_tersePartUpdates.Dequeue();
|
SceneObjectPart part = m_partsUpdateQueue.Dequeue();
|
||||||
part.SendTerseUpdate(m_controllingClient);
|
if (m_updateTimes.ContainsKey(part.UUID))
|
||||||
terseCount++;
|
|
||||||
|
|
||||||
if ((m_tersePartUpdates.Count < 1) | (terseCount > 30))
|
|
||||||
{
|
{
|
||||||
terse = false;
|
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
|
||||||
}
|
|
||||||
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;
|
//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_partsUpdateQueue.Count < 1 | updateCount > 60)
|
||||||
|
{
|
||||||
|
runUpdate = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#region Status Methods
|
#region Status Methods
|
||||||
|
|
||||||
public void MakeAvatarPhysical(LLVector3 pos, bool isFlying)
|
public void MakeAvatarPhysical(LLVector3 pos, bool isFlying)
|
||||||
|
@ -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)
|
public override void SetText(string text, Vector3 color, double alpha)
|
||||||
{
|
{
|
||||||
throw new Exception("Can't set Text on avatar.");
|
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_leftY;
|
||||||
private short m_width;
|
private short m_width;
|
||||||
private short m_height;
|
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_parent = parent;
|
||||||
|
m_quadID = quadID;
|
||||||
m_leftX = leftX;
|
m_leftX = leftX;
|
||||||
m_leftY = leftY;
|
m_leftY = leftY;
|
||||||
m_width = width;
|
m_width = width;
|
||||||
m_height = height;
|
m_height = height;
|
||||||
|
// Console.WriteLine("creating quadtree node " + m_quadID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddObject(SceneObjectGroup obj)
|
public void AddObject(SceneObjectGroup obj)
|
||||||
|
@ -34,9 +38,9 @@ namespace OpenSim.Region.Environment.Types
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (obj.AbsolutePosition.X < (m_leftX + (m_width/2)))
|
if (obj.AbsolutePosition.X < (m_leftX + (m_width / 2)))
|
||||||
{
|
{
|
||||||
if (obj.AbsolutePosition.Y < (m_leftY + (m_height/2)))
|
if (obj.AbsolutePosition.Y < (m_leftY + (m_height / 2)))
|
||||||
{
|
{
|
||||||
m_childNodes[0].AddObject(obj);
|
m_childNodes[0].AddObject(obj);
|
||||||
}
|
}
|
||||||
|
@ -47,7 +51,7 @@ namespace OpenSim.Region.Environment.Types
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (obj.AbsolutePosition.Y < (m_leftY + (m_height/2)))
|
if (obj.AbsolutePosition.Y < (m_leftY + (m_height / 2)))
|
||||||
{
|
{
|
||||||
m_childNodes[1].AddObject(obj);
|
m_childNodes[1].AddObject(obj);
|
||||||
}
|
}
|
||||||
|
@ -64,17 +68,10 @@ namespace OpenSim.Region.Environment.Types
|
||||||
if (m_childNodes == null)
|
if (m_childNodes == null)
|
||||||
{
|
{
|
||||||
m_childNodes = new BasicQuadTreeNode[4];
|
m_childNodes = new BasicQuadTreeNode[4];
|
||||||
m_childNodes[0] =
|
m_childNodes[0] = new BasicQuadTreeNode(this, m_quadID + "1/", m_leftX, m_leftY, (short)(m_width / 2), (short)(m_height / 2));
|
||||||
new BasicQuadTreeNode(this, 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[1] =
|
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));
|
||||||
new BasicQuadTreeNode(this, (short) (m_leftX + (m_width/2)), m_leftY, (short) (m_width/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));
|
||||||
(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));
|
|
||||||
}
|
}
|
||||||
else
|
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)
|
if (m_childNodes == null)
|
||||||
{
|
{
|
||||||
return m_objects;
|
return new List<SceneObjectGroup>(m_objects);
|
||||||
}
|
}
|
||||||
else
|
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);
|
return m_childNodes[0].GetObjectsFrom(x, y);
|
||||||
}
|
}
|
||||||
|
@ -106,7 +103,7 @@ namespace OpenSim.Region.Environment.Types
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (y < (m_leftY + (m_height/2)))
|
if (y < m_leftY + (m_height / 2))
|
||||||
{
|
{
|
||||||
return m_childNodes[1].GetObjectsFrom(x, y);
|
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()
|
public void Update()
|
||||||
{
|
{
|
||||||
if (m_childNodes != null)
|
if (m_childNodes != null)
|
||||||
|
@ -132,8 +183,7 @@ namespace OpenSim.Region.Environment.Types
|
||||||
List<SceneObjectGroup> outBounds = new List<SceneObjectGroup>();
|
List<SceneObjectGroup> outBounds = new List<SceneObjectGroup>();
|
||||||
foreach (SceneObjectGroup group in m_objects)
|
foreach (SceneObjectGroup group in m_objects)
|
||||||
{
|
{
|
||||||
if (((group.AbsolutePosition.X > m_leftX) && (group.AbsolutePosition.X < (m_leftX + m_width))) &&
|
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))))
|
||||||
((group.AbsolutePosition.Y > m_leftY) && (group.AbsolutePosition.Y < (m_leftY + m_height))))
|
|
||||||
{
|
{
|
||||||
//still in bounds
|
//still in bounds
|
||||||
}
|
}
|
||||||
|
@ -157,8 +207,7 @@ namespace OpenSim.Region.Environment.Types
|
||||||
|
|
||||||
public void PassUp(SceneObjectGroup group)
|
public void PassUp(SceneObjectGroup group)
|
||||||
{
|
{
|
||||||
if (((group.AbsolutePosition.X > m_leftX) && (group.AbsolutePosition.X < (m_leftX + m_width))) &&
|
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))))
|
||||||
((group.AbsolutePosition.Y > m_leftY) && (group.AbsolutePosition.Y < (m_leftY + m_height))))
|
|
||||||
{
|
{
|
||||||
AddObject(group);
|
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