public static void LoadingScreenLoop() { GL.Disable(EnableCap.DepthTest); GL.MatrixMode(MatrixMode.Projection); GL.PushMatrix(); GL.LoadIdentity(); GL.Ortho(0.0, (double)Renderer.ScreenWidth, (double)Renderer.ScreenHeight, 0.0, -1.0, 1.0); GL.Viewport(0, 0, Renderer.ScreenWidth, Renderer.ScreenHeight); while (!Loading.Complete && !Loading.Cancel) { CPreciseTimer.GetElapsedTime(); Program.currentGameWindow.ProcessEvents(); if (Program.currentGameWindow.IsExiting) { Loading.Cancel = true; } Renderer.DrawLoadingScreen(); Program.currentGameWindow.SwapBuffers(); if (Loading.JobAvailable) { while (jobs.Count > 0) { lock (jobLock) { var currentJob = jobs.Dequeue(); var locker = locks.Dequeue(); currentJob(); lock (locker) { Monitor.Pulse(locker); } } } Loading.JobAvailable = false; } double time = CPreciseTimer.GetElapsedTime(); double wait = 1000.0 / 60.0 - time * 1000 - 50; if (wait > 0) { Thread.Sleep((int)(wait)); } } if (!Loading.Cancel) { GL.PopMatrix(); GL.MatrixMode(MatrixMode.Projection); } else { Program.currentGameWindow.Exit(); } }
//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(); }
public static void LoadingScreenLoop() { currentlyLoading = true; Program.Renderer.PushMatrix(MatrixMode.Projection); Matrix4D.CreateOrthographicOffCenter(0.0f, Program.Renderer.Screen.Width, Program.Renderer.Screen.Height, 0.0f, -1.0f, 1.0f, out Program.Renderer.CurrentProjectionMatrix); Program.Renderer.PushMatrix(MatrixMode.Modelview); Program.Renderer.CurrentViewMatrix = Matrix4D.Identity; while (!Loading.Complete && !Loading.Cancel) { CPreciseTimer.GetElapsedTime(); Program.currentGameWindow.ProcessEvents(); if (Program.currentGameWindow.IsExiting) { Loading.Cancel = true; } Program.Renderer.Loading.DrawLoadingScreen(Fonts.SmallFont, Loading.RouteProgress, 1.0); Program.currentGameWindow.SwapBuffers(); if (Loading.JobAvailable) { while (jobs.Count > 0) { lock (jobLock) { var currentJob = jobs.Dequeue(); var locker = locks.Dequeue(); currentJob(); lock (locker) { Monitor.Pulse(locker); } } } Loading.JobAvailable = false; } double time = CPreciseTimer.GetElapsedTime(); double wait = 1000.0 / 60.0 - time * 1000 - 50; if (wait > 0) { Thread.Sleep((int)(wait)); } } if (!Loading.Cancel) { Program.Renderer.PopMatrix(MatrixMode.Modelview); Program.Renderer.PopMatrix(MatrixMode.Projection); } else { Program.currentGameWindow.Exit(); } }
private void LoadingScreenLoop() { GL.MatrixMode(MatrixMode.Projection); GL.PushMatrix(); GL.LoadIdentity(); GL.Ortho(0.0, (double)LibRender.Screen.Width, (double)LibRender.Screen.Height, 0.0, -1.0, 1.0); GL.Viewport(0, 0, LibRender.Screen.Width, LibRender.Screen.Height); while (!Loading.Complete && !Loading.Cancel) { CPreciseTimer.GetElapsedTime(); this.ProcessEvents(); if (this.IsExiting) { Loading.Cancel = true; } LoadingScreen.DrawLoadingScreen(Fonts.SmallFont, Loading.RouteProgress, Loading.TrainProgress); Program.currentGameWindow.SwapBuffers(); if (Loading.JobAvailable) { while (jobs.Count > 0) { lock (jobLock) { var currentJob = jobs.Dequeue(); var locker = locks.Dequeue(); currentJob(); lock (locker) { Monitor.Pulse(locker); } } } Loading.JobAvailable = false; } double time = CPreciseTimer.GetElapsedTime(); double wait = 1000.0 / 60.0 - time * 1000 - 50; if (wait > 0) { Thread.Sleep((int)(wait)); } } if (!Loading.Cancel) { GL.PopMatrix(); GL.MatrixMode(MatrixMode.Projection); SetupSimulation(); } else { this.Exit(); } }
//This renders the frame protected override void OnRenderFrame(FrameEventArgs e) { Game.InfoFrameRate = RenderFrequency; GL.ClearColor(0.75f, 0.75f, 0.75f, 1.0f); //Do not do anything whilst loading if (currentlyLoading) { System.Threading.Thread.Sleep(10); 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 (World.CameraAlignmentDirection.Position.X != 0.0 | World.CameraAlignmentDirection.Position.Y != 0.0 | World.CameraAlignmentDirection.Position.Z != 0.0 | World.CameraAlignmentDirection.Pitch != 0.0 | World.CameraAlignmentDirection.Yaw != 0.0 | World.CameraAlignmentDirection.Roll != 0.0 | World.CameraAlignmentDirection.TrackPosition != 0.0 | World.CameraAlignmentDirection.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; } } } 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); ObjectManager.UpdateVisibility(World.CameraTrackFollower.TrackPosition + World.CameraCurrentAlignment.Position.Z); TextureManager.Update(TimeElapsed); SoundManager.Update(TimeElapsed); Renderer.RenderScene(TimeElapsed); SwapBuffers(); }
protected override void OnUpdateFrame(FrameEventArgs e) { double RealTimeElapsed = CPreciseTimer.GetElapsedTime(); DateTime time = DateTime.Now; Game.SecondsSinceMidnight = 3600 * time.Hour + 60 * time.Minute + time.Second + 0.001 * time.Millisecond; NearestTrain.Apply(); if (NearestTrain.IsExtensionsCfg) { double[] decelerationDueToBrake, decelerationDueToMotor; Program.TrainManager.Trains[0].UpdateBrakeSystem(RealTimeElapsed, out decelerationDueToBrake, out decelerationDueToMotor); } TotalTimeElapsedForInfo += RealTimeElapsed; RenderRealTimeElapsed += RealTimeElapsed; }
protected override void OnRenderFrame(FrameEventArgs e) { Program.MouseMovement(); double timeElapsed = CPreciseTimer.GetElapsedTime(); DateTime time = DateTime.Now; Game.SecondsSinceMidnight = (double)(3600 * time.Hour + 60 * time.Minute + time.Second) + 0.001 * (double)time.Millisecond; lock (Program.LockObj) { ObjectManager.UpdateAnimatedWorldObjects(timeElapsed, false); } if (Program.ReducedMode) { System.Threading.Thread.Sleep(125); } else { System.Threading.Thread.Sleep(1); } bool updatelight = false; bool keep = false; // rotate x if (Program.RotateX == 0) { double d = (1.0 + Math.Abs(RotateXSpeed)) * timeElapsed; if (RotateXSpeed >= -d & RotateXSpeed <= d) { RotateXSpeed = 0.0; } else { RotateXSpeed -= (double)Math.Sign(RotateXSpeed) * d; } } else { double d = (1.0 + 1.0 - 1.0 / (1.0 + RotateXSpeed * RotateXSpeed)) * timeElapsed; double m = 1.0; RotateXSpeed += (double)Program.RotateX * d; if (RotateXSpeed < -m) { RotateXSpeed = -m; } else if (RotateXSpeed > m) { RotateXSpeed = m; } } if (RotateXSpeed != 0.0) { double cosa = Math.Cos(RotateXSpeed * timeElapsed); double sina = Math.Sin(RotateXSpeed * timeElapsed); Program.Renderer.Camera.AbsoluteDirection.Rotate(Vector3.Down, cosa, sina); Program.Renderer.Camera.AbsoluteUp.Rotate(Vector3.Down, cosa, sina); Program.Renderer.Camera.AbsoluteSide.Rotate(Vector3.Down, cosa, sina); keep = true; } // rotate y if (Program.RotateY == 0) { double d = (1.0 + Math.Abs(RotateYSpeed)) * timeElapsed; if (RotateYSpeed >= -d & RotateYSpeed <= d) { RotateYSpeed = 0.0; } else { RotateYSpeed -= (double)Math.Sign(RotateYSpeed) * d; } } else { double d = (1.0 + 1.0 - 1.0 / (1.0 + RotateYSpeed * RotateYSpeed)) * timeElapsed; double m = 1.0; RotateYSpeed += (double)Program.RotateY * d; if (RotateYSpeed < -m) { RotateYSpeed = -m; } else if (RotateYSpeed > m) { RotateYSpeed = m; } } if (RotateYSpeed != 0.0) { double cosa = Math.Cos(RotateYSpeed * timeElapsed); double sina = Math.Sin(RotateYSpeed * timeElapsed); Program.Renderer.Camera.AbsoluteDirection.Rotate(Program.Renderer.Camera.AbsoluteSide, cosa, sina); Program.Renderer.Camera.AbsoluteUp.Rotate(Program.Renderer.Camera.AbsoluteSide, cosa, sina); keep = true; } // move x if (Program.MoveX == 0) { double d = (2.5 + Math.Abs(MoveXSpeed)) * timeElapsed; if (MoveXSpeed >= -d & MoveXSpeed <= d) { MoveXSpeed = 0.0; } else { MoveXSpeed -= (double)Math.Sign(MoveXSpeed) * d; } } else { double d = (5.0 + 10.0 - 10.0 / (1.0 + MoveXSpeed * MoveXSpeed)) * timeElapsed; double m = 25.0; MoveXSpeed += (double)Program.MoveX * d; if (MoveXSpeed < -m) { MoveXSpeed = -m; } else if (MoveXSpeed > m) { MoveXSpeed = m; } } if (MoveXSpeed != 0.0) { Program.Renderer.Camera.AbsolutePosition += MoveXSpeed * timeElapsed * Program.Renderer.Camera.AbsoluteSide; keep = true; } // move y if (Program.MoveY == 0) { double d = (2.5 + Math.Abs(MoveYSpeed)) * timeElapsed; if (MoveYSpeed >= -d & MoveYSpeed <= d) { MoveYSpeed = 0.0; } else { MoveYSpeed -= (double)Math.Sign(MoveYSpeed) * d; } } else { double d = (5.0 + 10.0 - 10.0 / (1.0 + MoveYSpeed * MoveYSpeed)) * timeElapsed; double m = 25.0; MoveYSpeed += (double)Program.MoveY * d; if (MoveYSpeed < -m) { MoveYSpeed = -m; } else if (MoveYSpeed > m) { MoveYSpeed = m; } } if (MoveYSpeed != 0.0) { Program.Renderer.Camera.AbsolutePosition += MoveYSpeed * timeElapsed * Program.Renderer.Camera.AbsoluteUp; keep = true; } // move z if (Program.MoveZ == 0) { double d = (2.5 + Math.Abs(MoveZSpeed)) * timeElapsed; if (MoveZSpeed >= -d & MoveZSpeed <= d) { MoveZSpeed = 0.0; } else { MoveZSpeed -= (double)Math.Sign(MoveZSpeed) * d; } } else { double d = (5.0 + 10.0 - 10.0 / (1.0 + MoveZSpeed * MoveZSpeed)) * timeElapsed; double m = 25.0; MoveZSpeed += (double)Program.MoveZ * d; if (MoveZSpeed < -m) { MoveZSpeed = -m; } else if (MoveZSpeed > m) { MoveZSpeed = m; } } if (MoveZSpeed != 0.0) { Program.Renderer.Camera.AbsolutePosition += MoveZSpeed * timeElapsed * Program.Renderer.Camera.AbsoluteDirection; keep = true; } // lighting if (Program.LightingRelative == -1) { Program.LightingRelative = (double)Program.LightingTarget; updatelight = true; } if (Program.LightingTarget == 0) { if (Program.LightingRelative != 0.0) { Program.LightingRelative -= 0.5 * timeElapsed; if (Program.LightingRelative < 0.0) { Program.LightingRelative = 0.0; } updatelight = true; keep = true; } } else { if (Program.LightingRelative != 1.0) { Program.LightingRelative += 0.5 * timeElapsed; if (Program.LightingRelative > 1.0) { Program.LightingRelative = 1.0; } updatelight = true; keep = true; } } // continue if (Program.ReducedMode) { ReducedModeEnteringTime = 3.0; } else { if (keep) { ReducedModeEnteringTime = 3.0; } else if (ReducedModeEnteringTime <= 0) { Program.ReducedMode = true; Program.Renderer.Camera.AbsoluteSide.Y = 0.0; Program.Renderer.Camera.AbsoluteSide.Normalize(); Program.Renderer.Camera.AbsoluteDirection.Normalize(); Program.Renderer.Camera.AbsoluteUp = Vector3.Cross(Program.Renderer.Camera.AbsoluteDirection, Program.Renderer.Camera.AbsoluteSide); } else { ReducedModeEnteringTime -= timeElapsed; } } if (updatelight) { Program.Renderer.Lighting.OptionAmbientColor.R = (byte)Math.Round(32.0 + 128.0 * Program.LightingRelative * (2.0 - Program.LightingRelative)); Program.Renderer.Lighting.OptionAmbientColor.G = (byte)Math.Round(32.0 + 128.0 * 0.5 * (Program.LightingRelative + Program.LightingRelative * (2.0 - Program.LightingRelative))); Program.Renderer.Lighting.OptionAmbientColor.B = (byte)Math.Round(32.0 + 128.0 * Program.LightingRelative); Program.Renderer.Lighting.OptionDiffuseColor.R = (byte)Math.Round(32.0 + 128.0 * Program.LightingRelative); Program.Renderer.Lighting.OptionDiffuseColor.G = (byte)Math.Round(32.0 + 128.0 * Program.LightingRelative); Program.Renderer.Lighting.OptionDiffuseColor.B = (byte)Math.Round(32.0 + 128.0 * Math.Sqrt(Program.LightingRelative)); } Program.Renderer.Lighting.Initialize(); Program.Renderer.RenderScene(); SwapBuffers(); }
protected override void OnUpdateFrame(FrameEventArgs e) { TimeFactor = MainLoop.TimeFactor; // timer double RealTimeElapsed; double TimeElapsed; if (Game.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 - Game.SecondsSinceMidnight; } //We only want to update the simulation if we aren't in a menu if (Game.CurrentInterface == Game.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 += TimeElapsed; TotalTimeElapsedForSectionUpdate += TimeElapsed; if (TotalTimeElapsedForSectionUpdate >= 1.0) { if (Game.Sections.Length != 0) { Game.UpdateSection(Game.Sections.Length - 1); } TotalTimeElapsedForSectionUpdate = 0.0; } // events // update simulation in chunks { const double chunkTime = 1.0 / 2.0; if (TimeElapsed <= chunkTime) { Game.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++) { Game.SecondsSinceMidnight += time; TrainManager.UpdateTrains(time); } } } Game.CurrentScore.Update(TimeElapsed); Game.UpdateMessages(); Game.UpdateScoreMessages(TimeElapsed); } RenderTimeElapsed += TimeElapsed; RenderRealTimeElapsed += RealTimeElapsed; }
private void LoadingScreenLoop() { Program.Renderer.PushMatrix(MatrixMode.Projection); Matrix4D.CreateOrthographicOffCenter(0.0f, Program.Renderer.Screen.Width, Program.Renderer.Screen.Height, 0.0f, -1.0f, 1.0f, out Program.Renderer.CurrentProjectionMatrix); Program.Renderer.PushMatrix(MatrixMode.Modelview); Program.Renderer.CurrentViewMatrix = Matrix4D.Identity; while (!Loading.Complete && !Loading.Cancel) { CPreciseTimer.GetElapsedTime(); this.ProcessEvents(); if (this.IsExiting) { Loading.Cancel = true; } double routeProgress = 1.0; for (int i = 0; i < Program.CurrentHost.Plugins.Length; i++) { if (Program.CurrentHost.Plugins[i].Route != null && Program.CurrentHost.Plugins[i].Route.IsLoading) { routeProgress = Program.CurrentHost.Plugins[i].Route.CurrentProgress; break; } } Program.Renderer.Loading.SetLoadingBkg(Program.CurrentRoute.Information.LoadingScreenBackground); Program.Renderer.Loading.DrawLoadingScreen(Fonts.SmallFont, routeProgress, Loading.TrainProgress); Program.currentGameWindow.SwapBuffers(); if (Loading.JobAvailable) { while (jobs.Count > 0) { lock (jobLock) { var currentJob = jobs.Dequeue(); var locker = locks.Dequeue(); currentJob(); lock (locker) { Monitor.Pulse(locker); } } } Loading.JobAvailable = false; } double time = CPreciseTimer.GetElapsedTime(); double wait = 1000.0 / 60.0 - time * 1000 - 50; if (wait > 0) { Thread.Sleep((int)(wait)); } } if (!Loading.Cancel) { Program.Renderer.PopMatrix(MatrixMode.Modelview); Program.Renderer.PopMatrix(MatrixMode.Projection); SetupSimulation(); } else { this.Exit(); } }