OpenBve.Game.ApplyPointOfInterest C# (CSharp) Method

ApplyPointOfInterest() static private method

static private ApplyPointOfInterest ( int Value, bool Relative ) : bool
Value int
Relative bool
return bool
		internal static bool ApplyPointOfInterest(int Value, bool Relative) {
			double t = 0.0;
			int j = -1;
			if (Relative) {
				// relative
				if (Value < 0) {
					// previous poi
					t = double.NegativeInfinity;
					for (int i = 0; i < PointsOfInterest.Length; i++) {
						if (PointsOfInterest[i].TrackPosition < World.CameraTrackFollower.TrackPosition) {
							if (PointsOfInterest[i].TrackPosition > t) {
								t = PointsOfInterest[i].TrackPosition;
								j = i;
							}
						}
					}
				} else if (Value > 0) {
					// next poi
					t = double.PositiveInfinity;
					for (int i = 0; i < PointsOfInterest.Length; i++) {
						if (PointsOfInterest[i].TrackPosition > World.CameraTrackFollower.TrackPosition) {
							if (PointsOfInterest[i].TrackPosition < t) {
								t = PointsOfInterest[i].TrackPosition;
								j = i;
							}
						}
					}
				}
			} else {
				// absolute
				j = Value >= 0 & Value < PointsOfInterest.Length ? Value : -1;
			}
			// process poi
			if (j >= 0) {
				TrackManager.UpdateTrackFollower(ref World.CameraTrackFollower, t, true, false);
				World.CameraCurrentAlignment.Position = PointsOfInterest[j].TrackOffset;
				World.CameraCurrentAlignment.Yaw = PointsOfInterest[j].TrackYaw;
				World.CameraCurrentAlignment.Pitch = PointsOfInterest[j].TrackPitch;
				World.CameraCurrentAlignment.Roll = PointsOfInterest[j].TrackRoll;
				World.CameraCurrentAlignment.TrackPosition = t;
				World.UpdateAbsoluteCamera(0.0);
				return true;
			} else {
				return false;
			}
		}

Usage Example

示例#1
0
        // 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;
                }
            }
        }
All Usage Examples Of OpenBve.Game::ApplyPointOfInterest