aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorTeravus Ovares (Dan Olivares)2009-08-29 03:36:41 -0400
committerTeravus Ovares (Dan Olivares)2009-08-29 03:36:41 -0400
commitd45f871d8f3abcc58556d6f5a834b132da6ec0ab (patch)
tree8bf9f262ad2d3c5d783115583031ae1e0a13c7b7 /OpenSim/Region
parent* Deal with teleports to other virtual regions in the same scene. (diff)
downloadopensim-SC-d45f871d8f3abcc58556d6f5a834b132da6ec0ab.zip
opensim-SC-d45f871d8f3abcc58556d6f5a834b132da6ec0ab.tar.gz
opensim-SC-d45f871d8f3abcc58556d6f5a834b132da6ec0ab.tar.bz2
opensim-SC-d45f871d8f3abcc58556d6f5a834b132da6ec0ab.tar.xz
* Only lock the Borders when they're being changed, otherwise one avatar's movement could hinder another avatar's movement.
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs73
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs179
2 files changed, 184 insertions, 68 deletions
diff --git a/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs b/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs
index 22ef107..2fc1623 100644
--- a/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs
+++ b/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs
@@ -236,20 +236,31 @@ namespace OpenSim.Region.CoreModules.World.Land
236 m_log.DebugFormat("Scene: {0} to the west of Scene{1} Offset: {2}. Extents:{3}", 236 m_log.DebugFormat("Scene: {0} to the west of Scene{1} Offset: {2}. Extents:{3}",
237 conn.RegionScene.RegionInfo.RegionName, 237 conn.RegionScene.RegionInfo.RegionName,
238 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); 238 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
239 239
240
241 scene.BordersLocked = true;
242 conn.RegionScene.BordersLocked = true;
240 conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); 243 conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents);
241 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); 244 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero);
242 245
243 conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; 246 lock (conn.RegionScene.EastBorders)
244 conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; 247 conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize;
245 conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; 248
249 lock (conn.RegionScene.NorthBorders)
250 conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize;
251
252 lock (conn.RegionScene.SouthBorders)
253 conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize;
246 254
247 scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West 255 lock (scene.WestBorders)
256 scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West
248 257
249 // Reset Terrain.. since terrain normally loads first. 258 // Reset Terrain.. since terrain normally loads first.
250 // 259 //
251 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); 260 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised());
252 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); 261 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
262 conn.RegionScene.BordersLocked = false;
263 scene.BordersLocked = false;
253 264
254 connectedYN = true; 265 connectedYN = true;
255 break; 266 break;
@@ -277,23 +288,33 @@ namespace OpenSim.Region.CoreModules.World.Land
277 extents.X = conn.XEnd; 288 extents.X = conn.XEnd;
278 conn.UpdateExtents(extents); 289 conn.UpdateExtents(extents);
279 290
291
292 scene.BordersLocked = true;
293 conn.RegionScene.BordersLocked = true;
294
280 m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", 295 m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}",
281 conn.RegionScene.RegionInfo.RegionName, 296 conn.RegionScene.RegionInfo.RegionName,
282 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); 297 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
283 conn.RegionScene.PhysicsScene.Combine(null,Vector3.Zero,extents); 298 conn.RegionScene.PhysicsScene.Combine(null,Vector3.Zero,extents);
284 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); 299 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero);
285 300
286 conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; 301 lock(conn.RegionScene.NorthBorders)
287 conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; 302 conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize;
288 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; 303 lock(conn.RegionScene.EastBorders)
289 304 conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize;
290 scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south 305 lock(conn.RegionScene.WestBorders)
306 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
307 lock(scene.SouthBorders)
308 scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south
291 309
292 // Reset Terrain.. since terrain normally loads first. 310 // Reset Terrain.. since terrain normally loads first.
293 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); 311 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
294 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); 312 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised());
295 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); 313 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
296 314
315 scene.BordersLocked = false;
316 conn.RegionScene.BordersLocked = false;
317
297 connectedYN = true; 318 connectedYN = true;
298 break; 319 break;
299 } 320 }
@@ -318,36 +339,48 @@ namespace OpenSim.Region.CoreModules.World.Land
318 extents.X = regionConnections.XEnd + conn.XEnd; 339 extents.X = regionConnections.XEnd + conn.XEnd;
319 conn.UpdateExtents(extents); 340 conn.UpdateExtents(extents);
320 341
342 scene.BordersLocked = true;
343 conn.RegionScene.BordersLocked = true;
344
321 m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}", 345 m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}",
322 conn.RegionScene.RegionInfo.RegionName, 346 conn.RegionScene.RegionInfo.RegionName,
323 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); 347 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
324 348
325 conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); 349 conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents);
326 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); 350 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero);
327 351 lock(conn.RegionScene.NorthBorders)
328 if (conn.RegionScene.NorthBorders.Count == 1)// && 2) 352 if (conn.RegionScene.NorthBorders.Count == 1)// && 2)
329 { 353 {
330 //compound border 354 //compound border
355 // already locked above
331 conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; 356 conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize;
332 conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; 357
333 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; 358 lock(conn.RegionScene.EastBorders)
359 conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize;
360 lock(conn.RegionScene.WestBorders)
361 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
334 362
335 363
336 364
337 } 365 }
338 366 lock(scene.SouthBorders)
339 scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south 367 scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south
340 368
369 lock(conn.RegionScene.EastBorders)
341 if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) 370 if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2)
342 { 371 {
343 372
344 conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; 373 conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize;
345 conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; 374 lock(conn.RegionScene.NorthBorders)
346 conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; 375 conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize;
376 lock(conn.RegionScene.SouthBorders)
377 conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize;
347 378
348 379
349 } 380 }
350 scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West 381
382 lock (scene.WestBorders)
383 scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West
351/* 384/*
352 else 385 else
353 { 386 {
@@ -363,6 +396,8 @@ namespace OpenSim.Region.CoreModules.World.Land
363 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); 396 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
364 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); 397 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised());
365 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); 398 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
399 scene.BordersLocked = false;
400 conn.RegionScene.BordersLocked = false;
366 401
367 connectedYN = true; 402 connectedYN = true;
368 403
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 2c1d0e5..3e573cf 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -81,6 +81,8 @@ namespace OpenSim.Region.Framework.Scenes
81 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>(); 81 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>();
82 protected List<RegionInfo> m_neighbours = new List<RegionInfo>(); 82 protected List<RegionInfo> m_neighbours = new List<RegionInfo>();
83 83
84 public volatile bool BordersLocked = false;
85
84 public List<Border> NorthBorders = new List<Border>(); 86 public List<Border> NorthBorders = new List<Border>();
85 public List<Border> EastBorders = new List<Border>(); 87 public List<Border> EastBorders = new List<Border>();
86 public List<Border> SouthBorders = new List<Border>(); 88 public List<Border> SouthBorders = new List<Border>();
@@ -331,6 +333,8 @@ namespace OpenSim.Region.Framework.Scenes
331 m_config = config; 333 m_config = config;
332 334
333 Random random = new Random(); 335 Random random = new Random();
336
337 BordersLocked = true;
334 338
335 Border northBorder = new Border(); 339 Border northBorder = new Border();
336 northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- 340 northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<---
@@ -352,6 +356,7 @@ namespace OpenSim.Region.Framework.Scenes
352 westBorder.CrossDirection = Cardinals.W; 356 westBorder.CrossDirection = Cardinals.W;
353 WestBorders.Add(westBorder); 357 WestBorders.Add(westBorder);
354 358
359 BordersLocked = false;
355 360
356 m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); 361 m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4);
357 m_moduleLoader = moduleLoader; 362 m_moduleLoader = moduleLoader;
@@ -482,6 +487,7 @@ namespace OpenSim.Region.Framework.Scenes
482 /// <param name="regInfo"></param> 487 /// <param name="regInfo"></param>
483 public Scene(RegionInfo regInfo) 488 public Scene(RegionInfo regInfo)
484 { 489 {
490 BordersLocked = true;
485 Border northBorder = new Border(); 491 Border northBorder = new Border();
486 northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- 492 northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<---
487 northBorder.CrossDirection = Cardinals.N; 493 northBorder.CrossDirection = Cardinals.N;
@@ -501,6 +507,7 @@ namespace OpenSim.Region.Framework.Scenes
501 westBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //---> 507 westBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, 0); //--->
502 westBorder.CrossDirection = Cardinals.W; 508 westBorder.CrossDirection = Cardinals.W;
503 WestBorders.Add(westBorder); 509 WestBorders.Add(westBorder);
510 BordersLocked = false;
504 511
505 m_regInfo = regInfo; 512 m_regInfo = regInfo;
506 m_eventManager = new EventManager(); 513 m_eventManager = new EventManager();
@@ -1801,105 +1808,179 @@ namespace OpenSim.Region.Framework.Scenes
1801 1808
1802 public Border GetCrossedBorder(Vector3 position, Cardinals gridline) 1809 public Border GetCrossedBorder(Vector3 position, Cardinals gridline)
1803 { 1810 {
1811 if (BordersLocked)
1812 {
1813 switch (gridline)
1814 {
1815 case Cardinals.N:
1816 lock (NorthBorders)
1817 {
1818 foreach (Border b in NorthBorders)
1819 {
1820 if (b.TestCross(position))
1821 return b;
1822 }
1823 }
1824 break;
1825 case Cardinals.S:
1826 lock (SouthBorders)
1827 {
1828 foreach (Border b in SouthBorders)
1829 {
1830 if (b.TestCross(position))
1831 return b;
1832 }
1833 }
1804 1834
1805 switch (gridline) 1835 break;
1836 case Cardinals.E:
1837 lock (EastBorders)
1838 {
1839 foreach (Border b in EastBorders)
1840 {
1841 if (b.TestCross(position))
1842 return b;
1843 }
1844 }
1845
1846 break;
1847 case Cardinals.W:
1848
1849 lock (WestBorders)
1850 {
1851 foreach (Border b in WestBorders)
1852 {
1853 if (b.TestCross(position))
1854 return b;
1855 }
1856 }
1857 break;
1858
1859 }
1860 }
1861 else
1806 { 1862 {
1807 case Cardinals.N: 1863 switch (gridline)
1808 lock (NorthBorders) 1864 {
1809 { 1865 case Cardinals.N:
1810 foreach (Border b in NorthBorders) 1866 foreach (Border b in NorthBorders)
1811 { 1867 {
1812 if (b.TestCross(position)) 1868 if (b.TestCross(position))
1813 return b; 1869 return b;
1814 } 1870 }
1815 } 1871
1816 break; 1872 break;
1817 case Cardinals.S: 1873 case Cardinals.S:
1818
1819
1820 lock (SouthBorders)
1821 {
1822 foreach (Border b in SouthBorders) 1874 foreach (Border b in SouthBorders)
1823 { 1875 {
1824 if (b.TestCross(position)) 1876 if (b.TestCross(position))
1825 return b; 1877 return b;
1826 } 1878 }
1827 } 1879 break;
1828 1880 case Cardinals.E:
1829 break;
1830 case Cardinals.E:
1831 lock (EastBorders)
1832 {
1833 foreach (Border b in EastBorders) 1881 foreach (Border b in EastBorders)
1834 { 1882 {
1835 if (b.TestCross(position)) 1883 if (b.TestCross(position))
1836 return b; 1884 return b;
1837 } 1885 }
1838 }
1839 1886
1840 break; 1887 break;
1841 case Cardinals.W: 1888 case Cardinals.W:
1842
1843 lock (WestBorders)
1844 {
1845 foreach (Border b in WestBorders) 1889 foreach (Border b in WestBorders)
1846 { 1890 {
1847 if (b.TestCross(position)) 1891 if (b.TestCross(position))
1848 return b; 1892 return b;
1849 } 1893 }
1850 } 1894 break;
1851 break;
1852 1895
1896 }
1853 } 1897 }
1898
1854 1899
1855 return null; 1900 return null;
1856 } 1901 }
1857 1902
1858 public bool TestBorderCross(Vector3 position, Cardinals border) 1903 public bool TestBorderCross(Vector3 position, Cardinals border)
1859 { 1904 {
1860 switch (border) 1905 if (BordersLocked)
1861 { 1906 {
1862 case Cardinals.N: 1907 switch (border)
1863 lock (NorthBorders) 1908 {
1864 { 1909 case Cardinals.N:
1865 foreach(Border b in NorthBorders) 1910 lock (NorthBorders)
1911 {
1912 foreach (Border b in NorthBorders)
1913 {
1914 if (b.TestCross(position))
1915 return true;
1916 }
1917 }
1918 break;
1919 case Cardinals.E:
1920 lock (EastBorders)
1921 {
1922 foreach (Border b in EastBorders)
1923 {
1924 if (b.TestCross(position))
1925 return true;
1926 }
1927 }
1928 break;
1929 case Cardinals.S:
1930 lock (SouthBorders)
1931 {
1932 foreach (Border b in SouthBorders)
1933 {
1934 if (b.TestCross(position))
1935 return true;
1936 }
1937 }
1938 break;
1939 case Cardinals.W:
1940 lock (WestBorders)
1941 {
1942 foreach (Border b in WestBorders)
1943 {
1944 if (b.TestCross(position))
1945 return true;
1946 }
1947 }
1948 break;
1949 }
1950 }
1951 else
1952 {
1953 switch (border)
1954 {
1955 case Cardinals.N:
1956 foreach (Border b in NorthBorders)
1866 { 1957 {
1867 if (b.TestCross(position)) 1958 if (b.TestCross(position))
1868 return true; 1959 return true;
1869 } 1960 }
1870 } 1961 break;
1871 break; 1962 case Cardinals.E:
1872 case Cardinals.E:
1873 lock (EastBorders)
1874 {
1875 foreach (Border b in EastBorders) 1963 foreach (Border b in EastBorders)
1876 { 1964 {
1877 if (b.TestCross(position)) 1965 if (b.TestCross(position))
1878 return true; 1966 return true;
1879 } 1967 }
1880 } 1968 break;
1881 break; 1969 case Cardinals.S:
1882 case Cardinals.S:
1883 lock (SouthBorders)
1884 {
1885 foreach (Border b in SouthBorders) 1970 foreach (Border b in SouthBorders)
1886 { 1971 {
1887 if (b.TestCross(position)) 1972 if (b.TestCross(position))
1888 return true; 1973 return true;
1889 } 1974 }
1890 } 1975 break;
1891 break; 1976 case Cardinals.W:
1892 case Cardinals.W:
1893 lock (WestBorders)
1894 {
1895 foreach (Border b in WestBorders) 1977 foreach (Border b in WestBorders)
1896 { 1978 {
1897 if (b.TestCross(position)) 1979 if (b.TestCross(position))
1898 return true; 1980 return true;
1899 } 1981 }
1900 } 1982 break;
1901 break; 1983 }
1902
1903 } 1984 }
1904 return false; 1985 return false;
1905 } 1986 }