diff options
author | Teravus Ovares (Dan Olivares) | 2009-08-28 14:45:17 -0400 |
---|---|---|
committer | Teravus Ovares (Dan Olivares) | 2009-08-28 14:45:17 -0400 |
commit | ac718843d92df3b512c4b9194bc05940ab064faf (patch) | |
tree | e594a16d6a0e8006d353a50d4910f81a628928b3 | |
parent | Merge branch 'master' of ssh://MyConnection/var/git/opensim (diff) | |
download | opensim-SC-ac718843d92df3b512c4b9194bc05940ab064faf.zip opensim-SC-ac718843d92df3b512c4b9194bc05940ab064faf.tar.gz opensim-SC-ac718843d92df3b512c4b9194bc05940ab064faf.tar.bz2 opensim-SC-ac718843d92df3b512c4b9194bc05940ab064faf.tar.xz |
* 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.
-rw-r--r-- | OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs | 67 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Border.cs | 21 | ||||
-rw-r--r-- | 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 | |||
216 | //xxy | 216 | //xxy |
217 | //xxx | 217 | //xxx |
218 | if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd | 218 | if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd |
219 | == (regionConnections.X * (int)Constants.RegionSize)) | 219 | >= (regionConnections.X * (int)Constants.RegionSize)) |
220 | && (((int)conn.Y * (int)Constants.RegionSize) | 220 | && (((int)conn.Y * (int)Constants.RegionSize) |
221 | == (regionConnections.Y * (int)Constants.RegionSize))) | 221 | >= (regionConnections.Y * (int)Constants.RegionSize))) |
222 | { | 222 | { |
223 | Vector3 offset = Vector3.Zero; | 223 | Vector3 offset = Vector3.Zero; |
224 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - | 224 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - |
@@ -262,9 +262,9 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
262 | //xxx | 262 | //xxx |
263 | //xxx | 263 | //xxx |
264 | if ((((int)conn.X * (int)Constants.RegionSize) | 264 | if ((((int)conn.X * (int)Constants.RegionSize) |
265 | == (regionConnections.X * (int)Constants.RegionSize)) | 265 | >= (regionConnections.X * (int)Constants.RegionSize)) |
266 | && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd | 266 | && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd |
267 | == (regionConnections.Y * (int)Constants.RegionSize))) | 267 | >= (regionConnections.Y * (int)Constants.RegionSize))) |
268 | { | 268 | { |
269 | Vector3 offset = Vector3.Zero; | 269 | Vector3 offset = Vector3.Zero; |
270 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - | 270 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - |
@@ -303,9 +303,9 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
303 | //xxx | 303 | //xxx |
304 | //xxx | 304 | //xxx |
305 | if ((((int)conn.X * (int)Constants.RegionSize) + conn.YEnd | 305 | if ((((int)conn.X * (int)Constants.RegionSize) + conn.YEnd |
306 | == (regionConnections.X * (int)Constants.RegionSize)) | 306 | >= (regionConnections.X * (int)Constants.RegionSize)) |
307 | && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd | 307 | && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd |
308 | == (regionConnections.Y * (int)Constants.RegionSize))) | 308 | >= (regionConnections.Y * (int)Constants.RegionSize))) |
309 | { | 309 | { |
310 | Vector3 offset = Vector3.Zero; | 310 | Vector3 offset = Vector3.Zero; |
311 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - | 311 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - |
@@ -315,13 +315,58 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
315 | 315 | ||
316 | Vector3 extents = Vector3.Zero; | 316 | Vector3 extents = Vector3.Zero; |
317 | extents.Y = regionConnections.YEnd + conn.YEnd; | 317 | extents.Y = regionConnections.YEnd + conn.YEnd; |
318 | extents.X = conn.XEnd + conn.XEnd; | 318 | extents.X = regionConnections.XEnd + conn.XEnd; |
319 | conn.UpdateExtents(extents); | ||
320 | |||
321 | m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}", | ||
322 | conn.RegionScene.RegionInfo.RegionName, | ||
323 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); | ||
324 | |||
325 | conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); | ||
326 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); | ||
327 | |||
328 | if (conn.RegionScene.NorthBorders.Count == 1)// && 2) | ||
329 | { | ||
330 | //compound border | ||
331 | conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; | ||
332 | conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
333 | conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
334 | |||
335 | |||
336 | |||
337 | } | ||
338 | |||
339 | scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south | ||
340 | |||
341 | if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) | ||
342 | { | ||
343 | |||
344 | conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; | ||
345 | conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
346 | conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
347 | |||
348 | |||
349 | } | ||
350 | scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West | ||
351 | /* | ||
352 | else | ||
353 | { | ||
354 | conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; | ||
355 | conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
356 | conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
357 | scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south | ||
358 | } | ||
359 | */ | ||
360 | |||
319 | 361 | ||
320 | m_log.DebugFormat("Scene: {0} to the south of Scene{1} Offset: {2}. Extents:{3}", | 362 | // Reset Terrain.. since terrain normally loads first. |
321 | conn.RegionScene.RegionInfo.RegionName, | 363 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); |
322 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); | 364 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); |
365 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); | ||
366 | |||
367 | connectedYN = true; | ||
323 | 368 | ||
324 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); | 369 | //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); |
325 | 370 | ||
326 | break; | 371 | break; |
327 | } | 372 | } |
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 | |||
34 | { | 34 | { |
35 | public class Border | 35 | public class Border |
36 | { | 36 | { |
37 | 37 | ||
38 | /// <summary> | 38 | /// <summary> |
39 | /// Line perpendicular to the Direction Cardinal. Z value is the | 39 | /// Line perpendicular to the Direction Cardinal. Z value is the |
40 | /// </summary> | 40 | /// </summary> |
@@ -125,6 +125,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
125 | return result; | 125 | return result; |
126 | } | 126 | } |
127 | 127 | ||
128 | public float Extent | ||
129 | { | ||
130 | get | ||
131 | { | ||
132 | switch (CrossDirection) | ||
133 | { | ||
134 | case Cardinals.N: | ||
135 | break; | ||
136 | case Cardinals.S: | ||
137 | break; | ||
138 | case Cardinals.W: | ||
139 | break; | ||
140 | case Cardinals.E: | ||
141 | break; | ||
142 | } | ||
143 | return 0; | ||
144 | } | ||
145 | } | ||
146 | |||
128 | } | 147 | } |
129 | 148 | ||
130 | 149 | ||
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 | |||
1706 | ulong newRegionHandle = 0; | 1706 | ulong newRegionHandle = 0; |
1707 | Vector3 pos = attemptedPosition; | 1707 | Vector3 pos = attemptedPosition; |
1708 | 1708 | ||
1709 | 1709 | if (TestBorderCross(attemptedPosition, Cardinals.W)) | |
1710 | |||
1711 | if (TestBorderCross(attemptedPosition, Cardinals.E)) | ||
1712 | { | 1710 | { |
1713 | pos.X = ((pos.X - Constants.RegionSize)); | 1711 | if (TestBorderCross(attemptedPosition, Cardinals.S)) |
1714 | newRegionHandle | 1712 | { |
1715 | = Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize)); | 1713 | //Border crossedBorderx = GetCrossedBorder(attemptedPosition,Cardinals.W); |
1716 | // x + 1 | 1714 | //Border crossedBordery = GetCrossedBorder(attemptedPosition, Cardinals.S); |
1715 | //(crossedBorderx.BorderLine.Z / (int)Constants.RegionSize) | ||
1716 | pos.X = ((pos.X + Constants.RegionSize)); | ||
1717 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
1718 | newRegionHandle | ||
1719 | = Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize), | ||
1720 | (uint)((thisy - 1) * Constants.RegionSize)); | ||
1721 | // x - 1 | ||
1722 | // y - 1 | ||
1723 | } | ||
1724 | else if (TestBorderCross(attemptedPosition, Cardinals.N)) | ||
1725 | { | ||
1726 | pos.X = ((pos.X + Constants.RegionSize)); | ||
1727 | pos.Y = ((pos.Y - Constants.RegionSize)); | ||
1728 | newRegionHandle | ||
1729 | = Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize), | ||
1730 | (uint)((thisy + 1) * Constants.RegionSize)); | ||
1731 | // x - 1 | ||
1732 | // y + 1 | ||
1733 | } | ||
1734 | else | ||
1735 | { | ||
1736 | pos.X = ((pos.X + Constants.RegionSize)); | ||
1737 | newRegionHandle | ||
1738 | = Util.UIntsToLong((uint) ((thisx - 1)*Constants.RegionSize), | ||
1739 | (uint) (thisy*Constants.RegionSize)); | ||
1740 | // x - 1 | ||
1741 | } | ||
1717 | } | 1742 | } |
1718 | else if (TestBorderCross(attemptedPosition, Cardinals.W)) | 1743 | else if (TestBorderCross(attemptedPosition, Cardinals.E)) |
1719 | { | 1744 | { |
1720 | pos.X = ((pos.X + Constants.RegionSize)); | 1745 | if (TestBorderCross(attemptedPosition, Cardinals.S)) |
1746 | { | ||
1747 | pos.X = ((pos.X - Constants.RegionSize)); | ||
1748 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
1749 | newRegionHandle | ||
1750 | = Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize), | ||
1751 | (uint)((thisy - 1) * Constants.RegionSize)); | ||
1752 | // x + 1 | ||
1753 | // y - 1 | ||
1754 | } | ||
1755 | else if (TestBorderCross(attemptedPosition, Cardinals.N)) | ||
1756 | { | ||
1757 | pos.X = ((pos.X - Constants.RegionSize)); | ||
1758 | pos.Y = ((pos.Y - Constants.RegionSize)); | ||
1759 | newRegionHandle | ||
1760 | = Util.UIntsToLong((uint)((thisx + 1) * Constants.RegionSize), | ||
1761 | (uint)((thisy + 1) * Constants.RegionSize)); | ||
1762 | // x + 1 | ||
1763 | // y + 1 | ||
1764 | } | ||
1765 | else | ||
1766 | { | ||
1767 | pos.X = ((pos.X - Constants.RegionSize)); | ||
1768 | newRegionHandle | ||
1769 | = Util.UIntsToLong((uint) ((thisx + 1)*Constants.RegionSize), | ||
1770 | (uint) (thisy*Constants.RegionSize)); | ||
1771 | // x + 1 | ||
1772 | } | ||
1773 | } | ||
1774 | else if (TestBorderCross(attemptedPosition, Cardinals.S)) | ||
1775 | { | ||
1776 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
1721 | newRegionHandle | 1777 | newRegionHandle |
1722 | = Util.UIntsToLong((uint)((thisx - 1) * Constants.RegionSize), (uint)(thisy * Constants.RegionSize)); | 1778 | = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - 1) * Constants.RegionSize)); |
1723 | // x - 1 | 1779 | // y - 1 |
1724 | } | 1780 | } |
1725 | 1781 | else if (TestBorderCross(attemptedPosition, Cardinals.N)) | |
1726 | if (TestBorderCross(attemptedPosition, Cardinals.N)) | ||
1727 | { | 1782 | { |
1783 | |||
1728 | pos.Y = ((pos.Y - Constants.RegionSize)); | 1784 | pos.Y = ((pos.Y - Constants.RegionSize)); |
1729 | newRegionHandle | 1785 | newRegionHandle |
1730 | = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + 1) * Constants.RegionSize)); | 1786 | = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy + 1) * Constants.RegionSize)); |
1731 | // y + 1 | 1787 | // y + 1 |
1732 | } | 1788 | } |
1733 | else if (TestBorderCross(attemptedPosition, Cardinals.S)) | ||
1734 | { | ||
1735 | pos.Y = ((pos.Y + Constants.RegionSize)); | ||
1736 | newRegionHandle | ||
1737 | = Util.UIntsToLong((uint)(thisx * Constants.RegionSize), (uint)((thisy - 1) * Constants.RegionSize)); | ||
1738 | // y - 1 | ||
1739 | } | ||
1740 | 1789 | ||
1741 | // Offset the positions for the new region across the border | 1790 | // Offset the positions for the new region across the border |
1742 | Vector3 oldGroupPosition = grp.RootPart.GroupPosition; | 1791 | Vector3 oldGroupPosition = grp.RootPart.GroupPosition; |
@@ -1750,6 +1799,62 @@ namespace OpenSim.Region.Framework.Scenes | |||
1750 | } | 1799 | } |
1751 | } | 1800 | } |
1752 | 1801 | ||
1802 | public Border GetCrossedBorder(Vector3 position, Cardinals gridline) | ||
1803 | { | ||
1804 | |||
1805 | switch (gridline) | ||
1806 | { | ||
1807 | case Cardinals.N: | ||
1808 | lock (NorthBorders) | ||
1809 | { | ||
1810 | foreach (Border b in NorthBorders) | ||
1811 | { | ||
1812 | if (b.TestCross(position)) | ||
1813 | return b; | ||
1814 | } | ||
1815 | } | ||
1816 | break; | ||
1817 | case Cardinals.S: | ||
1818 | |||
1819 | |||
1820 | lock (SouthBorders) | ||
1821 | { | ||
1822 | foreach (Border b in SouthBorders) | ||
1823 | { | ||
1824 | if (b.TestCross(position)) | ||
1825 | return b; | ||
1826 | } | ||
1827 | } | ||
1828 | |||
1829 | break; | ||
1830 | case Cardinals.E: | ||
1831 | lock (EastBorders) | ||
1832 | { | ||
1833 | foreach (Border b in EastBorders) | ||
1834 | { | ||
1835 | if (b.TestCross(position)) | ||
1836 | return b; | ||
1837 | } | ||
1838 | } | ||
1839 | |||
1840 | break; | ||
1841 | case Cardinals.W: | ||
1842 | |||
1843 | lock (WestBorders) | ||
1844 | { | ||
1845 | foreach (Border b in WestBorders) | ||
1846 | { | ||
1847 | if (b.TestCross(position)) | ||
1848 | return b; | ||
1849 | } | ||
1850 | } | ||
1851 | break; | ||
1852 | |||
1853 | } | ||
1854 | |||
1855 | return null; | ||
1856 | } | ||
1857 | |||
1753 | public bool TestBorderCross(Vector3 position, Cardinals border) | 1858 | public bool TestBorderCross(Vector3 position, Cardinals border) |
1754 | { | 1859 | { |
1755 | switch (border) | 1860 | switch (border) |