public static void RenderRoundedRectangle(DoubleRect rect, Color color, float thickness, bool gamecoords = true)
 {
     using (new GLEnableCap(EnableCap.Blend))
     {
         using (new GLEnableCap(EnableCap.Texture2D))
         {
             if (gamecoords)
             {
                 GameDrawingMatrix.Enter();
             }
             var vao = GetLineVAO();
             vao.Scale = GameDrawingMatrix.Scale;
             var vec1 = rect.Vector;
             var vec2 = vec1 + new Vector2d(rect.Width, 0);
             var vec3 = vec1 + rect.Size;
             var vec4 = vec1 + new Vector2d(0, rect.Height);
             vao.AddLine(vec1, vec2, color, thickness);
             vao.AddLine(vec2, vec3, color, thickness);
             vao.AddLine(vec3, vec4, color, thickness);
             vao.AddLine(vec4, vec1, color, thickness);
             vao.knobstate = 0;
             vao.Draw(PrimitiveType.Triangles);
             if (gamecoords)
             {
                 GameDrawingMatrix.Exit();
             }
         }
     }
 }
Exemple #2
0
        private void DrawTexture(
            Tex tex,
            DoubleRect rect,
            FloatRect uv,
            Vector2d origin,
            Vector2d rotationAnchor,
            float opacity,
            bool pretty = false
            )
        {
            var angle     = Angle.FromLine(origin, rotationAnchor);
            var t         = Utility.RotateRect(rect, Vector2d.Zero, angle);
            var transform = new Vector2d[] {
                (t[0] + origin), // 0 tl
                (t[1] + origin), // 1 tr
                (t[2] + origin), // 2 br
                (t[3] + origin), // 3 bl
            };
            var texrect = GameDrawingMatrix.ScreenCoords(transform);
            var color   = Color.FromArgb((int)(255f * opacity), Color.White);

            Color[] colors = new Color[] { color, color, color, color };
            if (pretty)
            {
                var random = new Random((Environment.TickCount / 100) % 255);
                for (int i = 0; i < colors.Length; i++)
                {
                    bool redness  = random.Next() % 2 == 0;
                    bool blueness = random.Next() % 2 == 0;
                    var  random1  = Math.Max(200, random.Next() % 255);
                    int  red      = Math.Min(255, redness ? (random1 * 2) : (random1 / 2));
                    int  green    = Math.Min(255, (blueness && redness) ? (random1) : (random1 / 2));
                    int  blue     = Math.Min(255, blueness ? (random1 * 2) : (random1 / 2));

                    colors[i] = Color.FromArgb((int)(255f * opacity), red, green, blue);
                }
            }
            var u1    = uv.Left;
            var v1    = uv.Top;
            var u2    = uv.Right;
            var v2    = uv.Bottom;
            var verts = new RiderVertex[] {
                new RiderVertex(texrect[0], new Vector2(uv.Left, uv.Top), tex, colors[0]),
                new RiderVertex(texrect[1], new Vector2(uv.Right, uv.Top), tex, colors[1]),
                new RiderVertex(texrect[2], new Vector2(uv.Right, uv.Bottom), tex, colors[2]),
                new RiderVertex(texrect[3], new Vector2(uv.Left, uv.Bottom), tex, colors[3])
            };

            Array.Add(verts[0]);
            Array.Add(verts[1]);
            Array.Add(verts[2]);

            Array.Add(verts[3]);
            Array.Add(verts[2]);
            Array.Add(verts[0]);
        }
