aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs186
1 files changed, 183 insertions, 3 deletions
diff --git a/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs b/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs
index 2fc1623..8921085 100644
--- a/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs
+++ b/OpenSim/Region/CoreModules/World/Land/PhysicsCombiner.cs
@@ -42,6 +42,7 @@ namespace OpenSim.Region.CoreModules.World.Land
42 RegionConnections regionConnections = new RegionConnections(); 42 RegionConnections regionConnections = new RegionConnections();
43 regionConnections.ConnectedRegions = new List<RegionData>(); 43 regionConnections.ConnectedRegions = new List<RegionData>();
44 regionConnections.RegionScene = scene; 44 regionConnections.RegionScene = scene;
45 regionConnections.RegionLandChannel = scene.LandChannel;
45 regionConnections.RegionId = scene.RegionInfo.originRegionID; 46 regionConnections.RegionId = scene.RegionInfo.originRegionID;
46 regionConnections.X = scene.RegionInfo.RegionLocX; 47 regionConnections.X = scene.RegionInfo.RegionLocX;
47 regionConnections.Y = scene.RegionInfo.RegionLocY; 48 regionConnections.Y = scene.RegionInfo.RegionLocY;
@@ -240,6 +241,13 @@ namespace OpenSim.Region.CoreModules.World.Land
240 241
241 scene.BordersLocked = true; 242 scene.BordersLocked = true;
242 conn.RegionScene.BordersLocked = true; 243 conn.RegionScene.BordersLocked = true;
244
245 RegionData ConnectedRegion = new RegionData();
246 ConnectedRegion.Offset = offset;
247 ConnectedRegion.RegionId = scene.RegionInfo.originRegionID;
248 ConnectedRegion.RegionScene = scene;
249 conn.ConnectedRegions.Add(ConnectedRegion);
250
243 conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); 251 conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents);
244 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); 252 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero);
245 253
@@ -259,9 +267,9 @@ namespace OpenSim.Region.CoreModules.World.Land
259 // 267 //
260 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); 268 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised());
261 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); 269 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
270
262 conn.RegionScene.BordersLocked = false; 271 conn.RegionScene.BordersLocked = false;
263 scene.BordersLocked = false; 272 scene.BordersLocked = false;
264
265 connectedYN = true; 273 connectedYN = true;
266 break; 274 break;
267 } 275 }
@@ -292,6 +300,12 @@ namespace OpenSim.Region.CoreModules.World.Land
292 scene.BordersLocked = true; 300 scene.BordersLocked = true;
293 conn.RegionScene.BordersLocked = true; 301 conn.RegionScene.BordersLocked = true;
294 302
303 RegionData ConnectedRegion = new RegionData();
304 ConnectedRegion.Offset = offset;
305 ConnectedRegion.RegionId = scene.RegionInfo.originRegionID;
306 ConnectedRegion.RegionScene = scene;
307 conn.ConnectedRegions.Add(ConnectedRegion);
308
295 m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", 309 m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}",
296 conn.RegionScene.RegionInfo.RegionName, 310 conn.RegionScene.RegionInfo.RegionName,
297 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); 311 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
@@ -342,6 +356,13 @@ namespace OpenSim.Region.CoreModules.World.Land
342 scene.BordersLocked = true; 356 scene.BordersLocked = true;
343 conn.RegionScene.BordersLocked = true; 357 conn.RegionScene.BordersLocked = true;
344 358
359 RegionData ConnectedRegion = new RegionData();
360 ConnectedRegion.Offset = offset;
361 ConnectedRegion.RegionId = scene.RegionInfo.originRegionID;
362 ConnectedRegion.RegionScene = scene;
363
364 conn.ConnectedRegions.Add(ConnectedRegion);
365
345 m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}", 366 m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}",
346 conn.RegionScene.RegionInfo.RegionName, 367 conn.RegionScene.RegionInfo.RegionName,
347 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); 368 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
@@ -409,7 +430,19 @@ namespace OpenSim.Region.CoreModules.World.Land
409 430
410 } 431 }
411 if (!connectedYN) 432 if (!connectedYN)
433 {
434 RegionData rdata = new RegionData();
435 rdata.Offset = Vector3.Zero;
436 rdata.RegionId = scene.RegionInfo.originRegionID;
437 rdata.RegionScene = scene;
438 regionConnections.RegionLandChannel = scene.LandChannel;
439
440 LargeLandChannel lnd = new LargeLandChannel(rdata,scene.LandChannel,regionConnections.ConnectedRegions);
441 scene.LandChannel = lnd;
442
412 m_regions.Add(scene.RegionInfo.originRegionID,regionConnections); 443 m_regions.Add(scene.RegionInfo.originRegionID,regionConnections);
444 }
445
413 } 446 }
414 } 447 }
415 448
@@ -431,12 +464,29 @@ namespace OpenSim.Region.CoreModules.World.Land
431 { 464 {
432 465
433 } 466 }
434 }
435 467
468
469 public RegionData GetRegionFromPosition(Vector3 pPosition)
470 {
471 pPosition = pPosition/(int) Constants.RegionSize;
472 int OffsetX = (int) pPosition.X;
473 int OffsetY = (int) pPosition.Y;
474 foreach (RegionConnections regConn in m_regions.Values)
475 {
476 foreach (RegionData reg in regConn.ConnectedRegions)
477 {
478 if (reg.Offset.X == OffsetX && reg.Offset.Y == OffsetY)
479 return reg;
480 }
481 }
482 return new RegionData();
483 }
484 }
436 public class RegionConnections 485 public class RegionConnections
437 { 486 {
438 public UUID RegionId; 487 public UUID RegionId;
439 public Scene RegionScene; 488 public Scene RegionScene;
489 public ILandChannel RegionLandChannel;
440 public uint X; 490 public uint X;
441 public uint Y; 491 public uint Y;
442 public int XEnd; 492 public int XEnd;
@@ -450,10 +500,140 @@ namespace OpenSim.Region.CoreModules.World.Land
450 500
451 } 501 }
452 502
453 public struct RegionData 503 public class RegionData
454 { 504 {
455 public UUID RegionId; 505 public UUID RegionId;
456 public Scene RegionScene; 506 public Scene RegionScene;
457 public Vector3 Offset; 507 public Vector3 Offset;
508
509 }
510
511 public class LargeLandChannel : ILandChannel
512 {
513 private static readonly ILog m_log =
514 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
515 private RegionData RegData;
516 private ILandChannel RootRegionLandChannel;
517 private readonly List<RegionData> RegionConnections;
518
519 #region ILandChannel Members
520
521 public LargeLandChannel(RegionData regData, ILandChannel rootRegionLandChannel,List<RegionData> regionConnections)
522 {
523 RegData = regData;
524 RootRegionLandChannel = rootRegionLandChannel;
525 RegionConnections = regionConnections;
526 }
527
528 public List<ILandObject> ParcelsNearPoint(Vector3 position)
529 {
530 m_log.DebugFormat("[LANDPARCELNEARPOINT]: {0}>", position);
531 return RootRegionLandChannel.ParcelsNearPoint(position - RegData.Offset);
532 }
533
534 public List<ILandObject> AllParcels()
535 {
536
537 return RootRegionLandChannel.AllParcels();
538
539 }
540
541 public ILandObject GetLandObject(int x, int y)
542 {
543 m_log.DebugFormat("[BIGLANDTESTINT]: <{0},{1}>", x, y);
544
545 if (x > 0 && x <= (int)Constants.RegionSize && y > 0 && y <= (int)Constants.RegionSize)
546 {
547 return RootRegionLandChannel.GetLandObject(x, y);
548 }
549 else
550 {
551 int offsetX = (x / (int)Constants.RegionSize);
552 int offsetY = (x / (int)Constants.RegionSize);
553 offsetX *= (int)Constants.RegionSize;
554 offsetY *= (int)Constants.RegionSize;
555
556 foreach (RegionData regionData in RegionConnections)
557 {
558 if (regionData.Offset.X == offsetX && regionData.Offset.Y == offsetY)
559 {
560 return regionData.RegionScene.LandChannel.GetLandObject(x - offsetX, y - offsetY);
561 }
562 }
563 ILandObject obj = new LandObject(UUID.Zero, false, RegData.RegionScene);
564 obj.landData.Name = "NO LAND";
565 return obj;
566 }
567 }
568
569 public ILandObject GetLandObject(int localID)
570 {
571 return RootRegionLandChannel.GetLandObject(localID);
572 }
573
574 public ILandObject GetLandObject(float x, float y)
575 {
576 m_log.DebugFormat("[BIGLANDTESTFLOAT]: <{0},{1}>", x, y);
577
578 if (x > 0 && x <= (int)Constants.RegionSize && y > 0 && y <= (int)Constants.RegionSize)
579 {
580 return RootRegionLandChannel.GetLandObject(x, y);
581 }
582 else
583 {
584 int offsetX = (int)(x/(int) Constants.RegionSize);
585 int offsetY = (int)(x/(int) Constants.RegionSize);
586 offsetX *= (int) Constants.RegionSize;
587 offsetY *= (int) Constants.RegionSize;
588
589 foreach (RegionData regionData in RegionConnections)
590 {
591 if (regionData.Offset.X == offsetX && regionData.Offset.Y == offsetY)
592 {
593 return regionData.RegionScene.LandChannel.GetLandObject(x - offsetX, y - offsetY);
594 }
595 }
596 ILandObject obj = new LandObject(UUID.Zero, false, RegData.RegionScene);
597 obj.landData.Name = "NO LAND";
598 return obj;
599 }
600 }
601
602 public bool IsLandPrimCountTainted()
603 {
604 return RootRegionLandChannel.IsLandPrimCountTainted();
605 }
606
607 public bool IsForcefulBansAllowed()
608 {
609 return RootRegionLandChannel.IsForcefulBansAllowed();
610 }
611
612 public void UpdateLandObject(int localID, LandData data)
613 {
614 RootRegionLandChannel.UpdateLandObject(localID, data);
615 }
616
617 public void ReturnObjectsInParcel(int localID, uint returnType, UUID[] agentIDs, UUID[] taskIDs, IClientAPI remoteClient)
618 {
619 RootRegionLandChannel.ReturnObjectsInParcel(localID, returnType, agentIDs, taskIDs, remoteClient);
620 }
621
622 public void setParcelObjectMaxOverride(overrideParcelMaxPrimCountDelegate overrideDel)
623 {
624 RootRegionLandChannel.setParcelObjectMaxOverride(overrideDel);
625 }
626
627 public void setSimulatorObjectMaxOverride(overrideSimulatorMaxPrimCountDelegate overrideDel)
628 {
629 RootRegionLandChannel.setSimulatorObjectMaxOverride(overrideDel);
630 }
631
632 public void SetParcelOtherCleanTime(IClientAPI remoteClient, int localID, int otherCleanTime)
633 {
634 RootRegionLandChannel.SetParcelOtherCleanTime(remoteClient, localID, otherCleanTime);
635 }
636
637 #endregion
458 } 638 }
459} 639}