Switched to use ScheduleFullUpdates() and ScheduleTerseUpdates() as the funnel to catch any property updates, so as to update bucket's sync
timestamp correctly. Code good for compilation, runtime not tested yet.dsg
parent
5ef659520e
commit
7a331b6a8f
|
@ -591,7 +591,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
|||
}
|
||||
|
||||
so.AbsolutePosition = AttachOffset;
|
||||
so.RootPart.AttachedPos = AttachOffset;
|
||||
so.RootPart.AttachedPos = AttachOffset;
|
||||
so.RootPart.IsAttachment = true;
|
||||
|
||||
so.RootPart.SetParentLocalId(avatar.LocalId);
|
||||
|
@ -611,7 +611,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
|||
}
|
||||
|
||||
so.IsSelected = false; // fudge....
|
||||
so.ScheduleGroupForFullUpdate();
|
||||
//so.ScheduleGroupForFullUpdate();
|
||||
so.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //just force it to sychronize all properties
|
||||
}
|
||||
|
||||
// In case it is later dropped again, don't let
|
||||
|
|
|
@ -352,7 +352,8 @@ namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps
|
|||
rootGroup.LinkToGroup(allparts[j]);
|
||||
}
|
||||
|
||||
rootGroup.ScheduleGroupForFullUpdate();
|
||||
//rootGroup.ScheduleGroupForFullUpdate();
|
||||
rootGroup.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //seems like new object
|
||||
pos = m_scene.GetNewRezLocation(Vector3.Zero, rootpos, UUID.Zero, rot, (byte)1, 1, true, allparts[0].GroupScale(), false);
|
||||
|
||||
responsedata["int_response_code"] = 200; //501; //410; //404;
|
||||
|
|
|
@ -1581,7 +1581,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
if (destination != null && !CrossPrimGroupIntoNewRegion(destination, grp, silent))
|
||||
{
|
||||
grp.OffsetForNewRegion(oldGroupPosition);
|
||||
grp.ScheduleGroupForFullUpdate();
|
||||
//grp.ScheduleGroupForFullUpdate();
|
||||
grp.ScheduleGroupForFullUpdate(SceneObjectPartProperties.Position);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -600,7 +600,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
// if not, we set it's position in world.
|
||||
if (!attachment)
|
||||
{
|
||||
group.ScheduleGroupForFullUpdate();
|
||||
//group.ScheduleGroupForFullUpdate();
|
||||
group.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //new object
|
||||
|
||||
float offsetHeight = 0;
|
||||
pos = m_Scene.GetNewRezLocation(
|
||||
|
@ -698,7 +699,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1);
|
||||
rootPart.ParentGroup.ResumeScripts();
|
||||
|
||||
rootPart.ScheduleFullUpdate();
|
||||
//rootPart.ScheduleFullUpdate();
|
||||
rootPart.ScheduleFullUpdate(SceneObjectPartProperties.FullUpdate);
|
||||
}
|
||||
|
||||
if (!m_Scene.Permissions.BypassPermissions())
|
||||
|
|
|
@ -321,7 +321,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
//RegionSyncMessage.HandleSuccess(LogHeader(), msg, String.Format("Object \"{0}\" ({1}) ({1}) updated.", sog.Name, sog.UUID.ToString(), sog.LocalId.ToString()));
|
||||
//else
|
||||
//RegionSyncMessage.HandleSuccess(LogHeader(), msg, String.Format("Object \"{0}\" ({1}) ({1}) added.", sog.Name, sog.UUID.ToString(), sog.LocalId.ToString()));
|
||||
sog.ScheduleGroupForFullUpdate();
|
||||
//sog.ScheduleGroupForFullUpdate();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -550,7 +550,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
//the prim is not the root-part, set the offset position
|
||||
primToUpdate.OffsetPosition = pos;
|
||||
parent.HasGroupChanged = true;
|
||||
parent.ScheduleGroupForTerseUpdate();
|
||||
//parent.ScheduleGroupForTerseUpdate();
|
||||
parent.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.OffsetPosition);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -181,8 +181,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
get { return m_isSyncRelay; }
|
||||
}
|
||||
|
||||
private Dictionary<string, string> m_primPropertyBucketMap = new Dictionary<string, string>();
|
||||
public Dictionary<string, string> PrimPropertyBucketMap
|
||||
private Dictionary<SceneObjectPartProperties, string> m_primPropertyBucketMap = new Dictionary<SceneObjectPartProperties, string>();
|
||||
public Dictionary<SceneObjectPartProperties, string> PrimPropertyBucketMap
|
||||
{
|
||||
get { return m_primPropertyBucketMap; }
|
||||
}
|
||||
|
@ -225,6 +225,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
m_propertyBucketDescription.Add(physicsBucketName);
|
||||
m_maxNumOfPropertyBuckets = 2;
|
||||
|
||||
/*
|
||||
foreach (string pName in SceneObjectPart.PropertyList)
|
||||
{
|
||||
switch (pName){
|
||||
|
@ -252,6 +253,36 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
break;
|
||||
}
|
||||
}
|
||||
* */
|
||||
|
||||
foreach (SceneObjectPartProperties property in Enum.GetValues(typeof(SceneObjectPartProperties)))
|
||||
{
|
||||
switch (property)
|
||||
{
|
||||
case SceneObjectPartProperties.GroupPosition:
|
||||
case SceneObjectPartProperties.OffsetPosition:
|
||||
case SceneObjectPartProperties.Scale:
|
||||
case SceneObjectPartProperties.Velocity:
|
||||
case SceneObjectPartProperties.AngularVelocity:
|
||||
case SceneObjectPartProperties.RotationOffset:
|
||||
case SceneObjectPartProperties.Position:
|
||||
case SceneObjectPartProperties.Size:
|
||||
case SceneObjectPartProperties.Force:
|
||||
case SceneObjectPartProperties.RotationalVelocity:
|
||||
case SceneObjectPartProperties.PA_Acceleration:
|
||||
case SceneObjectPartProperties.Torque:
|
||||
case SceneObjectPartProperties.Orientation:
|
||||
case SceneObjectPartProperties.IsPhysical:
|
||||
case SceneObjectPartProperties.Flying:
|
||||
case SceneObjectPartProperties.Buoyancy:
|
||||
m_primPropertyBucketMap.Add(property, physicsBucketName);
|
||||
break;
|
||||
default:
|
||||
//all other properties belong to the "General" bucket.
|
||||
m_primPropertyBucketMap.Add(property, generalBucketName);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsSyncingWithOtherActors()
|
||||
|
|
|
@ -236,7 +236,8 @@ namespace OpenSim.Region.CoreModules.Media.Moap
|
|||
part.Shape.Media[face] = me;
|
||||
|
||||
UpdateMediaUrl(part, UUID.Zero);
|
||||
part.ScheduleFullUpdate();
|
||||
//part.ScheduleFullUpdate();
|
||||
part.ScheduleFullUpdate(SceneObjectPartProperties.MediaUrl);
|
||||
part.TriggerScriptChangedEvent(Changed.MEDIA);
|
||||
}
|
||||
|
||||
|
@ -421,7 +422,9 @@ namespace OpenSim.Region.CoreModules.Media.Moap
|
|||
UpdateMediaUrl(part, agentId);
|
||||
|
||||
// Arguably, we could avoid sending a full update to the avatar that just changed the texture.
|
||||
part.ScheduleFullUpdate();
|
||||
//part.ScheduleFullUpdate();
|
||||
part.ScheduleFullUpdate(SceneObjectPartProperties.Shape);
|
||||
part.ScheduleFullUpdate(SceneObjectPartProperties.MediaUrl); //not an efficient way to taint two properties, but should not have bad side effects
|
||||
|
||||
part.TriggerScriptChangedEvent(Changed.MEDIA);
|
||||
|
||||
|
@ -499,7 +502,8 @@ namespace OpenSim.Region.CoreModules.Media.Moap
|
|||
|
||||
UpdateMediaUrl(part, agentId);
|
||||
|
||||
part.ScheduleFullUpdate();
|
||||
//part.ScheduleFullUpdate();
|
||||
part.ScheduleFullUpdate(SceneObjectPartProperties.MediaUrl);
|
||||
|
||||
part.TriggerScriptChangedEvent(Changed.MEDIA);
|
||||
|
||||
|
|
|
@ -148,7 +148,8 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
|
|||
part.GetProperties(remoteClient);
|
||||
part.TriggerScriptChangedEvent(Changed.OWNER);
|
||||
group.ResumeScripts();
|
||||
part.ScheduleFullUpdate();
|
||||
//part.ScheduleFullUpdate();
|
||||
part.ScheduleFullUpdate(SceneObjectPartProperties.FullUpdate); //quite some properties changed, let's just force all to be synchronized
|
||||
|
||||
break;
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// <summary>
|
||||
/// The mapping of a property (identified by its name) to the index of a bucket.
|
||||
/// </summary>
|
||||
Dictionary<string, string> PrimPropertyBucketMap { get; }
|
||||
Dictionary<SceneObjectPartProperties, string> PrimPropertyBucketMap { get; }
|
||||
/// <summary>
|
||||
/// The text description of the properties in each bucket, e.g. "General", "Physics"
|
||||
/// </summary>
|
||||
|
|
|
@ -2197,7 +2197,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// to find out if scripts should be activated at all.
|
||||
group.CreateScriptInstances(param, true, DefaultScriptEngine, 3);
|
||||
|
||||
group.ScheduleGroupForFullUpdate();
|
||||
//group.ScheduleGroupForFullUpdate();
|
||||
group.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //new object, all properties have new value
|
||||
|
||||
return group;
|
||||
}
|
||||
|
@ -2262,7 +2263,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
sog.SetOwnerId(ownerID);
|
||||
sog.SetGroup(groupID, remoteClient);
|
||||
sog.ScheduleGroupForFullUpdate();
|
||||
//sog.ScheduleGroupForFullUpdate();
|
||||
sog.ScheduleGroupForFullUpdate(SceneObjectPartProperties.OwnerID);
|
||||
|
||||
SceneObjectPart[] partList = sog.Parts;
|
||||
|
||||
|
|
|
@ -208,11 +208,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// TODO: Make selection flagging per prim!
|
||||
//
|
||||
part.ParentGroup.IsSelected = false;
|
||||
|
||||
|
||||
if (part.ParentGroup.IsAttachment)
|
||||
isAttachment = true;
|
||||
else
|
||||
part.ParentGroup.ScheduleGroupForFullUpdate();
|
||||
//part.ParentGroup.ScheduleGroupForFullUpdate();
|
||||
part.ParentGroup.ScheduleGroupForFullUpdate(SceneObjectPartProperties.IsSelected);
|
||||
|
||||
// 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
|
||||
|
|
|
@ -2391,7 +2391,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
sceneObject.SetGroup(groupID, null);
|
||||
}
|
||||
|
||||
sceneObject.ScheduleGroupForFullUpdate();
|
||||
//sceneObject.ScheduleGroupForFullUpdate();
|
||||
sceneObject.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //new object, all properties have new value
|
||||
|
||||
return sceneObject;
|
||||
}
|
||||
|
@ -4490,7 +4491,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
if (ent is SceneObjectGroup)
|
||||
{
|
||||
((SceneObjectGroup)ent).ScheduleGroupForFullUpdate();
|
||||
//((SceneObjectGroup)ent).ScheduleGroupForFullUpdate();
|
||||
((SceneObjectGroup)ent).ScheduleGroupForFullUpdate(SceneObjectPartProperties.None); //This is not due to property being updated, hence passing "None" property.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -383,7 +383,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
sceneObject.AttachToScene(m_parentScene);
|
||||
|
||||
if (sendClientUpdates)
|
||||
sceneObject.ScheduleGroupForFullUpdate();
|
||||
//sceneObject.ScheduleGroupForFullUpdate();
|
||||
sceneObject.ScheduleGroupForFullUpdate(SceneObjectPartProperties.None);
|
||||
|
||||
Entities.Add(sceneObject);
|
||||
|
||||
|
@ -1747,22 +1748,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
//SYMMETRIC SYNC
|
||||
//set timestamp
|
||||
/*
|
||||
long timeStamp = DateTime.Now.Ticks;
|
||||
string actorID = m_parentScene.GetSyncActorID();
|
||||
foreach (SceneObjectGroup sog in afterDelinkGroups)
|
||||
{
|
||||
if (m_parentScene.RegionSyncModule != null)
|
||||
{
|
||||
sog.SyncInfoUpdate(timeStamp, actorID); ;
|
||||
}
|
||||
}
|
||||
* */
|
||||
//Send out DelinkObject message to other actors to sychronize their object list
|
||||
m_parentScene.RegionSyncModule.SendDeLinkObject(prims, beforeDelinkGroups, afterDelinkGroups);
|
||||
|
||||
|
||||
if (m_parentScene.RegionSyncModule != null)
|
||||
{
|
||||
m_parentScene.RegionSyncModule.SendDeLinkObject(prims, beforeDelinkGroups, afterDelinkGroups);
|
||||
}
|
||||
//Schedule updates as in legacy OpenSim code, to send updates to viewers connected to this actor (at least needed for client managers).
|
||||
//But timestamp won't be changed, so that when other actors get the update, they's simple ignore the updates since they already get them
|
||||
foreach (SceneObjectGroup sog in afterDelinkGroups)
|
||||
|
@ -1905,7 +1895,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 1);
|
||||
copy.HasGroupChanged = true;
|
||||
copy.ScheduleGroupForFullUpdate();
|
||||
//copy.ScheduleGroupForFullUpdate();
|
||||
copy.ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //new object, all property values are new
|
||||
copy.ResumeScripts();
|
||||
|
||||
// required for physics to update it's position
|
||||
|
@ -1974,7 +1965,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
//if we need to debug the script engine with a viewer attaching to it,
|
||||
//we need to schedule updates to be sent to the viewer
|
||||
oldSog.ScheduleGroupForFullUpdate();
|
||||
oldSog.ScheduleGroupForFullUpdate(SceneObjectPartProperties.None);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -1022,7 +1022,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
RootPart.RemFlag(PrimFlags.TemporaryOnRez);
|
||||
AttachToBackup();
|
||||
m_scene.EventManager.TriggerParcelPrimCountTainted();
|
||||
m_rootPart.ScheduleFullUpdate();
|
||||
//m_rootPart.ScheduleFullUpdate();
|
||||
m_rootPart.ScheduleFullUpdate(SceneObjectPartProperties.AttachmentPoint); //Physics properties, such as Position, OffsetPosition, etc, should be tainted in ApplyPhysics()
|
||||
m_rootPart.ClearUndoState();
|
||||
}
|
||||
|
||||
|
@ -1295,7 +1296,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_scene.RemoveGroupTarget(this);
|
||||
}
|
||||
|
||||
ScheduleGroupForFullUpdate();
|
||||
//ScheduleGroupForFullUpdate();
|
||||
ScheduleGroupForFullUpdate(SceneObjectPartProperties.Flags);
|
||||
}
|
||||
|
||||
public void SetText(string text, Vector3 color, double alpha)
|
||||
|
@ -1307,7 +1309,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
Text = text;
|
||||
|
||||
HasGroupChanged = true;
|
||||
m_rootPart.ScheduleFullUpdate();
|
||||
//m_rootPart.ScheduleFullUpdate();
|
||||
m_rootPart.ScheduleFullUpdate(SceneObjectPartProperties.Text);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1541,7 +1544,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
dupe.HasGroupChanged = true;
|
||||
dupe.AttachToBackup();
|
||||
|
||||
ScheduleGroupForFullUpdate();
|
||||
//ScheduleGroupForFullUpdate();
|
||||
ScheduleGroupForFullUpdate(SceneObjectPartProperties.None); //This full-update is triggered by copying, no property changed
|
||||
}
|
||||
|
||||
return dupe;
|
||||
|
@ -1794,7 +1798,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
ApplyNextOwnerPermissions();
|
||||
}
|
||||
|
||||
part.ScheduleFullUpdate();
|
||||
//part.ScheduleFullUpdate();
|
||||
part.ScheduleFullUpdate(SceneObjectPartProperties.OwnerID);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1919,33 +1924,38 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <summary>
|
||||
/// Schedule a full update for this scene object
|
||||
/// </summary>
|
||||
public void ScheduleGroupForFullUpdate()
|
||||
//public void ScheduleGroupForFullUpdate()
|
||||
public void ScheduleGroupForFullUpdate(SceneObjectPartProperties property)
|
||||
{
|
||||
// if (IsAttachment)
|
||||
// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId);
|
||||
|
||||
checkAtTargets();
|
||||
RootPart.ScheduleFullUpdate();
|
||||
//RootPart.ScheduleFullUpdate();
|
||||
RootPart.ScheduleFullUpdate(property);
|
||||
|
||||
SceneObjectPart[] parts = m_parts.GetArray();
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
SceneObjectPart part = parts[i];
|
||||
if (part != RootPart)
|
||||
part.ScheduleFullUpdate();
|
||||
//part.ScheduleFullUpdate();
|
||||
part.ScheduleFullUpdate(property);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Schedule a terse update for this scene object
|
||||
/// </summary>
|
||||
public void ScheduleGroupForTerseUpdate()
|
||||
//public void ScheduleGroupForTerseUpdate()
|
||||
public void ScheduleGroupForTerseUpdate(SceneObjectPartProperties property)
|
||||
{
|
||||
// m_log.DebugFormat("[SOG]: Scheduling terse update for {0} {1}", Name, UUID);
|
||||
|
||||
SceneObjectPart[] parts = m_parts.GetArray();
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
parts[i].ScheduleTerseUpdate();
|
||||
//parts[i].ScheduleTerseUpdate();
|
||||
parts[i].ScheduleTerseUpdate(property);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -2703,7 +2713,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
HasGroupChanged = true;
|
||||
part.TriggerScriptChangedEvent(Changed.SCALE);
|
||||
ScheduleGroupForFullUpdate();
|
||||
//ScheduleGroupForFullUpdate();
|
||||
ScheduleGroupForFullUpdate(SceneObjectPartProperties.None); //above actions only update Scale for the given part, and part.Resize() will taint Scale as updated
|
||||
|
||||
//if (part.UUID == m_rootPart.UUID)
|
||||
//{
|
||||
|
@ -2855,7 +2866,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
part.StoreUndoState();
|
||||
HasGroupChanged = true;
|
||||
m_rootPart.TriggerScriptChangedEvent(Changed.SCALE);
|
||||
ScheduleGroupForTerseUpdate();
|
||||
//ScheduleGroupForTerseUpdate();
|
||||
ScheduleGroupForTerseUpdate(SceneObjectPartProperties.Scale);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2896,7 +2908,8 @@ 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();
|
||||
//ScheduleGroupForTerseUpdate();
|
||||
ScheduleGroupForTerseUpdate(SceneObjectPartProperties.GroupPosition);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -2959,7 +2972,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
AbsolutePosition = newPos;
|
||||
|
||||
HasGroupChanged = true;
|
||||
ScheduleGroupForTerseUpdate();
|
||||
//ScheduleGroupForTerseUpdate();
|
||||
ScheduleGroupForTerseUpdate(SceneObjectPartProperties.Position);
|
||||
}
|
||||
|
||||
public void OffsetForNewRegion(Vector3 offset)
|
||||
|
@ -2991,7 +3005,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
HasGroupChanged = true;
|
||||
ScheduleGroupForTerseUpdate();
|
||||
//ScheduleGroupForTerseUpdate();
|
||||
ScheduleGroupForTerseUpdate(SceneObjectPartProperties.None); //Above actions only update m_rootPart's RotationOffset, and m_rootPart.UpdateRotation will taint RotationOffset as updated
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -3017,7 +3032,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
AbsolutePosition = pos;
|
||||
|
||||
HasGroupChanged = true;
|
||||
ScheduleGroupForTerseUpdate();
|
||||
//ScheduleGroupForTerseUpdate();
|
||||
ScheduleGroupForTerseUpdate(SceneObjectPartProperties.Position); //RotationOffset is only updated for m_rootPart, and m_rootPart.UpdateRotation should already taint RotationOffset as updated
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -3104,7 +3120,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
Quaternion newRot = primsRot * oldParentRot;
|
||||
newRot *= Quaternion.Inverse(axRot);
|
||||
prim.RotationOffset = newRot;
|
||||
prim.ScheduleTerseUpdate();
|
||||
//prim.ScheduleTerseUpdate();
|
||||
prim.ScheduleTerseUpdate(SceneObjectPartProperties.RotationOffset | SceneObjectPartProperties.OffsetPosition);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3118,7 +3135,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
m_rootPart.ScheduleTerseUpdate();
|
||||
//m_rootPart.ScheduleTerseUpdate();
|
||||
m_rootPart.ScheduleTerseUpdate(SceneObjectPartProperties.RotationOffset);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
|
@ -311,7 +311,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
///
|
||||
/// TODO - This should be an enumeration
|
||||
/// </summary>
|
||||
private byte m_updateFlag;
|
||||
//private byte m_updateFlag;
|
||||
protected byte m_updateFlag;
|
||||
|
||||
private PhysicsActor m_physActor;
|
||||
protected Vector3 m_acceleration;
|
||||
|
@ -352,6 +353,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
private bool m_forceMouselook;
|
||||
|
||||
// TODO: Collision sound should have default.
|
||||
//private UUID m_collisionSound;
|
||||
protected UUID m_collisionSound;
|
||||
private float m_collisionSoundVolume;
|
||||
|
||||
|
@ -2749,7 +2751,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
//m_parentGroup.RootPart.m_groupPosition = newpos;
|
||||
}
|
||||
ScheduleTerseUpdate();
|
||||
//ScheduleTerseUpdate();
|
||||
ScheduleTerseUpdate(SceneObjectPartProperties.Position);
|
||||
|
||||
//SendTerseUpdateToAllClients();
|
||||
}
|
||||
|
@ -2839,7 +2842,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_shape.Scale = scale;
|
||||
|
||||
ParentGroup.HasGroupChanged = true;
|
||||
ScheduleFullUpdate();
|
||||
//ScheduleFullUpdate();
|
||||
ScheduleFullUpdate(SceneObjectPartProperties.Scale);
|
||||
}
|
||||
|
||||
public void RotLookAt(Quaternion target, float strength, float damping)
|
||||
|
@ -2881,7 +2885,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// <summary>
|
||||
/// Schedules this prim for a full update
|
||||
/// </summary>
|
||||
public void ScheduleFullUpdate()
|
||||
//public void ScheduleFullUpdate() :: SYMMETRIC SYNC: changed the interface so that we can identify which property triggers calling this function
|
||||
public virtual void ScheduleFullUpdate(SceneObjectPartProperties sopProperty)
|
||||
{
|
||||
// m_log.DebugFormat("[SCENE OBJECT PART]: Scheduling full update for {0} {1}", Name, LocalId);
|
||||
|
||||
|
@ -2909,20 +2914,14 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// m_log.DebugFormat(
|
||||
// "[SCENE OBJECT PART]: Scheduling full update for {0}, {1} at {2}",
|
||||
// UUID, Name, TimeStampFull);
|
||||
|
||||
//SYMMETRIC SYNC
|
||||
|
||||
//update information (timestamp, actorID, etc) needed for synchronization across copies of Scene
|
||||
//SyncInfoUpdate();
|
||||
|
||||
//end of SYMMETRIC SYNC
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Schedule a terse update for this prim. Terse updates only send position,
|
||||
/// rotation, velocity, rotational velocity and shape information.
|
||||
/// </summary>
|
||||
public void ScheduleTerseUpdate()
|
||||
//public void ScheduleTerseUpdate()
|
||||
public virtual void ScheduleTerseUpdate(SceneObjectPartProperties sopProperty)
|
||||
{
|
||||
if (m_updateFlag < 1)
|
||||
{
|
||||
|
@ -2937,13 +2936,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// m_log.DebugFormat(
|
||||
// "[SCENE OBJECT PART]: Scheduling terse update for {0}, {1} at {2}",
|
||||
// UUID, Name, TimeStampTerse);
|
||||
|
||||
//SYMMETRIC SYNC
|
||||
|
||||
//update information (timestamp, actorID, etc) needed for synchronization across copies of Scene
|
||||
//SyncInfoUpdate();
|
||||
|
||||
//end of SYMMETRIC SYNC
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2981,8 +2973,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
|
||||
//public void SculptTextureCallback(UUID textureID, AssetBase texture)
|
||||
public virtual void SculptTextureCallback(UUID textureID, AssetBase texture)
|
||||
public void SculptTextureCallback(UUID textureID, AssetBase texture)
|
||||
{
|
||||
if (m_shape.SculptEntry)
|
||||
{
|
||||
|
@ -3164,10 +3155,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
ClearUpdateSchedule();
|
||||
|
||||
//SYMMETRIC SYNC
|
||||
if (m_parentGroup.Scene.RegionSyncModule == null)
|
||||
return;
|
||||
m_parentGroup.Scene.RegionSyncModule.QueueSceneObjectPartForUpdate((SceneObjectPart)this);
|
||||
|
||||
if (m_parentGroup.Scene.RegionSyncModule != null)
|
||||
{
|
||||
m_parentGroup.Scene.RegionSyncModule.QueueSceneObjectPartForUpdate((SceneObjectPart)this);
|
||||
}
|
||||
//end of SYMMETRIC SYNC
|
||||
}
|
||||
|
||||
|
@ -3274,8 +3265,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
});
|
||||
}
|
||||
|
||||
//public void SetAttachmentPoint(uint AttachmentPoint)
|
||||
public virtual void SetAttachmentPoint(uint AttachmentPoint)
|
||||
public void SetAttachmentPoint(uint AttachmentPoint)
|
||||
{
|
||||
this.AttachmentPoint = AttachmentPoint;
|
||||
|
||||
|
@ -3291,8 +3281,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// save the attachment point.
|
||||
//if (AttachmentPoint != 0)
|
||||
//{
|
||||
m_shape.State = (byte)AttachmentPoint;
|
||||
|
||||
m_shape.State = (byte)AttachmentPoint;
|
||||
//}
|
||||
}
|
||||
|
||||
|
@ -3633,14 +3622,16 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
Text = text;
|
||||
|
||||
ParentGroup.HasGroupChanged = true;
|
||||
ScheduleFullUpdate();
|
||||
//ScheduleFullUpdate();
|
||||
ScheduleFullUpdate(SceneObjectPartProperties.Text);
|
||||
}
|
||||
|
||||
public void StopLookAt()
|
||||
{
|
||||
m_parentGroup.stopLookAt();
|
||||
|
||||
m_parentGroup.ScheduleGroupForTerseUpdate();
|
||||
//m_parentGroup.ScheduleGroupForTerseUpdate();
|
||||
m_parentGroup.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.None);//in stopLookAt(), PhysicsActor shall already take care of tainting which properties have been updated
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -3662,7 +3653,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
m_parentGroup.stopMoveToTarget();
|
||||
|
||||
m_parentGroup.ScheduleGroupForTerseUpdate();
|
||||
//m_parentGroup.ScheduleGroupForTerseUpdate();
|
||||
m_parentGroup.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.None); //in stopMoveToTarget(), PhysicsActor shall already take care of tainting which properties have been updated
|
||||
//m_parentGroup.ScheduleGroupForFullUpdate();
|
||||
}
|
||||
|
||||
|
@ -4210,8 +4202,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
ParentGroup.HasGroupChanged = true;
|
||||
ScheduleFullUpdate();
|
||||
|
||||
//ScheduleFullUpdate();
|
||||
ScheduleFullUpdate(SceneObjectPartProperties.Shape);
|
||||
}
|
||||
|
||||
public void UpdateGroupPosition(Vector3 pos)
|
||||
|
@ -4222,7 +4214,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
|
||||
GroupPosition = newPos;
|
||||
ScheduleTerseUpdate();
|
||||
//ScheduleTerseUpdate();
|
||||
ScheduleFullUpdate(SceneObjectPartProperties.GroupPosition);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4254,7 +4247,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
OffsetPosition = newPos;
|
||||
ScheduleTerseUpdate();
|
||||
//ScheduleTerseUpdate();
|
||||
ScheduleFullUpdate(SceneObjectPartProperties.OffsetPosition);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4543,7 +4537,8 @@ 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();
|
||||
//ScheduleFullUpdate();
|
||||
ScheduleFullUpdate(SceneObjectPartProperties.Flags);
|
||||
}
|
||||
|
||||
public void UpdateRotation(Quaternion rot)
|
||||
|
@ -4555,7 +4550,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
RotationOffset = rot;
|
||||
ParentGroup.HasGroupChanged = true;
|
||||
ScheduleTerseUpdate();
|
||||
//ScheduleTerseUpdate();
|
||||
ScheduleFullUpdate(SceneObjectPartProperties.RotationOffset);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4563,8 +4559,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// Update the shape of this part.
|
||||
/// </summary>
|
||||
/// <param name="shapeBlock"></param>
|
||||
//public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock)
|
||||
public virtual void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock)
|
||||
public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock)
|
||||
{
|
||||
m_shape.PathBegin = shapeBlock.PathBegin;
|
||||
m_shape.PathEnd = shapeBlock.PathEnd;
|
||||
|
@ -4601,7 +4596,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
ParentGroup.HasGroupChanged = true;
|
||||
TriggerScriptChangedEvent(Changed.SHAPE);
|
||||
ScheduleFullUpdate();
|
||||
//ScheduleFullUpdate();
|
||||
ScheduleFullUpdate(SceneObjectPartProperties.Shape);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -4639,8 +4635,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
/// Update the texture entry for this part.
|
||||
/// </summary>
|
||||
/// <param name="textureEntry"></param>
|
||||
//public void UpdateTextureEntry(byte[] textureEntry)
|
||||
public virtual void UpdateTextureEntry(byte[] textureEntry)
|
||||
public void UpdateTextureEntry(byte[] textureEntry)
|
||||
{
|
||||
m_shape.TextureEntry = textureEntry;
|
||||
TriggerScriptChangedEvent(Changed.TEXTURE);
|
||||
|
@ -4649,7 +4644,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//This is madness..
|
||||
//ParentGroup.ScheduleGroupForFullUpdate();
|
||||
//This is sparta
|
||||
ScheduleFullUpdate();
|
||||
//ScheduleFullUpdate();
|
||||
ScheduleFullUpdate(SceneObjectPartProperties.Shape);
|
||||
}
|
||||
|
||||
public void aggregateScriptEvents()
|
||||
|
@ -4717,7 +4713,8 @@ 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();
|
||||
//ScheduleFullUpdate();
|
||||
ScheduleFullUpdate(SceneObjectPartProperties.Flags);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4740,7 +4737,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents()", Name, LocalId);
|
||||
ScheduleFullUpdate();
|
||||
//ScheduleFullUpdate();
|
||||
ScheduleFullUpdate(SceneObjectPartProperties.Flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4944,44 +4942,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
set { m_lastUpdateTimeStamp = value; }
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Schedules this prim for a full update, without changing the timestamp or actorID (info on when and who modified any property).
|
||||
/// NOTE: this is the same as the original SceneObjectPart.ScheduleFullUpdate().
|
||||
/// </summary>
|
||||
public void ScheduleFullUpdate_SyncInfoUnchanged()
|
||||
{
|
||||
//m_log.DebugFormat("[SCENE OBJECT PART]: ScheduleFullUpdate_SyncInfoUnchanged 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;
|
||||
}
|
||||
else
|
||||
{
|
||||
TimeStampFull = (uint)timeNow;
|
||||
}
|
||||
|
||||
m_updateFlag = 2;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE OBJECT PART]: Scheduling full update for {0}, {1} at {2}",
|
||||
// UUID, Name, TimeStampFull);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
@ -5037,6 +4997,164 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
}
|
||||
|
||||
/*
|
||||
public enum SceneObjectPartProperties:ulong
|
||||
{
|
||||
//Following properties copied from SceneObjectSerializer(),
|
||||
AllowedDrop = (ulong) 1<<0,
|
||||
CreatorID = (ulong) 1<<1,
|
||||
CreatorData = (ulong) 1 <<2,
|
||||
FolderID = (ulong) 1 << 3,
|
||||
InventorySerial = (ulong) 1 << 4,
|
||||
TaskInventory = (ulong) 1 << 5,
|
||||
//UUID",
|
||||
//LocalId",
|
||||
Name = (ulong) 1 << 6,
|
||||
Material = (ulong) 1 <<7,
|
||||
PassTouches = (ulong) 1 << 8,
|
||||
RegionHandle = (ulong) 1 << 9,
|
||||
ScriptAccessPin = (ulong) 1 << 10,
|
||||
GroupPosition = (ulong) 1 << 11,
|
||||
OffsetPosition = (ulong) 1 << 12,
|
||||
RotationOffset = (ulong) 1 << 13,
|
||||
Velocity = (ulong) 1 << 14,
|
||||
AngularVelocity = (ulong) 1 << 15,
|
||||
//"Acceleration",
|
||||
SOP_Acceleration = (ulong) 1 << 16, //SOP and PA read/write their own local copies of acceleration, so we distinguish the copies
|
||||
Description = (ulong) 1 << 17,
|
||||
Color = (ulong) 1 << 18,
|
||||
Text = (ulong) 1 << 19,
|
||||
SitName = (ulong) 1 << 20,
|
||||
TouchName = (ulong) 1 << 21,
|
||||
LinkNum = (ulong) 1 << 22,
|
||||
ClickAction = (ulong) 1 << 23,
|
||||
Shape = (ulong) 1 << 24,
|
||||
Scale = (ulong) 1 << 25,
|
||||
UpdateFlag = (ulong) 1 << 26,
|
||||
SitTargetOrientation = (ulong) 1 << 27,
|
||||
SitTargetPosition = (ulong) 1 << 28,
|
||||
SitTargetPositionLL = (ulong) 1 << 29,
|
||||
SitTargetOrientationLL = (ulong) 1 << 30,
|
||||
ParentID = (ulong)1 << 31,
|
||||
CreationDate = (ulong) 1 << 32,
|
||||
Category = (ulong) 1 << 33,
|
||||
SalePrice = (ulong) 1 << 34,
|
||||
ObjectSaleType = (ulong) 1 << 35,
|
||||
OwnershipCost = (ulong) 1 << 36,
|
||||
GroupID = (ulong) 1 << 37,
|
||||
OwnerID = (ulong) 1 << 38,
|
||||
LastOwnerID = (ulong) 1 << 39,
|
||||
BaseMask = (ulong) 1 << 40,
|
||||
OwnerMask = (ulong) 1 << 41,
|
||||
GroupMask = (ulong) 1 << 42,
|
||||
EveryoneMask = (ulong) 1 << 43,
|
||||
NextOwnerMask = (ulong) 1 << 44,
|
||||
Flags = (ulong) 1 << 45,
|
||||
CollisionSound = (ulong) 1 << 46,
|
||||
CollisionSoundVolume = (ulong) 1 << 47,
|
||||
MediaUrl = (ulong) 1 << 48,
|
||||
TextureAnimation = (ulong) 1 << 49,
|
||||
ParticleSystem = (ulong) 1 << 50,
|
||||
//Property names below copied from PhysicsActor, they are necessary in synchronization, but not covered the above properties
|
||||
//Physics properties "Velocity" is covered above
|
||||
Position = (ulong) 1 << 51,
|
||||
Size = (ulong) 1 << 52,
|
||||
Force = (ulong) 1 << 53,
|
||||
RotationalVelocity = (ulong) 1 << 54,
|
||||
PA_Acceleration = (ulong) 1 << 55,
|
||||
Torque = (ulong) 1 << 56,
|
||||
Orientation = (ulong) 1 << 57,
|
||||
IsPhysical = (ulong) 1 << 58,
|
||||
Flying = (ulong) 1 << 59,
|
||||
Buoyancy = (ulong) 1 << 60,
|
||||
//To be handled
|
||||
AttachmentPoint = (ulong)1 << 61,
|
||||
FullUpdate = UInt64.MaxValue
|
||||
}
|
||||
*/
|
||||
|
||||
public enum SceneObjectPartProperties
|
||||
{
|
||||
None,
|
||||
//Following properties copied from SceneObjectSerializer(),
|
||||
AllowedDrop ,
|
||||
CreatorID ,
|
||||
CreatorData ,
|
||||
FolderID ,
|
||||
InventorySerial,
|
||||
TaskInventory,
|
||||
//UUID",
|
||||
//LocalId",
|
||||
Name,
|
||||
Material,
|
||||
PassTouches,
|
||||
RegionHandle,
|
||||
ScriptAccessPin,
|
||||
GroupPosition,
|
||||
OffsetPosition,
|
||||
RotationOffset,
|
||||
Velocity,
|
||||
AngularVelocity,
|
||||
//"Acceleration",
|
||||
SOP_Acceleration, //SOP and PA read/write their own local copies of acceleration, so we distinguish the copies
|
||||
Description,
|
||||
Color,
|
||||
Text,
|
||||
SitName,
|
||||
TouchName,
|
||||
LinkNum,
|
||||
ClickAction,
|
||||
Shape,
|
||||
Scale,
|
||||
UpdateFlag,
|
||||
SitTargetOrientation,
|
||||
SitTargetPosition,
|
||||
SitTargetPositionLL,
|
||||
SitTargetOrientationLL,
|
||||
ParentID,
|
||||
CreationDate,
|
||||
Category,
|
||||
SalePrice,
|
||||
ObjectSaleType,
|
||||
OwnershipCost,
|
||||
GroupID,
|
||||
OwnerID,
|
||||
LastOwnerID,
|
||||
BaseMask,
|
||||
OwnerMask,
|
||||
GroupMask,
|
||||
EveryoneMask,
|
||||
NextOwnerMask,
|
||||
Flags,
|
||||
CollisionSound,
|
||||
CollisionSoundVolume,
|
||||
MediaUrl,
|
||||
TextureAnimation,
|
||||
ParticleSystem,
|
||||
//Property names below copied from PhysicsActor, they are necessary in synchronization, but not covered the above properties
|
||||
//Physics properties "Velocity" is covered above
|
||||
Position,
|
||||
Size,
|
||||
Force,
|
||||
RotationalVelocity,
|
||||
PA_Acceleration,
|
||||
Torque,
|
||||
Orientation,
|
||||
IsPhysical,
|
||||
Flying,
|
||||
Buoyancy,
|
||||
//To be handled in serialization/deserizaltion for synchronization
|
||||
IsSelected,
|
||||
AttachmentPoint,
|
||||
AttachedPos,
|
||||
Sound, //This indicates any Sound related property has changed: Sound, SoundGain, SoundFlags,SoundRadius,
|
||||
//Addition properties to be added here
|
||||
|
||||
//Client Manager may want to add some property here that viewers care about and should be synchronized across actors
|
||||
|
||||
FullUpdate,
|
||||
}
|
||||
|
||||
|
||||
public class SceneObjectPart : SceneObjectPartBase
|
||||
{
|
||||
|
@ -5064,10 +5182,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//TODO: serialization and deserialization processors to be added in SceneObjectSerializer
|
||||
|
||||
//The following variables are initialized when RegionSyncModule reads the config file for mapping of properties and buckets
|
||||
private static Dictionary<string, string> m_primPropertyBucketMap = null;
|
||||
private static Dictionary<SceneObjectPartProperties, string> m_primPropertyBucketMap = null;
|
||||
private static List<string> m_propertyBucketNames = null;
|
||||
//private static List<Object> m_bucketUpdateLocks = null;
|
||||
private static Dictionary<string, Object> m_bucketUpdateLocks = new Dictionary<string, object>();
|
||||
|
||||
private static string m_localActorID = "";
|
||||
//private static int m_bucketCount = 0;
|
||||
|
@ -5076,6 +5192,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
//private static Dictionary<string, BucketUpdateProcessor> m_bucketUpdateProcessors = new Dictionary<string, BucketUpdateProcessor>();
|
||||
private Dictionary<string, BucketUpdateProcessor> m_bucketUpdateProcessors = new Dictionary<string, BucketUpdateProcessor>();
|
||||
private Dictionary<string, Object> m_bucketUpdateLocks = new Dictionary<string, object>();
|
||||
private Dictionary<string, bool> m_bucketSyncTainted = new Dictionary<string, bool>();
|
||||
|
||||
//Define this as a guard to not to fill in any sync info when not desired, i.e. while de-serializing and building SOP and SOG, where
|
||||
//property set functions will be called and might trigger UpdateBucketSyncInfo() if not guarded carefully.
|
||||
|
@ -5084,6 +5202,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//The list of each prim's properties. This is the list of properties that matter in synchronizing prim copies on different actors.
|
||||
//This list is created based on properties included in the serialization/deserialization process (see SceneObjectSerializer()) and the
|
||||
//properties Physics Engine needs to synchronize to other actors.
|
||||
/*
|
||||
public static List<string> PropertyList = new List<string>()
|
||||
{
|
||||
//Following properties copied from SceneObjectSerializer()
|
||||
|
@ -5154,9 +5273,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
"Flying",
|
||||
"Buoyancy",
|
||||
};
|
||||
|
||||
* */
|
||||
|
||||
public static void InitializePropertyBucketInfo(Dictionary<string, string> propertyBucketMap, List<string> bucketNames, string actorID)
|
||||
|
||||
public static void InitializePropertyBucketInfo(Dictionary<SceneObjectPartProperties, string> propertyBucketMap, List<string> bucketNames, string actorID)
|
||||
{
|
||||
m_primPropertyBucketMap = propertyBucketMap;
|
||||
m_propertyBucketNames = bucketNames;
|
||||
|
@ -5202,51 +5322,18 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update the properties of this SOP with the values in updatedPart.
|
||||
/// </summary>
|
||||
/// <param name="updatedPart"></param>
|
||||
/// <param name="bucketName"></param>
|
||||
|
||||
private void GeneralBucketUpdateProcessor(SceneObjectPart updatedPart, string bucketName)
|
||||
{
|
||||
//NOTE!!!!!!!! Need to cast the local copy to SceneObjectPartBase in order not to trigger UpdateBucketSyncInfo(),
|
||||
//since the property updates inside this function are not due to local operations.
|
||||
SceneObjectPartBase localPart = (SceneObjectPartBase)this;
|
||||
|
||||
lock (m_bucketUpdateLocks[bucketName])
|
||||
{
|
||||
localPart.AllowedDrop = updatedPart.AllowedDrop;
|
||||
|
||||
localPart.Shape = updatedPart.Shape;
|
||||
|
||||
bool collisionSoundUpdated = UpdateCollisionSound(updatedPart.CollisionSound);
|
||||
|
||||
|
||||
m_bucketSyncInfoList[bucketName].LastUpdateTimeStamp = updatedPart.BucketSyncInfoList[bucketName].LastUpdateTimeStamp;
|
||||
m_bucketSyncInfoList[bucketName].LastUpdateActorID = updatedPart.BucketSyncInfoList[bucketName].LastUpdateActorID;
|
||||
|
||||
if (collisionSoundUpdated)
|
||||
{
|
||||
//If the local actor is Script Engine, it will catch this evnet and trigger aggregateScriptEvents()
|
||||
m_parentGroup.Scene.EventManager.TriggerAggregateScriptEvents(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void PhysicsBucketUpdateProcessor(SceneObjectPart updatedPart, string bucketName)
|
||||
{
|
||||
//NOTE!!!!!!!! Need to cast the local copy to SceneObjectPartBase in order not to trigger UpdateBucketSyncInfo(),
|
||||
//since the property updates inside this function are not due to local operations.
|
||||
SceneObjectPartBase localPart = (SceneObjectPartBase)this;
|
||||
|
||||
lock (m_bucketUpdateLocks[bucketName])
|
||||
{
|
||||
localPart.GroupPosition = updatedPart.GroupPosition;
|
||||
|
||||
m_bucketSyncInfoList[bucketName].LastUpdateTimeStamp = updatedPart.BucketSyncInfoList[bucketName].LastUpdateTimeStamp;
|
||||
m_bucketSyncInfoList[bucketName].LastUpdateActorID = updatedPart.BucketSyncInfoList[bucketName].LastUpdateActorID;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5279,6 +5366,10 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
m_bucketUpdateLocks.Add(bucketName, new Object());
|
||||
}
|
||||
if (!m_bucketSyncTainted.ContainsKey(bucketName))
|
||||
{
|
||||
m_bucketSyncTainted.Add(bucketName, false);
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_BucketUpdateProcessorRegistered)
|
||||
|
@ -5290,16 +5381,59 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_syncEnabled = true;
|
||||
}
|
||||
|
||||
//For tainitng and clearing taints, do i need to lock on m_bucketSyncTaint?
|
||||
public void TaintBucketSyncInfo(SceneObjectPartProperties property)
|
||||
{
|
||||
if (m_syncEnabled && m_bucketSyncTainted.Count > 0)
|
||||
{
|
||||
string bucketName = m_primPropertyBucketMap[property];
|
||||
m_bucketSyncTainted[bucketName] = true;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
public void ClearBucketTaint()
|
||||
{
|
||||
if (m_syncEnabled && m_bucketSyncTainted.Count > 0)
|
||||
{
|
||||
foreach (KeyValuePair<string, bool> pair in m_bucketSyncTainted)
|
||||
{
|
||||
pair.Value = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
* */
|
||||
|
||||
/// <summary>
|
||||
/// Update the timestamp information of each property bucket, and clear out the taint on each bucket.
|
||||
/// </summary>
|
||||
public void UpdateTaintedBucketSyncInfo()
|
||||
{
|
||||
if (m_syncEnabled)
|
||||
{
|
||||
long timeStamp = DateTime.Now.Ticks;
|
||||
foreach (KeyValuePair<string, BucketSyncInfo> pair in m_bucketSyncInfoList)
|
||||
{
|
||||
string bucketName = pair.Key;
|
||||
if (m_bucketSyncTainted[bucketName])
|
||||
{
|
||||
m_bucketSyncInfoList[bucketName].UpdateSyncInfo(timeStamp, m_localActorID);
|
||||
m_bucketSyncTainted[bucketName] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update the timestamp and actorID information of the bucket the given property belongs to.
|
||||
/// </summary>
|
||||
/// <param name="propertyName">Name of the property. Make sure the spelling is consistent with what are defined in PropertyList</param>
|
||||
public void UpdateBucketSyncInfo(string propertyName)
|
||||
public void UpdateBucketSyncInfo(SceneObjectPartProperties property)
|
||||
{
|
||||
if (m_syncEnabled && m_bucketSyncInfoList != null && m_bucketSyncInfoList.Count > 0)
|
||||
{
|
||||
//int bucketIndex = m_primPropertyBucketMap[propertyName];
|
||||
string bucketName = m_primPropertyBucketMap[propertyName];
|
||||
string bucketName = m_primPropertyBucketMap[property];
|
||||
long timeStamp = DateTime.Now.Ticks;
|
||||
if (m_bucketSyncInfoList.ContainsKey(bucketName))
|
||||
{
|
||||
|
@ -5312,7 +5446,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public Scene.ObjectUpdateResult UpdateAllProperties(SceneObjectPart updatedPart)
|
||||
{
|
||||
|
@ -5371,95 +5505,53 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
}
|
||||
|
||||
#region new property access functions
|
||||
//(only properties relevant for synchronization purpose are implemented here)
|
||||
|
||||
new public bool AllowedDrop
|
||||
public override void ScheduleFullUpdate(SceneObjectPartProperties property)
|
||||
{
|
||||
get { return base.AllowedDrop; }
|
||||
set
|
||||
{
|
||||
base.AllowedDrop = value;
|
||||
UpdateBucketSyncInfo("AllowedDrop");
|
||||
}
|
||||
base.ScheduleFullUpdate(property);
|
||||
TaintBucketSyncInfo(property);
|
||||
}
|
||||
|
||||
public override void ScheduleTerseUpdate(SceneObjectPartProperties property)
|
||||
{
|
||||
base.ScheduleTerseUpdate(property);
|
||||
TaintBucketSyncInfo(property);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The position of the entire group that this prim belongs to.
|
||||
/// Schedules this prim for a full update, without changing the timestamp or actorID (info on when and who modified any property).
|
||||
/// NOTE: this is the same as the original SceneObjectPart.ScheduleFullUpdate().
|
||||
/// </summary>
|
||||
new public Vector3 GroupPosition
|
||||
public void ScheduleFullUpdate_SyncInfoUnchanged()
|
||||
{
|
||||
get { return base.GroupPosition; }
|
||||
set
|
||||
//m_log.DebugFormat("[SCENE OBJECT PART]: ScheduleFullUpdate_SyncInfoUnchanged for {0} {1}", Name, LocalId);
|
||||
|
||||
if (m_parentGroup != null)
|
||||
{
|
||||
base.GroupPosition = value;
|
||||
UpdateBucketSyncInfo("GroupPosition");
|
||||
m_parentGroup.QueueForUpdateCheck();
|
||||
}
|
||||
}
|
||||
|
||||
new public Vector3 OffsetPosition
|
||||
{
|
||||
get { return base.OffsetPosition; }
|
||||
set
|
||||
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)
|
||||
{
|
||||
base.OffsetPosition = value;
|
||||
UpdateBucketSyncInfo("OffsetPosition");
|
||||
TimeStampFull += 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
new public PrimitiveBaseShape Shape
|
||||
{
|
||||
get { return base.Shape; }
|
||||
set
|
||||
else
|
||||
{
|
||||
base.Shape = value;
|
||||
UpdateBucketSyncInfo("Shape");
|
||||
TimeStampFull = (uint)timeNow;
|
||||
}
|
||||
|
||||
m_updateFlag = 2;
|
||||
|
||||
// m_log.DebugFormat(
|
||||
// "[SCENE OBJECT PART]: Scheduling full update for {0}, {1} at {2}",
|
||||
// UUID, Name, TimeStampFull);
|
||||
|
||||
}
|
||||
|
||||
//For functions that update SOP properties, override them so that when they are called from SOPBase (but the object itself is an instance of SOP)
|
||||
//the following implementations will be called instead of the same name functions in SOPBase.
|
||||
public override void SculptTextureCallback(UUID textureID, AssetBase texture)
|
||||
{
|
||||
base.SculptTextureCallback(textureID, texture);
|
||||
UpdateBucketSyncInfo("Shape");
|
||||
}
|
||||
|
||||
public override void SetAttachmentPoint(uint AttachmentPoint)
|
||||
{
|
||||
base.SetAttachmentPoint(AttachmentPoint);
|
||||
UpdateBucketSyncInfo("Shape");
|
||||
}
|
||||
|
||||
public void UpdateExtraParam(ushort type, bool inUse, byte[] data)
|
||||
{
|
||||
base.UpdateExtraParam(type, inUse, data);
|
||||
UpdateBucketSyncInfo("Shape");
|
||||
}
|
||||
|
||||
public override void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock)
|
||||
{
|
||||
base.UpdateShape(shapeBlock);
|
||||
UpdateBucketSyncInfo("Shape");
|
||||
}
|
||||
|
||||
public override void UpdateTextureEntry(byte[] textureEntry)
|
||||
{
|
||||
base.UpdateTextureEntry(textureEntry);
|
||||
UpdateBucketSyncInfo("Shape");
|
||||
}
|
||||
|
||||
public override void Resize(Vector3 scale)
|
||||
{
|
||||
base.Resize(scale);
|
||||
UpdateBucketSyncInfo("Scale");
|
||||
}
|
||||
|
||||
#endregion //new property access functions
|
||||
|
||||
|
||||
private bool UpdateCollisionSound(UUID updatedCollisionSound)
|
||||
{
|
||||
if (this.CollisionSound != updatedCollisionSound)
|
||||
|
@ -5469,7 +5561,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//end of SYMMETRIC SYNC
|
||||
|
|
|
@ -294,7 +294,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.ScheduleFullUpdate(SceneObjectPartProperties.Flags | SceneObjectPartProperties.TaskInventory);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -322,7 +322,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.ScheduleFullUpdate(SceneObjectPartProperties.Flags | SceneObjectPartProperties.TaskInventory);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -546,7 +546,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_part.ParentGroup.HasGroupChanged = true;
|
||||
|
||||
//SYMMETRIC SYNC: add ScheduleFullUpdate to enable synchronization across actors
|
||||
m_part.ScheduleFullUpdate();
|
||||
m_part.ScheduleFullUpdate(SceneObjectPartProperties.TaskInventory | SceneObjectPartProperties.InventorySerial);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -766,7 +766,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (!ContainsScripts())
|
||||
m_part.RemFlag(PrimFlags.Scripted);
|
||||
|
||||
m_part.ScheduleFullUpdate();
|
||||
m_part.ScheduleFullUpdate(SceneObjectPartProperties.TaskInventory);
|
||||
|
||||
return type;
|
||||
|
||||
|
|
|
@ -91,7 +91,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
part.RotationOffset = Rotation;
|
||||
if (Scale != Vector3.Zero)
|
||||
part.Resize(Scale);
|
||||
part.ParentGroup.ScheduleGroupForTerseUpdate();
|
||||
//part.ParentGroup.ScheduleGroupForTerseUpdate();
|
||||
part.ParentGroup.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.Scale);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -99,7 +100,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
part.OffsetPosition = Position;
|
||||
part.UpdateRotation(Rotation);
|
||||
if (Scale != Vector3.Zero)
|
||||
part.Resize(Scale); part.ScheduleTerseUpdate();
|
||||
part.Resize(Scale); //part.ScheduleTerseUpdate();
|
||||
part.ScheduleTerseUpdate(SceneObjectPartProperties.Scale);
|
||||
}
|
||||
part.Undoing = false;
|
||||
|
||||
|
@ -119,7 +121,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
part.UpdateRotation(Rotation);
|
||||
if (Scale != Vector3.Zero)
|
||||
part.Resize(Scale);
|
||||
part.ParentGroup.ScheduleGroupForTerseUpdate();
|
||||
//part.ParentGroup.ScheduleGroupForTerseUpdate();
|
||||
part.ParentGroup.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.Scale);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -129,7 +132,9 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
part.UpdateRotation(Rotation);
|
||||
if (Scale != Vector3.Zero)
|
||||
part.Resize(Scale);
|
||||
part.ScheduleTerseUpdate();
|
||||
//part.ScheduleTerseUpdate();
|
||||
part.ScheduleTerseUpdate(SceneObjectPartProperties.Scale);
|
||||
|
||||
}
|
||||
part.Undoing = false;
|
||||
|
||||
|
|
|
@ -290,7 +290,8 @@ 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).ScheduleGroupForFullUpdate();
|
||||
((SceneObjectGroup)ent).ScheduleGroupForFullUpdate(SceneObjectPartProperties.FullUpdate); //don't know what properties to taint, so just taint all
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
|
|
|
@ -640,7 +640,8 @@ namespace OpenSim.Region.OptionalModules.World.TreePopulator
|
|||
{
|
||||
s_tree.Scale += copse.m_rate;
|
||||
s_tree.ParentGroup.HasGroupChanged = true;
|
||||
s_tree.ScheduleFullUpdate();
|
||||
//s_tree.ScheduleFullUpdate();
|
||||
s_tree.ScheduleFullUpdate(SceneObjectPartProperties.Scale);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -1411,7 +1411,8 @@ 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.ScheduleFullUpdate();
|
||||
m_host.ScheduleFullUpdate(SceneObjectPartProperties.ClickAction);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1679,7 +1680,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
}
|
||||
|
||||
part.ParentGroup.HasGroupChanged = true;
|
||||
part.ScheduleFullUpdate();
|
||||
//part.ScheduleFullUpdate();
|
||||
part.ScheduleFullUpdate(SceneObjectPartProperties.Shape);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -1714,7 +1716,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
}
|
||||
|
||||
part.ParentGroup.HasGroupChanged = true;
|
||||
part.ScheduleFullUpdate();
|
||||
//part.ScheduleFullUpdate();
|
||||
part.ScheduleFullUpdate(SceneObjectPartProperties.Shape);
|
||||
}
|
||||
|
||||
public LSL_Vector llGetColor(int face)
|
||||
|
@ -1982,40 +1985,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
targetPos.z = ground;
|
||||
SceneObjectGroup parent = part.ParentGroup;
|
||||
LSL_Vector real_vec = SetPosAdjust(currentPos, targetPos);
|
||||
//KittyL: edited below
|
||||
if ((World.ScriptEngineToSceneConnectorModule == null))
|
||||
{
|
||||
parent.UpdateGroupPosition(new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z));
|
||||
}
|
||||
else
|
||||
{
|
||||
object[] valParams = new object[1];
|
||||
Vector3 pos = new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z);
|
||||
valParams[0] = (Vector3)pos;
|
||||
World.ScriptEngineToSceneConnectorModule.SendSetPrimProperties(m_host.ParentGroup.LocX, m_host.ParentGroup.LocY, m_host.UUID, "pos", (object)valParams);
|
||||
}
|
||||
parent.UpdateGroupPosition(new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z));
|
||||
}
|
||||
else
|
||||
{
|
||||
LSL_Vector rel_vec = SetPosAdjust(currentPos, targetPos);
|
||||
|
||||
//KittyL: edited below
|
||||
if ((World.ScriptEngineToSceneConnectorModule == null))
|
||||
{
|
||||
part.OffsetPosition = new Vector3((float)rel_vec.x, (float)rel_vec.y, (float)rel_vec.z);
|
||||
SceneObjectGroup parent = part.ParentGroup;
|
||||
parent.HasGroupChanged = true;
|
||||
parent.ScheduleGroupForTerseUpdate();
|
||||
}
|
||||
else
|
||||
{
|
||||
object[] valParams = new object[3];
|
||||
valParams[0] = (object)rel_vec.x;
|
||||
valParams[1] = (object)rel_vec.y;
|
||||
valParams[2] = (object)rel_vec.z;
|
||||
World.ScriptEngineToSceneConnectorModule.SendSetPrimProperties(m_host.ParentGroup.LocX, m_host.ParentGroup.LocY, m_host.UUID, "pos", (object)valParams);
|
||||
}
|
||||
|
||||
part.OffsetPosition = new Vector3((float)rel_vec.x, (float)rel_vec.y, (float)rel_vec.z);
|
||||
SceneObjectGroup parent = part.ParentGroup;
|
||||
parent.HasGroupChanged = true;
|
||||
//parent.ScheduleGroupForTerseUpdate();
|
||||
parent.ScheduleGroupForTerseUpdate(SceneObjectPartProperties.OffsetPosition);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2361,7 +2340,8 @@ 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.ScheduleFullUpdate();
|
||||
m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound);
|
||||
m_host.SendFullUpdateToAllClients();
|
||||
}
|
||||
|
||||
|
@ -2381,7 +2361,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
prim.SoundFlags = 1; // looping
|
||||
prim.SoundRadius = 20; // Magic number, 20 seems reasonable. Make configurable?
|
||||
|
||||
prim.ScheduleFullUpdate();
|
||||
//prim.ScheduleFullUpdate();
|
||||
m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound);
|
||||
prim.SendFullUpdateToAllClients();
|
||||
}
|
||||
}
|
||||
|
@ -2393,7 +2374,8 @@ 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.ScheduleFullUpdate();
|
||||
m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound);
|
||||
m_host.SendFullUpdateToAllClients();
|
||||
}
|
||||
|
||||
|
@ -2435,7 +2417,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
part.SoundGain = 0;
|
||||
part.SoundFlags = 0;
|
||||
part.SoundRadius = 0;
|
||||
part.ScheduleFullUpdate();
|
||||
//part.ScheduleFullUpdate();
|
||||
m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound);
|
||||
part.SendFullUpdateToAllClients();
|
||||
}
|
||||
m_host.ParentGroup.LoopSoundMasterPrim = null;
|
||||
|
@ -2447,7 +2430,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
m_host.SoundGain = 0;
|
||||
m_host.SoundFlags = 0;
|
||||
m_host.SoundRadius = 0;
|
||||
m_host.ScheduleFullUpdate();
|
||||
//m_host.ScheduleFullUpdate();
|
||||
m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound);
|
||||
m_host.SendFullUpdateToAllClients();
|
||||
}
|
||||
}
|
||||
|
@ -2457,7 +2441,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
m_host.SoundGain = 0;
|
||||
m_host.SoundFlags = 0;
|
||||
m_host.SoundRadius = 0;
|
||||
m_host.ScheduleFullUpdate();
|
||||
//m_host.ScheduleFullUpdate();
|
||||
m_host.ScheduleFullUpdate(SceneObjectPartProperties.Sound);
|
||||
m_host.SendFullUpdateToAllClients();
|
||||
}
|
||||
}
|
||||
|
@ -3384,7 +3369,8 @@ 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.ScheduleTerseUpdate();
|
||||
m_host.ScheduleFullUpdate(SceneObjectPartProperties.AngularVelocity);
|
||||
m_host.SendTerseUpdateToAllClients();
|
||||
m_host.ParentGroup.HasGroupChanged = true;
|
||||
}
|
||||
|
@ -3664,7 +3650,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
|
||||
parentPrim.RootPart.CreateSelected = true;
|
||||
parentPrim.HasGroupChanged = true;
|
||||
parentPrim.ScheduleGroupForFullUpdate();
|
||||
//parentPrim.ScheduleGroupForFullUpdate();
|
||||
//SYMMETRIC SYNC
|
||||
//Schedule a LinkObject message for synchronization purpose. This will lead to enqueue a LinkObject message in SyncConnector's outgoingQueue,
|
||||
//so should return quickly.
|
||||
if (World.RegionSyncModule != null)
|
||||
{
|
||||
//Tell other actors to link the SceneObjectParts together as a new group.
|
||||
//parentGroup.SyncInfoUpdate();
|
||||
World.RegionSyncModule.SendLinkObject(parentPrim, parentPrim.RootPart, new List<SceneObjectPart>(childPrim.Parts));
|
||||
}
|
||||
m_host.ScheduleFullUpdate(SceneObjectPartProperties.None); //SendLinkObject above will synchronize the link operation, no need to taint updates here
|
||||
//end of SYMMETRIC SYNC
|
||||
|
||||
if (client != null)
|
||||
parentPrim.GetProperties(client);
|
||||
|
@ -3722,15 +3719,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
if (linknum == ScriptBaseClass.LINK_ROOT)
|
||||
{
|
||||
//SYMMETRIC SYNC
|
||||
List<SceneObjectGroup> beforeDelinkGroups = new List<SceneObjectGroup>();
|
||||
beforeDelinkGroups.Add(parentPrim);
|
||||
List<SceneObjectGroup> afterDelinkGroups = new List<SceneObjectGroup>();
|
||||
//end of SYMMETRIC SYNC
|
||||
|
||||
// Restructuring Multiple Prims.
|
||||
List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Parts);
|
||||
parts.Remove(parentPrim.RootPart);
|
||||
foreach (SceneObjectPart part in parts)
|
||||
{
|
||||
parentPrim.DelinkFromGroup(part.LocalId, true);
|
||||
//SYMMETRIC SYNC
|
||||
afterDelinkGroups.Add(part.ParentGroup);
|
||||
}
|
||||
parentPrim.HasGroupChanged = true;
|
||||
parentPrim.ScheduleGroupForFullUpdate();
|
||||
//parentPrim.ScheduleGroupForFullUpdate();
|
||||
//SYMMETRIC SYNC
|
||||
//Send out DelinkObject message to other actors to sychronize their object list
|
||||
if (World.RegionSyncModule != null)
|
||||
{
|
||||
World.RegionSyncModule.SendDeLinkObject(parts, beforeDelinkGroups, afterDelinkGroups);
|
||||
}
|
||||
parentPrim.ScheduleGroupForFullUpdate(SceneObjectPartProperties.None);
|
||||
//end of SYMMETRIC SYNC
|
||||
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
|
||||
|
||||
if (parts.Count > 0)
|
||||
|
@ -3743,7 +3756,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
newRoot.ParentGroup.LinkToGroup(part.ParentGroup);
|
||||
}
|
||||
newRoot.ParentGroup.HasGroupChanged = true;
|
||||
newRoot.ParentGroup.ScheduleGroupForFullUpdate();
|
||||
//newRoot.ParentGroup.ScheduleGroupForFullUpdate();
|
||||
//SYMMETRIC SYNC
|
||||
if (World.RegionSyncModule != null)
|
||||
{
|
||||
World.RegionSyncModule.SendLinkObject(newRoot.ParentGroup, newRoot, new List<SceneObjectPart>(newRoot.ParentGroup.Parts));
|
||||
}
|
||||
newRoot.ParentGroup.ScheduleGroupForFullUpdate(SceneObjectPartProperties.None);
|
||||
//end of SYMMETRIC SYNC
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -3753,7 +3774,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
parentPrim.DelinkFromGroup(childPrim.LocalId, true);
|
||||
parentPrim.HasGroupChanged = true;
|
||||
parentPrim.ScheduleGroupForFullUpdate();
|
||||
//parentPrim.ScheduleGroupForFullUpdate();
|
||||
//SYMMETRIC SYNC
|
||||
//Send out DelinkObject message to other actors to sychronize their object list
|
||||
if (World.RegionSyncModule != null)
|
||||
{
|
||||
List<SceneObjectGroup> beforeDelinkGroups = new List<SceneObjectGroup>();
|
||||
beforeDelinkGroups.Add(parentPrim);
|
||||
List<SceneObjectGroup> afterDelinkGroups = new List<SceneObjectGroup>();
|
||||
afterDelinkGroups.Add(childPrim.ParentGroup);
|
||||
World.RegionSyncModule.SendDeLinkObject(new List<SceneObjectPart>(parentPrim.Parts), beforeDelinkGroups, afterDelinkGroups);
|
||||
}
|
||||
//end of SYMMETRIC SYNC
|
||||
|
||||
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
|
||||
}
|
||||
}
|
||||
|
@ -3765,6 +3798,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
if (parentPrim.RootPart.AttachmentPoint != 0)
|
||||
return; // Fail silently if attached
|
||||
|
||||
//SYMMETRIC SYNC
|
||||
List<SceneObjectGroup> beforeDelinkGroups = new List<SceneObjectGroup>();
|
||||
beforeDelinkGroups.Add(parentPrim);
|
||||
List<SceneObjectGroup> afterDelinkGroups = new List<SceneObjectGroup>();
|
||||
SceneObjectPart rootPart = parentPrim.RootPart;
|
||||
//end of SYMMETRIC SYNC
|
||||
|
||||
List<SceneObjectPart> parts = new List<SceneObjectPart>(parentPrim.Parts);
|
||||
parts.Remove(parentPrim.RootPart);
|
||||
|
||||
|
@ -3772,9 +3812,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
{
|
||||
parentPrim.DelinkFromGroup(part.LocalId, true);
|
||||
parentPrim.TriggerScriptChangedEvent(Changed.LINK);
|
||||
//SYMMETRIC SYNC
|
||||
afterDelinkGroups.Add(part.ParentGroup);
|
||||
}
|
||||
parentPrim.HasGroupChanged = true;
|
||||
parentPrim.ScheduleGroupForFullUpdate();
|
||||
//parentPrim.ScheduleGroupForFullUpdate();
|
||||
//SYMMETRIC SYNC
|
||||
if (World.RegionSyncModule != null)
|
||||
{
|
||||
parts.Add(rootPart);
|
||||
afterDelinkGroups.Add(rootPart.ParentGroup);
|
||||
World.RegionSyncModule.SendDeLinkObject(parts, beforeDelinkGroups, afterDelinkGroups);
|
||||
}
|
||||
parentPrim.ScheduleGroupForFullUpdate(SceneObjectPartProperties.None);
|
||||
//end of SYMMETRIC SYNC
|
||||
}
|
||||
|
||||
public LSL_String llGetLinkKey(int linknum)
|
||||
|
@ -4012,7 +4063,8 @@ 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.ScheduleGroupForFullUpdate();
|
||||
m_host.ParentGroup.ScheduleGroupForFullUpdate(SceneObjectPartProperties.Text);
|
||||
}
|
||||
|
||||
public LSL_Float llWater(LSL_Vector offset)
|
||||
|
|
|
@ -2349,7 +2349,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
|
||||
obj.ParentGroup.HasGroupChanged = true;
|
||||
obj.ScheduleFullUpdate();
|
||||
//obj.ScheduleFullUpdate();
|
||||
obj.ScheduleFullUpdate(SceneObjectPartProperties.Shape);
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue