1. Replaced SendLinkObject and SendDeLinkObject with SyncLinkObject and SyncDeLinkObject
2. Replaced HandleLinkObject and HandleDelinkObject with HandleSyncLinkObject and HandleSyncDelinkObject. LinkObject seems sync'ed well across actors.dsg
							parent
							
								
									3d7cece491
								
							
						
					
					
						commit
						3676b5fbef
					
				|  | @ -599,6 +599,92 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||||
|             SendSpecialObjectUpdateToRelevantSyncConnectors(m_actorID, sog, rsm); |             SendSpecialObjectUpdateToRelevantSyncConnectors(m_actorID, sog, rsm); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         public void SyncLinkObject(SceneObjectGroup linkedGroup, SceneObjectPart root, List<SceneObjectPart> children) | ||||||
|  |         { | ||||||
|  |             if (children.Count == 0) return; | ||||||
|  | 
 | ||||||
|  |             if (!IsSyncingWithOtherSyncNodes()) | ||||||
|  |             { | ||||||
|  |                 //no SyncConnector connected. Do nothing. | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //First, make sure the linked group has updated timestamp info for synchronization | ||||||
|  |             linkedGroup.BucketSyncInfoUpdate(); | ||||||
|  | 
 | ||||||
|  |             OSDMap data = new OSDMap(); | ||||||
|  |             OSDMap encodedSOG = SceneObjectEncoder(linkedGroup); | ||||||
|  |             data["linkedGroup"] = encodedSOG; | ||||||
|  |             data["rootID"] = OSD.FromUUID(root.UUID); | ||||||
|  |             data["partCount"] = OSD.FromInteger(children.Count); | ||||||
|  |             data["actorID"] = OSD.FromString(m_actorID); | ||||||
|  |             int partNum = 0; | ||||||
|  |             foreach (SceneObjectPart part in children) | ||||||
|  |             { | ||||||
|  |                 string partTempID = "part" + partNum; | ||||||
|  |                 data[partTempID] = OSD.FromUUID(part.UUID); | ||||||
|  |                 partNum++; | ||||||
|  | 
 | ||||||
|  |                 //m_log.DebugFormat("{0}: SendLinkObject to link {1},{2} with {3}, {4}", part.Name, part.UUID, root.Name, root.UUID); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.LinkObject, OSDParser.SerializeJsonString(data)); | ||||||
|  |             SendSpecialObjectUpdateToRelevantSyncConnectors(m_actorID, linkedGroup, rsm); | ||||||
|  |             //SendSceneEventToRelevantSyncConnectors(m_actorID, rsm, linkedGroup); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         public void SyncDeLinkObject(List<SceneObjectPart> prims, List<SceneObjectGroup> beforeDelinkGroups, List<SceneObjectGroup> afterDelinkGroups) | ||||||
|  |         { | ||||||
|  |             if (prims.Count == 0 || beforeDelinkGroups.Count == 0) return; | ||||||
|  | 
 | ||||||
|  |             if (!IsSyncingWithOtherSyncNodes()) | ||||||
|  |             { | ||||||
|  |                 //no SyncConnector connected. Do nothing. | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             OSDMap data = new OSDMap(); | ||||||
|  |             data["partCount"] = OSD.FromInteger(prims.Count); | ||||||
|  |             int partNum = 0; | ||||||
|  |             foreach (SceneObjectPart part in prims) | ||||||
|  |             { | ||||||
|  |                 string partTempID = "part" + partNum; | ||||||
|  |                 data[partTempID] = OSD.FromUUID(part.UUID); | ||||||
|  |                 partNum++; | ||||||
|  |             } | ||||||
|  |             //We also include the IDs of beforeDelinkGroups, for now it is more for sanity checking at the receiving end, so that the receiver  | ||||||
|  |             //could make sure its delink starts with the same linking state of the groups/prims. | ||||||
|  |             data["beforeGroupsCount"] = OSD.FromInteger(beforeDelinkGroups.Count); | ||||||
|  |             int groupNum = 0; | ||||||
|  |             foreach (SceneObjectGroup affectedGroup in beforeDelinkGroups) | ||||||
|  |             { | ||||||
|  |                 string groupTempID = "beforeGroup" + groupNum; | ||||||
|  |                 data[groupTempID] = OSD.FromUUID(affectedGroup.UUID); | ||||||
|  |                 groupNum++; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //include the property values of each object after delinking, for synchronizing the values | ||||||
|  |             data["afterGroupsCount"] = OSD.FromInteger(afterDelinkGroups.Count); | ||||||
|  |             groupNum = 0; | ||||||
|  |             foreach (SceneObjectGroup afterGroup in afterDelinkGroups) | ||||||
|  |             { | ||||||
|  |                 string groupTempID = "afterGroup" + groupNum; | ||||||
|  |                 string sogxml = SceneObjectSerializer.ToXml2Format(afterGroup); | ||||||
|  |                 data[groupTempID] = OSD.FromString(sogxml); | ||||||
|  |                 groupNum++; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //make sure the newly delinked objects have the updated timestamp information | ||||||
|  |             foreach (SceneObjectGroup sog in afterDelinkGroups) | ||||||
|  |             { | ||||||
|  |                 sog.BucketSyncInfoUpdate(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.DelinkObject, OSDParser.SerializeJsonString(data)); | ||||||
|  |             SendDelinkObjectToRelevantSyncConnectors(m_actorID, beforeDelinkGroups, rsm); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         #endregion //IRegionSyncModule   |         #endregion //IRegionSyncModule   | ||||||
| 
 | 
 | ||||||
|         #region ICommandableModule Members |         #region ICommandableModule Members | ||||||
|  | @ -2153,7 +2239,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|                 case SymmetricSyncMessage.MsgType.NewObject: |                 case SymmetricSyncMessage.MsgType.NewObject: | ||||||
|                     HandleAddNewObject(msg, senderActorID); |                     //HandleAddNewObject(msg, senderActorID); | ||||||
|  |                     HandleSyncNewObject(msg, senderActorID); | ||||||
|                     break; |                     break; | ||||||
|                 case SymmetricSyncMessage.MsgType.UpdatedPrimProperties: |                 case SymmetricSyncMessage.MsgType.UpdatedPrimProperties: | ||||||
|                     HandleUpdatedPrimProperties(msg, senderActorID); |                     HandleUpdatedPrimProperties(msg, senderActorID); | ||||||
|  | @ -2176,12 +2263,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||||
|                     } |                     } | ||||||
|                 case SymmetricSyncMessage.MsgType.LinkObject: |                 case SymmetricSyncMessage.MsgType.LinkObject: | ||||||
|                     { |                     { | ||||||
|                         HandleLinkObject(msg, senderActorID); |                         //HandleLinkObject(msg, senderActorID); | ||||||
|  |                         HandleSyncLinkObject(msg, senderActorID); | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|                 case SymmetricSyncMessage.MsgType.DelinkObject: |                 case SymmetricSyncMessage.MsgType.DelinkObject: | ||||||
|                     { |                     { | ||||||
|                         HandleDelinkObject(msg, senderActorID); |                         //HandleDelinkObject(msg, senderActorID); | ||||||
|  |                         HandleSyncDelinkObject(msg, senderActorID); | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|                     //EVENTS PROCESSING |                     //EVENTS PROCESSING | ||||||
|  | @ -2241,7 +2330,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||||
|         // Per property sync handlers |         // Per property sync handlers | ||||||
|         /////////////////////////////////////////////////////////////////////// |         /////////////////////////////////////////////////////////////////////// | ||||||
| 
 | 
 | ||||||
|         private void HandleAddNewObject(SymmetricSyncMessage msg, string senderActorID) |         private void HandleSyncNewObject(SymmetricSyncMessage msg, string senderActorID) | ||||||
|         { |         { | ||||||
| 
 | 
 | ||||||
|             OSDMap data = DeserializeMessage(msg); |             OSDMap data = DeserializeMessage(msg); | ||||||
|  | @ -2261,8 +2350,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||||
|             } |             } | ||||||
|              * */  |              * */  | ||||||
|              |              | ||||||
|             //NewObjectMessageDecoder(data, out sog); |  | ||||||
|              |  | ||||||
|             AddNewSceneObjectByDecoding(data); |             AddNewSceneObjectByDecoding(data); | ||||||
| 
 | 
 | ||||||
|         } |         } | ||||||
|  | @ -2302,10 +2389,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||||
|                 List<SceneObjectPartSyncProperties> propertiesUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoBySync(sop, propertiesSyncInfo); |                 List<SceneObjectPartSyncProperties> propertiesUpdated = m_primSyncInfoManager.UpdatePrimSyncInfoBySync(sop, propertiesSyncInfo); | ||||||
| 
 | 
 | ||||||
|                 //SYNC DEBUG |                 //SYNC DEBUG | ||||||
|                 if (propertiesUpdated.Contains(SceneObjectPartSyncProperties.Shape)) |                 //if (propertiesUpdated.Contains(SceneObjectPartSyncProperties.Shape)) | ||||||
|                 { |                 //{ | ||||||
|                     m_log.DebugFormat("Shape updated: " + PropertySerializer.SerializeShape(sop));  |                 //    m_log.DebugFormat("Shape updated: " + PropertySerializer.SerializeShape(sop));  | ||||||
|                 } |                 //} | ||||||
| 
 | 
 | ||||||
|                 if (propertiesUpdated.Count > 0) |                 if (propertiesUpdated.Count > 0) | ||||||
|                 { |                 { | ||||||
|  | @ -2319,10 +2406,162 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         private void HandleSyncLinkObject(SymmetricSyncMessage msg, string senderActorID) | ||||||
|  |         { | ||||||
|  | 
 | ||||||
|  |             // Get the data from message and error check | ||||||
|  |             OSDMap data = DeserializeMessage(msg); | ||||||
|  |             if (data == null) | ||||||
|  |             { | ||||||
|  |                 SymmetricSyncMessage.HandleError(LogHeader, msg, "Could not deserialize JSON data."); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             OSDMap encodedSOG = (OSDMap)data["linkedGroup"]; | ||||||
|  |             SceneObjectGroup linkedGroup; | ||||||
|  |             Dictionary<UUID, PrimSyncInfo> primsSyncInfo; | ||||||
|  | 
 | ||||||
|  |             SceneObjectDecoder(encodedSOG, out linkedGroup, out primsSyncInfo); | ||||||
|  | 
 | ||||||
|  |             if (linkedGroup == null) | ||||||
|  |             { | ||||||
|  |                 m_log.WarnFormat("{0}: HandleSyncLinkObject, no valid Linked-Group has been deserialized", LogHeader); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             UUID rootID = data["rootID"].AsUUID(); | ||||||
|  |             int partCount = data["partCount"].AsInteger(); | ||||||
|  |             List<UUID> childrenIDs = new List<UUID>(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             //if this is a relay node, forwards the event | ||||||
|  |             if (m_isSyncRelay) | ||||||
|  |             { | ||||||
|  |                 //SendSceneEventToRelevantSyncConnectors(senderActorID, msg, linkedGroup); | ||||||
|  |                 SendSpecialObjectUpdateToRelevantSyncConnectors(senderActorID, linkedGroup, msg); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             for (int i = 0; i < partCount; i++) | ||||||
|  |             { | ||||||
|  |                 string partTempID = "part" + i; | ||||||
|  |                 childrenIDs.Add(data[partTempID].AsUUID()); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //TEMP SYNC DEBUG | ||||||
|  |             //m_log.DebugFormat("{0}: received LinkObject from {1}", LogHeader, senderActorID); | ||||||
|  | 
 | ||||||
|  |             m_scene.LinkObjectBySync(linkedGroup, rootID, childrenIDs); | ||||||
|  | 
 | ||||||
|  |             //Update properties, if any has changed | ||||||
|  |             foreach (KeyValuePair<UUID, PrimSyncInfo> incomingPrimSyncInfo in primsSyncInfo) | ||||||
|  |             { | ||||||
|  |                 UUID primUUID = incomingPrimSyncInfo.Key; | ||||||
|  |                 PrimSyncInfo updatedPrimSyncInfo = incomingPrimSyncInfo.Value; | ||||||
|  | 
 | ||||||
|  |                 SceneObjectPart part = m_scene.GetSceneObjectPart(primUUID); | ||||||
|  |                 if (part == null) | ||||||
|  |                 { | ||||||
|  |                     m_log.WarnFormat("{0}: HandleSyncLinkObject, prim {1} not in local Scene Graph after LinkObjectBySync is called", LogHeader, primUUID); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     m_primSyncInfoManager.UpdatePrimSyncInfoBySync(part, updatedPrimSyncInfo); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private void HandleSyncDelinkObject(SymmetricSyncMessage msg, string senderActorID) | ||||||
|  |         { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             OSDMap data = DeserializeMessage(msg); | ||||||
|  |             if (data == null) | ||||||
|  |             { | ||||||
|  |                 SymmetricSyncMessage.HandleError(LogHeader, msg, "Could not deserialize JSON data."); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //List<SceneObjectPart> localPrims = new List<SceneObjectPart>(); | ||||||
|  |             List<UUID> delinkPrimIDs = new List<UUID>(); | ||||||
|  |             List<UUID> beforeDelinkGroupIDs = new List<UUID>(); | ||||||
|  |             List<SceneObjectGroup> incomingAfterDelinkGroups = new List<SceneObjectGroup>(); | ||||||
|  | 
 | ||||||
|  |             int partCount = data["partCount"].AsInteger(); | ||||||
|  |             for (int i = 0; i < partCount; i++) | ||||||
|  |             { | ||||||
|  |                 string partTempID = "part" + i; | ||||||
|  |                 UUID primID = data[partTempID].AsUUID(); | ||||||
|  |                 //SceneObjectPart localPart = m_scene.GetSceneObjectPart(primID); | ||||||
|  |                 //localPrims.Add(localPart); | ||||||
|  |                 delinkPrimIDs.Add(primID); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             int beforeGroupCount = data["beforeGroupsCount"].AsInteger(); | ||||||
|  |             for (int i = 0; i < beforeGroupCount; i++) | ||||||
|  |             { | ||||||
|  |                 string groupTempID = "beforeGroup" + i; | ||||||
|  |                 UUID beforeGroupID = data[groupTempID].AsUUID(); | ||||||
|  |                 beforeDelinkGroupIDs.Add(beforeGroupID); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             int afterGroupsCount = data["afterGroupsCount"].AsInteger(); | ||||||
|  |             for (int i = 0; i < afterGroupsCount; i++) | ||||||
|  |             { | ||||||
|  |                 string groupTempID = "afterGroup" + i; | ||||||
|  |                 string sogxml = data[groupTempID].AsString(); | ||||||
|  |                 //SceneObjectGroup afterGroup = SceneObjectSerializer.FromXml2Format(sogxml); | ||||||
|  |                 SceneObjectGroup afterGroup = DecodeSceneObjectGroup(sogxml); | ||||||
|  |                 incomingAfterDelinkGroups.Add(afterGroup); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //if this is a relay node, forwards the event | ||||||
|  |             if (m_isSyncRelay) | ||||||
|  |             { | ||||||
|  |                 List<SceneObjectGroup> beforeDelinkGroups = new List<SceneObjectGroup>(); | ||||||
|  |                 foreach (UUID sogID in beforeDelinkGroupIDs) | ||||||
|  |                 { | ||||||
|  |                     SceneObjectGroup sog = m_scene.SceneGraph.GetGroupByPrim(sogID); | ||||||
|  |                     beforeDelinkGroups.Add(sog); | ||||||
|  |                 } | ||||||
|  |                 SendDelinkObjectToRelevantSyncConnectors(senderActorID, beforeDelinkGroups, msg); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             m_scene.DelinkObjectsBySync(delinkPrimIDs, beforeDelinkGroupIDs, incomingAfterDelinkGroups); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         /////////////////////////////////////////////////////////////////////// |         /////////////////////////////////////////////////////////////////////// | ||||||
|         // Bucket sync handlers |         // Bucket sync handlers | ||||||
|         /////////////////////////////////////////////////////////////////////// |         /////////////////////////////////////////////////////////////////////// | ||||||
| 
 | 
 | ||||||
|  |         private void HandleAddNewObject(SymmetricSyncMessage msg, string senderActorID) | ||||||
|  |         { | ||||||
|  | 
 | ||||||
|  |             OSDMap data = DeserializeMessage(msg); | ||||||
|  | 
 | ||||||
|  |             //if this is a relay node, forward the event | ||||||
|  |             Vector3 globalPos = data["GroupPosition"].AsVector3(); | ||||||
|  |             if (m_isSyncRelay) | ||||||
|  |             { | ||||||
|  |                 SendSpecialObjectUpdateToRelevantSyncConnectors(senderActorID, globalPos, msg); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             /* | ||||||
|  |             if (!m_syncQuarkManager.IsPosInSyncQuarks(globalPos)) | ||||||
|  |             { | ||||||
|  |                 m_log.WarnFormat("{0}: Received an update for object at global pos {1}, not within local quarks, ignore the update", LogHeader, globalPos.ToString()); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |              * */ | ||||||
|  | 
 | ||||||
|  |             SceneObjectGroup sog; | ||||||
|  |             Object group; | ||||||
|  |             NewObjectMessageDecoder(data, out group); | ||||||
|  |             sog = (SceneObjectGroup)group;  | ||||||
|  |             //Might need to do something with SOG, or no more actions, just return | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Handler of UpdatedObject message. Note: for a relay node in the  |         /// Handler of UpdatedObject message. Note: for a relay node in the  | ||||||
|         /// sync topology, it won't forward the message right away. Instead, |         /// sync topology, it won't forward the message right away. Instead, | ||||||
|  | @ -3375,6 +3614,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||||
|             if (syncData.Count > 0) |             if (syncData.Count > 0) | ||||||
|             { |             { | ||||||
|                 //SYNC DEBUG |                 //SYNC DEBUG | ||||||
|  |                  | ||||||
|                 string pString = ""; |                 string pString = ""; | ||||||
|                 foreach (SceneObjectPartSyncProperties property in updatedProperties) |                 foreach (SceneObjectPartSyncProperties property in updatedProperties) | ||||||
|                 { |                 { | ||||||
|  | @ -3383,10 +3623,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||||
|                 m_log.DebugFormat("{0}: SendPrimPropertyUpdates for {1}, {2}, with updated properties -- {3}", LogHeader, sop.Name, sop.UUID, pString); |                 m_log.DebugFormat("{0}: SendPrimPropertyUpdates for {1}, {2}, with updated properties -- {3}", LogHeader, sop.Name, sop.UUID, pString); | ||||||
| 
 | 
 | ||||||
|                 //SYNC DEBUG |                 //SYNC DEBUG | ||||||
|  |                 /* | ||||||
|                 if (updatedProperties.Contains(SceneObjectPartSyncProperties.Shape)) |                 if (updatedProperties.Contains(SceneObjectPartSyncProperties.Shape)) | ||||||
|                 { |                 { | ||||||
|                     m_log.DebugFormat("Shape updated: " + PropertySerializer.SerializeShape(sop)); |                     m_log.DebugFormat("Shape updated: " + PropertySerializer.SerializeShape(sop)); | ||||||
|                 } |                 } | ||||||
|  |                  * */  | ||||||
| 
 | 
 | ||||||
|                 SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedPrimProperties, OSDParser.SerializeJsonString(syncData)); |                 SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedPrimProperties, OSDParser.SerializeJsonString(syncData)); | ||||||
|                 SendPrimUpdateToRelevantSyncConnectors(primUUID, syncMsg); |                 SendPrimUpdateToRelevantSyncConnectors(primUUID, syncMsg); | ||||||
|  | @ -4678,6 +4920,13 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||||
|             return propertiesUpdated; |             return propertiesUpdated; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         public List<SceneObjectPartSyncProperties> UpdatePropertiesBySync(SceneObjectPart part, PrimSyncInfo updatedPrimSyncInfo) | ||||||
|  |         { | ||||||
|  |             HashSet<PropertySyncInfo> propertiesSyncInfo = new HashSet<PropertySyncInfo>(updatedPrimSyncInfo.PropertiesSyncInfo.Values); | ||||||
|  |             return UpdatePropertiesBySync(part, propertiesSyncInfo); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Encode the SyncInfo of each property, including its current value  |         /// Encode the SyncInfo of each property, including its current value  | ||||||
|         /// maintained in this SyncModule, its timestamp and syncID. |         /// maintained in this SyncModule, its timestamp and syncID. | ||||||
|  | @ -6464,6 +6713,20 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         public List<SceneObjectPartSyncProperties> UpdatePrimSyncInfoBySync(SceneObjectPart part, PrimSyncInfo updatedPrimSyncInfo) | ||||||
|  |         { | ||||||
|  |             if (m_primsInSync.ContainsKey(part.UUID)) | ||||||
|  |             { | ||||||
|  |                 PrimSyncInfo primSyncInfo = m_primsInSync[part.UUID]; | ||||||
|  |                 return primSyncInfo.UpdatePropertiesBySync(part, updatedPrimSyncInfo); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 //This should not happen, as we should only receive UpdatedPrimProperties after receiving a NewObject message | ||||||
|  |                 m_log.WarnFormat("PrimSyncInfoManager.UpdatePrimSyncInfoBySync: SOP {0},{1} not in local record of PrimSyncInfo.", part.Name, part.UUID); | ||||||
|  |                 return new List<SceneObjectPartSyncProperties>(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         public OSDMap EncodePrimProperties(UUID primUUID, HashSet<SceneObjectPartSyncProperties> updatedProperties) |         public OSDMap EncodePrimProperties(UUID primUUID, HashSet<SceneObjectPartSyncProperties> updatedProperties) | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  | @ -80,13 +80,14 @@ namespace OpenSim.Region.Framework.Interfaces | ||||||
|         //void SendSceneUpdates(); |         //void SendSceneUpdates(); | ||||||
|         void SendNewObject(SceneObjectGroup sog); |         void SendNewObject(SceneObjectGroup sog); | ||||||
|         void SendDeleteObject(SceneObjectGroup sog, bool softDelete); |         void SendDeleteObject(SceneObjectGroup sog, bool softDelete); | ||||||
|  |         void SendLinkObject(SceneObjectGroup linkedGroup, SceneObjectPart root, List<SceneObjectPart> children); | ||||||
|  |         void SendDeLinkObject(List<SceneObjectPart> prims, List<SceneObjectGroup> beforeDelinkGroups, List<SceneObjectGroup> afterDelinkGroups); | ||||||
| 
 | 
 | ||||||
|         //New functions for per property sync'ing |         //New functions for per property sync'ing | ||||||
|         void SyncNewObject(SceneObjectGroup sog); |         void SyncNewObject(SceneObjectGroup sog); | ||||||
|         void SyncDeleteObject(SceneObjectGroup sog, bool softDelete); |         void SyncDeleteObject(SceneObjectGroup sog, bool softDelete); | ||||||
| 
 |         void SyncLinkObject(SceneObjectGroup linkedGroup, SceneObjectPart root, List<SceneObjectPart> children); | ||||||
|         void SendLinkObject(SceneObjectGroup linkedGroup, SceneObjectPart root, List<SceneObjectPart> children); |         void SyncDeLinkObject(List<SceneObjectPart> prims, List<SceneObjectGroup> beforeDelinkGroups, List<SceneObjectGroup> afterDelinkGroups); | ||||||
|         void SendDeLinkObject(List<SceneObjectPart> prims, List<SceneObjectGroup> beforeDelinkGroups, List<SceneObjectGroup> afterDelinkGroups); |  | ||||||
| 
 | 
 | ||||||
|         //In RegionSyncModule's implementation,  |         //In RegionSyncModule's implementation,  | ||||||
|         //The following calls send out a message immediately, w/o putting it in the SyncConnector's outgoing queue. |         //The following calls send out a message immediately, w/o putting it in the SyncConnector's outgoing queue. | ||||||
|  |  | ||||||
|  | @ -830,12 +830,10 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|             m_sceneGraph.LinkObjectsBySync(root, children);  |             m_sceneGraph.LinkObjectsBySync(root, children);  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|             //The properties of the newly linked object should be updated later with another UpdatedObject message.  |             //KittyL 04/19/2011: no longer update properties here, caller will do it | ||||||
| 
 |  | ||||||
|             //Set the property values as in the incoming copy of the object group |             //Set the property values as in the incoming copy of the object group | ||||||
| 
 |             //SceneObjectGroup localGroup = root.ParentGroup; | ||||||
|             SceneObjectGroup localGroup = root.ParentGroup; |             //localGroup.UpdateObjectGroupBySync(linkedGroup); | ||||||
|             localGroup.UpdateObjectGroupBySync(linkedGroup); |  | ||||||
| 
 | 
 | ||||||
|             //debug |             //debug | ||||||
|             /* |             /* | ||||||
|  |  | ||||||
|  | @ -1631,13 +1631,13 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                 parentGroup.TriggerScriptChangedEvent(Changed.LINK); |                 parentGroup.TriggerScriptChangedEvent(Changed.LINK); | ||||||
|                 parentGroup.HasGroupChanged = true; |                 parentGroup.HasGroupChanged = true; | ||||||
| 
 | 
 | ||||||
|                 //SYMMETRIC SYNC |                 //DSG SYNC | ||||||
|                 //Schedule a LinkObject message for synchronization purpose. This will lead to enqueue a LinkObject message in SyncConnector's outgoingQueue, |                 //Send out LinkObject sync messages.  | ||||||
|                 //so should return quickly.  |  | ||||||
|                 if (m_parentScene.RegionSyncModule != null) |                 if (m_parentScene.RegionSyncModule != null) | ||||||
|                 { |                 { | ||||||
|                     //Tell other actors to link the SceneObjectParts together as a new group.  |                     //Tell other actors to link the SceneObjectParts together as a new group.  | ||||||
|                     m_parentScene.RegionSyncModule.SendLinkObject(parentGroup, root, children); |                     //m_parentScene.RegionSyncModule.SendLinkObject(parentGroup, root, children); | ||||||
|  |                     m_parentScene.RegionSyncModule.SyncLinkObject(parentGroup, root, children); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 //Schedule updates as in legacy OpenSim code, to send updates to viewers connected to this actor (at least needed for client managers). |                 //Schedule updates as in legacy OpenSim code, to send updates to viewers connected to this actor (at least needed for client managers). | ||||||
|  | @ -1645,7 +1645,7 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|                 //via the LinkObject message sent above. |                 //via the LinkObject message sent above. | ||||||
|                 parentGroup.ScheduleGroupForFullUpdate_SyncInfoUnchanged(); |                 parentGroup.ScheduleGroupForFullUpdate_SyncInfoUnchanged(); | ||||||
| 
 | 
 | ||||||
|                 //end of SYMMETRIC SYNC |                 //end of DSG SYNC | ||||||
|                  |                  | ||||||
|             } |             } | ||||||
|             finally |             finally | ||||||
|  |  | ||||||
|  | @ -4137,6 +4137,91 @@ namespace OpenSim.Region.Framework.Scenes | ||||||
|              |              | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  |         // Per SOP property based sync | ||||||
|  |         /////////////////////////////////////////////////////////////////////// | ||||||
|  | 
 | ||||||
|  |         /// <summary> | ||||||
|  |         /// Update the existing copy of the object with updated properties in 'updatedSog'.  | ||||||
|  |         /// </summary> | ||||||
|  |         /// <param name="updatedSog"></param> | ||||||
|  |         /// <returns></returns> | ||||||
|  |         public Scene.ObjectUpdateResult UpdateSOGBySync(SceneObjectGroup updatedSog) | ||||||
|  |         { | ||||||
|  |             //This GroupID check should be done by the actor who initiates the object update | ||||||
|  |             //if (!this.GroupID.Equals(updatedSog.GroupID)) | ||||||
|  |             //    return Scene.ObjectUpdateResult.Error; | ||||||
|  | 
 | ||||||
|  |             //////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|  |             //NOTE!!!  | ||||||
|  |             //We do not want to simply call SceneObjectGroup.Copy here to clone the object:  | ||||||
|  |             //the prims (SceneObjectParts) in updatedSog are different instances than those in the local copy, | ||||||
|  |             //and we want to preserve the references to the prims in this local copy, especially for scripts  | ||||||
|  |             //of each prim, where the scripts have references to the local copy. If the local copy is replaced, | ||||||
|  |             //the prims (parts) will be replaces and we need to update all the references that were pointing to  | ||||||
|  |             //the previous prims. | ||||||
|  |             //////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | 
 | ||||||
|  |             Scene.ObjectUpdateResult groupUpdateResult = Scene.ObjectUpdateResult.Unchanged; | ||||||
|  |             Dictionary<UUID, SceneObjectPart> updatedParts = new Dictionary<UUID, SceneObjectPart>(); | ||||||
|  | 
 | ||||||
|  |             lock (m_parts.SyncRoot) | ||||||
|  |             { | ||||||
|  |                 //This function is called by LinkObjectBySync and DelinkObjectBySinc(), | ||||||
|  |                 //which should have updated the parts in this SOG, hence should be no need to  | ||||||
|  |                 //add or remove parts to sync | ||||||
|  | 
 | ||||||
|  |                 if (this.PrimCount != updatedSog.PrimCount) | ||||||
|  |                 { | ||||||
|  |                     m_log.WarnFormat("UpdateSOGBySync: For SOP {0}, local copy has {1} parts, while incoming updated copy has {2} parts. Inconsistent.", this.UUID, | ||||||
|  |                         this.PrimCount, updatedSog.PrimCount); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 //now update properties of the parts | ||||||
|  |                 foreach (SceneObjectPart part in this.Parts) | ||||||
|  |                 { | ||||||
|  |                     Scene.ObjectUpdateResult partUpdateResult = Scene.ObjectUpdateResult.Unchanged; | ||||||
|  |                     SceneObjectPart updatedPart = updatedSog.GetChildPart(part.UUID); | ||||||
|  | 
 | ||||||
|  |                     if (updatedPart == null) | ||||||
|  |                     { | ||||||
|  |                         m_log.WarnFormat("UpdateSOGBySync: part {0},{1} exists in local copy, not in incoming updated copy", part.Name, part.UUID); | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         partUpdateResult = part.UpdateAllProperties(updatedPart); | ||||||
|  | 
 | ||||||
|  |                         if (partUpdateResult != Scene.ObjectUpdateResult.Unchanged) | ||||||
|  |                         { | ||||||
|  |                             groupUpdateResult = partUpdateResult; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 //Just to make sure the parts each has the right localID of the rootpart | ||||||
|  |                 UpdateParentIDs(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //Schedule updates to be sent out, if the local copy has just been updated | ||||||
|  |             //(1) if we are debugging the actor with a viewer attaching to it, | ||||||
|  |             //we need to schedule updates to be sent to the viewer. | ||||||
|  |             //(2) or if we are a relaying node to relay updates, we need to forward the updates. | ||||||
|  |             //NOTE: LastUpdateTimeStamp and LastUpdateActorID should be kept the same as in the received copy of the object. | ||||||
|  |             if (groupUpdateResult == Scene.ObjectUpdateResult.Updated) | ||||||
|  |             { | ||||||
|  |                 ScheduleGroupForFullUpdate_SyncInfoUnchanged(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             //debug the update result | ||||||
|  |             if (groupUpdateResult == Scene.ObjectUpdateResult.Updated) | ||||||
|  |             { | ||||||
|  |                 DebugObjectUpdateResult(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             return groupUpdateResult; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|         #endregion |         #endregion | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Huaiyu (Kitty) Liu
						Huaiyu (Kitty) Liu