Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
commit
4333bc7742
|
@ -14,7 +14,10 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
public string Name { get { return "RegionCombinerModule"; } }
|
public string Name { get
|
||||||
|
{
|
||||||
|
return "RegionCombinerModule";
|
||||||
|
} }
|
||||||
public Type ReplaceableInterface
|
public Type ReplaceableInterface
|
||||||
{
|
{
|
||||||
get { return null; }
|
get { return null; }
|
||||||
|
@ -22,11 +25,15 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
private Dictionary<UUID, RegionConnections> m_regions = new Dictionary<UUID, RegionConnections>();
|
private Dictionary<UUID, RegionConnections> m_regions = new Dictionary<UUID, RegionConnections>();
|
||||||
private bool enabledYN = false;
|
private bool enabledYN = false;
|
||||||
|
private Dictionary<UUID, Scene> m_startingScenes = new Dictionary<UUID, Scene>();
|
||||||
|
|
||||||
public void Initialise(IConfigSource source)
|
public void Initialise(IConfigSource source)
|
||||||
{
|
{
|
||||||
|
|
||||||
IConfig myConfig = source.Configs["Startup"];
|
IConfig myConfig = source.Configs["Startup"];
|
||||||
enabledYN = myConfig.GetBoolean("CombineContiguousRegions", false);
|
enabledYN = myConfig.GetBoolean("CombineContiguousRegions", false);
|
||||||
//enabledYN = true;
|
//enabledYN = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public void Close()
|
||||||
|
@ -36,9 +43,13 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
public void AddRegion(Scene scene)
|
public void AddRegion(Scene scene)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!enabledYN)
|
if (!enabledYN)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
lock (m_startingScenes)
|
||||||
|
m_startingScenes.Add(scene.RegionInfo.originRegionID, scene);
|
||||||
|
|
||||||
Border northBorder = new Border();
|
Border northBorder = new Border();
|
||||||
northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<---
|
northBorder.BorderLine = new Vector3(0, (int)Constants.RegionSize, (int)Constants.RegionSize); //<---
|
||||||
northBorder.CrossDirection = Cardinals.N;
|
northBorder.CrossDirection = Cardinals.N;
|
||||||
|
@ -464,11 +475,13 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveRegion(Scene scene)
|
public void RemoveRegion(Scene scene)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegionLoaded(Scene scene)
|
public void RegionLoaded(Scene scene)
|
||||||
|
@ -480,9 +493,62 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
public void OnFrame()
|
|
||||||
|
// Create a set of infinite borders around the whole aabb of the combined island.
|
||||||
|
private void MakeLargeRegionBounds()
|
||||||
{
|
{
|
||||||
|
lock (m_regions)
|
||||||
|
{
|
||||||
|
foreach (RegionConnections rconn in m_regions.Values)
|
||||||
|
{
|
||||||
|
Vector3 offset = Vector3.Zero;
|
||||||
|
rconn.RegionScene.BordersLocked = true;
|
||||||
|
foreach (RegionData rdata in rconn.ConnectedRegions)
|
||||||
|
{
|
||||||
|
if (rdata.Offset.X > offset.X) offset.X = rdata.Offset.X;
|
||||||
|
if (rdata.Offset.Y > offset.Y) offset.Y = rdata.Offset.Y;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (rconn.RegionScene.NorthBorders)
|
||||||
|
{
|
||||||
|
Border northBorder = new Border();
|
||||||
|
northBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue,
|
||||||
|
offset.Y); //<---
|
||||||
|
northBorder.CrossDirection = Cardinals.N;
|
||||||
|
rconn.RegionScene.NorthBorders.Add(northBorder);
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (rconn.RegionScene.SouthBorders)
|
||||||
|
{
|
||||||
|
Border southBorder = new Border();
|
||||||
|
southBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //--->
|
||||||
|
southBorder.CrossDirection = Cardinals.S;
|
||||||
|
rconn.RegionScene.SouthBorders.Add(southBorder);
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (rconn.RegionScene.EastBorders)
|
||||||
|
{
|
||||||
|
Border eastBorder = new Border();
|
||||||
|
eastBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, offset.Y);
|
||||||
|
//<---
|
||||||
|
eastBorder.CrossDirection = Cardinals.E;
|
||||||
|
rconn.RegionScene.EastBorders.Add(eastBorder);
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (rconn.RegionScene.WestBorders)
|
||||||
|
{
|
||||||
|
Border westBorder = new Border();
|
||||||
|
westBorder.BorderLine = new Vector3(float.MinValue, float.MaxValue, 0); //--->
|
||||||
|
westBorder.CrossDirection = Cardinals.W;
|
||||||
|
rconn.RegionScene.WestBorders.Add(westBorder);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
rconn.RegionScene.BordersLocked = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1710,7 +1710,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
int thisx = (int)RegionInfo.RegionLocX;
|
int thisx = (int)RegionInfo.RegionLocX;
|
||||||
int thisy = (int)RegionInfo.RegionLocY;
|
int thisy = (int)RegionInfo.RegionLocY;
|
||||||
|
|
||||||
ulong newRegionHandle = 0;
|
|
||||||
|
// use this if no borders were crossed!
|
||||||
|
ulong newRegionHandle
|
||||||
|
= Util.UIntsToLong((uint)((thisx) * Constants.RegionSize),
|
||||||
|
(uint)((thisy) * Constants.RegionSize));
|
||||||
|
|
||||||
Vector3 pos = attemptedPosition;
|
Vector3 pos = attemptedPosition;
|
||||||
|
|
||||||
if (TestBorderCross(attemptedPosition, Cardinals.W))
|
if (TestBorderCross(attemptedPosition, Cardinals.W))
|
||||||
|
|
|
@ -1477,8 +1477,26 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone();
|
SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone();
|
||||||
dupe.m_isBackedUp = false;
|
dupe.m_isBackedUp = false;
|
||||||
dupe.m_parts = new Dictionary<UUID, SceneObjectPart>();
|
dupe.m_parts = new Dictionary<UUID, SceneObjectPart>();
|
||||||
|
|
||||||
|
// Warning, The following code related to previousAttachmentStatus is needed so that clones of
|
||||||
|
// attachments do not bordercross while they're being duplicated. This is hacktastic!
|
||||||
|
// Normally, setting AbsolutePosition will bordercross a prim if it's outside the region!
|
||||||
|
// unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state
|
||||||
|
// (which should be false anyway) set it as an Attachment and then set it's Absolute Position,
|
||||||
|
// then restore it's attachment state
|
||||||
|
|
||||||
|
// This is only necessary when userExposed is false!
|
||||||
|
|
||||||
|
bool previousAttachmentStatus = dupe.RootPart.IsAttachment;
|
||||||
|
|
||||||
|
if (!userExposed)
|
||||||
|
dupe.RootPart.IsAttachment = true;
|
||||||
|
|
||||||
dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
|
dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
|
||||||
|
|
||||||
|
if (!userExposed)
|
||||||
|
dupe.RootPart.IsAttachment = previousAttachmentStatus;
|
||||||
|
|
||||||
dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
|
dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
|
||||||
dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
|
dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
|
||||||
|
|
||||||
|
|
|
@ -3509,8 +3509,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
// Set the parent localID to 0 so it transfers over properly.
|
// Set the parent localID to 0 so it transfers over properly.
|
||||||
gobj.RootPart.SetParentLocalId(0);
|
gobj.RootPart.SetParentLocalId(0);
|
||||||
gobj.RootPart.IsAttachment = false;
|
|
||||||
gobj.AbsolutePosition = gobj.RootPart.AttachedPos;
|
gobj.AbsolutePosition = gobj.RootPart.AttachedPos;
|
||||||
|
gobj.RootPart.IsAttachment = false;
|
||||||
//gobj.RootPart.LastOwnerID = gobj.GetFromAssetID();
|
//gobj.RootPart.LastOwnerID = gobj.GetFromAssetID();
|
||||||
m_log.DebugFormat("[ATTACHMENT]: Sending attachment {0} to region {1}", gobj.UUID, regionHandle);
|
m_log.DebugFormat("[ATTACHMENT]: Sending attachment {0} to region {1}", gobj.UUID, regionHandle);
|
||||||
m_scene.CrossPrimGroupIntoNewRegion(regionHandle, gobj, silent);
|
m_scene.CrossPrimGroupIntoNewRegion(regionHandle, gobj, silent);
|
||||||
|
|
Loading…
Reference in New Issue