Add size of region to OAR control file. Megaregions (sw root OARs when saved) will have a size larger than 256x256

Not yet read.  Do not rely on this information yet, it may change.
0.7.4.1
Justin Clark-Casey (justincc) 2012-05-19 04:56:47 +01:00
parent 824a3a114b
commit 5759313f7f
3 changed files with 56 additions and 17 deletions

View File

@ -392,35 +392,45 @@ namespace OpenSim.Region.CoreModules.World.Archiver
xtw.WriteElementString("id", UUID.Random().ToString()); xtw.WriteElementString("id", UUID.Random().ToString());
xtw.WriteEndElement(); xtw.WriteEndElement();
xtw.WriteElementString("assets_included", SaveAssets.ToString()); xtw.WriteStartElement("region_info");
bool isMegaregion; bool isMegaregion;
Vector2 size;
IRegionCombinerModule rcMod = null;
// FIXME: This is only here for regression test purposes since they do not supply a module. Need to fix // FIXME: This is only here for regression test purposes since they do not supply a module. Need to fix
// this, possibly by doing control file creation somewhere else. // this, possibly by doing control file creation somewhere else.
if (m_module != null && m_module.RegionCombinerModule != null) if (m_module != null)
{ rcMod = m_module.RegionCombinerModule;
IRegionCombinerModule mod = m_module.RegionCombinerModule;
isMegaregion = mod.IsRootForMegaregion(m_scene.RegionInfo.RegionID); if (rcMod != null)
} isMegaregion = rcMod.IsRootForMegaregion(m_scene.RegionInfo.RegionID);
else else
{
isMegaregion = false; isMegaregion = false;
}
if (isMegaregion)
size = rcMod.GetSizeOfMegaregion(m_scene.RegionInfo.RegionID);
else
size = new Vector2((float)Constants.RegionSize, (float)Constants.RegionSize);
xtw.WriteElementString("is_megaregion", isMegaregion.ToString()); xtw.WriteElementString("is_megaregion", isMegaregion.ToString());
xtw.WriteElementString("size_in_meters", string.Format("{0},{1}", size.X, size.Y));
xtw.WriteEndElement();
xtw.WriteElementString("assets_included", SaveAssets.ToString());
xtw.WriteEndElement(); xtw.WriteEndElement();
xtw.Flush(); xtw.Flush();
xtw.Close();
} }
s = sw.ToString(); s = sw.ToString();
} }
// Console.WriteLine( if (m_scene != null)
// "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s); Console.WriteLine(
"[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s);
return s; return s;
} }

View File

@ -40,6 +40,20 @@ namespace OpenSim.Region.Framework.Interfaces
/// <summary> /// <summary>
/// Does the given id belong to the root region of a megaregion? /// Does the given id belong to the root region of a megaregion?
/// </summary> /// </summary>
bool IsRootForMegaregion(UUID sceneId); bool IsRootForMegaregion(UUID regionId);
/// <summary>
/// Gets the size of megaregion.
/// </summary>
/// <remarks>
/// Returns size in meters.
/// Do not rely on this method remaining the same - this area is actively under development.
/// </remarks>
/// <param name="sceneId">
/// The id of the root region for a megaregion.
/// This may change in the future to allow any region id that makes up a megaregion.
/// Currently, will throw an exception if this does not match a root region.
/// </param>
Vector2 GetSizeOfMegaregion(UUID regionId);
} }
} }

View File

@ -113,10 +113,25 @@ namespace OpenSim.Region.RegionCombinerModule
} }
} }
public bool IsRootForMegaregion(UUID sceneId) public bool IsRootForMegaregion(UUID regionId)
{ {
lock (m_regions) lock (m_regions)
return m_regions.ContainsKey(sceneId); return m_regions.ContainsKey(regionId);
}
public Vector2 GetSizeOfMegaregion(UUID regionId)
{
lock (m_regions)
{
if (m_regions.ContainsKey(regionId))
{
RegionConnections rootConn = m_regions[regionId];
return new Vector2((float)rootConn.XEnd, (float)rootConn.YEnd);
}
}
throw new Exception(string.Format("Region with id {0} not found", regionId));
} }
private void NewPresence(ScenePresence presence) private void NewPresence(ScenePresence presence)