//This renders the frame
protected override void OnRenderFrame(FrameEventArgs e)
{
if (!firstFrame)
{
//If the load is not complete, then we shouldn't be running the mainloop
return;
}
double TimeElapsed = RenderTimeElapsed;
double RealTimeElapsed = RenderRealTimeElapsed;
//Next, check if we're in paused/ in a menu
if (Game.CurrentInterface != Game.InterfaceType.Normal)
{
MainLoop.UpdateControlRepeats(0.0);
MainLoop.ProcessKeyboard();
MainLoop.ProcessControls(0.0);
if (Game.CurrentInterface == Game.InterfaceType.Pause)
{
System.Threading.Thread.Sleep(10);
}
//Renderer.UpdateLighting();
Renderer.RenderScene(TimeElapsed);
Program.currentGameWindow.SwapBuffers();
if (MainLoop.Quit)
{
Close();
}
//If the menu state has not changed, don't update the rendered simulation
return;
}
//Use the OpenTK framerate as this is much more accurate
//Also avoids running a calculation
if (TotalTimeElapsedForInfo >= 0.2)
{
Game.InfoFrameRate = RenderFrequency;
TotalTimeElapsedForInfo = 0.0;
}
if (Game.PreviousInterface != Game.InterfaceType.Normal)
{
ObjectManager.UpdateAnimatedWorldObjects(0.0, false);
Game.PreviousInterface = Game.InterfaceType.Normal;
}
else
{
ObjectManager.UpdateAnimatedWorldObjects(TimeElapsed, false);
}
//We need to update the camera position in the render sequence
//Not doing this means that the camera doesn't move
// update in one piece
if (World.CameraMode == World.CameraViewMode.Interior | World.CameraMode == World.CameraViewMode.InteriorLookAhead)
{
//Update the in-car camera based upon the current driver car (Cabview or passenger view)
TrainManager.PlayerTrain.Cars[World.CameraCar].UpdateCamera();
}
else if (World.CameraMode == World.CameraViewMode.Exterior)
{
//Update the camera position based upon the relative car position
TrainManager.PlayerTrain.Cars[World.CameraCar].UpdateCamera();
}
if (World.CameraRestriction == World.CameraRestrictionMode.NotAvailable)
{
World.UpdateDriverBody(TimeElapsed);
}
//Check if we are running at an accelerated time factor-
//Camera motion speed should be the same whatever the game speed is
if (TimeFactor != 1)
{
World.UpdateAbsoluteCamera(TimeElapsed / TimeFactor);
}
else
{
World.UpdateAbsoluteCamera(TimeElapsed);
}
TrainManager.UpdateTrainObjects(TimeElapsed, false);
if (World.CameraMode == World.CameraViewMode.Interior | World.CameraMode == World.CameraViewMode.InteriorLookAhead | World.CameraMode == World.CameraViewMode.Exterior)
{
ObjectManager.UpdateVisibility(World.CameraTrackFollower.TrackPosition + World.CameraCurrentAlignment.Position.Z);
int d = TrainManager.PlayerTrain.DriverCar;
World.CameraSpeed = TrainManager.PlayerTrain.Cars[d].Specs.CurrentSpeed;
}
else
{
World.CameraSpeed = 0.0;
}
World.CameraAlignmentDirection = new World.CameraAlignment();
if (MainLoop.Quit)
{
Program.currentGameWindow.Exit();
}
Renderer.UpdateLighting();
Renderer.RenderScene(TimeElapsed);
Sounds.Update(TimeElapsed, Interface.CurrentOptions.SoundModel);
Program.currentGameWindow.SwapBuffers();
Game.UpdateBlackBox();
// pause/menu
// limit framerate
if (MainLoop.LimitFramerate)
{
System.Threading.Thread.Sleep(10);
}
MainLoop.UpdateControlRepeats(RealTimeElapsed);
MainLoop.ProcessKeyboard();
World.UpdateMouseGrab(TimeElapsed);
MainLoop.ProcessControls(TimeElapsed);
for (int i = 0; i < JoystickManager.AttachedJoysticks.Length; i++)
{
var railDriver = JoystickManager.AttachedJoysticks[i] as JoystickManager.Raildriver;
if (railDriver != null)
{
if (Interface.CurrentOptions.RailDriverMPH)
{
railDriver.SetDisplay((int)(TrainManager.PlayerTrain.Cars[TrainManager.PlayerTrain.DriverCar].Specs
.CurrentPerceivedSpeed * 2.23694));
}
else
{
railDriver.SetDisplay((int)(TrainManager.PlayerTrain.Cars[TrainManager.PlayerTrain.DriverCar].Specs
.CurrentPerceivedSpeed * 3.6));
}
}
}
RenderRealTimeElapsed = 0.0;
RenderTimeElapsed = 0.0;
#if DEBUG
MainLoop.CheckForOpenGlError("MainLoop");
#endif
if (Interface.CurrentOptions.UnloadUnusedTextures)
{
Renderer.UnloadUnusedTextures(TimeElapsed);
Renderer.LastBoundTexture = null;
}
// finish
try
{
Interface.SaveLogs();
}
catch { }
}