Object update prioritization by Jim Greensky of Intel Labs, part one. This implements a simple distance prioritizer based on initial agent positions. Re-prioritizing and more advanced priority algorithms will follow soon
parent
df2d5a460f
commit
4b75353cbf
|
@ -996,19 +996,19 @@ namespace OpenSim.Client.MXP.ClientStack
|
||||||
// Need to translate to MXP somehow
|
// Need to translate to MXP somehow
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID, uint avatarLocalID, Vector3 position, byte[] textureEntry, uint parentID, Quaternion rotation)
|
public void SendAvatarData(SendAvatarData data)
|
||||||
{
|
{
|
||||||
//ScenePresence presence=((Scene)this.Scene).GetScenePresence(avatarID);
|
//ScenePresence presence=((Scene)this.Scene).GetScenePresence(avatarID);
|
||||||
UUID ownerID = avatarID;
|
UUID ownerID = data.avatarID;
|
||||||
MXPSendAvatarData(firstName + " " + lastName, ownerID, UUID.Zero, avatarID, avatarLocalID, position, rotation);
|
MXPSendAvatarData(data.firstName + " " + data.lastName, ownerID, UUID.Zero, data.avatarID, data.avatarLocalID, data.Pos, data.rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, Vector3 velocity, Quaternion rotation, UUID uuid)
|
public void SendAvatarTerseUpdate(SendAvatarTerseData data)
|
||||||
{
|
{
|
||||||
MovementEventMessage me = new MovementEventMessage();
|
MovementEventMessage me = new MovementEventMessage();
|
||||||
me.ObjectIndex = localID;
|
me.ObjectIndex = data.localID;
|
||||||
me.Location =ToOmVector(position);
|
me.Location = ToOmVector(data.position);
|
||||||
me.Orientation = ToOmQuaternion(rotation);
|
me.Orientation = ToOmQuaternion(data.rotation);
|
||||||
|
|
||||||
Session.Send(me);
|
Session.Send(me);
|
||||||
}
|
}
|
||||||
|
@ -1028,22 +1028,17 @@ namespace OpenSim.Client.MXP.ClientStack
|
||||||
// Need to translate to MXP somehow
|
// Need to translate to MXP somehow
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags, UUID objectID, UUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem, byte clickAction, byte material, byte[] textureanim, bool attachment, uint AttachPoint, UUID AssetId, UUID SoundId, double SoundVolume, byte SoundFlags, double SoundRadius)
|
public void SendPrimitiveToClient(SendPrimitiveData data)
|
||||||
{
|
{
|
||||||
MXPSendPrimitive(localID, ownerID, acc, rvel, primShape, pos, objectID, vel, rotation, flags,text,color,parentID,particleSystem,clickAction,material,textureanim);
|
MXPSendPrimitive(data.localID, data.ownerID, data.acc, data.rvel, data.primShape, data.pos, data.objectID, data.vel, data.rotation, data.flags, data.text, data.color, data.parentID, data.particleSystem, data.clickAction, data.material, data.textureanim);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags, UUID objectID, UUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem, byte clickAction, byte material)
|
public void SendPrimTerseUpdate(SendPrimitiveTerseData data)
|
||||||
{
|
|
||||||
MXPSendPrimitive(localID, ownerID, acc, rvel, primShape, pos, objectID, vel, rotation, flags, text, color, parentID, particleSystem, clickAction, material, new byte[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, UUID AssetId, UUID owner, int attachPoint)
|
|
||||||
{
|
{
|
||||||
MovementEventMessage me = new MovementEventMessage();
|
MovementEventMessage me = new MovementEventMessage();
|
||||||
me.ObjectIndex = localID;
|
me.ObjectIndex = data.localID;
|
||||||
me.Location = ToOmVector(position);
|
me.Location = ToOmVector(data.position);
|
||||||
me.Orientation = ToOmQuaternion(rotation);
|
me.Orientation = ToOmQuaternion(data.rotation);
|
||||||
Session.Send(me);
|
Session.Send(me);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -560,12 +560,12 @@ namespace OpenSim.Client.VWoHTTP.ClientStack
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID, uint avatarLocalID, Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation)
|
public void SendAvatarData(SendAvatarData data)
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, Vector3 velocity, Quaternion rotation, UUID uuid)
|
public void SendAvatarTerseUpdate(SendAvatarTerseData data)
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
}
|
}
|
||||||
|
@ -585,17 +585,12 @@ namespace OpenSim.Client.VWoHTTP.ClientStack
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags, UUID objectID, UUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem, byte clickAction, byte material, byte[] textureanim, bool attachment, uint AttachPoint, UUID AssetId, UUID SoundId, double SoundVolume, byte SoundFlags, double SoundRadius)
|
public void SendPrimitiveToClient(SendPrimitiveData data)
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags, UUID objectID, UUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem, byte clickAction, byte material)
|
public void SendPrimTerseUpdate(SendPrimitiveTerseData data)
|
||||||
{
|
|
||||||
throw new System.NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, UUID AssetId, UUID owner, int attachPoint)
|
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
|
@ -517,6 +517,233 @@ namespace OpenSim.Framework
|
||||||
public float dwell;
|
public float dwell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct SendAvatarData
|
||||||
|
{
|
||||||
|
private ulong m_regionHandle;
|
||||||
|
private string m_firstName;
|
||||||
|
private string m_lastName;
|
||||||
|
private string m_grouptitle;
|
||||||
|
private UUID m_avatarID;
|
||||||
|
private uint m_avatarLocalID;
|
||||||
|
private Vector3 m_Pos;
|
||||||
|
private byte[] m_textureEntry;
|
||||||
|
private uint m_parentID;
|
||||||
|
private Quaternion m_rotation;
|
||||||
|
|
||||||
|
public SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID,
|
||||||
|
uint avatarLocalID,
|
||||||
|
Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation)
|
||||||
|
{
|
||||||
|
this.m_regionHandle = regionHandle;
|
||||||
|
this.m_firstName = firstName;
|
||||||
|
this.m_lastName = lastName;
|
||||||
|
this.m_grouptitle = grouptitle;
|
||||||
|
this.m_avatarID = avatarID;
|
||||||
|
this.m_avatarLocalID = avatarLocalID;
|
||||||
|
this.m_Pos = Pos;
|
||||||
|
this.m_textureEntry = textureEntry;
|
||||||
|
this.m_parentID = parentID;
|
||||||
|
this.m_rotation = rotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ulong regionHandle { get { return this.m_regionHandle; } }
|
||||||
|
public string firstName { get { return this.m_firstName; } }
|
||||||
|
public string lastName { get { return this.m_lastName; } }
|
||||||
|
public string grouptitle { get { return this.m_grouptitle; } }
|
||||||
|
public UUID avatarID { get { return this.m_avatarID; } }
|
||||||
|
public uint avatarLocalID { get { return this.m_avatarLocalID; } }
|
||||||
|
public Vector3 Pos { get { return this.m_Pos; } }
|
||||||
|
public byte[] textureEntry { get { return this.m_textureEntry; } }
|
||||||
|
public uint parentID { get { return this.m_parentID; } }
|
||||||
|
public Quaternion rotation { get { return this.m_rotation; } }
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct SendAvatarTerseData
|
||||||
|
{
|
||||||
|
private ulong m_regionHandle;
|
||||||
|
private ushort m_timeDilation;
|
||||||
|
private uint m_localID;
|
||||||
|
private Vector3 m_position;
|
||||||
|
private Vector3 m_velocity;
|
||||||
|
private Quaternion m_rotation;
|
||||||
|
private UUID m_agentid;
|
||||||
|
private double m_priority;
|
||||||
|
|
||||||
|
public SendAvatarTerseData(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
|
||||||
|
Vector3 velocity, Quaternion rotation, UUID agentid, double priority)
|
||||||
|
{
|
||||||
|
this.m_regionHandle = regionHandle;
|
||||||
|
this.m_timeDilation = timeDilation;
|
||||||
|
this.m_localID = localID;
|
||||||
|
this.m_position = position;
|
||||||
|
this.m_velocity = velocity;
|
||||||
|
this.m_rotation = rotation;
|
||||||
|
this.m_agentid = agentid;
|
||||||
|
this.m_priority = priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ulong regionHandle { get { return this.m_regionHandle; } }
|
||||||
|
public ushort timeDilation { get { return this.m_timeDilation; } }
|
||||||
|
public uint localID { get { return this.m_localID; } }
|
||||||
|
public Vector3 position { get { return this.m_position; } }
|
||||||
|
public Vector3 velocity { get { return this.m_velocity; } }
|
||||||
|
public Quaternion rotation { get { return this.m_rotation; } }
|
||||||
|
public UUID agentid { get { return this.m_agentid; } }
|
||||||
|
public double priority { get { return this.m_priority; } }
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct SendPrimitiveTerseData
|
||||||
|
{
|
||||||
|
private ulong m_regionHandle;
|
||||||
|
private ushort m_timeDilation;
|
||||||
|
private uint m_localID;
|
||||||
|
private Vector3 m_position;
|
||||||
|
private Quaternion m_rotation;
|
||||||
|
private Vector3 m_velocity;
|
||||||
|
private Vector3 m_rotationalvelocity;
|
||||||
|
private byte m_state;
|
||||||
|
private UUID m_AssetId;
|
||||||
|
private UUID m_owner;
|
||||||
|
private int m_attachPoint;
|
||||||
|
private double m_priority;
|
||||||
|
|
||||||
|
public SendPrimitiveTerseData(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
|
||||||
|
Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state,
|
||||||
|
UUID AssetId, UUID owner, int attachPoint, double priority)
|
||||||
|
{
|
||||||
|
this.m_regionHandle = regionHandle;
|
||||||
|
this.m_timeDilation = timeDilation;
|
||||||
|
this.m_localID = localID;
|
||||||
|
this.m_position = position;
|
||||||
|
this.m_rotation = rotation;
|
||||||
|
this.m_velocity = velocity;
|
||||||
|
this.m_rotationalvelocity = rotationalvelocity;
|
||||||
|
this.m_state = state;
|
||||||
|
this.m_AssetId = AssetId;
|
||||||
|
this.m_owner = owner;
|
||||||
|
this.m_attachPoint = attachPoint;
|
||||||
|
this.m_priority = priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ulong regionHandle { get { return this.m_regionHandle; } }
|
||||||
|
public ushort timeDilation { get { return this.m_timeDilation; } }
|
||||||
|
public uint localID { get { return this.m_localID; } }
|
||||||
|
public Vector3 position { get { return this.m_position; } }
|
||||||
|
public Quaternion rotation { get { return this.m_rotation; } }
|
||||||
|
public Vector3 velocity { get { return this.m_velocity; } }
|
||||||
|
public Vector3 rotationalvelocity { get { return this.m_rotationalvelocity; } }
|
||||||
|
public byte state { get { return this.m_state; } }
|
||||||
|
public UUID AssetId { get { return this.m_AssetId; } }
|
||||||
|
public UUID owner { get { return this.m_owner; } }
|
||||||
|
public int attachPoint { get { return this.m_attachPoint; } }
|
||||||
|
public double priority { get { return this.m_priority; } }
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct SendPrimitiveData
|
||||||
|
{
|
||||||
|
private ulong m_regionHandle;
|
||||||
|
private ushort m_timeDilation;
|
||||||
|
private uint m_localID;
|
||||||
|
private PrimitiveBaseShape m_primShape;
|
||||||
|
private Vector3 m_pos;
|
||||||
|
private Vector3 m_vel;
|
||||||
|
private Vector3 m_acc;
|
||||||
|
private Quaternion m_rotation;
|
||||||
|
private Vector3 m_rvel;
|
||||||
|
private uint m_flags;
|
||||||
|
private UUID m_objectID;
|
||||||
|
private UUID m_ownerID;
|
||||||
|
private string m_text;
|
||||||
|
private byte[] m_color;
|
||||||
|
private uint m_parentID;
|
||||||
|
private byte[] m_particleSystem;
|
||||||
|
private byte m_clickAction;
|
||||||
|
private byte m_material;
|
||||||
|
private byte[] m_textureanim;
|
||||||
|
private bool m_attachment;
|
||||||
|
private uint m_AttachPoint;
|
||||||
|
private UUID m_AssetId;
|
||||||
|
private UUID m_SoundId;
|
||||||
|
private double m_SoundVolume;
|
||||||
|
private byte m_SoundFlags;
|
||||||
|
private double m_SoundRadius;
|
||||||
|
private double m_priority;
|
||||||
|
|
||||||
|
public SendPrimitiveData(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
|
||||||
|
Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel,
|
||||||
|
uint flags, UUID objectID, UUID ownerID, string text, byte[] color,
|
||||||
|
uint parentID, byte[] particleSystem, byte clickAction, byte material, double priority) :
|
||||||
|
this(regionHandle, timeDilation, localID, primShape, pos, vel, acc, rotation, rvel, flags, objectID,
|
||||||
|
ownerID, text, color, parentID, particleSystem, clickAction, material, new byte[0], false, 0, UUID.Zero,
|
||||||
|
UUID.Zero, 0, 0, 0, priority) { }
|
||||||
|
|
||||||
|
public SendPrimitiveData(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
|
||||||
|
Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel,
|
||||||
|
uint flags,
|
||||||
|
UUID objectID, UUID ownerID, string text, byte[] color, uint parentID,
|
||||||
|
byte[] particleSystem,
|
||||||
|
byte clickAction, byte material, byte[] textureanim, bool attachment,
|
||||||
|
uint AttachPoint, UUID AssetId, UUID SoundId, double SoundVolume, byte SoundFlags,
|
||||||
|
double SoundRadius, double priority)
|
||||||
|
{
|
||||||
|
this.m_regionHandle = regionHandle;
|
||||||
|
this.m_timeDilation = timeDilation;
|
||||||
|
this.m_localID = localID;
|
||||||
|
this.m_primShape = primShape;
|
||||||
|
this.m_pos = pos;
|
||||||
|
this.m_vel = vel;
|
||||||
|
this.m_acc = acc;
|
||||||
|
this.m_rotation = rotation;
|
||||||
|
this.m_rvel = rvel;
|
||||||
|
this.m_flags = flags;
|
||||||
|
this.m_objectID = objectID;
|
||||||
|
this.m_ownerID = ownerID;
|
||||||
|
this.m_text = text;
|
||||||
|
this.m_color = color;
|
||||||
|
this.m_parentID = parentID;
|
||||||
|
this.m_particleSystem = particleSystem;
|
||||||
|
this.m_clickAction = clickAction;
|
||||||
|
this.m_material = material;
|
||||||
|
this.m_textureanim = textureanim;
|
||||||
|
this.m_attachment = attachment;
|
||||||
|
this.m_AttachPoint = AttachPoint;
|
||||||
|
this.m_AssetId = AssetId;
|
||||||
|
this.m_SoundId = SoundId;
|
||||||
|
this.m_SoundVolume = SoundVolume;
|
||||||
|
this.m_SoundFlags = SoundFlags;
|
||||||
|
this.m_SoundRadius = SoundRadius;
|
||||||
|
this.m_priority = priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ulong regionHandle { get { return this.m_regionHandle; } }
|
||||||
|
public ushort timeDilation { get { return this.m_timeDilation; } }
|
||||||
|
public uint localID { get { return this.m_localID; } }
|
||||||
|
public PrimitiveBaseShape primShape { get { return this.m_primShape; } }
|
||||||
|
public Vector3 pos { get { return this.m_pos; } }
|
||||||
|
public Vector3 vel { get { return this.m_vel; } }
|
||||||
|
public Vector3 acc { get { return this.m_acc; } }
|
||||||
|
public Quaternion rotation { get { return this.m_rotation; } }
|
||||||
|
public Vector3 rvel { get { return this.m_rvel; } }
|
||||||
|
public uint flags { get { return this.m_flags; } }
|
||||||
|
public UUID objectID { get { return this.m_objectID; } }
|
||||||
|
public UUID ownerID { get { return this.m_ownerID; } }
|
||||||
|
public string text { get { return this.m_text; } }
|
||||||
|
public byte[] color { get { return this.m_color; } }
|
||||||
|
public uint parentID { get { return this.m_parentID; } }
|
||||||
|
public byte[] particleSystem { get { return this.m_particleSystem; } }
|
||||||
|
public byte clickAction { get { return this.m_clickAction; } }
|
||||||
|
public byte material { get { return this.m_material; } }
|
||||||
|
public byte[] textureanim { get { return this.m_textureanim; } }
|
||||||
|
public bool attachment { get { return this.m_attachment; } }
|
||||||
|
public uint AttachPoint { get { return this.m_AttachPoint; } }
|
||||||
|
public UUID AssetId { get { return this.m_AssetId; } }
|
||||||
|
public UUID SoundId { get { return this.m_SoundId; } }
|
||||||
|
public double SoundVolume { get { return this.m_SoundVolume; } }
|
||||||
|
public byte SoundFlags { get { return this.m_SoundFlags; } }
|
||||||
|
public double SoundRadius { get { return this.m_SoundRadius; } }
|
||||||
|
public double priority { get { return this.m_priority; } }
|
||||||
|
}
|
||||||
|
|
||||||
public interface IClientAPI
|
public interface IClientAPI
|
||||||
{
|
{
|
||||||
Vector3 StartPos { get; set; }
|
Vector3 StartPos { get; set; }
|
||||||
|
@ -877,37 +1104,18 @@ namespace OpenSim.Framework
|
||||||
void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance);
|
void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance);
|
||||||
void SendPayPrice(UUID objectID, int[] payPrice);
|
void SendPayPrice(UUID objectID, int[] payPrice);
|
||||||
|
|
||||||
void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID,
|
void SendAvatarData(SendAvatarData data);
|
||||||
uint avatarLocalID,
|
|
||||||
Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation);
|
|
||||||
|
|
||||||
void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
|
void SendAvatarTerseUpdate(SendAvatarTerseData data);
|
||||||
Vector3 velocity, Quaternion rotation, UUID agentid);
|
|
||||||
|
|
||||||
void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations);
|
void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations);
|
||||||
|
|
||||||
void AttachObject(uint localID, Quaternion rotation, byte attachPoint, UUID ownerID);
|
void AttachObject(uint localID, Quaternion rotation, byte attachPoint, UUID ownerID);
|
||||||
void SetChildAgentThrottle(byte[] throttle);
|
void SetChildAgentThrottle(byte[] throttle);
|
||||||
|
|
||||||
void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
|
void SendPrimitiveToClient(SendPrimitiveData data);
|
||||||
Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel,
|
|
||||||
uint flags,
|
|
||||||
UUID objectID, UUID ownerID, string text, byte[] color, uint parentID,
|
|
||||||
byte[] particleSystem,
|
|
||||||
byte clickAction, byte material, byte[] textureanim, bool attachment,
|
|
||||||
uint AttachPoint, UUID AssetId, UUID SoundId, double SoundVolume, byte SoundFlags,
|
|
||||||
double SoundRadius);
|
|
||||||
|
|
||||||
|
void SendPrimTerseUpdate(SendPrimitiveTerseData data);
|
||||||
void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
|
|
||||||
Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel,
|
|
||||||
uint flags, UUID objectID, UUID ownerID, string text, byte[] color,
|
|
||||||
uint parentID, byte[] particleSystem, byte clickAction, byte material);
|
|
||||||
|
|
||||||
|
|
||||||
void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
|
|
||||||
Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state,
|
|
||||||
UUID AssetId, UUID owner, int attachPoint);
|
|
||||||
|
|
||||||
void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List<InventoryItemBase> items,
|
void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List<InventoryItemBase> items,
|
||||||
List<InventoryFolderBase> folders, bool fetchFolders,
|
List<InventoryFolderBase> folders, bool fetchFolders,
|
||||||
|
|
|
@ -320,14 +320,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
private readonly IGroupsModule m_GroupsModule;
|
private readonly IGroupsModule m_GroupsModule;
|
||||||
|
|
||||||
private int m_cachedTextureSerial;
|
private int m_cachedTextureSerial;
|
||||||
private Timer m_avatarTerseUpdateTimer;
|
private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates =
|
||||||
private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates_ =
|
|
||||||
new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
|
new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
|
||||||
private Timer m_primTerseUpdateTimer;
|
private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates =
|
||||||
private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates_ =
|
|
||||||
new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
|
new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
|
||||||
private Timer m_primFullUpdateTimer;
|
private PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates =
|
||||||
private PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates_ =
|
|
||||||
new PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock>();
|
new PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock>();
|
||||||
private int m_moneyBalance;
|
private int m_moneyBalance;
|
||||||
private int m_animationSequenceNumber = 1;
|
private int m_animationSequenceNumber = 1;
|
||||||
|
@ -353,9 +350,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
// LL uses these limits, apparently. Compressed terse would be 23, but we don't have that yet
|
// LL uses these limits, apparently. Compressed terse would be 23, but we don't have that yet
|
||||||
protected int m_primTerseUpdatesPerPacket = 10;
|
protected int m_primTerseUpdatesPerPacket = 10;
|
||||||
protected int m_primFullUpdatesPerPacket = 14;
|
protected int m_primFullUpdatesPerPacket = 14;
|
||||||
protected int m_primTerseUpdateRate = 10;
|
|
||||||
protected int m_primFullUpdateRate = 14;
|
|
||||||
protected int m_avatarTerseUpdateRate = 50;
|
|
||||||
protected int m_avatarTerseUpdatesPerPacket = 5;
|
protected int m_avatarTerseUpdatesPerPacket = 5;
|
||||||
/// <summary>Number of texture packets to put on the queue each time the
|
/// <summary>Number of texture packets to put on the queue each time the
|
||||||
/// OnQueueEmpty event is triggered for the texture category</summary>
|
/// OnQueueEmpty event is triggered for the texture category</summary>
|
||||||
|
@ -479,25 +473,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
// Remove ourselves from the scene
|
// Remove ourselves from the scene
|
||||||
m_scene.RemoveClient(AgentId);
|
m_scene.RemoveClient(AgentId);
|
||||||
|
|
||||||
// Shut down timers. Thread Context of this method is murky. Lock all timers
|
|
||||||
if (m_avatarTerseUpdateTimer.Enabled)
|
|
||||||
lock (m_avatarTerseUpdateTimer)
|
|
||||||
m_avatarTerseUpdateTimer.Stop();
|
|
||||||
if (m_primTerseUpdateTimer.Enabled)
|
|
||||||
lock (m_primTerseUpdateTimer)
|
|
||||||
m_primTerseUpdateTimer.Stop();
|
|
||||||
if (m_primFullUpdateTimer.Enabled)
|
|
||||||
lock (m_primFullUpdateTimer)
|
|
||||||
m_primFullUpdateTimer.Stop();
|
|
||||||
|
|
||||||
// We can't reach into other scenes and close the connection
|
// We can't reach into other scenes and close the connection
|
||||||
// We need to do this over grid communications
|
// We need to do this over grid communications
|
||||||
//m_scene.CloseAllAgents(CircuitCode);
|
//m_scene.CloseAllAgents(CircuitCode);
|
||||||
|
|
||||||
m_avatarTerseUpdateTimer.Dispose();
|
|
||||||
m_primTerseUpdateTimer.Dispose();
|
|
||||||
m_primFullUpdateTimer.Dispose();
|
|
||||||
|
|
||||||
// Disable UDP handling for this client
|
// Disable UDP handling for this client
|
||||||
m_udpClient.Shutdown();
|
m_udpClient.Shutdown();
|
||||||
|
|
||||||
|
@ -524,18 +503,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
public void Stop()
|
public void Stop()
|
||||||
{
|
{
|
||||||
// Shut down timers. Thread Context is Murky, lock all timers!
|
|
||||||
if (m_avatarTerseUpdateTimer.Enabled)
|
|
||||||
lock (m_avatarTerseUpdateTimer)
|
|
||||||
m_avatarTerseUpdateTimer.Stop();
|
|
||||||
|
|
||||||
if (m_primTerseUpdateTimer.Enabled)
|
|
||||||
lock (m_primTerseUpdateTimer)
|
|
||||||
m_primTerseUpdateTimer.Stop();
|
|
||||||
|
|
||||||
if (m_primFullUpdateTimer.Enabled)
|
|
||||||
lock (m_primFullUpdateTimer)
|
|
||||||
m_primFullUpdateTimer.Stop();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion Client Methods
|
#endregion Client Methods
|
||||||
|
@ -631,18 +599,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
public virtual void Start()
|
public virtual void Start()
|
||||||
{
|
{
|
||||||
m_avatarTerseUpdateTimer = new Timer(m_avatarTerseUpdateRate);
|
|
||||||
m_avatarTerseUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessAvatarTerseUpdates);
|
|
||||||
m_avatarTerseUpdateTimer.AutoReset = false;
|
|
||||||
|
|
||||||
m_primTerseUpdateTimer = new Timer(m_primTerseUpdateRate);
|
|
||||||
m_primTerseUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessPrimTerseUpdates);
|
|
||||||
m_primTerseUpdateTimer.AutoReset = false;
|
|
||||||
|
|
||||||
m_primFullUpdateTimer = new Timer(m_primFullUpdateRate);
|
|
||||||
m_primFullUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessPrimFullUpdates);
|
|
||||||
m_primFullUpdateTimer.AutoReset = false;
|
|
||||||
|
|
||||||
m_scene.AddNewClient(this);
|
m_scene.AddNewClient(this);
|
||||||
|
|
||||||
RefreshGroupMembership();
|
RefreshGroupMembership();
|
||||||
|
@ -3394,28 +3350,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// send a objectupdate packet with information about the clients avatar
|
/// send a objectupdate packet with information about the clients avatar
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID,
|
public void SendAvatarData(SendAvatarData data)
|
||||||
uint avatarLocalID, Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation)
|
|
||||||
{
|
{
|
||||||
ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
|
ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
|
||||||
// TODO: don't create new blocks if recycling an old packet
|
// TODO: don't create new blocks if recycling an old packet
|
||||||
objupdate.RegionData.RegionHandle = regionHandle;
|
objupdate.RegionData.RegionHandle = data.regionHandle;
|
||||||
objupdate.RegionData.TimeDilation = ushort.MaxValue;
|
objupdate.RegionData.TimeDilation = ushort.MaxValue;
|
||||||
objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
|
objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
|
||||||
objupdate.ObjectData[0] = CreateDefaultAvatarPacket(textureEntry);
|
objupdate.ObjectData[0] = CreateDefaultAvatarPacket(data.textureEntry);
|
||||||
|
|
||||||
//give this avatar object a local id and assign the user a name
|
//give this avatar object a local id and assign the user a name
|
||||||
objupdate.ObjectData[0].ID = avatarLocalID;
|
objupdate.ObjectData[0].ID = data.avatarLocalID;
|
||||||
objupdate.ObjectData[0].FullID = avatarID;
|
objupdate.ObjectData[0].FullID = data.avatarID;
|
||||||
objupdate.ObjectData[0].ParentID = parentID;
|
objupdate.ObjectData[0].ParentID = data.parentID;
|
||||||
objupdate.ObjectData[0].NameValue =
|
objupdate.ObjectData[0].NameValue =
|
||||||
Utils.StringToBytes("FirstName STRING RW SV " + firstName + "\nLastName STRING RW SV " + lastName + "\nTitle STRING RW SV " + grouptitle);
|
Utils.StringToBytes("FirstName STRING RW SV " + data.firstName + "\nLastName STRING RW SV " + data.lastName + "\nTitle STRING RW SV " + data.grouptitle);
|
||||||
|
|
||||||
Vector3 pos2 = new Vector3(Pos.X, Pos.Y, Pos.Z);
|
Vector3 pos2 = new Vector3(data.Pos.X, data.Pos.Y, data.Pos.Z);
|
||||||
byte[] pb = pos2.GetBytes();
|
byte[] pb = pos2.GetBytes();
|
||||||
Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
|
Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
|
||||||
|
|
||||||
byte[] rot = rotation.GetBytes();
|
byte[] rot = data.rotation.GetBytes();
|
||||||
Array.Copy(rot, 0, objupdate.ObjectData[0].ObjectData, 52, rot.Length);
|
Array.Copy(rot, 0, objupdate.ObjectData[0].ObjectData, 52, rot.Length);
|
||||||
|
|
||||||
objupdate.Header.Zerocoded = true;
|
objupdate.Header.Zerocoded = true;
|
||||||
|
@ -3426,38 +3381,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
/// Send a terse positional/rotation/velocity update about an avatar
|
/// Send a terse positional/rotation/velocity update about an avatar
|
||||||
/// to the client. This avatar can be that of the client itself.
|
/// to the client. This avatar can be that of the client itself.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual void SendAvatarTerseUpdate(ulong regionHandle,
|
public virtual void SendAvatarTerseUpdate(SendAvatarTerseData data)
|
||||||
ushort timeDilation, uint localID, Vector3 position,
|
|
||||||
Vector3 velocity, Quaternion rotation, UUID agentid)
|
|
||||||
{
|
{
|
||||||
|
if (data.priority == double.NaN)
|
||||||
|
{
|
||||||
|
m_log.Error("[LLClientView] SendAvatarTerseUpdate received a NaN priority, dropping update");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Quaternion rotation = data.rotation;
|
||||||
|
|
||||||
if (rotation.X == rotation.Y &&
|
if (rotation.X == rotation.Y &&
|
||||||
rotation.Y == rotation.Z &&
|
rotation.Y == rotation.Z &&
|
||||||
rotation.Z == rotation.W && rotation.W == 0)
|
rotation.Z == rotation.W && rotation.W == 0)
|
||||||
rotation = Quaternion.Identity;
|
rotation = Quaternion.Identity;
|
||||||
|
|
||||||
ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock =
|
ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock =
|
||||||
CreateAvatarImprovedBlock(localID, position, velocity,rotation);
|
CreateAvatarImprovedBlock(data.localID, data.position, data.velocity, rotation);
|
||||||
|
|
||||||
lock (m_avatarTerseUpdates_.SyncRoot)
|
lock (m_avatarTerseUpdates.SyncRoot)
|
||||||
{
|
m_avatarTerseUpdates.Enqueue(data.priority, terseBlock, data.localID);
|
||||||
m_avatarTerseUpdates_.Enqueue(DateTime.Now.ToOADate(), terseBlock, localID);
|
|
||||||
|
|
||||||
// If packet is full or own movement packet, send it.
|
|
||||||
if (m_avatarTerseUpdates_.Count >= m_avatarTerseUpdatesPerPacket)
|
|
||||||
{
|
|
||||||
ProcessAvatarTerseUpdates(this, null);
|
|
||||||
}
|
|
||||||
else if (m_avatarTerseUpdates_.Count == 1)
|
|
||||||
{
|
|
||||||
lock (m_avatarTerseUpdateTimer)
|
|
||||||
m_avatarTerseUpdateTimer.Start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ProcessAvatarTerseUpdates(object sender, ElapsedEventArgs e)
|
private void ProcessAvatarTerseUpdates()
|
||||||
{
|
{
|
||||||
lock (m_avatarTerseUpdates_.SyncRoot)
|
lock (m_avatarTerseUpdates.SyncRoot)
|
||||||
{
|
{
|
||||||
ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
|
ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
|
||||||
|
|
||||||
|
@ -3468,8 +3416,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
(ushort)(Scene.TimeDilation * ushort.MaxValue);
|
(ushort)(Scene.TimeDilation * ushort.MaxValue);
|
||||||
|
|
||||||
int max = m_avatarTerseUpdatesPerPacket;
|
int max = m_avatarTerseUpdatesPerPacket;
|
||||||
if (max > m_avatarTerseUpdates_.Count)
|
if (max > m_avatarTerseUpdates.Count)
|
||||||
max = m_avatarTerseUpdates_.Count;
|
max = m_avatarTerseUpdates.Count;
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
|
@ -3482,12 +3430,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
for (count = 0 ; count < max ; count++)
|
for (count = 0 ; count < max ; count++)
|
||||||
{
|
{
|
||||||
int length = 0;
|
int length = 0;
|
||||||
m_avatarTerseUpdates_.Peek().ToBytes(blockbuffer, ref length);
|
m_avatarTerseUpdates.Peek().ToBytes(blockbuffer, ref length);
|
||||||
length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer);
|
length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer);
|
||||||
if (size + length > Packet.MTU)
|
if (size + length > Packet.MTU)
|
||||||
break;
|
break;
|
||||||
size += length;
|
size += length;
|
||||||
updates.Enqueue(m_avatarTerseUpdates_.Dequeue());
|
updates.Enqueue(m_avatarTerseUpdates.Dequeue());
|
||||||
}
|
}
|
||||||
|
|
||||||
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[count];
|
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[count];
|
||||||
|
@ -3497,14 +3445,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
terse.Header.Reliable = false;
|
terse.Header.Reliable = false;
|
||||||
terse.Header.Zerocoded = true;
|
terse.Header.Zerocoded = true;
|
||||||
// FIXME: Move this to ThrottleOutPacketType.State when the real prioritization code is committed
|
|
||||||
OutPacket(terse, ThrottleOutPacketType.Task);
|
|
||||||
|
|
||||||
if (m_avatarTerseUpdates_.Count == 0)
|
OutPacket(terse, ThrottleOutPacketType.State);
|
||||||
{
|
|
||||||
lock (m_avatarTerseUpdateTimer)
|
|
||||||
m_avatarTerseUpdateTimer.Stop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3569,54 +3511,42 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
OutPacket(attach, ThrottleOutPacketType.Task);
|
OutPacket(attach, ThrottleOutPacketType.Task);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendPrimitiveToClient(
|
public void SendPrimitiveToClient(SendPrimitiveData data)
|
||||||
ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
|
|
||||||
Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel,
|
|
||||||
uint flags, UUID objectID, UUID ownerID, string text, byte[] color,
|
|
||||||
uint parentID, byte[] particleSystem, byte clickAction, byte material)
|
|
||||||
{
|
{
|
||||||
byte[] textureanim = new byte[0];
|
if (data.priority == double.NaN)
|
||||||
|
{
|
||||||
SendPrimitiveToClient(regionHandle, timeDilation, localID, primShape, pos, vel,
|
m_log.Error("[LLClientView] SendPrimitiveToClient received a NaN priority, dropping update");
|
||||||
acc, rotation, rvel, flags,
|
|
||||||
objectID, ownerID, text, color, parentID, particleSystem,
|
|
||||||
clickAction, material, textureanim, false, 0, UUID.Zero, UUID.Zero, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SendPrimitiveToClient(
|
|
||||||
ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
|
|
||||||
Vector3 pos, Vector3 velocity, Vector3 acceleration, Quaternion rotation, Vector3 rotational_velocity,
|
|
||||||
uint flags,
|
|
||||||
UUID objectID, UUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem,
|
|
||||||
byte clickAction, byte material, byte[] textureanim, bool attachment, uint AttachPoint, UUID AssetId, UUID SoundId, double SoundGain, byte SoundFlags, double SoundRadius)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (AttachPoint > 30 && ownerID != AgentId) // Someone else's HUD
|
|
||||||
return;
|
return;
|
||||||
if (primShape.PCode == 9 && primShape.State != 0 && parentID == 0)
|
}
|
||||||
|
|
||||||
|
Quaternion rotation = data.rotation;
|
||||||
|
|
||||||
|
if (data.AttachPoint > 30 && data.ownerID != AgentId) // Someone else's HUD
|
||||||
|
return;
|
||||||
|
if (data.primShape.PCode == 9 && data.primShape.State != 0 && data.parentID == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0)
|
if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0.0f)
|
||||||
rotation = Quaternion.Identity;
|
rotation = Quaternion.Identity;
|
||||||
|
|
||||||
ObjectUpdatePacket.ObjectDataBlock objectData = CreatePrimUpdateBlock(primShape, flags);
|
ObjectUpdatePacket.ObjectDataBlock objectData = CreatePrimUpdateBlock(data.primShape, data.flags);
|
||||||
|
|
||||||
objectData.ID = localID;
|
objectData.ID = data.localID;
|
||||||
objectData.FullID = objectID;
|
objectData.FullID = data.objectID;
|
||||||
objectData.OwnerID = ownerID;
|
objectData.OwnerID = data.ownerID;
|
||||||
|
|
||||||
objectData.Text = Util.StringToBytes256(text);
|
objectData.Text = Util.StringToBytes256(data.text);
|
||||||
objectData.TextColor[0] = color[0];
|
objectData.TextColor[0] = data.color[0];
|
||||||
objectData.TextColor[1] = color[1];
|
objectData.TextColor[1] = data.color[1];
|
||||||
objectData.TextColor[2] = color[2];
|
objectData.TextColor[2] = data.color[2];
|
||||||
objectData.TextColor[3] = color[3];
|
objectData.TextColor[3] = data.color[3];
|
||||||
objectData.ParentID = parentID;
|
objectData.ParentID = data.parentID;
|
||||||
objectData.PSBlock = particleSystem;
|
objectData.PSBlock = data.particleSystem;
|
||||||
objectData.ClickAction = clickAction;
|
objectData.ClickAction = data.clickAction;
|
||||||
objectData.Material = material;
|
objectData.Material = data.material;
|
||||||
objectData.Flags = 0;
|
objectData.Flags = 0;
|
||||||
|
|
||||||
if (attachment)
|
if (data.attachment)
|
||||||
{
|
{
|
||||||
// Necessary???
|
// Necessary???
|
||||||
objectData.JointAxisOrAnchor = new Vector3(0, 0, 2);
|
objectData.JointAxisOrAnchor = new Vector3(0, 0, 2);
|
||||||
|
@ -3624,14 +3554,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
// Item from inventory???
|
// Item from inventory???
|
||||||
objectData.NameValue =
|
objectData.NameValue =
|
||||||
Utils.StringToBytes("AttachItemID STRING RW SV " + AssetId.Guid);
|
Utils.StringToBytes("AttachItemID STRING RW SV " + data.AssetId.Guid);
|
||||||
objectData.State = (byte)((AttachPoint % 16) * 16 + (AttachPoint / 16));
|
objectData.State = (byte)((data.AttachPoint % 16) * 16 + (data.AttachPoint / 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Xantor 20080528: Send sound info as well
|
// Xantor 20080528: Send sound info as well
|
||||||
// Xantor 20080530: Zero out everything if there's no SoundId, so zerocompression will work again
|
// Xantor 20080530: Zero out everything if there's no SoundId, so zerocompression will work again
|
||||||
objectData.Sound = SoundId;
|
objectData.Sound = data.SoundId;
|
||||||
if (SoundId == UUID.Zero)
|
if (data.SoundId == UUID.Zero)
|
||||||
{
|
{
|
||||||
objectData.OwnerID = UUID.Zero;
|
objectData.OwnerID = UUID.Zero;
|
||||||
objectData.Gain = 0.0f;
|
objectData.Gain = 0.0f;
|
||||||
|
@ -3640,39 +3570,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
objectData.OwnerID = ownerID;
|
objectData.OwnerID = data.ownerID;
|
||||||
objectData.Gain = (float)SoundGain;
|
objectData.Gain = (float)data.SoundVolume;
|
||||||
objectData.Radius = (float)SoundRadius;
|
objectData.Radius = (float)data.SoundRadius;
|
||||||
objectData.Flags = SoundFlags;
|
objectData.Flags = data.SoundFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] pb = pos.GetBytes();
|
byte[] pb = data.pos.GetBytes();
|
||||||
Array.Copy(pb, 0, objectData.ObjectData, 0, pb.Length);
|
Buffer.BlockCopy(pb, 0, objectData.ObjectData, 0, pb.Length);
|
||||||
|
|
||||||
byte[] vel = velocity.GetBytes();
|
byte[] vel = data.vel.GetBytes();
|
||||||
Array.Copy(vel, 0, objectData.ObjectData, pb.Length, vel.Length);
|
Buffer.BlockCopy(vel, 0, objectData.ObjectData, pb.Length, vel.Length);
|
||||||
|
|
||||||
byte[] rot = rotation.GetBytes();
|
byte[] rot = rotation.GetBytes();
|
||||||
Array.Copy(rot, 0, objectData.ObjectData, 36, rot.Length);
|
Buffer.BlockCopy(rot, 0, objectData.ObjectData, 36, rot.Length);
|
||||||
|
|
||||||
byte[] rvel = rotational_velocity.GetBytes();
|
byte[] rvel = data.rvel.GetBytes();
|
||||||
Array.Copy(rvel, 0, objectData.ObjectData, 36 + rot.Length, rvel.Length);
|
Buffer.BlockCopy(rvel, 0, objectData.ObjectData, 36 + rot.Length, rvel.Length);
|
||||||
|
|
||||||
if (textureanim.Length > 0)
|
if (data.textureanim.Length > 0)
|
||||||
{
|
{
|
||||||
objectData.TextureAnim = textureanim;
|
objectData.TextureAnim = data.textureanim;
|
||||||
}
|
}
|
||||||
|
|
||||||
lock (m_primFullUpdates_.SyncRoot)
|
lock (m_primFullUpdates.SyncRoot)
|
||||||
{
|
m_primFullUpdates.Enqueue(data.priority, objectData, data.localID);
|
||||||
if (m_primFullUpdates_.Count == 0)
|
|
||||||
m_primFullUpdateTimer.Start();
|
|
||||||
|
|
||||||
m_primFullUpdates_.Enqueue(DateTime.Now.ToOADate(), objectData, localID);
|
|
||||||
|
|
||||||
if (m_primFullUpdates_.Count >= m_primFullUpdatesPerPacket)
|
|
||||||
ProcessPrimFullUpdates(this, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HandleQueueEmpty(ThrottleOutPacketType queue)
|
void HandleQueueEmpty(ThrottleOutPacketType queue)
|
||||||
|
@ -3682,6 +3604,33 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
case ThrottleOutPacketType.Texture:
|
case ThrottleOutPacketType.Texture:
|
||||||
ProcessTextureRequests();
|
ProcessTextureRequests();
|
||||||
break;
|
break;
|
||||||
|
case ThrottleOutPacketType.State:
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
lock (m_avatarTerseUpdates.SyncRoot)
|
||||||
|
count = m_avatarTerseUpdates.Count;
|
||||||
|
if (count > 0)
|
||||||
|
{
|
||||||
|
ProcessAvatarTerseUpdates();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (m_primFullUpdates.SyncRoot)
|
||||||
|
count = m_primFullUpdates.Count;
|
||||||
|
if (count > 0)
|
||||||
|
{
|
||||||
|
ProcessPrimFullUpdates();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (m_primTerseUpdates.SyncRoot)
|
||||||
|
count = m_primTerseUpdates.Count;
|
||||||
|
if (count > 0)
|
||||||
|
{
|
||||||
|
ProcessPrimTerseUpdates();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3691,18 +3640,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
m_imageManager.ProcessImageQueue(m_textureSendLimit);
|
m_imageManager.ProcessImageQueue(m_textureSendLimit);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProcessPrimFullUpdates(object sender, ElapsedEventArgs e)
|
void ProcessPrimFullUpdates()
|
||||||
{
|
{
|
||||||
lock (m_primFullUpdates_.SyncRoot)
|
lock (m_primFullUpdates.SyncRoot)
|
||||||
{
|
{
|
||||||
if (m_primFullUpdates_.Count == 0 && m_primFullUpdateTimer.Enabled)
|
|
||||||
{
|
|
||||||
lock (m_primFullUpdateTimer)
|
|
||||||
m_primFullUpdateTimer.Stop();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ObjectUpdatePacket outPacket =
|
ObjectUpdatePacket outPacket =
|
||||||
(ObjectUpdatePacket)PacketPool.Instance.GetPacket(
|
(ObjectUpdatePacket)PacketPool.Instance.GetPacket(
|
||||||
PacketType.ObjectUpdate);
|
PacketType.ObjectUpdate);
|
||||||
|
@ -3712,7 +3653,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
outPacket.RegionData.TimeDilation =
|
outPacket.RegionData.TimeDilation =
|
||||||
(ushort)(Scene.TimeDilation * ushort.MaxValue);
|
(ushort)(Scene.TimeDilation * ushort.MaxValue);
|
||||||
|
|
||||||
int max = m_primFullUpdates_.Count;
|
int max = m_primFullUpdates.Count;
|
||||||
if (max > m_primFullUpdatesPerPacket)
|
if (max > m_primFullUpdatesPerPacket)
|
||||||
max = m_primFullUpdatesPerPacket;
|
max = m_primFullUpdatesPerPacket;
|
||||||
|
|
||||||
|
@ -3727,12 +3668,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
for (count = 0 ; count < max ; count++)
|
for (count = 0 ; count < max ; count++)
|
||||||
{
|
{
|
||||||
int length = 0;
|
int length = 0;
|
||||||
m_primFullUpdates_.Peek().ToBytes(blockbuffer, ref length);
|
m_primFullUpdates.Peek().ToBytes(blockbuffer, ref length);
|
||||||
length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer);
|
length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer);
|
||||||
if (size + length > Packet.MTU)
|
if (size + length > Packet.MTU)
|
||||||
break;
|
break;
|
||||||
size += length;
|
size += length;
|
||||||
updates.Enqueue(m_primFullUpdates_.Dequeue());
|
updates.Enqueue(m_primFullUpdates.Dequeue());
|
||||||
}
|
}
|
||||||
|
|
||||||
outPacket.ObjectData =
|
outPacket.ObjectData =
|
||||||
|
@ -3743,53 +3684,42 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
outPacket.Header.Zerocoded = true;
|
outPacket.Header.Zerocoded = true;
|
||||||
OutPacket(outPacket, ThrottleOutPacketType.State);
|
OutPacket(outPacket, ThrottleOutPacketType.State);
|
||||||
|
|
||||||
if (m_primFullUpdates_.Count == 0 && m_primFullUpdateTimer.Enabled)
|
|
||||||
lock (m_primFullUpdateTimer)
|
|
||||||
m_primFullUpdateTimer.Stop();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
|
//public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
|
||||||
Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, UUID AssetId, UUID ownerID, int attachPoint)
|
// Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, UUID AssetId, UUID ownerID, int attachPoint)
|
||||||
|
public void SendPrimTerseUpdate(SendPrimitiveTerseData data)
|
||||||
{
|
{
|
||||||
if (attachPoint > 30 && ownerID != AgentId) // Someone else's HUD
|
if (data.priority == double.NaN)
|
||||||
|
{
|
||||||
|
m_log.Error("[LLClientView] SendPrimTerseUpdate received a NaN priority, dropping update");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Quaternion rotation = data.rotation;
|
||||||
|
|
||||||
|
if (data.attachPoint > 30 && data.owner != AgentId) // Someone else's HUD
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0)
|
if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0)
|
||||||
rotation = Quaternion.Identity;
|
rotation = Quaternion.Identity;
|
||||||
|
|
||||||
ImprovedTerseObjectUpdatePacket.ObjectDataBlock objectData =
|
ImprovedTerseObjectUpdatePacket.ObjectDataBlock objectData =
|
||||||
CreatePrimImprovedBlock(localID, position, rotation,
|
CreatePrimImprovedBlock(data.localID, data.position, rotation,
|
||||||
velocity, rotationalvelocity, state);
|
data.velocity, data.rotationalvelocity, data.state);
|
||||||
|
|
||||||
lock (m_primTerseUpdates_.SyncRoot)
|
lock (m_primTerseUpdates.SyncRoot)
|
||||||
{
|
m_primTerseUpdates.Enqueue(data.priority, objectData, data.localID);
|
||||||
if (m_primTerseUpdates_.Count == 0)
|
|
||||||
m_primTerseUpdateTimer.Start();
|
|
||||||
|
|
||||||
m_primTerseUpdates_.Enqueue(DateTime.Now.ToOADate(), objectData, localID);
|
|
||||||
|
|
||||||
if (m_primTerseUpdates_.Count >= m_primTerseUpdatesPerPacket)
|
|
||||||
ProcessPrimTerseUpdates(this, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProcessPrimTerseUpdates(object sender, ElapsedEventArgs e)
|
void ProcessPrimTerseUpdates()
|
||||||
{
|
{
|
||||||
lock (m_primTerseUpdates_.SyncRoot)
|
lock (m_primTerseUpdates.SyncRoot)
|
||||||
{
|
{
|
||||||
if (m_primTerseUpdates_.Count == 0)
|
|
||||||
{
|
|
||||||
lock (m_primTerseUpdateTimer)
|
|
||||||
m_primTerseUpdateTimer.Stop();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImprovedTerseObjectUpdatePacket outPacket =
|
ImprovedTerseObjectUpdatePacket outPacket =
|
||||||
(ImprovedTerseObjectUpdatePacket)
|
(ImprovedTerseObjectUpdatePacket)
|
||||||
PacketPool.Instance.GetPacket(
|
PacketPool.Instance.GetPacket(
|
||||||
|
@ -3800,7 +3730,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
outPacket.RegionData.TimeDilation =
|
outPacket.RegionData.TimeDilation =
|
||||||
(ushort)(Scene.TimeDilation * ushort.MaxValue);
|
(ushort)(Scene.TimeDilation * ushort.MaxValue);
|
||||||
|
|
||||||
int max = m_primTerseUpdates_.Count;
|
int max = m_primTerseUpdates.Count;
|
||||||
if (max > m_primTerseUpdatesPerPacket)
|
if (max > m_primTerseUpdatesPerPacket)
|
||||||
max = m_primTerseUpdatesPerPacket;
|
max = m_primTerseUpdatesPerPacket;
|
||||||
|
|
||||||
|
@ -3815,12 +3745,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
for (count = 0 ; count < max ; count++)
|
for (count = 0 ; count < max ; count++)
|
||||||
{
|
{
|
||||||
int length = 0;
|
int length = 0;
|
||||||
m_primTerseUpdates_.Peek().ToBytes(blockbuffer, ref length);
|
m_primTerseUpdates.Peek().ToBytes(blockbuffer, ref length);
|
||||||
length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer);
|
length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer);
|
||||||
if (size + length > Packet.MTU)
|
if (size + length > Packet.MTU)
|
||||||
break;
|
break;
|
||||||
size += length;
|
size += length;
|
||||||
updates.Enqueue(m_primTerseUpdates_.Dequeue());
|
updates.Enqueue(m_primTerseUpdates.Dequeue());
|
||||||
}
|
}
|
||||||
|
|
||||||
outPacket.ObjectData =
|
outPacket.ObjectData =
|
||||||
|
@ -3833,26 +3763,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
outPacket.Header.Reliable = false;
|
outPacket.Header.Reliable = false;
|
||||||
outPacket.Header.Zerocoded = true;
|
outPacket.Header.Zerocoded = true;
|
||||||
OutPacket(outPacket, ThrottleOutPacketType.State);
|
OutPacket(outPacket, ThrottleOutPacketType.State);
|
||||||
|
|
||||||
if (m_primTerseUpdates_.Count == 0)
|
|
||||||
lock (m_primTerseUpdateTimer)
|
|
||||||
m_primTerseUpdateTimer.Stop();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FlushPrimUpdates()
|
public void FlushPrimUpdates()
|
||||||
{
|
{
|
||||||
while (m_primFullUpdates_.Count > 0)
|
while (m_primFullUpdates.Count > 0)
|
||||||
{
|
{
|
||||||
ProcessPrimFullUpdates(this, null);
|
ProcessPrimFullUpdates();
|
||||||
}
|
}
|
||||||
while (m_primTerseUpdates_.Count > 0)
|
while (m_primTerseUpdates.Count > 0)
|
||||||
{
|
{
|
||||||
ProcessPrimTerseUpdates(this, null);
|
ProcessPrimTerseUpdates();
|
||||||
}
|
}
|
||||||
while (m_avatarTerseUpdates_.Count > 0)
|
while (m_avatarTerseUpdates.Count > 0)
|
||||||
{
|
{
|
||||||
ProcessAvatarTerseUpdates(this, null);
|
ProcessAvatarTerseUpdates();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -499,13 +499,11 @@ namespace OpenSim.Region.Examples.SimpleModule
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID,
|
public virtual void SendAvatarData(SendAvatarData data)
|
||||||
uint avatarLocalID, Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID,
|
public virtual void SendAvatarTerseUpdate(SendAvatarTerseData data)
|
||||||
Vector3 position, Vector3 velocity, Quaternion rotation, UUID agentid)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -521,27 +519,11 @@ namespace OpenSim.Region.Examples.SimpleModule
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID,
|
public virtual void SendPrimitiveToClient(SendPrimitiveData data)
|
||||||
PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel,
|
|
||||||
Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags,
|
|
||||||
UUID objectID, UUID ownerID, string text, byte[] color,
|
|
||||||
uint parentID,
|
|
||||||
byte[] particleSystem, byte clickAction, byte material)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public virtual void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID,
|
|
||||||
PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel,
|
public virtual void SendPrimTerseUpdate(SendPrimitiveTerseData data)
|
||||||
Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags,
|
|
||||||
UUID objectID, UUID ownerID, string text, byte[] color,
|
|
||||||
uint parentID,
|
|
||||||
byte[] particleSystem, byte clickAction, byte material, byte[] textureanimation,
|
|
||||||
bool attachment, uint AttachmentPoint, UUID AssetId, UUID SoundId, double SoundVolume, byte SoundFlags, double SoundRadius)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
public virtual void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID,
|
|
||||||
Vector3 position, Quaternion rotation, Vector3 velocity,
|
|
||||||
Vector3 rotationalvelocity, byte state, UUID AssetId,
|
|
||||||
UUID ownerID, int attachPoint)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
{
|
{
|
||||||
void Reset();
|
void Reset();
|
||||||
void Close();
|
void Close();
|
||||||
int MaxPrimsPerFrame { get; set; }
|
|
||||||
void QueuePartForUpdate(SceneObjectPart part);
|
void QueuePartForUpdate(SceneObjectPart part);
|
||||||
void SendPrimUpdates();
|
void SendPrimUpdates();
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public partial class Scene : SceneBase
|
public partial class Scene : SceneBase
|
||||||
{
|
{
|
||||||
|
public enum UpdatePrioritizationSchemes {
|
||||||
|
Time = 0,
|
||||||
|
Distance = 1,
|
||||||
|
SimpleAngularDistance = 2,
|
||||||
|
}
|
||||||
|
|
||||||
public delegate void SynchronizeSceneHandler(Scene scene);
|
public delegate void SynchronizeSceneHandler(Scene scene);
|
||||||
public SynchronizeSceneHandler SynchronizeScene = null;
|
public SynchronizeSceneHandler SynchronizeScene = null;
|
||||||
|
|
||||||
|
@ -268,9 +274,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
private volatile bool shuttingdown = false;
|
private volatile bool shuttingdown = false;
|
||||||
|
|
||||||
private int m_lastUpdate = Environment.TickCount;
|
private int m_lastUpdate = Environment.TickCount;
|
||||||
private int m_maxPrimsPerFrame = 200;
|
|
||||||
private bool m_firstHeartbeat = true;
|
private bool m_firstHeartbeat = true;
|
||||||
|
|
||||||
|
private UpdatePrioritizationSchemes m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time;
|
||||||
|
|
||||||
private object m_deleting_scene_object = new object();
|
private object m_deleting_scene_object = new object();
|
||||||
|
|
||||||
// the minimum time that must elapse before a changed object will be considered for persisted
|
// the minimum time that must elapse before a changed object will be considered for persisted
|
||||||
|
@ -282,6 +289,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
#region Properties
|
#region Properties
|
||||||
|
|
||||||
|
public UpdatePrioritizationSchemes UpdatePrioritizationScheme { get { return this.m_update_prioritization_scheme; } }
|
||||||
|
|
||||||
public AgentCircuitManager AuthenticateHandler
|
public AgentCircuitManager AuthenticateHandler
|
||||||
{
|
{
|
||||||
get { return m_authenticateHandler; }
|
get { return m_authenticateHandler; }
|
||||||
|
@ -326,12 +335,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
get { return m_sceneGraph.m_syncRoot; }
|
get { return m_sceneGraph.m_syncRoot; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public int MaxPrimsPerFrame
|
|
||||||
{
|
|
||||||
get { return m_maxPrimsPerFrame; }
|
|
||||||
set { m_maxPrimsPerFrame = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This is for llGetRegionFPS
|
/// This is for llGetRegionFPS
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -509,7 +512,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "DotNetEngine");
|
m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "DotNetEngine");
|
||||||
|
|
||||||
m_maxPrimsPerFrame = startupConfig.GetInt("MaxPrimsPerFrame", 200);
|
|
||||||
IConfig packetConfig = m_config.Configs["PacketPool"];
|
IConfig packetConfig = m_config.Configs["PacketPool"];
|
||||||
if (packetConfig != null)
|
if (packetConfig != null)
|
||||||
{
|
{
|
||||||
|
@ -518,6 +520,28 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
|
|
||||||
m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl);
|
m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl);
|
||||||
|
|
||||||
|
IConfig interest_management_config = m_config.Configs["InterestManagement"];
|
||||||
|
if (interest_management_config != null)
|
||||||
|
{
|
||||||
|
string update_prioritization_scheme = interest_management_config.GetString("UpdatePrioritizationScheme", "Time").Trim().ToLower();
|
||||||
|
switch (update_prioritization_scheme)
|
||||||
|
{
|
||||||
|
case "time":
|
||||||
|
m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time;
|
||||||
|
break;
|
||||||
|
case "distance":
|
||||||
|
m_update_prioritization_scheme = UpdatePrioritizationSchemes.Distance;
|
||||||
|
break;
|
||||||
|
case "simpleangulardistance":
|
||||||
|
m_update_prioritization_scheme = UpdatePrioritizationSchemes.SimpleAngularDistance;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
m_log.Warn("[SCENE]: UpdatePrioritizationScheme was not recognized, setting to default settomg of Time");
|
||||||
|
m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
|
|
|
@ -613,7 +613,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
newAvatar = new ScenePresence(client, m_parentScene, m_regInfo, appearance);
|
newAvatar = new ScenePresence(client, m_parentScene, m_regInfo, appearance);
|
||||||
newAvatar.IsChildAgent = true;
|
newAvatar.IsChildAgent = true;
|
||||||
newAvatar.MaxPrimsPerFrame = m_parentScene.MaxPrimsPerFrame;
|
|
||||||
|
|
||||||
AddScenePresence(newAvatar);
|
AddScenePresence(newAvatar);
|
||||||
|
|
||||||
|
|
|
@ -1817,7 +1817,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public void ServiceObjectPropertiesFamilyRequest(IClientAPI remoteClient, UUID AgentID, uint RequestFlags)
|
public void ServiceObjectPropertiesFamilyRequest(IClientAPI remoteClient, UUID AgentID, uint RequestFlags)
|
||||||
{
|
{
|
||||||
|
|
||||||
remoteClient.SendObjectPropertiesFamilyData(RequestFlags, RootPart.UUID, RootPart.ObjectOwner, RootPart.GroupID, RootPart.BaseMask,
|
remoteClient.SendObjectPropertiesFamilyData(RequestFlags, RootPart.UUID, RootPart.OwnerID, RootPart.GroupID, RootPart.BaseMask,
|
||||||
RootPart.OwnerMask, RootPart.GroupMask, RootPart.EveryoneMask, RootPart.NextOwnerMask,
|
RootPart.OwnerMask, RootPart.GroupMask, RootPart.EveryoneMask, RootPart.NextOwnerMask,
|
||||||
RootPart.OwnershipCost, RootPart.ObjectSaleType, RootPart.SalePrice, RootPart.Category,
|
RootPart.OwnershipCost, RootPart.ObjectSaleType, RootPart.SalePrice, RootPart.Category,
|
||||||
RootPart.CreatorID, RootPart.Name, RootPart.Description);
|
RootPart.CreatorID, RootPart.Name, RootPart.Description);
|
||||||
|
@ -3343,5 +3343,77 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double GetUpdatePriority(IClientAPI client)
|
||||||
|
{
|
||||||
|
switch (Scene.UpdatePrioritizationScheme)
|
||||||
|
{
|
||||||
|
case Scene.UpdatePrioritizationSchemes.Time:
|
||||||
|
return GetPriorityByTime();
|
||||||
|
case Scene.UpdatePrioritizationSchemes.Distance:
|
||||||
|
return GetPriorityByDistance(client);
|
||||||
|
case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance:
|
||||||
|
return GetPriorityBySimpleAngularDistance(client);
|
||||||
|
default:
|
||||||
|
throw new InvalidOperationException("UpdatePrioritizationScheme not defined");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private double GetPriorityByTime()
|
||||||
|
{
|
||||||
|
return DateTime.Now.ToOADate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private double GetPriorityByDistance(IClientAPI client)
|
||||||
|
{
|
||||||
|
ScenePresence presence = Scene.GetScenePresence(client.AgentId);
|
||||||
|
if (presence != null)
|
||||||
|
{
|
||||||
|
return GetPriorityByDistance((presence.IsChildAgent) ?
|
||||||
|
presence.AbsolutePosition : presence.CameraPosition);
|
||||||
|
}
|
||||||
|
return double.NaN;
|
||||||
|
}
|
||||||
|
|
||||||
|
private double GetPriorityBySimpleAngularDistance(IClientAPI client)
|
||||||
|
{
|
||||||
|
ScenePresence presence = Scene.GetScenePresence(client.AgentId);
|
||||||
|
if (presence != null)
|
||||||
|
{
|
||||||
|
return GetPriorityBySimpleAngularDistance((presence.IsChildAgent) ?
|
||||||
|
presence.AbsolutePosition : presence.CameraPosition);
|
||||||
|
}
|
||||||
|
return double.NaN;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetPriorityByDistance(Vector3 position)
|
||||||
|
{
|
||||||
|
return Vector3.Distance(AbsolutePosition, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double GetPriorityBySimpleAngularDistance(Vector3 position)
|
||||||
|
{
|
||||||
|
double distance = Vector3.Distance(position, AbsolutePosition);
|
||||||
|
if (distance >= double.Epsilon)
|
||||||
|
{
|
||||||
|
float height;
|
||||||
|
Vector3 box = GetAxisAlignedBoundingBox(out height);
|
||||||
|
|
||||||
|
double angle = box.X / distance;
|
||||||
|
double max = angle;
|
||||||
|
|
||||||
|
angle = box.Y / distance;
|
||||||
|
if (max < angle)
|
||||||
|
max = angle;
|
||||||
|
|
||||||
|
angle = box.Z / distance;
|
||||||
|
if (max < angle)
|
||||||
|
max = angle;
|
||||||
|
|
||||||
|
return -max;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return double.MinValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2400,10 +2400,10 @@ if (m_shape != null) {
|
||||||
//isattachment = ParentGroup.RootPart.IsAttachment;
|
//isattachment = ParentGroup.RootPart.IsAttachment;
|
||||||
|
|
||||||
byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A};
|
byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A};
|
||||||
remoteClient.SendPrimitiveToClient(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, m_shape,
|
remoteClient.SendPrimitiveToClient(new SendPrimitiveData(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, m_shape,
|
||||||
lPos, Velocity, Acceleration, RotationOffset, RotationalVelocity, clientFlags, m_uuid, _ownerID,
|
lPos, Velocity, Acceleration, RotationOffset, RotationalVelocity, clientFlags, m_uuid, _ownerID,
|
||||||
m_text, color, _parentID, m_particleSystem, m_clickAction, (byte)m_material, m_TextureAnimation, IsAttachment,
|
m_text, color, _parentID, m_particleSystem, m_clickAction, (byte)m_material, m_TextureAnimation, IsAttachment,
|
||||||
AttachmentPoint,FromItemID, Sound, SoundGain, SoundFlags, SoundRadius);
|
AttachmentPoint,FromItemID, Sound, SoundGain, SoundFlags, SoundRadius, ParentGroup.GetUpdatePriority(remoteClient)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -3794,12 +3794,12 @@ if (m_shape != null) {
|
||||||
|
|
||||||
// Causes this thread to dig into the Client Thread Data.
|
// Causes this thread to dig into the Client Thread Data.
|
||||||
// Remember your locking here!
|
// Remember your locking here!
|
||||||
remoteClient.SendPrimTerseUpdate(m_regionHandle,
|
remoteClient.SendPrimTerseUpdate(new SendPrimitiveTerseData(m_regionHandle,
|
||||||
(ushort)(m_parentGroup.GetTimeDilation() *
|
(ushort)(m_parentGroup.GetTimeDilation() *
|
||||||
(float)ushort.MaxValue), LocalId, lPos,
|
(float)ushort.MaxValue), LocalId, lPos,
|
||||||
RotationOffset, Velocity,
|
RotationOffset, Velocity,
|
||||||
RotationalVelocity, state, FromItemID,
|
RotationalVelocity, state, FromItemID,
|
||||||
OwnerID, (int)AttachmentPoint);
|
OwnerID, (int)AttachmentPoint, ParentGroup.GetUpdatePriority(remoteClient)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddScriptLPS(int count)
|
public void AddScriptLPS(int count)
|
||||||
|
|
|
@ -403,12 +403,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
set { m_parentPosition = value; }
|
set { m_parentPosition = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public int MaxPrimsPerFrame
|
|
||||||
{
|
|
||||||
get { return m_sceneViewer.MaxPrimsPerFrame; }
|
|
||||||
set { m_sceneViewer.MaxPrimsPerFrame = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Absolute position of this avatar in 'region cordinates'
|
/// Absolute position of this avatar in 'region cordinates'
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -2457,8 +2451,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
Vector3 pos = m_pos;
|
Vector3 pos = m_pos;
|
||||||
pos.Z -= m_appearance.HipOffset;
|
pos.Z -= m_appearance.HipOffset;
|
||||||
|
|
||||||
remoteClient.SendAvatarTerseUpdate(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue),
|
remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
|
||||||
LocalId, pos, Velocity, m_bodyRot, m_uuid);
|
pos, m_velocity, m_rotation, m_uuid, GetUpdatePriority(remoteClient)));
|
||||||
|
|
||||||
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
|
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
|
||||||
m_scene.StatsReporter.AddAgentUpdates(1);
|
m_scene.StatsReporter.AddAgentUpdates(1);
|
||||||
|
@ -2563,9 +2557,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
Vector3 pos = m_pos;
|
Vector3 pos = m_pos;
|
||||||
pos.Z -= m_appearance.HipOffset;
|
pos.Z -= m_appearance.HipOffset;
|
||||||
|
|
||||||
remoteAvatar.m_controllingClient.SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid,
|
remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid,
|
||||||
LocalId, m_pos, m_appearance.Texture.GetBytes(),
|
LocalId, m_pos, m_appearance.Texture.GetBytes(),
|
||||||
m_parentID, rot);
|
m_parentID, rot));
|
||||||
m_scene.StatsReporter.AddAgentUpdates(1);
|
m_scene.StatsReporter.AddAgentUpdates(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2634,8 +2628,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
Vector3 pos = m_pos;
|
Vector3 pos = m_pos;
|
||||||
pos.Z -= m_appearance.HipOffset;
|
pos.Z -= m_appearance.HipOffset;
|
||||||
|
|
||||||
m_controllingClient.SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
|
m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
|
||||||
m_pos, m_appearance.Texture.GetBytes(), m_parentID, rot);
|
m_pos, m_appearance.Texture.GetBytes(), m_parentID, rot));
|
||||||
|
|
||||||
if (!m_isChildAgent)
|
if (!m_isChildAgent)
|
||||||
{
|
{
|
||||||
|
@ -2741,8 +2735,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
|
|
||||||
Quaternion rot = m_bodyRot;
|
Quaternion rot = m_bodyRot;
|
||||||
m_controllingClient.SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
|
m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
|
||||||
m_pos, m_appearance.Texture.GetBytes(), m_parentID, rot);
|
m_pos, m_appearance.Texture.GetBytes(), m_parentID, rot));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3870,5 +3864,41 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double GetUpdatePriority(IClientAPI client)
|
||||||
|
{
|
||||||
|
switch (Scene.UpdatePrioritizationScheme)
|
||||||
|
{
|
||||||
|
case Scene.UpdatePrioritizationSchemes.Time:
|
||||||
|
return GetPriorityByTime();
|
||||||
|
case Scene.UpdatePrioritizationSchemes.Distance:
|
||||||
|
return GetPriorityByDistance(client);
|
||||||
|
case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance:
|
||||||
|
return GetPriorityByDistance(client);
|
||||||
|
default:
|
||||||
|
throw new InvalidOperationException("UpdatePrioritizationScheme not defined.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private double GetPriorityByTime()
|
||||||
|
{
|
||||||
|
return DateTime.Now.ToOADate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private double GetPriorityByDistance(IClientAPI client)
|
||||||
|
{
|
||||||
|
ScenePresence presence = Scene.GetScenePresence(client.AgentId);
|
||||||
|
if (presence != null)
|
||||||
|
{
|
||||||
|
return GetPriorityByDistance((presence.IsChildAgent) ?
|
||||||
|
presence.AbsolutePosition : presence.CameraPosition);
|
||||||
|
}
|
||||||
|
return double.NaN;
|
||||||
|
}
|
||||||
|
|
||||||
|
private double GetPriorityByDistance(Vector3 position)
|
||||||
|
{
|
||||||
|
return Vector3.Distance(AbsolutePosition, position);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,14 +45,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
protected Dictionary<UUID, ScenePartUpdate> m_updateTimes = new Dictionary<UUID, ScenePartUpdate>();
|
protected Dictionary<UUID, ScenePartUpdate> m_updateTimes = new Dictionary<UUID, ScenePartUpdate>();
|
||||||
|
|
||||||
protected int m_maxPrimsPerFrame = 200;
|
|
||||||
|
|
||||||
public int MaxPrimsPerFrame
|
|
||||||
{
|
|
||||||
get { return m_maxPrimsPerFrame; }
|
|
||||||
set { m_maxPrimsPerFrame = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public SceneViewer()
|
public SceneViewer()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -82,16 +74,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
m_pendingObjects = new Queue<SceneObjectGroup>();
|
m_pendingObjects = new Queue<SceneObjectGroup>();
|
||||||
|
|
||||||
List<EntityBase> ents = new List<EntityBase>(m_presence.Scene.Entities);
|
foreach (EntityBase e in m_presence.Scene.Entities)
|
||||||
if (!m_presence.IsChildAgent) // Proximity sort makes no sense for
|
|
||||||
{ // Child agents
|
|
||||||
ents.Sort(delegate(EntityBase a, EntityBase b)
|
|
||||||
{
|
|
||||||
return Vector3.Distance(m_presence.AbsolutePosition, a.AbsolutePosition).CompareTo(Vector3.Distance(m_presence.AbsolutePosition, b.AbsolutePosition));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (EntityBase e in ents)
|
|
||||||
{
|
{
|
||||||
if (e is SceneObjectGroup)
|
if (e is SceneObjectGroup)
|
||||||
m_pendingObjects.Enqueue((SceneObjectGroup)e);
|
m_pendingObjects.Enqueue((SceneObjectGroup)e);
|
||||||
|
@ -99,7 +82,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (m_pendingObjects != null && m_pendingObjects.Count > 0 && m_partsUpdateQueue.Count < m_maxPrimsPerFrame)
|
while (m_pendingObjects != null && m_pendingObjects.Count > 0)
|
||||||
{
|
{
|
||||||
SceneObjectGroup g = m_pendingObjects.Dequeue();
|
SceneObjectGroup g = m_pendingObjects.Dequeue();
|
||||||
|
|
||||||
|
@ -183,8 +166,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_presence.GenerateClientFlags(part.UUID));
|
m_presence.GenerateClientFlags(part.UUID));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_presence.ControllingClient.FlushPrimUpdates();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Reset()
|
public void Reset()
|
||||||
|
|
|
@ -35,8 +35,8 @@ namespace OpenSim.Region.Framework.Scenes.Scripting
|
||||||
string Description { get; set; }
|
string Description { get; set; }
|
||||||
|
|
||||||
UUID UUID { get; }
|
UUID UUID { get; }
|
||||||
UUID ObjectOwner { get; }
|
UUID OwnerID { get; }
|
||||||
UUID ObjectCreator { get; }
|
UUID CreatorID { get; }
|
||||||
Vector3 AbsolutePosition { get; }
|
Vector3 AbsolutePosition { get; }
|
||||||
|
|
||||||
string SitName { get; set; }
|
string SitName { get; set; }
|
||||||
|
|
|
@ -68,12 +68,12 @@ namespace OpenSim.Region.Framework.Scenes.Scripting
|
||||||
get { return UUID.Zero; }
|
get { return UUID.Zero; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID ObjectOwner
|
public UUID OwnerID
|
||||||
{
|
{
|
||||||
get { return UUID.Zero; }
|
get { return UUID.Zero; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID ObjectCreator
|
public UUID CreatorID
|
||||||
{
|
{
|
||||||
get { return UUID.Zero; }
|
get { return UUID.Zero; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1011,12 +1011,12 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID, uint avatarLocalID, Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation)
|
public void SendAvatarData(SendAvatarData data)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, Vector3 velocity, Quaternion rotation, UUID agentid)
|
public void SendAvatarTerseUpdate(SendAvatarTerseData data)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1036,17 +1036,12 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags, UUID objectID, UUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem, byte clickAction, byte material, byte[] textureanim, bool attachment, uint AttachPoint, UUID AssetId, UUID SoundId, double SoundVolume, byte SoundFlags, double SoundRadius)
|
public void SendPrimitiveToClient(SendPrimitiveData data)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags, UUID objectID, UUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem, byte clickAction, byte material)
|
public void SendPrimTerseUpdate(SendPrimitiveTerseData data)
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position, Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, UUID AssetId, UUID owner, int attachPoint)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,7 +188,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
|
||||||
// MISC COMPARISONS (UUID, Byte)
|
// MISC COMPARISONS (UUID, Byte)
|
||||||
if (first.ClickAction != second.ClickAction)
|
if (first.ClickAction != second.ClickAction)
|
||||||
result |= Diff.CLICKACTION;
|
result |= Diff.CLICKACTION;
|
||||||
if (first.ObjectOwner != second.ObjectOwner)
|
if (first.OwnerID != second.OwnerID)
|
||||||
result |= Diff.OBJECTOWNER;
|
result |= Diff.OBJECTOWNER;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -588,13 +588,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID,
|
public virtual void SendAvatarData(SendAvatarData data)
|
||||||
uint avatarLocalID, Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID,
|
public virtual void SendAvatarTerseUpdate(SendAvatarTerseData data)
|
||||||
Vector3 position, Vector3 velocity, Quaternion rotation, UUID agentId)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -610,26 +608,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID,
|
public virtual void SendPrimitiveToClient(SendPrimitiveData data)
|
||||||
PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel,
|
|
||||||
Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags,
|
|
||||||
UUID objectID, UUID ownerID, string text, byte[] color,
|
|
||||||
uint parentID,
|
|
||||||
byte[] particleSystem, byte clickAction, byte material)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public virtual void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID,
|
|
||||||
PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel,
|
public virtual void SendPrimTerseUpdate(SendPrimitiveTerseData data)
|
||||||
Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags,
|
|
||||||
UUID objectID, UUID ownerID, string text, byte[] color,
|
|
||||||
uint parentID,
|
|
||||||
byte[] particleSystem, byte clickAction, byte material, byte[] textureanimation,
|
|
||||||
bool attachment, uint AttachmentPoint, UUID AssetId, UUID SoundId, double SoundVolume, byte SoundFlags, double SoundRadius)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
public virtual void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID,
|
|
||||||
Vector3 position, Quaternion rotation, Vector3 velocity,
|
|
||||||
Vector3 rotationalvelocity, byte state, UUID AssetId, UUID ownerID, int attachPoint)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2875,7 +2875,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
|
||||||
return m_host.ObjectOwner.ToString();
|
return m_host.OwnerID.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llInstantMessage(string user, string message)
|
public void llInstantMessage(string user, string message)
|
||||||
|
@ -5634,7 +5634,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
ILandObject parcel = World.LandChannel.GetLandObject(av.AbsolutePosition.X, av.AbsolutePosition.Y);
|
ILandObject parcel = World.LandChannel.GetLandObject(av.AbsolutePosition.X, av.AbsolutePosition.Y);
|
||||||
if (parcel != null)
|
if (parcel != null)
|
||||||
{
|
{
|
||||||
if (m_host.ObjectOwner == parcel.LandData.OwnerID ||
|
if (m_host.OwnerID == parcel.LandData.OwnerID ||
|
||||||
(m_host.OwnerID == m_host.GroupID && m_host.GroupID == parcel.LandData.GroupID
|
(m_host.OwnerID == m_host.GroupID && m_host.GroupID == parcel.LandData.GroupID
|
||||||
&& parcel.LandData.IsGroupOwned) || World.Permissions.IsGod(m_host.OwnerID))
|
&& parcel.LandData.IsGroupOwned) || World.Permissions.IsGod(m_host.OwnerID))
|
||||||
{
|
{
|
||||||
|
@ -7157,7 +7157,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
|
|
||||||
ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
|
ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
|
||||||
|
|
||||||
if (land.LandData.OwnerID != m_host.ObjectOwner)
|
if (land.LandData.OwnerID != m_host.OwnerID)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
land.SetMusicUrl(url);
|
land.SetMusicUrl(url);
|
||||||
|
@ -7215,7 +7215,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
public LSL_String llGetCreator()
|
public LSL_String llGetCreator()
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
return m_host.ObjectCreator.ToString();
|
return m_host.CreatorID.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public LSL_String llGetTimestamp()
|
public LSL_String llGetTimestamp()
|
||||||
|
@ -8396,7 +8396,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
IDialogModule dm = World.RequestModuleInterface<IDialogModule>();
|
IDialogModule dm = World.RequestModuleInterface<IDialogModule>();
|
||||||
if (null != dm)
|
if (null != dm)
|
||||||
dm.SendUrlToUser(
|
dm.SendUrlToUser(
|
||||||
new UUID(avatar_id), m_host.Name, m_host.UUID, m_host.ObjectOwner, false, message, url);
|
new UUID(avatar_id), m_host.Name, m_host.UUID, m_host.OwnerID, false, message, url);
|
||||||
|
|
||||||
ConditionalScriptSleep(10000);
|
ConditionalScriptSleep(10000);
|
||||||
}
|
}
|
||||||
|
@ -8411,7 +8411,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
// according to the docs, this command only works if script owner and land owner are the same
|
// according to the docs, this command only works if script owner and land owner are the same
|
||||||
// lets add estate owners and gods, too, and use the generic permission check.
|
// lets add estate owners and gods, too, and use the generic permission check.
|
||||||
ILandObject landObject = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
|
ILandObject landObject = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
|
||||||
if (!World.Permissions.CanEditParcel(m_host.ObjectOwner, landObject)) return;
|
if (!World.Permissions.CanEditParcel(m_host.OwnerID, landObject)) return;
|
||||||
|
|
||||||
bool update = false; // send a ParcelMediaUpdate (and possibly change the land's media URL)?
|
bool update = false; // send a ParcelMediaUpdate (and possibly change the land's media URL)?
|
||||||
byte loop = 0;
|
byte loop = 0;
|
||||||
|
@ -9081,9 +9081,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
Vector3 velocity = m_host.Velocity;
|
Vector3 velocity = m_host.Velocity;
|
||||||
Quaternion rotation = m_host.RotationOffset;
|
Quaternion rotation = m_host.RotationOffset;
|
||||||
string ownerName = String.Empty;
|
string ownerName = String.Empty;
|
||||||
ScenePresence scenePresence = World.GetScenePresence(m_host.ObjectOwner);
|
ScenePresence scenePresence = World.GetScenePresence(m_host.OwnerID);
|
||||||
if (scenePresence == null)
|
if (scenePresence == null)
|
||||||
ownerName = resolveName(m_host.ObjectOwner);
|
ownerName = resolveName(m_host.OwnerID);
|
||||||
else
|
else
|
||||||
ownerName = scenePresence.Name;
|
ownerName = scenePresence.Name;
|
||||||
|
|
||||||
|
@ -9108,7 +9108,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
httpHeaders["X-SecondLife-Local-Velocity"] = string.Format("({0:0.000000}, {1:0.000000}, {2:0.000000})", velocity.X, velocity.Y, velocity.Z);
|
httpHeaders["X-SecondLife-Local-Velocity"] = string.Format("({0:0.000000}, {1:0.000000}, {2:0.000000})", velocity.X, velocity.Y, velocity.Z);
|
||||||
httpHeaders["X-SecondLife-Local-Rotation"] = string.Format("({0:0.000000}, {1:0.000000}, {2:0.000000}, {3:0.000000})", rotation.X, rotation.Y, rotation.Z, rotation.W);
|
httpHeaders["X-SecondLife-Local-Rotation"] = string.Format("({0:0.000000}, {1:0.000000}, {2:0.000000}, {3:0.000000})", rotation.X, rotation.Y, rotation.Z, rotation.W);
|
||||||
httpHeaders["X-SecondLife-Owner-Name"] = ownerName;
|
httpHeaders["X-SecondLife-Owner-Name"] = ownerName;
|
||||||
httpHeaders["X-SecondLife-Owner-Key"] = m_host.ObjectOwner.ToString();
|
httpHeaders["X-SecondLife-Owner-Key"] = m_host.OwnerID.ToString();
|
||||||
string userAgent = config.Configs["Network"].GetString("user_agent", null);
|
string userAgent = config.Configs["Network"].GetString("user_agent", null);
|
||||||
if (userAgent != null)
|
if (userAgent != null)
|
||||||
httpHeaders["User-Agent"] = userAgent;
|
httpHeaders["User-Agent"] = userAgent;
|
||||||
|
|
|
@ -1164,7 +1164,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
ILandObject land
|
ILandObject land
|
||||||
= World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
|
= World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
|
||||||
|
|
||||||
if (land.LandData.OwnerID != m_host.ObjectOwner)
|
if (land.LandData.OwnerID != m_host.OwnerID)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
land.SetMediaUrl(url);
|
land.SetMediaUrl(url);
|
||||||
|
@ -1182,7 +1182,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
ILandObject land
|
ILandObject land
|
||||||
= World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
|
= World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
|
||||||
|
|
||||||
if (land.LandData.OwnerID != m_host.ObjectOwner)
|
if (land.LandData.OwnerID != m_host.OwnerID)
|
||||||
{
|
{
|
||||||
OSSLError("osSetParcelSIPAddress: Sorry, you need to own the land to use this function");
|
OSSLError("osSetParcelSIPAddress: Sorry, you need to own the land to use this function");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -592,13 +592,11 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID,
|
public virtual void SendAvatarData(SendAvatarData data)
|
||||||
uint avatarLocalID, Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID,
|
public virtual void SendAvatarTerseUpdate(SendAvatarTerseData data)
|
||||||
Vector3 position, Vector3 velocity, Quaternion rotation, UUID agentid)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -614,27 +612,11 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID,
|
public virtual void SendPrimitiveToClient(SendPrimitiveData data)
|
||||||
PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel,
|
|
||||||
Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags,
|
|
||||||
UUID objectID, UUID ownerID, string text, byte[] color,
|
|
||||||
uint parentID,
|
|
||||||
byte[] particleSystem, byte clickAction, byte material)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public virtual void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID,
|
|
||||||
PrimitiveBaseShape primShape, Vector3 pos, Vector3 vel,
|
public virtual void SendPrimTerseUpdate(SendPrimitiveTerseData data)
|
||||||
Vector3 acc, Quaternion rotation, Vector3 rvel, uint flags,
|
|
||||||
UUID objectID, UUID ownerID, string text, byte[] color,
|
|
||||||
uint parentID,
|
|
||||||
byte[] particleSystem, byte clickAction, byte material, byte[] textureanimation,
|
|
||||||
bool attachment, uint AttachmentPoint, UUID AssetId, UUID SoundId, double SoundVolume, byte SoundFlags, double SoundRadius)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
public virtual void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID,
|
|
||||||
Vector3 position, Quaternion rotation, Vector3 velocity,
|
|
||||||
Vector3 rotationalvelocity, byte state, UUID AssetId,
|
|
||||||
UUID ownerID, int attachPoint)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue