//This renders the frame protected override void OnRenderFrame(FrameEventArgs e) { Program.MouseMovement(); Program.Renderer.FrameRate = RenderFrequency; //Do not do anything whilst loading if (currentlyLoading) { return; } ProcessEvents(); double TimeElapsed = CPreciseTimer.GetElapsedTime(); if (Program.CpuReducedMode) { System.Threading.Thread.Sleep(250); } else { System.Threading.Thread.Sleep(1); if (ReducedModeEnteringTime == 0) { ReducedModeEnteringTime = 2500; } if (Program.Renderer.Camera.AlignmentDirection.Position.X != 0.0 | Program.Renderer.Camera.AlignmentDirection.Position.Y != 0.0 | Program.Renderer.Camera.AlignmentDirection.Position.Z != 0.0 | Program.Renderer.Camera.AlignmentDirection.Pitch != 0.0 | Program.Renderer.Camera.AlignmentDirection.Yaw != 0.0 | Program.Renderer.Camera.AlignmentDirection.Roll != 0.0 | Program.Renderer.Camera.AlignmentDirection.TrackPosition != 0.0 | Program.Renderer.Camera.AlignmentDirection.Zoom != 0.0) { ReducedModeEnteringTime = 2500; } //Automatically enter reduced CPU mode if appropriate if (Program.CpuAutomaticMode && Program.CpuReducedMode == false) { ReducedModeEnteringTime -= TimeElapsed; if (ReducedModeEnteringTime <= 0) { Program.CpuReducedMode = true; ReducedModeEnteringTime = 0; } } } if (Program.CurrentRouteFile != null) { DateTime d = DateTime.Now; Game.SecondsSinceMidnight = (double)(3600 * d.Hour + 60 * d.Minute + d.Second) + 0.001 * (double)d.Millisecond; ObjectManager.UpdateAnimatedWorldObjects(TimeElapsed, false); World.UpdateAbsoluteCamera(TimeElapsed); Program.Renderer.UpdateVisibility(Program.Renderer.CameraTrackFollower.TrackPosition + Program.Renderer.Camera.Alignment.Position.Z); Program.Sounds.Update(TimeElapsed, SoundModels.Linear); } Program.Renderer.Lighting.UpdateLighting(Program.CurrentRoute.SecondsSinceMidnight); Program.Renderer.RenderScene(TimeElapsed); MessageManager.UpdateMessages(); SwapBuffers(); }
/// <summary>Called once a frame to update the messages displayed on-screen</summary> internal static void UpdateMessages() { MessageManager.UpdateMessages(); }
protected override void OnUpdateFrame(FrameEventArgs e) { TimeFactor = MainLoop.TimeFactor; // timer double RealTimeElapsed; double TimeElapsed; if (Program.CurrentRoute.SecondsSinceMidnight >= Game.StartupTime) { RealTimeElapsed = CPreciseTimer.GetElapsedTime(); TimeElapsed = RealTimeElapsed * (double)TimeFactor; if (loadComplete && !firstFrame) { //Our current in-game time is equal to or greater than the startup time, but the first frame has not yet been processed //Therefore, reset the timer to zero as time consuming texture loads may cause us to be late at the first station RealTimeElapsed = 0.0; TimeElapsed = 0.0; firstFrame = true; } } else { RealTimeElapsed = 0.0; TimeElapsed = Game.StartupTime - Program.CurrentRoute.SecondsSinceMidnight; } //We only want to update the simulation if we aren't in a menu if (Program.Renderer.CurrentInterface == InterfaceType.Normal) { #if DEBUG //If we're in debug mode and a frame takes greater than a second to render, we can safely assume that VS has hit a breakpoint //Check this and the sim no longer barfs because the update time was too great if (RealTimeElapsed > 1) { RealTimeElapsed = 0.0; TimeElapsed = 0.0; } #endif TotalTimeElapsedForInfo += RealTimeElapsed; TotalTimeElapsedForSectionUpdate += TimeElapsed; if (TotalTimeElapsedForSectionUpdate >= 1.0) { if (Program.CurrentRoute.Sections.Length != 0) { Program.CurrentRoute.UpdateAllSections(); } TotalTimeElapsedForSectionUpdate = 0.0; } // events // update simulation in chunks { const double chunkTime = 1.0 / 2.0; if (TimeElapsed <= chunkTime) { Program.CurrentRoute.SecondsSinceMidnight += TimeElapsed; TrainManager.UpdateTrains(TimeElapsed); } else { const int maxChunks = 2; int chunks = Math.Min((int)Math.Round(TimeElapsed / chunkTime), maxChunks); double time = TimeElapsed / (double)chunks; for (int i = 0; i < chunks; i++) { Program.CurrentRoute.SecondsSinceMidnight += time; TrainManager.UpdateTrains(time); } } } Game.CurrentScore.Update(TimeElapsed); MessageManager.UpdateMessages(); Game.UpdateScoreMessages(TimeElapsed); for (int i = 0; i < InputDevicePlugin.AvailablePluginInfos.Count; i++) { if (InputDevicePlugin.AvailablePluginInfos[i].Status == InputDevicePlugin.PluginInfo.PluginStatus.Enable) { InputDevicePlugin.AvailablePlugins[i].OnUpdateFrame(); } } } RenderTimeElapsed += TimeElapsed; RenderRealTimeElapsed += RealTimeElapsed; }