Removed BucketSync code from RegionSyncModule.
							parent
							
								
									7aaacbc4a6
								
							
						
					
					
						commit
						ba948251fe
					
				|  | @ -84,9 +84,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             m_isSyncRelay = m_sysConfig.GetBoolean("IsSyncRelay", false); | ||||
|             m_isSyncListenerLocal = m_sysConfig.GetBoolean("IsSyncListenerLocal", false); | ||||
| 
 | ||||
|             //Setup the PropertyBucketMap  | ||||
|             PopulatePropertyBucketMap(m_sysConfig); | ||||
| 
 | ||||
|             m_active = true; | ||||
| 
 | ||||
|             LogHeader += "-Actor " + m_actorID; | ||||
|  | @ -737,24 +734,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             m_log.Warn("[REGION SYNC MODULE]: StatsTimerElapsed -- NOT yet implemented."); | ||||
|         } | ||||
| 
 | ||||
|         private SymmetricSyncMessage CreateNewObjectMessage(SceneObjectGroup sog) | ||||
|         { | ||||
|             OSDMap data = new OSDMap(); | ||||
|             string sogxml = SceneObjectSerializer.ToXml2Format(sog); | ||||
|             data["sogxml"] = OSD.FromString(sogxml); | ||||
|             OSDArray partArray = new OSDArray(); | ||||
|             foreach (SceneObjectPart part in sog.Parts) | ||||
|             { | ||||
|                 OSDMap partData = PhysicsBucketPropertiesEncoder(m_physicsBucketName, part); | ||||
|                 partArray.Add(partData); | ||||
|             } | ||||
|             data["partPhysicsProperties"] = partArray; | ||||
|             //string sogxml = SceneObjectSerializer.ToXml2Format(sog); | ||||
|             SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.NewObject, OSDParser.SerializeJsonString(data)); | ||||
| 
 | ||||
|             return rsm; | ||||
|         } | ||||
| 
 | ||||
|         private void HandleGetTerrainRequest(SyncConnector connector) | ||||
|         { | ||||
|             string msgData = m_scene.Heightmap.SaveToXmlString(); | ||||
|  | @ -796,499 +775,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         //Read in configuration for which property-bucket each property belongs to, and the description of each bucket | ||||
|         private void PopulatePropertyBucketMap(IConfig config) | ||||
|         { | ||||
|             //We start with a default bucket map. Will add the code to read in configuration from config files later. | ||||
|             PopulatePropertyBuketMapByDefault(); | ||||
| 
 | ||||
|             //Pass the bucket information to SceneObjectPart. | ||||
|             SceneObjectPart.InitializePropertyBucketInfo(m_primPropertyBucketMap, m_propertyBucketNames, m_actorID); | ||||
|         } | ||||
| 
 | ||||
|         #region Bucket specific sender/receiver, encoder/decoder | ||||
|         //////////////////////////////////////////////////////////////////////// | ||||
|         // These are bucket specific functions, hence are "hard-coded", that is, | ||||
|         // they each undestand the particular bucket it operates for. | ||||
|         //  | ||||
|         // Each encoder should encode properties in OSDMap, and besides | ||||
|         // properties, encode two more items:  | ||||
|         // Bucket -- bucket's name, | ||||
|         // GroupPostiion -- the object group or object part's group position, | ||||
|         //                  which is used to identify which quark an object | ||||
|         //                  group/part belongs to. | ||||
|         // The encoder needs to convert positions from local to global coordinates, | ||||
|         // if necessary (client manager needs to). | ||||
|         // | ||||
|         // Each receiver should check if the object/prim's group position is  | ||||
|         // within local sync quarks' space. If not, ignore the sync message. | ||||
|         // Otherwise, it calls decoder to decode the properties. | ||||
|         // | ||||
|         // Each decoder need to convert the coordicates if necessary (only client | ||||
|         // manager needs to register for the conversion handler). | ||||
|         //////////////////////////////////////////////////////////////////////// | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Decode and construct SceneObjectGroup, convert the coordinates of Position | ||||
|         /// properties if necessary (from global to local). | ||||
|         /// </summary> | ||||
|         /// <param name="sogxml"></param> | ||||
|         /// <param name="inLocalQuarks">indicates if the constructed SOG resides in the Sync Quarks</param> | ||||
|         /// <returns></returns> | ||||
|         // private SceneObjectGroup DecodeSceneObjectGroup(string sogxml, out bool inLocalQuarks) | ||||
|         private SceneObjectGroup DecodeSceneObjectGroup(string sogxml) | ||||
|         { | ||||
|             SceneObjectGroup sog = SceneObjectSerializer.FromXml2Format(sogxml); | ||||
| 
 | ||||
|             return sog; | ||||
|         } | ||||
| 
 | ||||
|         /////////////////////////////////////////////////////////////////////// | ||||
|         //Legacy implementation of NewObject encoder/decoder for bucket-based | ||||
|         //sync protocol. | ||||
|         /////////////////////////////////////////////////////////////////////// | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Encode all properties of an object. Assumption: no matter how many | ||||
|         /// buckets are designed, there is always a "General" bucket that contains | ||||
|         /// non-actor specific properties. | ||||
|         /// The encoding include the sogxml of the object as serialized by  | ||||
|         /// SceneObjectSerializer, and encoding of properties in all buckets other | ||||
|         /// than "General" bucket. | ||||
|         /// </summary> | ||||
|         /// <param name="sog"></param> | ||||
|         /// <returns></returns> | ||||
|         private SymmetricSyncMessage NewObjectMessageEncoder(SceneObjectGroup sog) | ||||
|         { | ||||
|             OSDMap data = new OSDMap(); | ||||
|             string sogxml = SceneObjectSerializer.ToXml2Format(sog); | ||||
|             data["SogXml"] = OSD.FromString(sogxml); | ||||
| 
 | ||||
|             //convert the coordinates if necessary | ||||
|             Vector3 globalPos = sog.AbsolutePosition; | ||||
|             data["GroupPosition"] = OSDMap.FromVector3(globalPos); | ||||
| 
 | ||||
|             foreach (string bucketName in m_propertyBucketNames) | ||||
|             { | ||||
|                 //We assume there is always a General bucket, and properties in it  | ||||
|                 //are covered in the xml serialization above | ||||
|                 if (bucketName.Equals(m_generalBucketName)) | ||||
|                     continue; | ||||
| 
 | ||||
|                 OSDArray partArray = new OSDArray(); | ||||
|                 foreach (SceneObjectPart part in sog.Parts) | ||||
|                 { | ||||
|                     OSDMap partData = m_updatePerBucketEncoder[bucketName](bucketName, (Object)part); | ||||
|                     partArray.Add(partData); | ||||
|                 } | ||||
|                 data[bucketName] = partArray; | ||||
|             } | ||||
|             //string sogxml = SceneObjectSerializer.ToXml2Format(sog); | ||||
|             SymmetricSyncMessage rsm = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.NewObject, OSDParser.SerializeJsonString(data)); | ||||
| 
 | ||||
|             //SYNC DEBUG | ||||
|             //m_log.DebugFormat("{0}: Created a NewObject message for {1},{2}, at pos {3}", LogHeader, sog.Name, sog.UUID, globalPos); | ||||
| 
 | ||||
|             return rsm; | ||||
|         } | ||||
| 
 | ||||