Exemple #3
0
        public void Render(DrawOptions options, bool recording = false)
        {
            using (new GLEnableCap(EnableCap.Texture2D))
            {
                UpdateBuffers();
                GL.BlendFunc(
                    BlendingFactorSrc.SrcAlpha,
                    BlendingFactorDest.OneMinusSrcAlpha);
                GameDrawingMatrix.Enter();
                _physvbo.Scale     = options.Zoom;
                _physvbo.KnobState = options.KnobState;

                _sceneryvbo.Scale = options.Zoom;
                //green lines dont get lifelock
                if (options.KnobState != KnobState.Hidden)
                {
                    _sceneryvbo.KnobState = KnobState.Shown;
                }
                else
                {
                    _sceneryvbo.KnobState = KnobState.Hidden;
                }

                if ((Settings.PreviewMode || recording) && !(recording && !Settings.Recording.EnableColorTriggers))
                {
                    _sceneryvbo.OverrideColor = game.Track.Timeline.GetFrameLineColor(game.Track.Offset);
                    _physvbo.OverrideColor    = game.Track.Timeline.GetFrameLineColor(game.Track.Offset);
                }
                else
                {
                    _sceneryvbo.OverrideColor = (Settings.NightMode ? Constants.DefaultNightLineColor : Constants.DefaultLineColor);
                    _physvbo.OverrideColor    = (Settings.NightMode ? Constants.DefaultNightLineColor : Constants.DefaultLineColor);
                }

                if (options.LineColors)
                {
                    _sceneryvbo.OverrideColor    = Constants.SceneryLineColor;
                    _sceneryvbo.OverridePriority = 1;
                    _physvbo.OverridePriority    = 1;
                }
                else
                {
                    _sceneryvbo.OverridePriority = 255;//force override
                    _physvbo.OverridePriority    = 255;
                }
                _physvbo.Overlay    = options.Overlay;
                _sceneryvbo.Overlay = options.Overlay;
                _sceneryvbo.Draw();
                _decorator.DrawUnder(options);
                _physvbo.Draw();
                GameDrawingMatrix.Exit();
            }
        }
Exemple #4
0
        public void Render(DrawOptions options)
        {
            using (new GLEnableCap(EnableCap.Texture2D))
            {
                UpdateBuffers();
                GL.BlendFunc(
                    BlendingFactorSrc.SrcAlpha,
                    BlendingFactorDest.OneMinusSrcAlpha);
                GameDrawingMatrix.Enter();
                _physvbo.Scale     = options.Zoom;
                _physvbo.KnobState = options.KnobState;

                _sceneryvbo.Scale = options.Zoom;
                //green lines dont get lifelock
                if (options.KnobState != KnobState.Hidden)
                {
                    _sceneryvbo.KnobState = KnobState.Shown;
                }
                else
                {
                    _sceneryvbo.KnobState = KnobState.Hidden;
                }

                if (options.NightMode)
                {
                    _sceneryvbo.OverrideColor = Constants.DefaultNightLineColor;
                    _physvbo.OverrideColor    = Constants.DefaultNightLineColor;
                }
                else
                {
                    _sceneryvbo.OverrideColor = Constants.DefaultLineColor;
                    _physvbo.OverrideColor    = Constants.DefaultLineColor;
                }
                if (options.LineColors)
                {
                    _sceneryvbo.OverrideColor    = Constants.SceneryLineColor;
                    _sceneryvbo.OverridePriority = 1;
                    _physvbo.OverridePriority    = 1;
                }
                else
                {
                    _sceneryvbo.OverridePriority = 255;//force override
                    _physvbo.OverridePriority    = 255;
                }
                _physvbo.Overlay    = options.Overlay;
                _sceneryvbo.Overlay = options.Overlay;
                _sceneryvbo.Draw();
                _decorator.DrawUnder(options);
                _physvbo.Draw();
                GameDrawingMatrix.Exit();
            }
        }
 private static void RenderPointOutline(List <Vector2d> points, Color color)
 {
     GameDrawingMatrix.Enter();
     GL.Begin(PrimitiveType.LineStrip);
     for (int i = 0; i < points.Count; i++)
     {
         Color col = (i < 1 || i == points.Count - 1) ? color : Color.FromArgb(255, 200, 0);
         GL.Color3(col);
         GL.Vertex2(points[i]);
     }
     GL.End();
     GameDrawingMatrix.Exit();
 }
        private static void DrawCircle(Vector2d point, float size, Color color)
        {
            GameDrawingMatrix.Enter();
            var center = (Vector2)point;
            var circ   = StaticRenderer.GenerateCircle(center.X, center.Y, size, 360);

            GL.Begin(PrimitiveType.LineStrip);
            GL.Color3(color);
            for (int i = 0; i < circ.Length; i++)
            {
                GL.Vertex2((Vector2)circ[i]);
            }
            GL.End();
            GameDrawingMatrix.Exit();
        }
 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))
         {
             GameDrawingMatrix.Enter();
             var vao = GetLineVAO();
             vao.Scale = GameDrawingMatrix.Scale;
             vao.AddLine(position, position2, color, thickness);
             vao.knobstate = knobs ? (redknobs ? 2 : 1) : 0;
             vao.Draw(PrimitiveType.Triangles);
             GameDrawingMatrix.Exit();
         }
     }
 }
 public static void DrawBezierCurve(Vector2[] points, Color color, int resolution)
 {
     Vector2[] curvePoints = GenerateBezierCurve(points, resolution);
     if (points.Length > 0)
     {
         GameDrawingMatrix.Enter();
         GL.Begin(PrimitiveType.LineStrip);
         GL.Color3(color);
         for (int i = 0; i < curvePoints.Length; i++)
         {
             GL.Vertex2(curvePoints[i]);
         }
         GL.End();
         GameDrawingMatrix.Exit();
     }
 }
        public static void DrawTrackLine(StandardLine line, Color color, bool drawwell, bool drawcolor)
        {
            var lv    = new AutoArray <LineVertex>(24);
            var verts = new AutoArray <GenericVertex>(30);

            if (drawcolor)
            {
                if (line is RedLine redline)
                {
                    verts.AddRange(LineAccelRenderer.GetAccelDecor(redline));
                }
                lv.AddRange(LineColorRenderer.CreateDecorationLine(line, line.Color));
            }
            lv.AddRange(
                LineRenderer.CreateTrackLine(
                    line.Start,
                    line.End,
                    line.Width * 2,
                    Utility.ColorToRGBA_LE(color)));
            if (drawwell)
            {
                verts.AddRange(WellRenderer.GetWell(line));
            }
            var vao = GetLineVAO();

            vao.Scale = Game.Track.Zoom;
            foreach (var v in lv.unsafe_array)
            {
                vao.AddVertex(v);
            }
            GameDrawingMatrix.Enter();
            using (new GLEnableCap(EnableCap.Blend))
            {
                if (verts.Count != 0)
                {
                    GenericVAO gvao = new GenericVAO();
                    foreach (var v in verts.unsafe_array)
                    {
                        gvao.AddVertex(v);
                    }
                    gvao.Draw(PrimitiveType.Triangles);
                }
                vao.Draw(PrimitiveType.Triangles);
            }
            GameDrawingMatrix.Exit();
        }
        private Vector2[] DrawLine(Vector2d p1, Vector2d p2, int color, float size)
        {
            var calc = Utility.GetThickLine(p1, p2, Angle.FromLine(p1, p2), size);
            var t = GameDrawingMatrix.ScreenCoords(calc);
            var verts = new RiderVertex[] {
                RiderVertex.NoTexture(t[0],color),
                RiderVertex.NoTexture(t[1],color),
                RiderVertex.NoTexture(t[2],color),
                RiderVertex.NoTexture(t[3],color)
            };
            Array.Add(verts[0]);
            Array.Add(verts[1]);
            Array.Add(verts[2]);

            Array.Add(verts[3]);
            Array.Add(verts[2]);
            Array.Add(verts[0]);
            return t;
        }
 public void DrawMomentum(Rider rider, float opacity)
 {
     var color = Constants.MomentumVectorColor;
     color = ChangeOpacity(color, opacity);
     for (int i = 0; i < rider.Body.Length; i++)
     {
         var anchor = rider.Body[i];
         var vec1 = anchor.Location;
         var vec2 = vec1 + (anchor.Momentum);
         var line = Line.FromAngle(
             vec1,
             Angle.FromVector(anchor.Momentum),
             2);
         _momentumvao.AddLine(
             GameDrawingMatrix.ScreenCoordD(line.Position),
             GameDrawingMatrix.ScreenCoordD(line.Position2),
             color,
             GameDrawingMatrix.Scale / 2.5f);
     }
 }
        private static void renderPointTrace(List <Vector2d> points, BezierCurve curve, Color color)
        {
            double        lineLength      = 0;
            List <double> lengthsPerPoint = new List <double> {
                0
            };

            for (int i = 1; i < points.Count; i++)
            {
                lineLength += Distance(points[i - 1], points[i]);
                lengthsPerPoint.Add(lineLength);
            }
            for (int i = 1; i < points.Count - 1; i++)
            {
                Vector2 curvePoint = curve.CalculatePoint((float)lengthsPerPoint[i] / (float)lineLength);
                GameDrawingMatrix.Enter();
                GL.Begin(PrimitiveType.LineStrip);
                GL.Color3(color);
                GL.Vertex2(points[i]);
                GL.Vertex2(curvePoint);
                GL.End();
                GameDrawingMatrix.Exit();
            }
        }
