From 80428bfa40b2b08fc9444ac10874684c9841c3fe Mon Sep 17 00:00:00 2001 From: wo80 Date: Tue, 1 Mar 2022 16:02:22 +0100 Subject: [PATCH] Triangle.Rendering simplify IRenderLayer and buffer handling. --- src/Triangle.Rendering/BoundingBox.cs | 68 -------------- src/Triangle.Rendering/Buffer/IndexBuffer.cs | 48 ++++++++++ src/Triangle.Rendering/Buffer/VertexBuffer.cs | 62 ++++++++++++ src/Triangle.Rendering/IRenderLayer.cs | 59 +----------- src/Triangle.Rendering/RenderContext.cs | 25 +++-- src/Triangle.Rendering/RenderLayer.cs | 56 +---------- src/Triangle.Rendering/Util/BufferHelper.cs | 94 ------------------- 7 files changed, 131 insertions(+), 281 deletions(-) delete mode 100644 src/Triangle.Rendering/BoundingBox.cs delete mode 100644 src/Triangle.Rendering/Util/BufferHelper.cs diff --git a/src/Triangle.Rendering/BoundingBox.cs b/src/Triangle.Rendering/BoundingBox.cs deleted file mode 100644 index 41a5d0b..0000000 --- a/src/Triangle.Rendering/BoundingBox.cs +++ /dev/null @@ -1,68 +0,0 @@ - -namespace TriangleNet.Rendering -{ - using System.Drawing; - - public class BoundingBox - { - public float Left; - public float Right; - public float Bottom; - public float Top; - - public float Width - { - get { return Right - Left; } - } - - public float Height - { - get { return Top - Bottom; } - } - - public BoundingBox() - { - Reset(); - } - - public BoundingBox(float left, float right, float bottom, float top) - { - Left = left; - Right = right; - Bottom = bottom; - Top = top; - } - - public void Update(Point pt) - { - Update(pt.X, pt.Y); - } - - public void Update(PointF pt) - { - Update(pt.X, pt.Y); - } - - public void Update(double x, double y) - { - Update((float)x, (float)y); - } - - public void Update(float x, float y) - { - // Update bounding box - if (Left > x) Left = x; - if (Right < x) Right = x; - if (Bottom > y) Bottom = y; - if (Top < y) Top = y; - } - - public void Reset() - { - Left = float.MaxValue; - Right = -float.MaxValue; - Bottom = float.MaxValue; - Top = -float.MaxValue; - } - } -} diff --git a/src/Triangle.Rendering/Buffer/IndexBuffer.cs b/src/Triangle.Rendering/Buffer/IndexBuffer.cs index 13a9975..108d8a7 100644 --- a/src/Triangle.Rendering/Buffer/IndexBuffer.cs +++ b/src/Triangle.Rendering/Buffer/IndexBuffer.cs @@ -1,8 +1,56 @@  namespace TriangleNet.Rendering.Buffer { + using System.Collections.Generic; + using System.Linq; + using TriangleNet.Geometry; + using TriangleNet.Topology; + public class IndexBuffer : BufferBase { + #region Static methods + + public static IBuffer Create(IEnumerable edges, int size) + { + var buffer = new IndexBuffer(size * edges.Count(), size); + + var data = buffer.Data; + + int i = 0; + + foreach (var e in edges) + { + data[size * i + 0] = e.P0; + data[size * i + 1] = e.P1; + + i++; + } + + return buffer; + } + + public static IBuffer Create(ICollection elements, int size) + { + var buffer = new IndexBuffer(size * elements.Count, size); + + var data = buffer.Data; + + int i = 0; + + foreach (var e in elements) + { + data[size * i + 0] = e.GetVertexID(0); + data[size * i + 1] = e.GetVertexID(1); + data[size * i + 2] = e.GetVertexID(2); + + i++; + } + + return buffer; + } + + #endregion + /// /// Initializes a new instance of the class. /// diff --git a/src/Triangle.Rendering/Buffer/VertexBuffer.cs b/src/Triangle.Rendering/Buffer/VertexBuffer.cs index 568a50a..3dcb1f7 100644 --- a/src/Triangle.Rendering/Buffer/VertexBuffer.cs +++ b/src/Triangle.Rendering/Buffer/VertexBuffer.cs @@ -1,8 +1,70 @@  namespace TriangleNet.Rendering.Buffer { + using System.Collections.Generic; + using TriangleNet.Geometry; + public class VertexBuffer : BufferBase { + #region Static methods + + /// + /// Create a vertex buffer from given point collection. + /// + /// The points to render. + /// The points bounding box. + /// + public static IBuffer Create(ICollection points, Rectangle bounds) + { + var buffer = new VertexBuffer(2 * points.Count); + + var data = buffer.Data; + + float x, y; + + int i = 0; + + foreach (var p in points) + { + x = (float)p.X; + y = (float)p.Y; + + data[2 * i] = x; + data[2 * i + 1] = y; + + i++; + } + + return buffer; + } + + /// + /// Create a vertex buffer from given vertex collection. + /// + /// The vertices to render. + /// The vertices bounding box. + /// + public static IBuffer Create(ICollection points, Rectangle bounds) + { + var buffer = new VertexBuffer(2 * points.Count); + + var data = buffer.Data; + + int i = 0; + + foreach (var p in points) + { + data[2 * i] = (float)p.X; + data[2 * i + 1] = (float)p.Y; + + i++; + } + + return buffer; + } + + #endregion + /// /// Initializes a new instance of the class. /// diff --git a/src/Triangle.Rendering/IRenderLayer.cs b/src/Triangle.Rendering/IRenderLayer.cs index b672356..b83e457 100644 --- a/src/Triangle.Rendering/IRenderLayer.cs +++ b/src/Triangle.Rendering/IRenderLayer.cs @@ -1,9 +1,6 @@  namespace TriangleNet.Rendering { - using System.Collections.Generic; - using TriangleNet.Geometry; - using TriangleNet.Meshing; using TriangleNet.Rendering.Buffer; using TriangleNet.Rendering.Util; @@ -46,61 +43,9 @@ namespace TriangleNet.Rendering /// If true, all buffers will be set to null. void Reset(bool clear); - // TODO: add boolean: reset + void SetPoints(IBuffer buffer, bool reset = true); - /// - /// Replaces the current points with the given buffer. - /// - /// The new points buffer. - void SetPoints(IBuffer buffer); - - /// - /// Copy the points of the given to the layers point buffer. - /// - /// The polygon to render. - void SetPoints(IPolygon poly); - - /// - /// Copy the points of the given to the layers point buffer. - /// - /// The mesh to render. - void SetPoints(IMesh mesh); - - /// - /// Copy the points of the given collection to the layers point buffer. - /// - /// The point set to render. - void SetPoints(ICollection points); - - /// - /// Copy the segment indices of the given polygon to the layers index buffer. - /// - /// The polygon to render. - void SetPolygon(IPolygon poly); - - /// - /// Copy the segment indices of the given mesh to the layers index buffer. - /// - /// The mesh to render. - void SetPolygon(IMesh mesh); - - /// - /// Copy the indices of the given mesh triangles to the layers index buffer. - /// - /// The mesh to render. - /// If true, all triangle indices are copied. Otherwise, - /// only edge indices are copied. - /// - /// Use elements = true for layers rendering filled triangles (3 indices per buffer item). - /// Use elements = false if only edges are rendered (wireframe, 2 indices per buffer item). - /// - void SetMesh(IMesh mesh, bool elements); - - /// - /// Copy the indices of the given edges to the layers index buffer. - /// - /// The edges to render. - void SetMesh(IEnumerable edges); + void SetIndices(IBuffer buffer); #region Attached data (mesh partitioning and heat map rendering) diff --git a/src/Triangle.Rendering/RenderContext.cs b/src/Triangle.Rendering/RenderContext.cs index 1433f7e..8e646c0 100644 --- a/src/Triangle.Rendering/RenderContext.cs +++ b/src/Triangle.Rendering/RenderContext.cs @@ -5,6 +5,7 @@ namespace TriangleNet.Rendering using System.Linq; using TriangleNet.Geometry; using TriangleNet.Meshing; + using TriangleNet.Rendering.Buffer; /// /// The RenderContext class brings all the rendering parts together. @@ -76,8 +77,9 @@ namespace TriangleNet.Rendering zoom.Initialize(bounds); - RenderLayers[2].SetPoints(data); - RenderLayers[2].SetPolygon(data); + RenderLayers[2].SetPoints(VertexBuffer.Create(data.Points, bounds)); + RenderLayers[2].SetIndices(IndexBuffer.Create(data.Segments, 2)); + RenderLayers[3].SetPoints(RenderLayers[2].Points); } @@ -96,22 +98,25 @@ namespace TriangleNet.Rendering mesh = data; bounds = data.Bounds; + // Ensure linear numbering of vertices. + mesh.Renumber(); + zoom.Initialize(bounds); - RenderLayers[1].SetPoints(data); - RenderLayers[1].SetMesh(data, false); + RenderLayers[1].SetPoints(VertexBuffer.Create(data.Vertices, bounds)); + RenderLayers[1].SetIndices(IndexBuffer.Create(data.Edges, 2)); RenderLayers[2].SetPoints(RenderLayers[1].Points); - RenderLayers[2].SetPolygon(data); + RenderLayers[2].SetIndices(IndexBuffer.Create(data.Segments, 2)); - RenderLayers[3].SetPoints(RenderLayers[1].Points); + RenderLayers[3].SetPoints(RenderLayers[1].Points, false); } /// public void Add(ICollection points, IEnumerable edges, bool reset) { - RenderLayers[4].SetPoints(points); - RenderLayers[4].SetMesh(edges); + RenderLayers[4].SetPoints(VertexBuffer.Create(points, bounds)); + RenderLayers[4].SetIndices(IndexBuffer.Create(edges, 2)); RenderLayers[4].IsEnabled = true; } @@ -120,7 +125,7 @@ namespace TriangleNet.Rendering { // Add function values for filled mesh. RenderLayers[0].SetPoints(RenderLayers[1].Points); - RenderLayers[0].SetMesh(this.mesh, true); + RenderLayers[0].SetIndices(IndexBuffer.Create(mesh.Triangles, 3)); RenderLayers[0].AttachLayerData(data, colorManager.ColorMap); RenderLayers[0].IsEnabled = true; @@ -131,7 +136,7 @@ namespace TriangleNet.Rendering { // Add partition data for filled mesh. RenderLayers[0].SetPoints(RenderLayers[1].Points); - RenderLayers[0].SetMesh(this.mesh, true); + RenderLayers[0].SetIndices(IndexBuffer.Create(mesh.Triangles, 3)); RenderLayers[0].AttachLayerData(data); RenderLayers[0].IsEnabled = true; diff --git a/src/Triangle.Rendering/RenderLayer.cs b/src/Triangle.Rendering/RenderLayer.cs index fa4e4aa..a590db6 100644 --- a/src/Triangle.Rendering/RenderLayer.cs +++ b/src/Triangle.Rendering/RenderLayer.cs @@ -63,9 +63,9 @@ namespace TriangleNet.Rendering } /// - public void SetPoints(IBuffer buffer) + public void SetPoints(IBuffer buffer, bool reset = true) { - if (points != null && points.Count < buffer.Count) + if (!reset && points != null && points.Count < buffer.Count) { // NOTE: we keep the old size to be able to render new Steiner // points in a different color than existing points. @@ -80,57 +80,9 @@ namespace TriangleNet.Rendering } /// - public void SetPoints(IPolygon poly) + public void SetIndices(IBuffer buffer) { - points = BufferHelper.CreateVertexBuffer(poly.Points); - count = points.Count / points.Size; - } - - /// - public void SetPoints(IMesh mesh) - { - points = BufferHelper.CreateVertexBuffer(mesh.Vertices); - count = points.Count / points.Size; - } - - /// - public void SetPoints(ICollection vertices) - { - points = BufferHelper.CreateVertexBuffer(vertices); - count = points.Count / points.Size; - } - - /// - public void SetPolygon(IPolygon poly) - { - indices = BufferHelper.CreateIndexBuffer(poly.Segments, 2); - } - - public void SetPolygon(IMesh mesh) - { - indices = BufferHelper.CreateIndexBuffer(mesh.Segments, 2); - } - - /// - public void SetMesh(IEnumerable edges) - { - indices = BufferHelper.CreateIndexBuffer(edges, 2); - } - - /// - public void SetMesh(IMesh mesh, bool elements) - { - mesh.Renumber(); - - if (!elements) - { - indices = BufferHelper.CreateIndexBuffer(mesh.Edges, 2); - } - - if (elements || indices.Count == 0) - { - indices = BufferHelper.CreateIndexBuffer(mesh.Triangles, 3); - } + indices = buffer; } /// diff --git a/src/Triangle.Rendering/Util/BufferHelper.cs b/src/Triangle.Rendering/Util/BufferHelper.cs deleted file mode 100644 index 486ee3a..0000000 --- a/src/Triangle.Rendering/Util/BufferHelper.cs +++ /dev/null @@ -1,94 +0,0 @@ - -namespace TriangleNet.Rendering.Util -{ - using System.Collections.Generic; - using TriangleNet.Topology; - using TriangleNet.Geometry; - using TriangleNet.Rendering.Buffer; - using System.Linq; - - internal static class BufferHelper - { - public static IBuffer CreateVertexBuffer(ICollection points) - { - var buffer = new VertexBuffer(2 * points.Count); - - var data = buffer.Data; - - float x, y; - - int i = 0; - - foreach (var p in points) - { - x = (float)p.X; - y = (float)p.Y; - - data[2 * i] = x; - data[2 * i + 1] = y; - - i++; - } - - return buffer; - } - - public static IBuffer CreateVertexBuffer(ICollection points) - { - var buffer = new VertexBuffer(2 * points.Count); - - var data = buffer.Data; - - int i = 0; - - foreach (var p in points) - { - data[2 * i] = (float)p.X; - data[2 * i + 1] = (float)p.Y; - - i++; - } - - return buffer; - } - - public static IBuffer CreateIndexBuffer(IEnumerable edges, int size) - { - var buffer = new IndexBuffer(size * edges.Count(), size); - - var data = buffer.Data; - - int i = 0; - - foreach (var e in edges) - { - data[size * i + 0] = e.P0; - data[size * i + 1] = e.P1; - - i++; - } - - return buffer; - } - - public static IBuffer CreateIndexBuffer(ICollection elements, int size) - { - var buffer = new IndexBuffer(size * elements.Count, size); - - var data = buffer.Data; - - int i = 0; - - foreach (var e in elements) - { - data[size * i + 0] = e.GetVertexID(0); - data[size * i + 1] = e.GetVertexID(1); - data[size * i + 2] = e.GetVertexID(2); - - i++; - } - - return buffer; - } - } -}