Add Varregion support to Terragen Handler

Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
0.8.0.3
Dev Random 2014-02-25 10:27:04 -05:00 committed by Michael Cerquoni
parent 3c5b7d7b79
commit 50eec6df52
1 changed files with 23 additions and 28 deletions

View File

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