using System.Collections.Generic; using System.Diagnostics; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; public class Line { private List points; private float thickness = 1.0f; public enum JoinType { None, Miter, Bevel, Round } public enum LineCaps { None, Round } private Color LineColor { get; set; } //Graphical representation private VertexBuffer vbo; private IndexBuffer ibo; private GraphicsDevice gDevice; public Line(List points) { this.points = points; this.LineColor = Color.Black; } public Line(List points, float thickness) { this.points = points; this.thickness = thickness; this.LineColor = Color.Black; } public Line(List points, float thickness, Color color) { this.points = points; this.thickness = thickness; this.LineColor = color; } public void InitOnGraphicalDevice(GraphicsDevice device) { this.gDevice = device; Debug.Assert(this.points.Count >= 2); List vertices = new List(); List indices = new List(); for(int i = 0; i < this.points.Count - 1 ; i++) { var p = this.points[i]; var pNext = this.points[i+1]; Vector2 dir = pNext - p; Vector2 perpendincularVector = new Vector2(dir.Y, -dir.X); perpendincularVector.Normalize(); var offsetPoint1 = new Vector3(p.X, p.Y ,0.0f); var offsetPoint2 = new Vector3(p.X, p.Y ,0.0f); vertices.Add(new VertexPositionColorTexture(offsetPoint1,this.LineColor, perpendincularVector)); vertices.Add(new VertexPositionColorTexture(offsetPoint2,this.LineColor, perpendincularVector * -1)); var offsetPoint1Next = new Vector3(pNext.X, pNext.Y ,0.0f); var offsetPoint2Next = new Vector3(pNext.X, pNext.Y ,0.0f); vertices.Add(new VertexPositionColorTexture(offsetPoint1Next,this.LineColor, perpendincularVector)); vertices.Add(new VertexPositionColorTexture(offsetPoint2Next,this.LineColor, perpendincularVector * -1)); } for (int i = 0; i < vertices.Count; i+=4) { indices.Add((ushort)(i)); indices.Add((ushort)(i + 1)); indices.Add((ushort)(i + 2)); indices.Add((ushort)(i + 2)); indices.Add((ushort)(i + 1)); indices.Add((ushort)(i + 3)); } this.vbo = new VertexBuffer(device, typeof(VertexPositionColorTexture), (this.points.Count - 1) * 4, BufferUsage.WriteOnly); this.vbo.SetData(vertices.ToArray()); this.ibo = new IndexBuffer(device, typeof(ushort), indices.Count,BufferUsage.WriteOnly); this.ibo.SetData(indices.ToArray()); } public void Draw(Effect lineEffect) { this.gDevice.SetVertexBuffer(this.vbo); this.gDevice.Indices = this.ibo; RasterizerState rasterizerState = new RasterizerState(); rasterizerState.CullMode = CullMode.None; this.gDevice.RasterizerState = rasterizerState; lineEffect.Parameters["thickness"].SetValue(this.thickness); foreach (EffectPass pass in lineEffect.CurrentTechnique.Passes) { pass.Apply(); this.gDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList,0,0,this.ibo.IndexCount / 3); //this.gDevice.DrawPrimitives(PrimitiveType.LineList, 0, this.vbo.VertexCount); } } }