diff --git a/Driver.cpp b/Driver.cpp index c355bdc4..9797d740 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -1532,7 +1532,7 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche, // próg opóźnienia dla zadziałania hamulca fAccThreshold = ( mvOccupied->TrainType == dt_EZT ? -0.6 : - mvOccupied->TrainType == dt_DMU ? -0.4 : + mvOccupied->TrainType == dt_DMU ? -0.45 : -0.2 ); } // TrainParams=NewTrainParams; @@ -1552,8 +1552,12 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche, TableClear(); if( WriteLogFlag ) { - _mkdir( "physicslog\\" ); - LogFile.open( std::string( "physicslog\\" + VehicleName + ".dat" ), +#ifdef _WIN32 + _mkdir( "physicslog" ); +#elif __linux__ + mkdir( "physicslog", 0644 ); +#endif + LogFile.open( std::string( "physicslog/" + VehicleName + ".dat" ), std::ios::in | std::ios::out | std::ios::trunc ); #if LOGPRESS == 0 LogFile << std::string( " Time [s] Velocity [m/s] Acceleration [m/ss] Coupler.Dist[m] " @@ -1829,7 +1833,7 @@ void TController::AutoRewident() fBrakeReaction = 0.25; } else if( mvOccupied->TrainType == dt_DMU ) { - fAccThreshold = std::max( -fBrake_a0[ BrakeAccTableSize ] - 8 * fBrake_a1[ BrakeAccTableSize ], /*-0.7*/ -0.4 ); + fAccThreshold = std::max( -fBrake_a0[ BrakeAccTableSize ] - 8 * fBrake_a1[ BrakeAccTableSize ], -0.45 ); fBrakeReaction = 0.25; } else if (ustaw > 16) @@ -4565,7 +4569,7 @@ TController::UpdateSituation(double dt) { TDynamicObject *d = pVehicles[0]; // pojazd na czele składu while (d) { - AbsAccS += d->MoverParameters->TotalMass * d->MoverParameters->AccS * iDirection; + AbsAccS += d->MoverParameters->TotalMass * d->MoverParameters->AccS * d->DirectionGet() * iDirection; d = d->Next(); // kolejny pojazd, podłączony od tyłu (licząc od czoła) } AbsAccS /= fMass; diff --git a/DynObj.cpp b/DynObj.cpp index 439a6bfc..6497c8fd 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -3047,10 +3047,11 @@ bool TDynamicObject::Update(double dt, double dt1) double k; // tymczasowy kąt double PantDiff; TAnimPant *p; // wskaźnik do obiektu danych pantografu - double fCurrent = (MoverParameters->DynamicBrakeFlag && MoverParameters->ResistorsFlag ? - 0 : - MoverParameters->Itot) + - MoverParameters->TotalCurrent; // prąd pobierany przez pojazd - bez + double fCurrent = ( + ( MoverParameters->DynamicBrakeFlag && MoverParameters->ResistorsFlag ) ? + 0 : + MoverParameters->Itot ) + + MoverParameters->TotalCurrent; // prąd pobierany przez pojazd - bez // sensu z tym (TotalCurrent) // TotalCurrent to bedzie prad nietrakcyjny (niezwiazany z napedem) // fCurrent+=fabs(MoverParameters->Voltage)*1e-6; //prąd płynący przez @@ -3099,10 +3100,13 @@ bool TDynamicObject::Update(double dt, double dt1) && ( PantDiff < 0.01 ) ) // tolerancja niedolegania { if (p->hvPowerWire) { - auto const wirevoltage { p->hvPowerWire->VoltageGet( MoverParameters->Voltage, fPantCurrent ) }; + auto const lastvoltage { MoverParameters->PantFrontVolt }; + // TODO: wyliczyć trzeba prąd przypadający na pantograf i wstawić do GetVoltage() + MoverParameters->PantFrontVolt = p->hvPowerWire->VoltageGet( MoverParameters->Voltage, fPantCurrent ); + fCurrent -= fPantCurrent; // taki prąd płynie przez powyższy pantograf // TODO: refactor reaction to voltage change to mover as sound event for specific pantograph - if( ( MoverParameters->PantFrontVolt == 0.0 ) - && ( wirevoltage > 0.0 ) ) { + if( ( lastvoltage == 0.0 ) + && ( MoverParameters->PantFrontVolt > 0.0 ) ) { for( auto &pantograph : m_pantographsounds ) { if( pantograph.sPantUp.offset().z > 0 ) { // limit to pantographs located in the front half of the vehicle @@ -3110,9 +3114,6 @@ bool TDynamicObject::Update(double dt, double dt1) } } } - // TODO: wyliczyć trzeba prąd przypadający na pantograf i wstawić do GetVoltage() - MoverParameters->PantFrontVolt = wirevoltage; - fCurrent -= fPantCurrent; // taki prąd płynie przez powyższy pantograf } else MoverParameters->PantFrontVolt = 0.0; @@ -3133,10 +3134,13 @@ bool TDynamicObject::Update(double dt, double dt1) && ( PantDiff < 0.01 ) ) { if (p->hvPowerWire) { - auto const wirevoltage { p->hvPowerWire->VoltageGet( MoverParameters->Voltage, fPantCurrent ) }; + auto const lastvoltage { MoverParameters->PantRearVolt }; + // TODO: wyliczyć trzeba prąd przypadający na pantograf i wstawić do GetVoltage() + MoverParameters->PantRearVolt = p->hvPowerWire->VoltageGet( MoverParameters->Voltage, fPantCurrent ); + fCurrent -= fPantCurrent; // taki prąd płynie przez powyższy pantograf // TODO: refactor reaction to voltage change to mover as sound event for specific pantograph - if( ( MoverParameters->PantRearVolt == 0.0 ) - && ( wirevoltage > 0.0 ) ) { + if( ( lastvoltage == 0.0 ) + && ( MoverParameters->PantRearVolt > 0.0 ) ) { for( auto &pantograph : m_pantographsounds ) { if( pantograph.sPantUp.offset().z < 0 ) { // limit to pantographs located in the rear half of the vehicle @@ -3144,9 +3148,6 @@ bool TDynamicObject::Update(double dt, double dt1) } } } - // TODO: wyliczyć trzeba prąd przypadający na pantograf i wstawić do GetVoltage() - MoverParameters->PantRearVolt = p->hvPowerWire->VoltageGet( MoverParameters->Voltage, fPantCurrent ); - fCurrent -= fPantCurrent; // taki prąd płynie przez powyższy pantograf } else MoverParameters->PantRearVolt = 0.0; @@ -3180,26 +3181,21 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->PantFrontUp ) )// jeśli ma być podniesiony { if (PantDiff > 0.001) // jeśli nie dolega do drutu - { // jeśli poprzednia wysokość jest mniejsza niż pożądana, zwiększyć kąt - // dolnego + { // jeśli poprzednia wysokość jest mniejsza niż pożądana, zwiększyć kąt dolnego // ramienia zgodnie z ciśnieniem if (pantspeedfactor > 0.55 * PantDiff) // 0.55 to około pochodna kąta po wysokości k += 0.55 * PantDiff; // ograniczenie "skoku" w danej klatce else k += pantspeedfactor; // dolne ramię - // jeśli przekroczono kąt graniczny, zablokować pantograf (wymaga - // interwencji - // pociągu sieciowego) + // jeśli przekroczono kąt graniczny, zablokować pantograf + // (wymaga interwencji pociągu sieciowego) } - else if (PantDiff < -0.001) - { // drut się obniżył albo pantograf - // podniesiony za wysoko + else if (PantDiff < -0.001) { + // drut się obniżył albo pantograf podniesiony za wysoko // jeśli wysokość jest zbyt duża, wyznaczyć zmniejszenie kąta - // jeśli zmniejszenie kąta jest zbyt duże, przejść do trybu łamania - // pantografu - // if (PantFrontDiff<-0.05) //skok w dół o 5cm daje złąmanie - // pantografu + // jeśli zmniejszenie kąta jest zbyt duże, przejść do trybu łamania pantografu + // if (PantFrontDiff<-0.05) //skok w dół o 5cm daje złąmanie pantografu k += 0.4 * PantDiff; // mniej niż pochodna kąta po wysokości } // jeśli wysokość jest dobra, nic więcej nie liczyć } diff --git a/Model3d.cpp b/Model3d.cpp index 047cd899..f060d911 100644 --- a/Model3d.cpp +++ b/Model3d.cpp @@ -517,7 +517,7 @@ int TSubModel::Load( cParser &parser, TModel3d *Model, /*int Pos,*/ bool dynamic } // Ra 15-01: należało by jeszcze uwzględnić skalowanie wprowadzane przez transformy, aby normalne po przeskalowaniu były jednostkowe if( glm::length2( vertexnormal ) == 0.0f ) { - WriteLog( "Bad model: zero lenght normal vector generated for sub-model \"" + pName + "\"", logtype::model ); + WriteLog( "Bad model: zero length normal vector generated for sub-model \"" + pName + "\"", logtype::model ); } Vertices[ vertexidx ].normal = ( glm::length2( vertexnormal ) > 0.0f ? diff --git a/World.cpp b/World.cpp index 0f869be7..3c97d687 100644 --- a/World.cpp +++ b/World.cpp @@ -362,6 +362,7 @@ void TWorld::OnKeyDown(int cKey) { case GLFW_KEY_F10: { keyinfo += "F10"; break; } case GLFW_KEY_F11: { keyinfo += "F11"; break; } case GLFW_KEY_F12: { keyinfo += "F12"; break; } + case GLFW_KEY_PAUSE: { keyinfo += "Pause"; break; } } } if( keyinfo.empty() == false ) {