Exemple #13
0
        public void DrawContacts(Rider rider, List <int> diagnosis, float opacity)
        {
            if (diagnosis == null)
            {
                diagnosis = new List <int>();
            }
            var bones = RiderConstants.Bones;

            for (var i = 0; i < bones.Length; i++)
            {
                var constraintcolor = bones[i].OnlyRepel
                ? Constants.ConstraintRepelColor
                : Constants.ConstraintColor;

                constraintcolor = ChangeOpacity(constraintcolor, opacity);

                if (bones[i].Breakable)
                {
                    continue;
                }
                else if (bones[i].OnlyRepel)
                {
                    _lines.AddLine(
                        GameDrawingMatrix.ScreenCoordD(rider.Body[bones[i].joint1].Location),
                        GameDrawingMatrix.ScreenCoordD(rider.Body[bones[i].joint2].Location),
                        constraintcolor,
                        GameDrawingMatrix.Scale / 4);
                }
                else if (i <= 3)
                {
                    _lines.AddLine(
                        GameDrawingMatrix.ScreenCoordD(rider.Body[bones[i].joint1].Location),
                        GameDrawingMatrix.ScreenCoordD(rider.Body[bones[i].joint2].Location),
                        constraintcolor,
                        GameDrawingMatrix.Scale / 4);
                }
            }
            if (!rider.Crashed && diagnosis.Count != 0)
            {
                Color firstbreakcolor = Constants.ConstraintFirstBreakColor;
                Color breakcolor      = Constants.ConstraintBreakColor;
                breakcolor      = ChangeOpacity(breakcolor, opacity / 2);
                firstbreakcolor = ChangeOpacity(firstbreakcolor, opacity);
                for (int i = 1; i < diagnosis.Count; i++)
                {
                    var broken = diagnosis[i];
                    if (broken >= 0)
                    {
                        _lines.AddLine(
                            GameDrawingMatrix.ScreenCoordD(rider.Body[bones[broken].joint1].Location),
                            GameDrawingMatrix.ScreenCoordD(rider.Body[bones[broken].joint2].Location),
                            breakcolor,
                            GameDrawingMatrix.Scale / 4);
                    }
                }
                //the first break is most important so we give it a better color, assuming its not just a fakie death
                if (diagnosis[0] > 0)
                {
                    _lines.AddLine(
                        GameDrawingMatrix.ScreenCoordD(rider.Body[bones[diagnosis[0]].joint1].Location),
                        GameDrawingMatrix.ScreenCoordD(rider.Body[bones[diagnosis[0]].joint2].Location),
                        firstbreakcolor,
                        GameDrawingMatrix.Scale / 4);
                }
            }
            for (var i = 0; i < rider.Body.Length; i++)
            {
                Color c = Constants.ContactPointColor;
                if (
                    ((i == RiderConstants.SledTL || i == RiderConstants.SledBL) && diagnosis.Contains(-1)) ||
                    ((i == RiderConstants.BodyButt || i == RiderConstants.BodyShoulder) && diagnosis.Contains(-2)))
                {
                    c = Constants.ContactPointFakieColor;
                }
                c = ChangeOpacity(c, opacity);
                _lines.AddLine(
                    GameDrawingMatrix.ScreenCoordD(rider.Body[i].Location),
                    GameDrawingMatrix.ScreenCoordD(rider.Body[i].Location),
                    c,
                    GameDrawingMatrix.Scale / 4);
            }
        }