From ac718843d92df3b512c4b9194bc05940ab064faf Mon Sep 17 00:00:00 2001 From: Teravus Ovares (Dan Olivares) Date: Fri, 28 Aug 2009 14:45:17 -0400 Subject: * Allow corner prim crossings. Previously this was only on a single cardinal direction * Some leg work in getting avatar teleports into 'virtual regions' moved to the proper region. --- .../CoreModules/World/Land/PhysicsCombiner.cs | 67 ++++++++-- OpenSim/Region/Framework/Scenes/Border.cs | 21 ++- OpenSim/Region/Framework/Scenes/Scene.cs | 145 ++++++++++++++++++--- 3 files changed, 201 insertions(+), 32 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs b/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs index 3a4a17b..22ef107 100644 --- a/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs +++ b/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs @@ -216,9 +216,9 @@ namespace OpenSim.Region.CoreModules.World.Land //xxy //xxx if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd - == (regionConnections.X * (int)Constants.RegionSize)) + >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) - == (regionConnections.Y * (int)Constants.RegionSize))) + >= (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - @@ -262,9 +262,9 @@ namespace OpenSim.Region.CoreModules.World.Land //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) - == (regionConnections.X * (int)Constants.RegionSize)) + >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd - == (regionConnections.Y * (int)Constants.RegionSize))) + >= (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - @@ -303,9 +303,9 @@ namespace OpenSim.Region.CoreModules.World.Land //xxx //xxx if ((((int)conn.X * (int)Constants.RegionSize) + conn.YEnd - == (regionConnections.X * (int)Constants.RegionSize)) + >= (regionConnections.X * (int)Constants.RegionSize)) && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd - == (regionConnections.Y * (int)Constants.RegionSize))) + >= (regionConnections.Y * (int)Constants.RegionSize))) { Vector3 offset = Vector3.Zero; offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - @@ -315,13 +315,58 @@ namespace OpenSim.Region.CoreModules.World.Land Vector3 extents = Vector3.Zero; extents.Y = regionConnections.YEnd + conn.YEnd; - extents.X = conn.XEnd + conn.XEnd; + extents.X = regionConnections.XEnd + conn.XEnd; + conn.UpdateExtents(extents); + + m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}", + conn.RegionScene.RegionInfo.RegionName, + regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); + + conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); + scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); + + if (conn.RegionScene.NorthBorders.Count == 1)// && 2) + { + //compound border + conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; + conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; + conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; + + + + } + + scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south + + if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) + { + + conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; + conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; + conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; + + + } + scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West +/* + else + { + conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; + conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; + conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; + scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south + } +*/ + - m_log.DebugFormat("Scene: {0} to the south of Scene{1} Offset: {2}. Extents:{3}", - conn.RegionScene.RegionInfo.RegionName, - regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); + // Reset Terrain.. since terrain normally loads first. + //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); + scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); + //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); + + connectedYN = true; - scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); + //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); break; } diff --git a/OpenSim/Region/Framework/Scenes/Border.cs b/OpenSim/Region/Framework/Scenes/Border.cs index 19ecb4f..9a08afe 100644 --- a/OpenSim/Region/Framework/Scenes/Border.cs +++ b/OpenSim/Region/Framework/Scenes/Border.cs @@ -34,7 +34,7 @@ namespace OpenSim.Region.Framework.Scenes { public class Border { - + /// /// Line perpendicular to the Direction Cardinal. Z value is the /// @@ -125,6 +125,25 @@ namespace OpenSim.Region.Framework.Scenes return result; } + public float Extent + { + get + { + switch (CrossDirection) + { + case Cardinals.N: + break; + case Cardinals.S: + break; + case Cardinals.W: + break; + case Cardinals.E: + break; + } + return 0; + } + } + } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index acf0375..dfd06bb 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1706,37 +1706,86 @@ namespace OpenSim.Region.Framework.Scenes ulong newRegionHandle = 0; Vector3 pos = attemptedPosition; - - - if (TestBorderCross(attemptedPosition, Cardinals.E)) + if (TestBorderCross(attemptedPosition, Cardinals.W)) { - pos.X = ((pos.X - Constants.RegionSize)); - newRegionHandle - = Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize)); - // x + 1 + if (TestBorderCross(attemptedPosition, Cardinals.S)) + { + //Border crossedBorderx = GetCrossedBorder(attemptedPosition,Cardinals.W); + //Border crossedBordery = GetCrossedBorder(attemptedPosition, Cardinals.S); + //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) + pos.X = ((pos.X + Constants.RegionSize)); + pos.Y = ((pos.Y + Constants.RegionSize)); + newRegionHandle + = Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize), + (uint)((thisy - 1) * Constants.RegionSize)); + // x - 1 + // y - 1 + } + else if (TestBorderCross(attemptedPosition, Cardinals.N)) + { + pos.X = ((pos.X + Constants.RegionSize)); + pos.Y = ((pos.Y - Constants.RegionSize)); + newRegionHandle + = Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize), + (uint)((thisy + 1) * Constants.RegionSize)); + // x - 1 + // y + 1 + } + else + { + pos.X = ((pos.X + Constants.RegionSize)); + newRegionHandle + = Util.UIntsToLong((uint) ((thisx - 1)*Constants.RegionSize), + (uint) (thisy*Constants.RegionSize)); + // x - 1 + } } - else if (TestBorderCross(attemptedPosition, Cardinals.W)) + else if (TestBorderCross(attemptedPosition, Cardinals.E)) { - pos.X = ((pos.X + Constants.RegionSize)); + if (TestBorderCross(attemptedPosition, Cardinals.S)) + { + pos.X = ((pos.X - Constants.RegionSize)); + pos.Y = ((pos.Y + Constants.RegionSize)); + newRegionHandle + = Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize), + (uint)((thisy - 1) * Constants.RegionSize)); + // x + 1 + // y - 1 + } + else if (TestBorderCross(attemptedPosition, Cardinals.N)) + { + pos.X = ((pos.X - Constants.RegionSize)); + pos.Y = ((pos.Y - Constants.RegionSize)); + newRegionHandle + = Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize), + (uint)((thisy + 1) * Constants.RegionSize)); + // x + 1 + // y + 1 + } + else + { + pos.X = ((pos.X - Constants.RegionSize)); + newRegionHandle + = Util.UIntsToLong((uint) ((thisx + 1)*Constants.RegionSize), + (uint) (thisy*Constants.RegionSize)); + // x + 1 + } + } + else if (TestBorderCross(attemptedPosition, Cardinals.S)) + { + pos.Y = ((pos.Y + Constants.RegionSize)); newRegionHandle - = Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize)); - // x - 1 + = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - 1) * Constants.RegionSize)); + // y - 1 } - - if (TestBorderCross(attemptedPosition, Cardinals.N)) + else if (TestBorderCross(attemptedPosition, Cardinals.N)) { + pos.Y = ((pos.Y - Constants.RegionSize)); newRegionHandle = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + 1) * Constants.RegionSize)); // y + 1 } - else if (TestBorderCross(attemptedPosition, Cardinals.S)) - { - pos.Y = ((pos.Y + 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; @@ -1750,6 +1799,62 @@ namespace OpenSim.Region.Framework.Scenes } } + public Border GetCrossedBorder(Vector3 position, Cardinals gridline) + { + + switch (gridline) + { + case Cardinals.N: + lock (NorthBorders) + { + foreach (Border b in NorthBorders) + { + if (b.TestCross(position)) + return b; + } + } + break; + case Cardinals.S: + + + lock (SouthBorders) + { + foreach (Border b in SouthBorders) + { + if (b.TestCross(position)) + return b; + } + } + + break; + case Cardinals.E: + lock (EastBorders) + { + foreach (Border b in EastBorders) + { + if (b.TestCross(position)) + return b; + } + } + + break; + case Cardinals.W: + + lock (WestBorders) + { + foreach (Border b in WestBorders) + { + if (b.TestCross(position)) + return b; + } + } + break; + + } + + return null; + } + public bool TestBorderCross(Vector3 position, Cardinals border) { switch (border) -- cgit v1.1