internal static void keyDownEvent(object sender, KeyboardKeyEventArgs e) { double speedModified = (ShiftPressed ? 2.0 : 1.0) * (ControlPressed ? 4.0 : 1.0) * (AltPressed ? 8.0 : 1.0); switch (e.Key) { case Key.ShiftLeft: case Key.ShiftRight: ShiftPressed = true; break; case Key.ControlLeft: case Key.ControlRight: ControlPressed = true; break; case Key.LAlt: case Key.RAlt: AltPressed = true; break; case Key.F5: if (CurrentRouteFile != null && CurrentlyLoading == false) { Bitmap bitmap = null; CurrentlyLoading = true; Renderer.OptionInterface = false; if (!Interface.CurrentOptions.LoadingBackground) { Renderer.RenderScene(0.0); currentGameWindow.SwapBuffers(); bitmap = new Bitmap(Renderer.Screen.Width, Renderer.Screen.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); BitmapData bData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); GL.ReadPixels(0, 0, Renderer.Screen.Width, Renderer.Screen.Height, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, bData.Scan0); bitmap.UnlockBits(bData); bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); } CameraAlignment a = Renderer.Camera.Alignment; if (LoadRoute(bitmap)) { Renderer.Camera.Alignment = a; Program.Renderer.CameraTrackFollower.UpdateAbsolute(-1.0, true, false); Program.Renderer.CameraTrackFollower.UpdateAbsolute(a.TrackPosition, true, false); Renderer.Camera.AlignmentDirection = new CameraAlignment(); Renderer.Camera.AlignmentSpeed = new CameraAlignment(); Renderer.UpdateVisibility(a.TrackPosition, true); ObjectManager.UpdateAnimatedWorldObjects(0.0, true); } else { Renderer.Camera.Alignment.Yaw = 0.0; Renderer.Camera.Alignment.Pitch = 0.0; Renderer.Camera.Alignment.Roll = 0.0; Renderer.Camera.Alignment.Position = new Vector3(0.0, 2.5, 0.0); Renderer.Camera.Alignment.Zoom = 0.0; Renderer.Camera.AlignmentDirection = new CameraAlignment(); Renderer.Camera.AlignmentSpeed = new CameraAlignment(); Renderer.Camera.VerticalViewingAngle = Renderer.Camera.OriginalVerticalViewingAngle; Renderer.UpdateViewport(); World.UpdateAbsoluteCamera(0.0); Program.Renderer.UpdateViewingDistances(Program.CurrentRoute.CurrentBackground.BackgroundImageDistance); } CurrentlyLoading = false; Renderer.OptionInterface = true; if (bitmap != null) { bitmap.Dispose(); } } break; case Key.F7: if (CurrentlyLoading == true) { break; } OpenFileDialog Dialog = new OpenFileDialog(); Dialog.CheckFileExists = true; Dialog.Filter = @"All Supported Routes|*.csv;*.rw;*.dat|CSV/RW files|*.csv;*.rw|Mechanik Routes|*.dat|All files|*"; if (Dialog.ShowDialog() == DialogResult.OK) { Application.DoEvents(); CurrentlyLoading = true; CurrentRouteFile = Dialog.FileName; bool canLoad = false; for (int i = 0; i < Program.CurrentHost.Plugins.Length; i++) { if (Program.CurrentHost.Plugins[i].Route != null && Program.CurrentHost.Plugins[i].Route.CanLoadRoute(CurrentRouteFile)) { canLoad = true; break; } } if (canLoad && LoadRoute()) { ObjectManager.UpdateAnimatedWorldObjects(0.0, true); } else { bool isObject = false; for (int i = 0; i < Program.CurrentHost.Plugins.Length; i++) { if (Program.CurrentHost.Plugins[i].Object != null && Program.CurrentHost.Plugins[i].Object.CanLoadObject(CurrentRouteFile)) { isObject = true; break; } } if (isObject) { // oops, that's actually an object- Let's show Object Viewer string File = System.IO.Path.Combine(Application.StartupPath, "ObjectViewer.exe"); if (System.IO.File.Exists(File)) { System.Diagnostics.Process.Start(File, CurrentRouteFile); } } else { MessageBox.Show("No plugins found capable of loading routefile: " + Environment.NewLine + CurrentRouteFile); } Renderer.Camera.Alignment.Yaw = 0.0; Renderer.Camera.Alignment.Pitch = 0.0; Renderer.Camera.Alignment.Roll = 0.0; Renderer.Camera.Alignment.Position = new Vector3(0.0, 2.5, 0.0); Renderer.Camera.Alignment.Zoom = 0.0; Renderer.Camera.AlignmentDirection = new CameraAlignment(); Renderer.Camera.AlignmentSpeed = new CameraAlignment(); Renderer.Camera.VerticalViewingAngle = Renderer.Camera.OriginalVerticalViewingAngle; Renderer.UpdateViewport(); World.UpdateAbsoluteCamera(0.0); CurrentRouteFile = null; Renderer.UpdateViewingDistances(Program.CurrentRoute.CurrentBackground.BackgroundImageDistance); } CurrentlyLoading = false; UpdateCaption(); } else { if (Program.CurrentHost.MonoRuntime) { //HACK: Dialog doesn't close properly when pressing the ESC key under Mono //Avoid calling Application.DoEvents() unless absolutely necessary though! Application.DoEvents(); } } Dialog.Dispose(); break; case Key.F8: if (Program.CurrentlyLoading == true) { //Don't allow the user to update the settings during loading, bad idea.. break; } if (formOptions.ShowOptions() == DialogResult.OK) { UpdateGraphicsSettings(); } Application.DoEvents(); Renderer.Camera.AlignmentDirection.TrackPosition = 0; Renderer.Camera.AlignmentDirection.Position.X = 0; Renderer.Camera.AlignmentDirection.Position.Y = 0; break; case Key.F9: if (Interface.LogMessages.Count != 0) { formMessages.ShowMessages(); Application.DoEvents(); Renderer.Camera.AlignmentDirection.TrackPosition = 0; Renderer.Camera.AlignmentDirection.Position.X = 0; Renderer.Camera.AlignmentDirection.Position.Y = 0; } break; case Key.F10: Renderer.RenderStatsOverlay = !Renderer.RenderStatsOverlay; break; case Key.A: case Key.Keypad4: Renderer.Camera.AlignmentDirection.Position.X = -CameraProperties.ExteriorTopSpeed * speedModified; CpuReducedMode = false; break; case Key.D: case Key.Keypad6: Renderer.Camera.AlignmentDirection.Position.X = CameraProperties.ExteriorTopSpeed * speedModified; CpuReducedMode = false; break; case Key.Keypad2: Renderer.Camera.AlignmentDirection.Position.Y = -CameraProperties.ExteriorTopSpeed * speedModified; CpuReducedMode = false; break; case Key.Keypad8: Renderer.Camera.AlignmentDirection.Position.Y = CameraProperties.ExteriorTopSpeed * speedModified; CpuReducedMode = false; break; case Key.W: case Key.Keypad9: Renderer.Camera.AlignmentDirection.TrackPosition = CameraProperties.ExteriorTopSpeed * speedModified; CpuReducedMode = false; break; case Key.S: case Key.Keypad3: Renderer.Camera.AlignmentDirection.TrackPosition = -CameraProperties.ExteriorTopSpeed * speedModified; CpuReducedMode = false; break; case Key.Left: Renderer.Camera.AlignmentDirection.Yaw = -CameraProperties.ExteriorTopAngularSpeed * speedModified; CpuReducedMode = false; break; case Key.Right: Renderer.Camera.AlignmentDirection.Yaw = CameraProperties.ExteriorTopAngularSpeed * speedModified; CpuReducedMode = false; break; case Key.Up: Renderer.Camera.AlignmentDirection.Pitch = CameraProperties.ExteriorTopAngularSpeed * speedModified; CpuReducedMode = false; break; case Key.Down: Renderer.Camera.AlignmentDirection.Pitch = -CameraProperties.ExteriorTopAngularSpeed * speedModified; CpuReducedMode = false; break; case Key.KeypadDivide: Renderer.Camera.AlignmentDirection.Roll = -CameraProperties.ExteriorTopAngularSpeed * speedModified; CpuReducedMode = false; break; case Key.KeypadMultiply: Renderer.Camera.AlignmentDirection.Roll = CameraProperties.ExteriorTopAngularSpeed * speedModified; CpuReducedMode = false; break; case Key.Keypad0: Renderer.Camera.AlignmentDirection.Zoom = CameraProperties.ZoomTopSpeed * speedModified; CpuReducedMode = false; break; case Key.KeypadPeriod: Renderer.Camera.AlignmentDirection.Zoom = -CameraProperties.ZoomTopSpeed * speedModified; CpuReducedMode = false; break; case Key.Keypad1: Game.ApplyPointOfInterest(-1, true); CpuReducedMode = false; break; case Key.Keypad7: Game.ApplyPointOfInterest(1, true); CpuReducedMode = false; break; case Key.PageUp: JumpToStation(1); CpuReducedMode = false; break; case Key.PageDown: JumpToStation(-1); CpuReducedMode = false; break; case Key.Keypad5: Renderer.Camera.Alignment.Yaw = 0.0; Renderer.Camera.Alignment.Pitch = 0.0; Renderer.Camera.Alignment.Roll = 0.0; Renderer.Camera.Alignment.Position = new Vector3(0.0, 2.5, 0.0); Renderer.Camera.Alignment.Zoom = 0.0; Renderer.Camera.AlignmentDirection = new CameraAlignment(); Renderer.Camera.AlignmentSpeed = new CameraAlignment(); Renderer.Camera.VerticalViewingAngle = Renderer.Camera.OriginalVerticalViewingAngle; Renderer.UpdateViewport(); World.UpdateAbsoluteCamera(0.0); Program.Renderer.UpdateViewingDistances(Program.CurrentRoute.CurrentBackground.BackgroundImageDistance); CpuReducedMode = false; break; case Key.F: Renderer.OptionWireFrame = !Renderer.OptionWireFrame; CpuReducedMode = false; break; case Key.N: Renderer.OptionNormals = !Renderer.OptionNormals; CpuReducedMode = false; break; case Key.E: Renderer.OptionEvents = !Renderer.OptionEvents; CpuReducedMode = false; break; case Key.C: CpuAutomaticMode = !CpuAutomaticMode; CpuReducedMode = false; break; case Key.I: Renderer.OptionInterface = !Renderer.OptionInterface; CpuReducedMode = false; break; case Key.M: //SoundManager.Mute = !SoundManager.Mute; break; case Key.Plus: case Key.KeypadPlus: if (!JumpToPositionEnabled) { JumpToPositionEnabled = true; JumpToPositionValue = "+"; CpuReducedMode = false; } break; case Key.Minus: case Key.KeypadMinus: if (!JumpToPositionEnabled) { JumpToPositionEnabled = true; JumpToPositionValue = "-"; CpuReducedMode = false; } break; case Key.Number0: case Key.Number1: case Key.Number2: case Key.Number3: case Key.Number4: case Key.Number5: case Key.Number6: case Key.Number7: case Key.Number8: case Key.Number9: if (!JumpToPositionEnabled) { JumpToPositionEnabled = true; JumpToPositionValue = string.Empty; } JumpToPositionValue += char.ConvertFromUtf32(48 + e.Key - Key.Number0); CpuReducedMode = false; break; case Key.Period: if (!JumpToPositionEnabled) { JumpToPositionEnabled = true; JumpToPositionValue = "0."; } else if (JumpToPositionValue.IndexOf('.') == -1) { JumpToPositionValue += "."; } CpuReducedMode = false; break; case Key.BackSpace: if (JumpToPositionEnabled && JumpToPositionValue.Length != 0) { JumpToPositionValue = JumpToPositionValue.Substring(0, JumpToPositionValue.Length - 1); CpuReducedMode = false; } break; case Key.Enter: if (JumpToPositionEnabled) { if (JumpToPositionValue.Length != 0) { int direction; if (JumpToPositionValue[0] == '-') { JumpToPositionValue = JumpToPositionValue.Substring(1); direction = -1; } else if (JumpToPositionValue[0] == '+') { JumpToPositionValue = JumpToPositionValue.Substring(1); direction = 1; } else { direction = 0; } double value; if (double.TryParse(JumpToPositionValue, NumberStyles.Float, CultureInfo.InvariantCulture, out value)) { if (value < CurrentRoute.Tracks[0].Elements[CurrentRoute.Tracks[0].Elements.Length - 1].StartingTrackPosition + 100 && value > MinimumJumpToPositionValue - 100) { if (direction != 0) { value = Program.Renderer.CameraTrackFollower.TrackPosition + (double)direction * value; } Program.Renderer.CameraTrackFollower.UpdateAbsolute(value, true, false); Renderer.Camera.Alignment.TrackPosition = value; World.UpdateAbsoluteCamera(0.0); Program.Renderer.UpdateViewingDistances(Program.CurrentRoute.CurrentBackground.BackgroundImageDistance); } } } } JumpToPositionEnabled = false; CpuReducedMode = false; break; case Key.Escape: JumpToPositionEnabled = false; CpuReducedMode = false; break; case Key.R: Renderer.SwitchOpenGLVersion(); break; } }