public static void RenderRoundedLine(Vector2d position, Vector2d position2, Color color, float thickness, bool knobs = false, bool redknobs = false) { using (new GLEnableCap(EnableCap.Blend)) { using (new GLEnableCap(EnableCap.Texture2D)) { var vertices = GenRoundedLine(position, position2, color, thickness, knobs, redknobs); if (vertices.Count != 0) { _roundlinevao.Texture = StaticRenderer.CircleTex; _roundlinevao.Clear(); foreach (var v in vertices) { _roundlinevao.AddVertex(v); } _roundlinevao.SetOpacity(color.A / 255f); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); _roundlinevao.Draw(PrimitiveType.Triangles); _roundlinevao.Texture = 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(); } }
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); } }