diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs index 4ad2d6d500..a4fcdf77c5 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -2417,10 +2417,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule if (p.Property == SceneObjectPartSyncProperties.Shape) { PrimitiveBaseShape shape = PropertySerializer.DeSerializeShape((String)p.LastUpdateValue); - m_log.DebugFormat("Shape changed on SOP {0}, {1} to ProfileShape {2}", sop.Name, sop.UUID, shape.ProfileShape); + m_log.DebugFormat("Shape to be changed on SOP {0}, {1} to ProfileShape {2}", sop.Name, sop.UUID, shape.ProfileShape); } } + //m_log.DebugFormat("ms {0}: HandleUpdatedPrimProperties, for prim {1},{2} with updated properties -- {3}", DateTime.Now.Millisecond, sop.Name, sop.UUID, pString); @@ -2432,14 +2433,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //m_log.DebugFormat("AggregateScriptEvents updated: " + sop.AggregateScriptEvents); } - /* + if (propertiesUpdated.Contains(SceneObjectPartSyncProperties.Shape)) { String hashedShape = Util.Md5Hash((PropertySerializer.SerializeShape(sop))); - m_log.DebugFormat("HandleUpdatedPrimProperties -- SOP {0},{1}, Shape, ProfileShape {2}, hashed value in SOP:{3}, in PrinSyncInfoManager: {4}", + m_log.DebugFormat("HandleUpdatedPrimProperties -- SOP {0},{1}, Shape updated, ProfileShape {2}, hashed value in SOP:{3}, in PrinSyncInfoManager: {4}", sop.Name, sop.UUID, sop.Shape.ProfileShape, hashedShape, m_primSyncInfoManager.GetPrimSyncInfo(sop.UUID).PropertiesSyncInfo[SceneObjectPartSyncProperties.Shape].LastUpdateValueHash); } - * */ + if (propertiesUpdated.Count > 0) { @@ -3559,6 +3560,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule part.Name, part.UUID, part.Shape.ProfileShape, hashedShape, m_primSyncInfoManager.GetPrimSyncInfo(part.UUID).PropertiesSyncInfo[SceneObjectPartSyncProperties.Shape].LastUpdateValueHash); } * */ + //Enqueue the prim with the set of updated properties, excluding the group properties if (propertiesWithSyncInfoUpdated.Count > 0) @@ -3726,7 +3728,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule // m_log.DebugFormat("SendPrimPropertyUpdates -- AggregateScriptEvents: " + sop.AggregateScriptEvents); } - /* + if (updatedProperties.Contains(SceneObjectPartSyncProperties.Shape)) { String hashedShape = Util.Md5Hash((PropertySerializer.SerializeShape(sop))); @@ -3734,7 +3736,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule sop.Name, sop.UUID, sop.Shape.ProfileShape, hashedShape, m_primSyncInfoManager.GetPrimSyncInfo(sop.UUID).PropertiesSyncInfo[SceneObjectPartSyncProperties.Shape].LastUpdateValueHash); } - * */ + SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedPrimProperties, OSDParser.SerializeJsonString(syncData)); @@ -3839,7 +3841,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //set the PhysActor's properties foreach (SceneObjectPart part in group.Parts) { - primsSyncInfo[part.UUID].SetSOPPhyscActorProperties(part); + //primsSyncInfo[part.UUID].SetSOPPhyscActorProperties(part); + m_primSyncInfoManager.SetSOPPhyscActorProperties(part); } } @@ -4890,15 +4893,17 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule #endregion //Constructors - public void UpdatePropertySyncInfoByLocal(SceneObjectPartSyncProperties property, long lastUpdateTS, string syncID, Object pValue, string pHashedValue) + public void UpdatePropertyWithHashByLocal(SceneObjectPartSyncProperties property, long lastUpdateTS, string syncID, Object pValue, string pHashedValue) { m_propertiesSyncInfo[property].UpdateSyncInfoByLocal(lastUpdateTS, syncID, pValue, pHashedValue); } - public void UpdatePropertySyncInfoByLocal(SceneObjectPartSyncProperties property, long lastUpdateTS, string syncID, Object pValue) + /* + public void UpdatePropertyByLocal(SceneObjectPartSyncProperties property, long lastUpdateTS, string syncID, Object pValue) { m_propertiesSyncInfo[property].UpdateSyncInfoByLocal(lastUpdateTS, syncID, pValue); } + * */ //public void UpdatePropertySyncInfoBySync(SceneObjectPartSyncProperties property, long lastUpdateTS, string syncID, Object pValue, Object pHashedValue, long recvTS) //{ @@ -4916,6 +4921,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule /// public HashSet UpdatePropertiesByLocal(SceneObjectPart part, List updatedProperties, long lastUpdateTS, string syncID) { + //DSG DEBUG + /* + if (updatedProperties.Contains(SceneObjectPartSyncProperties.Shape)) + { + DebugLog.DebugFormat("UpdatePropertiesByLocal: To update SOP {0},{1} Shape to be {2}", part.Name, part.UUID, part.Shape.ProfileShape); + }*/ + + HashSet propertiesToBeSynced = new HashSet(updatedProperties); if (part == null) { @@ -4965,6 +4978,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //that really have recently been updated by local operations HashSet propertiesUpdatedByLocal = new HashSet(); + //DSG DEBUG + if (propertiesToBeSynced.Contains(SceneObjectPartSyncProperties.Shape)) + { + DebugLog.DebugFormat("UpdatePropertiesByLocal: to update cache of SOP {0}, {1} Shape to {2}", part.Name, part.UUID, part.Shape.ProfileShape); + } + lock (m_primSyncInfoLock) { foreach (SceneObjectPartSyncProperties property in propertiesToBeSynced) @@ -4999,27 +5018,36 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule long recvTS = DateTime.Now.Ticks; List propertiesUpdated = new List(); - foreach (PropertySyncInfo pSyncInfo in propertiesSyncInfo) + lock (m_primSyncInfoLock) { - bool updated = false; - SceneObjectPartSyncProperties property = pSyncInfo.Property; - //Compare if the value of the property in this SyncModule is - //different than the value in SOP - if (!m_propertiesSyncInfo.ContainsKey(property)) + foreach (PropertySyncInfo pSyncInfo in propertiesSyncInfo) { - //Should not happen - DebugLog.WarnFormat("PrimSyncInfo.UpdatePropertiesBySync -- no record of property {0} for SOP {1},{2}", property, part.Name, part.UUID); - } - else - { - //Compare timestamp and update SyncInfo if necessary - updated = m_propertiesSyncInfo[property].CompareAndUpdateSyncInfoBySync(pSyncInfo, recvTS); - //If updated, update the property value in SOP - if (updated) + bool updated = false; + SceneObjectPartSyncProperties property = pSyncInfo.Property; + //Compare if the value of the property in this SyncModule is + //different than the value in SOP + if (!m_propertiesSyncInfo.ContainsKey(property)) { - //UpdateSOPProperty(part, m_propertiesSyncInfo[property]); - SetSOPPropertyValue(part, property); - propertiesUpdated.Add(property); + //Should not happen + DebugLog.WarnFormat("PrimSyncInfo.UpdatePropertiesBySync -- no record of property {0} for SOP {1},{2}", property, part.Name, part.UUID); + } + else + { + //Compare timestamp and update SyncInfo if necessary + updated = m_propertiesSyncInfo[property].CompareAndUpdateSyncInfoBySync(pSyncInfo, recvTS); + //If updated, update the property value in SOP + if (updated) + { + //DSG DEBUG + if (property == SceneObjectPartSyncProperties.Shape) + { + DebugLog.DebugFormat("UpdatePropertiesBySync: updating Shape of {0}, {1}", part.Name, part.UUID); + } + + //UpdateSOPProperty(part, m_propertiesSyncInfo[property]); + SetSOPPropertyValue(part, property); + propertiesUpdated.Add(property); + } } } } @@ -5099,7 +5127,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule return propertiesSyncInfo; } - //TO BE FINISHED + //Should only be called after receiving a message with encoded prim properties, + // + /// + /// Create a SOP instance based on the properties in PrimSyncInfo. Should + /// only be called after receiving a message with encoded prim properties, + /// and the SOP with the given UUID does not exsit locally yet. + /// + /// public SceneObjectPart PrimSyncInfoToSOP() { SceneObjectPart sop = new SceneObjectPart(); @@ -5136,6 +5171,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } } + /// + /// Initialize the properties with the values in the given SOP. + /// + /// + /// + /// private void InitPropertiesSyncInfo(SceneObjectPart part, long initUpdateTimestamp, string syncID) { m_propertiesSyncInfo.Clear(); @@ -5201,11 +5242,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //value by copying that from PrimSyncInfoManager if (lastUpdateTS > m_propertiesSyncInfo[property].LastUpdateTimeStamp) { - UpdatePropertySyncInfoByLocal(property, lastUpdateTS, syncID, (Object)primShapeString, primShapeStringHash); + UpdatePropertyWithHashByLocal(property, lastUpdateTS, syncID, (Object)primShapeString, primShapeStringHash); //DSG DEBUG - DebugLog.DebugFormat("CompareHashedValue_UpdateByLocal - Shape of {0}, {1} updated: SOP hashed shape: {2}, cached hash {3}", - part.Name, part.UUID, primShapeStringHash, m_propertiesSyncInfo[property].LastUpdateValueHash); + //DebugLog.DebugFormat("CompareHashedValue_UpdateByLocal - Shape of {0}, {1} updated to ProfileShape {2}: SOP hashed shape: {3}, cached hash {4}", + // part.Name, part.UUID, part.Shape.ProfileShape, primShapeStringHash, m_propertiesSyncInfo[property].LastUpdateValueHash); updated = true; } @@ -5224,7 +5265,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { if (lastUpdateTS > m_propertiesSyncInfo[property].LastUpdateTimeStamp) { - UpdatePropertySyncInfoByLocal(property, lastUpdateTS, syncID, (Object)primTaskInventoryString, primTaskInventoryStringHash); + UpdatePropertyWithHashByLocal(property, lastUpdateTS, syncID, (Object)primTaskInventoryString, primTaskInventoryStringHash); updated = true; } else if (lastUpdateTS < m_propertiesSyncInfo[property].LastUpdateTimeStamp) @@ -6327,13 +6368,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule return propertyUpdatedByLocal; } - private void UpdateSOPProperty(SceneObjectPart sop, PropertySyncInfo propertySyncInfo) - { - switch (propertySyncInfo.Property) - { - - } - } private bool ByteArrayEquals(byte[] a, byte[] b) { @@ -7196,6 +7230,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule return null; } + public bool SetSOPPhyscActorProperties(SceneObjectPart part) + { + if(m_primsInSync.ContainsKey(part.UUID)){ + m_primsInSync[part.UUID].SetSOPPhyscActorProperties(part); + return true; + } + return false; + } } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 3a7453f93b..04129a5fd0 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -4650,6 +4650,10 @@ namespace OpenSim.Region.Framework.Scenes ParentGroup.HasGroupChanged = true; TriggerScriptChangedEvent(Changed.SHAPE); //ScheduleFullUpdate(); + + //DSG DEBUG + m_log.DebugFormat("{0}, {1}: shaped updated to {2}, calling ScheduleFullUpdate.", Name, UUID, Shape.ProfileShape); + ScheduleFullUpdate(new List() {SceneObjectPartSyncProperties.Shape}); } @@ -6088,10 +6092,23 @@ namespace OpenSim.Region.Framework.Scenes { if (updatedProperties != null && updatedProperties.Count > 0) { - if (m_parentGroup != null && m_parentGroup.Scene!=null && m_parentGroup.Scene.RegionSyncModule != null) + if (m_parentGroup != null && m_parentGroup.Scene != null && m_parentGroup.Scene.RegionSyncModule != null) { + /* + if (updatedProperties.Contains(SceneObjectPartSyncProperties.Shape)) + { + m_log.DebugFormat("{0}, {1} -- calling ProcessAndEnqueuePrimUpdatesByLocal to update to Shape {2}", Name, UUID, Shape.ProfileShape); + } + * */ m_parentGroup.Scene.RegionSyncModule.ProcessAndEnqueuePrimUpdatesByLocal(this, updatedProperties); } + else + { + if (updatedProperties.Contains(SceneObjectPartSyncProperties.Shape)) + { + m_log.DebugFormat("{0}, {1} Shape changed to {2}, but this SOP not attached to Scene yet", Name, UUID, Shape.ProfileShape); + } + } } base.ScheduleFullUpdate(updatedProperties); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 1931c3e7f3..b0c296041d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -7093,7 +7093,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api code = (int)rules.GetLSLIntegerItem(idx++); //debug - //part.ParentGroup.Scene.RegionSyncModule.Debug("LSL_Api: Prim " + part.Name + "," + part.UUID + ", changing shape to " + code); + part.ParentGroup.Scene.RegionSyncModule.Debug("LSL_Api: Prim " + part.Name + "," + part.UUID + ", changing shape to " + code); remain = rules.Length - idx; float hollow;