Beispiel #1
0
        public static void DrawScarf(DynamicLine[] lines, float opacity)
        {
            GLEnableCap blend = null;

            if (opacity < 1)
            {
                blend = new GLEnableCap(EnableCap.Blend);
                GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
            }

            GameDrawingMatrix.Enter();
            VAO  scarf = new VAO(false, true);//VAO does not need disposing, it does not allocate a buffer
            bool t     = false;

            for (int i = 0; i < lines.Length; i++)
            {
                Color    c      = Color.FromArgb((byte)(255 * opacity), 209, 1, 1);
                var      alt    = Color.FromArgb((byte)(255 * opacity), 255, 100, 100);
                var      diff   = lines[i].Position2 - lines[i].Position;
                var      dangle = MathHelper.RadiansToDegrees(Math.Atan2(diff.Y, diff.X)) + 90;
                Vector2d q1;
                Vector2d q2;
                Vector2d q3;
                Vector2d q4;
                float    size = 2;
                if (i == 0)
                {
                    var    diff2   = lines[i + 1].Position2 - lines[i + 1].Position;
                    var    dangle2 = MathHelper.RadiansToDegrees(Math.Atan2(diff2.Y, diff2.X)) + 90;
                    Turtle turtle  = new Turtle(lines[i].Position);
                    turtle.Move(dangle2, -(size / 2));
                    q1 = turtle.Point;
                    turtle.Move(0, size);
                    q2           = turtle.Point;
                    turtle.Point = lines[i].Position2;
                    turtle.Move(dangle, size / 2);
                    q3 = turtle.Point;
                    turtle.Move(0, -size);
                    q4 = turtle.Point;
                }
                else
                {
                    var    diff2   = lines[i - 1].Position2 - lines[i - 1].Position;
                    var    dangle2 = MathHelper.RadiansToDegrees(Math.Atan2(diff2.Y, diff2.X)) + 90;
                    Turtle turtle  = new Turtle(lines[i].Position);
                    turtle.Move(dangle2, -(size / 2));
                    q1 = turtle.Point;
                    turtle.Move(0, size);
                    q2           = turtle.Point;
                    turtle.Point = lines[i].Position2;
                    turtle.Move(dangle, size / 2);
                    q3 = turtle.Point;
                    turtle.Move(0, -size);
                    q4 = turtle.Point;
                }
                scarf.AddVertex(new Vertex((Vector2)q1, t ? c : alt));
                scarf.AddVertex(new Vertex((Vector2)q2, t ? c : alt));
                scarf.AddVertex(new Vertex((Vector2)q3, t ? c : alt));
                scarf.AddVertex(new Vertex((Vector2)q4, t ? c : alt));
                t = !t;
            }
            scarf.Draw(PrimitiveType.Quads);
            GameDrawingMatrix.Exit();

            if (blend != null)
            {
                blend.Dispose();
            }
        }
Beispiel #2
0
        public static void DrawRider(float opacity, Rider rider, bool scarf = false, bool drawcontactpoints = false, bool momentumvectors = false)
        {
            if (scarf)
            {
                DrawScarf(rider.ScarfLines, opacity);
            }
            var points = rider.ModelAnchors;

            DrawGraphic(Models.Leg, points[4].Position, points[9].Position, opacity);

            DrawGraphic(Models.Arm, points[5].Position, points[7].Position, opacity);
            if (!rider.Crashed)
            {
                RenderRoundedLine(points[7].Position, points[3].Position, Color.Black, 0.1f);
            }

            if (rider.SledBroken)
            {
                DrawGraphic(Models.BrokenSled, points[0].Position, points[3].Position, opacity);
            }
            else
            {
                DrawGraphic(Models.Sled, points[0].Position, points[3].Position, opacity);
            }

            DrawGraphic(Models.Leg, points[4].Position, points[8].Position, opacity);
            if (!rider.Crashed)
            {
                DrawGraphic(Models.Bosh, points[4].Position, points[5].Position, opacity);
            }
            else
            {
                DrawGraphic(Models.BoshDead, points[4].Position, points[5].Position, opacity);
            }
            if (!rider.Crashed)
            {
                RenderRoundedLine(points[6].Position, points[3].Position, Color.Black, 0.1f);
            }

            DrawGraphic(Models.Arm, points[5].Position, points[6].Position, opacity);
            List <Vertex> vertices = new List <Vertex>(300);

            if (momentumvectors)
            {
                foreach (var anchor in rider.ModelAnchors)
                {
                    var vec1 = anchor.Position;
                    var vec2 = vec1 + (anchor.Momentum);
                    vertices.AddRange(GenRoundedLine(vec1, vec2, Color.Red, 1f / 2, false));
                }
            }
            if (drawcontactpoints)
            {
                var brokenpoints = Game.Track.Diagnose(rider);
                for (var i = 0; i < rider.ModelLines.Length; i++)
                {
                    var c = Color.FromArgb(255, Color.FromArgb(0xCC72B7));
                    if (rider.ModelLines[i] is BindLine)
                    {
                        continue;
                    }
                    else if (rider.ModelLines[i] is RepelLine)
                    {
                        c = Color.CornflowerBlue;
                        vertices.AddRange(GenRoundedLine(rider.ModelLines[i].Position, rider.ModelLines[i].Position2, c, 1f / 4, false));
                    }
                    else if (i <= 3)
                    {
                        vertices.AddRange(GenRoundedLine(rider.ModelLines[i].Position, rider.ModelLines[i].Position2, c, 1f / 4, false));
                    }
                }
                for (var i = 0; i < rider.ModelLines.Length; i++)
                {
                    if (rider.ModelLines[i] is BindLine)
                    {
                        if (rider.Crashed)
                        {
                            continue;
                        }
                        if (brokenpoints.Contains(i))
                        {
                            vertices.AddRange(GenRoundedLine(rider.ModelLines[i].Position, rider.ModelLines[i].Position2, Color.DarkOrange, 1f / 4, false));
                        }
                    }
                }
                for (int i = 0; i < rider.ModelAnchors.Length; i++)
                {
                    Color c = Color.Cyan;
                    if (((i == 0 || i == 1) && brokenpoints.Contains(-1)) || ((i == 4 || i == 5) && brokenpoints.Contains(-2)))
                    {
                        c = Color.Blue;
                    }
                    vertices.AddRange(GenRoundedLine(rider.ModelAnchors[i].Position, rider.ModelAnchors[i].Position, c, 1f / 4, false));
                }
            }
            if (vertices.Count != 0)
            {
                VAO vao = new VAO(false, false);
                vao.Texture = StaticRenderer.CircleTex;
                vao.AddVerticies(vertices);
                GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
                vao.Draw(PrimitiveType.Triangles);
            }
        }