diff --git a/Triangle.NET/TestApp/DarkMessageBox.cs b/Triangle.NET/TestApp/DarkMessageBox.cs index 517791c..b1ad107 100644 --- a/Triangle.NET/TestApp/DarkMessageBox.cs +++ b/Triangle.NET/TestApp/DarkMessageBox.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; +using System.Drawing; using System.Windows.Forms; namespace MeshExplorer diff --git a/Triangle.NET/TestApp/FormExport.cs b/Triangle.NET/TestApp/FormExport.cs index 5cc7dcd..075798b 100644 --- a/Triangle.NET/TestApp/FormExport.cs +++ b/Triangle.NET/TestApp/FormExport.cs @@ -1,12 +1,7 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; using System.IO; +using System.Windows.Forms; namespace MeshExplorer { diff --git a/Triangle.NET/TestApp/FormLog.cs b/Triangle.NET/TestApp/FormLog.cs index 70b619b..1d2677b 100644 --- a/Triangle.NET/TestApp/FormLog.cs +++ b/Triangle.NET/TestApp/FormLog.cs @@ -16,7 +16,7 @@ namespace MeshExplorer public void AddItem(string message, bool warning) { - ILog log = Log.Instance; + var log = Log.Instance; if (warning) { @@ -32,7 +32,7 @@ namespace MeshExplorer { listLog.Items.Clear(); - ILog log = Log.Instance; + var log = Log.Instance; foreach (var item in log.Data) { @@ -73,7 +73,26 @@ namespace MeshExplorer private void listLog_KeyDown(object sender, KeyEventArgs e) { - if (e.KeyCode == Keys.Delete) + if (e.KeyCode == Keys.C) + { + if (ModifierKeys == Keys.Control) + { + var selection = listLog.SelectedItems; + + if (selection != null && selection.Count > 0) + { + StringBuilder sb = new StringBuilder(); + + foreach (var item in selection) + { + GetRowText(sb, item); + } + + Clipboard.SetText(sb.ToString()); + } + } + } + else if (e.KeyCode == Keys.Delete) { if (ModifierKeys == Keys.Control) { @@ -110,7 +129,8 @@ namespace MeshExplorer if (lvi != null) { - sb.AppendLine(lvi.Text); + sb.Append(lvi.Text); + sb.Append("; "); } } } diff --git a/Triangle.NET/TestApp/FormMain.cs b/Triangle.NET/TestApp/FormMain.cs index d8efa81..e45d92a 100644 --- a/Triangle.NET/TestApp/FormMain.cs +++ b/Triangle.NET/TestApp/FormMain.cs @@ -5,13 +5,13 @@ using System.IO; using System.Windows.Forms; using MeshExplorer.Controls; using MeshExplorer.IO; -using MeshRenderer.Core; using TriangleNet; using TriangleNet.Geometry; using TriangleNet.Meshing; using TriangleNet.Meshing.Algorithm; -using TriangleNet.Smoothing; using TriangleNet.Tools; +using TriangleNet.Smoothing; +using TriangleNet.Rendering; namespace MeshExplorer { @@ -25,7 +25,6 @@ namespace MeshExplorer FormGenerator frmGenerator; RenderManager renderManager; - RenderData renderData; public FormMain() { @@ -41,12 +40,14 @@ namespace MeshExplorer settings = new Settings(); renderManager = new RenderManager(); - renderManager.CreateDefaultControl(); + + IRenderControl control = new TriangleNet.Rendering.GDI.RenderControl(); /* - if (!renderManager.CreateControl("MeshRenderer.SharpGL2.dll", new string[] { "SharpGL.dll" })) + if (!renderManager.TryCreateControl("Triangle.Rendering.SharpGL.dll", + new string[] { "SharpGL.dll" }, out control)) { - renderManager.CreateDefaultControl(); + control = new TriangleNet.Rendering.GDI.RenderControl(); if (frmLog == null) { @@ -55,34 +56,47 @@ namespace MeshExplorer frmLog.AddItem("Failed to initialize OpenGL.", true); } - */ - - var control = renderManager.RenderControl; + //*/ if (control != null) { - this.splitContainer1.Panel2.Controls.Add(control); - - // Initialize control - control.BackColor = Color.Black; - control.Dock = DockStyle.Fill; - control.Font = new Font("Consolas", 8.25F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0))); - control.Location = new System.Drawing.Point(0, 0); - control.Name = "renderControl1"; - control.Size = new Size(703, 612); - control.TabIndex = 0; - control.Text = "meshRenderer1"; - - renderManager.Initialize(); + InitializeRenderControl((Control)control); + renderManager.Initialize(control); } else { DarkMessageBox.Show("Ooops ...", "Failed to initialize renderer."); } - - renderData = new RenderData(); } - + + private void InitializeRenderControl(Control control) + { + this.splitContainer1.SuspendLayout(); + this.splitContainer1.Panel2.Controls.Add(control); + + var size = this.splitContainer1.Panel2.ClientRectangle; + + // Initialize control + control.BackColor = Color.Black; + control.Dock = DockStyle.Fill; + control.Font = new Font("Consolas", 8.25F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0))); + control.Location = new System.Drawing.Point(0, 0); + control.Name = "renderControl1"; + control.Size = new Size(size.Width, size.Height); + control.TabIndex = 0; + control.Text = "renderControl1"; + control.MouseClick += new MouseEventHandler(RenderControl_MouseClick); + + this.splitContainer1.ResumeLayout(); + } + + private void RenderControl_MouseClick(object sender, MouseEventArgs e) + { + var pt = e.Location; + + renderManager.Click(((float)pt.X), ((float)pt.Y), e.Button); + } + private void Form1_KeyUp(object sender, KeyEventArgs e) { switch (e.KeyCode) @@ -194,7 +208,7 @@ namespace MeshExplorer // Handle window minimize and maximize if (!isResizing) { - renderManager.HandleResize(); + renderManager.Resize(); } } @@ -205,7 +219,7 @@ namespace MeshExplorer if (this.ClientSize != this.oldClientSize) { this.oldClientSize = this.ClientSize; - renderManager.HandleResize(); + renderManager.Resize(); } } @@ -260,8 +274,7 @@ namespace MeshExplorer menuToolsRcm.Enabled = false; // Render input - renderData.SetInputGeometry(input); - renderManager.SetData(renderData); + renderManager.Set(input); // Update window caption this.Text = "Triangle.NET - Mesh Explorer - " + settings.CurrentFile; @@ -270,9 +283,7 @@ namespace MeshExplorer private void HandleMeshImport() { // Render mesh - renderData.SetMesh(mesh); - renderManager.SetData(renderData); - //renderManager.Initialize(); + renderManager.Set(mesh, true); // Update window caption this.Text = "Triangle.NET - Mesh Explorer - " + settings.CurrentFile; @@ -292,8 +303,7 @@ namespace MeshExplorer private void HandleMeshUpdate() { // Render mesh - renderData.SetMesh(mesh); - renderManager.SetData(renderData); + renderManager.Set(mesh, false); // Update Statistic view statisticView.HandleMeshUpdate(mesh); @@ -675,7 +685,6 @@ namespace MeshExplorer else { RasterImage img = new RasterImage(); - img.ColorScheme = ColorManager.LightScheme(); img.Export(this.mesh, export.ImageName, size); } } @@ -696,7 +705,7 @@ namespace MeshExplorer if (menuViewVoronoi.Checked) { - renderManager.ShowVoronoi = false; + //renderManager.ShowVoronoi = false; menuViewVoronoi.Checked = false; return; } @@ -712,8 +721,7 @@ namespace MeshExplorer voronoi = new Voronoi(mesh); } - renderData.SetVoronoi(voronoi); - renderManager.SetData(renderData); + renderManager.Set(voronoi, false); menuViewVoronoi.Checked = true; } diff --git a/Triangle.NET/TestApp/FormTopology.cs b/Triangle.NET/TestApp/FormTopology.cs index 60ef393..a933842 100644 --- a/Triangle.NET/TestApp/FormTopology.cs +++ b/Triangle.NET/TestApp/FormTopology.cs @@ -57,7 +57,8 @@ namespace MeshExplorer private ITriangle FindTriangleAt(float x, float y) { // Get mesh coordinates - var p = renderControl.Zoom.ScreenToWorld(x, y); + var p = new System.Drawing.PointF(x, y); + renderControl.Zoom.ScreenToWorld(ref p); topoControlView.SetPosition(p); diff --git a/Triangle.NET/TestApp/IO/RasterImage.cs b/Triangle.NET/TestApp/IO/RasterImage.cs index bb51b5e..9715f43 100644 --- a/Triangle.NET/TestApp/IO/RasterImage.cs +++ b/Triangle.NET/TestApp/IO/RasterImage.cs @@ -12,15 +12,15 @@ namespace MeshExplorer.IO using System.Drawing.Imaging; using System.IO; using TriangleNet; - using MeshRenderer.Core; - using MeshRenderer.Core.GDI; + using TriangleNet.Rendering; + using TriangleNet.Rendering.GDI; /// /// Writes an image of the mesh to disk. /// public class RasterImage { - ColorManager colors = ColorManager.Default(); + ColorManager colors = RasterImage.LightScheme(); public ColorManager ColorScheme { @@ -36,10 +36,6 @@ namespace MeshExplorer.IO /// The desired width (pixel) of the image. public void Export(Mesh mesh, string filename, int width) { - // Get mesh data -- TODO: Use RenderControl's RenderData - RenderData data = new RenderData(); - data.SetMesh(mesh); - // Check file name if (String.IsNullOrWhiteSpace(filename)) { @@ -53,21 +49,21 @@ namespace MeshExplorer.IO { bitmap = new Bitmap(400, 200); Graphics g = Graphics.FromImage(bitmap); - g.Clear(colors.Background); + g.Clear(Color.White); string message = String.Format("Sorry, I won't render {0} points on such a small image!", mesh.Vertices.Count); SizeF sz = g.MeasureString(message, SystemFonts.DefaultFont); g.SmoothingMode = SmoothingMode.AntiAlias; - g.DrawString(message, SystemFonts.DefaultFont, colors.Point, + g.DrawString(message, SystemFonts.DefaultFont, Brushes.Black, 200 - sz.Width / 2, 100 - sz.Height / 2); g.Dispose(); } else { - var bounds = data.Bounds; + var bounds = mesh.Bounds; // World margin on each side float margin = (float)bounds.Height * 0.05f; float scale = width / ((float)bounds.Width + 2 * margin); @@ -76,16 +72,18 @@ namespace MeshExplorer.IO bitmap = new Bitmap(width, target.Height, PixelFormat.Format32bppPArgb); - Zoom zoom = new Zoom(); - zoom.Initialize(target, bounds); - Graphics g = Graphics.FromImage(bitmap); g.Clear(colors.Background); g.SmoothingMode = SmoothingMode.HighQuality; - MeshRenderer meshRenderer = new MeshRenderer(data, colors); - meshRenderer.Render(g, zoom); + var context = new RenderContext(new Projection(target), colors); + context.Add(mesh, true); + + var renderer = new LayerRenderer(); + renderer.Context = context; + renderer.RenderTarget = g; + renderer.Render(); g.Dispose(); } @@ -97,5 +95,19 @@ namespace MeshExplorer.IO bitmap.Save(filename, ImageFormat.Png); } + + public static ColorManager LightScheme() + { + var colors = new ColorManager(); + + colors.Background = Color.White; + colors.Point = new SolidBrush(Color.FromArgb(60, 80, 120)); + colors.SteinerPoint = new SolidBrush(Color.DarkGreen); + colors.Line = new Pen(Color.FromArgb(150, 150, 150)); + colors.Segment = new Pen(Color.SteelBlue); + colors.VoronoiLine = new Pen(Color.FromArgb(160, 170, 180)); + + return colors; + } } } diff --git a/Triangle.NET/TestApp/Mesh Explorer.csproj b/Triangle.NET/TestApp/Mesh Explorer.csproj index f5c7a75..aad11c5 100644 --- a/Triangle.NET/TestApp/Mesh Explorer.csproj +++ b/Triangle.NET/TestApp/Mesh Explorer.csproj @@ -40,10 +40,8 @@ - - @@ -183,9 +181,9 @@ - - {9C5040DA-C739-43A1-8540-E6BD3ED6DB55} - MeshRenderer.Core + + {41022e0e-bd0f-439e-bc3a-aabb1b43471b} + Triangle.Rendering {F7907A0A-B75F-400B-9E78-BFAD00DB4D6B} diff --git a/Triangle.NET/TestApp/Topology/TopologyRenderControl.cs b/Triangle.NET/TestApp/Topology/TopologyRenderControl.cs index 726b630..d070716 100644 --- a/Triangle.NET/TestApp/Topology/TopologyRenderControl.cs +++ b/Triangle.NET/TestApp/Topology/TopologyRenderControl.cs @@ -5,8 +5,8 @@ namespace MeshExplorer.Topology using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Windows.Forms; - using MeshRenderer.Core; using TriangleNet; + using TriangleNet.Rendering; public class TopologyRenderControl : Control { @@ -14,12 +14,12 @@ namespace MeshExplorer.Topology private BufferedGraphics buffer; private BufferedGraphicsContext context; - Zoom zoom; + Projection zoom; TopologyRenderer renderer; bool initialized = false; - public Zoom Zoom + public Projection Zoom { get { return zoom; } } @@ -33,7 +33,6 @@ namespace MeshExplorer.Topology this.BackColor = Color.Black; - zoom = new Zoom(true); context = new BufferedGraphicsContext(); } @@ -44,11 +43,11 @@ namespace MeshExplorer.Topology { renderer = new TopologyRenderer(mesh); - zoom.Initialize(this.ClientRectangle); + zoom = new Projection(this.ClientRectangle); //zoom.ClipMargin = 10.0f; var b = mesh.Bounds; - zoom.Update(new BoundingBox((float)b.Left, (float)b.Right, + zoom.Initialize(new BoundingBox((float)b.Left, (float)b.Right, (float)b.Bottom, (float)b.Top)); InitializeBuffer(); diff --git a/Triangle.NET/TestApp/Topology/TopologyRenderer.cs b/Triangle.NET/TestApp/Topology/TopologyRenderer.cs index 290b3d5..0f0be5e 100644 --- a/Triangle.NET/TestApp/Topology/TopologyRenderer.cs +++ b/Triangle.NET/TestApp/Topology/TopologyRenderer.cs @@ -3,13 +3,13 @@ namespace MeshExplorer.Topology { using System; using System.Drawing; - using MeshRenderer.Core; using TriangleNet; using TriangleNet.Geometry; + using TriangleNet.Rendering; public class TopologyRenderer { - Zoom zoom; + Projection zoom; Mesh mesh; PointF[] points; @@ -50,7 +50,7 @@ namespace MeshExplorer.Topology /// /// Renders the mesh. /// - public void Render(Graphics g, Zoom zoom) + public void Render(Graphics g, Projection zoom) { this.zoom = zoom; @@ -142,7 +142,8 @@ namespace MeshExplorer.Topology { var brush = i == id ? Brushes.DarkRed : Point; - pt = zoom.WorldToScreen(points[i].X, points[i].Y); + pt = points[i]; + zoom.WorldToScreen(ref pt); g.FillEllipse(brush, pt.X - 10f, pt.Y - 10f, 20, 20); pt.X -= i > 9 ? 7 : 4; @@ -164,9 +165,9 @@ namespace MeshExplorer.Topology p1 = points[tri.P1]; p2 = points[tri.P2]; - p0 = zoom.WorldToScreen(p0.X, p0.Y); - p1 = zoom.WorldToScreen(p1.X, p1.Y); - p2 = zoom.WorldToScreen(p2.X, p2.Y); + zoom.WorldToScreen(ref p0); + zoom.WorldToScreen(ref p1); + zoom.WorldToScreen(ref p2); g.DrawLine(Line, p0, p1); g.DrawLine(Line, p1, p2); @@ -193,9 +194,9 @@ namespace MeshExplorer.Topology p1 = points[tri.P1]; p2 = points[tri.P2]; - p0 = zoom.WorldToScreen(p0.X, p0.Y); - p1 = zoom.WorldToScreen(p1.X, p1.Y); - p2 = zoom.WorldToScreen(p2.X, p2.Y); + zoom.WorldToScreen(ref p0); + zoom.WorldToScreen(ref p1); + zoom.WorldToScreen(ref p2); center = GetIncenter(p0, p1, p2); center.X -= 5; @@ -217,8 +218,8 @@ namespace MeshExplorer.Topology p0 = points[edge.P0]; p1 = points[edge.P1]; - p0 = zoom.WorldToScreen(p0.X, p0.Y); - p1 = zoom.WorldToScreen(p1.X, p1.Y); + zoom.WorldToScreen(ref p0); + zoom.WorldToScreen(ref p1); g.DrawLine(Line, p0, p1); } @@ -235,8 +236,8 @@ namespace MeshExplorer.Topology p0 = points[seg.P0]; p1 = points[seg.P1]; - p0 = zoom.WorldToScreen(p0.X, p0.Y); - p1 = zoom.WorldToScreen(p1.X, p1.Y); + zoom.WorldToScreen(ref p0); + zoom.WorldToScreen(ref p1); g.DrawLine(Segment, p0, p1); } @@ -251,8 +252,8 @@ namespace MeshExplorer.Topology p0 = points[selection.Org().ID]; p1 = points[selection.Dest().ID]; - p0 = zoom.WorldToScreen(p0.X, p0.Y); - p1 = zoom.WorldToScreen(p1.X, p1.Y); + zoom.WorldToScreen(ref p0); + zoom.WorldToScreen(ref p1); g.DrawLine(SelectedEdge, p0, p1); } @@ -270,9 +271,9 @@ namespace MeshExplorer.Topology p[1] = points[tri.P1]; p[2] = points[tri.P2]; - p[0] = zoom.WorldToScreen(p[0].X, p[0].Y); - p[1] = zoom.WorldToScreen(p[1].X, p[1].Y); - p[2] = zoom.WorldToScreen(p[2].X, p[2].Y); + zoom.WorldToScreen(ref p[0]); + zoom.WorldToScreen(ref p[1]); + zoom.WorldToScreen(ref p[2]); g.FillPolygon(SelectedTriangle, p); } diff --git a/Triangle.NET/TestApp/Views/AboutView.cs b/Triangle.NET/TestApp/Views/AboutView.cs index b3b23b2..defddf2 100644 --- a/Triangle.NET/TestApp/Views/AboutView.cs +++ b/Triangle.NET/TestApp/Views/AboutView.cs @@ -1,13 +1,7 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; +using System.Diagnostics; using System.Windows.Forms; using TriangleNet; -using System.Diagnostics; using TriangleNet.Geometry; namespace MeshExplorer.Views diff --git a/Triangle.NET/TestApp/Views/MeshControlView.cs b/Triangle.NET/TestApp/Views/MeshControlView.cs index c478d5d..c6107fe 100644 --- a/Triangle.NET/TestApp/Views/MeshControlView.cs +++ b/Triangle.NET/TestApp/Views/MeshControlView.cs @@ -1,10 +1,4 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; using System.Windows.Forms; using TriangleNet; using TriangleNet.Geometry; diff --git a/Triangle.NET/TestApp/Views/StatisticView.cs b/Triangle.NET/TestApp/Views/StatisticView.cs index d462ced..a938867 100644 --- a/Triangle.NET/TestApp/Views/StatisticView.cs +++ b/Triangle.NET/TestApp/Views/StatisticView.cs @@ -1,14 +1,8 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; +using System.Linq; using System.Windows.Forms; using TriangleNet; -using TriangleNet.Tools; using TriangleNet.Geometry; +using TriangleNet.Tools; namespace MeshExplorer.Views {