|         private void NewObjectMessageDecoder(OSDMap data, out Object group) | ||||
|         { | ||||
|             //First, create the object group and add it to Scene | ||||
|             string sogxml = data["SogXml"].AsString(); | ||||
|             Vector3 globalPos = data["GroupPosition"].AsVector3(); | ||||
|             SceneObjectGroup sog = DecodeSceneObjectGroup(sogxml); | ||||
| 
 | ||||
|             //Convert the coordinates if necessary | ||||
|             Vector3 localPos = globalPos; | ||||
| 
 | ||||
|             sog.AbsolutePosition = localPos; | ||||
| 
 | ||||
|             //TEMP DEBUG | ||||
|             //m_log.DebugFormat("{0}: received NewObject sync message for object {1}, {2} at pos {3}", LogHeader, sog.Name, sog.UUID, sog.AbsolutePosition.ToString()); | ||||
| 
 | ||||
|             Scene.ObjectUpdateResult updateResult = m_scene.AddNewSceneObjectBySync(sog); | ||||
| 
 | ||||
|             //Second, for each prim in the object, update the properties in buckets | ||||
|             //other than the General bucket | ||||
|             foreach (string bucketName in m_propertyBucketNames) | ||||
|             { | ||||
|                 if (bucketName.Equals(m_generalBucketName)) | ||||
|                     continue; | ||||
| 
 | ||||
|                 if (!data.ContainsKey(bucketName)) | ||||
|                 { | ||||
|                     m_log.WarnFormat("{0}: On receiving NewObject, no properties in bucket {1} are included", LogHeader, bucketName); | ||||
|                     continue; | ||||
|                 } | ||||
| 
 | ||||
|                 OSDArray partDataArray = (OSDArray)data[bucketName]; | ||||
| 
 | ||||
|                 for (int i = 0; i < partDataArray.Count; i++) | ||||
|                 { | ||||
|                     OSDMap partData = (OSDMap)partDataArray[i]; | ||||
| 
 | ||||
|                     m_primUpdatesPerBucketReceiver[bucketName](bucketName, partData); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             group = (Object)sog; | ||||
|         } | ||||
| 
 | ||||
|         //As of current version, we still use the xml serialization as most of SOP's properties are in the General bucket. | ||||
|         //Going forward, we may serialize the properties differently, e.g. using OSDMap  | ||||
|         private void PrimUpdatesGeneralBucketSender(string bucketName, List<SceneObjectPart> primUpdates) | ||||
|         { | ||||
|             Dictionary<UUID, SceneObjectGroup> updatedObjects = new Dictionary<UUID, SceneObjectGroup>(); | ||||
|             foreach (SceneObjectPart part in primUpdates) | ||||
|             { | ||||
|                 if (!part.ParentGroup.IsDeleted) | ||||
|                     updatedObjects[part.ParentGroup.UUID] = part.ParentGroup; | ||||
|             } | ||||
|             long timeStamp = DateTime.Now.Ticks; | ||||
|             foreach (SceneObjectGroup sog in updatedObjects.Values) | ||||
|             { | ||||
|                 sog.UpdateTaintedBucketSyncInfo(bucketName, timeStamp); //this update the timestamp and clear the taint info of the bucket | ||||
|                 //string sogGeneralBucketEncoding = SceneObjectSerializer.ToXml2Format(sog); | ||||
|                 //SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedObject, sogGeneralBucketEncoding); | ||||
| 
 | ||||
|                 OSDMap data = GeneralBucketPropertiesEncoder(bucketName, sog); | ||||
|                 SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedObject, OSDParser.SerializeJsonString(data)); | ||||
| 
 | ||||
|                 lock (m_stats) m_statSOGBucketOut++; | ||||
| 
 | ||||
|                 //TEMP SYNC DEBUG | ||||
|                 //m_log.DebugFormat(LogHeader + " calling SendObjectUpdateToRelevantSyncConnectors for general bucket for sog {0},{1}", sog.Name, sog.UUID); | ||||
| 
 | ||||
|                 SendObjectUpdateToRelevantSyncConnectors(sog, syncMsg); | ||||
| 
 | ||||
|                 //clear the taints | ||||
|                 foreach (SceneObjectPart part in sog.Parts) | ||||
|                 { | ||||
|                     part.BucketSyncInfoList[bucketName].ClearBucketTaintBySync(); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             //UpdateBucektLastSentTime(bucketName, timeStamp); | ||||
|         } | ||||
| 
 | ||||
|         private void PrimUpdatesGeneralBucketReceiver(string bucketName, OSDMap data) | ||||
|         { | ||||
|             lock (m_stats) m_statSOGBucketIn++; | ||||
| 
 | ||||
|             if (!data.ContainsKey("GroupPosition")) | ||||
|             { | ||||
|                 m_log.WarnFormat("{0}: PrimUpdatesGeneralBucketReceiver -- no GroupPosition is provided in the received update message"); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             //Check the object/prim's position, if outside of local quarks, ignore the update. | ||||
|             Vector3 groupPosition = data["GroupPosition"].AsVector3(); | ||||
|             /* | ||||
|             if (!m_syncQuarkManager.IsPosInSyncQuarks(groupPosition)) | ||||
|             { | ||||
|                 m_log.WarnFormat("{0}: Received a {1} bucket update for object at pos {2}, OUT OF local quarks", LogHeader, bucketName, groupPosition.ToString()); | ||||
|                 return; | ||||
|             } | ||||
|              * */  | ||||
| 
 | ||||
|             //TEMP SYNC DEBUG | ||||
|             //m_log.DebugFormat("{0}: PrimUpdatesGeneralBucketReceiver called, for update at GroupPosition {1}", LogHeader, groupPosition.ToString()); | ||||
| 
 | ||||
|             Object ret; | ||||
|             GeneralBucketPropertiesDecoder(bucketName, data, out ret); | ||||
| 
 | ||||
|             SceneObjectGroup sog; | ||||
|             if (ret is SceneObjectGroup && ret != null) | ||||
|             { | ||||
|                 sog = (SceneObjectGroup)ret; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 m_log.DebugFormat("{0}: Error in GeneralBucketPropertiesDecoder.", LogHeader); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             if (sog.IsDeleted) | ||||
|             { | ||||
|                 m_log.DebugFormat("{0}: Ignoring update on deleted object, Name: {1}, UUID: {2}.", LogHeader, sog.Name, sog.UUID); | ||||
|                 return; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 //TEMP SYNC DEBUG | ||||
|                 //m_log.DebugFormat("{0}: UpdateObjectBySynchronization to be called for: sog {1}, {2}, at post {3}", LogHeader, sog.Name, sog.UUID, sog.AbsolutePosition); | ||||
| 
 | ||||
|                 Scene.ObjectUpdateResult updateResult = m_scene.UpdateObjectBySynchronization(sog); | ||||
| 
 | ||||
|                 /* | ||||
|                 switch (updateResult) | ||||
|                 { | ||||
|                     case Scene.ObjectUpdateResult.New: | ||||
|                         m_log.DebugFormat("[{0} Object \"{1}\" ({1}) ({2}) added.", LogHeader, sog.Name, sog.UUID.ToString(), sog.LocalId.ToString()); | ||||
|                         break; | ||||
|                     case Scene.ObjectUpdateResult.Updated: | ||||
|                         m_log.DebugFormat("[{0} Object \"{1}\" ({1}) ({2}) updated.", LogHeader, sog.Name, sog.UUID.ToString(), sog.LocalId.ToString()); | ||||
|                         break; | ||||
|                     case Scene.ObjectUpdateResult.Error: | ||||
|                         m_log.WarnFormat("[{0} Object \"{1}\" ({1}) ({2}) -- add or update ERROR.", LogHeader, sog.Name, sog.UUID.ToString(), sog.LocalId.ToString()); | ||||
|                         break; | ||||
|                     case Scene.ObjectUpdateResult.Unchanged: | ||||
|                         //m_log.DebugFormat("[{0} Object \"{1}\" ({1}) ({2}) unchanged after receiving an update.", LogHeader, sog.Name, sog.UUID.ToString(), sog.LocalId.ToString()); | ||||
|                         break; | ||||
|                 } | ||||
|                  * */ | ||||
| 
 | ||||
|                 //TEMP SYNC DEBUG | ||||
|                // m_log.DebugFormat("{0}: end of processing UpdatedObject {4} bucket, for object {1}, {2}, at pos {3}", LogHeader, sog.Name, | ||||
|                //     sog.UUID, sog.AbsolutePosition, bucketName); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Encode the properties of a given object(group) into string, to be  | ||||
|         /// included in an outgoing sync message. | ||||
|         /// </summary> | ||||
|         /// <param name="bucketName"></param> | ||||
|         /// <param name="sog"></param> | ||||
|         /// <returns></returns> | ||||
|         private OSDMap GeneralBucketPropertiesEncoder(string bucketName, Object group) | ||||
|         { | ||||
|             OSDMap data = new OSDMap(); | ||||
| 
 | ||||
|             SceneObjectGroup sog; | ||||
|             if (group is SceneObjectGroup) | ||||
|             { | ||||
|                 sog = (SceneObjectGroup)group; | ||||
|             } | ||||
|             else | ||||
|                 return data; | ||||
| 
 | ||||
|             string sogxml = SceneObjectSerializer.ToXml2Format(sog); | ||||
|             data["Bucket"] = OSDMap.FromString(bucketName); | ||||
|             data["SogXml"] = OSDMap.FromString(sogxml); | ||||
| 
 | ||||
|             //convert the coordinates if necessary | ||||
|             Vector3 globalPos = sog.AbsolutePosition; | ||||
|             /* | ||||
|             if (CoordinatesConversionHandler != null) | ||||
|             { | ||||
|                 bool inComingMsg = false; | ||||
|                 globalPos = CoordinatesConversionHandler(globalPos, inComingMsg); | ||||
|             } | ||||
|              * */  | ||||
| 
 | ||||
|             data["GroupPosition"] = OSDMap.FromVector3(globalPos); | ||||
| 
 | ||||
|             //TEMP DEBUG | ||||
|             //m_log.Debug(LogHeader + " GeneralBucketPropertiesEncoder for " + sog.Name + "," + sog.UUID + ". GlobalPos: " + globalPos.ToString()); | ||||
| 
 | ||||
|             return data; | ||||
|         } | ||||
| 
 | ||||
|         private void GeneralBucketPropertiesDecoder(string bucketName, OSDMap data, out Object group) | ||||
|         { | ||||
|             group = null; | ||||
|             if (!data.ContainsKey("SogXml") || !data.ContainsKey("GroupPosition")) | ||||
|             { | ||||
|                 m_log.WarnFormat("{0}: GeneralBucketPropertiesDecoder -- Either SogXml or GroupPosition is missing in the received update message"); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             string sogxml = data["SogXml"].AsString(); | ||||
|             Vector3 globalPos = data["GroupPosition"].AsVector3(); | ||||
| 
 | ||||
|             SceneObjectGroup sog = SceneObjectSerializer.FromXml2Format(sogxml); | ||||
| 
 | ||||
|             /* | ||||
|             if (CoordinatesConversionHandler != null) | ||||
|             { | ||||
|                 bool inComingMsg = true; | ||||
|                 sog.AbsolutePosition = CoordinatesConversionHandler(globalPos, inComingMsg); | ||||
|             } | ||||
|              * */  | ||||
| 
 | ||||
|             group = sog; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         private void PrimUpdatesPhysicsBucketSender(string bucketName, List<SceneObjectPart> primUpdates) | ||||
|         { | ||||
|             foreach (SceneObjectPart updatedPart in primUpdates) | ||||
|             { | ||||
|                 if (updatedPart.ParentGroup.IsDeleted) | ||||
|                     continue; | ||||
| 
 | ||||
|                 updatedPart.UpdateTaintedBucketSyncInfo(bucketName, DateTime.Now.Ticks); | ||||
| 
 | ||||
|                 //string partPhysicsBucketEncoding = PhysicsBucketPropertiesEncoder(bucketName, updatedPart); | ||||
|                 OSDMap partData = PhysicsBucketPropertiesEncoder(bucketName, updatedPart); | ||||
|                 //SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedBucketProperties, OSDParser.SerializeJsonString(partData)); | ||||
|                 SymmetricSyncMessage syncMsg = new SymmetricSyncMessage(SymmetricSyncMessage.MsgType.UpdatedObject, OSDParser.SerializeJsonString(partData)); | ||||
| 
 | ||||
|                 lock (m_stats) m_statPhysBucketOut++; | ||||
|                 SendPrimUpdateToRelevantSyncConnectors(updatedPart, syncMsg, updatedPart.BucketSyncInfoList[bucketName].LastUpdateActorID); | ||||
| 
 | ||||
|                 //clear the taints | ||||
|                 updatedPart.BucketSyncInfoList[bucketName].ClearBucketTaintBySync(); | ||||
|             } | ||||
| 
 | ||||
|             //UpdateBucektLastSentTime(bucketName); | ||||
|         } | ||||
| 
 | ||||
|         private void PrimUpdatesPhysicsBucketReceiver(string bucketName, OSDMap data) | ||||
|         { | ||||
|             lock (m_stats) m_statPhysBucketIn++; | ||||
| 
 | ||||
|             if (!data.ContainsKey("GroupPosition")) | ||||
|             { | ||||
|                 m_log.WarnFormat("{0}: PrimUpdatesGeneralBucketReceiver -- no GroupPosition is provided in the received update message"); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             //check the object/prim's position, if outside of local quarks, ignore it | ||||
|             Vector3 groupPosition = data["GroupPosition"].AsVector3(); | ||||
|             /* | ||||
|             if (!m_syncQuarkManager.IsPosInSyncQuarks(groupPosition)) | ||||
|             { | ||||
|                 m_log.WarnFormat("{0}: Received a {1} bucket update for object at pos {2}, OUT OF local quarks", LogHeader, bucketName, groupPosition.ToString()); | ||||
|                 return; | ||||
|             } | ||||
|              * */ | ||||
| 
 | ||||
|             //TEMP SYNC DEBUG | ||||
|             //m_log.DebugFormat("{0}: PrimUpdatesPhysicsBucketReceiver called, for update at GroupPosition {1}", LogHeader, groupPosition.ToString()); | ||||
| 
 | ||||
|             Object ret; | ||||
|             PhysicsBucketPropertiesDecoder(bucketName, data, out ret); | ||||
| 
 | ||||
|             OSDMap recvData; | ||||
|             if (ret is OSDMap && ret != null) | ||||
|             { | ||||
|                 recvData = (OSDMap)ret; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 m_log.DebugFormat("{0}: Error in PhysicsBucketPropertiesDecoder.", LogHeader); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             UUID partUUID = data["UUID"].AsUUID(); | ||||
| 
 | ||||
| 
 | ||||
|             BucketSyncInfo rBucketSyncInfo = new BucketSyncInfo(bucketName); | ||||
|             rBucketSyncInfo.LastUpdateTimeStamp = data["LastUpdateTimeStamp"].AsLong(); | ||||
|             rBucketSyncInfo.LastUpdateActorID = data["LastUpdateActorID"].AsString(); | ||||
| 
 | ||||
|             m_scene.UpdateObjectPartBucketProperties(bucketName, partUUID, data, rBucketSyncInfo); | ||||
| 
 | ||||
|             //TEMP SYNC DEBUG | ||||
|             SceneObjectPart localPart = m_scene.GetSceneObjectPart(partUUID); | ||||
|             //m_log.DebugFormat("{0}: end of processing UpdatedObject {4} bucket, for part {1}, {2}, at group pos {3}", LogHeader, localPart.Name, | ||||
|             // localPart.UUID, localPart.GroupPosition, bucketName); | ||||
|         } | ||||
| 
 | ||||
|         private OSDMap PhysicsBucketPropertiesEncoder(string bucketName, Object part) | ||||
|         { | ||||
|             OSDMap data = new OSDMap(); | ||||
| 
 | ||||
|             SceneObjectPart updatedPart; | ||||
|             if (part is SceneObjectPart) | ||||
|             { | ||||
|                 updatedPart = (SceneObjectPart)part; | ||||
|             } | ||||
|             else | ||||
|                 return data; | ||||
| 
 | ||||
| 
 | ||||
|             data["Bucket"] = OSD.FromString(bucketName); | ||||
| 
 | ||||
|             //Convert GroupPosition if necessary | ||||
|             Vector3 globalGroupPos = updatedPart.GroupPosition; | ||||
|             /* | ||||
|             if (CoordinatesConversionHandler != null) | ||||
|             { | ||||
|                 bool inComingMsg = false; | ||||
|                 globalGroupPos = CoordinatesConversionHandler(globalGroupPos, inComingMsg); | ||||
|             } | ||||
|              * */  | ||||
|             data["GroupPosition"] = OSDMap.FromVector3(globalGroupPos); //This records the global GroupPosition. | ||||
| 
 | ||||
|             data["UUID"] = OSD.FromUUID(updatedPart.UUID); | ||||
|             data["OffsetPosition"] = OSD.FromVector3(updatedPart.OffsetPosition); | ||||
|             data["Scale"] = OSD.FromVector3(updatedPart.Scale); | ||||
|             data["AngularVelocity"] = OSD.FromVector3(updatedPart.AngularVelocity); | ||||
|             data["RotationOffset"] = OSD.FromQuaternion(updatedPart.RotationOffset); | ||||
| 
 | ||||
|             Physics.Manager.PhysicsActor pa = updatedPart.PhysActor; | ||||
|             if (pa != null) | ||||
|             { | ||||
| 
 | ||||
|                 //Convert Position if necessary | ||||
|                 Vector3 globalPos = pa.Position; | ||||
|                 /* | ||||
|                 if (CoordinatesConversionHandler != null) | ||||
|                 { | ||||
|                     bool inComingMsg = false; | ||||
|                     globalPos = CoordinatesConversionHandler(globalPos, inComingMsg); | ||||
|                 } | ||||
|                  * */ | ||||
|                 data["Position"] = OSDMap.FromVector3(globalPos); //This records the global GroupPosition.  | ||||
| 
 | ||||
|                 data["Size"] = OSD.FromVector3(pa.Size); | ||||
|                 //data["Position"] = OSD.FromVector3(pa.Position); | ||||
|                 data["Force"] = OSD.FromVector3(pa.Force); | ||||
|                 data["Velocity"] = OSD.FromVector3(pa.Velocity); | ||||
|                 data["RotationalVelocity"] = OSD.FromVector3(pa.RotationalVelocity); | ||||
|                 data["PA_Acceleration"] = OSD.FromVector3(pa.Acceleration); | ||||
|                 data["Torque"] = OSD.FromVector3(pa.Torque); | ||||
|                 data["Orientation"] = OSD.FromQuaternion(pa.Orientation); | ||||
|                 data["IsPhysical"] = OSD.FromBoolean(pa.IsPhysical); | ||||
|                 data["Flying"] = OSD.FromBoolean(pa.Flying); | ||||
|                 data["Kinematic"] = OSD.FromBoolean(pa.Kinematic); | ||||
|                 data["Buoyancy"] = OSD.FromReal(pa.Buoyancy); | ||||
|                 data["CollidingGround"] = OSD.FromBoolean(pa.CollidingGround); | ||||
|                 data["IsColliding"] = OSD.FromBoolean(pa.IsColliding); | ||||
| 
 | ||||
|                 //m_log.DebugFormat("{0}: PhysBucketSender for {1}, pos={2}", LogHeader, updatedPart.UUID.ToString(), pa.Position.ToString()); | ||||
|             } | ||||
| 
 | ||||
|             data["LastUpdateTimeStamp"] = OSD.FromLong(updatedPart.BucketSyncInfoList[bucketName].LastUpdateTimeStamp); | ||||
|             data["LastUpdateActorID"] = OSD.FromString(updatedPart.BucketSyncInfoList[bucketName].LastUpdateActorID); | ||||
| 
 | ||||
|             return data; | ||||
|         } | ||||
| 
 | ||||
|         private void PhysicsBucketPropertiesDecoder(string bucketName, OSDMap msgData, out Object data) | ||||
|         { | ||||
|             /* | ||||
|             if (msgData.ContainsKey("GroupPosition")) | ||||
|             { | ||||
|                 if (CoordinatesConversionHandler != null) | ||||
|                 { | ||||
|                     bool inComingMsg = true; | ||||
|                     Vector3 globalGroupPos = msgData["GroupPosition"].AsVector3(); | ||||
|                     msgData["GroupPosition"] = OSDMap.FromVector3(CoordinatesConversionHandler(globalGroupPos, inComingMsg)); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if (msgData.ContainsKey("Position")) | ||||
|             { | ||||
|                 if (CoordinatesConversionHandler != null) | ||||
|                 { | ||||
|                     bool inComingMsg = true; | ||||
|                     Vector3 globalPos = msgData["Position"].AsVector3(); | ||||
|                     msgData["Position"] = OSDMap.FromVector3(CoordinatesConversionHandler(globalPos, inComingMsg)); | ||||
|                 } | ||||
|             } | ||||
|              * */  | ||||
| 
 | ||||
|             data = (Object)msgData; | ||||
|         } | ||||
| 
 | ||||
|         #endregion //Bucket specific sender/receiver, encoder/decoder | ||||
| 
 | ||||
|         private bool HaveUpdatesToSendoutForSync(SceneObjectPart part, string bucketName) | ||||
|         { | ||||
|  | @ -1302,76 +788,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         //by default, there are two property buckets: the "General" bucket and the "Physics" bucket. | ||||
|         private string m_generalBucketName = "General"; | ||||
|         private string m_physicsBucketName = "Physics"; | ||||
|         //If nothing configured in the config file, this is the default settings for grouping properties into different bucket | ||||
|         private void PopulatePropertyBuketMapByDefault() | ||||
|         { | ||||
| 
 | ||||
|             m_propertyBucketNames.Add(m_generalBucketName); | ||||
|             m_propertyBucketNames.Add(m_physicsBucketName); | ||||
|             m_maxNumOfPropertyBuckets = m_propertyBucketNames.Count; | ||||
| 
 | ||||
|             //Linking each bucket with the sender/receiver function for sending/receiving an update message | ||||
|             m_primUpdatesPerBucketSender.Add(m_generalBucketName, PrimUpdatesGeneralBucketSender); | ||||
|             m_primUpdatesPerBucketSender.Add(m_physicsBucketName, PrimUpdatesPhysicsBucketSender); | ||||
| 
 | ||||
|             m_primUpdatesPerBucketReceiver.Add(m_generalBucketName, PrimUpdatesGeneralBucketReceiver); | ||||
|             m_primUpdatesPerBucketReceiver.Add(m_physicsBucketName, PrimUpdatesPhysicsBucketReceiver); | ||||
| 
 | ||||
|             //Linking each bucket with the encoder/decoder functions that encode/decode the properties in the bucket  | ||||
|             m_updatePerBucketEncoder.Add(m_generalBucketName, GeneralBucketPropertiesEncoder); | ||||
|             m_updatePerBucketEncoder.Add(m_physicsBucketName, PhysicsBucketPropertiesEncoder); | ||||
| 
 | ||||
|             m_updatePerBucketDecoder.Add(m_generalBucketName, GeneralBucketPropertiesDecoder); | ||||
|             m_updatePerBucketDecoder.Add(m_physicsBucketName, PhysicsBucketPropertiesDecoder); | ||||
|              | ||||
| 
 | ||||
|             //m_lastUpdateSentTime.Add("General", 0); | ||||
|             //m_lastUpdateSentTime.Add("Physics", 0); | ||||
| 
 | ||||
|             //Mapping properties to buckets. | ||||
|             foreach (SceneObjectPartSyncProperties property in Enum.GetValues(typeof(SceneObjectPartSyncProperties))) | ||||
|             { | ||||
|                 switch (property) | ||||
|                 { | ||||
|                     case SceneObjectPartSyncProperties.GroupPosition: | ||||
|                     case SceneObjectPartSyncProperties.OffsetPosition: | ||||
|                     case SceneObjectPartSyncProperties.Scale: | ||||
|                     case SceneObjectPartSyncProperties.AngularVelocity: | ||||
|                     case SceneObjectPartSyncProperties.RotationOffset: | ||||
|                     case SceneObjectPartSyncProperties.Size: | ||||
|                     case SceneObjectPartSyncProperties.Position: | ||||
|                     case SceneObjectPartSyncProperties.Force: | ||||
|                     case SceneObjectPartSyncProperties.Velocity: | ||||
|                     case SceneObjectPartSyncProperties.RotationalVelocity: | ||||
|                     case SceneObjectPartSyncProperties.PA_Acceleration: | ||||
|                     case SceneObjectPartSyncProperties.Torque: | ||||
|                     case SceneObjectPartSyncProperties.Orientation: | ||||
|                     case SceneObjectPartSyncProperties.IsPhysical: | ||||
|                     case SceneObjectPartSyncProperties.Flying: | ||||
|                     case SceneObjectPartSyncProperties.Kinematic: | ||||
|                     case SceneObjectPartSyncProperties.Buoyancy: | ||||
|                     case SceneObjectPartSyncProperties.CollidingGround: | ||||
|                     case SceneObjectPartSyncProperties.IsColliding: | ||||
|                         m_primPropertyBucketMap.Add(property, m_physicsBucketName); | ||||
|                         break; | ||||
|                     default: | ||||
|                         //all other properties belong to the "General" bucket. | ||||
|                         m_primPropertyBucketMap.Add(property, m_generalBucketName); | ||||
|                         break; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             //create different lists to keep track which SOP has what properties updated (which bucket of properties) | ||||
|             foreach (string bucketName in m_propertyBucketNames) | ||||
|             { | ||||
|                 m_primUpdates.Add(bucketName, new Dictionary<UUID, SceneObjectPart>()); | ||||
|                 m_primUpdateLocks.Add(bucketName, new Object()); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private bool IsSyncingWithOtherSyncNodes() | ||||
|         { | ||||
|             return (m_syncConnectors.Count > 0); | ||||
|  | @ -1484,36 +900,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Check if we need to send out an update message for the given object. For now, we have a very inefficient solution: | ||||
|         /// If any synchronization bucket in any part shows a property in that bucket has changed, we'll serialize and ship the whole object. | ||||
|         /// </summary> | ||||
|         /// <param name="sog"></param> | ||||
|         /// <returns></returns> | ||||
|         private bool CheckObjectForSendingUpdate(SceneObjectGroup sog) | ||||
|         { | ||||
|             //If any part in the object has the last update caused by this actor itself, then send the update | ||||
|             foreach (SceneObjectPart part in sog.Parts) | ||||
|             { | ||||
|                 /* | ||||
|                 if (!part.LastUpdateActorID.Equals(m_actorID)) | ||||
|                 { | ||||
|                     return true; | ||||
|                 } | ||||
|                  * */  | ||||
|                   | ||||
|                 foreach (KeyValuePair<string, BucketSyncInfo> pair in part.BucketSyncInfoList) | ||||
|                 { | ||||
|                     if (pair.Value.LastUpdateActorID.Equals(m_actorID)) | ||||
|                     { | ||||
|                         return true; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Get the set of SyncConnectors to send updates of the given object.  | ||||
|         /// </summary> | ||||
|  | @ -1530,7 +916,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                 //in other parts as well, so we are sending to all connectors. | ||||
|                 ForEachSyncConnector(delegate(SyncConnector connector) | ||||
|                 { | ||||
|                     //if(!connector.OtherSideActorID.Equals(sog.BucketSyncInfoUpdate[ | ||||
|                     syncConnectors.Add(connector); | ||||
|                 }); | ||||
|             } | ||||
|  | @ -1897,31 +1282,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         //debug functions | ||||
|         private void BucketSyncDebug() | ||||
|         { | ||||
|             //Legacy serialization/deserialization for bucket based sync  | ||||
|             /* | ||||
|             //first test serialization | ||||
|             StringWriter sw = new StringWriter(); | ||||
|             XmlTextWriter writer = new XmlTextWriter(sw); | ||||
|             Dictionary<string, BucketSyncInfo> bucketSyncInfoList = new Dictionary<string,BucketSyncInfo>(); | ||||
|             BucketSyncInfo generalBucket = new BucketSyncInfo(DateTime.Now.Ticks, m_actorID, "General"); | ||||
|             bucketSyncInfoList.Add("General", generalBucket); | ||||
|             BucketSyncInfo physicsBucket = new BucketSyncInfo(DateTime.Now.Ticks, m_actorID, "Physics"); | ||||
|             bucketSyncInfoList.Add("Physics", physicsBucket); | ||||
|             SceneObjectSerializer.WriteBucketSyncInfo(writer, bucketSyncInfoList); | ||||
| 
 | ||||
|             string xmlString = sw.ToString(); | ||||
|             m_log.DebugFormat("Serialized xml string: {0}", xmlString); | ||||
| 
 | ||||
|             //second, test de-serialization | ||||
|             XmlTextReader reader = new XmlTextReader(new StringReader(xmlString)); | ||||
|             SceneObjectPart part = new SceneObjectPart(); | ||||
|             SceneObjectSerializer.ProcessBucketSyncInfo(part, reader); | ||||
|              * */ | ||||
|         } | ||||
| 
 | ||||
|         private void PrimSyncSerializationDebug() | ||||
|         { | ||||
|             if (m_scene != null) | ||||
|  | @ -2193,11 +1553,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                         HandleUpdatedObject(msg, senderActorID);                       | ||||
|                         return; | ||||
|                     } | ||||
|                 case SymmetricSyncMessage.MsgType.UpdatedBucketProperties: | ||||
|                     { | ||||
|                         HandleUpdatedBucketProperties(msg, senderActorID); | ||||
|                         return; | ||||
|                     } | ||||
|                 case SymmetricSyncMessage.MsgType.RemovedObject: | ||||
|                     { | ||||
|                         HandleRemovedObject(msg, senderActorID); | ||||
|  | @ -2205,13 +1560,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                     } | ||||
|                 case SymmetricSyncMessage.MsgType.LinkObject: | ||||
|                     { | ||||
|                         //HandleLinkObject(msg, senderActorID); | ||||
|                         HandleSyncLinkObject(msg, senderActorID); | ||||
|                         return; | ||||
|                     } | ||||
|                 case SymmetricSyncMessage.MsgType.DelinkObject: | ||||
|                     { | ||||
|                         //HandleDelinkObject(msg, senderActorID); | ||||
|                         HandleSyncDelinkObject(msg, senderActorID); | ||||
|                         return; | ||||
|                     } | ||||
|  | @ -2522,32 +1875,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         // 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> | ||||
|         /// Handler of UpdatedObject message. Note: for a relay node in the  | ||||
|  | @ -2650,32 +1977,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private void HandleUpdatedBucketProperties(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; | ||||
|             } | ||||
| 
 | ||||
|             lock (m_stats) m_statPhysBucketIn++; | ||||
| 
 | ||||
|             UUID partUUID = data["UUID"].AsUUID(); | ||||
|             string bucketName = data["Bucket"].AsString(); | ||||
| 
 | ||||
|             //m_log.DebugFormat("{0}: HandleUpdatedBucketProperties from {1}: for {2}/{3}", LogHeader, senderActorID, partUUID.ToString(), bucketName); | ||||
|              | ||||
|             BucketSyncInfo rBucketSyncInfo = new BucketSyncInfo(bucketName); | ||||
|             rBucketSyncInfo.LastUpdateTimeStamp = data["LastUpdateTimeStamp"].AsLong(); | ||||
|             rBucketSyncInfo.LastUpdateActorID = data["LastUpdateActorID"].AsString(); | ||||
|             // updatedPart.BucketSyncInfoList.Add(bucketName, rBucketSyncInfo); | ||||
| 
 | ||||
|             m_scene.UpdateObjectPartBucketProperties(bucketName, partUUID, data, rBucketSyncInfo); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Send out a sync message about the updated Terrain. If this is a relay node, | ||||
|         /// forward the sync message to all connectors except the one which initiated | ||||
|  | @ -2770,107 +2071,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         private void HandleLinkObject(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; | ||||
|             } | ||||
| 
 | ||||
|             //string init_actorID = data["actorID"].AsString(); | ||||
|             string sogxml = data["linkedGroup"].AsString(); | ||||
|             //SceneObjectGroup linkedGroup = SceneObjectSerializer.FromXml2Format(sogxml); | ||||
|             SceneObjectGroup linkedGroup = DecodeSceneObjectGroup(sogxml); | ||||
| 
 | ||||
|             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); | ||||
| 
 | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         private void HandleDelinkObject(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); | ||||
| 
 | ||||
|         } | ||||
|         #endregion //Sync message handlers | ||||
| 
 | ||||
|         #region Remote Event handlers | ||||
|  |  | |||
|  | @ -851,13 +851,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             m_sceneGraph.DelinkObjectsBySync(delinkPrimIDs, beforeDelinkGroupIDs, incomingAfterDelinkGroups); | ||||
|         } | ||||
| 
 | ||||
|         //public ObjectUpdateResult UpdateObjectPartBucketProperties(string bucketName, UUID partUUID, Dictionary<string, Object> updatedProperties, BucketSyncInfo rBucketSyncInfo) | ||||
|         public ObjectUpdateResult UpdateObjectPartBucketProperties(string bucketName, UUID partUUID,  | ||||
|                                 Object updatePart, BucketSyncInfo bucketSyncInfo) | ||||
|         { | ||||
|             return m_sceneGraph.UpdateObjectPartBucketProperties(bucketName, partUUID, updatePart, bucketSyncInfo); | ||||
|         } | ||||
| 
 | ||||
|         public bool AddNewSceneObjectByDelink(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates) | ||||
|         { | ||||
|             if (m_sceneGraph.AddNewSceneObjectByDelink(sceneObject, attachToBackup, sendClientUpdates)) | ||||
|  |  | |||
|  | @ -2198,18 +2198,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                             // Make sure no child prim is set for sale | ||||
|                             // So that, on delink, no prims are unwittingly | ||||
|                             // left for sale and sold off | ||||
|                             //DSG SYNC: need to copy value w/o trigger UpdateBucketSyncInfo | ||||
|                             //child.RootPart.ObjectSaleType = 0; | ||||
|                             //child.RootPart.SalePrice = 10; | ||||
|                             //child.RootPart.SetObjectSaleType(0); | ||||
|                             //child.RootPart.SetSalePrice(10); | ||||
|                             //child.RootPart.SetProperty("ObjectSaleType", 0); | ||||
|                             //child.RootPart.SetProperty("SalePrice", 10); | ||||
| 
 | ||||
|                             //casting SOP to SOPBase to make sure we call SOPBase.Property set function, not the SOP.Property set function | ||||
|                             SceneObjectPartBase rootPart = (SceneObjectPartBase)child.RootPart; | ||||
|                             rootPart.ObjectSaleType = 0; | ||||
|                             rootPart.SalePrice = 10; | ||||
|                             child.RootPart.ObjectSaleType = 0; | ||||
|                             child.RootPart.SalePrice = 10; | ||||
|                             childGroups.Add(child); | ||||
|                         } | ||||
|                     } | ||||
|  | @ -2496,19 +2486,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             return afterDelinkGroups; | ||||
|         } | ||||
| 
 | ||||
|         //public Scene.ObjectUpdateResult UpdateObjectPartBucketProperties(string bucketName, UUID partUUID, Dictionary<string, Object> updatedProperties, BucketSyncInfo rBucketSyncInfo) | ||||
|         public Scene.ObjectUpdateResult UpdateObjectPartBucketProperties(string bucketName, UUID partUUID,  | ||||
|                             Object updatedPart, BucketSyncInfo bucketSyncInfo) | ||||
|         { | ||||
|             SceneObjectPart localPart = GetSceneObjectPart(partUUID); | ||||
|             if (localPart == null) | ||||
|             { | ||||
|                 m_log.Warn("No SOP found: UUID -- " + partUUID); | ||||
|                 return Scene.ObjectUpdateResult.Unchanged; | ||||
|             } | ||||
|             return localPart.UpdateBucketProperties(bucketName, updatedPart, bucketSyncInfo); | ||||
|         } | ||||
| 
 | ||||
|         protected internal bool AddNewSceneObjectByDelink(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates) | ||||
|         { | ||||
|             // Ensure that we persist this new scene object if it's not an | ||||
|  |  | |||
|  | @ -601,6 +601,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             //ScheduleGroupForFullUpdate(); | ||||
| 
 | ||||
|             //DSG SYNC | ||||
|             /* | ||||
|             if (m_scene.RegionSyncModule != null) | ||||
|             { | ||||
|                 foreach (SceneObjectPart part in Parts) | ||||
|  | @ -608,6 +609,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|                     part.InitializeBucketSyncInfo(); | ||||
|                 } | ||||
|             } | ||||
|              * */  | ||||
|         } | ||||
| 
 | ||||
|         public Vector3 GroupScale() | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Huaiyu (Kitty) Liu
						Huaiyu (Kitty) Liu