Add a position parameter to region crossing of objects. This avoids the
potential bad update that places an object at the opposite side of the origin sim for a moment before actually crossing it. Especially important in grids like OSG where lag between sims is high.xassetservice
							parent
							
								
									cf9b3e7708
								
							
						
					
					
						commit
						1dfc990264
					
				| 
						 | 
				
			
			@ -1704,14 +1704,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
 | 
			
		||||
            // Offset the positions for the new region across the border
 | 
			
		||||
            Vector3 oldGroupPosition = grp.RootPart.GroupPosition;
 | 
			
		||||
            grp.RootPart.GroupPosition = pos;
 | 
			
		||||
 | 
			
		||||
            // If we fail to cross the border, then reset the position of the scene object on that border.
 | 
			
		||||
            uint x = 0, y = 0;
 | 
			
		||||
            Utils.LongToUInts(newRegionHandle, out x, out y);
 | 
			
		||||
            GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
 | 
			
		||||
 | 
			
		||||
            if (destination == null || !CrossPrimGroupIntoNewRegion(destination, grp, silent))
 | 
			
		||||
            if (destination == null || !CrossPrimGroupIntoNewRegion(destination, pos, grp, silent))
 | 
			
		||||
            {
 | 
			
		||||
                m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}",grp.UUID);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1741,7 +1740,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
 | 
			
		||||
        /// </returns>
 | 
			
		||||
        protected bool CrossPrimGroupIntoNewRegion(GridRegion destination, SceneObjectGroup grp, bool silent)
 | 
			
		||||
        protected bool CrossPrimGroupIntoNewRegion(GridRegion destination, Vector3 newPosition, SceneObjectGroup grp, bool silent)
 | 
			
		||||
        {
 | 
			
		||||
            //m_log.Debug("  >>> CrossPrimGroupIntoNewRegion <<<");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1766,7 +1765,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
                //if (m_interregionCommsOut != null)
 | 
			
		||||
                //    successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true);
 | 
			
		||||
                if (m_aScene.SimulationService != null)
 | 
			
		||||
                    successYN = m_aScene.SimulationService.CreateObject(destination, grp, true);
 | 
			
		||||
                    successYN = m_aScene.SimulationService.CreateObject(destination, newPosition, grp, true);
 | 
			
		||||
 | 
			
		||||
                if (successYN)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -1825,7 +1824,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
                    gobj.IsAttachment = false;
 | 
			
		||||
                    //gobj.RootPart.LastOwnerID = gobj.GetFromAssetID();
 | 
			
		||||
                    m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending attachment {0} to region {1}", gobj.UUID, destination.RegionName);
 | 
			
		||||
                    CrossPrimGroupIntoNewRegion(destination, gobj, silent);
 | 
			
		||||
                    CrossPrimGroupIntoNewRegion(destination, Vector3.Zero, gobj, silent);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -315,7 +315,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
 | 
			
		|||
         * Object-related communications
 | 
			
		||||
         */
 | 
			
		||||
 | 
			
		||||
        public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
 | 
			
		||||
        public bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog, bool isLocalCall)
 | 
			
		||||
        {
 | 
			
		||||
            if (destination == null)
 | 
			
		||||
                return false;
 | 
			
		||||
| 
						 | 
				
			
			@ -330,12 +330,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
 | 
			
		|||
                        // We need to make a local copy of the object
 | 
			
		||||
                        ISceneObject sogClone = sog.CloneForNewScene();
 | 
			
		||||
                        sogClone.SetState(sog.GetStateSnapshot(), s);
 | 
			
		||||
                        return s.IncomingCreateObject(sogClone);
 | 
			
		||||
                        return s.IncomingCreateObject(newPosition, sogClone);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        // Use the object as it came through the wire
 | 
			
		||||
                        return s.IncomingCreateObject(sog);
 | 
			
		||||
                        return s.IncomingCreateObject(newPosition, sog);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -282,13 +282,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
 | 
			
		|||
         * Object-related communications
 | 
			
		||||
         */
 | 
			
		||||
 | 
			
		||||
        public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
 | 
			
		||||
        public bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog, bool isLocalCall)
 | 
			
		||||
        {
 | 
			
		||||
            if (destination == null)
 | 
			
		||||
                return false;
 | 
			
		||||
 | 
			
		||||
            // Try local first
 | 
			
		||||
            if (m_localBackend.CreateObject(destination, sog, isLocalCall))
 | 
			
		||||
            if (m_localBackend.CreateObject(destination, newPosition, sog, isLocalCall))
 | 
			
		||||
            {
 | 
			
		||||
                //m_log.Debug("[REST COMMS]: LocalBackEnd SendCreateObject succeeded");
 | 
			
		||||
                return true;
 | 
			
		||||
| 
						 | 
				
			
			@ -296,7 +296,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
 | 
			
		|||
 | 
			
		||||
            // else do the remote thing
 | 
			
		||||
            if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
 | 
			
		||||
                return m_remoteConnector.CreateObject(destination, sog, isLocalCall);
 | 
			
		||||
                return m_remoteConnector.CreateObject(destination, newPosition, sog, isLocalCall);
 | 
			
		||||
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2317,7 +2317,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// </summary>
 | 
			
		||||
        /// <param name="sog"></param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        public bool IncomingCreateObject(ISceneObject sog)
 | 
			
		||||
        public bool IncomingCreateObject(Vector3 newPosition, ISceneObject sog)
 | 
			
		||||
        {
 | 
			
		||||
            //m_log.DebugFormat(" >>> IncomingCreateObject(sog) <<< {0} deleted? {1} isAttach? {2}", ((SceneObjectGroup)sog).AbsolutePosition,
 | 
			
		||||
            //    ((SceneObjectGroup)sog).IsDeleted, ((SceneObjectGroup)sog).RootPart.IsAttachment);
 | 
			
		||||
| 
						 | 
				
			
			@ -2333,6 +2333,9 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (newPosition != Vector3.Zero)
 | 
			
		||||
                newObject.RootPart.GroupPosition = newPosition;
 | 
			
		||||
 | 
			
		||||
            if (!AddSceneObject(newObject))
 | 
			
		||||
            {
 | 
			
		||||
                m_log.DebugFormat("[SCENE]: Problem adding scene object {0} in {1} ", sog.UUID, RegionInfo.RegionName);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3223,7 +3223,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                    ((SceneObjectGroup)so).LocalId = 0;
 | 
			
		||||
                    ((SceneObjectGroup)so).RootPart.ClearUpdateSchedule();
 | 
			
		||||
                    so.SetState(cAgent.AttachmentObjectStates[i++], m_scene);
 | 
			
		||||
                    m_scene.IncomingCreateObject(so);
 | 
			
		||||
                    m_scene.IncomingCreateObject(Vector3.Zero, so);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -136,6 +136,8 @@ namespace OpenSim.Server.Handlers.Simulation
 | 
			
		|||
            int x = 0, y = 0;
 | 
			
		||||
            UUID uuid = UUID.Zero;
 | 
			
		||||
            string regionname = string.Empty;
 | 
			
		||||
            Vector3 newPosition = Vector3.Zero;
 | 
			
		||||
 | 
			
		||||
            if (args.ContainsKey("destination_x") && args["destination_x"] != null)
 | 
			
		||||
                Int32.TryParse(args["destination_x"].AsString(), out x);
 | 
			
		||||
            if (args.ContainsKey("destination_y") && args["destination_y"] != null)
 | 
			
		||||
| 
						 | 
				
			
			@ -144,6 +146,8 @@ namespace OpenSim.Server.Handlers.Simulation
 | 
			
		|||
                UUID.TryParse(args["destination_uuid"].AsString(), out uuid);
 | 
			
		||||
            if (args.ContainsKey("destination_name") && args["destination_name"] != null)
 | 
			
		||||
                regionname = args["destination_name"].ToString();
 | 
			
		||||
            if (args.ContainsKey("new_position") && args["new_position"] != null)
 | 
			
		||||
                Vector3.TryParse(args["new_position"], out newPosition);
 | 
			
		||||
 | 
			
		||||
            GridRegion destination = new GridRegion();
 | 
			
		||||
            destination.RegionID = uuid;
 | 
			
		||||
| 
						 | 
				
			
			@ -199,7 +203,7 @@ namespace OpenSim.Server.Handlers.Simulation
 | 
			
		|||
            try
 | 
			
		||||
            {
 | 
			
		||||
                // This is the meaning of POST object
 | 
			
		||||
                result = CreateObject(destination, sog);
 | 
			
		||||
                result = CreateObject(destination, newPosition, sog);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -211,9 +215,9 @@ namespace OpenSim.Server.Handlers.Simulation
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        // subclasses can override this
 | 
			
		||||
        protected virtual bool CreateObject(GridRegion destination, ISceneObject sog)
 | 
			
		||||
        protected virtual bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog)
 | 
			
		||||
        {
 | 
			
		||||
            return m_SimulationService.CreateObject(destination, sog, false);
 | 
			
		||||
            return m_SimulationService.CreateObject(destination, newPosition, sog, false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected virtual void DoObjectPut(Hashtable request, Hashtable responsedata, UUID regionID)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -408,7 +408,7 @@ namespace OpenSim.Services.Connectors.Simulation
 | 
			
		|||
        /// <summary>
 | 
			
		||||
        ///
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
 | 
			
		||||
        public bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog, bool isLocalCall)
 | 
			
		||||
        {
 | 
			
		||||
            // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateObject start");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -421,6 +421,7 @@ namespace OpenSim.Services.Connectors.Simulation
 | 
			
		|||
                args["sog"] = OSD.FromString(sog.ToXml2());
 | 
			
		||||
                args["extra"] = OSD.FromString(sog.ExtraToXmlString());
 | 
			
		||||
                args["modified"] = OSD.FromBoolean(sog.HasGroupChanged);
 | 
			
		||||
                args["new_position"] = newPosition.ToString();
 | 
			
		||||
 | 
			
		||||
                string state = sog.GetStateSnapshot();
 | 
			
		||||
                if (state.Length > 0)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -98,7 +98,7 @@ namespace OpenSim.Services.Interfaces
 | 
			
		|||
        /// <param name="sog"></param>
 | 
			
		||||
        /// <param name="isLocalCall"></param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall);
 | 
			
		||||
        bool CreateObject(GridRegion destination, Vector3 newPosition, ISceneObject sog, bool isLocalCall);
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Create an object from the user's inventory in the destination region. 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue