16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-24 04:19:18 +02:00

dangling pointer crash semi-fix, minor bug fixes, minor code correctness enhancements

This commit is contained in:
tmj-fstate
2018-07-16 02:40:53 +02:00
parent ed1e0d8a10
commit 3751c8a0a8
28 changed files with 895 additions and 946 deletions

View File

@@ -361,13 +361,14 @@ void TAnimContainer::UpdateModelIK()
{ // odwrotna kinematyka wyliczana dopiero po ustawieniu macierzy w submodelach { // odwrotna kinematyka wyliczana dopiero po ustawieniu macierzy w submodelach
if (pSubModel) // pozbyć się tego - sprawdzać wcześniej if (pSubModel) // pozbyć się tego - sprawdzać wcześniej
{ {
if (pSubModel->b_Anim & at_IK) if ((pSubModel->b_Anim == TAnimType::at_IK)
||(pSubModel->b_Anim == TAnimType::at_IK22))
{ // odwrotna kinematyka { // odwrotna kinematyka
float3 d, k; float3 d, k;
TSubModel *ch = pSubModel->ChildGet(); TSubModel *ch = pSubModel->ChildGet();
switch (pSubModel->b_Anim) switch (pSubModel->b_Anim)
{ {
case at_IK11: // stopa: ustawić w kierunku czubka (pierwszy potomny) case TAnimType::at_IK11: // stopa: ustawić w kierunku czubka (pierwszy potomny)
d = ch->Translation1Get(); // wektor względem aktualnego układu (nie uwzględnia d = ch->Translation1Get(); // wektor względem aktualnego układu (nie uwzględnia
// obrotu) // obrotu)
k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0, k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0,
@@ -377,7 +378,7 @@ void TAnimContainer::UpdateModelIK()
// WriteLog("--> "+AnsiString(k.x)+" "+AnsiString(k.y)+" "+AnsiString(k.z)); // WriteLog("--> "+AnsiString(k.x)+" "+AnsiString(k.y)+" "+AnsiString(k.z));
// Ra: to już jest dobrze, może być inna ćwiartka i znak // Ra: to już jest dobrze, może być inna ćwiartka i znak
break; break;
case at_IK22: // udo: ustawić w kierunku pierwszej potomnej pierwszej potomnej (kostki) case TAnimType::at_IK22: // udo: ustawić w kierunku pierwszej potomnej pierwszej potomnej (kostki)
// pozycję kostki należy określić względem kości centralnej (+biodro może być // pozycję kostki należy określić względem kości centralnej (+biodro może być
// pochylone) // pochylone)
// potem wyliczyć ewentualne odchylenie w tej i następnej // potem wyliczyć ewentualne odchylenie w tej i następnej

View File

@@ -27,7 +27,7 @@ void TCamera::Init( Math3D::vector3 NPos, Math3D::vector3 NAngle) {
Roll = NAngle.z; Roll = NAngle.z;
Pos = NPos; Pos = NPos;
Type = (Global.bFreeFly ? tp_Free : tp_Follow); Type = (Global.bFreeFly ? TCameraType::tp_Free : TCameraType::tp_Follow);
}; };
void TCamera::Reset() { void TCamera::Reset() {
@@ -76,12 +76,12 @@ TCamera::OnCommand( command_data const &Command ) {
case user_command::movehorizontalfast: { case user_command::movehorizontalfast: {
auto const movespeed = ( auto const movespeed = (
Type == tp_Free ? runspeed : Type == TCameraType::tp_Free ? runspeed :
Type == tp_Follow ? walkspeed : Type == TCameraType::tp_Follow ? walkspeed :
0.0 ); 0.0 );
auto const speedmultiplier = ( auto const speedmultiplier = (
( ( Type == tp_Free ) && ( Command.command == user_command::movehorizontalfast ) ) ? ( ( Type == TCameraType::tp_Free ) && ( Command.command == user_command::movehorizontalfast ) ) ?
30.0 : 30.0 :
1.0 ); 1.0 );
@@ -111,12 +111,12 @@ TCamera::OnCommand( command_data const &Command ) {
case user_command::moveverticalfast: { case user_command::moveverticalfast: {
auto const movespeed = ( auto const movespeed = (
Type == tp_Free ? runspeed * 0.5 : Type == TCameraType::tp_Free ? runspeed * 0.5 :
Type == tp_Follow ? walkspeed : Type == TCameraType::tp_Follow ? walkspeed :
0.0 ); 0.0 );
auto const speedmultiplier = ( auto const speedmultiplier = (
( ( Type == tp_Free ) && ( Command.command == user_command::moveverticalfast ) ) ? ( ( Type == TCameraType::tp_Free ) && ( Command.command == user_command::moveverticalfast ) ) ?
10.0 : 10.0 :
1.0 ); 1.0 );
@@ -145,8 +145,8 @@ TCamera::OnCommand( command_data const &Command ) {
void TCamera::Update() void TCamera::Update()
{ {
if( FreeFlyModeFlag == true ) { Type = tp_Free; } if( FreeFlyModeFlag == true ) { Type = TCameraType::tp_Free; }
else { Type = tp_Follow; } else { Type = TCameraType::tp_Follow; }
// check for sent user commands // check for sent user commands
// NOTE: this is a temporary arrangement, for the transition period from old command setup to the new one // NOTE: this is a temporary arrangement, for the transition period from old command setup to the new one
@@ -162,7 +162,7 @@ void TCamera::Update()
auto const deltatime { Timer::GetDeltaRenderTime() }; // czas bez pauzy auto const deltatime { Timer::GetDeltaRenderTime() }; // czas bez pauzy
// update position // update position
if( ( Type == tp_Free ) if( ( Type == TCameraType::tp_Free )
|| ( false == Global.ctrlState ) || ( false == Global.ctrlState )
|| ( true == DebugCameraFlag ) ) { || ( true == DebugCameraFlag ) ) {
// ctrl is used for mirror view, so we ignore the controls when in vehicle if ctrl is pressed // ctrl is used for mirror view, so we ignore the controls when in vehicle if ctrl is pressed
@@ -172,7 +172,7 @@ void TCamera::Update()
Velocity.y = clamp( Velocity.y + m_moverate.y * 10.0 * deltatime, -std::abs( m_moverate.y ), std::abs( m_moverate.y ) ); Velocity.y = clamp( Velocity.y + m_moverate.y * 10.0 * deltatime, -std::abs( m_moverate.y ), std::abs( m_moverate.y ) );
} }
if( ( Type == tp_Free ) if( ( Type == TCameraType::tp_Free )
|| ( true == DebugCameraFlag ) ) { || ( true == DebugCameraFlag ) ) {
// free movement position update is handled here, movement while in vehicle is handled by train update // free movement position update is handled here, movement while in vehicle is handled by train update
Math3D::vector3 Vec = Velocity; Math3D::vector3 Vec = Velocity;
@@ -193,7 +193,7 @@ void TCamera::Update()
Pitch -= rotationfactor * m_rotationoffsets.x; Pitch -= rotationfactor * m_rotationoffsets.x;
m_rotationoffsets.x *= ( 1.0 - rotationfactor ); m_rotationoffsets.x *= ( 1.0 - rotationfactor );
if( Type == tp_Follow ) { if( Type == TCameraType::tp_Follow ) {
// jeżeli jazda z pojazdem ograniczenie kąta spoglądania w dół i w górę // jeżeli jazda z pojazdem ograniczenie kąta spoglądania w dół i w górę
Pitch = clamp( Pitch, -M_PI_4, M_PI_4 ); Pitch = clamp( Pitch, -M_PI_4, M_PI_4 );
} }
@@ -210,7 +210,7 @@ bool TCamera::SetMatrix( glm::dmat4 &Matrix ) {
Matrix = glm::rotate( Matrix, -Pitch, glm::dvec3( 1.0, 0.0, 0.0 ) ); Matrix = glm::rotate( Matrix, -Pitch, glm::dvec3( 1.0, 0.0, 0.0 ) );
Matrix = glm::rotate( Matrix, -Yaw, glm::dvec3( 0.0, 1.0, 0.0 ) ); // w zewnętrznym widoku: kierunek patrzenia Matrix = glm::rotate( Matrix, -Yaw, glm::dvec3( 0.0, 1.0, 0.0 ) ); // w zewnętrznym widoku: kierunek patrzenia
if( ( Type == tp_Follow ) && ( false == DebugCameraFlag ) ) { if( ( Type == TCameraType::tp_Follow ) && ( false == DebugCameraFlag ) ) {
Matrix *= glm::lookAt( Matrix *= glm::lookAt(
glm::dvec3{ Pos }, glm::dvec3{ Pos },

View File

@@ -13,7 +13,7 @@ http://mozilla.org/MPL/2.0/.
#include "command.h" #include "command.h"
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
enum TCameraType enum class TCameraType
{ // tryby pracy kamery { // tryby pracy kamery
tp_Follow, // jazda z pojazdem tp_Follow, // jazda z pojazdem
tp_Free, // stoi na scenerii tp_Free, // stoi na scenerii

View File

@@ -46,7 +46,7 @@ class TMtableTime; // czas dla danego posterunku
class TController; // obiekt sterujący pociągiem (AI) class TController; // obiekt sterujący pociągiem (AI)
enum TCommandType enum class TCommandType
{ // binarne odpowiedniki komend w komórce pamięci { // binarne odpowiedniki komend w komórce pamięci
cm_Unknown, // ciąg nierozpoznany (nie jest komendą) cm_Unknown, // ciąg nierozpoznany (nie jest komendą)
cm_Ready, // W4 zezwala na odjazd, ale semafor może zatrzymać cm_Ready, // W4 zezwala na odjazd, ale semafor może zatrzymać

View File

@@ -201,12 +201,12 @@ void TSpeedPos::CommandCheck()
double value2 = evEvent->ValueGet(2); double value2 = evEvent->ValueGet(2);
switch (command) switch (command)
{ {
case cm_ShuntVelocity: case TCommandType::cm_ShuntVelocity:
// prędkość manewrową zapisać, najwyżej AI zignoruje przy analizie tabelki // prędkość manewrową zapisać, najwyżej AI zignoruje przy analizie tabelki
fVelNext = value1; // powinno być value2, bo druga określa "za"? fVelNext = value1; // powinno być value2, bo druga określa "za"?
iFlags |= spShuntSemaphor; iFlags |= spShuntSemaphor;
break; break;
case cm_SetVelocity: case TCommandType::cm_SetVelocity:
// w semaforze typu "m" jest ShuntVelocity dla Ms2 i SetVelocity dla S1 // w semaforze typu "m" jest ShuntVelocity dla Ms2 i SetVelocity dla S1
// SetVelocity * 0 -> można jechać, ale stanąć przed // SetVelocity * 0 -> można jechać, ale stanąć przed
// SetVelocity 0 20 -> stanąć przed, potem można jechać 20 (SBL) // SetVelocity 0 20 -> stanąć przed, potem można jechać 20 (SBL)
@@ -222,31 +222,31 @@ void TSpeedPos::CommandCheck()
iFlags |= spStopOnSBL; // flaga, że ma zatrzymać; na pewno nie zezwoli na manewry iFlags |= spStopOnSBL; // flaga, że ma zatrzymać; na pewno nie zezwoli na manewry
} }
break; break;
case cm_SectionVelocity: case TCommandType::cm_SectionVelocity:
// odcinek z ograniczeniem prędkości // odcinek z ograniczeniem prędkości
fVelNext = value1; fVelNext = value1;
fSectionVelocityDist = value2; fSectionVelocityDist = value2;
iFlags |= spSectionVel; iFlags |= spSectionVel;
break; break;
case cm_RoadVelocity: case TCommandType::cm_RoadVelocity:
// prędkość drogowa (od tej pory będzie jako domyślna najwyższa) // prędkość drogowa (od tej pory będzie jako domyślna najwyższa)
fVelNext = value1; fVelNext = value1;
iFlags |= spRoadVel; iFlags |= spRoadVel;
break; break;
case cm_PassengerStopPoint: case TCommandType::cm_PassengerStopPoint:
// nie ma dostępu do rozkładu // nie ma dostępu do rozkładu
// przystanek, najwyżej AI zignoruje przy analizie tabelki // przystanek, najwyżej AI zignoruje przy analizie tabelki
// if ((iFlags & spPassengerStopPoint) == 0) // if ((iFlags & spPassengerStopPoint) == 0)
fVelNext = 0.0; // TrainParams->IsStop()?0.0:-1.0; //na razie tak fVelNext = 0.0; // TrainParams->IsStop()?0.0:-1.0; //na razie tak
iFlags |= spPassengerStopPoint; // niestety nie da się w tym miejscu współpracować z rozkładem iFlags |= spPassengerStopPoint; // niestety nie da się w tym miejscu współpracować z rozkładem
break; break;
case cm_SetProximityVelocity: case TCommandType::cm_SetProximityVelocity:
// musi zostać gdyż inaczej nie działają manewry // musi zostać gdyż inaczej nie działają manewry
fVelNext = -1; fVelNext = -1;
iFlags |= spProximityVelocity; iFlags |= spProximityVelocity;
// fSectionVelocityDist = value2; // fSectionVelocityDist = value2;
break; break;
case cm_OutsideStation: case TCommandType::cm_OutsideStation:
// w trybie manewrowym: skanować od niej wstecz i stanąć po wyjechaniu za sygnalizator i // w trybie manewrowym: skanować od niej wstecz i stanąć po wyjechaniu za sygnalizator i
// zmienić kierunek // zmienić kierunek
// w trybie pociągowym: można przyspieszyć do wskazanej prędkości (po zjechaniu z rozjazdów) // w trybie pociągowym: można przyspieszyć do wskazanej prędkości (po zjechaniu z rozjazdów)
@@ -803,7 +803,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
double d; // droga double d; // droga
double d_to_next_sem = 10000.0; //ustaiwamy na pewno dalej niż widzi AI double d_to_next_sem = 10000.0; //ustaiwamy na pewno dalej niż widzi AI
bool isatpassengerstop { false }; // true if the consist is within acceptable range of w4 post bool isatpassengerstop { false }; // true if the consist is within acceptable range of w4 post
TCommandType go = cm_Unknown; TCommandType go = TCommandType::cm_Unknown;
eSignNext = NULL; eSignNext = NULL;
// te flagi są ustawiane tutaj, w razie potrzeby // te flagi są ustawiane tutaj, w razie potrzeby
iDrivigFlags &= ~(moveTrackEnd | moveSwitchFound | moveSemaphorFound | moveSpeedLimitFound); iDrivigFlags &= ~(moveTrackEnd | moveSwitchFound | moveSemaphorFound | moveSpeedLimitFound);
@@ -1011,8 +1011,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
iDrivigFlags |= moveStopCloser; // do następnego W4 podjechać blisko (z dociąganiem) iDrivigFlags |= moveStopCloser; // do następnego W4 podjechać blisko (z dociąganiem)
sSpeedTable[i].iFlags = 0; // nie liczy się już zupełnie (nie wyśle SetVelocity) sSpeedTable[i].iFlags = 0; // nie liczy się już zupełnie (nie wyśle SetVelocity)
sSpeedTable[i].fVelNext = -1; // można jechać za W4 sSpeedTable[i].fVelNext = -1; // można jechać za W4
if (go == cm_Unknown) // jeśli nie było komendy wcześniej if (go == TCommandType::cm_Unknown) // jeśli nie było komendy wcześniej
go = cm_Ready; // gotów do odjazdu z W4 (semafor może go = TCommandType::cm_Ready; // gotów do odjazdu z W4 (semafor może
// zatrzymać) // zatrzymać)
if( false == tsGuardSignal.empty() ) { if( false == tsGuardSignal.empty() ) {
// jeśli mamy głos kierownika, to odegrać // jeśli mamy głos kierownika, to odegrać
@@ -1232,12 +1232,12 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
sSpeedTable[ i ].iFlags = 0; sSpeedTable[ i ].iFlags = 0;
} }
} }
else if( go == cm_Unknown ) { else if( go == TCommandType::cm_Unknown ) {
// jeśli jeszcze nie ma komendy // jeśli jeszcze nie ma komendy
// komenda jest tylko gdy ma jechać, bo stoi na podstawietabelki // komenda jest tylko gdy ma jechać, bo stoi na podstawietabelki
if( v != 0.0 ) { if( v != 0.0 ) {
// jeśli nie było komendy wcześniej - pierwsza się liczy - ustawianie VelSignal // jeśli nie było komendy wcześniej - pierwsza się liczy - ustawianie VelSignal
go = cm_ShuntVelocity; // w trybie pociągowym tylko jeśli włącza go = TCommandType::cm_ShuntVelocity; // w trybie pociągowym tylko jeśli włącza
// tryb manewrowy (v!=0.0) // tryb manewrowy (v!=0.0)
// Ra 2014-06: (VelSignal) nie może być tu ustawiane, bo Tm może być // Ra 2014-06: (VelSignal) nie może być tu ustawiane, bo Tm może być
// daleko // daleko
@@ -1258,12 +1258,12 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
} }
else if( !( sSpeedTable[ i ].iFlags & spSectionVel ) ) { else if( !( sSpeedTable[ i ].iFlags & spSectionVel ) ) {
//jeśli jakiś event pasywny ale nie ograniczenie //jeśli jakiś event pasywny ale nie ograniczenie
if( go == cm_Unknown ) { if( go == TCommandType::cm_Unknown ) {
// jeśli nie było komendy wcześniej - pierwsza się liczy - ustawianie VelSignal // jeśli nie było komendy wcześniej - pierwsza się liczy - ustawianie VelSignal
if( ( v < 0.0 ) if( ( v < 0.0 )
|| ( v >= 1.0 ) ) { || ( v >= 1.0 ) ) {
// bo wartość 0.1 służy do hamowania tylko // bo wartość 0.1 służy do hamowania tylko
go = cm_SetVelocity; // może odjechać go = TCommandType::cm_SetVelocity; // może odjechać
// Ra 2014-06: (VelSignal) nie może być tu ustawiane, bo semafor może być daleko // Ra 2014-06: (VelSignal) nie może być tu ustawiane, bo semafor może być daleko
// VelSignal=v; //nie do końca tak, to jest druga prędkość; -1 nie wpisywać... // VelSignal=v; //nie do końca tak, to jest druga prędkość; -1 nie wpisywać...
if( VelSignal == 0.0 ) { if( VelSignal == 0.0 ) {
@@ -1295,12 +1295,12 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
eSignNext = sSpeedTable[ i ].evEvent; // dla informacji eSignNext = sSpeedTable[ i ].evEvent; // dla informacji
if( true == TestFlag( iDrivigFlags, moveStopHere ) ) { if( true == TestFlag( iDrivigFlags, moveStopHere ) ) {
// jeśli ma stać, dostaje komendę od razu // jeśli ma stać, dostaje komendę od razu
go = cm_Command; // komenda z komórki, do wykonania po zatrzymaniu go = TCommandType::cm_Command; // komenda z komórki, do wykonania po zatrzymaniu
} }
else if( sSpeedTable[ i ].fDist <= fMaxProximityDist ) { else if( sSpeedTable[ i ].fDist <= fMaxProximityDist ) {
// jeśli ma dociągnąć, to niech dociąga // jeśli ma dociągnąć, to niech dociąga
// (moveStopCloser dotyczy dociągania do W4, nie semafora) // (moveStopCloser dotyczy dociągania do W4, nie semafora)
go = cm_Command; // komenda z komórki, do wykonania po zatrzymaniu go = TCommandType::cm_Command; // komenda z komórki, do wykonania po zatrzymaniu
} }
} }
} }
@@ -1671,7 +1671,7 @@ void TController::Activation()
TDynamicObject *old = pVehicle, *d = pVehicle; // w tym siedzi AI TDynamicObject *old = pVehicle, *d = pVehicle; // w tym siedzi AI
TController *drugi; // jakby były dwa, to zamienić miejscami, a nie robić wycieku pamięci TController *drugi; // jakby były dwa, to zamienić miejscami, a nie robić wycieku pamięci
// poprzez nadpisanie // poprzez nadpisanie
int brake = mvOccupied->LocalBrakePos; auto const localbrakelevel { mvOccupied->LocalBrakePosA };
while (mvControlling->MainCtrlPos) // samo zapętlenie DecSpeed() nie wystarcza :/ while (mvControlling->MainCtrlPos) // samo zapętlenie DecSpeed() nie wystarcza :/
DecSpeed(true); // wymuszenie zerowania nastawnika jazdy DecSpeed(true); // wymuszenie zerowania nastawnika jazdy
while (mvOccupied->ActiveDir < 0) while (mvOccupied->ActiveDir < 0)
@@ -1683,7 +1683,7 @@ void TController::Activation()
{ {
mvControlling->MainSwitch( mvControlling->MainSwitch(
false); // dezaktywacja czuwaka, jeśli przejście do innego członu false); // dezaktywacja czuwaka, jeśli przejście do innego członu
mvOccupied->DecLocalBrakeLevel(10); // zwolnienie hamulca w opuszczanym pojeździe mvOccupied->DecLocalBrakeLevel(LocalBrakePosNo); // zwolnienie hamulca w opuszczanym pojeździe
// mvOccupied->BrakeLevelSet((mvOccupied->BrakeHandle==FVel6)?4:-2); //odcięcie na // mvOccupied->BrakeLevelSet((mvOccupied->BrakeHandle==FVel6)?4:-2); //odcięcie na
// zaworze maszynisty, FVel6 po drugiej stronie nie luzuje // zaworze maszynisty, FVel6 po drugiej stronie nie luzuje
mvOccupied->BrakeLevelSet( mvOccupied->BrakeLevelSet(
@@ -1721,7 +1721,7 @@ void TController::Activation()
ControllingSet(); // utworzenie połączenia do sterowanego pojazdu (może się zmienić) - ControllingSet(); // utworzenie połączenia do sterowanego pojazdu (może się zmienić) -
// silnikowy dla EZT // silnikowy dla EZT
} }
if( mvControlling->EngineType == DieselEngine ) { if( mvControlling->EngineType == TEngineType::DieselEngine ) {
// dla 2Ls150 - przed ustawieniem kierunku - można zmienić tryb pracy // dla 2Ls150 - przed ustawieniem kierunku - można zmienić tryb pracy
if( mvControlling->ShuntModeAllow ) { if( mvControlling->ShuntModeAllow ) {
mvControlling->CurrentSwitch( mvControlling->CurrentSwitch(
@@ -1736,8 +1736,8 @@ void TController::Activation()
// mvOccupied->ActiveDir=0; //żeby sam ustawił kierunek // mvOccupied->ActiveDir=0; //żeby sam ustawił kierunek
mvOccupied->CabActivisation(); // uruchomienie kabin w członach mvOccupied->CabActivisation(); // uruchomienie kabin w członach
DirectionForward(true); // nawrotnik do przodu DirectionForward(true); // nawrotnik do przodu
if (brake) // hamowanie tylko jeśli był wcześniej zahamowany (bo możliwe, że jedzie!) if (localbrakelevel > 0.0) // hamowanie tylko jeśli był wcześniej zahamowany (bo możliwe, że jedzie!)
mvOccupied->IncLocalBrakeLevel(brake); // zahamuj jak wcześniej mvOccupied->LocalBrakePosA = localbrakelevel; // zahamuj jak wcześniej
CheckVehicles(); // sprawdzenie składu, AI zapali światła CheckVehicles(); // sprawdzenie składu, AI zapali światła
TableClear(); // resetowanie tabelki skanowania torów TableClear(); // resetowanie tabelki skanowania torów
} }
@@ -1984,7 +1984,7 @@ bool TController::CheckVehicles(TOrders user)
p->DestinationSet(TrainParams->Relation2, TrainParams->TrainName); // relacja docelowa, jeśli nie było p->DestinationSet(TrainParams->Relation2, TrainParams->TrainName); // relacja docelowa, jeśli nie było
if (AIControllFlag) // jeśli prowadzi komputer if (AIControllFlag) // jeśli prowadzi komputer
p->RaLightsSet(0, 0); // gasimy światła p->RaLightsSet(0, 0); // gasimy światła
if (p->MoverParameters->EnginePowerSource.SourceType == CurrentCollector) if (p->MoverParameters->EnginePowerSource.SourceType == TPowerSource::CurrentCollector)
{ // jeśli pojazd posiada pantograf, to przydzielamy mu maskę, którą będzie informował o { // jeśli pojazd posiada pantograf, to przydzielamy mu maskę, którą będzie informował o
// jeździe bezprądowej // jeździe bezprądowej
p->iOverheadMask = pantmask; p->iOverheadMask = pantmask;
@@ -2274,7 +2274,7 @@ bool TController::PrepareEngine()
ReactionTime = PrepareTime; ReactionTime = PrepareTime;
iDrivigFlags |= moveActive; // może skanować sygnały i reagować na komendy iDrivigFlags |= moveActive; // może skanować sygnały i reagować na komendy
if ( mvControlling->EnginePowerSource.SourceType == CurrentCollector ) { if ( mvControlling->EnginePowerSource.SourceType == TPowerSource::CurrentCollector ) {
voltfront = true; voltfront = true;
voltrear = true; voltrear = true;
} }
@@ -2288,15 +2288,15 @@ bool TController::PrepareEngine()
if (AIControllFlag) { if (AIControllFlag) {
// część wykonawcza dla sterowania przez komputer // część wykonawcza dla sterowania przez komputer
mvOccupied->BatterySwitch( true ); mvOccupied->BatterySwitch( true );
if( ( mvControlling->EngineType == DieselElectric ) if( ( mvControlling->EngineType == TEngineType::DieselElectric )
|| ( mvControlling->EngineType == DieselEngine ) ) { || ( mvControlling->EngineType == TEngineType::DieselEngine ) ) {
mvControlling->OilPumpSwitch( true ); mvControlling->OilPumpSwitch( true );
workingtemperature = UpdateHeating(); workingtemperature = UpdateHeating();
if( true == workingtemperature ) { if( true == workingtemperature ) {
mvControlling->FuelPumpSwitch( true ); mvControlling->FuelPumpSwitch( true );
} }
} }
if (mvControlling->EnginePowerSource.SourceType == CurrentCollector) if (mvControlling->EnginePowerSource.SourceType == TPowerSource::CurrentCollector)
{ // jeśli silnikowy jest pantografującym { // jeśli silnikowy jest pantografującym
mvOccupied->PantFront( true ); mvOccupied->PantFront( true );
mvOccupied->PantRear( true ); mvOccupied->PantRear( true );
@@ -2427,7 +2427,7 @@ bool TController::ReleaseEngine()
ReactionTime = PrepareTime; ReactionTime = PrepareTime;
if (AIControllFlag) if (AIControllFlag)
{ // jeśli steruje komputer { // jeśli steruje komputer
if (mvOccupied->DoorCloseCtrl == control::driver) if (mvOccupied->DoorCloseCtrl == control_t::driver)
{ // zamykanie drzwi { // zamykanie drzwi
if (mvOccupied->DoorLeftOpened) if (mvOccupied->DoorLeftOpened)
mvOccupied->DoorLeft(false); mvOccupied->DoorLeft(false);
@@ -2439,7 +2439,7 @@ bool TController::ReleaseEngine()
{ {
mvControlling->CompressorSwitch(false); mvControlling->CompressorSwitch(false);
mvControlling->ConverterSwitch(false); mvControlling->ConverterSwitch(false);
if (mvControlling->EnginePowerSource.SourceType == CurrentCollector) if (mvControlling->EnginePowerSource.SourceType == TPowerSource::CurrentCollector)
{ {
mvControlling->PantFront(false); mvControlling->PantFront(false);
mvControlling->PantRear(false); mvControlling->PantRear(false);
@@ -2474,15 +2474,15 @@ bool TController::ReleaseEngine()
{ // jeśli się zatrzymał { // jeśli się zatrzymał
iEngineActive = 0; iEngineActive = 0;
eStopReason = stopSleep; // stoimy z powodu wyłączenia eStopReason = stopSleep; // stoimy z powodu wyłączenia
eAction = actSleep; //śpi (wygaszony) eAction = TAction::actSleep; //śpi (wygaszony)
if (AIControllFlag) if (AIControllFlag)
{ {
if( ( mvControlling->EngineType == DieselElectric ) if( ( mvControlling->EngineType == TEngineType::DieselElectric )
|| ( mvControlling->EngineType == DieselEngine ) ) { || ( mvControlling->EngineType == TEngineType::DieselEngine ) ) {
// heating/cooling subsystem // heating/cooling subsystem
mvControlling->WaterHeaterSwitch( false ); mvControlling->WaterHeaterSwitch( false );
// optionally turn off the water pump as well // optionally turn off the water pump as well
if( mvControlling->WaterPump.start_type != start::battery ) { if( mvControlling->WaterPump.start_type != start_t::battery ) {
mvControlling->WaterPumpSwitch( false ); mvControlling->WaterPumpSwitch( false );
} }
// fuel and oil subsystems // fuel and oil subsystems
@@ -2504,8 +2504,8 @@ bool TController::IncBrake()
{ // zwiększenie hamowania { // zwiększenie hamowania
bool OK = false; bool OK = false;
switch( mvOccupied->BrakeSystem ) { switch( mvOccupied->BrakeSystem ) {
case Individual: { case TBrakeSystem::Individual: {
if( mvOccupied->LocalBrake == ManualBrake ) { if( mvOccupied->LocalBrake == TLocalBrake::ManualBrake ) {
OK = mvOccupied->IncManualBrakeLevel( 1 + static_cast<int>( std::floor( 0.5 + std::fabs( AccDesired ) ) ) ); OK = mvOccupied->IncManualBrakeLevel( 1 + static_cast<int>( std::floor( 0.5 + std::fabs( AccDesired ) ) ) );
} }
else { else {
@@ -2513,7 +2513,7 @@ bool TController::IncBrake()
} }
break; break;
} }
case Pneumatic: { case TBrakeSystem::Pneumatic: {
// NOTE: can't perform just test whether connected vehicle == nullptr, due to virtual couplers formed with nearby vehicles // NOTE: can't perform just test whether connected vehicle == nullptr, due to virtual couplers formed with nearby vehicles
bool standalone { true }; bool standalone { true };
if( ( mvOccupied->TrainType == dt_ET41 ) if( ( mvOccupied->TrainType == dt_ET41 )
@@ -2577,7 +2577,7 @@ bool TController::IncBrake()
} }
pos_corr = pos_corr / fMass * 2.5; pos_corr = pos_corr / fMass * 2.5;
if (mvOccupied->BrakeHandle == FV4a) if (mvOccupied->BrakeHandle == TBrakeHandle::FV4a)
{ {
pos_corr += mvOccupied->Handle->GetCP()*0.2; pos_corr += mvOccupied->Handle->GetCP()*0.2;
@@ -2621,9 +2621,9 @@ bool TController::IncBrake()
} }
break; break;
} }
case ElectroPneumatic: { case TBrakeSystem::ElectroPneumatic: {
if( mvOccupied->EngineType == ElectricInductionMotor ) { if( mvOccupied->EngineType == TEngineType::ElectricInductionMotor ) {
if (mvOccupied->BrakeHandle == MHZ_EN57) { if (mvOccupied->BrakeHandle == TBrakeHandle::MHZ_EN57) {
if (mvOccupied->BrakeCtrlPos < mvOccupied->Handle->GetPos(bh_FB)) if (mvOccupied->BrakeCtrlPos < mvOccupied->Handle->GetPos(bh_FB))
OK = mvOccupied->BrakeLevelAdd(1.0); OK = mvOccupied->BrakeLevelAdd(1.0);
} }
@@ -2652,13 +2652,13 @@ bool TController::DecBrake()
double deltaAcc = 0; double deltaAcc = 0;
switch (mvOccupied->BrakeSystem) switch (mvOccupied->BrakeSystem)
{ {
case Individual: case TBrakeSystem::Individual:
if (mvOccupied->LocalBrake == ManualBrake) if (mvOccupied->LocalBrake == TLocalBrake::ManualBrake)
OK = mvOccupied->DecManualBrakeLevel(1 + floor(0.5 + fabs(AccDesired))); OK = mvOccupied->DecManualBrakeLevel(1 + floor(0.5 + fabs(AccDesired)));
else else
OK = mvOccupied->DecLocalBrakeLevel(1 + floor(0.5 + fabs(AccDesired))); OK = mvOccupied->DecLocalBrakeLevel(1 + floor(0.5 + fabs(AccDesired)));
break; break;
case Pneumatic: case TBrakeSystem::Pneumatic:
deltaAcc = -AccDesired*BrakeAccFactor() - (fBrake_a0[0] + 4 * (mvOccupied->BrakeCtrlPosR-1.0)*fBrake_a1[0]); deltaAcc = -AccDesired*BrakeAccFactor() - (fBrake_a0[0] + 4 * (mvOccupied->BrakeCtrlPosR-1.0)*fBrake_a1[0]);
if (deltaAcc < 0) if (deltaAcc < 0)
{ {
@@ -2672,13 +2672,13 @@ bool TController::DecBrake()
} }
} }
if (!OK) if (!OK)
OK = mvOccupied->DecLocalBrakeLevel(2); OK = mvOccupied->DecLocalBrakeLevel(LocalBrakePosNo);
if (mvOccupied->PipePress < 3.0) if (mvOccupied->PipePress < 3.0)
Need_BrakeRelease = true; Need_BrakeRelease = true;
break; break;
case ElectroPneumatic: case TBrakeSystem::ElectroPneumatic:
if (mvOccupied->EngineType == ElectricInductionMotor) { if (mvOccupied->EngineType == TEngineType::ElectricInductionMotor) {
if (mvOccupied->BrakeHandle == MHZ_EN57) { if (mvOccupied->BrakeHandle == TBrakeHandle::MHZ_EN57) {
if (mvOccupied->BrakeCtrlPos > mvOccupied->Handle->GetPos(bh_RP)) if (mvOccupied->BrakeCtrlPos > mvOccupied->Handle->GetPos(bh_RP))
OK = mvOccupied->BrakeLevelAdd(-1.0); OK = mvOccupied->BrakeLevelAdd(-1.0);
} }
@@ -2696,7 +2696,7 @@ bool TController::DecBrake()
else else
OK = false; OK = false;
if (!OK) if (!OK)
OK = mvOccupied->DecLocalBrakeLevel(2); OK = mvOccupied->DecLocalBrakeLevel(LocalBrakePosNo);
break; break;
} }
return OK; return OK;
@@ -2726,12 +2726,12 @@ bool TController::IncSpeed()
return false; // jak poślizg, to nie przyspieszamy return false; // jak poślizg, to nie przyspieszamy
switch (mvOccupied->EngineType) switch (mvOccupied->EngineType)
{ {
case None: // McZapkie-041003: wagon sterowniczy case TEngineType::None: // McZapkie-041003: wagon sterowniczy
if (mvControlling->MainCtrlPosNo > 0) // jeśli ma czym kręcić if (mvControlling->MainCtrlPosNo > 0) // jeśli ma czym kręcić
iDrivigFlags |= moveIncSpeed; // ustawienie flagi jazdy iDrivigFlags |= moveIncSpeed; // ustawienie flagi jazdy
return false; return false;
case ElectricSeriesMotor: case TEngineType::ElectricSeriesMotor:
if (mvControlling->EnginePowerSource.SourceType == CurrentCollector) // jeśli pantografujący if (mvControlling->EnginePowerSource.SourceType == TPowerSource::CurrentCollector) // jeśli pantografujący
{ {
if (fOverhead2 >= 0.0) // a jazda bezprądowa ustawiana eventami (albo opuszczenie) if (fOverhead2 >= 0.0) // a jazda bezprądowa ustawiana eventami (albo opuszczenie)
return false; // to nici z ruszania return false; // to nici z ruszania
@@ -2813,8 +2813,8 @@ bool TController::IncSpeed()
} }
mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania
break; break;
case Dumb: case TEngineType::Dumb:
case DieselElectric: case TEngineType::DieselElectric:
if (!mvControlling->FuseFlag) if (!mvControlling->FuseFlag)
if (Ready || (iDrivigFlags & movePress)) //{(BrakePress<=0.01*MaxBrakePress)} if (Ready || (iDrivigFlags & movePress)) //{(BrakePress<=0.01*MaxBrakePress)}
{ {
@@ -2823,7 +2823,7 @@ bool TController::IncSpeed()
OK = mvControlling->IncScndCtrl(1); OK = mvControlling->IncScndCtrl(1);
} }
break; break;
case ElectricInductionMotor: case TEngineType::ElectricInductionMotor:
if (!mvControlling->FuseFlag) if (!mvControlling->FuseFlag)
if (Ready || (iDrivigFlags & movePress) || (mvOccupied->ShuntMode)) //{(BrakePress<=0.01*MaxBrakePress)} if (Ready || (iDrivigFlags & movePress) || (mvOccupied->ShuntMode)) //{(BrakePress<=0.01*MaxBrakePress)}
{ {
@@ -2839,7 +2839,7 @@ bool TController::IncSpeed()
} }
break; break;
case WheelsDriven: case TEngineType::WheelsDriven:
if (!mvControlling->CabNo) if (!mvControlling->CabNo)
mvControlling->CabActivisation(); mvControlling->CabActivisation();
if (sin(mvControlling->eAngle) > 0) if (sin(mvControlling->eAngle) > 0)
@@ -2847,7 +2847,7 @@ bool TController::IncSpeed()
else else
mvControlling->DecMainCtrl(3 + 3 * floor(0.5 + fabs(AccDesired))); mvControlling->DecMainCtrl(3 + 3 * floor(0.5 + fabs(AccDesired)));
break; break;
case DieselEngine: case TEngineType::DieselEngine:
if (mvControlling->ShuntModeAllow) if (mvControlling->ShuntModeAllow)
{ // dla 2Ls150 można zmienić tryb pracy, jeśli jest w liniowym i nie daje rady (wymaga zerowania kierunku) { // dla 2Ls150 można zmienić tryb pracy, jeśli jest w liniowym i nie daje rady (wymaga zerowania kierunku)
// mvControlling->ShuntMode=(OrderList[OrderPos]&Shunt)||(fMass>224000.0); // mvControlling->ShuntMode=(OrderList[OrderPos]&Shunt)||(fMass>224000.0);
@@ -2876,29 +2876,29 @@ bool TController::DecSpeed(bool force)
bool OK = false; // domyślnie false, aby wyszło z pętli while bool OK = false; // domyślnie false, aby wyszło z pętli while
switch (mvOccupied->EngineType) switch (mvOccupied->EngineType)
{ {
case None: // McZapkie-041003: wagon sterowniczy case TEngineType::None: // McZapkie-041003: wagon sterowniczy
iDrivigFlags &= ~moveIncSpeed; // usunięcie flagi jazdy iDrivigFlags &= ~moveIncSpeed; // usunięcie flagi jazdy
if (force) // przy aktywacji kabiny jest potrzeba natychmiastowego wyzerowania if (force) // przy aktywacji kabiny jest potrzeba natychmiastowego wyzerowania
if (mvControlling->MainCtrlPosNo > 0) // McZapkie-041003: wagon sterowniczy, np. EZT if (mvControlling->MainCtrlPosNo > 0) // McZapkie-041003: wagon sterowniczy, np. EZT
mvControlling->DecMainCtrl(1 + (mvControlling->MainCtrlPos > 2 ? 1 : 0)); mvControlling->DecMainCtrl(1 + (mvControlling->MainCtrlPos > 2 ? 1 : 0));
mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania
return false; return false;
case ElectricSeriesMotor: case TEngineType::ElectricSeriesMotor:
OK = mvControlling->DecScndCtrl(2); // najpierw bocznik na zero OK = mvControlling->DecScndCtrl(2); // najpierw bocznik na zero
if (!OK) if (!OK)
OK = mvControlling->DecMainCtrl(1 + (mvControlling->MainCtrlPos > 2 ? 1 : 0)); OK = mvControlling->DecMainCtrl(1 + (mvControlling->MainCtrlPos > 2 ? 1 : 0));
mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania mvControlling->AutoRelayCheck(); // sprawdzenie logiki sterowania
break; break;
case Dumb: case TEngineType::Dumb:
case DieselElectric: case TEngineType::DieselElectric:
OK = mvControlling->DecScndCtrl(2); OK = mvControlling->DecScndCtrl(2);
if (!OK) if (!OK)
OK = mvControlling->DecMainCtrl(2 + (mvControlling->MainCtrlPos / 2)); OK = mvControlling->DecMainCtrl(2 + (mvControlling->MainCtrlPos / 2));
break; break;
case ElectricInductionMotor: case TEngineType::ElectricInductionMotor:
OK = mvControlling->DecMainCtrl(1); OK = mvControlling->DecMainCtrl(1);
break; break;
case WheelsDriven: case TEngineType::WheelsDriven:
if (!mvControlling->CabNo) if (!mvControlling->CabNo)
mvControlling->CabActivisation(); mvControlling->CabActivisation();
if (sin(mvControlling->eAngle) < 0) if (sin(mvControlling->eAngle) < 0)
@@ -2906,7 +2906,7 @@ bool TController::DecSpeed(bool force)
else else
mvControlling->DecMainCtrl(3 + 3 * floor(0.5 + fabs(AccDesired))); mvControlling->DecMainCtrl(3 + 3 * floor(0.5 + fabs(AccDesired)));
break; break;
case DieselEngine: case TEngineType::DieselEngine:
if ((mvControlling->Vel > mvControlling->dizel_minVelfullengage)) if ((mvControlling->Vel > mvControlling->dizel_minVelfullengage))
{ {
if (mvControlling->RList[mvControlling->MainCtrlPos].Mn > 0) if (mvControlling->RList[mvControlling->MainCtrlPos].Mn > 0)
@@ -2928,7 +2928,7 @@ void TController::SpeedSet()
// ma dokręcać do bezoporowych i zdejmować pozycje w przypadku przekroczenia prądu // ma dokręcać do bezoporowych i zdejmować pozycje w przypadku przekroczenia prądu
switch (mvOccupied->EngineType) switch (mvOccupied->EngineType)
{ {
case None: // McZapkie-041003: wagon sterowniczy case TEngineType::None: // McZapkie-041003: wagon sterowniczy
if (mvControlling->MainCtrlPosNo > 0) if (mvControlling->MainCtrlPosNo > 0)
{ // jeśli ma czym kręcić { // jeśli ma czym kręcić
// TODO: sprawdzanie innego czlonu //if (!FuseFlagCheck()) // TODO: sprawdzanie innego czlonu //if (!FuseFlagCheck())
@@ -2993,7 +2993,7 @@ void TController::SpeedSet()
} }
} }
break; break;
case ElectricSeriesMotor: case TEngineType::ElectricSeriesMotor:
if( ( false == mvControlling->StLinFlag ) if( ( false == mvControlling->StLinFlag )
&& ( false == mvControlling->DelayCtrlFlag ) ) { && ( false == mvControlling->DelayCtrlFlag ) ) {
// styczniki liniowe rozłączone yBARC // styczniki liniowe rozłączone yBARC
@@ -3063,15 +3063,15 @@ void TController::SpeedSet()
// bezoporowej // bezoporowej
} }
break; break;
case Dumb: case TEngineType::Dumb:
case DieselElectric: case TEngineType::DieselElectric:
case ElectricInductionMotor: case TEngineType::ElectricInductionMotor:
break; break;
// WheelsDriven : // WheelsDriven :
// begin // begin
// OK:=False; // OK:=False;
// end; // end;
case DieselEngine: case TEngineType::DieselEngine:
// Ra 2014-06: "automatyczna" skrzynia biegów... // Ra 2014-06: "automatyczna" skrzynia biegów...
if (!mvControlling->MotorParam[mvControlling->ScndCtrlPos].AutoSwitch) // gdy biegi ręczne if (!mvControlling->MotorParam[mvControlling->ScndCtrlPos].AutoSwitch) // gdy biegi ręczne
if ((mvControlling->ShuntMode ? mvControlling->AnPos : 1.0) * mvControlling->Vel > if ((mvControlling->ShuntMode ? mvControlling->AnPos : 1.0) * mvControlling->Vel >
@@ -3128,7 +3128,7 @@ void TController::Doors( bool const Open, int const Side ) {
// wagony muszą mieć baterię załączoną do otwarcia drzwi... // wagony muszą mieć baterię załączoną do otwarcia drzwi...
vehicle->MoverParameters->BatterySwitch( true ); vehicle->MoverParameters->BatterySwitch( true );
// otwieranie drzwi w pojazdach - flaga zezwolenia była by lepsza // otwieranie drzwi w pojazdach - flaga zezwolenia była by lepsza
if( vehicle->MoverParameters->DoorOpenCtrl != control::passenger ) { if( vehicle->MoverParameters->DoorOpenCtrl != control_t::passenger ) {
// if the door are controlled by the driver, we let the user operate them... // if the door are controlled by the driver, we let the user operate them...
if( true == AIControllFlag ) { if( true == AIControllFlag ) {
// ...unless this user is an ai // ...unless this user is an ai
@@ -3137,9 +3137,9 @@ void TController::Doors( bool const Open, int const Side ) {
auto const lewe = ( vehicle->DirectionGet() > 0 ) ? 1 : 2; auto const lewe = ( vehicle->DirectionGet() > 0 ) ? 1 : 2;
auto const prawe = 3 - lewe; auto const prawe = 3 - lewe;
if( Side & lewe ) if( Side & lewe )
vehicle->MoverParameters->DoorLeft( true, range::local ); vehicle->MoverParameters->DoorLeft( true, range_t::local );
if( Side & prawe ) if( Side & prawe )
vehicle->MoverParameters->DoorRight( true, range::local ); vehicle->MoverParameters->DoorRight( true, range_t::local );
} }
} }
// pojazd podłączony z tyłu (patrząc od czoła) // pojazd podłączony z tyłu (patrząc od czoła)
@@ -3169,9 +3169,9 @@ void TController::Doors( bool const Open, int const Side ) {
auto *vehicle = pVehicles[ 0 ]; // pojazd na czole składu auto *vehicle = pVehicles[ 0 ]; // pojazd na czole składu
while( vehicle != nullptr ) { while( vehicle != nullptr ) {
// zamykanie drzwi w pojazdach - flaga zezwolenia była by lepsza // zamykanie drzwi w pojazdach - flaga zezwolenia była by lepsza
if( vehicle->MoverParameters->DoorCloseCtrl != control::autonomous ) { if( vehicle->MoverParameters->DoorCloseCtrl != control_t::autonomous ) {
vehicle->MoverParameters->DoorLeft( false, range::local ); // w lokomotywie można by nie zamykać... vehicle->MoverParameters->DoorLeft( false, range_t::local ); // w lokomotywie można by nie zamykać...
vehicle->MoverParameters->DoorRight( false, range::local ); vehicle->MoverParameters->DoorRight( false, range_t::local );
} }
vehicle = vehicle->Next(); // pojazd podłączony z tyłu (patrząc od czoła) vehicle = vehicle->Next(); // pojazd podłączony z tyłu (patrząc od czoła)
} }
@@ -3625,8 +3625,8 @@ void TController::PhysicsLog()
<< mvControlling->Im << " " << mvControlling->Im << " "
<< int(mvControlling->MainCtrlPos) << " " << int(mvControlling->MainCtrlPos) << " "
<< int(mvControlling->ScndCtrlPos) << " " << int(mvControlling->ScndCtrlPos) << " "
<< int(mvOccupied->BrakeCtrlPos) << " " << mvOccupied->fBrakeCtrlPos << " "
<< int(mvOccupied->LocalBrakePos) << " " << mvOccupied->LocalBrakePosA << " "
<< int(mvControlling->ActiveDir) << " " << int(mvControlling->ActiveDir) << " "
<< ( mvOccupied->CommandIn.Command.empty() ? "none" : mvOccupied->CommandIn.Command.c_str() ) << " " << ( mvOccupied->CommandIn.Command.empty() ? "none" : mvOccupied->CommandIn.Command.c_str() ) << " "
<< mvOccupied->CommandIn.Value1 << " " << mvOccupied->CommandIn.Value1 << " "
@@ -3752,14 +3752,14 @@ TController::UpdateSituation(double dt) {
auto const *vehicle { p->MoverParameters }; auto const *vehicle { p->MoverParameters };
if( ( vehicle->EngineType == DieselEngine ) if( ( vehicle->EngineType == TEngineType::DieselEngine )
|| ( vehicle->EngineType == DieselElectric ) ) { || ( vehicle->EngineType == TEngineType::DieselElectric ) ) {
Ready = ( Ready = (
( vehicle->Vel > 0.5 ) // already moving ( vehicle->Vel > 0.5 ) // already moving
|| ( false == vehicle->Mains ) // deadweight vehicle || ( false == vehicle->Mains ) // deadweight vehicle
|| ( vehicle->enrot > 0.8 * ( || ( vehicle->enrot > 0.8 * (
vehicle->EngineType == DieselEngine ? vehicle->EngineType == TEngineType::DieselEngine ?
vehicle->dizel_nmin : vehicle->dizel_nmin :
vehicle->DElist[ 0 ].RPM / 60.0 ) ) ); vehicle->DElist[ 0 ].RPM / 60.0 ) ) );
} }
@@ -3770,7 +3770,7 @@ TController::UpdateSituation(double dt) {
// for human-controlled vehicles with no door control and dynamic brake auto-activating with door open // for human-controlled vehicles with no door control and dynamic brake auto-activating with door open
if( ( false == AIControllFlag ) if( ( false == AIControllFlag )
&& ( iDrivigFlags & moveDoorOpened ) && ( iDrivigFlags & moveDoorOpened )
&& ( mvOccupied->DoorCloseCtrl != control::driver ) && ( mvOccupied->DoorCloseCtrl != control_t::driver )
&& ( mvControlling->MainCtrlPos > 0 ) ) { && ( mvControlling->MainCtrlPos > 0 ) ) {
Doors( false ); Doors( false );
} }
@@ -3790,7 +3790,7 @@ TController::UpdateSituation(double dt) {
} }
} }
if (mvControlling->EnginePowerSource.SourceType == CurrentCollector) { if (mvControlling->EnginePowerSource.SourceType == TPowerSource::CurrentCollector) {
if( mvOccupied->ScndPipePress > 4.3 ) { if( mvOccupied->ScndPipePress > 4.3 ) {
// gdy główna sprężarka bezpiecznie nabije ciśnienie to można przestawić kurek na zasilanie pantografów z głównej pneumatyki // gdy główna sprężarka bezpiecznie nabije ciśnienie to można przestawić kurek na zasilanie pantografów z głównej pneumatyki
@@ -3827,7 +3827,7 @@ TController::UpdateSituation(double dt) {
*/ */
} }
if (mvControlling->EnginePowerSource.SourceType == CurrentCollector) { if (mvControlling->EnginePowerSource.SourceType == TPowerSource::CurrentCollector) {
if( mvOccupied->Vel > 0.05 ) { if( mvOccupied->Vel > 0.05 ) {
// is moving // is moving
@@ -3873,7 +3873,7 @@ TController::UpdateSituation(double dt) {
// if the power station is heavily burdened try to reduce the load // if the power station is heavily burdened try to reduce the load
switch( mvControlling->EngineType ) { switch( mvControlling->EngineType ) {
case ElectricSeriesMotor: { case TEngineType::ElectricSeriesMotor: {
if( mvControlling->RList[ mvControlling->MainCtrlPos ].Bn > 1 ) { if( mvControlling->RList[ mvControlling->MainCtrlPos ].Bn > 1 ) {
// limit yourself to series mode // limit yourself to series mode
if( mvControlling->ScndCtrlPos ) { if( mvControlling->ScndCtrlPos ) {
@@ -4168,7 +4168,7 @@ TController::UpdateSituation(double dt) {
// 3. faza odczepiania. // 3. faza odczepiania.
SetVelocity(2, 0); // jazda w ustawionym kierunku z prędkością 2 SetVelocity(2, 0); // jazda w ustawionym kierunku z prędkością 2
if ((mvControlling->MainCtrlPos > 0) || if ((mvControlling->MainCtrlPos > 0) ||
(mvOccupied->BrakeSystem == ElectroPneumatic)) // jeśli jazda (mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic)) // jeśli jazda
{ {
WriteLog(mvOccupied->Name + " odczepianie w kierunku " + std::to_string(mvOccupied->DirAbsolute)); WriteLog(mvOccupied->Name + " odczepianie w kierunku " + std::to_string(mvOccupied->DirAbsolute));
TDynamicObject *p = TDynamicObject *p =
@@ -4223,7 +4223,7 @@ TController::UpdateSituation(double dt) {
// powino zostać wyłączone) // powino zostać wyłączone)
// WriteLog("Zahamowanie składu"); // WriteLog("Zahamowanie składu");
mvOccupied->BrakeLevelSet( mvOccupied->BrakeLevelSet(
mvOccupied->BrakeSystem == ElectroPneumatic ? mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic ?
1 : 1 :
3 ); 3 );
double p = mvOccupied->BrakePressureActual.PipePressureVal; double p = mvOccupied->BrakePressureActual.PipePressureVal;
@@ -4232,18 +4232,18 @@ TController::UpdateSituation(double dt) {
// TODO: zabezpieczenie przed dziwnymi CHK do czasu wyjaśnienia sensu 0 oraz -1 w tym miejscu // TODO: zabezpieczenie przed dziwnymi CHK do czasu wyjaśnienia sensu 0 oraz -1 w tym miejscu
p = 3.9; p = 3.9;
} }
if (mvOccupied->BrakeSystem == ElectroPneumatic ? if (mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic ?
mvOccupied->BrakePress > 2 : mvOccupied->BrakePress > 2 :
mvOccupied->PipePress < p + 0.1) mvOccupied->PipePress < p + 0.1)
{ // jeśli w miarę został zahamowany (ciśnienie mniejsze niż podane na { // jeśli w miarę został zahamowany (ciśnienie mniejsze niż podane na
// pozycji 3, zwyle 0.37) // pozycji 3, zwyle 0.37)
if (mvOccupied->BrakeSystem == ElectroPneumatic) if (mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic)
mvOccupied->BrakeLevelSet(0); // wyłączenie EP, gdy wystarczy (może mvOccupied->BrakeLevelSet(0); // wyłączenie EP, gdy wystarczy (może
// nie być potrzebne, bo na początku // nie być potrzebne, bo na początku
// jest) // jest)
WriteLog("Luzowanie lokomotywy i zmiana kierunku"); WriteLog("Luzowanie lokomotywy i zmiana kierunku");
mvOccupied->BrakeReleaser(1); // wyluzuj lokomotywę; a ST45? mvOccupied->BrakeReleaser(1); // wyluzuj lokomotywę; a ST45?
mvOccupied->DecLocalBrakeLevel(10); // zwolnienie hamulca mvOccupied->DecLocalBrakeLevel(LocalBrakePosNo); // zwolnienie hamulca
iDrivigFlags |= movePress; // następnie będzie dociskanie iDrivigFlags |= movePress; // następnie będzie dociskanie
DirectionForward(mvOccupied->ActiveDir < 0); // zmiana kierunku jazdy na przeciwny (dociskanie) DirectionForward(mvOccupied->ActiveDir < 0); // zmiana kierunku jazdy na przeciwny (dociskanie)
CheckVehicles(); // od razu zmienić światła (zgasić) - bez tego się nie odczepi CheckVehicles(); // od razu zmienić światła (zgasić) - bez tego się nie odczepi
@@ -4512,7 +4512,7 @@ TController::UpdateSituation(double dt) {
switch (comm) switch (comm)
{ // ustawienie VelSignal - trochę proteza = do przemyślenia { // ustawienie VelSignal - trochę proteza = do przemyślenia
case cm_Ready: // W4 zezwolił na jazdę case TCommandType::cm_Ready: // W4 zezwolił na jazdę
// ewentualne doskanowanie trasy za W4, który zezwolił na jazdę // ewentualne doskanowanie trasy za W4, który zezwolił na jazdę
TableCheck( routescanrange); TableCheck( routescanrange);
TableUpdate(VelDesired, ActualProximityDist, VelNext, AccDesired); // aktualizacja po skanowaniu TableUpdate(VelDesired, ActualProximityDist, VelNext, AccDesired); // aktualizacja po skanowaniu
@@ -4520,21 +4520,21 @@ TController::UpdateSituation(double dt) {
break; // ale jak coś z przodu zamyka, to ma stać break; // ale jak coś z przodu zamyka, to ma stać
if (iDrivigFlags & moveStopCloser) if (iDrivigFlags & moveStopCloser)
VelSignal = -1.0; // ma czekać na sygnał z sygnalizatora! VelSignal = -1.0; // ma czekać na sygnał z sygnalizatora!
case cm_SetVelocity: // od wersji 357 semafor nie budzi wyłączonej lokomotywy case TCommandType::cm_SetVelocity: // od wersji 357 semafor nie budzi wyłączonej lokomotywy
if (!(OrderList[OrderPos] & if (!(OrderList[OrderPos] &
~(Obey_train | Shunt))) // jedzie w dowolnym trybie albo Wait_for_orders ~(Obey_train | Shunt))) // jedzie w dowolnym trybie albo Wait_for_orders
if (fabs(VelSignal) >= if (fabs(VelSignal) >=
1.0) // 0.1 nie wysyła się do samochodow, bo potem nie ruszą 1.0) // 0.1 nie wysyła się do samochodow, bo potem nie ruszą
PutCommand("SetVelocity", VelSignal, VelNext, nullptr); // komenda robi dodatkowe operacje PutCommand("SetVelocity", VelSignal, VelNext, nullptr); // komenda robi dodatkowe operacje
break; break;
case cm_ShuntVelocity: // od wersji 357 Tm nie budzi wyłączonej lokomotywy case TCommandType::cm_ShuntVelocity: // od wersji 357 Tm nie budzi wyłączonej lokomotywy
if (!(OrderList[OrderPos] & if (!(OrderList[OrderPos] &
~(Obey_train | Shunt))) // jedzie w dowolnym trybie albo Wait_for_orders ~(Obey_train | Shunt))) // jedzie w dowolnym trybie albo Wait_for_orders
PutCommand("ShuntVelocity", VelSignal, VelNext, nullptr); PutCommand("ShuntVelocity", VelSignal, VelNext, nullptr);
else if (iCoupler) // jeśli jedzie w celu połączenia else if (iCoupler) // jeśli jedzie w celu połączenia
SetVelocity(VelSignal, VelNext); SetVelocity(VelSignal, VelNext);
break; break;
case cm_Command: // komenda z komórki case TCommandType::cm_Command: // komenda z komórki
if( !( OrderList[ OrderPos ] & ~( Obey_train | Shunt ) ) ) { if( !( OrderList[ OrderPos ] & ~( Obey_train | Shunt ) ) ) {
// jedzie w dowolnym trybie albo Wait_for_orders // jedzie w dowolnym trybie albo Wait_for_orders
if( mvOccupied->Vel < 0.1 ) { if( mvOccupied->Vel < 0.1 ) {
@@ -4557,12 +4557,12 @@ TController::UpdateSituation(double dt) {
if( ( OrderList[ OrderPos ] & Connect ) ? if( ( OrderList[ OrderPos ] & Connect ) ?
( pVehicles[ 0 ]->fTrackBlock > 2000 || pVehicles[ 0 ]->fTrackBlock > FirstSemaphorDist ) : ( pVehicles[ 0 ]->fTrackBlock > 2000 || pVehicles[ 0 ]->fTrackBlock > FirstSemaphorDist ) :
true ) { true ) {
if( ( comm = BackwardScan() ) != cm_Unknown ) { if( ( comm = BackwardScan() ) != TCommandType::cm_Unknown ) {
// jeśli w drugą można jechać // jeśli w drugą można jechać
// należy sprawdzać odległość od znalezionego sygnalizatora, // należy sprawdzać odległość od znalezionego sygnalizatora,
// aby w przypadku prędkości 0.1 wyciągnąć najpierw skład za sygnalizator // aby w przypadku prędkości 0.1 wyciągnąć najpierw skład za sygnalizator
// i dopiero wtedy zmienić kierunek jazdy, oczekując podania prędkości >0.5 // i dopiero wtedy zmienić kierunek jazdy, oczekując podania prędkości >0.5
if( comm == cm_Command ) { if( comm == TCommandType::cm_Command ) {
// jeśli komenda Shunt to ją odbierz bez przemieszczania się (np. odczep wagony po dopchnięciu do końca toru) // jeśli komenda Shunt to ją odbierz bez przemieszczania się (np. odczep wagony po dopchnięciu do końca toru)
iDrivigFlags |= moveStopHere; iDrivigFlags |= moveStopHere;
} }
@@ -5044,9 +5044,9 @@ TController::UpdateSituation(double dt) {
PrepareEngine(); // próba ponownego załączenia PrepareEngine(); // próba ponownego załączenia
} }
// włączanie bezpiecznika // włączanie bezpiecznika
if ((mvControlling->EngineType == ElectricSeriesMotor) || if ((mvControlling->EngineType == TEngineType::ElectricSeriesMotor) ||
(mvControlling->TrainType & dt_EZT) || (mvControlling->TrainType & dt_EZT) ||
(mvControlling->EngineType == DieselElectric)) (mvControlling->EngineType == TEngineType::DieselElectric))
if (mvControlling->FuseFlag || Need_TryAgain) if (mvControlling->FuseFlag || Need_TryAgain)
{ {
Need_TryAgain = false; // true, jeśli druga pozycja w elektryku nie załapała Need_TryAgain = false; // true, jeśli druga pozycja w elektryku nie załapała
@@ -5079,8 +5079,8 @@ TController::UpdateSituation(double dt) {
ReactionTime = 0.25; ReactionTime = 0.25;
} }
} }
if (mvOccupied->BrakeSystem == Pneumatic) // napełnianie uderzeniowe if (mvOccupied->BrakeSystem == TBrakeSystem::Pneumatic) // napełnianie uderzeniowe
if (mvOccupied->BrakeHandle == FV4a) if (mvOccupied->BrakeHandle == TBrakeHandle::FV4a)
{ {
if( mvOccupied->BrakeCtrlPos == -2 ) { if( mvOccupied->BrakeCtrlPos == -2 ) {
mvOccupied->BrakeLevelSet( 0 ); mvOccupied->BrakeLevelSet( 0 );
@@ -5282,7 +5282,7 @@ TController::UpdateSituation(double dt) {
if( ( VelDesired == 0.0 ) if( ( VelDesired == 0.0 )
&& ( vel > VelDesired ) && ( vel > VelDesired )
&& ( ActualProximityDist <= fMinProximityDist ) && ( ActualProximityDist <= fMinProximityDist )
&& ( mvOccupied->LocalBrakePos == 0 ) ) { && ( mvOccupied->LocalBrakePosA < 0.01 ) ) {
IncBrake(); IncBrake();
} }
} }
@@ -5335,8 +5335,8 @@ TController::UpdateHeating() {
switch( mvControlling->EngineType ) { switch( mvControlling->EngineType ) {
case DieselElectric: case TEngineType::DieselElectric:
case DieselEngine: { case TEngineType::DieselEngine: {
auto const &heat { mvControlling->dizel_heat }; auto const &heat { mvControlling->dizel_heat };
@@ -5368,7 +5368,7 @@ TController::UpdateHeating() {
mvControlling->WaterHeaterSwitch( false ); mvControlling->WaterHeaterSwitch( false );
mvControlling->WaterHeaterBreakerSwitch( false ); mvControlling->WaterHeaterBreakerSwitch( false );
// optionally turn off the water pump as well // optionally turn off the water pump as well
if( mvControlling->WaterPump.start_type != start::battery ) { if( mvControlling->WaterPump.start_type != start_t::battery ) {
mvControlling->WaterPumpSwitch( false ); mvControlling->WaterPumpSwitch( false );
mvControlling->WaterPumpBreakerSwitch( false ); mvControlling->WaterPumpBreakerSwitch( false );
} }
@@ -5738,13 +5738,13 @@ TCommandType TController::BackwardScan()
// zwraca true, jeśli należy odwrócić kierunek jazdy pojazdu // zwraca true, jeśli należy odwrócić kierunek jazdy pojazdu
if( ( OrderList[ OrderPos ] & ~( Shunt | Connect ) ) ) { if( ( OrderList[ OrderPos ] & ~( Shunt | Connect ) ) ) {
// skanowanie sygnałów tylko gdy jedzie w trybie manewrowym albo czeka na rozkazy // skanowanie sygnałów tylko gdy jedzie w trybie manewrowym albo czeka na rozkazy
return cm_Unknown; return TCommandType::cm_Unknown;
} }
// kierunek jazdy względem sprzęgów pojazdu na czele // kierunek jazdy względem sprzęgów pojazdu na czele
int const startdir = -pVehicles[0]->DirectionGet(); int const startdir = -pVehicles[0]->DirectionGet();
if( startdir == 0 ) { if( startdir == 0 ) {
// jeśli kabina i kierunek nie jest określony nie robimy nic // jeśli kabina i kierunek nie jest określony nie robimy nic
return cm_Unknown; return TCommandType::cm_Unknown;
} }
// szukamy od pierwszej osi w wybranym kierunku // szukamy od pierwszej osi w wybranym kierunku
double scandir = startdir * pVehicles[0]->RaDirectionGet(); double scandir = startdir * pVehicles[0]->RaDirectionGet();
@@ -5759,7 +5759,7 @@ TCommandType TController::BackwardScan()
auto const dir = startdir * pVehicles[0]->VectorFront(); // wektor w kierunku jazdy/szukania auto const dir = startdir * pVehicles[0]->VectorFront(); // wektor w kierunku jazdy/szukania
if( !scantrack ) { if( !scantrack ) {
// jeśli wstecz wykryto koniec toru to raczej nic się nie da w takiej sytuacji zrobić // jeśli wstecz wykryto koniec toru to raczej nic się nie da w takiej sytuacji zrobić
return cm_Unknown; return TCommandType::cm_Unknown;
} }
else { else {
// a jeśli są dalej tory // a jeśli są dalej tory
@@ -5789,7 +5789,7 @@ TCommandType TController::BackwardScan()
#if LOGBACKSCAN #if LOGBACKSCAN
WriteLog(edir + " - ignored as not passed yet"); WriteLog(edir + " - ignored as not passed yet");
#endif #endif
return cm_Unknown; // nic return TCommandType::cm_Unknown; // nic
} }
vmechmax = e->ValueGet(1); // prędkość przy tym semaforze vmechmax = e->ValueGet(1); // prędkość przy tym semaforze
// przeliczamy odległość od semafora - potrzebne by były współrzędne początku składu // przeliczamy odległość od semafora - potrzebne by były współrzędne początku składu
@@ -5799,7 +5799,7 @@ TCommandType TController::BackwardScan()
scandist = 0; scandist = 0;
} }
bool move = false; // czy AI w trybie manewerowym ma dociągnąć pod S1 bool move = false; // czy AI w trybie manewerowym ma dociągnąć pod S1
if( e->Command() == cm_SetVelocity ) { if( e->Command() == TCommandType::cm_SetVelocity ) {
if( ( vmechmax == 0.0 ) ? if( ( vmechmax == 0.0 ) ?
( OrderCurrentGet() & ( Shunt | Connect ) ) : ( OrderCurrentGet() & ( Shunt | Connect ) ) :
( OrderCurrentGet() & Connect ) ) { // przy podczepianiu ignorować wyjazd? ( OrderCurrentGet() & Connect ) ) { // przy podczepianiu ignorować wyjazd?
@@ -5818,8 +5818,8 @@ TCommandType TController::BackwardScan()
// SetProximityVelocity(scandist,vmechmax,&sl); // SetProximityVelocity(scandist,vmechmax,&sl);
return ( return (
vmechmax > 0 ? vmechmax > 0 ?
cm_SetVelocity : TCommandType::cm_SetVelocity :
cm_Unknown ); TCommandType::cm_Unknown );
} }
else { else {
// ustawiamy prędkość tylko wtedy, gdy ma ruszyć, stanąć albo ma stać // ustawiamy prędkość tylko wtedy, gdy ma ruszyć, stanąć albo ma stać
@@ -5835,15 +5835,15 @@ TCommandType TController::BackwardScan()
#endif #endif
return ( return (
vmechmax > 0 ? vmechmax > 0 ?
cm_SetVelocity : TCommandType::cm_SetVelocity :
cm_Unknown ); TCommandType::cm_Unknown );
} }
} }
} }
if (OrderCurrentGet() ? OrderCurrentGet() & (Shunt | Connect) : if (OrderCurrentGet() ? OrderCurrentGet() & (Shunt | Connect) :
true) // w Wait_for_orders też widzi tarcze true) // w Wait_for_orders też widzi tarcze
{ // reakcja AI w trybie manewrowym dodatkowo na sygnały manewrowe { // reakcja AI w trybie manewrowym dodatkowo na sygnały manewrowe
if (move ? true : e->Command() == cm_ShuntVelocity) if (move ? true : e->Command() == TCommandType::cm_ShuntVelocity)
{ // jeśli powyżej było SetVelocity 0 0, to dociągamy pod S1 { // jeśli powyżej było SetVelocity 0 0, to dociągamy pod S1
if ((scandist > fMinProximityDist) ? if ((scandist > fMinProximityDist) ?
(mvOccupied->Vel > 0.0) || (vmechmax == 0.0) : (mvOccupied->Vel > 0.0) || (vmechmax == 0.0) :
@@ -5861,8 +5861,8 @@ TCommandType TController::BackwardScan()
#endif #endif
// SetProximityVelocity(scandist,vmechmax,&sl); // SetProximityVelocity(scandist,vmechmax,&sl);
return (iDrivigFlags & moveTrackEnd) ? return (iDrivigFlags & moveTrackEnd) ?
cm_ChangeDirection : TCommandType::cm_ChangeDirection :
cm_Unknown; // jeśli jedzie na W5 albo koniec toru, TCommandType::cm_Unknown; // jeśli jedzie na W5 albo koniec toru,
// to można zmienić kierunek // to można zmienić kierunek
} }
} }
@@ -5880,8 +5880,8 @@ TCommandType TController::BackwardScan()
#endif #endif
return ( return (
vmechmax > 0 ? vmechmax > 0 ?
cm_ShuntVelocity : TCommandType::cm_ShuntVelocity :
cm_Unknown ); TCommandType::cm_Unknown );
} }
} }
if ((vmechmax != 0.0) && (scandist < 100.0)) { if ((vmechmax != 0.0) && (scandist < 100.0)) {
@@ -5892,19 +5892,19 @@ TCommandType TController::BackwardScan()
#endif #endif
return ( return (
vmechmax > 0 ? vmechmax > 0 ?
cm_ShuntVelocity : TCommandType::cm_ShuntVelocity :
cm_Unknown ); TCommandType::cm_Unknown );
} }
} // if (move?... } // if (move?...
} // if (OrderCurrentGet()==Shunt) } // if (OrderCurrentGet()==Shunt)
if (!e->bEnabled) // jeśli skanowany if (!e->bEnabled) // jeśli skanowany
if (e->StopCommand()) // a podłączona komórka ma komendę if (e->StopCommand()) // a podłączona komórka ma komendę
return cm_Command; // to też się obrócić return TCommandType::cm_Command; // to też się obrócić
} // if (e->Type==tp_GetValues) } // if (e->Type==tp_GetValues)
} // if (e) } // if (e)
} // if (scantrack) } // if (scantrack)
} // if (scandir!=0.0) } // if (scandir!=0.0)
return cm_Unknown; // nic return TCommandType::cm_Unknown; // nic
}; };
std::string TController::NextStop() std::string TController::NextStop()

View File

@@ -73,7 +73,7 @@ enum TStopReason
stopError // z powodu błędu w obliczeniu drogi hamowania stopError // z powodu błędu w obliczeniu drogi hamowania
}; };
enum TAction enum class TAction : int
{ // przechowanie aktualnego stanu AI od poprzedniego przebłysku świadomości { // przechowanie aktualnego stanu AI od poprzedniego przebłysku świadomości
actUnknown, // stan nieznany (domyślny na początku) actUnknown, // stan nieznany (domyślny na początku)
actPantUp, // podnieś pantograf (info dla użytkownika) actPantUp, // podnieś pantograf (info dla użytkownika)
@@ -223,7 +223,7 @@ private:
double LastReactionTime = 0.0; double LastReactionTime = 0.0;
double fActionTime = 0.0; // czas używany przy regulacji prędkości i zamykaniu drzwi double fActionTime = 0.0; // czas używany przy regulacji prędkości i zamykaniu drzwi
double m_radiocontroltime{ 0.0 }; // timer used to control speed of radio operations double m_radiocontroltime{ 0.0 }; // timer used to control speed of radio operations
TAction eAction { actUnknown }; // aktualny stan TAction eAction { TAction::actUnknown }; // aktualny stan
public: public:
inline inline
TAction GetAction() { TAction GetAction() {

View File

@@ -967,7 +967,7 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
} }
if( ( Mechanik != nullptr ) if( ( Mechanik != nullptr )
&& ( Mechanik->GetAction() != actSleep ) ) { && ( Mechanik->GetAction() != TAction::actSleep ) ) {
// rysowanie figurki mechanika // rysowanie figurki mechanika
btMechanik1.Turn( MoverParameters->ActiveCab > 0 ); btMechanik1.Turn( MoverParameters->ActiveCab > 0 );
btMechanik2.Turn( MoverParameters->ActiveCab < 0 ); btMechanik2.Turn( MoverParameters->ActiveCab < 0 );
@@ -1828,7 +1828,7 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
return 0.0; // zerowa długość to brak pojazdu return 0.0; // zerowa długość to brak pojazdu
} }
// ustawienie pozycji hamulca // ustawienie pozycji hamulca
MoverParameters->LocalBrakePos = 0; MoverParameters->LocalBrakePosA = 0.0;
if (driveractive) if (driveractive)
{ {
if (Cab == 0) if (Cab == 0)
@@ -2299,7 +2299,7 @@ TDynamicObject::create_controller( std::string const Type, bool const Trainset )
if( asName == Global.asHumanCtrlVehicle ) { if( asName == Global.asHumanCtrlVehicle ) {
// jeśli pojazd wybrany do prowadzenia // jeśli pojazd wybrany do prowadzenia
if( MoverParameters->EngineType != Dumb ) { if( MoverParameters->EngineType != TEngineType::Dumb ) {
// wsadzamy tam sterującego // wsadzamy tam sterującego
Controller = Humandriver; Controller = Humandriver;
} }
@@ -2576,16 +2576,16 @@ bool TDynamicObject::UpdateForce(double dt, double dt1, bool FullVer)
// initiates load change by specified amounts, with a platform on specified side // initiates load change by specified amounts, with a platform on specified side
void TDynamicObject::LoadExchange( int const Disembark, int const Embark, int const Platform ) { void TDynamicObject::LoadExchange( int const Disembark, int const Embark, int const Platform ) {
if( ( MoverParameters->DoorOpenCtrl == control::passenger ) if( ( MoverParameters->DoorOpenCtrl == control_t::passenger )
|| ( MoverParameters->DoorOpenCtrl == control::mixed ) ) { || ( MoverParameters->DoorOpenCtrl == control_t::mixed ) ) {
// jeśli jedzie do tyłu, to drzwi otwiera odwrotnie // jeśli jedzie do tyłu, to drzwi otwiera odwrotnie
auto const lewe = ( DirectionGet() > 0 ) ? 1 : 2; auto const lewe = ( DirectionGet() > 0 ) ? 1 : 2;
auto const prawe = 3 - lewe; auto const prawe = 3 - lewe;
if( Platform & lewe ) { if( Platform & lewe ) {
MoverParameters->DoorLeft( true, range::local ); MoverParameters->DoorLeft( true, range_t::local );
} }
if( Platform & prawe ) { if( Platform & prawe ) {
MoverParameters->DoorRight( true, range::local ); MoverParameters->DoorRight( true, range_t::local );
} }
} }
m_exchange.unload_count += Disembark; m_exchange.unload_count += Disembark;
@@ -2645,18 +2645,18 @@ void TDynamicObject::update_exchange( double const Deltatime ) {
MoverParameters->LoadStatus = 0; MoverParameters->LoadStatus = 0;
// if the exchange is completed (or canceled) close the door, if applicable // if the exchange is completed (or canceled) close the door, if applicable
if( ( MoverParameters->DoorCloseCtrl == control::passenger ) if( ( MoverParameters->DoorCloseCtrl == control_t::passenger )
|| ( MoverParameters->DoorCloseCtrl == control::mixed ) ) { || ( MoverParameters->DoorCloseCtrl == control_t::mixed ) ) {
if( ( MoverParameters->Vel > 2.0 ) if( ( MoverParameters->Vel > 2.0 )
|| ( Random() < ( || ( Random() < (
// remotely controlled door are more likely to be left open // remotely controlled door are more likely to be left open
MoverParameters->DoorCloseCtrl == control::passenger ? MoverParameters->DoorCloseCtrl == control_t::passenger ?
0.75 : 0.75 :
0.50 ) ) ) { 0.50 ) ) ) {
MoverParameters->DoorLeft( false, range::local ); MoverParameters->DoorLeft( false, range_t::local );
MoverParameters->DoorRight( false, range::local ); MoverParameters->DoorRight( false, range_t::local );
} }
} }
} }
@@ -2794,7 +2794,7 @@ bool TDynamicObject::Update(double dt, double dt1)
return false; // a normalnie powinny mieć bEnabled==false return false; // a normalnie powinny mieć bEnabled==false
// McZapkie-260202 // McZapkie-260202
if ((MoverParameters->EnginePowerSource.SourceType == CurrentCollector) && if ((MoverParameters->EnginePowerSource.SourceType == TPowerSource::CurrentCollector) &&
(MoverParameters->Power > 1.0)) // aby rozrządczy nie opuszczał silnikowemu (MoverParameters->Power > 1.0)) // aby rozrządczy nie opuszczał silnikowemu
/* /*
if ((MechInside) || (MoverParameters->TrainType == dt_EZT)) if ((MechInside) || (MoverParameters->TrainType == dt_EZT))
@@ -2817,7 +2817,7 @@ bool TDynamicObject::Update(double dt, double dt1)
// pressure switch safety measure -- open the line breaker, unless there's alternate source of traction voltage // pressure switch safety measure -- open the line breaker, unless there's alternate source of traction voltage
if( MoverParameters->GetTrainsetVoltage() < 0.5 * MoverParameters->EnginePowerSource.MaxVoltage ) { if( MoverParameters->GetTrainsetVoltage() < 0.5 * MoverParameters->EnginePowerSource.MaxVoltage ) {
// TODO: check whether line breaker should be open EMU-wide // TODO: check whether line breaker should be open EMU-wide
MoverParameters->MainSwitch( false, ( MoverParameters->TrainType == dt_EZT ? range::unit : range::local ) ); MoverParameters->MainSwitch( false, ( MoverParameters->TrainType == dt_EZT ? range_t::unit : range_t::local ) );
} }
} }
else { else {
@@ -2825,7 +2825,7 @@ bool TDynamicObject::Update(double dt, double dt1)
// and prevents their activation until pressure switch is set again // and prevents their activation until pressure switch is set again
MoverParameters->PantPressLockActive = true; MoverParameters->PantPressLockActive = true;
// TODO: separate 'heating allowed' from actual heating flag, so we can disable it here without messing up heating toggle // TODO: separate 'heating allowed' from actual heating flag, so we can disable it here without messing up heating toggle
MoverParameters->ConverterSwitch( false, range::unit ); MoverParameters->ConverterSwitch( false, range_t::unit );
} }
// mark the pressure switch as spent // mark the pressure switch as spent
MoverParameters->PantPressSwitchActive = false; MoverParameters->PantPressSwitchActive = false;
@@ -2923,7 +2923,7 @@ bool TDynamicObject::Update(double dt, double dt1)
// znane napięcia // znane napięcia
// TTractionParam tmpTraction; // TTractionParam tmpTraction;
// tmpTraction.TractionVoltage=0; // tmpTraction.TractionVoltage=0;
if (MoverParameters->EnginePowerSource.SourceType == CurrentCollector) if (MoverParameters->EnginePowerSource.SourceType == TPowerSource::CurrentCollector)
{ // dla EZT tylko silnikowy { // dla EZT tylko silnikowy
// if (Global.bLiveTraction) // if (Global.bLiveTraction)
{ // Ra 2013-12: to niżej jest chyba trochę bez sensu { // Ra 2013-12: to niżej jest chyba trochę bez sensu
@@ -2988,7 +2988,7 @@ bool TDynamicObject::Update(double dt, double dt1)
{ // Ra 2F3F: do Driver.cpp to przenieść? { // Ra 2F3F: do Driver.cpp to przenieść?
MoverParameters->EqvtPipePress = GetEPP(); // srednie cisnienie w PG MoverParameters->EqvtPipePress = GetEPP(); // srednie cisnienie w PG
if( ( Mechanik->Primary() ) if( ( Mechanik->Primary() )
&& ( MoverParameters->EngineType == ElectricInductionMotor ) ) { && ( MoverParameters->EngineType == TEngineType::ElectricInductionMotor ) ) {
// jesli glowny i z asynchronami, to niech steruje hamulcem lacznie dla calego pociagu/ezt // jesli glowny i z asynchronami, to niech steruje hamulcem lacznie dla calego pociagu/ezt
auto const kier = (DirectionGet() * MoverParameters->ActiveCab > 0); auto const kier = (DirectionGet() * MoverParameters->ActiveCab > 0);
auto FED { 0.0 }; auto FED { 0.0 };
@@ -3082,9 +3082,10 @@ bool TDynamicObject::Update(double dt, double dt1)
} }
if ((Fzad > 1) && (!MEDLogFile.is_open()) && (MoverParameters->Vel > 1)) if ((Fzad > 1) && (!MEDLogFile.is_open()) && (MoverParameters->Vel > 1))
{ {
MEDLogFile.open(std::string("MEDLOGS/" + MoverParameters->Name + "_" + to_string(++MEDLogCount) + ".csv"), MEDLogFile.open(
std::ios::in | std::ios::out | std::ios::trunc); "MEDLOGS/" + MoverParameters->Name + "_" + to_string( ++MEDLogCount ) + ".csv",
MEDLogFile << std::string("t\tVel\tMasa\tOsie\tFmaxPN\tFmaxED\tFfulED\tFrED\tFzad\tFzadED\tFzadPN").c_str(); std::ios::in | std::ios::out | std::ios::trunc );
MEDLogFile << "t\tVel\tMasa\tOsie\tFmaxPN\tFmaxED\tFfulED\tFrED\tFzad\tFzadED\tFzadPN";
for(int k=1;k<=np;k++) for(int k=1;k<=np;k++)
{ {
MEDLogFile << "\tBP" << k; MEDLogFile << "\tBP" << k;
@@ -3095,8 +3096,8 @@ bool TDynamicObject::Update(double dt, double dt1)
MEDLogTime = 0; MEDLogTime = 0;
} }
auto FzadED { 0.0 }; auto FzadED { 0.0 };
if( ( MoverParameters->EpFuse && (MoverParameters->BrakeHandle != MHZ_EN57)) if( ( MoverParameters->EpFuse && (MoverParameters->BrakeHandle != TBrakeHandle::MHZ_EN57))
|| ( ( MoverParameters->BrakeHandle == MHZ_EN57 ) || ( ( MoverParameters->BrakeHandle == TBrakeHandle::MHZ_EN57 )
&& ( MoverParameters->BrakeOpModeFlag & bom_MED ) ) ) { && ( MoverParameters->BrakeOpModeFlag & bom_MED ) ) ) {
FzadED = std::min( Fzad, FmaxED ); FzadED = std::min( Fzad, FmaxED );
} }
@@ -3280,10 +3281,10 @@ bool TDynamicObject::Update(double dt, double dt1)
// NOTE: disabled on account of multi-unit setups, where the unmanned unit wouldn't be affected // NOTE: disabled on account of multi-unit setups, where the unmanned unit wouldn't be affected
&& ( Controller == Humandriver ) && ( Controller == Humandriver )
*/ */
&& ( MoverParameters->EngineType != DieselEngine ) && ( MoverParameters->EngineType != TEngineType::DieselEngine )
&& ( MoverParameters->EngineType != WheelsDriven ) ) && ( MoverParameters->EngineType != TEngineType::WheelsDriven ) )
{ // jeśli bateria wyłączona, a nie diesel ani drezyna reczna { // jeśli bateria wyłączona, a nie diesel ani drezyna reczna
if( MoverParameters->MainSwitch( false, ( MoverParameters->TrainType == dt_EZT ? range::unit : range::local ) ) ) { if( MoverParameters->MainSwitch( false, ( MoverParameters->TrainType == dt_EZT ? range_t::unit : range_t::local ) ) ) {
// wyłączyć zasilanie // wyłączyć zasilanie
// NOTE: we turn off entire EMU, but only the affected unit for other multi-unit consists // NOTE: we turn off entire EMU, but only the affected unit for other multi-unit consists
MoverParameters->EventFlag = true; MoverParameters->EventFlag = true;
@@ -3625,8 +3626,8 @@ bool TDynamicObject::Update(double dt, double dt1)
} }
*/ */
} }
else if (MoverParameters->EnginePowerSource.SourceType == InternalSource) else if (MoverParameters->EnginePowerSource.SourceType == TPowerSource::InternalSource)
if (MoverParameters->EnginePowerSource.PowerType == SteamPower) if (MoverParameters->EnginePowerSource.PowerType == TPowerType::SteamPower)
// if (smPatykird1[0]) // if (smPatykird1[0])
{ // Ra: animacja rozrządu parowozu, na razie nieoptymalizowane { // Ra: animacja rozrządu parowozu, na razie nieoptymalizowane
/* //Ra: tymczasowo wyłączone ze względu na porządkowanie animacji /* //Ra: tymczasowo wyłączone ze względu na porządkowanie animacji
@@ -3986,7 +3987,7 @@ void TDynamicObject::RenderSounds() {
// NBMX dzwiek przetwornicy // NBMX dzwiek przetwornicy
if( MoverParameters->ConverterFlag ) { if( MoverParameters->ConverterFlag ) {
frequency = ( frequency = (
MoverParameters->EngineType == ElectricSeriesMotor ? MoverParameters->EngineType == TEngineType::ElectricSeriesMotor ?
( MoverParameters->RunningTraction.TractionVoltage / MoverParameters->NominalVoltage ) * MoverParameters->RList[ MoverParameters->RlistSize ].Mn : ( MoverParameters->RunningTraction.TractionVoltage / MoverParameters->NominalVoltage ) * MoverParameters->RList[ MoverParameters->RlistSize ].Mn :
1.0 ); 1.0 );
frequency = sConverter.m_frequencyoffset + sConverter.m_frequencyfactor * frequency; frequency = sConverter.m_frequencyoffset + sConverter.m_frequencyfactor * frequency;
@@ -4617,7 +4618,7 @@ void TDynamicObject::LoadMMediaFile( std::string BaseDir, std::string TypeName,
} }
if( !MoverParameters->LoadAccepted.empty() ) { if( !MoverParameters->LoadAccepted.empty() ) {
if( ( MoverParameters->EnginePowerSource.SourceType == CurrentCollector ) if( ( MoverParameters->EnginePowerSource.SourceType == TPowerSource::CurrentCollector )
&& ( asLoadName == "pantstate" ) ) { && ( asLoadName == "pantstate" ) ) {
// wartość niby "pantstate" - nazwa dla formalności, ważna jest ilość // wartość niby "pantstate" - nazwa dla formalności, ważna jest ilość
if( MoverParameters->Load == 1 ) { if( MoverParameters->Load == 1 ) {
@@ -5075,7 +5076,7 @@ void TDynamicObject::LoadMMediaFile( std::string BaseDir, std::string TypeName,
(k) (k)
*/ */
MoverParameters->EnginePowerSource.PowerType = MoverParameters->EnginePowerSource.PowerType =
SteamPower; // Ra: po chamsku, ale z CHK nie działa TPowerType::SteamPower; // Ra: po chamsku, ale z CHK nie działa
} }
else if( token == "animreturnprefix:" ) { else if( token == "animreturnprefix:" ) {
@@ -5271,8 +5272,8 @@ void TDynamicObject::LoadMMediaFile( std::string BaseDir, std::string TypeName,
m_powertrainsounds.engine.owner( this ); m_powertrainsounds.engine.owner( this );
auto const amplitudedivisor = static_cast<float>( ( auto const amplitudedivisor = static_cast<float>( (
MoverParameters->EngineType == DieselEngine ? 1 : MoverParameters->EngineType == TEngineType::DieselEngine ? 1 :
MoverParameters->EngineType == DieselElectric ? 1 : MoverParameters->EngineType == TEngineType::DieselElectric ? 1 :
MoverParameters->nmax * 60 + MoverParameters->Power * 3 ) ); MoverParameters->nmax * 60 + MoverParameters->Power * 3 ) );
m_powertrainsounds.engine.m_amplitudefactor /= amplitudedivisor; m_powertrainsounds.engine.m_amplitudefactor /= amplitudedivisor;
} }
@@ -6435,7 +6436,7 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
if( ( std::abs( Vehicle.enrot ) > 0.01 ) if( ( std::abs( Vehicle.enrot ) > 0.01 )
// McZapkie-280503: zeby dla dumb dzialal silnik na jalowych obrotach // McZapkie-280503: zeby dla dumb dzialal silnik na jalowych obrotach
|| ( Vehicle.EngineType == Dumb ) ) { || ( Vehicle.EngineType == TEngineType::Dumb ) ) {
// frequency calculation // frequency calculation
auto const normalizer { ( auto const normalizer { (
@@ -6449,14 +6450,14 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
engine.m_frequencyoffset engine.m_frequencyoffset
+ engine.m_frequencyfactor * std::abs( Vehicle.enrot ) * normalizer; + engine.m_frequencyfactor * std::abs( Vehicle.enrot ) * normalizer;
if( Vehicle.EngineType == Dumb ) { if( Vehicle.EngineType == TEngineType::Dumb ) {
frequency -= 0.2 * Vehicle.EnginePower / ( 1 + Vehicle.Power * 1000 ); frequency -= 0.2 * Vehicle.EnginePower / ( 1 + Vehicle.Power * 1000 );
} }
// base volume calculation // base volume calculation
switch( Vehicle.EngineType ) { switch( Vehicle.EngineType ) {
// TODO: check calculated values // TODO: check calculated values
case DieselElectric: { case TEngineType::DieselElectric: {
volume = volume =
engine.m_amplitudeoffset engine.m_amplitudeoffset
@@ -6465,7 +6466,7 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
+ 0.75 * ( Vehicle.enrot * 60 ) / ( Vehicle.DElist[ Vehicle.MainCtrlPosNo ].RPM ) ); + 0.75 * ( Vehicle.enrot * 60 ) / ( Vehicle.DElist[ Vehicle.MainCtrlPosNo ].RPM ) );
break; break;
} }
case DieselEngine: { case TEngineType::DieselEngine: {
if( Vehicle.enrot > 0.0 ) { if( Vehicle.enrot > 0.0 ) {
volume = ( volume = (
Vehicle.EnginePower > 0 ? Vehicle.EnginePower > 0 ?
@@ -6485,15 +6486,15 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
if( engine_volume >= 0.05 ) { if( engine_volume >= 0.05 ) {
auto enginerevvolume { 0.f }; auto enginerevvolume { 0.f };
if( ( Vehicle.EngineType == DieselElectric ) if( ( Vehicle.EngineType == TEngineType::DieselElectric )
|| ( Vehicle.EngineType == DieselEngine ) ) { || ( Vehicle.EngineType == TEngineType::DieselEngine ) ) {
// diesel engine revolutions increase; it can potentially decrease volume of base engine sound // diesel engine revolutions increase; it can potentially decrease volume of base engine sound
if( engine_revs_last != -1.f ) { if( engine_revs_last != -1.f ) {
// calculate potential recent increase of engine revolutions // calculate potential recent increase of engine revolutions
auto const revolutionsperminute { Vehicle.enrot * 60 }; auto const revolutionsperminute { Vehicle.enrot * 60 };
auto const revolutionsdifference { revolutionsperminute - engine_revs_last }; auto const revolutionsdifference { revolutionsperminute - engine_revs_last };
auto const idlerevolutionsthreshold { 1.01 * ( auto const idlerevolutionsthreshold { 1.01 * (
Vehicle.EngineType == DieselElectric ? Vehicle.EngineType == TEngineType::DieselElectric ?
Vehicle.DElist[ 0 ].RPM : Vehicle.DElist[ 0 ].RPM :
Vehicle.dizel_nmin * 60 ) }; Vehicle.dizel_nmin * 60 ) };
@@ -6620,13 +6621,13 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
// base volume calculation // base volume calculation
switch( Vehicle.EngineType ) { switch( Vehicle.EngineType ) {
case ElectricInductionMotor: { case TEngineType::ElectricInductionMotor: {
volume = volume =
motor.m_amplitudeoffset motor.m_amplitudeoffset
+ motor.m_amplitudefactor * ( Vehicle.EnginePower + motorrevolutions * 2 ); + motor.m_amplitudefactor * ( Vehicle.EnginePower + motorrevolutions * 2 );
break; break;
} }
case ElectricSeriesMotor: { case TEngineType::ElectricSeriesMotor: {
volume = volume =
motor.m_amplitudeoffset motor.m_amplitudeoffset
+ motor.m_amplitudefactor * ( Vehicle.EnginePower / 1000 + motorrevolutions * 60.0 ); + motor.m_amplitudefactor * ( Vehicle.EnginePower / 1000 + motorrevolutions * 60.0 );
@@ -6640,7 +6641,7 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
} }
} }
if( Vehicle.EngineType == ElectricSeriesMotor ) { if( Vehicle.EngineType == TEngineType::ElectricSeriesMotor ) {
// volume variation // volume variation
if( ( volume < 1.0 ) if( ( volume < 1.0 )
&& ( Vehicle.EnginePower < 100 ) ) { && ( Vehicle.EnginePower < 100 ) ) {
@@ -6691,7 +6692,7 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
} }
} }
// inverter sounds // inverter sounds
if( Vehicle.EngineType == ElectricInductionMotor ) { if( Vehicle.EngineType == TEngineType::ElectricInductionMotor ) {
if( Vehicle.InverterFrequency > 0.1 ) { if( Vehicle.InverterFrequency > 0.1 ) {
volume = inverter.m_amplitudeoffset + inverter.m_amplitudefactor * std::sqrt( std::abs( Vehicle.dizel_fill ) ); volume = inverter.m_amplitudeoffset + inverter.m_amplitudefactor * std::sqrt( std::abs( Vehicle.dizel_fill ) );
@@ -6718,8 +6719,8 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
rsWentylator.stop(); rsWentylator.stop();
} }
// radiator fan sounds // radiator fan sounds
if( ( Vehicle.EngineType == DieselEngine ) if( ( Vehicle.EngineType == TEngineType::DieselEngine )
|| ( Vehicle.EngineType == DieselElectric ) ) { || ( Vehicle.EngineType == TEngineType::DieselElectric ) ) {
if( Vehicle.dizel_heat.rpmw > 0.1 ) { if( Vehicle.dizel_heat.rpmw > 0.1 ) {
// NOTE: fan speed tends to max out at ~100 rpm; by default we try to get pitch range of 0.5-1.5 and volume range of 0.5-1.0 // NOTE: fan speed tends to max out at ~100 rpm; by default we try to get pitch range of 0.5-1.5 and volume range of 0.5-1.0
@@ -6813,7 +6814,7 @@ vehicle_table::update( double Deltatime, int Iterationcount ) {
for( auto *vehicle : m_items ) { for( auto *vehicle : m_items ) {
if( false == vehicle->bEnabled ) { continue; } if( false == vehicle->bEnabled ) { continue; }
// Ra: zmienić warunek na sprawdzanie pantografów w jednej zmiennej: czy pantografy i czy podniesione // Ra: zmienić warunek na sprawdzanie pantografów w jednej zmiennej: czy pantografy i czy podniesione
if( vehicle->MoverParameters->EnginePowerSource.SourceType == CurrentCollector ) { if( vehicle->MoverParameters->EnginePowerSource.SourceType == TPowerSource::CurrentCollector ) {
update_traction( vehicle ); update_traction( vehicle );
} }
vehicle->MoverParameters->ComputeConstans(); vehicle->MoverParameters->ComputeConstans();
@@ -6989,16 +6990,22 @@ vehicle_table::erase_disabled() {
++vehicleiter; ++vehicleiter;
} }
else { else {
if( vehicle->MyTrack != nullptr ) { if( ( vehicle->MyTrack != nullptr )
vehicle->MyTrack->RemoveDynamicObject( vehicle ); && ( true == vehicle->MyTrack->RemoveDynamicObject( vehicle ) ) ) {
vehicle->MyTrack = nullptr;
} }
// clear potential train binding // clear potential train binding
Global.pWorld->TrainDelete( vehicle ); Global.pWorld->TrainDelete( vehicle );
// remove potential entries in the light array // remove potential entries in the light array
simulation::Lights.remove( vehicle ); simulation::Lights.remove( vehicle );
/*
// finally get rid of the vehicle and its record themselves // finally get rid of the vehicle and its record themselves
// BUG: deleting the vehicle leaves dangling pointers in event->Activator and potentially elsewhere
// TBD, TODO: either mark 'dead' vehicles with additional flag, or delete the references as well
SafeDelete( vehicle ); SafeDelete( vehicle );
vehicleiter = m_items.erase( vehicleiter ); vehicleiter = m_items.erase( vehicleiter );
*/
++vehicleiter; // NOTE: instead of the erase in the disabled section
} }
} }
// ...and call it a day // ...and call it a day

View File

@@ -297,37 +297,37 @@ void TEvent::Load(cParser *parser, Math3D::vector3 const &org)
if (token.find('#') != std::string::npos) if (token.find('#') != std::string::npos)
token.erase(token.find('#')); // obcięcie unikatowości token.erase(token.find('#')); // obcięcie unikatowości
win1250_to_ascii( token ); // get rid of non-ascii chars win1250_to_ascii( token ); // get rid of non-ascii chars
Params[6].asCommand = cm_PassengerStopPoint; Params[6].asCommand = TCommandType::cm_PassengerStopPoint;
// nie do kolejki (dla SetVelocity też, ale jak jest do toru dowiązany) // nie do kolejki (dla SetVelocity też, ale jak jest do toru dowiązany)
bEnabled = false; bEnabled = false;
} }
else if (token == "SetVelocity") else if (token == "SetVelocity")
{ {
bEnabled = false; bEnabled = false;
Params[6].asCommand = cm_SetVelocity; Params[6].asCommand = TCommandType::cm_SetVelocity;
} }
else if (token == "RoadVelocity") else if (token == "RoadVelocity")
{ {
bEnabled = false; bEnabled = false;
Params[6].asCommand = cm_RoadVelocity; Params[6].asCommand = TCommandType::cm_RoadVelocity;
} }
else if (token == "SectionVelocity") else if (token == "SectionVelocity")
{ {
bEnabled = false; bEnabled = false;
Params[6].asCommand = cm_SectionVelocity; Params[6].asCommand = TCommandType::cm_SectionVelocity;
} }
else if (token == "ShuntVelocity") else if (token == "ShuntVelocity")
{ {
bEnabled = false; bEnabled = false;
Params[6].asCommand = cm_ShuntVelocity; Params[6].asCommand = TCommandType::cm_ShuntVelocity;
} }
else if (token == "OutsideStation") else if (token == "OutsideStation")
{ {
bEnabled = false; // ma być skanowny, aby AI nie przekraczało W5 bEnabled = false; // ma być skanowny, aby AI nie przekraczało W5
Params[6].asCommand = cm_OutsideStation; Params[6].asCommand = TCommandType::cm_OutsideStation;
} }
else else
Params[6].asCommand = cm_Unknown; Params[6].asCommand = TCommandType::cm_Unknown;
Params[0].asText = new char[token.size() + 1]; Params[0].asText = new char[token.size() + 1];
strcpy(Params[0].asText, token.c_str()); strcpy(Params[0].asText, token.c_str());
parser->getTokens(); parser->getTokens();
@@ -817,7 +817,7 @@ TCommandType TEvent::Command()
case tp_PutValues: case tp_PutValues:
return Params[6].asCommand; // komenda zakodowana binarnie return Params[6].asCommand; // komenda zakodowana binarnie
} }
return cm_Unknown; // inne eventy się nie liczą return TCommandType::cm_Unknown; // inne eventy się nie liczą
}; };
double TEvent::ValueGet(int n) double TEvent::ValueGet(int n)

View File

@@ -45,7 +45,7 @@ void TGauge::Init(TSubModel *Submodel, TGaugeType Type, float Scale, float Offse
return; return;
} }
if( m_type == gt_Digital ) { if( m_type == TGaugeType::gt_Digital ) {
TSubModel *sm = SubModel->ChildGet(); TSubModel *sm = SubModel->ChildGet();
do { do {
@@ -148,18 +148,18 @@ bool TGauge::Load( cParser &Parser, TDynamicObject const *Owner, TModel3d *md1,
} }
std::map<std::string, TGaugeType> gaugetypes { std::map<std::string, TGaugeType> gaugetypes {
{ "rot", gt_Rotate }, { "rot", TGaugeType::gt_Rotate },
{ "rotvar", gt_Rotate }, { "rotvar", TGaugeType::gt_Rotate },
{ "mov", gt_Move }, { "mov", TGaugeType::gt_Move },
{ "movvar", gt_Move }, { "movvar", TGaugeType::gt_Move },
{ "wip", gt_Wiper }, { "wip", TGaugeType::gt_Wiper },
{ "dgt", gt_Digital } { "dgt", TGaugeType::gt_Digital }
}; };
auto lookup = gaugetypes.find( gaugetypename ); auto lookup = gaugetypes.find( gaugetypename );
auto const type = ( auto const type = (
lookup != gaugetypes.end() ? lookup != gaugetypes.end() ?
lookup->second : lookup->second :
gt_Unknown ); TGaugeType::gt_Unknown );
Init( submodel, type, scale, offset, friction, 0, endvalue, endscale, interpolatescale ); Init( submodel, type, scale, offset, friction, 0, endvalue, endscale, interpolatescale );
@@ -228,16 +228,16 @@ TGauge::UpdateValue( float fNewDesired, sound_source *Fallbacksound ) {
if( ( currentvalue < fNewDesired ) if( ( currentvalue < fNewDesired )
&& ( false == m_soundfxincrease.empty() ) ) { && ( false == m_soundfxincrease.empty() ) ) {
// shift up // shift up
m_soundfxincrease.play(); m_soundfxincrease.play( sound_flags::exclusive );
} }
else if( ( currentvalue > fNewDesired ) else if( ( currentvalue > fNewDesired )
&& ( false == m_soundfxdecrease.empty() ) ) { && ( false == m_soundfxdecrease.empty() ) ) {
// shift down // shift down
m_soundfxdecrease.play(); m_soundfxdecrease.play( sound_flags::exclusive );
} }
else if( Fallbacksound != nullptr ) { else if( Fallbacksound != nullptr ) {
// ...and if that fails too, try the provided fallback sound from legacy system // ...and if that fails too, try the provided fallback sound from legacy system
Fallbacksound->play(); Fallbacksound->play( sound_flags::exclusive );
} }
}; };
@@ -276,15 +276,15 @@ void TGauge::Update() {
if( SubModel ) if( SubModel )
{ // warunek na wszelki wypadek, gdyby się submodel nie podłączył { // warunek na wszelki wypadek, gdyby się submodel nie podłączył
switch (m_type) { switch (m_type) {
case gt_Rotate: { case TGaugeType::gt_Rotate: {
SubModel->SetRotate( float3( 0, 1, 0 ), GetScaledValue() * 360.0 ); SubModel->SetRotate( float3( 0, 1, 0 ), GetScaledValue() * 360.0 );
break; break;
} }
case gt_Move: { case TGaugeType::gt_Move: {
SubModel->SetTranslate( float3( 0, 0, GetScaledValue() ) ); SubModel->SetTranslate( float3( 0, 0, GetScaledValue() ) );
break; break;
} }
case gt_Wiper: { case TGaugeType::gt_Wiper: {
auto const scaledvalue { GetScaledValue() }; auto const scaledvalue { GetScaledValue() };
SubModel->SetRotate( float3( 0, 1, 0 ), scaledvalue * 360.0 ); SubModel->SetRotate( float3( 0, 1, 0 ), scaledvalue * 360.0 );
auto *sm = SubModel->ChildGet(); auto *sm = SubModel->ChildGet();
@@ -296,7 +296,7 @@ void TGauge::Update() {
} }
break; break;
} }
case gt_Digital: { case TGaugeType::gt_Digital: {
// Ra 2014-07: licznik cyfrowy // Ra 2014-07: licznik cyfrowy
auto *sm = SubModel->ChildGet(); auto *sm = SubModel->ChildGet();
/* std::string n = FormatFloat( "0000000000", floor( fValue ) ); // na razie tak trochę bez sensu /* std::string n = FormatFloat( "0000000000", floor( fValue ) ); // na razie tak trochę bez sensu

View File

@@ -12,7 +12,7 @@ http://mozilla.org/MPL/2.0/.
#include "Classes.h" #include "Classes.h"
#include "sound.h" #include "sound.h"
enum TGaugeType { enum class TGaugeType {
// typ ruchu // typ ruchu
gt_Unknown, // na razie nie znany gt_Unknown, // na razie nie znany
gt_Rotate, // obrót gt_Rotate, // obrót
@@ -60,7 +60,7 @@ private:
GetScaledValue() const; GetScaledValue() const;
// members // members
TGaugeType m_type { gt_Unknown }; // typ ruchu TGaugeType m_type { TGaugeType::gt_Unknown }; // typ ruchu
float m_friction { 0.f }; // hamowanie przy zliżaniu się do zadanej wartości float m_friction { 0.f }; // hamowanie przy zliżaniu się do zadanej wartości
float m_targetvalue { 0.f }; // wartość docelowa float m_targetvalue { 0.f }; // wartość docelowa
float m_value { 0.f }; // wartość obecna float m_value { 0.f }; // wartość obecna

View File

@@ -156,13 +156,13 @@ enum coupling {
uic = 0x100 uic = 0x100
}; };
// possible effect ranges for control commands; exclusive // possible effect ranges for control commands; exclusive
enum range { enum class range_t {
local, local,
unit, unit,
consist consist
}; };
// start method for devices; exclusive // start method for devices; exclusive
enum start { enum class start_t {
manual, manual,
automatic, automatic,
manualwithautofallback, manualwithautofallback,
@@ -180,7 +180,7 @@ enum light {
}; };
// door operation methods; exclusive // door operation methods; exclusive
enum control { enum control_t {
passenger, // local, opened/closed for duration of loading passenger, // local, opened/closed for duration of loading
driver, // remote, operated by the driver driver, // remote, operated by the driver
autonomous, // local, closed when vehicle moves and/or after timeout autonomous, // local, closed when vehicle moves and/or after timeout
@@ -351,13 +351,13 @@ struct TTractionParam
/*powyzsze parametry zwiazane sa z torem po ktorym aktualnie pojazd jedzie*/ /*powyzsze parametry zwiazane sa z torem po ktorym aktualnie pojazd jedzie*/
/*typy hamulcow zespolonych*/ /*typy hamulcow zespolonych*/
enum TBrakeSystem { Individual, Pneumatic, ElectroPneumatic }; enum class TBrakeSystem { Individual, Pneumatic, ElectroPneumatic };
/*podtypy hamulcow zespolonych*/ /*podtypy hamulcow zespolonych*/
enum TBrakeSubSystem { ss_None, ss_W, ss_K, ss_KK, ss_Hik, ss_ESt, ss_KE, ss_LSt, ss_MT, ss_Dako }; enum class TBrakeSubSystem { ss_None, ss_W, ss_K, ss_KK, ss_Hik, ss_ESt, ss_KE, ss_LSt, ss_MT, ss_Dako };
enum TBrakeValve { NoValve, W, W_Lu_VI, W_Lu_L, W_Lu_XR, K, Kg, Kp, Kss, Kkg, Kkp, Kks, Hikg1, Hikss, Hikp1, KE, SW, EStED, NESt3, ESt3, LSt, ESt4, ESt3AL2, EP1, EP2, M483, CV1_L_TR, CV1, CV1_R, Other }; enum class TBrakeValve { NoValve, W, W_Lu_VI, W_Lu_L, W_Lu_XR, K, Kg, Kp, Kss, Kkg, Kkp, Kks, Hikg1, Hikss, Hikp1, KE, SW, EStED, NESt3, ESt3, LSt, ESt4, ESt3AL2, EP1, EP2, M483, CV1_L_TR, CV1, CV1_R, Other };
enum TBrakeHandle { NoHandle, West, FV4a, M394, M254, FVel1, FVel6, D2, Knorr, FD1, BS2, testH, St113, MHZ_P, MHZ_T, MHZ_EN57, MHZ_K5P }; enum class TBrakeHandle { NoHandle, West, FV4a, M394, M254, FVel1, FVel6, D2, Knorr, FD1, BS2, testH, St113, MHZ_P, MHZ_T, MHZ_EN57, MHZ_K5P };
/*typy hamulcow indywidualnych*/ /*typy hamulcow indywidualnych*/
enum TLocalBrake { NoBrake, ManualBrake, PneumaticBrake, HydraulicBrake }; enum class TLocalBrake { NoBrake, ManualBrake, PneumaticBrake, HydraulicBrake };
/*dla osob/towar: opoznienie hamowania/odhamowania*/ /*dla osob/towar: opoznienie hamowania/odhamowania*/
typedef double TBrakeDelayTable[4]; typedef double TBrakeDelayTable[4];
@@ -366,17 +366,17 @@ struct TBrakePressure
double PipePressureVal = 0.0; double PipePressureVal = 0.0;
double BrakePressureVal = 0.0; double BrakePressureVal = 0.0;
double FlowSpeedVal = 0.0; double FlowSpeedVal = 0.0;
TBrakeSystem BrakeType = Pneumatic; TBrakeSystem BrakeType = TBrakeSystem::Pneumatic;
}; };
typedef std::map<int,TBrakePressure> TBrakePressureTable; typedef std::map<int,TBrakePressure> TBrakePressureTable;
/*typy napedow*/ /*typy napedow*/
enum TEngineTypes { None, Dumb, WheelsDriven, ElectricSeriesMotor, ElectricInductionMotor, DieselEngine, SteamEngine, DieselElectric }; enum class TEngineType { None, Dumb, WheelsDriven, ElectricSeriesMotor, ElectricInductionMotor, DieselEngine, SteamEngine, DieselElectric };
/*postac dostarczanej energii*/ /*postac dostarczanej energii*/
enum TPowerType { NoPower, BioPower, MechPower, ElectricPower, SteamPower }; enum class TPowerType { NoPower, BioPower, MechPower, ElectricPower, SteamPower };
/*rodzaj paliwa*/ /*rodzaj paliwa*/
enum TFuelType { Undefined, Coal, Oil }; enum class TFuelType { Undefined, Coal, Oil };
/*rodzaj rusztu*/ /*rodzaj rusztu*/
struct TGrateType { struct TGrateType {
TFuelType FuelType; TFuelType FuelType;
@@ -425,7 +425,7 @@ struct TCurrentCollector {
//} //}
}; };
/*typy źródeł mocy*/ /*typy źródeł mocy*/
enum TPowerSource { NotDefined, InternalSource, Transducer, Generator, Accumulator, CurrentCollector, PowerCable, Heater }; enum class TPowerSource { NotDefined, InternalSource, Transducer, Generator, Accumulator, CurrentCollector, PowerCable, Heater };
struct _mover__1 struct _mover__1
@@ -481,7 +481,7 @@ struct TPowerParameters
}; };
struct struct
{ {
TEngineTypes GeneratorEngine; TEngineType GeneratorEngine;
}; };
struct struct
{ {
@@ -498,9 +498,9 @@ struct TPowerParameters
MaxVoltage = 0.0; MaxVoltage = 0.0;
MaxCurrent = 0.0; MaxCurrent = 0.0;
IntR = 0.001; IntR = 0.001;
SourceType = NotDefined; SourceType = TPowerSource::NotDefined;
PowerType = NoPower; PowerType = TPowerType::NoPower;
RPowerCable.PowerTrans = NoPower; RPowerCable.PowerTrans = TPowerType::NoPower;
} }
}; };
@@ -584,7 +584,7 @@ struct TTransmision
double Ratio = 1.0; double Ratio = 1.0;
}; };
enum TCouplerType { NoCoupler, Articulated, Bare, Chain, Screw, Automatic }; enum class TCouplerType { NoCoupler, Articulated, Bare, Chain, Screw, Automatic };
struct power_coupling { struct power_coupling {
double current{ 0.0 }; double current{ 0.0 };
@@ -601,7 +601,7 @@ struct TCoupling {
double FmaxB = 1000.0; double FmaxB = 1000.0;
double DmaxC = 0.1; double DmaxC = 0.1;
double FmaxC = 1000.0; double FmaxC = 1000.0;
TCouplerType CouplerType = NoCoupler; /*typ sprzegu*/ TCouplerType CouplerType = TCouplerType::NoCoupler; /*typ sprzegu*/
/*zmienne*/ /*zmienne*/
int CouplingFlag = 0; /*0 - wirtualnie, 1 - sprzegi, 2 - pneumatycznie, 4 - sterowanie, 8 - kabel mocy*/ int CouplingFlag = 0; /*0 - wirtualnie, 1 - sprzegi, 2 - pneumatycznie, 4 - sterowanie, 8 - kabel mocy*/
int AllowedFlag = 3; //Ra: znaczenie jak wyżej, maska dostępnych int AllowedFlag = 3; //Ra: znaczenie jak wyżej, maska dostępnych
@@ -625,7 +625,7 @@ struct fuel_pump {
bool is_enabled { false }; // device is allowed/requested to operate bool is_enabled { false }; // device is allowed/requested to operate
bool is_active { false }; // device is working bool is_active { false }; // device is working
start start_type { start::manual }; start_t start_type { start_t::manual };
}; };
// basic approximation of a fuel pump // basic approximation of a fuel pump
@@ -634,7 +634,7 @@ struct oil_pump {
bool is_enabled { false }; // device is allowed/requested to operate bool is_enabled { false }; // device is allowed/requested to operate
bool is_active { false }; // device is working bool is_active { false }; // device is working
start start_type { start::manual }; start_t start_type { start_t::manual };
float resource_amount { 1.f }; float resource_amount { 1.f };
float pressure_minimum { 0.f }; // lowest acceptable working pressure float pressure_minimum { 0.f }; // lowest acceptable working pressure
float pressure_maximum { 0.65f }; // oil pressure at maximum engine revolutions float pressure_maximum { 0.65f }; // oil pressure at maximum engine revolutions
@@ -647,7 +647,7 @@ struct water_pump {
bool breaker { true }; // device is allowed to operate bool breaker { true }; // device is allowed to operate
bool is_enabled { false }; // device is requested to operate bool is_enabled { false }; // device is requested to operate
bool is_active { false }; // device is working bool is_active { false }; // device is working
start start_type { start::manual }; start_t start_type { start_t::manual };
}; };
struct water_heater { struct water_heater {
@@ -728,7 +728,7 @@ public:
std::string TypeName; /*nazwa serii/typu*/ std::string TypeName; /*nazwa serii/typu*/
//TrainType: string; {typ: EZT/elektrowoz - Winger 040304} //TrainType: string; {typ: EZT/elektrowoz - Winger 040304}
int TrainType = 0; /*Ra: powinno być szybciej niż string*/ int TrainType = 0; /*Ra: powinno być szybciej niż string*/
TEngineTypes EngineType = None; /*typ napedu*/ TEngineType EngineType = TEngineType::None; /*typ napedu*/
TPowerParameters EnginePowerSource; /*zrodlo mocy dla silnikow*/ TPowerParameters EnginePowerSource; /*zrodlo mocy dla silnikow*/
TPowerParameters SystemPowerSource; /*zrodlo mocy dla systemow sterowania/przetwornic/sprezarek*/ TPowerParameters SystemPowerSource; /*zrodlo mocy dla systemow sterowania/przetwornic/sprezarek*/
TPowerParameters HeatingPowerSource; /*zrodlo mocy dla ogrzewania*/ TPowerParameters HeatingPowerSource; /*zrodlo mocy dla ogrzewania*/
@@ -766,11 +766,11 @@ public:
/*hamulce:*/ /*hamulce:*/
int NBpA = 0; /*ilosc el. ciernych na os: 0 1 2 lub 4*/ int NBpA = 0; /*ilosc el. ciernych na os: 0 1 2 lub 4*/
int SandCapacity = 0; /*zasobnik piasku [kg]*/ int SandCapacity = 0; /*zasobnik piasku [kg]*/
TBrakeSystem BrakeSystem = Individual;/*rodzaj hamulca zespolonego*/ TBrakeSystem BrakeSystem = TBrakeSystem::Individual;/*rodzaj hamulca zespolonego*/
TBrakeSubSystem BrakeSubsystem = ss_None ; TBrakeSubSystem BrakeSubsystem = TBrakeSubSystem::ss_None ;
TBrakeValve BrakeValve = NoValve; TBrakeValve BrakeValve = TBrakeValve::NoValve;
TBrakeHandle BrakeHandle = NoHandle; TBrakeHandle BrakeHandle = TBrakeHandle::NoHandle;
TBrakeHandle BrakeLocHandle = NoHandle; TBrakeHandle BrakeLocHandle = TBrakeHandle::NoHandle;
double MBPM = 1.0; /*masa najwiekszego cisnienia*/ double MBPM = 1.0; /*masa najwiekszego cisnienia*/
std::shared_ptr<TBrake> Hamulec; std::shared_ptr<TBrake> Hamulec;
@@ -779,7 +779,7 @@ public:
std::shared_ptr<TReservoir> Pipe; std::shared_ptr<TReservoir> Pipe;
std::shared_ptr<TReservoir> Pipe2; std::shared_ptr<TReservoir> Pipe2;
TLocalBrake LocalBrake = NoBrake; /*rodzaj hamulca indywidualnego*/ TLocalBrake LocalBrake = TLocalBrake::NoBrake; /*rodzaj hamulca indywidualnego*/
TBrakePressureTable BrakePressureTable; /*wyszczegolnienie cisnien w rurze*/ TBrakePressureTable BrakePressureTable; /*wyszczegolnienie cisnien w rurze*/
TBrakePressure BrakePressureActual; //wartości ważone dla aktualnej pozycji kranu TBrakePressure BrakePressureActual; //wartości ważone dla aktualnej pozycji kranu
int ASBType = 0; /*0: brak hamulca przeciwposlizgowego, 1: reczny, 2: automat*/ int ASBType = 0; /*0: brak hamulca przeciwposlizgowego, 1: reczny, 2: automat*/
@@ -1006,9 +1006,9 @@ public:
bool CompressorAllow = false; /*! zezwolenie na uruchomienie sprezarki NBMX*/ bool CompressorAllow = false; /*! zezwolenie na uruchomienie sprezarki NBMX*/
bool CompressorAllowLocal{ true }; // local device state override (most units don't have this fitted so it's set to true not to intefere) bool CompressorAllowLocal{ true }; // local device state override (most units don't have this fitted so it's set to true not to intefere)
bool CompressorGovernorLock{ false }; // indicates whether compressor pressure switch was activated due to reaching cut-out pressure bool CompressorGovernorLock{ false }; // indicates whether compressor pressure switch was activated due to reaching cut-out pressure
start CompressorStart{ start::manual }; // whether the compressor is started manually, or another way start_t CompressorStart{ start_t::manual }; // whether the compressor is started manually, or another way
// TODO converter parameters, for when we start cleaning up mover parameters // TODO converter parameters, for when we start cleaning up mover parameters
start ConverterStart{ start::manual }; // whether converter is started manually, or by other means start_t ConverterStart{ start_t::manual }; // whether converter is started manually, or by other means
float ConverterStartDelay{ 0.0f }; // delay (in seconds) before the converter is started, once its activation conditions are met float ConverterStartDelay{ 0.0f }; // delay (in seconds) before the converter is started, once its activation conditions are met
double ConverterStartDelayTimer{ 0.0 }; // helper, for tracking whether converter start delay passed double ConverterStartDelayTimer{ 0.0 }; // helper, for tracking whether converter start delay passed
bool ConverterAllow = false; /*zezwolenie na prace przetwornicy NBMX*/ bool ConverterAllow = false; /*zezwolenie na prace przetwornicy NBMX*/
@@ -1024,7 +1024,6 @@ public:
int BrakeCtrlPos = -2; /*nastawa hamulca zespolonego*/ int BrakeCtrlPos = -2; /*nastawa hamulca zespolonego*/
double BrakeCtrlPosR = 0.0; /*nastawa hamulca zespolonego - plynna dla FV4a*/ double BrakeCtrlPosR = 0.0; /*nastawa hamulca zespolonego - plynna dla FV4a*/
double BrakeCtrlPos2 = 0.0; /*nastawa hamulca zespolonego - kapturek dla FV4a*/ double BrakeCtrlPos2 = 0.0; /*nastawa hamulca zespolonego - kapturek dla FV4a*/
int LocalBrakePos = 0; /*nastawa hamulca indywidualnego*/
int ManualBrakePos = 0; /*nastawa hamulca recznego*/ int ManualBrakePos = 0; /*nastawa hamulca recznego*/
double LocalBrakePosA = 0.0; double LocalBrakePosA = 0.0;
/* /*
@@ -1250,7 +1249,7 @@ public:
bool AddPulseForce(int Multipler);/*dla drezyny*/ bool AddPulseForce(int Multipler);/*dla drezyny*/
bool Sandbox( bool const State, int const Notify = range::consist );/*wlacza/wylacza sypanie piasku*/ bool Sandbox( bool const State, range_t const Notify = range_t::consist );/*wlacza/wylacza sypanie piasku*/
/*! zbijanie czuwaka/SHP*/ /*! zbijanie czuwaka/SHP*/
void SSReset(void); void SSReset(void);
@@ -1263,11 +1262,9 @@ public:
/*! stopnie hamowania - hamulec zasadniczy*/ /*! stopnie hamowania - hamulec zasadniczy*/
bool IncBrakeLevelOld(void); bool IncBrakeLevelOld(void);
bool DecBrakeLevelOld(void); bool DecBrakeLevelOld(void);
bool IncLocalBrakeLevel(int CtrlSpeed); bool IncLocalBrakeLevel(float const CtrlSpeed);
bool DecLocalBrakeLevel(int CtrlSpeed); bool DecLocalBrakeLevel(float const CtrlSpeed);
/*! ABu 010205: - skrajne polozenia ham. pomocniczego*/ /*! ABu 010205: - skrajne polozenia ham. pomocniczego*/
bool IncLocalBrakeLevelFAST(void);
bool DecLocalBrakeLevelFAST(void);
bool IncManualBrakeLevel(int CtrlSpeed); bool IncManualBrakeLevel(int CtrlSpeed);
bool DecManualBrakeLevel(int CtrlSpeed); bool DecManualBrakeLevel(int CtrlSpeed);
bool DynamicBrakeSwitch(bool Switch); bool DynamicBrakeSwitch(bool Switch);
@@ -1309,16 +1306,16 @@ public:
/*--funkcje dla lokomotyw*/ /*--funkcje dla lokomotyw*/
bool DirectionBackward(void);/*! kierunek ruchu*/ bool DirectionBackward(void);/*! kierunek ruchu*/
bool WaterPumpBreakerSwitch( bool State, int const Notify = range::consist ); // water pump breaker state toggle bool WaterPumpBreakerSwitch( bool State, range_t const Notify = range_t::consist ); // water pump breaker state toggle
bool WaterPumpSwitch( bool State, int const Notify = range::consist ); // water pump state toggle bool WaterPumpSwitch( bool State, range_t const Notify = range_t::consist ); // water pump state toggle
bool WaterHeaterBreakerSwitch( bool State, int const Notify = range::consist ); // water heater breaker state toggle bool WaterHeaterBreakerSwitch( bool State, range_t const Notify = range_t::consist ); // water heater breaker state toggle
bool WaterHeaterSwitch( bool State, int const Notify = range::consist ); // water heater state toggle bool WaterHeaterSwitch( bool State, range_t const Notify = range_t::consist ); // water heater state toggle
bool WaterCircuitsLinkSwitch( bool State, int const Notify = range::consist ); // water circuits link state toggle bool WaterCircuitsLinkSwitch( bool State, range_t const Notify = range_t::consist ); // water circuits link state toggle
bool FuelPumpSwitch( bool State, int const Notify = range::consist ); // fuel pump state toggle bool FuelPumpSwitch( bool State, range_t const Notify = range_t::consist ); // fuel pump state toggle
bool OilPumpSwitch( bool State, int const Notify = range::consist ); // oil pump state toggle bool OilPumpSwitch( bool State, range_t const Notify = range_t::consist ); // oil pump state toggle
bool MainSwitch( bool const State, int const Notify = range::consist );/*! wylacznik glowny*/ bool MainSwitch( bool const State, range_t const Notify = range_t::consist );/*! wylacznik glowny*/
bool ConverterSwitch( bool State, int const Notify = range::consist );/*! wl/wyl przetwornicy*/ bool ConverterSwitch( bool State, range_t const Notify = range_t::consist );/*! wl/wyl przetwornicy*/
bool CompressorSwitch( bool State, int const Notify = range::consist );/*! wl/wyl sprezarki*/ bool CompressorSwitch( bool State, range_t const Notify = range_t::consist );/*! wl/wyl sprezarki*/
/*-funkcje typowe dla lokomotywy elektrycznej*/ /*-funkcje typowe dla lokomotywy elektrycznej*/
void ConverterCheck( double const Timestep ); // przetwornica void ConverterCheck( double const Timestep ); // przetwornica
@@ -1348,8 +1345,8 @@ public:
bool AutoRelayCheck(void);//symulacja automatycznego rozruchu bool AutoRelayCheck(void);//symulacja automatycznego rozruchu
bool ResistorsFlagCheck(void); //sprawdzenie kontrolki oporow rozruchowych NBMX bool ResistorsFlagCheck(void); //sprawdzenie kontrolki oporow rozruchowych NBMX
bool PantFront( bool const State, int const Notify = range::consist ); //obsluga pantografou przedniego bool PantFront( bool const State, range_t const Notify = range_t::consist ); //obsluga pantografou przedniego
bool PantRear( bool const State, int const Notify = range::consist ); //obsluga pantografu tylnego bool PantRear( bool const State, range_t const Notify = range_t::consist ); //obsluga pantografu tylnego
/*-funkcje typowe dla lokomotywy spalinowej z przekladnia mechaniczna*/ /*-funkcje typowe dla lokomotywy spalinowej z przekladnia mechaniczna*/
bool dizel_EngageSwitch(double state); bool dizel_EngageSwitch(double state);
@@ -1364,10 +1361,10 @@ public:
/* funckje dla wagonow*/ /* funckje dla wagonow*/
bool LoadingDone(double LSpeed, std::string LoadInit); bool LoadingDone(double LSpeed, std::string LoadInit);
bool DoorLeft(bool State, int const Notify = range::consist ); //obsluga drzwi lewych bool DoorLeft(bool State, range_t const Notify = range_t::consist ); //obsluga drzwi lewych
bool DoorRight(bool State, int const Notify = range::consist ); //obsluga drzwi prawych bool DoorRight(bool State, range_t const Notify = range_t::consist ); //obsluga drzwi prawych
bool DoorBlockedFlag(void); //sprawdzenie blokady drzwi bool DoorBlockedFlag(void); //sprawdzenie blokady drzwi
bool signal_departure( bool const State, int const Notify = range::consist ); // toggles departure warning bool signal_departure( bool const State, range_t const Notify = range_t::consist ); // toggles departure warning
void update_autonomous_doors( double const Deltatime ); // automatic door controller update void update_autonomous_doors( double const Deltatime ); // automatic door controller update
/* funkcje dla samochodow*/ /* funkcje dla samochodow*/
@@ -1403,7 +1400,7 @@ private:
void LoadFIZ_PowerParamsDecode( TPowerParameters &Powerparameters, std::string const Prefix, std::string const &Input ); void LoadFIZ_PowerParamsDecode( TPowerParameters &Powerparameters, std::string const Prefix, std::string const &Input );
TPowerType LoadFIZ_PowerDecode( std::string const &Power ); TPowerType LoadFIZ_PowerDecode( std::string const &Power );
TPowerSource LoadFIZ_SourceDecode( std::string const &Source ); TPowerSource LoadFIZ_SourceDecode( std::string const &Source );
TEngineTypes LoadFIZ_EngineDecode( std::string const &Engine ); TEngineType LoadFIZ_EngineDecode( std::string const &Engine );
bool readMPT0( std::string const &line ); bool readMPT0( std::string const &line );
bool readMPT( std::string const &line ); //Q 20160717 bool readMPT( std::string const &line ); //Q 20160717
bool readMPTElectricSeries( std::string const &line ); bool readMPTElectricSeries( std::string const &line );

File diff suppressed because it is too large Load Diff

View File

@@ -51,37 +51,37 @@ TCommandType TMemCell::CommandCheck()
{ // rozpoznanie komendy { // rozpoznanie komendy
if( szText == "SetVelocity" ) // najpopularniejsze if( szText == "SetVelocity" ) // najpopularniejsze
{ {
eCommand = cm_SetVelocity; eCommand = TCommandType::cm_SetVelocity;
bCommand = false; // ta komenda nie jest wysyłana bCommand = false; // ta komenda nie jest wysyłana
} }
else if( szText == "ShuntVelocity" ) // w tarczach manewrowych else if( szText == "ShuntVelocity" ) // w tarczach manewrowych
{ {
eCommand = cm_ShuntVelocity; eCommand = TCommandType::cm_ShuntVelocity;
bCommand = false; // ta komenda nie jest wysyłana bCommand = false; // ta komenda nie jest wysyłana
} }
else if( szText == "Change_direction" ) // zdarza się else if( szText == "Change_direction" ) // zdarza się
{ {
eCommand = cm_ChangeDirection; eCommand = TCommandType::cm_ChangeDirection;
bCommand = true; // do wysłania bCommand = true; // do wysłania
} }
else if( szText == "OutsideStation" ) // zdarza się else if( szText == "OutsideStation" ) // zdarza się
{ {
eCommand = cm_OutsideStation; eCommand = TCommandType::cm_OutsideStation;
bCommand = false; // tego nie powinno być w komórce bCommand = false; // tego nie powinno być w komórce
} }
else if( szText.compare( 0, 19, "PassengerStopPoint:" ) == 0 ) // porównanie początków else if( szText.compare( 0, 19, "PassengerStopPoint:" ) == 0 ) // porównanie początków
{ {
eCommand = cm_PassengerStopPoint; eCommand = TCommandType::cm_PassengerStopPoint;
bCommand = false; // tego nie powinno być w komórce bCommand = false; // tego nie powinno być w komórce
} }
else if( szText == "SetProximityVelocity" ) // nie powinno tego być else if( szText == "SetProximityVelocity" ) // nie powinno tego być
{ {
eCommand = cm_SetProximityVelocity; eCommand = TCommandType::cm_SetProximityVelocity;
bCommand = false; // ta komenda nie jest wysyłana bCommand = false; // ta komenda nie jest wysyłana
} }
else else
{ {
eCommand = cm_Unknown; // ciąg nierozpoznany (nie jest komendą) eCommand = TCommandType::cm_Unknown; // ciąg nierozpoznany (nie jest komendą)
bCommand = true; // do wysłania bCommand = true; // do wysłania
} }
return eCommand; return eCommand;
@@ -141,11 +141,11 @@ bool TMemCell::Compare( std::string const &szTestText, double const fTestValue1,
bool TMemCell::IsVelocity() const bool TMemCell::IsVelocity() const
{ // sprawdzenie, czy event odczytu tej komórki ma być do skanowania, czy do kolejkowania { // sprawdzenie, czy event odczytu tej komórki ma być do skanowania, czy do kolejkowania
if (eCommand == cm_SetVelocity) if (eCommand == TCommandType::cm_SetVelocity)
return true; return true;
if (eCommand == cm_ShuntVelocity) if (eCommand == TCommandType::cm_ShuntVelocity)
return true; return true;
return (eCommand == cm_SetProximityVelocity); return (eCommand == TCommandType::cm_SetProximityVelocity);
}; };
void TMemCell::StopCommandSent() void TMemCell::StopCommandSent()

View File

@@ -64,7 +64,7 @@ private:
double fValue1 { 0.0 }; double fValue1 { 0.0 };
double fValue2 { 0.0 }; double fValue2 { 0.0 };
// other // other
TCommandType eCommand { cm_Unknown }; TCommandType eCommand { TCommandType::cm_Unknown };
bool bCommand { false }; // czy zawiera komendę dla zatrzymanego AI bool bCommand { false }; // czy zawiera komendę dla zatrzymanego AI
TEvent *OnSent { nullptr }; // event dodawany do kolejki po wysłaniu komendy zatrzymującej skład TEvent *OnSent { nullptr }; // event dodawany do kolejki po wysłaniu komendy zatrzymującej skład
}; };

View File

@@ -107,22 +107,6 @@ int TSubModel::SeekFaceNormal(std::vector<unsigned int> const &Masks, int const
float emm1[] = { 1, 1, 1, 0 }; float emm1[] = { 1, 1, 1, 0 };
float emm2[] = { 0, 0, 0, 1 }; float emm2[] = { 0, 0, 0, 1 };
inline double readIntAsDouble(cParser &parser, int base = 255)
{
int value = parser.getToken<int>(false);
return (static_cast<double>(value) / base);
};
template <typename ColorT> inline void readColor(cParser &parser, ColorT *color)
{
double discard;
parser.getTokens(4, false);
parser >> discard >> color[0] >> color[1] >> color[2];
color[ 0 ] /= 255.0;
color[ 1 ] /= 255.0;
color[ 2 ] /= 255.0;
};
inline void readColor(cParser &parser, glm::vec4 &color) inline void readColor(cParser &parser, glm::vec4 &color)
{ {
int discard; int discard;
@@ -192,41 +176,41 @@ int TSubModel::Load( cParser &parser, TModel3d *Model, /*int Pos,*/ bool dynamic
{ {
iFlags |= 0x4000; // jak animacja, to trzeba przechowywać macierz zawsze iFlags |= 0x4000; // jak animacja, to trzeba przechowywać macierz zawsze
if (type == "seconds_jump") if (type == "seconds_jump")
b_Anim = b_aAnim = at_SecondsJump; // sekundy z przeskokiem b_Anim = b_aAnim = TAnimType::at_SecondsJump; // sekundy z przeskokiem
else if (type == "minutes_jump") else if (type == "minutes_jump")
b_Anim = b_aAnim = at_MinutesJump; // minuty z przeskokiem b_Anim = b_aAnim = TAnimType::at_MinutesJump; // minuty z przeskokiem
else if (type == "hours_jump") else if (type == "hours_jump")
b_Anim = b_aAnim = at_HoursJump; // godziny z przeskokiem b_Anim = b_aAnim = TAnimType::at_HoursJump; // godziny z przeskokiem
else if (type == "hours24_jump") else if (type == "hours24_jump")
b_Anim = b_aAnim = at_Hours24Jump; // godziny z przeskokiem b_Anim = b_aAnim = TAnimType::at_Hours24Jump; // godziny z przeskokiem
else if (type == "seconds") else if (type == "seconds")
b_Anim = b_aAnim = at_Seconds; // minuty płynnie b_Anim = b_aAnim = TAnimType::at_Seconds; // minuty płynnie
else if (type == "minutes") else if (type == "minutes")
b_Anim = b_aAnim = at_Minutes; // minuty płynnie b_Anim = b_aAnim = TAnimType::at_Minutes; // minuty płynnie
else if (type == "hours") else if (type == "hours")
b_Anim = b_aAnim = at_Hours; // godziny płynnie b_Anim = b_aAnim = TAnimType::at_Hours; // godziny płynnie
else if (type == "hours24") else if (type == "hours24")
b_Anim = b_aAnim = at_Hours24; // godziny płynnie b_Anim = b_aAnim = TAnimType::at_Hours24; // godziny płynnie
else if (type == "billboard") else if (type == "billboard")
b_Anim = b_aAnim = at_Billboard; // obrót w pionie do kamery b_Anim = b_aAnim = TAnimType::at_Billboard; // obrót w pionie do kamery
else if (type == "wind") else if (type == "wind")
b_Anim = b_aAnim = at_Wind; // ruch pod wpływem wiatru b_Anim = b_aAnim = TAnimType::at_Wind; // ruch pod wpływem wiatru
else if (type == "sky") else if (type == "sky")
b_Anim = b_aAnim = at_Sky; // aniamacja nieba b_Anim = b_aAnim = TAnimType::at_Sky; // aniamacja nieba
else if (type == "ik") else if (type == "ik")
b_Anim = b_aAnim = at_IK; // IK: zadający b_Anim = b_aAnim = TAnimType::at_IK; // IK: zadający
else if (type == "ik11") else if (type == "ik11")
b_Anim = b_aAnim = at_IK11; // IK: kierunkowany b_Anim = b_aAnim = TAnimType::at_IK11; // IK: kierunkowany
else if (type == "ik21") else if (type == "ik21")
b_Anim = b_aAnim = at_IK21; // IK: kierunkowany b_Anim = b_aAnim = TAnimType::at_IK21; // IK: kierunkowany
else if (type == "ik22") else if (type == "ik22")
b_Anim = b_aAnim = at_IK22; // IK: kierunkowany b_Anim = b_aAnim = TAnimType::at_IK22; // IK: kierunkowany
else if (type == "digital") else if (type == "digital")
b_Anim = b_aAnim = at_Digital; // licznik mechaniczny b_Anim = b_aAnim = TAnimType::at_Digital; // licznik mechaniczny
else if (type == "digiclk") else if (type == "digiclk")
b_Anim = b_aAnim = at_DigiClk; // zegar cyfrowy b_Anim = b_aAnim = TAnimType::at_DigiClk; // zegar cyfrowy
else else
b_Anim = b_aAnim = at_Undefined; // nieznana forma animacji b_Anim = b_aAnim = TAnimType::at_Undefined; // nieznana forma animacji
} }
} }
if (eType < TP_ROTATOR) if (eType < TP_ROTATOR)
@@ -281,19 +265,16 @@ int TSubModel::Load( cParser &parser, TModel3d *Model, /*int Pos,*/ bool dynamic
else if (eType < TP_ROTATOR) else if (eType < TP_ROTATOR)
{ {
std::string discard; std::string discard;
parser.getTokens(5, false); parser.getTokens(6, false);
parser parser
>> discard >> bWire >> discard >> bWire
>> discard >> fWireSize >> discard >> fWireSize
>> discard; >> discard >> Opacity;
// wymagane jest 0 dla szyb, 100 idzie w nieprzezroczyste // wymagane jest 0 dla szyb, 100 idzie w nieprzezroczyste
Opacity = readIntAsDouble(parser, 100.0f); if( Opacity > 1.f ) {
if (Opacity > 1.0f) Opacity = std::min( 1.f, Opacity * 0.01f );
Opacity *= 0.01f; // w 2013 był błąd i aby go obejść, trzeba było wpisać 10000.0 }
/*
if ((Global.iConvertModels & 1) == 0) // dla zgodności wstecz
Opacity = 0.0; // wszystko idzie w przezroczyste albo zależnie od tekstury
*/
if (!parser.expectToken("map:")) if (!parser.expectToken("map:"))
Error("Model map parse failure!"); Error("Model map parse failure!");
std::string material = parser.getToken<std::string>(); std::string material = parser.getToken<std::string>();
@@ -793,8 +774,8 @@ void TSubModel::SetRotate(float3 vNewRotateAxis, float fNewAngle)
f_Angle = fNewAngle; f_Angle = fNewAngle;
if (fNewAngle != 0.0) if (fNewAngle != 0.0)
{ {
b_Anim = at_Rotate; b_Anim = TAnimType::at_Rotate;
b_aAnim = at_Rotate; b_aAnim = TAnimType::at_Rotate;
} }
iAnimOwner = iInstance; // zapamiętanie czyja jest animacja iAnimOwner = iInstance; // zapamiętanie czyja jest animacja
} }
@@ -804,8 +785,8 @@ void TSubModel::SetRotateXYZ(float3 vNewAngles)
// podane kąty wokół osi // podane kąty wokół osi
// lokalnego układu // lokalnego układu
v_Angles = vNewAngles; v_Angles = vNewAngles;
b_Anim = at_RotateXYZ; b_Anim = TAnimType::at_RotateXYZ;
b_aAnim = at_RotateXYZ; b_aAnim = TAnimType::at_RotateXYZ;
iAnimOwner = iInstance; // zapamiętanie czyja jest animacja iAnimOwner = iInstance; // zapamiętanie czyja jest animacja
} }
@@ -816,16 +797,16 @@ void TSubModel::SetRotateXYZ( Math3D::vector3 vNewAngles)
v_Angles.x = vNewAngles.x; v_Angles.x = vNewAngles.x;
v_Angles.y = vNewAngles.y; v_Angles.y = vNewAngles.y;
v_Angles.z = vNewAngles.z; v_Angles.z = vNewAngles.z;
b_Anim = at_RotateXYZ; b_Anim = TAnimType::at_RotateXYZ;
b_aAnim = at_RotateXYZ; b_aAnim = TAnimType::at_RotateXYZ;
iAnimOwner = iInstance; // zapamiętanie czyja jest animacja iAnimOwner = iInstance; // zapamiętanie czyja jest animacja
} }
void TSubModel::SetTranslate(float3 vNewTransVector) void TSubModel::SetTranslate(float3 vNewTransVector)
{ // przesunięcie submodelu (np. w kabinie) { // przesunięcie submodelu (np. w kabinie)
v_TransVector = vNewTransVector; v_TransVector = vNewTransVector;
b_Anim = at_Translate; b_Anim = TAnimType::at_Translate;
b_aAnim = at_Translate; b_aAnim = TAnimType::at_Translate;
iAnimOwner = iInstance; // zapamiętanie czyja jest animacja iAnimOwner = iInstance; // zapamiętanie czyja jest animacja
} }
@@ -834,8 +815,8 @@ void TSubModel::SetTranslate( Math3D::vector3 vNewTransVector)
v_TransVector.x = vNewTransVector.x; v_TransVector.x = vNewTransVector.x;
v_TransVector.y = vNewTransVector.y; v_TransVector.y = vNewTransVector.y;
v_TransVector.z = vNewTransVector.z; v_TransVector.z = vNewTransVector.z;
b_Anim = at_Translate; b_Anim = TAnimType::at_Translate;
b_aAnim = at_Translate; b_aAnim = TAnimType::at_Translate;
iAnimOwner = iInstance; // zapamiętanie czyja jest animacja iAnimOwner = iInstance; // zapamiętanie czyja jest animacja
} }
@@ -891,17 +872,17 @@ void TSubModel::RaAnimation(TAnimType a)
{ // wykonanie animacji niezależnie od renderowania { // wykonanie animacji niezależnie od renderowania
switch (a) switch (a)
{ // korekcja położenia, jeśli submodel jest animowany { // korekcja położenia, jeśli submodel jest animowany
case at_Translate: // Ra: było "true" case TAnimType::at_Translate: // Ra: było "true"
if (iAnimOwner != iInstance) if (iAnimOwner != iInstance)
break; // cudza animacja break; // cudza animacja
glTranslatef(v_TransVector.x, v_TransVector.y, v_TransVector.z); glTranslatef(v_TransVector.x, v_TransVector.y, v_TransVector.z);
break; break;
case at_Rotate: // Ra: było "true" case TAnimType::at_Rotate: // Ra: było "true"
if (iAnimOwner != iInstance) if (iAnimOwner != iInstance)
break; // cudza animacja break; // cudza animacja
glRotatef(f_Angle, v_RotateAxis.x, v_RotateAxis.y, v_RotateAxis.z); glRotatef(f_Angle, v_RotateAxis.x, v_RotateAxis.y, v_RotateAxis.z);
break; break;
case at_RotateXYZ: case TAnimType::at_RotateXYZ:
if (iAnimOwner != iInstance) if (iAnimOwner != iInstance)
break; // cudza animacja break; // cudza animacja
glTranslatef(v_TransVector.x, v_TransVector.y, v_TransVector.z); glTranslatef(v_TransVector.x, v_TransVector.y, v_TransVector.z);
@@ -909,31 +890,31 @@ void TSubModel::RaAnimation(TAnimType a)
glRotatef(v_Angles.y, 0.0f, 1.0f, 0.0f); glRotatef(v_Angles.y, 0.0f, 1.0f, 0.0f);
glRotatef(v_Angles.z, 0.0f, 0.0f, 1.0f); glRotatef(v_Angles.z, 0.0f, 0.0f, 1.0f);
break; break;
case at_SecondsJump: // sekundy z przeskokiem case TAnimType::at_SecondsJump: // sekundy z przeskokiem
glRotatef(simulation::Time.data().wSecond * 6.0, 0.0, 1.0, 0.0); glRotatef(simulation::Time.data().wSecond * 6.0, 0.0, 1.0, 0.0);
break; break;
case at_MinutesJump: // minuty z przeskokiem case TAnimType::at_MinutesJump: // minuty z przeskokiem
glRotatef(simulation::Time.data().wMinute * 6.0, 0.0, 1.0, 0.0); glRotatef(simulation::Time.data().wMinute * 6.0, 0.0, 1.0, 0.0);
break; break;
case at_HoursJump: // godziny skokowo 12h/360° case TAnimType::at_HoursJump: // godziny skokowo 12h/360°
glRotatef(simulation::Time.data().wHour * 30.0 * 0.5, 0.0, 1.0, 0.0); glRotatef(simulation::Time.data().wHour * 30.0 * 0.5, 0.0, 1.0, 0.0);
break; break;
case at_Hours24Jump: // godziny skokowo 24h/360° case TAnimType::at_Hours24Jump: // godziny skokowo 24h/360°
glRotatef(simulation::Time.data().wHour * 15.0 * 0.25, 0.0, 1.0, 0.0); glRotatef(simulation::Time.data().wHour * 15.0 * 0.25, 0.0, 1.0, 0.0);
break; break;
case at_Seconds: // sekundy płynnie case TAnimType::at_Seconds: // sekundy płynnie
glRotatef(simulation::Time.second() * 6.0, 0.0, 1.0, 0.0); glRotatef(simulation::Time.second() * 6.0, 0.0, 1.0, 0.0);
break; break;
case at_Minutes: // minuty płynnie case TAnimType::at_Minutes: // minuty płynnie
glRotatef(simulation::Time.data().wMinute * 6.0 + simulation::Time.second() * 0.1, 0.0, 1.0, 0.0); glRotatef(simulation::Time.data().wMinute * 6.0 + simulation::Time.second() * 0.1, 0.0, 1.0, 0.0);
break; break;
case at_Hours: // godziny płynnie 12h/360° case TAnimType::at_Hours: // godziny płynnie 12h/360°
glRotatef(2.0 * Global.fTimeAngleDeg, 0.0, 1.0, 0.0); glRotatef(2.0 * Global.fTimeAngleDeg, 0.0, 1.0, 0.0);
break; break;
case at_Hours24: // godziny płynnie 24h/360° case TAnimType::at_Hours24: // godziny płynnie 24h/360°
glRotatef(Global.fTimeAngleDeg, 0.0, 1.0, 0.0); glRotatef(Global.fTimeAngleDeg, 0.0, 1.0, 0.0);
break; break;
case at_Billboard: // obrót w pionie do kamery case TAnimType::at_Billboard: // obrót w pionie do kamery
{ {
Math3D::matrix4x4 mat; mat.OpenGL_Matrix( OpenGLMatrices.data_array( GL_MODELVIEW ) ); Math3D::matrix4x4 mat; mat.OpenGL_Matrix( OpenGLMatrices.data_array( GL_MODELVIEW ) );
float3 gdzie = float3(mat[3][0], mat[3][1], mat[3][2]); // początek układu współrzędnych submodelu względem kamery float3 gdzie = float3(mat[3][0], mat[3][1], mat[3][2]); // początek układu współrzędnych submodelu względem kamery
@@ -944,19 +925,19 @@ void TSubModel::RaAnimation(TAnimType a)
0.0); // jedynie obracamy w pionie o kąt 0.0); // jedynie obracamy w pionie o kąt
} }
break; break;
case at_Wind: // ruch pod wpływem wiatru (wiatr będziemy liczyć potem...) case TAnimType::at_Wind: // ruch pod wpływem wiatru (wiatr będziemy liczyć potem...)
glRotated(1.5 * std::sin(M_PI * simulation::Time.second() / 6.0), 0.0, 1.0, 0.0); glRotated(1.5 * std::sin(M_PI * simulation::Time.second() / 6.0), 0.0, 1.0, 0.0);
break; break;
case at_Sky: // animacja nieba case TAnimType::at_Sky: // animacja nieba
glRotated(Global.fLatitudeDeg, 1.0, 0.0, 0.0); // ustawienie osi OY na północ glRotated(Global.fLatitudeDeg, 1.0, 0.0, 0.0); // ustawienie osi OY na północ
// glRotatef(Global.fTimeAngleDeg,0.0,1.0,0.0); //obrót dobowy osi OX // glRotatef(Global.fTimeAngleDeg,0.0,1.0,0.0); //obrót dobowy osi OX
glRotated(-fmod(Global.fTimeAngleDeg, 360.0), 0.0, 1.0, 0.0); // obrót dobowy osi OX glRotated(-fmod(Global.fTimeAngleDeg, 360.0), 0.0, 1.0, 0.0); // obrót dobowy osi OX
break; break;
case at_IK11: // ostatni element animacji szkieletowej (podudzie, stopa) case TAnimType::at_IK11: // ostatni element animacji szkieletowej (podudzie, stopa)
glRotatef(v_Angles.z, 0.0f, 1.0f, 0.0f); // obrót względem osi pionowej (azymut) glRotatef(v_Angles.z, 0.0f, 1.0f, 0.0f); // obrót względem osi pionowej (azymut)
glRotatef(v_Angles.x, 1.0f, 0.0f, 0.0f); // obrót względem poziomu (deklinacja) glRotatef(v_Angles.x, 1.0f, 0.0f, 0.0f); // obrót względem poziomu (deklinacja)
break; break;
case at_DigiClk: // animacja zegara cyfrowego case TAnimType::at_DigiClk: // animacja zegara cyfrowego
{ // ustawienie animacji w submodelach potomnych { // ustawienie animacji w submodelach potomnych
TSubModel *sm = ChildGet(); TSubModel *sm = ChildGet();
do do

View File

@@ -21,7 +21,7 @@ const int TP_FREESPOTLIGHT = 257;
const int TP_STARS = 258; const int TP_STARS = 258;
const int TP_TEXT = 259; const int TP_TEXT = 259;
enum TAnimType // rodzaj animacji enum class TAnimType // rodzaj animacji
{ {
at_None, // brak at_None, // brak
at_Rotate, // obrót względem wektora o kąt at_Rotate, // obrót względem wektora o kąt
@@ -38,13 +38,13 @@ enum TAnimType // rodzaj animacji
at_Billboard, // obrót w pionie do kamery at_Billboard, // obrót w pionie do kamery
at_Wind, // ruch pod wpływem wiatru at_Wind, // ruch pod wpływem wiatru
at_Sky, // animacja nieba at_Sky, // animacja nieba
at_IK = 0x100, // odwrotna kinematyka - submodel sterujący (np. staw skokowy) at_IK, // odwrotna kinematyka - submodel sterujący (np. staw skokowy)
at_IK11 = 0x101, // odwrotna kinematyka - submodel nadrzędny do sterowango (np. stopa) at_IK11, // odwrotna kinematyka - submodel nadrzędny do sterowango (np. stopa)
at_IK21 = 0x102, // odwrotna kinematyka - submodel nadrzędny do sterowango (np. podudzie) at_IK21, // odwrotna kinematyka - submodel nadrzędny do sterowango (np. podudzie)
at_IK22 = 0x103, // odwrotna kinematyka - submodel nadrzędny do nadrzędnego sterowango (np. udo) at_IK22, // odwrotna kinematyka - submodel nadrzędny do nadrzędnego sterowango (np. udo)
at_Digital = 0x200, // dziesięciocyfrowy licznik mechaniczny (z cylindrami) at_Digital, // dziesięciocyfrowy licznik mechaniczny (z cylindrami)
at_DigiClk = 0x201, // zegar cyfrowy jako licznik na dziesięciościanach at_DigiClk, // zegar cyfrowy jako licznik na dziesięciościanach
at_Undefined = 0x800000FF // animacja chwilowo nieokreślona at_Undefined // animacja chwilowo nieokreślona
}; };
namespace scene { namespace scene {
@@ -73,7 +73,7 @@ private:
int eType{ TP_ROTATOR }; // Ra: modele binarne dają więcej możliwości niż mesh złożony z trójkątów int eType{ TP_ROTATOR }; // Ra: modele binarne dają więcej możliwości niż mesh złożony z trójkątów
int iName{ -1 }; // numer łańcucha z nazwą submodelu, albo -1 gdy anonimowy int iName{ -1 }; // numer łańcucha z nazwą submodelu, albo -1 gdy anonimowy
public: // chwilowo public: // chwilowo
TAnimType b_Anim{ at_None }; TAnimType b_Anim{ TAnimType::at_None };
private: private:
int iFlags{ 0x0200 }; // bit 9=1: submodel został utworzony a nie ustawiony na wczytany plik int iFlags{ 0x0200 }; // bit 9=1: submodel został utworzony a nie ustawiony na wczytany plik
@@ -136,7 +136,7 @@ public: // chwilowo
gfx::vertex_array Vertices; gfx::vertex_array Vertices;
float m_boundingradius { 0 }; float m_boundingradius { 0 };
size_t iAnimOwner{ 0 }; // roboczy numer egzemplarza, który ustawił animację size_t iAnimOwner{ 0 }; // roboczy numer egzemplarza, który ustawił animację
TAnimType b_aAnim{ at_None }; // kody animacji oddzielnie, bo zerowane TAnimType b_aAnim{ TAnimType::at_None }; // kody animacji oddzielnie, bo zerowane
float4x4 *mAnimMatrix{ nullptr }; // macierz do animacji kwaternionowych (należy do AnimContainer) float4x4 *mAnimMatrix{ nullptr }; // macierz do animacji kwaternionowych (należy do AnimContainer)
TSubModel **smLetter{ nullptr }; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D) TSubModel **smLetter{ nullptr }; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D)
TSubModel *Parent{ nullptr }; // nadrzędny, np. do wymnażania macierzy TSubModel *Parent{ nullptr }; // nadrzędny, np. do wymnażania macierzy

130
Train.cpp
View File

@@ -600,7 +600,7 @@ bool TTrain::is_eztoer() const {
return return
( ( mvControlled->TrainType == dt_EZT ) ( ( mvControlled->TrainType == dt_EZT )
&& ( mvOccupied->BrakeSubsystem == ss_ESt ) && ( mvOccupied->BrakeSubsystem == TBrakeSubSystem::ss_ESt )
&& ( mvControlled->Battery == true ) && ( mvControlled->Battery == true )
&& ( mvControlled->EpFuse == true ) && ( mvControlled->EpFuse == true )
&& ( mvControlled->ActiveDir != 0 ) ); // od yB && ( mvControlled->ActiveDir != 0 ) ); // od yB
@@ -769,7 +769,7 @@ void TTrain::OnCommand_secondcontrollerincrease( TTrain *Train, command_data con
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
// on press or hold // on press or hold
if( ( Train->mvControlled->EngineType == DieselElectric ) if( ( Train->mvControlled->EngineType == TEngineType::DieselElectric )
&& ( true == Train->mvControlled->ShuntMode ) ) { && ( true == Train->mvControlled->ShuntMode ) ) {
Train->mvControlled->AnPos = clamp( Train->mvControlled->AnPos = clamp(
Train->mvControlled->AnPos + 0.025, Train->mvControlled->AnPos + 0.025,
@@ -785,7 +785,7 @@ void TTrain::OnCommand_secondcontrollerincreasefast( TTrain *Train, command_data
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
// on press or hold // on press or hold
if( ( Train->mvControlled->EngineType == DieselElectric ) if( ( Train->mvControlled->EngineType == TEngineType::DieselElectric )
&& ( true == Train->mvControlled->ShuntMode ) ) { && ( true == Train->mvControlled->ShuntMode ) ) {
Train->mvControlled->AnPos = 1.0; Train->mvControlled->AnPos = 1.0;
} }
@@ -837,7 +837,7 @@ void TTrain::OnCommand_secondcontrollerdecrease( TTrain *Train, command_data con
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
// on press or hold // on press or hold
if( ( Train->mvControlled->EngineType == DieselElectric ) if( ( Train->mvControlled->EngineType == TEngineType::DieselElectric )
&& ( true == Train->mvControlled->ShuntMode ) ) { && ( true == Train->mvControlled->ShuntMode ) ) {
Train->mvControlled->AnPos = clamp( Train->mvControlled->AnPos = clamp(
Train->mvControlled->AnPos - 0.025, Train->mvControlled->AnPos - 0.025,
@@ -853,7 +853,7 @@ void TTrain::OnCommand_secondcontrollerdecreasefast( TTrain *Train, command_data
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
// on press or hold // on press or hold
if( ( Train->mvControlled->EngineType == DieselElectric ) if( ( Train->mvControlled->EngineType == TEngineType::DieselElectric )
&& ( true == Train->mvControlled->ShuntMode ) ) { && ( true == Train->mvControlled->ShuntMode ) ) {
Train->mvControlled->AnPos = 0.0; Train->mvControlled->AnPos = 0.0;
} }
@@ -882,7 +882,7 @@ void TTrain::OnCommand_independentbrakeincrease( TTrain *Train, command_data con
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
if( Train->mvOccupied->LocalBrake != ManualBrake ) { if( Train->mvOccupied->LocalBrake != TLocalBrake::ManualBrake ) {
Train->mvOccupied->IncLocalBrakeLevel( 1 ); Train->mvOccupied->IncLocalBrakeLevel( 1 );
} }
} }
@@ -892,8 +892,8 @@ void TTrain::OnCommand_independentbrakeincreasefast( TTrain *Train, command_data
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
if( Train->mvOccupied->LocalBrake != ManualBrake ) { if( Train->mvOccupied->LocalBrake != TLocalBrake::ManualBrake ) {
Train->mvOccupied->IncLocalBrakeLevel( 2 ); Train->mvOccupied->IncLocalBrakeLevel( LocalBrakePosNo );
} }
} }
} }
@@ -902,10 +902,10 @@ void TTrain::OnCommand_independentbrakedecrease( TTrain *Train, command_data con
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
if( ( Train->mvOccupied->LocalBrake != ManualBrake ) if( ( Train->mvOccupied->LocalBrake != TLocalBrake::ManualBrake )
// Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - odhamować jakoś trzeba // Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - odhamować jakoś trzeba
// TODO: sort AI out so it doesn't do things it doesn't have equipment for // TODO: sort AI out so it doesn't do things it doesn't have equipment for
|| ( Train->mvOccupied->LocalBrakePos != 0 ) ) { || ( Train->mvOccupied->LocalBrakePosA > 0 ) ) {
Train->mvOccupied->DecLocalBrakeLevel( 1 ); Train->mvOccupied->DecLocalBrakeLevel( 1 );
} }
} }
@@ -915,11 +915,11 @@ void TTrain::OnCommand_independentbrakedecreasefast( TTrain *Train, command_data
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
if( ( Train->mvOccupied->LocalBrake != ManualBrake ) if( ( Train->mvOccupied->LocalBrake != TLocalBrake::ManualBrake )
// Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - odhamować jakoś trzeba // Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - odhamować jakoś trzeba
// TODO: sort AI out so it doesn't do things it doesn't have equipment for // TODO: sort AI out so it doesn't do things it doesn't have equipment for
|| ( Train->mvOccupied->LocalBrakePos != 0 ) ) { || ( Train->mvOccupied->LocalBrakePosA > 0 ) ) {
Train->mvOccupied->DecLocalBrakeLevel( 2 ); Train->mvOccupied->DecLocalBrakeLevel( LocalBrakePosNo );
} }
} }
} }
@@ -948,9 +948,9 @@ void TTrain::OnCommand_independentbrakebailoff( TTrain *Train, command_data cons
// TODO: check if this set of conditions can be simplified. // TODO: check if this set of conditions can be simplified.
// it'd be more flexible to have an attribute indicating whether bail off position is supported // it'd be more flexible to have an attribute indicating whether bail off position is supported
if( ( Train->mvControlled->TrainType != dt_EZT ) if( ( Train->mvControlled->TrainType != dt_EZT )
&& ( ( Train->mvControlled->EngineType == ElectricSeriesMotor ) && ( ( Train->mvControlled->EngineType == TEngineType::ElectricSeriesMotor )
|| ( Train->mvControlled->EngineType == DieselElectric ) || ( Train->mvControlled->EngineType == TEngineType::DieselElectric )
|| ( Train->mvControlled->EngineType == ElectricInductionMotor ) ) || ( Train->mvControlled->EngineType == TEngineType::ElectricInductionMotor ) )
&& ( Train->mvOccupied->BrakeCtrlPosNo > 0 ) ) { && ( Train->mvOccupied->BrakeCtrlPosNo > 0 ) ) {
if( Command.action == GLFW_PRESS ) { if( Command.action == GLFW_PRESS ) {
@@ -989,7 +989,7 @@ void TTrain::OnCommand_trainbrakeincrease( TTrain *Train, command_data const &Co
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
if( Train->mvOccupied->BrakeHandle == FV4a ) { if( Train->mvOccupied->BrakeHandle == TBrakeHandle::FV4a ) {
Train->mvOccupied->BrakeLevelAdd( 0.1 /*15.0 * Command.time_delta*/ ); Train->mvOccupied->BrakeLevelAdd( 0.1 /*15.0 * Command.time_delta*/ );
} }
else { else {
@@ -1002,7 +1002,7 @@ void TTrain::OnCommand_trainbrakedecrease( TTrain *Train, command_data const &Co
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
// press or hold // press or hold
if( Train->mvOccupied->BrakeHandle == FV4a ) { if( Train->mvOccupied->BrakeHandle == TBrakeHandle::FV4a ) {
Train->mvOccupied->BrakeLevelAdd( -0.1 /*-15.0 * Command.time_delta*/ ); Train->mvOccupied->BrakeLevelAdd( -0.1 /*-15.0 * Command.time_delta*/ );
} }
else { else {
@@ -1031,7 +1031,7 @@ void TTrain::OnCommand_trainbrakecharging( TTrain *Train, command_data const &Co
else { else {
// release // release
if( ( Train->mvOccupied->BrakeCtrlPos == -1 ) if( ( Train->mvOccupied->BrakeCtrlPos == -1 )
&& ( Train->mvOccupied->BrakeHandle == FVel6 ) && ( Train->mvOccupied->BrakeHandle == TBrakeHandle::FVel6 )
&& ( Train->DynamicObject->Controller != AIdriver ) && ( Train->DynamicObject->Controller != AIdriver )
&& ( Global.iFeedbackMode < 3 ) ) { && ( Global.iFeedbackMode < 3 ) ) {
// Odskakiwanie hamulce EP // Odskakiwanie hamulce EP
@@ -1062,7 +1062,7 @@ void TTrain::OnCommand_trainbrakeservice( TTrain *Train, command_data const &Com
Train->set_train_brake( ( Train->set_train_brake( (
Train->mvOccupied->BrakeCtrlPosNo / 2 Train->mvOccupied->BrakeCtrlPosNo / 2
+ ( Train->mvOccupied->BrakeHandle == FV4a ? + ( Train->mvOccupied->BrakeHandle == TBrakeHandle::FV4a ?
1 : 1 :
0 ) ) ); 0 ) ) );
} }
@@ -1103,7 +1103,7 @@ void TTrain::OnCommand_trainbrakebasepressureincrease( TTrain *Train, command_da
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
switch( Train->mvOccupied->BrakeHandle ) { switch( Train->mvOccupied->BrakeHandle ) {
case FV4a: { case TBrakeHandle::FV4a: {
Train->mvOccupied->BrakeCtrlPos2 = clamp( Train->mvOccupied->BrakeCtrlPos2 - 0.01, -1.5, 2.0 ); Train->mvOccupied->BrakeCtrlPos2 = clamp( Train->mvOccupied->BrakeCtrlPos2 - 0.01, -1.5, 2.0 );
break; break;
} }
@@ -1120,7 +1120,7 @@ void TTrain::OnCommand_trainbrakebasepressuredecrease( TTrain *Train, command_da
if( Command.action != GLFW_RELEASE ) { if( Command.action != GLFW_RELEASE ) {
switch( Train->mvOccupied->BrakeHandle ) { switch( Train->mvOccupied->BrakeHandle ) {
case FV4a: { case TBrakeHandle::FV4a: {
Train->mvOccupied->BrakeCtrlPos2 = clamp( Train->mvOccupied->BrakeCtrlPos2 + 0.01, -1.5, 2.0 ); Train->mvOccupied->BrakeCtrlPos2 = clamp( Train->mvOccupied->BrakeCtrlPos2 + 0.01, -1.5, 2.0 );
break; break;
} }
@@ -1158,7 +1158,7 @@ void TTrain::OnCommand_manualbrakeincrease( TTrain *Train, command_data const &C
auto *vehicle { Train->find_nearest_consist_vehicle() }; auto *vehicle { Train->find_nearest_consist_vehicle() };
if( vehicle == nullptr ) { return; } if( vehicle == nullptr ) { return; }
if( ( vehicle->MoverParameters->LocalBrake == ManualBrake ) if( ( vehicle->MoverParameters->LocalBrake == TLocalBrake::ManualBrake )
|| ( vehicle->MoverParameters->MBrake == true ) ) { || ( vehicle->MoverParameters->MBrake == true ) ) {
vehicle->MoverParameters->IncManualBrakeLevel( 1 ); vehicle->MoverParameters->IncManualBrakeLevel( 1 );
@@ -1173,7 +1173,7 @@ void TTrain::OnCommand_manualbrakedecrease( TTrain *Train, command_data const &C
auto *vehicle { Train->find_nearest_consist_vehicle() }; auto *vehicle { Train->find_nearest_consist_vehicle() };
if( vehicle == nullptr ) { return; } if( vehicle == nullptr ) { return; }
if( ( vehicle->MoverParameters->LocalBrake == ManualBrake ) if( ( vehicle->MoverParameters->LocalBrake == TLocalBrake::ManualBrake )
|| ( vehicle->MoverParameters->MBrake == true ) ) { || ( vehicle->MoverParameters->MBrake == true ) ) {
vehicle->MoverParameters->DecManualBrakeLevel( 1 ); vehicle->MoverParameters->DecManualBrakeLevel( 1 );
@@ -1210,7 +1210,7 @@ void TTrain::OnCommand_wheelspinbrakeactivate( TTrain *Train, command_data const
return; return;
} }
if( Train->mvOccupied->BrakeSystem != ElectroPneumatic ) { if( Train->mvOccupied->BrakeSystem != TBrakeSystem::ElectroPneumatic ) {
// standard behaviour // standard behaviour
if( Command.action == GLFW_PRESS ) { if( Command.action == GLFW_PRESS ) {
// visual feedback // visual feedback
@@ -1229,7 +1229,7 @@ void TTrain::OnCommand_wheelspinbrakeactivate( TTrain *Train, command_data const
// visual feedback // visual feedback
Train->ggAntiSlipButton.UpdateValue( 1.0, Train->dsbPneumaticSwitch ); Train->ggAntiSlipButton.UpdateValue( 1.0, Train->dsbPneumaticSwitch );
if( ( Train->mvOccupied->BrakeHandle == St113 ) if( ( Train->mvOccupied->BrakeHandle == TBrakeHandle::St113 )
&& ( Train->mvControlled->EpFuse == true ) ) { && ( Train->mvControlled->EpFuse == true ) ) {
Train->mvOccupied->SwitchEPBrake( 1 ); Train->mvOccupied->SwitchEPBrake( 1 );
} }
@@ -2074,8 +2074,8 @@ void TTrain::OnCommand_linebreakerclose( TTrain *Train, command_data const &Comm
if( Train->m_linebreakerstate == 2 ) { if( Train->m_linebreakerstate == 2 ) {
// we don't need to start the diesel twice, but the other types (with impulse switch setup) still need to be launched // we don't need to start the diesel twice, but the other types (with impulse switch setup) still need to be launched
if( ( Train->mvControlled->EngineType != DieselEngine ) if( ( Train->mvControlled->EngineType != TEngineType::DieselEngine )
&& ( Train->mvControlled->EngineType != DieselElectric ) ) { && ( Train->mvControlled->EngineType != TEngineType::DieselElectric ) ) {
// try to finalize state change of the line breaker, set the state based on the outcome // try to finalize state change of the line breaker, set the state based on the outcome
Train->m_linebreakerstate = ( Train->m_linebreakerstate = (
Train->mvControlled->MainSwitch( true ) ? Train->mvControlled->MainSwitch( true ) ?
@@ -2387,7 +2387,7 @@ void TTrain::OnCommand_convertertoggle( TTrain *Train, command_data const &Comma
void TTrain::OnCommand_converterenable( TTrain *Train, command_data const &Command ) { void TTrain::OnCommand_converterenable( TTrain *Train, command_data const &Command ) {
if( Train->mvControlled->ConverterStart == start::automatic ) { if( Train->mvControlled->ConverterStart == start_t::automatic ) {
// let the automatic thing do its automatic thing... // let the automatic thing do its automatic thing...
return; return;
} }
@@ -2421,7 +2421,7 @@ void TTrain::OnCommand_converterenable( TTrain *Train, command_data const &Comma
void TTrain::OnCommand_converterdisable( TTrain *Train, command_data const &Command ) { void TTrain::OnCommand_converterdisable( TTrain *Train, command_data const &Command ) {
if( Train->mvControlled->ConverterStart == start::automatic ) { if( Train->mvControlled->ConverterStart == start_t::automatic ) {
// let the automatic thing do its automatic thing... // let the automatic thing do its automatic thing...
return; return;
} }
@@ -2461,7 +2461,7 @@ void TTrain::OnCommand_converterdisable( TTrain *Train, command_data const &Comm
void TTrain::OnCommand_convertertogglelocal( TTrain *Train, command_data const &Command ) { void TTrain::OnCommand_convertertogglelocal( TTrain *Train, command_data const &Command ) {
if( Train->mvOccupied->ConverterStart == start::automatic ) { if( Train->mvOccupied->ConverterStart == start_t::automatic ) {
// let the automatic thing do its automatic thing... // let the automatic thing do its automatic thing...
return; return;
} }
@@ -3714,7 +3714,7 @@ void TTrain::OnCommand_doortoggleleft( TTrain *Train, command_data const &Comman
Train->mvOccupied->DoorLeftOpened : Train->mvOccupied->DoorLeftOpened :
Train->mvOccupied->DoorRightOpened ) ) { Train->mvOccupied->DoorRightOpened ) ) {
// open // open
if( Train->mvOccupied->DoorOpenCtrl != control::driver ) { if( Train->mvOccupied->DoorOpenCtrl != control_t::driver ) {
return; return;
} }
if( Train->mvOccupied->ActiveCab == 1 ) { if( Train->mvOccupied->ActiveCab == 1 ) {
@@ -3729,7 +3729,7 @@ void TTrain::OnCommand_doortoggleleft( TTrain *Train, command_data const &Comman
} }
else { else {
// close // close
if( Train->mvOccupied->DoorCloseCtrl != control::driver ) { if( Train->mvOccupied->DoorCloseCtrl != control_t::driver ) {
return; return;
} }
// TODO: move door opening/closing to the update, so the switch animation doesn't hinge on door working // TODO: move door opening/closing to the update, so the switch animation doesn't hinge on door working
@@ -3755,7 +3755,7 @@ void TTrain::OnCommand_doortoggleright( TTrain *Train, command_data const &Comma
Train->mvOccupied->DoorRightOpened : Train->mvOccupied->DoorRightOpened :
Train->mvOccupied->DoorLeftOpened ) ) { Train->mvOccupied->DoorLeftOpened ) ) {
// open // open
if( Train->mvOccupied->DoorOpenCtrl != control::driver ) { if( Train->mvOccupied->DoorOpenCtrl != control_t::driver ) {
return; return;
} }
if( Train->mvOccupied->ActiveCab == 1 ) { if( Train->mvOccupied->ActiveCab == 1 ) {
@@ -3770,7 +3770,7 @@ void TTrain::OnCommand_doortoggleright( TTrain *Train, command_data const &Comma
} }
else { else {
// close // close
if( Train->mvOccupied->DoorCloseCtrl != control::driver ) { if( Train->mvOccupied->DoorCloseCtrl != control_t::driver ) {
return; return;
} }
if( Train->mvOccupied->ActiveCab == 1 ) { if( Train->mvOccupied->ActiveCab == 1 ) {
@@ -4107,8 +4107,8 @@ void TTrain::UpdateMechPosition(double dt)
&& ( pMechOffset.y < 4.0 ) ) // Ra 15-01: przy oglądaniu pantografu bujanie przeszkadza && ( pMechOffset.y < 4.0 ) ) // Ra 15-01: przy oglądaniu pantografu bujanie przeszkadza
{ {
Math3D::vector3 shakevector; Math3D::vector3 shakevector;
if( ( mvOccupied->EngineType == DieselElectric ) if( ( mvOccupied->EngineType == TEngineType::DieselElectric )
|| ( mvOccupied->EngineType == DieselEngine ) ) { || ( mvOccupied->EngineType == TEngineType::DieselEngine ) ) {
if( std::abs( mvOccupied->enrot ) > 0.0 ) { if( std::abs( mvOccupied->enrot ) > 0.0 ) {
// engine vibration // engine vibration
shakevector.x += shakevector.x +=
@@ -4258,8 +4258,8 @@ bool TTrain::Update( double const Deltatime )
|| ( ggMainOnButton.GetDesiredValue() > 0.95 ) ) { || ( ggMainOnButton.GetDesiredValue() > 0.95 ) ) {
// keep track of period the line breaker button is held down, to determine when/if circuit closes // keep track of period the line breaker button is held down, to determine when/if circuit closes
if( ( fHVoltage > 0.5 * mvControlled->EnginePowerSource.MaxVoltage ) if( ( fHVoltage > 0.5 * mvControlled->EnginePowerSource.MaxVoltage )
|| ( ( mvControlled->EngineType != ElectricSeriesMotor ) || ( ( mvControlled->EngineType != TEngineType::ElectricSeriesMotor )
&& ( mvControlled->EngineType != ElectricInductionMotor ) && ( mvControlled->EngineType != TEngineType::ElectricInductionMotor )
&& ( true == mvControlled->Battery ) ) ) { && ( true == mvControlled->Battery ) ) ) {
// prevent the switch from working if there's no power // prevent the switch from working if there's no power
// TODO: consider whether it makes sense for diesel engines and such // TODO: consider whether it makes sense for diesel engines and such
@@ -4284,8 +4284,8 @@ bool TTrain::Update( double const Deltatime )
if( m_linebreakerstate == 2 ) { if( m_linebreakerstate == 2 ) {
// for diesels and/or vehicles with toggle switch setup we complete the engine start here // for diesels and/or vehicles with toggle switch setup we complete the engine start here
if( ( ggMainOnButton.SubModel == nullptr ) if( ( ggMainOnButton.SubModel == nullptr )
|| ( ( mvControlled->EngineType == DieselEngine ) || ( ( mvControlled->EngineType == TEngineType::DieselEngine )
|| ( mvControlled->EngineType == DieselElectric ) ) ) { || ( mvControlled->EngineType == TEngineType::DieselElectric ) ) ) {
// try to finalize state change of the line breaker, set the state based on the outcome // try to finalize state change of the line breaker, set the state based on the outcome
m_linebreakerstate = ( m_linebreakerstate = (
mvControlled->MainSwitch( true ) ? mvControlled->MainSwitch( true ) ?
@@ -4350,7 +4350,7 @@ bool TTrain::Update( double const Deltatime )
} }
} }
if( ( mvOccupied->BrakeHandle == FVel6 ) if( ( mvOccupied->BrakeHandle == TBrakeHandle::FVel6 )
&& ( mvOccupied->fBrakeCtrlPos < 0.0 ) && ( mvOccupied->fBrakeCtrlPos < 0.0 )
&& ( Global.iFeedbackMode < 3 ) ) { && ( Global.iFeedbackMode < 3 ) ) {
// Odskakiwanie hamulce EP // Odskakiwanie hamulce EP
@@ -4389,8 +4389,8 @@ bool TTrain::Update( double const Deltatime )
} }
// Ra 2014-09: napięcia i prądy muszą być ustalone najpierw, bo wysyłane są ewentualnie na PoKeys // Ra 2014-09: napięcia i prądy muszą być ustalone najpierw, bo wysyłane są ewentualnie na PoKeys
if ((mvControlled->EngineType != DieselElectric) if ((mvControlled->EngineType != TEngineType::DieselElectric)
&& (mvControlled->EngineType != ElectricInductionMotor)) // Ra 2014-09: czy taki rozdzia? ma sens? && (mvControlled->EngineType != TEngineType::ElectricInductionMotor)) // Ra 2014-09: czy taki rozdzia? ma sens?
fHVoltage = mvControlled->RunningTraction.TractionVoltage; // Winger czy to nie jest zle? fHVoltage = mvControlled->RunningTraction.TractionVoltage; // Winger czy to nie jest zle?
// *mvControlled->Mains); // *mvControlled->Mains);
else else
@@ -4453,7 +4453,7 @@ bool TTrain::Update( double const Deltatime )
asCarName[i] = p->name(); asCarName[i] = p->name();
bPants[iUnitNo - 1][0] = (bPants[iUnitNo - 1][0] || p->MoverParameters->PantFrontUp); bPants[iUnitNo - 1][0] = (bPants[iUnitNo - 1][0] || p->MoverParameters->PantFrontUp);
bPants[iUnitNo - 1][1] = (bPants[iUnitNo - 1][1] || p->MoverParameters->PantRearUp); bPants[iUnitNo - 1][1] = (bPants[iUnitNo - 1][1] || p->MoverParameters->PantRearUp);
bComp[iUnitNo - 1][0] = (bComp[iUnitNo - 1][0] || p->MoverParameters->CompressorAllow || (p->MoverParameters->CompressorStart == start::automatic)); bComp[iUnitNo - 1][0] = (bComp[iUnitNo - 1][0] || p->MoverParameters->CompressorAllow || (p->MoverParameters->CompressorStart == start_t::automatic));
bSlip[i] = p->MoverParameters->SlippingWheels; bSlip[i] = p->MoverParameters->SlippingWheels;
if (p->MoverParameters->CompressorSpeed > 0.00001) if (p->MoverParameters->CompressorSpeed > 0.00001)
{ {
@@ -4552,12 +4552,12 @@ bool TTrain::Update( double const Deltatime )
// hunter-080812: wyrzucanie szybkiego na elektrykach gdy nie ma napiecia przy dowolnym ustawieniu kierunkowego // hunter-080812: wyrzucanie szybkiego na elektrykach gdy nie ma napiecia przy dowolnym ustawieniu kierunkowego
// Ra: to już jest w T_MoverParameters::TractionForce(), ale zależy od kierunku // Ra: to już jest w T_MoverParameters::TractionForce(), ale zależy od kierunku
if( ( mvControlled->Mains ) if( ( mvControlled->Mains )
&& ( mvControlled->EngineType == ElectricSeriesMotor ) ) { && ( mvControlled->EngineType == TEngineType::ElectricSeriesMotor ) ) {
if( std::max( mvControlled->GetTrainsetVoltage(), std::fabs( mvControlled->RunningTraction.TractionVoltage ) ) < 0.5 * mvControlled->EnginePowerSource.MaxVoltage ) { if( std::max( mvControlled->GetTrainsetVoltage(), std::fabs( mvControlled->RunningTraction.TractionVoltage ) ) < 0.5 * mvControlled->EnginePowerSource.MaxVoltage ) {
// TODO: check whether it should affect entire consist for EMU // TODO: check whether it should affect entire consist for EMU
// TODO: check whether it should happen if there's power supplied alternatively through hvcouplers // TODO: check whether it should happen if there's power supplied alternatively through hvcouplers
// TODO: potentially move this to the mover module, as there isn't much reason to have this dependent on the operator presence // TODO: potentially move this to the mover module, as there isn't much reason to have this dependent on the operator presence
mvControlled->MainSwitch( false, ( mvControlled->TrainType == dt_EZT ? range::unit : range::local ) ); mvControlled->MainSwitch( false, ( mvControlled->TrainType == dt_EZT ? range_t::unit : range_t::local ) );
} }
} }
@@ -4579,7 +4579,7 @@ bool TTrain::Update( double const Deltatime )
{ {
fConverterTimer += Deltatime; fConverterTimer += Deltatime;
if ((mvControlled->CompressorFlag == true) && (mvControlled->CompressorPower == 1) && if ((mvControlled->CompressorFlag == true) && (mvControlled->CompressorPower == 1) &&
((mvControlled->EngineType == ElectricSeriesMotor) || ((mvControlled->EngineType == TEngineType::ElectricSeriesMotor) ||
(mvControlled->TrainType == dt_EZT)) && (mvControlled->TrainType == dt_EZT)) &&
(DynamicObject->Controller == Humandriver)) // hunter-110212: poprawka dla EZT (DynamicObject->Controller == Humandriver)) // hunter-110212: poprawka dla EZT
{ // hunter-091012: poprawka (zmiana warunku z CompressorPower /rozne od { // hunter-091012: poprawka (zmiana warunku z CompressorPower /rozne od
@@ -4588,7 +4588,7 @@ bool TTrain::Update( double const Deltatime )
{ {
mvControlled->ConvOvldFlag = true; mvControlled->ConvOvldFlag = true;
if (mvControlled->TrainType != dt_EZT) if (mvControlled->TrainType != dt_EZT)
mvControlled->MainSwitch( false, ( mvControlled->TrainType == dt_EZT ? range::unit : range::local ) ); mvControlled->MainSwitch( false, ( mvControlled->TrainType == dt_EZT ? range_t::unit : range_t::local ) );
} }
else if( fConverterTimer >= fConverterPrzekaznik ) { else if( fConverterTimer >= fConverterPrzekaznik ) {
// changed switch from always true to take into account state of the compressor switch // changed switch from always true to take into account state of the compressor switch
@@ -4707,13 +4707,13 @@ bool TTrain::Update( double const Deltatime )
ggLVoltage.Update(); ggLVoltage.Update();
} }
if (mvControlled->EngineType == DieselElectric) if (mvControlled->EngineType == TEngineType::DieselElectric)
{ // ustawienie zmiennych dla silnika spalinowego { // ustawienie zmiennych dla silnika spalinowego
fEngine[1] = mvControlled->ShowEngineRotation(1); fEngine[1] = mvControlled->ShowEngineRotation(1);
fEngine[2] = mvControlled->ShowEngineRotation(2); fEngine[2] = mvControlled->ShowEngineRotation(2);
} }
else if (mvControlled->EngineType == DieselEngine) else if (mvControlled->EngineType == TEngineType::DieselEngine)
{ // albo dla innego spalinowego { // albo dla innego spalinowego
fEngine[1] = mvControlled->ShowEngineRotation(1); fEngine[1] = mvControlled->ShowEngineRotation(1);
fEngine[2] = mvControlled->ShowEngineRotation(2); fEngine[2] = mvControlled->ShowEngineRotation(2);
@@ -5161,7 +5161,7 @@ bool TTrain::Update( double const Deltatime )
false) // nie blokujemy AI false) // nie blokujemy AI
{ // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba { // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba
// Firleju: dlatego kasujemy i zastepujemy funkcją w Console // Firleju: dlatego kasujemy i zastepujemy funkcją w Console
if (mvOccupied->BrakeHandle == FV4a) if (mvOccupied->BrakeHandle == TBrakeHandle::FV4a)
{ {
double b = Console::AnalogCalibrateGet(0); double b = Console::AnalogCalibrateGet(0);
b = b * 8.0 - 2.0; b = b * 8.0 - 2.0;
@@ -5169,7 +5169,7 @@ bool TTrain::Update( double const Deltatime )
ggBrakeCtrl.UpdateValue(b); // przesów bez zaokrąglenia ggBrakeCtrl.UpdateValue(b); // przesów bez zaokrąglenia
mvOccupied->BrakeLevelSet(b); mvOccupied->BrakeLevelSet(b);
} }
if (mvOccupied->BrakeHandle == FVel6) // może można usunąć ograniczenie do FV4a i FVel6? if (mvOccupied->BrakeHandle == TBrakeHandle::FVel6) // może można usunąć ograniczenie do FV4a i FVel6?
{ {
double b = Console::AnalogCalibrateGet(0); double b = Console::AnalogCalibrateGet(0);
b = b * 7.0 - 1.0; b = b * 7.0 - 1.0;
@@ -5191,23 +5191,23 @@ bool TTrain::Update( double const Deltatime )
#ifdef _WIN32 #ifdef _WIN32
if( ( DynamicObject->Mechanik != nullptr ) if( ( DynamicObject->Mechanik != nullptr )
&& ( false == DynamicObject->Mechanik->AIControllFlag ) // nie blokujemy AI && ( false == DynamicObject->Mechanik->AIControllFlag ) // nie blokujemy AI
&& ( mvOccupied->BrakeLocHandle == FD1 ) && ( mvOccupied->BrakeLocHandle == TBrakeHandle::FD1 )
&& ( ( Global.iFeedbackMode == 4 ) && ( ( Global.iFeedbackMode == 4 )
/*|| ( Global.bMWDmasterEnable && Global.bMWDBreakEnable )*/ ) ) { /*|| ( Global.bMWDmasterEnable && Global.bMWDBreakEnable )*/ ) ) {
// Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba
// Firleju: dlatego kasujemy i zastepujemy funkcją w Console // Firleju: dlatego kasujemy i zastepujemy funkcją w Console
auto const b = clamp<double>( auto const b = clamp<double>(
Console::AnalogCalibrateGet( 1 ) * 10.0, Console::AnalogCalibrateGet( 1 ),
0.0, 0.0,
LocalBrakePosNo ); 1.0 );
ggLocalBrake.UpdateValue( b ); // przesów bez zaokrąglenia mvOccupied->LocalBrakePosA = b;
mvOccupied->LocalBrakePos = int( 1.09 * b ); // sposób zaokrąglania jest do ustalenia ggLocalBrake.UpdateValue( b * LocalBrakePosNo );
} }
else else
#endif #endif
{ {
// standardowa prodedura z kranem powiązanym z klawiaturą // standardowa prodedura z kranem powiązanym z klawiaturą
ggLocalBrake.UpdateValue( std::max<double>( mvOccupied->LocalBrakePos, mvOccupied->LocalBrakePosA * LocalBrakePosNo ) ); ggLocalBrake.UpdateValue( mvOccupied->LocalBrakePosA * LocalBrakePosNo );
} }
ggLocalBrake.Update(); ggLocalBrake.Update();
} }
@@ -5369,7 +5369,7 @@ bool TTrain::Update( double const Deltatime )
} }
// anti slip system activation, maintained while the control button is down // anti slip system activation, maintained while the control button is down
if( mvOccupied->BrakeSystem != ElectroPneumatic ) { if( mvOccupied->BrakeSystem != TBrakeSystem::ElectroPneumatic ) {
if( ggAntiSlipButton.GetDesiredValue() > 0.95 ) { if( ggAntiSlipButton.GetDesiredValue() > 0.95 ) {
mvControlled->AntiSlippingBrake(); mvControlled->AntiSlippingBrake();
} }
@@ -5475,8 +5475,8 @@ TTrain::update_sounds( double const Deltatime ) {
// McZapkie-280302 - syczenie // McZapkie-280302 - syczenie
// TODO: softer volume reduction than plain abrupt stop, perhaps as reusable wrapper? // TODO: softer volume reduction than plain abrupt stop, perhaps as reusable wrapper?
if( ( mvOccupied->BrakeHandle == FV4a ) if( ( mvOccupied->BrakeHandle == TBrakeHandle::FV4a )
|| ( mvOccupied->BrakeHandle == FVel6 ) ) { || ( mvOccupied->BrakeHandle == TBrakeHandle::FVel6 ) ) {
// upuszczanie z PG // upuszczanie z PG
fPPress = interpolate( fPPress, static_cast<float>( mvOccupied->Handle->GetSound( s_fv4a_b ) ), 0.05f ); fPPress = interpolate( fPPress, static_cast<float>( mvOccupied->Handle->GetSound( s_fv4a_b ) ), 0.05f );
volume = ( volume = (
@@ -7139,9 +7139,9 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con
if (Parser.getToken<std::string>() == "analog") if (Parser.getToken<std::string>() == "analog")
{ {
// McZapkie-300302: zegarek // McZapkie-300302: zegarek
ggClockSInd.Init(DynamicObject->mdKabina->GetFromName("ClockShand"), gt_Rotate, 1.0/60.0); ggClockSInd.Init(DynamicObject->mdKabina->GetFromName("ClockShand"), TGaugeType::gt_Rotate, 1.0/60.0);
ggClockMInd.Init(DynamicObject->mdKabina->GetFromName("ClockMhand"), gt_Rotate, 1.0/60.0); ggClockMInd.Init(DynamicObject->mdKabina->GetFromName("ClockMhand"), TGaugeType::gt_Rotate, 1.0/60.0);
ggClockHInd.Init(DynamicObject->mdKabina->GetFromName("ClockHhand"), gt_Rotate, 1.0/12.0); ggClockHInd.Init(DynamicObject->mdKabina->GetFromName("ClockHhand"), TGaugeType::gt_Rotate, 1.0/12.0);
} }
} }
else if (Label == "evoltage:") else if (Label == "evoltage:")

View File

@@ -128,7 +128,7 @@ bool TWorld::Init( GLFWwindow *Window ) {
Controlled = NULL; Controlled = NULL;
mvControlled = NULL; mvControlled = NULL;
SafeDelete( Train ); SafeDelete( Train );
Camera.Type = tp_Free; Camera.Type = TCameraType::tp_Free;
} }
} }
else else
@@ -141,7 +141,7 @@ bool TWorld::Init( GLFWwindow *Window ) {
glfwSwapBuffers( window ); glfwSwapBuffers( window );
Controlled = NULL; Controlled = NULL;
mvControlled = NULL; mvControlled = NULL;
Camera.Type = tp_Free; Camera.Type = TCameraType::tp_Free;
DebugCamera = Camera; DebugCamera = Camera;
Global.DebugCameraPosition = DebugCamera.Pos; Global.DebugCameraPosition = DebugCamera.Pos;
} }
@@ -699,7 +699,7 @@ bool TWorld::Update() {
// fixed step part of the camera update // fixed step part of the camera update
if( ( Train != nullptr ) if( ( Train != nullptr )
&& ( Camera.Type == tp_Follow ) && ( Camera.Type == TCameraType::tp_Follow )
&& ( false == DebugCameraFlag ) ) { && ( false == DebugCameraFlag ) ) {
// jeśli jazda w kabinie, przeliczyć trzeba parametry kamery // jeśli jazda w kabinie, przeliczyć trzeba parametry kamery
Train->UpdateMechPosition( m_secondaryupdaterate ); Train->UpdateMechPosition( m_secondaryupdaterate );
@@ -825,7 +825,7 @@ TWorld::Update_Camera( double const Deltatime ) {
Global.CabWindowOpen = false; Global.CabWindowOpen = false;
if( ( Train != nullptr ) if( ( Train != nullptr )
&& ( Camera.Type == tp_Follow ) && ( Camera.Type == TCameraType::tp_Follow )
&& ( false == DebugCameraFlag ) ) { && ( false == DebugCameraFlag ) ) {
// jeśli jazda w kabinie, przeliczyć trzeba parametry kamery // jeśli jazda w kabinie, przeliczyć trzeba parametry kamery
auto tempangle = Controlled->VectorFront() * ( Controlled->MoverParameters->ActiveCab == -1 ? -1 : 1 ); auto tempangle = Controlled->VectorFront() * ( Controlled->MoverParameters->ActiveCab == -1 ? -1 : 1 );

View File

@@ -207,6 +207,8 @@ eu07_application::init( int Argc, char *Argv[] ) {
int int
eu07_application::run() { eu07_application::run() {
// HACK: prevent mouse capture before simulation starts
Global.ControlPicking = true;
// TODO: move input sources and their initializations to the application mode member // TODO: move input sources and their initializations to the application mode member
input::Keyboard.init(); input::Keyboard.init();
input::Mouse.init(); input::Mouse.init();
@@ -238,6 +240,7 @@ eu07_application::run() {
set_cursor( GLFW_CURSOR_DISABLED ); set_cursor( GLFW_CURSOR_DISABLED );
set_cursor_pos( 0, 0 ); set_cursor_pos( 0, 0 );
Global.ControlPicking = false;
// main application loop // main application loop
// TODO: split into parts and delegate these to application mode member // TODO: split into parts and delegate these to application mode member
@@ -390,12 +393,12 @@ eu07_application::init_settings( int Argc, char *Argv[] ) {
} }
else if( token == "-s" ) { else if( token == "-s" ) {
if( i + 1 < Argc ) { if( i + 1 < Argc ) {
Global.SceneryFile = Argv[ ++i ]; Global.SceneryFile = ToLower( Argv[ ++i ] );
} }
} }
else if( token == "-v" ) { else if( token == "-v" ) {
if( i + 1 < Argc ) { if( i + 1 < Argc ) {
Global.asHumanCtrlVehicle = Argv[ ++i ]; Global.asHumanCtrlVehicle = ToLower( Argv[ ++i ] );
} }
} }
else { else {

View File

@@ -21,6 +21,20 @@ namespace audio {
openal_renderer renderer; openal_renderer renderer;
float const EU07_SOUND_CUTOFFRANGE { 3000.f }; // 2750 m = max expected emitter spawn range, plus safety margin float const EU07_SOUND_CUTOFFRANGE { 3000.f }; // 2750 m = max expected emitter spawn range, plus safety margin
float const EU07_SOUND_VELOCITYLIMIT { 250 / 3.6f }; // 343 m/sec ~= speed of sound; arbitrary limit of 250 km/h
// potentially clamps length of provided vector to 343 meters
// TBD: make a generic method for utilities out of this
glm::vec3
limit_velocity( glm::vec3 const &Velocity ) {
auto const ratio { glm::length( Velocity ) / EU07_SOUND_VELOCITYLIMIT };
return (
ratio > 1.f ?
Velocity / ratio :
Velocity );
}
// starts playback of queued buffers // starts playback of queued buffers
void void
@@ -97,7 +111,7 @@ openal_source::sync_with( sound_properties const &State ) {
&& ( sound_range >= 0 ) && ( sound_range >= 0 )
&& ( properties.location != glm::dvec3() ) ) { && ( properties.location != glm::dvec3() ) ) {
// after sound position was initialized we can start velocity calculations // after sound position was initialized we can start velocity calculations
sound_velocity = ( State.location - properties.location ) / update_deltatime; sound_velocity = limit_velocity( ( State.location - properties.location ) / update_deltatime );
} }
// NOTE: velocity at this point can be either listener velocity for global sounds, actual sound velocity, or 0 if sound position is yet unknown // NOTE: velocity at this point can be either listener velocity for global sounds, actual sound velocity, or 0 if sound position is yet unknown
::alSourcefv( id, AL_VELOCITY, glm::value_ptr( sound_velocity ) ); ::alSourcefv( id, AL_VELOCITY, glm::value_ptr( sound_velocity ) );
@@ -311,7 +325,7 @@ openal_renderer::update( double const Deltatime ) {
m_listenerposition = listenerposition; m_listenerposition = listenerposition;
m_listenervelocity = ( m_listenervelocity = (
glm::length( listenermovement ) < 1000.0 ? // large jumps are typically camera changes glm::length( listenermovement ) < 1000.0 ? // large jumps are typically camera changes
listenermovement / Deltatime : limit_velocity( listenermovement / Deltatime ) :
glm::vec3() ); glm::vec3() );
::alListenerfv( AL_VELOCITY, reinterpret_cast<ALfloat const *>( glm::value_ptr( m_listenervelocity ) ) ); ::alListenerfv( AL_VELOCITY, reinterpret_cast<ALfloat const *>( glm::value_ptr( m_listenervelocity ) ) );
} }

View File

@@ -69,14 +69,14 @@ private:
// members // members
commandsetup_sequence m_commands; commandsetup_sequence m_commands;
user_command m_command; // last, if any, issued command user_command m_command { user_command::none }; // last, if any, issued command
usercommand_map m_bindings; usercommand_map m_bindings;
command_relay m_relay; command_relay m_relay;
bool m_shift{ false }; bool m_shift { false };
bool m_ctrl{ false }; bool m_ctrl { false };
bindings_cache m_bindingscache; bindings_cache m_bindingscache;
glm::vec2 m_movementhorizontal; glm::vec2 m_movementhorizontal { 0.f };
float m_movementvertical; float m_movementvertical { 0.f };
std::array<char, GLFW_KEY_LAST + 1> m_keys; std::array<char, GLFW_KEY_LAST + 1> m_keys;
}; };

View File

@@ -200,7 +200,7 @@ WyslijObsadzone()
r.fPar[ 16 * i + 4 ] = vehicle->GetPosition().x; r.fPar[ 16 * i + 4 ] = vehicle->GetPosition().x;
r.fPar[ 16 * i + 5 ] = vehicle->GetPosition().y; r.fPar[ 16 * i + 5 ] = vehicle->GetPosition().y;
r.fPar[ 16 * i + 6 ] = vehicle->GetPosition().z; r.fPar[ 16 * i + 6 ] = vehicle->GetPosition().z;
r.iPar[ 16 * i + 7 ] = vehicle->Mechanik->GetAction(); r.iPar[ 16 * i + 7 ] = static_cast<int>( vehicle->Mechanik->GetAction() );
strcpy( r.cString + 64 * i + 32, vehicle->GetTrack()->IsolatedName().c_str() ); strcpy( r.cString + 64 * i + 32, vehicle->GetTrack()->IsolatedName().c_str() );
strcpy( r.cString + 64 * i + 48, vehicle->Mechanik->TrainName().c_str() ); strcpy( r.cString + 64 * i + 48, vehicle->Mechanik->TrainName().c_str() );
i++; i++;

View File

@@ -51,7 +51,7 @@ struct stream_units {
std::vector<GLint> texture { GL_TEXTURE0 }; // unit associated with main texture data stream. TODO: allow multiple units per stream std::vector<GLint> texture { GL_TEXTURE0 }; // unit associated with main texture data stream. TODO: allow multiple units per stream
}; };
typedef std::vector<basic_vertex> vertex_array; using vertex_array = std::vector<basic_vertex>;
// generic geometry bank class, allows storage, update and drawing of geometry chunks // generic geometry bank class, allows storage, update and drawing of geometry chunks
@@ -130,7 +130,7 @@ protected:
} }
}; };
typedef std::vector<geometry_chunk> geometrychunk_sequence; using geometrychunk_sequence = std::vector<geometry_chunk>;
// methods // methods
inline inline
@@ -182,21 +182,21 @@ private:
bool is_good{ false }; // true if local content of the chunk matches the data on the opengl end bool is_good{ false }; // true if local content of the chunk matches the data on the opengl end
}; };
typedef std::vector<chunk_record> chunkrecord_sequence; using chunkrecord_sequence = std::vector<chunk_record>;
// methods: // methods:
// create() subclass details // create() subclass details
void void
create_( gfx::geometry_handle const &Geometry ); create_( gfx::geometry_handle const &Geometry ) override;
// replace() subclass details // replace() subclass details
void void
replace_( gfx::geometry_handle const &Geometry ); replace_( gfx::geometry_handle const &Geometry ) override;
// draw() subclass details // draw() subclass details
void void
draw_( gfx::geometry_handle const &Geometry, gfx::stream_units const &Units, unsigned int const Streams ); draw_( gfx::geometry_handle const &Geometry, gfx::stream_units const &Units, unsigned int const Streams ) override;
// release() subclass details // release() subclass details
void void
release_(); release_() override;
void void
bind_buffer(); bind_buffer();
void void
@@ -237,21 +237,21 @@ private:
unsigned int streams { 0 }; // stream combination used to generate the display list unsigned int streams { 0 }; // stream combination used to generate the display list
}; };
typedef std::vector<chunk_record> chunkrecord_sequence; using chunkrecord_sequence = std::vector<chunk_record>;
// methods: // methods:
// create() subclass details // create() subclass details
void void
create_( gfx::geometry_handle const &Geometry ); create_( gfx::geometry_handle const &Geometry ) override;
// replace() subclass details // replace() subclass details
void void
replace_( gfx::geometry_handle const &Geometry ); replace_( gfx::geometry_handle const &Geometry ) override;
// draw() subclass details // draw() subclass details
void void
draw_( gfx::geometry_handle const &Geometry, gfx::stream_units const &Units, unsigned int const Streams ); draw_( gfx::geometry_handle const &Geometry, gfx::stream_units const &Units, unsigned int const Streams ) override;
// release () subclass details // release () subclass details
void void
release_(); release_() override;
void void
delete_list( gfx::geometry_handle const &Geometry ); delete_list( gfx::geometry_handle const &Geometry );
@@ -262,7 +262,7 @@ private:
// geometry bank manager, holds collection of geometry banks // geometry bank manager, holds collection of geometry banks
typedef geometry_handle geometrybank_handle; using geometrybank_handle = geometry_handle;
class geometrybank_manager { class geometrybank_manager {
@@ -302,11 +302,8 @@ public:
private: private:
// types: // types:
typedef std::pair< using geometrybanktimepoint_pair = std::pair< std::shared_ptr<geometry_bank>, resource_timestamp >;
std::shared_ptr<geometry_bank>, using geometrybanktimepointpair_sequence = std::deque< geometrybanktimepoint_pair >;
resource_timestamp > geometrybanktimepoint_pair;
typedef std::deque< geometrybanktimepoint_pair > geometrybanktimepointpair_sequence;
// members: // members:
geometrybanktimepointpair_sequence m_geometrybanks; geometrybanktimepointpair_sequence m_geometrybanks;

View File

@@ -2350,7 +2350,7 @@ opengl_renderer::Render( TSubModel *Submodel ) {
::glPushMatrix(); ::glPushMatrix();
if( Submodel->fMatrix ) if( Submodel->fMatrix )
::glMultMatrixf( Submodel->fMatrix->readArray() ); ::glMultMatrixf( Submodel->fMatrix->readArray() );
if( Submodel->b_Anim ) if( Submodel->b_Anim != TAnimType::at_None )
Submodel->RaAnimation( Submodel->b_Anim ); Submodel->RaAnimation( Submodel->b_Anim );
} }
@@ -3169,7 +3169,7 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel ) {
::glPushMatrix(); ::glPushMatrix();
if( Submodel->fMatrix ) if( Submodel->fMatrix )
::glMultMatrixf( Submodel->fMatrix->readArray() ); ::glMultMatrixf( Submodel->fMatrix->readArray() );
if( Submodel->b_aAnim ) if( Submodel->b_aAnim != TAnimType::at_None )
Submodel->RaAnimation( Submodel->b_aAnim ); Submodel->RaAnimation( Submodel->b_aAnim );
} }

View File

@@ -95,7 +95,7 @@ uart_input::recall_bindings() {
auto const bindingtype { typelookup->second }; auto const bindingtype { typelookup->second };
std::array<user_command, 2> bindingcommands { user_command::none, user_command::none }; std::array<user_command, 2> bindingcommands { user_command::none, user_command::none };
auto const commandcount { ( bindingtype == toggle ? 2 : 1 ) }; auto const commandcount { ( bindingtype == input_type_t::toggle ? 2 : 1 ) };
for( int commandidx = 0; commandidx < commandcount; ++commandidx ) { for( int commandidx = 0; commandidx < commandcount; ++commandidx ) {
// grab command(s) associated with the input pin // grab command(s) associated with the input pin
auto const bindingcommandname { entryparser.getToken<std::string>() }; auto const bindingcommandname { entryparser.getToken<std::string>() };
@@ -166,14 +166,14 @@ void uart_input::poll()
auto const type { std::get<input_type_t>( entry ) }; auto const type { std::get<input_type_t>( entry ) };
auto const action { ( auto const action { (
type != impulse ? type != input_type_t::impulse ?
GLFW_PRESS : GLFW_PRESS :
( true == state ? ( true == state ?
GLFW_PRESS : GLFW_PRESS :
GLFW_RELEASE ) ) }; GLFW_RELEASE ) ) };
auto const command { ( auto const command { (
type != toggle ? type != input_type_t::toggle ?
std::get<2>( entry ) : std::get<2>( entry ) :
( true == state ? ( true == state ?
std::get<2>( entry ) : std::get<2>( entry ) :

2
uart.h
View File

@@ -48,7 +48,7 @@ public:
private: private:
// types // types
enum input_type_t enum class input_type_t
{ {
toggle, // two commands, each mapped to one state; press event on state change toggle, // two commands, each mapped to one state; press event on state change
impulse, // one command; press event when set, release when cleared impulse, // one command; press event when set, release when cleared

View File

@@ -276,7 +276,7 @@ ui_layer::update() {
else if( mover->ActiveDir < 0 ) { uitextline2 += " R"; } else if( mover->ActiveDir < 0 ) { uitextline2 += " R"; }
else { uitextline2 += " N"; } else { uitextline2 += " N"; }
uitextline3 = "Brakes:" + to_string( mover->fBrakeCtrlPos, 1, 5 ) + "+" + std::to_string( mover->LocalBrakePos ) + ( mover->SlippingWheels ? " !" : " " ); uitextline3 = "Brakes:" + to_string( mover->fBrakeCtrlPos, 1, 5 ) + "+" + to_string( mover->LocalBrakePosA * LocalBrakePosNo, 0 ) + ( mover->SlippingWheels ? " !" : " " );
uitextline4 = ( uitextline4 = (
true == TestFlag( mover->SecuritySystem.Status, s_aware ) ? true == TestFlag( mover->SecuritySystem.Status, s_aware ) ?
@@ -472,7 +472,7 @@ ui_layer::update() {
uitextline2 += ( vehicle->MoverParameters->OilPump.is_active ? "O" : ( vehicle->MoverParameters->OilPump.is_enabled ? "o" : "." ) ); uitextline2 += ( vehicle->MoverParameters->OilPump.is_active ? "O" : ( vehicle->MoverParameters->OilPump.is_enabled ? "o" : "." ) );
uitextline2 += ( false == vehicle->MoverParameters->ConverterAllowLocal ? "-" : ( vehicle->MoverParameters->ConverterAllow ? ( vehicle->MoverParameters->ConverterFlag ? "X" : "x" ) : "." ) ); uitextline2 += ( false == vehicle->MoverParameters->ConverterAllowLocal ? "-" : ( vehicle->MoverParameters->ConverterAllow ? ( vehicle->MoverParameters->ConverterFlag ? "X" : "x" ) : "." ) );
uitextline2 += ( vehicle->MoverParameters->ConvOvldFlag ? "!" : "." ); uitextline2 += ( vehicle->MoverParameters->ConvOvldFlag ? "!" : "." );
uitextline2 += ( vehicle->MoverParameters->CompressorFlag ? "C" : ( false == vehicle->MoverParameters->CompressorAllowLocal ? "-" : ( ( vehicle->MoverParameters->CompressorAllow || vehicle->MoverParameters->CompressorStart == start::automatic ) ? "c" : "." ) ) ); uitextline2 += ( vehicle->MoverParameters->CompressorFlag ? "C" : ( false == vehicle->MoverParameters->CompressorAllowLocal ? "-" : ( ( vehicle->MoverParameters->CompressorAllow || vehicle->MoverParameters->CompressorStart == start_t::automatic ) ? "c" : "." ) ) );
uitextline2 += ( vehicle->MoverParameters->CompressorGovernorLock ? "!" : "." ); uitextline2 += ( vehicle->MoverParameters->CompressorGovernorLock ? "!" : "." );
auto const train { Global.pWorld->train() }; auto const train { Global.pWorld->train() };
@@ -876,9 +876,9 @@ ui_layer::update() {
uitextline2 = uitextline2 =
"HamZ=" + to_string( vehicle->MoverParameters->fBrakeCtrlPos, 2 ) "HamZ=" + to_string( vehicle->MoverParameters->fBrakeCtrlPos, 2 )
+ "; HamP=" + std::to_string( vehicle->MoverParameters->LocalBrakePos ) + "/" + to_string( vehicle->MoverParameters->LocalBrakePosA, 2 ) + "; HamP=" + to_string( vehicle->MoverParameters->LocalBrakePosA, 2 )
+ "; NasJ=" + std::to_string( vehicle->MoverParameters->MainCtrlPos ) + "(" + std::to_string( vehicle->MoverParameters->MainCtrlActualPos ) + ")" + "; NasJ=" + std::to_string( vehicle->MoverParameters->MainCtrlPos ) + "(" + std::to_string( vehicle->MoverParameters->MainCtrlActualPos ) + ")"
+ ( ( vehicle->MoverParameters->ShuntMode && vehicle->MoverParameters->EngineType == DieselElectric ) ? + ( ( vehicle->MoverParameters->ShuntMode && vehicle->MoverParameters->EngineType == TEngineType::DieselElectric ) ?
"; NasB=" + to_string( vehicle->MoverParameters->AnPos, 2 ) : "; NasB=" + to_string( vehicle->MoverParameters->AnPos, 2 ) :
"; NasB=" + std::to_string( vehicle->MoverParameters->ScndCtrlPos ) + "(" + std::to_string( vehicle->MoverParameters->ScndCtrlActualPos ) + ")" ) "; NasB=" + std::to_string( vehicle->MoverParameters->ScndCtrlPos ) + "(" + std::to_string( vehicle->MoverParameters->ScndCtrlActualPos ) + ")" )
+ "; I=" + + "; I=" +
@@ -943,7 +943,7 @@ ui_layer::update() {
uitextline3 += " Vtrack " + to_string( vehicle->MoverParameters->RunningTrack.Velmax, 2 ); uitextline3 += " Vtrack " + to_string( vehicle->MoverParameters->RunningTrack.Velmax, 2 );
} }
if( ( vehicle->MoverParameters->EnginePowerSource.SourceType == CurrentCollector ) if( ( vehicle->MoverParameters->EnginePowerSource.SourceType == TPowerSource::CurrentCollector )
|| ( vehicle->MoverParameters->TrainType == dt_EZT ) ) { || ( vehicle->MoverParameters->TrainType == dt_EZT ) ) {
uitextline3 += uitextline3 +=
"; pant. " + to_string( vehicle->MoverParameters->PantPress, 2 ) "; pant. " + to_string( vehicle->MoverParameters->PantPress, 2 )
@@ -971,7 +971,7 @@ ui_layer::update() {
} }
// induction motor data // induction motor data
if( vehicle->MoverParameters->EngineType == ElectricInductionMotor ) { if( vehicle->MoverParameters->EngineType == TEngineType::ElectricInductionMotor ) {
UITable->text_lines.emplace_back( " eimc: eimv: press:", Global.UITextColor ); UITable->text_lines.emplace_back( " eimc: eimv: press:", Global.UITextColor );
for( int i = 0; i <= 20; ++i ) { for( int i = 0; i <= 20; ++i ) {
@@ -994,7 +994,7 @@ ui_layer::update() {
UITable->text_lines.emplace_back( parameters, Global.UITextColor ); UITable->text_lines.emplace_back( parameters, Global.UITextColor );
} }
} }
if (vehicle->MoverParameters->EngineType == DieselEngine) { if (vehicle->MoverParameters->EngineType == TEngineType::DieselEngine) {
std::string parameters = "param value"; std::string parameters = "param value";
UITable->text_lines.emplace_back(parameters, Global.UITextColor); UITable->text_lines.emplace_back(parameters, Global.UITextColor);
parameters = "efill: " + to_string(vehicle->MoverParameters->dizel_fill, 2, 9); parameters = "efill: " + to_string(vehicle->MoverParameters->dizel_fill, 2, 9);

View File

@@ -307,8 +307,6 @@ nearest_segment_point( VecType_ const &Segmentstart, VecType_ const &Segmentend,
return c1 / c2; return c1 / c2;
} }
class cParser; glm::dvec3 LoadPoint( class cParser &Input );
glm::dvec3 LoadPoint( cParser &Input );
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------