OpenRA.Graphics.RgbaColorRenderer.DrawConnectedLine C# (CSharp) Method

DrawConnectedLine() private method

private DrawConnectedLine ( float3 points, float width, Color color, bool closed ) : void
points float3
width float
color Color
closed bool
return void
        void DrawConnectedLine(float3[] points, float width, Color color, bool closed)
        {
            // Not a line
            if (points.Length < 2)
                return;

            // Single segment
            if (points.Length == 2)
            {
                DrawLine(points[0], points[1], width, color);
                return;
            }

            renderer.CurrentBatchRenderer = this;
            color = Util.PremultiplyAlpha(color);
            var r = color.R / 255.0f;
            var g = color.G / 255.0f;
            var b = color.B / 255.0f;
            var a = color.A / 255.0f;

            var start = points[0];
            var end = points[1];
            var dir = (end - start) / (end - start).XY.Length;
            var corner = width / 2 * new float3(-dir.Y, dir.X, dir.Z);

            // Corners for start of line segment
            var ca = start - corner;
            var cb = start + corner;

            // Segment is part of closed loop
            if (closed)
            {
                var prev = points[points.Length - 1];
                var prevDir = (start - prev) / (start - prev).XY.Length;
                var prevCorner = width / 2 * new float3(-prevDir.Y, prevDir.X, prevDir.Z);
                ca = IntersectionOf(start - prevCorner, prevDir, start - corner, dir);
                cb = IntersectionOf(start + prevCorner, prevDir, start + corner, dir);
            }

            var limit = closed ? points.Length : points.Length - 1;
            for (var i = 0; i < limit; i++)
            {
                var next = points[(i + 2) % points.Length];
                var nextDir = (next - end) / (next - end).XY.Length;
                var nextCorner = width / 2 * new float3(-nextDir.Y, nextDir.X, nextDir.Z);

                // Vertices for the corners joining start-end to end-next
                var cc = closed || i < limit ? IntersectionOf(end + corner, dir, end + nextCorner, nextDir) : end + corner;
                var cd = closed || i < limit ? IntersectionOf(end - corner, dir, end - nextCorner, nextDir) : end - corner;

                // Fill segment
                if (nv + 6 > renderer.TempBufferSize)
                    Flush();

                vertices[nv++] = new Vertex(ca + Offset, r, g, b, a, 0, 0);
                vertices[nv++] = new Vertex(cb + Offset, r, g, b, a, 0, 0);
                vertices[nv++] = new Vertex(cc + Offset, r, g, b, a, 0, 0);
                vertices[nv++] = new Vertex(cc + Offset, r, g, b, a, 0, 0);
                vertices[nv++] = new Vertex(cd + Offset, r, g, b, a, 0, 0);
                vertices[nv++] = new Vertex(ca + Offset, r, g, b, a, 0, 0);

                // Advance line segment
                end = next;
                dir = nextDir;
                corner = nextCorner;

                ca = cd;
                cb = cc;
            }
        }