public void Render(float blend = 1) { bool shouldrender = _invalidated || Canvas.NeedsRedraw || (Track.PlaybackMode) || Loading || Track.NeedsDraw || SelectedTool.NeedsRender; _invalidated = false; if (shouldrender) { BeginOrtho(); var slider = Canvas.Scrubber; if (blend == 1 && Settings.SmoothPlayback && Track.Playing && !slider.Held) { blend = Math.Min(1, (float)Scheduler.ElapsedPercent); if (ReversePlayback) { blend = 1 - blend; } Track.Camera.BeginFrame(blend, Track.Zoom); } else { Track.Camera.BeginFrame(blend, Track.Zoom); } GL.ClearColor(Settings.NightMode ? Constants.ColorNightMode : (Settings.WhiteBG ? Constants.ColorWhite : Constants.ColorOffwhite)); MSAABuffer.Use(RenderSize.Width, RenderSize.Height); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); GL.Clear(ClearBufferMask.ColorBufferBit); GL.Enable(EnableCap.Blend); GL.Disable(EnableCap.Lighting); #if debuggrid if (this.Keyboard.GetState().IsKeyDown(Key.C)) { GameRenderer.DbgDrawGrid(); } #endif Track.Render(blend); #if debugcamera if (this.Keyboard.GetState().IsKeyDown(Key.C)) { GameRenderer.DbgDrawCamera(); } #endif SelectedTool.Render(); Canvas.RenderCanvas(); MSAABuffer.End(); if (Settings.NightMode) { StaticRenderer.RenderRect(new FloatRect(0, 0, RenderSize.Width, RenderSize.Height), Color.FromArgb(40, 0, 0, 0)); } SwapBuffers(); //there are machines and cases where a refresh may not hit the screen without calling glfinish... GL.Finish(); var seconds = Track.FramerateWatch.Elapsed.TotalSeconds; Track.FramerateCounter.AddFrame(seconds); Track.FramerateWatch.Restart(); } if (!Track.Playing && !Canvas.NeedsRedraw && !Track.NeedsDraw && !SelectedTool.Active)//if nothing is waiting on us we can let the os breathe { Thread.Sleep(10); } }