aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules')
-rw-r--r--OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs130
1 files changed, 116 insertions, 14 deletions
diff --git a/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs b/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs
index 45e09a3..df2975b 100644
--- a/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs
@@ -80,9 +80,15 @@ namespace OpenSim.Region.CoreModules.World.Land
80 if (!enabledYN) 80 if (!enabledYN)
81 return; 81 return;
82 82
83 /* For testing on a single instance
84 if (scene.RegionInfo.RegionLocX == 1004 && scene.RegionInfo.RegionLocY == 1000)
85 return;
86 */
87
83 lock (m_startingScenes) 88 lock (m_startingScenes)
84 m_startingScenes.Add(scene.RegionInfo.originRegionID, scene); 89 m_startingScenes.Add(scene.RegionInfo.originRegionID, scene);
85 90
91 // Give each region a standard set of non-infinite borders
86 Border northBorder = new Border(); 92 Border northBorder = new Border();
87 northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<--- 93 northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<---
88 northBorder.CrossDirection = Cardinals.N; 94 northBorder.CrossDirection = Cardinals.N;
@@ -103,6 +109,8 @@ namespace OpenSim.Region.CoreModules.World.Land
103 westBorder.CrossDirection = Cardinals.W; 109 westBorder.CrossDirection = Cardinals.W;
104 scene.WestBorders[0] = westBorder; 110 scene.WestBorders[0] = westBorder;
105 111
112
113
106 RegionConnections regionConnections = new RegionConnections(); 114 RegionConnections regionConnections = new RegionConnections();
107 regionConnections.ConnectedRegions = new List<RegionData>(); 115 regionConnections.ConnectedRegions = new List<RegionData>();
108 regionConnections.RegionScene = scene; 116 regionConnections.RegionScene = scene;
@@ -112,6 +120,8 @@ namespace OpenSim.Region.CoreModules.World.Land
112 regionConnections.Y = scene.RegionInfo.RegionLocY; 120 regionConnections.Y = scene.RegionInfo.RegionLocY;
113 regionConnections.XEnd = (int)Constants.RegionSize; 121 regionConnections.XEnd = (int)Constants.RegionSize;
114 regionConnections.YEnd = (int)Constants.RegionSize; 122 regionConnections.YEnd = (int)Constants.RegionSize;
123
124
115 lock (m_regions) 125 lock (m_regions)
116 { 126 {
117 bool connectedYN = false; 127 bool connectedYN = false;
@@ -280,6 +290,7 @@ namespace OpenSim.Region.CoreModules.World.Land
280 //xxx 290 //xxx
281 //xxy 291 //xxy
282 //xxx 292 //xxx
293
283 if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd 294 if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd
284 >= (regionConnections.X * (int)Constants.RegionSize)) 295 >= (regionConnections.X * (int)Constants.RegionSize))
285 && (((int)conn.Y * (int)Constants.RegionSize) 296 && (((int)conn.Y * (int)Constants.RegionSize)
@@ -310,9 +321,13 @@ namespace OpenSim.Region.CoreModules.World.Land
310 ConnectedRegion.RegionScene = scene; 321 ConnectedRegion.RegionScene = scene;
311 conn.ConnectedRegions.Add(ConnectedRegion); 322 conn.ConnectedRegions.Add(ConnectedRegion);
312 323
324 // Inform root region Physics about the extents of this region
313 conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); 325 conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents);
326
327 // Inform Child region that it needs to forward it's terrain to the root region
314 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); 328 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero);
315 329
330 // Extend the borders as appropriate
316 lock (conn.RegionScene.EastBorders) 331 lock (conn.RegionScene.EastBorders)
317 conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; 332 conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize;
318 333
@@ -323,15 +338,24 @@ namespace OpenSim.Region.CoreModules.World.Land
323 conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; 338 conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize;
324 339
325 lock (scene.WestBorders) 340 lock (scene.WestBorders)
326 scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West 341 {
342 scene.WestBorders[0].BorderLine.Z += (int) Constants.RegionSize; //auto teleport West
327 343
328 // Reset Terrain.. since terrain normally loads first. 344 // Trigger auto teleport to root region
329 // 345 scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
330 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); 346 scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY;
331 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); 347 }
332 348
349 // Reset Terrain.. since terrain loads before we get here, we need to load
350 // it again so it loads in the root region
351
352 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised());
353
354 // Unlock borders
333 conn.RegionScene.BordersLocked = false; 355 conn.RegionScene.BordersLocked = false;
334 scene.BordersLocked = false; 356 scene.BordersLocked = false;
357
358 // Create a client event forwarder and add this region's events to the root region.
335 if (conn.ClientEventForwarder != null) 359 if (conn.ClientEventForwarder != null)
336 conn.ClientEventForwarder.AddSceneToEventForwarding(scene); 360 conn.ClientEventForwarder.AddSceneToEventForwarding(scene);
337 connectedYN = true; 361 connectedYN = true;
@@ -381,7 +405,11 @@ namespace OpenSim.Region.CoreModules.World.Land
381 lock (conn.RegionScene.WestBorders) 405 lock (conn.RegionScene.WestBorders)
382 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; 406 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
383 lock (scene.SouthBorders) 407 lock (scene.SouthBorders)
384 scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south 408 {
409 scene.SouthBorders[0].BorderLine.Z += (int) Constants.RegionSize; //auto teleport south
410 scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
411 scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY;
412 }
385 413
386 // Reset Terrain.. since terrain normally loads first. 414 // Reset Terrain.. since terrain normally loads first.
387 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); 415 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
@@ -446,8 +474,13 @@ namespace OpenSim.Region.CoreModules.World.Land
446 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; 474 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
447 } 475 }
448 } 476 }
477
449 lock (scene.SouthBorders) 478 lock (scene.SouthBorders)
450 scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south 479 {
480 scene.SouthBorders[0].BorderLine.Z += (int) Constants.RegionSize; //auto teleport south
481 scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
482 scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY;
483 }
451 484
452 lock (conn.RegionScene.EastBorders) 485 lock (conn.RegionScene.EastBorders)
453 { 486 {
@@ -463,9 +496,14 @@ namespace OpenSim.Region.CoreModules.World.Land
463 496
464 } 497 }
465 } 498 }
466 499
467 lock (scene.WestBorders) 500 lock (scene.WestBorders)
468 scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West 501 {
502 scene.WestBorders[0].BorderLine.Z += (int) Constants.RegionSize; //auto teleport West
503 scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX;
504 scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY;
505 }
506
469 /* 507 /*
470 else 508 else
471 { 509 {
@@ -495,17 +533,21 @@ namespace OpenSim.Region.CoreModules.World.Land
495 } 533 }
496 } 534 }
497 535
536 // If !connectYN means that this region is a root region
498 if (!connectedYN) 537 if (!connectedYN)
499 { 538 {
500 RegionData rdata = new RegionData(); 539 RegionData rdata = new RegionData();
501 rdata.Offset = Vector3.Zero; 540 rdata.Offset = Vector3.Zero;
502 rdata.RegionId = scene.RegionInfo.originRegionID; 541 rdata.RegionId = scene.RegionInfo.originRegionID;
503 rdata.RegionScene = scene; 542 rdata.RegionScene = scene;
543 // save it's land channel
504 regionConnections.RegionLandChannel = scene.LandChannel; 544 regionConnections.RegionLandChannel = scene.LandChannel;
505 545
546 // Substitue our landchannel
506 RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel, 547 RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel,
507 regionConnections.ConnectedRegions); 548 regionConnections.ConnectedRegions);
508 scene.LandChannel = lnd; 549 scene.LandChannel = lnd;
550 // Forward the permissions modules of each of the connected regions to the root region
509 lock (m_regions) 551 lock (m_regions)
510 { 552 {
511 foreach (RegionData r in regionConnections.ConnectedRegions) 553 foreach (RegionData r in regionConnections.ConnectedRegions)
@@ -513,12 +555,17 @@ namespace OpenSim.Region.CoreModules.World.Land
513 ForwardPermissionRequests(regionConnections, r.RegionScene); 555 ForwardPermissionRequests(regionConnections, r.RegionScene);
514 } 556 }
515 } 557 }
516 558 // Create the root region's Client Event Forwarder
517 regionConnections.ClientEventForwarder = new RegionCombinerClientEventForwarder(regionConnections); 559 regionConnections.ClientEventForwarder = new RegionCombinerClientEventForwarder(regionConnections);
560
561 // Sets up the CoarseLocationUpdate forwarder for this root region
518 scene.EventManager.OnNewPresence += SetCourseLocationDelegate; 562 scene.EventManager.OnNewPresence += SetCourseLocationDelegate;
563
564 // Adds this root region to a dictionary of regions that are connectable
519 m_regions.Add(scene.RegionInfo.originRegionID, regionConnections); 565 m_regions.Add(scene.RegionInfo.originRegionID, regionConnections);
520 } 566 }
521 } 567 }
568 // Set up infinite borders around the entire AABB of the combined ConnectedRegions
522 AdjustLargeRegionBounds(); 569 AdjustLargeRegionBounds();
523 } 570 }
524 571
@@ -646,6 +693,13 @@ namespace OpenSim.Region.CoreModules.World.Land
646 } 693 }
647 } 694 }
648 695
696 /// <summary>
697 /// Locates a the Client of a particular region in an Array of RegionData based on offset
698 /// </summary>
699 /// <param name="offset"></param>
700 /// <param name="uUID"></param>
701 /// <param name="rdata"></param>
702 /// <returns>IClientAPI or null</returns>
649 private IClientAPI LocateUsersChildAgentIClientAPI(Vector2 offset, UUID uUID, RegionData[] rdata) 703 private IClientAPI LocateUsersChildAgentIClientAPI(Vector2 offset, UUID uUID, RegionData[] rdata)
650 { 704 {
651 IClientAPI returnclient = null; 705 IClientAPI returnclient = null;
@@ -664,6 +718,10 @@ namespace OpenSim.Region.CoreModules.World.Land
664 { 718 {
665 } 719 }
666 720
721 /// <summary>
722 /// TODO:
723 /// </summary>
724 /// <param name="rdata"></param>
667 public void UnCombineRegion(RegionData rdata) 725 public void UnCombineRegion(RegionData rdata)
668 { 726 {
669 lock (m_regions) 727 lock (m_regions)
@@ -706,7 +764,7 @@ namespace OpenSim.Region.CoreModules.World.Land
706 lock (rconn.RegionScene.NorthBorders) 764 lock (rconn.RegionScene.NorthBorders)
707 { 765 {
708 Border northBorder = null; 766 Border northBorder = null;
709 767 // If we don't already have an infinite border, create one.
710 if (!TryGetInfiniteBorder(rconn.RegionScene.NorthBorders, out northBorder)) 768 if (!TryGetInfiniteBorder(rconn.RegionScene.NorthBorders, out northBorder))
711 { 769 {
712 northBorder = new Border(); 770 northBorder = new Border();
@@ -721,6 +779,7 @@ namespace OpenSim.Region.CoreModules.World.Land
721 lock (rconn.RegionScene.SouthBorders) 779 lock (rconn.RegionScene.SouthBorders)
722 { 780 {
723 Border southBorder = null; 781 Border southBorder = null;
782 // If we don't already have an infinite border, create one.
724 if (!TryGetInfiniteBorder(rconn.RegionScene.SouthBorders, out southBorder)) 783 if (!TryGetInfiniteBorder(rconn.RegionScene.SouthBorders, out southBorder))
725 { 784 {
726 southBorder = new Border(); 785 southBorder = new Border();
@@ -733,6 +792,7 @@ namespace OpenSim.Region.CoreModules.World.Land
733 lock (rconn.RegionScene.EastBorders) 792 lock (rconn.RegionScene.EastBorders)
734 { 793 {
735 Border eastBorder = null; 794 Border eastBorder = null;
795 // If we don't already have an infinite border, create one.
736 if (!TryGetInfiniteBorder(rconn.RegionScene.EastBorders, out eastBorder)) 796 if (!TryGetInfiniteBorder(rconn.RegionScene.EastBorders, out eastBorder))
737 { 797 {
738 eastBorder = new Border(); 798 eastBorder = new Border();
@@ -746,6 +806,7 @@ namespace OpenSim.Region.CoreModules.World.Land
746 lock (rconn.RegionScene.WestBorders) 806 lock (rconn.RegionScene.WestBorders)
747 { 807 {
748 Border westBorder = null; 808 Border westBorder = null;
809 // If we don't already have an infinite border, create one.
749 if (!TryGetInfiniteBorder(rconn.RegionScene.WestBorders, out westBorder)) 810 if (!TryGetInfiniteBorder(rconn.RegionScene.WestBorders, out westBorder))
750 { 811 {
751 westBorder = new Border(); 812 westBorder = new Border();
@@ -761,6 +822,12 @@ namespace OpenSim.Region.CoreModules.World.Land
761 } 822 }
762 } 823 }
763 824
825 /// <summary>
826 /// Try and get an Infinite border out of a listT of borders
827 /// </summary>
828 /// <param name="borders"></param>
829 /// <param name="oborder"></param>
830 /// <returns></returns>
764 public static bool TryGetInfiniteBorder(List<Border> borders, out Border oborder) 831 public static bool TryGetInfiniteBorder(List<Border> borders, out Border oborder)
765 { 832 {
766 // Warning! Should be locked before getting here! 833 // Warning! Should be locked before getting here!
@@ -847,8 +914,19 @@ namespace OpenSim.Region.CoreModules.World.Land
847 914
848 public class RegionConnections 915 public class RegionConnections
849 { 916 {
917 /// <summary>
918 /// Root Region ID
919 /// </summary>
850 public UUID RegionId; 920 public UUID RegionId;
921
922 /// <summary>
923 /// Root Region Scene
924 /// </summary>
851 public Scene RegionScene; 925 public Scene RegionScene;
926
927 /// <summary>
928 /// LargeLandChannel for combined region
929 /// </summary>
852 public ILandChannel RegionLandChannel; 930 public ILandChannel RegionLandChannel;
853 public uint X; 931 public uint X;
854 public uint Y; 932 public uint Y;
@@ -1323,7 +1401,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1323 m_virtScene.UnSubscribeToClientPrimRezEvents(client); 1401 m_virtScene.UnSubscribeToClientPrimRezEvents(client);
1324 m_virtScene.UnSubscribeToClientInventoryEvents(client); 1402 m_virtScene.UnSubscribeToClientInventoryEvents(client);
1325 m_virtScene.UnSubscribeToClientAttachmentEvents(client); 1403 m_virtScene.UnSubscribeToClientAttachmentEvents(client);
1326 m_virtScene.UnSubscribeToClientTeleportEvents(client); 1404 //m_virtScene.UnSubscribeToClientTeleportEvents(client);
1327 m_virtScene.UnSubscribeToClientScriptEvents(client); 1405 m_virtScene.UnSubscribeToClientScriptEvents(client);
1328 m_virtScene.UnSubscribeToClientGodEvents(client); 1406 m_virtScene.UnSubscribeToClientGodEvents(client);
1329 m_virtScene.UnSubscribeToClientNetworkEvents(client); 1407 m_virtScene.UnSubscribeToClientNetworkEvents(client);
@@ -1333,7 +1411,7 @@ namespace OpenSim.Region.CoreModules.World.Land
1333 client.OnRezObject += LocalRezObject; 1411 client.OnRezObject += LocalRezObject;
1334 m_rootScene.SubscribeToClientInventoryEvents(client); 1412 m_rootScene.SubscribeToClientInventoryEvents(client);
1335 m_rootScene.SubscribeToClientAttachmentEvents(client); 1413 m_rootScene.SubscribeToClientAttachmentEvents(client);
1336 m_rootScene.SubscribeToClientTeleportEvents(client); 1414 //m_rootScene.SubscribeToClientTeleportEvents(client);
1337 m_rootScene.SubscribeToClientScriptEvents(client); 1415 m_rootScene.SubscribeToClientScriptEvents(client);
1338 m_rootScene.SubscribeToClientGodEvents(client); 1416 m_rootScene.SubscribeToClientGodEvents(client);
1339 m_rootScene.SubscribeToClientNetworkEvents(client); 1417 m_rootScene.SubscribeToClientNetworkEvents(client);
@@ -1343,6 +1421,19 @@ namespace OpenSim.Region.CoreModules.World.Land
1343 { 1421 {
1344 } 1422 }
1345 1423
1424 /// <summary>
1425 /// Fixes position based on the region the Rez event came in on
1426 /// </summary>
1427 /// <param name="remoteclient"></param>
1428 /// <param name="itemid"></param>
1429 /// <param name="rayend"></param>
1430 /// <param name="raystart"></param>
1431 /// <param name="raytargetid"></param>
1432 /// <param name="bypassraycast"></param>
1433 /// <param name="rayendisintersection"></param>
1434 /// <param name="rezselected"></param>
1435 /// <param name="removeitem"></param>
1436 /// <param name="fromtaskid"></param>
1346 private void LocalRezObject(IClientAPI remoteclient, UUID itemid, Vector3 rayend, Vector3 raystart, 1437 private void LocalRezObject(IClientAPI remoteclient, UUID itemid, Vector3 rayend, Vector3 raystart,
1347 UUID raytargetid, byte bypassraycast, bool rayendisintersection, bool rezselected, bool removeitem, 1438 UUID raytargetid, byte bypassraycast, bool rayendisintersection, bool rezselected, bool removeitem,
1348 UUID fromtaskid) 1439 UUID fromtaskid)
@@ -1357,7 +1448,18 @@ namespace OpenSim.Region.CoreModules.World.Land
1357 m_rootScene.RezObject(remoteclient, itemid, rayend, raystart, raytargetid, bypassraycast, 1448 m_rootScene.RezObject(remoteclient, itemid, rayend, raystart, raytargetid, bypassraycast,
1358 rayendisintersection, rezselected, removeitem, fromtaskid); 1449 rayendisintersection, rezselected, removeitem, fromtaskid);
1359 } 1450 }
1360 1451 /// <summary>
1452 /// Fixes position based on the region the AddPrimShape event came in on
1453 /// </summary>
1454 /// <param name="ownerid"></param>
1455 /// <param name="groupid"></param>
1456 /// <param name="rayend"></param>
1457 /// <param name="rot"></param>
1458 /// <param name="shape"></param>
1459 /// <param name="bypassraycast"></param>
1460 /// <param name="raystart"></param>
1461 /// <param name="raytargetid"></param>
1462 /// <param name="rayendisintersection"></param>
1361 private void LocalAddNewPrim(UUID ownerid, UUID groupid, Vector3 rayend, Quaternion rot, 1463 private void LocalAddNewPrim(UUID ownerid, UUID groupid, Vector3 rayend, Quaternion rot,
1362 PrimitiveBaseShape shape, byte bypassraycast, Vector3 raystart, UUID raytargetid, 1464 PrimitiveBaseShape shape, byte bypassraycast, Vector3 raystart, UUID raytargetid,
1363 byte rayendisintersection) 1465 byte rayendisintersection)