varregion: update LandManagementModule and LandObject for variable sized regions.
parent
07dead7dcb
commit
df14b40e88
|
@ -64,6 +64,12 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
public class LandManagementModule : INonSharedRegionModule
|
public class LandManagementModule : INonSharedRegionModule
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
private static readonly string LogHeader = "[LAND MANAGEMENT MODULE]";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Minimum land unit size in region co-ordinates.
|
||||||
|
/// </summary>
|
||||||
|
public const int landUnit = 4;
|
||||||
|
|
||||||
private static readonly string remoteParcelRequestPath = "0009/";
|
private static readonly string remoteParcelRequestPath = "0009/";
|
||||||
|
|
||||||
|
@ -74,15 +80,10 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
protected IPrimCountModule m_primCountModule;
|
protected IPrimCountModule m_primCountModule;
|
||||||
protected IDialogModule m_Dialog;
|
protected IDialogModule m_Dialog;
|
||||||
|
|
||||||
// Minimum for parcels to work is 64m even if we don't actually use them.
|
|
||||||
#pragma warning disable 0429
|
|
||||||
private const int landArrayMax = ((int)((int)Constants.RegionSize / 4) >= 64) ? (int)((int)Constants.RegionSize / 4) : 64;
|
|
||||||
#pragma warning restore 0429
|
|
||||||
|
|
||||||
/// <value>
|
/// <value>
|
||||||
/// Local land ids at specified region co-ordinates (region size / 4)
|
/// Local land ids at specified region co-ordinates (region size / 4)
|
||||||
/// </value>
|
/// </value>
|
||||||
private readonly int[,] m_landIDList = new int[landArrayMax, landArrayMax];
|
private int[,] m_landIDList;
|
||||||
|
|
||||||
/// <value>
|
/// <value>
|
||||||
/// Land objects keyed by local id
|
/// Land objects keyed by local id
|
||||||
|
@ -123,7 +124,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
public void AddRegion(Scene scene)
|
public void AddRegion(Scene scene)
|
||||||
{
|
{
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
m_landIDList.Initialize();
|
m_landIDList = new int[m_scene.RegionInfo.RegionSizeX / landUnit, m_scene.RegionInfo.RegionSizeY / landUnit];
|
||||||
landChannel = new LandChannel(scene, this);
|
landChannel = new LandChannel(scene, this);
|
||||||
|
|
||||||
parcelInfoCache = new Cache();
|
parcelInfoCache = new Cache();
|
||||||
|
@ -264,7 +265,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
m_landList.Clear();
|
m_landList.Clear();
|
||||||
m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
|
m_lastLandLocalID = LandChannel.START_LAND_LOCAL_ID - 1;
|
||||||
m_landIDList.Initialize();
|
m_landIDList = new int[m_scene.RegionInfo.RegionSizeX / landUnit, m_scene.RegionInfo.RegionSizeY / landUnit];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -274,11 +275,11 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// <returns>The parcel created.</returns>
|
/// <returns>The parcel created.</returns>
|
||||||
protected ILandObject CreateDefaultParcel()
|
protected ILandObject CreateDefaultParcel()
|
||||||
{
|
{
|
||||||
m_log.DebugFormat(
|
m_log.DebugFormat("{0} Creating default parcel for region {1}", LogHeader, m_scene.RegionInfo.RegionName);
|
||||||
"[LAND MANAGEMENT MODULE]: Creating default parcel for region {0}", m_scene.RegionInfo.RegionName);
|
|
||||||
|
|
||||||
ILandObject fullSimParcel = new LandObject(UUID.Zero, false, m_scene);
|
ILandObject fullSimParcel = new LandObject(UUID.Zero, false, m_scene);
|
||||||
fullSimParcel.SetLandBitmap(fullSimParcel.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize));
|
fullSimParcel.SetLandBitmap(fullSimParcel.GetSquareLandBitmap(0, 0,
|
||||||
|
(int)m_scene.RegionInfo.RegionSizeX, (int)m_scene.RegionInfo.RegionSizeY));
|
||||||
fullSimParcel.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
|
fullSimParcel.LandData.OwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
|
||||||
fullSimParcel.LandData.ClaimDate = Util.UnixTimeSinceEpoch();
|
fullSimParcel.LandData.ClaimDate = Util.UnixTimeSinceEpoch();
|
||||||
|
|
||||||
|
@ -569,9 +570,9 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
new_land.LandData.LocalID = newLandLocalID;
|
new_land.LandData.LocalID = newLandLocalID;
|
||||||
|
|
||||||
bool[,] landBitmap = new_land.GetLandBitmap();
|
bool[,] landBitmap = new_land.GetLandBitmap();
|
||||||
for (int x = 0; x < landArrayMax; x++)
|
for (int x = 0; x < landBitmap.GetLength(0); x++)
|
||||||
{
|
{
|
||||||
for (int y = 0; y < landArrayMax; y++)
|
for (int y = 0; y < landBitmap.GetLength(1); y++)
|
||||||
{
|
{
|
||||||
if (landBitmap[x, y])
|
if (landBitmap[x, y])
|
||||||
{
|
{
|
||||||
|
@ -601,9 +602,9 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
ILandObject land;
|
ILandObject land;
|
||||||
lock (m_landList)
|
lock (m_landList)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < 64; x++)
|
for (int x = 0; x < m_landIDList.GetLength(0); x++)
|
||||||
{
|
{
|
||||||
for (int y = 0; y < 64; y++)
|
for (int y = 0; y < m_landIDList.GetLength(1); y++)
|
||||||
{
|
{
|
||||||
if (m_landIDList[x, y] == local_id)
|
if (m_landIDList[x, y] == local_id)
|
||||||
{
|
{
|
||||||
|
@ -656,9 +657,9 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
bool[,] landBitmapSlave = slave.GetLandBitmap();
|
bool[,] landBitmapSlave = slave.GetLandBitmap();
|
||||||
lock (m_landList)
|
lock (m_landList)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < 64; x++)
|
for (int x = 0; x < landBitmapSlave.GetLength(0); x++)
|
||||||
{
|
{
|
||||||
for (int y = 0; y < 64; y++)
|
for (int y = 0; y < landBitmapSlave.GetLength(1); y++)
|
||||||
{
|
{
|
||||||
if (landBitmapSlave[x, y])
|
if (landBitmapSlave[x, y])
|
||||||
{
|
{
|
||||||
|
@ -695,20 +696,23 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
int x;
|
int x;
|
||||||
int y;
|
int y;
|
||||||
|
|
||||||
if (x_float > Constants.RegionSize || x_float < 0 || y_float > Constants.RegionSize || y_float < 0)
|
if (x_float >= m_scene.RegionInfo.RegionSizeX || x_float < 0 || y_float >= m_scene.RegionInfo.RegionSizeX || y_float < 0)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
x = Convert.ToInt32(Math.Floor(Convert.ToDouble(x_float) / 4.0));
|
x = Convert.ToInt32(Math.Floor(Convert.ToDouble(x_float) / (float)landUnit));
|
||||||
y = Convert.ToInt32(Math.Floor(Convert.ToDouble(y_float) / 4.0));
|
y = Convert.ToInt32(Math.Floor(Convert.ToDouble(y_float) / (float)landUnit));
|
||||||
}
|
}
|
||||||
catch (OverflowException)
|
catch (OverflowException)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (x >= 64 || y >= 64 || x < 0 || y < 0)
|
if (x >= (m_scene.RegionInfo.RegionSizeX / landUnit)
|
||||||
|
|| y >= (m_scene.RegionInfo.RegionSizeY / landUnit)
|
||||||
|
|| x < 0
|
||||||
|
|| y < 0)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -740,20 +744,20 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
int avx = (int)x;
|
int avx = (int)x;
|
||||||
if (avx < 0)
|
if (avx < 0)
|
||||||
avx = 0;
|
avx = 0;
|
||||||
else if (avx >= (int)Constants.RegionSize)
|
else if (avx >= m_scene.RegionInfo.RegionSizeX)
|
||||||
avx = (int)Constants.RegionSize - 1;
|
avx = (int)Constants.RegionSize - 1;
|
||||||
|
|
||||||
int avy = (int)y;
|
int avy = (int)y;
|
||||||
if (avy < 0)
|
if (avy < 0)
|
||||||
avy = 0;
|
avy = 0;
|
||||||
else if (avy >= (int)Constants.RegionSize)
|
else if (avy >= m_scene.RegionInfo.RegionSizeY)
|
||||||
avy = (int)Constants.RegionSize - 1;
|
avy = (int)Constants.RegionSize - 1;
|
||||||
|
|
||||||
lock (m_landIDList)
|
lock (m_landIDList)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return m_landList[m_landIDList[avx / 4, avy / 4]];
|
return m_landList[m_landIDList[avx / landUnit, avy / landUnit]];
|
||||||
}
|
}
|
||||||
catch (IndexOutOfRangeException)
|
catch (IndexOutOfRangeException)
|
||||||
{
|
{
|
||||||
|
@ -764,7 +768,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
public ILandObject GetLandObject(int x, int y)
|
public ILandObject GetLandObject(int x, int y)
|
||||||
{
|
{
|
||||||
if (x >= Convert.ToInt32(Constants.RegionSize) || y >= Convert.ToInt32(Constants.RegionSize) || x < 0 || y < 0)
|
if (x >= m_scene.RegionInfo.RegionSizeX || y >= m_scene.RegionInfo.RegionSizeY || x < 0 || y < 0)
|
||||||
{
|
{
|
||||||
// These exceptions here will cause a lot of complaints from the users specifically because
|
// These exceptions here will cause a lot of complaints from the users specifically because
|
||||||
// they happen every time at border crossings
|
// they happen every time at border crossings
|
||||||
|
@ -1057,9 +1061,10 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
int byteArrayCount = 0;
|
int byteArrayCount = 0;
|
||||||
int sequenceID = 0;
|
int sequenceID = 0;
|
||||||
|
|
||||||
for (int y = 0; y < Constants.RegionSize; y += 4)
|
// Layer data is in landUnit (4m) chunks
|
||||||
|
for (int y = 0; y < m_scene.RegionInfo.RegionSizeY; y += landUnit)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < Constants.RegionSize; x += 4)
|
for (int x = 0; x < m_scene.RegionInfo.RegionSizeX; x += landUnit)
|
||||||
{
|
{
|
||||||
byte tempByte = 0; //This represents the byte for the current 4x4
|
byte tempByte = 0; //This represents the byte for the current 4x4
|
||||||
|
|
||||||
|
@ -1769,7 +1774,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
// most likely still cached from building the extLandData entry
|
// most likely still cached from building the extLandData entry
|
||||||
uint x = 0, y = 0;
|
uint x = 0, y = 0;
|
||||||
Utils.LongToUInts(data.RegionHandle, out x, out y);
|
Util.RegionHandleToWorldLoc(data.RegionHandle, out x, out y);
|
||||||
info = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y);
|
info = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y);
|
||||||
}
|
}
|
||||||
// we need to transfer the fake parcelID, not the one in landData, so the viewer can match it to the landmark.
|
// we need to transfer the fake parcelID, not the one in landData, so the viewer can match it to the landmark.
|
||||||
|
|
|
@ -45,15 +45,13 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
#region Member Variables
|
#region Member Variables
|
||||||
|
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
#pragma warning disable 0429
|
private static readonly string LogHeader = "[LAND OBJECT]";
|
||||||
private const int landArrayMax = ((int)((int)Constants.RegionSize / 4) >= 64) ? (int)((int)Constants.RegionSize / 4) : 64;
|
|
||||||
#pragma warning restore 0429
|
private readonly int landUnit = 4;
|
||||||
private bool[,] m_landBitmap = new bool[landArrayMax,landArrayMax];
|
|
||||||
|
|
||||||
private int m_lastSeqId = 0;
|
private int m_lastSeqId = 0;
|
||||||
private int m_expiryCounter = 0;
|
private int m_expiryCounter = 0;
|
||||||
|
|
||||||
protected LandData m_landData = new LandData();
|
|
||||||
protected Scene m_scene;
|
protected Scene m_scene;
|
||||||
protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>();
|
protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>();
|
||||||
protected Dictionary<uint, UUID> m_listTransactions = new Dictionary<uint, UUID>();
|
protected Dictionary<uint, UUID> m_listTransactions = new Dictionary<uint, UUID>();
|
||||||
|
@ -61,6 +59,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
protected ExpiringCache<UUID, bool> m_groupMemberCache = new ExpiringCache<UUID, bool>();
|
protected ExpiringCache<UUID, bool> m_groupMemberCache = new ExpiringCache<UUID, bool>();
|
||||||
protected TimeSpan m_groupMemberCacheTimeout = TimeSpan.FromSeconds(30); // cache invalidation after 30 seconds
|
protected TimeSpan m_groupMemberCacheTimeout = TimeSpan.FromSeconds(30); // cache invalidation after 30 seconds
|
||||||
|
|
||||||
|
private bool[,] m_landBitmap;
|
||||||
public bool[,] LandBitmap
|
public bool[,] LandBitmap
|
||||||
{
|
{
|
||||||
get { return m_landBitmap; }
|
get { return m_landBitmap; }
|
||||||
|
@ -76,6 +75,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
return free;
|
return free;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected LandData m_landData;
|
||||||
public LandData LandData
|
public LandData LandData
|
||||||
{
|
{
|
||||||
get { return m_landData; }
|
get { return m_landData; }
|
||||||
|
@ -94,12 +94,12 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
for (int y = 0; y < landArrayMax; y++)
|
for (int y = 0; y < LandBitmap.GetLength(1); y++)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < landArrayMax; x++)
|
for (int x = 0; x < LandBitmap.GetLength(0); x++)
|
||||||
{
|
{
|
||||||
if (LandBitmap[x, y])
|
if (LandBitmap[x, y])
|
||||||
return new Vector3(x * 4, y * 4, 0);
|
return new Vector3(x * landUnit, y * landUnit, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,13 +111,13 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
for (int y = landArrayMax - 1; y >= 0; y--)
|
for (int y = LandBitmap.GetLength(1) - 1; y >= 0; y--)
|
||||||
{
|
{
|
||||||
for (int x = landArrayMax - 1; x >= 0; x--)
|
for (int x = LandBitmap.GetLength(0) - 1; x >= 0; x--)
|
||||||
{
|
{
|
||||||
if (LandBitmap[x, y])
|
if (LandBitmap[x, y])
|
||||||
{
|
{
|
||||||
return new Vector3(x * 4 + 4, y * 4 + 4, 0);
|
return new Vector3(x * landUnit + landUnit, y * landUnit + landUnit, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,9 +128,21 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
#region Constructors
|
#region Constructors
|
||||||
|
|
||||||
|
public LandObject(LandData landData, Scene scene)
|
||||||
|
{
|
||||||
|
LandData = landData.Copy();
|
||||||
|
m_scene = scene;
|
||||||
|
}
|
||||||
|
|
||||||
public LandObject(UUID owner_id, bool is_group_owned, Scene scene)
|
public LandObject(UUID owner_id, bool is_group_owned, Scene scene)
|
||||||
{
|
{
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
|
if (m_scene == null)
|
||||||
|
LandBitmap = new bool[Constants.RegionSize / landUnit, Constants.RegionSize / landUnit];
|
||||||
|
else
|
||||||
|
LandBitmap = new bool[m_scene.RegionInfo.RegionSizeX / landUnit, m_scene.RegionInfo.RegionSizeY / landUnit];
|
||||||
|
|
||||||
|
LandData = new LandData();
|
||||||
LandData.OwnerID = owner_id;
|
LandData.OwnerID = owner_id;
|
||||||
if (is_group_owned)
|
if (is_group_owned)
|
||||||
LandData.GroupID = owner_id;
|
LandData.GroupID = owner_id;
|
||||||
|
@ -155,9 +167,9 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// <returns>Returns true if the piece of land contains the specified point</returns>
|
/// <returns>Returns true if the piece of land contains the specified point</returns>
|
||||||
public bool ContainsPoint(int x, int y)
|
public bool ContainsPoint(int x, int y)
|
||||||
{
|
{
|
||||||
if (x >= 0 && y >= 0 && x < Constants.RegionSize && y < Constants.RegionSize)
|
if (x >= 0 && y >= 0 && x < m_scene.RegionInfo.RegionSizeX && y < m_scene.RegionInfo.RegionSizeY)
|
||||||
{
|
{
|
||||||
return (LandBitmap[x / 4, y / 4] == true);
|
return LandBitmap[x / landUnit, y / landUnit];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -197,10 +209,10 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Normal Calculations
|
// Normal Calculations
|
||||||
int parcelMax = (int)((long)LandData.Area
|
int parcelMax = (int)( (long)LandData.Area
|
||||||
* (long)m_scene.RegionInfo.ObjectCapacity
|
* (long)m_scene.RegionInfo.ObjectCapacity
|
||||||
* (long)m_scene.RegionInfo.RegionSettings.ObjectBonus
|
* (long)m_scene.RegionInfo.RegionSettings.ObjectBonus
|
||||||
/ 65536L);
|
/ (long)(m_scene.RegionInfo.RegionSizeX * m_scene.RegionInfo.RegionSizeY) );
|
||||||
//m_log.DebugFormat("Area: {0}, Capacity {1}, Bonus {2}, Parcel {3}", LandData.Area, m_scene.RegionInfo.ObjectCapacity, m_scene.RegionInfo.RegionSettings.ObjectBonus, parcelMax);
|
//m_log.DebugFormat("Area: {0}, Capacity {1}, Bonus {2}, Parcel {3}", LandData.Area, m_scene.RegionInfo.ObjectCapacity, m_scene.RegionInfo.RegionSettings.ObjectBonus, parcelMax);
|
||||||
return parcelMax;
|
return parcelMax;
|
||||||
}
|
}
|
||||||
|
@ -231,8 +243,9 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Normal Calculations
|
//Normal Calculations
|
||||||
int simMax = (int)((long)LandData.SimwideArea
|
int simMax = (int)( (long)LandData.SimwideArea
|
||||||
* (long)m_scene.RegionInfo.ObjectCapacity / 65536L);
|
* (long)m_scene.RegionInfo.ObjectCapacity
|
||||||
|
/ (long)(m_scene.RegionInfo.RegionSizeX * m_scene.RegionInfo.RegionSizeY) );
|
||||||
// m_log.DebugFormat("Simwide Area: {0}, Capacity {1}, SimMax {2}", LandData.SimwideArea, m_scene.RegionInfo.ObjectCapacity, simMax);
|
// m_log.DebugFormat("Simwide Area: {0}, Capacity {1}, SimMax {2}", LandData.SimwideArea, m_scene.RegionInfo.ObjectCapacity, simMax);
|
||||||
return simMax;
|
return simMax;
|
||||||
}
|
}
|
||||||
|
@ -597,8 +610,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
over =
|
over =
|
||||||
m_scene.LandChannel.GetLandObject(Util.Clamp<int>((int)Math.Round(avatar.AbsolutePosition.X), 0, ((int)Constants.RegionSize - 1)),
|
m_scene.LandChannel.GetLandObject(Util.Clamp<int>((int)Math.Round(avatar.AbsolutePosition.X), 0, ((int)m_scene.RegionInfo.RegionSizeX - 1)),
|
||||||
Util.Clamp<int>((int)Math.Round(avatar.AbsolutePosition.Y), 0, ((int)Constants.RegionSize - 1)));
|
Util.Clamp<int>((int)Math.Round(avatar.AbsolutePosition.Y), 0, ((int)m_scene.RegionInfo.RegionSizeY - 1)));
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
|
@ -752,9 +765,9 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
int max_y = Int32.MinValue;
|
int max_y = Int32.MinValue;
|
||||||
int tempArea = 0;
|
int tempArea = 0;
|
||||||
int x, y;
|
int x, y;
|
||||||
for (x = 0; x < 64; x++)
|
for (x = 0; x < LandBitmap.GetLength(0); x++)
|
||||||
{
|
{
|
||||||
for (y = 0; y < 64; y++)
|
for (y = 0; y < LandBitmap.GetLength(1); y++)
|
||||||
{
|
{
|
||||||
if (LandBitmap[x, y] == true)
|
if (LandBitmap[x, y] == true)
|
||||||
{
|
{
|
||||||
|
@ -766,23 +779,25 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
max_x = x;
|
max_x = x;
|
||||||
if (max_y < y)
|
if (max_y < y)
|
||||||
max_y = y;
|
max_y = y;
|
||||||
tempArea += 16; //16sqm peice of land
|
tempArea += landUnit * landUnit; //16sqm peice of land
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int tx = min_x * landUnit;
|
||||||
|
if (tx > ((int)m_scene.RegionInfo.RegionSizeX - 1))
|
||||||
|
tx = ((int)m_scene.RegionInfo.RegionSizeX - 1);
|
||||||
|
|
||||||
int tx = min_x * 4;
|
|
||||||
int htx;
|
int htx;
|
||||||
if (tx == ((int)Constants.RegionSize))
|
if (tx >= ((int)m_scene.RegionInfo.RegionSizeX))
|
||||||
htx = tx - 1;
|
htx = (int)m_scene.RegionInfo.RegionSizeX - 1;
|
||||||
else
|
else
|
||||||
htx = tx;
|
htx = tx;
|
||||||
|
|
||||||
int ty = min_y * 4;
|
int ty = min_y * landUnit;
|
||||||
int hty;
|
int hty;
|
||||||
|
|
||||||
if (ty == ((int)Constants.RegionSize))
|
if (ty >= ((int)m_scene.RegionInfo.RegionSizeY))
|
||||||
hty = ty - 1;
|
hty = (int)m_scene.RegionInfo.RegionSizeY - 1;
|
||||||
else
|
else
|
||||||
hty = ty;
|
hty = ty;
|
||||||
|
|
||||||
|
@ -791,17 +806,17 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
(float)(tx), (float)(ty), m_scene != null ? (float)m_scene.Heightmap[htx, hty] : 0);
|
(float)(tx), (float)(ty), m_scene != null ? (float)m_scene.Heightmap[htx, hty] : 0);
|
||||||
|
|
||||||
max_x++;
|
max_x++;
|
||||||
tx = max_x * 4;
|
tx = max_x * landUnit;
|
||||||
if (tx == ((int)Constants.RegionSize))
|
if (tx >= ((int)m_scene.RegionInfo.RegionSizeX))
|
||||||
htx = tx - 1;
|
htx = (int)m_scene.RegionInfo.RegionSizeX - 1;
|
||||||
else
|
else
|
||||||
htx = tx;
|
htx = tx;
|
||||||
|
|
||||||
max_y++;
|
max_y++;
|
||||||
ty = max_y * 4;
|
ty = max_y * 4;
|
||||||
|
|
||||||
if (ty == ((int)Constants.RegionSize))
|
if (ty >= ((int)m_scene.RegionInfo.RegionSizeY))
|
||||||
hty = ty - 1;
|
hty = (int)m_scene.RegionInfo.RegionSizeY - 1;
|
||||||
else
|
else
|
||||||
hty = ty;
|
hty = ty;
|
||||||
|
|
||||||
|
@ -819,20 +834,11 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the land's bitmap manually
|
/// Sets the land's bitmap manually
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="bitmap">64x64 block representing where this land is on a map</param>
|
/// <param name="bitmap">block representing where this land is on a map mapped in a 4x4 meter grid</param>
|
||||||
public void SetLandBitmap(bool[,] bitmap)
|
public void SetLandBitmap(bool[,] bitmap)
|
||||||
{
|
{
|
||||||
if (bitmap.GetLength(0) != 64 || bitmap.GetLength(1) != 64 || bitmap.Rank != 2)
|
LandBitmap = bitmap;
|
||||||
{
|
ForceUpdateLandInfo();
|
||||||
//Throw an exception - The bitmap is not 64x64
|
|
||||||
//throw new Exception("Error: Invalid Parcel Bitmap");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Valid: Lets set it
|
|
||||||
LandBitmap = bitmap;
|
|
||||||
ForceUpdateLandInfo();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -846,14 +852,16 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
public bool[,] BasicFullRegionLandBitmap()
|
public bool[,] BasicFullRegionLandBitmap()
|
||||||
{
|
{
|
||||||
return GetSquareLandBitmap(0, 0, (int) Constants.RegionSize, (int) Constants.RegionSize);
|
return GetSquareLandBitmap(0, 0, (int)m_scene.RegionInfo.RegionSizeX, (int) m_scene.RegionInfo.RegionSizeY);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y)
|
public bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y)
|
||||||
{
|
{
|
||||||
bool[,] tempBitmap = new bool[64,64];
|
// Empty bitmap for the whole region
|
||||||
|
bool[,] tempBitmap = new bool[m_scene.RegionInfo.RegionSizeX / landUnit, m_scene.RegionInfo.RegionSizeY / landUnit];
|
||||||
tempBitmap.Initialize();
|
tempBitmap.Initialize();
|
||||||
|
|
||||||
|
// Fill the bitmap square area specified by state and end
|
||||||
tempBitmap = ModifyLandBitmapSquare(tempBitmap, start_x, start_y, end_x, end_y, true);
|
tempBitmap = ModifyLandBitmapSquare(tempBitmap, start_x, start_y, end_x, end_y, true);
|
||||||
return tempBitmap;
|
return tempBitmap;
|
||||||
}
|
}
|
||||||
|
@ -871,19 +879,13 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
public bool[,] ModifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y,
|
public bool[,] ModifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y,
|
||||||
bool set_value)
|
bool set_value)
|
||||||
{
|
{
|
||||||
if (land_bitmap.GetLength(0) != 64 || land_bitmap.GetLength(1) != 64 || land_bitmap.Rank != 2)
|
|
||||||
{
|
|
||||||
//Throw an exception - The bitmap is not 64x64
|
|
||||||
//throw new Exception("Error: Invalid Parcel Bitmap in modifyLandBitmapSquare()");
|
|
||||||
}
|
|
||||||
|
|
||||||
int x, y;
|
int x, y;
|
||||||
for (y = 0; y < 64; y++)
|
for (y = 0; y < land_bitmap.GetLength(1); y++)
|
||||||
{
|
{
|
||||||
for (x = 0; x < 64; x++)
|
for (x = 0; x < land_bitmap.GetLength(0); x++)
|
||||||
{
|
{
|
||||||
if (x >= start_x / 4 && x < end_x / 4
|
if (x >= start_x / landUnit && x < end_x / landUnit
|
||||||
&& y >= start_y / 4 && y < end_y / 4)
|
&& y >= start_y / landUnit && y < end_y / landUnit)
|
||||||
{
|
{
|
||||||
land_bitmap[x, y] = set_value;
|
land_bitmap[x, y] = set_value;
|
||||||
}
|
}
|
||||||
|
@ -900,21 +902,21 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool[,] MergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add)
|
public bool[,] MergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add)
|
||||||
{
|
{
|
||||||
if (bitmap_base.GetLength(0) != 64 || bitmap_base.GetLength(1) != 64 || bitmap_base.Rank != 2)
|
if (bitmap_base.GetLength(0) != bitmap_add.GetLength(0)
|
||||||
|
|| bitmap_base.GetLength(1) != bitmap_add.GetLength(1)
|
||||||
|
|| bitmap_add.Rank != 2
|
||||||
|
|| bitmap_base.Rank != 2)
|
||||||
{
|
{
|
||||||
//Throw an exception - The bitmap is not 64x64
|
throw new Exception(
|
||||||
throw new Exception("Error: Invalid Parcel Bitmap - Bitmap_base in mergeLandBitmaps");
|
String.Format("{0} MergeLandBitmaps. merging maps not same size. baseSizeXY=<{1},{2}>, addSizeXY=<{3},{4}>",
|
||||||
}
|
LogHeader, bitmap_base.GetLength(0), bitmap_base.GetLength(1), bitmap_add.GetLength(0), bitmap_add.GetLength(1))
|
||||||
if (bitmap_add.GetLength(0) != 64 || bitmap_add.GetLength(1) != 64 || bitmap_add.Rank != 2)
|
);
|
||||||
{
|
|
||||||
//Throw an exception - The bitmap is not 64x64
|
|
||||||
throw new Exception("Error: Invalid Parcel Bitmap - Bitmap_add in mergeLandBitmaps");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int x, y;
|
int x, y;
|
||||||
for (y = 0; y < 64; y++)
|
for (y = 0; y < bitmap_base.GetLength(1); y++)
|
||||||
{
|
{
|
||||||
for (x = 0; x < 64; x++)
|
for (x = 0; x < bitmap_add.GetLength(0); x++)
|
||||||
{
|
{
|
||||||
if (bitmap_add[x, y])
|
if (bitmap_add[x, y])
|
||||||
{
|
{
|
||||||
|
@ -931,14 +933,14 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private byte[] ConvertLandBitmapToBytes()
|
private byte[] ConvertLandBitmapToBytes()
|
||||||
{
|
{
|
||||||
byte[] tempConvertArr = new byte[512];
|
byte[] tempConvertArr = new byte[LandBitmap.GetLength(0) * LandBitmap.GetLength(1) / 8];
|
||||||
int tempByte = 0;
|
int tempByte = 0;
|
||||||
int x, y, i, byteNum = 0;
|
int i, byteNum = 0;
|
||||||
int mask = 1;
|
int mask = 1;
|
||||||
i = 0;
|
i = 0;
|
||||||
for (y = 0; y < 64; y++)
|
for (int y = 0; y < LandBitmap.GetLength(1); y++)
|
||||||
{
|
{
|
||||||
for (x = 0; x < 64; x++)
|
for (int x = 0; x < LandBitmap.GetLength(0); x++)
|
||||||
{
|
{
|
||||||
if (LandBitmap[x, y])
|
if (LandBitmap[x, y])
|
||||||
tempByte |= mask;
|
tempByte |= mask;
|
||||||
|
@ -971,25 +973,45 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
private bool[,] ConvertBytesToLandBitmap()
|
private bool[,] ConvertBytesToLandBitmap()
|
||||||
{
|
{
|
||||||
bool[,] tempConvertMap = new bool[landArrayMax, landArrayMax];
|
bool[,] tempConvertMap = new bool[m_scene.RegionInfo.RegionSizeX / landUnit, m_scene.RegionInfo.RegionSizeY / landUnit];
|
||||||
tempConvertMap.Initialize();
|
tempConvertMap.Initialize();
|
||||||
byte tempByte = 0;
|
byte tempByte = 0;
|
||||||
int x = 0, y = 0, i = 0, bitNum = 0;
|
// Math.Min overcomes an old bug that might have made it into the database. Only use the bytes that fit into convertMap.
|
||||||
for (i = 0; i < 512; i++)
|
int bitmapLen = Math.Min(LandData.Bitmap.Length, tempConvertMap.GetLength(0) * tempConvertMap.GetLength(1) / 8);
|
||||||
|
int xLen = (int)(m_scene.RegionInfo.RegionSizeX / landUnit);
|
||||||
|
|
||||||
|
if (bitmapLen == 512)
|
||||||
|
{
|
||||||
|
// Legacy bitmap being passed in. Use the legacy region size
|
||||||
|
// and only set the lower area of the larger region.
|
||||||
|
xLen = (int)(Constants.RegionSize / landUnit);
|
||||||
|
}
|
||||||
|
// m_log.DebugFormat("{0} ConvertBytesToLandBitmap: bitmapLen={1}, xLen={2}", LogHeader, bitmapLen, xLen);
|
||||||
|
|
||||||
|
int x = 0, y = 0;
|
||||||
|
for (int i = 0; i < bitmapLen; i++)
|
||||||
{
|
{
|
||||||
tempByte = LandData.Bitmap[i];
|
tempByte = LandData.Bitmap[i];
|
||||||
for (bitNum = 0; bitNum < 8; bitNum++)
|
for (int bitNum = 0; bitNum < 8; bitNum++)
|
||||||
{
|
{
|
||||||
bool bit = Convert.ToBoolean(Convert.ToByte(tempByte >> bitNum) & (byte) 1);
|
bool bit = Convert.ToBoolean(Convert.ToByte(tempByte >> bitNum) & (byte) 1);
|
||||||
tempConvertMap[x, y] = bit;
|
try
|
||||||
|
{
|
||||||
|
tempConvertMap[x, y] = bit;
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
m_log.DebugFormat("{0} ConvertBytestoLandBitmap: i={1}, x={2}, y={3}", LogHeader, i, x, y);
|
||||||
|
}
|
||||||
x++;
|
x++;
|
||||||
if (x > 63)
|
if (x >= xLen)
|
||||||
{
|
{
|
||||||
x = 0;
|
x = 0;
|
||||||
y++;
|
y++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return tempConvertMap;
|
return tempConvertMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue