mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 15:09:19 +02:00
build 180404. optional scenario clock sync with current local time, keyboard input for the ui layer
This commit is contained in:
4
DynObj.h
4
DynObj.h
@@ -518,7 +518,7 @@ private:
|
|||||||
return mMatrix.readArray(); };
|
return mMatrix.readArray(); };
|
||||||
inline double * Matrix() {
|
inline double * Matrix() {
|
||||||
return mMatrix.getArray(); };
|
return mMatrix.getArray(); };
|
||||||
inline double GetVelocity() {
|
inline double GetVelocity() const {
|
||||||
return MoverParameters->Vel; };
|
return MoverParameters->Vel; };
|
||||||
inline double GetLength() const {
|
inline double GetLength() const {
|
||||||
return MoverParameters->Dim.L; };
|
return MoverParameters->Dim.L; };
|
||||||
@@ -561,7 +561,7 @@ private:
|
|||||||
float GetEPP(); // wyliczanie sredniego cisnienia w PG
|
float GetEPP(); // wyliczanie sredniego cisnienia w PG
|
||||||
int DirectionSet(int d); // ustawienie kierunku w składzie
|
int DirectionSet(int d); // ustawienie kierunku w składzie
|
||||||
// odczyt kierunku w składzie
|
// odczyt kierunku w składzie
|
||||||
int DirectionGet() {
|
int DirectionGet() const {
|
||||||
return iDirection + iDirection - 1; };
|
return iDirection + iDirection - 1; };
|
||||||
int DettachStatus(int dir);
|
int DettachStatus(int dir);
|
||||||
int Dettach(int dir);
|
int Dettach(int dir);
|
||||||
|
|||||||
7
EU07.cpp
7
EU07.cpp
@@ -148,11 +148,14 @@ void mouse_button_callback( GLFWwindow* window, int button, int action, int mods
|
|||||||
|
|
||||||
void key_callback( GLFWwindow *window, int key, int scancode, int action, int mods ) {
|
void key_callback( GLFWwindow *window, int key, int scancode, int action, int mods ) {
|
||||||
|
|
||||||
input::Keyboard.key( key, action );
|
|
||||||
|
|
||||||
Global.shiftState = ( mods & GLFW_MOD_SHIFT ) ? true : false;
|
Global.shiftState = ( mods & GLFW_MOD_SHIFT ) ? true : false;
|
||||||
Global.ctrlState = ( mods & GLFW_MOD_CONTROL ) ? true : false;
|
Global.ctrlState = ( mods & GLFW_MOD_CONTROL ) ? true : false;
|
||||||
|
|
||||||
|
// give the ui first shot at the input processing...
|
||||||
|
if( true == UILayer.on_key( key, action ) ) { return; }
|
||||||
|
// ...if the input is left untouched, pass it on
|
||||||
|
input::Keyboard.key( key, action );
|
||||||
|
|
||||||
if( ( true == Global.InputMouse )
|
if( ( true == Global.InputMouse )
|
||||||
&& ( ( key == GLFW_KEY_LEFT_ALT )
|
&& ( ( key == GLFW_KEY_LEFT_ALT )
|
||||||
|| ( key == GLFW_KEY_RIGHT_ALT ) ) ) {
|
|| ( key == GLFW_KEY_RIGHT_ALT ) ) ) {
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ bool TEventLauncher::Load(cParser *parser)
|
|||||||
auto const timeoffset { static_cast<int>( Global.ScenarioTimeOffset * 60 ) };
|
auto const timeoffset { static_cast<int>( Global.ScenarioTimeOffset * 60 ) };
|
||||||
if( timeoffset != 0 ) {
|
if( timeoffset != 0 ) {
|
||||||
auto const adjustedtime { clamp_circular( iHour * 60 + iMinute + timeoffset, 24 * 60 ) };
|
auto const adjustedtime { clamp_circular( iHour * 60 + iMinute + timeoffset, 24 * 60 ) };
|
||||||
iHour = ( adjustedtime / 60 ) % 60;
|
iHour = ( adjustedtime / 60 ) % 24;
|
||||||
iMinute = adjustedtime % 60;
|
iMinute = adjustedtime % 60;
|
||||||
}
|
}
|
||||||
WriteLog(
|
WriteLog(
|
||||||
|
|||||||
@@ -313,6 +313,11 @@ global_settings::ConfigParse(cParser &Parser) {
|
|||||||
Parser.getTokens( 1, false );
|
Parser.getTokens( 1, false );
|
||||||
Parser >> ScenarioTimeOffset;
|
Parser >> ScenarioTimeOffset;
|
||||||
}
|
}
|
||||||
|
else if( token == "scenario.time.current" ) {
|
||||||
|
// sync simulation time with local clock
|
||||||
|
Parser.getTokens( 1, false );
|
||||||
|
Parser >> ScenarioTimeCurrent;
|
||||||
|
}
|
||||||
else if( token == "scalespeculars" ) {
|
else if( token == "scalespeculars" ) {
|
||||||
// whether strength of specular highlights should be adjusted (generally needed for legacy 3d models)
|
// whether strength of specular highlights should be adjusted (generally needed for legacy 3d models)
|
||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ struct global_settings {
|
|||||||
double fTimeSpeed{ 1.0 }; // przyspieszenie czasu, zmienna do testów
|
double fTimeSpeed{ 1.0 }; // przyspieszenie czasu, zmienna do testów
|
||||||
double fLatitudeDeg{ 52.0 }; // szerokość geograficzna
|
double fLatitudeDeg{ 52.0 }; // szerokość geograficzna
|
||||||
float ScenarioTimeOffset { 0.f }; // time shift (in hours) applied to train timetables
|
float ScenarioTimeOffset { 0.f }; // time shift (in hours) applied to train timetables
|
||||||
|
bool ScenarioTimeCurrent { false }; // automatic time shift to match scenario time with local clock
|
||||||
bool bInactivePause{ true }; // automatyczna pauza, gdy okno nieaktywne
|
bool bInactivePause{ true }; // automatyczna pauza, gdy okno nieaktywne
|
||||||
int iSlowMotionMask{ -1 }; // maska wyłączanych właściwości
|
int iSlowMotionMask{ -1 }; // maska wyłączanych właściwości
|
||||||
bool bHideConsole{ false }; // hunter-271211: ukrywanie konsoli
|
bool bHideConsole{ false }; // hunter-271211: ukrywanie konsoli
|
||||||
|
|||||||
808
World.cpp
808
World.cpp
@@ -30,17 +30,9 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "Console.h"
|
#include "Console.h"
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
#include "uilayer.h"
|
#include "uilayer.h"
|
||||||
#include "uitranscripts.h"
|
|
||||||
#include "translation.h"
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
TDynamicObject *Controlled = NULL; // pojazd, który prowadzimy
|
|
||||||
|
|
||||||
std::shared_ptr<ui_panel> UIHeader = std::make_shared<ui_panel>( 20, 20 ); // header ui panel
|
|
||||||
std::shared_ptr<ui_panel> UITable = std::make_shared<ui_panel>( 20, 100 ); // schedule or scan table
|
|
||||||
std::shared_ptr<ui_panel> UITranscripts = std::make_shared<ui_panel>( 85, 600 ); // voice transcripts
|
|
||||||
|
|
||||||
namespace simulation {
|
namespace simulation {
|
||||||
|
|
||||||
simulation_time Time;
|
simulation_time Time;
|
||||||
@@ -63,7 +55,7 @@ simulation_time::init() {
|
|||||||
|
|
||||||
// potentially adjust scenario clock
|
// potentially adjust scenario clock
|
||||||
auto const requestedtime { clamp_circular<int>( m_time.wHour * 60 + m_time.wMinute + Global.ScenarioTimeOffset * 60, 24 * 60 ) };
|
auto const requestedtime { clamp_circular<int>( m_time.wHour * 60 + m_time.wMinute + Global.ScenarioTimeOffset * 60, 24 * 60 ) };
|
||||||
auto const requestedhour { ( requestedtime / 60 ) % 60 };
|
auto const requestedhour { ( requestedtime / 60 ) % 24 };
|
||||||
auto const requestedminute { requestedtime % 60 };
|
auto const requestedminute { requestedtime % 60 };
|
||||||
// cache requested elements, if any
|
// cache requested elements, if any
|
||||||
::GetLocalTime( &m_time );
|
::GetLocalTime( &m_time );
|
||||||
@@ -190,7 +182,6 @@ TWorld::TWorld()
|
|||||||
for (int i = 0; i < 10; ++i)
|
for (int i = 0; i < 10; ++i)
|
||||||
KeyEvents[i] = NULL; // eventy wyzwalane klawiszami cyfrowymi
|
KeyEvents[i] = NULL; // eventy wyzwalane klawiszami cyfrowymi
|
||||||
Global.iSlowMotion = 0;
|
Global.iSlowMotion = 0;
|
||||||
pDynamicNearest = NULL;
|
|
||||||
fTimeBuffer = 0.0; // bufor czasu aktualizacji dla stałego kroku fizyki
|
fTimeBuffer = 0.0; // bufor czasu aktualizacji dla stałego kroku fizyki
|
||||||
fMaxDt = 0.01; //[s] początkowy krok czasowy fizyki
|
fMaxDt = 0.01; //[s] początkowy krok czasowy fizyki
|
||||||
fTime50Hz = 0.0; // bufor czasu dla komunikacji z PoKeys
|
fTime50Hz = 0.0; // bufor czasu dla komunikacji z PoKeys
|
||||||
@@ -307,29 +298,13 @@ bool TWorld::Init( GLFWwindow *Window ) {
|
|||||||
WriteLog( "Load time: " +
|
WriteLog( "Load time: " +
|
||||||
std::to_string( std::chrono::duration_cast<std::chrono::seconds>(( std::chrono::system_clock::now() - timestart )).count() )
|
std::to_string( std::chrono::duration_cast<std::chrono::seconds>(( std::chrono::system_clock::now() - timestart )).count() )
|
||||||
+ " seconds");
|
+ " seconds");
|
||||||
/*
|
|
||||||
if (DebugModeFlag) // w Debugmode automatyczne włączenie AI
|
|
||||||
if (Train)
|
|
||||||
if (Train->Dynamic()->Mechanik)
|
|
||||||
Train->Dynamic()->Mechanik->TakeControl(true);
|
|
||||||
*/
|
|
||||||
UILayer.set_progress();
|
UILayer.set_progress();
|
||||||
UILayer.set_progress( "" );
|
UILayer.set_progress( "" );
|
||||||
UILayer.set_background( "" );
|
UILayer.set_background( "" );
|
||||||
UILayer.clear_texts();
|
|
||||||
|
|
||||||
Timer::ResetTimers();
|
Timer::ResetTimers();
|
||||||
|
|
||||||
// make 4 empty lines for the ui header, to cut down on work down the road
|
|
||||||
UIHeader->text_lines.emplace_back( "", Global.UITextColor );
|
|
||||||
UIHeader->text_lines.emplace_back( "", Global.UITextColor );
|
|
||||||
UIHeader->text_lines.emplace_back( "", Global.UITextColor );
|
|
||||||
UIHeader->text_lines.emplace_back( "", Global.UITextColor );
|
|
||||||
// bind the panels with ui object. maybe not the best place for this but, eh
|
|
||||||
UILayer.push_back( UIHeader );
|
|
||||||
UILayer.push_back( UITable );
|
|
||||||
UILayer.push_back( UITranscripts );
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -427,60 +402,23 @@ void TWorld::OnKeyDown(int cKey) {
|
|||||||
else if( ( cKey >= GLFW_KEY_F1 ) && ( cKey <= GLFW_KEY_F12 ) )
|
else if( ( cKey >= GLFW_KEY_F1 ) && ( cKey <= GLFW_KEY_F12 ) )
|
||||||
{
|
{
|
||||||
switch (cKey) {
|
switch (cKey) {
|
||||||
|
|
||||||
case GLFW_KEY_F1: {
|
case GLFW_KEY_F1: {
|
||||||
|
|
||||||
if( DebugModeFlag ) {
|
if( DebugModeFlag ) {
|
||||||
// additional time speedup keys in debug mode
|
// additional simulation clock jump keys in debug mode
|
||||||
if( Global.ctrlState ) {
|
if( Global.ctrlState ) {
|
||||||
// ctrl-f3
|
// ctrl-f1
|
||||||
simulation::Time.update( 20.0 * 60.0 );
|
simulation::Time.update( 20.0 * 60.0 );
|
||||||
}
|
}
|
||||||
else if( Global.shiftState ) {
|
else if( Global.shiftState ) {
|
||||||
// shift-f3
|
// shift-f1
|
||||||
simulation::Time.update( 5.0 * 60.0 );
|
simulation::Time.update( 5.0 * 60.0 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( ( false == Global.ctrlState )
|
|
||||||
&& ( false == Global.shiftState ) ) {
|
|
||||||
// czas i relacja
|
|
||||||
if( Global.iTextMode == cKey ) { ++Global.iScreenMode[ cKey - GLFW_KEY_F1 ]; }
|
|
||||||
if( Global.iScreenMode[ cKey - GLFW_KEY_F1 ] > 1 ) {
|
|
||||||
// wyłączenie napisów
|
|
||||||
Global.iTextMode = 0;
|
|
||||||
Global.iScreenMode[ cKey - GLFW_KEY_F1 ] = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Global.iTextMode = cKey;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GLFW_KEY_F2: {
|
|
||||||
// parametry pojazdu
|
|
||||||
if( Global.iTextMode == cKey ) { ++Global.iScreenMode[ cKey - GLFW_KEY_F1 ]; }
|
|
||||||
if( Global.iScreenMode[ cKey - GLFW_KEY_F1 ] > 1 ) {
|
|
||||||
// wyłączenie napisów
|
|
||||||
Global.iTextMode = 0;
|
|
||||||
Global.iScreenMode[ cKey - GLFW_KEY_F1 ] = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Global.iTextMode = cKey;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GLFW_KEY_F3: {
|
|
||||||
// timetable
|
|
||||||
if( Global.iTextMode == cKey ) { ++Global.iScreenMode[ cKey - GLFW_KEY_F1 ]; }
|
|
||||||
if( Global.iScreenMode[ cKey - GLFW_KEY_F1 ] > 1 ) {
|
|
||||||
// wyłączenie napisów
|
|
||||||
Global.iTextMode = 0;
|
|
||||||
Global.iScreenMode[ cKey - GLFW_KEY_F1 ] = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Global.iTextMode = cKey;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case GLFW_KEY_F4: {
|
case GLFW_KEY_F4: {
|
||||||
|
|
||||||
InOutKey( !Global.shiftState ); // distant view with Shift, short distance step out otherwise
|
InOutKey( !Global.shiftState ); // distant view with Shift, short distance step out otherwise
|
||||||
@@ -510,27 +448,27 @@ void TWorld::OnKeyDown(int cKey) {
|
|||||||
if( Train == nullptr )
|
if( Train == nullptr )
|
||||||
Train = new TTrain(); // jeśli niczym jeszcze nie jeździlismy
|
Train = new TTrain(); // jeśli niczym jeszcze nie jeździlismy
|
||||||
if( Train->Init( Controlled ) ) { // przejmujemy sterowanie
|
if( Train->Init( Controlled ) ) { // przejmujemy sterowanie
|
||||||
if( !DebugModeFlag ) // w DebugMode nadal prowadzi AI
|
if( !DebugModeFlag ) {
|
||||||
|
// w DebugMode nadal prowadzi AI
|
||||||
Controlled->Mechanik->TakeControl( false );
|
Controlled->Mechanik->TakeControl( false );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
SafeDelete( Train ); // i nie ma czym sterować
|
SafeDelete( Train ); // i nie ma czym sterować
|
||||||
// Global.pUserDynamic=Controlled; //renerowanie pojazdu względem kabiny
|
}
|
||||||
// Global.iTextMode=VK_F4;
|
if( Train ) {
|
||||||
if( Train )
|
|
||||||
InOutKey(); // do kabiny
|
InOutKey(); // do kabiny
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Global.iTextMode = cKey;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GLFW_KEY_F6: {
|
case GLFW_KEY_F6: {
|
||||||
// Global.iTextMode = cKey;
|
|
||||||
// przyspieszenie symulacji do testowania scenerii... uwaga na FPS!
|
// przyspieszenie symulacji do testowania scenerii... uwaga na FPS!
|
||||||
if( DebugModeFlag ) {
|
if( DebugModeFlag ) {
|
||||||
|
|
||||||
if( Global.ctrlState ) { Global.fTimeSpeed = ( Global.shiftState ? 60.0 : 20.0 ); }
|
if( Global.ctrlState ) { Global.fTimeSpeed = ( Global.shiftState ? 60.0 : 20.0 ); }
|
||||||
else { Global.fTimeSpeed = ( Global.shiftState ? 5.0 : 1.0 ); }
|
else { Global.fTimeSpeed = ( Global.shiftState ? 5.0 : 1.0 ); }
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -538,13 +476,22 @@ void TWorld::OnKeyDown(int cKey) {
|
|||||||
// debug mode functions
|
// debug mode functions
|
||||||
if( DebugModeFlag ) {
|
if( DebugModeFlag ) {
|
||||||
|
|
||||||
if( Global.ctrlState ) {
|
if( Global.ctrlState
|
||||||
|
&& Global.shiftState ) {
|
||||||
|
// shift + ctrl + f7 toggles between debug and regular camera
|
||||||
|
DebugCameraFlag = !DebugCameraFlag;
|
||||||
|
}
|
||||||
|
else if( Global.ctrlState ) {
|
||||||
// ctrl + f7 toggles static daylight
|
// ctrl + f7 toggles static daylight
|
||||||
ToggleDaylight();
|
ToggleDaylight();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else if( Global.shiftState ) {
|
||||||
|
// shift + f7 is currently unused
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
// f7: wireframe toggle
|
// f7: wireframe toggle
|
||||||
|
// TODO: pass this to renderer instead of making direct calls
|
||||||
Global.bWireFrame = !Global.bWireFrame;
|
Global.bWireFrame = !Global.bWireFrame;
|
||||||
if( true == Global.bWireFrame ) {
|
if( true == Global.bWireFrame ) {
|
||||||
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
|
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
|
||||||
@@ -556,55 +503,24 @@ void TWorld::OnKeyDown(int cKey) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GLFW_KEY_F8: {
|
case GLFW_KEY_F12: {
|
||||||
|
// quick debug mode toggle
|
||||||
if( Global.ctrlState
|
if( Global.ctrlState
|
||||||
&& Global.shiftState ) {
|
&& Global.shiftState ) {
|
||||||
DebugCameraFlag = !DebugCameraFlag; // taka opcjonalna funkcja, może się czasem przydać
|
DebugModeFlag = !DebugModeFlag;
|
||||||
}
|
|
||||||
else {
|
|
||||||
Global.iTextMode = cKey;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GLFW_KEY_F9: {
|
|
||||||
Global.iTextMode = cKey;
|
default: {
|
||||||
// wersja
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GLFW_KEY_F10: {
|
|
||||||
if( Global.iTextMode == cKey ) {
|
|
||||||
Global.iTextMode =
|
|
||||||
( Global.iPause && ( cKey != GLFW_KEY_F1 ) ?
|
|
||||||
GLFW_KEY_F1 :
|
|
||||||
0 ); // wyłączenie napisów, chyba że pauza
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Global.iTextMode = cKey;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GLFW_KEY_F12: {
|
|
||||||
// coś tam jeszcze
|
|
||||||
if( Global.ctrlState
|
|
||||||
&& Global.shiftState )
|
|
||||||
DebugModeFlag = !DebugModeFlag; // taka opcjonalna funkcja, może się czasem przydać
|
|
||||||
else
|
|
||||||
Global.iTextMode = cKey;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if (cKey!=VK_F4)
|
// if (cKey!=VK_F4)
|
||||||
return; // nie są przekazywane do pojazdu wcale
|
return; // nie są przekazywane do pojazdu wcale
|
||||||
}
|
}
|
||||||
if( Global.iTextMode == GLFW_KEY_F10 ) // wyświetlone napisy klawiszem F10
|
|
||||||
{ // i potwierdzenie
|
if ((Global.iTextMode == GLFW_KEY_F12) ? (cKey >= '0') && (cKey <= '9') : false)
|
||||||
if( cKey == GLFW_KEY_Y ) {
|
|
||||||
// flaga wyjścia z programu
|
|
||||||
glfwSetWindowShouldClose( window, 1 );
|
|
||||||
}
|
|
||||||
return; // nie przekazujemy do pociągu
|
|
||||||
}
|
|
||||||
else if ((Global.iTextMode == GLFW_KEY_F12) ? (cKey >= '0') && (cKey <= '9') : false)
|
|
||||||
{ // tryb konfiguracji debugmode (przestawianie kamery już wyłączone
|
{ // tryb konfiguracji debugmode (przestawianie kamery już wyłączone
|
||||||
if (!Global.shiftState) // bez [Shift]
|
if (!Global.shiftState) // bez [Shift]
|
||||||
{
|
{
|
||||||
@@ -951,7 +867,7 @@ bool TWorld::Update() {
|
|||||||
fTime50Hz += dt; // w pauzie też trzeba zliczać czas, bo przy dużym FPS będzie problem z odczytem ramek
|
fTime50Hz += dt; // w pauzie też trzeba zliczać czas, bo przy dużym FPS będzie problem z odczytem ramek
|
||||||
while( fTime50Hz >= 1.0 / 50.0 ) {
|
while( fTime50Hz >= 1.0 / 50.0 ) {
|
||||||
Console::Update(); // to i tak trzeba wywoływać
|
Console::Update(); // to i tak trzeba wywoływać
|
||||||
Update_UI();
|
UILayer.update();
|
||||||
// decelerate camera
|
// decelerate camera
|
||||||
Camera.Velocity *= 0.65;
|
Camera.Velocity *= 0.65;
|
||||||
if( std::abs( Camera.Velocity.x ) < 0.01 ) { Camera.Velocity.x = 0.0; }
|
if( std::abs( Camera.Velocity.x ) < 0.01 ) { Camera.Velocity.x = 0.0; }
|
||||||
@@ -1115,662 +1031,6 @@ void TWorld::ResourceSweep()
|
|||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
|
||||||
TWorld::Update_UI() {
|
|
||||||
|
|
||||||
UITable->text_lines.clear();
|
|
||||||
std::string uitextline1, uitextline2, uitextline3, uitextline4;
|
|
||||||
UILayer.set_tooltip( "" );
|
|
||||||
|
|
||||||
if( ( Train != nullptr ) && ( false == FreeFlyModeFlag ) ) {
|
|
||||||
if( false == DebugModeFlag ) {
|
|
||||||
// in regular mode show control functions, for defined controls
|
|
||||||
UILayer.set_tooltip( locale::label_cab_control( Train->GetLabel( GfxRenderer.Pick_Control() ) ) );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// in debug mode show names of submodels, to help with cab setup and/or debugging
|
|
||||||
auto const cabcontrol = GfxRenderer.Pick_Control();
|
|
||||||
UILayer.set_tooltip( ( cabcontrol ? cabcontrol->pName : "" ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( ( true == Global.ControlPicking ) && ( true == FreeFlyModeFlag ) && ( true == DebugModeFlag ) ) {
|
|
||||||
auto const scenerynode = GfxRenderer.Pick_Node();
|
|
||||||
UILayer.set_tooltip(
|
|
||||||
( scenerynode ?
|
|
||||||
scenerynode->name() :
|
|
||||||
"" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
switch( Global.iTextMode ) {
|
|
||||||
|
|
||||||
case( GLFW_KEY_F1 ) : {
|
|
||||||
// f1, default mode: current time and timetable excerpt
|
|
||||||
auto const &time = simulation::Time.data();
|
|
||||||
uitextline1 =
|
|
||||||
"Time: "
|
|
||||||
+ to_string( time.wHour ) + ":"
|
|
||||||
+ ( time.wMinute < 10 ? "0" : "" ) + to_string( time.wMinute ) + ":"
|
|
||||||
+ ( time.wSecond < 10 ? "0" : "" ) + to_string( time.wSecond );
|
|
||||||
if( Global.iPause ) {
|
|
||||||
uitextline1 += " (paused)";
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ( Controlled != nullptr )
|
|
||||||
&& ( Controlled->Mechanik != nullptr ) ) {
|
|
||||||
|
|
||||||
auto const &mover = Controlled->MoverParameters;
|
|
||||||
auto const &driver = Controlled->Mechanik;
|
|
||||||
|
|
||||||
uitextline2 = "Throttle: " + to_string( driver->Controlling()->MainCtrlPos, 0, 2 ) + "+" + std::to_string( driver->Controlling()->ScndCtrlPos );
|
|
||||||
if( mover->ActiveDir > 0 ) { uitextline2 += " D"; }
|
|
||||||
else if( mover->ActiveDir < 0 ) { uitextline2 += " R"; }
|
|
||||||
else { uitextline2 += " N"; }
|
|
||||||
|
|
||||||
uitextline3 = "Brakes:" + to_string( mover->fBrakeCtrlPos, 1, 5 ) + "+" + std::to_string( mover->LocalBrakePos ) + ( mover->SlippingWheels ? " !" : " " );
|
|
||||||
|
|
||||||
uitextline4 = (
|
|
||||||
true == TestFlag( mover->SecuritySystem.Status, s_aware ) ?
|
|
||||||
"!ALERTER! " :
|
|
||||||
" " );
|
|
||||||
uitextline4 += (
|
|
||||||
true == TestFlag( mover->SecuritySystem.Status, s_active ) ?
|
|
||||||
"!SHP! " :
|
|
||||||
" " );
|
|
||||||
|
|
||||||
if( Global.iScreenMode[ Global.iTextMode - GLFW_KEY_F1 ] == 1 ) {
|
|
||||||
// detail mode on second key press
|
|
||||||
uitextline2 +=
|
|
||||||
" Speed: " + std::to_string( static_cast<int>( std::floor( mover->Vel ) ) ) + " km/h"
|
|
||||||
+ " (limit: " + std::to_string( static_cast<int>( std::floor( driver->VelDesired ) ) ) + " km/h"
|
|
||||||
+ ", next limit: " + std::to_string( static_cast<int>( std::floor( Controlled->Mechanik->VelNext ) ) ) + " km/h"
|
|
||||||
+ " in " + to_string( Controlled->Mechanik->ActualProximityDist * 0.001, 1 ) + " km)";
|
|
||||||
uitextline3 +=
|
|
||||||
" Pressure: " + to_string( mover->BrakePress * 100.0, 2 ) + " kPa"
|
|
||||||
+ " (train pipe: " + to_string( mover->PipePress * 100.0, 2 ) + " kPa)";
|
|
||||||
|
|
||||||
auto const stoptime { static_cast<int>( -1.0 * Controlled->Mechanik->fStopTime ) };
|
|
||||||
if( stoptime > 0 ) {
|
|
||||||
uitextline4 += " Loading/unloading in progress (" + to_string( stoptime ) + ( stoptime > 1 ? " seconds" : " second" ) + " left)";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
auto const trackblockdistance{ std::abs( Controlled->Mechanik->TrackBlock() ) };
|
|
||||||
if( trackblockdistance <= 75.0 ) {
|
|
||||||
uitextline4 += " Another vehicle ahead (distance: " + to_string( trackblockdistance, 1 ) + " m)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case( GLFW_KEY_F2 ) : {
|
|
||||||
// timetable
|
|
||||||
auto *vehicle {
|
|
||||||
( FreeFlyModeFlag ?
|
|
||||||
std::get<TDynamicObject *>( simulation::Region->find_vehicle( Camera.Pos, 20, false, false ) ) :
|
|
||||||
Controlled ) }; // w trybie latania lokalizujemy wg mapy
|
|
||||||
|
|
||||||
if( vehicle == nullptr ) { break; }
|
|
||||||
// if the nearest located vehicle doesn't have a direct driver, try to query its owner
|
|
||||||
auto const owner = (
|
|
||||||
( ( vehicle->Mechanik != nullptr ) && ( vehicle->Mechanik->Primary() ) ) ?
|
|
||||||
vehicle->Mechanik :
|
|
||||||
vehicle->ctOwner );
|
|
||||||
if( owner == nullptr ){ break; }
|
|
||||||
|
|
||||||
auto const table = owner->Timetable();
|
|
||||||
if( table == nullptr ) { break; }
|
|
||||||
|
|
||||||
auto const &time = simulation::Time.data();
|
|
||||||
uitextline1 =
|
|
||||||
"Time: "
|
|
||||||
+ to_string( time.wHour ) + ":"
|
|
||||||
+ ( time.wMinute < 10 ? "0" : "" ) + to_string( time.wMinute ) + ":"
|
|
||||||
+ ( time.wSecond < 10 ? "0" : "" ) + to_string( time.wSecond );
|
|
||||||
if( Global.iPause ) {
|
|
||||||
uitextline1 += " (paused)";
|
|
||||||
}
|
|
||||||
|
|
||||||
uitextline2 = Bezogonkow( owner->Relation(), true ) + " (" + Bezogonkow( owner->Timetable()->TrainName, true ) + ")";
|
|
||||||
auto const nextstation = Bezogonkow( owner->NextStop(), true );
|
|
||||||
if( !nextstation.empty() ) {
|
|
||||||
// jeśli jest podana relacja, to dodajemy punkt następnego zatrzymania
|
|
||||||
uitextline3 = " -> " + nextstation;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Global.iScreenMode[ Global.iTextMode - GLFW_KEY_F1 ] == 1 ) {
|
|
||||||
|
|
||||||
if( 0 == table->StationCount ) {
|
|
||||||
// only bother if there's stations to list
|
|
||||||
UITable->text_lines.emplace_back( "(no timetable)", Global.UITextColor );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// header
|
|
||||||
UITable->text_lines.emplace_back( "+----------------------------+-------+-------+-----+", Global.UITextColor );
|
|
||||||
|
|
||||||
TMTableLine *tableline;
|
|
||||||
for( int i = owner->iStationStart; i <= std::min( owner->iStationStart + 15, table->StationCount ); ++i ) {
|
|
||||||
// wyświetlenie pozycji z rozkładu
|
|
||||||
tableline = table->TimeTable + i; // linijka rozkładu
|
|
||||||
|
|
||||||
std::string station =
|
|
||||||
( tableline->StationName + " " ).substr( 0, 26 );
|
|
||||||
std::string arrival =
|
|
||||||
( tableline->Ah >= 0 ?
|
|
||||||
to_string( int( 100 + tableline->Ah ) ).substr( 1, 2 ) + ":" + to_string( int( 100 + tableline->Am ) ).substr( 1, 2 ) :
|
|
||||||
" " );
|
|
||||||
std::string departure =
|
|
||||||
( tableline->Dh >= 0 ?
|
|
||||||
to_string( int( 100 + tableline->Dh ) ).substr( 1, 2 ) + ":" + to_string( int( 100 + tableline->Dm ) ).substr( 1, 2 ) :
|
|
||||||
" " );
|
|
||||||
std::string vmax =
|
|
||||||
" "
|
|
||||||
+ to_string( tableline->vmax, 0 );
|
|
||||||
vmax = vmax.substr( vmax.length() - 3, 3 ); // z wyrównaniem do prawej
|
|
||||||
|
|
||||||
UITable->text_lines.emplace_back(
|
|
||||||
Bezogonkow( "| " + station + " | " + arrival + " | " + departure + " | " + vmax + " | " + tableline->StationWare, true ),
|
|
||||||
( ( owner->iStationStart < table->StationIndex )
|
|
||||||
&& ( i < table->StationIndex )
|
|
||||||
&& ( ( time.wHour * 60 + time.wMinute ) >= ( tableline->Dh * 60 + tableline->Dm ) ) ?
|
|
||||||
glm::vec4( 0.0f, 1.0f, 0.0f, 1.0f ) :// czas minął i odjazd był, to nazwa stacji będzie na zielono
|
|
||||||
Global.UITextColor ) );
|
|
||||||
// divider/footer
|
|
||||||
UITable->text_lines.emplace_back( "+----------------------------+-------+-------+-----+", Global.UITextColor );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case( GLFW_KEY_F3 ) : {
|
|
||||||
|
|
||||||
auto *vehicle{
|
|
||||||
( FreeFlyModeFlag ?
|
|
||||||
std::get<TDynamicObject *>( simulation::Region->find_vehicle( Camera.Pos, 20, false, false ) ) :
|
|
||||||
Controlled ) }; // w trybie latania lokalizujemy wg mapy
|
|
||||||
|
|
||||||
if( vehicle != nullptr ) {
|
|
||||||
// jeśli domyślny ekran po pierwszym naciśnięciu
|
|
||||||
uitextline1 = "Vehicle name: " + vehicle->MoverParameters->Name;
|
|
||||||
|
|
||||||
if( ( vehicle->Mechanik == nullptr ) && ( vehicle->ctOwner ) ) {
|
|
||||||
// for cars other than leading unit indicate the leader
|
|
||||||
uitextline1 += ", owned by " + vehicle->ctOwner->OwnerName();
|
|
||||||
}
|
|
||||||
uitextline1 += "; Status: " + vehicle->MoverParameters->EngineDescription( 0 );
|
|
||||||
// informacja o sprzęgach
|
|
||||||
uitextline1 +=
|
|
||||||
"; C0:" +
|
|
||||||
( vehicle->PrevConnected ?
|
|
||||||
vehicle->PrevConnected->name() + ":" + to_string( vehicle->MoverParameters->Couplers[ 0 ].CouplingFlag ) + (
|
|
||||||
vehicle->MoverParameters->Couplers[ 0 ].CouplingFlag == 0 ?
|
|
||||||
" (" + to_string( vehicle->MoverParameters->Couplers[ 0 ].CoupleDist, 1 ) + " m)" :
|
|
||||||
"" ) :
|
|
||||||
"none" );
|
|
||||||
uitextline1 +=
|
|
||||||
" C1:" +
|
|
||||||
( vehicle->NextConnected ?
|
|
||||||
vehicle->NextConnected->name() + ":" + to_string( vehicle->MoverParameters->Couplers[ 1 ].CouplingFlag ) + (
|
|
||||||
vehicle->MoverParameters->Couplers[ 1 ].CouplingFlag == 0 ?
|
|
||||||
" (" + to_string( vehicle->MoverParameters->Couplers[ 1 ].CoupleDist, 1 ) + " m)" :
|
|
||||||
"" ) :
|
|
||||||
"none" );
|
|
||||||
|
|
||||||
// equipment flags
|
|
||||||
uitextline2 = ( vehicle->MoverParameters->Battery ? "B" : "." );
|
|
||||||
uitextline2 += ( vehicle->MoverParameters->Mains ? "M" : "." );
|
|
||||||
uitextline2 += ( vehicle->MoverParameters->PantRearUp ? ( vehicle->MoverParameters->PantRearVolt > 0.0 ? "O" : "o" ) : "." );;
|
|
||||||
uitextline2 += ( vehicle->MoverParameters->PantFrontUp ? ( vehicle->MoverParameters->PantFrontVolt > 0.0 ? "P" : "p" ) : "." );;
|
|
||||||
uitextline2 += ( vehicle->MoverParameters->PantPressLockActive ? "!" : ( vehicle->MoverParameters->PantPressSwitchActive ? "*" : "." ) );
|
|
||||||
uitextline2 += ( vehicle->MoverParameters->FuelPump.is_enabled ? ( vehicle->MoverParameters->FuelPump.is_active ? "F" : "f" ) : "." );;
|
|
||||||
uitextline2 += ( false == vehicle->MoverParameters->ConverterAllowLocal ? "-" : ( vehicle->MoverParameters->ConverterAllow ? ( vehicle->MoverParameters->ConverterFlag ? "X" : "x" ) : "." ) );
|
|
||||||
uitextline2 += ( vehicle->MoverParameters->ConvOvldFlag ? "!" : "." );
|
|
||||||
uitextline2 += ( false == vehicle->MoverParameters->CompressorAllowLocal ? "-" : ( ( vehicle->MoverParameters->CompressorAllow || vehicle->MoverParameters->CompressorPower > 1 ) ? ( vehicle->MoverParameters->CompressorFlag ? "C" : "c" ) : "." ) );
|
|
||||||
uitextline2 += ( vehicle->MoverParameters->CompressorGovernorLock ? "!" : "." );
|
|
||||||
|
|
||||||
auto const train { Global.pWorld->train() };
|
|
||||||
if( ( train != nullptr ) && ( train->Dynamic() == vehicle ) ) {
|
|
||||||
uitextline2 += " R: " + std::to_string( train->RadioChannel() );
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
uitextline2 +=
|
|
||||||
" AnlgB: " + to_string( tmp->MoverParameters->AnPos, 1 )
|
|
||||||
+ "+"
|
|
||||||
+ to_string( tmp->MoverParameters->LocalBrakePosA, 1 )
|
|
||||||
*/
|
|
||||||
uitextline2 += " Bdelay: ";
|
|
||||||
if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_G ) == bdelay_G )
|
|
||||||
uitextline2 += "G";
|
|
||||||
if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_P ) == bdelay_P )
|
|
||||||
uitextline2 += "P";
|
|
||||||
if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_R ) == bdelay_R )
|
|
||||||
uitextline2 += "R";
|
|
||||||
if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_M ) == bdelay_M )
|
|
||||||
uitextline2 += "+Mg";
|
|
||||||
|
|
||||||
uitextline2 += ", Load: " + to_string( vehicle->MoverParameters->Load, 0 ) + " (" + to_string( vehicle->MoverParameters->LoadFlag, 0 ) + ")";
|
|
||||||
|
|
||||||
uitextline2 +=
|
|
||||||
"; Pant: "
|
|
||||||
+ to_string( vehicle->MoverParameters->PantPress, 2 )
|
|
||||||
+ ( vehicle->MoverParameters->bPantKurek3 ? "-ZG" : "|ZG" );
|
|
||||||
|
|
||||||
uitextline2 +=
|
|
||||||
"; Ft: " + to_string(
|
|
||||||
vehicle->MoverParameters->Ft * 0.001f * (
|
|
||||||
vehicle->MoverParameters->ActiveCab ? vehicle->MoverParameters->ActiveCab :
|
|
||||||
vehicle->ctOwner ? vehicle->ctOwner->Controlling()->ActiveCab :
|
|
||||||
1 ), 1 )
|
|
||||||
+ ", Fb: " + to_string( vehicle->MoverParameters->Fb * 0.001f, 1 )
|
|
||||||
+ ", Fr: " + to_string( vehicle->MoverParameters->Adhesive( vehicle->MoverParameters->RunningTrack.friction ), 2 )
|
|
||||||
+ ( vehicle->MoverParameters->SlippingWheels ? " (!)" : "" );
|
|
||||||
|
|
||||||
if( vehicle->Mechanik ) {
|
|
||||||
uitextline2 += "; Ag: " + to_string( vehicle->Mechanik->fAccGravity, 2 );
|
|
||||||
}
|
|
||||||
|
|
||||||
uitextline2 +=
|
|
||||||
"; TC:"
|
|
||||||
+ to_string( vehicle->MoverParameters->TotalCurrent, 0 );
|
|
||||||
auto const frontcouplerhighvoltage =
|
|
||||||
to_string( vehicle->MoverParameters->Couplers[ side::front ].power_high.voltage, 0 )
|
|
||||||
+ "@"
|
|
||||||
+ to_string( vehicle->MoverParameters->Couplers[ side::front ].power_high.current, 0 );
|
|
||||||
auto const rearcouplerhighvoltage =
|
|
||||||
to_string( vehicle->MoverParameters->Couplers[ side::rear ].power_high.voltage, 0 )
|
|
||||||
+ "@"
|
|
||||||
+ to_string( vehicle->MoverParameters->Couplers[ side::rear ].power_high.current, 0 );
|
|
||||||
uitextline2 += ", HV: ";
|
|
||||||
if( vehicle->MoverParameters->Couplers[ side::front ].power_high.local == false ) {
|
|
||||||
uitextline2 +=
|
|
||||||
"(" + frontcouplerhighvoltage + ")-"
|
|
||||||
+ ":F" + ( vehicle->DirectionGet() ? "<<" : ">>" ) + "R:"
|
|
||||||
+ "-(" + rearcouplerhighvoltage + ")";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uitextline2 +=
|
|
||||||
frontcouplerhighvoltage
|
|
||||||
+ ":F" + ( vehicle->DirectionGet() ? "<<" : ">>" ) + "R:"
|
|
||||||
+ rearcouplerhighvoltage;
|
|
||||||
}
|
|
||||||
|
|
||||||
uitextline3 +=
|
|
||||||
"TrB: " + to_string( vehicle->MoverParameters->BrakePress, 2 )
|
|
||||||
+ ", " + to_hex_str( vehicle->MoverParameters->Hamulec->GetBrakeStatus(), 2 );
|
|
||||||
|
|
||||||
uitextline3 +=
|
|
||||||
"; LcB: " + to_string( vehicle->MoverParameters->LocBrakePress, 2 )
|
|
||||||
+ "; hat: " + to_string( vehicle->MoverParameters->BrakeCtrlPos2, 2 )
|
|
||||||
+ "; pipes: " + to_string( vehicle->MoverParameters->PipePress, 2 )
|
|
||||||
+ "/" + to_string( vehicle->MoverParameters->ScndPipePress, 2 )
|
|
||||||
+ "/" + to_string( vehicle->MoverParameters->EqvtPipePress, 2 )
|
|
||||||
+ ", MT: " + to_string( vehicle->MoverParameters->CompressedVolume, 3 )
|
|
||||||
+ ", BT: " + to_string( vehicle->MoverParameters->Volume, 3 )
|
|
||||||
+ ", CtlP: " + to_string( vehicle->MoverParameters->CntrlPipePress, 3 )
|
|
||||||
+ ", CtlT: " + to_string( vehicle->MoverParameters->Hamulec->GetCRP(), 3 );
|
|
||||||
|
|
||||||
if( vehicle->MoverParameters->ManualBrakePos > 0 ) {
|
|
||||||
|
|
||||||
uitextline3 += "; manual brake on";
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
if( tmp->MoverParameters->LocalBrakePos > 0 ) {
|
|
||||||
|
|
||||||
uitextline3 += ", local brake on";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
uitextline3 += ", local brake off";
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
if( vehicle->Mechanik ) {
|
|
||||||
// o ile jest ktoś w środku
|
|
||||||
std::string flags = "cpapcplhhndoiefgvdpseil "; // flagi AI (definicja w Driver.h)
|
|
||||||
for( int i = 0, j = 1; i < 23; ++i, j <<= 1 )
|
|
||||||
if( false == ( vehicle->Mechanik->DrivigFlags() & j ) ) // jak bit ustawiony
|
|
||||||
flags[ i ] = '.';// std::toupper( flags[ i ] ); // ^= 0x20; // to zmiana na wielką literę
|
|
||||||
|
|
||||||
uitextline4 = flags;
|
|
||||||
|
|
||||||
uitextline4 +=
|
|
||||||
"Driver: Vd=" + to_string( vehicle->Mechanik->VelDesired, 0 )
|
|
||||||
+ " Ad=" + to_string( vehicle->Mechanik->AccDesired, 2 )
|
|
||||||
+ " Ah=" + to_string( vehicle->Mechanik->fAccThreshold, 2 )
|
|
||||||
+ "@" + to_string( vehicle->Mechanik->fBrake_a0[ 0 ], 2 )
|
|
||||||
+ "+" + to_string( vehicle->Mechanik->fBrake_a1[ 0 ], 2 )
|
|
||||||
+ " Bd=" + to_string( vehicle->Mechanik->fBrakeDist, 0 )
|
|
||||||
+ " Pd=" + to_string( vehicle->Mechanik->ActualProximityDist, 0 )
|
|
||||||
+ " Vn=" + to_string( vehicle->Mechanik->VelNext, 0 )
|
|
||||||
+ " VSl=" + to_string( vehicle->Mechanik->VelSignalLast, 0 )
|
|
||||||
+ " VLl=" + to_string( vehicle->Mechanik->VelLimitLast, 0 )
|
|
||||||
+ " VRd=" + to_string( vehicle->Mechanik->VelRoad, 0 )
|
|
||||||
+ " VRst=" + to_string( vehicle->Mechanik->VelRestricted, 0 );
|
|
||||||
|
|
||||||
if( ( vehicle->Mechanik->VelNext == 0.0 )
|
|
||||||
&& ( vehicle->Mechanik->eSignNext ) ) {
|
|
||||||
// jeśli ma zapamiętany event semafora, nazwa eventu semafora
|
|
||||||
uitextline4 += " (" + Bezogonkow( vehicle->Mechanik->eSignNext->asName ) + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
// biezaca komenda dla AI
|
|
||||||
uitextline4 += ", command: " + vehicle->Mechanik->OrderCurrent();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Global.iScreenMode[ Global.iTextMode - GLFW_KEY_F1 ] == 1 ) {
|
|
||||||
// f2 screen, track scan mode
|
|
||||||
if( vehicle->Mechanik == nullptr ) {
|
|
||||||
//żeby była tabelka, musi być AI
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t i = 0; std::size_t const speedtablesize = clamp( static_cast<int>( vehicle->Mechanik->TableSize() ) - 1, 0, 30 );
|
|
||||||
do {
|
|
||||||
std::string scanline = vehicle->Mechanik->TableText( i );
|
|
||||||
if( scanline.empty() ) { break; }
|
|
||||||
UITable->text_lines.emplace_back( Bezogonkow( scanline ), Global.UITextColor );
|
|
||||||
++i;
|
|
||||||
} while( i < speedtablesize ); // TController:iSpeedTableSize TODO: change when the table gets recoded
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// wyświetlenie współrzędnych w scenerii oraz kąta kamery, gdy nie mamy wskaźnika
|
|
||||||
uitextline1 =
|
|
||||||
"Camera position: "
|
|
||||||
+ to_string( Camera.Pos.x, 2 ) + " "
|
|
||||||
+ to_string( Camera.Pos.y, 2 ) + " "
|
|
||||||
+ to_string( Camera.Pos.z, 2 )
|
|
||||||
+ ", azimuth: "
|
|
||||||
+ to_string( 180.0 - RadToDeg( Camera.Yaw ), 0 ) // ma być azymut, czyli 0 na północy i rośnie na wschód
|
|
||||||
+ " "
|
|
||||||
+ std::string( "S SEE NEN NWW SW" )
|
|
||||||
.substr( 0 + 2 * floor( fmod( 8 + ( Camera.Yaw + 0.5 * M_PI_4 ) / M_PI_4, 8 ) ), 2 );
|
|
||||||
// current luminance level
|
|
||||||
uitextline2 = "Light level: " + to_string( Global.fLuminance, 3 );
|
|
||||||
if( Global.FakeLight ) { uitextline2 += "(*)"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case( GLFW_KEY_F8 ) : {
|
|
||||||
// gfx renderer data
|
|
||||||
uitextline1 =
|
|
||||||
"FoV: " + to_string( Global.FieldOfView / Global.ZoomFactor, 1 )
|
|
||||||
+ ", Draw range x " + to_string( Global.fDistanceFactor, 1 )
|
|
||||||
// + "; sectors: " + std::to_string( GfxRenderer.m_drawcount )
|
|
||||||
// + ", FPS: " + to_string( Timer::GetFPS(), 2 );
|
|
||||||
+ ", FPS: " + std::to_string( static_cast<int>(std::round(GfxRenderer.Framerate())) );
|
|
||||||
if( Global.iSlowMotion ) {
|
|
||||||
uitextline1 += " (slowmotion " + to_string( Global.iSlowMotion ) + ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
uitextline2 =
|
|
||||||
std::string( "Rendering mode: " )
|
|
||||||
+ ( Global.bUseVBO ?
|
|
||||||
"VBO" :
|
|
||||||
"Display Lists" )
|
|
||||||
+ " ";
|
|
||||||
if( false == Global.LastGLError.empty() ) {
|
|
||||||
uitextline2 +=
|
|
||||||
"Last openGL error: "
|
|
||||||
+ Global.LastGLError;
|
|
||||||
}
|
|
||||||
// renderer stats
|
|
||||||
uitextline3 = GfxRenderer.info_times();
|
|
||||||
uitextline4 = GfxRenderer.info_stats();
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case( GLFW_KEY_F9 ) : {
|
|
||||||
// informacja o wersji
|
|
||||||
uitextline1 = "MaSzyna " + Global.asVersion; // informacja o wersji
|
|
||||||
if( Global.iMultiplayer ) {
|
|
||||||
uitextline1 += " (multiplayer mode is active)";
|
|
||||||
}
|
|
||||||
uitextline3 =
|
|
||||||
"vehicles: " + to_string( Timer::subsystem.sim_dynamics.average(), 2 ) + " msec"
|
|
||||||
+ " update total: " + to_string( Timer::subsystem.sim_total.average(), 2 ) + " msec";
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case( GLFW_KEY_F10 ) : {
|
|
||||||
|
|
||||||
uitextline1 = ( "Press [Y] key to quit / Aby zakonczyc program, przycisnij klawisz [Y]." );
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case( GLFW_KEY_F12 ) : {
|
|
||||||
// opcje włączenia i wyłączenia logowania
|
|
||||||
uitextline1 = "[0] Debugmode " + std::string( DebugModeFlag ? "(on)" : "(off)" );
|
|
||||||
uitextline2 = "[1] log.txt " + std::string( ( Global.iWriteLogEnabled & 1 ) ? "(on)" : "(off)" );
|
|
||||||
uitextline3 = "[2] Console " + std::string( ( Global.iWriteLogEnabled & 2 ) ? "(on)" : "(off)" );
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default: {
|
|
||||||
// uncovered cases, nothing to do here...
|
|
||||||
// ... unless we're in debug mode
|
|
||||||
if( DebugModeFlag ) {
|
|
||||||
|
|
||||||
auto *vehicle {
|
|
||||||
( FreeFlyModeFlag ?
|
|
||||||
std::get<TDynamicObject *>( simulation::Region->find_vehicle( Camera.Pos, 20, false, false ) ) :
|
|
||||||
Controlled ) }; // w trybie latania lokalizujemy wg mapy
|
|
||||||
if( vehicle == nullptr ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
uitextline1 =
|
|
||||||
"vel: " + to_string( vehicle->GetVelocity(), 2 ) + "/" + to_string( vehicle->MoverParameters->nrot* M_PI * vehicle->MoverParameters->WheelDiameter * 3.6, 2 )
|
|
||||||
+ " km/h;" + ( vehicle->MoverParameters->SlippingWheels ? " (!)" : " " )
|
|
||||||
+ " dist: " + to_string( vehicle->MoverParameters->DistCounter, 2 ) + " km"
|
|
||||||
+ "; pos: [" + to_string( vehicle->GetPosition().x, 2 ) + ", " + to_string( vehicle->GetPosition().y, 2 ) + ", " + to_string( vehicle->GetPosition().z, 2 ) + "]"
|
|
||||||
+ ", PM=" + to_string( vehicle->MoverParameters->WheelFlat, 1 )
|
|
||||||
+ " mm; enrot=" + to_string( vehicle->MoverParameters->enrot * 60, 0 )
|
|
||||||
+ " tmrot=" + to_string( std::abs( vehicle->MoverParameters->nrot ) * vehicle->MoverParameters->Transmision.Ratio * 60, 0 )
|
|
||||||
+ "; ventrot=" + to_string( vehicle->MoverParameters->RventRot * 60, 1 );
|
|
||||||
|
|
||||||
uitextline2 =
|
|
||||||
"HamZ=" + to_string( vehicle->MoverParameters->fBrakeCtrlPos, 2 )
|
|
||||||
+ "; HamP=" + std::to_string( vehicle->MoverParameters->LocalBrakePos ) + "/" + to_string( vehicle->MoverParameters->LocalBrakePosA, 2 )
|
|
||||||
+ "; NasJ=" + std::to_string( vehicle->MoverParameters->MainCtrlPos ) + "(" + std::to_string( vehicle->MoverParameters->MainCtrlActualPos ) + ")"
|
|
||||||
+ ( vehicle->MoverParameters->ShuntMode ?
|
|
||||||
"; NasB=" + to_string( vehicle->MoverParameters->AnPos, 2 ) :
|
|
||||||
"; NasB=" + std::to_string( vehicle->MoverParameters->ScndCtrlPos ) + "(" + std::to_string( vehicle->MoverParameters->ScndCtrlActualPos ) + ")" )
|
|
||||||
+ "; I=" +
|
|
||||||
( vehicle->MoverParameters->TrainType == dt_EZT ?
|
|
||||||
std::to_string( int( vehicle->MoverParameters->ShowCurrent( 0 ) ) ) :
|
|
||||||
std::to_string( int( vehicle->MoverParameters->Im ) ) )
|
|
||||||
+ "; U=" + to_string( int( vehicle->MoverParameters->RunningTraction.TractionVoltage + 0.5 ) )
|
|
||||||
+ "; R=" +
|
|
||||||
( std::abs( vehicle->MoverParameters->RunningShape.R ) > 10000.0 ?
|
|
||||||
"~0.0" :
|
|
||||||
to_string( vehicle->MoverParameters->RunningShape.R, 1 ) )
|
|
||||||
+ " An=" + to_string( vehicle->MoverParameters->AccN, 2 ); // przyspieszenie poprzeczne
|
|
||||||
|
|
||||||
if( tprev != simulation::Time.data().wSecond ) {
|
|
||||||
tprev = simulation::Time.data().wSecond;
|
|
||||||
Acc = ( vehicle->MoverParameters->Vel - VelPrev ) / 3.6;
|
|
||||||
VelPrev = vehicle->MoverParameters->Vel;
|
|
||||||
}
|
|
||||||
uitextline2 += "; As=" + to_string( Acc, 2 ); // przyspieszenie wzdłużne
|
|
||||||
uitextline2 += " eAngle=" + to_string( std::cos( vehicle->MoverParameters->eAngle ), 2 );
|
|
||||||
|
|
||||||
uitextline3 =
|
|
||||||
"cyl.ham. " + to_string( vehicle->MoverParameters->BrakePress, 2 )
|
|
||||||
+ "; prz.gl. " + to_string( vehicle->MoverParameters->PipePress, 2 )
|
|
||||||
+ "; zb.gl. " + to_string( vehicle->MoverParameters->CompressedVolume, 2 )
|
|
||||||
// youBy - drugi wezyk
|
|
||||||
+ "; p.zas. " + to_string( vehicle->MoverParameters->ScndPipePress, 2 );
|
|
||||||
|
|
||||||
// McZapkie: warto wiedziec w jakim stanie sa przelaczniki
|
|
||||||
if( vehicle->MoverParameters->ConvOvldFlag )
|
|
||||||
uitextline3 += " C! ";
|
|
||||||
else if( vehicle->MoverParameters->FuseFlag )
|
|
||||||
uitextline3 += " F! ";
|
|
||||||
else if( !vehicle->MoverParameters->Mains )
|
|
||||||
uitextline3 += " () ";
|
|
||||||
else {
|
|
||||||
switch(
|
|
||||||
vehicle->MoverParameters->ActiveDir *
|
|
||||||
( vehicle->MoverParameters->Imin == vehicle->MoverParameters->IminLo ?
|
|
||||||
1 :
|
|
||||||
2 ) ) {
|
|
||||||
case 2: { uitextline3 += " >> "; break; }
|
|
||||||
case 1: { uitextline3 += " -> "; break; }
|
|
||||||
case 0: { uitextline3 += " -- "; break; }
|
|
||||||
case -1: { uitextline3 += " <- "; break; }
|
|
||||||
case -2: { uitextline3 += " << "; break; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// McZapkie: predkosc szlakowa
|
|
||||||
if( vehicle->MoverParameters->RunningTrack.Velmax == -1 ) {
|
|
||||||
uitextline3 += " Vtrack=Vmax";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uitextline3 += " Vtrack " + to_string( vehicle->MoverParameters->RunningTrack.Velmax, 2 );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ( vehicle->MoverParameters->EnginePowerSource.SourceType == CurrentCollector )
|
|
||||||
|| ( vehicle->MoverParameters->TrainType == dt_EZT ) ) {
|
|
||||||
uitextline3 +=
|
|
||||||
"; pant. " + to_string( vehicle->MoverParameters->PantPress, 2 )
|
|
||||||
+ ( vehicle->MoverParameters->bPantKurek3 ? "=" : "^" ) + "ZG";
|
|
||||||
}
|
|
||||||
|
|
||||||
// McZapkie: komenda i jej parametry
|
|
||||||
if( vehicle->MoverParameters->CommandIn.Command != ( "" ) ) {
|
|
||||||
uitextline4 =
|
|
||||||
"C:" + vehicle->MoverParameters->CommandIn.Command
|
|
||||||
+ " V1=" + to_string( vehicle->MoverParameters->CommandIn.Value1, 0 )
|
|
||||||
+ " V2=" + to_string( vehicle->MoverParameters->CommandIn.Value2, 0 );
|
|
||||||
}
|
|
||||||
if( ( vehicle->Mechanik )
|
|
||||||
&& ( vehicle->Mechanik->AIControllFlag == AIdriver ) ) {
|
|
||||||
uitextline4 +=
|
|
||||||
"AI: Vd=" + to_string( vehicle->Mechanik->VelDesired, 0 )
|
|
||||||
+ " ad=" + to_string(vehicle->Mechanik->AccDesired, 2)
|
|
||||||
+ "/" + to_string(vehicle->Mechanik->AccDesired*vehicle->Mechanik->BrakeAccFactor(), 2)
|
|
||||||
+ " atrain=" + to_string(vehicle->Mechanik->fBrake_a0[0], 2)
|
|
||||||
+ "+" + to_string(vehicle->Mechanik->fBrake_a1[0], 2)
|
|
||||||
+ " aS=" + to_string(vehicle->Mechanik->AbsAccS_pub, 2)
|
|
||||||
+ " Pd=" + to_string( vehicle->Mechanik->ActualProximityDist, 0 )
|
|
||||||
+ " Vn=" + to_string( vehicle->Mechanik->VelNext, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// induction motor data
|
|
||||||
if( vehicle->MoverParameters->EngineType == ElectricInductionMotor ) {
|
|
||||||
|
|
||||||
UITable->text_lines.emplace_back( " eimc: eimv: press:", Global.UITextColor );
|
|
||||||
for( int i = 0; i <= 20; ++i ) {
|
|
||||||
|
|
||||||
std::string parameters =
|
|
||||||
vehicle->MoverParameters->eimc_labels[ i ] + to_string( vehicle->MoverParameters->eimc[ i ], 2, 9 )
|
|
||||||
+ " | "
|
|
||||||
+ vehicle->MoverParameters->eimv_labels[ i ] + to_string( vehicle->MoverParameters->eimv[ i ], 2, 9 );
|
|
||||||
|
|
||||||
if( i < 10 ) {
|
|
||||||
parameters += " | " + Train->fPress_labels[i] + to_string( Train->fPress[ i ][ 0 ], 2, 9 );
|
|
||||||
}
|
|
||||||
else if( i == 12 ) {
|
|
||||||
parameters += " med:";
|
|
||||||
}
|
|
||||||
else if( i >= 13 ) {
|
|
||||||
parameters += " | " + vehicle->MED_labels[ i - 13 ] + to_string( vehicle->MED[ 0 ][ i - 13 ], 2, 9 );
|
|
||||||
}
|
|
||||||
|
|
||||||
UITable->text_lines.emplace_back( parameters, Global.UITextColor );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (vehicle->MoverParameters->EngineType == DieselEngine) {
|
|
||||||
std::string parameters = "param value";
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "efill: " + to_string(vehicle->MoverParameters->dizel_fill, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "etorq: " + to_string(vehicle->MoverParameters->dizel_Torque, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "creal: " + to_string(vehicle->MoverParameters->dizel_engage, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "cdesi: " + to_string(vehicle->MoverParameters->dizel_engagestate, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "cdelt: " + to_string(vehicle->MoverParameters->dizel_engagedeltaomega, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "gears: " + to_string(vehicle->MoverParameters->dizel_automaticgearstatus, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "hydro value";
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "hTCnI: " + to_string(vehicle->MoverParameters->hydro_TC_nIn, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "hTCnO: " + to_string(vehicle->MoverParameters->hydro_TC_nOut, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "hTCTM: " + to_string(vehicle->MoverParameters->hydro_TC_TMRatio, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "hTCTI: " + to_string(vehicle->MoverParameters->hydro_TC_TorqueIn, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "hTCTO: " + to_string(vehicle->MoverParameters->hydro_TC_TorqueOut, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "hTCfl: " + to_string(vehicle->MoverParameters->hydro_TC_Fill, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
parameters = "hTCLR: " + to_string(vehicle->MoverParameters->hydro_TC_LockupRate, 2, 9);
|
|
||||||
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
//parameters = "hTCXX: " + to_string(vehicle->MoverParameters->hydro_TC_nIn, 2, 9);
|
|
||||||
//UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // if( DebugModeFlag && Controlled )
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef EU07_USE_OLD_UI_CODE
|
|
||||||
if( Controlled && DebugModeFlag && !Global.iTextMode ) {
|
|
||||||
|
|
||||||
uitextline1 +=
|
|
||||||
( "; d_omega " ) + to_string( Controlled->MoverParameters->dizel_engagedeltaomega, 3 );
|
|
||||||
|
|
||||||
if( Controlled->MoverParameters->EngineType == ElectricInductionMotor ) {
|
|
||||||
|
|
||||||
for( int i = 0; i <= 8; i++ ) {
|
|
||||||
for( int j = 0; j <= 9; j++ ) {
|
|
||||||
glRasterPos2f( 0.05f + 0.03f * i, 0.16f - 0.01f * j );
|
|
||||||
uitextline4 = to_string( Train->fEIMParams[ i ][ j ], 2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// update the ui header texts
|
|
||||||
auto &headerdata = UIHeader->text_lines;
|
|
||||||
headerdata[ 0 ].data = uitextline1;
|
|
||||||
headerdata[ 1 ].data = uitextline2;
|
|
||||||
headerdata[ 2 ].data = uitextline3;
|
|
||||||
headerdata[ 3 ].data = uitextline4;
|
|
||||||
|
|
||||||
// stenogramy dźwięków (ukryć, gdy tabelka skanowania lub rozkład?)
|
|
||||||
auto &transcripts = UITranscripts->text_lines;
|
|
||||||
transcripts.clear();
|
|
||||||
for( auto const &transcript : ui::Transcripts.aLines ) {
|
|
||||||
|
|
||||||
if( Global.fTimeAngleDeg >= transcript.fShow ) {
|
|
||||||
|
|
||||||
cParser parser( transcript.asText );
|
|
||||||
while( true == parser.getTokens( 1, false, "|" ) ) {
|
|
||||||
|
|
||||||
std::string transcriptline; parser >> transcriptline;
|
|
||||||
transcripts.emplace_back( transcriptline, glm::vec4( 1.0f, 1.0f, 0.0f, 1.0f ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void TWorld::OnCommandGet(multiplayer::DaneRozkaz *pRozkaz)
|
void TWorld::OnCommandGet(multiplayer::DaneRozkaz *pRozkaz)
|
||||||
{ // odebranie komunikatu z serwera
|
{ // odebranie komunikatu z serwera
|
||||||
|
|||||||
19
World.h
19
World.h
@@ -109,6 +109,8 @@ TWorld();
|
|||||||
void TrainDelete(TDynamicObject *d = NULL);
|
void TrainDelete(TDynamicObject *d = NULL);
|
||||||
TTrain const *
|
TTrain const *
|
||||||
train() const { return Train; }
|
train() const { return Train; }
|
||||||
|
TDynamicObject const *
|
||||||
|
controlled() const { return Controlled; }
|
||||||
// switches between static and dynamic daylight calculation
|
// switches between static and dynamic daylight calculation
|
||||||
void ToggleDaylight();
|
void ToggleDaylight();
|
||||||
// calculates current season of the year based on set simulation date
|
// calculates current season of the year based on set simulation date
|
||||||
@@ -121,7 +123,6 @@ TWorld();
|
|||||||
private:
|
private:
|
||||||
void Update_Environment();
|
void Update_Environment();
|
||||||
void Update_Camera( const double Deltatime );
|
void Update_Camera( const double Deltatime );
|
||||||
void Update_UI();
|
|
||||||
void ResourceSweep();
|
void ResourceSweep();
|
||||||
// handles vehicle change flag
|
// handles vehicle change flag
|
||||||
void ChangeDynamic();
|
void ChangeDynamic();
|
||||||
@@ -133,21 +134,19 @@ private:
|
|||||||
TCamera DebugCamera;
|
TCamera DebugCamera;
|
||||||
world_environment Environment;
|
world_environment Environment;
|
||||||
TTrain *Train;
|
TTrain *Train;
|
||||||
TDynamicObject *pDynamicNearest;
|
TDynamicObject *Controlled { nullptr }; // pojazd, który prowadzimy
|
||||||
bool Paused{ true };
|
TDynamicObject *pDynamicNearest { nullptr };
|
||||||
|
bool Paused { true };
|
||||||
TEvent *KeyEvents[10]; // eventy wyzwalane z klawiaury
|
TEvent *KeyEvents[10]; // eventy wyzwalane z klawiaury
|
||||||
TMoverParameters *mvControlled; // wskaźnik na człon silnikowy, do wyświetlania jego parametrów
|
TMoverParameters *mvControlled; // wskaźnik na człon silnikowy, do wyświetlania jego parametrów
|
||||||
double fTime50Hz; // bufor czasu dla komunikacji z PoKeys
|
double fTime50Hz; // bufor czasu dla komunikacji z PoKeys
|
||||||
double fTimeBuffer; // bufor czasu aktualizacji dla stałego kroku fizyki
|
double fTimeBuffer; // bufor czasu aktualizacji dla stałego kroku fizyki
|
||||||
double fMaxDt; //[s] krok czasowy fizyki (0.01 dla normalnych warunków)
|
double fMaxDt; //[s] krok czasowy fizyki (0.01 dla normalnych warunków)
|
||||||
double m_primaryupdaterate{ 1.0 / 100.0 };
|
double const m_primaryupdaterate { 1.0 / 100.0 };
|
||||||
double m_secondaryupdaterate{ 1.0 / 50.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_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
|
double m_secondaryupdateaccumulator { m_secondaryupdaterate }; // keeps track of elapsed simulation time, for less important fixed step routines
|
||||||
int iPause; // wykrywanie zmian w zapauzowaniu
|
int iPause; // wykrywanie zmian w zapauzowaniu
|
||||||
double VelPrev; // poprzednia prędkość
|
|
||||||
int tprev; // poprzedni czas
|
|
||||||
double Acc; // przyspieszenie styczne
|
|
||||||
bool m_init { false }; // indicates whether initial update of the world was performed
|
bool m_init { false }; // indicates whether initial update of the world was performed
|
||||||
GLFWwindow *window;
|
GLFWwindow *window;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -531,13 +531,13 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
|||||||
{
|
{
|
||||||
adjustedtime = clamp_circular( TimeTable[i].Ah * 60 + TimeTable[i].Am + timeoffset, 24 * 60 ); // nowe minuty
|
adjustedtime = clamp_circular( TimeTable[i].Ah * 60 + TimeTable[i].Am + timeoffset, 24 * 60 ); // nowe minuty
|
||||||
TimeTable[i].Am = adjustedtime % 60;
|
TimeTable[i].Am = adjustedtime % 60;
|
||||||
TimeTable[i].Ah = (adjustedtime /*div*/ / 60) % 60;
|
TimeTable[i].Ah = (adjustedtime / 60) % 24;
|
||||||
}
|
}
|
||||||
if ((TimeTable[i].Dh >= 0))
|
if ((TimeTable[i].Dh >= 0))
|
||||||
{
|
{
|
||||||
adjustedtime = clamp_circular( TimeTable[i].Dh * 60 + TimeTable[i].Dm + timeoffset, 24 * 60 ); // nowe minuty
|
adjustedtime = clamp_circular( TimeTable[i].Dh * 60 + TimeTable[i].Dm + timeoffset, 24 * 60 ); // nowe minuty
|
||||||
TimeTable[i].Dm = adjustedtime % 60;
|
TimeTable[i].Dm = adjustedtime % 60;
|
||||||
TimeTable[i].Dh = (adjustedtime /*div*/ / 60) % 60;
|
TimeTable[i].Dh = (adjustedtime / 60) % 24;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -539,6 +539,17 @@ state_manager::deserialize_time( cParser &Input, scene::scratch_data &Scratchpad
|
|||||||
>> time.wHour
|
>> time.wHour
|
||||||
>> time.wMinute;
|
>> time.wMinute;
|
||||||
|
|
||||||
|
if( true == Global.ScenarioTimeCurrent ) {
|
||||||
|
// calculate time shift required to match scenario time with local clock
|
||||||
|
auto timenow = std::time( 0 );
|
||||||
|
auto *localtime = std::localtime( &timenow );
|
||||||
|
Global.ScenarioTimeOffset =
|
||||||
|
clamp_circular(
|
||||||
|
( localtime->tm_hour * 60 + localtime->tm_min ) - ( time.wHour * 60 + time.wMinute ),
|
||||||
|
24 * 60 )
|
||||||
|
/ 60.f;
|
||||||
|
}
|
||||||
|
|
||||||
// remaining sunrise and sunset parameters are no longer used, as they're now calculated dynamically
|
// remaining sunrise and sunset parameters are no longer used, as they're now calculated dynamically
|
||||||
// anything else left in the section has no defined meaning
|
// anything else left in the section has no defined meaning
|
||||||
skip_until( Input, "endtime" );
|
skip_until( Input, "endtime" );
|
||||||
|
|||||||
812
uilayer.cpp
812
uilayer.cpp
@@ -2,9 +2,18 @@
|
|||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "uilayer.h"
|
#include "uilayer.h"
|
||||||
|
#include "uitranscripts.h"
|
||||||
|
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
#include "utilities.h"
|
#include "translation.h"
|
||||||
|
#include "simulation.h"
|
||||||
|
#include "mtable.h"
|
||||||
|
#include "train.h"
|
||||||
|
#include "dynobj.h"
|
||||||
|
#include "model3d.h"
|
||||||
#include "renderer.h"
|
#include "renderer.h"
|
||||||
|
#include "timer.h"
|
||||||
|
#include "utilities.h"
|
||||||
#include "logs.h"
|
#include "logs.h"
|
||||||
|
|
||||||
ui_layer UILayer;
|
ui_layer UILayer;
|
||||||
@@ -25,6 +34,21 @@ ui_layer::~ui_layer() {
|
|||||||
bool
|
bool
|
||||||
ui_layer::init( GLFWwindow *Window ) {
|
ui_layer::init( GLFWwindow *Window ) {
|
||||||
|
|
||||||
|
clear_texts();
|
||||||
|
|
||||||
|
UIHeader = std::make_shared<ui_panel>( 20, 20 ); // header ui panel
|
||||||
|
UITable = std::make_shared<ui_panel>( 20, 100 ); // schedule or scan table
|
||||||
|
UITranscripts = std::make_shared<ui_panel>( 85, 600 ); // voice transcripts
|
||||||
|
// make 4 empty lines for the ui header, to cut down on work down the road
|
||||||
|
UIHeader->text_lines.emplace_back( "", Global.UITextColor );
|
||||||
|
UIHeader->text_lines.emplace_back( "", Global.UITextColor );
|
||||||
|
UIHeader->text_lines.emplace_back( "", Global.UITextColor );
|
||||||
|
UIHeader->text_lines.emplace_back( "", Global.UITextColor );
|
||||||
|
// bind the panels with ui object. maybe not the best place for this but, eh
|
||||||
|
push_back( UIHeader );
|
||||||
|
push_back( UITable );
|
||||||
|
push_back( UITranscripts );
|
||||||
|
|
||||||
m_window = Window;
|
m_window = Window;
|
||||||
HFONT font; // Windows Font ID
|
HFONT font; // Windows Font ID
|
||||||
m_fontbase = ::glGenLists(96); // storage for 96 characters
|
m_fontbase = ::glGenLists(96); // storage for 96 characters
|
||||||
@@ -60,6 +84,792 @@ ui_layer::init( GLFWwindow *Window ) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// potentially processes provided input key. returns: true if key was processed, false otherwise
|
||||||
|
bool
|
||||||
|
ui_layer::on_key( int const Key, int const Action ) {
|
||||||
|
// TODO: pass the input first through an active ui element if there's any
|
||||||
|
// if the ui element shows no interest or we don't have one, try to interpret the input yourself:
|
||||||
|
// shared conditions
|
||||||
|
switch( Key ) {
|
||||||
|
|
||||||
|
case GLFW_KEY_F1:
|
||||||
|
case GLFW_KEY_F2:
|
||||||
|
case GLFW_KEY_F3:
|
||||||
|
case GLFW_KEY_F8:
|
||||||
|
case GLFW_KEY_F9:
|
||||||
|
case GLFW_KEY_F10:
|
||||||
|
case GLFW_KEY_F12: { // ui mode selectors
|
||||||
|
|
||||||
|
if( ( true == Global.ctrlState )
|
||||||
|
|| ( true == Global.shiftState ) ) {
|
||||||
|
// only react to keys without modifiers
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( Action == GLFW_RELEASE ) { return true; } // recognized, but ignored
|
||||||
|
}
|
||||||
|
|
||||||
|
default: { // everything else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (Key) {
|
||||||
|
|
||||||
|
case GLFW_KEY_F1: {
|
||||||
|
// basic consist info
|
||||||
|
if( Global.iTextMode == Key ) { ++Global.iScreenMode[ Key - GLFW_KEY_F1 ]; }
|
||||||
|
if( Global.iScreenMode[ Key - GLFW_KEY_F1 ] > 1 ) {
|
||||||
|
// wyłączenie napisów
|
||||||
|
Global.iTextMode = 0;
|
||||||
|
Global.iScreenMode[ Key - GLFW_KEY_F1 ] = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Global.iTextMode = Key;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case GLFW_KEY_F2: {
|
||||||
|
// parametry pojazdu
|
||||||
|
if( Global.iTextMode == Key ) { ++Global.iScreenMode[ Key - GLFW_KEY_F1 ]; }
|
||||||
|
if( Global.iScreenMode[ Key - GLFW_KEY_F1 ] > 1 ) {
|
||||||
|
// wyłączenie napisów
|
||||||
|
Global.iTextMode = 0;
|
||||||
|
Global.iScreenMode[ Key - GLFW_KEY_F1 ] = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Global.iTextMode = Key;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case GLFW_KEY_F3: {
|
||||||
|
// timetable
|
||||||
|
if( Global.iTextMode == Key ) { ++Global.iScreenMode[ Key - GLFW_KEY_F1 ]; }
|
||||||
|
if( Global.iScreenMode[ Key - GLFW_KEY_F1 ] > 1 ) {
|
||||||
|
// wyłączenie napisów
|
||||||
|
Global.iTextMode = 0;
|
||||||
|
Global.iScreenMode[ Key - GLFW_KEY_F1 ] = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Global.iTextMode = Key;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case GLFW_KEY_F8: {
|
||||||
|
// renderer debug data
|
||||||
|
Global.iTextMode = Key;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case GLFW_KEY_F9: {
|
||||||
|
// wersja
|
||||||
|
Global.iTextMode = Key;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case GLFW_KEY_F10: {
|
||||||
|
// quit
|
||||||
|
if( Global.iTextMode == Key ) {
|
||||||
|
Global.iTextMode =
|
||||||
|
( Global.iPause && ( Key != GLFW_KEY_F1 ) ?
|
||||||
|
GLFW_KEY_F1 :
|
||||||
|
0 ); // wyłączenie napisów, chyba że pauza
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Global.iTextMode = Key;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case GLFW_KEY_F12: {
|
||||||
|
// coś tam jeszcze
|
||||||
|
Global.iTextMode = Key;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case GLFW_KEY_Y: {
|
||||||
|
// potentially quit
|
||||||
|
if( Global.iTextMode != GLFW_KEY_F10 ) { return false; } // not in quit mode
|
||||||
|
|
||||||
|
if( Action == GLFW_RELEASE ) { return true; } // recognized, but ignored
|
||||||
|
|
||||||
|
glfwSetWindowShouldClose( m_window, 1 );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// updates state of UI elements
|
||||||
|
void
|
||||||
|
ui_layer::update() {
|
||||||
|
|
||||||
|
UITable->text_lines.clear();
|
||||||
|
std::string uitextline1, uitextline2, uitextline3, uitextline4;
|
||||||
|
UILayer.set_tooltip( "" );
|
||||||
|
|
||||||
|
auto const *train { ( Global.pWorld ? Global.pWorld->train() : nullptr ) };
|
||||||
|
auto const *controlled { ( Global.pWorld ? Global.pWorld->controlled() : nullptr ) };
|
||||||
|
auto const *camera { Global.pCamera };
|
||||||
|
|
||||||
|
if( ( train != nullptr ) && ( false == FreeFlyModeFlag ) ) {
|
||||||
|
if( false == DebugModeFlag ) {
|
||||||
|
// in regular mode show control functions, for defined controls
|
||||||
|
UILayer.set_tooltip( locale::label_cab_control( train->GetLabel( GfxRenderer.Pick_Control() ) ) );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// in debug mode show names of submodels, to help with cab setup and/or debugging
|
||||||
|
auto const cabcontrol = GfxRenderer.Pick_Control();
|
||||||
|
UILayer.set_tooltip( ( cabcontrol ? cabcontrol->pName : "" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( ( true == Global.ControlPicking ) && ( true == FreeFlyModeFlag ) && ( true == DebugModeFlag ) ) {
|
||||||
|
auto const scenerynode = GfxRenderer.Pick_Node();
|
||||||
|
UILayer.set_tooltip(
|
||||||
|
( scenerynode ?
|
||||||
|
scenerynode->name() :
|
||||||
|
"" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( Global.iTextMode ) {
|
||||||
|
|
||||||
|
case( GLFW_KEY_F1 ) : {
|
||||||
|
// f1, default mode: current time and timetable excerpt
|
||||||
|
auto const &time = simulation::Time.data();
|
||||||
|
uitextline1 =
|
||||||
|
"Time: "
|
||||||
|
+ to_string( time.wHour ) + ":"
|
||||||
|
+ ( time.wMinute < 10 ? "0" : "" ) + to_string( time.wMinute ) + ":"
|
||||||
|
+ ( time.wSecond < 10 ? "0" : "" ) + to_string( time.wSecond );
|
||||||
|
if( Global.iPause ) {
|
||||||
|
uitextline1 += " (paused)";
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( controlled != nullptr )
|
||||||
|
&& ( controlled->Mechanik != nullptr ) ) {
|
||||||
|
|
||||||
|
auto const &mover = controlled->MoverParameters;
|
||||||
|
auto const &driver = controlled->Mechanik;
|
||||||
|
|
||||||
|
uitextline2 = "Throttle: " + to_string( driver->Controlling()->MainCtrlPos, 0, 2 ) + "+" + std::to_string( driver->Controlling()->ScndCtrlPos );
|
||||||
|
if( mover->ActiveDir > 0 ) { uitextline2 += " D"; }
|
||||||
|
else if( mover->ActiveDir < 0 ) { uitextline2 += " R"; }
|
||||||
|
else { uitextline2 += " N"; }
|
||||||
|
|
||||||
|
uitextline3 = "Brakes:" + to_string( mover->fBrakeCtrlPos, 1, 5 ) + "+" + std::to_string( mover->LocalBrakePos ) + ( mover->SlippingWheels ? " !" : " " );
|
||||||
|
|
||||||
|
uitextline4 = (
|
||||||
|
true == TestFlag( mover->SecuritySystem.Status, s_aware ) ?
|
||||||
|
"!ALERTER! " :
|
||||||
|
" " );
|
||||||
|
uitextline4 += (
|
||||||
|
true == TestFlag( mover->SecuritySystem.Status, s_active ) ?
|
||||||
|
"!SHP! " :
|
||||||
|
" " );
|
||||||
|
|
||||||
|
if( Global.iScreenMode[ Global.iTextMode - GLFW_KEY_F1 ] == 1 ) {
|
||||||
|
// detail mode on second key press
|
||||||
|
uitextline2 +=
|
||||||
|
" Speed: " + std::to_string( static_cast<int>( std::floor( mover->Vel ) ) ) + " km/h"
|
||||||
|
+ " (limit: " + std::to_string( static_cast<int>( std::floor( driver->VelDesired ) ) ) + " km/h"
|
||||||
|
+ ", next limit: " + std::to_string( static_cast<int>( std::floor( controlled->Mechanik->VelNext ) ) ) + " km/h"
|
||||||
|
+ " in " + to_string( controlled->Mechanik->ActualProximityDist * 0.001, 1 ) + " km)";
|
||||||
|
uitextline3 +=
|
||||||
|
" Pressure: " + to_string( mover->BrakePress * 100.0, 2 ) + " kPa"
|
||||||
|
+ " (train pipe: " + to_string( mover->PipePress * 100.0, 2 ) + " kPa)";
|
||||||
|
|
||||||
|
auto const stoptime { static_cast<int>( -1.0 * controlled->Mechanik->fStopTime ) };
|
||||||
|
if( stoptime > 0 ) {
|
||||||
|
uitextline4 += " Loading/unloading in progress (" + to_string( stoptime ) + ( stoptime > 1 ? " seconds" : " second" ) + " left)";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
auto const trackblockdistance{ std::abs( controlled->Mechanik->TrackBlock() ) };
|
||||||
|
if( trackblockdistance <= 75.0 ) {
|
||||||
|
uitextline4 += " Another vehicle ahead (distance: " + to_string( trackblockdistance, 1 ) + " m)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case( GLFW_KEY_F2 ) : {
|
||||||
|
// timetable
|
||||||
|
auto *vehicle {
|
||||||
|
( FreeFlyModeFlag ?
|
||||||
|
std::get<TDynamicObject *>( simulation::Region->find_vehicle( camera->Pos, 20, false, false ) ) :
|
||||||
|
controlled ) }; // w trybie latania lokalizujemy wg mapy
|
||||||
|
|
||||||
|
if( vehicle == nullptr ) { break; }
|
||||||
|
// if the nearest located vehicle doesn't have a direct driver, try to query its owner
|
||||||
|
auto const owner = (
|
||||||
|
( ( vehicle->Mechanik != nullptr ) && ( vehicle->Mechanik->Primary() ) ) ?
|
||||||
|
vehicle->Mechanik :
|
||||||
|
vehicle->ctOwner );
|
||||||
|
if( owner == nullptr ){ break; }
|
||||||
|
|
||||||
|
auto const table = owner->Timetable();
|
||||||
|
if( table == nullptr ) { break; }
|
||||||
|
|
||||||
|
auto const &time = simulation::Time.data();
|
||||||
|
uitextline1 =
|
||||||
|
"Time: "
|
||||||
|
+ to_string( time.wHour ) + ":"
|
||||||
|
+ ( time.wMinute < 10 ? "0" : "" ) + to_string( time.wMinute ) + ":"
|
||||||
|
+ ( time.wSecond < 10 ? "0" : "" ) + to_string( time.wSecond );
|
||||||
|
if( Global.iPause ) {
|
||||||
|
uitextline1 += " (paused)";
|
||||||
|
}
|
||||||
|
|
||||||
|
uitextline2 = Bezogonkow( owner->Relation(), true ) + " (" + Bezogonkow( owner->Timetable()->TrainName, true ) + ")";
|
||||||
|
auto const nextstation = Bezogonkow( owner->NextStop(), true );
|
||||||
|
if( !nextstation.empty() ) {
|
||||||
|
// jeśli jest podana relacja, to dodajemy punkt następnego zatrzymania
|
||||||
|
uitextline3 = " -> " + nextstation;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( Global.iScreenMode[ Global.iTextMode - GLFW_KEY_F1 ] == 1 ) {
|
||||||
|
|
||||||
|
if( 0 == table->StationCount ) {
|
||||||
|
// only bother if there's stations to list
|
||||||
|
UITable->text_lines.emplace_back( "(no timetable)", Global.UITextColor );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// header
|
||||||
|
UITable->text_lines.emplace_back( "+----------------------------+-------+-------+-----+", Global.UITextColor );
|
||||||
|
|
||||||
|
TMTableLine *tableline;
|
||||||
|
for( int i = owner->iStationStart; i <= std::min( owner->iStationStart + 15, table->StationCount ); ++i ) {
|
||||||
|
// wyświetlenie pozycji z rozkładu
|
||||||
|
tableline = table->TimeTable + i; // linijka rozkładu
|
||||||
|
|
||||||
|
std::string station =
|
||||||
|
( tableline->StationName + " " ).substr( 0, 26 );
|
||||||
|
std::string arrival =
|
||||||
|
( tableline->Ah >= 0 ?
|
||||||
|
to_string( int( 100 + tableline->Ah ) ).substr( 1, 2 ) + ":" + to_string( int( 100 + tableline->Am ) ).substr( 1, 2 ) :
|
||||||
|
" " );
|
||||||
|
std::string departure =
|
||||||
|
( tableline->Dh >= 0 ?
|
||||||
|
to_string( int( 100 + tableline->Dh ) ).substr( 1, 2 ) + ":" + to_string( int( 100 + tableline->Dm ) ).substr( 1, 2 ) :
|
||||||
|
" " );
|
||||||
|
std::string vmax =
|
||||||
|
" "
|
||||||
|
+ to_string( tableline->vmax, 0 );
|
||||||
|
vmax = vmax.substr( vmax.length() - 3, 3 ); // z wyrównaniem do prawej
|
||||||
|
|
||||||
|
UITable->text_lines.emplace_back(
|
||||||
|
Bezogonkow( "| " + station + " | " + arrival + " | " + departure + " | " + vmax + " | " + tableline->StationWare, true ),
|
||||||
|
( ( owner->iStationStart < table->StationIndex )
|
||||||
|
&& ( i < table->StationIndex )
|
||||||
|
&& ( ( time.wHour * 60 + time.wMinute ) >= ( tableline->Dh * 60 + tableline->Dm ) ) ?
|
||||||
|
glm::vec4( 0.0f, 1.0f, 0.0f, 1.0f ) :// czas minął i odjazd był, to nazwa stacji będzie na zielono
|
||||||
|
Global.UITextColor ) );
|
||||||
|
// divider/footer
|
||||||
|
UITable->text_lines.emplace_back( "+----------------------------+-------+-------+-----+", Global.UITextColor );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case( GLFW_KEY_F3 ) : {
|
||||||
|
|
||||||
|
auto *vehicle{
|
||||||
|
( FreeFlyModeFlag ?
|
||||||
|
std::get<TDynamicObject *>( simulation::Region->find_vehicle( camera->Pos, 20, false, false ) ) :
|
||||||
|
controlled ) }; // w trybie latania lokalizujemy wg mapy
|
||||||
|
|
||||||
|
if( vehicle != nullptr ) {
|
||||||
|
// jeśli domyślny ekran po pierwszym naciśnięciu
|
||||||
|
uitextline1 = "Vehicle name: " + vehicle->MoverParameters->Name;
|
||||||
|
|
||||||
|
if( ( vehicle->Mechanik == nullptr ) && ( vehicle->ctOwner ) ) {
|
||||||
|
// for cars other than leading unit indicate the leader
|
||||||
|
uitextline1 += ", owned by " + vehicle->ctOwner->OwnerName();
|
||||||
|
}
|
||||||
|
uitextline1 += "; Status: " + vehicle->MoverParameters->EngineDescription( 0 );
|
||||||
|
// informacja o sprzęgach
|
||||||
|
uitextline1 +=
|
||||||
|
"; C0:" +
|
||||||
|
( vehicle->PrevConnected ?
|
||||||
|
vehicle->PrevConnected->name() + ":" + to_string( vehicle->MoverParameters->Couplers[ 0 ].CouplingFlag ) + (
|
||||||
|
vehicle->MoverParameters->Couplers[ 0 ].CouplingFlag == 0 ?
|
||||||
|
" (" + to_string( vehicle->MoverParameters->Couplers[ 0 ].CoupleDist, 1 ) + " m)" :
|
||||||
|
"" ) :
|
||||||
|
"none" );
|
||||||
|
uitextline1 +=
|
||||||
|
" C1:" +
|
||||||
|
( vehicle->NextConnected ?
|
||||||
|
vehicle->NextConnected->name() + ":" + to_string( vehicle->MoverParameters->Couplers[ 1 ].CouplingFlag ) + (
|
||||||
|
vehicle->MoverParameters->Couplers[ 1 ].CouplingFlag == 0 ?
|
||||||
|
" (" + to_string( vehicle->MoverParameters->Couplers[ 1 ].CoupleDist, 1 ) + " m)" :
|
||||||
|
"" ) :
|
||||||
|
"none" );
|
||||||
|
|
||||||
|
// equipment flags
|
||||||
|
uitextline2 = ( vehicle->MoverParameters->Battery ? "B" : "." );
|
||||||
|
uitextline2 += ( vehicle->MoverParameters->Mains ? "M" : "." );
|
||||||
|
uitextline2 += ( vehicle->MoverParameters->PantRearUp ? ( vehicle->MoverParameters->PantRearVolt > 0.0 ? "O" : "o" ) : "." );;
|
||||||
|
uitextline2 += ( vehicle->MoverParameters->PantFrontUp ? ( vehicle->MoverParameters->PantFrontVolt > 0.0 ? "P" : "p" ) : "." );;
|
||||||
|
uitextline2 += ( vehicle->MoverParameters->PantPressLockActive ? "!" : ( vehicle->MoverParameters->PantPressSwitchActive ? "*" : "." ) );
|
||||||
|
uitextline2 += ( vehicle->MoverParameters->FuelPump.is_enabled ? ( vehicle->MoverParameters->FuelPump.is_active ? "F" : "f" ) : "." );;
|
||||||
|
uitextline2 += ( false == vehicle->MoverParameters->ConverterAllowLocal ? "-" : ( vehicle->MoverParameters->ConverterAllow ? ( vehicle->MoverParameters->ConverterFlag ? "X" : "x" ) : "." ) );
|
||||||
|
uitextline2 += ( vehicle->MoverParameters->ConvOvldFlag ? "!" : "." );
|
||||||
|
uitextline2 += ( false == vehicle->MoverParameters->CompressorAllowLocal ? "-" : ( ( vehicle->MoverParameters->CompressorAllow || vehicle->MoverParameters->CompressorPower > 1 ) ? ( vehicle->MoverParameters->CompressorFlag ? "C" : "c" ) : "." ) );
|
||||||
|
uitextline2 += ( vehicle->MoverParameters->CompressorGovernorLock ? "!" : "." );
|
||||||
|
|
||||||
|
auto const train { Global.pWorld->train() };
|
||||||
|
if( ( train != nullptr ) && ( train->Dynamic() == vehicle ) ) {
|
||||||
|
uitextline2 += " R: " + std::to_string( train->RadioChannel() );
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
uitextline2 +=
|
||||||
|
" AnlgB: " + to_string( tmp->MoverParameters->AnPos, 1 )
|
||||||
|
+ "+"
|
||||||
|
+ to_string( tmp->MoverParameters->LocalBrakePosA, 1 )
|
||||||
|
*/
|
||||||
|
uitextline2 += " Bdelay: ";
|
||||||
|
if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_G ) == bdelay_G )
|
||||||
|
uitextline2 += "G";
|
||||||
|
if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_P ) == bdelay_P )
|
||||||
|
uitextline2 += "P";
|
||||||
|
if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_R ) == bdelay_R )
|
||||||
|
uitextline2 += "R";
|
||||||
|
if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_M ) == bdelay_M )
|
||||||
|
uitextline2 += "+Mg";
|
||||||
|
|
||||||
|
uitextline2 += ", Load: " + to_string( vehicle->MoverParameters->Load, 0 ) + " (" + to_string( vehicle->MoverParameters->LoadFlag, 0 ) + ")";
|
||||||
|
|
||||||
|
uitextline2 +=
|
||||||
|
"; Pant: "
|
||||||
|
+ to_string( vehicle->MoverParameters->PantPress, 2 )
|
||||||
|
+ ( vehicle->MoverParameters->bPantKurek3 ? "-ZG" : "|ZG" );
|
||||||
|
|
||||||
|
uitextline2 +=
|
||||||
|
"; Ft: " + to_string(
|
||||||
|
vehicle->MoverParameters->Ft * 0.001f * (
|
||||||
|
vehicle->MoverParameters->ActiveCab ? vehicle->MoverParameters->ActiveCab :
|
||||||
|
vehicle->ctOwner ? vehicle->ctOwner->Controlling()->ActiveCab :
|
||||||
|
1 ), 1 )
|
||||||
|
+ ", Fb: " + to_string( vehicle->MoverParameters->Fb * 0.001f, 1 )
|
||||||
|
+ ", Fr: " + to_string( vehicle->MoverParameters->Adhesive( vehicle->MoverParameters->RunningTrack.friction ), 2 )
|
||||||
|
+ ( vehicle->MoverParameters->SlippingWheels ? " (!)" : "" );
|
||||||
|
|
||||||
|
if( vehicle->Mechanik ) {
|
||||||
|
uitextline2 += "; Ag: " + to_string( vehicle->Mechanik->fAccGravity, 2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
uitextline2 +=
|
||||||
|
"; TC:"
|
||||||
|
+ to_string( vehicle->MoverParameters->TotalCurrent, 0 );
|
||||||
|
auto const frontcouplerhighvoltage =
|
||||||
|
to_string( vehicle->MoverParameters->Couplers[ side::front ].power_high.voltage, 0 )
|
||||||
|
+ "@"
|
||||||
|
+ to_string( vehicle->MoverParameters->Couplers[ side::front ].power_high.current, 0 );
|
||||||
|
auto const rearcouplerhighvoltage =
|
||||||
|
to_string( vehicle->MoverParameters->Couplers[ side::rear ].power_high.voltage, 0 )
|
||||||
|
+ "@"
|
||||||
|
+ to_string( vehicle->MoverParameters->Couplers[ side::rear ].power_high.current, 0 );
|
||||||
|
uitextline2 += ", HV: ";
|
||||||
|
if( vehicle->MoverParameters->Couplers[ side::front ].power_high.local == false ) {
|
||||||
|
uitextline2 +=
|
||||||
|
"(" + frontcouplerhighvoltage + ")-"
|
||||||
|
+ ":F" + ( vehicle->DirectionGet() ? "<<" : ">>" ) + "R:"
|
||||||
|
+ "-(" + rearcouplerhighvoltage + ")";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uitextline2 +=
|
||||||
|
frontcouplerhighvoltage
|
||||||
|
+ ":F" + ( vehicle->DirectionGet() ? "<<" : ">>" ) + "R:"
|
||||||
|
+ rearcouplerhighvoltage;
|
||||||
|
}
|
||||||
|
|
||||||
|
uitextline3 +=
|
||||||
|
"TrB: " + to_string( vehicle->MoverParameters->BrakePress, 2 )
|
||||||
|
+ ", " + to_hex_str( vehicle->MoverParameters->Hamulec->GetBrakeStatus(), 2 );
|
||||||
|
|
||||||
|
uitextline3 +=
|
||||||
|
"; LcB: " + to_string( vehicle->MoverParameters->LocBrakePress, 2 )
|
||||||
|
+ "; hat: " + to_string( vehicle->MoverParameters->BrakeCtrlPos2, 2 )
|
||||||
|
+ "; pipes: " + to_string( vehicle->MoverParameters->PipePress, 2 )
|
||||||
|
+ "/" + to_string( vehicle->MoverParameters->ScndPipePress, 2 )
|
||||||
|
+ "/" + to_string( vehicle->MoverParameters->EqvtPipePress, 2 )
|
||||||
|
+ ", MT: " + to_string( vehicle->MoverParameters->CompressedVolume, 3 )
|
||||||
|
+ ", BT: " + to_string( vehicle->MoverParameters->Volume, 3 )
|
||||||
|
+ ", CtlP: " + to_string( vehicle->MoverParameters->CntrlPipePress, 3 )
|
||||||
|
+ ", CtlT: " + to_string( vehicle->MoverParameters->Hamulec->GetCRP(), 3 );
|
||||||
|
|
||||||
|
if( vehicle->MoverParameters->ManualBrakePos > 0 ) {
|
||||||
|
|
||||||
|
uitextline3 += "; manual brake on";
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if( tmp->MoverParameters->LocalBrakePos > 0 ) {
|
||||||
|
|
||||||
|
uitextline3 += ", local brake on";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
uitextline3 += ", local brake off";
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
if( vehicle->Mechanik ) {
|
||||||
|
// o ile jest ktoś w środku
|
||||||
|
std::string flags = "cpapcplhhndoiefgvdpseil "; // flagi AI (definicja w Driver.h)
|
||||||
|
for( int i = 0, j = 1; i < 23; ++i, j <<= 1 )
|
||||||
|
if( false == ( vehicle->Mechanik->DrivigFlags() & j ) ) // jak bit ustawiony
|
||||||
|
flags[ i ] = '.';// std::toupper( flags[ i ] ); // ^= 0x20; // to zmiana na wielką literę
|
||||||
|
|
||||||
|
uitextline4 = flags;
|
||||||
|
|
||||||
|
uitextline4 +=
|
||||||
|
"Driver: Vd=" + to_string( vehicle->Mechanik->VelDesired, 0 )
|
||||||
|
+ " Ad=" + to_string( vehicle->Mechanik->AccDesired, 2 )
|
||||||
|
+ " Ah=" + to_string( vehicle->Mechanik->fAccThreshold, 2 )
|
||||||
|
+ "@" + to_string( vehicle->Mechanik->fBrake_a0[ 0 ], 2 )
|
||||||
|
+ "+" + to_string( vehicle->Mechanik->fBrake_a1[ 0 ], 2 )
|
||||||
|
+ " Bd=" + to_string( vehicle->Mechanik->fBrakeDist, 0 )
|
||||||
|
+ " Pd=" + to_string( vehicle->Mechanik->ActualProximityDist, 0 )
|
||||||
|
+ " Vn=" + to_string( vehicle->Mechanik->VelNext, 0 )
|
||||||
|
+ " VSl=" + to_string( vehicle->Mechanik->VelSignalLast, 0 )
|
||||||
|
+ " VLl=" + to_string( vehicle->Mechanik->VelLimitLast, 0 )
|
||||||
|
+ " VRd=" + to_string( vehicle->Mechanik->VelRoad, 0 )
|
||||||
|
+ " VRst=" + to_string( vehicle->Mechanik->VelRestricted, 0 );
|
||||||
|
|
||||||
|
if( ( vehicle->Mechanik->VelNext == 0.0 )
|
||||||
|
&& ( vehicle->Mechanik->eSignNext ) ) {
|
||||||
|
// jeśli ma zapamiętany event semafora, nazwa eventu semafora
|
||||||
|
uitextline4 += " (" + Bezogonkow( vehicle->Mechanik->eSignNext->asName ) + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
// biezaca komenda dla AI
|
||||||
|
uitextline4 += ", command: " + vehicle->Mechanik->OrderCurrent();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( Global.iScreenMode[ Global.iTextMode - GLFW_KEY_F1 ] == 1 ) {
|
||||||
|
// f2 screen, track scan mode
|
||||||
|
if( vehicle->Mechanik == nullptr ) {
|
||||||
|
//żeby była tabelka, musi być AI
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t i = 0; std::size_t const speedtablesize = clamp( static_cast<int>( vehicle->Mechanik->TableSize() ) - 1, 0, 30 );
|
||||||
|
do {
|
||||||
|
std::string scanline = vehicle->Mechanik->TableText( i );
|
||||||
|
if( scanline.empty() ) { break; }
|
||||||
|
UITable->text_lines.emplace_back( Bezogonkow( scanline ), Global.UITextColor );
|
||||||
|
++i;
|
||||||
|
} while( i < speedtablesize ); // TController:iSpeedTableSize TODO: change when the table gets recoded
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// wyświetlenie współrzędnych w scenerii oraz kąta kamery, gdy nie mamy wskaźnika
|
||||||
|
uitextline1 =
|
||||||
|
"Camera position: "
|
||||||
|
+ to_string( camera->Pos.x, 2 ) + " "
|
||||||
|
+ to_string( camera->Pos.y, 2 ) + " "
|
||||||
|
+ to_string( camera->Pos.z, 2 )
|
||||||
|
+ ", azimuth: "
|
||||||
|
+ to_string( 180.0 - glm::degrees( camera->Yaw ), 0 ) // ma być azymut, czyli 0 na północy i rośnie na wschód
|
||||||
|
+ " "
|
||||||
|
+ std::string( "S SEE NEN NWW SW" )
|
||||||
|
.substr( 0 + 2 * floor( fmod( 8 + ( camera->Yaw + 0.5 * M_PI_4 ) / M_PI_4, 8 ) ), 2 );
|
||||||
|
// current luminance level
|
||||||
|
uitextline2 = "Light level: " + to_string( Global.fLuminance, 3 );
|
||||||
|
if( Global.FakeLight ) { uitextline2 += "(*)"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case( GLFW_KEY_F8 ) : {
|
||||||
|
// gfx renderer data
|
||||||
|
uitextline1 =
|
||||||
|
"FoV: " + to_string( Global.FieldOfView / Global.ZoomFactor, 1 )
|
||||||
|
+ ", Draw range x " + to_string( Global.fDistanceFactor, 1 )
|
||||||
|
// + "; sectors: " + std::to_string( GfxRenderer.m_drawcount )
|
||||||
|
// + ", FPS: " + to_string( Timer::GetFPS(), 2 );
|
||||||
|
+ ", FPS: " + std::to_string( static_cast<int>(std::round(GfxRenderer.Framerate())) );
|
||||||
|
if( Global.iSlowMotion ) {
|
||||||
|
uitextline1 += " (slowmotion " + to_string( Global.iSlowMotion ) + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
uitextline2 =
|
||||||
|
std::string( "Rendering mode: " )
|
||||||
|
+ ( Global.bUseVBO ?
|
||||||
|
"VBO" :
|
||||||
|
"Display Lists" )
|
||||||
|
+ " ";
|
||||||
|
if( false == Global.LastGLError.empty() ) {
|
||||||
|
uitextline2 +=
|
||||||
|
"Last openGL error: "
|
||||||
|
+ Global.LastGLError;
|
||||||
|
}
|
||||||
|
// renderer stats
|
||||||
|
uitextline3 = GfxRenderer.info_times();
|
||||||
|
uitextline4 = GfxRenderer.info_stats();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case( GLFW_KEY_F9 ) : {
|
||||||
|
// informacja o wersji
|
||||||
|
uitextline1 = "MaSzyna " + Global.asVersion; // informacja o wersji
|
||||||
|
if( Global.iMultiplayer ) {
|
||||||
|
uitextline1 += " (multiplayer mode is active)";
|
||||||
|
}
|
||||||
|
uitextline3 =
|
||||||
|
"vehicles: " + to_string( Timer::subsystem.sim_dynamics.average(), 2 ) + " msec"
|
||||||
|
+ " update total: " + to_string( Timer::subsystem.sim_total.average(), 2 ) + " msec";
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case( GLFW_KEY_F10 ) : {
|
||||||
|
|
||||||
|
uitextline1 = ( "Press [Y] key to quit / Aby zakonczyc program, przycisnij klawisz [Y]." );
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case( GLFW_KEY_F12 ) : {
|
||||||
|
// opcje włączenia i wyłączenia logowania
|
||||||
|
uitextline1 = "[0] Debugmode " + std::string( DebugModeFlag ? "(on)" : "(off)" );
|
||||||
|
uitextline2 = "[1] log.txt " + std::string( ( Global.iWriteLogEnabled & 1 ) ? "(on)" : "(off)" );
|
||||||
|
uitextline3 = "[2] Console " + std::string( ( Global.iWriteLogEnabled & 2 ) ? "(on)" : "(off)" );
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: {
|
||||||
|
// uncovered cases, nothing to do here...
|
||||||
|
// ... unless we're in debug mode
|
||||||
|
if( DebugModeFlag ) {
|
||||||
|
|
||||||
|
auto *vehicle {
|
||||||
|
( FreeFlyModeFlag ?
|
||||||
|
std::get<TDynamicObject *>( simulation::Region->find_vehicle( camera->Pos, 20, false, false ) ) :
|
||||||
|
controlled ) }; // w trybie latania lokalizujemy wg mapy
|
||||||
|
if( vehicle == nullptr ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
uitextline1 =
|
||||||
|
"vel: " + to_string( vehicle->GetVelocity(), 2 ) + "/" + to_string( vehicle->MoverParameters->nrot* M_PI * vehicle->MoverParameters->WheelDiameter * 3.6, 2 )
|
||||||
|
+ " km/h;" + ( vehicle->MoverParameters->SlippingWheels ? " (!)" : " " )
|
||||||
|
+ " dist: " + to_string( vehicle->MoverParameters->DistCounter, 2 ) + " km"
|
||||||
|
+ "; pos: [" + to_string( vehicle->GetPosition().x, 2 ) + ", " + to_string( vehicle->GetPosition().y, 2 ) + ", " + to_string( vehicle->GetPosition().z, 2 ) + "]"
|
||||||
|
+ ", PM=" + to_string( vehicle->MoverParameters->WheelFlat, 1 )
|
||||||
|
+ " mm; enrot=" + to_string( vehicle->MoverParameters->enrot * 60, 0 )
|
||||||
|
+ " tmrot=" + to_string( std::abs( vehicle->MoverParameters->nrot ) * vehicle->MoverParameters->Transmision.Ratio * 60, 0 )
|
||||||
|
+ "; ventrot=" + to_string( vehicle->MoverParameters->RventRot * 60, 1 );
|
||||||
|
|
||||||
|
uitextline2 =
|
||||||
|
"HamZ=" + to_string( vehicle->MoverParameters->fBrakeCtrlPos, 2 )
|
||||||
|
+ "; HamP=" + std::to_string( vehicle->MoverParameters->LocalBrakePos ) + "/" + to_string( vehicle->MoverParameters->LocalBrakePosA, 2 )
|
||||||
|
+ "; NasJ=" + std::to_string( vehicle->MoverParameters->MainCtrlPos ) + "(" + std::to_string( vehicle->MoverParameters->MainCtrlActualPos ) + ")"
|
||||||
|
+ ( vehicle->MoverParameters->ShuntMode ?
|
||||||
|
"; NasB=" + to_string( vehicle->MoverParameters->AnPos, 2 ) :
|
||||||
|
"; NasB=" + std::to_string( vehicle->MoverParameters->ScndCtrlPos ) + "(" + std::to_string( vehicle->MoverParameters->ScndCtrlActualPos ) + ")" )
|
||||||
|
+ "; I=" +
|
||||||
|
( vehicle->MoverParameters->TrainType == dt_EZT ?
|
||||||
|
std::to_string( int( vehicle->MoverParameters->ShowCurrent( 0 ) ) ) :
|
||||||
|
std::to_string( int( vehicle->MoverParameters->Im ) ) )
|
||||||
|
+ "; U=" + to_string( int( vehicle->MoverParameters->RunningTraction.TractionVoltage + 0.5 ) )
|
||||||
|
+ "; R=" +
|
||||||
|
( std::abs( vehicle->MoverParameters->RunningShape.R ) > 10000.0 ?
|
||||||
|
"~0.0" :
|
||||||
|
to_string( vehicle->MoverParameters->RunningShape.R, 1 ) )
|
||||||
|
+ " An=" + to_string( vehicle->MoverParameters->AccN, 2 ); // przyspieszenie poprzeczne
|
||||||
|
|
||||||
|
if( tprev != simulation::Time.data().wSecond ) {
|
||||||
|
tprev = simulation::Time.data().wSecond;
|
||||||
|
Acc = ( vehicle->MoverParameters->Vel - VelPrev ) / 3.6;
|
||||||
|
VelPrev = vehicle->MoverParameters->Vel;
|
||||||
|
}
|
||||||
|
uitextline2 += "; As=" + to_string( Acc, 2 ); // przyspieszenie wzdłużne
|
||||||
|
uitextline2 += " eAngle=" + to_string( std::cos( vehicle->MoverParameters->eAngle ), 2 );
|
||||||
|
|
||||||
|
uitextline3 =
|
||||||
|
"cyl.ham. " + to_string( vehicle->MoverParameters->BrakePress, 2 )
|
||||||
|
+ "; prz.gl. " + to_string( vehicle->MoverParameters->PipePress, 2 )
|
||||||
|
+ "; zb.gl. " + to_string( vehicle->MoverParameters->CompressedVolume, 2 )
|
||||||
|
// youBy - drugi wezyk
|
||||||
|
+ "; p.zas. " + to_string( vehicle->MoverParameters->ScndPipePress, 2 );
|
||||||
|
|
||||||
|
// McZapkie: warto wiedziec w jakim stanie sa przelaczniki
|
||||||
|
if( vehicle->MoverParameters->ConvOvldFlag )
|
||||||
|
uitextline3 += " C! ";
|
||||||
|
else if( vehicle->MoverParameters->FuseFlag )
|
||||||
|
uitextline3 += " F! ";
|
||||||
|
else if( !vehicle->MoverParameters->Mains )
|
||||||
|
uitextline3 += " () ";
|
||||||
|
else {
|
||||||
|
switch(
|
||||||
|
vehicle->MoverParameters->ActiveDir *
|
||||||
|
( vehicle->MoverParameters->Imin == vehicle->MoverParameters->IminLo ?
|
||||||
|
1 :
|
||||||
|
2 ) ) {
|
||||||
|
case 2: { uitextline3 += " >> "; break; }
|
||||||
|
case 1: { uitextline3 += " -> "; break; }
|
||||||
|
case 0: { uitextline3 += " -- "; break; }
|
||||||
|
case -1: { uitextline3 += " <- "; break; }
|
||||||
|
case -2: { uitextline3 += " << "; break; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// McZapkie: predkosc szlakowa
|
||||||
|
if( vehicle->MoverParameters->RunningTrack.Velmax == -1 ) {
|
||||||
|
uitextline3 += " Vtrack=Vmax";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uitextline3 += " Vtrack " + to_string( vehicle->MoverParameters->RunningTrack.Velmax, 2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( vehicle->MoverParameters->EnginePowerSource.SourceType == CurrentCollector )
|
||||||
|
|| ( vehicle->MoverParameters->TrainType == dt_EZT ) ) {
|
||||||
|
uitextline3 +=
|
||||||
|
"; pant. " + to_string( vehicle->MoverParameters->PantPress, 2 )
|
||||||
|
+ ( vehicle->MoverParameters->bPantKurek3 ? "=" : "^" ) + "ZG";
|
||||||
|
}
|
||||||
|
|
||||||
|
// McZapkie: komenda i jej parametry
|
||||||
|
if( vehicle->MoverParameters->CommandIn.Command != ( "" ) ) {
|
||||||
|
uitextline4 =
|
||||||
|
"C:" + vehicle->MoverParameters->CommandIn.Command
|
||||||
|
+ " V1=" + to_string( vehicle->MoverParameters->CommandIn.Value1, 0 )
|
||||||
|
+ " V2=" + to_string( vehicle->MoverParameters->CommandIn.Value2, 0 );
|
||||||
|
}
|
||||||
|
if( ( vehicle->Mechanik )
|
||||||
|
&& ( vehicle->Mechanik->AIControllFlag == AIdriver ) ) {
|
||||||
|
uitextline4 +=
|
||||||
|
"AI: Vd=" + to_string( vehicle->Mechanik->VelDesired, 0 )
|
||||||
|
+ " ad=" + to_string(vehicle->Mechanik->AccDesired, 2)
|
||||||
|
+ "/" + to_string(vehicle->Mechanik->AccDesired*vehicle->Mechanik->BrakeAccFactor(), 2)
|
||||||
|
+ " atrain=" + to_string(vehicle->Mechanik->fBrake_a0[0], 2)
|
||||||
|
+ "+" + to_string(vehicle->Mechanik->fBrake_a1[0], 2)
|
||||||
|
+ " aS=" + to_string(vehicle->Mechanik->AbsAccS_pub, 2)
|
||||||
|
+ " Pd=" + to_string( vehicle->Mechanik->ActualProximityDist, 0 )
|
||||||
|
+ " Vn=" + to_string( vehicle->Mechanik->VelNext, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
// induction motor data
|
||||||
|
if( vehicle->MoverParameters->EngineType == ElectricInductionMotor ) {
|
||||||
|
|
||||||
|
UITable->text_lines.emplace_back( " eimc: eimv: press:", Global.UITextColor );
|
||||||
|
for( int i = 0; i <= 20; ++i ) {
|
||||||
|
|
||||||
|
std::string parameters =
|
||||||
|
vehicle->MoverParameters->eimc_labels[ i ] + to_string( vehicle->MoverParameters->eimc[ i ], 2, 9 )
|
||||||
|
+ " | "
|
||||||
|
+ vehicle->MoverParameters->eimv_labels[ i ] + to_string( vehicle->MoverParameters->eimv[ i ], 2, 9 );
|
||||||
|
|
||||||
|
if( i < 10 ) {
|
||||||
|
parameters += " | " + train->fPress_labels[i] + to_string( train->fPress[ i ][ 0 ], 2, 9 );
|
||||||
|
}
|
||||||
|
else if( i == 12 ) {
|
||||||
|
parameters += " med:";
|
||||||
|
}
|
||||||
|
else if( i >= 13 ) {
|
||||||
|
parameters += " | " + vehicle->MED_labels[ i - 13 ] + to_string( vehicle->MED[ 0 ][ i - 13 ], 2, 9 );
|
||||||
|
}
|
||||||
|
|
||||||
|
UITable->text_lines.emplace_back( parameters, Global.UITextColor );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (vehicle->MoverParameters->EngineType == DieselEngine) {
|
||||||
|
std::string parameters = "param value";
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "efill: " + to_string(vehicle->MoverParameters->dizel_fill, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "etorq: " + to_string(vehicle->MoverParameters->dizel_Torque, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "creal: " + to_string(vehicle->MoverParameters->dizel_engage, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "cdesi: " + to_string(vehicle->MoverParameters->dizel_engagestate, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "cdelt: " + to_string(vehicle->MoverParameters->dizel_engagedeltaomega, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "gears: " + to_string(vehicle->MoverParameters->dizel_automaticgearstatus, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "hydro value";
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "hTCnI: " + to_string(vehicle->MoverParameters->hydro_TC_nIn, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "hTCnO: " + to_string(vehicle->MoverParameters->hydro_TC_nOut, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "hTCTM: " + to_string(vehicle->MoverParameters->hydro_TC_TMRatio, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "hTCTI: " + to_string(vehicle->MoverParameters->hydro_TC_TorqueIn, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "hTCTO: " + to_string(vehicle->MoverParameters->hydro_TC_TorqueOut, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "hTCfl: " + to_string(vehicle->MoverParameters->hydro_TC_Fill, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
parameters = "hTCLR: " + to_string(vehicle->MoverParameters->hydro_TC_LockupRate, 2, 9);
|
||||||
|
UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
//parameters = "hTCXX: " + to_string(vehicle->MoverParameters->hydro_TC_nIn, 2, 9);
|
||||||
|
//UITable->text_lines.emplace_back(parameters, Global.UITextColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // if( DebugModeFlag && Controlled )
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef EU07_USE_OLD_UI_CODE
|
||||||
|
if( Controlled && DebugModeFlag && !Global.iTextMode ) {
|
||||||
|
|
||||||
|
uitextline1 +=
|
||||||
|
( "; d_omega " ) + to_string( Controlled->MoverParameters->dizel_engagedeltaomega, 3 );
|
||||||
|
|
||||||
|
if( Controlled->MoverParameters->EngineType == ElectricInductionMotor ) {
|
||||||
|
|
||||||
|
for( int i = 0; i <= 8; i++ ) {
|
||||||
|
for( int j = 0; j <= 9; j++ ) {
|
||||||
|
glRasterPos2f( 0.05f + 0.03f * i, 0.16f - 0.01f * j );
|
||||||
|
uitextline4 = to_string( Train->fEIMParams[ i ][ j ], 2 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// update the ui header texts
|
||||||
|
auto &headerdata = UIHeader->text_lines;
|
||||||
|
headerdata[ 0 ].data = uitextline1;
|
||||||
|
headerdata[ 1 ].data = uitextline2;
|
||||||
|
headerdata[ 2 ].data = uitextline3;
|
||||||
|
headerdata[ 3 ].data = uitextline4;
|
||||||
|
|
||||||
|
// stenogramy dźwięków (ukryć, gdy tabelka skanowania lub rozkład?)
|
||||||
|
auto &transcripts = UITranscripts->text_lines;
|
||||||
|
transcripts.clear();
|
||||||
|
for( auto const &transcript : ui::Transcripts.aLines ) {
|
||||||
|
|
||||||
|
if( Global.fTimeAngleDeg >= transcript.fShow ) {
|
||||||
|
|
||||||
|
cParser parser( transcript.asText );
|
||||||
|
while( true == parser.getTokens( 1, false, "|" ) ) {
|
||||||
|
|
||||||
|
std::string transcriptline; parser >> transcriptline;
|
||||||
|
transcripts.emplace_back( transcriptline, glm::vec4( 1.0f, 1.0f, 0.0f, 1.0f ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ui_layer::render() {
|
ui_layer::render() {
|
||||||
|
|
||||||
|
|||||||
19
uilayer.h
19
uilayer.h
@@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -40,8 +40,15 @@ public:
|
|||||||
// methods:
|
// methods:
|
||||||
bool
|
bool
|
||||||
init( GLFWwindow *Window );
|
init( GLFWwindow *Window );
|
||||||
|
// assign texturing hardware unit
|
||||||
void
|
void
|
||||||
set_unit( GLint const Textureunit ) { m_textureunit = Textureunit; }
|
set_unit( GLint const Textureunit ) { m_textureunit = Textureunit; }
|
||||||
|
// potentially processes provided input key. returns: true if the input was processed, false otherwise
|
||||||
|
bool
|
||||||
|
on_key( int const Key, int const Action );
|
||||||
|
// updates state of UI elements
|
||||||
|
void
|
||||||
|
update();
|
||||||
// draws requested UI elements
|
// draws requested UI elements
|
||||||
void
|
void
|
||||||
render();
|
render();
|
||||||
@@ -85,11 +92,10 @@ private:
|
|||||||
void
|
void
|
||||||
quad( glm::vec4 const &Coordinates, glm::vec4 const &Color );
|
quad( glm::vec4 const &Coordinates, glm::vec4 const &Color );
|
||||||
|
|
||||||
|
|
||||||
// members:
|
// members:
|
||||||
GLFWwindow *m_window { nullptr };
|
GLFWwindow *m_window { nullptr };
|
||||||
GLint m_textureunit{ GL_TEXTURE0 };
|
GLint m_textureunit{ GL_TEXTURE0 };
|
||||||
GLuint m_fontbase { (GLuint)-1 }; // numer DL dla znaków w napisach
|
GLuint m_fontbase { (GLuint)-1 }; // numer DL dla znaków w napisach
|
||||||
|
|
||||||
// progress bar config. TODO: put these together into an object
|
// progress bar config. TODO: put these together into an object
|
||||||
float m_progress { 0.0f }; // percentage of filled progres bar, to indicate lengthy operations.
|
float m_progress { 0.0f }; // percentage of filled progres bar, to indicate lengthy operations.
|
||||||
@@ -101,6 +107,13 @@ private:
|
|||||||
GLuint m_texture { 0 };
|
GLuint m_texture { 0 };
|
||||||
std::vector<std::shared_ptr<ui_panel> > m_panels;
|
std::vector<std::shared_ptr<ui_panel> > m_panels;
|
||||||
std::string m_tooltip;
|
std::string m_tooltip;
|
||||||
|
// TODO: clean these legacy components up
|
||||||
|
std::shared_ptr<ui_panel> UIHeader; // header ui panel
|
||||||
|
std::shared_ptr<ui_panel> UITable; // schedule or scan table
|
||||||
|
std::shared_ptr<ui_panel> UITranscripts; // voice transcripts
|
||||||
|
int tprev; // poprzedni czas
|
||||||
|
double VelPrev; // poprzednia prędkość
|
||||||
|
double Acc; // przyspieszenie styczne
|
||||||
};
|
};
|
||||||
|
|
||||||
extern ui_layer UILayer;
|
extern ui_layer UILayer;
|
||||||
|
|||||||
Reference in New Issue
Block a user