public void RenderLine(IRenderContext context, Vector2 start, Vector2 end, Color color, float width = 1f) { var angle = (float)Math.Atan2(end.Y - start.Y, end.X - start.X); var length = Vector2.Distance(start, end); context.SpriteBatch.Draw( context.SingleWhitePixel, new Vector2(start.X + 1, start.Y), null, color, angle, Vector2.Zero, new Vector2(length, width), SpriteEffects.None, _interlacedBatchingDepthProvider.GetDepthForCurrentInstance()); }
private void RenderRoundedRectangle(IRenderContext renderContext, Rectangle rectangle, float pixelCorners, ColorFetchCallback getColor, bool isBorder, bool isTab) { float topLeftPixelCorners = pixelCorners; float topRightPixelCorners = pixelCorners; float bottomLeftPixelCorners = pixelCorners; float bottomRightPixelCorners = pixelCorners; if (isTab) { bottomLeftPixelCorners = 0; bottomRightPixelCorners = 0; } if (_surfaceEffect.IsReady) { var depth = _interlacedBatchingDepthProvider.GetDepthForCurrentInstance(); var points = new List <VertexPositionColor>(); points.Add(new VertexPositionColor(new Vector3(rectangle.X + topLeftPixelCorners, rectangle.Y, depth), getColor(topLeftPixelCorners, 0, rectangle.Width, rectangle.Height))); points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width - topRightPixelCorners, rectangle.Y, depth), getColor(rectangle.Width - topRightPixelCorners, 0, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } for (var a = 0f; a < MathHelper.PiOver2; a += MathHelper.PiOver2 / 10f) { var i = a + MathHelper.PiOver2 * 1; points.Add(new VertexPositionColor( new Vector3(rectangle.X + rectangle.Width - topRightPixelCorners - (float)Math.Cos(i) * topRightPixelCorners, rectangle.Y + topRightPixelCorners - (float)Math.Sin(i) * topRightPixelCorners, depth), getColor(rectangle.Width - topRightPixelCorners - (float)Math.Cos(i) * topRightPixelCorners, topRightPixelCorners - (float)Math.Sin(i) * topRightPixelCorners, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } } points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width, rectangle.Y + topRightPixelCorners, depth), getColor(rectangle.Width, topRightPixelCorners, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width, rectangle.Y + rectangle.Height - bottomRightPixelCorners, depth), getColor(rectangle.Width, rectangle.Height - bottomRightPixelCorners, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } for (var a = 0f; a < MathHelper.PiOver2; a += MathHelper.PiOver2 / 10f) { var i = a + MathHelper.PiOver2 * 2; points.Add(new VertexPositionColor( new Vector3(rectangle.X + rectangle.Width - bottomRightPixelCorners - (float)Math.Cos(i) * bottomRightPixelCorners, rectangle.Y + rectangle.Height - bottomRightPixelCorners - (float)Math.Sin(i) * bottomRightPixelCorners, depth), getColor(rectangle.Width - bottomRightPixelCorners - (float)Math.Cos(i) * bottomRightPixelCorners, rectangle.Height - bottomRightPixelCorners - (float)Math.Sin(i) * bottomRightPixelCorners, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } } points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width - bottomRightPixelCorners, rectangle.Y + rectangle.Height, depth), getColor(rectangle.Width - bottomRightPixelCorners, rectangle.Height, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } points.Add(new VertexPositionColor(new Vector3(rectangle.X + bottomLeftPixelCorners, rectangle.Y + rectangle.Height, depth), getColor(bottomLeftPixelCorners, rectangle.Height, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } for (var a = 0f; a < MathHelper.PiOver2; a += MathHelper.PiOver2 / 10f) { var i = a + MathHelper.PiOver2 * 3; points.Add(new VertexPositionColor( new Vector3(rectangle.X + bottomLeftPixelCorners - (float)Math.Cos(i) * bottomLeftPixelCorners, rectangle.Y + rectangle.Height - bottomLeftPixelCorners - (float)Math.Sin(i) * bottomLeftPixelCorners, depth), getColor(bottomLeftPixelCorners - (float)Math.Cos(i) * bottomLeftPixelCorners, rectangle.Height - bottomLeftPixelCorners - (float)Math.Sin(i) * bottomLeftPixelCorners, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } } points.Add(new VertexPositionColor(new Vector3(rectangle.X, rectangle.Y + rectangle.Height - bottomLeftPixelCorners, depth), getColor(0, rectangle.Height - bottomLeftPixelCorners, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } points.Add(new VertexPositionColor(new Vector3(rectangle.X, rectangle.Y + topLeftPixelCorners, depth), getColor(0, topLeftPixelCorners, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } for (var a = 0f; a < MathHelper.PiOver2; a += MathHelper.PiOver2 / 10f) { var i = a + MathHelper.PiOver2 * 0; points.Add(new VertexPositionColor( new Vector3(rectangle.X + topLeftPixelCorners - (float)Math.Cos(i) * topLeftPixelCorners, rectangle.Y + topLeftPixelCorners - (float)Math.Sin(i) * topLeftPixelCorners, depth), getColor(topLeftPixelCorners - (float)Math.Cos(i) * topLeftPixelCorners, topLeftPixelCorners - (float)Math.Sin(i) * topLeftPixelCorners, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } } points.Add(new VertexPositionColor(new Vector3(rectangle.X + topLeftPixelCorners, rectangle.Y, depth), getColor(topLeftPixelCorners, 0, rectangle.Width, rectangle.Height))); if (!isBorder) { points.Add(new VertexPositionColor(new Vector3(rectangle.X + rectangle.Width / 2f, rectangle.Y + rectangle.Height / 2f, depth), getColor(rectangle.Width / 2f, rectangle.Height / 2f, rectangle.Width, rectangle.Height))); } var pointsArray = points.ToArray(); renderContext.SpriteBatch.End(); var effect = _surfaceEffect.Asset.Effects["ColorNoNormals"]; var effectParameterSet = effect.CreateParameterSet(); effect.LoadParameterSet(renderContext, effectParameterSet); foreach (var pass in effect.NativeEffect.CurrentTechnique.Passes) { pass.Apply(); if (isBorder) { renderContext.GraphicsDevice.DrawUserPrimitives( PrimitiveType.LineStrip, pointsArray, 0, points.Count - 1); } else { renderContext.GraphicsDevice.DrawUserPrimitives( PrimitiveType.TriangleStrip, pointsArray, 0, points.Count - 2); } } var renderPass = renderContext.GetCurrentRenderPass <ICanvasRenderPass>(); renderContext.SpriteBatch.Begin(renderPass.TextureSortMode); } }