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());
        }
Beispiel #2
0
        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);
            }
        }