Add Varregion support to Terragen Handler
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>0.8.0.3
parent
3c5b7d7b79
commit
50eec6df52
|
@ -65,7 +65,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
bool eof = false;
|
bool eof = false;
|
||||||
|
|
||||||
int fileXPoints = 0;
|
int fileXPoints = 0;
|
||||||
// int fileYPoints = 0;
|
int fileYPoints = 0;
|
||||||
|
|
||||||
// Terragen file
|
// Terragen file
|
||||||
while (eof == false)
|
while (eof == false)
|
||||||
|
@ -75,7 +75,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
{
|
{
|
||||||
case "SIZE":
|
case "SIZE":
|
||||||
fileXPoints = bs.ReadInt16() + 1;
|
fileXPoints = bs.ReadInt16() + 1;
|
||||||
// fileYPoints = fileXPoints;
|
fileYPoints = fileXPoints;
|
||||||
bs.ReadInt16();
|
bs.ReadInt16();
|
||||||
break;
|
break;
|
||||||
case "XPTS":
|
case "XPTS":
|
||||||
|
@ -83,8 +83,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
bs.ReadInt16();
|
bs.ReadInt16();
|
||||||
break;
|
break;
|
||||||
case "YPTS":
|
case "YPTS":
|
||||||
// fileYPoints = bs.ReadInt16();
|
fileYPoints = bs.ReadInt16();
|
||||||
bs.ReadInt16();
|
|
||||||
bs.ReadInt16();
|
bs.ReadInt16();
|
||||||
break;
|
break;
|
||||||
case "ALTW":
|
case "ALTW":
|
||||||
|
@ -138,7 +137,6 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
bs.ReadInt16();
|
bs.ReadInt16();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
bs.ReadInt32();
|
bs.ReadInt32();
|
||||||
|
@ -154,10 +152,11 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
|
|
||||||
public ITerrainChannel LoadStream(Stream s)
|
public ITerrainChannel LoadStream(Stream s)
|
||||||
{
|
{
|
||||||
|
// Set to default size
|
||||||
int w = (int)Constants.RegionSize;
|
int w = (int)Constants.RegionSize;
|
||||||
int h = (int)Constants.RegionSize;
|
int h = (int)Constants.RegionSize;
|
||||||
|
|
||||||
|
// create a dummy channel (in case data is bad)
|
||||||
TerrainChannel retval = new TerrainChannel(w, h);
|
TerrainChannel retval = new TerrainChannel(w, h);
|
||||||
|
|
||||||
BinaryReader bs = new BinaryReader(s);
|
BinaryReader bs = new BinaryReader(s);
|
||||||
|
@ -165,8 +164,6 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
bool eof = false;
|
bool eof = false;
|
||||||
if (Encoding.ASCII.GetString(bs.ReadBytes(16)) == "TERRAGENTERRAIN ")
|
if (Encoding.ASCII.GetString(bs.ReadBytes(16)) == "TERRAGENTERRAIN ")
|
||||||
{
|
{
|
||||||
// int fileWidth = w;
|
|
||||||
// int fileHeight = h;
|
|
||||||
|
|
||||||
// Terragen file
|
// Terragen file
|
||||||
while (eof == false)
|
while (eof == false)
|
||||||
|
@ -175,31 +172,29 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
switch (tmp)
|
switch (tmp)
|
||||||
{
|
{
|
||||||
case "SIZE":
|
case "SIZE":
|
||||||
// int sztmp = bs.ReadInt16() + 1;
|
w = bs.ReadInt16() + 1;
|
||||||
// fileWidth = sztmp;
|
h = w;
|
||||||
// fileHeight = sztmp;
|
|
||||||
bs.ReadInt16();
|
|
||||||
bs.ReadInt16();
|
bs.ReadInt16();
|
||||||
break;
|
break;
|
||||||
case "XPTS":
|
case "XPTS":
|
||||||
// fileWidth = bs.ReadInt16();
|
w = bs.ReadInt16();
|
||||||
bs.ReadInt16();
|
|
||||||
bs.ReadInt16();
|
bs.ReadInt16();
|
||||||
break;
|
break;
|
||||||
case "YPTS":
|
case "YPTS":
|
||||||
// fileHeight = bs.ReadInt16();
|
h = bs.ReadInt16();
|
||||||
bs.ReadInt16();
|
|
||||||
bs.ReadInt16();
|
bs.ReadInt16();
|
||||||
break;
|
break;
|
||||||
case "ALTW":
|
case "ALTW":
|
||||||
eof = true;
|
eof = true;
|
||||||
Int16 heightScale = bs.ReadInt16();
|
// create new channel of proper size (now that we know it)
|
||||||
Int16 baseHeight = bs.ReadInt16();
|
retval = new TerrainChannel(w, h);
|
||||||
|
double heightScale = (double)bs.ReadInt16() / 65536.0;
|
||||||
|
double baseHeight = (double)bs.ReadInt16();
|
||||||
for (int y = 0; y < h; y++)
|
for (int y = 0; y < h; y++)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < w; x++)
|
for (int x = 0; x < w; x++)
|
||||||
{
|
{
|
||||||
retval[x, y] = baseHeight + bs.ReadInt16() * (double)heightScale / 65536.0;
|
retval[x, y] = baseHeight + (double)bs.ReadInt16() * heightScale;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -209,9 +204,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bs.Close();
|
bs.Close();
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,17 +250,17 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
bs.Write(enc.GetBytes("TERRAGENTERRAIN "));
|
bs.Write(enc.GetBytes("TERRAGENTERRAIN "));
|
||||||
|
|
||||||
bs.Write(enc.GetBytes("SIZE"));
|
bs.Write(enc.GetBytes("SIZE"));
|
||||||
bs.Write(Convert.ToInt16(Constants.RegionSize));
|
bs.Write(Convert.ToInt16(map.Width));
|
||||||
bs.Write(Convert.ToInt16(0)); // necessary padding
|
bs.Write(Convert.ToInt16(0)); // necessary padding
|
||||||
|
|
||||||
//The XPTS and YPTS chunks are not needed for square regions
|
//The XPTS and YPTS chunks are not needed for square regions
|
||||||
//but L3DT won't load the terrain file properly without them.
|
//but L3DT won't load the terrain file properly without them.
|
||||||
bs.Write(enc.GetBytes("XPTS"));
|
bs.Write(enc.GetBytes("XPTS"));
|
||||||
bs.Write(Convert.ToInt16(Constants.RegionSize));
|
bs.Write(Convert.ToInt16(map.Width));
|
||||||
bs.Write(Convert.ToInt16(0)); // necessary padding
|
bs.Write(Convert.ToInt16(0)); // necessary padding
|
||||||
|
|
||||||
bs.Write(enc.GetBytes("YPTS"));
|
bs.Write(enc.GetBytes("YPTS"));
|
||||||
bs.Write(Convert.ToInt16(Constants.RegionSize));
|
bs.Write(Convert.ToInt16(map.Height));
|
||||||
bs.Write(Convert.ToInt16(0)); // necessary padding
|
bs.Write(Convert.ToInt16(0)); // necessary padding
|
||||||
|
|
||||||
bs.Write(enc.GetBytes("SCAL"));
|
bs.Write(enc.GetBytes("SCAL"));
|
||||||
|
@ -282,12 +275,14 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
bs.Write(enc.GetBytes("ALTW"));
|
bs.Write(enc.GetBytes("ALTW"));
|
||||||
bs.Write(Convert.ToInt16(horizontalScale)); // range between max and min
|
bs.Write(Convert.ToInt16(horizontalScale)); // range between max and min
|
||||||
bs.Write(Convert.ToInt16(baseHeight)); // base height or mid point
|
bs.Write(Convert.ToInt16(baseHeight)); // base height or mid point
|
||||||
|
|
||||||
|
double factor = 65536.0 / horizontalScale; // avoid computing this on each iteration
|
||||||
|
|
||||||
for (int y = 0; y < map.Height; y++)
|
for (int y = 0; y < map.Height; y++)
|
||||||
{
|
{
|
||||||
for (int x = 0; x < map.Width; x++)
|
for (int x = 0; x < map.Width; x++)
|
||||||
{
|
{
|
||||||
float elevation = (float)((map[x,y] - baseHeight) * 65536 ) / (float)horizontalScale; // see LoadStream for inverse
|
float elevation = (float)((map[x,y] - baseHeight) * factor); // see LoadStream for inverse
|
||||||
|
|
||||||
// clamp rounding issues
|
// clamp rounding issues
|
||||||
if (elevation > Int16.MaxValue)
|
if (elevation > Int16.MaxValue)
|
||||||
|
@ -299,7 +294,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//This is only necessary for older versions of Terragen.
|
//This is necessary for older versions of Terragen.
|
||||||
bs.Write(enc.GetBytes("EOF "));
|
bs.Write(enc.GetBytes("EOF "));
|
||||||
|
|
||||||
bs.Close();
|
bs.Close();
|
||||||
|
@ -343,7 +338,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
if (BitConverter.IsLittleEndian == false)
|
if (BitConverter.IsLittleEndian == false)
|
||||||
{
|
{
|
||||||
byte[] tmp = new byte[4];
|
byte[] tmp = new byte[4];
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 3; i >= 0; i--)
|
||||||
{
|
{
|
||||||
tmp[i] = retVal[3 - i];
|
tmp[i] = retVal[3 - i];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue