diff --git a/Classes.h b/Classes.h index 5bafa69d..b8967103 100644 --- a/Classes.h +++ b/Classes.h @@ -36,9 +36,6 @@ class TMtableTime; // czas dla danego posterunku }; class TController; // obiekt sterujący pociągiem (AI) -#ifdef EU07_USE_OLD_TNAMES_CLASS -class TNames; // obiekt sortujący nazwy -#endif typedef enum { // binarne odpowiedniki komend w komórce pamięci diff --git a/Driver.cpp b/Driver.cpp index e7f95040..f30d5268 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -87,7 +87,7 @@ const double HardAcceleration = 0.9; const double PrepareTime = 2.0; //[s] przebłyski świadomości przy odpalaniu bool WriteLogFlag = false; -string StopReasonTable[] = { +std::string StopReasonTable[] = { // przyczyny zatrzymania ruchu AI "", // stopNone, //nie ma powodu - powinien jechać "Off", // stopSleep, //nie został odpalony, to nie pojedzie @@ -240,23 +240,15 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) // głównej drogi - chyba że jest równorzędne... fVelNext = 30.0; // uzależnić prędkość od promienia; albo niech będzie // ograniczona w skrzyżowaniu (velocity z ujemną wartością) - if ((iFlags & spElapsed) == 0) // jeśli nie wjechał -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - if (trTrack->iNumDynamics > 0) // a skrzyżowanie zawiera pojazd - { - if (Global::iWriteLogEnabled & 8) - WriteLog("Tor " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + std::to_string(trTrack->iNumDynamics) + "Dist= " + std::to_string(fDist)); - fVelNext = - 0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto) - } -#else + if( ( iFlags & spElapsed ) == 0 ) { + // jeśli nie wjechał if( false == trTrack->Dynamics.empty() ) { if( Global::iWriteLogEnabled & 8 ) { WriteLog( "Tor " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + std::to_string( trTrack->Dynamics.size() ) + "Dist= " + std::to_string( fDist ) ); fVelNext = 0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto) } } -#endif + } } if (iFlags & spSwitch) // jeśli odcinek zmienny { @@ -271,19 +263,6 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) // na Mydelniczce potrafi skanować na wprost mimo pojechania na bok } // poniższe nie dotyczy trybu łączenia? -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - if ((iFlags & spElapsed) ? false : - trTrack->iNumDynamics > - 0) // jeśli jeszcze nie wjechano na tor, a coś na nim jest - { - if (Global::iWriteLogEnabled & 8) - WriteLog("Rozjazd " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + std::to_string(trTrack->iNumDynamics) + "Dist= "+std::to_string(fDist)); - //fDist -= 30.0; - fVelNext = 0.0; // to niech stanie w zwiększonej odległości - // else if (fVelNext==0.0) //jeśli została wyzerowana - // fVelNext=trTrack->VelocityGet(); //odczyt prędkości - } -#else if( ( ( iFlags & spElapsed ) == 0 ) && ( false == trTrack->Dynamics.empty() ) ) { // jeśli jeszcze nie wjechano na tor, a coś na nim jest @@ -292,7 +271,6 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) } fVelNext = 0.0; // to niech stanie w zwiększonej odległości } -#endif } } } @@ -1504,10 +1482,10 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche, if( WriteLogFlag ) { mkdir( "physicslog\\" ); - LogFile.open( string( "physicslog\\" + VehicleName + ".dat" ).c_str(), + LogFile.open( std::string( "physicslog\\" + VehicleName + ".dat" ).c_str(), std::ios::in | std::ios::out | std::ios::trunc ); #if LOGPRESS == 0 - LogFile << string( " Time [s] Velocity [m/s] Acceleration [m/ss] Coupler.Dist[m] " + LogFile << std::string( " Time [s] Velocity [m/s] Acceleration [m/ss] Coupler.Dist[m] " "Coupler.Force[N] TractionForce [kN] FrictionForce [kN] " "BrakeForce [kN] BrakePress [MPa] PipePress [MPa] " "MotorCurrent [A] MCP SCP BCP LBP DmgFlag Command CVal1 CVal2" ) @@ -1698,7 +1676,7 @@ void TController::AutoRewident() ustaw = 16 + bdelay_R; // lokomotywa luzem (może być wieloczłonowa) else { // jeśli są wagony - ustaw = (g < min(4, r + p) ? 16 : 0); + ustaw = (g < std::min(4, r + p) ? 16 : 0); if (ustaw) // jeśli towarowe < Min(4, pospieszne+osobowe) { // to skład pasażerski - nastawianie pasażerskiego ustaw += (g && (r < g + p)) ? bdelay_P : bdelay_R; @@ -4927,7 +4905,7 @@ void TController::OrdersInit(double fVel) // Ale mozna by je zapodac ze scenerii }; -string TController::StopReasonText() +std::string TController::StopReasonText() { // informacja tekstowa o przyczynie zatrzymania if (eStopReason != 7) // zawalidroga będzie inaczej return StopReasonTable[eStopReason]; @@ -4952,15 +4930,6 @@ double TController::Distance(vector3 &p1,vector3 &n,vector3 &p2) bool TController::BackwardTrackBusy(TTrack *Track) { // najpierw sprawdzamy, czy na danym torze są pojazdy z innego składu -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - if (Track->iNumDynamics) - { // jeśli tylko z własnego składu, to tor jest wolny - for (int i = 0; i < Track->iNumDynamics; ++i) - if (Track->Dynamics[i]->ctOwner != this) // jeśli jest jakiś cudzy - return true; // to tor jest zajęty i skanowanie nie obowiązuje - } - return false; // wolny -#else if( false == Track->Dynamics.empty() ) { for( auto dynamic : Track->Dynamics ) { if( dynamic->ctOwner != this ) { @@ -4970,7 +4939,6 @@ bool TController::BackwardTrackBusy(TTrack *Track) } } return false; // wolny -#endif }; TEvent * TController::CheckTrackEventBackward(double fDirection, TTrack *Track) @@ -5435,5 +5403,5 @@ void TController::RouteSwitch(int d) }; std::string TController::OwnerName() { - return pVehicle ? pVehicle->MoverParameters->Name : string("none"); + return ( pVehicle ? pVehicle->MoverParameters->Name : "none" ); }; diff --git a/DynObj.cpp b/DynObj.cpp index e31f1d55..78d5b437 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -950,69 +950,15 @@ double ABuAcos(const vector3 &calc_temp) return atan2(-calc_temp.x, calc_temp.z); // Ra: tak prościej } -TDynamicObject * TDynamicObject::ABuFindNearestObject(TTrack *Track, - TDynamicObject *MyPointer, - int &CouplNr) -{ // zwraca wskaznik do obiektu znajdujacego sie na torze - // (Track), którego sprzęg jest najblizszy - // kamerze +TDynamicObject * TDynamicObject::ABuFindNearestObject(TTrack *Track, TDynamicObject *MyPointer, int &CouplNr) +{ + // zwraca wskaznik do obiektu znajdujacego sie na torze (Track), którego sprzęg jest najblizszy kamerze // służy np. do łączenia i rozpinania sprzęgów // WE: Track - tor, na ktorym odbywa sie poszukiwanie // MyPointer - wskaznik do obiektu szukajacego // WY: CouplNr - który sprzęg znalezionego obiektu jest bliższy kamerze // Uwaga! Jesli CouplNr==-2 to szukamy njblizszego obiektu, a nie sprzegu!!! - -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - if ((Track->iNumDynamics) > 0) - { // o ile w ogóle jest co przeglądać na tym torze - // vector3 poz; //pozycja pojazdu XYZ w scenerii - // vector3 kon; //wektor czoła względem środka pojazdu wzglęem początku toru - vector3 tmp; // wektor pomiędzy kamerą i sprzęgiem - double dist; // odległość - for (int i = 0; i < Track->iNumDynamics; i++) - { - if (CouplNr == -2) - { // wektor [kamera-obiekt] - poszukiwanie obiektu - tmp = Global::GetCameraPosition() - Track->Dynamics[i]->vPosition; - dist = tmp.x * tmp.x + tmp.y * tmp.y + tmp.z * tmp.z; // odległość do kwadratu - if (dist < 100.0) // 10 metrów - return Track->Dynamics[i]; - } - else // jeśli (CouplNr) inne niz -2, szukamy sprzęgu - { // wektor [kamera-sprzeg0], potem [kamera-sprzeg1] - // Powinno byc wyliczone, ale nie zaszkodzi drugi raz: - //(bo co, jesli nie wykonuje sie obrotow wozkow?) - Ra: ale zawsze są - // liczone - // współrzędne sprzęgów - // Track->Dynamics[i]->modelRot.z=ABuAcos(Track->Dynamics[i]->Axle0.pPosition-Track->Dynamics[i]->Axle1.pPosition); - // poz=Track->Dynamics[i]->vPosition; //pozycja środka pojazdu - // kon=vector3( //położenie przodu względem środka - // -((0.5*Track->Dynamics[i]->MoverParameters->Dim.L)*sin(Track->Dynamics[i]->modelRot.z)), - // 0, //yyy... jeśli duże pochylenie i długi pojazd, to może być problem - // +((0.5*Track->Dynamics[i]->MoverParameters->Dim.L)*cos(Track->Dynamics[i]->modelRot.z)) - //); - tmp = - Global::GetCameraPosition() - - Track->Dynamics[i]->vCoulpler[0]; // Ra: pozycje sprzęgów też są zawsze liczone - dist = tmp.x * tmp.x + tmp.y * tmp.y + tmp.z * tmp.z; // odległość do kwadratu - if (dist < 25.0) // 5 metrów - { - CouplNr = 0; - return Track->Dynamics[i]; - } - tmp = Global::GetCameraPosition() - Track->Dynamics[i]->vCoulpler[1]; - dist = tmp.x * tmp.x + tmp.y * tmp.y + tmp.z * tmp.z; // odległość do kwadratu - if (dist < 25.0) // 5 metrów - { - CouplNr = 1; - return Track->Dynamics[i]; - } - } - } - return NULL; - } -#else for( auto dynamic : Track->Dynamics ) { if( CouplNr == -2 ) { @@ -1038,7 +984,6 @@ TDynamicObject * TDynamicObject::ABuFindNearestObject(TTrack *Track, } // empty track or nothing found return nullptr; -#endif } TDynamicObject * TDynamicObject::ABuScanNearestObject(TTrack *Track, double ScanDir, @@ -1160,21 +1105,13 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir, // WY: wskaznik do znalezionego obiektu. // CouplFound - nr sprzegu znalezionego obiektu -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - if (Track->iNumDynamics > 0) -#else if( false == Track->Dynamics.empty() ) -#endif { // sens szukania na tym torze jest tylko, gdy są na nim pojazdy double MyTranslation; // pozycja szukającego na torze double MinDist = Track->Length(); // najmniejsza znaleziona odleglość // (zaczynamy od długości toru) double TestDist; // robocza odległość od kolejnych pojazdów na danym odcinku -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - int iMinDist = -1; // indeks wykrytego obiektu -#else TDynamicObject *collider = nullptr; -#endif // if (Track->iNumDynamics>1) // iMinDist+=0; //tymczasowo pułapka if (MyTrack == Track) // gdy szukanie na tym samym torze @@ -1186,54 +1123,6 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir, MyTranslation = MinDist; // szukanie w kierunku Point1 (do zera) - jesteśmy w Point2 if (ScanDir >= 0) { // jeśli szukanie w kierunku Point2 -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - for( int i = 0; i < Track->iNumDynamics; i++ ) - { // pętla po pojazdach - if (Track->Dynamics[i] != this) // szukający się nie liczy - { - TestDist = (Track->Dynamics[i]->RaTranslationGet()) - - MyTranslation; // odległogłość tamtego od szukającego - if ((TestDist > 0) && (TestDist <= MinDist)) - { // gdy jest po właściwej stronie i bliżej - // niż jakiś wcześniejszy - CouplFound = (Track->Dynamics[i]->RaDirectionGet() > 0) ? - 1 : - 0; // to, bo (ScanDir>=0) - if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy - { // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po - // jednej - // szynie i się mija - // Ra: mijanie samochodów wcale nie jest proste - // Przesuniecie wzgledne pojazdow. Wyznaczane, zeby sprawdzic, - // czy pojazdy faktycznie sie zderzaja (moga byc przesuniete - // w/m siebie tak, ze nie zachodza na siebie i wtedy sie mijaja). - double RelOffsetH; // wzajemna odległość poprzeczna - if (CouplFound) // my na tym torze byśmy byli w kierunku Point2 - // dla CouplFound=1 są zwroty zgodne - istotna różnica - // przesunięć - RelOffsetH = (MoverParameters->OffsetTrackH - - Track->Dynamics[i]->MoverParameters->OffsetTrackH); - else - // dla CouplFound=0 są zwroty przeciwne - przesunięcia sumują - // się - RelOffsetH = (MoverParameters->OffsetTrackH + - Track->Dynamics[i]->MoverParameters->OffsetTrackH); - if (RelOffsetH < 0) - RelOffsetH = -RelOffsetH; - if (RelOffsetH + RelOffsetH > - MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W) - continue; // odległość większa od połowy sumy szerokości - - // kolizji - // nie będzie - // jeśli zahaczenie jest niewielkie, a jest miejsce na poboczu, to - // zjechać na pobocze - } - iMinDist = i; // potencjalna kolizja - MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów - } - } - } -#else for( auto dynamic : Track->Dynamics ) { // pętla po pojazdach if( dynamic == this ) { @@ -1277,56 +1166,9 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir, } } -#endif } else //(ScanDir<0) { -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - for( int i = 0; i < Track->iNumDynamics; i++ ) - { - if (Track->Dynamics[i] != this) - { - TestDist = MyTranslation - - (Track->Dynamics[i]->RaTranslationGet()); //???-przesunięcie wózka - // względem Point1 toru - if ((TestDist > 0) && (TestDist < MinDist)) - { - CouplFound = (Track->Dynamics[i]->RaDirectionGet() > 0) ? - 0 : - 1; // odwrotnie, bo (ScanDir<0) - if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy - { // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po - // jednej - // szynie i się mija - // Ra: mijanie samochodów wcale nie jest proste - // Przesunięcie względne pojazdów. Wyznaczane, żeby sprawdzić, - // czy pojazdy faktycznie się zderzają (mogą być przesunięte - // w/m siebie tak, że nie zachodzą na siebie i wtedy sie mijają). - double RelOffsetH; // wzajemna odległość poprzeczna - if (CouplFound) // my na tym torze byśmy byli w kierunku Point1 - // dla CouplFound=1 są zwroty zgodne - istotna różnica - // przesunięć - RelOffsetH = (MoverParameters->OffsetTrackH - - Track->Dynamics[i]->MoverParameters->OffsetTrackH); - else - // dla CouplFound=0 są zwroty przeciwne - przesunięcia sumują - // się - RelOffsetH = (MoverParameters->OffsetTrackH + - Track->Dynamics[i]->MoverParameters->OffsetTrackH); - if (RelOffsetH < 0) - RelOffsetH = -RelOffsetH; - if (RelOffsetH + RelOffsetH > - MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W) - continue; // odległość większa od połowy sumy szerokości - - // kolizji - // nie będzie - } - iMinDist = i; // potencjalna kolizja - MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów - } - } - } -#else for( auto dynamic : Track->Dynamics ) { if( dynamic == this ) { continue; } @@ -1362,14 +1204,9 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir, MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów } } -#endif } dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka do przeskanowanej odległości -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - return ( iMinDist >= 0 ) ? Track->Dynamics[ iMinDist ] : NULL; -#else return collider; -#endif } dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej // odległości diff --git a/EvLaunch.cpp b/EvLaunch.cpp index 2d9a3652..c44cf1be 100644 --- a/EvLaunch.cpp +++ b/EvLaunch.cpp @@ -36,21 +36,13 @@ TEventLauncher::TEventLauncher() DeltaTime = -1; UpdatedTime = 0; fVal1 = fVal2 = 0; -#ifdef EU07_USE_OLD_TEVENTLAUNCHER_TEXT_ARRAY - szText = NULL; -#endif iHour = iMinute = -1; // takiego czasu nigdy nie będzie dRadius = 0; Event1 = Event2 = NULL; MemCell = NULL; iCheckMask = 0; } -#ifdef EU07_USE_OLD_TEVENTLAUNCHER_TEXT_ARRAY -TEventLauncher::~TEventLauncher() -{ - SafeDeleteArray(szText); -} -#endif + void TEventLauncher::Init() { } @@ -126,13 +118,7 @@ bool TEventLauncher::Load(cParser *parser) asMemCellName = token; parser->getTokens(); *parser >> token; -#ifdef EU07_USE_OLD_TEVENTLAUNCHER_TEXT_ARRAY - SafeDeleteArray(szText); - szText = new char[256]; - strcpy(szText, token.c_str()); -#else szText = token; -#endif if (token != "*") //*=nie brać command pod uwagę iCheckMask |= conditional_memstring; parser->getTokens(); diff --git a/EvLaunch.h b/EvLaunch.h index 491c14b3..42ce2c73 100644 --- a/EvLaunch.h +++ b/EvLaunch.h @@ -7,8 +7,7 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef EvLaunchH -#define EvLaunchH +#pragma once #include #include "Classes.h" @@ -21,11 +20,7 @@ class TEventLauncher double UpdatedTime; double fVal1; double fVal2; -#ifdef EU07_USE_OLD_TEVENTLAUNCHER_TEXT_ARRAY - char * szText; -#else std::string szText; -#endif int iHour, iMinute; // minuta uruchomienia public: double dRadius; @@ -37,9 +32,6 @@ class TEventLauncher TMemCell *MemCell; int iCheckMask; TEventLauncher(); -#ifdef EU07_USE_OLD_TEVENTLAUNCHER_TEXT_ARRAY - ~TEventLauncher(); -#endif void Init(); bool Load(cParser *parser); bool Render(); @@ -47,4 +39,3 @@ class TEventLauncher }; //--------------------------------------------------------------------------- -#endif diff --git a/Event.cpp b/Event.cpp index 566c4fd5..c27f9a4a 100644 --- a/Event.cpp +++ b/Event.cpp @@ -70,7 +70,7 @@ void TEvent::Init(){ }; -void TEvent::Conditions(cParser *parser, string s) +void TEvent::Conditions(cParser *parser, std::string s) { // przetwarzanie warunków, wspólne dla Multiple i UpdateValues if (s == "condition") { // jesli nie "endevent" @@ -623,14 +623,14 @@ void TEvent::AddToQuery(TEvent *e) //--------------------------------------------------------------------------- -string TEvent::CommandGet() +std::string TEvent::CommandGet() { // odczytanie komendy z eventu switch (Type) { // to się wykonuje również składu jadącego bez obsługi case tp_GetValues: - return string(Params[9].asMemCell->Text()); + return std::string(Params[9].asMemCell->Text()); case tp_PutValues: - return string(Params[0].asText); + return std::string(Params[0].asText); } return ""; // inne eventy się nie liczą }; diff --git a/Ground.cpp b/Ground.cpp index c7570483..9858d947 100644 --- a/Ground.cpp +++ b/Ground.cpp @@ -47,7 +47,7 @@ extern "C" } bool bCondition; // McZapkie: do testowania warunku na event multiple -string LogComment; +std::string LogComment; //--------------------------------------------------------------------------- // Obiekt renderujący siatkę jest sztucznie tworzonym obiektem pomocniczym, @@ -707,7 +707,7 @@ void TGroundNode::RenderAlphaDL() if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012 { glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.02f); + glAlphaFunc(GL_GREATER, 0.04f); }; #endif } @@ -1430,9 +1430,6 @@ TGround::TGround() for( int i = 0; i < TP_LAST; ++i ) { nRootOfType[ i ] = nullptr; // zerowanie tablic wyszukiwania } -#ifdef EU07_USE_OLD_TNAMES_CLASS - sTracks = new TNames(); // nazwy torów - na razie tak -#endif ::SecureZeroMemory( TempConnectionType, sizeof( TempConnectionType ) ); ::SecureZeroMemory( pRendered, sizeof( pRendered ) ); @@ -1487,9 +1484,6 @@ void TGround::Free() iNumNodes = 0; // RootNode=NULL; nRootDynamic = NULL; -#ifdef EU07_USE_OLD_TNAMES_CLASS - delete sTracks; -#endif } TGroundNode * TGround::DynamicFindAny(std::string asNameToFind) @@ -1522,9 +1516,6 @@ TGroundNode * TGround::FindGroundNode(std::string asNameToFind, TGroundNodeType { // wyszukiwanie obiektu o podanej nazwie i konkretnym typie if ((iNodeType == TP_TRACK) || (iNodeType == TP_MEMCELL) || (iNodeType == TP_MODEL)) { // wyszukiwanie w drzewie binarnym -#ifdef EU07_USE_OLD_TNAMES_CLASS - return (TGroundNode *)sTracks->Find(iNodeType, asNameToFind.c_str()); -#else /* switch( iNodeType ) { @@ -1553,7 +1544,6 @@ TGroundNode * TGround::FindGroundNode(std::string asNameToFind, TGroundNodeType return nullptr; */ return m_trackmap.Find( iNodeType, asNameToFind ); -#endif } // standardowe wyszukiwanie liniowe TGroundNode *Current; @@ -1566,10 +1556,10 @@ TGroundNode * TGround::FindGroundNode(std::string asNameToFind, TGroundNodeType double fTrainSetVel = 0; double fTrainSetDir = 0; double fTrainSetDist = 0; // odległość składu od punktu 1 w stronę punktu 2 -string asTrainSetTrack = ""; +std::string asTrainSetTrack = ""; int iTrainSetConnection = 0; bool bTrainSet = false; -string asTrainName = ""; +std::string asTrainName = ""; int iTrainSetWehicleNumber = 0; TGroundNode *nTrainSetNode = NULL; // poprzedni pojazd do łączenia TGroundNode *nTrainSetDriver = NULL; // pojazd, któremu zostanie wysłany rozkład @@ -1703,7 +1693,7 @@ void TGround::RaTriangleDivider(TGroundNode *node) TGroundNode * TGround::AddGroundNode(cParser *parser) { // wczytanie wpisu typu "node" // parser->LoadTraction=Global::bLoadTraction; //Ra: tu nie potrzeba powtarzać - string str, str1, str2, str3, str4, Skin, DriverType, asNodeName; + std::string str, str1, str2, str3, str4, Skin, DriverType, asNodeName; int nv, i; double tf, r, rmin, tf1, tf3; int int1; @@ -1725,7 +1715,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) //str = AnsiString(token.c_str()); TGroundNode *tmp; tmp = new TGroundNode(); - tmp->asName = (asNodeName == "none" ? string("") : asNodeName); + tmp->asName = (asNodeName == "none" ? "" : asNodeName); if (r >= 0) tmp->fSquareRadius = r * r; tmp->fSquareMinRadius = rmin * rmin; @@ -1876,21 +1866,10 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) tmp->MemCell->Load(parser); if (!tmp->asName.empty()) // jest pusta gdy "none" { // dodanie do wyszukiwarki -#ifdef EU07_USE_OLD_TNAMES_CLASS - if (sTracks->Update(TP_MEMCELL, tmp->asName.c_str(), - tmp)) // najpierw sprawdzić, czy już jest - { // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność - // wsteczna) - ErrorLog("Duplicated memcell: " + tmp->asName); // to zgłaszać duplikat - } - else - sTracks->Add(TP_MEMCELL, tmp->asName.c_str(), tmp); // nazwa jest unikalna -#else if( false == m_trackmap.Add( TP_MEMCELL, tmp->asName, tmp ) ) { // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność wsteczna) ErrorLog( "Duplicated memcell: " + tmp->asName ); // to zgłaszać duplikat } -#endif } break; case TP_EVLAUNCH: @@ -1910,22 +1889,10 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) tmp->asName); // w nazwie może być nazwa odcinka izolowanego if (!tmp->asName.empty()) // jest pusta gdy "none" { // dodanie do wyszukiwarki -#ifdef EU07_USE_OLD_TNAMES_CLASS - if (sTracks->Update(TP_TRACK, tmp->asName.c_str(), - tmp)) // najpierw sprawdzić, czy już jest - { // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność - // wsteczna) - if (tmp->pTrack->iCategoryFlag & 1) // jeśli jest zdublowany tor kolejowy - ErrorLog("Duplicated track: " + tmp->asName); // to zgłaszać duplikat - } - else - sTracks->Add(TP_TRACK, tmp->asName.c_str(), tmp); // nazwa jest unikalna -#else if( false == m_trackmap.Add( TP_TRACK, tmp->asName, tmp ) ) { // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność wsteczna) ErrorLog( "Duplicated track: " + tmp->asName ); // to zgłaszać duplikat } -#endif } tmp->pCenter = (tmp->pTrack->CurrentSegment()->FastGetPoint_0() + tmp->pTrack->CurrentSegment()->FastGetPoint(0.5) + @@ -1969,7 +1936,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) >> str4; tf3 = fTrainSetVel; // prędkość int2 = str4.find("."); // yB: wykorzystuje tutaj zmienna, ktora potem bedzie ladunkiem - if (int2 != string::npos) // yB: jesli znalazl kropke, to ja przetwarza jako parametry + if (int2 != std::string::npos) // yB: jesli znalazl kropke, to ja przetwarza jako parametry { size_t dlugosc = str4.length(); int1 = atoi(str4.substr(0, int2).c_str()); // niech sprzegiem bedzie do kropki cos @@ -2165,21 +2132,10 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) } else if (!tmp->asName.empty()) // jest pusta gdy "none" { // dodanie do wyszukiwarki -#ifdef EU07_USE_OLD_TNAMES_CLASS - if (sTracks->Update(TP_MODEL, tmp->asName.c_str(), - tmp)) // najpierw sprawdzić, czy już jest - { // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność - // wsteczna) - ErrorLog("Duplicated model: " + tmp->asName); // to zgłaszać duplikat - } - else - sTracks->Add(TP_MODEL, tmp->asName.c_str(), tmp); // nazwa jest unikalna -#else if( false == m_trackmap.Add( TP_MODEL, tmp->asName, tmp ) ) { // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność wsteczna) ErrorLog( "Duplicated model: " + tmp->asName ); // to zgłaszać duplikat } -#endif } // str=Parser->GetNextSymbol().LowerCase(); break; @@ -2239,7 +2195,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) // PROBLEND Q: 13122011 - Szociu: 27012012 PROBLEND = true; // domyslnie uruchomione nowe wyświetlanie tmp->PROBLEND = true; // odwolanie do tgroundnode, bo rendering jest w tej klasie - if (str.find('@') != string::npos) // sprawdza, czy w nazwie tekstury jest znak "@" + if (str.find('@') != std::string::npos) // sprawdza, czy w nazwie tekstury jest znak "@" { PROBLEND = false; // jeśli jest, wyswietla po staremu tmp->PROBLEND = false; @@ -2457,17 +2413,13 @@ TSubRect * TGround::GetSubRect(int iCol, int iRow) return (Rects[br][bc].SafeGetRect(sc, sr)); // pobranie małego kwadratu } -TEvent * TGround::FindEvent(const string &asEventName) +TEvent * TGround::FindEvent(const std::string &asEventName) { -#ifdef EU07_USE_OLD_TNAMES_CLASS - return (TEvent *)sTracks->Find(0, asEventName.c_str()); // wyszukiwanie w drzewie -#else auto const lookup = m_eventmap.find( asEventName ); return lookup != m_eventmap.end() ? lookup->second : nullptr; -#endif /* //powolna wyszukiwarka for (TEvent *Current=RootEvent;Current;Current=Current->Next2) { @@ -2478,27 +2430,19 @@ TEvent * TGround::FindEvent(const string &asEventName) */ } -TEvent * TGround::FindEventScan(const string &asEventName) +TEvent * TGround::FindEventScan( std::string const &asEventName ) { // wyszukanie eventu z opcją utworzenia niejawnego dla komórek skanowanych -#ifdef EU07_USE_OLD_TNAMES_CLASS - TEvent *e = (TEvent *)sTracks->Find( 0, asEventName.c_str() ); // wyszukiwanie w drzewie eventów -#else auto const lookup = m_eventmap.find( asEventName ); auto e = lookup != m_eventmap.end() ? lookup->second : nullptr; -#endif if (e) return e; // jak istnieje, to w porządku if (asEventName.rfind(":scan") != std::string::npos) // jeszcze może być event niejawny { // no to szukamy komórki pamięci o nazwie zawartej w evencie - string n = asEventName.substr(0, asEventName.length() - 5); // do dwukropka -#ifdef EU07_USE_OLD_TNAMES_CLASS - if( sTracks->Find( TP_MEMCELL, n.c_str() ) ) // jeśli jest takowa komórka pamięci -#else + std::string n = asEventName.substr(0, asEventName.length() - 5); // do dwukropka if( m_trackmap.Find( TP_MEMCELL, n ) != nullptr ) // jeśli jest takowa komórka pamięci -#endif e = new TEvent(n); // utworzenie niejawnego eventu jej odczytu } return e; // utworzony albo się nie udało @@ -2582,7 +2526,7 @@ bool TGround::Init(std::string File) Global::pGround = this; // pTrain=NULL; pOrigin = aRotate = vector3(0, 0, 0); // zerowanie przesunięcia i obrotu - string str = ""; + std::string str; // TFileStream *fs; // int size; std::string subpath = Global::asCurrentSceneryPath; // "scenery/"; @@ -2792,13 +2736,9 @@ bool TGround::Init(std::string File) // pierwszy if (RootEvent->Type != tp_Ignored) if (RootEvent->asName.find( - "onstart") != string::npos) // event uruchamiany automatycznie po starcie + "onstart") != std::string::npos) // event uruchamiany automatycznie po starcie AddToQuery(RootEvent, NULL); // dodanie do kolejki -#ifdef EU07_USE_OLD_TNAMES_CLASS - sTracks->Add(0, tmp->asName.c_str(), tmp); // dodanie do wyszukiwarki -#else m_eventmap.emplace( tmp->asName, tmp ); // dodanie do wyszukiwarki -#endif } } } @@ -3035,7 +2975,7 @@ bool TGround::Init(std::string File) WriteLog("Scenery sky definition"); parser.getTokens(); parser >> token; - string SkyTemp = token; + std::string SkyTemp = token; if (Global::asSky == "1") Global::asSky = SkyTemp; do @@ -3096,12 +3036,6 @@ bool TGround::Init(std::string File) parser >> token; } -#ifdef EU07_USE_OLD_TNAMES_CLASS - sTracks->Sort(TP_TRACK); // finalne sortowanie drzewa torów - sTracks->Sort(TP_MEMCELL); // finalne sortowanie drzewa komórek pamięci - sTracks->Sort(TP_MODEL); // finalne sortowanie drzewa modeli - sTracks->Sort(0); // finalne sortowanie drzewa eventów -#endif if (!bInitDone) FirstInit(); // jeśli nie było w scenerii if (Global::pTerrainCompact) @@ -3345,24 +3279,19 @@ bool TGround::InitEvents() Current->Params[9].asTrack = tmp->pTrack; if (!Current->Params[9].asTrack) { - ErrorLog("Bad event: Track \"" + string(buff) + - "\" does not exist in \"" + Current->asName + "\""); - Current->iFlags &= - ~(conditional_trackoccupied | conditional_trackfree); // zerowanie flag + ErrorLog("Bad event: Track \"" + std::string(buff) + "\" does not exist in \"" + Current->asName + "\""); + Current->iFlags &= ~(conditional_trackoccupied | conditional_trackfree); // zerowanie flag } } - else if (Current->iFlags & - (conditional_memstring | conditional_memval1 | conditional_memval2)) + else if (Current->iFlags & (conditional_memstring | conditional_memval1 | conditional_memval2)) { // jeśli chodzi o komorke pamieciową tmp = FindGroundNode(buff, TP_MEMCELL); if (tmp) Current->Params[9].asMemCell = tmp->MemCell; if (!Current->Params[9].asMemCell) { - ErrorLog("Bad event: MemCell \"" + string(buff) + - "\" does not exist in \"" + Current->asName + "\""); - Current->iFlags &= - ~(conditional_memstring | conditional_memval1 | conditional_memval2); + ErrorLog("Bad event: MemCell \"" + std::string(buff) + "\" does not exist in \"" + Current->asName + "\""); + Current->iFlags &= ~(conditional_memstring | conditional_memval1 | conditional_memval2); } } for (i = 0; i < 8; i++) @@ -3375,8 +3304,8 @@ bool TGround::InitEvents() if( !Current->Params[ i ].asEvent ) { // Ra: tylko w logu informacja o braku if( ( Current->Params[ i ].asText == NULL ) || ( std::string( Current->Params[ i ].asText ).substr( 0, 5 ) != "none_" ) ) { - WriteLog( "Event \"" + string( buff ) + "\" does not exist" ); - ErrorLog( "Missed event: " + string( buff ) + " in multiple " + Current->asName ); + WriteLog( "Event \"" + std::string( buff ) + "\" does not exist" ); + ErrorLog( "Missed event: " + std::string( buff ) + " in multiple " + Current->asName ); } } } @@ -3414,7 +3343,7 @@ void TGround::InitTracks() TTrack *tmp; // znaleziony tor TTrack *Track; int iConnection; - string name; + std::string name; // tracks=tracksfar=0; for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext) { @@ -3568,11 +3497,7 @@ void TGround::InitTracks() Current = new TGroundNode(); // to nie musi mieć nazwy, nazwa w wyszukiwarce wystarczy // Current->asName=p->asName; //mazwa identyczna, jak nazwa odcinka izolowanego Current->MemCell = new TMemCell(NULL); // nowa komórka -#ifdef EU07_USE_OLD_TNAMES_CLASS - sTracks->Add(TP_MEMCELL, p->asName.c_str(), Current); // dodanie do wyszukiwarki -#else m_trackmap.Add( TP_MEMCELL, p->asName, Current ); -#endif Current->nNext = nRootOfType[TP_MEMCELL]; // to nie powinno tutaj być, bo robi się śmietnik nRootOfType[TP_MEMCELL] = Current; @@ -3592,7 +3517,7 @@ void TGround::InitTraction() TTraction *tmp; // znalezione przęsło TTraction *Traction; int iConnection; - string name; + std::string name; for (nCurrent = nRootOfType[TP_TRACTION]; nCurrent; nCurrent = nCurrent->nNext) { // podłączenie do zasilacza, żeby można było sumować prąd kilku pojazdów // a jednocześnie z jednego miejsca zmieniać napięcie eventem @@ -4015,18 +3940,11 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node) if (Event->Params[6].asTrack) { // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla // wszystkich 'dynamic' na danym torze -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - for (int i = 0; i < Event->Params[6].asTrack->iNumDynamics; ++i) - Event->Params[5].asMemCell->PutCommand( - Event->Params[6].asTrack->Dynamics[i]->Mechanik, - &Event->Params[4].nGroundNode->pCenter); -#else for( auto dynamic : Event->Params[ 6 ].asTrack->Dynamics ) { Event->Params[ 5 ].asMemCell->PutCommand( dynamic->Mechanik, &Event->Params[ 4 ].nGroundNode->pCenter ); } -#endif //if (DebugModeFlag) WriteLog("EVENT EXECUTED: AddValues & Track command - " + std::string(Event->Params[0].asText) + " " + @@ -4045,8 +3963,7 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node) } if (Event) { // standardowe dodanie do kolejki - WriteLog("EVENT ADDED TO QUEUE: " + Event->asName + - (Node ? (" by " + Node->asName) : string(""))); + WriteLog("EVENT ADDED TO QUEUE: " + Event->asName + (Node ? (" by " + Node->asName) : "")); Event->fStartTime = fabs(Event->fDelay) + Timer::GetTime(); // czas od uruchomienia scenerii if (Event->fRandomDelay > 0.0) @@ -4091,12 +4008,12 @@ bool TGround::EventConditon(TEvent *e) if (tmpEvent->Params[9].asMemCell->Compare(e->Params[10].asText, e->Params[11].asdouble, e->Params[12].asdouble, e->iFlags)) { //logowanie spełnionych warunków - LogComment = e->Params[9].asMemCell->Text() + string(" ") + + LogComment = e->Params[9].asMemCell->Text() + " " + to_string(e->Params[9].asMemCell->Value1(), 2, 8) + " " + to_string(tmpEvent->Params[9].asMemCell->Value2(), 2, 8) + " = "; if (TestFlag(e->iFlags, conditional_memstring)) - LogComment += string(tmpEvent->Params[10].asText); + LogComment += std::string(tmpEvent->Params[10].asText); else LogComment += "*"; if (TestFlag(tmpEvent->iFlags, conditional_memval1)) @@ -4113,7 +4030,7 @@ bool TGround::EventConditon(TEvent *e) //else if (Global::iWriteLogEnabled && DebugModeFlag) //zawsze bo to bardzo istotne w debugowaniu scenariuszy else { // nie zgadza się, więc sprawdzmy, co - LogComment = e->Params[9].asMemCell->Text() + string(" ") + + LogComment = e->Params[9].asMemCell->Text() + " " + to_string(e->Params[9].asMemCell->Value1(), 2, 8) + " " + to_string(tmpEvent->Params[9].asMemCell->Value2(), 2, 8) + " != "; @@ -4199,8 +4116,9 @@ bool TGround::CheckQuery() if (tmpEvent->bEnabled) { // w zasadzie te wyłączone są skanowane i nie powinny się nigdy w kolejce znaleźć WriteLog("EVENT LAUNCHED: " + tmpEvent->asName + - (tmpEvent->Activator ? string(" by " + tmpEvent->Activator->asName) : - string(""))); + (tmpEvent->Activator ? + std::string(" by " + tmpEvent->Activator->asName) : + "" )); switch (tmpEvent->Type) { case tp_CopyValues: // skopiowanie wartości z innej komórki @@ -4224,18 +4142,11 @@ bool TGround::CheckQuery() if (tmpEvent->Params[6].asTrack) { // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla // wszystkich 'dynamic' na danym torze -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - for (int i = 0; i < tmpEvent->Params[6].asTrack->iNumDynamics; ++i) - tmpEvent->Params[5].asMemCell->PutCommand( - tmpEvent->Params[6].asTrack->Dynamics[i]->Mechanik, - &tmpEvent->Params[4].nGroundNode->pCenter); -#else for( auto dynamic : tmpEvent->Params[ 6 ].asTrack->Dynamics ) { tmpEvent->Params[ 5 ].asMemCell->PutCommand( dynamic->Mechanik, &tmpEvent->Params[ 4 ].nGroundNode->pCenter ); } -#endif //if (DebugModeFlag) WriteLog("Type: UpdateValues & Track command - " + tmpEvent->Params[5].asMemCell->Text() + " " + @@ -4409,71 +4320,31 @@ bool TGround::CheckQuery() if (tmpEvent->iFlags & update_load) { // jeśli pytanie o ładunek if (tmpEvent->iFlags & update_memadd) // jeśli typ pojazdu -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - tmpEvent->Params[ 9 ].asMemCell->UpdateValues( - strdup(tmpEvent->Activator->MoverParameters->TypeName.c_str()), // typ pojazdu - 0, // na razie nic - 0, // na razie nic - tmpEvent->iFlags & - (update_memstring | update_memval1 | update_memval2)); -#else tmpEvent->Params[ 9 ].asMemCell->UpdateValues( tmpEvent->Activator->MoverParameters->TypeName, // typ pojazdu 0, // na razie nic 0, // na razie nic tmpEvent->iFlags & (update_memstring | update_memval1 | update_memval2)); -#endif else // jeśli parametry ładunku -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - tmpEvent->Params[ 9 ].asMemCell->UpdateValues( - tmpEvent->Activator->MoverParameters->LoadType != "" ? - strdup(tmpEvent->Activator->MoverParameters->LoadType.c_str()) : - (char*)"none", // nazwa ładunku - tmpEvent->Activator->MoverParameters->Load, // aktualna ilość - tmpEvent->Activator->MoverParameters->MaxLoad, // maksymalna ilość - tmpEvent->iFlags & - (update_memstring | update_memval1 | update_memval2)); -#else tmpEvent->Params[ 9 ].asMemCell->UpdateValues( tmpEvent->Activator->MoverParameters->LoadType, // nazwa ładunku tmpEvent->Activator->MoverParameters->Load, // aktualna ilość tmpEvent->Activator->MoverParameters->MaxLoad, // maksymalna ilość tmpEvent->iFlags & (update_memstring | update_memval1 | update_memval2)); -#endif } else if (tmpEvent->iFlags & update_memadd) { // jeśli miejsce docelowe pojazdu -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - tmpEvent->Params[ 9 ].asMemCell->UpdateValues( - strdup(tmpEvent->Activator->asDestination.c_str()), // adres docelowy - tmpEvent->Activator->DirectionGet(), // kierunek pojazdu względem czoła - // składu (1=zgodny,-1=przeciwny) - tmpEvent->Activator->MoverParameters - ->Power, // moc pojazdu silnikowego: 0 dla wagonu - tmpEvent->iFlags & (update_memstring | update_memval1 | update_memval2)); -#else tmpEvent->Params[ 9 ].asMemCell->UpdateValues( tmpEvent->Activator->asDestination, // adres docelowy tmpEvent->Activator->DirectionGet(), // kierunek pojazdu względem czoła składu (1=zgodny,-1=przeciwny) tmpEvent->Activator->MoverParameters ->Power, // moc pojazdu silnikowego: 0 dla wagonu tmpEvent->iFlags & (update_memstring | update_memval1 | update_memval2)); -#endif } else if (tmpEvent->Activator->Mechanik) if (tmpEvent->Activator->Mechanik->Primary()) { // tylko jeśli ktoś tam siedzi - nie powinno dotyczyć pasażera! -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - tmpEvent->Params[ 9 ].asMemCell->UpdateValues( - const_cast(tmpEvent->Activator->Mechanik->TrainName().c_str()), - tmpEvent->Activator->Mechanik->StationCount() - - tmpEvent->Activator->Mechanik - ->StationIndex(), // ile przystanków do końca - tmpEvent->Activator->Mechanik->IsStop() ? 1 : - 0, // 1, gdy ma tu zatrzymanie - tmpEvent->iFlags); -#else tmpEvent->Params[ 9 ].asMemCell->UpdateValues( tmpEvent->Activator->Mechanik->TrainName(), tmpEvent->Activator->Mechanik->StationCount() - @@ -4482,7 +4353,6 @@ bool TGround::CheckQuery() tmpEvent->Activator->Mechanik->IsStop() ? 1 : 0, // 1, gdy ma tu zatrzymanie tmpEvent->iFlags); -#endif WriteLog("Train detected: " + tmpEvent->Activator->Mechanik->TrainName()); } break; @@ -4975,7 +4845,7 @@ bool TGround::RenderDL(vector3 pPosition) bool TGround::RenderAlphaDL(vector3 pPosition) { // renderowanie scenerii z Display List - faza przezroczystych glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.02f); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f + glAlphaFunc(GL_GREATER, 0.04f); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f TGroundNode *node; glColor4f(1.0f, 1.0f, 1.0f, 1.0f); TSubRect *tmp; @@ -5269,13 +5139,13 @@ void TGround::WyslijObsadzone() } while (i <= 30) { - strcpy(r.cString + 64 * i, string("none").c_str()); + strcpy(r.cString + 64 * i, "none"); r.fPar[16 * i + 4] = 1; r.fPar[16 * i + 5] = 2; r.fPar[16 * i + 6] = 3; r.iPar[16 * i + 7] = 0; - strcpy(r.cString + 64 * i + 32, string("none").c_str()); - strcpy(r.cString + 64 * i + 48, string("none").c_str()); + strcpy(r.cString + 64 * i + 32, "none"); + strcpy(r.cString + 64 * i + 48, "none"); i++; } @@ -5345,18 +5215,6 @@ TDynamicObject * TGround::DynamicNearest(vector3 pPosition, double distance, boo if ((tmp = FastGetSubRect(i, j)) != NULL) for (node = tmp->nRootNode; node; node = node->nNext2) // następny z sektora if (node->iType == TP_TRACK) // Ra: przebudować na użycie tabeli torów? -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - for( k = 0; k < node->pTrack->iNumDynamics; k++ ) - if (mech ? (node->pTrack->Dynamics[k]->Mechanik != NULL) : - true) // czy ma mieć obsadę - if ((sqd = SquareMagnitude( - node->pTrack->Dynamics[k]->GetPosition() - pPosition)) < - sqm) - { - sqm = sqd; // nowa odległość - dyn = node->pTrack->Dynamics[k]; // nowy lider - } -#else for( auto dynamic : node->pTrack->Dynamics ) { if( mech ? ( dynamic->Mechanik != nullptr ) : true ) { // czy ma mieć obsadę @@ -5366,7 +5224,6 @@ TDynamicObject * TGround::DynamicNearest(vector3 pPosition, double distance, boo } } } -#endif return dyn; }; TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, bool mech) @@ -5383,27 +5240,6 @@ TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, boo if ((tmp = FastGetSubRect(i, j)) != NULL) for (node = tmp->nRootNode; node; node = node->nNext2) // następny z sektora if (node->iType == TP_TRACK) // Ra: przebudować na użycie tabeli torów? -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - for( k = 0; k < node->pTrack->iNumDynamics; k++ ) - if (mech ? (node->pTrack->Dynamics[k]->Mechanik != NULL) : - true) // czy ma mieć obsadę - { - if ((sqd = SquareMagnitude( - node->pTrack->Dynamics[k]->HeadPosition() - pPosition)) < - sqm) - { - sqm = sqd; // nowa odległość - dyn = node->pTrack->Dynamics[k]; // nowy lider - } - if ((sqd = SquareMagnitude( - node->pTrack->Dynamics[k]->RearPosition() - pPosition)) < - sqm) - { - sqm = sqd; // nowa odległość - dyn = node->pTrack->Dynamics[k]; // nowy lider - } - } -#else for( auto dynamic : node->pTrack->Dynamics ) { if( mech ? ( dynamic->Mechanik != nullptr ) : true ) { // czy ma mieć obsadę @@ -5417,7 +5253,6 @@ TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, boo } } } -#endif return dyn; }; //--------------------------------------------------------------------------- @@ -5556,11 +5391,7 @@ void TGround::TrackBusyList() TGroundNode *Current; for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext) if (!Current->asName.empty()) // musi być nazwa -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - if( Current->pTrack->iNumDynamics ) // osi to chyba nie ma jak policzyć -#else if( false == Current->pTrack->Dynamics.empty() ) -#endif WyslijString(Current->asName, 8); // zajęty }; //--------------------------------------------------------------------------- diff --git a/Ground.h b/Ground.h index 9a8673c5..44164d09 100644 --- a/Ground.h +++ b/Ground.h @@ -306,13 +306,9 @@ class TGround ssh = 0, ssm = 0; // ustawienia czasu // int tracks,tracksfar; //liczniki torów -#ifdef EU07_USE_OLD_TNAMES_CLASS - TNames *sTracks = nullptr; // posortowane nazwy torów i eventów -#else typedef std::unordered_map event_map; event_map m_eventmap; TNames m_trackmap; -#endif light_array m_lights; // collection of dynamic light sources present in the scene private: // metody prywatne diff --git a/MemCell.cpp b/MemCell.cpp index 49db62c3..9a9ad4fe 100644 --- a/MemCell.cpp +++ b/MemCell.cpp @@ -28,37 +28,20 @@ http://mozilla.org/MPL/2.0/. TMemCell::TMemCell(vector3 *p) { fValue1 = fValue2 = 0; -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - szText = new char[256]; // musi być dla automatycznie tworzonych komórek dla odcinków izolowanych -#endif vPosition = p ? *p : vector3(0, 0, 0); // ustawienie współrzędnych, bo do TGroundNode nie ma dostępu bCommand = false; // komenda wysłana OnSent = NULL; } -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY -TMemCell::~TMemCell() -{ - SafeDeleteArray(szText); -} -#endif void TMemCell::Init() { } -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY -void TMemCell::UpdateValues(char const *szNewText, double const fNewValue1, double const fNewValue2, int const CheckMask) -#else void TMemCell::UpdateValues( std::string const &szNewText, double const fNewValue1, double const fNewValue2, int const CheckMask ) -#endif { if (CheckMask & update_memadd) { // dodawanie wartości if( TestFlag( CheckMask, update_memstring ) ) -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - strcat( szText, szNewText ); -#else szText += szNewText; -#endif if (TestFlag(CheckMask, update_memval1)) fValue1 += fNewValue1; if (TestFlag(CheckMask, update_memval2)) @@ -67,11 +50,7 @@ void TMemCell::UpdateValues( std::string const &szNewText, double const fNewValu else { if( TestFlag( CheckMask, update_memstring ) ) -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - strcpy( szText, szNewText ); -#else szText = szNewText; -#endif if (TestFlag(CheckMask, update_memval1)) fValue1 = fNewValue1; if (TestFlag(CheckMask, update_memval2)) @@ -83,56 +62,32 @@ void TMemCell::UpdateValues( std::string const &szNewText, double const fNewValu TCommandType TMemCell::CommandCheck() { // rozpoznanie komendy -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - if (strcmp(szText, "SetVelocity") == 0) // najpopularniejsze -#else if( szText == "SetVelocity" ) // najpopularniejsze -#endif { eCommand = cm_SetVelocity; bCommand = false; // ta komenda nie jest wysyłana } -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - else if( strcmp( szText, "ShuntVelocity" ) == 0 ) // w tarczach manewrowych -#else else if( szText == "ShuntVelocity" ) // w tarczach manewrowych -#endif { eCommand = cm_ShuntVelocity; bCommand = false; // ta komenda nie jest wysyłana } -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - else if( strcmp( szText, "Change_direction" ) == 0 ) // zdarza się -#else else if( szText == "Change_direction" ) // zdarza się -#endif { eCommand = cm_ChangeDirection; bCommand = true; // do wysłania } -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - else if( strcmp( szText, "OutsideStation" ) == 0 ) // zdarza się -#else else if( szText == "OutsideStation" ) // zdarza się -#endif { eCommand = cm_OutsideStation; bCommand = false; // tego nie powinno być w komórce } -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - else if( strncmp( szText, "PassengerStopPoint:", 19 ) == 0 ) // porównanie początków -#else else if( szText.compare( 0, 19, "PassengerStopPoint:" ) == 0 ) // porównanie początków -#endif { eCommand = cm_PassengerStopPoint; bCommand = false; // tego nie powinno być w komórce } -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - else if( strcmp( szText, "SetProximityVelocity" ) == 0 ) // nie powinno tego być -#else else if( szText == "SetProximityVelocity" ) // nie powinno tego być -#endif { eCommand = cm_SetProximityVelocity; bCommand = false; // ta komenda nie jest wysyłana @@ -149,14 +104,7 @@ bool TMemCell::Load(cParser *parser) { std::string token; parser->getTokens(1, false); // case sensitive -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - *parser >> token; - SafeDeleteArray(szText); - szText = new char[256]; // musi być bufor do łączenia tekstów - strcpy(szText, token.c_str()); -#else *parser >> szText; -#endif parser->getTokens( 2, false ); *parser >> fValue1 @@ -179,32 +127,6 @@ void TMemCell::PutCommand(TController *Mech, vector3 *Loc) Mech->PutCommand(szText, fValue1, fValue2, Loc); } -bool TMemCell::Compare(char const *szTestText, double const fTestValue1, double const fTestValue2, int const CheckMask) -{ // porównanie zawartości komórki pamięci z podanymi wartościami - if (TestFlag(CheckMask, conditional_memstring)) - { // porównać teksty - std::string - match( szTestText ); - auto range = match.find( '*' ); - if( range != std::string::npos ) { - // compare string parts - if( 0 != szText.compare( 0, range, match, 0, range ) ) { - return false; - } - } - else { - // compare full strings - if( szText != match ) { - return false; - } - } - } - // tekst zgodny, porównać resztę - return ((!TestFlag(CheckMask, conditional_memval1) || (fValue1 == fTestValue1)) && - (!TestFlag(CheckMask, conditional_memval2) || (fValue2 == fTestValue2))); -}; - -#ifndef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY bool TMemCell::Compare( std::string const &szTestText, double const fTestValue1, double const fTestValue2, int const CheckMask ) { // porównanie zawartości komórki pamięci z podanymi wartościami if( TestFlag( CheckMask, conditional_memstring ) ) { @@ -224,10 +146,9 @@ bool TMemCell::Compare( std::string const &szTestText, double const fTestValue1, } } // tekst zgodny, porównać resztę - return ( ( !TestFlag( CheckMask, conditional_memval1 ) || ( fValue1 == fTestValue1 ) ) && - ( !TestFlag( CheckMask, conditional_memval2 ) || ( fValue2 == fTestValue2 ) ) ); + return ( ( !TestFlag( CheckMask, conditional_memval1 ) || ( fValue1 == fTestValue1 ) ) + && ( !TestFlag( CheckMask, conditional_memval2 ) || ( fValue2 == fTestValue2 ) ) ); }; -#endif bool TMemCell::Render() { diff --git a/MemCell.h b/MemCell.h index 730a5bf1..a4384b3f 100644 --- a/MemCell.h +++ b/MemCell.h @@ -7,56 +7,31 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef MemCellH -#define MemCellH +#pragma once #include "Classes.h" #include "dumb3d.h" -using namespace Math3D; -using namespace std; class TMemCell { private: - vector3 vPosition; -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - char *szText; -#else + Math3D::vector3 vPosition; std::string szText; -#endif double fValue1; double fValue2; TCommandType eCommand; bool bCommand; // czy zawiera komendę dla zatrzymanego AI TEvent *OnSent; // event dodawany do kolejki po wysłaniu komendy zatrzymującej skład public: - string - asTrackName; // McZapkie-100302 - zeby nazwe toru na ktory jest Putcommand wysylane pamietac - TMemCell(vector3 *p); -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - ~TMemCell(); -#endif + std::string asTrackName; // McZapkie-100302 - zeby nazwe toru na ktory jest Putcommand wysylane pamietac + TMemCell( Math3D::vector3 *p ); void Init(); -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - void UpdateValues( char const *szNewText, double const fNewValue1, double const fNewValue2, int const CheckMask ); -#else void UpdateValues( std::string const &szNewText, double const fNewValue1, double const fNewValue2, int const CheckMask ); -#endif bool Load(cParser *parser); - void PutCommand(TController *Mech, vector3 *Loc); - bool Compare( char const *szTestText, double const fTestValue1, double const fTestValue2, int const CheckMask ); -#ifndef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY + void PutCommand( TController *Mech, Math3D::vector3 *Loc ); bool Compare( std::string const &szTestText, double const fTestValue1, double const fTestValue2, int const CheckMask ); -#endif bool Render(); -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - inline char * Text() - { - return szText; - }; -#else inline std::string const &Text() { return szText; } -#endif inline double Value1() { return fValue1; @@ -65,7 +40,7 @@ class TMemCell { return fValue2; }; - inline vector3 Position() + inline Math3D::vector3 Position() { return vPosition; }; @@ -84,4 +59,3 @@ class TMemCell }; //--------------------------------------------------------------------------- -#endif diff --git a/Names.cpp b/Names.cpp index 1f6bcd54..c9f26e8e 100644 --- a/Names.cpp +++ b/Names.cpp @@ -11,179 +11,3 @@ http://mozilla.org/MPL/2.0/. #include "Names.h" //--------------------------------------------------------------------------- - -/* -Moduł zarządzający plikami oraz wyszukiwaniem obiektów wg nazw. -1. Ma przydzielony z góry (EU07.INI) obszar pamięci (rzędu 16MB). -2. W przypadku przepełnienia dostępnej pamięci wystąpi błąd wczytywania. -3. Obszar ten będzie zużywany na rekordy obiektów oraz ciągi tekstowe z nazwami. -4. Rekordy będą sortowane w ramach typu (tekstury, dźwięki, modele, node, eventy). -5. Pierwszy etap wyszukiwania to 5 bitów z pierwszego bajtu i 3 z drugiego (256). -6. Dla plików istnieje możliwość wczytania ich w innym terminie. -7. Możliwość wczytania plików w oddzielnym watku (np. tekstur). - -Obsługiwane pliki: -1. Tekstury, można wczytywać później, rekord przechowuje numer podany przez kartę graficzną. -2. Dźwięki, można wczytać później. -3. Modele, można wczytać później o ile nie mają animacji eventami i nie dotyczą pojazdów. - -Obiekty sortowane wg nazw, można dodawać i usuwać komórki scenerii: -4. Tory, drogi, rzeki - wyszukiwanie w celu sprawdzenia zajetości. -5. Eventy - wyszukiwane przy zewnętrznym wywołaniu oraz podczas wczytywania. -6. Pojazdy - wyszukiwane w celu wysyłania komend. -7. Egzemplarze modeli animowanych - wyszukiwanie w celu połączenia z animacjami. - -*/ - -#ifdef EU07_USE_OLD_TNAMES_CLASS - -void ItemRecord::TreeAdd(ItemRecord *r, int c) -{ // dodanie rekordu do drzewa - ustalenie w której gałęzi - // zapisać w (iFlags) ile znaków jest zgodnych z nadrzędnym, żeby nie sprawdzać wszystkich od - // zera - if ((cName[c] && r->cName[c]) ? cName[c] == r->cName[c] : false) - TreeAdd(r, c + 1); // ustawić wg kolejnego znaku, chyba że zero - else if ((unsigned char)(cName[c]) < (unsigned char)(r->cName[c])) - { // zero jest najmniejsze - doczepiamy jako (rNext) - if (!rNext) - rNext = r; - else - rNext->TreeAdd(r, 0); // doczepić do tej gałęzi - } - else - { - if (!rPrev) - rPrev = r; - else - rPrev->TreeAdd(r, 0); // doczepić do tej gałęzi - } -}; - -void ItemRecord::ListGet(ItemRecord *r, int *&n) -{ // rekurencyjne wypełnianie posortowanej listy na podstawie drzewa - if (rPrev) - rPrev->ListGet(r, n); // dodanie wszystkich wcześniejszych - *n++ = this - r; // dodanie swojego indeksu do tabeli - if (rNext) - rNext->ListGet(r, n); // dodanie wszystkich późniejszych -}; - -void * ItemRecord::TreeFind(const char *n) -{ // wyszukanie ciągu (n) - ItemRecord *r = TreeFindRecord(n); - return r ? r->pData : NULL; -}; - -ItemRecord * ItemRecord::TreeFindRecord(const char *n) -{ // wyszukanie ciągu (n) - ItemRecord *r = this; //żeby nie robić rekurencji - int i = 0; - do - { - if (!n[i]) - if (!r->cName[i]) - return r; // znaleziony - if (n[i] == r->cName[i]) - ++i; // porównać kolejny znak - else if ((unsigned char)(n[i]) < (unsigned char)(r->cName[i])) - { - i = 0; // porównywać od nowa - r = r->rPrev; // wcześniejsza gałąź drzewa - } - else - { - i = 0; // porównywać od nowa - r = r->rNext; // późniejsza gałąź drzewa - } - } while (r); - return NULL; -}; - -TNames::TNames() -{ // tworzenie bufora - iSize = 16 * 1024 * 1024; // rozmiar bufora w bajtach - cBuffer = new char[iSize]; - ZeroMemory(cBuffer, iSize); // nie trzymać jakiś starych śmieci - rRecords = (ItemRecord *)cBuffer; - cLast = cBuffer + iSize; // bajt za buforem - iLast = -1; - ZeroMemory(rTypes, 20 * sizeof(ItemRecord *)); -}; - -TNames::~TNames() { - - delete[] cBuffer; -} - -int TNames::Add(int t, const char *n) -{ // dodanie obiektu typu (t) o nazwie (n) - int len = strlen(n) + 1; // ze znacznikiem końca - cLast -= len; // rezerwacja miejsca - memcpy(cLast, n, len); // przekopiowanie tekstu do bufora - // cLast[len-1]='\0'; - rRecords[++iLast].cName = cLast; // połączenie nazwy z rekordem - rRecords[iLast].iFlags = t; - if (!rTypes[t]) - rTypes[t] = rRecords + iLast; // korzeń drzewa, bo nie było wcześniej - else - rTypes[t]->TreeAdd(rRecords + iLast, 0); // doczepienie jako gałąź - // rTypes[t]=Sort(t); //sortowanie uruchamiać ręcznie - if ((iLast & 0x3F) == 0) // nie za często, bo sortowania zajmą więcej czasu niż wyszukiwania - Sort(t); // optymalizacja drzewa co jakiś czas - return iLast; -} -int TNames::Add(int t, const char *n, void *d) -{ - int i = Add(t, n); - rRecords[iLast].pData = d; - return i; -}; - -bool TNames::Update(int t, const char *n, void *d) -{ // dodanie jeśli nie ma, wymiana (d), gdy jest - ItemRecord *r = FindRecord(t, n); // najpierw sprawdzić, czy już jest - if (r) - { // przy zdublowaniu nazwy podmieniać w drzewku na późniejszy - r->pData = d; - return true; // duplikat - } - // Add(t,n,d); //nazwa unikalna - return false; // został dodany nowy -}; - -ItemRecord * TNames::TreeSet(int *n, int d, int u) -{ // rekurencyjne wypełnianie drzewa pozycjami od (d) do (u) - if (d == u) - { - rRecords[n[d]].rPrev = rRecords[n[d]].rNext = NULL; - return rRecords + n[d]; // tej gałęzi nie ma - } - else if (d > u) - return NULL; - int p = (u + d) >> 1; // połowa - rRecords[n[p]].rPrev = TreeSet(n, d, p - 1); // zapisanie wcześniejszych gałęzi - rRecords[n[p]].rNext = TreeSet(n, p + 1, u); // zapisanie późniejszych gałęzi - return rRecords + n[p]; -}; - -void TNames::Sort(int t) -{ // przebudowa drzewa typu (t), zwraca wierzchołek drzewa - if (iLast < 3) - return; // jak jest mało, to nie ma sensu sortować - if (rTypes[t]) // jeśli jest jakiś rekord danego typu - { - int *r = new int[iLast + 1]; // robocza tablica indeksów - numery posortowanych rekordów - int *q = r; // wskaźnik roboczy, przekazywany przez referencję - rTypes[t]->ListGet(rRecords, q); // drzewo jest już posortowane - zamienić je na listę - rTypes[t] = TreeSet(r, 0, (q - r) - 1); - delete[] r; - } - return; -}; - -ItemRecord * TNames::FindRecord(const int t, const char *n) -{ // poszukiwanie rekordu w celu np. zmiany wskaźnika - return rTypes[t] ? rTypes[t]->TreeFindRecord(n) : NULL; -}; - -#endif diff --git a/Names.h b/Names.h index d9220fb1..a4bbdf70 100644 --- a/Names.h +++ b/Names.h @@ -1,4 +1,3 @@ -#pragma once /* This Source Code Form is subject to the terms of the Mozilla Public License, v. @@ -8,12 +7,12 @@ obtain one at http://mozilla.org/MPL/2.0/. */ +#pragma once + #include #include -#ifndef EU07_USE_OLD_TNAMES_CLASS - -template +template class TNames { public: @@ -27,7 +26,7 @@ public: // methods: // dodanie obiektu z wskaźnikiem. updates data field if the object already exists. returns true for insertion, false for update bool - Add( int const Type, std::string const &Name, _Pointer Data ) { + Add( int const Type, std::string const &Name, _Type Data ) { auto lookup = find_map( Type ).emplace( Name, Data ); if( lookup.second == false ) { @@ -41,7 +40,7 @@ public: } } // returns pointer associated with provided label, or nullptr if there's no match - _Pointer + _Type Find( int const Type, std::string const &Name ) { auto const &map = find_map( Type ); @@ -52,78 +51,17 @@ public: private: // types: - typedef std::unordered_map pointer_map; - typedef std::unordered_map pointermap_map; + typedef std::unordered_map type_map; + typedef std::unordered_map typemap_map; // methods: // returns database stored with specified type key; creates new database if needed. - pointer_map & + type_map & find_map( int const Type ) { - return m_maps.emplace( Type, pointer_map() ).first->second; + return m_maps.emplace( Type, type_map() ).first->second; } // members: - pointermap_map m_maps; // list of pointer maps of types specified so far + typemap_map m_maps; // list of object maps of types specified so far }; - -#else - -//--------------------------------------------------------------------------- -class ItemRecord -{ // rekord opisujący obiekt; raz utworzony nie przemieszcza się - // rozmiar rekordu można zmienić w razie potrzeby - public: - char *cName; // wskaźnik do nazwy umieszczonej w buforze - int iFlags; // flagi bitowe - ItemRecord *rPrev, *rNext; // posortowane drzewo (przebudowywane w razie potrzeby) - union - { - void *pData; // wskaźnik do obiektu - int iData; // albo numer obiektu (tekstury) - unsigned int uData; - }; - // typedef - void ListGet(ItemRecord *r, int *&n); - void TreeAdd(ItemRecord *r, int c); - template inline TOut *DataGet() - { - return (TOut *)pData; - }; - template inline void DataSet(TOut *x) - { - pData = (void *)x; - }; - void * TreeFind(const char *n); - ItemRecord * TreeFindRecord(const char *n); -}; - -class TNames -{ - public: - int iSize; // rozmiar bufora - char *cBuffer; // bufor dla rekordów (na początku) i nazw (na końcu) - ItemRecord *rRecords; // rekordy na początku bufora - char *cLast; // ostatni użyty bajt na nazwy - ItemRecord *rTypes[20]; // rożne typy obiektów (początek drzewa) - int iLast; // ostatnio użyty rekord - public: - TNames(); - ~TNames(); - int Add(int t, const char *n); // dodanie obiektu typu (t) - int Add(int t, const char *n, void *d); // dodanie obiektu z wskaźnikiem - int Add(int t, const char *n, int d); // dodanie obiektu z numerem - bool Update(int t, const char *n, void *d); // dodanie jeśli nie ma, wymiana (d), gdy jest - void TreeSet(); - ItemRecord * TreeSet(int *n, int d, int u); - void Sort(int t); // przebudowa drzewa typu (t) - ItemRecord * Item(int n); // rekord o numerze (n) - inline void *Find(const int t, const char *n) - { - return rTypes[t] ? rTypes[t]->TreeFind(n) : NULL; - }; - ItemRecord * FindRecord(const int t, const char *n); - // template inline TOut* Find(const int t,const char *n) - //{return (TOut*)(rTypes[t]->TreeFind(n));}; -}; -#endif diff --git a/Track.cpp b/Track.cpp index e13c9eae..d493055a 100644 --- a/Track.cpp +++ b/Track.cpp @@ -77,8 +77,8 @@ TIsolated::TIsolated() TIsolated("none", NULL); }; -TIsolated::TIsolated(const string &n, TIsolated *i) : - asName( n ), pNext( i ) +TIsolated::TIsolated(std::string const &n, TIsolated *i) : + asName( n ), pNext( i ) { // utworznie obwodu izolowanego. nothing to do here. }; @@ -96,7 +96,7 @@ TIsolated::~TIsolated(){ */ }; -TIsolated * TIsolated::Find(const string &n) +TIsolated * TIsolated::Find(std::string const &n) { // znalezienie obiektu albo utworzenie nowego TIsolated *p = pRoot; while (p) @@ -121,13 +121,8 @@ void TIsolated::Modify(int i, TDynamicObject *o) if (Global::iMultiplayer) // jeśli multiplayer Global::pGround->WyslijString(asName, 10); // wysłanie pakietu o zwolnieniu if (pMemCell) // w powiązanej komórce -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - pMemCell->UpdateValues( NULL, 0, int( pMemCell->Value2() ) & ~0xFF, - update_memval2); //"zerujemy" ostatnią wartość -#else pMemCell->UpdateValues( "", 0, int( pMemCell->Value2() ) & ~0xFF, update_memval2 ); //"zerujemy" ostatnią wartość -#endif } } else @@ -140,12 +135,7 @@ void TIsolated::Modify(int i, TDynamicObject *o) if (Global::iMultiplayer) // jeśli multiplayer Global::pGround->WyslijString(asName, 11); // wysłanie pakietu o zajęciu if (pMemCell) // w powiązanej komórce -#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY - pMemCell->UpdateValues( NULL, 0, int( pMemCell->Value2() ) | 1, - update_memval2); // zmieniamy ostatnią wartość na nieparzystą -#else pMemCell->UpdateValues( "", 0, int( pMemCell->Value2() ) | 1, update_memval2 ); // zmieniamy ostatnią wartość na nieparzystą -#endif } } }; @@ -154,9 +144,6 @@ void TIsolated::Modify(int i, TDynamicObject *o) TTrack::TTrack(TGroundNode *g) : pMyNode( g ) // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode { -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - ::SecureZeroMemory( Dynamics, sizeof( Dynamics ) ); -#endif fRadiusTable[ 0 ] = 0.0; fRadiusTable[ 1 ] = 0.0; nFouling[ 0 ] = nullptr; @@ -199,7 +186,7 @@ void TTrack::Init() break; case tt_Table: // oba potrzebne SwitchExtension = std::make_shared( this, 1 ); // kopia oryginalnego toru - Segment = make_shared(this); + Segment = std::make_shared(this); break; } } @@ -413,7 +400,7 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name) { // pobranie obiektu trajektorii ruchu vector3 pt, vec, p1, p2, cp1, cp2, p3, p4, cp3, cp4; // dodatkowe punkty potrzebne do skrzyżowań double a1, a2, r1, r2, r3, r4; - string str; + std::string str; size_t i; //,state; //Ra: teraz już nie ma początkowego stanu zwrotnicy we wpisie std::string token; @@ -808,7 +795,7 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name) } // alternatywny zapis nazwy odcinka izolowanego - po znaku "@" w nazwie toru if (!pIsolated) - if ((i = name.find("@")) != string::npos) + if ((i = name.find("@")) != std::string::npos) if (i < name.length()) // nie może być puste { pIsolated = TIsolated::Find(name.substr(i + 1, name.length())); @@ -976,7 +963,7 @@ bool TTrack::AssignForcedEvents(TEvent *NewEventPlus, TEvent *NewEventMinus) return false; }; -string TTrack::IsolatedName() +std::string TTrack::IsolatedName() { // podaje nazwę odcinka izolowanego, jesli nie ma on jeszcze przypisanych zdarzeń if (pIsolated) if (!pIsolated->evBusy && !pIsolated->evFree) @@ -1007,27 +994,6 @@ bool TTrack::AddDynamicObject(TDynamicObject *Dynamic) Dynamic->MyTrack = NULL; // trzeba by to uzależnić od kierunku ruchu... return true; } -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - if (Global::iMultiplayer) // jeśli multiplayer - if (!iNumDynamics) // pierwszy zajmujący - if (pMyNode->asName != "none") - Global::pGround->WyslijString(pMyNode->asName, - 8); // przekazanie informacji o zajętości toru - if (iNumDynamics < iMaxNumDynamics) - { // jeśli jest miejsce, dajemy na koniec - Dynamics[iNumDynamics++] = Dynamic; - Dynamic->MyTrack = this; // ABu: na ktorym torze jesteśmy - if (Dynamic->iOverheadMask) // jeśli ma pantografy - Dynamic->OverheadTrack( - fOverhead); // przekazanie informacji o jeździe bezprądowej na tym odcinku toru - return true; - } - else - { - Error("Too many dynamics on track " + pMyNode->asName); - return false; - } -#else if( Global::iMultiplayer ) { // jeśli multiplayer if( true == Dynamics.empty() ) { @@ -1045,7 +1011,6 @@ bool TTrack::AddDynamicObject(TDynamicObject *Dynamic) Dynamic->OverheadTrack( fOverhead ); // przekazanie informacji o jeździe bezprądowej na tym odcinku toru } return true; -#endif }; void TTrack::MoveMe(vector3 pPosition) @@ -1863,42 +1828,16 @@ void TTrack::Render() bool TTrack::CheckDynamicObject(TDynamicObject *Dynamic) { // sprawdzenie, czy pojazd jest przypisany do toru -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - for (int i = 0; i < iNumDynamics; i++) - if (Dynamic == Dynamics[i]) - return true; - return false; -#else for( auto dynamic : Dynamics ) { if( dynamic == Dynamic ) { return true; } } return false; -#endif }; bool TTrack::RemoveDynamicObject(TDynamicObject *Dynamic) { // usunięcie pojazdu z listy przypisanych do toru -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - for (int i = 0; i < iNumDynamics; i++) - { // sprawdzanie wszystkich po kolei - if (Dynamic == Dynamics[i]) - { // znaleziony, przepisanie następnych, żeby dziur nie było - --iNumDynamics; - for (i; i < iNumDynamics; i++) - Dynamics[i] = Dynamics[i + 1]; - if (Global::iMultiplayer) // jeśli multiplayer - if (!iNumDynamics) // jeśli już nie ma żadnego - if (pMyNode->asName != "none") - Global::pGround->WyslijString( - pMyNode->asName, 9); // przekazanie informacji o zwolnieniu toru - return true; - } - } - Error("Cannot remove dynamic from track"); - return false; -#else bool result = false; if( *Dynamics.begin() == Dynamic ) { // most likely the object getting removed is at the front... @@ -1935,7 +1874,6 @@ bool TTrack::RemoveDynamicObject(TDynamicObject *Dynamic) } return result; -#endif } bool TTrack::InMovement() @@ -2660,14 +2598,6 @@ void TTrack::EnvironmentReset() void TTrack::RenderDyn() { // renderowanie nieprzezroczystych fragmentów pojazdów -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - if (!iNumDynamics) - return; // po co kombinować, jeśli nie ma pojazdów? - // EnvironmentSet(); //Ra: pojazdy sobie same teraz liczą cienie - for (int i = 0; i < iNumDynamics; i++) - Dynamics[i]->Render(); // sam sprawdza, czy VBO; zmienia kontekst VBO! - // EnvironmentReset(); -#else for( auto dynamic : Dynamics ) { // sam sprawdza, czy VBO; zmienia kontekst VBO! #ifdef EU07_USE_OLD_RENDERCODE @@ -2676,19 +2606,10 @@ void TTrack::RenderDyn() GfxRenderer.Render( dynamic ); #endif } -#endif }; void TTrack::RenderDynAlpha() { // renderowanie przezroczystych fragmentów pojazdów -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - if (!iNumDynamics) - return; // po co kombinować, jeśli nie ma pojazdów? - // EnvironmentSet(); //Ra: pojazdy sobie same teraz liczą cienie - for (int i = 0; i < iNumDynamics; i++) - Dynamics[i]->RenderAlpha(); // sam sprawdza, czy VBO; zmienia kontekst VBO! - // EnvironmentReset(); -#else for( auto dynamic : Dynamics ) { // sam sprawdza, czy VBO; zmienia kontekst VBO! #ifdef EU07_USE_OLD_RENDERCODE @@ -2697,19 +2618,13 @@ void TTrack::RenderDynAlpha() GfxRenderer.Render_Alpha( dynamic ); #endif } -#endif }; void TTrack::RenderDynSounds() { // odtwarzanie dźwięków pojazdów jest niezależne od ich wyświetlania -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - for( int i = 0; i < iNumDynamics; i++ ) - Dynamics[i]->RenderSounds(); -#else for( auto dynamic : Dynamics ) { dynamic->RenderSounds(); } -#endif }; //--------------------------------------------------------------------------- bool TTrack::SetConnections(int i) @@ -3043,15 +2958,10 @@ TTrack * TTrack::RaAnimate() SwitchExtension->vTrans; // SwitchExtension->Segments[0]->FastGetPoint(0.5); Segment->Init(middle + vector3(sina, 0.0, cosa), middle - vector3(sina, 0.0, cosa), 5.0); // nowy odcinek -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - for( int i = 0; i < iNumDynamics; i++ ) - Dynamics[i]->Move(0.000001); // minimalny ruch, aby przeliczyć pozycję i -#else for( auto dynamic : Dynamics ) { // minimalny ruch, aby przeliczyć pozycję dynamic->Move( 0.000001 ); } -#endif // kąty if (Global::bUseVBO) { // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment @@ -3083,15 +2993,9 @@ TTrack * TTrack::RaAnimate() //--------------------------------------------------------------------------- void TTrack::RadioStop() { // przekazanie pojazdom rozkazu zatrzymania -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - for (int i = 0; i < iNumDynamics; i++) - Dynamics[i]->RadioStop(); -#else for( auto dynamic : Dynamics ) { dynamic->RadioStop(); } -#endif - }; double TTrack::WidthTotal() @@ -3200,7 +3104,7 @@ void TTrack::MovedUp1(double dh) fTexHeight1 += dh; }; -string TTrack::NameGet() +std::string TTrack::NameGet() { // ustalenie nazwy toru if (this) if (pMyNode) diff --git a/Track.h b/Track.h index 3b33fd4d..07e971b5 100644 --- a/Track.h +++ b/Track.h @@ -95,10 +95,6 @@ class TSwitchExtension private: }; -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY -const int iMaxNumDynamics = 40; // McZapkie-100303 -#endif - class TIsolated { // obiekt zbierający zajętości z kilku odcinków int iAxles = 0; // ilość osi na odcinkach obsługiwanych przez obiekt @@ -152,13 +148,8 @@ class TTrack : public Resource TGroundNode * pMyNode = nullptr; // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode public: -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - int iNumDynamics = 0; - TDynamicObject *Dynamics[iMaxNumDynamics]; -#else typedef std::deque dynamics_sequence; dynamics_sequence Dynamics; -#endif int iEvents = 0; // Ra: flaga informująca o obecności eventów TEvent *evEventall0 = nullptr; // McZapkie-140302: wyzwalany gdy pojazd stoi TEvent *evEventall1 = nullptr; @@ -204,11 +195,7 @@ class TTrack : public Resource TTrack * NullCreate(int dir); inline bool IsEmpty() { -#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY - return (iNumDynamics <= 0); -#else return Dynamics.empty(); -#endif }; void ConnectPrevPrev(TTrack *pNewPrev, int typ); void ConnectPrevNext(TTrack *pNewPrev, int typ); diff --git a/maszyna.vcxproj.filters b/maszyna.vcxproj.filters index edfae163..ba97afe4 100644 --- a/maszyna.vcxproj.filters +++ b/maszyna.vcxproj.filters @@ -207,7 +207,7 @@ Source Files - + Source Files @@ -404,9 +404,6 @@ Header Files - - Header Files - Header Files diff --git a/openglmatrixstack.cpp b/openglmatrixstack.cpp new file mode 100644 index 00000000..f01c98e2 --- /dev/null +++ b/openglmatrixstack.cpp @@ -0,0 +1,13 @@ +/* +This Source Code Form is subject to the +terms of the Mozilla Public License, v. +2.0. If a copy of the MPL was not +distributed with this file, You can +obtain one at +http://mozilla.org/MPL/2.0/. +*/ + +#include "stdafx.h" +#include "openglmatrixstack.h" + +opengl_matrices OpenGLMatrices; diff --git a/openglmatrixstack.h b/openglmatrixstack.h index 1ba685a2..890843d3 100644 --- a/openglmatrixstack.h +++ b/openglmatrixstack.h @@ -135,7 +135,7 @@ public: void perspective( _Type const Fovy, _Type const Aspect, _Type const Znear, _Type const Zfar ) { m_stacks[ m_mode ].perspective( - static_cast( Fovy ), + static_cast(Fovy) * 0.0174532925f, // deg2rad static_cast( Aspect ), static_cast( Znear ), static_cast( Zfar ) ); } diff --git a/renderer.cpp b/renderer.cpp index 2f6b9cf6..300fc702 100644 --- a/renderer.cpp +++ b/renderer.cpp @@ -16,10 +16,8 @@ http://mozilla.org/MPL/2.0/. #include "uilayer.h" #include "logs.h" #include "usefull.h" -#include "glwidgetlibrary.h" opengl_renderer GfxRenderer; -opengl_matrices OpenGLMatrices; extern TWorld World; // returns true if specified object is within camera frustum, false otherwise @@ -134,7 +132,7 @@ opengl_renderer::Render() { ::glMatrixMode( GL_PROJECTION ); // select the Projection Matrix ::gluPerspective( - Global::FieldOfView / Global::ZoomFactor * 0.0174532925f, + Global::FieldOfView / Global::ZoomFactor, std::max( 1.0f, (float)Global::ScreenWidth ) / std::max( 1.0f, (float)Global::ScreenHeight ), 0.1f * Global::ZoomFactor, m_drawrange * Global::fDistanceFactor ); @@ -183,7 +181,7 @@ bool opengl_renderer::Render( TGround *Ground ) { glDisable( GL_BLEND ); - glAlphaFunc( GL_GREATER, 0.35f ); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f + glAlphaFunc( GL_GREATER, 0.45f ); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f glEnable( GL_LIGHTING ); glColor3f( 1.0f, 1.0f, 1.0f ); @@ -444,7 +442,7 @@ opengl_renderer::Render_Alpha( TDynamicObject *Dynamic ) { } TSubModel::iInstance = ( size_t )this; //żeby nie robić cudzych animacji - double squaredistance = SquareMagnitude( Global::pCameraPosition - Dynamic->vPosition ); + double squaredistance = SquareMagnitude( Global::pCameraPosition - Dynamic->vPosition ) / Global::ZoomFactor; Dynamic->ABuLittleUpdate( squaredistance ); // ustawianie zmiennych submodeli dla wspólnego modelu ::glPushMatrix();