From 3f1dbae8e4f47056555f9ecfaa32e959293ada48 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Fri, 12 Sep 2008 00:37:59 +0000 Subject: * minor: various doc and tidy up, logging increase to make it clearer which prim is failing a border crossing --- OpenSim/Region/Environment/Scenes/Scene.cs | 83 +++++++++++++++------- .../Region/Environment/Scenes/SceneObjectGroup.cs | 18 +++-- .../Region/Environment/Scenes/SceneObjectPart.cs | 16 ++--- 3 files changed, 80 insertions(+), 37 deletions(-) (limited to 'OpenSim/Region/Environment') diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index d8ce3f0..9c2dd06 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -1871,13 +1871,14 @@ namespace OpenSim.Region.Environment.Scenes } /// - /// Locate New region Handle and offset the prim position for the new region - /// + /// Move the given scene object into a new region depending on which region its absolute position has moved + /// into. + /// + /// This method locates the new region handle and offsets the prim position for the new region /// - /// current position of Group - /// Scene Object Group that we're crossing - - public void CrossPrimGroupIntoNewRegion(Vector3 position, SceneObjectGroup grp) + /// the attempted out of region position of the scene object + /// the scene object that we're crossing + public void CrossPrimGroupIntoNewRegion(Vector3 attemptedPosition, SceneObjectGroup grp) { if (grp == null) return; @@ -1897,53 +1898,70 @@ namespace OpenSim.Region.Environment.Scenes } return; } - - m_log.Warn("Prim crossing: " + grp.ToString()); + int thisx = (int)RegionInfo.RegionLocX; int thisy = (int)RegionInfo.RegionLocY; ulong newRegionHandle = 0; - Vector3 pos = position; + Vector3 pos = attemptedPosition; - if (position.X > Constants.RegionSize + 0.1f) + if (attemptedPosition.X > Constants.RegionSize + 0.1f) { pos.X = ((pos.X - Constants.RegionSize)); - newRegionHandle = Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize)); + newRegionHandle + = Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize)); // x + 1 } - else if (position.X < -0.1f) + else if (attemptedPosition.X < -0.1f) { pos.X = ((pos.X + Constants.RegionSize)); - newRegionHandle = Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize)); + newRegionHandle + = Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize)); // x - 1 } - if (position.Y > Constants.RegionSize + 0.1f) + if (attemptedPosition.Y > Constants.RegionSize + 0.1f) { pos.Y = ((pos.Y - Constants.RegionSize)); - newRegionHandle = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + 1) * Constants.RegionSize)); + newRegionHandle + = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + 1) * Constants.RegionSize)); // y + 1 } - else if (position.Y < -1f) + else if (attemptedPosition.Y < -1f) { pos.Y = ((pos.Y + Constants.RegionSize)); - newRegionHandle = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - 1) * Constants.RegionSize)); + newRegionHandle + = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - 1) * Constants.RegionSize)); // y - 1 } // Offset the positions for the new region across the border + Vector3 oldGroupPosition = grp.RootPart.GroupPosition; grp.OffsetForNewRegion(pos); - CrossPrimGroupIntoNewRegion(newRegionHandle, grp); + // If we fail to cross the border, then reset the position of the scene object on that border. + if (!CrossPrimGroupIntoNewRegion(newRegionHandle, grp)) + { + grp.OffsetForNewRegion(oldGroupPosition); + } } - public void CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp) + /// + /// Move the given scene object into a new region + /// + /// + /// Scene Object Group that we're crossing + /// + /// 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(ulong newRegionHandle, SceneObjectGroup grp) { + bool successYN = false; int primcrossingXMLmethod = 0; + if (newRegionHandle != 0) { - bool successYN = false; - successYN = m_sceneGridService.PrimCrossToNeighboringRegion( newRegionHandle, grp.UUID, m_serialiser.SaveGroupToXml2(grp), primcrossingXMLmethod); @@ -1955,14 +1973,15 @@ namespace OpenSim.Region.Environment.Scenes { DeleteSceneObject(grp); } - catch (Exception) + catch (Exception e) { - m_log.Warn("[DATABASE]: exception when trying to remove the prim that crossed the border."); + m_log.ErrorFormat( + "[INTERREGION]: Exception deleting the old object left behind on a border crossing for {0}, {1}", + grp, e); } } else { - m_log.Warn("[INTERREGION]: Prim Crossing Failed!"); if (grp.RootPart != null) { if (grp.RootPart.PhysActor != null) @@ -1970,10 +1989,26 @@ namespace OpenSim.Region.Environment.Scenes grp.RootPart.PhysActor.CrossingFailure(); } } + + m_log.ErrorFormat("[INTERREGION]: Prim crossing failed for {0}", grp); } } + else + { + m_log.Error("[INTERREGION]: region handle was unexpectedly 0 in Scene.CrossPrimGroupIntoNewRegion()"); + } + + return successYN; } + /// + /// Handle a scene object that is crossing into this region from another. + /// + /// + /// + /// + /// + /// public bool IncomingInterRegionPrimGroup(ulong regionHandle, UUID primID, string objXMLData, int XMLMethod) { m_log.Warn("{[INTERREGION]: A new prim arrived from a neighbor"); diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 1b2ea8e..f52e764 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -180,6 +180,9 @@ namespace OpenSim.Region.Environment.Scenes } } + /// + /// The absolute position of this scene object in the scene + /// public override Vector3 AbsolutePosition { get @@ -195,8 +198,9 @@ namespace OpenSim.Region.Environment.Scenes set { Vector3 val = value; + if ((val.X > 257f || val.X < -1f || val.Y > 257f || val.Y < -1f) && !m_rootPart.IsAttachment) - { + { m_scene.CrossPrimGroupIntoNewRegion(val, this); } @@ -899,7 +903,6 @@ namespace OpenSim.Region.Environment.Scenes public void ResetChildPrimPhysicsPositions() { AbsolutePosition = AbsolutePosition; // could someone in the know please explain how this works? - //HasGroupChanged = false; } public UUID GetPartsFullID(uint localID) @@ -1090,10 +1093,10 @@ namespace OpenSim.Region.Environment.Scenes { part.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_physicalPrim); } - + // Hack to get the physics scene geometries in the right spot - ResetChildPrimPhysicsPositions(); - } + ResetChildPrimPhysicsPositions(); + } } else { @@ -2706,5 +2709,10 @@ namespace OpenSim.Region.Environment.Scenes part.TriggerScriptChangedEvent(val); } } + + public override string ToString() + { + return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition); + } } } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index eaabdd5..2b0ad12 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -108,8 +108,6 @@ namespace OpenSim.Region.Environment.Scenes [XmlIgnore] public PhysicsActor PhysActor = null; - - //Xantor 20080528 Sound stuff: // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet. // Not a big problem as long as the script that sets it remains in the prim on startup. @@ -443,6 +441,9 @@ namespace OpenSim.Region.Environment.Scenes set { m_particleSystem = value; } } + /// + /// The position of the entire group that this prim belongs to. + /// public Vector3 GroupPosition { get @@ -475,18 +476,14 @@ namespace OpenSim.Region.Environment.Scenes { try { - // Root prim actually goes at Position if (_parentID == 0) { PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z); - } else { - // To move the child prim in respect to the group position and rotation we have to calculate - Vector3 resultingposition = GetWorldPosition(); PhysActor.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); Quaternion resultingrot = GetWorldRotation(); @@ -783,8 +780,6 @@ namespace OpenSim.Region.Environment.Scenes get { return m_parentGroup; } } - - public scriptEvents ScriptEvents { get { return AggregateScriptEvents; } @@ -3321,6 +3316,11 @@ namespace OpenSim.Region.Environment.Scenes public bool GetForceMouselook() { return m_forceMouselook; } + + public override string ToString() + { + return String.Format("{0} {1} (parent {2}))", Name, UUID, ParentGroup); + } #endregion Public Methods } -- cgit v1.1