Re-implemented SOP.ScheduleFullUpdate and SOP.ScheduleTerseUpdate, calling RecordPrimUpdatesByLocal
to record updated values and timestamp of SOP's updated properties. Also, removed some code that had been commented out before.dsg
							parent
							
								
									2bea8bb4bc
								
							
						
					
					
						commit
						fe3d4ec9a8
					
				|  | @ -604,8 +604,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
| 
 | ||||
|         #endregion Console Command Interface | ||||
| 
 | ||||
|         #region RegionSyncModule members and functions | ||||
| 
 | ||||
|         /////////////////////////////////////////////////////////////////////// | ||||
|         // Memeber variables | ||||
|         /////////////////////////////////////////////////////////////////////// | ||||
|  | @ -1263,21 +1261,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             { | ||||
|                 return part.HasPropertyUpdatedLocally(bucketName); | ||||
|             } | ||||
| 
 | ||||
|             //return (m_isSyncRelay || part.HasPropertyUpdatedLocallyInGivenBucket(bucketName)); | ||||
| 
 | ||||
|             /* | ||||
|             if (!m_isSyncRelay) | ||||
|             { | ||||
|                 return part.HasPropertyUpdatedLocallyInGivenBucket(bucketName); | ||||
|             } | ||||
| 
 | ||||
|             //if this is a relay node, forward out the updates that have not been sent out since lastUpdateSentTime | ||||
|             if (m_lastUpdateSentTime[bucketName] <= part.BucketSyncInfoList[bucketName].LastUpdateTimeStamp) | ||||
|                 return true; | ||||
|             else | ||||
|                 return false; | ||||
|              * */  | ||||
|         } | ||||
| 
 | ||||
|         //by default, there are two property buckets: the "General" bucket and the "Physics" bucket. | ||||
|  | @ -2020,6 +2003,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         #region Sync message handlers | ||||
| 
 | ||||
| 
 | ||||
|         /// <summary> | ||||
|  | @ -2042,30 +2026,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|                     } | ||||
|                 case SymmetricSyncMessage.MsgType.Terrain: | ||||
|                     { | ||||
|                         /* | ||||
|                         m_scene.Heightmap.LoadFromXmlString(Encoding.ASCII.GetString(msg.Data, 0, msg.Length)); | ||||
|                         //Inform the terrain module that terrain has been updated | ||||
|                         m_scene.RequestModuleInterface<ITerrainModule>().TaintTerrain(); | ||||
|                         m_log.Debug(LogHeader+": Synchronized terrain"); | ||||
|                          * */ | ||||
|                         HandleTerrainUpdateMessage(msg, senderActorID); | ||||
|                         return; | ||||
|                     } | ||||
|                 case SymmetricSyncMessage.MsgType.GetObjects: | ||||
|                     { | ||||
|                         /* | ||||
|                         EntityBase[] entities = m_scene.GetEntities();  | ||||
|                         foreach (EntityBase e in entities) | ||||
|                         { | ||||
|                             if (e is SceneObjectGroup) | ||||
|                             { | ||||
|                                 //string sogxml = SceneObjectSerializer.ToXml2Format((SceneObjectGroup)e); | ||||
|                                 //SendSyncMessage(SymmetricSyncMessage.MsgType.NewObject, sogxml); | ||||
|                                 SceneObjectGroup sog = (SceneObjectGroup)e; | ||||
|                                 HandleGetObjectRequest(syncConnector, sog); | ||||
|                             } | ||||
|                         } | ||||
|                          * */ | ||||
|                         HandleGetObjectRequest(syncConnector); | ||||
|                         return; | ||||
|                     } | ||||
|  | @ -2497,6 +2462,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             m_scene.DelinkObjectsBySync(delinkPrimIDs, beforeDelinkGroupIDs, incomingAfterDelinkGroups); | ||||
| 
 | ||||
|         } | ||||
|         #endregion //Sync message handlers | ||||
| 
 | ||||
|         #region Remote Event handlers | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// The common actions for handling remote events (event initiated at other actors and propogated here) | ||||
|  | @ -2644,58 +2612,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             m_scene.EventManager.TriggerScriptResetLocally(part.LocalId, itemID); | ||||
|         } | ||||
| 
 | ||||
|         /* | ||||
|         /// <summary> | ||||
|         /// Special actions for remote event ChatFromClient | ||||
|         /// </summary> | ||||
|         /// <param name="data">OSDMap data of event args</param> | ||||
|         private void HandleRemoteEvent_OnChatFromClient(string actorID, ulong evSeqNum, OSDMap data) | ||||
|         { | ||||
|             //m_log.Debug(LogHeader + ": received ChatFromClient from "+actorID+", seq "+evSeqNum); | ||||
| 
 | ||||
|             OSChatMessage args = new OSChatMessage(); | ||||
|             args.Channel = data["channel"].AsInteger(); | ||||
|             args.Message = data["msg"].AsString(); | ||||
|             args.Position = data["pos"].AsVector3(); | ||||
|             args.From = data["name"].AsString(); | ||||
|             UUID id = data["id"].AsUUID(); | ||||
|             args.Scene = m_scene; | ||||
|             //args.Type = ChatTypeEnum.Say; | ||||
|             args.Type = (ChatTypeEnum) data["type"].AsInteger(); | ||||
|             ScenePresence sp; | ||||
|             m_scene.TryGetScenePresence(id, out sp); | ||||
| 
 | ||||
|             m_scene.EventManager.TriggerOnChatFromClientLocally(sp, args); //Let WorldCommModule and other modules to catch the event | ||||
|             m_scene.EventManager.TriggerOnChatFromWorldLocally(sp, args); //This is to let ChatModule to get the event and deliver it to avatars | ||||
|         } | ||||
| 
 | ||||
|         private void HandleRemoteEvent_OnChatFromWorld(string actorID, ulong evSeqNum, OSDMap data) | ||||
|         { | ||||
|             //m_log.Debug(LogHeader + ", " + m_actorID + ": received ChatFromWorld from " + actorID + ", seq " + evSeqNum); | ||||
| 
 | ||||
|             OSChatMessage args = new OSChatMessage(); | ||||
|             args.Channel = data["channel"].AsInteger(); | ||||
|             args.Message = data["msg"].AsString(); | ||||
|             args.Position = data["pos"].AsVector3(); | ||||
|             args.From = data["name"].AsString(); | ||||
|             UUID id = data["id"].AsUUID(); | ||||
|             args.Scene = m_scene; | ||||
|             //args.Type = ChatTypeEnum.Say; | ||||
|             args.Type = (ChatTypeEnum)data["type"].AsInteger(); | ||||
|             //ScenePresence sp; | ||||
|             //m_scene.TryGetScenePresence(id, out sp); | ||||
| 
 | ||||
|             m_log.Debug(LogHeader + " TriggerOnChatFromWorldLocally "); | ||||
| 
 | ||||
|             m_scene.EventManager.TriggerOnChatFromWorldLocally(m_scene, args); | ||||
|         } | ||||
| 
 | ||||
|         private void HandleRemoteEvent_OnChatBroadcast(string actorID, ulong evSeqNum, OSDMap data) | ||||
|         { | ||||
|              | ||||
|         } | ||||
|          * */  | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Handlers for remote chat events: ChatFromClient, ChatFromWorld, ChatBroadcast | ||||
|         /// </summary> | ||||
|  | @ -2957,42 +2873,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|             SendSceneEvent(SymmetricSyncMessage.MsgType.ScriptReset, data); | ||||
|         } | ||||
| 
 | ||||
|         /* | ||||
|         private void OnLocalChatFromClient(Object sender, OSChatMessage chat) | ||||
|         { | ||||
|             ScenePresence avatar = m_scene.GetScenePresence(chat.SenderUUID); | ||||
| 
 | ||||
|             if (avatar == null) | ||||
|             { | ||||
|                 m_log.Warn(LogHeader + "avatar " + chat.SenderUUID + " not exist locally, NOT sending out ChatFromClient"); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             OSDMap data = new OSDMap(); | ||||
|             data["channel"] = OSD.FromInteger(chat.Channel); | ||||
|             data["msg"] = OSD.FromString(chat.Message); | ||||
|             data["pos"] = OSD.FromVector3(chat.Position); | ||||
|             data["name"] = OSD.FromString(avatar.Name); //note this is different from OnLocalChatFromWorld | ||||
|             data["id"] = OSD.FromUUID(chat.SenderUUID); | ||||
|             data["type"] = OSD.FromInteger((int)chat.Type); | ||||
|             SendSceneEvent(SymmetricSyncMessage.MsgType.ChatFromClient, data); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         private void OnLocalChatFromWorld(Object sender, OSChatMessage chat) | ||||
|         { | ||||
| 
 | ||||
|             OSDMap data = new OSDMap(); | ||||
|             data["channel"] = OSD.FromInteger(chat.Channel); | ||||
|             data["msg"] = OSD.FromString(chat.Message); | ||||
|             data["pos"] = OSD.FromVector3(chat.Position); | ||||
|             data["name"] = OSD.FromString(chat.From); //note this is different from OnLocalChatFromClient | ||||
|             data["id"] = OSD.FromUUID(chat.SenderUUID); | ||||
|             data["type"] = OSD.FromInteger((int)chat.Type); | ||||
|             SendSceneEvent(SymmetricSyncMessage.MsgType.ChatFromWorld, data); | ||||
|         } | ||||
|          * */  | ||||
| 
 | ||||
|         private void OnLocalChatBroadcast(Object sender, OSChatMessage chat) | ||||
|         { | ||||
| 
 | ||||
|  | @ -3049,49 +2929,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
| 
 | ||||
|         private void OnLocalGrabObject(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) | ||||
|         { | ||||
|             /* | ||||
|             //we will use the prim's UUID as the identifier, not the localID, to publish the event for the prim                 | ||||
|             SceneObjectPart part = m_scene.GetSceneObjectPart(localID); | ||||
|             if (part == null) | ||||
|             { | ||||
|                 m_log.Warn(LogHeader + ": part with localID " + localID + " not exist"); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             //this seems to be useful if the prim touched and the prim handling the touch event are different: | ||||
|             //i.e. a child part is touched, pass the event to root, and root handles the event. then root is the "part", | ||||
|             //and the child part is the "originalPart" | ||||
|             SceneObjectPart originalPart = null; | ||||
|             if (originalID != 0) | ||||
|             { | ||||
|                 originalPart = m_scene.GetSceneObjectPart(originalID); | ||||
|                 if (originalPart == null) | ||||
|                 { | ||||
|                     m_log.Warn(LogHeader + ": part with localID " + localID + " not exist"); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             OSDMap data = new OSDMap(); | ||||
|             data["agentID"] = OSD.FromUUID(remoteClient.AgentId); | ||||
|             data["primID"] = OSD.FromUUID(part.UUID); | ||||
|             if (originalID != 0) | ||||
|             { | ||||
|                 data["originalPrimID"] = OSD.FromUUID(originalPart.UUID); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 data["originalPrimID"] = OSD.FromUUID(UUID.Zero); | ||||
|             } | ||||
|             data["offsetPos"] = OSD.FromVector3(offsetPos); | ||||
|              | ||||
|             data["binormal"] = OSD.FromVector3(surfaceArgs.Binormal); | ||||
|             data["faceIndex"] = OSD.FromInteger(surfaceArgs.FaceIndex); | ||||
|             data["normal"] = OSD.FromVector3(surfaceArgs.Normal); | ||||
|             data["position"] = OSD.FromVector3(surfaceArgs.Position); | ||||
|             data["stCoord"] = OSD.FromVector3(surfaceArgs.STCoord); | ||||
|             data["uvCoord"] = OSD.FromVector3(surfaceArgs.UVCoord); | ||||
|              * */ | ||||
|             OSDMap data = PrepareObjectGrabArgs(localID, originalID, offsetPos, remoteClient, surfaceArgs); | ||||
|             SendSceneEvent(SymmetricSyncMessage.MsgType.ObjectGrab, data); | ||||
|         } | ||||
|  | @ -3174,8 +3011,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule | |||
|         { | ||||
|             return m_eventSeq++; | ||||
|         } | ||||
|         #endregion //Remote Event handlers | ||||
| 
 | ||||
|         #region Per Property SyncInfo management | ||||
|         public void RecordPrimUpdatesByLocal(SceneObjectPart part, List<SceneObjectPartProperties> updatedProperties) | ||||
|         { | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         #endregion //Per Property SyncInfo management | ||||
| 
 | ||||
|         #endregion //RegionSyncModule members and functions | ||||
| 
 | ||||
|         #region ISyncStatistics | ||||
|         private object m_stats = new object(); | ||||
|  |  | |||
|  | @ -67,9 +67,11 @@ namespace OpenSim.Region.Framework.Interfaces | |||
|         List<string> PropertyBucketDescription { get; } | ||||
| 
 | ||||
|         //Enqueue updates for scene-objects and scene-presences | ||||
|         //Legacy interface, used in Bucket-sync | ||||
|         void QueueSceneObjectPartForUpdate(SceneObjectPart part); | ||||
|         void QueueScenePresenceForTerseUpdate(ScenePresence presence); | ||||
|         //void QueueSceneObjectGroupForUpdate(SceneObjectGroup sog); | ||||
| 
 | ||||
|         void RecordPrimUpdatesByLocal(SceneObjectPart part, List<SceneObjectPartProperties> updatedProperties); | ||||
| 
 | ||||
|         //The folloiwng calls deal with object updates, and will insert each update into an outgoing queue of each SyncConnector | ||||
|         void SendSceneUpdates(); | ||||
|  |  | |||
|  | @ -3203,10 +3203,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             ClearUpdateSchedule(); | ||||
| 
 | ||||
|             //SYMMETRIC SYNC | ||||
|             //KittyL: 04/06/2011, No longer calling QueueSceneObjectPartForUpdate  | ||||
|             //from here. Local updates are now recorded by calling  | ||||
|             //IRegionSyncModule.RecordPrimUpdatesByLocal. | ||||
|             /* | ||||
|             if (m_parentGroup.Scene.RegionSyncModule != null) | ||||
|             {                 | ||||
|                 m_parentGroup.Scene.RegionSyncModule.QueueSceneObjectPartForUpdate((SceneObjectPart)this); | ||||
|             } | ||||
|              * */  | ||||
|             //end of SYMMETRIC SYNC | ||||
|         } | ||||
| 
 | ||||
|  | @ -5937,6 +5942,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             return partUpdateResult; | ||||
|         } | ||||
| 
 | ||||
|         //Implementation of ScheduleFullUpdate and ScheduleTerseUpdate for Bucket  | ||||
|         //based synchronization | ||||
|         /* | ||||
|         public override void ScheduleFullUpdate(List<SceneObjectPartProperties> updatedProperties) | ||||
|         { | ||||
|             if (updatedProperties != null && updatedProperties.Count > 0) | ||||
|  | @ -5964,6 +5972,36 @@ namespace OpenSim.Region.Framework.Scenes | |||
|             base.ScheduleTerseUpdate(updatedProperties); | ||||
|             //TaintBucketSyncInfo(property); | ||||
|         } | ||||
|          * */ | ||||
| 
 | ||||
|         //Implementation of ScheduleFullUpdate and ScheduleTerseUpdate for Bucket  | ||||
|         //based synchronization | ||||
|         public override void ScheduleFullUpdate(List<SceneObjectPartProperties> updatedProperties) | ||||
|         { | ||||
|             if (updatedProperties != null && updatedProperties.Count > 0) | ||||
|             { | ||||
|                 if (m_parentGroup != null && m_parentGroup.Scene.RegionSyncModule != null) | ||||
|                 { | ||||
|                     m_parentGroup.Scene.RegionSyncModule.RecordPrimUpdatesByLocal(this, updatedProperties); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             base.ScheduleTerseUpdate(updatedProperties); | ||||
|         } | ||||
| 
 | ||||
|         public override void ScheduleTerseUpdate(List<SceneObjectPartProperties> updatedProperties) | ||||
|         { | ||||
|             if (updatedProperties != null && updatedProperties.Count > 0) | ||||
|             { | ||||
|                 if (m_parentGroup != null && m_parentGroup.Scene.RegionSyncModule != null) | ||||
|                 { | ||||
|                     m_parentGroup.Scene.RegionSyncModule.RecordPrimUpdatesByLocal(this, updatedProperties); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             base.ScheduleTerseUpdate(updatedProperties); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Schedules this prim for a full update, without changing the timestamp or actorID (info on when and who modified any property). | ||||
|  | @ -5971,33 +6009,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
|         /// </summary> | ||||
|         public void ScheduleFullUpdate_SyncInfoUnchanged() | ||||
|         { | ||||
|             //m_log.DebugFormat("[SCENE OBJECT PART]: ScheduleFullUpdate_SyncInfoUnchanged for {0} {1}", Name, LocalId); | ||||
| 
 | ||||
|             if (m_parentGroup != null) | ||||
|             { | ||||
|                 m_parentGroup.QueueForUpdateCheck(); | ||||
|             } | ||||
| 
 | ||||
|             int timeNow = Util.UnixTimeSinceEpoch(); | ||||
| 
 | ||||
|             // If multiple updates are scheduled on the same second, we still need to perform all of them | ||||
|             // So we'll force the issue by bumping up the timestamp so that later processing sees these need | ||||
|             // to be performed. | ||||
|             if (timeNow <= TimeStampFull) | ||||
|             { | ||||
|                 TimeStampFull += 1; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 TimeStampFull = (uint)timeNow; | ||||
|             } | ||||
| 
 | ||||
|             m_updateFlag = 2; | ||||
| 
 | ||||
|             //            m_log.DebugFormat( | ||||
|             //                "[SCENE OBJECT PART]: Scheduling full  update for {0}, {1} at {2}", | ||||
|             //                UUID, Name, TimeStampFull); | ||||
| 
 | ||||
|             base.ScheduleFullUpdate(null); | ||||
|         } | ||||
| 
 | ||||
|         private bool UpdateCollisionSound(UUID updatedCollisionSound) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Huaiyu (Kitty) Liu
						Huaiyu (Kitty) Liu