/* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #pragma once #include "applicationmode.h" #include "driverkeyboardinput.h" #include "drivermouseinput.h" #include "gamepadinput.h" #include "Console.h" #include "Camera.h" #include "Classes.h" #ifdef WITH_UART #include "uart.h" #endif #ifdef WITH_ZMQ #include "zmq_input.h" #endif class driver_mode : public application_mode { public: // constructors driver_mode(); // methods // initializes internal data structures of the mode. returns: true on success, false otherwise bool init() override; // mode-specific update of simulation data. returns: false on error, true otherwise bool update() override; // maintenance method, called when the mode is activated void enter() override; // maintenance method, called when the mode is deactivated void exit() override; // input handlers void on_key( int Key, int Scancode, int Action, int Mods ) override; void on_cursor_pos( double Horizontal, double Vertical ) override; void on_mouse_button( int Button, int Action, int Mods ) override; void on_scroll( double Xoffset, double Yoffset ) override; void on_window_resize( int w, int h ) override { ; } void on_event_poll() override; bool is_command_processor() const override; private: // types enum view { consistfront, consistrear, bogie, driveby, count_ }; struct view_config { TDynamicObject const *owner { nullptr }; Math3D::vector3 offset {}; Math3D::vector3 angle {}; }; struct drivermode_input { gamepad_input gamepad; drivermouse_input mouse; glm::dvec2 mouse_pickmodepos; // stores last mouse position in control picking mode driverkeyboard_input keyboard; #ifdef _WIN32 Console console; #endif #ifdef WITH_UART std::unique_ptr uart; #endif #ifdef WITH_ZMQ std::unique_ptr zmq; #endif std::unique_ptr telemetry; bool init(); void poll(); std::string binding_hints( std::pair const &Commands ) const; std::pair command_fallback( user_command const Command ) const; }; // methods void update_camera( const double Deltatime ); // handles vehicle change flag void OnKeyDown( int cKey ); void InOutKey(); void CabView(); void ExternalView(); void DistantView( bool const Near = false ); void set_picking( bool const Picking ); // members drivermode_input m_input; std::array KeyEvents { nullptr }; // eventy wyzwalane z klawiaury TCamera Camera; TCamera DebugCamera; int m_externalviewmode { view::consistfront }; // selected external view mode bool m_externalview { true }; std::array m_externalviewconfigs; TDynamicObject *pDynamicNearest { nullptr }; // vehicle nearest to the active camera. TODO: move to camera double fTime50Hz { 0.0 }; // bufor czasu dla komunikacji z PoKeys double const m_primaryupdaterate { 1.0 / 100.0 }; double const m_secondaryupdaterate { 1.0 / 50.0 }; double m_primaryupdateaccumulator { m_secondaryupdaterate }; // keeps track of elapsed simulation time, for core fixed step routines double m_secondaryupdateaccumulator { m_secondaryupdaterate }; // keeps track of elapsed simulation time, for less important fixed step routines int iPause { 0 }; // wykrywanie zmian w zapauzowaniu command_relay m_relay; std::string change_train; // train name awaiting entering };