aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs83
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs18
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.cs16
3 files changed, 80 insertions, 37 deletions
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
1871 } 1871 }
1872 1872
1873 /// <summary> 1873 /// <summary>
1874 /// Locate New region Handle and offset the prim position for the new region 1874 /// Move the given scene object into a new region depending on which region its absolute position has moved
1875 /// 1875 /// into.
1876 ///
1877 /// This method locates the new region handle and offsets the prim position for the new region
1876 /// </summary> 1878 /// </summary>
1877 /// <param name="position">current position of Group</param> 1879 /// <param name="attemptedPosition">the attempted out of region position of the scene object</param>
1878 /// <param name="grp">Scene Object Group that we're crossing</param> 1880 /// <param name="grp">the scene object that we're crossing</param>
1879 1881 public void CrossPrimGroupIntoNewRegion(Vector3 attemptedPosition, SceneObjectGroup grp)
1880 public void CrossPrimGroupIntoNewRegion(Vector3 position, SceneObjectGroup grp)
1881 { 1882 {
1882 if (grp == null) 1883 if (grp == null)
1883 return; 1884 return;
@@ -1897,53 +1898,70 @@ namespace OpenSim.Region.Environment.Scenes
1897 } 1898 }
1898 return; 1899 return;
1899 } 1900 }
1900 1901
1901 m_log.Warn("Prim crossing: " + grp.ToString());
1902 int thisx = (int)RegionInfo.RegionLocX; 1902 int thisx = (int)RegionInfo.RegionLocX;
1903 int thisy = (int)RegionInfo.RegionLocY; 1903 int thisy = (int)RegionInfo.RegionLocY;
1904 1904
1905 ulong newRegionHandle = 0; 1905 ulong newRegionHandle = 0;
1906 Vector3 pos = position; 1906 Vector3 pos = attemptedPosition;
1907 1907
1908 if (position.X > Constants.RegionSize + 0.1f) 1908 if (attemptedPosition.X > Constants.RegionSize + 0.1f)
1909 { 1909 {
1910 pos.X = ((pos.X - Constants.RegionSize)); 1910 pos.X = ((pos.X - Constants.RegionSize));
1911 newRegionHandle = Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize)); 1911 newRegionHandle
1912 = Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize));
1912 // x + 1 1913 // x + 1
1913 } 1914 }
1914 else if (position.X < -0.1f) 1915 else if (attemptedPosition.X < -0.1f)
1915 { 1916 {
1916 pos.X = ((pos.X + Constants.RegionSize)); 1917 pos.X = ((pos.X + Constants.RegionSize));
1917 newRegionHandle = Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize)); 1918 newRegionHandle
1919 = Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize));
1918 // x - 1 1920 // x - 1
1919 } 1921 }
1920 1922
1921 if (position.Y > Constants.RegionSize + 0.1f) 1923 if (attemptedPosition.Y > Constants.RegionSize + 0.1f)
1922 { 1924 {
1923 pos.Y = ((pos.Y - Constants.RegionSize)); 1925 pos.Y = ((pos.Y - Constants.RegionSize));
1924 newRegionHandle = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + 1) * Constants.RegionSize)); 1926 newRegionHandle
1927 = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + 1) * Constants.RegionSize));
1925 // y + 1 1928 // y + 1
1926 } 1929 }
1927 else if (position.Y < -1f) 1930 else if (attemptedPosition.Y < -1f)
1928 { 1931 {
1929 pos.Y = ((pos.Y + Constants.RegionSize)); 1932 pos.Y = ((pos.Y + Constants.RegionSize));
1930 newRegionHandle = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - 1) * Constants.RegionSize)); 1933 newRegionHandle
1934 = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - 1) * Constants.RegionSize));
1931 // y - 1 1935 // y - 1
1932 } 1936 }
1933 1937
1934 // Offset the positions for the new region across the border 1938 // Offset the positions for the new region across the border
1939 Vector3 oldGroupPosition = grp.RootPart.GroupPosition;
1935 grp.OffsetForNewRegion(pos); 1940 grp.OffsetForNewRegion(pos);
1936 1941
1937 CrossPrimGroupIntoNewRegion(newRegionHandle, grp); 1942 // If we fail to cross the border, then reset the position of the scene object on that border.
1943 if (!CrossPrimGroupIntoNewRegion(newRegionHandle, grp))
1944 {
1945 grp.OffsetForNewRegion(oldGroupPosition);
1946 }
1938 } 1947 }
1939 1948
1940 public void CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp) 1949 /// <summary>
1950 /// Move the given scene object into a new region
1951 /// </summary>
1952 /// <param name="newRegionHandle"></param>
1953 /// <param name="grp">Scene Object Group that we're crossing</param>
1954 /// <returns>
1955 /// true if the crossing itself was successful, false on failure
1956 /// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region
1957 /// </returns>
1958 public bool CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp)
1941 { 1959 {
1960 bool successYN = false;
1942 int primcrossingXMLmethod = 0; 1961 int primcrossingXMLmethod = 0;
1962
1943 if (newRegionHandle != 0) 1963 if (newRegionHandle != 0)
1944 { 1964 {
1945 bool successYN = false;
1946
1947 successYN 1965 successYN
1948 = m_sceneGridService.PrimCrossToNeighboringRegion( 1966 = m_sceneGridService.PrimCrossToNeighboringRegion(
1949 newRegionHandle, grp.UUID, m_serialiser.SaveGroupToXml2(grp), primcrossingXMLmethod); 1967 newRegionHandle, grp.UUID, m_serialiser.SaveGroupToXml2(grp), primcrossingXMLmethod);
@@ -1955,14 +1973,15 @@ namespace OpenSim.Region.Environment.Scenes
1955 { 1973 {
1956 DeleteSceneObject(grp); 1974 DeleteSceneObject(grp);
1957 } 1975 }
1958 catch (Exception) 1976 catch (Exception e)
1959 { 1977 {
1960 m_log.Warn("[DATABASE]: exception when trying to remove the prim that crossed the border."); 1978 m_log.ErrorFormat(
1979 "[INTERREGION]: Exception deleting the old object left behind on a border crossing for {0}, {1}",
1980 grp, e);
1961 } 1981 }
1962 } 1982 }
1963 else 1983 else
1964 { 1984 {
1965 m_log.Warn("[INTERREGION]: Prim Crossing Failed!");
1966 if (grp.RootPart != null) 1985 if (grp.RootPart != null)
1967 { 1986 {
1968 if (grp.RootPart.PhysActor != null) 1987 if (grp.RootPart.PhysActor != null)
@@ -1970,10 +1989,26 @@ namespace OpenSim.Region.Environment.Scenes
1970 grp.RootPart.PhysActor.CrossingFailure(); 1989 grp.RootPart.PhysActor.CrossingFailure();
1971 } 1990 }
1972 } 1991 }
1992
1993 m_log.ErrorFormat("[INTERREGION]: Prim crossing failed for {0}", grp);
1973 } 1994 }
1974 } 1995 }
1996 else
1997 {
1998 m_log.Error("[INTERREGION]: region handle was unexpectedly 0 in Scene.CrossPrimGroupIntoNewRegion()");
1999 }
2000
2001 return successYN;
1975 } 2002 }
1976 2003
2004 /// <summary>
2005 /// Handle a scene object that is crossing into this region from another.
2006 /// </summary>
2007 /// <param name="regionHandle"></param>
2008 /// <param name="primID"></param>
2009 /// <param name="objXMLData"></param>
2010 /// <param name="XMLMethod"></param>
2011 /// <returns></returns>
1977 public bool IncomingInterRegionPrimGroup(ulong regionHandle, UUID primID, string objXMLData, int XMLMethod) 2012 public bool IncomingInterRegionPrimGroup(ulong regionHandle, UUID primID, string objXMLData, int XMLMethod)
1978 { 2013 {
1979 m_log.Warn("{[INTERREGION]: A new prim arrived from a neighbor"); 2014 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
180 } 180 }
181 } 181 }
182 182
183 /// <summary>
184 /// The absolute position of this scene object in the scene
185 /// </summary>
183 public override Vector3 AbsolutePosition 186 public override Vector3 AbsolutePosition
184 { 187 {
185 get 188 get
@@ -195,8 +198,9 @@ namespace OpenSim.Region.Environment.Scenes
195 set 198 set
196 { 199 {
197 Vector3 val = value; 200 Vector3 val = value;
201
198 if ((val.X > 257f || val.X < -1f || val.Y > 257f || val.Y < -1f) && !m_rootPart.IsAttachment) 202 if ((val.X > 257f || val.X < -1f || val.Y > 257f || val.Y < -1f) && !m_rootPart.IsAttachment)
199 { 203 {
200 m_scene.CrossPrimGroupIntoNewRegion(val, this); 204 m_scene.CrossPrimGroupIntoNewRegion(val, this);
201 } 205 }
202 206
@@ -899,7 +903,6 @@ namespace OpenSim.Region.Environment.Scenes
899 public void ResetChildPrimPhysicsPositions() 903 public void ResetChildPrimPhysicsPositions()
900 { 904 {
901 AbsolutePosition = AbsolutePosition; // could someone in the know please explain how this works? 905 AbsolutePosition = AbsolutePosition; // could someone in the know please explain how this works?
902 //HasGroupChanged = false;
903 } 906 }
904 907
905 public UUID GetPartsFullID(uint localID) 908 public UUID GetPartsFullID(uint localID)
@@ -1090,10 +1093,10 @@ namespace OpenSim.Region.Environment.Scenes
1090 { 1093 {
1091 part.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_physicalPrim); 1094 part.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_physicalPrim);
1092 } 1095 }
1093 1096
1094 // Hack to get the physics scene geometries in the right spot 1097 // Hack to get the physics scene geometries in the right spot
1095 ResetChildPrimPhysicsPositions(); 1098 ResetChildPrimPhysicsPositions();
1096 } 1099 }
1097 } 1100 }
1098 else 1101 else
1099 { 1102 {
@@ -2706,5 +2709,10 @@ namespace OpenSim.Region.Environment.Scenes
2706 part.TriggerScriptChangedEvent(val); 2709 part.TriggerScriptChangedEvent(val);
2707 } 2710 }
2708 } 2711 }
2712
2713 public override string ToString()
2714 {
2715 return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition);
2716 }
2709 } 2717 }
2710} 2718}
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
108 [XmlIgnore] 108 [XmlIgnore]
109 public PhysicsActor PhysActor = null; 109 public PhysicsActor PhysActor = null;
110 110
111
112
113 //Xantor 20080528 Sound stuff: 111 //Xantor 20080528 Sound stuff:
114 // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet. 112 // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet.
115 // Not a big problem as long as the script that sets it remains in the prim on startup. 113 // 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
443 set { m_particleSystem = value; } 441 set { m_particleSystem = value; }
444 } 442 }
445 443
444 /// <summary>
445 /// The position of the entire group that this prim belongs to.
446 /// </summary>
446 public Vector3 GroupPosition 447 public Vector3 GroupPosition
447 { 448 {
448 get 449 get
@@ -475,18 +476,14 @@ namespace OpenSim.Region.Environment.Scenes
475 { 476 {
476 try 477 try
477 { 478 {
478
479 // Root prim actually goes at Position 479 // Root prim actually goes at Position
480 if (_parentID == 0) 480 if (_parentID == 0)
481 { 481 {
482 PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z); 482 PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z);
483
484 } 483 }
485 else 484 else
486 { 485 {
487
488 // To move the child prim in respect to the group position and rotation we have to calculate 486 // To move the child prim in respect to the group position and rotation we have to calculate
489
490 Vector3 resultingposition = GetWorldPosition(); 487 Vector3 resultingposition = GetWorldPosition();
491 PhysActor.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); 488 PhysActor.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z);
492 Quaternion resultingrot = GetWorldRotation(); 489 Quaternion resultingrot = GetWorldRotation();
@@ -783,8 +780,6 @@ namespace OpenSim.Region.Environment.Scenes
783 get { return m_parentGroup; } 780 get { return m_parentGroup; }
784 } 781 }
785 782
786
787
788 public scriptEvents ScriptEvents 783 public scriptEvents ScriptEvents
789 { 784 {
790 get { return AggregateScriptEvents; } 785 get { return AggregateScriptEvents; }
@@ -3321,6 +3316,11 @@ namespace OpenSim.Region.Environment.Scenes
3321 public bool GetForceMouselook() { 3316 public bool GetForceMouselook() {
3322 return m_forceMouselook; 3317 return m_forceMouselook;
3323 } 3318 }
3319
3320 public override string ToString()
3321 {
3322 return String.Format("{0} {1} (parent {2}))", Name, UUID, ParentGroup);
3323 }
3324 3324
3325 #endregion Public Methods 3325 #endregion Public Methods
3326 } 3326 }