Added ProcessAndEnqueuePrimUpdateByLocal and SyncOutPrimUpdates to
RegionSyncModule, and PrimSyncInfo.PropertyToOSD.dsg
parent
a06ddb9e88
commit
a06dad37fd
|
@ -654,7 +654,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
// Memeber variables for per-property timestamp
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
private Object m_primPropertyUpdateLock = new Object();
|
||||
private Dictionary<UUID, HashSet<SceneObjectPartProperties>> m_primPropertyUpdates = new Dictionary<UUID, HashSet<SceneObjectPartProperties>>();
|
||||
private int m_sendingPrimPropertyUpdates = 0;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
// Legacy members for bucket-based sync,
|
||||
|
@ -3018,18 +3020,104 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
}
|
||||
#endregion //Remote Event handlers
|
||||
|
||||
#region Per Property SyncInfo management
|
||||
#region Prim Property Sync management
|
||||
|
||||
private PrimSyncInfoManager m_primSyncInfoManager;
|
||||
public void RecordPrimUpdatesByLocal(SceneObjectPart part, List<SceneObjectPartProperties> updatedProperties)
|
||||
//private
|
||||
/// <summary>
|
||||
/// Triggered when some properties in an SOP have been updated.
|
||||
/// Sync the properties' values in this sync module with those in
|
||||
/// SOP, and update timestamp accordingly.
|
||||
/// </summary>
|
||||
/// <param name="part"></param>
|
||||
/// <param name="updatedProperties"></param>
|
||||
public void ProcessAndEnqueuePrimUpdatesByLocal(SceneObjectPart part, List<SceneObjectPartProperties> updatedProperties)
|
||||
{
|
||||
List<SceneObjectPartProperties> propertiesWithSyncInfoUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoByLocal(part, updatedProperties);
|
||||
OSDMap propertiesToSync = m_primSyncInfoManager.EncodePrimProperties(part, propertiesWithSyncInfoUpdated);
|
||||
//Sync values with SOP's data and update timestamp according, to
|
||||
//obtain the list of properties that really have been updated
|
||||
//and should be propogated to other sync nodes.
|
||||
HashSet<SceneObjectPartProperties> propertiesWithSyncInfoUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoByLocal(part, updatedProperties);
|
||||
|
||||
//TODO: Send out sync message with propertiesToSync
|
||||
//Enqueue the prim with the set of updated properties
|
||||
if (propertiesWithSyncInfoUpdated.Count > 0)
|
||||
{
|
||||
lock (m_primPropertyUpdateLock)
|
||||
{
|
||||
if (m_primPropertyUpdates.ContainsKey(part.UUID))
|
||||
{
|
||||
foreach (SceneObjectPartProperties property in propertiesWithSyncInfoUpdated)
|
||||
{
|
||||
//Include the "property" into the list of updated properties.
|
||||
//HashSet's Add function should handle it correctly whether the property
|
||||
//is or is not in the set.
|
||||
m_primPropertyUpdates[part.UUID].Add(property);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_primPropertyUpdates[part.UUID] = propertiesWithSyncInfoUpdated;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion //Per Property SyncInfo management
|
||||
/// <summary>
|
||||
/// Triggered periodically to send out sync messages that include
|
||||
/// prim-properties that have been updated since last SyncOut.
|
||||
/// </summary>
|
||||
public void SyncOutPrimUpdates()
|
||||
{
|
||||
if (!IsSyncingWithOtherSyncNodes())
|
||||
{
|
||||
//no SyncConnector connected. clear update queues and return.
|
||||
m_primPropertyUpdates.Clear();
|
||||
return;
|
||||
}
|
||||
|
||||
//If no prim has been updated since last SyncOut, simply return.
|
||||
if (m_primPropertyUpdates.Count == 0)
|
||||
return;
|
||||
|
||||
// Existing value of 1 indicates that updates are currently being sent so skip updates this pass
|
||||
if (Interlocked.Exchange(ref m_sendingPrimPropertyUpdates, 1) == 1)
|
||||
{
|
||||
m_log.DebugFormat("{0} SyncOutPrimUpdates(): An update thread is already running.", LogHeader);
|
||||
return;
|
||||
}
|
||||
|
||||
//copy the updated prim property list, and clear m_primPropertyUpdates immediately for future use
|
||||
Dictionary<UUID, HashSet<SceneObjectPartProperties>> primPropertyUpdates = new Dictionary<UUID, HashSet<SceneObjectPartProperties>>();
|
||||
lock (m_primPropertyUpdateLock)
|
||||
{
|
||||
foreach (KeyValuePair<UUID, HashSet<SceneObjectPartProperties>> updatedPrimProperties in m_primPropertyUpdates)
|
||||
{
|
||||
UUID primUUID = updatedPrimProperties.Key;
|
||||
SceneObjectPart prim = m_scene.GetSceneObjectPart(primUUID);
|
||||
//Skip if the prim is on longer in the local Scene Graph
|
||||
if (prim == null)
|
||||
{
|
||||
m_log.WarnFormat("{0}: in SyncOutPrimUpdates, prim {1} no longer in local SceneGraph", LogHeader, primUUID);
|
||||
continue;
|
||||
}
|
||||
//Skip if the object group is being deleted
|
||||
if (prim.ParentGroup.IsDeleted)
|
||||
continue;
|
||||
|
||||
primPropertyUpdates.Add(primUUID, updatedPrimProperties.Value);
|
||||
}
|
||||
m_primPropertyUpdates.Clear();
|
||||
}
|
||||
|
||||
//Enqueue sync message for sending out
|
||||
if (primPropertyUpdates.Count > 0)
|
||||
{
|
||||
//OSDMap propertiesToSync = m_primSyncInfoManager.EncodePrimProperties(part, propertiesWithSyncInfoUpdated);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endregion //Prim Property Sync management
|
||||
|
||||
|
||||
#region ISyncStatistics
|
||||
|
@ -3359,9 +3447,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
/// <param name="updatedProperties"></param>
|
||||
/// <param name="lastUpdateTS"></param>
|
||||
/// <param name="syncID"></param>
|
||||
public List<SceneObjectPartProperties> UpdatePropertiesByLocal(SceneObjectPart part, List<SceneObjectPartProperties> updatedProperties, long lastUpdateTS, string syncID)
|
||||
public HashSet<SceneObjectPartProperties> UpdatePropertiesByLocal(SceneObjectPart part, List<SceneObjectPartProperties> updatedProperties, long lastUpdateTS, string syncID)
|
||||
{
|
||||
List<SceneObjectPartProperties> propertiesWithSyncInfoUpdated = new List<SceneObjectPartProperties>();
|
||||
HashSet<SceneObjectPartProperties> propertiesWithSyncInfoUpdated = new HashSet<SceneObjectPartProperties>();
|
||||
if (part == null) return propertiesWithSyncInfoUpdated;
|
||||
|
||||
//first, see if there are physics properties updated but PhysActor
|
||||
|
@ -3433,6 +3521,20 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
return propertiesWithSyncInfoUpdated;
|
||||
}
|
||||
|
||||
public OSDMap EncodeUpdatedProperties(HashSet<SceneObjectPartProperties> propertiesToSync)
|
||||
{
|
||||
OSDMap propertyData = new OSDMap();
|
||||
|
||||
lock (m_primSyncInfoLock)
|
||||
{
|
||||
foreach (SceneObjectPartProperties property in propertiesToSync)
|
||||
{
|
||||
propertyData.Add(property.ToString(), PropertyToOSD(property));
|
||||
}
|
||||
}
|
||||
return propertyData;
|
||||
}
|
||||
|
||||
private void InitPropertiesSyncInfo(SceneObjectPart part, long initUpdateTimestamp, string syncID)
|
||||
{
|
||||
m_propertiesSyncInfo = new Dictionary<SceneObjectPartProperties, PropertySyncInfo>();
|
||||
|
@ -3535,6 +3637,48 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
return SceneObjectSerializer.ReadTaskInventory(reader, "TaskInventory");
|
||||
}
|
||||
|
||||
//Copy code from SceneObjectSerializer.SOPToXml2
|
||||
private string SerializeColor(System.Drawing.Color color)
|
||||
{
|
||||
string serializedColor;
|
||||
using (StringWriter sw = new StringWriter())
|
||||
{
|
||||
using (XmlTextWriter writer = new XmlTextWriter(sw))
|
||||
{
|
||||
writer.WriteStartElement("Color");
|
||||
writer.WriteElementString("R", color.R.ToString(Utils.EnUsCulture));
|
||||
writer.WriteElementString("G", color.G.ToString(Utils.EnUsCulture));
|
||||
writer.WriteElementString("B", color.B.ToString(Utils.EnUsCulture));
|
||||
writer.WriteElementString("A", color.G.ToString(Utils.EnUsCulture));
|
||||
writer.WriteEndElement();
|
||||
}
|
||||
serializedColor = sw.ToString();
|
||||
}
|
||||
return serializedColor;
|
||||
}
|
||||
|
||||
//Copy code from SceneObjectSerializer.ProcessColor
|
||||
private System.Drawing.Color DeSerializeColor(string colorString)
|
||||
{
|
||||
StringReader sr = new StringReader(colorString);
|
||||
XmlTextReader reader = new XmlTextReader(sr);
|
||||
|
||||
System.Drawing.Color color = new System.Drawing.Color();
|
||||
|
||||
reader.ReadStartElement("Color");
|
||||
if (reader.Name == "R")
|
||||
{
|
||||
float r = reader.ReadElementContentAsFloat("R", String.Empty);
|
||||
float g = reader.ReadElementContentAsFloat("G", String.Empty);
|
||||
float b = reader.ReadElementContentAsFloat("B", String.Empty);
|
||||
float a = reader.ReadElementContentAsFloat("A", String.Empty);
|
||||
color = System.Drawing.Color.FromArgb((int)a, (int)r, (int)g, (int)b);
|
||||
reader.ReadEndElement();
|
||||
}
|
||||
return color;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Compare the value (not "reference") of the given property.
|
||||
/// Assumption: the caller has already checked if PhysActor exists
|
||||
|
@ -4777,6 +4921,208 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
|
||||
return pValue;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Convert the value of the given property to OSD type.
|
||||
/// </summary>
|
||||
/// <param name="property"></param>
|
||||
/// <returns></returns>
|
||||
private OSD PropertyToOSD(SceneObjectPartProperties property)
|
||||
{
|
||||
OSDMap propertyData = new OSDMap();
|
||||
propertyData["LastUpdateTimeStamp"] = m_propertiesSyncInfo[property].LastUpdateTimeStamp;
|
||||
propertyData["LastUpdateSyncID"] = m_propertiesSyncInfo[property].LastUpdateSyncID;
|
||||
|
||||
switch (property)
|
||||
{
|
||||
///////////////////////////////////////
|
||||
//SOP properties with complex structure
|
||||
///////////////////////////////////////
|
||||
case SceneObjectPartProperties.Shape:
|
||||
case SceneObjectPartProperties.TaskInventory:
|
||||
propertyData["Value"] = OSD.FromString((string)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
////////////////////////////
|
||||
//SOP properties, enum types
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.AggregateScriptEvents:
|
||||
propertyData["Value"] = OSD.FromInteger((int)((scriptEvents)m_propertiesSyncInfo[property].LastUpdateValue));
|
||||
break;
|
||||
case SceneObjectPartProperties.Flags:
|
||||
propertyData["Value"] = OSD.FromInteger((int)((PrimFlags)m_propertiesSyncInfo[property].LastUpdateValue));
|
||||
break;
|
||||
////////////////////////////
|
||||
//SOP properties, bool types
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.AllowedDrop:
|
||||
case SceneObjectPartProperties.IsAttachment:
|
||||
case SceneObjectPartProperties.PassTouches:
|
||||
propertyData["Value"] = OSD.FromBoolean((bool)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
////////////////////////////
|
||||
//SOP properties, Vector3 types
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.AngularVelocity:
|
||||
case SceneObjectPartProperties.AttachedPos:
|
||||
case SceneObjectPartProperties.GroupPosition:
|
||||
case SceneObjectPartProperties.OffsetPosition:
|
||||
case SceneObjectPartProperties.Scale:
|
||||
case SceneObjectPartProperties.SitTargetPosition:
|
||||
case SceneObjectPartProperties.SitTargetPositionLL:
|
||||
case SceneObjectPartProperties.SOP_Acceleration:
|
||||
case SceneObjectPartProperties.Velocity:
|
||||
propertyData["Value"] = OSD.FromVector3((Vector3)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
////////////////////////////
|
||||
//SOP properties, UUID types
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.AttachedAvatar:
|
||||
case SceneObjectPartProperties.CollisionSound:
|
||||
case SceneObjectPartProperties.CreatorID:
|
||||
case SceneObjectPartProperties.FolderID:
|
||||
case SceneObjectPartProperties.GroupID:
|
||||
case SceneObjectPartProperties.LastOwnerID:
|
||||
case SceneObjectPartProperties.OwnerID:
|
||||
case SceneObjectPartProperties.Sound:
|
||||
propertyData["Value"] = OSD.FromUUID((UUID)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
//case SceneObjectPartProperties.AttachedPos:
|
||||
////////////////////////////
|
||||
//SOP properties, uint types
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.AttachmentPoint:
|
||||
case SceneObjectPartProperties.BaseMask:
|
||||
case SceneObjectPartProperties.Category:
|
||||
case SceneObjectPartProperties.EveryoneMask:
|
||||
case SceneObjectPartProperties.GroupMask:
|
||||
case SceneObjectPartProperties.InventorySerial:
|
||||
case SceneObjectPartProperties.NextOwnerMask:
|
||||
case SceneObjectPartProperties.OwnerMask:
|
||||
propertyData["Value"] = OSD.FromUInteger((uint)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
//case SceneObjectPartProperties.BaseMask:
|
||||
//case SceneObjectPartProperties.Category:
|
||||
|
||||
////////////////////////////
|
||||
//SOP properties, byte types
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.ClickAction:
|
||||
case SceneObjectPartProperties.Material:
|
||||
case SceneObjectPartProperties.ObjectSaleType:
|
||||
case SceneObjectPartProperties.UpdateFlag:
|
||||
propertyData["Value"] = OSD.FromInteger((byte)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
//case SceneObjectPartProperties.CollisionSound:
|
||||
|
||||
////////////////////////////
|
||||
//SOP properties, float types
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.CollisionSoundVolume:
|
||||
propertyData["Value"] = OSD.FromReal((float)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
////////////////////////////
|
||||
//SOP properties, Color(struct type)
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.Color:
|
||||
propertyData["Value"] = OSD.FromString(SerializeColor((System.Drawing.Color)m_propertiesSyncInfo[property].LastUpdateValue));
|
||||
break;
|
||||
|
||||
////////////////////////////
|
||||
//SOP properties, int types
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.CreationDate:
|
||||
case SceneObjectPartProperties.LinkNum:
|
||||
case SceneObjectPartProperties.OwnershipCost:
|
||||
case SceneObjectPartProperties.SalePrice:
|
||||
case SceneObjectPartProperties.ScriptAccessPin:
|
||||
propertyData["Value"] = OSD.FromInteger((int)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
////////////////////////////
|
||||
//SOP properties, string types
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.CreatorData:
|
||||
case SceneObjectPartProperties.Description:
|
||||
case SceneObjectPartProperties.MediaUrl:
|
||||
case SceneObjectPartProperties.Name:
|
||||
case SceneObjectPartProperties.SitName:
|
||||
case SceneObjectPartProperties.Text:
|
||||
case SceneObjectPartProperties.TouchName:
|
||||
propertyData["Value"] = OSD.FromString((string)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
////////////////////////////
|
||||
//SOP properties, byte[] types
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.ParticleSystem:
|
||||
case SceneObjectPartProperties.TextureAnimation:
|
||||
propertyData["Value"] = OSD.FromBinary((byte[])m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
////////////////////////////
|
||||
//SOP properties, Quaternion types
|
||||
////////////////////////////
|
||||
case SceneObjectPartProperties.RotationOffset:
|
||||
case SceneObjectPartProperties.SitTargetOrientation:
|
||||
case SceneObjectPartProperties.SitTargetOrientationLL:
|
||||
propertyData["Value"] = OSD.FromQuaternion((Quaternion)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
////////////////////////////////////
|
||||
//PhysActor properties, float type
|
||||
////////////////////////////////////
|
||||
case SceneObjectPartProperties.Buoyancy:
|
||||
propertyData["Value"] = OSD.FromReal((float)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
////////////////////////////////////
|
||||
//PhysActor properties, bool type
|
||||
////////////////////////////////////
|
||||
case SceneObjectPartProperties.Flying:
|
||||
case SceneObjectPartProperties.IsColliding:
|
||||
case SceneObjectPartProperties.CollidingGround:
|
||||
case SceneObjectPartProperties.IsPhysical:
|
||||
case SceneObjectPartProperties.Kinematic:
|
||||
propertyData["Value"] = OSD.FromBoolean((bool)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
////////////////////////////////////
|
||||
//PhysActor properties, Vector3 type
|
||||
////////////////////////////////////
|
||||
case SceneObjectPartProperties.Force:
|
||||
case SceneObjectPartProperties.PA_Acceleration:
|
||||
case SceneObjectPartProperties.Position:
|
||||
case SceneObjectPartProperties.RotationalVelocity:
|
||||
case SceneObjectPartProperties.Size:
|
||||
case SceneObjectPartProperties.Torque:
|
||||
propertyData["Value"] = OSD.FromVector3((Vector3)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
////////////////////////////////////
|
||||
//PhysActor properties, Quaternion type
|
||||
////////////////////////////////////
|
||||
case SceneObjectPartProperties.Orientation:
|
||||
propertyData["Value"] = OSD.FromQuaternion((Quaternion)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
///////////////////////
|
||||
//SOG properties
|
||||
///////////////////////
|
||||
case SceneObjectPartProperties.IsSelected:
|
||||
propertyData["Value"] = OSD.FromBoolean((bool)m_propertiesSyncInfo[property].LastUpdateValue);
|
||||
break;
|
||||
|
||||
default:
|
||||
m_log.WarnFormat("PrimSynInfo.PropertyToOSD -- no handler for property {0} ", property);
|
||||
break;
|
||||
}
|
||||
return propertyData;
|
||||
}
|
||||
}
|
||||
|
||||
public class PrimSyncInfoManager
|
||||
|
@ -4815,7 +5161,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
/// <param name="updatedProperties"></param>
|
||||
/// <returns>The list properties among updatedProperties whose value
|
||||
/// have been copied over to PrimSyncInfo.</returns>
|
||||
public List<SceneObjectPartProperties> UpdatePrimSyncInfoByLocal(SceneObjectPart part, List<SceneObjectPartProperties> updatedProperties)
|
||||
public HashSet<SceneObjectPartProperties> UpdatePrimSyncInfoByLocal(SceneObjectPart part, List<SceneObjectPartProperties> updatedProperties)
|
||||
{
|
||||
long currentTime = DateTime.Now.Ticks;
|
||||
if (m_primsInSync.ContainsKey(part.UUID))
|
||||
|
@ -4830,7 +5176,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
|||
PrimSyncInfo primSyncInfo = new PrimSyncInfo(part, currentTime, m_regionSyncModule.SyncID, m_log);
|
||||
m_primsInSync.Add(part.UUID, primSyncInfo);
|
||||
|
||||
return updatedProperties;
|
||||
return new HashSet<SceneObjectPartProperties>(updatedProperties);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -68,13 +68,14 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
|
||||
//Enqueue updates for scene-objects and scene-presences
|
||||
//Legacy interface, used in Bucket-sync
|
||||
void QueueSceneObjectPartForUpdate(SceneObjectPart part);
|
||||
//void QueueSceneObjectPartForUpdate(SceneObjectPart part);
|
||||
void QueueScenePresenceForTerseUpdate(ScenePresence presence);
|
||||
|
||||
void RecordPrimUpdatesByLocal(SceneObjectPart part, List<SceneObjectPartProperties> updatedProperties);
|
||||
void ProcessAndEnqueuePrimUpdatesByLocal(SceneObjectPart part, List<SceneObjectPartProperties> updatedProperties);
|
||||
void SyncOutPrimUpdates();
|
||||
|
||||
//The folloiwng calls deal with object updates, and will insert each update into an outgoing queue of each SyncConnector
|
||||
void SendSceneUpdates();
|
||||
//void SendSceneUpdates();
|
||||
void SendNewObject(SceneObjectGroup sog);
|
||||
void SendDeleteObject(SceneObjectGroup sog, bool softDelete);
|
||||
void SendLinkObject(SceneObjectGroup linkedGroup, SceneObjectPart root, List<SceneObjectPart> children);
|
||||
|
|
|
@ -1745,7 +1745,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//NOTE: If it is configured as symmetric sync in opensim.ini, the above IsSyncedServer() or IsSyncedClient() should all return false
|
||||
if (RegionSyncModule != null)
|
||||
{
|
||||
RegionSyncModule.SendSceneUpdates();
|
||||
//RegionSyncModule.SendSceneUpdates();
|
||||
RegionSyncModule.SyncOutPrimUpdates();
|
||||
}
|
||||
//end of SYMMETRIC SYNC
|
||||
|
||||
|
|
|
@ -5981,7 +5981,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
if (m_parentGroup != null && m_parentGroup.Scene.RegionSyncModule != null)
|
||||
{
|
||||
m_parentGroup.Scene.RegionSyncModule.RecordPrimUpdatesByLocal(this, updatedProperties);
|
||||
m_parentGroup.Scene.RegionSyncModule.ProcessAndEnqueuePrimUpdatesByLocal(this, updatedProperties);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5994,7 +5994,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
if (m_parentGroup != null && m_parentGroup.Scene.RegionSyncModule != null)
|
||||
{
|
||||
m_parentGroup.Scene.RegionSyncModule.RecordPrimUpdatesByLocal(this, updatedProperties);
|
||||
m_parentGroup.Scene.RegionSyncModule.ProcessAndEnqueuePrimUpdatesByLocal(this, updatedProperties);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue