From 5c31e0bdd3f1968069cea9bcee7efe64fc3efe53 Mon Sep 17 00:00:00 2001 From: "Huaiyu (Kitty) Liu" Date: Mon, 10 Jan 2011 14:14:40 -0800 Subject: [PATCH] Enabled touch events (ObjectGrab, ObjectGrabbing, ObjectDeGrab) to be propagated to script engine and triggers script. --- .../RegionSyncModule/RegionSyncClient.cs | 9 +- .../SymmetricSync/RegionSyncModule.cs | 252 ++++++++++++++++++ .../SymmetricSync/SymmetricSyncMessage.cs | 3 + .../Scripting/WorldComm/WorldCommModule.cs | 12 +- .../Region/Framework/Scenes/EventManager.cs | 78 +++++- OpenSim/Region/Framework/Scenes/Scene.cs | 7 +- .../Serialization/SceneObjectSerializer.cs | 5 +- 7 files changed, 349 insertions(+), 17 deletions(-) mode change 100755 => 100644 OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs index 91d3ca6bae..1b2df520a2 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs @@ -883,13 +883,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule // Register for interesting client events which will be forwarded to auth sim // These are the raw packet data blocks from the client, intercepted and sent up to the sim client.OnAgentUpdateRaw += HandleAgentUpdateRaw; - //SYMMETRIC SYNC: do not subscribe to OnChatFromClientRaw, we may remove this event entirely later + //SYMMETRIC SYNC: do not subscribe to OnChatFromClientRaw: RegionSyncModule + Scene.EventManager will handle this. //client.OnChatFromClientRaw += HandleChatFromClientRaw; client.OnAgentRequestSit += HandleAgentRequestSit; client.OnAgentSit += HandleAgentSit; - client.OnGrabObject += HandleGrabObject; - client.OnGrabUpdate += HandleGrabUpdate; - client.OnDeGrabObject += HandleDeGrabObject; + //SYMMETRIC SYNC: do not subscribe to OnGrabObject, OnGrabUpdate, and OnDeGrabObject: RegionSyncModule + Scene.EventManager will handle this. + //client.OnGrabObject += HandleGrabObject; + //client.OnGrabUpdate += HandleGrabUpdate; + //client.OnDeGrabObject += HandleDeGrabObject; client.OnStartAnim += HandleStartAnim; client.OnStopAnim += HandleStopAnim; } diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs old mode 100755 new mode 100644 index 5b67dfda89..0345dda564 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/RegionSyncModule.cs @@ -854,6 +854,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule case SymmetricSyncMessage.MsgType.ScriptReset: case SymmetricSyncMessage.MsgType.ChatFromClient: case SymmetricSyncMessage.MsgType.ChatFromWorld: + case SymmetricSyncMessage.MsgType.ObjectGrab: + case SymmetricSyncMessage.MsgType.ObjectGrabbing: + case SymmetricSyncMessage.MsgType.ObjectDeGrab: { HandleRemoteEvent(msg); return; @@ -1011,6 +1014,15 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule case SymmetricSyncMessage.MsgType.ChatFromWorld: HandleRemoteEvent_OnChatFromWorld(init_actorID, evSeqNum, data); break; + case SymmetricSyncMessage.MsgType.ObjectGrab: + HandleRemoteEvent_OnObjectGrab(init_actorID, evSeqNum, data); + break; + case SymmetricSyncMessage.MsgType.ObjectGrabbing: + HandleRemoteEvent_OnObjectGrabbing(init_actorID, evSeqNum, data); + break; + case SymmetricSyncMessage.MsgType.ObjectDeGrab: + HandleRemoteEvent_OnObjectDeGrab(init_actorID, evSeqNum, data); + break; } //if this is a relay node, forwards the event @@ -1102,6 +1114,120 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_scene.EventManager.TriggerOnChatFromWorldLocally(m_scene, args); } + /// + /// Special actions for remote event ChatFromClient + /// + /// OSDMap data of event args + private void HandleRemoteEvent_OnObjectGrab(string actorID, ulong evSeqNum, OSDMap data) + { + m_log.Debug(LogHeader + ", " + m_actorID + ": received GrabObject from " + actorID + ", seq " + evSeqNum); + + + UUID agentID = data["agentID"].AsUUID(); + UUID primID = data["primID"].AsUUID(); + UUID originalPrimID = data["originalPrimID"].AsUUID(); + Vector3 offsetPos = data["offsetPos"].AsVector3(); + SurfaceTouchEventArgs surfaceArgs = new SurfaceTouchEventArgs(); + surfaceArgs.Binormal = data["binormal"].AsVector3(); + surfaceArgs.FaceIndex = data["faceIndex"].AsInteger(); + surfaceArgs.Normal = data["normal"].AsVector3(); + surfaceArgs.Position = data["position"].AsVector3(); + surfaceArgs.STCoord = data["stCoord"].AsVector3(); + surfaceArgs.UVCoord = data["uvCoord"].AsVector3(); + + //Create an instance of IClientAPI to pass along agentID, see SOPObject.EventManager_OnObjectGrab() + //We don't really need RegionSyncAvatar's implementation here, just borrow it's IClientAPI interface. + //If we decide to remove RegionSyncAvatar later, we can simple just define a very simple class that implements + //ICleintAPI to be used here. + IClientAPI remoteClinet = new RegionSyncAvatar(m_scene, agentID, "", "", Vector3.Zero); + SceneObjectPart part = m_scene.GetSceneObjectPart(primID); + if (part == null) + { + m_log.Error(LogHeader + ": no prim with ID " + primID); + return; + } + uint originalID = 0; + if (originalPrimID != UUID.Zero) + { + SceneObjectPart originalPart = m_scene.GetSceneObjectPart(originalPrimID); + originalID = originalPart.LocalId; + } + m_scene.EventManager.TriggerObjectGrabLocally(part.LocalId, originalID, offsetPos, remoteClinet, surfaceArgs); + } + + private void HandleRemoteEvent_OnObjectGrabbing(string actorID, ulong evSeqNum, OSDMap data) + { + m_log.Debug(LogHeader + ", " + m_actorID + ": received GrabObject from " + actorID + ", seq " + evSeqNum); + + UUID agentID = data["agentID"].AsUUID(); + UUID primID = data["primID"].AsUUID(); + UUID originalPrimID = data["originalPrimID"].AsUUID(); + Vector3 offsetPos = data["offsetPos"].AsVector3(); + SurfaceTouchEventArgs surfaceArgs = new SurfaceTouchEventArgs(); + surfaceArgs.Binormal = data["binormal"].AsVector3(); + surfaceArgs.FaceIndex = data["faceIndex"].AsInteger(); + surfaceArgs.Normal = data["normal"].AsVector3(); + surfaceArgs.Position = data["position"].AsVector3(); + surfaceArgs.STCoord = data["stCoord"].AsVector3(); + surfaceArgs.UVCoord = data["uvCoord"].AsVector3(); + + //Create an instance of IClientAPI to pass along agentID, see SOPObject.EventManager_OnObjectGrab() + //We don't really need RegionSyncAvatar's implementation here, just borrow it's IClientAPI interface. + //If we decide to remove RegionSyncAvatar later, we can simple just define a very simple class that implements + //ICleintAPI to be used here. + IClientAPI remoteClinet = new RegionSyncAvatar(m_scene, agentID, "", "", Vector3.Zero); + SceneObjectPart part = m_scene.GetSceneObjectPart(primID); + if (part == null) + { + m_log.Error(LogHeader + ": no prim with ID " + primID); + return; + } + uint originalID = 0; + if (originalPrimID != UUID.Zero) + { + SceneObjectPart originalPart = m_scene.GetSceneObjectPart(originalPrimID); + originalID = originalPart.LocalId; + } + + m_scene.EventManager.TriggerObjectGrabbingLocally(part.LocalId, originalID, offsetPos, remoteClinet, surfaceArgs); + } + + private void HandleRemoteEvent_OnObjectDeGrab(string actorID, ulong evSeqNum, OSDMap data) + { + m_log.Debug(LogHeader + ", " + m_actorID + ": received GrabObject from " + actorID + ", seq " + evSeqNum); + + UUID agentID = data["agentID"].AsUUID(); + UUID primID = data["primID"].AsUUID(); + UUID originalPrimID = data["originalPrimID"].AsUUID(); + + SurfaceTouchEventArgs surfaceArgs = new SurfaceTouchEventArgs(); + surfaceArgs.Binormal = data["binormal"].AsVector3(); + surfaceArgs.FaceIndex = data["faceIndex"].AsInteger(); + surfaceArgs.Normal = data["normal"].AsVector3(); + surfaceArgs.Position = data["position"].AsVector3(); + surfaceArgs.STCoord = data["stCoord"].AsVector3(); + surfaceArgs.UVCoord = data["uvCoord"].AsVector3(); + + //Create an instance of IClientAPI to pass along agentID, see SOPObject.EventManager_OnObjectGrab() + //We don't really need RegionSyncAvatar's implementation here, just borrow it's IClientAPI interface. + //If we decide to remove RegionSyncAvatar later, we can simple just define a very simple class that implements + //ICleintAPI to be used here. + IClientAPI remoteClinet = new RegionSyncAvatar(m_scene, agentID, "", "", Vector3.Zero); + SceneObjectPart part = m_scene.GetSceneObjectPart(primID); + if (part == null) + { + m_log.Error(LogHeader + ": no prim with ID " + primID); + return; + } + uint originalID = 0; + if (originalPrimID != UUID.Zero) + { + SceneObjectPart originalPart = m_scene.GetSceneObjectPart(originalPrimID); + originalID = originalPart.LocalId; + } + + m_scene.EventManager.TriggerObjectDeGrabLocally(part.LocalId, originalID, remoteClinet, surfaceArgs); + } /// /// Send a sync message to remove the given objects in all connected actors, if this is a relay node. @@ -1164,6 +1290,15 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } OnLocalChatFromWorld(evArgs[0], (OSChatMessage)evArgs[1]); return; + case EventManager.EventNames.ObjectGrab: + OnLocalGrabObject((uint)evArgs[0], (uint)evArgs[1], (Vector3) evArgs[2], (IClientAPI) evArgs[3], (SurfaceTouchEventArgs)evArgs[4]); + return; + case EventManager.EventNames.ObjectGrabbing: + OnLocalObjectGrabbing((uint)evArgs[0], (uint)evArgs[1], (Vector3)evArgs[2], (IClientAPI)evArgs[3], (SurfaceTouchEventArgs)evArgs[4]); + return; + case EventManager.EventNames.ObjectDeGrab: + OnLocalDeGrabObject((uint)evArgs[0], (uint)evArgs[1], (IClientAPI)evArgs[2], (SurfaceTouchEventArgs)evArgs[3]); + return; default: return; } @@ -1204,6 +1339,12 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //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; + } + OSDMap data = new OSDMap(); data["primID"] = OSD.FromUUID(part.UUID); data["itemID"] = OSD.FromUUID(itemID); @@ -1245,6 +1386,117 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule data["type"] = OSD.FromInteger((int)chat.Type); SendSceneEvent(SymmetricSyncMessage.MsgType.ChatFromWorld, data); } + + 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); + } + + private void OnLocalObjectGrabbing(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + { + OSDMap data = PrepareObjectGrabArgs(localID, originalID, offsetPos, remoteClient, surfaceArgs); + if (data != null) + { + SendSceneEvent(SymmetricSyncMessage.MsgType.ObjectGrabbing, data); + } + } + + private OSDMap PrepareObjectGrabArgs(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 + ": PrepareObjectGrabArgs - part with localID " + localID + " not exist"); + return null; + } + + //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 + ": PrepareObjectGrabArgs - part with localID " + localID + " not exist"); + return null; + } + } + + 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); + + return data; + } + + + private void OnLocalDeGrabObject(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + { + + } private void SendSceneEvent(SymmetricSyncMessage.MsgType msgType, OSDMap data) { diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SymmetricSyncMessage.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SymmetricSyncMessage.cs index a10f43e76b..b093a16702 100755 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SymmetricSyncMessage.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SymmetricSync/SymmetricSyncMessage.cs @@ -38,6 +38,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule ScriptReset, ChatFromClient, ChatFromWorld, + ObjectGrab, + ObjectGrabbing, + ObjectDeGrab, } #endregion diff --git a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs index 7d8df7eb0f..86aa79d7dd 100644 --- a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs @@ -34,8 +34,8 @@ using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; -using log4net; -using System.Reflection; +//using log4net; +//using System.Reflection; /***************************************************** @@ -98,7 +98,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm private int m_saydistance = 30; private int m_shoutdistance = 100; - private ILog m_log; + //private ILog m_log; #region IRegionModule Members @@ -130,7 +130,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm //SYMMETRIC SYNC //m_scene.EventManager.OnChatFromWorld += DeliverClientMessage; //Kitty: temp debug - m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + //m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); //end SYMMETRIC SYNC m_pendingQ = new Queue(); m_pending = Queue.Synchronized(m_pendingQ); @@ -248,8 +248,8 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm /// msg to sent public void DeliverMessage(ChatTypeEnum type, int channel, string name, UUID id, string msg, Vector3 position) { - m_log.DebugFormat("[WorldComm] got[2] type {0}, channel {1}, name {2}, id {3}, msg {4}", - type, channel, name, id, msg); + //m_log.DebugFormat("[WorldComm] got[2] type {0}, channel {1}, name {2}, id {3}, msg {4}", + // type, channel, name, id, msg); // Determine which listen event filters match the given set of arguments, this results // in a limited set of listeners, each belonging a host. If the host is in range, add them diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index b4ae2ea5fa..f3b5e17677 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -54,6 +54,10 @@ namespace OpenSim.Region.Framework.Scenes ScriptReset, ChatFromClient, //chats from avatars ChatFromWorld, //chats from objects + ObjectGrab, + ObjectGrabbing, + ObjectDeGrab, + } public EventManager(Scene scene) @@ -148,6 +152,68 @@ namespace OpenSim.Region.Framework.Scenes base.TriggerOnChatFromWorld(sender, chat); } #endregion //ChatFromWorld + + #region ObjectGrab, ObjectGrabbing, ObjectDeGrab + public override void TriggerObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + { + if (m_scene.RegionSyncModule != null) + { + Object[] eventArgs = new Object[5]; + eventArgs[0] = (Object)localID; + eventArgs[1] = (Object)originalID; + eventArgs[2] = (Object)offsetPos; + eventArgs[3] = (Object)remoteClient; + eventArgs[4] = (Object)surfaceArgs; + m_scene.RegionSyncModule.PublishSceneEvent(EventNames.ObjectGrab, eventArgs); + } + TriggerObjectGrabLocally(localID, originalID, offsetPos, remoteClient, surfaceArgs); + } + public void TriggerObjectGrabLocally(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + { + base.TriggerObjectGrab(localID, originalID, offsetPos, remoteClient, surfaceArgs); + } + + public override void TriggerObjectGrabbing(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + { + if (m_scene.RegionSyncModule != null) + { + Object[] eventArgs = new Object[5]; + eventArgs[0] = (Object)localID; + eventArgs[1] = (Object)originalID; + eventArgs[2] = (Object)offsetPos; + eventArgs[3] = (Object)remoteClient; + eventArgs[4] = (Object)surfaceArgs; + m_scene.RegionSyncModule.PublishSceneEvent(EventNames.ObjectGrabbing, eventArgs); + } + TriggerObjectGrabbingLocally(localID, originalID, offsetPos, remoteClient, surfaceArgs); + } + + public void TriggerObjectGrabbingLocally(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + { + base.TriggerObjectGrabbing(localID, originalID, offsetPos, remoteClient, surfaceArgs); + } + + public override void TriggerObjectDeGrab(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + { + if (m_scene.RegionSyncModule != null) + { + Object[] eventArgs = new Object[4]; + eventArgs[0] = (Object)localID; + eventArgs[1] = (Object)originalID; + eventArgs[2] = (Object)remoteClient; + eventArgs[3] = (Object)surfaceArgs; + m_scene.RegionSyncModule.PublishSceneEvent(EventNames.ObjectDeGrab, eventArgs); + } + + TriggerObjectDeGrabLocally(localID, originalID, remoteClient, surfaceArgs); + } + + public void TriggerObjectDeGrabLocally(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + { + base.TriggerObjectDeGrab(localID, originalID, remoteClient, surfaceArgs); + } + + #endregion //GrabObject } /// @@ -954,7 +1020,9 @@ namespace OpenSim.Region.Framework.Scenes } } - public void TriggerObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + //SYMMETRIC SYNC: overridden at new EventManager class + //public void TriggerObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + public virtual void TriggerObjectGrab(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) { ObjectGrabDelegate handlerObjectGrab = OnObjectGrab; if (handlerObjectGrab != null) @@ -975,7 +1043,9 @@ namespace OpenSim.Region.Framework.Scenes } } - public void TriggerObjectGrabbing(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + //SYMMETRIC SYNC: overridden at new EventManager class + //public void TriggerObjectGrabbing(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + public virtual void TriggerObjectGrabbing(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) { ObjectGrabDelegate handlerObjectGrabbing = OnObjectGrabbing; if (handlerObjectGrabbing != null) @@ -996,7 +1066,9 @@ namespace OpenSim.Region.Framework.Scenes } } - public void TriggerObjectDeGrab(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + //SYMMETRIC SYNC: overridden at new EventManager class + //public void TriggerObjectDeGrab(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) + public virtual void TriggerObjectDeGrab(uint localID, uint originalID, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) { ObjectDeGrabDelegate handlerObjectDeGrab = OnObjectDeGrab; if (handlerObjectDeGrab != null) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index bec3603ed7..bcbacd3794 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3071,12 +3071,13 @@ namespace OpenSim.Region.Framework.Scenes client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags; client.OnRequestObjectPropertiesFamily += m_sceneGraph.RequestObjectPropertiesFamily; client.OnObjectPermissions += HandleObjectPermissionsUpdate; - if (IsSyncedServer()) - { + //SYMMETRIC SYNC: return the code back to its original OpenSim version + //if (IsSyncedServer()) + //{ client.OnGrabObject += ProcessObjectGrab; client.OnGrabUpdate += ProcessObjectGrabUpdate; client.OnDeGrabObject += ProcessObjectDeGrab; - } + //} client.OnUndo += m_sceneGraph.HandleUndo; client.OnRedo += m_sceneGraph.HandleRedo; client.OnObjectDescription += m_sceneGraph.PrimDescription; diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 8953ce31ba..0769929421 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -1174,7 +1174,10 @@ namespace OpenSim.Region.Framework.Scenes.Serialization writer.WriteElementString("GroupMask", sop.GroupMask.ToString()); writer.WriteElementString("EveryoneMask", sop.EveryoneMask.ToString()); writer.WriteElementString("NextOwnerMask", sop.NextOwnerMask.ToString()); - WriteFlags(writer, "Flags", sop.Flags.ToString(), options); + //SYMMETRIC SYNC: also serialize SceneObjectPart:LocalFlags, so that it can be propogated across actors + //WriteFlags(writer, "Flags", sop.Flags.ToString(), options); + WriteFlags(writer, "Flags", sop.GetEffectiveObjectFlags().ToString(), options); + //end SYMMETRIC SYNC WriteUUID(writer, "CollisionSound", sop.CollisionSound, options); writer.WriteElementString("CollisionSoundVolume", sop.CollisionSoundVolume.ToString()); if (sop.MediaUrl != null)