diff --git a/.gitignore b/.gitignore index ec4a4f77..36205d64 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,10 @@ install_manifest.txt *.~h *.~bpr *.~pas +*.opensdf +*.sdf +*.sln +*.vcxproj +*.filters +format_all_files.py +~$kumentacja zmiennych Python.docx diff --git a/Button.cpp b/Button.cpp index 7b5f90c2..3f2f51b2 100644 --- a/Button.cpp +++ b/Button.cpp @@ -21,6 +21,7 @@ http://mozilla.org/MPL/2.0/. TButton::TButton() { iFeedbackBit = 0; + bData = NULL; Clear(); }; @@ -54,8 +55,8 @@ void TButton::Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel Init(str, pModel1, false); if (pModel2) if (!pModelOn && !pModelOff) - Init(str, pModel2, - false); // może w drugim będzie (jak nie w kabinie, to w zewnętrznym) + Init(str, pModel2, false); // może w drugim będzie (jak nie w kabinie, + // to w zewnętrznym) } else { @@ -66,6 +67,8 @@ void TButton::Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel void TButton::Update() { + if (bData != NULL) + bOn = (*bData); if (pModelOn) pModelOn->iVisible = bOn; if (pModelOff) @@ -78,3 +81,8 @@ void TButton::Update() Console::BitsClear(iFeedbackBit); } }; + +void TButton::AssignBool(bool *bValue) +{ + bData = bValue; +} diff --git a/Button.h b/Button.h index 013e0d61..a7dbffb5 100644 --- a/Button.h +++ b/Button.h @@ -14,12 +14,13 @@ http://mozilla.org/MPL/2.0/. #include "QueryParserComp.hpp" class TButton -{ // animacja dwustanowa, włącza jeden z dwóch submodeli (jednego z nich może nie być) +{ // animacja dwustanowa, włącza jeden z dwóch submodeli (jednego + // z nich może nie być) private: TSubModel *pModelOn, *pModelOff; // submodel dla stanu załączonego i wyłączonego bool bOn; + bool *bData; int iFeedbackBit; // Ra: bit informacji zwrotnej, do wyprowadzenia na pulpit - void Update(); public: TButton(); @@ -53,8 +54,10 @@ class TButton { return (pModelOn) || (pModelOff); }; + void Update(); void Init(AnsiString asName, TModel3d *pModel, bool bNewOn = false); void Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel2 = NULL); + void AssignBool(bool *bValue); }; //--------------------------------------------------------------------------- diff --git a/Dokumentacja zmiennych Python.docx b/Dokumentacja zmiennych Python.docx new file mode 100644 index 00000000..f509f279 Binary files /dev/null and b/Dokumentacja zmiennych Python.docx differ diff --git a/DynObj.cpp b/DynObj.cpp index 32f55c71..14ff1ab4 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -53,7 +53,8 @@ void TAnimPant::AKP_4E() vPos = vector3(0, 0, 0); // przypisanie domyśnych współczynników do pantografów fLenL1 = 1.22; // 1.176289 w modelach fLenU1 = 1.755; // 1.724482197 w modelach - fHoriz = 0.535; // 0.54555075 przesunięcie ślizgu w długości pojazdu względem osi obrotu dolnego + fHoriz = 0.535; // 0.54555075 przesunięcie ślizgu w długości pojazdu względem + // osi obrotu dolnego // ramienia fHeight = 0.07; // wysokość ślizgu ponad oś obrotu fWidth = 0.635; // połowa szerokości ślizgu, 0.635 dla AKP-1 i AKP-4E @@ -76,11 +77,14 @@ void TAnimPant::AKP_4E() }; //--------------------------------------------------------------------------- int TAnim::TypeSet(int i, int fl) -{ // ustawienie typu animacji i zależnej od niego ilości animowanych submodeli +{ // ustawienie typu animacji i zależnej od + // niego ilości animowanych submodeli fMaxDist = -1.0; // normalnie nie pokazywać switch (i) - { // maska 0x000F: ile używa wskaźników na submodele (0 gdy jeden, wtedy bez tablicy) - // maska 0x00F0: 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki + { // maska 0x000F: ile używa wskaźników na submodele (0 gdy jeden, + // wtedy bez tablicy) + // maska 0x00F0: + // 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki // maska 0xFF00: ile używa liczb float dla współczynników i stanu case 0: iFlags = 0x000; @@ -173,7 +177,8 @@ TDynamicObject *__fastcall TDynamicObject::FirstFind(int &coupler_nr) //--------------------------------------------------------------------------- float TDynamicObject::GetEPP() -{ // szukanie skrajnego połączonego pojazdu w pociagu +{ // szukanie skrajnego połączonego pojazdu w + // pociagu // od strony sprzegu (coupler_nr) obiektu (start) TDynamicObject *temp = this; int coupler_nr = 0; @@ -272,14 +277,16 @@ TDynamicObject* TDynamicObject::GetFirstCabDynamic(int cpl_type) return NULL; if (coupler_nr==0) {//jeżeli szukamy od sprzęgu 0 - if (temp->PrevConnectedNo==0) //jeśli pojazd od strony sprzęgu 0 jest odwrócony + if (temp->PrevConnectedNo==0) //jeśli pojazd od strony sprzęgu 0 jest +odwrócony coupler_nr=1-coupler_nr; //to zmieniamy kierunek sprzęgu if (temp->PrevConnected) temp=temp->PrevConnected; //ten jest od strony 0 } else { - if (temp->NextConnectedNo==1) //jeśli pojazd od strony sprzęgu 1 jest odwrócony + if (temp->NextConnectedNo==1) //jeśli pojazd od strony sprzęgu 1 jest +odwrócony coupler_nr=1-coupler_nr; //to zmieniamy kierunek sprzęgu if (temp->NextConnected) temp=temp->NextConnected; //ten pojazd jest od strony 1 @@ -416,7 +423,8 @@ void TDynamicObject::UpdateDoorTranslate(TAnim *pAnim) void TDynamicObject::UpdateDoorRotate(TAnim *pAnim) { // animacja drzwi - obrót if (pAnim->smAnimated) - { // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac + { // if (MoverParameters->DoorOpenMethod==2) //obrotowe + // albo dwójłomne (trzeba kombinowac // submodelami i ShiftL=90,R=180) if (pAnim->iNumber & 1) pAnim->smAnimated->SetRotate(float3(1, 0, 0), dDoorMoveR); @@ -428,7 +436,8 @@ void TDynamicObject::UpdateDoorRotate(TAnim *pAnim) void TDynamicObject::UpdateDoorFold(TAnim *pAnim) { // animacja drzwi - obrót if (pAnim->smAnimated) - { // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac + { // if (MoverParameters->DoorOpenMethod==2) //obrotowe + // albo dwójłomne (trzeba kombinowac // submodelami i ShiftL=90,R=180) if (pAnim->iNumber & 1) { @@ -489,15 +498,19 @@ void TDynamicObject::UpdateLeverInt(TAnim *pAnim) pAnim->smAnimated->SetRotate(float3(1, 0, 0), pAnim->fSpeed * *pAnim->iIntBase); }; void TDynamicObject::UpdateLeverEnum(TAnim *pAnim) -{ // ustawienie kąta na wartość wskazaną przez int z tablicy fParam +{ // ustawienie kąta na + // wartość wskazaną przez + // int z tablicy fParam // pAnim->fParam[0]; - dodać lepkość pAnim->smAnimated->SetRotate(float3(1, 0, 0), pAnim->fParam[*pAnim->iIntBase]); }; // ABu 29.01.05 przeklejone z render i renderalpha: ********************* void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) -{ // ABu290105: pozbierane i uporzadkowane powtarzajace sie rzeczy z Render i RenderAlpha - // dodatkowy warunek, if (ObjSqrDist<...) zeby niepotrzebnie nie zmianiec w obiektach, +{ // ABu290105: pozbierane i uporzadkowane powtarzajace + // sie rzeczy z Render i RenderAlpha + // dodatkowy warunek, if (ObjSqrDist<...) zeby niepotrzebnie nie zmianiec w + // obiektach, // ktorych i tak nie widac // NBMX wrzesien, MC listopad: zuniwersalnione btnOn = false; // czy przywrócić stan domyślny po renderowaniu @@ -530,7 +543,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) // ABu011104: liczenie obrotow wozkow ABuBogies(); // Mczapkie-100402: rysowanie lub nie - sprzegow - // ABu-240105: Dodatkowy warunek: if (...).Render, zeby rysowal tylko jeden + // ABu-240105: Dodatkowy warunek: if (...).Render, zeby rysowal tylko + // jeden // z polaczonych sprzegow if ((TestFlag(MoverParameters->Couplers[0].CouplingFlag, ctrain_coupler)) && (MoverParameters->Couplers[0].Render)) @@ -547,7 +561,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) } // else btCoupler2.TurnOff(); //******************************************************************************** - // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie 'render' - juz + // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie + // 'render' - juz // nie // przewody powietrzne, yB: decyzja na podstawie polaczen w t3d if (Global::bnewAirCouplers) @@ -661,7 +676,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) //*********************************************************************************/ else // po staremu ABu'oewmu { - // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie 'render' + // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie + // 'render' if (TestFlag(MoverParameters->Couplers[0].CouplingFlag, ctrain_pneumatic)) { if (MoverParameters->Couplers[0].Render) @@ -690,7 +706,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) // btCPneumatic2r.TurnOff(); //} - // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie 'render' + // przewody powietrzne j.w., ABu: decyzja czy rysowac tylko na podstawie + // 'render' // //yB - zasilajace if (TestFlag(MoverParameters->Couplers[0].CouplingFlag, ctrain_scndpneumatic)) { @@ -720,7 +737,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) // btPneumatic2r.TurnOff(); //} } - //*************************************************************/// koniec wezykow + //*************************************************************/// koniec + // wezykow // uginanie zderzakow for (int i = 0; i < 2; i++) { @@ -840,9 +858,9 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) else { // jak jest tylko jeden, to do drugiej kabiny go obracamy smMechanik0->iVisible = (MoverParameters->ActiveCab != 0); - smMechanik0->SetRotate(float3(0, 0, 1), MoverParameters->ActiveCab >= 0 ? - 0 : - 180); // obrót względem osi Z + smMechanik0->SetRotate( + float3(0, 0, 1), + MoverParameters->ActiveCab >= 0 ? 0 : 180); // obrót względem osi Z } if (smMechanik1) // mechanik od strony sprzęgu 1 smMechanik1->iVisible = MoverParameters->ActiveCab < 0; @@ -852,7 +870,8 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) // if (ObjSqrDist<80000) ABuModelRoll(); //przechyłki od 400m } if (MoverParameters->Battery) - { // sygnały czoła pociagu //Ra: wyświetlamy bez ograniczeń odległości, by były widoczne z + { // sygnały czoła pociagu //Ra: wyświetlamy bez + // ograniczeń odległości, by były widoczne z // daleka if (TestFlag(iLights[0], 1)) { @@ -895,14 +914,16 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) // ABu 29.01.05 koniec przeklejenia ************************************* double ABuAcos(const vector3 &calc_temp) -{ // Odpowiednik funkcji Arccos, bo cos mi tam nie dzialalo. +{ // Odpowiednik funkcji Arccos, bo cos + // mi tam nie dzialalo. return atan2(-calc_temp.x, calc_temp.z); // Ra: tak prościej } TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track, TDynamicObject *MyPointer, int &CouplNr) -{ // zwraca wskaznik do obiektu znajdujacego sie na torze (Track), którego sprzęg jest najblizszy +{ // 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 @@ -929,7 +950,8 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track, 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 + //(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 @@ -963,7 +985,8 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track, TDynamicObject *__fastcall TDynamicObject::ABuScanNearestObject(TTrack *Track, double ScanDir, double ScanDist, int &CouplNr) -{ // skanowanie toru w poszukiwaniu obiektu najblizszego kamerze +{ // skanowanie toru w poszukiwaniu obiektu najblizszego + // kamerze // double MyScanDir=ScanDir; //Moja orientacja na torze. //Ra: nie używane if (ABuGetDirection() < 0) ScanDir = -ScanDir; @@ -1018,18 +1041,21 @@ TDynamicObject *__fastcall TDynamicObject::ABuScanNearestObject(TTrack *Track, d // ABu 01.11.04 poczatek wyliczania przechylow pudla ********************** void TDynamicObject::ABuModelRoll() -{ // ustawienie przechyłki pojazdu i jego zawartości +{ // ustawienie przechyłki pojazdu i jego + // zawartości // Ra: przechyłkę załatwiamy na etapie przesuwania modelu } // ABu 06.05.04 poczatek wyliczania obrotow wozkow ********************** void TDynamicObject::ABuBogies() -{ // Obracanie wozkow na zakretach. Na razie uwzględnia tylko zakręty, +{ // Obracanie wozkow na zakretach. Na razie + // uwzględnia tylko zakręty, // bez zadnych gorek i innych przeszkod. if ((smBogie[0] != NULL) && (smBogie[1] != NULL)) { - // modelRot.z=ABuAcos(Axle0.pPosition-Axle1.pPosition); //kąt obrotu pojazdu [rad] + // modelRot.z=ABuAcos(Axle0.pPosition-Axle1.pPosition); //kąt obrotu pojazdu + // [rad] // bogieRot[0].z=ABuAcos(Axle0.pPosition-Axle3.pPosition); bogieRot[0].z = Axle0.vAngles.z; bogieRot[0] = RadToDeg(modelRot - bogieRot[0]); // mnożenie wektora przez stałą @@ -1044,7 +1070,8 @@ void TDynamicObject::ABuBogies() // ABu 16.03.03 sledzenie toru przed obiektem: ************************** void TDynamicObject::ABuCheckMyTrack() -{ // Funkcja przypisujaca obiekt prawidlowej tablicy Dynamics, +{ // Funkcja przypisujaca obiekt + // prawidlowej tablicy Dynamics, // bo gdzies jest jakis blad i wszystkie obiekty z danego // pociagu na poczatku stawiane sa na jednym torze i wpisywane // do jednej tablicy. Wykonuje sie tylko raz - po to 'ABuChecked' @@ -1067,8 +1094,10 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan // WE: Track - tor, na ktorym odbywa sie poszukiwanie, // MyPointer - wskaznik do obiektu szukajacego. //Ra: zamieniłem na "this" - // ScanDir - kierunek szukania na torze (+1:w stronę Point2, -1:w stronę Point1) - // MyScanDir - kierunek szukania obiektu szukajacego (na jego torze); Ra: nie potrzebne + // ScanDir - kierunek szukania na torze (+1:w stronę Point2, -1:w stronę + // Point1) + // MyScanDir - kierunek szukania obiektu szukajacego (na jego torze); Ra: + // nie potrzebne // MyCouplFound - nr sprzegu obiektu szukajacego; Ra: nie potrzebne // WY: wskaznik do znalezionego obiektu. @@ -1077,8 +1106,8 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan { // sens szukania na tym torze jest tylko, gdy są na nim pojazdy double ObjTranslation; // pozycja najblizszego obiektu na torze double MyTranslation; // pozycja szukającego na torze - double MinDist = - Track->Length(); // najmniejsza znaleziona odleglość (zaczynamy od długości toru) + 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 int iMinDist = -1; // indeks wykrytego obiektu // if (Track->iNumDynamics>1) @@ -1099,12 +1128,14 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan 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 + { // 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 + { // 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, @@ -1112,18 +1143,21 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan // 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ęć + // 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ę + // 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 + 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 @@ -1140,17 +1174,17 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan { if (Track->Dynamics[i] != this) { - TestDist = - MyTranslation - - (Track->Dynamics[i] - ->RaTranslationGet()); //???-przesunięcie wózka względem Point1 toru + 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 + { // 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ć, @@ -1158,18 +1192,21 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan // 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ęć + // 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ę + // 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 + continue; // odległość większa od połowy sumy szerokości - + // kolizji // nie będzie } iMinDist = i; // potencjalna kolizja @@ -1178,16 +1215,20 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan } } } - dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka do przeskanowanej + dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka + // do przeskanowanej // odległości return (iMinDist >= 0) ? Track->Dynamics[iMinDist] : NULL; } - dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej odległości + dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej + // odległości return NULL; // nie ma pojazdów na torze, to jest NULL } int TDynamicObject::DettachStatus(int dir) -{ // sprawdzenie odległości sprzęgów rzeczywistych od strony (dir): 0=przód,1=tył +{ // sprawdzenie odległości sprzęgów + // rzeczywistych od strony (dir): + // 0=przód,1=tył // Ra: dziwne, że ta funkcja nie jest używana if (!MoverParameters->Couplers[dir].CouplingFlag) return 0; // jeśli nic nie podłączone, to jest OK @@ -1195,10 +1236,12 @@ int TDynamicObject::DettachStatus(int dir) } int TDynamicObject::Dettach(int dir) -{ // rozłączenie sprzęgów rzeczywistych od strony (dir): 0=przód,1=tył +{ // rozłączenie sprzęgów rzeczywistych od + // strony (dir): 0=przód,1=tył // zwraca maskę bitową aktualnych sprzegów (0 jeśli rozłączony) if (ctOwner) - { // jeśli pojazd ma przypisany obiekt nadzorujący skład, to póki są wskaźniki + { // jeśli pojazd ma przypisany obiekt nadzorujący skład, to póki + // są wskaźniki TDynamicObject *d = this; while (d) { @@ -1219,7 +1262,8 @@ int TDynamicObject::Dettach(int dir) } void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir) -{ // funkcja rozłączajaca podłączone sprzęgi, jeśli odległość przekracza (MinDist) +{ // funkcja rozłączajaca podłączone sprzęgi, + // jeśli odległość przekracza (MinDist) // MinDist - dystans minimalny, dla ktorego mozna rozłączać if (MyScanDir > 0) { @@ -1230,7 +1274,8 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir) { if ((PrevConnectedNo ? PrevConnected->NextConnected : PrevConnected->PrevConnected) == this) - { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w + { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas + // podłączony (może jechać w // innym kierunku) PrevConnected->MoverParameters->Couplers[PrevConnectedNo].Connected = NULL; if (PrevConnectedNo == 0) @@ -1260,7 +1305,8 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir) { if ((NextConnectedNo ? NextConnected->NextConnected : NextConnected->PrevConnected) == this) - { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w + { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas + // podłączony (może jechać w // innym kierunku) NextConnected->MoverParameters->Couplers[NextConnectedNo].Connected = NULL; if (NextConnectedNo == 0) @@ -1284,23 +1330,25 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir) void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) { // skanowanie toru w poszukiwaniu kolidujących pojazdów - // ScanDir - określa kierunek poszukiwania zależnie od zwrotu prędkości pojazdu + // ScanDir - określa kierunek poszukiwania zależnie od zwrotu prędkości + // pojazdu // ScanDir=1 - od strony Coupler0, ScanDir=-1 - od strony Coupler1 - int MyScanDir = - ScanDir; // zapamiętanie kierunku poszukiwań na torze początkowym, względem sprzęgów + int MyScanDir = ScanDir; // zapamiętanie kierunku poszukiwań na torze + // początkowym, względem sprzęgów TTrackFollower *FirstAxle = (MyScanDir > 0 ? &Axle0 : &Axle1); // można by to trzymać w trainset - TTrack *Track = - FirstAxle->GetTrack(); // tor na którym "stoi" skrajny wózek (może być inny niż tor pojazdu) + TTrack *Track = FirstAxle->GetTrack(); // tor na którym "stoi" skrajny wózek + // (może być inny niż tor pojazdu) if (FirstAxle->GetDirection() < 0) // czy oś jest ustawiona w stronę Point1? - ScanDir = -ScanDir; // jeśli tak, to kierunek szukania będzie przeciwny (teraz względem + ScanDir = -ScanDir; // jeśli tak, to kierunek szukania będzie przeciwny + // (teraz względem // toru) Byte MyCouplFound; // numer sprzęgu do podłączenia w obiekcie szukajacym MyCouplFound = (MyScanDir < 0) ? 1 : 0; Byte CouplFound; // numer sprzęgu w znalezionym obiekcie (znaleziony wypełni) TDynamicObject *FoundedObj; // znaleziony obiekt double ActDist = 0; // przeskanowana odleglość; odległość do zawalidrogi - FoundedObj = - ABuFindObject(Track, ScanDir, CouplFound, ActDist); // zaczynamy szukać na tym samym torze + FoundedObj = ABuFindObject(Track, ScanDir, CouplFound, + ActDist); // zaczynamy szukać na tym samym torze /* if (FoundedObj) //jak coś znajdzie, to śledzimy @@ -1358,7 +1406,8 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) } if (Track) { // jesli jest kolejny odcinek toru - // CurrDist=Track->Length(); //doliczenie tego toru do przejrzanego dystandu + // CurrDist=Track->Length(); //doliczenie tego toru do przejrzanego + // dystandu FoundedObj = ABuFindObject(Track, ScanDir, CouplFound, ActDist); // przejrzenie pojazdów tego toru if (FoundedObj) @@ -1380,10 +1429,12 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) CouplersDettach(1.0, MyScanDir); // odłączamy, jeśli dalej niż metr // i łączenie sprzęgiem wirtualnym if (FoundedObj) - { // siebie można bezpiecznie podłączyć jednostronnie do znalezionego + { // siebie można bezpiecznie podłączyć jednostronnie do + // znalezionego MoverParameters->Attach(MyCouplFound, CouplFound, FoundedObj->MoverParameters, ctrain_virtual); - // MoverParameters->Couplers[MyCouplFound].Render=false; //wirtualnego nie renderujemy + // MoverParameters->Couplers[MyCouplFound].Render=false; //wirtualnego nie + // renderujemy if (MyCouplFound == 0) { PrevConnected = FoundedObj; // pojazd od strony sprzęgu 0 @@ -1395,7 +1446,8 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) NextConnectedNo = CouplFound; } if (FoundedObj->MoverParameters->Couplers[CouplFound].CouplingFlag == ctrain_virtual) - { // Ra: wpinamy się wirtualnym tylko jeśli znaleziony ma wirtualny sprzęg + { // Ra: wpinamy się wirtualnym tylko jeśli znaleziony + // ma wirtualny sprzęg FoundedObj->MoverParameters->Attach(CouplFound, MyCouplFound, this->MoverParameters, ctrain_virtual); if (CouplFound == 0) // jeśli widoczny sprzęg 0 znalezionego @@ -1423,7 +1475,8 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) FoundedObj->NextConnectedNo = MyCouplFound; } } - // Ra: jeśli dwa samochody się mijają na odcinku przed zawrotką, to odległość między nimi + // Ra: jeśli dwa samochody się mijają na odcinku przed zawrotką, to + // odległość między nimi // nie może być liczona w linii prostej! fTrackBlock = MoverParameters->Couplers[MyCouplFound] .CoupleDist; // odległość do najbliższego pojazdu w linii prostej @@ -1431,7 +1484,8 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) if (ActDist > MoverParameters->Dim.L + FoundedObj->MoverParameters->Dim .L) // przeskanowana odległość większa od długości pojazdów - // else if (ActDistiLights; // wskaźnik na stan własnych świateł (zmienimy dla rozrządczych EZT) + iLights = MoverParameters->iLights; // wskaźnik na stan własnych świateł + // (zmienimy dla rozrządczych EZT) // McZapkie: TypeName musi byc nazwą CHK/MMD pojazdu if (!MoverParameters->LoadChkFile(asBaseDir)) { // jak wczytanie CHK się nie uda, to błąd @@ -1635,19 +1699,21 @@ double TDynamicObject::Init( } bool driveractive = (fVel != 0.0); // jeśli prędkość niezerowa, to aktywujemy ruch if (!MoverParameters->CheckLocomotiveParameters( - driveractive, (fVel > 0 ? 1 : -1) * Cab * - (iDirection ? 1 : -1))) // jak jedzie lub obsadzony to gotowy do drogi + driveractive, + (fVel > 0 ? 1 : -1) * Cab * + (iDirection ? 1 : -1))) // jak jedzie lub obsadzony to gotowy do drogi { Error("Parameters mismatch: dynamic object " + asName + " from\n" + BaseDir + "\\" + Type_Name); return 0.0; // zerowa długość to brak pojazdu } MoverParameters->BrakeLevelSet( - MoverParameters - ->BrakeCtrlPos); // poprawienie hamulca po ewentualnym przestawieniu przez Pascal + MoverParameters->BrakeCtrlPos); // poprawienie hamulca po ewentualnym + // przestawieniu przez Pascal // dodatkowe parametry yB - MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać kropkę na koniec + MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać + // kropkę na koniec int kropka = MoreParams.Pos("."); // znajdź kropke AnsiString ActPar; // na parametry while (kropka > 0) // jesli sa kropki jeszcze @@ -1698,7 +1764,8 @@ double TDynamicObject::Init( } if (ActPar.Pos("Q") > 0) // oprozniony { - // MoverParameters->Hamulec->ForceEmptiness(); //TODO: sprawdzic, dlaczego + // MoverParameters->Hamulec->ForceEmptiness(); //TODO: sprawdzic, + // dlaczego // pojawia sie blad przy uzyciu tej linijki w lokomotywie MoverParameters->BrakeReleaser(1); // odluznij automatycznie MoverParameters->Pipe->CreatePress(0.0); @@ -1785,17 +1852,20 @@ double TDynamicObject::Init( if (Track->fTrackWidth < 3.5) // jeśli droga wąska MoverParameters->OffsetTrackH = 0.0; // to stawiamy na środku, niezależnie od stanu // ruchu - else if (driveractive) // od 3.5m do 8.0m jedzie po środku pasa, dla szerszych w odległości + else if (driveractive) // od 3.5m do 8.0m jedzie po środku pasa, dla + // szerszych w odległości // 1.5m MoverParameters->OffsetTrackH = Track->fTrackWidth <= 8.0 ? -Track->fTrackWidth * 0.25 : -1.5; - else // jak stoi, to kołem na poboczu i pobieramy szerokość razem z poboczem, ale nie z + else // jak stoi, to kołem na poboczu i pobieramy szerokość razem z + // poboczem, ale nie z // chodnikiem MoverParameters->OffsetTrackH = -0.5 * (Track->WidthTotal() - MoverParameters->Dim.W) + 0.05; iHornWarning = 0; // nie będzie trąbienia po podaniu zezwolenia na jazdę if (fDist < 0.0) //-0.5*MoverParameters->Dim.L) //jeśli jest przesunięcie do tyłu - if (!Track->CurrentPrev()) // a nie ma tam odcinka i trzeba by coś wygenerować + if (!Track->CurrentPrev()) // a nie ma tam odcinka i trzeba by coś + // wygenerować fDist = -fDist; // to traktujemy, jakby przesunięcie było w drugą stronę } // w wagonie tez niech jedzie @@ -1811,10 +1881,12 @@ double TDynamicObject::Init( else // w przeciwnym razie trzeba włączyć pokazywanie kabiny bDisplayCab = true; } - // McZapkie-151102: rozkład jazdy czytany z pliku *.txt z katalogu w którym jest sceneria + // McZapkie-151102: rozkład jazdy czytany z pliku *.txt z katalogu w którym + // jest sceneria if (DriverType.Pos("1") || DriverType.Pos("2")) { // McZapkie-110303: mechanik i rozklad tylko gdy jest obsada - // MoverParameters->ActiveCab=MoverParameters->CabNo; //ustalenie aktywnej kabiny + // MoverParameters->ActiveCab=MoverParameters->CabNo; //ustalenie aktywnej + // kabiny // (rozrząd) Mechanik = new TController(Controller, this, Aggressive); if (TrainName.IsEmpty()) // jeśli nie w składzie @@ -1829,7 +1901,8 @@ double TDynamicObject::Init( } else if (DriverType == "p") { // obserwator w charakterze pasażera - // Ra: to jest niebezpieczne, bo w razie co będzie pomagał hamulcem bezpieczeństwa + // Ra: to jest niebezpieczne, bo w razie co będzie pomagał hamulcem + // bezpieczeństwa Mechanik = new TController(Controller, this, Easyman, false); } } @@ -1909,19 +1982,22 @@ double TDynamicObject::Init( if (fAxleDist > MoverParameters->Dim.L - 0.2) // nie mogą być za daleko fAxleDist = MoverParameters->Dim.L - 0.2; // bo będzie "walenie w mur" double fAxleDistHalf = fAxleDist * 0.5; - // WriteLog("Dynamic "+Type_Name+" of length "+MoverParameters->Dim.L+" at "+AnsiString(fDist)); + // WriteLog("Dynamic "+Type_Name+" of length "+MoverParameters->Dim.L+" at + // "+AnsiString(fDist)); // if (Cab) //jeśli ma obsadę - zgodność wstecz, jeśli tor startowy ma Event0 // if (Track->Event0) //jeśli tor ma Event0 - // if (fDist>=0.0) //jeśli jeśli w starych sceneriach początek składu byłby wysunięty na ten + // if (fDist>=0.0) //jeśli jeśli w starych sceneriach początek składu byłby + // wysunięty na ten // tor // if (fDist<=0.5*MoverParameters->Dim.L+0.2) //ale nie jest wysunięty // fDist+=0.5*MoverParameters->Dim.L+0.2; //wysunąć go na ten tor // przesuwanie pojazdu tak, aby jego początek był we wskazanym miejcu - fDist -= 0.5 * - MoverParameters->Dim - .L; // dodajemy pół długości pojazdu, bo ustawiamy jego środek (zliczanie na minus) + fDist -= 0.5 * MoverParameters->Dim.L; // dodajemy pół długości pojazdu, bo + // ustawiamy jego środek (zliczanie na + // minus) switch (iNumAxles) - { // Ra: pojazdy wstawiane są na tor początkowy, a potem przesuwane + { // Ra: pojazdy wstawiane są na tor początkowy, a potem + // przesuwane case 2: // ustawianie osi na torze Axle0.Init(Track, this, iDirection ? 1 : -1); Axle0.Move((iDirection ? fDist : -fDist) + fAxleDistHalf, false); @@ -1946,9 +2022,11 @@ double TDynamicObject::Init( // Axle3.Move((iDirection?fDist:-fDist)+(fAxleDistHalf-MoverParameters->ADist*0.5),false); break; } - Move(0.0001); // potrzebne do wyliczenia aktualnej pozycji; nie może być zero, bo nie przeliczy + Move(0.0001); // potrzebne do wyliczenia aktualnej pozycji; nie może być zero, + // bo nie przeliczy // pozycji - // teraz jeszcze trzeba przypisać pojazdy do nowego toru, bo przesuwanie początkowe osi nie + // teraz jeszcze trzeba przypisać pojazdy do nowego toru, bo przesuwanie + // początkowe osi nie // zrobiło tego ABuCheckMyTrack(); // zmiana toru na ten, co oś Axle0 (oś z przodu) TLocation loc; // Ra: ustawienie pozycji do obliczania sprzęgów @@ -1992,16 +2070,21 @@ void TDynamicObject::FastMove(double fDistance) } void TDynamicObject::Move(double fDistance) -{ // przesuwanie pojazdu po trajektorii polega na przesuwaniu poszczególnych osi - // Ra: wartość prędkości 2km/h ma ograniczyć aktywację eventów w przypadku drgań +{ // przesuwanie pojazdu po + // trajektorii polega na + // przesuwaniu poszczególnych osi + // Ra: wartość prędkości 2km/h ma ograniczyć aktywację eventów w przypadku + // drgań if (Axle0.GetTrack() == Axle1.GetTrack()) // przed przesunięciem - { // powiązanie pojazdu z osią można zmienić tylko wtedy, gdy skrajne osie są na tym samym torze + { // powiązanie pojazdu z osią można zmienić tylko wtedy, gdy skrajne osie są + // na tym samym torze if (MoverParameters->Vel > 2) //|[km/h]| nie ma sensu zmiana osi, jesli pojazd drga na postoju iAxleFirst = (MoverParameters->V >= 0.0) ? 1 : 0; //[m/s] ?1:0 - aktywna druga oś w kierunku jazdy - // aktualnie eventy aktywuje druga oś, żeby AI nie wyłączało sobie semafora za szybko + // aktualnie eventy aktywuje druga oś, żeby AI nie wyłączało sobie semafora + // za szybko } if (fDistance > 0.0) { // gdy ruch w stronę sprzęgu 0, doliczyć korektę do osi 1 @@ -2022,20 +2105,23 @@ void TDynamicObject::Move(double fDistance) { // liczenie pozycji pojazdu tutaj, bo jest używane w wielu miejscach vPosition = 0.5 * (Axle1.pPosition + Axle0.pPosition); //środek między skrajnymi osiami vFront = Axle0.pPosition - Axle1.pPosition; // wektor pomiędzy skrajnymi osiami - // Ra 2F1J: to nie jest stabilne (powoduje rzucanie taborem) i wymaga dopracowania + // Ra 2F1J: to nie jest stabilne (powoduje rzucanie taborem) i wymaga + // dopracowania fAdjustment = vFront.Length() - fAxleDist; // na łuku będzie ujemny - // if (fabs(fAdjustment)>0.02) //jeśli jest zbyt dużo, to rozłożyć na kilka przeliczeń + // if (fabs(fAdjustment)>0.02) //jeśli jest zbyt dużo, to rozłożyć na kilka + // przeliczeń // (wygasza drgania?) - //{//parę centymetrów trzeba by już skorygować; te błędy mogą się też generować na ostrych + //{//parę centymetrów trzeba by już skorygować; te błędy mogą się też + // generować na ostrych //łukach // fAdjustment*=0.5; //w jednym kroku korygowany jest ułamek błędu //} // else // fAdjustment=0.0; vFront = Normalize(vFront); // kierunek ustawienia pojazdu (wektor jednostkowy) - vLeft = Normalize(CrossProduct( - vWorldUp, - vFront)); // wektor poziomy w lewo, normalizacja potrzebna z powodu pochylenia (vFront) + vLeft = Normalize(CrossProduct(vWorldUp, vFront)); // wektor poziomy w lewo, + // normalizacja potrzebna z powodu + // pochylenia (vFront) vUp = CrossProduct(vFront, vLeft); // wektor w górę, będzie jednostkowy modelRot.z = atan2(-vFront.x, vFront.z); // kąt obrotu pojazdu [rad]; z ABuBogies() double a = ((Axle1.GetRoll() + Axle0.GetRoll())); // suma przechyłek @@ -2051,11 +2137,12 @@ void TDynamicObject::Move(double fDistance) vLeft = Normalize(CrossProduct(vUp, vFront)); // wektor w lewo // vUp=CrossProduct(vFront,vLeft); //wektor w górę } - mMatrix.Identity(); // to też można by od razu policzyć, ale potrzebne jest do wyświetlania + mMatrix.Identity(); // to też można by od razu policzyć, ale potrzebne jest + // do wyświetlania mMatrix.BasisChange(vLeft, vUp, vFront); // przesuwanie jest jednak rzadziej niż // renderowanie - mMatrix = - Inverse(mMatrix); // wyliczenie macierzy dla pojazdu (potrzebna tylko do wyświetlania?) + mMatrix = Inverse(mMatrix); // wyliczenie macierzy dla pojazdu (potrzebna + // tylko do wyświetlania?) // if (MoverParameters->CategoryFlag&2) { // przesunięcia są używane po wyrzuceniu pociągu z toru vPosition.x += MoverParameters->OffsetTrackH * vLeft.x; // dodanie przesunięcia w bok @@ -2083,7 +2170,8 @@ void TDynamicObject::Move(double fDistance) // e_bridge... fShade = 0.0; // standardowe oświetlenie else - { // jeżeli te tory mają niestandardowy stopień zacienienia (e_canyon, e_tunnel) + { // jeżeli te tory mają niestandardowy stopień zacienienia + // (e_canyon, e_tunnel) if (t0->eEnvironment == t1->eEnvironment) { switch (t0->eEnvironment) @@ -2103,7 +2191,8 @@ void TDynamicObject::Move(double fDistance) d = t0->fTrackLength - d; // od drugiej strony liczona długość d /= fAxleDist; // rozsataw osi procentowe znajdowanie się na torze switch (t0->eEnvironment) - { // typ zmiany oświetlenia - zakładam, że drugi tor ma e_flat + { // typ zmiany oświetlenia - zakładam, że + // drugi tor ma e_flat case e_canyon: fShade = (d * 0.65) + (1.0 - d); break; // zacienienie w kanionie @@ -2112,7 +2201,8 @@ void TDynamicObject::Move(double fDistance) break; // zacienienie w tunelu } switch (t1->eEnvironment) - { // typ zmiany oświetlenia - zakładam, że pierwszy tor ma e_flat + { // typ zmiany oświetlenia - zakładam, że + // pierwszy tor ma e_flat case e_canyon: fShade = d + (1.0 - d) * 0.65; break; // zacienienie w kanionie @@ -2127,15 +2217,19 @@ void TDynamicObject::Move(double fDistance) }; void TDynamicObject::AttachPrev(TDynamicObject *Object, int iType) -{ // Ra: doczepia Object na końcu składu (nazwa funkcji może być myląca) +{ // Ra: doczepia Object na końcu + // składu (nazwa funkcji może być + // myląca) // Ra: używane tylko przy wczytywaniu scenerii /* - //Ra: po wstawieniu pojazdu do scenerii nie miał on ustawionej pozycji, teraz już ma + //Ra: po wstawieniu pojazdu do scenerii nie miał on ustawionej pozycji, teraz + już ma TLocation loc; loc.X=-vPosition.x; loc.Y=vPosition.z; loc.Z=vPosition.y; - MoverParameters->Loc=loc; //Ra: do obliczania sprzęgów, na starcie nie są przesunięte + MoverParameters->Loc=loc; //Ra: do obliczania sprzęgów, na starcie nie są + przesunięte loc.X=-Object->vPosition.x; loc.Y=Object->vPosition.z; loc.Z=Object->vPosition.y; @@ -2168,8 +2262,9 @@ void TDynamicObject::AttachPrev(TDynamicObject *Object, int iType) Object->NextConnected = this; // on ma nas z tyłu Object->NextConnectedNo = iDirection; } - if (MoverParameters->TrainType & - dt_EZT) // w przypadku łączenia członów, światła w rozrządczym zależą od stanu w silnikowym + if (MoverParameters->TrainType & dt_EZT) // w przypadku łączenia członów, + // światła w rozrządczym zależą od + // stanu w silnikowym if (MoverParameters->Couplers[iDirection].AllowedFlag & ctrain_depot) // gdy sprzęgi łączone warsztatowo (powiedzmy) if ((MoverParameters->Power < 1.0) && @@ -2210,7 +2305,8 @@ void TDynamicObject::LoadUpdate() mdLoad = TModelsManager::GetModel(asLoadName.c_str()); // nowy ładunek Global::asCurrentTexturePath = AnsiString(szTexturePath); // z powrotem defaultowa sciezka do tekstur - // Ra: w MMD można by zapisać położenie modelu ładunku (np. węgiel) w zależności od + // Ra: w MMD można by zapisać położenie modelu ładunku (np. węgiel) w + // zależności od // załadowania } else if (MoverParameters->Load == 0) @@ -2326,9 +2422,11 @@ bool TDynamicObject::Update(double dt, double dt1) return false; // a normalnie powinny mieć bEnabled==false // Ra: przeniosłem - no już lepiej tu, niż w wyświetlaniu! - // if ((MoverParameters->ConverterFlag==false) && (MoverParameters->TrainType!=dt_ET22)) + // if ((MoverParameters->ConverterFlag==false) && + // (MoverParameters->TrainType!=dt_ET22)) // Ra: to nie może tu być, bo wyłącza sprężarkę w rozrządczym EZT! - // if ((MoverParameters->ConverterFlag==false)&&(MoverParameters->CompressorPower!=0)) + // if + // ((MoverParameters->ConverterFlag==false)&&(MoverParameters->CompressorPower!=0)) // MoverParameters->CompressorFlag=false; // if (MoverParameters->CompressorPower==2) // MoverParameters->CompressorAllow=MoverParameters->ConverterFlag; @@ -2338,12 +2436,16 @@ bool TDynamicObject::Update(double dt, double dt1) (MoverParameters->Power > 1.0)) // aby rozrządczy nie opuszczał silnikowemu if ((MechInside) || (MoverParameters->TrainType == dt_EZT)) { - // if ((!MoverParameters->PantCompFlag)&&(MoverParameters->CompressedVolume>=2.8)) + // if + // ((!MoverParameters->PantCompFlag)&&(MoverParameters->CompressedVolume>=2.8)) // MoverParameters->PantVolume=MoverParameters->CompressedVolume; if (MoverParameters->PantPress < (MoverParameters->TrainType == dt_EZT ? 2.4 : 3.5)) - { // 3.5 wg http://www.transportszynowy.pl/eu06-07pneumat.php - //"Wyłączniki ciśnieniowe odbieraków prądu wyłączają sterowanie wyłącznika szybkiego - // oraz uniemożliwiają podniesienie odbieraków prądu, gdy w instalacji rozrządu + { // 3.5 wg + // http://www.transportszynowy.pl/eu06-07pneumat.php + //"Wyłączniki ciśnieniowe odbieraków prądu wyłączają sterowanie + // wyłącznika szybkiego + // oraz uniemożliwiają podniesienie odbieraków prądu, gdy w instalacji + // rozrządu // ciśnienie spadnie poniżej wartości 3,5 bara." // Ra 2013-12: Niebugocław mówi, że w EZT podnoszą się przy 2.5 // if (!MoverParameters->PantCompFlag) @@ -2369,24 +2471,29 @@ bool TDynamicObject::Update(double dt, double dt1) // TTrackShape ts; // ts.R=MyTrack->fRadius; // if (ABuGetDirection()<0) ts.R=-ts.R; - // ts.R=MyTrack->fRadius; //ujemne promienie są już zamienione przy wczytywaniu + // ts.R=MyTrack->fRadius; //ujemne promienie są już zamienione przy + // wczytywaniu if (Axle0.vAngles.z != Axle1.vAngles.z) - { // wyliczenie promienia z obrotów osi - modyfikację zgłosił youBy + { // wyliczenie promienia z obrotów + // osi - modyfikację zgłosił youBy ts.R = Axle0.vAngles.z - Axle1.vAngles.z; // różnica może dawać stałą ±M_2PI if (ts.R > M_PI) ts.R -= M_2PI else if (ts.R < -M_PI) ts.R += M_2PI; // normalizacja // ts.R=fabs(0.5*MoverParameters->BDist/sin(ts.R*0.5)); ts.R = -0.5 * MoverParameters->BDist / sin(ts.R * 0.5); if ((ts.R > 15000.0) || (ts.R < -15000.0)) - ts.R = 0.0; // szkoda czasu na zbyt duże promienie, 4km to promień nie wymagający + ts.R = 0.0; // szkoda czasu na zbyt duże promienie, 4km to promień nie + // wymagający // przechyłki } else ts.R = 0.0; // ts.R=ComputeRadius(Axle1.pPosition,Axle2.pPosition,Axle3.pPosition,Axle0.pPosition); - // Ra: składową pochylenia wzdłużnego mamy policzoną w jednostkowym wektorze vFront + // Ra: składową pochylenia wzdłużnego mamy policzoną w jednostkowym wektorze + // vFront ts.Len = 1.0; // Max0R(MoverParameters->BDist,MoverParameters->ADist); - ts.dHtrack = -vFront.y; // Axle1.pPosition.y-Axle0.pPosition.y; //wektor między skrajnymi osiami + ts.dHtrack = -vFront.y; // Axle1.pPosition.y-Axle0.pPosition.y; //wektor + // między skrajnymi osiami // (!!!odwrotny) ts.dHrail = (Axle1.GetRoll() + Axle0.GetRoll()) * 0.5; //średnia przechyłka pudła // TTrackParam tp; @@ -2406,7 +2513,8 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->InsideConsist = false; } // napiecie sieci trakcyjnej - // Ra 15-01: przeliczenie poboru prądu powinno być robione wcześniej, żeby na tym etapie były + // Ra 15-01: przeliczenie poboru prądu powinno być robione wcześniej, żeby na + // tym etapie były // znane napięcia // TTractionParam tmpTraction; // tmpTraction.TractionVoltage=0; @@ -2419,8 +2527,9 @@ bool TDynamicObject::Update(double dt, double dt1) { v = MoverParameters->PantFrontVolt; if (v == 0.0) - if (MoverParameters->TrainType & - (dt_EZT | dt_ET40 | dt_ET41 | dt_ET42)) // dwuczłony mogą mieć sprzęg WN + if ((MoverParameters->TrainType & (dt_EZT | dt_ET40 | dt_ET41 | dt_ET42)) && + MoverParameters->EngineType != + ElectricInductionMotor) // dwuczłony mogą mieć sprzęg WN v = MoverParameters->GetTrainsetVoltage(); // ostatnia szansa } if (v != 0.0) @@ -2439,20 +2548,24 @@ bool TDynamicObject::Update(double dt, double dt1) {//wspomagacz usuwania problemów z siecią if (!Global::iPause) {//Ra: tymczasowa teleportacja do miejsca, gdzie brakuje prądu - Global::SetCameraPosition(vPosition+vector3(0,0,5)); //nowa pozycja dla + Global::SetCameraPosition(vPosition+vector3(0,0,5)); //nowa + pozycja dla generowania obiektów Global::pCamera->Init(vPosition+vector3(0,0,5),Global::pFreeCameraInitAngle[0]); //przestawienie } - Global:l::pGround->Silence(Global::pCamera->Pos); //wyciszenie wszystkiego + Global:l::pGround->Silence(Global::pCamera->Pos); //wyciszenie + wszystkiego z poprzedniej pozycji - Globa:iPause|=1; //tymczasowe zapauzowanie, gdy problem z siecią + Globa:iPause|=1; //tymczasowe zapauzowanie, gdy problem z + siecią } */ NoVoltTime = NoVoltTime + dt; if (NoVoltTime > 0.2) // jeśli brak zasilania dłużej niż 0.2 sekundy (25km/h pod // izolatorem daje 0.15s) - { // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało WS pod + { // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało + // WS pod // izolatorem if (MoverParameters->Vel > 0.5) // jeśli jedzie if (MoverParameters->PantFrontUp || @@ -2480,14 +2593,16 @@ bool TDynamicObject::Update(double dt, double dt1) // "+FloatToStrF(vPosition.z,ffFixed,7,2)+", time // "+FloatToStrF(NoVoltTime,ffFixed,7,2)); } - // Ra 2F1H: nie było sensu wpisywać tu zera po upływie czasu, bo zmienna była + // Ra 2F1H: nie było sensu wpisywać tu zera po upływie czasu, bo + // zmienna była // tymczasowa, a napięcie zerowane od razu tmpTraction.TractionVoltage = 0; // Ra 2013-12: po co tak? // pControlled->MainSwitch(false); //może tak? } } } - // else //Ra: nie no, trzeba podnieść pantografy, jak nie będzie drutu, to będą miały prąd + // else //Ra: nie no, trzeba podnieść pantografy, jak nie będzie drutu, to + // będą miały prąd // po osiągnięciu 1.4m // tmpTraction.TractionVoltage=0.95*MoverParameters->EnginePowerSource.MaxVoltage; } @@ -2498,16 +2613,29 @@ bool TDynamicObject::Update(double dt, double dt1) tmpTraction.TractionResistivity = 0.3; // McZapkie: predkosc w torze przekazac do TrackParam - // McZapkie: Vel ma wymiar [km/h] (absolutny), V ma wymiar [m/s], taka przyjalem notacje + // McZapkie: Vel ma wymiar [km/h] (absolutny), V ma wymiar [m/s], taka + // przyjalem notacje tp.Velmax = MyTrack->VelocityGet(); if (Mechanik) { // Ra 2F3F: do Driver.cpp to przenieść? MoverParameters->EqvtPipePress = GetEPP(); // srednie cisnienie w PG if ((Mechanik->Primary()) && - (MoverParameters->EngineType == - ElectricInductionMotor)) // jesli glowny i z asynchronami, to niech steruje + (MoverParameters->EngineType == ElectricInductionMotor)) // jesli glowny i z + // asynchronami, to + // niech steruje { // hamulcem lacznie dla calego pociagu/ezt + float FED = 0; + float np = 0; + float masa = 0; + float FrED = 0; + float masamax = 0; + float FmaxPN = 0; + float FmaxED = 0; + float Fzad = 0; + float FzadED = 0; + float FzadPN = 0; + float amax = 0; // 1. ustal wymagana sile hamowania calego pociagu // - opoznienie moze byc ustalane na podstawie charakterystyki // - opoznienie moze byc ustalane na podstawie mas i cisnien granicznych @@ -2515,9 +2643,39 @@ bool TDynamicObject::Update(double dt, double dt1) // 2. ustal mozliwa do realizacji sile hamowania ED // - w szczegolnosci powinien brac pod uwage rozne sily hamowania - float FED = 0; - // for(TDynamicObject *p=GetFirstDynamic(4);p;p->NextC(4)) - // FED+=p->MoverParameters->eimv[eimv_Fmax]; + for (TDynamicObject *p = GetFirstDynamic(MoverParameters->ActiveCab < 0 ? 1 : 0); p; + p = p->NextC(4)) + { + np++; + masamax += p->MoverParameters->MBPM + + (p->MoverParameters->MBPM > 1 ? 0 : p->MoverParameters->Mass) + + p->MoverParameters->Mred; + float Nmax = ((p->MoverParameters->P2FTrans * p->MoverParameters->MaxBrakePress[0] - + p->MoverParameters->BrakeCylSpring) * + p->MoverParameters->BrakeCylMult[0] - + p->MoverParameters->BrakeSlckAdj) * + p->MoverParameters->BrakeCylNo * p->MoverParameters->BrakeRigEff; + FmaxPN += Nmax * + p->MoverParameters->Hamulec->GetFC( + Nmax / (p->MoverParameters->NAxles * p->MoverParameters->NBpA), + p->MoverParameters->Vmax) * + 1000; // sila hamowania pn + FmaxED += ((p->MoverParameters->Mains) && (p->MoverParameters->eimc[eimc_p_Fh] * + p->MoverParameters->NPoweredAxles > + 0) ? + p->MoverParameters->eimc[eimc_p_Fh] * 1000 : + 0); // chwilowy max ED -> do rozdzialu sil + FED -= Min0R(p->MoverParameters->eimv[eimv_Fmax], 0) * + 1000; // chwilowy max ED -> do rozdzialu sil + FrED -= Min0R(p->MoverParameters->eimv[eimv_Fr], 0) * + 1000; // chwilowo realizowane ED -> do pneumatyki + masa += p->MoverParameters->TotalMass; + } + amax = FmaxPN / masamax; + Fzad = amax * MoverParameters->LocalBrakeRatio() * masa; + FzadED = Min0R(Fzad, FmaxED); + FzadPN = Fzad - FrED; + np = 0; // 3. ustaw pojazdom sile hamowania ED // - proporcjonalnie do mozliwosci @@ -2526,8 +2684,31 @@ bool TDynamicObject::Update(double dt, double dt1) // 5. w razie potrzeby wlacz hamulec utrzymujacy // - gdy zahamowany ma ponizej 2 km/h // 6. ustaw pojazdom sile hamowania ep - // - proporcjonalnie do masy, do liczby osi, rowne cisnienia - jak bedzie, tak bedzie + // - proporcjonalnie do masy, do liczby osi, rowne cisnienia - jak + // bedzie, tak bedzie // dobrze + float Fpoj = 0; + for (TDynamicObject *p = GetFirstDynamic(MoverParameters->ActiveCab < 0 ? 1 : 0); p; + p = p->NextC(4)) + { + np++; + float Nmax = ((p->MoverParameters->P2FTrans * p->MoverParameters->MaxBrakePress[0] - + p->MoverParameters->BrakeCylSpring) * + p->MoverParameters->BrakeCylMult[0] - + p->MoverParameters->BrakeSlckAdj) * + p->MoverParameters->BrakeCylNo * p->MoverParameters->BrakeRigEff; + float FmaxPoj = Nmax * + p->MoverParameters->Hamulec->GetFC( + Nmax / (p->MoverParameters->NAxles * p->MoverParameters->NBpA), + p->MoverParameters->Vel) * + 1000; // sila hamowania pn + // Fpoj=(FED>0?-FzadED*p->MoverParameters->eimv[eimv_Fmax]*1000/FED:0); + // p->MoverParameters->AnPos=(p->MoverParameters->eimc[eimc_p_Fh]>1?0.001f*Fpoj/(p->MoverParameters->eimc[eimc_p_Fh]):0); + p->MoverParameters->AnPos = (FmaxED > 0 ? FzadED / FmaxED : 0); + Fpoj = FzadPN * Min0R(p->MoverParameters->TotalMass / masa, 1); + p->MoverParameters->LocalBrakePosA = + (p->MoverParameters->SlippingWheels ? 0 : Min0R(Max0R(Fpoj / FmaxPoj, 0), 1)); + } } // yB: cos (AI) tu jest nie kompatybilne z czyms (hamulce) @@ -2546,14 +2727,16 @@ bool TDynamicObject::Update(double dt, double dt1) if ((!MoverParameters->Battery) && (Controller == Humandriver) && (MoverParameters->EngineType != DieselEngine) && (MoverParameters->EngineType != 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)) // wyłączyć zasilanie MoverParameters->EventFlag = true; } if (MoverParameters->TrainType == dt_ET42) { // powinny być wszystkie dwuczłony oraz EZT /* - //Ra: to jest bez sensu, bo wyłącza WS przy przechodzeniu przez "wewnętrzne" kabiny (z + //Ra: to jest bez sensu, bo wyłącza WS przy przechodzeniu przez + "wewnętrzne" kabiny (z powodu ActiveCab) //trzeba to zrobić inaczej, np. dla członu A sprawdzać, czy jest B //albo sprawdzać w momencie załączania WS i zmiany w sprzęgach @@ -2608,7 +2791,8 @@ bool TDynamicObject::Update(double dt, double dt1) else if (MyTrack->eEnvironment == e_bridge) { vol *= 1.2; - // freq=0.99; //MC: stukot w zaleznosci od tego gdzie + // freq=0.99; //MC: stukot w zaleznosci od + // tego gdzie // jest tor } if (MyTrack->fSoundDistance != dRailLength) @@ -2682,13 +2866,15 @@ bool TDynamicObject::Update(double dt, double dt1) // fragment z EXE Kursa /* if (MoverParameters->TrainType==dt_ET42) { - if ((MoverParameters->DynamicBrakeType=dbrake_switch) && ((MoverParameters->BrakePress > + if ((MoverParameters->DynamicBrakeType=dbrake_switch) && + ((MoverParameters->BrakePress > 0.2) || ( MoverParameters->PipePress < 0.36 ))) { MoverParameters->StLinFlag=true; } else - if ((MoverParameters->DynamicBrakeType=dbrake_switch) && (MoverParameters->BrakePress < + if ((MoverParameters->DynamicBrakeType=dbrake_switch) && + (MoverParameters->BrakePress < 0.1)) { MoverParameters->StLinFlag=false; @@ -2696,7 +2882,8 @@ bool TDynamicObject::Update(double dt, double dt1) } } */ if ((MoverParameters->TrainType == dt_ET40) || (MoverParameters->TrainType == dt_EP05)) - { // dla ET40 i EU05 automatyczne cofanie nastawnika - i tak nie będzie to działać dobrze... + { // dla ET40 i EU05 automatyczne cofanie nastawnika - i tak + // nie będzie to działać dobrze... /* if ((MoverParameters->MainCtrlPos>MoverParameters->MainCtrlActualPos)&&(abs(MoverParameters->Im)>MoverParameters->IminHi)) { @@ -2728,23 +2915,25 @@ bool TDynamicObject::Update(double dt, double dt1) if (dWheelAngle[2] > 360.0) dWheelAngle[2] -= 360.0; } - if (pants) // pantograf może być w wagonie kuchennym albo pojeździe rewizyjnym (np. SR61) + if (pants) // pantograf może być w wagonie kuchennym albo pojeździe rewizyjnym + // (np. SR61) { // przeliczanie kątów dla pantografów double k; // tymczasowy kąt double PantDiff; TAnimPant *p; // wskaźnik do obiektu danych pantografu - double fCurrent = - (MoverParameters->DynamicBrakeFlag && MoverParameters->ResistorsFlag ? - 0 : - fabs(MoverParameters->Itot)) + - MoverParameters - ->TotalCurrent; // prąd pobierany przez pojazd - bez sensu z tym (TotalCurrent) - // fCurrent+=fabs(MoverParameters->Voltage)*1e-6; //prąd płynący przez woltomierz, + double fCurrent = (MoverParameters->DynamicBrakeFlag && MoverParameters->ResistorsFlag ? + 0 : + fabs(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 + // woltomierz, // rozładowuje kondensator orgromowy 4µF double fPantCurrent = fCurrent; // normalnie cały prąd przez jeden pantograf if (pants) - if (iAnimType[ANIM_PANTS] > - 1) // a jeśli są dwa pantografy //Ra 1014-11: proteza, trzeba zrobić sensowniej + if (iAnimType[ANIM_PANTS] > 1) // a jeśli są dwa pantografy //Ra 1014-11: + // proteza, trzeba zrobić sensowniej if (pants[0].fParamPants->hvPowerWire && pants[1].fParamPants->hvPowerWire) // i oba podłączone do drutów fPantCurrent = fCurrent * 0.5; // to dzielimy prąd równo na oba (trochę bez @@ -2783,7 +2972,8 @@ bool TDynamicObject::Update(double dt, double dt1) if ((MoverParameters->PantFrontVolt == 0.0) && (MoverParameters->PantRearVolt == 0.0)) sPantUp.Play(vol, 0, MechInside, vPosition); - if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i + if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na + // pantograf i // wstawić do GetVoltage() { MoverParameters->PantFrontVolt = @@ -2807,7 +2997,8 @@ bool TDynamicObject::Update(double dt, double dt1) if ((MoverParameters->PantRearVolt == 0.0) && (MoverParameters->PantFrontVolt == 0.0)) sPantUp.Play(vol, 0, MechInside, vPosition); - if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i + if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na + // pantograf i // wstawić do GetVoltage() { MoverParameters->PantRearVolt = @@ -2822,9 +3013,11 @@ bool TDynamicObject::Update(double dt, double dt1) break; } // pozostałe na razie nie obsługiwane if (MoverParameters->PantPress > - (MoverParameters->TrainType == dt_EZT ? - 2.5 : - 3.3)) // Ra 2013-12: Niebugocław mówi, że w EZT podnoszą się przy 2.5 + (MoverParameters->TrainType == dt_EZT ? 2.5 : 3.3)) // Ra 2013-12: + // Niebugocław + // mówi, że w EZT + // podnoszą się + // przy 2.5 pantspeedfactor = 0.015 * (MoverParameters->PantPress) * dt1; // z EXE Kursa //Ra: wysokość zależy od ciśnienia !!! else @@ -2836,21 +3029,26 @@ 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 + // 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 + { // 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ć } @@ -2888,7 +3086,8 @@ bool TDynamicObject::Update(double dt, double dt1) MoverParameters->PantRearSP = true; } if (MoverParameters->EnginePowerSource.SourceType == CurrentCollector) - { // Winger 240404 - wylaczanie sprezarki i przetwornicy przy braku napiecia + { // Winger 240404 - wylaczanie sprezarki i + // przetwornicy przy braku napiecia if (tmpTraction.TractionVoltage == 0) { // to coś wyłączało dźwięk silnika w ST43! MoverParameters->ConverterFlag = false; @@ -2901,7 +3100,8 @@ bool TDynamicObject::Update(double dt, double dt1) if (MoverParameters->EnginePowerSource.PowerType == SteamPower) // if (smPatykird1[0]) { // Ra: animacja rozrządu parowozu, na razie nieoptymalizowane - /* //Ra: tymczasowo wyłączone ze względu na porządkowanie animacji pantografów + /* //Ra: tymczasowo wyłączone ze względu na porządkowanie animacji + pantografów double fi,dx,c2,ka,kc; double sin_fi,cos_fi; double L1=1.6688888888888889; @@ -2913,10 +3113,12 @@ bool TDynamicObject::Update(double dt, double dt1) //ruch tłoków oraz korbowodów for (int i=0;i<=1;++i) {//obie strony w ten sam sposób - fi=DegToRad(dWheelAngle[1]+(i?pant2x:pant1x)); //kąt obrotu koła dla tłoka 1 + fi=DegToRad(dWheelAngle[1]+(i?pant2x:pant1x)); //kąt obrotu koła dla + tłoka 1 sin_fi=sin(fi); cos_fi=cos(fi); - dx=panty*cos_fi+sqrt(panth*panth-panty*panty*sin_fi*sin_fi)-panth; //nieoptymalne + dx=panty*cos_fi+sqrt(panth*panth-panty*panty*sin_fi*sin_fi)-panth; + //nieoptymalne if (smPatykird1[i]) //na razie zabezpieczenie smPatykird1[i]->SetTranslate(float3(dx,0,0)); ka=-asin(panty/panth)*sin_fi; @@ -2924,7 +3126,8 @@ bool TDynamicObject::Update(double dt, double dt1) smPatykirg1[i]->SetRotateXYZ(vector3(RadToDeg(ka),0,0)); //smPatykirg1[0]->SetRotate(float3(0,1,0),RadToDeg(fi)); //obracamy //ruch drążka mimośrodkowego oraz jarzma - //korzystałem z pliku PDF "mm.pdf" (opis czworoboku korbowo-wahaczowego): + //korzystałem z pliku PDF "mm.pdf" (opis czworoboku + korbowo-wahaczowego): //"MECHANIKA MASZYN. Szkic wykładu i laboratorium komputerowego." //Prof. dr hab. inż. Jerzy Zajączkowski, 2007, Politechnika Łódzka //L1 - wysokość (w pionie) osi jarzma ponad osią koła @@ -2938,11 +3141,14 @@ bool TDynamicObject::Update(double dt, double dt1) //G1=(Lr*Lr+L1*L1+L2*L2+Kc*Lc-L*L-2.0*Lc*L2*cos(fi)+2.0*Lc*L1*sin(fi))/(Lr*Lr); //G2=2.0*(L2-Lc*cos(fi))/Lr; //G3=2.0*(L1-Lc*sin(fi))/Lr; - fi=DegToRad(dWheelAngle[1]+(i?pant2x:pant1x)-96.77416667); //kąt obrotu koła dla + fi=DegToRad(dWheelAngle[1]+(i?pant2x:pant1x)-96.77416667); //kąt + obrotu koła dla tłoka 1 - //1) dla dWheelAngle[1]=0° korba jest w dół, a mimośród w stronę jarzma, czyli + //1) dla dWheelAngle[1]=0° korba jest w dół, a mimośród w stronę + jarzma, czyli fi=-7° - //2) dla dWheelAngle[1]=90° korba jest do tyłu, a mimośród w dół, czyli fi=83° + //2) dla dWheelAngle[1]=90° korba jest do tyłu, a mimośród w dół, + czyli fi=83° sin_fi=sin(fi); cos_fi=cos(fi); G1=(1.0+L1*L1+L2*L2+Lc*Lc-L*L-2.0*Lc*L2*cos_fi+2.0*Lc*L1*sin_fi); @@ -2951,17 +3157,23 @@ bool TDynamicObject::Update(double dt, double dt1) G2_2=G2*G2; G3=2.0*(L1-Lc*sin_fi); G3_2=G3*G3; - sin_ksi=(G1*G2-G3*_fm_sqrt(G2_2+G3_2-G1_2))/(G2_2+G3_2); //x1 (minus delta) + sin_ksi=(G1*G2-G3*_fm_sqrt(G2_2+G3_2-G1_2))/(G2_2+G3_2); //x1 (minus + delta) ksi=asin(sin_ksi); //kąt jarzma if (smPatykirg2[i]) - smPatykirg2[i]->SetRotateXYZ(vector3(RadToDeg(ksi),0,0)); //obrócenie jarzma + smPatykirg2[i]->SetRotateXYZ(vector3(RadToDeg(ksi),0,0)); //obrócenie + jarzma //1) ksi=-23°, gam= //2) ksi=10°, gam= - //gam=acos((L2-sin_ksi-Lc*cos_fi)/L); //kąt od poziomu, liczony względem poziomu - //gam=asin((L1-cos_ksi-Lc*sin_fi)/L); //kąt od poziomu, liczony względem pionu - gam=atan2((L1-cos(ksi)+Lc*sin_fi),(L2-sin_ksi+Lc*cos_fi)); //kąt od poziomu + //gam=acos((L2-sin_ksi-Lc*cos_fi)/L); //kąt od poziomu, liczony + względem poziomu + //gam=asin((L1-cos_ksi-Lc*sin_fi)/L); //kąt od poziomu, liczony + względem pionu + gam=atan2((L1-cos(ksi)+Lc*sin_fi),(L2-sin_ksi+Lc*cos_fi)); //kąt od + poziomu if (smPatykird2[i]) //na razie zabezpieczenie - smPatykird2[i]->SetRotateXYZ(vector3(RadToDeg(-gam-ksi),0,0)); //obrócenie drążka + smPatykird2[i]->SetRotateXYZ(vector3(RadToDeg(-gam-ksi),0,0)); + //obrócenie drążka mimośrodowego } */ @@ -2986,13 +3198,17 @@ bool TDynamicObject::Update(double dt, double dt1) } // ABu-160303 sledzenie toru przed obiektem: ******************************* - // Z obserwacji: v>0 -> Coupler 0; v<0 ->coupler1 (Ra: prędkość jest związana z pojazdem) - // Rozroznienie jest tutaj, zeby niepotrzebnie nie skakac do funkcji. Nie jest uzaleznione + // Z obserwacji: v>0 -> Coupler 0; v<0 ->coupler1 (Ra: prędkość jest związana + // z pojazdem) + // Rozroznienie jest tutaj, zeby niepotrzebnie nie skakac do funkcji. Nie jest + // uzaleznione // od obecnosci AI, zeby uwzglednic np. jadace bez lokomotywy wagony. - // Ra: można by przenieść na poziom obiektu reprezentującego skład, aby nie sprawdzać środkowych + // Ra: można by przenieść na poziom obiektu reprezentującego skład, aby nie + // sprawdzać środkowych if (CouplCounter > 25) // licznik, aby nie robić za każdym razem { // poszukiwanie czegoś do zderzenia się - fTrackBlock = 10000.0; // na razie nie ma przeszkód (na wypadek nie uruchomienia skanowania) + fTrackBlock = 10000.0; // na razie nie ma przeszkód (na wypadek nie + // uruchomienia skanowania) // jeśli nie ma zwrotnicy po drodze, to tylko przeliczyć odległość? if (MoverParameters->V > 0.03) //[m/s] jeśli jedzie do przodu (w kierunku Coupler 0) { @@ -3016,7 +3232,8 @@ bool TDynamicObject::Update(double dt, double dt1) ++CouplCounter; // jazda sprzyja poszukiwaniu połączenia else { - CouplCounter = 25; // a bezruch nie, ale trzeba zaktualizować odległość, bo zawalidroga może + CouplCounter = 25; // a bezruch nie, ale trzeba zaktualizować odległość, bo + // zawalidroga może // sobie pojechać } if (MoverParameters->DerailReason > 0) @@ -3089,7 +3306,8 @@ bool TDynamicObject::FastUpdate(double dt) //}; void TDynamicObject::TurnOff() -{ // wyłączenie rysowania submodeli zmiennych dla egemplarza pojazdu +{ // wyłączenie rysowania submodeli zmiennych dla + // egemplarza pojazdu btnOn = false; btCoupler1.TurnOff(); btCoupler2.TurnOff(); @@ -3134,7 +3352,8 @@ void TDynamicObject::Render() if (ObjSqrDist < 500) // jak jest blisko - do 70m modelrotate = 0.01; // mały kąt, żeby nie znikało else - { // Global::pCameraRotation to kąt bewzględny w świecie (zero - na północ) + { // Global::pCameraRotation to kąt bewzględny w świecie (zero - na + // północ) tempangle = (vPosition - Global::pCameraPosition); // wektor od kamery modelrotate = ABuAcos(tempangle); // określenie kąta // if (modelrotate>M_PI) modelrotate-=(2*M_PI); @@ -3164,7 +3383,8 @@ void TDynamicObject::Render() // ActualTrack= GetTrack(); //McZapkie-240702 #if RENDER_CONE - { // Ra: testowe renderowanie pozycji wózków w postaci ostrosłupów, wymaga GLUT32.DLL + { // Ra: testowe renderowanie pozycji wózków w postaci ostrosłupów, wymaga + // GLUT32.DLL double dir = RadToDeg(atan2(vLeft.z, vLeft.x)); Axle0.Render(0); Axle1.Render(1); // bogieRot[0] @@ -3178,11 +3398,13 @@ void TDynamicObject::Render() if (this == Global::pUserDynamic) { // specjalne ustawienie, aby nie trzęsło if (Global::bSmudge) - { // jak jest widoczna smuga, to pojazd renderować po wyrenderowaniu smugi + { // jak jest widoczna smuga, to pojazd renderować po + // wyrenderowaniu smugi glPopMatrix(); // a to trzeba zebrać przed wyjściem return; } - // if (Global::pWorld->) //tu trzeba by ustawić animacje na modelu zewnętrznym + // if (Global::pWorld->) //tu trzeba by ustawić animacje na modelu + // zewnętrznym glLoadIdentity(); // zacząć od macierzy jedynkowej Global::pCamera->SetCabMatrix(vPosition); // specjalne ustawienie kamery } @@ -3234,7 +3456,8 @@ void TDynamicObject::Render() // Ra: dlaczego jest zablokowana w przezroczystych? if (mdKabina) // jeśli ma model kabiny if ((mdKabina != mdModel) && bDisplayCab && FreeFlyModeFlag) - { // rendering kabiny gdy jest oddzielnym modelem i ma byc wyswietlana + { // rendering kabiny gdy jest oddzielnym modelem i + // ma byc wyswietlana // ABu: tylko w trybie FreeFly, zwykly tryb w world.cpp // Ra: świetła są ustawione dla zewnętrza danego pojazdu // oswietlenie kabiny @@ -3293,7 +3516,9 @@ void TDynamicObject::Render() }; void TDynamicObject::RenderSounds() -{ // przeliczanie dźwięków, bo będzie słychać bez wyświetlania sektora z pojazdem +{ // przeliczanie dźwięków, bo będzie + // słychać bez wyświetlania sektora z + // pojazdem // McZapkie-010302: ulepszony dzwiek silnika double freq; double vol = 0; @@ -3304,10 +3529,11 @@ void TDynamicObject::RenderSounds() if (MoverParameters->Power > 0) { - if ((rsSilnik.AM != 0) && - ((MoverParameters->Mains) || - (MoverParameters->EngineType == - DieselEngine))) // McZapkie-280503: zeby dla dumb dzialal silnik na jalowych obrotach + if ((rsSilnik.AM != 0) && ((MoverParameters->Mains) || (MoverParameters->EngineType == + DieselEngine))) // McZapkie-280503: + // zeby dla dumb + // dzialal silnik na + // jalowych obrotach { if ((fabs(MoverParameters->enrot) > 0.01) || (MoverParameters->EngineType == Dumb)) //&& (MoverParameters->EnginePower>0.1)) @@ -3369,7 +3595,8 @@ void TDynamicObject::RenderSounds() } if ((MoverParameters->DynamicBrakeFlag) && (MoverParameters->EnginePower > 0.1) && (MoverParameters->EngineType == - ElectricSeriesMotor)) // Szociu - 29012012 - jeżeli uruchomiony jest hamulec + ElectricSeriesMotor)) // Szociu - 29012012 - jeżeli uruchomiony + // jest hamulec // elektrodynamiczny, odtwarzany jest dźwięk silnika vol += 0.8; @@ -3449,7 +3676,8 @@ void TDynamicObject::RenderSounds() else rscurve.Stop(); - // McZapkie-280302 - pisk mocno zacisnietych hamulcow - trzeba jeszcze zabezpieczyc przed + // McZapkie-280302 - pisk mocno zacisnietych hamulcow - trzeba jeszcze + // zabezpieczyc przed // brakiem deklaracji w mmedia.dta if (rsPisk.AM != 0) { @@ -3463,9 +3691,12 @@ void TDynamicObject::RenderSounds() rsPisk.Stop(); } - // if ((MoverParameters->ConverterFlag==false) && (MoverParameters->TrainType!=dt_ET22)) - // if ((MoverParameters->ConverterFlag==false)&&(MoverParameters->CompressorPower!=0)) - // MoverParameters->CompressorFlag=false; //Ra: wywalić to stąd, tu tylko dla wyświetlanych! + // if ((MoverParameters->ConverterFlag==false) && + // (MoverParameters->TrainType!=dt_ET22)) + // if + // ((MoverParameters->ConverterFlag==false)&&(MoverParameters->CompressorPower!=0)) + // MoverParameters->CompressorFlag=false; //Ra: wywalić to stąd, tu tylko dla + // wyświetlanych! // Ra: no to już wiemy, dlaczego pociągi jeżdżą lepiej, gdy się na nie patrzy! // if (MoverParameters->CompressorPower==2) // MoverParameters->CompressorAllow=MoverParameters->ConverterFlag; @@ -3487,8 +3718,8 @@ void TDynamicObject::RenderSounds() // youBy - przenioslem, bo diesel tez moze miec turbo if ((MoverParameters->MainCtrlPos) >= - (MoverParameters - ->TurboTest)) // hunter-250312: dlaczego zakomentowane? Ra: bo nie działało dobrze + (MoverParameters->TurboTest)) // hunter-250312: dlaczego zakomentowane? + // Ra: bo nie działało dobrze { // udawanie turbo: (6.66*(eng_vol-0.85)) if (eng_turbo > 6.66 * (enginevolume - 0.8) + 0.2 * dt) @@ -3736,7 +3967,7 @@ void TDynamicObject::RenderAlpha() mdKabina->RenderAlpha(ObjSqrDist,0); //smierdzi - // mdModel->RenderAlpha(SquareMagnitude(Global::pCameraPosition-pos),0); + // mdModel->RenderAlpha(SquareMagnitude(Global::pCameraPosition-pos),0); glLightfv(GL_LIGHT0,GL_AMBIENT,Global::ambientDayLight); glLightfv(GL_LIGHT0,GL_DIFFUSE,Global::diffuseDayLight); @@ -3809,7 +4040,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, asModel = asModel.SubString(1, asModel.Length() - 1); } if ((i = asModel.Pos(",")) > 0) - { // Ra 2015-01: może szukać przecinka w nazwie modelu, a po przecinku była by liczba + { // Ra 2015-01: może szukać przecinka w + // nazwie modelu, a po przecinku była by + // liczba // tekstur? if (i < asModel.Length()) iMultiTex = asModel[i + 1] - '0'; @@ -3818,8 +4051,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, else if (iMultiTex > 1) iMultiTex = 1; // na razie ustawiamy na 1 } - asModel = BaseDir + - asModel; // McZapkie 2002-07-20: dynamics maja swoje modele w dynamics/basedir + asModel = BaseDir + asModel; // McZapkie 2002-07-20: dynamics maja swoje + // modele w dynamics/basedir Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/... mdModel = TModelsManager::GetModel(asModel.c_str(), true); if (ReplacableSkin != AnsiString("none")) @@ -3924,19 +4157,23 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, iAlpha = 0x31310031; // tekstura -1 z kanałem alfa - nie renderować w cyklu // nieprzezroczystych else - iAlpha = 0x30300030; // wszystkie tekstury nieprzezroczyste - nie renderować w + iAlpha = 0x30300030; // wszystkie tekstury nieprzezroczyste - nie + // renderować w // cyklu przezroczystych if (ReplacableSkinID[2]) if (TTexturesManager::GetAlpha(ReplacableSkinID[2])) - iAlpha |= 0x02020002; // tekstura -2 z kanałem alfa - nie renderować w cyklu + iAlpha |= 0x02020002; // tekstura -2 z kanałem alfa - nie renderować + // w cyklu // nieprzezroczystych if (ReplacableSkinID[3]) if (TTexturesManager::GetAlpha(ReplacableSkinID[3])) - iAlpha |= 0x04040004; // tekstura -3 z kanałem alfa - nie renderować w cyklu + iAlpha |= 0x04040004; // tekstura -3 z kanałem alfa - nie renderować + // w cyklu // nieprzezroczystych if (ReplacableSkinID[4]) if (TTexturesManager::GetAlpha(ReplacableSkinID[4])) - iAlpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować w cyklu + iAlpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować + // w cyklu // nieprzezroczystych } // Winger 040304 - ladowanie przedsionkow dla EZT @@ -3950,7 +4187,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // if (MoverParameters->LoadAccepted!=AnsiString("")); // && // MoverParameters->LoadType!=AnsiString("passengers")) if (MoverParameters->EnginePowerSource.SourceType == CurrentCollector) - { // 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) MoverParameters->PantFront(true); else if (MoverParameters->Load == 2) @@ -3987,10 +4225,14 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, { str = Parser->GetNextSymbol().LowerCase(); if (str == AnsiString("animations:")) - { // Ra: ustawienie ilości poszczególnych animacji - musi być jako pierwsze, inaczej + { // Ra: ustawienie ilości + // poszczególnych animacji - + // musi być jako pierwsze, + // inaczej // ilości będą domyślne if (!pAnimations) - { // jeśli nie ma jeszcze tabeli animacji, można odczytać nowe ilości + { // jeśli nie ma jeszcze tabeli animacji, można + // odczytać nowe ilości int co = 0, ile; iAnimations = 0; do @@ -3999,7 +4241,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // animacji // if (co==ANIM_PANTS) // if (!Global::bLoadTraction) - // if (!DebugModeFlag) //w debugmode pantografy mają "niby działać" + // if (!DebugModeFlag) //w debugmode pantografy mają "niby + // działać" // ile=0; //wyłączenie animacji pantografów if (co < ANIM_TYPES) if (ile >= 0) @@ -4016,7 +4259,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // WriteLog("Total animations: "+AnsiString(iAnimations)); } if (!pAnimations) - { // Ra: tworzenie tabeli animacji, jeśli jeszcze nie było + { // Ra: tworzenie tabeli animacji, jeśli jeszcze nie + // było if (!iAnimations) // jeśli nie podano jawnie, ile ma być animacji iAnimations = 28; // tyle było kiedyś w każdym pojeździe (2 wiązary wypadły) /* //pojazd może mieć pantograf do innych celów niż napęd @@ -4038,8 +4282,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, pants = pAnimations + k; // zapamiętanie na potrzeby wyszukania submodeli pAnimations[k].iShift = sm; // przesunięcie do przydzielenia wskaźnika - sm += pAnimations[k++].TypeSet( - j); // ustawienie typu animacji i zliczanie tablicowanych submodeli + sm += pAnimations[k++].TypeSet(j); // ustawienie typu animacji i + // zliczanie tablicowanych + // submodeli } if (sm) // o ile są bardziej złożone animacje { @@ -4053,13 +4298,13 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, if (str == AnsiString("lowpolyinterior:")) // ABu: wnetrze lowpoly { asModel = Parser->GetNextSymbol().LowerCase(); - asModel = - BaseDir + - asModel; // McZapkie-200702 - dynamics maja swoje modele w dynamic/basedir + asModel = BaseDir + asModel; // McZapkie-200702 - dynamics maja swoje + // modele w dynamic/basedir Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/... mdLowPolyInt = TModelsManager::GetModel(asModel.c_str(), true); - // Global::asCurrentTexturePath=AnsiString(szTexturePath); //kiedyś uproszczone + // Global::asCurrentTexturePath=AnsiString(szTexturePath); //kiedyś + // uproszczone // wnętrze mieszało tekstury nieba } if (str == AnsiString("brakemode:")) @@ -4093,8 +4338,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, MoverParameters->WheelDiameter; // nie kręcić w większej odległości pAnimations[i].fMaxDist *= pAnimations[i].fMaxDist * - MoverParameters - ->WheelDiameter; // 50m do kwadratu, a średnica do trzeciej + MoverParameters->WheelDiameter; // 50m do kwadratu, a średnica + // do trzeciej pAnimations[i].fMaxDist *= Global::fDistanceFactor; // współczynnik // przeliczeniowy // jakości ekranu @@ -4111,22 +4356,27 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, m = 0; // numer osi; kolejny znak; ile osi danego typu; która średnica if ((MoverParameters->WheelDiameterL != MoverParameters->WheelDiameter) || (MoverParameters->WheelDiameterT != MoverParameters->WheelDiameter)) - { // obsługa różnych średnic, o ile występują + { // obsługa różnych średnic, o + // ile występują while ((i < iAnimType[ANIM_WHEELS]) && (j <= MoverParameters->AxleArangement.Length())) - { // wersja ze wskaźnikami jest bardziej elastyczna na nietypowe układy + { // wersja ze wskaźnikami jest + // bardziej elastyczna na nietypowe + // układy if ((k >= 'A') && (k <= 'J')) // 10 chyba maksimum? { pAnimations[i++].dWheelAngle = dWheelAngle + 1; // obrót osi napędzających - --k; // następna będzie albo taka sama, albo bierzemy kolejny znak + --k; // następna będzie albo taka sama, albo bierzemy kolejny + // znak m = 2; // następujące toczne będą miały inną średnicę } else if ((k >= '1') && (k <= '9')) { pAnimations[i++].dWheelAngle = dWheelAngle + m; // obrót osi // tocznych - --k; // następna będzie albo taka sama, albo bierzemy kolejny znak + --k; // następna będzie albo taka sama, albo bierzemy kolejny + // znak } else k = MoverParameters->AxleArangement[j++]; // pobranie kolejnego @@ -4145,7 +4395,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // } // } else if (str == AnsiString("animpantprefix:")) - { // Ra: pantografy po nowemu mają literki i numerki + { // Ra: pantografy po + // nowemu mają literki + // i numerki } // Pantografy - Winger 160204 if (str == AnsiString("animpantrd1prefix:")) @@ -4155,7 +4407,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, TSubModel *sm; if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* + { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* asAnimName = str + AnsiString(i + 1); sm = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[0] = sm; // jak NULL, to nie będzie animowany @@ -4163,9 +4416,11 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, { // w EP09 wywalało się tu z powodu NULL sm->WillBeAnimated(); sm->ParentMatrix(&m); // pobranie macierzy transformacji - // m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie tak) + // m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie + // tak) if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z T3D - m.InitialRotate(); // może być potrzebny dodatkowy obrót, jeśli + m.InitialRotate(); // może być potrzebny dodatkowy obrót, + // jeśli // wczytano z T3D, tzn. przed wykonaniem // Init() pants[i].fParamPants->vPos.z = @@ -4173,7 +4428,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, pants[i].fParamPants->vPos.y = m[3][1]; // przesunięcie w górę odczytane z modelu if ((sm = pants[i].smElement[0]->ChildGet()) != NULL) - { // jeśli ma potomny, można policzyć długość (odległość potomnego + { // jeśli ma potomny, można policzyć długość + // (odległość potomnego // od osi obrotu) m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, nie // trzeba kopiować @@ -4195,7 +4451,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, pants[i].fParamPants->fAngleL0; // początkowy kąt dolnego // ramienia if ((sm = sm->ChildGet()) != NULL) - { // jeśli dalej jest ślizg, można policzyć długość górnego + { // jeśli dalej jest + // ślizg, można policzyć + // długość górnego // ramienia m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, // nie trzeba kopiować @@ -4276,7 +4534,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, TSubModel *sm; if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* + { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* asAnimName = str + AnsiString(i + 1); sm = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[1] = sm; // jak NULL, to nie będzie animowany @@ -4284,7 +4543,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, { // w EP09 wywalało się tu z powodu NULL sm->WillBeAnimated(); if (pants[i].fParamPants->vPos.y == 0.0) - { // jeśli pierwsze ramię nie ustawiło tej wartości, próbować drugim + { // jeśli pierwsze ramię nie ustawiło tej wartości, + // próbować drugim //!!!! docelowo zrobić niezależną animację ramion z każdej // strony m = float4x4( @@ -4313,7 +4573,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* + { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* asAnimName = str + AnsiString(i + 1); pants[i].smElement[2] = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[2]->WillBeAnimated(); @@ -4324,7 +4585,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* + { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* asAnimName = str + AnsiString(i + 1); pants[i].smElement[3] = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[3]->WillBeAnimated(); @@ -4335,7 +4597,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* + { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* asAnimName = str + AnsiString(i + 1); pants[i].smElement[4] = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[4]->WillBeAnimated(); @@ -4345,7 +4608,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } } else if (str == AnsiString("pantfactors:")) - { // Winger 010304: parametry pantografow + { // Winger 010304: + // parametry pantografow double pant1x = Parser->GetNextSymbol().ToDouble(); double pant2x = Parser->GetNextSymbol().ToDouble(); double pant1h = Parser->GetNextSymbol().ToDouble(); // wysokość pierwszego @@ -4361,7 +4625,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; ++i) - { // przepisanie współczynników do pantografów (na razie nie będzie lepiej) + { // przepisanie współczynników do pantografów (na razie + // nie będzie lepiej) pants[i].fParamPants->fAngleL = pants[i].fParamPants->fAngleL0; // początkowy kąt dolnego ramienia pants[i].fParamPants->fAngleU = @@ -4370,9 +4635,12 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // //wysokość początkowa // pants[i].fParamPants->PantWys=1.176289*sin(pants[i].fParamPants->fAngleL)+1.724482197*sin(pants[i].fParamPants->fAngleU); // //wysokość początkowa - if (pants[i].fParamPants->fHeight == - 0.0) // gdy jest nieprawdopodobna wartość (np. nie znaleziony ślizg) - { // gdy pomiary modelu nie udały się, odczyt podanych parametrów z MMD + if (pants[i].fParamPants->fHeight == 0.0) // gdy jest + // nieprawdopodobna + // wartość (np. nie + // znaleziony ślizg) + { // gdy pomiary modelu nie udały się, odczyt podanych parametrów + // z MMD pants[i].fParamPants->vPos.x = (i & 1) ? pant2x : pant1x; pants[i].fParamPants->fHeight = (i & 1) ? pant2h : @@ -4394,7 +4662,10 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } } else if (str == AnsiString("animpistonprefix:")) - { // prefiks tłoczysk - na razie używamy modeli pantografów + { // prefiks tłoczysk + // - na razie + // używamy modeli + // pantografów str = Parser->GetNextSymbol(); for (int i = 1; i <= 2; i++) { @@ -4404,7 +4675,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } } else if (str == AnsiString("animconrodprefix:")) - { // prefiks korbowodów - na razie używamy modeli pantografów + { // prefiks korbowodów - na + // razie używamy modeli + // pantografów str = Parser->GetNextSymbol(); for (int i = 1; i <= 2; i++) { @@ -4414,20 +4687,30 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } } else if (str == AnsiString("pistonfactors:")) - { // Ra: parametry silnika parowego (tłoka) - /* //Ra: tymczasowo wyłączone ze względu na porządkowanie animacji pantografów - pant1x=Parser->GetNextSymbol().ToDouble(); //kąt przesunięcia dla + { // Ra: parametry + // silnika parowego + // (tłoka) + /* //Ra: tymczasowo wyłączone ze względu na porządkowanie animacji + pantografów + pant1x=Parser->GetNextSymbol().ToDouble(); //kąt przesunięcia + dla pierwszego tłoka - pant2x=Parser->GetNextSymbol().ToDouble(); //kąt przesunięcia dla + pant2x=Parser->GetNextSymbol().ToDouble(); //kąt przesunięcia + dla drugiego tłoka panty=Parser->GetNextSymbol().ToDouble(); //długość korby (r) - panth=Parser->GetNextSymbol().ToDouble(); //długoś korbowodu (k) + panth=Parser->GetNextSymbol().ToDouble(); //długoś korbowodu + (k) */ MoverParameters->EnginePowerSource.PowerType = SteamPower; // Ra: po chamsku, ale z CHK nie działa } else if (str == AnsiString("animreturnprefix:")) - { // prefiks drążka mimośrodowego - na razie używamy modeli pantografów + { // prefiks drążka + // mimośrodowego - + // na razie używamy + // modeli + // pantografów str = Parser->GetNextSymbol(); for (int i = 1; i <= 2; i++) { @@ -4451,7 +4734,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); asAnimName = ""; for (int i = 1; i <= 4; i++) - { // McZapkie-050402: wyszukiwanie max 4 wahaczy o nazwie str* + { // McZapkie-050402: wyszukiwanie max 4 + // wahaczy o nazwie str* asAnimName = str + AnsiString(i); smWahacze[i - 1] = mdModel->GetFromName(asAnimName.c_str()); smWahacze[i - 1]->WillBeAnimated(); @@ -4465,7 +4749,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); smMechanik0 = mdModel->GetFromName(str.c_str()); if (!smMechanik0) - { // jak nie ma bez numerka, to może jest z numerkiem? + { // jak nie ma bez numerka, to może jest z + // numerkiem? smMechanik0 = mdModel->GetFromName(AnsiString(str + "1").c_str()); smMechanik1 = mdModel->GetFromName(AnsiString(str + "2").c_str()); } @@ -4491,7 +4776,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // optymalizacji // transformu switch (MoverParameters->DoorOpenMethod) - { // od razu zapinamy potrzebny typ animacji + { // od razu zapinamy + // potrzebny typ + // animacji case 1: pAnimations[i + j].yUpdate = UpdateDoorTranslate; break; @@ -4508,7 +4795,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, pAnimations[i + j].fSpeed = random(150); // oryginalny koncept z DoorSpeedFactor pAnimations[i + j].fSpeed = (pAnimations[i + j].fSpeed + 100) / 100; - // Ra: te współczynniki są bez sensu, bo modyfikują wektor przesunięcia + // Ra: te współczynniki są bez sensu, bo modyfikują wektor + // przesunięcia } } } @@ -4535,8 +4823,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, str = Parser->GetNextSymbol(); } else if ((str == AnsiString("engine:")) && - (MoverParameters->Power > - 0)) // plik z dzwiekiem silnika, mnozniki i ofsety amp. i czest. + (MoverParameters->Power > 0)) // plik z dzwiekiem silnika, + // mnozniki i ofsety amp. i + // czest. { str = Parser->GetNextSymbol(); rsSilnik.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), GetPosition().x, @@ -4560,7 +4849,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, else if (((str == AnsiString("ventilator:")) && ((MoverParameters->EngineType == ElectricSeriesMotor) || (MoverParameters->EngineType == - ElectricInductionMotor)))) // plik z dzwiekiem wentylatora, mnozniki i + ElectricInductionMotor)))) // plik z dzwiekiem + // wentylatora, mnozniki i // ofsety amp. i czest. { str = Parser->GetNextSymbol(); @@ -4576,7 +4866,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } else if ((str == AnsiString("transmission:")) && (MoverParameters->EngineType == - ElectricSeriesMotor)) // plik z dzwiekiem, mnozniki i ofsety amp. i czest. + ElectricSeriesMotor)) // plik z dzwiekiem, mnozniki i ofsety + // amp. i czest. { str = Parser->GetNextSymbol(); rsPrzekladnia.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), @@ -4586,9 +4877,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, rsPrzekladnia.FM = 0.005; rsPrzekladnia.FA = 1.0; } - else if (str == - AnsiString( - "brake:")) // plik z piskiem hamulca, mnozniki i ofsety amplitudy. + else if (str == AnsiString("brake:")) // plik z piskiem hamulca, + // mnozniki i ofsety amplitudy. { str = Parser->GetNextSymbol(); rsPisk.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), GetPosition().x, @@ -4598,9 +4888,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, rsPisk.FM = 1.0; rsPisk.FA = 0.0; } - else if (str == - AnsiString( - "brakeacc:")) // plik z przyspieszaczem (upust po zlapaniu hamowania) + else if (str == AnsiString("brakeacc:")) // plik z przyspieszaczem + // (upust po zlapaniu + // hamowania) { str = Parser->GetNextSymbol(); // sBrakeAcc.Init(str.c_str(),Parser->GetNextSymbol().ToDouble(),GetPosition().x,GetPosition().y,GetPosition().z,true); @@ -4611,9 +4901,9 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // sBrakeAcc.FM=1.0; // sBrakeAcc.FA=0.0; } - else if (str == - AnsiString( - "unbrake:")) // plik z piskiem hamulca, mnozniki i ofsety amplitudy. + else if (str == AnsiString("unbrake:")) // plik z piskiem hamulca, + // mnozniki i ofsety + // amplitudy. { str = Parser->GetNextSymbol(); rsUnbrake.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), GetPosition().x, @@ -4694,7 +4984,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, } else if (str == AnsiString("converter:")) // pliki z przetwornica { - // if (MoverParameters->EngineType==DieselElectric) //będzie modulowany? + // if (MoverParameters->EngineType==DieselElectric) //będzie + // modulowany? sConverter.Load(Parser, GetPosition()); } else if (str == AnsiString("turbo:")) // pliki z turbogeneratorem @@ -4756,7 +5047,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, // ABu 050205 - tego wczesniej nie bylo i uciekala pamiec: delete Parser; if (mdModel) - mdModel->Init(); // obrócenie modelu oraz optymalizacja, również zapisanie binarnego + mdModel->Init(); // obrócenie modelu oraz optymalizacja, również zapisanie + // binarnego if (mdLoad) mdLoad->Init(); if (mdPrzedsionek) @@ -4778,15 +5070,19 @@ void TDynamicObject::RadioStop() }; void TDynamicObject::RaLightsSet(int head, int rear) -{ // zapalenie świateł z przodu i z tyłu, zależne od kierunku pojazdu +{ // zapalenie świateł z przodu i z + // tyłu, zależne od kierunku + // pojazdu if (!MoverParameters) return; // może tego nie być na początku if (rear == 2 + 32 + 64) - { // jeśli koniec pociągu, to trzeba ustalić, czy jest tam czynna lokomotywa + { // jeśli koniec pociągu, to trzeba ustalić, czy + // jest tam czynna lokomotywa // EN57 może nie mieć końcówek od środka członu if (MoverParameters->Power > 1.0) // jeśli ma moc napędową if (!MoverParameters->ActiveDir) // jeśli nie ma ustawionego kierunku - { // jeśli ma zarówno światła jak i końcówki, ustalić, czy jest w stanie aktywnym + { // jeśli ma zarówno światła jak i końcówki, ustalić, czy jest w stanie + // aktywnym // np. lokomotywa na zimno będzie mieć końcówki a nie światła rear = 64; // tablice blaszane // trzeba to uzależnić od "załączenia baterii" w pojeździe @@ -4819,7 +5115,8 @@ int TDynamicObject::DirectionSet(int d) iDirection = d > 0 ? 1 : 0; // d:1=zgodny,-1=przeciwny; iDirection:1=zgodny,0=przeciwny; CouplCounter = 20; //żeby normalnie skanować kolizje, to musi ruszyć z miejsca if (MyTrack) - { // podczas wczytywania wstawiane jest AI, ale może jeszcze nie być toru + { // podczas wczytywania wstawiane jest AI, ale może jeszcze nie + // być toru // AI ustawi kierunek ponownie po uruchomieniu silnika if (iDirection) // jeśli w kierunku Coupler 0 { @@ -4836,7 +5133,8 @@ int TDynamicObject::DirectionSet(int d) }; TDynamicObject *__fastcall TDynamicObject::PrevAny() -{ // wskaźnik na poprzedni, nawet wirtualny +{ // wskaźnik na poprzedni, + // nawet wirtualny return iDirection ? PrevConnected : NextConnected; }; TDynamicObject *__fastcall TDynamicObject::Prev() @@ -4858,7 +5156,9 @@ TDynamicObject *__fastcall TDynamicObject::NextC(int C) return NULL; // gdy sprzęg inny, to jakby nic nie było }; double TDynamicObject::NextDistance(double d) -{ // ustalenie odległości do następnego pojazdu, potrzebne do wstecznego skanowania +{ // ustalenie odległości do + // następnego pojazdu, potrzebne + // do wstecznego skanowania if (!MoverParameters->Couplers[iDirection].Connected) return d; // jeśli nic nie ma, zwrócenie domyślnej wartości if ((d <= 0.0) || (MoverParameters->Couplers[iDirection].CoupleDist < d)) @@ -4868,7 +5168,8 @@ double TDynamicObject::NextDistance(double d) }; TDynamicObject *__fastcall TDynamicObject::Neightbour(int &dir) -{ // ustalenie następnego (1) albo poprzedniego (0) w składzie bez względu na prawidłowość +{ // ustalenie następnego (1) albo poprzedniego (0) w składzie bez + // względu na prawidłowość // iDirection int d = dir; // zapamiętanie kierunku dir = 1 - (dir ? NextConnectedNo : PrevConnectedNo); // nowa wartość @@ -4886,7 +5187,8 @@ void TDynamicObject::CoupleDist() else { // na drodze trzeba uwzględnić wektory ruchu double d0 = MoverParameters->Couplers[0].CoupleDist; - // double d1=MoverParameters->Couplers[1].CoupleDist; //sprzęg z tyłu samochodu można olać, + // double d1=MoverParameters->Couplers[1].CoupleDist; //sprzęg z tyłu + // samochodu można olać, // dopóki nie jeździ na wstecznym vector3 p1, p2; double d, w; // dopuszczalny dystans w poprzek @@ -4894,10 +5196,12 @@ void TDynamicObject::CoupleDist() if (MoverParameters->Couplers[0].Connected) // jeśli cokolwiek podłączone if (MoverParameters->Couplers[0].CouplingFlag == 0) // jeśli wirtualny if (MoverParameters->Couplers[0].CoupleDist < 300.0) // i mniej niż 300m - { // przez MoverParameters->Couplers[0].Connected nie da się dostać do DynObj, stąd + { // przez MoverParameters->Couplers[0].Connected nie da się dostać do + // DynObj, stąd // prowizorka // WriteLog("Collision of - // "+AnsiString(MoverParameters->Couplers[0].CoupleDist)+"m detected by + // "+AnsiString(MoverParameters->Couplers[0].CoupleDist)+"m detected + // by // "+asName+":0."); w = 0.5 * (MoverParameters->Couplers[0].Connected->Dim.W + MoverParameters->Dim.W); // minimalna odległość minięcia @@ -4918,7 +5222,8 @@ void TDynamicObject::CoupleDist() if (MoverParameters->Couplers[1].CoupleDist < 300.0) // i mniej niż 300m { // WriteLog("Collision of - // "+AnsiString(MoverParameters->Couplers[1].CoupleDist)+"m detected by + // "+AnsiString(MoverParameters->Couplers[1].CoupleDist)+"m detected + // by // "+asName+":1."); w = 0.5 * (MoverParameters->Couplers[1].Connected->Dim.W + MoverParameters->Dim.W); // minimalna odległość minięcia @@ -4938,29 +5243,41 @@ void TDynamicObject::CoupleDist() }; TDynamicObject *__fastcall TDynamicObject::ControlledFind() -{ // taka proteza: chcę podłączyć kabinę EN57 bezpośrednio z silnikowym, aby nie robić tego przez +{ // taka proteza: + // chcę podłączyć + // kabinę EN57 + // bezpośrednio z + // silnikowym, aby + // nie robić tego + // przez // ukrotnienie // drugi silnikowy i tak musi być ukrotniony, podobnie jak kolejna jednostka - // lepiej by było przesyłać komendy sterowania, co jednak wymaga przebudowy transmisji komend + // lepiej by było przesyłać komendy sterowania, co jednak wymaga przebudowy + // transmisji komend // (LD) - // problem się robi ze światłami, które będą zapalane w silnikowym, ale muszą świecić się w + // problem się robi ze światłami, które będą zapalane w silnikowym, ale muszą + // świecić się w + // rozrządczych + // dla EZT światłą czołowe będą "zapalane w silnikowym", ale widziane z // rozrządczych - // dla EZT światłą czołowe będą "zapalane w silnikowym", ale widziane z rozrządczych // również wczytywanie MMD powinno dotyczyć aktualnego członu // problematyczna może być kwestia wybranej kabiny (w silnikowym...) - // jeśli silnikowy będzie zapięty odwrotnie (tzn. -1), to i tak powinno jeździć dobrze + // jeśli silnikowy będzie zapięty odwrotnie (tzn. -1), to i tak powinno + // jeździć dobrze // również hamowanie wykonuje się zaworem w członie, a nie w silnikowym... TDynamicObject *d = this; // zaczynamy od aktualnego if (d->MoverParameters->TrainType & dt_EZT) // na razie dotyczy to EZT if (d->NextConnected ? d->MoverParameters->Couplers[1].AllowedFlag & ctrain_depot : false) - { // gdy jest człon od sprzęgu 1, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 1, a sprzęg łączony + // warsztatowo (powiedzmy) if ((d->MoverParameters->Power < 1.0) && (d->NextConnected->MoverParameters->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma d = d->NextConnected; // będziemy sterować tym z mocą } else if (d->PrevConnected ? d->MoverParameters->Couplers[0].AllowedFlag & ctrain_depot : false) - { // gdy jest człon od sprzęgu 0, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 0, a sprzęg łączony + // warsztatowo (powiedzmy) if ((d->MoverParameters->Power < 1.0) && (d->PrevConnected->MoverParameters->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma d = d->PrevConnected; // będziemy sterować tym z mocą @@ -4973,9 +5290,10 @@ void TDynamicObject::ParamSet(int what, int into) { // ustawienie lokalnego parametru (what) na stan (into) switch (what & 0xFF00) { - case 0x0100: // to np. są drzwi, bity 0..7 określają numer 1..254 albo maskę dla 8 różnych - if (what & - 1) // na razie mamy lewe oraz prawe, czyli używamy maskę 1=lewe, 2=prawe, 3=wszystkie + case 0x0100: // to np. są drzwi, bity 0..7 określają numer 1..254 albo maskę + // dla 8 różnych + if (what & 1) // na razie mamy lewe oraz prawe, czyli używamy maskę 1=lewe, + // 2=prawe, 3=wszystkie if (MoverParameters->DoorLeftOpened) { // są otwarte if (!into) // jeśli zamykanie @@ -5010,7 +5328,9 @@ void TDynamicObject::ParamSet(int what, int into) }; int TDynamicObject::RouteWish(TTrack *tr) -{ // zapytanie do AI, po którym segmencie (-6..6) jechać na skrzyżowaniu (tr) +{ // zapytanie do AI, po którym + // segmencie (-6..6) jechać na + // skrzyżowaniu (tr) return Mechanik ? Mechanik->CrossRoute(tr) : 0; // wg AI albo prosto }; @@ -5035,10 +5355,14 @@ AnsiString TDynamicObject::TextureTest(AnsiString &name) }; void TDynamicObject::DestinationSet(AnsiString to) -{ // ustawienie stacji docelowej oraz wymiennej tekstury 4, jeśli istnieje plik +{ // ustawienie stacji + // docelowej oraz wymiennej + // tekstury 4, jeśli + // istnieje plik // w zasadzie, to każdy wagon mógłby mieć inną stację docelową // zwłaszcza w towarowych, pod kątem zautomatyzowania maewrów albo pracy górki - // ale to jeszcze potrwa, zanim będzie możliwe, na razie można wpisać stację z rozkładu + // ale to jeszcze potrwa, zanim będzie możliwe, na razie można wpisać stację z + // rozkładu if (abs(iMultiTex) >= 4) return; // jak są 4 tekstury wymienne, to nie zmieniać rozkładem asDestination = to; @@ -5060,11 +5384,14 @@ void TDynamicObject::DestinationSet(AnsiString to) NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się else ReplacableSkinID[4] = 0; // 0 to brak? -1 odpada, bo inaczej się będzie mapować - // Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa tekstury nr 4 + // Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa + // tekstury nr 4 }; void TDynamicObject::OverheadTrack(float o) -{ // ewentualne wymuszanie jazdy bezprądowej z powodu informacji w torze +{ // ewentualne wymuszanie jazdy + // bezprądowej z powodu informacji + // w torze if (ctOwner) // jeśli ma obiekt nadzorujący { // trzeba zaktualizować mapę flag bitowych jazdy bezprądowej if (o < 0.0) diff --git a/Gauge.cpp b/Gauge.cpp index 1772754f..9c65a502 100644 --- a/Gauge.cpp +++ b/Gauge.cpp @@ -50,7 +50,8 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, double fNewFriction, double fNewValue) { // ustawienie parametrów animacji submodelu if (NewSubModel) - { // warunek na wszelki wypadek, gdyby się submodel nie podłączył + { // warunek na wszelki wypadek, gdyby się submodel nie + // podłączył fFriction = fNewFriction; fValue = fNewValue; fOffset = fNewOffset; @@ -61,11 +62,12 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, { TSubModel *sm = SubModel->ChildGet(); do - { // pętla po submodelach potomnych i obracanie ich o kąt zależy od cyfry w (fValue) + { // pętla po submodelach potomnych i obracanie ich o kąt zależy od + // cyfry w (fValue) if (sm->pName) { // musi mieć niepustą nazwę - if ((*sm->pName) >= '0') - if ((*sm->pName) <= '9') + if (sm->pName[0] >= '0') + if (sm->pName[0] <= '9') sm->WillBeAnimated(); // wyłączenie optymalizacji } sm = sm->NextGet(); @@ -137,14 +139,16 @@ void TGauge::PutValue(double fNewDesired) void TGauge::Update() { float dt = Timer::GetDeltaTime(); - if ((fFriction > 0) && - (dt < - 0.5 * fFriction)) // McZapkie-281102: zabezpieczenie przed oscylacjami dla dlugich czasow + if ((fFriction > 0) && (dt < 0.5 * fFriction)) // McZapkie-281102: + // zabezpieczenie przed + // oscylacjami dla dlugich + // czasow fValue += dt * (fDesiredValue - fValue) / fFriction; else fValue = fDesiredValue; if (SubModel) - { // warunek na wszelki wypadek, gdyby się submodel nie podłączył + { // warunek na wszelki wypadek, gdyby się submodel nie + // podłączył TSubModel *sm; switch (eType) { @@ -167,16 +171,17 @@ void TGauge::Update() break; case gt_Digital: // Ra 2014-07: licznik cyfrowy sm = SubModel->ChildGet(); - AnsiString n = FormatFloat("0000000000", floor(fValue)); // na razie tak trochę bez - // sensu + AnsiString n = + FormatFloat("0000000000", floor(fValue)); // na razie tak trochę bez sensu do - { // pętla po submodelach potomnych i obracanie ich o kąt zależy od cyfry w (fValue) + { // pętla po submodelach potomnych i obracanie ich o kąt zależy od + // cyfry w (fValue) if (sm->pName) { // musi mieć niepustą nazwę - if ((*sm->pName) >= '0') - if ((*sm->pName) <= '9') + if (sm->pName[0] >= '0') + if (sm->pName[0] <= '9') sm->SetRotate(float3(0, 1, 0), - -36.0 * (n['0' + 10 - (*sm->pName)] - '0')); + -36.0 * (n['0' + 10 - sm->pName[0]] - '0')); } sm = sm->NextGet(); } while (sm); diff --git a/McZapkie/Mover.hpp b/McZapkie/Mover.hpp index 009f5b8f..8dd3a9cd 100644 --- a/McZapkie/Mover.hpp +++ b/McZapkie/Mover.hpp @@ -867,6 +867,7 @@ static const Shortint eimv_Uzsmax = 0x10; static const Shortint eimv_Pmax = 0x11; static const Shortint eimv_Fzad = 0x12; static const Shortint eimv_Imax = 0x13; +static const Shortint eimv_Fful = 0x14; extern PACKAGE double __fastcall Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1, const TDimension &Dim2); diff --git a/McZapkie/_Mover.hpp b/McZapkie/_Mover.hpp index 81065a91..f5d8031b 100644 --- a/McZapkie/_Mover.hpp +++ b/McZapkie/_Mover.hpp @@ -865,6 +865,7 @@ static const Shortint eimv_Uzsmax = 0x10; static const Shortint eimv_Pmax = 0x11; static const Shortint eimv_Fzad = 0x12; static const Shortint eimv_Imax = 0x13; +static const Shortint eimv_Fful = 0x14; extern PACKAGE double __fastcall Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1, const TDimension &Dim2); diff --git a/McZapkie/_mover.pas b/McZapkie/_mover.pas index c35523fe..9dc52768 100644 --- a/McZapkie/_mover.pas +++ b/McZapkie/_mover.pas @@ -1,13 +1,5 @@ unit _mover; {fizyka ruchu dla symulatora lokomotywy} -(* -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/. -*) (* MaSzyna EU07 locomotive simulator Copyright (C) 2001-2004 Maciej Czapkiewicz and others @@ -212,6 +204,7 @@ CONST eimv_Pmax=17; eimv_Fzad=18; eimv_Imax=19; + eimv_Fful=20; TYPE @@ -2425,10 +2418,13 @@ begin dpMainValve:=0; -if (BrakeCtrlPosNo>1) and (ActiveCab<>0)then +if (BrakeCtrlPosNo>1) {and(ActiveCab<>0)}then with BrakePressureTable[BrakeCtrlPos] do begin - dpLocalValve:=LocHandle.GetPF(LocalBrakePos/LocalBrakePosNo, Hamulec.GetBCP, ScndPipePress, dt, 0); + if(EngineType<>ElectricInductionMotor)then + dpLocalValve:=LocHandle.GetPF(Max0R(LocalBrakePos/LocalBrakePosNo,LocalBrakePosA), Hamulec.GetBCP, ScndPipePress, dt, 0) + else + dpLocalValve:=LocHandle.GetPF(LocalBrakePosA, Hamulec.GetBCP, ScndPipePress, dt, 0); if(BrakeHandle=FV4a)and((PipePress<2.75)and((Hamulec.GetStatus and b_rls)=0))and(BrakeSubsystem=ss_LSt)and(TrainType<>dt_EZT)then temp:=PipePress+0.00001 else @@ -2483,11 +2479,12 @@ end; if(DynamicBrakeFlag)and(EngineType=ElectricInductionMotor)then begin - if(Vel>10)then LocBrakePress:=0 else - if(Vel>5)then LocBrakePress:=(10-Vel)/5*LocBrakePress - end; - - (Hamulec as TLSt).SetLBP(LocBrakePress); + (Hamulec as TLSt).SetLBP(LocBrakePress); +// if(Vel>10)then LocBrakePress:=0 else +// if(Vel>5)then LocBrakePress:=(10-Vel)/5*LocBrakePress + end + else + (Hamulec as TLSt).SetLBP(LocBrakePress); end; CV1_L_TR: begin @@ -4095,10 +4092,11 @@ begin Mm:=Mm*RList[MainCtrlActualPos].Bn/(RList[MainCtrlActualPos].Bn+1); //zrobione w momencie, żeby nie dawac elektryki w przeliczaniu sił if (Abs(Im)>Imax) then - Vhyp:=Vhyp+dt*(Abs(Im)/Imax-0.9)*10 //zwieksz czas oddzialywania na PN + Vhyp:=Vhyp+dt//*(Abs(Im)/Imax-0.9)*10 //zwieksz czas oddzialywania na PN else Vhyp:=0; if (Vhyp>CtrlDelay/2) then //jesli czas oddzialywania przekroczony +// dec(MainCtrlActualPos); FuseOff; {wywalanie bezpiecznika z powodu przetezenia silnikow} if (Mains) then //nie wchodzić w funkcję bez potrzeby if (Abs(Voltage)EnginePowerSource.CollectorParameters.MaxV) then @@ -4292,31 +4290,39 @@ begin end; ElectricInductionMotor: begin - if (Voltage>1800) and (MainS) then + if (Mains) then //nie wchodzić w funkcję bez potrzeby + if (Abs(Voltage)EnginePowerSource.CollectorParameters.MaxV) then + MainSwitch(false); +// tmpV:=V/(Pi*WheelDiameter)*Transmision.Ratio;//*DirAbsolute*eimc[eimc_s_p]; - do przemyslenia dzialanie pp + if (MainS) then begin - if ((Hamulec as TLSt).GetEDBCP<0.25)and(LocHandle.GetCP<0.25) then + if ((Hamulec as TLSt).GetEDBCP<0.25) and (LocHandle.GetCP<0.25) and (AnPos<0.01) then DynamicBrakeFlag:=false - else if ((BrakePress>0.25) and ((Hamulec as TLSt).GetEDBCP>0.25)) or (LocHandle.GetCP>0.25) then + else if (((BrakePress>0.25) and ((Hamulec as TLSt).GetEDBCP>0.25) or (LocHandle.GetCP>0.25))) or (AnPos>0.02) then DynamicBrakeFlag:=true; if(DynamicBrakeFlag)then begin if eimv[eimv_Fmax]*sign(V)*DirAbsolute<-1 then - PosRatio:=-sign(V)*DirAbsolute*eimv[eimv_Fr]/(eimc[eimc_p_Fh]*Max0R((Hamulec as TLSt).GetEDBCP,LocHandle.GetCP)/MaxBrakePress[0]{dizel_fill}) + PosRatio:=-sign(V)*DirAbsolute*eimv[eimv_Fr]/(eimc[eimc_p_Fh]*Max0R((Hamulec as TLSt).GetEDBCP/MaxBrakePress[0],AnPos){dizel_fill}) else PosRatio:=0; PosRatio:=round(20*Posratio)/20; if PosRatio<19.5/20 then PosRatio:=PosRatio*0.9; (Hamulec as TLSt).SetED(PosRatio); - PosRatio:=-Max0R((Hamulec as TLSt).GetEDBCP,LocHandle.GetCP)/MaxBrakePress[0]*Max0R(0,Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0]))); +// (Hamulec as TLSt).SetLBP(LocBrakePress*(1-PosRatio)); + PosRatio:=-Max0R(Min0R((Hamulec as TLSt).GetEDBCP/MaxBrakePress[0],1),AnPos)*Max0R(0,Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0]))); + eimv[eimv_Fzad]:=-Max0R(LocalBrakeRatio,(Hamulec as TLSt).GetEDBCP/MaxBrakePress[0]); tmp:=5; end else begin PosRatio:=(MainCtrlPos/MainCtrlPosNo); + eimv[eimv_Fzad]:=PosRatio; PosRatio:=1.0*(PosRatio*0+1)*PosRatio; (Hamulec as TLSt).SetED(0); +// (Hamulec as TLSt).SetLBP(LocBrakePress); if (PosRatio>dizel_fill) then tmp:=1 else tmp:=4; //szybkie malenie, powolne wzrastanie end; if SlippingWheels then begin PosRatio:=0; tmp:=10; SandDoseOn; end;//przeciwposlizg @@ -4331,19 +4337,22 @@ begin eimv[eimv_Pmax]:=eimc[eimc_p_Ph] else eimv[eimv_Pmax]:=Min0R(eimc[eimc_p_Pmax],0.001*Voltage*(eimc[eimc_p_Imax]-eimc[eimc_f_I0])*Pirazy2*eimc[eimc_s_cim]/eimc[eimc_s_p]/eimc[eimc_s_cfu]); - eimv[eimv_FMAXMAX]:=0.001*SQR(Min0R(eimv[eimv_fkr]/Max0R(abs(enrot)*eimc[eimc_s_p]+eimc[eimc_s_dfmax]*eimv[eimv_ks],eimc[eimc_s_dfmax]),1)*eimc[eimc_f_cfu]/eimc[eimc_s_cfu])*(eimc[eimc_s_dfmax]*eimc[eimc_s_dfic]*eimc[eimc_s_cim])*Transmision.Ratio*NPoweredAxles*2/WheelDiameter; if(DynamicBrakeFlag)then -// if(Vel>eimc[eimc_p_Vh0])then - eimv[eimv_Fmax]:=-sign(V)*(DirAbsolute)*Min0R(eimc[eimc_p_Ph]*3.6/Vel,-eimc[eimc_p_Fh]*dizel_fill)//*Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0])) -// else -// eimv[eimv_Fmax]:=0 + begin + eimv[eimv_Fful]:=Min0R(eimc[eimc_p_Ph]*3.6/Vel,Min0R(eimc[eimc_p_Fh],eimv[eimv_FMAXMAX])); + eimv[eimv_Fmax]:=-sign(V)*(DirAbsolute)*Min0R(eimc[eimc_p_Ph]*3.6/Vel,Min0R(-eimc[eimc_p_Fh]*dizel_fill,eimv[eimv_FMAXMAX]));//*Min0R(1,(Vel-eimc[eimc_p_Vh0])/(eimc[eimc_p_Vh1]-eimc[eimc_p_Vh0])) + end else - eimv[eimv_Fmax]:=Min0R(Min0R(3.6*eimv[eimv_Pmax]/Max0R(Vel,1),eimc[eimc_p_F0]-Vel*eimc[eimc_p_a1]),eimv[eimv_FMAXMAX])*dizel_fill; + begin + eimv[eimv_Fful]:=Min0R(Min0R(3.6*eimv[eimv_Pmax]/Max0R(Vel,1),eimc[eimc_p_F0]-Vel*eimc[eimc_p_a1]),eimv[eimv_FMAXMAX]); + eimv[eimv_Fmax]:=eimv[eimv_Fful]*dizel_fill; + end; + eimv[eimv_ks]:=eimv[eimv_Fmax]/eimv[eimv_FMAXMAX]; eimv[eimv_df]:=eimv[eimv_ks]*eimc[eimc_s_dfmax]; - eimv[eimv_fp]:=DirAbsolute*enrot*eimc[eimc_s_p]+eimv[eimv_df]; + eimv[eimv_fp]:=DirAbsolute*enrot*eimc[eimc_s_p]+eimv[eimv_df]; //do przemyslenia dzialanie pp z tmpV // eimv[eimv_U]:=Max0R(eimv[eimv_Uzsmax],Min0R(eimc[eimc_f_cfu]*eimv[eimv_fp],eimv[eimv_Uzsmax])); // eimv[eimv_pole]:=eimv[eimv_U]/(eimv[eimv_fp]*eimc[eimc_s_cfu]); if(abs(eimv[eimv_fp])<=eimv[eimv_fkr])then @@ -4365,13 +4374,13 @@ begin EnginePower:=Abs(eimv[eimv_Ic]*eimv[eimv_U]*NPoweredAxles)/1000; tmpV:=eimv[eimv_fp]; - if (abs(eimv[eimv_If])>1) or (abs(tmpV)>0.1) then + if ((abs(eimv[eimv_If])>1) or (abs(tmpV)>0.1))and(RlistSize>0) then begin - if abs(tmpV)<32 then RventRot:=1.0 else - if abs(tmpV)<39 then RventRot:=0.33*abs(tmpV)/32 else - RventRot:=0.25*abs(tmpV)/39;//} + i:=0; + while (i0 then @@ -4851,34 +4860,39 @@ function T_MoverParameters.ComputeMovement(dt:real; dt1:real; Shape:TTrackShape; var b:byte; Vprev,AccSprev:real; // Iheat:real; prad ogrzewania + hvc: real; const Vepsilon=1e-5; Aepsilon=1e-3; //ASBSpeed=0.8; begin -{ + TotalCurrent:=0; for b:=0 to 1 do //przekazywanie napiec if ((Couplers[b].CouplingFlag and ctrain_power) = ctrain_power)or(((Couplers[b].CouplingFlag and ctrain_heating) = ctrain_heating)and(Heating)) then begin - HVCouplers[1-b][1]:=Max0R(Abs(Voltage),Couplers[b].Connected.HVCouplers[Couplers[b].ConnectedNr][1]); + HVCouplers[1-b][1]:=Max0R(Abs(ElectricTraction.TractionVoltage),Couplers[b].Connected.HVCouplers[Couplers[b].ConnectedNr][1]*0.99); end else - HVCouplers[1-b][1]:=Max0R(Abs(Voltage),0); - end; + HVCouplers[1-b][1]:=Abs(ElectricTraction.TractionVoltage);//Max0R(Abs(Voltage),0); +// end; + + hvc:=HVCouplers[0][1]+HVCouplers[1][1]; + if (Abs(ElectricTraction.TractionVoltage)<1) and (hvc>1)then //bez napiecia, ale jest cos na sprzegach: + begin + for b:=0 to 1 do //przekazywanie pradow + if ((Couplers[b].CouplingFlag and ctrain_power) = ctrain_power)or(((Couplers[b].CouplingFlag and ctrain_heating) = ctrain_heating)and(Heating)) then //jesli spiety + begin + HVCouplers[b][0]:=Couplers[b].Connected.HVCouplers[1-Couplers[b].ConnectedNr][0]+Itot*HVCouplers[b][1]/hvc; //obciążenie rozkladane stosownie do napiec + end + else //pierwszy pojazd + begin + HVCouplers[b][0]:=Itot*HVCouplers[b][1]/hvc; + end; + end + else + begin + TotalCurrent:=HVCouplers[0][0]+HVCouplers[1][0]; + HVCouplers[0][0]:=0; + HVCouplers[1][0]:=0; + end; - for b:=0 to 1 do //przekazywanie pradow - if ((Couplers[b].CouplingFlag and ctrain_power) = ctrain_power)or(((Couplers[b].CouplingFlag and ctrain_heating) = ctrain_heating)and(Heating)) then //jesli spiety - begin - if (HVCouplers[b][1]) > 1 then //przewod pod napiecie - HVCouplers[b][0]:=Couplers[b].Connected.HVCouplers[1-Couplers[b].ConnectedNr][0]+Iheat//obciążenie - else - HVCouplers[b][0]:=0; - end - else //pierwszy pojazd - begin - if (HVCouplers[b][1]) > 1 then //pod napieciem - HVCouplers[b][0]:=0+Iheat//obciążenie - else - HVCouplers[b][0]:=0; - end; -} ClearPendingExceptions; if not TestFlag(DamageFlag,dtrain_out) then @@ -4888,7 +4902,7 @@ begin RunningTraction:=ElectricTraction; with ElectricTraction do if not DynamicBrakeFlag then - RunningTraction.TractionVoltage:=TractionVoltage-Abs(TractionResistivity*(Itot+HVCouplers[0][0]+HVCouplers[1][0])) + RunningTraction.TractionVoltage:=TractionVoltage{-Abs(TractionResistivity*(Itot+HVCouplers[0][0]+HVCouplers[1][0]))} else RunningTraction.TractionVoltage:=TractionVoltage-Abs(TractionResistivity*Itot*0); //zasadniczo ED oporowe nie zmienia napięcia w sieci end; @@ -7357,7 +7371,14 @@ begin SST[k].Pmax:=Min0R(SST[k].Pmax,sqr(SST[k].Umax)/47.6); end; end; + end + else if (Pos('ffList:',lines)>0) then {dla asynchronow} + begin + RListSize:=s2b(DUE(ExtractKeyWord(lines,'Size='))); + for k:=0 to RListSize do + readln(fin, DEList[k].rpm, DEList[k].genpower) end; + end; end; {koniec filtru importu parametrow} if ConversionError=0 then diff --git a/Model3d.cpp b/Model3d.cpp index 435b6fdd..90a3c309 100644 --- a/Model3d.cpp +++ b/Model3d.cpp @@ -91,7 +91,8 @@ void TSubModel::FirstInit() Child = NULL; TextureID = 0; // TexAlpha=false; - iFlags = 0x0200; // bit 9=1: submodel został utworzony a nie ustawiony na wczytany plik + iFlags = 0x0200; // bit 9=1: submodel został utworzony a nie ustawiony na + // wczytany plik // TexHash=false; // Hits=NULL; // CollisionPts=NULL; @@ -137,15 +138,17 @@ TSubModel::~TSubModel() delete[] pName; } /* - else - {//wczytano z pliku binarnego (nie jest właścicielem tablic) - } + else + {//wczytano z pliku binarnego (nie jest właścicielem tablic) + } */ - delete[] smLetter; // używany tylko roboczo dla TP_TEXT, do przyspieszenia wyświetlania + delete[] smLetter; // używany tylko roboczo dla TP_TEXT, do przyspieszenia + // wyświetlania }; void TSubModel::TextureNameSet(const char *n) -{ // ustawienie nazwy submodelu, o ile nie jest wczytany z E3D +{ // ustawienie nazwy submodelu, o + // ile nie jest wczytany z E3D if (iFlags & 0x0200) { // tylko jeżeli submodel zosta utworzony przez new delete[] pTexture; // usunięcie poprzedniej @@ -161,7 +164,8 @@ void TSubModel::TextureNameSet(const char *n) }; void TSubModel::NameSet(const char *n) -{ // ustawienie nazwy submodelu, o ile nie jest wczytany z E3D +{ // ustawienie nazwy submodelu, o ile + // nie jest wczytany z E3D if (iFlags & 0x0200) { // tylko jeżeli submodel zosta utworzony przez new delete[] pName; // usunięcie poprzedniej @@ -176,10 +180,13 @@ void TSubModel::NameSet(const char *n) } }; -// int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX +// int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 +// *pt,GLVERTEX // *Vertices) int TSubModel::SeekFaceNormal(DWORD *Masks, int f, DWORD dwMask, float3 *pt, float8 *Vertices) -{ // szukanie punktu stycznego do (pt), zwraca numer wierzchołka, a nie trójkąta +{ // szukanie punktu stycznego + // do (pt), zwraca numer + // wierzchołka, a nie trójkąta int iNumFaces = iNumVerts / 3; // bo maska powierzchni jest jedna na trójkąt // GLVERTEX *p; //roboczy wskaźnik float8 *p; // roboczy wskaźnik @@ -269,13 +276,16 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) parser >> token; NameSet(token.c_str()); if (dynamic) - { // dla pojazdu, blokujemy załączone submodele, które mogą być nieobsługiwane + { // dla pojazdu, blokujemy załączone submodele, które mogą być + // nieobsługiwane if (token.find("_on") + 3 == token.length()) // jeśli nazwa kończy się na "_on" iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z obiektem "_off" } - else // dla pozostałych modeli blokujemy zapalone światła, które mogą być nieobsługiwane + else // dla pozostałych modeli blokujemy zapalone światła, które mogą być + // nieobsługiwane if (token.find("Light_On") == 0) // jeśli nazwa zaczyna się od "Light_On" - iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z obiektem "Light_Off" + iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z obiektem + // "Light_Off" if (parser.expectToken("anim:")) // Ra: ta informacja by się przydała! { // rodzaj animacji @@ -358,7 +368,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) parser.getToken(fCosHotspotAngle); // kąt liczony dla średnicy, a nie promienia fCosHotspotAngle = cos(DegToRad(0.5 * fCosHotspotAngle)); iNumVerts = 1; - iFlags |= 0x4010; // rysowane w cyklu nieprzezroczystych, macierz musi zostać bez zmiany + iFlags |= 0x4010; // rysowane w cyklu nieprzezroczystych, macierz musi + // zostać bez zmiany } else if (eType < TP_ROTATOR) { @@ -417,7 +428,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) szTexturePath, Global::asCurrentTexturePath.c_str(), texture); // TexAlpha=TTexturesManager::GetAlpha(TextureID); // iFlags|=TexAlpha?0x20:0x10; //0x10-nieprzezroczysta, 0x20-przezroczysta - if (Opacity < 1.0) // przezroczystość z tekstury brana tylko dla Opacity 0! + if (Opacity < 1.0) // przezroczystość z tekstury brana tylko dla Opacity + // 0! iFlags |= TTexturesManager::GetAlpha(TextureID) ? 0x20 : 0x10; // 0x10-nieprzezroczysta, 0x20-przezroczysta @@ -449,15 +461,17 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) if (eType < TP_ROTATOR) { // wczytywanie wierzchołków parser.ignoreToken(); - // Ra 15-01: to wczytać jako tekst - jeśli pierwszy znak zawiera "*", to dalej będzie nazwa - // wcześniejszego submodelu, z którego należy wziąć wierzchołki - // zapewni to jakąś zgodność wstecz, bo zamiast liczby będzie ciąg, którego wartość powinna - // być uznana jako zerowa + // Ra 15-01: to wczytać jako tekst - jeśli pierwszy znak zawiera "*", to + // dalej będzie nazwa wcześniejszego submodelu, z którego należy wziąć + // wierzchołki + // zapewni to jakąś zgodność wstecz, bo zamiast liczby będzie ciąg, którego + // wartość powinna być uznana jako zerowa // parser.getToken(iNumVerts); parser.getToken(token); if (token[0] == '*') - { // jeśli pierwszy znak jest gwiazdką, poszukać submodelu o nazwie bez tej gwiazdki i wziąć - // z niego wierzchołki + { // jeśli pierwszy znak jest gwiazdką, poszukać + // submodelu o nazwie bez tej gwiazdki i wziąć z + // niego wierzchołki Error("Verticles reference not yet supported!"); } else @@ -474,19 +488,23 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) { Vertices = new float8[iNumVerts]; iNumFaces = iNumVerts / 3; - sg = new DWORD[iNumFaces]; // maski powierzchni: 0 oznacza brak użredniania wektorów - // normalnych - int *wsp = new int[iNumVerts]; // z którego wierzchołka kopiować wektor normalny + sg = new DWORD[iNumFaces]; // maski powierzchni: 0 oznacza brak + // użredniania wektorów normalnych + int *wsp = new int[iNumVerts]; // z którego wierzchołka kopiować wektor + // normalny int maska = 0; for (int i = 0; i < iNumVerts; i++) - { // Ra: z konwersją na układ scenerii - będzie wydajniejsze wyświetlanie + { // Ra: z konwersją na układ scenerii - będzie wydajniejsze + // wyświetlanie wsp[i] = -1; // wektory normalne nie są policzone dla tego wierzchołka if ((i % 3) == 0) - { // jeśli będzie maska -1, to dalej będą wierzchołki z wektorami normalnymi, - // podanymi jawnie + { // jeśli będzie maska -1, to dalej będą + // wierzchołki z wektorami normalnymi, podanymi + // jawnie parser.getToken(maska); // maska powierzchni trójkąta - sg[i / 3] = (maska == -1) ? 0 : maska; // dla maski -1 będzie 0, czyli nie - // ma wspólnych wektorów normalnych + sg[i / 3] = (maska == -1) ? 0 : maska; // dla maski -1 będzie 0, + // czyli nie ma wspólnych + // wektorów normalnych } parser.getToken(Vertices[i].Point.x); parser.getToken(Vertices[i].Point.y); @@ -512,15 +530,15 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) WriteLog(AnsiString("Degenerated triangle ignored in: \"") + AnsiString(pName) + "\", verticle " + AnsiString(i)); } - if (i > 0) // jeśli pierwszy trójkąt będzie zdegenerowany, to zostanie - // usunięty i nie ma co sprawdzać + if (i > 0) // jeśli pierwszy trójkąt będzie zdegenerowany, to + // zostanie usunięty i nie ma co sprawdzać if (((Vertices[i].Point - Vertices[i - 1].Point).Length() > 1000.0) || ((Vertices[i - 1].Point - Vertices[i - 2].Point).Length() > 1000.0) || ((Vertices[i - 2].Point - Vertices[i].Point).Length() > 1000.0)) - { // jeżeli są dalej niż 2km od siebie //Ra 15-01: obiekt wstawiany nie - // powinien być większy niż 300m (trójkąty terenu w E3D mogą mieć - // 1.5km) + { // jeżeli są dalej niż 2km od siebie //Ra 15-01: + // obiekt wstawiany nie powinien być większy niż + // 300m (trójkąty terenu w E3D mogą mieć 1.5km) --iNumFaces; // o jeden trójkąt mniej iNumVerts -= 3; // czyli o 3 wierzchołki i -= 3; // wczytanie kolejnego w to miejsce @@ -531,8 +549,9 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) } int i; // indeks dla trójkątów float3 *n = new float3[iNumFaces]; // tablica wektorów normalnych dla trójkątów - for (i = 0; i < iNumFaces; i++) // pętla po trójkątach - będzie szybciej, jak - // wstępnie przeliczymy normalne trójkątów + for (i = 0; i < iNumFaces; i++) // pętla po trójkątach - będzie + // szybciej, jak wstępnie przeliczymy + // normalne trójkątów n[i] = SafeNormalize( CrossProduct(Vertices[i * 3].Point - Vertices[i * 3 + 1].Point, Vertices[i * 3].Point - Vertices[i * 3 + 2].Point)); @@ -541,8 +560,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) float3 norm; // roboczy wektor normalny for (v = 0; v < iNumVerts; v++) { // pętla po wierzchołkach trójkątów - if (wsp[v] >= - 0) // jeśli już był liczony wektor normalny z użyciem tego wierzchołka + if (wsp[v] >= 0) // jeśli już był liczony wektor normalny z użyciem + // tego wierzchołka Vertices[v].Normal = Vertices[wsp[v]].Normal; // to wystarczy skopiować policzony wcześniej else @@ -551,15 +570,16 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) norm = float3(0, 0, 0); // liczenie zaczynamy od zera f = v; // zaczynamy dodawanie wektorów normalnych od własnego while (f >= 0) - { // sumowanie z wektorem normalnym sąsiada (włącznie ze sobą) + { // sumowanie z wektorem normalnym sąsiada (włącznie + // ze sobą) wsp[f] = v; // informacja, że w tym wierzchołku jest już policzony // wektor normalny norm += n[f / 3]; f = SeekFaceNormal(sg, f / 3 + 1, sg[i], &Vertices[v].Point, Vertices); // i szukanie od kolejnego trójkąta } - // Ra 15-01: należało by jeszcze uwzględnić skalowanie wprowadzane przez - // transformy, aby normalne po przeskalowaniu były jednostkowe + // Ra 15-01: należało by jeszcze uwzględnić skalowanie wprowadzane + // przez transformy, aby normalne po przeskalowaniu były jednostkowe Vertices[v].Normal = SafeNormalize(norm); // przepisanie do wierzchołka trójkąta } @@ -576,7 +596,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) } // obsługa submodelu z własną listą wierzchołków } else if (eType == TP_STARS) - { // punkty świecące dookólnie - składnia jak dla smt_Mesh + { // punkty świecące dookólnie - składnia jak + // dla smt_Mesh parser.ignoreToken(); parser.getToken(iNumVerts); // Vertices=new GLVERTEX[iNumVerts]; @@ -604,7 +625,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) }; int TSubModel::TriangleAdd(TModel3d *m, int tex, int tri) -{ // dodanie trójkątów do submodelu, używane przy tworzeniu E3D terenu +{ // dodanie trójkątów do submodelu, używane + // przy tworzeniu E3D terenu TSubModel *s = this; while (s ? (s->TextureID != tex) : false) { // szukanie submodelu o danej teksturze @@ -636,7 +658,8 @@ int TSubModel::TriangleAdd(TModel3d *m, int tex, int tri) }; float8 *__fastcall TSubModel::TrianglePtr(int tex, int pos, int *la, int *ld, int *ls) -{ // zwraca wskaźnik do wypełnienia tabeli wierzchołków, używane przy tworzeniu E3D terenu +{ // zwraca wskaźnik do wypełnienia tabeli wierzchołków, używane + // przy tworzeniu E3D terenu TSubModel *s = this; while (s ? s->TextureID != tex : false) { // szukanie submodelu o danej teksturze @@ -660,7 +683,8 @@ float8 *__fastcall TSubModel::TrianglePtr(int tex, int pos, int *la, int *ld, in }; void TSubModel::DisplayLists() -{ // utworznie po jednej skompilowanej liście dla każdego submodelu +{ // utworznie po jednej skompilowanej liście dla + // każdego submodelu if (Global::bUseVBO) return; // Ra: przy VBO to się nie przyda // iFlags|=0x4000; //wyłączenie przeliczania wierzchołków, bo nie są zachowane @@ -682,9 +706,9 @@ void TSubModel::DisplayLists() for (int i = 0; i < iNumVerts; i++) { /* - glNormal3dv(&Vertices[i].Normal.x); - glTexCoord2f(Vertices[i].tu,Vertices[i].tv); - glVertex3dv(&Vertices[i].Point.x); + glNormal3dv(&Vertices[i].Normal.x); + glTexCoord2f(Vertices[i].tu,Vertices[i].tv); + glVertex3dv(&Vertices[i].Point.x); */ glNormal3fv(&Vertices[i].Normal.x); glTexCoord2f(Vertices[i].tu, Vertices[i].tv); @@ -738,7 +762,8 @@ void TSubModel::DisplayLists() glMaterialfv(GL_FRONT, GL_EMISSION, emm2); glEndList(); } - // SafeDeleteArray(Vertices); //przy VBO muszą zostać do załadowania całego modelu + // SafeDeleteArray(Vertices); //przy VBO muszą zostać do załadowania całego + // modelu if (Child) Child->DisplayLists(); if (Next) @@ -762,11 +787,12 @@ void TSubModel::InitialRotate(bool doit) iFlags &= ~0x8000; // jednak jednostkowa po obróceniu } if (Child) - Child->InitialRotate( - false); // potomnych nie obracamy już, tylko ewentualnie optymalizujemy + Child->InitialRotate(false); // potomnych nie obracamy już, tylko + // ewentualnie optymalizujemy else if (Global::iConvertModels & 2) // optymalizacja jest opcjonalna if ((iFlags & 0xC000) == 0x8000) // o ile nie ma animacji - { // jak nie ma potomnych, można wymnożyć przez transform i wyjedynkować go + { // jak nie ma potomnych, można wymnożyć przez transform i wyjedynkować + // go float4x4 *mat = GetMatrix(); // transform submodelu if (Vertices) { @@ -774,8 +800,8 @@ void TSubModel::InitialRotate(bool doit) Vertices[i].Point = (*mat) * Vertices[i].Point; (*mat)(3)[0] = (*mat)(3)[1] = (*mat)(3)[2] = 0.0; // zerujemy przesunięcie przed obracaniem normalnych - if (eType != TP_STARS) // gwiazdki mają kolory zamiast normalnych, to ich wtedy - // nie ruszamy + if (eType != TP_STARS) // gwiazdki mają kolory zamiast normalnych, to + // ich wtedy nie ruszamy for (int i = 0; i < iNumVerts; ++i) Vertices[i].Normal = SafeNormalize((*mat) * Vertices[i].Normal); } @@ -785,7 +811,8 @@ void TSubModel::InitialRotate(bool doit) } else // jak jest jednostkowy i nie ma animacji if (doit) - { // jeśli jest jednostkowy transform, to przeliczamy wierzchołki, a mnożenie podajemy dalej + { // jeśli jest jednostkowy transform, to przeliczamy + // wierzchołki, a mnożenie podajemy dalej double t; if (Vertices) for (int i = 0; i < iNumVerts; ++i) @@ -809,7 +836,8 @@ void TSubModel::InitialRotate(bool doit) void TSubModel::ChildAdd(TSubModel *SubModel) { // dodanie submodelu potemnego (uzależnionego) - // Ra: zmiana kolejności, żeby kolejne móc renderować po aktualnym (było przed) + // Ra: zmiana kolejności, żeby kolejne móc renderować po aktualnym (było + // przed) if (SubModel) SubModel->NextAdd(Child); // Ra: zmiana kolejności renderowania Child = SubModel; @@ -826,7 +854,8 @@ void TSubModel::NextAdd(TSubModel *SubModel) int TSubModel::FlagsCheck() { // analiza koniecznych zmian pomiędzy submodelami // samo pomijanie glBindTexture() nie poprawi wydajności - // ale można sprawdzić, czy można w ogóle pominąć kod do tekstur (sprawdzanie replaceskin) + // ale można sprawdzić, czy można w ogóle pominąć kod do tekstur (sprawdzanie + // replaceskin) int i; if (Child) { // Child jest renderowany po danym submodelu @@ -836,7 +865,8 @@ int TSubModel::FlagsCheck() i = Child->FlagsCheck(); iFlags |= 0x00FF0000 & ((i << 16) | (i) | (i >> 8)); // potomny, rodzeństwo i dzieci if (eType == TP_TEXT) - { // wyłączenie renderowania Next dla znaków wyświetlacza tekstowego + { // wyłączenie renderowania Next dla znaków + // wyświetlacza tekstowego TSubModel *p = Child; while (p) { @@ -846,21 +876,23 @@ int TSubModel::FlagsCheck() } } if (Next) - { // Next jest renderowany po danym submodelu (kolejność odwrócona po wczytaniu T3D) + { // Next jest renderowany po danym submodelu (kolejność odwrócona + // po wczytaniu T3D) if (TextureID) // o ile dany ma teksturę if ((TextureID != Next->TextureID) || (i & 0x00800000)) // a ma inną albo dzieci zmieniają iFlags |= 0x80; // to dany submodel musi sobie ją ustawiać i = Next->FlagsCheck(); iFlags |= 0xFF000000 & ((i << 24) | (i << 8) | (i)); // następny, kolejne i ich dzieci - // tekstury nie ustawiamy tylko wtedy, gdy jest taka sama jak Next i jego dzieci nie - // zmieniają + // tekstury nie ustawiamy tylko wtedy, gdy jest taka sama jak Next i jego + // dzieci nie zmieniają } return iFlags; }; void TSubModel::SetRotate(float3 vNewRotateAxis, float fNewAngle) -{ // obrócenie submodelu wg podanej osi (np. wskazówki w kabinie) +{ // obrócenie submodelu wg podanej + // osi (np. wskazówki w kabinie) v_RotateAxis = vNewRotateAxis; f_Angle = fNewAngle; if (fNewAngle != 0.0) @@ -872,7 +904,9 @@ void TSubModel::SetRotate(float3 vNewRotateAxis, float fNewAngle) } void TSubModel::SetRotateXYZ(float3 vNewAngles) -{ // obrócenie submodelu o podane kąty wokół osi lokalnego układu +{ // obrócenie submodelu o + // podane kąty wokół osi + // lokalnego układu v_Angles = vNewAngles; b_Anim = at_RotateXYZ; b_aAnim = at_RotateXYZ; @@ -880,7 +914,9 @@ void TSubModel::SetRotateXYZ(float3 vNewAngles) } void TSubModel::SetRotateXYZ(vector3 vNewAngles) -{ // obrócenie submodelu o podane kąty wokół osi lokalnego układu +{ // obrócenie submodelu o + // podane kąty wokół osi + // lokalnego układu v_Angles.x = vNewAngles.x; v_Angles.y = vNewAngles.y; v_Angles.z = vNewAngles.z; @@ -908,7 +944,9 @@ void TSubModel::SetTranslate(vector3 vNewTransVector) } void TSubModel::SetRotateIK1(float3 vNewAngles) -{ // obrócenie submodelu o podane kąty wokół osi lokalnego układu +{ // obrócenie submodelu o + // podane kąty wokół osi + // lokalnego układu v_Angles = vNewAngles; iAnimOwner = iInstance; // zapamiętanie czyja jest animacja } @@ -1004,13 +1042,14 @@ void TSubModel::RaAnimation(TAnimType a) break; case at_Billboard: // obrót w pionie do kamery { - matrix4x4 mat; // potrzebujemy współrzędne przesunięcia środka układu współrzędnych - // submodelu + matrix4x4 mat; // potrzebujemy współrzędne przesunięcia środka układu + // współrzędnych submodelu glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray()); // pobranie aktualnej matrycy float3 gdzie = float3(mat[3][0], mat[3][1], mat[3][2]); // początek układu współrzędnych submodelu względem kamery glLoadIdentity(); // macierz jedynkowa - glTranslatef(gdzie.x, gdzie.y, gdzie.z); // początek układu zostaje bez zmian + glTranslatef(gdzie.x, gdzie.y, gdzie.z); // początek układu zostaje bez + // zmian glRotated(atan2(gdzie.x, gdzie.z) * 180.0 / M_PI, 0.0, 1.0, 0.0); // jedynie obracamy w pionie o kąt } @@ -1024,7 +1063,8 @@ void TSubModel::RaAnimation(TAnimType a) glRotated(-fmod(Global::fTimeAngleDeg, 360.0), 0.0, 1.0, 0.0); // obrót dobowy osi OX break; case at_IK11: // ostatni element animacji szkieletowej (podudzie, stopa) - glRotatef(v_Angles.z, 0.0, 1.0, 0.0); // obrót względem osi pionowej (azymut) + glRotatef(v_Angles.z, 0.0, 1.0, 0.0); // obrót względem osi pionowej + // (azymut) glRotatef(v_Angles.x, 1.0, 0.0, 0.0); // obrót względem poziomu (deklinacja) break; case at_DigiClk: // animacja zegara cyfrowego @@ -1034,9 +1074,10 @@ void TSubModel::RaAnimation(TAnimType a) { // pętla po submodelach potomnych i obracanie ich o kąt zależy od czasu if (sm->pName) { // musi mieć niepustą nazwę - if ((*sm->pName) >= '0') - if ((*sm->pName) <= '5') // zegarek ma 6 cyfr maksymalnie - sm->SetRotate(float3(0, 1, 0), -Global::fClockAngleDeg[(*sm->pName) - '0']); + if ((sm->pName[0]) >= '0') + if ((sm->pName[0]) <= '5') // zegarek ma 6 cyfr maksymalnie + sm->SetRotate(float3(0, 1, 0), + -Global::fClockAngleDeg[(sm->pName[0]) - '0']); } sm = sm->NextGet(); } while (sm); @@ -1093,8 +1134,8 @@ void TSubModel::RenderDL() if (fCosViewAngle > fCosFalloffAngle) // kąt większy niż maksymalny stożek swiatła { double Distdimm = 1.0; - if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasność między Hotspot a - // Falloff + if (fCosViewAngle < + fCosHotspotAngle) // zmniejszona jasność między Hotspot a Falloff if (fCosFalloffAngle < fCosHotspotAngle) Distdimm = 1.0 - (fCosHotspotAngle - fCosViewAngle) / @@ -1102,20 +1143,21 @@ void TSubModel::RenderDL() glColor3f(f4Diffuse[0] * Distdimm, f4Diffuse[1] * Distdimm, f4Diffuse[2] * Distdimm); /* TODO: poprawic to zeby dzialalo - if (iFarAttenDecay>0) - switch (iFarAttenDecay) - { - case 1: - Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); //dorobic od - kata - break; - case 2: - Distdimm=fFarDecayRadius/(1+fSquareDist); //dorobic od kata - break; - } - if (Distdimm>1) - Distdimm=1; - glColor3f(Diffuse[0]*Distdimm,Diffuse[1]*Distdimm,Diffuse[2]*Distdimm); + if (iFarAttenDecay>0) + switch (iFarAttenDecay) + { + case 1: + Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); + //dorobic od kata + break; + case 2: + Distdimm=fFarDecayRadius/(1+fSquareDist); + //dorobic od kata + break; + } + if (Distdimm>1) + Distdimm=1; + glColor3f(Diffuse[0]*Distdimm,Diffuse[1]*Distdimm,Diffuse[2]*Distdimm); */ // glPopMatrix(); // return; @@ -1124,7 +1166,8 @@ void TSubModel::RenderDL() } else if (eType == TP_STARS) { - // glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie blendowaly + // glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie + // blendowaly if (Global::fLuminance < fLight) { glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo @@ -1184,12 +1227,14 @@ void TSubModel::RenderAlphaDL() } if (Child != NULL) if (eType == TP_TEXT) - { // tekst renderujemy w specjalny sposób, zamiast submodeli z łańcucha Child + { // tekst renderujemy w specjalny sposób, zamiast + // submodeli z łańcucha Child int i, j = pasText->Length(); TSubModel *p; char c; if (!smLetter) - { // jeśli nie ma tablicy, to ją stworzyć; miejsce nieodpowiednie, ale tymczasowo + { // jeśli nie ma tablicy, to ją stworzyć; miejsce + // nieodpowiednie, ale tymczasowo // może być smLetter = new TSubModel *[256]; // tablica wskaźników submodeli dla // wyświetlania tekstu @@ -1248,7 +1293,8 @@ void TSubModel::RenderVBO() else glBindTexture(GL_TEXTURE_2D, TextureID); // również 0 glColor3fv(f4Diffuse); // McZapkie-240702: zamiast ub - // glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,f4Diffuse); //to samo, co glColor + // glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,f4Diffuse); //to samo, + // co glColor if (Global::fLuminance < fLight) { glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo @@ -1271,8 +1317,8 @@ void TSubModel::RenderVBO() if (fCosViewAngle > fCosFalloffAngle) // kąt większy niż maksymalny stożek swiatła { double Distdimm = 1.0; - if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasność między Hotspot a - // Falloff + if (fCosViewAngle < + fCosHotspotAngle) // zmniejszona jasność między Hotspot a Falloff if (fCosFalloffAngle < fCosHotspotAngle) Distdimm = 1.0 - (fCosHotspotAngle - fCosViewAngle) / @@ -1280,30 +1326,36 @@ void TSubModel::RenderVBO() /* TODO: poprawic to zeby dzialalo - 2- Inverse (Applies inverse decay. The formula is luminance=R0/R, where R0 is - the radial source of the light if no attenuation is used, or the Near End - value of the light if Attenuation is used. R is the radial distance of the - illuminated surface from R0.) + 2- Inverse (Applies inverse decay. The formula is luminance=R0/R, where + R0 is + the radial source of the light if no attenuation is + used, or the Near End + value of the light if Attenuation is used. R is the + radial distance of the + illuminated surface from R0.) - 3- Inverse Square (Applies inverse-square decay. The formula for this is (R0/R)^2. - This is actually the "real-world" decay of light, but you might find it too dim - in the world of computer graphics.) + 3- Inverse Square (Applies inverse-square decay. The formula for this is + (R0/R)^2. + This is actually the "real-world" decay of light, but + you might find it too dim + in the world of computer graphics.) .DecayRadius -- The distance over which the decay occurs. - if (iFarAttenDecay>0) - switch (iFarAttenDecay) - { - case 1: - Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); //dorobic od - kata - break; - case 2: - Distdimm=fFarDecayRadius/(1+fSquareDist); //dorobic od kata - break; - } - if (Distdimm>1) - Distdimm=1; + if (iFarAttenDecay>0) + switch (iFarAttenDecay) + { + case 1: + Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); + //dorobic od kata + break; + case 2: + Distdimm=fFarDecayRadius/(1+fSquareDist); + //dorobic od kata + break; + } + if (Distdimm>1) + Distdimm=1; */ glBindTexture(GL_TEXTURE_2D, 0); // nie teksturować @@ -1313,10 +1365,12 @@ void TSubModel::RenderVBO() f4Diffuse[2] * Distdimm, 0}; // glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm); glColorMaterial(GL_FRONT, GL_EMISSION); - glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly + glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie + // blendowaly glColor3fv(color); // inaczej są białe glMaterialfv(GL_FRONT, GL_EMISSION, color); - glDrawArrays(GL_POINTS, iVboPtr, iNumVerts); // narysuj wierzchołek z VBO + glDrawArrays(GL_POINTS, iVboPtr, iNumVerts); // narysuj wierzchołek z + // VBO glEnable(GL_LIGHTING); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // co ma ustawiać glColor glMaterialfv(GL_FRONT, GL_EMISSION, emm2); // bez tego słupy się świecą @@ -1324,16 +1378,21 @@ void TSubModel::RenderVBO() } else if (eType == TP_STARS) { - // glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie blendowaly + // glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie + // blendowaly if (Global::fLuminance < fLight) - { // Ra: pewnie można by to zrobić lepiej, bez powtarzania StartVBO() + { // Ra: pewnie można by to zrobić + // lepiej, bez powtarzania StartVBO() pRoot->EndVBO(); // Ra: to też nie jest zbyt ładne if (pRoot->StartColorVBO()) - { // wyświetlanie kolorowych punktów zamiast trójkątów + { // wyświetlanie kolorowych punktów zamiast + // trójkątów glBindTexture(GL_TEXTURE_2D, 0); // tekstury nie ma glColorMaterial(GL_FRONT, GL_EMISSION); - glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly - // glMaterialfv(GL_FRONT,GL_EMISSION,f4Diffuse); //zeby swiecilo na kolorowo + glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie + // blendowaly + // glMaterialfv(GL_FRONT,GL_EMISSION,f4Diffuse); //zeby swiecilo na + // kolorowo glDrawArrays(GL_POINTS, iVboPtr, iNumVerts); // narysuj naraz wszystkie punkty z VBO glEnable(GL_LIGHTING); @@ -1345,9 +1404,9 @@ void TSubModel::RenderVBO() } } /*Ra: tu coś jest bez sensu... - else - { - glBindTexture(GL_TEXTURE_2D, 0); + else + { + glBindTexture(GL_TEXTURE_2D, 0); // if (eType==smt_FreeSpotLight) // { // if (iFarAttenDecay==0) @@ -1355,18 +1414,20 @@ void TSubModel::RenderVBO() // } // else //TODO: poprawic zeby dzialalo - glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]); - glColorMaterial(GL_FRONT,GL_EMISSION); - glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty swiecace sie blendowaly - //glBegin(GL_POINTS); - glDrawArrays(GL_POINTS,iVboPtr,iNumVerts); //narysuj wierzchołek z VBO - // glVertex3f(0,0,0); - //glEnd(); - glEnable(GL_LIGHTING); - glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); - glMaterialfv(GL_FRONT,GL_EMISSION,emm2); - //glEndList(); - } + glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]); + glColorMaterial(GL_FRONT,GL_EMISSION); + glDisable(GL_LIGHTING); //Tolaris-030603: bo mu punkty + swiecace sie blendowaly + //glBegin(GL_POINTS); + glDrawArrays(GL_POINTS,iVboPtr,iNumVerts); //narysuj + wierzchołek z VBO + // glVertex3f(0,0,0); + //glEnd(); + glEnable(GL_LIGHTING); + glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); + glMaterialfv(GL_FRONT,GL_EMISSION,emm2); + //glEndList(); + } */ if (Child != NULL) if (iAlpha & iFlags & 0x001F0000) @@ -1459,7 +1520,8 @@ void TSubModel::RaArrayFill(CVertNormTex *Vert) }; void TSubModel::Info() -{ // zapisanie informacji o submodelu do obiektu pomocniczego +{ // zapisanie informacji o submodelu do obiektu + // pomocniczego TSubModelInfo *info = TSubModelInfo::pTable + TSubModelInfo::iCurrent; info->pSubModel = this; if (fMatrix && (iFlags & 0x8000)) // ma matrycę i jest ona niejednostkowa @@ -1474,7 +1536,8 @@ void TSubModel::Info() } if (info->iTexture < 0) // jeśli nie znaleziono we wcześniejszych { - info->iTexture = ++info->iTotalTextures; // przydzielenie numeru tekstury w pliku (od 1) + info->iTexture = ++info->iTotalTextures; // przydzielenie numeru tekstury + // w pliku (od 1) AnsiString t = AnsiString(pTexture); if (t.SubString(t.Length() - 3, 4) == ".tga") t.Delete(t.Length() - 3, 4); @@ -1510,7 +1573,9 @@ void TSubModel::Info() }; void TSubModel::InfoSet(TSubModelInfo *info) -{ // ustawienie danych wg obiektu pomocniczego do zapisania w pliku +{ // ustawienie danych wg obiektu + // pomocniczego do zapisania w + // pliku int ile = (char *)&uiDisplayList - (char *)&eType; // ilość bajtów pomiędzy tymi zmiennymi ZeroMemory(this, sizeof(TSubModel)); // zerowaie całości CopyMemory(this, info->pSubModel, ile); // skopiowanie pamięci 1:1 @@ -1538,14 +1603,16 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS pName = n->String(iName); AnsiString s = AnsiString(pName); if (!s.IsEmpty()) - { // jeśli dany submodel jest zgaszonym światłem, to domyślnie go ukrywamy + { // jeśli dany submodel jest zgaszonym światłem, to + // domyślnie go ukrywamy if (s.SubString(1, 8) == "Light_On") // jeśli jest światłem numerowanym - iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z obiektem - // "Light_Off" + iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z + // obiektem "Light_Off" else if (dynamic) // inaczej wyłączało smugę w latarniach if (s.SubString(s.Length() - 2, 3) == "_on") // jeśli jest kontrolką w stanie zapalonym - iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z obiektem "_off" + iVisible = 0; // to domyślnie wyłączyć, żeby się nie nakładało z + // obiektem "_off" } } else @@ -1561,7 +1628,8 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS TextureID = TTexturesManager::GetTextureID(szTexturePath, Global::asCurrentTexturePath.c_str(), t.c_str()); // TexAlpha=TTexturesManager::GetAlpha(TextureID); //zmienna robocza - // ustawienie cyklu przezroczyste/nieprzezroczyste zależnie od własności stałej tekstury + // ustawienie cyklu przezroczyste/nieprzezroczyste zależnie od własności + // stałej tekstury // iFlags=(iFlags&~0x30)|(TTexturesManager::GetAlpha(TextureID)?0x20:0x10); // //0x10-nieprzezroczysta, 0x20-przezroczysta if (Opacity < 1.0) // przezroczystość z tekstury brana tylko dla Opacity 0! @@ -1572,12 +1640,15 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS iFlags |= 0x10; // normalnie nieprzezroczyste } b_aAnim = b_Anim; // skopiowanie animacji do drugiego cyklu - iFlags &= ~0x0200; // wczytano z pliku binarnego (nie jest właścicielem tablic) + iFlags &= ~0x0200; // wczytano z pliku binarnego (nie jest właścicielem + // tablic) Vertices = v + iVboPtr; - // if (!iNumVerts) eType=-1; //tymczasowo zmiana typu, żeby się nie renderowało na siłę + // if (!iNumVerts) eType=-1; //tymczasowo zmiana typu, żeby się nie + // renderowało na siłę }; void TSubModel::AdjustDist() -{ // aktualizacja odległości faz LoD, zależna od rozdzielczości pionowej oraz multisamplingu +{ // aktualizacja odległości faz LoD, zależna od + // rozdzielczości pionowej oraz multisamplingu if (fSquareMaxDist > 0.0) fSquareMaxDist *= Global::fDistanceFactor; if (fSquareMinDist > 0.0) @@ -1605,7 +1676,8 @@ void TSubModel::ColorsSet(int *a, int *d, int *s) }; void TSubModel::ParentMatrix(float4x4 *m) { // pobranie transformacji względem wstawienia modelu - // jeśli nie zostało wykonane Init() (tzn. zaraz po wczytaniu T3D), to dodatkowy obrót + // jeśli nie zostało wykonane Init() (tzn. zaraz po wczytaniu T3D), to + // dodatkowy obrót // obrót T3D jest wymagany np. do policzenia wysokości pantografów *m = float4x4(*fMatrix); // skopiowanie, bo będziemy mnożyć // m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie tak) @@ -1616,11 +1688,12 @@ void TSubModel::ParentMatrix(float4x4 *m) *m = *sm->Parent->GetMatrix() * *m; sm = sm->Parent; } - // dla ostatniego może być potrzebny dodatkowy obrót, jeśli wczytano z T3D, a nie obrócono - // jeszcze + // dla ostatniego może być potrzebny dodatkowy obrót, jeśli wczytano z T3D, a + // nie obrócono jeszcze }; float TSubModel::MaxY(const float4x4 &m) -{ // obliczenie maksymalnej wysokości, na początek ślizgu w pantografie +{ // obliczenie maksymalnej wysokości, + // na początek ślizgu w pantografie if (eType != 4) return 0; // tylko dla trójkątów liczymy if (iNumVerts < 1) @@ -1666,7 +1739,8 @@ TModel3d::~TModel3d() { // SafeDeleteArray(Materials); if (iFlags & 0x0200) - { // wczytany z pliku tekstowego, submodele sprzątają same + { // wczytany z pliku tekstowego, submodele sprzątają + // same SafeDelete(Root); // submodele się usuną rekurencyjnie } else @@ -1686,7 +1760,9 @@ TSubModel *__fastcall TModel3d::AddToNamed(const char *Name, TSubModel *SubModel }; void TModel3d::AddTo(TSubModel *tmp, TSubModel *SubModel) -{ // jedyny poprawny sposób dodawania submodeli, inaczej mogą zginąć przy zapisie E3D +{ // jedyny poprawny sposób dodawania + // submodeli, inaczej mogą zginąć + // przy zapisie E3D if (tmp) { // jeśli znaleziony, podłączamy mu jako potomny tmp->ChildAdd(SubModel); @@ -1784,13 +1860,13 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic) break; case 'SUB0': // submodele: 'SUB0',len,(256 bajtów na submodel) iSubModelsCount = (k - 2) / 64; - Root = (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy - // później + Root = + (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy później break; case 'SUB1': // submodele: 'SUB1',len,(320 bajtów na submodel) iSubModelsCount = (k - 2) / 80; - Root = (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy - // później + Root = + (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy później for (ch = 1; ch < iSubModelsCount; ++ch) // trzeba przesunąć bliżej, bo 256 wystarczy MoveMemory(((char *)Root) + 256 * ch, ((char *)Root) + 320 * ch, 256); @@ -1809,13 +1885,15 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic) break; case 'IDX4': // indeksy 4B: 'IDX4',len,(po 4 bajty na numer wierzchołka) break; - case 'TEX0': // tekstury: 'TEX0',len,(łańcuchy zakończone zerem - pliki tekstur) + case 'TEX0': // tekstury: 'TEX0',len,(łańcuchy zakończone zerem - pliki + // tekstur) Textures.Init((char *)(iModel + i)); //łącznie z nagłówkiem break; case 'TIX0': // indeks nazw tekstur Textures.InitIndex((int *)(iModel + i)); //łącznie z nagłówkiem break; - case 'NAM0': // nazwy: 'NAM0',len,(łańcuchy zakończone zerem - nazwy submodeli) + case 'NAM0': // nazwy: 'NAM0',len,(łańcuchy zakończone zerem - nazwy + // submodeli) Names.Init((char *)(iModel + i)); //łącznie z nagłówkiem break; case 'NIX0': // indeks nazw submodeli @@ -1853,25 +1931,30 @@ void TModel3d::LoadFromTextFile(char *FileName, bool dynamic) { std::string parent; // parser.getToken(parent); - parser.getTokens(1, false); // nazwa submodelu nadrzędnego bez zmieny na małe + parser.getTokens(1, false); // nazwa submodelu nadrzędnego bez zmieny na + // małe parser >> parent; if (parent == "") break; SubModel = new TSubModel(); iNumVerts += SubModel->Load(parser, this, iNumVerts, dynamic); - SubModel->Parent = AddToNamed( - parent.c_str(), SubModel); // będzie potrzebne do wyliczenia pozycji, np. pantografu + SubModel->Parent = + AddToNamed(parent.c_str(), + SubModel); // będzie potrzebne do wyliczenia pozycji, np. pantografu // iSubModelsCount++; parser.getToken(token); } - // Ra: od wersji 334 przechylany jest cały model, a nie tylko pierwszy submodel - // ale bujanie kabiny nadal używa bananów :( od 393 przywrócone, ale z dodatkowym warunkiem + // Ra: od wersji 334 przechylany jest cały model, a nie tylko pierwszy + // submodel + // ale bujanie kabiny nadal używa bananów :( od 393 przywrócone, ale z + // dodatkowym warunkiem if (Global::iConvertModels & 4) { // automatyczne banany czasem psuły przechylanie kabin... if (dynamic && Root) { if (Root->NextGet()) // jeśli ma jakiekolwiek kolejne - { // dynamic musi mieć "banana", bo tylko pierwszy obiekt jest animowany, a następne nie + { // dynamic musi mieć "banana", bo tylko pierwszy obiekt jest animowany, + // a następne nie SubModel = new TSubModel(); // utworzenie pustego SubModel->ChildAdd(Root); Root = SubModel; @@ -1883,16 +1966,19 @@ void TModel3d::LoadFromTextFile(char *FileName, bool dynamic) } void TModel3d::Init() -{ // obrócenie początkowe układu współrzędnych, dla pojazdów wykonywane po analizie animacji +{ // obrócenie początkowe układu współrzędnych, dla + // pojazdów wykonywane po analizie animacji if (iFlags & 0x8000) return; // operacje zostały już wykonane if (Root) { if (iFlags & 0x0200) // jeśli wczytano z pliku tekstowego - { // jest jakiś dziwny błąd, że obkręcany ma być tylko ostatni submodel głównego łańcucha + { // jest jakiś dziwny błąd, że obkręcany ma być tylko ostatni submodel + // głównego łańcucha // TSubModel *p=Root; // do - //{p->InitialRotate(true); //ostatniemu należy się konwersja układu współrzędnych + //{p->InitialRotate(true); //ostatniemu należy się konwersja układu + // współrzędnych // p=p->NextGet(); //} // while (p->NextGet()) @@ -1910,11 +1996,12 @@ void TModel3d::Init() { if (Global::fDistanceFactor != 1.0) // trochę zaoszczędzi czasu na modelach z wieloma submocelami - Root->AdjustDist(); // aktualizacja odległości faz LoD, zależnie od rozdzielczości - // pionowej oraz multisamplingu + Root->AdjustDist(); // aktualizacja odległości faz LoD, zależnie od + // rozdzielczości pionowej oraz multisamplingu if (Global::bUseVBO) { - if (!m_pVNT) // jeśli nie ma jeszcze tablicy (wczytano z pliku tekstowego) + if (!m_pVNT) // jeśli nie ma jeszcze tablicy (wczytano z pliku + // tekstowego) { // tworzenie tymczasowej tablicy z wierzchołkami całego modelu MakeArray(iNumVerts); // tworzenie tablic dla VBO Root->RaArrayFill(m_pVNT); // wypełnianie tablicy @@ -2027,7 +2114,8 @@ void TModel3d::BreakHierarhy() }; /* -void TModel3d::Render(vector3 pPosition,double fAngle,GLuint ReplacableSkinId,int iAlpha) +void TModel3d::Render(vector3 pPosition,double fAngle,GLuint +ReplacableSkinId,int iAlpha) { // glColor3f(1.0f,1.0f,1.0f); // glColor3f(0.0f,0.0f,0.0f); @@ -2080,7 +2168,8 @@ void TModel3d::RenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, int }; /* -void TModel3d::RaRender(vector3 pPosition,double fAngle,GLuint *ReplacableSkinId,int +void TModel3d::RaRender(vector3 pPosition,double fAngle,GLuint +*ReplacableSkinId,int iAlpha) { // glColor3f(1.0f,1.0f,1.0f); @@ -2100,7 +2189,8 @@ iAlpha) fSquareDist=SquareMagnitude(pos); */ /* - fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna globalna! + fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna +globalna! if (StartVBO()) {//odwrócenie flag, aby wyłapać nieprzezroczyste Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F); @@ -2142,14 +2232,16 @@ void TModel3d::RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, i }; /* -void TModel3d::RaRenderAlpha(vector3 pPosition,double fAngle,GLuint *ReplacableSkinId,int +void TModel3d::RaRenderAlpha(vector3 pPosition,double fAngle,GLuint +*ReplacableSkinId,int iAlpha) { glPushMatrix(); glTranslatef(pPosition.x,pPosition.y,pPosition.z); if (fAngle!=0) glRotatef(fAngle,0,1,0); - fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna globalna! + fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna +globalna! if (StartVBO()) {Root->ReplacableSet(ReplacableSkinId,iAlpha); Root->RaRenderAlpha(); @@ -2244,7 +2336,8 @@ void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *Replac //----------------------------------------------------------------------------- int TModel3d::TerrainCount() -{ // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy +{ // zliczanie kwadratów kilometrowych (główna + // linia po Next) do tworznia tablicy int i = 0; TSubModel *r = Root; while (r) @@ -2273,16 +2366,16 @@ void TModel3d::TerrainRenderVBO(int n) // if (vAngle->y!=0.0) glRotated(vAngle->y,0.0,1.0,0.0); // if (vAngle->x!=0.0) glRotated(vAngle->x,1.0,0.0,0.0); // if (vAngle->z!=0.0) glRotated(vAngle->z,0.0,0.0,1.0); - // TSubModel::fSquareDist=SquareMagnitude(*vPosition-Global::GetCameraPosition()); //zmienna - // globalna! + // TSubModel::fSquareDist=SquareMagnitude(*vPosition-Global::GetCameraPosition()); + // //zmienna globalna! if (StartVBO()) { // odwrócenie flag, aby wyłapać nieprzezroczyste // Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F); TSubModel *r = Root; while (r) { - if (r->iVisible == n) // tylko jeśli ma być widoczny w danej ramce (problem dla - // 0==false) + if (r->iVisible == + n) // tylko jeśli ma być widoczny w danej ramce (problem dla 0==false) r->RenderVBO(); // sub kolejne (Next) się nie wyrenderują r = r->NextGet(); } diff --git a/Train.cpp b/Train.cpp index 1b1922a9..c24aad4a 100644 --- a/Train.cpp +++ b/Train.cpp @@ -127,7 +127,7 @@ void TCab::Update() } for (i = 0; i < iButtons; ++i) { // animacje dwustanowe - // btList[i].Update(); //odczyt parametru i wybór submodelu + btList[i].Update(); // odczyt parametru i wybór submodelu } }; @@ -232,9 +232,10 @@ bool TTrain::Init(TDynamicObject *NewDynamicObject, bool e3d) // McZapkie: jazda luzem: // dsbRunningNoise=TSoundsManager::GetFromName("runningnoise.wav"); - // McZapkie? - dzwieki slyszalne tylko wewnatrz kabiny - generowane przez obiekt sterowany: + // McZapkie? - dzwieki slyszalne tylko wewnatrz kabiny - generowane przez + // obiekt sterowany: - // McZapkie-080302 sWentylatory.Init("wenton.wav","went.wav","wentoff.wav"); + // McZapkie-080302 sWentylatory.Init("wenton.wav","went.wav","wentoff.wav"); // McZapkie-010302 // sCompressor.Init("compressor-start.wav","compressor.wav","compressor-stop.wav"); @@ -303,8 +304,9 @@ void TTrain::OnKeyDown(int cKey) if (GetAsyncKeyState(VK_SHIFT) < 0) { // wciśnięty [Shift] - if (cKey == Global::Keys[k_IncMainCtrlFAST]) // McZapkie-200702: szybkie przelaczanie na - // poz. bezoporowa + if (cKey == Global::Keys[k_IncMainCtrlFAST]) // McZapkie-200702: szybkie + // przelaczanie na poz. + // bezoporowa { if (mvControlled->IncMainCtrl(2)) { @@ -394,7 +396,8 @@ void TTrain::OnKeyDown(int cKey) // if // (((mvControlled->TrainType==dt_EZT)||(mvControlled->EngineType==ElectricSeriesMotor)||(mvControlled->EngineType==DieselElectric))&&(!mvControlled->Battery)) if (!mvControlled->Battery) - { // wyłącznik jest też w SN61, ewentualnie załączać prąd na stałe z poziomu FIZ + { // wyłącznik jest też w SN61, ewentualnie + // załączać prąd na stałe z poziomu FIZ if (mvOccupied->BatterySwitch(true)) // bateria potrzebna np. do zapalenia świateł { dsbSwitch->Play(0, 0, 0); @@ -441,8 +444,9 @@ void TTrain::OnKeyDown(int cKey) else //----------- - if (cKey == - Global::Keys[k_BrakeProfile]) // McZapkie-240302-B: przelacznik opoznienia hamowania + if (cKey == Global::Keys[k_BrakeProfile]) // McZapkie-240302-B: + // przelacznik opoznienia + // hamowania { // yB://ABu: male poprawki, zeby bylo mozna ustawic dowolny wagon int CouplNr = -2; if (!FreeFlyModeFlag) @@ -492,12 +496,14 @@ void TTrain::OnKeyDown(int cKey) } else //----------- - // hunter-261211: przetwornica i sprzezarka przeniesione do TTrain::Update() - /* if (cKey==Global::Keys[k_Converter]) //NBMX 14-09-2003: przetwornica wl + // hunter-261211: przetwornica i sprzezarka przeniesione do + // TTrain::Update() + /* if (cKey==Global::Keys[k_Converter]) //NBMX 14-09-2003: + przetwornica wl { - if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || - (mvControlled->EnginePowerSource.SourceType!=CurrentCollector) || - (!Global::bLiveTraction)) + if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || + (mvControlled->EnginePowerSource.SourceType!=CurrentCollector) || + (!Global::bLiveTraction)) if (mvControlled->ConverterSwitch(true)) { dsbSwitch->SetVolume(DSBVOLUME_MAX); @@ -507,7 +513,8 @@ void TTrain::OnKeyDown(int cKey) else if (cKey==Global::Keys[k_Compressor]) //NBMX 14-09-2003: sprezarka wl { - if ((mvControlled->ConverterFlag) || (mvControlled->CompressorPower<2)) + if ((mvControlled->ConverterFlag) || + (mvControlled->CompressorPower<2)) if (mvControlled->CompressorSwitch(true)) { dsbSwitch->SetVolume(DSBVOLUME_MAX); @@ -537,14 +544,15 @@ void TTrain::OnKeyDown(int cKey) dsbSwitch->Play(0, 0, 0); } } - else if (cKey == Global::Keys[k_SmallCompressor]) // Winger 160404: mala sprezarka wl + else if (cKey == Global::Keys[k_SmallCompressor]) // Winger 160404: mala + // sprezarka wl { // Ra: dźwięk, gdy razem z [Shift] if ((mvControlled->TrainType & dt_EZT) ? mvControlled == mvOccupied : !mvOccupied->ActiveCab) // tylko w maszynowym if (Console::Pressed(VK_CONTROL)) // z [Ctrl] - mvControlled->bPantKurek3 = true; // zbiornik pantografu połączony jest ze - // zbiornikiem głównym (pompowanie nie ma - // sensu) + mvControlled->bPantKurek3 = true; // zbiornik pantografu połączony + // jest ze zbiornikiem głównym + // (pompowanie nie ma sensu) else if (!mvControlled->PantCompFlag) // jeśli wyłączona if (mvControlled->Battery) // jeszcze musi być załączona bateria if (mvControlled->PantPress < 4.8) // piszą, że to tak nie działa @@ -555,17 +563,20 @@ void TTrain::OnKeyDown(int cKey) } } else if (cKey == VkKeyScan('q')) // ze Shiftem - włączenie AI - { // McZapkie-240302 - wlaczanie automatycznego pilota (zadziala tylko w trybie debugmode) + { // McZapkie-240302 - wlaczanie automatycznego pilota (zadziala tylko w + // trybie debugmode) if (DynamicObject->Mechanik) { if (DebugModeFlag) - if (DynamicObject->Mechanik - ->AIControllFlag) //żeby nie trzeba było rozłączać dla zresetowania + if (DynamicObject->Mechanik->AIControllFlag) //żeby nie trzeba było + // rozłączać dla + // zresetowania DynamicObject->Mechanik->TakeControl(false); DynamicObject->Mechanik->TakeControl(true); } } - else if (cKey == Global::Keys[k_MaxCurrent]) // McZapkie-160502: F - wysoki rozruch + else if (cKey == Global::Keys[k_MaxCurrent]) // McZapkie-160502: F - + // wysoki rozruch { if ((mvControlled->EngineType == DieselElectric) && (mvControlled->ShuntModeAllow) && (mvControlled->MainCtrlPos == 0)) @@ -578,7 +589,8 @@ void TTrain::OnKeyDown(int cKey) dsbSwitch->Play(0, 0, 0); } /* Ra: przeniesione do Mover.cpp - if (mvControlled->TrainType!=dt_EZT) //to powinno być w fizyce, a nie w kabinie! + if (mvControlled->TrainType!=dt_EZT) //to powinno być w fizyce, a + nie w kabinie! if (mvControlled->MinCurrentSwitch(true)) { dsbSwitch->SetVolume(DSBVOLUME_MAX); @@ -586,7 +598,8 @@ void TTrain::OnKeyDown(int cKey) } */ } - else if (cKey == Global::Keys[k_CurrentAutoRelay]) // McZapkie-241002: G - wlaczanie PSR + else if (cKey == Global::Keys[k_CurrentAutoRelay]) // McZapkie-241002: G - + // wlaczanie PSR { if (mvControlled->AutoRelaySwitch(true)) { @@ -594,7 +607,8 @@ void TTrain::OnKeyDown(int cKey) dsbSwitch->Play(0, 0, 0); } } - else if (cKey == Global::Keys[k_FailedEngineCutOff]) // McZapkie-060103: E - wylaczanie + else if (cKey == Global::Keys[k_FailedEngineCutOff]) // McZapkie-060103: E + // - wylaczanie // sekcji silnikow { if (mvControlled->CutOffEngine()) @@ -636,7 +650,8 @@ void TTrain::OnKeyDown(int cKey) else //----------- // hunter-131211: dzwiek dla przelacznika universala podniesionego - // hunter-091012: ubajerowanie swiatla w kabinie (wyrzucenie przyciemnienia pod Univ4) + // hunter-091012: ubajerowanie swiatla w kabinie (wyrzucenie + // przyciemnienia pod Univ4) if (cKey == Global::Keys[k_Univ3]) { if (Console::Pressed(VK_CONTROL)) @@ -679,10 +694,12 @@ void TTrain::OnKeyDown(int cKey) else //----------- if (cKey == Global::Keys[k_PantFrontUp]) - { // Winger 160204: podn. przedn. pantografu + { // Winger 160204: podn. + // przedn. pantografu if (mvOccupied->ActiveCab == 1) //||((mvOccupied->ActiveCab<1)&&((mvControlled->TrainType&(dt_ET40|dt_ET41|dt_ET42|dt_EZT))==0))) - { // przedni gdy w kabinie 1 lub (z wyjątkiem ET40, ET41, ET42 i EZT) gdy w kabinie -1 + { // przedni gdy w kabinie 1 lub (z wyjątkiem ET40, ET41, ET42 i EZT) gdy + // w kabinie -1 mvControlled->PantFrontSP = false; if (mvControlled->PantFront(true)) if (mvControlled->PantFrontStart != 1) @@ -705,10 +722,13 @@ void TTrain::OnKeyDown(int cKey) } } else if (cKey == Global::Keys[k_PantRearUp]) - { // Winger 160204: podn. tyln. pantografu względem kierunku jazdy + { // Winger 160204: podn. + // tyln. pantografu + // względem kierunku jazdy if (mvOccupied->ActiveCab == 1) //||((mvOccupied->ActiveCab<1)&&((mvControlled->TrainType&(dt_ET40|dt_ET41|dt_ET42|dt_EZT))==0))) - { // tylny gdy w kabinie 1 lub (z wyjątkiem ET40, ET41, ET42 i EZT) gdy w kabinie -1 + { // tylny gdy w kabinie 1 lub (z wyjątkiem ET40, ET41, ET42 i EZT) gdy w + // kabinie -1 mvControlled->PantRearSP = false; if (mvControlled->PantRear(true)) if (mvControlled->PantRearStart != 1) @@ -731,18 +751,21 @@ void TTrain::OnKeyDown(int cKey) } } else if (cKey == Global::Keys[k_Active]) // yB 300407: przelacznik rozrzadu - { // Ra 2014-06: uruchomiłem to, aby aktywować czuwak w zajmowanym członie, a wyłączyć w - // innych - // Ra 2014-03: aktywacja czuwaka przepięta na ustawienie kierunku w mvOccupied + { // Ra 2014-06: uruchomiłem to, aby aktywować czuwak w zajmowanym członie, + // a wyłączyć w innych + // Ra 2014-03: aktywacja czuwaka przepięta na ustawienie kierunku w + // mvOccupied // if (mvControlled->Battery) //jeśli bateria jest już załączona - // mvOccupied->BatterySwitch(true); //to w ten oto durny sposób aktywuje się CA/SHP + // mvOccupied->BatterySwitch(true); //to w ten oto durny sposób aktywuje + // się CA/SHP // if (mvControlled->CabActivisation()) // { // dsbSwitch->SetVolume(DSBVOLUME_MAX); // dsbSwitch->Play(0,0,0); // } } - else if (cKey == Global::Keys[k_Heating]) // Winger 020304: ogrzewanie skladu - wlaczenie + else if (cKey == Global::Keys[k_Heating]) // Winger 020304: ogrzewanie + // skladu - wlaczenie { // Ra 2014-09: w trybie latania obsługa jest w World.cpp if (!FreeFlyModeFlag) { @@ -863,7 +886,8 @@ void TTrain::OnKeyDown(int cKey) } } //----------- } - else if (cKey == Global::Keys[k_UpperSign]) // ABu 060205: światło górne - włączenie + else if (cKey == Global::Keys[k_UpperSign]) // ABu 060205: światło górne - + // włączenie { if ((GetAsyncKeyState(VK_CONTROL) < 0) && (ggRearUpperLightButton.SubModel)) // hunter-230112 - z controlem zapala z tylu @@ -914,8 +938,9 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == - Global::Keys[k_RightSign]) // Winger 070304: swiatla tylne (koncowki) - wlaczenie + else if (cKey == Global::Keys[k_RightSign]) // Winger 070304: swiatla + // tylne (koncowki) - + // wlaczenie { if ((GetAsyncKeyState(VK_CONTROL) < 0) && (ggRearRightLightButton.SubModel)) // hunter-230112 - z controlem zapala z tylu @@ -1039,7 +1064,8 @@ void TTrain::OnKeyDown(int cKey) ; else if (cKey == Global::Keys[k_IncScndCtrl]) // if (MoverParameters->ScndCtrlPosScndCtrlPosNo) - // if (mvControlled->EnginePowerSource.SourceType==CurrentCollector) + // if + // (mvControlled->EnginePowerSource.SourceType==CurrentCollector) if (mvControlled->ShuntMode) { mvControlled->AnPos += (GetDeltaTime() / 0.85f); @@ -1088,7 +1114,10 @@ void TTrain::OnKeyDown(int cKey) else ; else if (cKey == Global::Keys[k_IncLocalBrakeLevel]) - { // Ra 2014-09: w trybie latania obsługa jest w World.cpp + { // Ra 2014-09: w + // trybie latania + // obsługa jest w + // World.cpp if (!FreeFlyModeFlag) { if (GetAsyncKeyState(VK_CONTROL) < 0) @@ -1103,7 +1132,10 @@ void TTrain::OnKeyDown(int cKey) } } else if (cKey == Global::Keys[k_DecLocalBrakeLevel]) - { // Ra 2014-06: wersja dla swobodnego latania przeniesiona do World.cpp + { // Ra 2014-06: wersja dla + // swobodnego latania + // przeniesiona do + // World.cpp if (!FreeFlyModeFlag) { if (GetAsyncKeyState(VK_CONTROL) < 0) @@ -1111,16 +1143,17 @@ void TTrain::OnKeyDown(int cKey) mvOccupied->DecManualBrakeLevel(1); else ; - else // Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - odhamować - // jakoś trzeba + else // Ra 1014-06: AI potrafi zahamować pomocniczym mimo jego braku - + // odhamować jakoś trzeba if ((mvOccupied->LocalBrake != ManualBrake) || mvOccupied->LocalBrakePos) mvOccupied->DecLocalBrakeLevel(1); } } else if ((cKey == Global::Keys[k_IncBrakeLevel]) && (mvOccupied->BrakeHandle != FV4a)) // if (mvOccupied->IncBrakeLevel()) - if (mvOccupied->BrakeLevelAdd( - Global::fBrakeStep)) // nieodpowiedni warunek; true, jeśli można dalej kręcić + if (mvOccupied->BrakeLevelAdd(Global::fBrakeStep)) // nieodpowiedni + // warunek; true, jeśli + // można dalej kręcić { keybrakecount = 0; if ((isEztOer) && (mvOccupied->BrakeCtrlPos < 3)) @@ -1133,7 +1166,8 @@ void TTrain::OnKeyDown(int cKey) ; else if ((cKey == Global::Keys[k_DecBrakeLevel]) && (mvOccupied->BrakeHandle != FV4a)) { - // nową wersję dostarczył ZiomalCl ("fixed looped sound in ezt when using NUM_9 key") + // nową wersję dostarczył ZiomalCl ("fixed looped sound in ezt when using + // NUM_9 key") if ((mvOccupied->BrakeCtrlPos > -1) || (keybrakecount > 1)) { @@ -1148,12 +1182,14 @@ void TTrain::OnKeyDown(int cKey) else keybrakecount += 1; // koniec wersji dostarczonej przez ZiomalCl - /* wersja poprzednia - ten pierwszy if ze średnikiem nie działał jak warunek + /* wersja poprzednia - ten pierwszy if ze średnikiem nie działał jak + warunek if ((mvOccupied->BrakeCtrlPos>-1)|| (keybrakecount>1)) { if (mvOccupied->DecBrakeLevel()); { - if ((isEztOer) && (mvOccupied->BrakeCtrlPos<2)&&(keybrakecount<=1)) + if ((isEztOer) && + (mvOccupied->BrakeCtrlPos<2)&&(keybrakecount<=1)) { dsbPneumaticSwitch->SetVolume(-10); dsbPneumaticSwitch->Play(0,0,0); @@ -1197,11 +1233,10 @@ void TTrain::OnKeyDown(int cKey) mvOccupied->BrakeLevelSet(mvOccupied->BrakeCtrlPosNo / 2 + (mvOccupied->BrakeHandle == FV4a ? 1 : 0)); if (GetAsyncKeyState(VK_CONTROL) < 0) - mvOccupied->BrakeLevelSet(mvOccupied->Handle->GetPos(bh_NP)); // yB: czy ten stos - // funkcji nie - // powinien być jako - // oddzielna funkcja - // movera? + mvOccupied->BrakeLevelSet( + mvOccupied->Handle->GetPos(bh_NP)); // yB: czy ten stos funkcji nie + // powinien być jako oddzielna + // funkcja movera? } else if (cKey == Global::Keys[k_Brake1]) { @@ -1260,7 +1295,8 @@ void TTrain::OnKeyDown(int cKey) } else //--------------- - // hunter-221211: hamulec przeciwposlizgowy przeniesiony do TTrain::Update() + // hunter-221211: hamulec przeciwposlizgowy przeniesiony do + // TTrain::Update() if (cKey == Global::Keys[k_AntiSlipping]) { if (mvOccupied->BrakeSystem != ElectroPneumatic) @@ -1375,7 +1411,9 @@ void TTrain::OnKeyDown(int cKey) // (mvControlled->EngineType==ElectricSeriesMotor)|| // (mvControlled->EngineType==DieselElectric)) if (mvOccupied->BatterySwitch(false)) - { // ewentualnie zablokować z FIZ, np. w samochodach się nie odłącza akumulatora + { // ewentualnie zablokować z FIZ, + // np. w samochodach się nie + // odłącza akumulatora dsbSwitch->Play(0, 0, 0); // mvOccupied->SecuritySystem.Status=0; mvControlled->PantFront(false); @@ -1384,7 +1422,8 @@ void TTrain::OnKeyDown(int cKey) } //----------- - // if (cKey==Global::Keys[k_Active]) //yB 300407: przelacznik rozrzadu + // if (cKey==Global::Keys[k_Active]) //yB 300407: przelacznik + // rozrzadu // { // if (mvControlled->CabDeactivisation()) // { @@ -1394,7 +1433,9 @@ void TTrain::OnKeyDown(int cKey) // } // else if (cKey == Global::Keys[k_BrakeProfile]) - { // yB://ABu: male poprawki, zeby bylo mozna ustawic dowolny wagon + { // yB://ABu: male poprawki, zeby + // bylo mozna ustawic dowolny + // wagon int CouplNr = -2; if (!FreeFlyModeFlag) { @@ -1443,7 +1484,8 @@ void TTrain::OnKeyDown(int cKey) } else //----------- - // hunter-261211: przetwornica i sprzezarka przeniesione do TTrain::Update() + // hunter-261211: przetwornica i sprzezarka przeniesione do + // TTrain::Update() if (cKey == Global::Keys[k_Converter]) { if (ggConverterButton.GetValue() != 0) @@ -1486,14 +1528,15 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_SmallCompressor]) // Winger 160404: mala sprezarka wl + else if (cKey == Global::Keys[k_SmallCompressor]) // Winger 160404: mala + // sprezarka wl { // Ra: bez [Shift] też dać dźwięk if ((mvControlled->TrainType & dt_EZT) ? mvControlled == mvOccupied : !mvOccupied->ActiveCab) // tylko w maszynowym if (Console::Pressed(VK_CONTROL)) // z [Ctrl] - mvControlled->bPantKurek3 = false; // zbiornik pantografu połączony jest z małą - // sprężarką (pompowanie ma sens, ale potem - // trzeba przełączyć) + mvControlled->bPantKurek3 = + false; // zbiornik pantografu połączony jest z małą sprężarką + // (pompowanie ma sens, ale potem trzeba przełączyć) else if (!mvControlled->PantCompFlag) // jeśli wyłączona if (mvControlled->Battery) // jeszcze musi być załączona bateria if (mvControlled->PantPress < 4.8) // piszą, że to tak nie działa @@ -1503,7 +1546,8 @@ void TTrain::OnKeyDown(int cKey) dsbSwitch->Play(0, 0, 0); // dźwięk tylko po naciśnięciu klawisza } } - // McZapkie-240302 - wylaczanie automatycznego pilota (w trybie ~debugmode mozna tylko raz) + // McZapkie-240302 - wylaczanie automatycznego pilota (w trybie ~debugmode + // mozna tylko raz) else if (cKey == VkKeyScan('q')) // bez Shift { if (DynamicObject->Mechanik) @@ -1530,7 +1574,8 @@ void TTrain::OnKeyDown(int cKey) } */ } - else if (cKey == Global::Keys[k_CurrentAutoRelay]) // McZapkie-241002: g - wylaczanie PSR + else if (cKey == Global::Keys[k_CurrentAutoRelay]) // McZapkie-241002: g - + // wylaczanie PSR { if (mvControlled->AutoRelaySwitch(false)) { @@ -1539,7 +1584,8 @@ void TTrain::OnKeyDown(int cKey) } } else - // hunter-201211: piasecznica poprawiona oraz przeniesiona do TTrain::Update() + // hunter-201211: piasecznica poprawiona oraz przeniesiona do + // TTrain::Update() if (cKey == Global::Keys[k_Sand]) { /* @@ -1590,7 +1636,9 @@ void TTrain::OnKeyDown(int cKey) false; // wyjście z maszynowego wyłącza sprężarkę pomocniczą } else if (cKey == Global::Keys[k_Couple]) - { // ABu051104: male zmiany, zeby mozna bylo laczyc odlegle wagony + { // ABu051104: male zmiany, zeby + // mozna bylo laczyc odlegle + // wagony // da sie zoptymalizowac, ale nie ma na to czasu :( if (iCabn > 0) { @@ -1598,24 +1646,26 @@ void TTrain::OnKeyDown(int cKey) { /* if (mvControlled->Couplers[iCabn-1].CouplingFlag==0) { - if - (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,ctrain_coupler)) +if + (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,ctrain_coupler)) { dsbCouplerAttach->SetVolume(DSBVOLUME_MAX); dsbCouplerAttach->Play(0,0,0); - //ABu: aha, a guzik, nie dziala i nie bedzie, a przydalo by sie cos takiego: + //ABu: aha, a guzik, nie dziala i nie bedzie, a przydalo by sie + cos takiego: //DynamicObject->NextConnected=mvControlled->Couplers[iCabn-1].Connected; //DynamicObject->PrevConnected=mvControlled->Couplers[iCabn-1].Connected; } } else - if (!TestFlag(mvControlled->Couplers[iCabn-1].CouplingFlag,ctrain_pneumatic)) + if + (!TestFlag(mvControlled->Couplers[iCabn-1].CouplingFlag,ctrain_pneumatic)) { //ABu021104: zeby caly czas bylo widac sprzegi: - if - (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,mvControlled->Couplers[iCabn-1].CouplingFlag+ctrain_pneumatic)) - //if - (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,ctrain_pneumatic)) +if + (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,mvControlled->Couplers[iCabn-1].CouplingFlag+ctrain_pneumatic)) +//if + (mvControlled->Attach(iCabn-1,mvControlled->Couplers[iCabn-1].Connected,ctrain_pneumatic)) { rsHiss.Play(1,DSBPLAY_LOOPING,true,DynamicObject->GetPosition()); } @@ -1742,11 +1792,13 @@ void TTrain::OnKeyDown(int cKey) } } else if (cKey == Global::Keys[k_DeCouple]) - { // ABu051104: male zmiany, zeby mozna bylo rozlaczac odlegle wagony + { // ABu051104: male zmiany, + // zeby mozna bylo rozlaczac + // odlegle wagony if (iCabn > 0) { - if (!FreeFlyModeFlag) // tryb 'kabinowy' (pozwala również rozłączyć sprzęgi - // zablokowane) + if (!FreeFlyModeFlag) // tryb 'kabinowy' (pozwala również rozłączyć + // sprzęgi zablokowane) { if (DynamicObject->DettachStatus(iCabn - 1) < 0) // jeśli jest co odczepić if (DynamicObject->Dettach(iCabn - 1)) // iCab==1:przód,iCab==2:tył @@ -1810,7 +1862,8 @@ void TTrain::OnKeyDown(int cKey) else //----------- // hunter-131211: dzwiek dla przelacznika universala - // hunter-091012: ubajerowanie swiatla w kabinie (wyrzucenie przyciemnienia pod Univ4) + // hunter-091012: ubajerowanie swiatla w kabinie (wyrzucenie + // przyciemnienia pod Univ4) if (cKey == Global::Keys[k_Univ3]) { if (Console::Pressed(VK_CONTROL)) @@ -1850,7 +1903,8 @@ void TTrain::OnKeyDown(int cKey) } } //----------- - else if (cKey == Global::Keys[k_PantFrontDown]) // Winger 160204: opuszczanie prz. patyka + else if (cKey == Global::Keys[k_PantFrontDown]) // Winger 160204: + // opuszczanie prz. patyka { if (mvOccupied->ActiveCab == 1) //||((mvOccupied->ActiveCab<1)&&(mvControlled->TrainType!=dt_ET40)&&(mvControlled->TrainType!=dt_ET41)&&(mvControlled->TrainType!=dt_ET42)&&(mvControlled->TrainType!=dt_EZT))) @@ -1875,7 +1929,8 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_PantRearDown]) // Winger 160204: opuszczanie tyl. patyka + else if (cKey == Global::Keys[k_PantRearDown]) // Winger 160204: + // opuszczanie tyl. patyka { if (mvOccupied->ActiveCab == 1) //||((mvOccupied->ActiveCab<1)&&(mvControlled->TrainType!=dt_ET40)&&(mvControlled->TrainType!=dt_ET41)&&(mvControlled->TrainType!=dt_ET42)&&(mvControlled->TrainType!=dt_EZT))) @@ -1901,7 +1956,8 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_Heating]) // Winger 020304: ogrzewanie - wylaczenie + else if (cKey == Global::Keys[k_Heating]) // Winger 020304: ogrzewanie - + // wylaczenie { // Ra 2014-09: w trybie latania obsługa jest w World.cpp if (!FreeFlyModeFlag) { @@ -1913,7 +1969,8 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_LeftSign]) // ABu 060205: lewe swiatlo - wylaczenie + else if (cKey == Global::Keys[k_LeftSign]) // ABu 060205: lewe swiatlo - + // wylaczenie { if ((GetAsyncKeyState(VK_CONTROL) < 0) && (ggRearLeftLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu @@ -2016,7 +2073,8 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_UpperSign]) // ABu 060205: światło górne - wyłączenie + else if (cKey == Global::Keys[k_UpperSign]) // ABu 060205: światło górne - + // wyłączenie { if ((GetAsyncKeyState(VK_CONTROL) < 0) && (ggRearUpperLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu @@ -2067,8 +2125,8 @@ void TTrain::OnKeyDown(int cKey) } } } - if (cKey == Global::Keys[k_RightSign]) // Winger 070304: swiatla tylne (koncowki) - - // wlaczenie + if (cKey == Global::Keys[k_RightSign]) // Winger 070304: swiatla tylne + // (koncowki) - wlaczenie { if ((GetAsyncKeyState(VK_CONTROL) < 0) && (ggRearRightLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu @@ -2171,7 +2229,8 @@ void TTrain::OnKeyDown(int cKey) } } } - else if (cKey == Global::Keys[k_StLinOff]) // Winger 110904: wylacznik st. liniowych + else if (cKey == Global::Keys[k_StLinOff]) // Winger 110904: wylacznik st. + // liniowych { if ((mvControlled->TrainType != dt_EZT) && (mvControlled->TrainType != dt_EP05) && (mvControlled->TrainType != dt_ET40)) @@ -2213,8 +2272,8 @@ void TTrain::OnKeyDown(int cKey) vMechMovement.x += fMechCroach; if (DynamicObject->Mechanik) if (!FreeFlyModeFlag) //żeby nie mieszać obserwując z zewnątrz - DynamicObject->Mechanik->RouteSwitch(1); // na skrzyżowaniu skręci w - // lewo + DynamicObject->Mechanik->RouteSwitch( + 1); // na skrzyżowaniu skręci w lewo } else if (cKey == Global::Keys[k_MechRight]) { @@ -2229,7 +2288,8 @@ void TTrain::OnKeyDown(int cKey) vMechMovement.z -= fMechCroach; // if (DynamicObject->Mechanik) // if (!FreeFlyModeFlag) //żeby nie mieszać obserwując z zewnątrz - // DynamicObject->Mechanik->RouteSwitch(0); //na skrzyżowaniu stanie i poczeka + // DynamicObject->Mechanik->RouteSwitch(0); //na skrzyżowaniu stanie + // i poczeka } else if (cKey == Global::Keys[k_MechForward]) { @@ -2309,10 +2369,13 @@ void TTrain::OnKeyUp(int cKey) }; void TTrain::UpdateMechPosition(double dt) -{ // Ra: mechanik powinien być telepany niezależnie od pozycji pojazdu +{ // Ra: mechanik powinien być + // telepany niezależnie od pozycji + // pojazdu // Ra: trzeba zrobić model bujania głową i wczepić go do pojazdu - // DynamicObject->vFront=DynamicObject->GetDirection(); //to jest już policzone + // DynamicObject->vFront=DynamicObject->GetDirection(); //to jest już + // policzone // Ra: tu by się przydało uwzględnić rozkład sił: // - na postoju horyzont prosto, kabina skosem @@ -2362,9 +2425,9 @@ void TTrain::UpdateMechPosition(double dt) } else { // hamowanie rzucania przy spadku FPS - pMechShake -= - pMechShake * - Min0R(dt, 1); // po tym chyba potrafią zostać jakieś ułamki, które powodują zjazd + pMechShake -= pMechShake * Min0R(dt, 1); // po tym chyba potrafią zostać + // jakieś ułamki, które powodują + // zjazd pMechOffset += vMechMovement * dt; vMechVelocity.y = 0.5 * vMechVelocity.y; pNewMechPosition = pMechOffset + vector3(pMechShake.x, 5 * pMechShake.y, pMechShake.z); @@ -2422,15 +2485,17 @@ bool TTrain::Update() DWORD stat; double dt = Timer::GetDeltaTime(); if (DynamicObject->mdKabina) - { // Ra: TODO: odczyty klawiatury/pulpitu nie powinny być uzależnione od istnienia modelu kabiny + { // Ra: TODO: odczyty klawiatury/pulpitu nie + // powinny być uzależnione od istnienia modelu + // kabiny tor = DynamicObject->GetTrack(); // McZapkie-180203 // McZapkie: predkosc wyswietlana na tachometrze brana jest z obrotow kol float maxtacho = 3; fTachoVelocity = Min0R(fabs(11.31 * mvControlled->WheelDiameter * mvControlled->nrot), mvControlled->Vmax * 1.05); { // skacze osobna zmienna - float ff = floor( - GlobalTime->mr); // skacze co sekunde - pol sekundy pomiar, pol sekundy ustawienie + float ff = floor(GlobalTime->mr); // skacze co sekunde - pol sekundy + // pomiar, pol sekundy ustawienie if (ff != fTachoTimer) // jesli w tej sekundzie nie zmienial { if (fTachoVelocity > 1) // jedzie @@ -2446,8 +2511,8 @@ bool TTrain::Update() fTachoCount += dt * 3; // szybciej zacznij stukac } else if (fTachoCount > 0) - fTachoCount -= - dt * 0.66; // schodz powoli - niektore haslery to ze 4 sekundy potrafia stukac + fTachoCount -= dt * 0.66; // schodz powoli - niektore haslery to ze 4 + // sekundy potrafia stukac /* Ra: to by trzeba było przemyśleć, zmienione na szybko problemy robi //McZapkie: predkosc wyswietlana na tachometrze brana jest z obrotow kol @@ -2465,18 +2530,22 @@ bool TTrain::Update() if (mvControlled->TrainType==dt_EZT) //dla EZT wskazówka porusza się niestabilnie if (fTachoVelocity>7.0) - {fTachoVelocity=floor(0.5+fTachoVelocity+random(5)-random(5)); - //*floor(0.2*fTachoVelocity); + {fTachoVelocity=floor(0.5+fTachoVelocity+random(5)-random(5)); + //*floor(0.2*fTachoVelocity); if (fTachoVelocity<0.0) fTachoVelocity=0.0; } iSekunda=floor(GlobalTime->mr); } */ - // Ra 2014-09: napięcia i prądy muszą być ustalone najpierw, bo wysyłane są ewentualnie na + // Ra 2014-09: napięcia i prądy muszą być ustalone najpierw, bo wysyłane są + // ewentualnie na // PoKeys - if (mvControlled->EngineType != DieselElectric) // Ra 2014-09: czy taki rozdział ma sens? - fHVoltage = mvControlled->RunningTraction - .TractionVoltage; // Winger czy to nie jest zle? *mvControlled->Mains); + if ((mvControlled->EngineType != DieselElectric) || + (mvControlled->EngineType != + ElectricInductionMotor)) // Ra 2014-09: czy taki rozdział ma sens? + fHVoltage = + mvControlled->RunningTraction.TractionVoltage; // Winger czy to nie jest zle? + // *mvControlled->Mains); else fHVoltage = mvControlled->Voltage; if (ShowNextCurrent) @@ -2489,8 +2558,8 @@ bool TTrain::Update() fHCurrent[3] = mvSecond->ShowCurrent(3) * 1.05; } else - fHCurrent[0] = fHCurrent[1] = fHCurrent[2] = fHCurrent[3] = 0.0; // gdy nie ma - // człona + fHCurrent[0] = fHCurrent[1] = fHCurrent[2] = fHCurrent[3] = + 0.0; // gdy nie ma człona } else { // normalne pokazywanie @@ -2499,27 +2568,97 @@ bool TTrain::Update() fHCurrent[2] = mvControlled->ShowCurrent(2); fHCurrent[3] = mvControlled->ShowCurrent(3); } + + TDynamicObject *p = DynamicObject->GetFirstDynamic(mvOccupied->ActiveCab < 0 ? 1 : 0); + int in = 0; + fEIMParams[0][6] = 0; + for (int i = 0; i < 20; i++) + { + if (p) + { + fPress[i][0] = p->MoverParameters->BrakePress; + fPress[i][1] = p->MoverParameters->PipePress; + fPress[i][2] = p->MoverParameters->ScndPipePress; + bDoors[i] = (p->dDoorMoveL > 0.001) || (p->dDoorMoveR > 0.001); + if ((in < 8) && (p->MoverParameters->eimc[eimc_p_Pmax] > 1)) + { + fEIMParams[1 + in][0] = p->MoverParameters->eimv[eimv_Fr]; + fEIMParams[1 + in][1] = Max0R(fEIMParams[1 + in][0], 0); + fEIMParams[1 + in][2] = -Min0R(fEIMParams[1 + in][0], 0); + fEIMParams[1 + in][3] = p->MoverParameters->eimv[eimv_Fr] / + Max0R(p->MoverParameters->eimv[eimv_Fful], 1); + fEIMParams[1 + in][4] = Max0R(fEIMParams[1 + in][3], 0); + fEIMParams[1 + in][5] = -Min0R(fEIMParams[1 + in][3], 0); + fEIMParams[1 + in][6] = p->MoverParameters->eimv[eimv_If]; + fEIMParams[1 + in][7] = p->MoverParameters->eimv[eimv_U]; + fEIMParams[1 + in][8] = p->MoverParameters->eimv[eimv_Ipoj]; + fEIMParams[1 + in][9] = p->MoverParameters->Voltage; + fEIMParams[0][6] += fEIMParams[1 + in][8]; + in++; + } + p = p->NextC(4); + } + else + { + fPress[i][0] = 0; + fPress[i][1] = 0; + fPress[i][2] = 0; + bDoors[i] = false; + } + } + + if (mvControlled == mvOccupied) + fEIMParams[0][3] = mvControlled->eimv[eimv_Fzad]; // procent zadany + else + fEIMParams[0][3] = + mvControlled->eimv[eimv_Fzad] - mvOccupied->LocalBrakeRatio(); // procent zadany + fEIMParams[0][4] = Max0R(fEIMParams[0][3], 0); + fEIMParams[0][5] = -Min0R(fEIMParams[0][3], 0); + fEIMParams[0][1] = fEIMParams[0][4] * mvControlled->eimv[eimv_Fful]; + fEIMParams[0][2] = fEIMParams[0][5] * mvControlled->eimv[eimv_Fful]; + fEIMParams[0][0] = fEIMParams[0][1] - fEIMParams[0][2]; + fEIMParams[0][7] = 0; + fEIMParams[0][8] = 0; + fEIMParams[0][9] = 0; + + for (int i = in; i < 8; i++) + { + fEIMParams[1 + i][0] = 0; + fEIMParams[1 + i][1] = 0; + fEIMParams[1 + i][2] = 0; + fEIMParams[1 + i][3] = 0; + fEIMParams[1 + i][4] = 0; + fEIMParams[1 + i][5] = 0; + fEIMParams[1 + i][6] = 0; + fEIMParams[1 + i][7] = 0; + fEIMParams[1 + i][8] = 0; + fEIMParams[1 + i][9] = 0; + } + if (Global::iFeedbackMode == 4) { // wykonywać tylko gdy wyprowadzone na pulpit Console::ValueSet(0, mvOccupied->Compressor); // Ra: sterowanie miernikiem: zbiornik główny - Console::ValueSet(1, mvOccupied->PipePress); // Ra: sterowanie miernikiem: przewód - // główny + Console::ValueSet(1, + mvOccupied->PipePress); // Ra: sterowanie miernikiem: przewód główny Console::ValueSet( 2, mvOccupied->BrakePress); // Ra: sterowanie miernikiem: cylinder hamulcowy Console::ValueSet(3, fHVoltage); // woltomierz wysokiego napięcia Console::ValueSet(4, fHCurrent[2]); // Ra: sterowanie miernikiem: drugi amperomierz Console::ValueSet( - 5, fHCurrent[(mvControlled->TrainType & dt_EZT) ? 0 : 1]); // pierwszy amperomierz; - // dla EZT prąd całkowity - Console::ValueSet(6, fTachoVelocity); ////Ra: prędkość na pin 43 - wyjście analogowe (to - /// nie jest PWM); skakanie zapewnia mechanika + 5, + fHCurrent[(mvControlled->TrainType & dt_EZT) ? 0 : 1]); // pierwszy amperomierz; dla + // EZT prąd całkowity + Console::ValueSet(6, fTachoVelocity); ////Ra: prędkość na pin 43 - wyjście + /// analogowe (to nie jest PWM); + /// skakanie zapewnia mechanika /// napędu } - // 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 + // 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 if (mvControlled->EngineType == ElectricSeriesMotor) if (fabs(mvControlled->RunningTraction.TractionVoltage) < 0.5 * @@ -2548,8 +2687,8 @@ bool TTrain::Update() ((mvControlled->EngineType == ElectricSeriesMotor) || (mvControlled->TrainType == dt_EZT)) && (DynamicObject->Controller == Humandriver)) // hunter-110212: poprawka dla EZT - { // hunter-091012: poprawka (zmiana warunku z CompressorPower /rozne od 0/ na /rowne - // 1/) + { // hunter-091012: poprawka (zmiana warunku z CompressorPower /rozne od + // 0/ na /rowne 1/) if (fConverterTimer < fConverterPrzekaznik) { mvControlled->ConvOvldFlag = true; @@ -2822,10 +2961,13 @@ bool TTrain::Update() // McZapkie! - to wazne - SoundFlag wystawiane jest przez moje moduly // gdy zachodza pewne wydarzenia komentowane dzwiekiem. // Mysle ze wystarczy sprawdzac a potem zerowac SoundFlag tutaj - // a nie w DynObject - gdyby cos poszlo zle to po co szarpac dzwiekiem co 10ms. + // a nie w DynObject - gdyby cos poszlo zle to po co szarpac dzwiekiem co + // 10ms. - if (TestFlag(mvOccupied->SoundFlag, - sound_relay)) // przekaznik - gdy bezpiecznik, automatyczny rozruch itp + if (TestFlag(mvOccupied->SoundFlag, sound_relay)) // przekaznik - gdy + // bezpiecznik, + // automatyczny rozruch + // itp { if (mvOccupied->EventFlag || TestFlag(mvOccupied->SoundFlag, sound_loud)) { @@ -2889,7 +3031,8 @@ bool TTrain::Update() mvOccupied->SoundFlag = 0; /* - for (int b=0; b<2; b++) //MC: aby zerowac stukanie przekaznikow w czlonie silnikowym + for (int b=0; b<2; b++) //MC: aby zerowac stukanie przekaznikow w + czlonie silnikowym if (TestFlag(mvControlled->Couplers[b].CouplingFlag,ctrain_controll)) if (mvControlled->Couplers[b].Connected.Power>0.01) mvControlled->Couplers[b]->Connected->SoundFlag=0; @@ -2939,16 +3082,18 @@ bool TTrain::Update() //fHaslerTimer+=dt; //if (fHaslerTimer>fHaslerTime) {//Ra: ryzykowne jest to, gdyż może się nie uaktualniać prędkość - //Ra: prędkość się powinna zaokrąglać tam gdzie się liczy fTachoVelocity + //Ra: prędkość się powinna zaokrąglać tam gdzie się liczy + fTachoVelocity if (ggVelocity.SubModel) - {//ZiomalCl: wskazanie Haslera w kabinie A ze zwloka czasowa oraz odpowiednia - tolerancja - //Nalezy sie zastanowic na przyszlosc nad rozroznieniem predkosciomierzy (dokladnosc - wskazan, zwloka czasowa wskazania, inne funkcje) - //ZiomalCl: W ezt typu stare EN57 wskazania haslera sa mniej dokladne (linka) + {//ZiomalCl: wskazanie Haslera w kabinie A ze zwloka czasowa oraz odpowiednia + tolerancja + //Nalezy sie zastanowic na przyszlosc nad rozroznieniem predkosciomierzy + (dokladnosc wskazan, zwloka czasowa wskazania, inne funkcje) + //ZiomalCl: W ezt typu stare EN57 wskazania haslera sa mniej dokladne + (linka) //ggVelocity.UpdateValue(fTachoVelocity>2?fTachoVelocity+0.5-random(mvControlled->TrainType==dt_EZT?5:2)/2:0); - ggVelocity.UpdateValue(Min0R(fTachoVelocity,mvControlled->Vmax*1.05)); //ograniczenie - maksymalnego wskazania na analogowym + ggVelocity.UpdateValue(Min0R(fTachoVelocity,mvControlled->Vmax*1.05)); + //ograniczenie maksymalnego wskazania na analogowym ggVelocity.Update(); } if (ggVelocityDgt.SubModel) @@ -2957,10 +3102,10 @@ bool TTrain::Update() ggVelocityDgt.Update(); } if (ggVelocity_B.SubModel) - {//ZiomalCl: wskazanie Haslera w kabinie B ze zwloka czasowa oraz odpowiednia - tolerancja - //Nalezy sie zastanowic na przyszlosc nad rozroznieniem predkosciomierzy (dokladnosc - wskazan, zwloka czasowa wskazania, inne funkcje) + {//ZiomalCl: wskazanie Haslera w kabinie B ze zwloka czasowa oraz odpowiednia + tolerancja + //Nalezy sie zastanowic na przyszlosc nad rozroznieniem predkosciomierzy + (dokladnosc wskazan, zwloka czasowa wskazania, inne funkcje) //Velocity_B.UpdateValue(fTachoVelocity>2?fTachoVelocity+0.5-random(mvControlled->TrainType==dt_EZT?5:2)/2:0); ggVelocity_B.UpdateValue(fTachoVelocity); ggVelocity_B.Update(); @@ -3087,11 +3232,12 @@ bool TTrain::Update() } if (mvControlled->SlippingWheels) - { // Ra 2014-12: lokomotywy 181/182 dostają SlippingWheels po zahamowaniu powyżej 2.85 bara - // i buczały + { // Ra 2014-12: lokomotywy 181/182 + // dostają SlippingWheels po zahamowaniu + // powyżej 2.85 bara i buczały double veldiff = (DynamicObject->GetVelocity() - fTachoVelocity) / mvControlled->Vmax; - if (veldiff < - -0.01) // 1% Vmax rezerwy, żeby 181/182 nie buczały po zahamowaniu, ale to proteza + if (veldiff < -0.01) // 1% Vmax rezerwy, żeby 181/182 nie buczały po + // zahamowaniu, ale to proteza { if (fabs(mvControlled->Im) > 10.0) btLampkaPoslizg.TurnOn(); @@ -3132,8 +3278,8 @@ bool TTrain::Update() (mvControlled->MainCtrlActualPos == 0)); // do EU04 if ((mvControlled->Itot != 0) || (mvOccupied->BrakePress > 2) || (mvOccupied->PipePress < 3.6)) - btLampkaStyczn.TurnOff(); // Ra: czy to jest udawanie działania styczników - // liniowych? + btLampkaStyczn.TurnOff(); // Ra: czy to jest udawanie działania + // styczników liniowych? else if (mvOccupied->BrakePress < 1) btLampkaStyczn.TurnOn(); // mozna prowadzic rozruch if (((TestFlag(mvControlled->Couplers[1].CouplingFlag, ctrain_controll)) && @@ -3144,18 +3290,19 @@ bool TTrain::Update() else btLampkaUkrotnienie.TurnOff(); - // if ((TestFlag(mvControlled->BrakeStatus,+b_Rused+b_Ractive)))//Lampka + // if + // ((TestFlag(mvControlled->BrakeStatus,+b_Rused+b_Ractive)))//Lampka // drugiego stopnia hamowania btLampkaHamPosp.Turn((TestFlag(mvOccupied->BrakeStatus, 1))); // lampka drugiego stopnia - // hamowania //TODO: - // youBy wyciągnąć flagę - // wysokiego stopnia + // hamowania //TODO: youBy + // wyciągnąć flagę wysokiego + // stopnia // hunter-111211: wylacznik cisnieniowy - Ra: tutaj? w kabinie? //yBARC - // omujborzegrzesiuzniszczylesmicalydzien // if (mvControlled->TrainType!=dt_EZT) - // if (((mvOccupied->BrakePress > 2) || ( mvOccupied->PipePress < 3.6 )) && ( - // mvControlled->MainCtrlPos != 0 )) + // if (((mvOccupied->BrakePress > 2) || ( mvOccupied->PipePress < + // 3.6 )) && ( mvControlled->MainCtrlPos != 0 )) // mvControlled->StLinFlag=true; //------- @@ -3179,8 +3326,8 @@ bool TTrain::Update() btLampkaSprezarka.Turn(mvControlled->CompressorFlag); // mutopsitka dziala // boczniki unsigned char scp; // Ra: dopisałem "unsigned" - // Ra: w SU45 boczniki wchodzą na MainCtrlPos, a nie na MainCtrlActualPos - pokićkał - // ktoś? + // Ra: w SU45 boczniki wchodzą na MainCtrlPos, a nie na MainCtrlActualPos + // - pokićkał ktoś? scp = mvControlled->RList[mvControlled->MainCtrlPos].ScndAct; scp = (scp == 255 ? 0 : scp); // Ra: whatta hella is this? if ((mvControlled->ScndCtrlPos > 0) || (mvControlled->ScndInMain) && (scp > 0)) @@ -3201,10 +3348,12 @@ bool TTrain::Update() { //sprezarka w drugim wozie bool comptemp=false; if (DynamicObject->NextConnected) - if (TestFlag(mvControlled->Couplers[1].CouplingFlag,ctrain_controll)) + if + (TestFlag(mvControlled->Couplers[1].CouplingFlag,ctrain_controll)) comptemp=DynamicObject->NextConnected->MoverParameters->CompressorFlag; if ((DynamicObject->PrevConnected) && (!comptemp)) - if (TestFlag(mvControlled->Couplers[0].CouplingFlag,ctrain_controll)) + if + (TestFlag(mvControlled->Couplers[0].CouplingFlag,ctrain_controll)) comptemp=DynamicObject->PrevConnected->MoverParameters->CompressorFlag; btLampkaSprezarkaB.Turn(comptemp); */ @@ -3244,8 +3393,8 @@ bool TTrain::Update() false); { // yB - wskazniki drugiego czlonu - TDynamicObject * - tmp; //=mvControlled->mvSecond; //Ra 2014-07: trzeba to jeszcze wyjąć z kabiny... + TDynamicObject *tmp; //=mvControlled->mvSecond; //Ra 2014-07: trzeba to + // jeszcze wyjąć z kabiny... // Ra 2014-07: no nie ma potrzeby szukać tego w każdej klatce tmp = NULL; if ((TestFlag(mvControlled->Couplers[1].CouplingFlag, ctrain_controll)) && @@ -3271,15 +3420,15 @@ bool TTrain::Update() btLampkaStycznB.TurnOn(); // mozna prowadzic rozruch //----------------- - // //hunter-271211: brak jazdy w drugim czlonie, gdy w pierwszym tez nie - // ma (i odwrotnie) - Ra: tutaj? w kabinie? + // //hunter-271211: brak jazdy w drugim czlonie, gdy w + // pierwszym tez nie ma (i odwrotnie) - Ra: tutaj? w kabinie? // if (tmp->MoverParameters->TrainType!=dt_EZT) // if (((tmp->MoverParameters->BrakePress > 2) || ( // tmp->MoverParameters->PipePress < 3.6 )) && ( // tmp->MoverParameters->MainCtrlPos != 0 )) // { - // tmp->MoverParameters->MainCtrlActualPos=0; //inaczej StLinFlag nie - // zmienia sie na false w drugim pojezdzie + // tmp->MoverParameters->MainCtrlActualPos=0; //inaczej + // StLinFlag nie zmienia sie na false w drugim pojezdzie // //tmp->MoverParameters->StLinFlag=true; // mvControlled->StLinFlag=true; // } @@ -3288,8 +3437,8 @@ bool TTrain::Update() // //tmp->MoverParameters->StLinFlag=true; //----------------- - // hunter-271211: sygnalizacja poslizgu w pierwszym pojezdzie, gdy wystapi w - // drugim + // hunter-271211: sygnalizacja poslizgu w pierwszym pojezdzie, gdy + // wystapi w drugim btLampkaPoslizg.Turn(tmp->MoverParameters->SlippingWheels); //----------------- @@ -3392,7 +3541,8 @@ bool TTrain::Update() ggMainCtrlAct.Update(); } if (ggScndCtrl.SubModel) - { // Ra: od byte odejmowane boolean i konwertowane potem na double? + { // Ra: od byte odejmowane boolean i konwertowane + // potem na double? ggScndCtrl.UpdateValue( double(mvControlled->ScndCtrlPos - ((mvControlled->TrainType == dt_ET42) && mvControlled->DynamicBrakeFlag))); @@ -3723,8 +3873,8 @@ bool TTrain::Update() } // Winger 020304 - ogrzewanie //---------- - // hunter-080812: poprawka na ogrzewanie w elektrykach - usuniete uzaleznienie od - // przetwornicy + // hunter-080812: poprawka na ogrzewanie w elektrykach - usuniete + // uzaleznienie od przetwornicy if (ggTrainHeatingButton.SubModel) { if (mvControlled->Heating) @@ -3848,7 +3998,8 @@ bool TTrain::Update() } //---------------- - // hunter-141211: wyl. szybki zalaczony i wylaczony przeniesiony z OnKeyPress() + // hunter-141211: wyl. szybki zalaczony i wylaczony przeniesiony z + // OnKeyPress() if (Console::Pressed(VK_SHIFT) && Console::Pressed(Global::Keys[k_Main])) { fMainRelayTimer += dt; @@ -3858,10 +4009,10 @@ bool TTrain::Update() if (fMainRelayTimer > mvControlled->InitialCtrlDelay) // wlaczanie WSa z opoznieniem if (mvControlled->MainSwitch(true)) { - // if (mvControlled->MainCtrlPos!=0) //zabezpieczenie, by po wrzuceniu - // pozycji przed wlaczonym - // mvControlled->StLinFlag=true; //WSem nie wrzucilo na ta pozycje po - // jego zalaczeniu //yBARC - co to tutaj robi?! + // if (mvControlled->MainCtrlPos!=0) //zabezpieczenie, by po + // wrzuceniu pozycji przed wlaczonym + // mvControlled->StLinFlag=true; //WSem nie wrzucilo na ta + // pozycje po jego zalaczeniu //yBARC - co to tutaj robi?! if (mvControlled->EngineType == DieselEngine) dsbDieselIgnition->Play(0, 0, 0); } @@ -3871,8 +4022,9 @@ bool TTrain::Update() if (ggConverterButton.GetValue() != 0) // po puszczeniu przycisku od WSa odpalanie potwora mvControlled->ConverterSwitch(true); - // hunter-091012: przeniesione z mover.pas, zeby dzwiek sie nie zapetlal, drugi warunek - // zeby nie odtwarzalo w nieskonczonosc i przeniesienie zerowania timera + // hunter-091012: przeniesione z mover.pas, zeby dzwiek sie nie zapetlal, + // drugi warunek zeby nie odtwarzalo w nieskonczonosc i przeniesienie + // zerowania timera if ((mvControlled->Mains != true) && (fMainRelayTimer > 0)) { dsbRelay->Play(0, 0, 0); @@ -3896,7 +4048,8 @@ bool TTrain::Update() ggMainOnButton.PutValue(1); if (mvControlled->MainSwitch(true)) { - if (mvControlled->MainCtrlPos!=0) //hunter-131211: takie zabezpieczenie + if (mvControlled->MainCtrlPos!=0) //hunter-131211: takie + zabezpieczenie mvControlled->StLinFlag=true; if (mvControlled->EngineType==DieselEngine) @@ -3921,7 +4074,8 @@ bool TTrain::Update() // hunter-131211: czuwak przeniesiony z OnKeyPress // hunter-091012: zrobiony test czuwaka if (Console::Pressed(Global::Keys[k_Czuwak])) - { // czuwak testuje kierunek, ale podobno w EZT nie, więc może być w rozrządczym + { // czuwak testuje kierunek, ale podobno w + // EZT nie, więc może być w rozrządczym fCzuwakTestTimer += dt; ggSecurityResetButton.PutValue(1); if (CAflag == false) @@ -4089,10 +4243,12 @@ bool TTrain::Update() if (!FreeFlyModeFlag) { - if (Console::Pressed(Global::Keys[k_Releaser])) // yB: odluzniacz caly czas trzymany, - // warunki powinny byc takie same, jak - // przy naciskaniu. Wlasciwie stamtad - // mozna wyrzucic sprawdzanie + if (Console::Pressed(Global::Keys[k_Releaser])) // yB: odluzniacz caly + // czas trzymany, warunki + // powinny byc takie same, + // jak przy naciskaniu. + // Wlasciwie stamtad mozna + // wyrzucic sprawdzanie // nacisniecia. { if ((mvControlled->EngineType == ElectricSeriesMotor) || @@ -4154,9 +4310,9 @@ bool TTrain::Update() { if (ggUniversal3Button.SubModel) { - ggUniversal3Button.PutValue(1); // hunter-131211: z UpdateValue na PutValue - // - by zachowywal sie jak pozostale - // przelaczniki + ggUniversal3Button.PutValue(1); // hunter-131211: z UpdateValue na + // PutValue - by zachowywal sie jak + // pozostale przelaczniki if (btLampkaUniversal3.Active()) LampkaUniversal3_st = true; } @@ -4177,9 +4333,9 @@ bool TTrain::Update() { if (ggUniversal3Button.SubModel) { - ggUniversal3Button.PutValue(0); // hunter-131211: z UpdateValue na PutValue - // - by zachowywal sie jak pozostale - // przelaczniki + ggUniversal3Button.PutValue(0); // hunter-131211: z UpdateValue na + // PutValue - by zachowywal sie jak + // pozostale przelaczniki if (btLampkaUniversal3.Active()) LampkaUniversal3_st = false; } @@ -4187,8 +4343,8 @@ bool TTrain::Update() } } - // hunter-091012: to w ogole jest bez sensu i tak namodzone ze nie wiadomo o co chodzi - - // zakomentowalem i zrobilem po swojemu + // hunter-091012: to w ogole jest bez sensu i tak namodzone ze nie wiadomo o + // co chodzi - zakomentowalem i zrobilem po swojemu /* if ( Console::Pressed(Global::Keys[k_Univ3]) ) { @@ -4212,15 +4368,15 @@ bool TTrain::Update() {//bez [Ctrl] przełączamy cośtem if (Console::Pressed(VK_SHIFT)) { - ggUniversal3Button.PutValue(1); //hunter-131211: z UpdateValue na PutValue - by - zachowywal sie jak pozostale przelaczniki + ggUniversal3Button.PutValue(1); //hunter-131211: z UpdateValue na + PutValue - by zachowywal sie jak pozostale przelaczniki if (btLampkaUniversal3.Active()) LampkaUniversal3_st=true; } else { - ggUniversal3Button.PutValue(0); //hunter-131211: z UpdateValue na PutValue - by - zachowywal sie jak pozostale przelaczniki + ggUniversal3Button.PutValue(0); //hunter-131211: z UpdateValue na + PutValue - by zachowywal sie jak pozostale przelaczniki if (btLampkaUniversal3.Active()) LampkaUniversal3_st=false; } @@ -4264,7 +4420,8 @@ bool TTrain::Update() } */ - // hunter-091012: przepisanie univ4 i zrobione z uwzglednieniem przelacznika swiatla + // hunter-091012: przepisanie univ4 i zrobione z uwzglednieniem przelacznika + // swiatla if (Console::Pressed(Global::Keys[k_Univ4])) { if (Console::Pressed(VK_SHIFT)) @@ -4290,9 +4447,9 @@ bool TTrain::Update() bCabLightDim = false; if (ggCabLightDimButton.SubModel) { - ggCabLightDimButton.PutValue(0); // hunter-131211: z UpdateValue na PutValue - // - by zachowywal sie jak pozostale - // przelaczniki + ggCabLightDimButton.PutValue(0); // hunter-131211: z UpdateValue na + // PutValue - by zachowywal sie jak + // pozostale przelaczniki } } else @@ -4321,7 +4478,8 @@ bool TTrain::Update() } // Ra: przeklejka z SPKS - płynne poruszanie hamulcem - // if ((mvOccupied->BrakeHandle==FV4a)&&(Console::Pressed(Global::Keys[k_IncBrakeLevel]))) + // if + // ((mvOccupied->BrakeHandle==FV4a)&&(Console::Pressed(Global::Keys[k_IncBrakeLevel]))) if ((Console::Pressed(Global::Keys[k_IncBrakeLevel]))) { if (Console::Pressed(VK_CONTROL)) @@ -4335,7 +4493,8 @@ bool TTrain::Update() // mvOccupied->BrakeCtrlPos= floor(mvOccupied->BrakeCtrlPosR+0.499); } } - // if ((mvOccupied->BrakeHandle==FV4a)&&(Console::Pressed(Global::Keys[k_DecBrakeLevel]))) + // if + // ((mvOccupied->BrakeHandle==FV4a)&&(Console::Pressed(Global::Keys[k_DecBrakeLevel]))) if ((Console::Pressed(Global::Keys[k_DecBrakeLevel]))) { if (Console::Pressed(VK_CONTROL)) @@ -4364,7 +4523,8 @@ bool TTrain::Update() { // mvOccupied->BrakeCtrlPosR+=(mvOccupied->BrakeCtrlPosR>mvOccupied->BrakeCtrlPosNo?0:dt*2); mvOccupied->BrakeLevelAdd(dt * 2); - // mvOccupied->BrakeCtrlPos= floor(mvOccupied->BrakeCtrlPosR+0.499); + // mvOccupied->BrakeCtrlPos= + // floor(mvOccupied->BrakeCtrlPosR+0.499); } } @@ -4379,7 +4539,8 @@ bool TTrain::Update() else { // mvOccupied->BrakeCtrlPosR-=(mvOccupied->BrakeCtrlPosR<-1?0:dt*2); - // mvOccupied->BrakeCtrlPos= floor(mvOccupied->BrakeCtrlPosR+0.499); + // mvOccupied->BrakeCtrlPos= + // floor(mvOccupied->BrakeCtrlPosR+0.499); mvOccupied->BrakeLevelAdd(-dt * 2); } } @@ -4515,7 +4676,8 @@ bool TTrain::Update() ggPantFrontButtonOff.PutValue(0); } - /* if ((mvControlled->Mains) && (mvControlled->EngineType==ElectricSeriesMotor)) + /* if ((mvControlled->Mains) && + (mvControlled->EngineType==ElectricSeriesMotor)) { //tu dac w przyszlosci zaleznosc od wlaczenia przetwornicy if (mvControlled->ConverterFlag) //NBMX -obsluga przetwornicy @@ -4652,8 +4814,10 @@ bool TTrain::CabChange(int iDirection) ->CabActivisation(); // załączenie rozrządu (wirtualne kabiny) return true; // udało się zmienić kabinę } - DynamicObject->MoverParameters->CabActivisation(); // aktywizacja poprzedniej, bo jeszcze - // nie wiadomo, czy jakiś pojazd jest + DynamicObject->MoverParameters->CabActivisation(); // aktywizacja + // poprzedniej, bo + // jeszcze nie wiadomo, + // czy jakiś pojazd jest } return false; // ewentualna zmiana pojazdu } @@ -4739,7 +4903,8 @@ bool TTrain::LoadMMediaFile(AnsiString asFileName) } else //--------------- - // hunter-111211: wydzielenie wejscia na bezoporowa i na drugi uklad do pliku + // hunter-111211: wydzielenie wejscia na bezoporowa i na drugi uklad + // do pliku if (str == AnsiString("wejscie_na_bezoporow:")) { str = Parser->GetNextSymbol().LowerCase(); @@ -4922,14 +5087,16 @@ bool TTrain::LoadMMediaFile(AnsiString asFileName) } else return false; // nie znalazl sekcji internal - delete Parser; // Ra: jak się coś newuje, to trzeba zdeletować, inaczej syf się robi + delete Parser; // Ra: jak się coś newuje, to trzeba zdeletować, inaczej syf + // się robi if (!InitializeCab(mvOccupied->ActiveCab, asFileName)) // zle zainicjowana kabina return false; else { if (DynamicObject->Controller == Humandriver) - DynamicObject->bDisplayCab = true; // McZapkie-030303: mozliwosc wyswietlania kabiny, w - // przyszlosci dac opcje w mmd + DynamicObject->bDisplayCab = true; // McZapkie-030303: mozliwosc + // wyswietlania kabiny, w przyszlosci + // dac opcje w mmd return true; } } @@ -4957,6 +5124,7 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) str = ""; int cabindex = 0; TGauge *gg; // roboczy wsaźnik na obiekt animujący gałkę + TButton *bt; // roboczy wsaźnik na obiekt animujący lampkę DynamicObject->mdKabina = NULL; // likwidacja wskaźnika na dotychczasową kabinę switch (NewCabNo) { // ustalenie numeru kabiny do wczytania @@ -4984,8 +5152,8 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) { Cabine[cabindex].Load(Parser); str = Parser->GetNextSymbol().LowerCase(); - if (AnsiCompareStr(AnsiString("driver") + cabindex + AnsiString("pos:"), str) == - 0) // pozycja poczatkowa maszynisty + if (AnsiCompareStr(AnsiString("driver") + cabindex + AnsiString("pos:"), + str) == 0) // pozycja poczatkowa maszynisty { pMechOffset.x = Parser->GetNextSymbol().ToDouble(); pMechOffset.y = Parser->GetNextSymbol().ToDouble(); @@ -4996,8 +5164,8 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) } // ABu: pozycja siedzaca mechanika str = Parser->GetNextSymbol().LowerCase(); - if (AnsiCompareStr(AnsiString("driver") + cabindex + AnsiString("sitpos:"), str) == - 0) // ABu 180404 pozycja siedzaca maszynisty + if (AnsiCompareStr(AnsiString("driver") + cabindex + AnsiString("sitpos:"), + str) == 0) // ABu 180404 pozycja siedzaca maszynisty { pMechSittingPosition.x = Parser->GetNextSymbol().ToDouble(); pMechSittingPosition.y = Parser->GetNextSymbol().ToDouble(); @@ -5013,12 +5181,12 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) else parse = true; // inicjacja kabiny - // Ra 2014-08: zmieniamy zasady - zamiast przypisywać submodel do istniejących obiektów - // animujących - // będziemy teraz uaktywniać obiekty animujące z tablicy i podawać im submodel oraz - // wskaźnik na parametr - if (AnsiCompareStr(AnsiString("cab") + cabindex + AnsiString("model:"), str) == - 0) // model kabiny + // Ra 2014-08: zmieniamy zasady - zamiast przypisywać submodel do + // istniejących obiektów animujących + // będziemy teraz uaktywniać obiekty animujące z tablicy i podawać im + // submodel oraz wskaźnik na parametr + if (AnsiCompareStr(AnsiString("cab") + cabindex + AnsiString("model:"), + str) == 0) // model kabiny { str = Parser->GetNextSymbol().LowerCase(); if (str != AnsiString("none")) @@ -5033,15 +5201,15 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) // if (DynamicObject->mdKabina!=k) if (k) DynamicObject->mdKabina = k; // nowa kabina - //(mdKabina) może zostać to samo po przejściu do innego członu bez zmiany - // kabiny, przy powrocie musi być wiązanie ponowne + //(mdKabina) może zostać to samo po przejściu do innego członu bez + // zmiany kabiny, przy powrocie musi być wiązanie ponowne // else // break; //wyjście z pętli, bo model zostaje bez zmian } else if (cabindex == 1) // model tylko, gdy nie ma kabiny 1 DynamicObject->mdKabina = - DynamicObject - ->mdModel; // McZapkie-170103: szukaj elementy kabiny w glownym modelu + DynamicObject->mdModel; // McZapkie-170103: szukaj elementy kabiny + // w glownym modelu ActiveUniversal4 = false; ggMainCtrl.Clear(); ggMainCtrlAct.Clear(); @@ -5199,12 +5367,11 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) else if (str == AnsiString("maxcurrent_sw:")) // przelacznik rozruchu ggMaxCurrentCtrl.Load(Parser, DynamicObject->mdKabina); // SEKCJA przyciskow sprezynujacych - else if (str == - AnsiString( - "main_off_bt:")) // przycisk wylaczajacy (w EU07 wyl szybki czerwony) + else if (str == AnsiString("main_off_bt:")) // przycisk wylaczajacy (w + // EU07 wyl szybki czerwony) ggMainOffButton.Load(Parser, DynamicObject->mdKabina); - else if (str == - AnsiString("main_on_bt:")) // przycisk wlaczajacy (w EU07 wyl szybki zielony) + else if (str == AnsiString("main_on_bt:")) // przycisk wlaczajacy (w EU07 + // wyl szybki zielony) ggMainOnButton.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("security_reset_bt:")) // przycisk zbijajacy SHP/czuwak ggSecurityResetButton.Load(Parser, DynamicObject->mdKabina); @@ -5218,8 +5385,10 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) ggHornButton.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("fuse_bt:")) // bezp. nadmiarowy ggFuseButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("converterfuse_bt:")) // hunter-261211: odblokowanie - // przekaznika nadm. przetw. i ogrz. + else if (str == AnsiString("converterfuse_bt:")) // hunter-261211: + // odblokowanie + // przekaznika nadm. + // przetw. i ogrz. ggConverterFuseButton.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("stlinoff_bt:")) // st. liniowe ggStLinOffButton.Load(Parser, DynamicObject->mdKabina); @@ -5295,13 +5464,17 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) ggUniversal4Button.Load(Parser, DynamicObject->mdKabina, DynamicObject->mdModel); // SEKCJA WSKAZNIKOW else if ((str == AnsiString("tachometer:")) || (str == AnsiString("tachometerb:"))) - { // predkosciomierz wskazówkowy z szarpaniem + { // predkosciomierz + // wskazówkowy z + // szarpaniem gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka gg->Load(Parser, DynamicObject->mdKabina); gg->AssignFloat(&fTachoVelocityJump); } else if (str == AnsiString("tachometern:")) - { // predkosciomierz wskazówkowy bez szarpania + { // predkosciomierz + // wskazówkowy bez + // szarpania gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka gg->Load(Parser, DynamicObject->mdKabina); gg->AssignFloat(&fTachoVelocity); @@ -5336,8 +5509,19 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) gg->Load(Parser, DynamicObject->mdKabina); gg->AssignFloat(fHCurrent); } + else if (str == AnsiString("eimscreen:")) + { // amperomierz calkowitego pradu + int i = Parser->GetNextSymbol().ToInt(); + int j = Parser->GetNextSymbol().ToInt(); + gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka + gg->Load(Parser, DynamicObject->mdKabina); + gg->AssignFloat(&fEIMParams[i][j]); + } else if ((str == AnsiString("brakepress:")) || (str == AnsiString("brakepressb:"))) - { // manometr cylindrow hamulcowych //Ra 2014-08: przeniesione do TCab + { // manometr cylindrow + // hamulcowych //Ra + // 2014-08: przeniesione + // do TCab gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka gg->Load(Parser, DynamicObject->mdKabina, NULL, 0.1); gg->AssignDouble(&mvOccupied->BrakePress); @@ -5348,9 +5532,9 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) gg->Load(Parser, DynamicObject->mdKabina, NULL, 0.1); gg->AssignDouble(&mvOccupied->PipePress); } - else if (str == - AnsiString( - "limpipepress:")) // manometr zbiornika sterujacego zaworu maszynisty + else if (str == AnsiString("limpipepress:")) // manometr zbiornika + // sterujacego zaworu + // maszynisty ggZbS.Load(Parser, DynamicObject->mdKabina, NULL, 0.1); else if (str == AnsiString("cntrlpress:")) { // manometr zbiornika kontrolnego/rorządu @@ -5359,7 +5543,9 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) gg->AssignDouble(&mvControlled->PantPress); } else if ((str == AnsiString("compressor:")) || (str == AnsiString("compressorb:"))) - { // manometr sprezarki/zbiornika glownego + { // manometr + // sprezarki/zbiornika + // glownego gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka gg->Load(Parser, DynamicObject->mdKabina, NULL, 0.1); gg->AssignDouble(&mvOccupied->Compressor); @@ -5421,8 +5607,8 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) gg->Load(Parser, DynamicObject->mdKabina); gg->AssignDouble(&mvControlled->dizel_engage); } // ggEngageRatio.Load(Parser,DynamicObject->mdKabina); - else if (str == AnsiString("maingearstatus:")) // np. ciśnienie sterownika skrzyni - // biegów + else if (str == AnsiString("maingearstatus:")) // np. ciśnienie sterownika + // skrzyni biegów ggMainGearStatus.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("ignitionkey:")) // ggIgnitionKey.Load(Parser, DynamicObject->mdKabina); @@ -5544,6 +5730,13 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) btLampkaBackward.Load(Parser, DynamicObject->mdKabina); else if (str == AnsiString("i-cablight:")) // hunter-171012 btCabLight.Load(Parser, DynamicObject->mdKabina); + else if (str == AnsiString("i-doors:")) + { + int i = Parser->GetNextSymbol().ToInt() - 1; + bt = Cabine[cabindex].Button(-1); // pierwsza wolna lampka + bt->Load(Parser, DynamicObject->mdKabina); + bt->AssignBool(bDoors + i); + } else if (str == AnsiString("pyscreen:")) pyScreens.init(Parser, DynamicObject->mdKabina, DynamicObject->GetName(), NewCabNo); // btLampkaUnknown.Init("unknown",mdKabina,false); @@ -5559,15 +5752,16 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName) pyScreens.start(); if (DynamicObject->mdKabina) { - DynamicObject->mdKabina - ->Init(); // obrócenie modelu oraz optymalizacja, również zapisanie binarnego + DynamicObject->mdKabina->Init(); // obrócenie modelu oraz optymalizacja, + // również zapisanie binarnego return true; } return AnsiCompareStr(str, AnsiString("none")); } void TTrain::MechStop() -{ // likwidacja ruchu kamery w kabinie (po powrocie przez [F4]) +{ // likwidacja ruchu kamery w kabinie (po powrocie + // przez [F4]) pMechPosition = vector3(0, 0, 0); pMechShake = vector3(0, 0, 0); vMechMovement = vector3(0, 0, 0); @@ -5591,15 +5785,19 @@ vector3 TTrain::MirrorPosition(bool lewe) }; void TTrain::DynamicSet(TDynamicObject *d) -{ // taka proteza: chcę podłączyć kabinę EN57 bezpośrednio z silnikowym, aby nie robić tego przez - // ukrotnienie +{ // taka proteza: chcę podłączyć + // kabinę EN57 bezpośrednio z + // silnikowym, aby nie robić tego + // przez ukrotnienie // drugi silnikowy i tak musi być ukrotniony, podobnie jak kolejna jednostka - // problem się robi ze światłami, które będą zapalane w silnikowym, ale muszą świecić się w + // problem się robi ze światłami, które będą zapalane w silnikowym, ale muszą + // świecić się w rozrządczych + // dla EZT światła czołowe będą "zapalane w silnikowym", ale widziane z // rozrządczych - // dla EZT światła czołowe będą "zapalane w silnikowym", ale widziane z rozrządczych // również wczytywanie MMD powinno dotyczyć aktualnego członu // problematyczna może być kwestia wybranej kabiny (w silnikowym...) - // jeśli silnikowy będzie zapięty odwrotnie (tzn. -1), to i tak powinno jeździć dobrze + // jeśli silnikowy będzie zapięty odwrotnie (tzn. -1), to i tak powinno + // jeździć dobrze // również hamowanie wykonuje się zaworem w członie, a nie w silnikowym... DynamicObject = d; // jedyne miejsce zmiany mvOccupied = mvControlled = d ? DynamicObject->MoverParameters : NULL; // albo silnikowy w EZT @@ -5608,7 +5806,8 @@ void TTrain::DynamicSet(TDynamicObject *d) if (mvControlled->TrainType & dt_EZT) // na razie dotyczy to EZT if (DynamicObject->NextConnected ? mvControlled->Couplers[1].AllowedFlag & ctrain_depot : false) - { // gdy jest człon od sprzęgu 1, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 1, a sprzęg łączony + // warsztatowo (powiedzmy) if ((mvControlled->Power < 1.0) && (mvControlled->Couplers[1].Connected->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma mvControlled = @@ -5617,7 +5816,8 @@ void TTrain::DynamicSet(TDynamicObject *d) else if (DynamicObject->PrevConnected ? mvControlled->Couplers[0].AllowedFlag & ctrain_depot : false) - { // gdy jest człon od sprzęgu 0, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 0, a sprzęg łączony + // warsztatowo (powiedzmy) if ((mvControlled->Power < 1.0) && (mvControlled->Couplers[0].Connected->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma mvControlled = @@ -5628,7 +5828,8 @@ void TTrain::DynamicSet(TDynamicObject *d) if (mvOccupied->Couplers[1].Connected ? mvOccupied->Couplers[1].AllowedFlag & ctrain_controll : false) - { // gdy jest człon od sprzęgu 1, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 1, a sprzęg łączony + // warsztatowo (powiedzmy) if (mvOccupied->Couplers[1].Connected->Power > 1.0) // ten drugi ma moc mvSecond = (TMoverParameters *)mvOccupied->Couplers[1].Connected; // wskaźnik na drugiego @@ -5636,7 +5837,8 @@ void TTrain::DynamicSet(TDynamicObject *d) else if (mvOccupied->Couplers[0].Connected ? mvOccupied->Couplers[0].AllowedFlag & ctrain_controll : false) - { // gdy jest człon od sprzęgu 0, a sprzęg łączony warsztatowo (powiedzmy) + { // gdy jest człon od sprzęgu 0, a sprzęg łączony + // warsztatowo (powiedzmy) if (mvOccupied->Couplers[0].Connected->Power > 1.0) // ale ten drugi ma moc mvSecond = (TMoverParameters *)mvOccupied->Couplers[0].Connected; // wskaźnik na drugiego diff --git a/Train.h b/Train.h index 97c7b532..090e71ed 100644 --- a/Train.h +++ b/Train.h @@ -152,8 +152,8 @@ class TTrain TGauge ggReleaserButton; TGauge ggAntiSlipButton; TGauge ggFuseButton; - TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania nadmiarowego przetwornic i - // ogrzewania + TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania + // nadmiarowego przetwornic i ogrzewania TGauge ggStLinOffButton; TGauge ggRadioButton; TGauge ggUpperLightButton; @@ -185,7 +185,8 @@ class TTrain TGauge ggUniversal4Button; TGauge ggCabLightButton; // hunter-091012: przelacznik oswietlania kabiny - TGauge ggCabLightDimButton; // hunter-091012: przelacznik przyciemnienia oswietlenia kabiny + TGauge ggCabLightDimButton; // hunter-091012: przelacznik przyciemnienia + // oswietlenia kabiny // NBMX wrzesien 2003 - obsluga drzwi TGauge ggDoorLeftButton; @@ -233,7 +234,8 @@ class TTrain TButton btLampkaOpory; TButton btLampkaWysRozr; TButton btLampkaUniversal3; - int LampkaUniversal3_typ; // ABu 030405 - swiecenie uzaleznione od: 0-nic, 1-obw.gl, 2-przetw. + int LampkaUniversal3_typ; // ABu 030405 - swiecenie uzaleznione od: 0-nic, + // 1-obw.gl, 2-przetw. bool LampkaUniversal3_st; TButton btLampkaWentZaluzje; // ET22 TButton btLampkaOgrzewanieSkladu; @@ -334,7 +336,8 @@ class TTrain // TFadeSound sConverter; //przetwornica // TFadeSound sSmallCompressor; //przetwornica - int iCabLightFlag; // McZapkie:120503: oswietlenie kabiny (0: wyl, 1: przyciemnione, 2: pelne) + int iCabLightFlag; // McZapkie:120503: oswietlenie kabiny (0: wyl, 1: + // przyciemnione, 2: pelne) bool bCabLight; // hunter-091012: czy swiatlo jest zapalone? bool bCabLightDim; // hunter-091012: czy przyciemnienie kabiny jest zapalone? @@ -372,17 +375,20 @@ class TTrain float fTachoVelocityJump; // ze skakaniem float fTachoTimer; float fTachoCount; - float fHVoltage; // napięcie dla dynamicznych gałek - float fHCurrent[4]; // prądy: suma i amperomierze 1,2,3 - float fEngine[4]; // obroty te?trzeba pobra? + float fHVoltage; // napi?cie dla dynamicznych ga?ek + float fHCurrent[4]; // pr?dy: suma i amperomierze 1,2,3 + float fEngine[4]; // obroty te? trzeba pobra? + float fPress[20][3]; // cisnienia dla wszystkich czlonow + bool bDoors[20]; // drzwi dla wszystkich czlonow // McZapkie: do syczenia float fPPress, fNPress; float fSPPress, fSNPress; - int iSekunda; // Ra: sekunda aktualizacji prędkości - int iRadioChannel; // numer aktualnego kanału radiowego + int iSekunda; // Ra: sekunda aktualizacji pr?dko?ci + int iRadioChannel; // numer aktualnego kana?u radiowego TPythonScreens pyScreens; public: + float fEIMParams[9][10]; // parametry dla silnikow asynchronicznych int RadioChannel() { return iRadioChannel;