//---------------------------------------------------------------------------------------------------------------------------------------------------
//
// 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
}
}