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);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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
 | 
			
		||||
 | 
			
		||||
        public override string ToString()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -76,6 +76,14 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
 | 
			
		|||
            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
 | 
			
		||||
 | 
			
		||||
        public override string ToString()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -240,6 +240,14 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
 | 
			
		|||
            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
 | 
			
		||||
 | 
			
		||||
        public override string ToString()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -160,6 +160,13 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
 | 
			
		|||
            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
 | 
			
		||||
 | 
			
		||||
        public override string ToString()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -308,6 +308,14 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
 | 
			
		|||
            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
 | 
			
		||||
 | 
			
		||||
        public override string ToString()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,5 +38,6 @@ namespace OpenSim.Region.CoreModules.World.Terrain
 | 
			
		|||
        ITerrainChannel LoadStream(Stream stream);
 | 
			
		||||
        void SaveFile(string filename, 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>
 | 
			
		||||
        /// Performs updates to the region periodically, synchronising physics and other heightmap aware sections
 | 
			
		||||
        /// </summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -860,6 +893,15 @@ namespace OpenSim.Region.CoreModules.World.Terrain
 | 
			
		|||
            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)
 | 
			
		||||
        {
 | 
			
		||||
            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",
 | 
			
		||||
                                            "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
 | 
			
		||||
            Command fillRegionCommand =
 | 
			
		||||
                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-tile", loadFromTileCommand);
 | 
			
		||||
            m_commander.RegisterCommand("save", saveToFileCommand);
 | 
			
		||||
            m_commander.RegisterCommand("save-tile", saveToTileCommand);
 | 
			
		||||
            m_commander.RegisterCommand("fill", fillRegionCommand);
 | 
			
		||||
            m_commander.RegisterCommand("elevate", elevateCommand);
 | 
			
		||||
            m_commander.RegisterCommand("lower", lowerCommand);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue