📄 contoureditor.cs
字号:
}
#endregion
[STAThread]
static void Main()
{
Application.Run(new ContourEditor());
}
protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
{
switch(e.KeyCode)
{
case Keys.NumPad0:
case Keys.N:
myOptimizedTexture.ResetDirection();
Invalidate();
e.Handled = true;
break;
case Keys.NumPad2:
case Keys.Down:
myOptimizedTexture.MoveDown();
Invalidate();
e.Handled = true;
break;
case Keys.NumPad4:
case Keys.Left:
myOptimizedTexture.MoveLeft();
Invalidate();
e.Handled = true;
break;
case Keys.NumPad5:
case Keys.M:
myOptimizedTexture.ResetLocation();
Invalidate();
e.Handled = true;
break;
case Keys.NumPad6:
case Keys.Right:
myOptimizedTexture.MoveRight();
Invalidate();
e.Handled = true;
break;
case Keys.NumPad7:
case Keys.PageUp:
myOptimizedTexture.RotateCCW();
Invalidate();
e.Handled = true;
break;
case Keys.NumPad8:
case Keys.Up:
myOptimizedTexture.MoveUp();
Invalidate();
e.Handled = true;
break;
case Keys.NumPad9:
case Keys.PageDown:
myOptimizedTexture.RotateCW();
Invalidate();
e.Handled = true;
break;
default:
break;
}
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
int baseX = AutoScrollPosition.X;
int baseY = AutoScrollPosition.Y;
Graphics g = e.Graphics;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
if(showImageMenuItem.Checked)
{
if(viewInputMenuItem.Checked)
{
System.Drawing.Drawing2D.Matrix oldTransform = g.Transform;
g.TranslateTransform(baseX, baseY, System.Drawing.Drawing2D.MatrixOrder.Prepend);
g.ScaleTransform(getZoom(), getZoom(), System.Drawing.Drawing2D.MatrixOrder.Prepend);
g.DrawImage(myOptimizedTexture.HiresImage, 0, 0);
g.Transform = oldTransform;
}
else
{
// rebuild if wrong size
if(displayBitmap != null
&& (displayBitmap.Width != ClientSize.Width || displayBitmap.Height != ClientSize.Height))
{
displayBitmap.Dispose();
displayBitmap = null;
}
// rebuild if missing
if(displayBitmap == null)
{
displayBitmap = new Bitmap(ClientSize.Width, ClientSize.Height, PixelFormat.Format24bppRgb);
displayBitmapIsDirty = true;
oldBaseX = baseX;
oldBaseY = baseY;
}
if(oldBaseX != baseX || oldBaseY != baseY)
{
displayBitmapIsDirty = true;
oldBaseX = baseX;
oldBaseY = baseY;
}
if(displayBitmapIsDirty)
{
myOptimizedTexture.FillDisplayBitmap(displayBitmap, getZoom(), baseX, baseY, previewWithThresholdMenuItem.Checked);
displayBitmapIsDirty = false;
}
g.DrawImageUnscaled(displayBitmap, 0, 0);
}
}
if(showSkeletonMenuItem.Checked)
{
System.Drawing.Drawing2D.Matrix oldTransform = g.Transform;
g.TranslateTransform(baseX, baseY, System.Drawing.Drawing2D.MatrixOrder.Prepend);
g.ScaleTransform(getZoom(), getZoom(), System.Drawing.Drawing2D.MatrixOrder.Prepend);
myOptimizedTexture.DrawSkeleton(g);
g.Transform = oldTransform;
}
}
private void changeViewType(object sender, System.EventArgs e)
{
viewInputMenuItem.Checked = false;
viewOutputMenuItem.Checked = false;
previewWithThresholdMenuItem.Checked = false;
((MenuItem)sender).Checked = true;
Dirty();
}
private void showImage(object sender, System.EventArgs e)
{
showImageMenuItem.Checked = !showImageMenuItem.Checked;
// don't show a blank screen but switch to other mode
if(!showImageMenuItem.Checked && !showSkeletonMenuItem.Checked)
{
showSkeletonMenuItem.Checked = true;
}
Invalidate();
}
private void showSkeleton(object sender, System.EventArgs e)
{
showSkeletonMenuItem.Checked = !showSkeletonMenuItem.Checked;
// don't show a blank screen but switch to other mode
if(!showImageMenuItem.Checked && !showSkeletonMenuItem.Checked)
{
showImageMenuItem.Checked = true;
}
Invalidate();
}
private void loadBitmap(object sender, System.EventArgs e)
{
DialogResult r = MessageBox.Show(this, "Discard the current bitmap and all editing done?", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if(r == DialogResult.OK)
{
using(OpenFileDialog fd = new OpenFileDialog())
{
fd.Filter = "Bitmap Files|*.bmp|JPEG Files|*.jpg|PNG Files|*.png";
DialogResult dr = fd.ShowDialog();
if(dr == DialogResult.OK)
{
try
{
OptimizedTexture newOptimizedTexture = new OptimizedTexture(fd.FileName, getDownsampling());
if(!RenderWindow.IsPowerOfTwo(newOptimizedTexture.GetSize(1).Width) || !RenderWindow.IsPowerOfTwo(newOptimizedTexture.GetSize(1).Height))
{
throw new Exception("Width and height of bitmap must be powers of 2.");
}
myOptimizedTexture.Dispose();
myOptimizedTexture = newOptimizedTexture;
myOptimizedTexture.SetEditor(this, myAdjustMetricForm, myRenderWindow);
AutoScrollMinSize = myOptimizedTexture.GetSize(getZoom());
Dirty();
theFile = null;
Text = "untitled";
}
catch(Exception ex)
{
MessageBox.Show(this, "Error on loading:\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}
private int getDownsampling()
{
if(downsampling4MenuItem.Checked)
{
return 4;
}
else if(downsampling8MenuItem.Checked)
{
return 8;
}
else
{
return 16;
}
}
private void changeDownsampling(object sender, System.EventArgs e)
{
downsampling4MenuItem.Checked = false;
downsampling8MenuItem.Checked = false;
downsampling16MenuItem.Checked = false;
((MenuItem)sender).Checked = true;
DialogResult r = MessageBox.Show(this, "Discard all editing done?", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if(r == DialogResult.OK)
{
myOptimizedTexture.ChangeDownsampling(getDownsampling());
Dirty();
}
}
private int getZoom()
{
if(zoom2MenuItem.Checked)
{
return 2;
}
else if(zoom4MenuItem.Checked)
{
return 4;
}
else
{
return 1;
}
}
private void changeZoom(object sender, System.EventArgs e)
{
zoomOffMenuItem.Checked = false;
zoom2MenuItem.Checked = false;
zoom4MenuItem.Checked = false;
((MenuItem)sender).Checked = true;
AutoScrollMinSize = myOptimizedTexture.GetSize(getZoom());
Dirty();
}
protected override void OnMouseUp(MouseEventArgs e)
{
myOptimizedTexture.Select(e.X, e.Y, AutoScrollPosition.X, AutoScrollPosition.Y, getZoom());
Invalidate();
base.OnMouseUp(e);
}
internal void Dirty()
{
displayBitmapIsDirty = true;
Invalidate();
}
private void exit(object sender, System.EventArgs e)
{
Application.Exit();
}
private void openProject(object sender, System.EventArgs e)
{
DialogResult r = MessageBox.Show(this, "Discard the current project and all editing done?", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if(r == DialogResult.OK)
{
using(OpenFileDialog fd = new OpenFileDialog())
{
fd.Filter = "Optimization Project Files|*.bilevelopt";
DialogResult dr = fd.ShowDialog();
if(dr == DialogResult.OK)
{
try
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(fd.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
OptimizedTexture newOptimizedTexture = (OptimizedTexture) formatter.Deserialize(stream);
stream.Close();
myOptimizedTexture.Dispose();
myOptimizedTexture = newOptimizedTexture;
myOptimizedTexture.SetEditor(this, myAdjustMetricForm, myRenderWindow);
AutoScrollMinSize = myOptimizedTexture.GetSize(getZoom());
Dirty();
theFile = fd.FileName;
Text = theFile;
}
catch(Exception ex)
{
MessageBox.Show(this, "Error on loading:\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}
private void saveProject(object sender, System.EventArgs e)
{
if(theFile == null)
{
saveProjectAs(sender, e);
}
else
{
commonSaveProjectAs(theFile);
}
}
private void saveProjectAs(object sender, System.EventArgs e)
{
using(SaveFileDialog fd = new SaveFileDialog())
{
fd.Filter = "Optimization Project Files|*.bilevelopt";
DialogResult dr = fd.ShowDialog();
if(dr == DialogResult.OK)
{
commonSaveProjectAs(fd.FileName);
}
}
}
private void commonSaveProjectAs(string fileName)
{
try
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, myOptimizedTexture);
stream.Close();
theFile = fileName;
Text = theFile;
}
catch(Exception ex)
{
MessageBox.Show(this, "Error on saving:\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void adjustMetric(object sender, System.EventArgs e)
{
if(!myAdjustMetricForm.Visible)
{
myAdjustMetricForm.Show();
}
else
{
myAdjustMetricForm.Hide();
}
}
private void showHidePreview(object sender, System.EventArgs e)
{
if(!myRenderWindow.Visible)
{
myRenderWindow.Show();
}
else
{
myRenderWindow.Hide();
}
}
private void exportTexture(object sender, System.EventArgs e)
{
using(SaveFileDialog fd = new SaveFileDialog())
{
fd.Filter = "Texture Files|*.dds";
DialogResult dr = fd.ShowDialog();
if(dr == DialogResult.OK)
{
myRenderWindow.SaveTexture(fd.FileName);
}
}
}
private void multicolor(object sender, System.EventArgs e)
{
using(MulticolorForm mf = new MulticolorForm(myRenderWindow))
{
mf.ShowDialog();
}
}
private void info(object sender, System.EventArgs e)
{
MessageBox.Show(this, "Contour Editor V. 1.0\n2005 by J鰎n Loviscach\nwww.l7h.cn\nFor details see Game Programming Gems Vol. 6", "Info");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -