Merge branch 'master' of ssh://opensimulator.org/var/git/opensim

remotes/origin/0.6.7-post-fixes
Sean Dague 2009-08-31 20:16:32 -04:00
commit 4333bc7742
4 changed files with 95 additions and 6 deletions

View File

@ -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;
}
}
} }

View File

@ -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))

View File

@ -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;

View File

@ -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);