diff options
Diffstat (limited to 'OpenSim/Region')
4 files changed, 243 insertions, 176 deletions
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs index e54774b..504f09b 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs | |||
@@ -391,36 +391,46 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
391 | xtw.WriteElementString("datetime", ((int)t.TotalSeconds).ToString()); | 391 | xtw.WriteElementString("datetime", ((int)t.TotalSeconds).ToString()); |
392 | xtw.WriteElementString("id", UUID.Random().ToString()); | 392 | xtw.WriteElementString("id", UUID.Random().ToString()); |
393 | xtw.WriteEndElement(); | 393 | xtw.WriteEndElement(); |
394 | 394 | ||
395 | xtw.WriteElementString("assets_included", SaveAssets.ToString()); | 395 | xtw.WriteStartElement("region_info"); |
396 | 396 | ||
397 | bool isMegaregion; | 397 | bool isMegaregion; |
398 | Vector2 size; | ||
399 | IRegionCombinerModule rcMod = null; | ||
398 | 400 | ||
399 | // FIXME: This is only here for regression test purposes since they do not supply a module. Need to fix | 401 | // FIXME: This is only here for regression test purposes since they do not supply a module. Need to fix |
400 | // this, possibly by doing control file creation somewhere else. | 402 | // this, possibly by doing control file creation somewhere else. |
401 | if (m_module != null && m_module.RegionCombinerModule != null) | 403 | if (m_module != null) |
402 | { | 404 | rcMod = m_module.RegionCombinerModule; |
403 | IRegionCombinerModule mod = m_module.RegionCombinerModule; | 405 | |
404 | isMegaregion = mod.IsRootForMegaregion(m_scene.RegionInfo.RegionID); | 406 | if (rcMod != null) |
405 | } | 407 | isMegaregion = rcMod.IsRootForMegaregion(m_scene.RegionInfo.RegionID); |
406 | else | 408 | else |
407 | { | ||
408 | isMegaregion = false; | 409 | isMegaregion = false; |
409 | } | 410 | |
410 | 411 | if (isMegaregion) | |
412 | size = rcMod.GetSizeOfMegaregion(m_scene.RegionInfo.RegionID); | ||
413 | else | ||
414 | size = new Vector2((float)Constants.RegionSize, (float)Constants.RegionSize); | ||
415 | |||
411 | xtw.WriteElementString("is_megaregion", isMegaregion.ToString()); | 416 | xtw.WriteElementString("is_megaregion", isMegaregion.ToString()); |
417 | xtw.WriteElementString("size_in_meters", string.Format("{0},{1}", size.X, size.Y)); | ||
418 | |||
419 | xtw.WriteEndElement(); | ||
412 | 420 | ||
421 | xtw.WriteElementString("assets_included", SaveAssets.ToString()); | ||
422 | |||
413 | xtw.WriteEndElement(); | 423 | xtw.WriteEndElement(); |
414 | 424 | ||
415 | xtw.Flush(); | 425 | xtw.Flush(); |
416 | xtw.Close(); | ||
417 | } | 426 | } |
418 | 427 | ||
419 | s = sw.ToString(); | 428 | s = sw.ToString(); |
420 | } | 429 | } |
421 | 430 | ||
422 | // Console.WriteLine( | 431 | if (m_scene != null) |
423 | // "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s); | 432 | Console.WriteLine( |
433 | "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s); | ||
424 | 434 | ||
425 | return s; | 435 | return s; |
426 | } | 436 | } |
diff --git a/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs index ca4ed5c..e03ac5a 100644 --- a/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRegionCombinerModule.cs | |||
@@ -40,6 +40,20 @@ namespace OpenSim.Region.Framework.Interfaces | |||
40 | /// <summary> | 40 | /// <summary> |
41 | /// Does the given id belong to the root region of a megaregion? | 41 | /// Does the given id belong to the root region of a megaregion? |
42 | /// </summary> | 42 | /// </summary> |
43 | bool IsRootForMegaregion(UUID sceneId); | 43 | bool IsRootForMegaregion(UUID regionId); |
44 | |||
45 | /// <summary> | ||
46 | /// Gets the size of megaregion. | ||
47 | /// </summary> | ||
48 | /// <remarks> | ||
49 | /// Returns size in meters. | ||
50 | /// Do not rely on this method remaining the same - this area is actively under development. | ||
51 | /// </remarks> | ||
52 | /// <param name="sceneId"> | ||
53 | /// The id of the root region for a megaregion. | ||
54 | /// This may change in the future to allow any region id that makes up a megaregion. | ||
55 | /// Currently, will throw an exception if this does not match a root region. | ||
56 | /// </param> | ||
57 | Vector2 GetSizeOfMegaregion(UUID regionId); | ||
44 | } | 58 | } |
45 | } \ No newline at end of file | 59 | } \ No newline at end of file |
diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index fadc30d..40daf13 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs | |||
@@ -59,6 +59,11 @@ namespace OpenSim.Region.RegionCombinerModule | |||
59 | } | 59 | } |
60 | 60 | ||
61 | /// <summary> | 61 | /// <summary> |
62 | /// Is this module enabled? | ||
63 | /// </summary> | ||
64 | private bool enabledYN = false; | ||
65 | |||
66 | /// <summary> | ||
62 | /// This holds the root regions for the megaregions. | 67 | /// This holds the root regions for the megaregions. |
63 | /// </summary> | 68 | /// </summary> |
64 | /// <remarks> | 69 | /// <remarks> |
@@ -67,11 +72,6 @@ namespace OpenSim.Region.RegionCombinerModule | |||
67 | private Dictionary<UUID, RegionConnections> m_regions = new Dictionary<UUID, RegionConnections>(); | 72 | private Dictionary<UUID, RegionConnections> m_regions = new Dictionary<UUID, RegionConnections>(); |
68 | 73 | ||
69 | /// <summary> | 74 | /// <summary> |
70 | /// Is this module enabled? | ||
71 | /// </summary> | ||
72 | private bool enabledYN = false; | ||
73 | |||
74 | /// <summary> | ||
75 | /// The scenes that comprise the megaregion. | 75 | /// The scenes that comprise the megaregion. |
76 | /// </summary> | 76 | /// </summary> |
77 | private Dictionary<UUID, Scene> m_startingScenes = new Dictionary<UUID, Scene>(); | 77 | private Dictionary<UUID, Scene> m_startingScenes = new Dictionary<UUID, Scene>(); |
@@ -113,10 +113,25 @@ namespace OpenSim.Region.RegionCombinerModule | |||
113 | } | 113 | } |
114 | } | 114 | } |
115 | 115 | ||
116 | public bool IsRootForMegaregion(UUID sceneId) | 116 | public bool IsRootForMegaregion(UUID regionId) |
117 | { | ||
118 | lock (m_regions) | ||
119 | return m_regions.ContainsKey(regionId); | ||
120 | } | ||
121 | |||
122 | public Vector2 GetSizeOfMegaregion(UUID regionId) | ||
117 | { | 123 | { |
118 | lock (m_regions) | 124 | lock (m_regions) |
119 | return m_regions.ContainsKey(sceneId); | 125 | { |
126 | if (m_regions.ContainsKey(regionId)) | ||
127 | { | ||
128 | RegionConnections rootConn = m_regions[regionId]; | ||
129 | |||
130 | return new Vector2((float)rootConn.XEnd, (float)rootConn.YEnd); | ||
131 | } | ||
132 | } | ||
133 | |||
134 | throw new Exception(string.Format("Region with id {0} not found", regionId)); | ||
120 | } | 135 | } |
121 | 136 | ||
122 | private void NewPresence(ScenePresence presence) | 137 | private void NewPresence(ScenePresence presence) |
@@ -229,24 +244,21 @@ namespace OpenSim.Region.RegionCombinerModule | |||
229 | westBorder.CrossDirection = Cardinals.W; | 244 | westBorder.CrossDirection = Cardinals.W; |
230 | scene.WestBorders[0] = westBorder; | 245 | scene.WestBorders[0] = westBorder; |
231 | 246 | ||
232 | 247 | RegionConnections newConn = new RegionConnections(); | |
233 | 248 | newConn.ConnectedRegions = new List<RegionData>(); | |
234 | RegionConnections regionConnections = new RegionConnections(); | 249 | newConn.RegionScene = scene; |
235 | regionConnections.ConnectedRegions = new List<RegionData>(); | 250 | newConn.RegionLandChannel = scene.LandChannel; |
236 | regionConnections.RegionScene = scene; | 251 | newConn.RegionId = scene.RegionInfo.originRegionID; |
237 | regionConnections.RegionLandChannel = scene.LandChannel; | 252 | newConn.X = scene.RegionInfo.RegionLocX; |
238 | regionConnections.RegionId = scene.RegionInfo.originRegionID; | 253 | newConn.Y = scene.RegionInfo.RegionLocY; |
239 | regionConnections.X = scene.RegionInfo.RegionLocX; | 254 | newConn.XEnd = (int)Constants.RegionSize; |
240 | regionConnections.Y = scene.RegionInfo.RegionLocY; | 255 | newConn.YEnd = (int)Constants.RegionSize; |
241 | regionConnections.XEnd = (int)Constants.RegionSize; | ||
242 | regionConnections.YEnd = (int)Constants.RegionSize; | ||
243 | |||
244 | 256 | ||
245 | lock (m_regions) | 257 | lock (m_regions) |
246 | { | 258 | { |
247 | bool connectedYN = false; | 259 | bool connectedYN = false; |
248 | 260 | ||
249 | foreach (RegionConnections conn in m_regions.Values) | 261 | foreach (RegionConnections rootConn in m_regions.Values) |
250 | { | 262 | { |
251 | #region commented | 263 | #region commented |
252 | /* | 264 | /* |
@@ -411,13 +423,9 @@ namespace OpenSim.Region.RegionCombinerModule | |||
411 | //xxy | 423 | //xxy |
412 | //xxx | 424 | //xxx |
413 | 425 | ||
414 | 426 | if (rootConn.PosX + rootConn.XEnd >= newConn.PosX && rootConn.PosY >= newConn.PosY) | |
415 | if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd | ||
416 | >= (regionConnections.X * (int)Constants.RegionSize)) | ||
417 | && (((int)conn.Y * (int)Constants.RegionSize) | ||
418 | >= (regionConnections.Y * (int)Constants.RegionSize))) | ||
419 | { | 427 | { |
420 | connectedYN = DoWorkForOneRegionOverPlusXY(conn, regionConnections, scene); | 428 | connectedYN = DoWorkForOneRegionOverPlusXY(rootConn, newConn, scene); |
421 | break; | 429 | break; |
422 | } | 430 | } |
423 | 431 | ||
@@ -425,12 +433,9 @@ namespace OpenSim.Region.RegionCombinerModule | |||
425 | //xyx | 433 | //xyx |
426 | //xxx | 434 | //xxx |
427 | //xxx | 435 | //xxx |
428 | if ((((int)conn.X * (int)Constants.RegionSize) | 436 | if (rootConn.PosX >= newConn.PosX && rootConn.PosY + rootConn.YEnd >= newConn.PosY) |
429 | >= (regionConnections.X * (int)Constants.RegionSize)) | ||
430 | && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd | ||
431 | >= (regionConnections.Y * (int)Constants.RegionSize))) | ||
432 | { | 437 | { |
433 | connectedYN = DoWorkForOneRegionOverXPlusY(conn, regionConnections, scene); | 438 | connectedYN = DoWorkForOneRegionOverXPlusY(rootConn, newConn, scene); |
434 | break; | 439 | break; |
435 | } | 440 | } |
436 | 441 | ||
@@ -438,12 +443,9 @@ namespace OpenSim.Region.RegionCombinerModule | |||
438 | //xxy | 443 | //xxy |
439 | //xxx | 444 | //xxx |
440 | //xxx | 445 | //xxx |
441 | if ((((int)conn.X * (int)Constants.RegionSize) + conn.XEnd | 446 | if (rootConn.PosX + rootConn.XEnd >= newConn.PosX && rootConn.PosY + rootConn.YEnd >= newConn.PosY) |
442 | >= (regionConnections.X * (int)Constants.RegionSize)) | ||
443 | && (((int)conn.Y * (int)Constants.RegionSize) + conn.YEnd | ||
444 | >= (regionConnections.Y * (int)Constants.RegionSize))) | ||
445 | { | 447 | { |
446 | connectedYN = DoWorkForOneRegionOverPlusXPlusY(conn, regionConnections, scene); | 448 | connectedYN = DoWorkForOneRegionOverPlusXPlusY(rootConn, newConn, scene); |
447 | break; | 449 | break; |
448 | 450 | ||
449 | } | 451 | } |
@@ -452,7 +454,7 @@ namespace OpenSim.Region.RegionCombinerModule | |||
452 | // If !connectYN means that this region is a root region | 454 | // If !connectYN means that this region is a root region |
453 | if (!connectedYN) | 455 | if (!connectedYN) |
454 | { | 456 | { |
455 | DoWorkForRootRegion(regionConnections, scene); | 457 | DoWorkForRootRegion(newConn, scene); |
456 | } | 458 | } |
457 | } | 459 | } |
458 | 460 | ||
@@ -460,59 +462,55 @@ namespace OpenSim.Region.RegionCombinerModule | |||
460 | AdjustLargeRegionBounds(); | 462 | AdjustLargeRegionBounds(); |
461 | } | 463 | } |
462 | 464 | ||
463 | private bool DoWorkForOneRegionOverPlusXY(RegionConnections conn, RegionConnections regionConnections, Scene scene) | 465 | private bool DoWorkForOneRegionOverPlusXY(RegionConnections rootConn, RegionConnections newConn, Scene scene) |
464 | { | 466 | { |
465 | Vector3 offset = Vector3.Zero; | 467 | Vector3 offset = Vector3.Zero; |
466 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - | 468 | offset.X = newConn.PosX - rootConn.PosX; |
467 | ((conn.X * (int)Constants.RegionSize))); | 469 | offset.Y = newConn.PosY - rootConn.PosY; |
468 | offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - | ||
469 | ((conn.Y * (int)Constants.RegionSize))); | ||
470 | 470 | ||
471 | Vector3 extents = Vector3.Zero; | 471 | Vector3 extents = Vector3.Zero; |
472 | extents.Y = conn.YEnd; | 472 | extents.Y = rootConn.YEnd; |
473 | extents.X = conn.XEnd + regionConnections.XEnd; | 473 | extents.X = rootConn.XEnd + newConn.XEnd; |
474 | 474 | ||
475 | conn.UpdateExtents(extents); | 475 | rootConn.UpdateExtents(extents); |
476 | 476 | ||
477 | m_log.DebugFormat( | 477 | m_log.DebugFormat( |
478 | "[REGION COMBINER MODULE]: Scene {0} to the west of Scene {1}, Offset: {2}, Extents: {3}", | 478 | "[REGION COMBINER MODULE]: Root region {0} is to the west of region {1}, Offset: {2}, Extents: {3}", |
479 | conn.RegionScene.RegionInfo.RegionName, | 479 | rootConn.RegionScene.RegionInfo.RegionName, |
480 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); | 480 | newConn.RegionScene.RegionInfo.RegionName, offset, extents); |
481 | 481 | ||
482 | scene.BordersLocked = true; | 482 | scene.BordersLocked = true; |
483 | conn.RegionScene.BordersLocked = true; | 483 | rootConn.RegionScene.BordersLocked = true; |
484 | 484 | ||
485 | RegionData ConnectedRegion = new RegionData(); | 485 | RegionData ConnectedRegion = new RegionData(); |
486 | ConnectedRegion.Offset = offset; | 486 | ConnectedRegion.Offset = offset; |
487 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; | 487 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; |
488 | ConnectedRegion.RegionScene = scene; | 488 | ConnectedRegion.RegionScene = scene; |
489 | conn.ConnectedRegions.Add(ConnectedRegion); | 489 | rootConn.ConnectedRegions.Add(ConnectedRegion); |
490 | 490 | ||
491 | // Inform root region Physics about the extents of this region | 491 | // Inform root region Physics about the extents of this region |
492 | conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); | 492 | rootConn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); |
493 | 493 | ||
494 | // Inform Child region that it needs to forward it's terrain to the root region | 494 | // Inform Child region that it needs to forward it's terrain to the root region |
495 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); | 495 | scene.PhysicsScene.Combine(rootConn.RegionScene.PhysicsScene, offset, Vector3.Zero); |
496 | 496 | ||
497 | // Extend the borders as appropriate | 497 | // Extend the borders as appropriate |
498 | lock (conn.RegionScene.EastBorders) | 498 | lock (rootConn.RegionScene.EastBorders) |
499 | conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; | 499 | rootConn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; |
500 | 500 | ||
501 | lock (conn.RegionScene.NorthBorders) | 501 | lock (rootConn.RegionScene.NorthBorders) |
502 | conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 502 | rootConn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
503 | 503 | ||
504 | lock (conn.RegionScene.SouthBorders) | 504 | lock (rootConn.RegionScene.SouthBorders) |
505 | conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 505 | rootConn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
506 | 506 | ||
507 | lock (scene.WestBorders) | 507 | lock (scene.WestBorders) |
508 | { | 508 | { |
509 | 509 | scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - rootConn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West | |
510 | |||
511 | scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - conn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West | ||
512 | 510 | ||
513 | // Trigger auto teleport to root region | 511 | // Trigger auto teleport to root region |
514 | scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; | 512 | scene.WestBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; |
515 | scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; | 513 | scene.WestBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; |
516 | } | 514 | } |
517 | 515 | ||
518 | // Reset Terrain.. since terrain loads before we get here, we need to load | 516 | // Reset Terrain.. since terrain loads before we get here, we need to load |
@@ -521,57 +519,58 @@ namespace OpenSim.Region.RegionCombinerModule | |||
521 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); | 519 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); |
522 | 520 | ||
523 | // Unlock borders | 521 | // Unlock borders |
524 | conn.RegionScene.BordersLocked = false; | 522 | rootConn.RegionScene.BordersLocked = false; |
525 | scene.BordersLocked = false; | 523 | scene.BordersLocked = false; |
526 | 524 | ||
527 | // Create a client event forwarder and add this region's events to the root region. | 525 | // Create a client event forwarder and add this region's events to the root region. |
528 | if (conn.ClientEventForwarder != null) | 526 | if (rootConn.ClientEventForwarder != null) |
529 | conn.ClientEventForwarder.AddSceneToEventForwarding(scene); | 527 | rootConn.ClientEventForwarder.AddSceneToEventForwarding(scene); |
530 | 528 | ||
531 | return true; | 529 | return true; |
532 | } | 530 | } |
533 | 531 | ||
534 | private bool DoWorkForOneRegionOverXPlusY(RegionConnections conn, RegionConnections regionConnections, Scene scene) | 532 | private bool DoWorkForOneRegionOverXPlusY(RegionConnections rootConn, RegionConnections newConn, Scene scene) |
535 | { | 533 | { |
536 | Vector3 offset = Vector3.Zero; | 534 | Vector3 offset = Vector3.Zero; |
537 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - | 535 | offset.X = newConn.PosX - rootConn.PosX; |
538 | ((conn.X * (int)Constants.RegionSize))); | 536 | offset.Y = newConn.PosY - rootConn.PosY; |
539 | offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - | ||
540 | ((conn.Y * (int)Constants.RegionSize))); | ||
541 | 537 | ||
542 | Vector3 extents = Vector3.Zero; | 538 | Vector3 extents = Vector3.Zero; |
543 | extents.Y = regionConnections.YEnd + conn.YEnd; | 539 | extents.Y = newConn.YEnd + rootConn.YEnd; |
544 | extents.X = conn.XEnd; | 540 | extents.X = rootConn.XEnd; |
545 | conn.UpdateExtents(extents); | 541 | rootConn.UpdateExtents(extents); |
546 | 542 | ||
547 | scene.BordersLocked = true; | 543 | scene.BordersLocked = true; |
548 | conn.RegionScene.BordersLocked = true; | 544 | rootConn.RegionScene.BordersLocked = true; |
549 | 545 | ||
550 | RegionData ConnectedRegion = new RegionData(); | 546 | RegionData ConnectedRegion = new RegionData(); |
551 | ConnectedRegion.Offset = offset; | 547 | ConnectedRegion.Offset = offset; |
552 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; | 548 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; |
553 | ConnectedRegion.RegionScene = scene; | 549 | ConnectedRegion.RegionScene = scene; |
554 | conn.ConnectedRegions.Add(ConnectedRegion); | 550 | rootConn.ConnectedRegions.Add(ConnectedRegion); |
555 | 551 | ||
556 | m_log.DebugFormat( | 552 | m_log.DebugFormat( |
557 | "[REGION COMBINER MODULE]: Scene: {0} to the northeast of Scene {1}, Offset: {2}, Extents: {3}", | 553 | "[REGION COMBINER MODULE]: Root region {0} is to the south of region {1}, Offset: {2}, Extents: {3}", |
558 | conn.RegionScene.RegionInfo.RegionName, | 554 | rootConn.RegionScene.RegionInfo.RegionName, |
559 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); | 555 | newConn.RegionScene.RegionInfo.RegionName, offset, extents); |
560 | 556 | ||
561 | conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); | 557 | rootConn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); |
562 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); | 558 | scene.PhysicsScene.Combine(rootConn.RegionScene.PhysicsScene, offset, Vector3.Zero); |
563 | 559 | ||
564 | lock (conn.RegionScene.NorthBorders) | 560 | lock (rootConn.RegionScene.NorthBorders) |
565 | conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; | 561 | rootConn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; |
566 | lock (conn.RegionScene.EastBorders) | 562 | |
567 | conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 563 | lock (rootConn.RegionScene.EastBorders) |
568 | lock (conn.RegionScene.WestBorders) | 564 | rootConn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
569 | conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 565 | |
566 | lock (rootConn.RegionScene.WestBorders) | ||
567 | rootConn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
568 | |||
570 | lock (scene.SouthBorders) | 569 | lock (scene.SouthBorders) |
571 | { | 570 | { |
572 | scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - conn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south | 571 | scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - rootConn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south |
573 | scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; | 572 | scene.SouthBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; |
574 | scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; | 573 | scene.SouthBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; |
575 | } | 574 | } |
576 | 575 | ||
577 | // Reset Terrain.. since terrain normally loads first. | 576 | // Reset Terrain.. since terrain normally loads first. |
@@ -580,84 +579,92 @@ namespace OpenSim.Region.RegionCombinerModule | |||
580 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); | 579 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); |
581 | 580 | ||
582 | scene.BordersLocked = false; | 581 | scene.BordersLocked = false; |
583 | conn.RegionScene.BordersLocked = false; | 582 | rootConn.RegionScene.BordersLocked = false; |
584 | if (conn.ClientEventForwarder != null) | 583 | |
585 | conn.ClientEventForwarder.AddSceneToEventForwarding(scene); | 584 | if (rootConn.ClientEventForwarder != null) |
585 | rootConn.ClientEventForwarder.AddSceneToEventForwarding(scene); | ||
586 | |||
586 | return true; | 587 | return true; |
587 | } | 588 | } |
588 | 589 | ||
589 | private bool DoWorkForOneRegionOverPlusXPlusY(RegionConnections conn, RegionConnections regionConnections, Scene scene) | 590 | private bool DoWorkForOneRegionOverPlusXPlusY(RegionConnections rootConn, RegionConnections newConn, Scene scene) |
590 | { | 591 | { |
591 | Vector3 offset = Vector3.Zero; | 592 | Vector3 offset = Vector3.Zero; |
592 | offset.X = (((regionConnections.X * (int)Constants.RegionSize)) - | 593 | offset.X = newConn.PosX - rootConn.PosX; |
593 | ((conn.X * (int)Constants.RegionSize))); | 594 | offset.Y = newConn.PosY - rootConn.PosY; |
594 | offset.Y = (((regionConnections.Y * (int)Constants.RegionSize)) - | ||
595 | ((conn.Y * (int)Constants.RegionSize))); | ||
596 | 595 | ||
597 | Vector3 extents = Vector3.Zero; | 596 | Vector3 extents = Vector3.Zero; |
598 | extents.Y = regionConnections.YEnd + conn.YEnd; | 597 | |
599 | extents.X = regionConnections.XEnd + conn.XEnd; | 598 | // We do not want to inflate the extents for regions strictly to the NE of the root region, since this |
600 | conn.UpdateExtents(extents); | 599 | // would double count regions strictly to the north and east that have already been added. |
600 | // extents.Y = regionConnections.YEnd + conn.YEnd; | ||
601 | // extents.X = regionConnections.XEnd + conn.XEnd; | ||
602 | // conn.UpdateExtents(extents); | ||
603 | |||
604 | extents.Y = rootConn.YEnd; | ||
605 | extents.X = rootConn.XEnd; | ||
601 | 606 | ||
602 | scene.BordersLocked = true; | 607 | scene.BordersLocked = true; |
603 | conn.RegionScene.BordersLocked = true; | 608 | rootConn.RegionScene.BordersLocked = true; |
604 | 609 | ||
605 | RegionData ConnectedRegion = new RegionData(); | 610 | RegionData ConnectedRegion = new RegionData(); |
606 | ConnectedRegion.Offset = offset; | 611 | ConnectedRegion.Offset = offset; |
607 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; | 612 | ConnectedRegion.RegionId = scene.RegionInfo.originRegionID; |
608 | ConnectedRegion.RegionScene = scene; | 613 | ConnectedRegion.RegionScene = scene; |
609 | 614 | ||
610 | conn.ConnectedRegions.Add(ConnectedRegion); | 615 | rootConn.ConnectedRegions.Add(ConnectedRegion); |
611 | 616 | ||
612 | m_log.DebugFormat( | 617 | m_log.DebugFormat( |
613 | "[REGION COMBINER MODULE]: Scene: {0} to the NorthEast of Scene {1}, Offset: {2}, Extents: {3}", | 618 | "[REGION COMBINER MODULE]: Region {0} is to the southwest of Scene {1}, Offset: {2}, Extents: {3}", |
614 | conn.RegionScene.RegionInfo.RegionName, | 619 | rootConn.RegionScene.RegionInfo.RegionName, |
615 | regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); | 620 | newConn.RegionScene.RegionInfo.RegionName, offset, extents); |
616 | 621 | ||
617 | conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); | 622 | rootConn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); |
618 | scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); | 623 | scene.PhysicsScene.Combine(rootConn.RegionScene.PhysicsScene, offset, Vector3.Zero); |
619 | lock (conn.RegionScene.NorthBorders) | 624 | |
625 | lock (rootConn.RegionScene.NorthBorders) | ||
620 | { | 626 | { |
621 | if (conn.RegionScene.NorthBorders.Count == 1)// && 2) | 627 | if (rootConn.RegionScene.NorthBorders.Count == 1)// && 2) |
622 | { | 628 | { |
623 | //compound border | 629 | //compound border |
624 | // already locked above | 630 | // already locked above |
625 | conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; | 631 | rootConn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; |
632 | |||
633 | lock (rootConn.RegionScene.EastBorders) | ||
634 | rootConn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
626 | 635 | ||
627 | lock (conn.RegionScene.EastBorders) | 636 | lock (rootConn.RegionScene.WestBorders) |
628 | conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; | 637 | rootConn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; |
629 | lock (conn.RegionScene.WestBorders) | ||
630 | conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
631 | } | 638 | } |
632 | } | 639 | } |
633 | 640 | ||
634 | lock (scene.SouthBorders) | 641 | lock (scene.SouthBorders) |
635 | { | 642 | { |
636 | scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - conn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south | 643 | scene.SouthBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocY - rootConn.RegionScene.RegionInfo.RegionLocY) * (int)Constants.RegionSize); //auto teleport south |
637 | scene.SouthBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; | 644 | scene.SouthBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; |
638 | scene.SouthBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; | 645 | scene.SouthBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; |
639 | } | 646 | } |
640 | 647 | ||
641 | lock (conn.RegionScene.EastBorders) | 648 | lock (rootConn.RegionScene.EastBorders) |
642 | { | 649 | { |
643 | if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) | 650 | if (rootConn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) |
644 | { | 651 | { |
645 | 652 | ||
646 | conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; | 653 | rootConn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; |
647 | lock (conn.RegionScene.NorthBorders) | ||
648 | conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
649 | lock (conn.RegionScene.SouthBorders) | ||
650 | conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
651 | 654 | ||
655 | lock (rootConn.RegionScene.NorthBorders) | ||
656 | rootConn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
652 | 657 | ||
658 | lock (rootConn.RegionScene.SouthBorders) | ||
659 | rootConn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; | ||
653 | } | 660 | } |
654 | } | 661 | } |
655 | 662 | ||
656 | lock (scene.WestBorders) | 663 | lock (scene.WestBorders) |
657 | { | 664 | { |
658 | scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - conn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West | 665 | scene.WestBorders[0].BorderLine.Z = (int)((scene.RegionInfo.RegionLocX - rootConn.RegionScene.RegionInfo.RegionLocX) * (int)Constants.RegionSize); //auto teleport West |
659 | scene.WestBorders[0].TriggerRegionX = conn.RegionScene.RegionInfo.RegionLocX; | 666 | scene.WestBorders[0].TriggerRegionX = rootConn.RegionScene.RegionInfo.RegionLocX; |
660 | scene.WestBorders[0].TriggerRegionY = conn.RegionScene.RegionInfo.RegionLocY; | 667 | scene.WestBorders[0].TriggerRegionY = rootConn.RegionScene.RegionInfo.RegionLocY; |
661 | } | 668 | } |
662 | 669 | ||
663 | /* | 670 | /* |
@@ -676,18 +683,17 @@ namespace OpenSim.Region.RegionCombinerModule | |||
676 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); | 683 | scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); |
677 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); | 684 | //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); |
678 | scene.BordersLocked = false; | 685 | scene.BordersLocked = false; |
679 | conn.RegionScene.BordersLocked = false; | 686 | rootConn.RegionScene.BordersLocked = false; |
680 | 687 | ||
681 | if (conn.ClientEventForwarder != null) | 688 | if (rootConn.ClientEventForwarder != null) |
682 | conn.ClientEventForwarder.AddSceneToEventForwarding(scene); | 689 | rootConn.ClientEventForwarder.AddSceneToEventForwarding(scene); |
683 | 690 | ||
684 | return true; | 691 | return true; |
685 | 692 | ||
686 | //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); | 693 | //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); |
687 | |||
688 | } | 694 | } |
689 | 695 | ||
690 | private void DoWorkForRootRegion(RegionConnections regionConnections, Scene scene) | 696 | private void DoWorkForRootRegion(RegionConnections rootConn, Scene scene) |
691 | { | 697 | { |
692 | m_log.DebugFormat("[REGION COMBINER MODULE]: Adding root region {0}", scene.RegionInfo.RegionName); | 698 | m_log.DebugFormat("[REGION COMBINER MODULE]: Adding root region {0}", scene.RegionInfo.RegionName); |
693 | 699 | ||
@@ -696,28 +702,31 @@ namespace OpenSim.Region.RegionCombinerModule | |||
696 | rdata.RegionId = scene.RegionInfo.originRegionID; | 702 | rdata.RegionId = scene.RegionInfo.originRegionID; |
697 | rdata.RegionScene = scene; | 703 | rdata.RegionScene = scene; |
698 | // save it's land channel | 704 | // save it's land channel |
699 | regionConnections.RegionLandChannel = scene.LandChannel; | 705 | rootConn.RegionLandChannel = scene.LandChannel; |
700 | 706 | ||
701 | // Substitue our landchannel | 707 | // Substitue our landchannel |
702 | RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel, | 708 | RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel, |
703 | regionConnections.ConnectedRegions); | 709 | rootConn.ConnectedRegions); |
710 | |||
704 | scene.LandChannel = lnd; | 711 | scene.LandChannel = lnd; |
712 | |||
705 | // Forward the permissions modules of each of the connected regions to the root region | 713 | // Forward the permissions modules of each of the connected regions to the root region |
706 | lock (m_regions) | 714 | lock (m_regions) |
707 | { | 715 | { |
708 | foreach (RegionData r in regionConnections.ConnectedRegions) | 716 | foreach (RegionData r in rootConn.ConnectedRegions) |
709 | { | 717 | { |
710 | ForwardPermissionRequests(regionConnections, r.RegionScene); | 718 | ForwardPermissionRequests(rootConn, r.RegionScene); |
711 | } | 719 | } |
712 | } | ||
713 | // Create the root region's Client Event Forwarder | ||
714 | regionConnections.ClientEventForwarder = new RegionCombinerClientEventForwarder(regionConnections); | ||
715 | |||
716 | // Sets up the CoarseLocationUpdate forwarder for this root region | ||
717 | scene.EventManager.OnNewPresence += SetCourseLocationDelegate; | ||
718 | 720 | ||
719 | // Adds this root region to a dictionary of regions that are connectable | 721 | // Create the root region's Client Event Forwarder |
720 | m_regions.Add(scene.RegionInfo.originRegionID, regionConnections); | 722 | rootConn.ClientEventForwarder = new RegionCombinerClientEventForwarder(rootConn); |
723 | |||
724 | // Sets up the CoarseLocationUpdate forwarder for this root region | ||
725 | scene.EventManager.OnNewPresence += SetCourseLocationDelegate; | ||
726 | |||
727 | // Adds this root region to a dictionary of regions that are connectable | ||
728 | m_regions.Add(scene.RegionInfo.originRegionID, rootConn); | ||
729 | } | ||
721 | } | 730 | } |
722 | 731 | ||
723 | private void SetCourseLocationDelegate(ScenePresence presence) | 732 | private void SetCourseLocationDelegate(ScenePresence presence) |
@@ -974,6 +983,7 @@ namespace OpenSim.Region.RegionCombinerModule | |||
974 | return true; | 983 | return true; |
975 | } | 984 | } |
976 | } | 985 | } |
986 | |||
977 | oborder = null; | 987 | oborder = null; |
978 | return false; | 988 | return false; |
979 | } | 989 | } |
@@ -983,14 +993,19 @@ namespace OpenSim.Region.RegionCombinerModule | |||
983 | pPosition = pPosition/(int) Constants.RegionSize; | 993 | pPosition = pPosition/(int) Constants.RegionSize; |
984 | int OffsetX = (int) pPosition.X; | 994 | int OffsetX = (int) pPosition.X; |
985 | int OffsetY = (int) pPosition.Y; | 995 | int OffsetY = (int) pPosition.Y; |
986 | foreach (RegionConnections regConn in m_regions.Values) | 996 | |
997 | lock (m_regions) | ||
987 | { | 998 | { |
988 | foreach (RegionData reg in regConn.ConnectedRegions) | 999 | foreach (RegionConnections regConn in m_regions.Values) |
989 | { | 1000 | { |
990 | if (reg.Offset.X == OffsetX && reg.Offset.Y == OffsetY) | 1001 | foreach (RegionData reg in regConn.ConnectedRegions) |
991 | return reg; | 1002 | { |
1003 | if (reg.Offset.X == OffsetX && reg.Offset.Y == OffsetY) | ||
1004 | return reg; | ||
1005 | } | ||
992 | } | 1006 | } |
993 | } | 1007 | } |
1008 | |||
994 | return new RegionData(); | 1009 | return new RegionData(); |
995 | } | 1010 | } |
996 | 1011 | ||
@@ -1046,18 +1061,17 @@ namespace OpenSim.Region.RegionCombinerModule | |||
1046 | } | 1061 | } |
1047 | 1062 | ||
1048 | #region console commands | 1063 | #region console commands |
1064 | |||
1049 | public void FixPhantoms(string module, string[] cmdparams) | 1065 | public void FixPhantoms(string module, string[] cmdparams) |
1050 | { | 1066 | { |
1051 | List<Scene> scenes = new List<Scene>(m_startingScenes.Values); | 1067 | List<Scene> scenes = new List<Scene>(m_startingScenes.Values); |
1068 | |||
1052 | foreach (Scene s in scenes) | 1069 | foreach (Scene s in scenes) |
1053 | { | 1070 | { |
1054 | s.ForEachSOG(delegate(SceneObjectGroup e) | 1071 | s.ForEachSOG(so => so.AbsolutePosition = so.AbsolutePosition); |
1055 | { | ||
1056 | e.AbsolutePosition = e.AbsolutePosition; | ||
1057 | } | ||
1058 | ); | ||
1059 | } | 1072 | } |
1060 | } | 1073 | } |
1074 | |||
1061 | #endregion | 1075 | #endregion |
1062 | } | 1076 | } |
1063 | } | 1077 | } |
diff --git a/OpenSim/Region/RegionCombinerModule/RegionConnections.cs b/OpenSim/Region/RegionCombinerModule/RegionConnections.cs index 3aa9f20..fba51d2 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionConnections.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionConnections.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using OpenMetaverse; | 30 | using OpenMetaverse; |
31 | using OpenSim.Framework; | ||
31 | using OpenSim.Region.Framework.Interfaces; | 32 | using OpenSim.Region.Framework.Interfaces; |
32 | using OpenSim.Region.Framework.Scenes; | 33 | using OpenSim.Region.Framework.Scenes; |
33 | 34 | ||
@@ -49,17 +50,45 @@ namespace OpenSim.Region.RegionCombinerModule | |||
49 | /// LargeLandChannel for combined region | 50 | /// LargeLandChannel for combined region |
50 | /// </summary> | 51 | /// </summary> |
51 | public ILandChannel RegionLandChannel; | 52 | public ILandChannel RegionLandChannel; |
53 | |||
54 | /// <summary> | ||
55 | /// The x map co-ordinate for this region (where each co-ordinate is a Constants.RegionSize block). | ||
56 | /// </summary> | ||
52 | public uint X; | 57 | public uint X; |
58 | |||
59 | /// <summary> | ||
60 | /// The y co-ordinate for this region (where each cor-odinate is a Constants.RegionSize block). | ||
61 | /// </summary> | ||
53 | public uint Y; | 62 | public uint Y; |
54 | public int XEnd; | 63 | |
55 | public int YEnd; | 64 | /// <summary> |
65 | /// The X meters position of this connection. | ||
66 | /// </summary> | ||
67 | public uint PosX { get { return X * Constants.RegionSize; } } | ||
68 | |||
69 | /// <summary> | ||
70 | /// The Y meters co-ordinate of this connection. | ||
71 | /// </summary> | ||
72 | public uint PosY { get { return Y * Constants.RegionSize; } } | ||
73 | |||
74 | /// <summary> | ||
75 | /// The size of the megaregion in meters. | ||
76 | /// </summary> | ||
77 | public uint XEnd; | ||
78 | |||
79 | /// <summary> | ||
80 | /// The size of the megaregion in meters. | ||
81 | /// </summary> | ||
82 | public uint YEnd; | ||
83 | |||
56 | public List<RegionData> ConnectedRegions; | 84 | public List<RegionData> ConnectedRegions; |
57 | public RegionCombinerPermissionModule PermissionModule; | 85 | public RegionCombinerPermissionModule PermissionModule; |
58 | public RegionCombinerClientEventForwarder ClientEventForwarder; | 86 | public RegionCombinerClientEventForwarder ClientEventForwarder; |
87 | |||
59 | public void UpdateExtents(Vector3 extents) | 88 | public void UpdateExtents(Vector3 extents) |
60 | { | 89 | { |
61 | XEnd = (int)extents.X; | 90 | XEnd = (uint)extents.X; |
62 | YEnd = (int)extents.Y; | 91 | YEnd = (uint)extents.Y; |
63 | } | 92 | } |
64 | } | 93 | } |
65 | } \ No newline at end of file | 94 | } \ No newline at end of file |