Implemented terrain save-tile command. Does the opposite of load-tile. For now, only saves to .png.
parent
5c870fce54
commit
16c911dcbb
|
@ -124,6 +124,52 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
colours.Save(stream, ImageFormat.Png);
|
colours.Save(stream, ImageFormat.Png);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void SaveFile(ITerrainChannel m_channel, string filename,
|
||||||
|
int offsetX, int offsetY,
|
||||||
|
int fileWidth, int fileHeight,
|
||||||
|
int regionSizeX, int regionSizeY)
|
||||||
|
|
||||||
|
{
|
||||||
|
// We need to do this because:
|
||||||
|
// "Saving the image to the same file it was constructed from is not allowed and throws an exception."
|
||||||
|
string tempName = offsetX + "_ " + offsetY + "_" + filename;
|
||||||
|
|
||||||
|
Bitmap entireBitmap = null;
|
||||||
|
Bitmap thisBitmap = null;
|
||||||
|
if (File.Exists(filename))
|
||||||
|
{
|
||||||
|
File.Copy(filename, tempName);
|
||||||
|
entireBitmap = new Bitmap(tempName);
|
||||||
|
if (entireBitmap.Width != fileWidth * regionSizeX || entireBitmap.Height != fileHeight * regionSizeY)
|
||||||
|
{
|
||||||
|
// old file, let's overwrite it
|
||||||
|
entireBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
entireBitmap = new Bitmap(fileWidth * regionSizeX, fileHeight * regionSizeY);
|
||||||
|
}
|
||||||
|
|
||||||
|
thisBitmap = CreateGrayscaleBitmapFromMap(m_channel);
|
||||||
|
Console.WriteLine("offsetX=" + offsetX + " offsetY=" + offsetY);
|
||||||
|
for (int x = 0; x < regionSizeX; x++)
|
||||||
|
for (int y = 0; y < regionSizeY; y++)
|
||||||
|
entireBitmap.SetPixel(x + offsetX * regionSizeX, y + (fileHeight - 1 - offsetY) * regionSizeY, thisBitmap.GetPixel(x, y));
|
||||||
|
|
||||||
|
Save(entireBitmap, filename);
|
||||||
|
thisBitmap.Dispose();
|
||||||
|
entireBitmap.Dispose();
|
||||||
|
|
||||||
|
if (File.Exists(tempName))
|
||||||
|
File.Delete(tempName);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Save(Bitmap bmp, string filename)
|
||||||
|
{
|
||||||
|
bmp.Save(filename, ImageFormat.Png);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|
|
@ -76,6 +76,14 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
colours.Save(stream, ImageFormat.Jpeg);
|
colours.Save(stream, ImageFormat.Jpeg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void SaveFile(ITerrainChannel m_channel, string filename,
|
||||||
|
int offsetX, int offsetY,
|
||||||
|
int fileWidth, int fileHeight,
|
||||||
|
int regionSizeX, int regionSizeY)
|
||||||
|
{
|
||||||
|
throw new System.Exception("Not Implemented");
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|
|
@ -240,6 +240,14 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
get { return ".raw"; }
|
get { return ".raw"; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void SaveFile(ITerrainChannel m_channel, string filename,
|
||||||
|
int offsetX, int offsetY,
|
||||||
|
int fileWidth, int fileHeight,
|
||||||
|
int regionSizeX, int regionSizeY)
|
||||||
|
{
|
||||||
|
throw new System.Exception("Not Implemented");
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|
|
@ -160,6 +160,13 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
bs.Close();
|
bs.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void SaveFile(ITerrainChannel m_channel, string filename,
|
||||||
|
int offsetX, int offsetY,
|
||||||
|
int fileWidth, int fileHeight,
|
||||||
|
int regionSizeX, int regionSizeY)
|
||||||
|
{
|
||||||
|
throw new System.Exception("Not Implemented");
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|
|
@ -308,6 +308,14 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
|
||||||
get { return ".ter"; }
|
get { return ".ter"; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void SaveFile(ITerrainChannel m_channel, string filename,
|
||||||
|
int offsetX, int offsetY,
|
||||||
|
int fileWidth, int fileHeight,
|
||||||
|
int regionSizeX, int regionSizeY)
|
||||||
|
{
|
||||||
|
throw new System.Exception("Not Implemented");
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|
|
@ -38,5 +38,6 @@ namespace OpenSim.Region.CoreModules.World.Terrain
|
||||||
ITerrainChannel LoadStream(Stream stream);
|
ITerrainChannel LoadStream(Stream stream);
|
||||||
void SaveFile(string filename, ITerrainChannel map);
|
void SaveFile(string filename, ITerrainChannel map);
|
||||||
void SaveStream(Stream stream, ITerrainChannel map);
|
void SaveStream(Stream stream, ITerrainChannel map);
|
||||||
|
void SaveFile(ITerrainChannel map, string filename, int offsetX, int offsetY, int fileWidth, int fileHeight, int regionSizeX, int regionSizeY);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -540,6 +540,39 @@ namespace OpenSim.Region.CoreModules.World.Terrain
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Saves the terrain to a larger terrain file.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filename">The terrain file to save</param>
|
||||||
|
/// <param name="fileWidth">The width of the file in units</param>
|
||||||
|
/// <param name="fileHeight">The height of the file in units</param>
|
||||||
|
/// <param name="fileStartX">Where to begin our slice</param>
|
||||||
|
/// <param name="fileStartY">Where to begin our slice</param>
|
||||||
|
public void SaveToFile(string filename, int fileWidth, int fileHeight, int fileStartX, int fileStartY)
|
||||||
|
{
|
||||||
|
int offsetX = (int)m_scene.RegionInfo.RegionLocX - fileStartX;
|
||||||
|
int offsetY = (int)m_scene.RegionInfo.RegionLocY - fileStartY;
|
||||||
|
|
||||||
|
if (offsetX >= 0 && offsetX < fileWidth && offsetY >= 0 && offsetY < fileHeight)
|
||||||
|
{
|
||||||
|
// this region is included in the tile request
|
||||||
|
foreach (KeyValuePair<string, ITerrainLoader> loader in m_loaders)
|
||||||
|
{
|
||||||
|
if (filename.EndsWith(loader.Key))
|
||||||
|
{
|
||||||
|
lock (m_scene)
|
||||||
|
{
|
||||||
|
loader.Value.SaveFile(m_channel, filename, offsetX, offsetY,
|
||||||
|
fileWidth, fileHeight,
|
||||||
|
(int)Constants.RegionSize,
|
||||||
|
(int)Constants.RegionSize);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Performs updates to the region periodically, synchronising physics and other heightmap aware sections
|
/// Performs updates to the region periodically, synchronising physics and other heightmap aware sections
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -860,6 +893,15 @@ namespace OpenSim.Region.CoreModules.World.Terrain
|
||||||
SaveToFile((string) args[0]);
|
SaveToFile((string) args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void InterfaceSaveTileFile(Object[] args)
|
||||||
|
{
|
||||||
|
SaveToFile((string)args[0],
|
||||||
|
(int)args[1],
|
||||||
|
(int)args[2],
|
||||||
|
(int)args[3],
|
||||||
|
(int)args[4]);
|
||||||
|
}
|
||||||
|
|
||||||
private void InterfaceBakeTerrain(Object[] args)
|
private void InterfaceBakeTerrain(Object[] args)
|
||||||
{
|
{
|
||||||
UpdateRevertMap();
|
UpdateRevertMap();
|
||||||
|
@ -1115,6 +1157,17 @@ namespace OpenSim.Region.CoreModules.World.Terrain
|
||||||
loadFromTileCommand.AddArgument("minimum Y tile", "The Y region coordinate of the first section on the file",
|
loadFromTileCommand.AddArgument("minimum Y tile", "The Y region coordinate of the first section on the file",
|
||||||
"Integer");
|
"Integer");
|
||||||
|
|
||||||
|
Command saveToTileCommand =
|
||||||
|
new Command("save-tile", CommandIntentions.COMMAND_HAZARDOUS, InterfaceSaveTileFile, "Saves the current heightmap to the larger file.");
|
||||||
|
saveToTileCommand.AddArgument("filename",
|
||||||
|
"The file you wish to save to, the file extension determines the loader to be used. Supported extensions include: " +
|
||||||
|
supportedFileExtensions, "String");
|
||||||
|
saveToTileCommand.AddArgument("file width", "The width of the file in tiles", "Integer");
|
||||||
|
saveToTileCommand.AddArgument("file height", "The height of the file in tiles", "Integer");
|
||||||
|
saveToTileCommand.AddArgument("minimum X tile", "The X region coordinate of the first section on the file",
|
||||||
|
"Integer");
|
||||||
|
saveToTileCommand.AddArgument("minimum Y tile", "The Y region coordinate of the first section on the file",
|
||||||
|
"Integer");
|
||||||
// Terrain adjustments
|
// Terrain adjustments
|
||||||
Command fillRegionCommand =
|
Command fillRegionCommand =
|
||||||
new Command("fill", CommandIntentions.COMMAND_HAZARDOUS, InterfaceFillTerrain, "Fills the current heightmap with a specified value.");
|
new Command("fill", CommandIntentions.COMMAND_HAZARDOUS, InterfaceFillTerrain, "Fills the current heightmap with a specified value.");
|
||||||
|
@ -1166,6 +1219,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
|
||||||
m_commander.RegisterCommand("load", loadFromFileCommand);
|
m_commander.RegisterCommand("load", loadFromFileCommand);
|
||||||
m_commander.RegisterCommand("load-tile", loadFromTileCommand);
|
m_commander.RegisterCommand("load-tile", loadFromTileCommand);
|
||||||
m_commander.RegisterCommand("save", saveToFileCommand);
|
m_commander.RegisterCommand("save", saveToFileCommand);
|
||||||
|
m_commander.RegisterCommand("save-tile", saveToTileCommand);
|
||||||
m_commander.RegisterCommand("fill", fillRegionCommand);
|
m_commander.RegisterCommand("fill", fillRegionCommand);
|
||||||
m_commander.RegisterCommand("elevate", elevateCommand);
|
m_commander.RegisterCommand("elevate", elevateCommand);
|
||||||
m_commander.RegisterCommand("lower", lowerCommand);
|
m_commander.RegisterCommand("lower", lowerCommand);
|
||||||
|
|
Loading…
Reference in New Issue