//--------------------------------------------------------------------------------------------------------------------------------------------------- // // Copyright (C)2007 DarkWynter Studios. All rights reserved. // //--------------------------------------------------------------------------------------------------------------------------------------------------- // {Contact : darkwynter.com for licensing information //--------------------------------------------------------------------------------------------------------------------------------------------------- using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using Microsoft.Xna; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using DarkWynter.Engine.Globals; using DarkWynter.Engine.Utilities; using DarkWynter.Engine.GameObjects; using DarkWynter.Engine.Controllers; using DarkWynter.Stream; using Color = System.Drawing.Color; using Point = System.Drawing.Point; using DarkWynter.Engine; namespace DarkWynter.App { public partial class TerrainModControl : UserControl { // New Bitmap Bitmap bmp; Color currentColor = Color.Red; int brushSize = 50; bool draw = false; static Enums_Engine.TerrainModType terrainModType = Enums_Engine.TerrainModType.EQUALTO; public TerrainModControl() { InitializeComponent(); this.Dock = DockStyle.Fill; // New Bitmap // bmp = new Bitmap("c:/images/image.gif"); bmp = new Bitmap(128,128); pictureBoxMapView.Image = bmp; Init_TerrainModVectors(); } private static void RequestTerrainMod(float amount, int radius, int timer, ref Vector3 position, ref Vector3 position2) { TerrainModRequest request = new TerrainModRequest(timer, amount, position, position2, radius, terrainModType); DarkWynter.Engine.Controllers.GameController.NonControllerBasedTerrainMod(request); } #region TerrainMod Vector Draw private void Init_TerrainModVectors() { // Init TerrainMod values amountBox.Text = "5"; radiusBox.Text = "2"; positionBox1.Text = "21"; positionBox2.Text = "0"; positionBox3.Text = "45"; } private void TerrainModVectors_EnterButton_Click(object sender, EventArgs e) { // Validate Input if (positionBox1.Text == "") { positionBox1.Text = "0"; } if (positionBox2.Text == "") { positionBox2.Text = "0"; } if (positionBox3.Text == "") { positionBox3.Text = "0"; } if (end1.Text == "") { end1.Text = "0"; } if (end2.Text == "") { end2.Text = "0"; } if (end3.Text == "") { end3.Text = "0"; } // Terrain Mod Panel float amount = float.Parse(amountBox.Text); int radius = int.Parse(radiusBox.Text); int timer = 100; Vector3 position = new Vector3(float.Parse(positionBox1.Text), float.Parse(positionBox2.Text), float.Parse(positionBox3.Text)); Vector3 position2 = new Vector3(float.Parse(end1.Text), float.Parse(end2.Text), float.Parse(end3.Text)); RequestTerrainMod(amount, radius, timer, ref position, ref position2); } #endregion #region BMP HeightMap Editor private void pictureBoxMapView_MouseDown(object sender, MouseEventArgs me) { draw = true; } private void pictureBoxMapView_MouseUp(object sender, MouseEventArgs me) { draw = false; } private void pictureBoxMapView_MouseMove(object sender, MouseEventArgs me) { //MouseEventArgs me = e as MouseEventArgs;//or MouseEventArgs em = (MouseEventArgs)e; brushSize = (int) numericUpDownBrushSize.Value; if (draw) { // Paint the 2D bitmap using brushsize for (int i = -brushSize; i < brushSize; i++) { for (int j = -brushSize; j < brushSize; j++) { // Find x & y relative to center of brush int x = me.X + i; int y = me.Y + j; // If within the bmp bounds if (0 < x && x < bmp.Width && 0 < y && y < bmp.Height) { // Call " Brush-Tip" Function here bmp.SetPixel(x, y, currentColor); } } } // Redraw pictureBoxMapView.Refresh(); // TerrainMod the 3D space using brushsize float amount = float.Parse(numericUpDownTerrainHeight.Text); int radius = int.Parse(numericUpDownBrushSize.Text); int timer = 100; Vector3 position = new Vector3(me.X, 0.0f, me.Y); Vector3 position2 = new Vector3(me.X, 0.0f, me.Y) + Vector3.One; RequestTerrainMod(amount, radius, timer, ref position, ref position2); } } private void colorSelectionButton_Click(object sender, EventArgs e) { // Color Dialog Selection ColorDialog colorDlg = new ColorDialog(); colorDlg.ShowDialog(); currentColor = colorDlg.Color; this.colorSelectionButton.BackColor = currentColor; } private void checkBoxAdditive_CheckedChanged(object sender, EventArgs e) { if (checkBoxAdditive.Checked) { terrainModType = Enums_Engine.TerrainModType.ADDITIVE; } else { terrainModType = Enums_Engine.TerrainModType.EQUALTO; } } /// /// Smooth Scaling by reinterpolating the image /// /// /// /// /// private void ResizeImageFromFile(String Image2Resize, String Image2Resize2, int poSizeWidth, int poSizeHeight) { Image poImage = Image.FromFile(Image2Resize); Image Original = poImage.Clone() as Image; if (Original.Height > Original.Width) { int TempValue; TempValue = poSizeWidth; poSizeWidth = poSizeHeight; poSizeHeight = TempValue; } Image ResizedImage = new Bitmap(poSizeWidth, poSizeHeight, Original.PixelFormat); Graphics oGraphic = Graphics.FromImage(ResizedImage); System.Drawing.Rectangle oRectangle = new System.Drawing.Rectangle(0, 0, poSizeWidth, poSizeHeight); oGraphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; oGraphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; oGraphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; oGraphic.DrawImage(Original, oRectangle); oGraphic.Dispose(); Original.Dispose(); // ResizedImage.Save(Image2Resize2, System.Drawing.Imaging.ImageFormat.Jpeg); } /// /// Smooth Scaling by reinterpolating the image /// /// /// /// /// private void ResizeImage(Image image, int poSizeWidth, int poSizeHeight) { Image clone = image.Clone() as Image; Graphics oGraphic = Graphics.FromImage(clone); System.Drawing.Rectangle oRectangle = new System.Drawing.Rectangle(0, 0, poSizeWidth, poSizeHeight); oGraphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; oGraphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; oGraphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; oGraphic.DrawImage(clone, oRectangle); oGraphic.Dispose(); clone.Dispose(); // ResizedImage.Save(Image2Resize2, System.Drawing.Imaging.ImageFormat.Jpeg); } #endregion #region Save Map private void buttonSaveMap_Click(object sender, EventArgs e) { SaveHeightMap(); } public void SaveHeightMap() { SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "DDS Vec4 MipMap (*.dds)|*.dds|All files (*.*)|*.*"; saveFileDialog1.FilterIndex = 0; saveFileDialog1.RestoreDirectory = true; saveFileDialog1.InitialDirectory = System.IO.Directory.GetCurrentDirectory() + "\\Content\\_terrainMaps"; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { DarkWynterEngine.engine.objectLibrary.terrain.heightMapTexture.Save(saveFileDialog1.FileName, ImageFileFormat.Dds); //Texture2D saveTexture = new Texture2D(Statics_Stream.RenderSettings.graphics.GraphicsDevice, bmp.Width, bmp.Height, 0, TextureUsage.AutoGenerateMipMap, SurfaceFormat.Vector4); //Vector4[] saveData = new Vector4[bmp.Width * bmp.Height]; //for (int x = 0; x < saveTexture.Width; x++) //{ // for (int y = 0; y < saveTexture.Height; y++) // { // Color pixelColor = bmp.GetPixel(x, y); // saveData[x + y * saveTexture.Width] = new Vector4(pixelColor.R, pixelColor.G, pixelColor.B, pixelColor.A); // } //} //saveTexture.SetData(saveData); //saveTexture.Save(saveFileDialog1.FileName, ImageFileFormat.Dds); } } #endregion } }