* Changed many more "terse" and "full" update sending and update scheduling methods to take PrimUpdateFlags instead

* Disabled m_killRecord until the issue of avatars keeping the same localID when TPing away and back can be resolved
slimupdates
John Hurliman 2010-05-05 16:51:41 -07:00
parent d5a5cae58b
commit 95130df78a
20 changed files with 219 additions and 319 deletions

View File

@ -245,7 +245,6 @@ namespace OpenSim.Data.Tests
pbshap.ProfileEnd = ushort.MaxValue;
pbshap.ProfileHollow = ushort.MaxValue;
Vector3 scale = new Vector3(random.Next(),random.Next(),random.Next());
byte updatef = (byte) random.Next(127);
RegionInfo regionInfo = new RegionInfo();
regionInfo.RegionID = region3;
@ -284,7 +283,6 @@ namespace OpenSim.Data.Tests
sop.LinkNum = linknum;
sop.ClickAction = clickaction;
sop.Scale = scale;
sop.UpdateFlag = updatef;
//Tests if local part accepted the parameters:
Assert.That(regionh,Is.EqualTo(sop.RegionHandle), "Assert.That(regionh,Is.EqualTo(sop.RegionHandle))");
@ -317,7 +315,6 @@ namespace OpenSim.Data.Tests
Assert.That(linknum,Is.EqualTo(sop.LinkNum), "Assert.That(linknum,Is.EqualTo(sop.LinkNum))");
Assert.That(clickaction,Is.EqualTo(sop.ClickAction), "Assert.That(clickaction,Is.EqualTo(sop.ClickAction))");
Assert.That(scale,Is.EqualTo(sop.Scale), "Assert.That(scale,Is.EqualTo(sop.Scale))");
Assert.That(updatef,Is.EqualTo(sop.UpdateFlag), "Assert.That(updatef,Is.EqualTo(sop.UpdateFlag))");
// This is necessary or object will not be inserted in DB
sop.ObjectFlags = 0;
@ -417,7 +414,6 @@ namespace OpenSim.Data.Tests
PrimitiveBaseShape pbshap = new PrimitiveBaseShape();
pbshap = PrimitiveBaseShape.Default;
Vector3 scale = new Vector3(random.Next(),random.Next(),random.Next());
byte updatef = (byte) random.Next(127);
// Updates the region with new values
SceneObjectGroup sog2 = FindSOG("Adam West", region3);
@ -447,7 +443,6 @@ namespace OpenSim.Data.Tests
sog2.RootPart.LinkNum = linknum;
sog2.RootPart.ClickAction = clickaction;
sog2.RootPart.Scale = scale;
sog2.RootPart.UpdateFlag = updatef;
db.StoreObject(sog2, region3);
List<SceneObjectGroup> sogs = db.LoadObjects(region3);

View File

@ -3450,9 +3450,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
while ((update = m_entityUpdates.Dequeue()) != null)
{
if (m_killRecord.Contains(update.Entity.LocalId))
continue;
#region UpdateFlags to packet type conversion
PrimUpdateFlags updateFlags = update.Flags;

View File

@ -1446,7 +1446,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (destination != null && !CrossPrimGroupIntoNewRegion(destination, grp, silent))
{
grp.OffsetForNewRegion(oldGroupPosition);
grp.ScheduleGroupForFullUpdate();
grp.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
}
}
@ -1465,7 +1465,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
//m_log.Debug(" >>> CrossPrimGroupIntoNewRegion <<<");
bool successYN = false;
grp.RootPart.UpdateFlag = 0;
grp.RootPart.ClearPendingUpdate();
//int primcrossingXMLmethod = 0;
if (destination != null)

View File

@ -511,7 +511,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
// if not, we set it's position in world.
if (!attachment)
{
group.ScheduleGroupForFullUpdate();
group.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
float offsetHeight = 0;
pos = m_Scene.GetNewRezLocation(
@ -603,7 +603,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 0);
rootPart.ParentGroup.ResumeScripts();
rootPart.ScheduleFullUpdate();
rootPart.ScheduleUpdate(PrimUpdateFlags.FullUpdate);
}
if (!m_Scene.Permissions.BypassPermissions())

View File

@ -26,6 +26,7 @@
*/
using System;
using OpenSim.Framework;
using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Region.Framework.Interfaces
@ -34,7 +35,7 @@ namespace OpenSim.Region.Framework.Interfaces
{
void Reset();
void Close();
void QueuePartForUpdate(SceneObjectPart part);
void QueuePartForUpdate(SceneObjectPart part, PrimUpdateFlags updateFlags);
void SendPrimUpdates();
}
}

View File

@ -1857,10 +1857,10 @@ namespace OpenSim.Region.Framework.Scenes
{
group.RootPart.ApplyImpulse((vel * group.GetMass()), false);
group.Velocity = vel;
rootPart.ScheduleFullUpdate();
rootPart.ScheduleUpdate(PrimUpdateFlags.FullUpdate);
}
group.CreateScriptInstances(param, true, DefaultScriptEngine, 2);
rootPart.ScheduleFullUpdate();
rootPart.ScheduleUpdate(PrimUpdateFlags.FullUpdate);
if (!Permissions.BypassPermissions())
{
@ -1929,7 +1929,7 @@ namespace OpenSim.Region.Framework.Scenes
{
sog.SetOwnerId(ownerID);
sog.SetGroup(groupID, remoteClient);
sog.ScheduleGroupForFullUpdate();
sog.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
foreach (SceneObjectPart child in sog.Children.Values)
child.Inventory.ChangeInventoryOwner(ownerID);

View File

@ -208,7 +208,7 @@ namespace OpenSim.Region.Framework.Scenes
if (part.ParentGroup.IsAttachment)
isAttachment = true;
else
part.ParentGroup.ScheduleGroupForFullUpdate();
part.ParentGroup.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
// If it's not an attachment, and we are allowed to move it,
// then we might have done so. If we moved across a parcel

View File

@ -2051,7 +2051,7 @@ namespace OpenSim.Region.Framework.Scenes
sceneObject.SetGroup(groupID, null);
}
sceneObject.ScheduleGroupForFullUpdate();
sceneObject.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
return sceneObject;
}
@ -2541,7 +2541,7 @@ namespace OpenSim.Region.Framework.Scenes
sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
grp.SendGroupFullUpdate();
grp.SendGroupUpdate(PrimUpdateFlags.FullUpdate);
}
else
{
@ -4037,7 +4037,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (ent is SceneObjectGroup)
{
((SceneObjectGroup)ent).ScheduleGroupForFullUpdate();
((SceneObjectGroup)ent).ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
}
}
}
@ -4538,7 +4538,7 @@ namespace OpenSim.Region.Framework.Scenes
part.GetProperties(remoteClient);
part.TriggerScriptChangedEvent(Changed.OWNER);
group.ResumeScripts();
part.ScheduleFullUpdate();
part.ScheduleUpdate(PrimUpdateFlags.FullUpdate);
break;

View File

@ -297,7 +297,7 @@ namespace OpenSim.Region.Framework.Scenes
sceneObject.AttachToScene(m_parentScene);
if (sendClientUpdates)
sceneObject.ScheduleGroupForFullUpdate();
sceneObject.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
lock (sceneObject)
{
@ -1512,7 +1512,7 @@ namespace OpenSim.Region.Framework.Scenes
parentGroup.RootPart.AddFlag(PrimFlags.CreateSelected);
parentGroup.TriggerScriptChangedEvent(Changed.LINK);
parentGroup.HasGroupChanged = true;
parentGroup.ScheduleGroupForFullUpdate();
parentGroup.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
}
finally
@ -1612,7 +1612,7 @@ namespace OpenSim.Region.Framework.Scenes
List<uint> linkIDs = new List<uint>();
foreach (SceneObjectPart newChild in newSet)
newChild.UpdateFlag = 0;
newChild.ClearPendingUpdate();
LinkObjects(newRoot, newSet);
if (!affectedGroups.Contains(newRoot.ParentGroup))
@ -1627,7 +1627,7 @@ namespace OpenSim.Region.Framework.Scenes
{
g.TriggerScriptChangedEvent(Changed.LINK);
g.HasGroupChanged = true; // Persist
g.ScheduleGroupForFullUpdate();
g.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
}
}
finally
@ -1735,7 +1735,7 @@ namespace OpenSim.Region.Framework.Scenes
copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 0);
copy.HasGroupChanged = true;
copy.ScheduleGroupForFullUpdate();
copy.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
copy.ResumeScripts();
// required for physics to update it's position

View File

@ -1001,7 +1001,7 @@ namespace OpenSim.Region.Framework.Scenes
}
IsSelected = false; // fudge....
ScheduleGroupForFullUpdate();
ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
}
}
else
@ -1052,7 +1052,7 @@ namespace OpenSim.Region.Framework.Scenes
RootPart.RemFlag(PrimFlags.TemporaryOnRez);
AttachToBackup();
m_scene.EventManager.TriggerParcelPrimCountTainted();
m_rootPart.ScheduleFullUpdate();
m_rootPart.ScheduleUpdate(PrimUpdateFlags.ParentID);
m_rootPart.ClearUndoState();
}
@ -1277,7 +1277,7 @@ namespace OpenSim.Region.Framework.Scenes
if (!silent)
{
part.UpdateFlag = 0;
part.ClearPendingUpdate();
if (part == m_rootPart)
avatar.ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
}
@ -1339,7 +1339,7 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.RemoveGroupTarget(this);
}
ScheduleGroupForFullUpdate();
ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
}
public override void SetText(string text, Vector3 color, double alpha)
@ -1351,7 +1351,7 @@ namespace OpenSim.Region.Framework.Scenes
Text = text;
HasGroupChanged = true;
m_rootPart.ScheduleFullUpdate();
m_rootPart.ScheduleUpdate(PrimUpdateFlags.Text);
}
/// <summary>
@ -1563,7 +1563,7 @@ namespace OpenSim.Region.Framework.Scenes
if (userExposed)
{
SetRootPartOwner(m_rootPart, cAgentID, cGroupID);
m_rootPart.ScheduleFullUpdate();
m_rootPart.ScheduleUpdate(PrimUpdateFlags.FullUpdate);
}
List<SceneObjectPart> partList;
@ -1590,7 +1590,7 @@ namespace OpenSim.Region.Framework.Scenes
if (userExposed)
{
SetPartOwner(newPart, cAgentID, cGroupID);
newPart.ScheduleFullUpdate();
newPart.ScheduleUpdate(PrimUpdateFlags.FullUpdate);
}
}
}
@ -1601,7 +1601,7 @@ namespace OpenSim.Region.Framework.Scenes
dupe.HasGroupChanged = true;
dupe.AttachToBackup();
ScheduleGroupForFullUpdate();
ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
}
return dupe;
@ -1854,7 +1854,7 @@ namespace OpenSim.Region.Framework.Scenes
ApplyNextOwnerPermissions();
}
part.ScheduleFullUpdate();
part.ScheduleUpdate(PrimUpdateFlags.FullUpdate);
}
/// <summary>
@ -1940,13 +1940,13 @@ namespace OpenSim.Region.Framework.Scenes
if (UsePhysics && !AbsolutePosition.ApproxEquals(lastPhysGroupPos, 0.02f))
{
m_rootPart.UpdateFlag = 1;
m_rootPart.PendingUpdateFlags |= PrimUpdateFlags.Position;
lastPhysGroupPos = AbsolutePosition;
}
if (UsePhysics && !GroupRotation.ApproxEquals(lastPhysGroupRot, 0.1f))
{
m_rootPart.UpdateFlag = 1;
m_rootPart.PendingUpdateFlags |= PrimUpdateFlags.Rotation;
lastPhysGroupRot = GroupRotation;
}
@ -1959,31 +1959,18 @@ namespace OpenSim.Region.Framework.Scenes
}
}
public void ScheduleFullUpdateToAvatar(ScenePresence presence)
public void ScheduleUpdateToAvatar(ScenePresence presence, PrimUpdateFlags updateFlags)
{
// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1} just to avatar {2}", Name, UUID, presence.Name);
RootPart.AddFullUpdateToAvatar(presence);
RootPart.AddUpdateToAvatar(presence, updateFlags);
lock (m_parts)
{
foreach (SceneObjectPart part in m_parts.Values)
{
if (part != RootPart)
part.AddFullUpdateToAvatar(presence);
}
}
}
public void ScheduleTerseUpdateToAvatar(ScenePresence presence)
{
// m_log.DebugFormat("[SOG]: Scheduling terse update for {0} {1} just to avatar {2}", Name, UUID, presence.Name);
lock (m_parts)
{
foreach (SceneObjectPart part in m_parts.Values)
{
part.AddTerseUpdateToAvatar(presence);
part.AddUpdateToAvatar(presence, updateFlags);
}
}
}
@ -1991,35 +1978,19 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary>
/// Schedule a full update for this scene object
/// </summary>
public void ScheduleGroupForFullUpdate()
public void ScheduleGroupForUpdate(PrimUpdateFlags updateFlags)
{
// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, UUID);
checkAtTargets();
RootPart.ScheduleFullUpdate();
RootPart.ScheduleUpdate(updateFlags);
lock (m_parts)
{
foreach (SceneObjectPart part in m_parts.Values)
{
if (part != RootPart)
part.ScheduleFullUpdate();
}
}
}
/// <summary>
/// Schedule a terse update for this scene object
/// </summary>
public void ScheduleGroupForTerseUpdate()
{
// m_log.DebugFormat("[SOG]: Scheduling terse update for {0} {1}", Name, UUID);
lock (m_parts)
{
foreach (SceneObjectPart part in m_parts.Values)
{
part.ScheduleTerseUpdate();
part.ScheduleUpdate(updateFlags);
}
}
}
@ -2027,21 +1998,21 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary>
/// Immediately send a full update for this scene object.
/// </summary>
public void SendGroupFullUpdate()
public void SendGroupUpdate(PrimUpdateFlags updateFlags)
{
if (IsDeleted)
return;
// m_log.DebugFormat("[SOG]: Sending immediate full group update for {0} {1}", Name, UUID);
RootPart.SendUpdateToAllClients(PrimUpdateFlags.FullUpdate);
RootPart.SendUpdateToAllClients(updateFlags);
lock (m_parts)
{
foreach (SceneObjectPart part in m_parts.Values)
{
if (part != RootPart)
part.SendUpdateToAllClients(PrimUpdateFlags.FullUpdate);
part.SendUpdateToAllClients(updateFlags);
}
}
}
@ -2779,7 +2750,7 @@ namespace OpenSim.Region.Framework.Scenes
//if (part.UUID != m_rootPart.UUID)
HasGroupChanged = true;
ScheduleGroupForFullUpdate();
ScheduleGroupForUpdate(PrimUpdateFlags.Scale);
//if (part.UUID == m_rootPart.UUID)
//{
@ -2931,7 +2902,7 @@ namespace OpenSim.Region.Framework.Scenes
part.IgnoreUndoUpdate = false;
part.StoreUndoState();
HasGroupChanged = true;
ScheduleGroupForTerseUpdate();
ScheduleGroupForUpdate(PrimUpdateFlags.Position);
}
}
@ -2972,7 +2943,7 @@ namespace OpenSim.Region.Framework.Scenes
//we need to do a terse update even if the move wasn't allowed
// so that the position is reset in the client (the object snaps back)
ScheduleGroupForTerseUpdate();
ScheduleGroupForUpdate(PrimUpdateFlags.Position);
}
/// <summary>
@ -3037,7 +3008,7 @@ namespace OpenSim.Region.Framework.Scenes
AbsolutePosition = newPos;
HasGroupChanged = true;
ScheduleGroupForTerseUpdate();
ScheduleGroupForUpdate(PrimUpdateFlags.Position);
}
public void OffsetForNewRegion(Vector3 offset)
@ -3069,7 +3040,7 @@ namespace OpenSim.Region.Framework.Scenes
}
HasGroupChanged = true;
ScheduleGroupForTerseUpdate();
ScheduleGroupForUpdate(PrimUpdateFlags.Position | PrimUpdateFlags.Rotation);
}
/// <summary>
@ -3095,7 +3066,7 @@ namespace OpenSim.Region.Framework.Scenes
AbsolutePosition = pos;
HasGroupChanged = true;
ScheduleGroupForTerseUpdate();
ScheduleGroupForUpdate(PrimUpdateFlags.Position | PrimUpdateFlags.Rotation);
}
/// <summary>
@ -3181,7 +3152,7 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion newRot = primsRot * oldParentRot;
newRot *= Quaternion.Inverse(axRot);
prim.RotationOffset = newRot;
prim.ScheduleTerseUpdate();
prim.ScheduleUpdate(PrimUpdateFlags.Position | PrimUpdateFlags.Rotation);
}
}
}
@ -3193,7 +3164,7 @@ namespace OpenSim.Region.Framework.Scenes
childpart.StoreUndoState();
}
}
m_rootPart.ScheduleTerseUpdate();
m_rootPart.ScheduleUpdate(PrimUpdateFlags.Position | PrimUpdateFlags.Rotation);
}
#endregion

View File

@ -168,13 +168,10 @@ namespace OpenSim.Region.Framework.Scenes
public double SoundRadius;
[XmlIgnore]
public uint TimeStampFull;
public uint TimeStampUpdate;
[XmlIgnore]
public uint TimeStampLastActivity; // Will be used for AutoReturn
[XmlIgnore]
public uint TimeStampTerse;
[XmlIgnore]
public UUID FromItemID;
@ -282,15 +279,8 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_passTouches;
/// <summary>
/// Only used internally to schedule client updates.
/// 0 - no update is scheduled
/// 1 - terse update scheduled
/// 2 - full update scheduled
///
/// TODO - This should be an enumeration
/// </summary>
private byte m_updateFlag;
/// <summary>Modified fields that need to be broadcast</summary>
private PrimUpdateFlags m_pendingUpdateFlags;
protected Vector3 m_acceleration;
protected Vector3 m_angularVelocity;
@ -961,10 +951,10 @@ namespace OpenSim.Region.Framework.Scenes
TriggerScriptChangedEvent(Changed.SCALE);
}
}
public byte UpdateFlag
public PrimUpdateFlags PendingUpdateFlags
{
get { return m_updateFlag; }
set { m_updateFlag = value; }
get { return m_pendingUpdateFlags; }
set { m_pendingUpdateFlags = value; }
}
#endregion
@ -1205,14 +1195,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
/// <summary>
/// Clear all pending updates of parts to clients
/// </summary>
private void ClearUpdateSchedule()
{
m_updateFlag = 0;
}
private void SendObjectPropertiesToClient(UUID AgentID)
{
m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar)
@ -1253,6 +1235,14 @@ namespace OpenSim.Region.Framework.Scenes
#region Public Methods
/// <summary>
/// Clear all pending updates of parts to clients
/// </summary>
public void ClearPendingUpdate()
{
m_pendingUpdateFlags = 0;
}
public void ResetExpire()
{
Expires = DateTime.Now + new TimeSpan(600000000);
@ -1275,17 +1265,17 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary>
/// Tell all scene presences that they should send updates for this part to their clients
/// </summary>
public void AddFullUpdateToAllAvatars()
public void AddUpdateToAllAvatars(PrimUpdateFlags updateFlags)
{
m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar)
{
avatar.SceneViewer.QueuePartForUpdate(this);
avatar.SceneViewer.QueuePartForUpdate(this, updateFlags);
});
}
public void AddFullUpdateToAvatar(ScenePresence presence)
public void AddUpdateToAvatar(ScenePresence presence, PrimUpdateFlags updateFlags)
{
presence.SceneViewer.QueuePartForUpdate(this);
presence.SceneViewer.QueuePartForUpdate(this, updateFlags);
}
public void AddNewParticleSystem(Primitive.ParticleSystem pSystem)
@ -1298,20 +1288,6 @@ namespace OpenSim.Region.Framework.Scenes
m_particleSystem = new byte[0];
}
/// Terse updates
public void AddTerseUpdateToAllAvatars()
{
m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar)
{
avatar.SceneViewer.QueuePartForUpdate(this);
});
}
public void AddTerseUpdateToAvatar(ScenePresence presence)
{
presence.SceneViewer.QueuePartForUpdate(this);
}
public void AddTextureAnimation(Primitive.TextureAnimation pTexAnim)
{
byte[] data = new byte[16];
@ -2588,19 +2564,19 @@ namespace OpenSim.Region.Framework.Scenes
{
if (PhysActor != null)
{
Vector3 newpos = PhysActor.Position;
Vector3 newpos = new Vector3(PhysActor.Position.GetBytes(), 0);
if (m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.N) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.S) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.E) | m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.W))
if (m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.N) |
m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.S) |
m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.E) |
m_parentGroup.Scene.TestBorderCross(newpos, Cardinals.W))
{
m_parentGroup.AbsolutePosition = newpos;
return;
}
//m_parentGroup.RootPart.m_groupPosition = newpos;
}
ScheduleTerseUpdate();
//SendTerseUpdateToAllClients();
ScheduleUpdate(PrimUpdateFlags.Position);
}
public void PreloadSound(string sound)
@ -2688,7 +2664,7 @@ namespace OpenSim.Region.Framework.Scenes
m_shape.Scale = scale;
ParentGroup.HasGroupChanged = true;
ScheduleFullUpdate();
ScheduleUpdate(PrimUpdateFlags.Scale);
}
public void RotLookAt(Quaternion target, float strength, float damping)
@ -2728,58 +2704,24 @@ namespace OpenSim.Region.Framework.Scenes
}
/// <summary>
/// Schedules this prim for a full update
/// Schedules this prim for an update
/// </summary>
public void ScheduleFullUpdate()
public void ScheduleUpdate(PrimUpdateFlags updateFlags)
{
// m_log.DebugFormat("[SCENE OBJECT PART]: Scheduling full update for {0} {1}", Name, LocalId);
if (m_parentGroup != null)
{
m_parentGroup.QueueForUpdateCheck();
}
int timeNow = Util.UnixTimeSinceEpoch();
// If multiple updates are scheduled on the same second, we still need to perform all of them
// So we'll force the issue by bumping up the timestamp so that later processing sees these need
// to be performed.
if (timeNow <= TimeStampFull)
{
TimeStampFull += 1;
}
if (timeNow <= TimeStampUpdate)
TimeStampUpdate += 1;
else
{
TimeStampFull = (uint)timeNow;
}
TimeStampUpdate = (uint)timeNow;
m_updateFlag = 2;
// m_log.DebugFormat(
// "[SCENE OBJECT PART]: Scheduling full update for {0}, {1} at {2}",
// UUID, Name, TimeStampFull);
}
/// <summary>
/// Schedule a terse update for this prim. Terse updates only send position,
/// rotation, velocity, rotational velocity and shape information.
/// </summary>
public void ScheduleTerseUpdate()
{
if (m_updateFlag < 1)
{
if (m_parentGroup != null)
{
m_parentGroup.HasGroupChanged = true;
m_parentGroup.QueueForUpdateCheck();
}
TimeStampTerse = (uint) Util.UnixTimeSinceEpoch();
m_updateFlag = 1;
// m_log.DebugFormat(
// "[SCENE OBJECT PART]: Scheduling terse update for {0}, {1} at {2}",
// UUID, Name, TimeStampTerse);
}
m_pendingUpdateFlags |= updateFlags;
}
public void ScriptSetPhantomStatus(bool Phantom)
@ -2886,50 +2828,59 @@ namespace OpenSim.Region.Framework.Scenes
public void SendScheduledUpdates()
{
const float ROTATION_TOLERANCE = 0.01f;
const float VELOCITY_TOLERANCE = 0.001f;
const float POSITION_TOLERANCE = 0.05f;
const int TIME_MS_TOLERANCE = 3000;
if (m_updateFlag == 1)
{
// Throw away duplicate or insignificant updates
if (!RotationOffset.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
!Acceleration.Equals(m_lastAcceleration) ||
!Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
Velocity.ApproxEquals(Vector3.Zero, VELOCITY_TOLERANCE) ||
!AngularVelocity.ApproxEquals(m_lastAngularVelocity, VELOCITY_TOLERANCE) ||
!OffsetPosition.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
{
AddTerseUpdateToAllAvatars();
ClearUpdateSchedule();
#region PrimUpdateFlags Management
// This causes the Scene to 'poll' physical objects every couple of frames
// bad, so it's been replaced by an event driven method.
//if ((ObjectFlags & (uint)PrimFlags.Physics) != 0)
//{
// Only send the constant terse updates on physical objects!
//ScheduleTerseUpdate();
//}
// Check if any of the movement fields changes and set flags accordingly
PrimUpdateFlags updateFlags = m_pendingUpdateFlags;
// Update the "last" values
m_lastPosition = OffsetPosition;
m_lastRotation = RotationOffset;
m_lastVelocity = Velocity;
m_lastAcceleration = Acceleration;
m_lastAngularVelocity = AngularVelocity;
m_lastTerseSent = Environment.TickCount;
}
}
if (!RotationOffset.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
updateFlags |= PrimUpdateFlags.Rotation;
else
updateFlags &= ~PrimUpdateFlags.Rotation;
if (!Acceleration.Equals(m_lastAcceleration))
updateFlags |= PrimUpdateFlags.Acceleration;
else
updateFlags &= ~PrimUpdateFlags.Acceleration;
if (!Velocity.Equals(m_lastVelocity))
updateFlags |= PrimUpdateFlags.Velocity;
else
updateFlags &= ~PrimUpdateFlags.Velocity;
if (!AngularVelocity.Equals(m_lastAngularVelocity))
updateFlags |= PrimUpdateFlags.AngularVelocity;
else
updateFlags &= ~PrimUpdateFlags.AngularVelocity;
if (!OffsetPosition.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
updateFlags |= PrimUpdateFlags.Position;
else
updateFlags &= ~PrimUpdateFlags.Position;
// For good measure
if (Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
updateFlags |= PrimUpdateFlags.Position;
#endregion PrimUpdateFlags Management
if (updateFlags != 0)
{
if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes
{
AddFullUpdateToAllAvatars();
ClearUpdateSchedule();
}
AddUpdateToAllAvatars(updateFlags);
// Update the "last" values
m_lastPosition = OffsetPosition;
m_lastRotation = RotationOffset;
m_lastVelocity = Velocity;
m_lastAcceleration = Acceleration;
m_lastAngularVelocity = AngularVelocity;
m_lastTerseSent = Environment.TickCount;
}
ClearUpdateSchedule();
ClearPendingUpdate();
}
/// <summary>
@ -3323,7 +3274,7 @@ namespace OpenSim.Region.Framework.Scenes
_groupID = groupID;
if (client != null)
GetProperties(client);
m_updateFlag = 2;
m_pendingUpdateFlags |= PrimUpdateFlags.FullUpdate;
}
/// <summary>
@ -3385,14 +3336,14 @@ namespace OpenSim.Region.Framework.Scenes
Text = text;
ParentGroup.HasGroupChanged = true;
ScheduleFullUpdate();
ScheduleUpdate(PrimUpdateFlags.Text);
}
public void StopLookAt()
{
m_parentGroup.stopLookAt();
m_parentGroup.ScheduleGroupForTerseUpdate();
m_parentGroup.ScheduleGroupForUpdate(PrimUpdateFlags.Position | PrimUpdateFlags.Rotation);
}
/// <summary>
@ -3414,8 +3365,7 @@ namespace OpenSim.Region.Framework.Scenes
{
m_parentGroup.stopMoveToTarget();
m_parentGroup.ScheduleGroupForTerseUpdate();
//m_parentGroup.ScheduleGroupForFullUpdate();
m_parentGroup.ScheduleGroupForUpdate(PrimUpdateFlags.Position | PrimUpdateFlags.Rotation);
}
public void StoreUndoState()
@ -3962,7 +3912,7 @@ namespace OpenSim.Region.Framework.Scenes
}
ParentGroup.HasGroupChanged = true;
ScheduleFullUpdate();
ScheduleUpdate(PrimUpdateFlags.ExtraData);
}
public void UpdateGroupPosition(Vector3 pos)
@ -3973,7 +3923,7 @@ namespace OpenSim.Region.Framework.Scenes
{
Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
GroupPosition = newPos;
ScheduleTerseUpdate();
ScheduleUpdate(PrimUpdateFlags.Position);
}
}
@ -4005,7 +3955,7 @@ namespace OpenSim.Region.Framework.Scenes
}
OffsetPosition = newPos;
ScheduleTerseUpdate();
ScheduleUpdate(PrimUpdateFlags.Position);
}
}
@ -4285,7 +4235,7 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.Debug("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString());
ParentGroup.HasGroupChanged = true;
ScheduleFullUpdate();
ScheduleUpdate(PrimUpdateFlags.PrimFlags);
}
public void UpdateRotation(Quaternion rot)
@ -4297,7 +4247,7 @@ namespace OpenSim.Region.Framework.Scenes
{
RotationOffset = rot;
ParentGroup.HasGroupChanged = true;
ScheduleTerseUpdate();
ScheduleUpdate(PrimUpdateFlags.Rotation);
}
}
@ -4341,7 +4291,7 @@ namespace OpenSim.Region.Framework.Scenes
ParentGroup.RootPart.Rezzed = DateTime.UtcNow;
ParentGroup.HasGroupChanged = true;
ScheduleFullUpdate();
ScheduleUpdate(PrimUpdateFlags.PrimData);
}
/// <summary>
@ -4388,7 +4338,7 @@ namespace OpenSim.Region.Framework.Scenes
//This is madness..
//ParentGroup.ScheduleGroupForFullUpdate();
//This is sparta
ScheduleFullUpdate();
ScheduleUpdate(PrimUpdateFlags.Textures);
}
public void aggregateScriptEvents()
@ -4456,7 +4406,7 @@ namespace OpenSim.Region.Framework.Scenes
{
// m_log.DebugFormat(
// "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents() since m_parentGroup == null", Name, LocalId);
ScheduleFullUpdate();
ScheduleUpdate(PrimUpdateFlags.FullUpdate);
return;
}
@ -4479,7 +4429,7 @@ namespace OpenSim.Region.Framework.Scenes
{
// m_log.DebugFormat(
// "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents()", Name, LocalId);
ScheduleFullUpdate();
ScheduleUpdate(PrimUpdateFlags.FullUpdate);
}
}

View File

@ -278,7 +278,7 @@ namespace OpenSim.Region.Framework.Scenes
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
m_part.ScheduleUpdate(PrimUpdateFlags.FullUpdate);
return;
}
@ -306,7 +306,7 @@ namespace OpenSim.Region.Framework.Scenes
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
m_part.ScheduleUpdate(PrimUpdateFlags.FullUpdate);
}
}
}
@ -697,7 +697,7 @@ namespace OpenSim.Region.Framework.Scenes
m_part.RemFlag(PrimFlags.Scripted);
}
m_part.ScheduleFullUpdate();
m_part.ScheduleUpdate(PrimUpdateFlags.FullUpdate);
return type;
}

View File

@ -783,10 +783,9 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary>
/// Add the part to the queue of parts for which we need to send an update to the client
/// </summary>
/// <param name="part"></param>
public void QueuePartForUpdate(SceneObjectPart part)
public void QueuePartForUpdate(SceneObjectPart part, PrimUpdateFlags updateFlags)
{
m_sceneViewer.QueuePartForUpdate(part);
m_sceneViewer.QueuePartForUpdate(part, updateFlags);
}
/// <summary>
@ -1573,7 +1572,7 @@ namespace OpenSim.Region.Framework.Scenes
// Commented out this code since it could never have executed, but might still be informative.
// if (proxyObjectGroup != null)
// {
proxyObjectGroup.SendGroupFullUpdate();
proxyObjectGroup.SendGroupUpdate(PrimUpdateFlags.FullUpdate);
remote_client.SendSitResponse(proxyObjectGroup.UUID, Vector3.Zero, Quaternion.Identity, true, Vector3.Zero, Vector3.Zero, false);
m_scene.DeleteSceneObject(proxyObjectGroup, false);
// }

View File

@ -38,6 +38,12 @@ namespace OpenSim.Region.Framework.Scenes
{
public class SceneViewer : ISceneViewer
{
public class ScenePartUpdate
{
public UUID FullID;
public uint LastUpdateTime;
}
protected ScenePresence m_presence;
protected UpdateQueue m_partsUpdateQueue = new UpdateQueue();
protected Queue<SceneObjectGroup> m_pendingObjects;
@ -56,13 +62,10 @@ namespace OpenSim.Region.Framework.Scenes
/// <summary>
/// Add the part to the queue of parts for which we need to send an update to the client
/// </summary>
/// <param name="part"></param>
public void QueuePartForUpdate(SceneObjectPart part)
public void QueuePartForUpdate(SceneObjectPart part, PrimUpdateFlags updateFlags)
{
lock (m_partsUpdateQueue)
{
m_partsUpdateQueue.Enqueue(part);
}
m_partsUpdateQueue.Enqueue(part, updateFlags);
}
public void SendPrimUpdates()
@ -94,14 +97,15 @@ namespace OpenSim.Region.Framework.Scenes
// Don't even queue if we have sent this one
//
if (!m_updateTimes.ContainsKey(g.UUID))
g.ScheduleFullUpdateToAvatar(m_presence);
g.ScheduleUpdateToAvatar(m_presence, PrimUpdateFlags.FullUpdate);
}
while (m_partsUpdateQueue.Count > 0)
SceneObjectPart part;
PrimUpdateFlags updateFlags;
while (m_partsUpdateQueue.TryDequeue(out part, out updateFlags))
{
SceneObjectPart part = m_partsUpdateQueue.Dequeue();
if (part.ParentGroup == null || part.ParentGroup.IsDeleted)
if (part.ParentGroup.IsDeleted)
continue;
if (m_updateTimes.ContainsKey(part.UUID))
@ -111,14 +115,13 @@ namespace OpenSim.Region.Framework.Scenes
// We deal with the possibility that two updates occur at
// the same unix time at the update point itself.
if ((update.LastFullUpdateTime < part.TimeStampFull) ||
part.IsAttachment)
if ((update.LastUpdateTime < part.TimeStampUpdate) || part.IsAttachment)
{
// m_log.DebugFormat(
// "[SCENE PRESENCE]: Fully updating prim {0}, {1} - part timestamp {2}",
// part.Name, part.UUID, part.TimeStampFull);
part.SendUpdateToClient(m_presence.ControllingClient, PrimUpdateFlags.FullUpdate);
part.SendUpdateToClient(m_presence.ControllingClient, updateFlags);
// We'll update to the part's timestamp rather than
// the current time to avoid the race condition
@ -127,19 +130,7 @@ namespace OpenSim.Region.Framework.Scenes
// updates which occurred on the same tick or the
// next tick of the last update would be ignored.
update.LastFullUpdateTime = part.TimeStampFull;
}
else if (update.LastTerseUpdateTime <= part.TimeStampTerse)
{
// m_log.DebugFormat(
// "[SCENE PRESENCE]: Tersely updating prim {0}, {1} - part timestamp {2}",
// part.Name, part.UUID, part.TimeStampTerse);
part.SendUpdateToClient(m_presence.ControllingClient, PrimUpdateFlags.Position | PrimUpdateFlags.Rotation |
PrimUpdateFlags.Velocity | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity);
update.LastTerseUpdateTime = part.TimeStampTerse;
update.LastUpdateTime = part.TimeStampUpdate;
}
}
else
@ -147,7 +138,7 @@ namespace OpenSim.Region.Framework.Scenes
//never been sent to client before so do full update
ScenePartUpdate update = new ScenePartUpdate();
update.FullID = part.UUID;
update.LastFullUpdateTime = part.TimeStampFull;
update.LastUpdateTime = part.TimeStampUpdate;
m_updateTimes.Add(part.UUID, update);
// Attachment handling
@ -191,19 +182,5 @@ namespace OpenSim.Region.Framework.Scenes
}
Reset();
}
public class ScenePartUpdate
{
public UUID FullID;
public uint LastFullUpdateTime;
public uint LastTerseUpdateTime;
public ScenePartUpdate()
{
FullID = UUID.Zero;
LastFullUpdateTime = 0;
LastTerseUpdateTime = 0;
}
}
}
}

View File

@ -72,8 +72,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
grp2.UpdateGroupRotationR(Quaternion.CreateFromEulers(180 * Utils.DEG_TO_RAD, 0, 0));
// Required for linking
grp1.RootPart.UpdateFlag = 0;
grp2.RootPart.UpdateFlag = 0;
grp1.RootPart.ClearPendingUpdate();
grp2.RootPart.ClearPendingUpdate();
// Link grp2 to grp1. part2 becomes child prim to grp1. grp2 is eliminated.
grp1.LinkToGroup(grp2);
@ -165,10 +165,10 @@ namespace OpenSim.Region.Framework.Scenes.Tests
grp4.UpdateGroupRotationR(Quaternion.CreateFromEulers(0, 90 * Utils.DEG_TO_RAD, 0));
// Required for linking
grp1.RootPart.UpdateFlag = 0;
grp2.RootPart.UpdateFlag = 0;
grp3.RootPart.UpdateFlag = 0;
grp4.RootPart.UpdateFlag = 0;
grp1.RootPart.ClearPendingUpdate();
grp2.RootPart.ClearPendingUpdate();
grp3.RootPart.ClearPendingUpdate();
grp4.RootPart.ClearPendingUpdate();
// Link grp2 to grp1. part2 becomes child prim to grp1. grp2 is eliminated.
grp1.LinkToGroup(grp2);
@ -199,8 +199,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
}
// Required for linking
grp1.RootPart.UpdateFlag = 0;
grp3.RootPart.UpdateFlag = 0;
grp1.RootPart.ClearPendingUpdate();
grp3.RootPart.ClearPendingUpdate();
// root part should have no offset position or rotation
Assert.That(part1.OffsetPosition == Vector3.Zero && part1.RotationOffset == Quaternion.Identity,

View File

@ -30,16 +30,21 @@ using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Security.Permissions;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Region.Framework.Scenes.Types
{
public class UpdateQueue
{
private Queue<SceneObjectPart> m_queue;
private Dictionary<UUID, bool> m_ids;
private struct Update
{
public SceneObjectPart Entity;
public PrimUpdateFlags UpdateFlags;
}
private Queue<Update> m_queue;
private HashSet<UUID> m_ids;
private object m_syncObject = new object();
public int Count
@ -49,8 +54,8 @@ namespace OpenSim.Region.Framework.Scenes.Types
public UpdateQueue()
{
m_queue = new Queue<SceneObjectPart>();
m_ids = new Dictionary<UUID, bool>();
m_queue = new Queue<Update>();
m_ids = new HashSet<UUID>();
}
public void Clear()
@ -62,30 +67,33 @@ namespace OpenSim.Region.Framework.Scenes.Types
}
}
public void Enqueue(SceneObjectPart part)
public void Enqueue(SceneObjectPart part, PrimUpdateFlags updateFlags)
{
lock (m_syncObject)
{
if (!m_ids.ContainsKey(part.UUID)) {
m_ids.Add(part.UUID, true);
m_queue.Enqueue(part);
}
if (m_ids.Add(part.UUID))
m_queue.Enqueue(new Update { Entity = part, UpdateFlags = updateFlags });
}
}
public SceneObjectPart Dequeue()
public bool TryDequeue(out SceneObjectPart part, out PrimUpdateFlags updateFlags)
{
SceneObjectPart part = null;
lock (m_syncObject)
{
if (m_queue.Count > 0)
{
part = m_queue.Dequeue();
Update update = m_queue.Dequeue();
part = update.Entity;
updateFlags = update.UpdateFlags;
m_ids.Remove(part.UUID);
return true;
}
}
return part;
part = null;
updateFlags = 0;
return false;
}
}
}

View File

@ -26,6 +26,7 @@
*/
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
namespace OpenSim.Region.Framework.Scenes
@ -91,7 +92,7 @@ namespace OpenSim.Region.Framework.Scenes
part.RotationOffset = Rotation;
if (Scale != Vector3.Zero)
part.Resize(Scale);
part.ParentGroup.ScheduleGroupForTerseUpdate();
part.ParentGroup.ScheduleGroupForUpdate(PrimUpdateFlags.Position | PrimUpdateFlags.Rotation);
}
else
{
@ -99,10 +100,11 @@ namespace OpenSim.Region.Framework.Scenes
part.OffsetPosition = Position;
part.UpdateRotation(Rotation);
if (Scale != Vector3.Zero)
part.Resize(Scale); part.ScheduleTerseUpdate();
part.Resize(Scale);
part.ScheduleUpdate(PrimUpdateFlags.Position | PrimUpdateFlags.Rotation);
}
part.Undoing = false;
part.Undoing = false;
}
}
public void PlayfwdState(SceneObjectPart part)
@ -119,7 +121,7 @@ namespace OpenSim.Region.Framework.Scenes
part.UpdateRotation(Rotation);
if (Scale != Vector3.Zero)
part.Resize(Scale);
part.ParentGroup.ScheduleGroupForTerseUpdate();
part.ParentGroup.ScheduleGroupForUpdate(PrimUpdateFlags.Position | PrimUpdateFlags.Rotation);
}
else
{
@ -129,7 +131,7 @@ namespace OpenSim.Region.Framework.Scenes
part.UpdateRotation(Rotation);
if (Scale != Vector3.Zero)
part.Resize(Scale);
part.ScheduleTerseUpdate();
part.ScheduleUpdate(PrimUpdateFlags.Position | PrimUpdateFlags.Rotation);
}
part.Undoing = false;

View File

@ -284,7 +284,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
((SceneObjectGroup)ent).ApplyPhysics(true);
((SceneObjectGroup)ent).AttachToBackup();
((SceneObjectGroup)ent).HasGroupChanged = true; // If not true, then attaching to backup does nothing because no change is detected.
((SceneObjectGroup)ent).ScheduleGroupForFullUpdate();
((SceneObjectGroup)ent).ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
}
catch(Exception e)
{

View File

@ -641,7 +641,7 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator
{
s_tree.Scale += copse.m_rate;
s_tree.ParentGroup.HasGroupChanged = true;
s_tree.ScheduleFullUpdate();
s_tree.ScheduleUpdate(PrimUpdateFlags.Scale);
}
}
else
@ -773,7 +773,7 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator
tree.Name = copse.ToString();
copse.m_trees.Add(tree.UUID);
tree.SendGroupFullUpdate();
tree.SendGroupUpdate(PrimUpdateFlags.FullUpdate);
}
}

View File

@ -1343,7 +1343,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1);
m_host.ClickAction = (byte)action;
if (m_host.ParentGroup != null) m_host.ParentGroup.HasGroupChanged = true;
m_host.ScheduleFullUpdate();
m_host.ScheduleUpdate(PrimUpdateFlags.PrimFlags);
return;
}
@ -1595,7 +1595,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
part.ParentGroup.HasGroupChanged = true;
part.ScheduleFullUpdate();
part.ScheduleUpdate(PrimUpdateFlags.ExtraData);
}
/// <summary>
@ -1630,7 +1630,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
part.ParentGroup.HasGroupChanged = true;
part.ScheduleFullUpdate();
part.ScheduleUpdate(PrimUpdateFlags.ExtraData);
}
public LSL_Vector llGetColor(int face)
@ -1913,7 +1913,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
part.OffsetPosition = new Vector3((float)targetPos.x, (float)targetPos.y, (float)targetPos.z);
SceneObjectGroup parent = part.ParentGroup;
parent.HasGroupChanged = true;
parent.ScheduleGroupForTerseUpdate();
parent.ScheduleGroupForUpdate(PrimUpdateFlags.Position);
}
}
}
@ -2245,7 +2245,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.SoundFlags = 1; // looping
m_host.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable?
m_host.ScheduleFullUpdate();
m_host.ScheduleUpdate(PrimUpdateFlags.Sound);
m_host.SendUpdateToAllClients(PrimUpdateFlags.Sound);
}
@ -2265,7 +2265,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
prim.SoundFlags = 1; // looping
prim.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable?
prim.ScheduleFullUpdate();
prim.ScheduleUpdate(PrimUpdateFlags.Sound);
prim.SendUpdateToAllClients(PrimUpdateFlags.Sound);
}
}
@ -2277,7 +2277,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.SoundFlags = 1; // looping
m_host.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable?
m_host.ScheduleFullUpdate();
m_host.ScheduleUpdate(PrimUpdateFlags.Sound);
m_host.SendUpdateToAllClients(PrimUpdateFlags.Sound);
}
@ -2319,7 +2319,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
part.SoundGain = 0;
part.SoundFlags = 0;
part.SoundRadius = 0;
part.ScheduleFullUpdate();
part.ScheduleUpdate(PrimUpdateFlags.Sound);
part.SendUpdateToAllClients(PrimUpdateFlags.Sound);
}
m_host.ParentGroup.LoopSoundMasterPrim = null;
@ -2331,7 +2331,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.SoundGain = 0;
m_host.SoundFlags = 0;
m_host.SoundRadius = 0;
m_host.ScheduleFullUpdate();
m_host.ScheduleUpdate(PrimUpdateFlags.Sound);
m_host.SendUpdateToAllClients(PrimUpdateFlags.Sound);
}
}
@ -2341,7 +2341,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.SoundGain = 0;
m_host.SoundFlags = 0;
m_host.SoundRadius = 0;
m_host.ScheduleFullUpdate();
m_host.ScheduleUpdate(PrimUpdateFlags.Sound);
m_host.SendUpdateToAllClients(PrimUpdateFlags.Sound);
}
}
@ -3240,7 +3240,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
m_host.AddScriptLPS(1);
m_host.AngularVelocity = new Vector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate));
m_host.ScheduleTerseUpdate();
m_host.ScheduleUpdate(PrimUpdateFlags.AngularVelocity);
m_host.SendUpdateToAllClients(PrimUpdateFlags.AngularVelocity);
m_host.ParentGroup.HasGroupChanged = true;
}
@ -3507,7 +3507,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
childPrim = m_host.ParentGroup;
}
// byte uf = childPrim.RootPart.UpdateFlag;
childPrim.RootPart.UpdateFlag = 0;
childPrim.RootPart.ClearPendingUpdate();
parentPrim.LinkToGroup(childPrim);
// if (uf != (Byte)0)
// parent.RootPart.UpdateFlag = uf;
@ -3516,7 +3516,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
parentPrim.RootPart.AddFlag(PrimFlags.CreateSelected);
parentPrim.HasGroupChanged = true;
parentPrim.ScheduleGroupForFullUpdate();
parentPrim.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
if (client != null)
parentPrim.GetProperties(client);
@ -3582,7 +3582,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
parentPrim.DelinkFromGroup(part.LocalId, true);
}
parentPrim.HasGroupChanged = true;
parentPrim.ScheduleGroupForFullUpdate();
parentPrim.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
if (parts.Count > 0)
@ -3591,11 +3591,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
parts.Remove(newRoot);
foreach (SceneObjectPart part in parts)
{
part.UpdateFlag = 0;
part.ClearPendingUpdate();
newRoot.ParentGroup.LinkToGroup(part.ParentGroup);
}
newRoot.ParentGroup.HasGroupChanged = true;
newRoot.ParentGroup.ScheduleGroupForFullUpdate();
newRoot.ParentGroup.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
}
}
else
@ -3605,7 +3605,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
parentPrim.DelinkFromGroup(childPrim.LocalId, true);
parentPrim.HasGroupChanged = true;
parentPrim.ScheduleGroupForFullUpdate();
parentPrim.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
}
}
@ -3626,7 +3626,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
}
parentPrim.HasGroupChanged = true;
parentPrim.ScheduleGroupForFullUpdate();
parentPrim.ScheduleGroupForUpdate(PrimUpdateFlags.FullUpdate);
}
public LSL_String llGetLinkKey(int linknum)
@ -3866,7 +3866,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
Util.Clip((float)color.z, 0.0f, 1.0f));
m_host.SetText(text, av3, Util.Clip((float)alpha, 0.0f, 1.0f));
m_host.ParentGroup.HasGroupChanged = true;
m_host.ParentGroup.ScheduleGroupForFullUpdate();
m_host.ParentGroup.ScheduleGroupForUpdate(PrimUpdateFlags.Text);
}
public LSL_Float llWater(LSL_Vector offset)