⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 contoureditor.cs

📁 游戏编程精粹6的光盘源代码
💻 CS
📖 第 1 页 / 共 2 页
字号:

		}
		#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 + -