From 2c6272d11a916953bee28ed4b36d839e8c8dd4a2 Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Thu, 19 Jan 2012 02:53:21 -0800 Subject: Add a version of GetGroupByPrim to Scene which accepts UUID instead of localID --- OpenSim/Region/Framework/Scenes/Scene.cs | 10 ++++++++++ OpenSim/Region/Framework/Scenes/SceneGraph.cs | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'OpenSim/Region/Framework/Scenes') diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 027ec96..3d8c714 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -4294,6 +4294,16 @@ namespace OpenSim.Region.Framework.Scenes public SceneObjectGroup GetGroupByPrim(uint localID) { return m_sceneGraph.GetGroupByPrim(localID); + } + + /// + /// Get a scene object group that contains the prim with the given uuid + /// + /// + /// null if no scene object group containing that prim is found + public SceneObjectGroup GetGroupByPrim(UUID fullID) + { + return m_sceneGraph.GetGroupByPrim(fullID); } public override bool TryGetScenePresence(UUID agentID, out ScenePresence sp) diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 1e2901b..f481e72 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -311,6 +311,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// This method does not send updates to the client - callers need to handle this themselves. + /// Caller should also trigger EventManager.TriggerObjectAddedToScene /// /// /// Position of the object. If null then the position stored in the object is used. @@ -925,7 +926,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// null if no scene object group containing that prim is found - private SceneObjectGroup GetGroupByPrim(UUID fullID) + public SceneObjectGroup GetGroupByPrim(UUID fullID) { SceneObjectGroup sog; lock (SceneObjectGroupsByFullPartID) -- cgit v1.1 From 5ced49aaa8ca4362ef8b17cb4f892da8c11d0e3f Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Thu, 19 Jan 2012 03:03:22 -0800 Subject: Cleaned up Color and Text parameters in SOP and made LocalFlags public for module access. --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 26 +++++----------------- 1 file changed, 6 insertions(+), 20 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes') diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index aea47e6..a70c8fa 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -236,7 +236,7 @@ namespace OpenSim.Region.Framework.Scenes public bool IgnoreUndoUpdate = false; - private PrimFlags LocalFlags; + public PrimFlags LocalFlags; private float m_damage = -1.0f; private byte[] m_TextureAnimation; @@ -904,32 +904,18 @@ namespace OpenSim.Region.Framework.Scenes public Color Color { get { return m_color; } - set - { - m_color = value; - - /* ScheduleFullUpdate() need not be called b/c after - * setting the color, the text will be set, so then - * ScheduleFullUpdate() will be called. */ - //ScheduleFullUpdate(); - } + set { m_color = value; } } public string Text { get { - string returnstr = m_text; - if (returnstr.Length > 255) - { - returnstr = returnstr.Substring(0, 254); - } - return returnstr; - } - set - { - m_text = value; + if (m_text.Length > 255) + return m_text.Substring(0, 254); + return m_text; } + set { m_text = value; } } -- cgit v1.1 From e41f23dead25356eb3e4bd37a5ef84c73e07336f Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Thu, 19 Jan 2012 03:06:35 -0800 Subject: Trigger event when prims are scheduled for an update. This gives modules early access to changed parameters. --- OpenSim/Region/Framework/Scenes/EventManager.cs | 24 ++++++++++++++++++++++ OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 4 ++++ 2 files changed, 28 insertions(+) (limited to 'OpenSim/Region/Framework/Scenes') diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index fd35c62..3d96f40 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -398,6 +398,9 @@ namespace OpenSim.Region.Framework.Scenes public event SceneObjectPartCopyDelegate OnSceneObjectPartCopy; public delegate void SceneObjectPartCopyDelegate(SceneObjectPart copy, SceneObjectPart original, bool userExposed); + public delegate void SceneObjectPartUpdated(SceneObjectPart sop); + public event SceneObjectPartUpdated OnSceneObjectPartUpdated; + public delegate void RegionUp(GridRegion region); public event RegionUp OnRegionUp; @@ -2203,6 +2206,27 @@ namespace OpenSim.Region.Framework.Scenes } } + public void TriggerSceneObjectPartUpdated(SceneObjectPart sop) + { + SceneObjectPartUpdated handler = OnSceneObjectPartUpdated; + if (handler != null) + { + foreach (SceneObjectPartUpdated d in handler.GetInvocationList()) + { + try + { + d(sop); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[EVENT MANAGER]: Delegate for TriggerSceneObjectPartUpdated failed - continuing. {0} {1}", + e.Message, e.StackTrace); + } + } + } + } + public void TriggerOnParcelPropertiesUpdateRequest(LandUpdateArgs args, int local_id, IClientAPI remote_client) { diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index a70c8fa..8e59abf 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -2733,6 +2733,8 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup == null) return; + ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); + ParentGroup.QueueForUpdateCheck(); int timeNow = Util.UnixTimeSinceEpoch(); @@ -2765,6 +2767,8 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup == null) return; + ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); + // This was pulled from SceneViewer. Attachments always receive full updates. // I could not verify if this is a requirement but this maintains existing behavior if (ParentGroup.IsAttachment) -- cgit v1.1 From 0ce9ad4a56ecfcb021208acb4e9650612bc7e931 Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Wed, 1 Feb 2012 16:27:20 -0800 Subject: Add event RegionHeartbeatEnd for modules interested in coordinating activity with region heartbeats --- OpenSim/Region/Framework/Scenes/EventManager.cs | 24 ++++++++++++++++++++++++ OpenSim/Region/Framework/Scenes/Scene.cs | 22 ++++++++++++---------- 2 files changed, 36 insertions(+), 10 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes') diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 3d96f40..d31d380 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -407,6 +407,9 @@ namespace OpenSim.Region.Framework.Scenes public delegate void RegionStarted(Scene scene); public event RegionStarted OnRegionStarted; + public delegate void RegionHeartbeatEnd(Scene scene); + public event RegionHeartbeatEnd OnRegionHeartbeatEnd; + public delegate void LoginsEnabled(string regionName); public event LoginsEnabled OnLoginsEnabled; @@ -2291,6 +2294,27 @@ namespace OpenSim.Region.Framework.Scenes } } + public void TriggerRegionHeartbeatEnd(Scene scene) + { + RegionHeartbeatEnd handler = OnRegionHeartbeatEnd; + + if (handler != null) + { + foreach (RegionHeartbeatEnd d in handler.GetInvocationList()) + { + try + { + d(scene); + } + catch (Exception e) + { + m_log.ErrorFormat("[EVENT MANAGER]: Delegate for OnRegionHeartbeatEnd failed - continuing {0} - {1}", + e.Message, e.StackTrace); + } + } + } + } + public void TriggerLoginsEnabled (string regionName) { LoginsEnabled handler = OnLoginsEnabled; diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index bfe8d2c..bbd2163 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1385,6 +1385,8 @@ namespace OpenSim.Region.Framework.Scenes RegionInfo.RegionName, e.Message, e.StackTrace); } + EventManager.TriggerRegionHeartbeatEnd(this); + maintc = Util.EnvironmentTickCountSubtract(maintc); maintc = (int)(MinFrameTime * 1000) - maintc; @@ -4290,16 +4292,16 @@ namespace OpenSim.Region.Framework.Scenes public SceneObjectGroup GetGroupByPrim(uint localID) { return m_sceneGraph.GetGroupByPrim(localID); - } - - /// - /// Get a scene object group that contains the prim with the given uuid - /// - /// - /// null if no scene object group containing that prim is found - public SceneObjectGroup GetGroupByPrim(UUID fullID) - { - return m_sceneGraph.GetGroupByPrim(fullID); + } + + /// + /// Get a scene object group that contains the prim with the given uuid + /// + /// + /// null if no scene object group containing that prim is found + public SceneObjectGroup GetGroupByPrim(UUID fullID) + { + return m_sceneGraph.GetGroupByPrim(fullID); } public override bool TryGetScenePresence(UUID agentID, out ScenePresence sp) -- cgit v1.1 From 146d78edfa2974038a7efe3f1c0f3d0e8d8520ae Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Thu, 2 Feb 2012 17:41:05 -0800 Subject: ObjectAddedToScene event should be fired when duplicating objects --- OpenSim/Region/Framework/Scenes/Scene.cs | 26 ++++++++++++++++++++++---- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 16 ---------------- 2 files changed, 22 insertions(+), 20 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes') diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index bbd2163..186e01c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2716,7 +2716,7 @@ namespace OpenSim.Region.Framework.Scenes client.OnObjectMaterial += m_sceneGraph.PrimMaterial; client.OnLinkObjects += LinkObjects; client.OnDelinkObjects += DelinkObjects; - client.OnObjectDuplicate += m_sceneGraph.DuplicateObject; + client.OnObjectDuplicate += DuplicateObject; client.OnObjectDuplicateOnRay += doObjectDuplicateOnRay; client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags; client.OnRequestObjectPropertiesFamily += m_sceneGraph.RequestObjectPropertiesFamily; @@ -2843,7 +2843,7 @@ namespace OpenSim.Region.Framework.Scenes client.OnObjectMaterial -= m_sceneGraph.PrimMaterial; client.OnLinkObjects -= LinkObjects; client.OnDelinkObjects -= DelinkObjects; - client.OnObjectDuplicate -= m_sceneGraph.DuplicateObject; + client.OnObjectDuplicate -= DuplicateObject; client.OnObjectDuplicateOnRay -= doObjectDuplicateOnRay; client.OnUpdatePrimFlags -= m_sceneGraph.UpdatePrimFlags; client.OnRequestObjectPropertiesFamily -= m_sceneGraph.RequestObjectPropertiesFamily; @@ -2936,6 +2936,21 @@ namespace OpenSim.Region.Framework.Scenes } /// + /// Duplicates object specified by localID. This is the event handler for IClientAPI. + /// + /// ID of object to duplicate + /// + /// + /// Agent doing the duplication + /// Group of new object + public void DuplicateObject(uint originalPrim, Vector3 offset, uint flags, UUID AgentID, UUID GroupID) + { + SceneObjectGroup copy = SceneGraph.DuplicateObject(originalPrim, offset, flags, AgentID, GroupID, Quaternion.Identity); + if (copy != null) + EventManager.TriggerObjectAddedToScene(copy); + } + + /// /// Duplicates object specified by localID at position raycasted against RayTargetObject using /// RayEnd and RayStart to determine what the angle of the ray is /// @@ -2997,19 +3012,22 @@ namespace OpenSim.Region.Framework.Scenes // stick in offset format from the original prim pos = pos - target.ParentGroup.AbsolutePosition; + SceneObjectGroup copy; if (CopyRotates) { Quaternion worldRot = target2.GetWorldRotation(); // SceneObjectGroup obj = m_sceneGraph.DuplicateObject(localID, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID, worldRot); - m_sceneGraph.DuplicateObject(localID, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID, worldRot); + copy = m_sceneGraph.DuplicateObject(localID, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID, worldRot); //obj.Rotation = worldRot; //obj.UpdateGroupRotationR(worldRot); } else { - m_sceneGraph.DuplicateObject(localID, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID); + copy = m_sceneGraph.DuplicateObject(localID, pos, target.GetEffectiveObjectFlags(), AgentID, GroupID, Quaternion.Identity); } + if (copy != null) + EventManager.TriggerObjectAddedToScene(copy); } } } diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 1487fac..7d801b5 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -1873,22 +1873,6 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Duplicate the given object, Fire and Forget, No rotation, no return wrapper - /// - /// - /// - /// - /// - /// - protected internal void DuplicateObject(uint originalPrim, Vector3 offset, uint flags, UUID AgentID, UUID GroupID) - { - //m_log.DebugFormat("[SCENE]: Duplication of object {0} at offset {1} requested by agent {2}", originalPrim, offset, AgentID); - - // SceneObjectGroup dupe = DuplicateObject(originalPrim, offset, flags, AgentID, GroupID, Quaternion.Zero); - DuplicateObject(originalPrim, offset, flags, AgentID, GroupID, Quaternion.Identity); - } - - /// /// Duplicate the given object. /// /// -- cgit v1.1 From ed846f11f17b7497c9a0bcf599fcb6431504c18e Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Thu, 2 Feb 2012 18:06:34 -0800 Subject: OpenSim tests do not always create an EventManager so calls to trigger events during tests must check for null EventManager --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes') diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 9b660b6..9fb11d3 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -2729,7 +2729,9 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup == null) return; - ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); + // When running OpenSim tests, EventManager can be null. Maybe tests should create an EventManager. + if(ParentGroup.Scene.EventManager != null) + ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); ParentGroup.QueueForUpdateCheck(); @@ -2763,7 +2765,9 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup == null) return; - ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); + // When running OpenSim tests, EventManager can be null. Maybe tests should create an EventManager. + if (ParentGroup.Scene.EventManager != null) + ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); // This was pulled from SceneViewer. Attachments always receive full updates. // I could not verify if this is a requirement but this maintains existing behavior -- cgit v1.1 From 61adf36339f15fcbcc16d96ff7089f03edf72c10 Mon Sep 17 00:00:00 2001 From: Dan Lake Date: Thu, 2 Feb 2012 18:19:22 -0800 Subject: Commenting out new event until I can fix OpenSim tests. Currently, testing objects does not create a Scene or EventManager so triggering events crashes some tests --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes') diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 9fb11d3..27bcc09 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -2729,9 +2729,9 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup == null) return; - // When running OpenSim tests, EventManager can be null. Maybe tests should create an EventManager. - if(ParentGroup.Scene.EventManager != null) - ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); + // When running OpenSim tests, Scene (and EventManager can be null). + // Need to fix tests before we can trigger this here + // ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); ParentGroup.QueueForUpdateCheck(); @@ -2765,9 +2765,9 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup == null) return; - // When running OpenSim tests, EventManager can be null. Maybe tests should create an EventManager. - if (ParentGroup.Scene.EventManager != null) - ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); + // When running OpenSim tests, Scene (and EventManager can be null). + // Need to fix tests before we can trigger this here + // ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); // This was pulled from SceneViewer. Attachments always receive full updates. // I could not verify if this is a requirement but this maintains existing behavior -- cgit v1.1