From 5becc16acfa28eb1daf2b6ca0680d00e581b4d64 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 14 Sep 2015 16:40:01 +0100 Subject: try to improve vehicles crossing with Xengine. Lag seems main issue now, but needs testing, specially the fail cases, that most likelly need more work --- .../Framework/EntityTransfer/EntityTransferModule.cs | 10 +++++----- .../Framework/Interfaces/IEntityTransferModule.cs | 4 ++-- OpenSim/Region/Framework/Scenes/Scene.cs | 5 ++++- OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 20 ++++++++++++++++---- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +- 5 files changed, 28 insertions(+), 13 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 97d417f..e6041b4 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -2607,7 +2607,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return neighbourRegion; } - +/* not in use. -> CrossPrimGroupIntoNewRegion /// /// Move the given scene object into a new region depending on which region its absolute position has moved /// into. @@ -2672,7 +2672,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer grp.ScheduleGroupForFullUpdate(); } } - +*/ /// /// Move the given scene object into a new region /// @@ -2682,7 +2682,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer /// true if the crossing itself was successful, false on failure /// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region /// - public bool CrossPrimGroupIntoNewRegion(GridRegion destination, Vector3 newPosition, SceneObjectGroup grp, bool silent) + public bool CrossPrimGroupIntoNewRegion(GridRegion destination, Vector3 newPosition, SceneObjectGroup grp, bool silent, bool removeScripts) { //m_log.Debug(" >>> CrossPrimGroupIntoNewRegion <<<"); @@ -2714,7 +2714,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // We remove the object here try { - grp.Scene.DeleteSceneObject(grp, silent); + grp.Scene.DeleteSceneObject(grp, silent, removeScripts); } catch (Exception e) { @@ -2764,7 +2764,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer "[ENTITY TRANSFER MODULE]: Sending attachment {0} to region {1}", clone.UUID, destination.RegionName); - CrossPrimGroupIntoNewRegion(destination, Vector3.Zero, clone, silent); + CrossPrimGroupIntoNewRegion(destination, Vector3.Zero, clone, silent,true); } } diff --git a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs index 80f8244..61d199f 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs @@ -96,8 +96,8 @@ namespace OpenSim.Region.Framework.Interfaces GridRegion GetDestination(Scene scene, UUID agentID, Vector3 pos, out string version, out Vector3 newpos); GridRegion GetObjectDestination(SceneObjectGroup grp, Vector3 targetPosition, out Vector3 newpos); bool checkAgentAccessToRegion(ScenePresence agent, GridRegion destiny, Vector3 position, out string version, out string reason); - void Cross(SceneObjectGroup sog, Vector3 position, bool silent); - bool CrossPrimGroupIntoNewRegion(GridRegion destination, Vector3 newPosition, SceneObjectGroup grp, bool silent); +// void Cross(SceneObjectGroup sog, Vector3 position, bool silent); + bool CrossPrimGroupIntoNewRegion(GridRegion destination, Vector3 newPosition, SceneObjectGroup grp, bool silent, bool removeScripts); ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, GridRegion neighbourRegion, bool isFlying, string version); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 1b6d483..db64eb7 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2177,7 +2177,7 @@ namespace OpenSim.Region.Framework.Scenes //// stored in the GridService, because that's what the world map module uses //// to send the map image UUIDs (of other regions) to the viewer... if (m_generateMaptiles) - RegenerateMaptile(); + RegenerateMaptile(); GridRegion region = new GridRegion(RegionInfo); string error = GridService.RegisterRegion(RegionInfo.ScopeID, region); @@ -2709,6 +2709,8 @@ namespace OpenSim.Region.Framework.Scenes { m_sceneGraph.updateScenePartGroup(part, grp); } + +/* not in use, outdate by async method /// /// Move the given scene object into a new region depending on which region its absolute position has moved /// into. @@ -2757,6 +2759,7 @@ namespace OpenSim.Region.Framework.Scenes if (EntityTransferModule != null) EntityTransferModule.Cross(grp, attemptedPosition, silent); } +*/ // Simple test to see if a position is in the current region. // This test is mostly used to see if a region crossing is necessary. diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index b3bd7e0..e860862 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -672,7 +672,7 @@ namespace OpenSim.Region.Framework.Scenes if (sog.m_linkedAvatars.Count == 0) { - entityTransfer.CrossPrimGroupIntoNewRegion(destination, newpos, sog, true); + entityTransfer.CrossPrimGroupIntoNewRegion(destination, newpos, sog, true, true); return sog; } @@ -716,7 +716,7 @@ namespace OpenSim.Region.Framework.Scenes av.ParentID = 0; } - if (entityTransfer.CrossPrimGroupIntoNewRegion(destination, newpos, sog, true)) + if (entityTransfer.CrossPrimGroupIntoNewRegion(destination, newpos, sog, true, false)) { foreach (avtocrossInfo avinfo in avsToCross) { @@ -730,14 +730,24 @@ namespace OpenSim.Region.Framework.Scenes // CrossAgentToNewRegionDelegate d = entityTransfer.CrossAgentToNewRegionAsync; // d.BeginInvoke(av, val, destination, av.Flying, version, CrossAgentToNewRegionCompleted, d); entityTransfer.CrossAgentToNewRegionAsync(av, newpos, destination, av.Flying, version); - if(av.IsChildAgent) + if (av.IsChildAgent) { + // avatar crossed do some extra cleanup if (av.ParentUUID != UUID.Zero) { av.ClearControls(); av.ParentPart = null; } } + else + { + // avatar cross failed we need do dedicated standUp + // part of it was done at CrossAgentToNewRegionAsync + // so for now just remove the sog controls + // this may need extra care + av.UnRegisterSeatControls(sog.UUID); + } + av.ParentUUID = UUID.Zero; // In any case av.IsInTransit = false; @@ -748,6 +758,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat("[SCENE OBJECT]: Crossing avatar already in transit {0} to {1}", av.Name, val); } avsToCross.Clear(); + sog.RemoveScriptInstances(true); return sog; } else // cross failed, put avas back ?? @@ -805,6 +816,7 @@ namespace OpenSim.Region.Framework.Scenes } } +/* outdated private void CrossAgentToNewRegionCompleted(ScenePresence agent) { //// If the cross was successful, this agent is a child agent @@ -829,7 +841,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat("[SCENE OBJECT]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); } - +*/ public override Vector3 Velocity { get { return RootPart.Velocity; } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 516736a..6210db0 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -5264,7 +5264,7 @@ namespace OpenSim.Region.Framework.Scenes } } - private void UnRegisterSeatControls(UUID obj) + public void UnRegisterSeatControls(UUID obj) { List takers = new List(); -- cgit v1.1