// process events
private static void ProcessEvents()
{
SDL.SDL_Event Event;
double speedModified = (ShiftPressed ? 2.0 : 1.0) * (ControlPressed ? 4.0 : 1.0) * (AltPressed ? 8.0 : 1.0);
while (SDL.SDL_PollEvent(out Event) != 0)
{
switch (Event.type)
{
// quit
case SDL.SDL_EventType.SDL_QUIT:
Quit = true;
return;
// resize
case SDL.SDL_EventType.SDL_WINDOWEVENT:
if (Event.window.windowEvent == SDL.SDL_WindowEventID.SDL_WINDOWEVENT_RESIZED)
{
Renderer.ScreenWidth = Event.window.data1;
Renderer.ScreenHeight = Event.window.data2;
UpdateViewport();
}
break;
// mouse
case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN: // FIXME implement check whether any track is loaded!
if (CurrentRoute != null)
{
switch (Event.button.button)
{
case (byte)SDL.SDL_BUTTON_LEFT:
World.CameraAlignmentDirection.TrackPosition = World.CameraExteriorTopSpeed * speedModified;
CpuReducedMode = false;
break;
case (byte)SDL.SDL_BUTTON_RIGHT:
World.CameraAlignmentDirection.TrackPosition = -World.CameraExteriorTopSpeed * speedModified;
CpuReducedMode = false;
break;
case (byte)SDL.SDL_BUTTON_MIDDLE:
Rotate = true;
SDL.SDL_SetRelativeMouseMode(SDL.SDL_bool.SDL_TRUE);
CpuReducedMode = false;
break;
}
}
break;
case SDL.SDL_EventType.SDL_MOUSEBUTTONUP: // FIXME implement check whether any track is loaded!
if (CurrentRoute != null)
{
if (Event.button.button == SDL.SDL_BUTTON_LEFT || Event.button.button == SDL.SDL_BUTTON_RIGHT)
{
World.CameraAlignmentDirection.TrackPosition = 0.0;
}
else if (Event.button.button == SDL.SDL_BUTTON_MIDDLE)
{
SDL.SDL_SetRelativeMouseMode(SDL.SDL_bool.SDL_FALSE);
World.CameraAlignmentDirection.Pitch = 0.0;
World.CameraAlignmentDirection.Yaw = 0.0;
Rotate = false;
}
}
break;
case SDL.SDL_EventType.SDL_MOUSEMOTION: // TODO - rotate
if (Rotate && CurrentStation != -1) /*
* World.CameraAlignmentDirection.Pitch = speedModified * -World.CameraExteriorTopAngularSpeed * Event.motion.yrel/3;
* World.CameraAlignmentDirection.Yaw = speedModified * World.CameraExteriorTopAngularSpeed * Event.motion.xrel/3;*/
{
}
break;
// key down
case SDL.SDL_EventType.SDL_KEYDOWN:
switch (Event.key.keysym.sym)
{
case SDL.SDL_Keycode.SDLK_LSHIFT:
case SDL.SDL_Keycode.SDLK_RSHIFT:
ShiftPressed = true;
break;
case SDL.SDL_Keycode.SDLK_LCTRL:
case SDL.SDL_Keycode.SDLK_RCTRL:
ControlPressed = true;
break;
case SDL.SDL_Keycode.SDLK_LALT:
case SDL.SDL_Keycode.SDLK_RALT:
AltPressed = true;
break;
case SDL.SDL_Keycode.SDLK_F5:
if (CurrentRoute != null)
{
CurrentlyLoading = true;
Renderer.RenderScene(0.0);
SwapBuffers();
World.CameraAlignment a = World.CameraCurrentAlignment;
if (LoadRoute())
{
World.CameraCurrentAlignment = a;
TrackManager.UpdateTrackFollower(ref World.CameraTrackFollower, -1.0, true, false);
TrackManager.UpdateTrackFollower(ref World.CameraTrackFollower, a.TrackPosition, true, false);
World.CameraAlignmentDirection = new World.CameraAlignment();
World.CameraAlignmentSpeed = new World.CameraAlignment();
ObjectManager.UpdateVisibility(a.TrackPosition, true);
ObjectManager.UpdateAnimatedWorldObjects(0.0, true);
}
CurrentlyLoading = false;
}
break;
case SDL.SDL_Keycode.SDLK_F7:
{
OpenFileDialog Dialog = new OpenFileDialog();
Dialog.CheckFileExists = true;
Dialog.Filter = "CSV/RW files|*.csv;*.rw|All files|*";
if (Dialog.ShowDialog() == DialogResult.OK)
{
CurrentlyLoading = true;
Renderer.RenderScene(0.0);
SwapBuffers();
CurrentRoute = Dialog.FileName;
LoadRoute();
ObjectManager.UpdateAnimatedWorldObjects(0.0, true);
CurrentlyLoading = false;
UpdateCaption();
}
}
break;
case SDL.SDL_Keycode.SDLK_F9:
if (Interface.MessageCount != 0)
{
formMessages.ShowMessages();
}
break;
case SDL.SDL_Keycode.SDLK_a:
case SDL.SDL_Keycode.SDLK_KP_4:
World.CameraAlignmentDirection.Position.X = -World.CameraExteriorTopSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_d:
case SDL.SDL_Keycode.SDLK_KP_6:
World.CameraAlignmentDirection.Position.X = World.CameraExteriorTopSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_KP_2:
World.CameraAlignmentDirection.Position.Y = -World.CameraExteriorTopSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_KP_8:
World.CameraAlignmentDirection.Position.Y = World.CameraExteriorTopSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_w:
case SDL.SDL_Keycode.SDLK_KP_9:
if (CurrentRoute != null)
{
World.CameraAlignmentDirection.TrackPosition = World.CameraExteriorTopSpeed * speedModified;
CpuReducedMode = false;
}
break;
case SDL.SDL_Keycode.SDLK_s:
case SDL.SDL_Keycode.SDLK_KP_3:
if (CurrentRoute != null)
{
World.CameraAlignmentDirection.TrackPosition = -World.CameraExteriorTopSpeed * speedModified;
CpuReducedMode = false;
}
break;
case SDL.SDL_Keycode.SDLK_LEFT:
World.CameraAlignmentDirection.Yaw = -World.CameraExteriorTopAngularSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_RIGHT:
World.CameraAlignmentDirection.Yaw = World.CameraExteriorTopAngularSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_UP:
World.CameraAlignmentDirection.Pitch = World.CameraExteriorTopAngularSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_DOWN:
World.CameraAlignmentDirection.Pitch = -World.CameraExteriorTopAngularSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_KP_DIVIDE:
World.CameraAlignmentDirection.Roll = -World.CameraExteriorTopAngularSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_KP_MULTIPLY:
World.CameraAlignmentDirection.Roll = World.CameraExteriorTopAngularSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_KP_0:
World.CameraAlignmentDirection.Zoom = World.CameraZoomTopSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_KP_PERIOD:
World.CameraAlignmentDirection.Zoom = -World.CameraZoomTopSpeed * speedModified;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_KP_1:
Game.ApplyPointOfInterest(-1, true);
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_KP_7:
Game.ApplyPointOfInterest(1, true);
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_PAGEUP:
JumpToStation(1);
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_PAGEDOWN:
JumpToStation(-1);
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_KP_5:
World.CameraCurrentAlignment.Yaw = 0.0;
World.CameraCurrentAlignment.Pitch = 0.0;
World.CameraCurrentAlignment.Roll = 0.0;
World.CameraCurrentAlignment.Position = new World.Vector3D(0.0, 2.5, 0.0);
World.CameraCurrentAlignment.Zoom = 0.0;
World.CameraAlignmentDirection = new World.CameraAlignment();
World.CameraAlignmentSpeed = new World.CameraAlignment();
World.VerticalViewingAngle = World.OriginalVerticalViewingAngle;
UpdateViewport();
World.UpdateAbsoluteCamera(0.0);
World.UpdateViewingDistances();
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_f:
Renderer.OptionWireframe = !Renderer.OptionWireframe;
CpuReducedMode = false;
if (Renderer.OptionWireframe)
{
GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line);
}
else
{
GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill);
} break;
case SDL.SDL_Keycode.SDLK_n:
Renderer.OptionNormals = !Renderer.OptionNormals;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_e:
Renderer.OptionEvents = !Renderer.OptionEvents;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_c:
CpuAutomaticMode = !CpuAutomaticMode;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_i:
Renderer.OptionInterface = !Renderer.OptionInterface;
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_m:
SoundManager.Mute = !SoundManager.Mute;
break;
case SDL.SDL_Keycode.SDLK_PLUS:
case SDL.SDL_Keycode.SDLK_KP_PLUS:
if (!JumpToPositionEnabled)
{
JumpToPositionEnabled = true;
JumpToPositionValue = "+";
CpuReducedMode = false;
}
break;
case SDL.SDL_Keycode.SDLK_MINUS:
case SDL.SDL_Keycode.SDLK_KP_MINUS:
if (!JumpToPositionEnabled)
{
JumpToPositionEnabled = true;
JumpToPositionValue = "-";
CpuReducedMode = false;
}
break;
case SDL.SDL_Keycode.SDLK_0:
case SDL.SDL_Keycode.SDLK_1:
case SDL.SDL_Keycode.SDLK_2:
case SDL.SDL_Keycode.SDLK_3:
case SDL.SDL_Keycode.SDLK_4:
case SDL.SDL_Keycode.SDLK_5:
case SDL.SDL_Keycode.SDLK_6:
case SDL.SDL_Keycode.SDLK_7:
case SDL.SDL_Keycode.SDLK_8:
case SDL.SDL_Keycode.SDLK_9:
if (!JumpToPositionEnabled)
{
JumpToPositionEnabled = true;
JumpToPositionValue = string.Empty;
}
JumpToPositionValue += char.ConvertFromUtf32(48 + Event.key.keysym.sym - SDL.SDL_Keycode.SDLK_0);
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_PERIOD:
if (!JumpToPositionEnabled)
{
JumpToPositionEnabled = true;
JumpToPositionValue = "0.";
}
else if (JumpToPositionValue.IndexOf('.') == -1)
{
JumpToPositionValue += ".";
}
CpuReducedMode = false;
break;
case SDL.SDL_Keycode.SDLK_BACKSPACE:
if (JumpToPositionEnabled && JumpToPositionValue.Length != 0)
{
JumpToPositionValue = JumpToPositionValue.Substring(0, JumpToPositionValue.Length - 1);
CpuReducedMode = false;
}
break;
case SDL.SDL_Keycode.SDLK_RETURN:
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 (direction != 0)
{
value = World.CameraTrackFollower.TrackPosition + (double)direction * value;
}
TrackManager.UpdateTrackFollower(ref World.CameraTrackFollower, value, true, false);
World.CameraCurrentAlignment.TrackPosition = value;
World.UpdateAbsoluteCamera(0.0);
World.UpdateViewingDistances();
}
}
JumpToPositionEnabled = false;
CpuReducedMode = false;
}
break;
case SDL.SDL_Keycode.SDLK_ESCAPE:
JumpToPositionEnabled = false;
CpuReducedMode = false;
break;
}
break;
// key up
case SDL.SDL_EventType.SDL_KEYUP:
switch (Event.key.keysym.sym)
{
case SDL.SDL_Keycode.SDLK_LSHIFT:
case SDL.SDL_Keycode.SDLK_RSHIFT:
ShiftPressed = false;
break;
case SDL.SDL_Keycode.SDLK_LCTRL:
case SDL.SDL_Keycode.SDLK_RCTRL:
ControlPressed = false;
break;
case SDL.SDL_Keycode.SDLK_LALT:
case SDL.SDL_Keycode.SDLK_RALT:
AltPressed = false;
break;
case SDL.SDL_Keycode.SDLK_a:
case SDL.SDL_Keycode.SDLK_KP_4:
case SDL.SDL_Keycode.SDLK_d:
case SDL.SDL_Keycode.SDLK_KP_6:
World.CameraAlignmentDirection.Position.X = 0.0;
break;
case SDL.SDL_Keycode.SDLK_KP_2:
case SDL.SDL_Keycode.SDLK_KP_8:
World.CameraAlignmentDirection.Position.Y = 0.0;
break;
case SDL.SDL_Keycode.SDLK_w:
case SDL.SDL_Keycode.SDLK_KP_9:
case SDL.SDL_Keycode.SDLK_s:
case SDL.SDL_Keycode.SDLK_KP_3:
World.CameraAlignmentDirection.TrackPosition = 0.0;
break;
case SDL.SDL_Keycode.SDLK_LEFT:
case SDL.SDL_Keycode.SDLK_RIGHT:
World.CameraAlignmentDirection.Yaw = 0.0;
break;
case SDL.SDL_Keycode.SDLK_UP:
case SDL.SDL_Keycode.SDLK_DOWN:
World.CameraAlignmentDirection.Pitch = 0.0;
break;
case SDL.SDL_Keycode.SDLK_KP_DIVIDE:
case SDL.SDL_Keycode.SDLK_KP_MULTIPLY:
World.CameraAlignmentDirection.Roll = 0.0;
break;
case SDL.SDL_Keycode.SDLK_KP_0:
case SDL.SDL_Keycode.SDLK_KP_PERIOD:
World.CameraAlignmentDirection.Zoom = 0.0;
break;
}
break;
}
}
}