diff --git a/Console.cpp b/Console.cpp index 5f2ceb85..4f3527c5 100644 --- a/Console.cpp +++ b/Console.cpp @@ -114,7 +114,7 @@ int Console::iMode = 0; int Console::iConfig = 0; TPoKeys55 *Console::PoKeys55[2] = {NULL, NULL}; TLPT *Console::LPT = NULL; -MWDComm *Console::MWD = NULL; // maciek001: obiekt dla MWD +TMWDComm *Console::MWDComm = NULL; // maciek001: obiekt dla MWD int Console::iSwitch[8]; // bistabilne w kabinie, załączane z [Shift], wyłączane bez int Console::iButton[8]; // monostabilne w kabinie, załączane podczas trzymania klawisza @@ -126,13 +126,14 @@ Console::Console() iSwitch[i] = 0; // bity 0..127 - bez [Ctrl], 128..255 - z [Ctrl] iButton[i] = 0; // bity 0..127 - bez [Shift], 128..255 - z [Shift] } + MWDComm = NULL; }; Console::~Console() { delete PoKeys55[0]; delete PoKeys55[1]; - delete MWD; + delete MWDComm; }; void Console::ModeSet(int m, int h) @@ -177,17 +178,20 @@ int Console::On() PoKeys55[0] = NULL; } break; - case 5: // maciek001: MWD OK - MWD = new MWDComm(); - if (!(MWD->Open())) - { - delete MWD; - iMode = 0; - Global::iFeedbackMode = 0; - WriteLog("COM Port not open!"); - } - break; } + + if (Global::bMWDmasterEnable) + { + WriteLog("Opening ComPort"); + MWDComm = new TMWDComm(); + if (!(MWDComm->Open())) // jeżeli nie otwarł portu + { + WriteLog("ERROR: ComPort is NOT OPEN!"); + delete MWDComm; + MWDComm = NULL; + } + } + return 0; }; @@ -206,8 +210,8 @@ void Console::Off() PoKeys55[1] = NULL; delete LPT; LPT = NULL; - delete MWD; // maciek001: zamykanie portu COM i takie tam inne ;) - MWD = NULL; + delete MWDComm; + MWDComm = NULL; }; void Console::BitsSet(int mask, int entry) @@ -296,104 +300,57 @@ void Console::BitsUpdate(int mask) PoKeys55[0]->Write(0x40, 16 - 1, (iBits & 0x4000) ? 1 : 0); } break; - case 5: // maciek001: MWD lampki i kontrolki - /* out3: ogrzewanie sk?adu, opory rozruchowe, poslizg, zaluzjewent, -, -, czuwak, shp - out4: stycz.liniowe, pezekaznikróżnicobwpomoc, nadmiarprzetw, roznicowy obw. gł, - nadmiarsilniki, wylszybki, zanikprąduprzyjeździenaoporach, nadmiarsprezarki - out5: HASLER */ - if (mask & 0x0001) - if (iBits & 1) - { - MWD->WriteDataBuff[4] |= 1 << 7; // SHP HASLER też - if (!MWD->bSHPstate) - { - MWD->bSHPstate = true; - MWD->bPrzejazdSHP = true; - } - else - MWD->bPrzejazdSHP = false; - } - else - { - MWD->WriteDataBuff[4] &= ~(1 << 7); - MWD->bPrzejazdSHP = false; - MWD->bSHPstate = false; - } - if (mask & 0x0002) - if (iBits & 2) - MWD->WriteDataBuff[4] |= 1 << 6; // CA - else - MWD->WriteDataBuff[4] &= ~(1 << 6); - if (mask & 0x0004) - if (iBits & 4) - MWD->WriteDataBuff[4] |= 1 << 1; // jazda na oporach rozruchowych - else - MWD->WriteDataBuff[4] &= ~(1 << 1); - if (mask & 0x0008) - if (iBits & 8) - MWD->WriteDataBuff[5] |= 1 << 5; // wyłącznik szybki - else - MWD->WriteDataBuff[5] &= ~(1 << 5); - if (mask & 0x0010) - if (iBits & 0x10) - MWD->WriteDataBuff[5] |= 1 << 4; // nadmiarowy silników trakcyjnych - else - MWD->WriteDataBuff[5] &= ~(1 << 4); - if (mask & 0x0020) - if (iBits & 0x20) - MWD->WriteDataBuff[4] |= 1 << 0; // styczniki liniowe - else - MWD->WriteDataBuff[5] &= ~(1 << 0); - if (mask & 0x0040) - if (iBits & 0x40) - MWD->WriteDataBuff[4] |= 1 << 2; // poślizg - else - MWD->WriteDataBuff[4] &= ~(1 << 2); - if (mask & 0x0080) - if (iBits & 0x80) - MWD->WriteDataBuff[5] |= 1 << 2; // (nadmiarowy) przetwornicy? ++ - else - MWD->WriteDataBuff[5] &= ~(1 << 2); - if (mask & 0x0100) - if (iBits & 0x100) - MWD->WriteDataBuff[5] |= 1 << 7; // nadmiarowy sprężarki - else - MWD->WriteDataBuff[5] &= ~(1 << 7); - if (mask & 0x0200) - if (iBits & 0x200) - MWD->WriteDataBuff[2] |= 1 << 1; // wentylatory i opory - else - MWD->WriteDataBuff[2] &= ~(1 << 1); - if (mask & 0x0400) - if (iBits & 0x400) - MWD->WriteDataBuff[2] |= 1 << 2; // wysoki rozruch - else - MWD->WriteDataBuff[2] &= ~(1 << 2); - if (mask & 0x0800) - if (iBits & 0x800) - MWD->WriteDataBuff[4] |= 1 << 0; // ogrzewanie pociągu - else - MWD->WriteDataBuff[4] &= ~(1 << 0); - if (mask & 0x1000) - if (iBits & 0x1000) - MWD->bHamowanie = true; // hasler: ciśnienie w hamulcach HASLER rysik 2 - else - MWD->bHamowanie = false; - if (mask & 0x2000) - if (iBits & 0x2000) - MWD->WriteDataBuff[6] |= - 1 << 4; // hasler: prąd "na" silnikach HASLER rysik 3 - else - MWD->WriteDataBuff[6] &= ~(1 << 4); - if (mask & 0x4000) - if (iBits & 0x4000) - MWD->WriteDataBuff[6] |= 1 << 7; // brzęczyk SHP/CA - else - MWD->WriteDataBuff[6] &= ~(1 << 7); - // if(mask & 0x8000) if(iBits & 0x8000) MWD->WriteDataBuff[1] |= 1<<7; (puste) - // else MWD->WriteDataBuff[0] &= ~(1<<7); - break; - } + } + if (Global::bMWDmasterEnable) + { + // maciek001: MWDComm lampki i kontrolki + // out3: ogrzewanie sk?adu, opory rozruchowe, poslizg, zaluzjewent, -, -, czuwak, shp + // out4: stycz.liniowe, pezekaznikr??nicobwpomoc, nadmiarprzetw, roznicowy obw. g?, nadmiarsilniki, wylszybki, zanikpr?duprzyje?dzienaoporach, nadmiarsprezarki + // out5: HASLER */ + if (mask & 0x0001) if (iBits & 1) { + MWDComm->WriteDataBuff[4] |= 1 << 7; // SHP HASLER też + if (!MWDComm->bSHPstate) { + MWDComm->bSHPstate = true; + MWDComm->bPrzejazdSHP = true; + } + else MWDComm->bPrzejazdSHP = false; + } + else { + MWDComm->WriteDataBuff[4] &= ~(1 << 7); + MWDComm->bPrzejazdSHP = false; + MWDComm->bSHPstate = false; + } + if (mask & 0x0002) if (iBits & 2) MWDComm->WriteDataBuff[4] |= 1 << 6; // CA + else MWDComm->WriteDataBuff[4] &= ~(1 << 6); + if (mask & 0x0004) if (iBits & 4) MWDComm->WriteDataBuff[4] |= 1 << 1; // jazda na oporach rozruchowych + else MWDComm->WriteDataBuff[4] &= ~(1 << 1); + if (mask & 0x0008) if (iBits & 8) MWDComm->WriteDataBuff[5] |= 1 << 5; // wy??cznik szybki + else MWDComm->WriteDataBuff[5] &= ~(1 << 5); + if (mask & 0x0010) if (iBits & 0x10) MWDComm->WriteDataBuff[5] |= 1 << 4; // nadmiarowy silnik?w trakcyjnych + else MWDComm->WriteDataBuff[5] &= ~(1 << 4); + if (mask & 0x0020) if (iBits & 0x20) MWDComm->WriteDataBuff[4] |= 1 << 0; // styczniki liniowe + else MWDComm->WriteDataBuff[5] &= ~(1 << 0); + if (mask & 0x0040) if (iBits & 0x40) MWDComm->WriteDataBuff[4] |= 1 << 2; // po?lizg + else MWDComm->WriteDataBuff[4] &= ~(1 << 2); + if (mask & 0x0080) if (iBits & 0x80) MWDComm->WriteDataBuff[5] |= 1 << 2; // (nadmiarowy) przetwornicy? ++ + else MWDComm->WriteDataBuff[5] &= ~(1 << 2); + if (mask & 0x0100) if (iBits & 0x100) MWDComm->WriteDataBuff[5] |= 1 << 7; // nadmiarowy spr??arki + else MWDComm->WriteDataBuff[5] &= ~(1 << 7); + if (mask & 0x0200) if (iBits & 0x200) MWDComm->WriteDataBuff[2] |= 1 << 1; // wentylatory i opory + else MWDComm->WriteDataBuff[2] &= ~(1 << 1); + if (mask & 0x0400) if (iBits & 0x400) MWDComm->WriteDataBuff[2] |= 1 << 2; // wysoki rozruch + else MWDComm->WriteDataBuff[2] &= ~(1 << 2); + if (mask & 0x0800) if (iBits & 0x800) MWDComm->WriteDataBuff[4] |= 1 << 0; // ogrzewanie poci?gu + else MWDComm->WriteDataBuff[4] &= ~(1 << 0); + if (mask & 0x1000) if (iBits & 0x1000) MWDComm->bHamowanie = true; // hasler: ci?nienie w hamulcach HASLER rysik 2 + else MWDComm->bHamowanie = false; + if (mask & 0x2000) if (iBits & 0x2000) MWDComm->WriteDataBuff[6] |= 1 << 4; // hasler: pr?d "na" silnikach HASLER rysik 3 + else MWDComm->WriteDataBuff[6] &= ~(1 << 4); + if (mask & 0x4000) if (iBits & 0x4000) MWDComm->WriteDataBuff[6] |= 1 << 7; // brz?czyk SHP/CA + else MWDComm->WriteDataBuff[6] &= ~(1 << 7); + //if(mask & 0x8000) if(iBits & 0x8000) MWDComm->WriteDataBuff[1] |= 1<<7; (puste) + //else MWDComm->WriteDataBuff[0] &= ~(1<<7); + } }; bool Console::Pressed(int x) @@ -434,61 +391,43 @@ void Console::ValueSet(int x, double y) WriteLog(" calibrated=" + std::to_string(temp)); PoKeys55[0]->PWM(x, temp); } - if (iMode == 5 && MWD) // pwm-y i prędkość - { - unsigned int iliczba; - if (x == 0) - { - iliczba = (unsigned int)floor((y / (Global::fMWDzg[0] * 10) * Global::fMWDzg[1]) + - 0.5); // zbiornik główny - MWD->WriteDataBuff[12] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[11] = (unsigned char)iliczba; - } - else if (x == 1) - { - iliczba = (unsigned int)floor((y / (Global::fMWDpg[0] * 10) * Global::fMWDpg[1]) + - 0.5); // przewód główny - MWD->WriteDataBuff[10] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[9] = (unsigned char)iliczba; - } - else if (x == 2) - { - iliczba = (unsigned int)floor((y / (Global::fMWDph[0] * 10) * Global::fMWDph[1]) + - 0.5); // cylinder hamulcowy - MWD->WriteDataBuff[8] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[7] = (unsigned char)iliczba; - } - else if (x == 3) - { - iliczba = (unsigned int)floor((y / Global::fMWDvolt[0] * Global::fMWDvolt[1]) + - 0.5); // woltomierz WN - MWD->WriteDataBuff[14] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[13] = (unsigned char)iliczba; - } - else if (x == 4) - { - iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + - 0.5); // amp WN 1 - MWD->WriteDataBuff[16] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[15] = (unsigned char)iliczba; - } - else if (x == 5) - { - iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + - 0.5); // amp WN 2 - MWD->WriteDataBuff[18] = (unsigned char)(iliczba >> 8); - MWD->WriteDataBuff[17] = (unsigned char)iliczba; - } - else if (x == 6) - { - iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + - 0.5); // amp WN 3 - MWD->WriteDataBuff[20] = (unsigned int)(iliczba >> 8); - MWD->WriteDataBuff[19] = (unsigned char)iliczba; - } - else if (x == 7) - MWD->WriteDataBuff[0] = (unsigned char)floor(y); // prędkość - } + if (Global::bMWDmasterEnable) + { + unsigned int iliczba; + switch (x) + { + case 0: iliczba = (unsigned int)floor((y / (Global::fMWDzg[0] * 10) * Global::fMWDzg[1]) + 0.5); // zbiornik g??wny + MWDComm->WriteDataBuff[12] = (unsigned char)(iliczba >> 8); + MWDComm->WriteDataBuff[11] = (unsigned char)iliczba; + break; + case 1: iliczba = (unsigned int)floor((y / (Global::fMWDpg[0] * 10) * Global::fMWDpg[1]) + 0.5); // przew?d g??wny + MWDComm->WriteDataBuff[10] = (unsigned char)(iliczba >> 8); + MWDComm->WriteDataBuff[9] = (unsigned char)iliczba; + break; + case 2: iliczba = (unsigned int)floor((y / (Global::fMWDph[0] * 10) * Global::fMWDph[1]) + 0.5); // cylinder hamulcowy + MWDComm->WriteDataBuff[8] = (unsigned char)(iliczba >> 8); + MWDComm->WriteDataBuff[7] = (unsigned char)iliczba; + break; + case 3: iliczba = (unsigned int)floor((y / Global::fMWDvolt[0] * Global::fMWDvolt[1]) + 0.5); // woltomierz WN + MWDComm->WriteDataBuff[14] = (unsigned char)(iliczba >> 8); + MWDComm->WriteDataBuff[13] = (unsigned char)iliczba; + break; + case 4: iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + 0.5); // amp WN 1 + MWDComm->WriteDataBuff[16] = (unsigned char)(iliczba >> 8); + MWDComm->WriteDataBuff[15] = (unsigned char)iliczba; + break; + case 5: iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + 0.5); // amp WN 2 + MWDComm->WriteDataBuff[18] = (unsigned char)(iliczba >> 8); + MWDComm->WriteDataBuff[17] = (unsigned char)iliczba; + break; + case 6: iliczba = (unsigned int)floor((y / Global::fMWDamp[0] * Global::fMWDamp[1]) + 0.5); // amp WN 3 + MWDComm->WriteDataBuff[20] = (unsigned int)(iliczba >> 8); + MWDComm->WriteDataBuff[19] = (unsigned char)iliczba; + break; + case 7: MWDComm->WriteDataBuff[0] = (unsigned char)floor(y); // prędkość + break; + } + } }; void Console::Update() @@ -506,10 +445,11 @@ void Console::Update() Global::iPause |= 8; // tak??? PoKeys55[0]->Connect(); // próba ponownego podłączenia } - if (iMode == 5) // Obs?uga MWD OK - { - MWD->Run(); - } + if (Global::bMWDmasterEnable) + { + if (MWDComm->GetMWDState()) MWDComm->Run(); + else MWDComm->Close(); + } }; float Console::AnalogGet(int x) @@ -534,25 +474,20 @@ float Console::AnalogCalibrateGet(int x) b + Global::fCalibrateIn[x][0]; } - if (iMode == 5 && MWD) // maciek001: obs?uga hamulc?w (wej?? analogowych) OK - { - float b = MWD->fAnalog[x]; - // b = - // b*(Global::fMWDAnalogCalib[x][0]-Global::fMWDAnalogCalib[x][1])/Global::fMWDAnalogCalib[x][3]+Global::fMWDAnalogCalib[x][1]/Global::fMWDAnalogCalib[x][3]; - b = (b - Global::fMWDAnalogCalib[x][1]) / - (Global::fMWDAnalogCalib[x][1] - Global::fMWDAnalogCalib[x][0]); - switch (x) - { - case 0: - return (b * 8 - 2); - break; - case 1: - return (b * 10); - break; - default: - return 0; - } - } + if (Global::bMWDmasterEnable && Global::bMWDBreakEnable) + { + float b = (float)MWDComm->uiAnalog[x]; + b = (b - Global::fMWDAnalogInCalib[x][0]) / (Global::fMWDAnalogInCalib[x][1] - Global::fMWDAnalogInCalib[x][0]); + switch (x) + { + case 0: if (Global::bMWDdebugEnable && Global::iMWDDebugMode & 4) WriteLog("Pozycja kranu = " + to_string(b * 8 - 2)); + return (b * 8 - 2); + break; + case 1: return (b * 10); + break; + default: return 0; + } + } return -1.0; // odcięcie }; diff --git a/Console.h b/Console.h index 440bc63b..aedaff1f 100644 --- a/Console.h +++ b/Console.h @@ -13,7 +13,7 @@ http://mozilla.org/MPL/2.0/. class TConsoleDevice; // urządzenie podłączalne za pomocą DLL class TPoKeys55; class TLPT; -class MWDComm; // maciek001: dodana obsluga portu COM +class TMWDComm; // maciek001: dodana obsluga portu COM // klasy konwersji znaków wprowadzanych z klawiatury class TKeyTrans @@ -32,7 +32,7 @@ class Console static int iBits; // podstawowy zestaw lampek static TPoKeys55 *PoKeys55[2]; // może ich być kilka static TLPT *LPT; - static MWDComm *MWD; // maciek001: na potrzeby MWD + static TMWDComm *MWDComm; // maciek001: na potrzeby MWD static void BitsUpdate(int mask); // zmienne dla trybu "jednokabinowego", potrzebne do współpracy z pulpitem (PoKeys) // używając klawiatury, każdy pojazd powinien mieć własny stan przełączników diff --git a/Console/MWD.cpp b/Console/MWD.cpp index 42cb4efc..cee73bc1 100644 --- a/Console/MWD.cpp +++ b/Console/MWD.cpp @@ -22,55 +22,62 @@ http://mozilla.org/MPL/2.0/. #include -#define BYTETOWRITE 31 /* ilość bajtów przesyłanych z MaSzyny*/ -#define BYTETOREAD 16 /* ilość bajtów przesyłanych do MaSzyny*/ - HANDLE hComm; -MWDComm::MWDComm() // konstruktor +TMWDComm::TMWDComm() // konstruktor { - MWDTime = 0; - bSHPstate = false; - bPrzejazdSHP = false; - bKabina1 = true; // pasuje wyciągnąć dane na temat kabiny i ustawiać te dwa parametry! - bKabina2 = false; - bHamowanie = false; - bCzuwak = false; + MWDTime = 0; + bSHPstate = false; + bPrzejazdSHP = false; + bKabina1 = true; // pasuje wyciągnąć dane na temat kabiny + bKabina2 = false; // i ustawiać te dwa parametry! + bHamowanie = false; + bCzuwak = false; - bRysik1H = false; - bRysik1L = false; - bRysik2H = false; - bRysik2L = false; + bRysik1H = false; + bRysik1L = false; + bRysik2H = false; + bRysik2L = false; - bocznik = 0; - nastawnik = 0; - kierunek = 0; - bnkMask = 0; + bocznik = 0; + nastawnik = 0; + kierunek = 0; + bnkMask = 0; - int i = 0; - while (i < BYTETOWRITE) - { - if (i < BYTETOREAD) - ReadDataBuff[i] = 0; - WriteDataBuff[i] = 0; - i++; - } - i = 0; - while (i < 6) - { - lastStateData[i] = 0; - maskSwitch[i] = 0; - bitSwitch[i] = 0; - i++; - } + int i = 6; + + while (i) + { + i--; + lastStateData[i] = 0; + maskData[i] = 0; + maskSwitch[i] = 0; + bitSwitch[i] = 0; + } + + i = 0; + while (i 0) return 1; @@ -149,26 +160,33 @@ inline bool MWDComm::GetMWDState() // sprawdzanie otwarcia portu COM return 0; } -bool MWDComm::ReadData() // odbieranie danych + odczyta danych analogowych i zapis do zmiennych +bool TMWDComm::ReadData() // odbieranie danych + odczyta danych analogowych i zapis do zmiennych { - DWORD bytes_read; - ReadFile(hComm, &ReadDataBuff[0], BYTETOREAD, &bytes_read, NULL); + DWORD bytes_read; + ReadFile(hComm, &ReadDataBuff[0], BYTETOREAD, &bytes_read, NULL); - fAnalog[0] = - (float)((ReadDataBuff[9] << 8) + ReadDataBuff[8]) / - Global::fMWDAnalogCalib[0][2]; // 4095.0f; //max wartosc wynikająca z rozdzielczości - fAnalog[1] = - (float)((ReadDataBuff[11] << 8) + ReadDataBuff[10]) / Global::fMWDAnalogCalib[1][2]; - fAnalog[2] = - (float)((ReadDataBuff[13] << 8) + ReadDataBuff[12]) / Global::fMWDAnalogCalib[2][2]; - fAnalog[3] = - (float)((ReadDataBuff[15] << 8) + ReadDataBuff[14]) / Global::fMWDAnalogCalib[3][2]; - CheckData(); - - return TRUE; + if (Global::bMWDBreakEnable) + { + uiAnalog[0] = (ReadDataBuff[9] << 8) + ReadDataBuff[8]; + uiAnalog[1] = (ReadDataBuff[11] << 8) + ReadDataBuff[10]; + uiAnalog[2] = (ReadDataBuff[13] << 8) + ReadDataBuff[12]; + uiAnalog[3] = (ReadDataBuff[15] << 8) + ReadDataBuff[14]; + if (Global::bMWDdebugEnable && (Global::iMWDDebugMode & 1)) + { + WriteLog("Main Break = " + to_string(uiAnalog[0])); + WriteLog("Locomotiv Break = " + to_string(uiAnalog[1])); + } + if (Global::bMWDdebugEnable && (Global::iMWDDebugMode & 2)) + { + WriteLog("Analog input 1 = " + to_string(uiAnalog[2])); + WriteLog("Analog imput 2 = " + to_string(uiAnalog[3])); + } + } + if (Global::bMWDInputEnable) CheckData(); + return TRUE; } -bool MWDComm::SendData() // wysyłanie danych +bool TMWDComm::SendData() // wysyłanie danych { DWORD bytes_write; @@ -177,30 +195,30 @@ bool MWDComm::SendData() // wysyłanie danych return TRUE; } -bool MWDComm::Run() // wywoływanie obsługi MWD + generacja większego opóźnienia +bool TMWDComm::Run() // wywoływanie obsługi MWD + generacja większego opóźnienia { - MWDTime++; - if (!(MWDTime % 5)) - { - if (GetMWDState()) - { - SendData(); - if (Global::bMWDInputDataEnable) - ReadData(); - return true; - } - else - { - WriteLog("Port COM: connection ERROR!"); - // może spróbować się połączyć znowu? - return false; - } - MWDTime = 0; - } - return false; + if (GetMWDState()) + { + MWDTime++; + if (!(MWDTime % Global::iMWDdivider)) + { + MWDTime = 0; + SendData(); + ReadData(); + return 1; + } + } + else + { + WriteLog("Port COM: connection ERROR!"); + Close(); + // może spróbować się połączyć znowu? + return 0; + } + return 1; } -void MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowanie maszyną +void TMWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowanie maszyną { int i = 0; while (i < 6) @@ -212,43 +230,43 @@ void MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowa /* Rozpiska portów! Port0: 0 NC odblok. przek. sprężarki i wentyl. oporów - 1 M wyłącznik wył. szybkiego - 2 Shift+M impuls załączający wył. szybki - 3 N odblok. przekaźników nadmiarowych + 1 M wyłącznik wył. szybkiego + 2 Shift+M impuls załączający wył. szybki + 3 N odblok. przekaźników nadmiarowych i różnicowego obwodu głównego - 4 NC rezerwa - 5 Ctrl+N odblok. przek. nadmiarowych + 4 NC rezerwa + 5 Ctrl+N odblok. przek. nadmiarowych przetwornicy, ogrzewania pociągu i różnicowych obw. pomocniczych - 6 L wył. styczników liniowych - 7 SPACE kasowanie czuwaka + 6 L wył. styczników liniowych + 7 SPACE kasowanie czuwaka Port1: 0 NC - 1 (Shift) X przetwornica - 2 (Shift) C sprężarka - 3 S piasecznice - 4 (Shift) H ogrzewanie składu - 5 przel. hamowania Shift+B + 1 (Shift) X przetwornica + 2 (Shift) C sprężarka + 3 S piasecznice + 4 (Shift) H ogrzewanie składu + 5 przel. hamowania Shift+B pspbpwy Ctrl+B pospieszny B towarowy - 6 przel. hamowania - 7 (Shift) F rozruch w/n + 6 przel. hamowania + 7 (Shift) F rozruch w/n Port2: 0 (Shift) P pantograf przedni - 1 (Shift) O pantograf tylni - 2 ENTER przyhamowanie przy poślizgu - 3 () przyciemnienie świateł - 4 () przyciemnienie świateł - 5 NUM6 odluźniacz - 6 a syrena lok W - 7 A syrena lok N + 1 (Shift) O pantograf tylni + 2 ENTER przyhamowanie przy poślizgu + 3 () przyciemnienie świateł + 4 () przyciemnienie świateł + 5 NUM6 odluźniacz + 6 a syrena lok W + 7 A syrena lok N Port3: 0 Shift+J bateria - 1 - 2 - 3 - 4 - 5 - 6 - 7 + 1 + 2 + 3 + 4 + 5 + 6 + 7 */ /* po przełączeniu bistabilnego najpierw wciskamy klawisz i przy następnym @@ -257,298 +275,238 @@ void MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowa // wciskanie przycisków klawiatury /*PORT0*/ - if (maskData[0] & 0x02 && lastStateData[0] & 0x02) - KeyBoard('M', 1); // wyłączenie wyłącznika szybkiego - else - KeyBoard('M', 0); // monostabilny - if (maskData[0] & 0x04 && lastStateData[0] & 0x04) - { // impuls załączający wyłącznik szybki - KeyBoard(0x10, 1); // monostabilny - KeyBoard('M', 1); - } - else - { - KeyBoard('M', 0); - KeyBoard(0x10, 0); - } - if (maskData[0] & 0x08 && lastStateData[0] & 0x08) - KeyBoard('N', 1); // odblok nadmiarowego silników trakcyjnych - else - KeyBoard('N', 0); // monostabilny - if (maskData[0] & 0x20 && lastStateData[0] & 0x20) - { // odblok nadmiarowego przetwornicy, ogrzewania poc. - KeyBoard(0x11, 1); // różnicowego obwodów pomocniczych - KeyBoard('N', 1); // monostabilny - } - else - { - KeyBoard('N', 0); - KeyBoard(0x11, 0); - } - if (maskData[0] & 0x40 && lastStateData[0] & 0x40) - KeyBoard('L', 1); // wył. styczników liniowych - else - KeyBoard('L', 0); // monostabilny - if (maskData[0] & 0x80 && lastStateData[0] & 0x80) - KeyBoard(0x20, 1); // kasowanie czuwaka/SHP - else - KeyBoard(0x20, 0); // kasowanie czuwaka/SHP + if (maskData[0] & 0x02) if (lastStateData[0] & 0x02) KeyBoard('M', 1); // wyłączenie wyłącznika szybkiego + else KeyBoard('M', 0); // monostabilny + if (maskData[0] & 0x04) if (lastStateData[0] & 0x04) { // impuls załączający wyłącznik szybki + KeyBoard(0x10, 1); // monostabilny + KeyBoard('M', 1); + } + else { + KeyBoard('M', 0); + KeyBoard(0x10, 0); + } + if (maskData[0] & 0x08) if (lastStateData[0] & 0x08) KeyBoard('N', 1); // odblok nadmiarowego silników trakcyjnych + else KeyBoard('N', 0); // monostabilny + if (maskData[0] & 0x20) if (lastStateData[0] & 0x20) { // odblok nadmiarowego przetwornicy, ogrzewania poc. + KeyBoard(0x11, 1); // różnicowego obwodów pomocniczych + KeyBoard('N', 1); // monostabilny + } + else { + KeyBoard('N', 0); + KeyBoard(0x11, 0); + } + if (maskData[0] & 0x40) if (lastStateData[0] & 0x40) KeyBoard('L', 1); // wył. styczników liniowych + else KeyBoard('L', 0); // monostabilny + if (maskData[0] & 0x80) if (lastStateData[0] & 0x80) KeyBoard(0x20, 1); // kasowanie czuwaka/SHP + else KeyBoard(0x20, 0); // kasowanie czuwaka/SHP /*PORT1*/ // puszczanie przycisku bistabilnego klawiatury - if (maskSwitch[1] & 0x02) - { - if (bitSwitch[1] & 0x02) - { - KeyBoard('X', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('X', 0); - maskSwitch[1] &= ~0x02; - } - if (maskSwitch[1] & 0x04) - { - if (bitSwitch[1] & 0x04) - { - KeyBoard('C', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('C', 0); - maskSwitch[1] &= ~0x04; - } - if (maskSwitch[1] & 0x10) - { - if (bitSwitch[1] & 0x10) - { - KeyBoard('H', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('H', 0); - maskSwitch[1] &= ~0x10; - } - if (maskSwitch[1] & 0x20 || maskSwitch[1] & 0x40) - { - if (maskSwitch[1] & 0x20) - KeyBoard(0x10, 0); - if (maskSwitch[1] & 0x40) - KeyBoard(0x11, 0); - KeyBoard('B', 0); - maskSwitch[1] &= ~0x60; - } - if (maskSwitch[1] & 0x80) - { - if (bitSwitch[1] & 0x80) - { - KeyBoard('F', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('F', 0); - maskSwitch[1] &= ~0x80; - } + if (maskSwitch[1] & 0x02) { + if (bitSwitch[1] & 0x02) { + KeyBoard('X', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('X', 0); + maskSwitch[1] &= ~0x02; + } + if (maskSwitch[1] & 0x04) { + if (bitSwitch[1] & 0x04) { + KeyBoard('C', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('C', 0); + maskSwitch[1] &= ~0x04; + } + if (maskSwitch[1] & 0x10) { + if (bitSwitch[1] & 0x10) { + KeyBoard('H', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('H', 0); + maskSwitch[1] &= ~0x10; + } + if (maskSwitch[1] & 0x20 || maskSwitch[1] & 0x40) { + if (maskSwitch[1] & 0x20) KeyBoard(0x10, 0); + if (maskSwitch[1] & 0x40) KeyBoard(0x11, 0); + KeyBoard('B', 0); + maskSwitch[1] &= ~0x60; + } + if (maskSwitch[1] & 0x80) { + if (bitSwitch[1] & 0x80) { + KeyBoard('F', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('F', 0); + maskSwitch[1] &= ~0x80; + } - if (maskData[1] & 0x02 && lastStateData[1] & 0x02) - { // przetwornica - KeyBoard(0x10, 1); // bistabilny - KeyBoard('X', 1); - maskSwitch[1] |= 0x02; - bitSwitch[1] |= 0x02; - } - else - { - maskSwitch[1] |= 0x02; - bitSwitch[1] &= ~0x02; - KeyBoard('X', 1); - } - if (maskData[1] & 0x04 && lastStateData[1] & 0x04) - { // sprężarka - KeyBoard(0x10, 1); // bistabilny - KeyBoard('C', 1); - maskSwitch[1] |= 0x04; - bitSwitch[1] |= 0x04; - } - else - { - maskSwitch[1] |= 0x04; - bitSwitch[1] &= ~0x04; - KeyBoard('C', 1); - } - if (maskData[1] & 0x08 && lastStateData[1] & 0x08) - KeyBoard('S', 1); // piasecznica - else - KeyBoard('S', 0); // monostabilny - if (maskData[1] & 0x10 && lastStateData[1] & 0x10) - { // ogrzewanie składu - KeyBoard(0x11, 1); // bistabilny - KeyBoard('H', 1); - maskSwitch[1] |= 0x10; - bitSwitch[1] |= 0x10; - } - else - { - maskSwitch[1] |= 0x10; - bitSwitch[1] &= ~0x10; - KeyBoard('H', 1); - } - if (maskData[1] & 0x20 || maskData[1] & 0x40) - { // przełącznik hamowania - if (lastStateData[1] & 0x20) - { // Shift+B - KeyBoard(0x10, 1); - maskSwitch[1] |= 0x20; - } - else if (lastStateData[1] & 0x40) - { // Ctrl+B - KeyBoard(0x11, 1); - maskSwitch[1] |= 0x40; - } - KeyBoard('B', 1); - } - if (maskData[1] & 0x80 && lastStateData[1] & 0x80) - { // rozruch wysoki/niski - KeyBoard(0x10, 1); // bistabilny - KeyBoard('F', 1); - maskSwitch[1] |= 0x80; - bitSwitch[1] |= 0x80; - } - else - { - maskSwitch[1] |= 0x80; - bitSwitch[1] &= ~0x80; - KeyBoard('F', 1); - } + if (maskData[1] & 0x02) if (lastStateData[1] & 0x02) { // przetwornica + KeyBoard(0x10, 1); // bistabilny + KeyBoard('X', 1); + maskSwitch[1] |= 0x02; + bitSwitch[1] |= 0x02; + } + else { + maskSwitch[1] |= 0x02; + bitSwitch[1] &= ~0x02; + KeyBoard('X', 1); + } + if (maskData[1] & 0x04) if (lastStateData[1] & 0x04) { // sprężarka + KeyBoard(0x10, 1); // bistabilny + KeyBoard('C', 1); + maskSwitch[1] |= 0x04; + bitSwitch[1] |= 0x04; + } + else { + maskSwitch[1] |= 0x04; + bitSwitch[1] &= ~0x04; + KeyBoard('C', 1); + } + if (maskData[1] & 0x08) if (lastStateData[1] & 0x08) KeyBoard('S', 1); // piasecznica + else KeyBoard('S', 0); // monostabilny + if (maskData[1] & 0x10) if (lastStateData[1] & 0x10) { // ogrzewanie składu + KeyBoard(0x11, 1); // bistabilny + KeyBoard('H', 1); + maskSwitch[1] |= 0x10; + bitSwitch[1] |= 0x10; + } + else { + maskSwitch[1] |= 0x10; + bitSwitch[1] &= ~0x10; + KeyBoard('H', 1); + } + if (maskData[1] & 0x20 || maskData[1] & 0x40) { // przełącznik hamowania + if (lastStateData[1] & 0x20) { // Shift+B + KeyBoard(0x10, 1); + maskSwitch[1] |= 0x20; + } + else if (lastStateData[1] & 0x40) { // Ctrl+B + KeyBoard(0x11, 1); + maskSwitch[1] |= 0x40; + } + KeyBoard('B', 1); + } - /*PORT2*/ + if (maskData[1] & 0x80) if (lastStateData[1] & 0x80) { // rozruch wysoki/niski + KeyBoard(0x10, 1); // bistabilny + KeyBoard('F', 1); + maskSwitch[1] |= 0x80; + bitSwitch[1] |= 0x80; + } + else { + maskSwitch[1] |= 0x80; + bitSwitch[1] &= ~0x80; + KeyBoard('F', 1); + } - if (maskSwitch[2] & 0x01) - { - if (bitSwitch[2] & 0x01) - { - KeyBoard('P', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('P', 0); - maskSwitch[2] &= ~0x01; - } - if (maskSwitch[2] & 0x02) - { - if (bitSwitch[2] & 0x02) - { - KeyBoard('O', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('O', 0); - maskSwitch[2] &= ~0x02; - } - if (maskData[2] & 0x01 && lastStateData[2] & 0x01) - { // pantograf przedni - KeyBoard(0x10, 1); // bistabilny - KeyBoard('P', 1); - maskSwitch[2] |= 0x01; - bitSwitch[2] |= 0x01; - } - else - { - maskSwitch[2] |= 0x01; - bitSwitch[2] &= ~0x01; - KeyBoard('P', 1); - } - if (maskData[2] & 0x02 && lastStateData[2] & 0x02) - { // pantograf tylni - KeyBoard(0x10, 1); // bistabilny - KeyBoard('O', 1); - maskSwitch[2] |= 0x02; - bitSwitch[2] |= 0x02; - } - else - { - maskSwitch[2] |= 0x02; - bitSwitch[2] &= ~0x02; - KeyBoard('O', 1); - } - if (maskData[2] & 0x04 && lastStateData[2] & 0x04) - { // przyhamowanie przy poślizgu - KeyBoard(0x10, 1); // monostabilny - KeyBoard(0x0D, 1); - } - else - { + //PORT2 + if (maskSwitch[2] & 0x01) { + if (bitSwitch[2] & 0x01) { + KeyBoard('P', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('P', 0); + maskSwitch[2] &= ~0x01; + } + if (maskSwitch[2] & 0x02) { + if (bitSwitch[2] & 0x02) { + KeyBoard('O', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('O', 0); + maskSwitch[2] &= ~0x02; + } - KeyBoard(0x0D, 0); - KeyBoard(0x10, 0); - } - /*if(maskData[2] & 0x08 && lastStateData[2] & 0x08){ // przyciemnienie świateł - KeyBoard(' ',0); // bistabilny - KeyBoard(0x10,1); - KeyBoard(' ',1); - }else{ - KeyBoard(' ',0); - KeyBoard(0x10,0); - KeyBoard(' ',1); - } - if(maskData[2] & 0x10 && lastStateData[2] & 0x10) { // przyciemnienie świateł - KeyBoard(' ',0); // bistabilny - KeyBoard(0x11,1); - KeyBoard(' ',1); - }else{ - KeyBoard(' ',0); - KeyBoard(0x11,0); - KeyBoard(' ',1); - }*/ - if (maskData[2] & 0x20 && lastStateData[2] & 0x20) - KeyBoard(0x66, 1); // odluźniacz - else - KeyBoard(0x66, 0); // monostabilny - if (maskData[2] & 0x40 && lastStateData[2] & 0x40) - { // syrena wysoka - KeyBoard(0x10, 1); // monostabilny - KeyBoard('A', 1); - } - else - { - KeyBoard('A', 0); - KeyBoard(0x10, 0); - } - if (maskData[2] & 0x80 && lastStateData[2] & 0x80) - KeyBoard('A', 1); // syrena niska - else - KeyBoard('A', 0); // monostabilny - /*PORT3*/ + if (maskData[2] & 0x01) if (lastStateData[2] & 0x01) { // pantograf przedni + KeyBoard(0x10, 1); // bistabilny + KeyBoard('P', 1); + maskSwitch[2] |= 0x01; + bitSwitch[2] |= 0x01; + } + else { + maskSwitch[2] |= 0x01; + bitSwitch[2] &= ~0x01; + KeyBoard('P', 1); + } + if (maskData[2] & 0x02) if (lastStateData[2] & 0x02) { // pantograf tylni + KeyBoard(0x10, 1); // bistabilny + KeyBoard('O', 1); + maskSwitch[2] |= 0x02; + bitSwitch[2] |= 0x02; + } + else { + maskSwitch[2] |= 0x02; + bitSwitch[2] &= ~0x02; + KeyBoard('O', 1); + } + if (maskData[2] & 0x04) if (lastStateData[2] & 0x04) { // przyhamowanie przy poślizgu + KeyBoard(0x10, 1); // monostabilny + KeyBoard(0x0D, 1); + } + else { - if (maskSwitch[3] & 0x01) - { - if (bitSwitch[3] & 0x01) - { - KeyBoard('J', 0); - KeyBoard(0x10, 0); - } - else - KeyBoard('J', 0); - maskSwitch[3] &= ~0x01; - } + KeyBoard(0x0D, 0); + KeyBoard(0x10, 0); + } + /*if(maskData[2] & 0x08) if (lastStateData[2] & 0x08){ // przyciemnienie świateł + KeyBoard(' ',0); // bistabilny + KeyBoard(0x10,1); + KeyBoard(' ',1); + }else{ + KeyBoard(' ',0); + KeyBoard(0x10,0); + KeyBoard(' ',1); + } + if(maskData[2] & 0x10) if (lastStateData[2] & 0x10) { // przyciemnienie świateł + KeyBoard(' ',0); // bistabilny + KeyBoard(0x11,1); + KeyBoard(' ',1); + }else{ + KeyBoard(' ',0); + KeyBoard(0x11,0); + KeyBoard(' ',1); + }*/ + if (maskData[2] & 0x20) if (lastStateData[2] & 0x20) KeyBoard(0x66, 1); // odluźniacz + else KeyBoard(0x66, 0); // monostabilny + if (maskData[2] & 0x40) if (lastStateData[2] & 0x40) { // syrena wysoka + KeyBoard(0x10, 1); // monostabilny + KeyBoard('A', 1); + } + else { + KeyBoard('A', 0); + KeyBoard(0x10, 0); + } + if (maskData[2] & 0x80) if (lastStateData[2] & 0x80) KeyBoard('A', 1); // syrena niska + else KeyBoard('A', 0); // monostabilny - if (maskData[3] & 0x01 && lastStateData[3] & 0x01) - { // bateria - KeyBoard(0x10, 1); // bistabilny - KeyBoard('J', 1); - maskSwitch[3] |= 0x01; - bitSwitch[3] |= 0x01; - } - else - { - maskSwitch[3] |= 0x01; - bitSwitch[3] &= ~0x01; - KeyBoard('J', 1); - } + + //PORT3 + + if (maskSwitch[3] & 0x01) { + if (bitSwitch[3] & 0x01) { + KeyBoard('J', 0); + KeyBoard(0x10, 0); + } + else KeyBoard('J', 0); + maskSwitch[3] &= ~0x01; + } + + if (maskData[3] & 0x01) if (lastStateData[3] & 0x01) { // bateria + KeyBoard(0x10, 1); // bistabilny + KeyBoard('J', 1); + maskSwitch[3] |= 0x01; + bitSwitch[3] |= 0x01; + } + else { + maskSwitch[3] |= 0x01; + bitSwitch[3] &= ~0x01; + KeyBoard('J', 1); + } /* if(maskData[3] & 0x04 && lastStateData[1] & 0x04) { KeyBoard(0x10,1); @@ -790,7 +748,7 @@ void MWDComm::CheckData() // sprawdzanie wejść cyfrowych i odpowiednie sterowa WriteDataBuff[6] &= ~(1 << 3); } -void MWDComm::KeyBoard(int key, bool s) // emulacja klawiatury +void TMWDComm::KeyBoard(int key, bool s) // emulacja klawiatury { INPUT ip; // Set up a generic keyboard event. diff --git a/Console/MWD.h b/Console/MWD.h index 5963c08b..ad35ee87 100644 --- a/Console/MWD.h +++ b/Console/MWD.h @@ -19,48 +19,53 @@ http://mozilla.org/MPL/2.0/. #define MWDH //--------------------------------------------------------------------------- +#define BYTETOWRITE 31 // ilość bajtów przesyłanych z MaSzyny +#define BYTETOREAD 16 // ilość bajtów przesyłanych do MaSzyny + typedef unsigned char BYTE; typedef unsigned long DWORD; -class MWDComm +class TMWDComm { - private: - int MWDTime; // - char lastStateData[6], maskData[6], maskSwitch[6], bitSwitch[6]; - int bocznik, nastawnik, kierunek; - char bnkMask; +private: + int MWDTime; // + char lastStateData[6], maskData[6], maskSwitch[6], bitSwitch[6]; + int bocznik, nastawnik, kierunek; + char bnkMask; - bool ReadData(); // BYTE *pReadDataBuff); - bool SendData(); // BYTE *pWriteDataBuff); - void CheckData(); // sprawdzanie zmian wejść i kontrola mazaków HASLERA - void KeyBoard(int key, bool s); + bool ReadData(); //BYTE *pReadDataBuff); + bool SendData(); //BYTE *pWriteDataBuff); + void CheckData(); //sprawdzanie zmian wejść i kontrola mazaków HASLERA + void KeyBoard(int key, bool s); - bool bRysik1H; - bool bRysik1L; - bool bRysik2H; - bool bRysik2L; + //void CheckData2(); - public: - bool Open(); // Otwarcie portu - bool Close(); // Zamknięcie portu - bool Run(); // Obsługa portu - bool GetMWDState(); // sprawdź czy port jest otwarty, 0 zamknięty, 1 otwarty + bool bRysik1H; + bool bRysik1L; + bool bRysik2H; + bool bRysik2L; - // zmienne do rysików HASLERA - bool bSHPstate; - bool bPrzejazdSHP; - bool bKabina1; - bool bKabina2; - bool bHamowanie; - bool bCzuwak; +public: + bool Open(); // Otwarcie portu + bool Close(); // Zamknięcie portu + bool Run(); // Obsługa portu + bool GetMWDState(); // sprawdź czy port jest otwarty, 0 zamknięty, 1 otwarty - float fAnalog[4]; // trzymanie danych z wejść analogowych + // zmienne do rysików HASLERA + bool bSHPstate; + bool bPrzejazdSHP; + bool bKabina1; + bool bKabina2; + bool bHamowanie; + bool bCzuwak; + + unsigned int uiAnalog[4]; // trzymanie danych z wejść analogowych - BYTE ReadDataBuff[17]; // bufory danych - BYTE WriteDataBuff[31]; + BYTE ReadDataBuff[BYTETOREAD]; //17]; // bufory danych + BYTE WriteDataBuff[BYTETOWRITE]; //31]; - MWDComm(); // konstruktor - ~MWDComm(); // destruktor + TMWDComm(); // konstruktor + ~TMWDComm(); // destruktor }; #endif diff --git a/Driver.cpp b/Driver.cpp index d75b747d..b76669bb 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -1171,6 +1171,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN iDrivigFlags |= moveSemaphorFound; //jeśli z przodu to dajemy falgę, że jest d_to_next_sem = Min0R(sSpeedTable[i].fDist, d_to_next_sem); } + if( sSpeedTable[ i ].fDist <= d_to_next_sem ) + { + VelSignalNext = sSpeedTable[ i ].fVelNext; + } } else if (sSpeedTable[i].iFlags & spRoadVel) { // to W6 diff --git a/DynObj.cpp b/DynObj.cpp index b1484ca3..77033806 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -3099,7 +3099,11 @@ bool TDynamicObject::Update(double dt, double dt1) dDOMoveLen = GetdMoveLen() + MoverParameters->ComputeMovement(dt, dt1, ts, tp, tmpTraction, l, r); // yB: zeby zawsze wrzucalo w jedna strone zakretu +/* + // this seemed to have opposite effect, if anything -- the sway direction would be affected + // by the 'direction' of the track, making the sway go sometimes inward, sometimes outward MoverParameters->AccN *= -ABuGetDirection(); +*/ // if (dDOMoveLen!=0.0) //Ra: nie może być, bo blokuje Event0 Move(dDOMoveLen); if (!bEnabled) // usuwane pojazdy nie mają toru @@ -3528,24 +3532,24 @@ bool TDynamicObject::Update(double dt, double dt1) // NBMX Obsluga drzwi, MC: zuniwersalnione if ((dDoorMoveL < MoverParameters->DoorMaxShiftL) && (MoverParameters->DoorLeftOpened)) { - rsDoorOpen.Play(vol, 0, MechInside, vPosition); + rsDoorOpen.Play(1, 0, MechInside, vPosition); dDoorMoveL += dt1 * 0.5 * MoverParameters->DoorOpenSpeed; } if ((dDoorMoveL > 0) && (!MoverParameters->DoorLeftOpened)) { - rsDoorClose.Play(vol, 0, MechInside, vPosition); + rsDoorClose.Play(1, 0, MechInside, vPosition); dDoorMoveL -= dt1 * MoverParameters->DoorCloseSpeed; if (dDoorMoveL < 0) dDoorMoveL = 0; } if ((dDoorMoveR < MoverParameters->DoorMaxShiftR) && (MoverParameters->DoorRightOpened)) { - rsDoorOpen.Play(vol, 0, MechInside, vPosition); + rsDoorOpen.Play(1, 0, MechInside, vPosition); dDoorMoveR += dt1 * 0.5 * MoverParameters->DoorOpenSpeed; } if ((dDoorMoveR > 0) && (!MoverParameters->DoorRightOpened)) { - rsDoorClose.Play(vol, 0, MechInside, vPosition); + rsDoorClose.Play(1, 0, MechInside, vPosition); dDoorMoveR -= dt1 * MoverParameters->DoorCloseSpeed; if (dDoorMoveR < 0) dDoorMoveR = 0; @@ -3704,7 +3708,7 @@ void TDynamicObject::Render() // zmienne renderme = false; // przeklejka - double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition); + double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition) / Global::ZoomFactor; // koniec przeklejki if (ObjSqrDist < 500) // jak jest blisko - do 70m modelrotate = 0.01; // mały kąt, żeby nie znikało @@ -3731,7 +3735,7 @@ void TDynamicObject::Render() { TSubModel::iInstance = (size_t)this; //żeby nie robić cudzych animacji // AnsiString asLoadName=""; - double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition); + double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition) / Global::ZoomFactor; ABuLittleUpdate(ObjSqrDist); // ustawianie zmiennych submodeli dla wspólnego modelu // Cone(vCoulpler[0],modelRot.z,0); @@ -5356,10 +5360,6 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, token, 50, GetPosition().x, GetPosition().y, GetPosition().z, true ); - sPantUp.AM = 50000; - sPantUp.AA = -1 * ( 105 - Random( 10 ) ) / 100; - sPantUp.FM = 1.0; - sPantUp.FA = 0.0; } else if( token == "pantographdown:" ) { @@ -5369,10 +5369,6 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, token, 50, GetPosition().x, GetPosition().y, GetPosition().z, true ); - sPantDown.AM = 50000; - sPantDown.AA = -1 * ( 105 - Random( 10 ) ) / 100; - sPantDown.FM = 1.0; - sPantDown.FA = 0.0; } else if( token == "compressor:" ) { @@ -5403,10 +5399,6 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, token, 50, GetPosition().x, GetPosition().y, GetPosition().z, true ); - rsDoorOpen.AM = 50000; - rsDoorOpen.AA = -1 * ( 105 - Random( 10 ) ) / 100; - rsDoorOpen.FM = 1.0; - rsDoorOpen.FA = 0.0; } else if( token == "doorclose:" ) { @@ -5416,10 +5408,6 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, token, 50, GetPosition().x, GetPosition().y, GetPosition().z, true ); - rsDoorClose.AM = 50000; - rsDoorClose.AA = -1 * ( 105 - Random( 10 ) ) / 100; - rsDoorClose.FM = 1.0; - rsDoorClose.FA = 0.0; } else if( token == "sand:" ) { diff --git a/EU07.cpp b/EU07.cpp index 4f20bff9..eb98cd0f 100644 --- a/EU07.cpp +++ b/EU07.cpp @@ -36,6 +36,8 @@ TWorld World; void window_resize_callback(GLFWwindow *window, int w, int h) { + Global::ScreenWidth = w; + Global::ScreenHeight = h; glViewport(0, 0, w, h); // Reset The Current Viewport glMatrixMode(GL_PROJECTION); // select the Projection Matrix glLoadIdentity(); // reset the Projection Matrix diff --git a/Gauge.cpp b/Gauge.cpp index 90e66f6b..aead0cca 100644 --- a/Gauge.cpp +++ b/Gauge.cpp @@ -175,14 +175,16 @@ void TGauge::Update() */ std::string n( "000000000" + std::to_string( static_cast( std::floor( fValue ) ) ) ); if( n.length() > 10 ) { n.erase( 0, n.length() - 10 ); } // also dumb but should work for now do - { // pętla po submodelach potomnych i obracanie ich o kąt zależy od - // cyfry w (fValue) - if (sm->pName.size()) - { // musi mieć niepustą nazwę - if (sm->pName[0] >= '0') - if (sm->pName[0] <= '9') - sm->SetRotate(float3(0, 1, 0), - -36.0 * (n['0' + 10 - sm->pName[0]] - '0')); + { // pętla po submodelach potomnych i obracanie ich o kąt zależy od cyfry w (fValue) + if( sm->pName.size() ) { + // musi mieć niepustą nazwę + if( ( sm->pName[ 0 ] >= '0' ) + && ( sm->pName[ 0 ] <= '9' ) ) { + + sm->SetRotate( + float3( 0, 1, 0 ), + -36.0 * ( n[ '0' + 9 - sm->pName[ 0 ] ] - '0' ) ); + } } sm = sm->NextGet(); } while (sm); diff --git a/Globals.cpp b/Globals.cpp index e52ccf86..7d0f9a49 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -48,7 +48,9 @@ bool Global::bOpenGL_1_5 = false; // czy są dostępne funkcje OpenGL 1.5 */ double Global::fLuminance = 1.0; // jasność światła do automatycznego zapalania int Global::iReCompile = 0; // zwiększany, gdy trzeba odświeżyć siatki -//HWND Global::hWnd = NULL; // uchwyt okna +int Global::ScreenWidth = 1; +int Global::ScreenHeight = 1; +float Global::ZoomFactor = 1.0f; GLFWwindow *Global::window; bool Global::shiftState; bool Global::ctrlState; @@ -132,6 +134,7 @@ bool Global::bAdjustScreenFreq = true; bool Global::bEnableTraction = true; bool Global::bLoadTraction = true; bool Global::bLiveTraction = true; +float Global::AnisotropicFiltering = 8.0f; // requested level of anisotropic filtering. TODO: move it to renderer object int Global::iDefaultFiltering = 9; // domyślne rozmywanie tekstur TGA bez alfa int Global::iBallastFiltering = 9; // domyślne rozmywanie tekstur podsypki int Global::iRailProFiltering = 5; // domyślne rozmywanie tekstur szyn @@ -193,17 +196,20 @@ int Global::iBpp = 32; // chyba już nie używa się kart, na których 16bpp co //randomizacja std::mt19937 Global::random_engine = std::mt19937(std::time(NULL)); // maciek001: konfiguracja wstępna portu COM -bool Global::bMWDdebugEnable = false; -bool Global::bMWDInputDataEnable = false; -unsigned int Global::iMWDBaudrate = 500000; -std::string Global::sMWDPortId = "COM1"; // nazwa portu z którego korzystamy - na razie nie działa -bool Global::bMWDBreakEnable = false; // zmienić na FALSE!!! jak już będzie działać wczytywanie z *.ini -double Global::fMWDAnalogCalib[4][3] = {{1023, 0, 1023},{1023, 0, 1023},{1023, 0, 1023},{1023, 0, 1023}}; // wartość max potencjometru, wartość min potencjometru, rozdzielczość (max. wartość jaka może być -1) -double Global::fMWDzg[2] = {0.9, 1023}; -double Global::fMWDpg[2] = {0.8, 1023}; -double Global::fMWDph[2] = {0.6, 1023}; -double Global::fMWDvolt[2] = {4000, 1023}; -double Global::fMWDamp[2] = {800, 1023}; +bool Global::bMWDmasterEnable = false; // główne włączenie portu! +bool Global::bMWDdebugEnable = false; // włącz dodawanie do logu +int Global::iMWDDebugMode = 0; // co ma wyświetlać w logu +std::string Global::sMWDPortId = "COM1"; // nazwa portu z którego korzystamy +unsigned long int Global::iMWDBaudrate = 9600; // prędkość transmisji danych +bool Global::bMWDInputEnable = false; // włącz wejścia +bool Global::bMWDBreakEnable = false; // włącz wejścia analogowe +double Global::fMWDAnalogInCalib[4][2] = { { 0, 1023 },{ 0, 1023 },{ 0, 1023 },{ 0, 1023 } }; // wartość max potencjometru, wartość min potencjometru, rozdzielczość (max. wartość jaka może być) +double Global::fMWDzg[2] = { 0.9, 1023 }; +double Global::fMWDpg[2] = { 0.8, 1023 }; +double Global::fMWDph[2] = { 0.6, 1023 }; +double Global::fMWDvolt[2] = { 4000, 1023 }; +double Global::fMWDamp[2] = { 800, 1023 }; +int Global::iMWDdivider = 5; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- @@ -464,7 +470,12 @@ void Global::ConfigParse(cParser &Parser) Parser.getTokens(1, false); Parser >> Global::iDynamicFiltering; } - else if (token == "usevbo") + else if( token == "anisotropicfiltering" ) { + + Parser.getTokens( 1, false ); + Parser >> Global::AnisotropicFiltering; + } + else if( token == "usevbo" ) { Parser.getTokens(); @@ -808,93 +819,100 @@ void Global::ConfigParse(cParser &Parser) >> Global::Background[2]; // b } // maciek001: ustawienia MWD - else if (token == "mwddebug") - { // czy włączyć obslugę hamulców - Parser.getTokens(); - Parser >> token; - bMWDdebugEnable = (token == "yes"); - } - else if (token == "comportname") - { - Parser.getTokens(); - Parser >> sMWDPortId; - if (bMWDdebugEnable) - WriteLog("PortName " + sMWDPortId); - } - else if (token == "mwdbaudrate") - { // pobierz prędkość transmisji danych - Parser.getTokens(1, false); - Parser >> iMWDBaudrate; - if (bMWDdebugEnable) - WriteLog("PortName " + to_string(iMWDBaudrate)); - } - else if (token == "mwdbreakenable") - { // czy włączyć obsługę hamulców - Parser.getTokens(); - Parser >> token; - bMWDBreakEnable = (token == "yes"); - } - else if (token == "mwdinputenable") - { - Parser.getTokens(); - Parser >> token; - bMWDInputDataEnable = (token == "yes"); - } - else if (token == "mwdbreak") // wartość max dla potencjometru hamulca zasadniczego - { - Parser.getTokens(); - Parser >> token; - int i = stol_def(token, -1); // numer wejďż˝cia - if ((i >= 0) && (i <= 3)) - { - Parser.getTokens(3, false); - Parser >> fMWDAnalogCalib[i][0] // max -> 2^16 -1 - >> fMWDAnalogCalib[i][1] // min -> 0 - >> - fMWDAnalogCalib[i][2]; // rozdzielczość -> 255 maksymalna możliwa wartość z ADC - if (bMWDdebugEnable) - WriteLog("Break settings " + to_string(i) + ": " + - to_string(fMWDAnalogCalib[i][0]) + " " + - to_string(fMWDAnalogCalib[i][1]) + " " + - to_string(fMWDAnalogCalib[i][2])); - } - } - else if (token == "mwdzbiornikglowny") - { - Parser.getTokens(2, false); - Parser >> fMWDzg[0] >> fMWDzg[1]; - if (bMWDdebugEnable) - WriteLog("AirTank settings: " + to_string(fMWDzg[0]) + " " + to_string(fMWDzg[1])); - } - else if (token == "mwdprzewodglowny") - { - Parser.getTokens(2, false); - Parser >> fMWDpg[0] >> fMWDpg[1]; - if (bMWDdebugEnable) - WriteLog("MainAirPipe settings: " + to_string(fMWDpg[0]) + " " + - to_string(fMWDpg[1])); - } - else if (token == "mwdcylinderhamulcowy") - { - Parser.getTokens(2, false); - Parser >> fMWDph[0] >> fMWDph[1]; - if (bMWDdebugEnable) - WriteLog("AirPipe settings: " + to_string(fMWDph[0]) + " " + to_string(fMWDph[1])); - } - else if (token == "mwdwoltomierzwn") - { - Parser.getTokens(2, false); - Parser >> fMWDvolt[0] >> fMWDvolt[1]; - if (bMWDdebugEnable) - WriteLog("Volt settings: " + to_string(fMWDvolt[0]) + " " + to_string(fMWDvolt[1])); - } - else if (token == "mwdamperomierzwn") - { - Parser.getTokens(2, false); - Parser >> fMWDamp[0] >> fMWDamp[1]; - if (bMWDdebugEnable) - WriteLog("Amp settings: " + to_string(fMWDamp[0]) + " " + to_string(fMWDamp[1])); - } + else if (token == "mwdmasterenable") { // główne włączenie maszyny! + Parser.getTokens(); + Parser >> token; + bMWDmasterEnable = (token == "yes"); + if (bMWDdebugEnable) WriteLog("SerialPort Master Enable"); + } + else if (token == "mwddebugenable") { // logowanie pracy + Parser.getTokens(); + Parser >> token; + bMWDdebugEnable = (token == "yes"); + if (bMWDdebugEnable) WriteLog("MWD Debug Mode On"); + } + else if (token == "mwddebugmode") { // co ma być debugowane? + Parser.getTokens(1, false); + Parser >> iMWDDebugMode; + if (bMWDdebugEnable) WriteLog("Debug Mode = " + to_string(iMWDDebugMode)); + } + else if (token == "mwdcomportname") { // nazwa portu COM + Parser.getTokens(); + Parser >> sMWDPortId; + if (bMWDdebugEnable) WriteLog("PortName " + sMWDPortId); + } + else if (token == "mwdbaudrate") { // prędkość transmisji danych + Parser.getTokens(1, false); + Parser >> iMWDBaudrate; + if (bMWDdebugEnable) WriteLog("Baud rate = " + to_string((int)(iMWDBaudrate / 1000)) + (" kbps")); + } + else if (token == "mwdinputenable") { // włącz wejścia + Parser.getTokens(); + Parser >> token; + bMWDInputEnable = (token == "yes"); + if (bMWDdebugEnable && bMWDInputEnable) WriteLog("MWD Input Enable"); + } + else if (token == "mwdbreakenable") { // włącz obsługę hamulców + Parser.getTokens(); + Parser >> token; + bMWDBreakEnable = (token == "yes"); + if (bMWDdebugEnable && bMWDBreakEnable) WriteLog("MWD Break Enable"); + } + else if (token == "mwdmainbreakconfig") { // ustawienia hamulca zespolonego + Parser.getTokens(2, false); + Parser >> fMWDAnalogInCalib[0][0] >> fMWDAnalogInCalib[0][1]; + if (bMWDdebugEnable) WriteLog("Main break settings: " + to_string(fMWDAnalogInCalib[0][0]) + (" ") + to_string(fMWDAnalogInCalib[0][1])); + } + else if (token == "mwdlocbreakconfig") { // ustawienia hamulca lokomotywy + Parser.getTokens(2, false); + Parser >> fMWDAnalogInCalib[1][0] >> fMWDAnalogInCalib[1][1]; + if (bMWDdebugEnable) WriteLog("Locomotive break settings: " + to_string(fMWDAnalogInCalib[1][0]) + (" ") + to_string(fMWDAnalogInCalib[1][1])); + } + else if (token == "mwdanalogin1config") { // ustawienia hamulca zespolonego + Parser.getTokens(2, false); + Parser >> fMWDAnalogInCalib[2][0] >> fMWDAnalogInCalib[2][1]; + if (bMWDdebugEnable) WriteLog("Analog input 1 settings: " + to_string(fMWDAnalogInCalib[2][0]) + (" ") + to_string(fMWDAnalogInCalib[2][1])); + } + else if (token == "mwdanalogin2config") { // ustawienia hamulca lokomotywy + Parser.getTokens(2, false); + Parser >> fMWDAnalogInCalib[3][0] >> fMWDAnalogInCalib[3][1]; + if (bMWDdebugEnable) WriteLog("Analog input 2 settings: " + to_string(fMWDAnalogInCalib[3][0]) + (" ") + to_string(fMWDAnalogInCalib[3][1])); + } + else if (token == "mwdmaintankpress") { // max ciśnienie w zbiorniku głownym i rozdzielczość + Parser.getTokens(2, false); + Parser >> fMWDzg[0] >> fMWDzg[1]; + if (bMWDdebugEnable) WriteLog("MainAirTank settings: " + to_string(fMWDzg[0]) + (" ") + to_string(fMWDzg[1])); + } + else if (token == "mwdmainpipepress") { // max ciśnienie w przewodzie głownym i rozdzielczość + Parser.getTokens(2, false); + Parser >> fMWDpg[0] >> fMWDpg[1]; + if (bMWDdebugEnable) WriteLog("MainAirPipe settings: " + to_string(fMWDpg[0]) + (" ") + to_string(fMWDpg[1])); + } + else if (token == "mwdbreakpress") { // max ciśnienie w hamulcach i rozdzielczość + Parser.getTokens(2, false); + Parser >> fMWDph[0] >> fMWDph[1]; + if (bMWDdebugEnable) WriteLog("AirPipe settings: " + to_string(fMWDph[0]) + (" ") + to_string(fMWDph[1])); + } + else if (token == "mwdhivoltmeter") { // max napięcie na woltomierzu WN + Parser.getTokens(2, false); + Parser >> fMWDvolt[0] >> fMWDvolt[1]; + if (bMWDdebugEnable) WriteLog("VoltMeter settings: " + to_string(fMWDvolt[0]) + (" ") + to_string(fMWDvolt[1])); + } + else if (token == "mwdhiampmeter") { + Parser.getTokens(2, false); + Parser >> fMWDamp[0] >> fMWDamp[1]; + if (bMWDdebugEnable) WriteLog("Amp settings: " + to_string(fMWDamp[0]) + (" ") + to_string(fMWDamp[1])); + } + else if (token == "mwddivider") { + Parser.getTokens(1, false); + Parser >> iMWDdivider; + if (iMWDdivider == 0) + { + WriteLog("Dzielnik nie może być równy ZERO! Ustawiam na 1!"); + iMWDdivider = 1; + } + if (bMWDdebugEnable) WriteLog("Divider = " + to_string(iMWDdivider)); + } } while ((token != "") && (token != "endconfig")); //(!Parser->EndOfFile) // na koniec trochę zależności if (!bLoadTraction) // wczytywanie drutów i słupów diff --git a/Globals.h b/Globals.h index 826a5f87..ca4cbac8 100644 --- a/Globals.h +++ b/Globals.h @@ -238,6 +238,7 @@ class Global static std::string asSky; static bool bnewAirCouplers; // Ra: nowe zmienne globalne + static float AnisotropicFiltering; // requested level of anisotropic filtering. TODO: move it to renderer object static int iDefaultFiltering; // domyślne rozmywanie tekstur TGA static int iBallastFiltering; // domyślne rozmywanie tekstury podsypki static int iRailProFiltering; // domyślne rozmywanie tekstury szyn @@ -252,6 +253,9 @@ class Global */ static double fLuminance; // jasność światła do automatycznego zapalania static int iMultiplayer; // blokada działania niektórych eventów na rzecz kominikacji + static int ScreenWidth; // current window dimensions. TODO: move it to renderer + static int ScreenHeight; + static float ZoomFactor; // determines current camera zoom level. TODO: move it to the renderer static GLFWwindow *window; static bool shiftState; //m7todo: brzydko static bool ctrlState; @@ -335,16 +339,19 @@ class Global static double CutValueToRange(double min, double value, double max); // maciek001: zmienne dla MWD - static bool bMWDdebugEnable; - static unsigned int iMWDBaudrate; - static std::string sMWDPortId; - static bool bMWDBreakEnable; - static bool bMWDInputDataEnable; - static double fMWDAnalogCalib[4][3]; - static double fMWDzg[2]; - static double fMWDpg[2]; - static double fMWDph[2]; - static double fMWDvolt[2]; - static double fMWDamp[2]; + static bool bMWDmasterEnable; // główne włączenie portu COM + static bool bMWDdebugEnable; // logowanie pracy + static int iMWDDebugMode; + static std::string sMWDPortId; // nazwa portu COM + static unsigned long int iMWDBaudrate; // prędkość transmisji + static bool bMWDInputEnable; // włącz wejścia + static bool bMWDBreakEnable; // włącz wejścia analogowe (hamulce) + static double fMWDAnalogInCalib[4][2]; // ustawienia kranów hamulca zespolonego i dodatkowego - min i max + static double fMWDzg[2]; // max wartość wskazywana i max wartość generowana (rozdzielczość) + static double fMWDpg[2]; + static double fMWDph[2]; + static double fMWDvolt[2]; + static double fMWDamp[2]; + static int iMWDdivider; }; //--------------------------------------------------------------------------- diff --git a/Ground.cpp b/Ground.cpp index 05d0c7b6f..3def8694 100644 --- a/Ground.cpp +++ b/Ground.cpp @@ -552,7 +552,7 @@ void TGroundNode::RenderDL() return smTerrain->RenderDL(); } // if (pTriGroup) if (pTriGroup!=this) return; //wyświetla go inny obiekt - double mgn = SquareMagnitude(pCenter - Global::pCameraPosition); + double mgn = SquareMagnitude(pCenter - Global::pCameraPosition) / Global::ZoomFactor; if ((mgn > fSquareRadius) || (mgn < fSquareMinRadius)) // McZapkie-070602: nie rysuj odleglych // obiektow ale sprawdzaj wyzwalacz // zdarzen @@ -611,7 +611,7 @@ void TGroundNode::RenderAlphaDL() // i jezeli tak to odpowiedni GL_GREATER w przeciwnym wypadku standardowy 0.04 // if (pTriGroup) if (pTriGroup!=this) return; //wyświetla go inny obiekt - double mgn = SquareMagnitude(pCenter - Global::pCameraPosition); + double mgn = SquareMagnitude(pCenter - Global::pCameraPosition) / Global::ZoomFactor; float r, g, b; if (mgn < fSquareMinRadius) return; diff --git a/Model3d.cpp b/Model3d.cpp index 1a9dff1c..f4259054 100644 --- a/Model3d.cpp +++ b/Model3d.cpp @@ -671,58 +671,58 @@ void TSubModel::DisplayLists() }; glEnd(); #endif - glEndList(); - } - } - else if (eType == TP_FREESPOTLIGHT) - { - uiDisplayList = glGenLists(1); - glNewList(uiDisplayList, GL_COMPILE); - TextureManager.Bind(0); - // if (eType==smt_FreeSpotLight) - // { - // if (iFarAttenDecay==0) - // glColor3f(Diffuse[0],Diffuse[1],Diffuse[2]); - // } - // 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); - glVertex3f(0, 0, 0); - glEnd(); - glEnable(GL_LIGHTING); - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); - glMaterialfv(GL_FRONT, GL_EMISSION, emm2); - glEndList(); - } - else if (eType == TP_STARS) - { // punkty świecące dookólnie - uiDisplayList = glGenLists(1); - glNewList(uiDisplayList, GL_COMPILE); - TextureManager.Bind(0); // tekstury nie ma - glColorMaterial(GL_FRONT, GL_EMISSION); - glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly - glBegin(GL_POINTS); - for (int i = 0; i < iNumVerts; i++) - { - glColor3f(Vertices[i].Normal.x, Vertices[i].Normal.y, Vertices[i].Normal.z); - // glVertex3dv(&Vertices[i].Point.x); - glVertex3fv(&Vertices[i].Point.x); - }; - glEnd(); - glEnable(GL_LIGHTING); - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); - glMaterialfv(GL_FRONT, GL_EMISSION, emm2); - glEndList(); - } - // SafeDeleteArray(Vertices); //przy VBO muszą zostać do załadowania całego - // modelu - if (Child) - Child->DisplayLists(); - if (Next) - Next->DisplayLists(); + glEndList(); + } + } + else if (eType == TP_FREESPOTLIGHT) + { + uiDisplayList = glGenLists(1); + glNewList(uiDisplayList, GL_COMPILE); + TextureManager.Bind(0); + // if (eType==smt_FreeSpotLight) + // { + // if (iFarAttenDecay==0) + // glColor3f(Diffuse[0],Diffuse[1],Diffuse[2]); + // } + // 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); + glVertex3f( 0.0f, 0.0f, -0.025f ); // shift point towards the viewer, to avoid z-fighting with the light polygons + glEnd(); + glEnable(GL_LIGHTING); + glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); + glMaterialfv(GL_FRONT, GL_EMISSION, emm2); + glEndList(); + } + else if (eType == TP_STARS) + { // punkty świecące dookólnie + uiDisplayList = glGenLists(1); + glNewList(uiDisplayList, GL_COMPILE); + TextureManager.Bind(0); // tekstury nie ma + glColorMaterial(GL_FRONT, GL_EMISSION); + glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly + glBegin(GL_POINTS); + for (int i = 0; i < iNumVerts; i++) + { + glColor3f(Vertices[i].Normal.x, Vertices[i].Normal.y, Vertices[i].Normal.z); + // glVertex3dv(&Vertices[i].Point.x); + glVertex3fv(&Vertices[i].Point.x); + }; + glEnd(); + glEnable(GL_LIGHTING); + glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); + glMaterialfv(GL_FRONT, GL_EMISSION, emm2); + glEndList(); + } + // SafeDeleteArray(Vertices); //przy VBO muszą zostać do załadowania całego + // modelu + if (Child) + Child->DisplayLists(); + if (Next) + Next->DisplayLists(); }; void TSubModel::InitialRotate(bool doit) diff --git a/Texture.cpp b/Texture.cpp index a0a7b8c1..1b688310 100644 --- a/Texture.cpp +++ b/Texture.cpp @@ -569,6 +569,11 @@ opengl_texture::set_filtering() { ::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); ::glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); + if( GLEW_EXT_texture_filter_anisotropic ) { + // anisotropic filtering + ::glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, Global::AnisotropicFiltering ); + } + bool sharpen{ false }; for( auto const &trait : traits ) { diff --git a/Train.cpp b/Train.cpp index 31827a57..3a249df7 100644 --- a/Train.cpp +++ b/Train.cpp @@ -24,6 +24,7 @@ http://mozilla.org/MPL/2.0/. #include "Console.h" #include "McZapkie\hamulce.h" #include "McZapkie\MOVER.h" +#include "Camera.h" //--------------------------------------------------------------------------- using namespace Timer; @@ -891,56 +892,56 @@ if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || if (false == (mvOccupied->LightsPosNo > 0)) { if ((Global::ctrlState) && - (ggRearLeftLightButton.SubModel)) // hunter-230112 - z controlem zapala z tylu + (ggRearRightLightButton.SubModel)) // hunter-230112 - z controlem zapala z tylu. + // 17.02.17 changed rear to opposite side, so the same key actually controls both lights on the left side, from the driver's point of view + // TODO: do it a more elegant way. preferably along with the rest of the controlling code { - //------------------------------ if (mvOccupied->ActiveCab == 1) { // kabina 1 - if (((DynamicObject->iLights[1]) & 3) == 0) + if (((DynamicObject->iLights[1]) & 48) == 0) { - DynamicObject->iLights[1] |= 1; + DynamicObject->iLights[1] |= 16; dsbSwitch->SetVolume(DSBVOLUME_MAX); dsbSwitch->Play(0, 0, 0); - ggRearLeftLightButton.PutValue(1); + ggRearRightLightButton.PutValue(1); } - if (((DynamicObject->iLights[1]) & 3) == 2) + if (((DynamicObject->iLights[1]) & 48) == 32) { - DynamicObject->iLights[1] &= (255 - 2); + DynamicObject->iLights[1] &= (255 - 32); dsbSwitch->SetVolume(DSBVOLUME_MAX); dsbSwitch->Play(0, 0, 0); - if (ggRearLeftEndLightButton.SubModel) + if (ggRearRightEndLightButton.SubModel) { - ggRearLeftEndLightButton.PutValue(0); - ggRearLeftLightButton.PutValue(0); + ggRearRightEndLightButton.PutValue(0); + ggRearRightLightButton.PutValue(0); } else - ggRearLeftLightButton.PutValue(0); + ggRearRightLightButton.PutValue(0); } } else { // kabina -1 - if (((DynamicObject->iLights[0]) & 3) == 0) + if (((DynamicObject->iLights[0]) & 48) == 0) { - DynamicObject->iLights[0] |= 1; + DynamicObject->iLights[0] |= 16; dsbSwitch->SetVolume(DSBVOLUME_MAX); dsbSwitch->Play(0, 0, 0); - ggRearLeftLightButton.PutValue(1); + ggRearRightLightButton.PutValue(1); } - if (((DynamicObject->iLights[0]) & 3) == 2) + if (((DynamicObject->iLights[0]) & 48) == 32) { - DynamicObject->iLights[0] &= (255 - 2); + DynamicObject->iLights[0] &= (255 - 32); dsbSwitch->SetVolume(DSBVOLUME_MAX); dsbSwitch->Play(0, 0, 0); - if (ggRearLeftEndLightButton.SubModel) + if (ggRearRightEndLightButton.SubModel) { - ggRearLeftEndLightButton.PutValue(0); - ggRearLeftLightButton.PutValue(0); + ggRearRightEndLightButton.PutValue(0); + ggRearRightLightButton.PutValue(0); } else - ggRearLeftLightButton.PutValue(0); + ggRearRightLightButton.PutValue(0); } } - //---------------------- } else { @@ -1066,53 +1067,46 @@ if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || if (false == (mvOccupied->LightsPosNo > 0)) { if ((Global::ctrlState) && - (ggRearRightLightButton.SubModel)) // hunter-230112 - z controlem zapala z tylu + (ggRearLeftLightButton.SubModel)) // hunter-230112 - z controlem zapala z tylu + // 17.02.17 changed rear to opposite side, so the same key actually controls both lights on the left side, from the driver's point of view + // TODO: do it a more elegant way. preferably along with the rest of the controlling code { - //------------------------------ - if (mvOccupied->ActiveCab == 1) - { // kabina 1 - if (((DynamicObject->iLights[1]) & 48) == 0) - { - DynamicObject->iLights[1] |= 16; - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - ggRearRightLightButton.PutValue(1); + if( mvOccupied->ActiveCab == 1 ) { // kabina 1 + if( ( ( DynamicObject->iLights[ 1 ] ) & 3 ) == 0 ) { + DynamicObject->iLights[ 1 ] |= 1; + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + ggRearLeftLightButton.PutValue( 1 ); } - if (((DynamicObject->iLights[1]) & 48) == 32) - { - DynamicObject->iLights[1] &= (255 - 32); - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - if (ggRearRightEndLightButton.SubModel) - { - ggRearRightEndLightButton.PutValue(0); - ggRearRightLightButton.PutValue(0); + if( ( ( DynamicObject->iLights[ 1 ] ) & 3 ) == 2 ) { + DynamicObject->iLights[ 1 ] &= ( 255 - 2 ); + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + if( ggRearLeftEndLightButton.SubModel ) { + ggRearLeftEndLightButton.PutValue( 0 ); + ggRearLeftLightButton.PutValue( 0 ); } else - ggRearRightLightButton.PutValue(0); + ggRearLeftLightButton.PutValue( 0 ); } } - else - { // kabina -1 - if (((DynamicObject->iLights[0]) & 48) == 0) - { - DynamicObject->iLights[0] |= 16; - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - ggRearRightLightButton.PutValue(1); + else { // kabina -1 + if( ( ( DynamicObject->iLights[ 0 ] ) & 3 ) == 0 ) { + DynamicObject->iLights[ 0 ] |= 1; + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + ggRearLeftLightButton.PutValue( 1 ); } - if (((DynamicObject->iLights[0]) & 48) == 32) - { - DynamicObject->iLights[0] &= (255 - 32); - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - if (ggRearRightEndLightButton.SubModel) - { - ggRearRightEndLightButton.PutValue(0); - ggRearRightLightButton.PutValue(0); + if( ( ( DynamicObject->iLights[ 0 ] ) & 3 ) == 2 ) { + DynamicObject->iLights[ 0 ] &= ( 255 - 2 ); + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + if( ggRearLeftEndLightButton.SubModel ) { + ggRearLeftEndLightButton.PutValue( 0 ); + ggRearLeftLightButton.PutValue( 0 ); } else - ggRearRightLightButton.PutValue(0); + ggRearLeftLightButton.PutValue( 0 ); } } } //------------------------------ @@ -2097,52 +2091,46 @@ if { if ((Global::ctrlState) && (ggRearLeftLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu + // 17.02.17 changed rear to opposite side, so the same key actually controls both lights on the left side, from the driver's point of view + // TODO: do it a more elegant way. preferably along with the rest of the controlling code { //------------------------------ - if (mvOccupied->ActiveCab == 1) - { // kabina 1 - if (((DynamicObject->iLights[1]) & 3) == 0) - { - DynamicObject->iLights[1] |= 2; - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - if (ggRearLeftEndLightButton.SubModel) - { - ggRearLeftEndLightButton.PutValue(1); - ggRearLeftLightButton.PutValue(0); + if( mvOccupied->ActiveCab == 1 ) { // kabina 1 (od strony 0) + if( ( ( DynamicObject->iLights[ 1 ] ) & 48 ) == 0 ) { + DynamicObject->iLights[ 1 ] |= 32; + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + if( ggRearRightEndLightButton.SubModel ) { + ggRearRightEndLightButton.PutValue( 1 ); + ggRearRightLightButton.PutValue( 0 ); } else - ggRearLeftLightButton.PutValue(-1); + ggRearRightLightButton.PutValue( -1 ); } - if (((DynamicObject->iLights[1]) & 3) == 1) - { - DynamicObject->iLights[1] &= (255 - 1); - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - ggRearLeftLightButton.PutValue(0); + if( ( ( DynamicObject->iLights[ 1 ] ) & 48 ) == 16 ) { + DynamicObject->iLights[ 1 ] &= ( 255 - 16 ); + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + ggRearRightLightButton.PutValue( 0 ); } } - else - { // kabina -1 - if (((DynamicObject->iLights[0]) & 3) == 0) - { - DynamicObject->iLights[0] |= 2; - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - if (ggRearLeftEndLightButton.SubModel) - { - ggRearLeftEndLightButton.PutValue(1); - ggRearLeftLightButton.PutValue(0); + else { // kabina -1 + if( ( ( DynamicObject->iLights[ 0 ] ) & 48 ) == 0 ) { + DynamicObject->iLights[ 0 ] |= 32; + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + if( ggRearRightEndLightButton.SubModel ) { + ggRearRightEndLightButton.PutValue( 1 ); + ggRearRightLightButton.PutValue( 0 ); } else - ggRearLeftLightButton.PutValue(-1); + ggRearRightLightButton.PutValue( -1 ); } - if (((DynamicObject->iLights[1]) & 3) == 1) - { - DynamicObject->iLights[1] &= (255 - 1); - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - ggLeftLightButton.PutValue(0); + if( ( ( DynamicObject->iLights[ 0 ] ) & 48 ) == 16 ) { + DynamicObject->iLights[ 0 ] &= ( 255 - 16 ); + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + ggRearRightLightButton.PutValue( 0 ); } } } //------------------------------ @@ -2270,52 +2258,46 @@ if { if ((Global::ctrlState) && (ggRearRightLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu + // 17.02.17 changed rear to opposite side, so the same key actually controls both lights on the left side, from the driver's point of view + // TODO: do it a more elegant way. preferably along with the rest of the controlling code { //------------------------------ - if (mvOccupied->ActiveCab == 1) - { // kabina 1 (od strony 0) - if (((DynamicObject->iLights[1]) & 48) == 0) - { - DynamicObject->iLights[1] |= 32; - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - if (ggRearRightEndLightButton.SubModel) - { - ggRearRightEndLightButton.PutValue(1); - ggRearRightLightButton.PutValue(0); + if( mvOccupied->ActiveCab == 1 ) { // kabina 1 + if( ( ( DynamicObject->iLights[ 1 ] ) & 3 ) == 0 ) { + DynamicObject->iLights[ 1 ] |= 2; + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + if( ggRearLeftEndLightButton.SubModel ) { + ggRearLeftEndLightButton.PutValue( 1 ); + ggRearLeftLightButton.PutValue( 0 ); } else - ggRearRightLightButton.PutValue(-1); + ggRearLeftLightButton.PutValue( -1 ); } - if (((DynamicObject->iLights[1]) & 48) == 16) - { - DynamicObject->iLights[1] &= (255 - 16); - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - ggRearRightLightButton.PutValue(0); + if( ( ( DynamicObject->iLights[ 1 ] ) & 3 ) == 1 ) { + DynamicObject->iLights[ 1 ] &= ( 255 - 1 ); + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + ggRearLeftLightButton.PutValue( 0 ); } } - else - { // kabina -1 - if (((DynamicObject->iLights[0]) & 48) == 0) - { - DynamicObject->iLights[0] |= 32; - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - if (ggRearRightEndLightButton.SubModel) - { - ggRearRightEndLightButton.PutValue(1); - ggRearRightLightButton.PutValue(0); + else { // kabina -1 + if( ( ( DynamicObject->iLights[ 0 ] ) & 3 ) == 0 ) { + DynamicObject->iLights[ 0 ] |= 2; + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + if( ggRearLeftEndLightButton.SubModel ) { + ggRearLeftEndLightButton.PutValue( 1 ); + ggRearLeftLightButton.PutValue( 0 ); } else - ggRearRightLightButton.PutValue(-1); + ggRearLeftLightButton.PutValue( -1 ); } - if (((DynamicObject->iLights[0]) & 48) == 16) - { - DynamicObject->iLights[0] &= (255 - 16); - dsbSwitch->SetVolume(DSBVOLUME_MAX); - dsbSwitch->Play(0, 0, 0); - ggRearRightLightButton.PutValue(0); + if( ( ( DynamicObject->iLights[ 1 ] ) & 3 ) == 1 ) { + DynamicObject->iLights[ 1 ] &= ( 255 - 1 ); + dsbSwitch->SetVolume( DSBVOLUME_MAX ); + dsbSwitch->Play( 0, 0, 0 ); + ggLeftLightButton.PutValue( 0 ); } } } //------------------------------ @@ -2400,17 +2382,25 @@ if { // McZapkie: poruszanie sie po kabinie, w updatemechpos zawarte sa wiezy - // double dt=Timer::GetDeltaTime(); - if (mvOccupied->ActiveCab < 0) - fMechCroach = -0.5; - else - fMechCroach = 0.5; - // if (!Global::shiftState<0) // bez shifta - if (!Global::ctrlState) // gdy [Ctrl] zwolniony (dodatkowe widoki) + auto step = 60.0f * Timer::GetDeltaTime(); + auto const camerayaw = Global::pCamera->Yaw; + Math3D::vector3 direction( 0.0f, 0.0f, step ); + direction.RotateY( camerayaw ); + Math3D::vector3 right( -step, 0.0f, 0.0f ); + right.RotateY( camerayaw ); + // auto right = Math3D::CrossProduct( direction, Math3D::vector3( 0.0f, 1.0f, 0.0f ) ); + + if( mvOccupied->ActiveCab < 0 ) { + + direction *= -1.0f; + right *= -1.0f; + } + // if (!GetAsyncKeyState(VK_SHIFT)<0) // bez shifta + if (!(Global::ctrlState)) // gdy [Ctrl] zwolniony (dodatkowe widoki) { if (cKey == Global::Keys[k_MechLeft]) { - vMechMovement.x += fMechCroach; + vMechMovement -= right; if (DynamicObject->Mechanik) if (!FreeFlyModeFlag) //żeby nie mieszać obserwując z zewnątrz DynamicObject->Mechanik->RouteSwitch( @@ -2418,7 +2408,7 @@ if } else if (cKey == Global::Keys[k_MechRight]) { - vMechMovement.x -= fMechCroach; + vMechMovement += right; if (DynamicObject->Mechanik) if (!FreeFlyModeFlag) //żeby nie mieszać obserwując z zewnątrz DynamicObject->Mechanik->RouteSwitch( @@ -2426,7 +2416,7 @@ if } else if (cKey == Global::Keys[k_MechBackward]) { - vMechMovement.z -= fMechCroach; + vMechMovement -= direction; // if (DynamicObject->Mechanik) // if (!FreeFlyModeFlag) //żeby nie mieszać obserwując z zewnątrz // DynamicObject->Mechanik->RouteSwitch(0); //na skrzyżowaniu stanie @@ -2434,16 +2424,16 @@ if } else if (cKey == Global::Keys[k_MechForward]) { - vMechMovement.z += fMechCroach; + vMechMovement += direction; if (DynamicObject->Mechanik) if (!FreeFlyModeFlag) //żeby nie mieszać obserwując z zewnątrz DynamicObject->Mechanik->RouteSwitch( 3); // na skrzyżowaniu pojedzie prosto } else if (cKey == Global::Keys[k_MechUp]) - pMechOffset.y += 0.2; // McZapkie-120302 - wstawanie + pMechOffset.y += 0.25; // McZapkie-120302 - wstawanie else if (cKey == Global::Keys[k_MechDown]) - pMechOffset.y -= 0.2; // McZapkie-120302 - siadanie + pMechOffset.y -= 0.25; // McZapkie-120302 - siadanie } } @@ -3756,7 +3746,7 @@ bool TTrain::Update( double const Deltatime ) { if (DynamicObject->Mechanik ? (DynamicObject->Mechanik->AIControllFlag ? false : - Global::iFeedbackMode == 4 ) : + (Global::iFeedbackMode == 4 || (Global::bMWDmasterEnable && Global::bMWDBreakEnable))) : false) // nie blokujemy AI { // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba // Firleju: dlatego kasujemy i zastepujemy funkcją w Console @@ -3780,7 +3770,7 @@ bool TTrain::Update( double const Deltatime ) if (ggLocalBrake.SubModel) { if (DynamicObject->Mechanik ? - (DynamicObject->Mechanik->AIControllFlag ? false : Global::iFeedbackMode == 4) : + (DynamicObject->Mechanik->AIControllFlag ? false : (Global::iFeedbackMode == 4 || Global::bMWDmasterEnable)) : false) // nie blokujemy AI { // Ra: nie najlepsze miejsce, ale na początek gdzieś to dać trzeba // Firleju: dlatego kasujemy i zastepujemy funkcją w Console @@ -5990,6 +5980,10 @@ bool TTrain::initialize_button(cParser &Parser, std::string const &Label, int co { btLampkaHamienie.Load(Parser, DynamicObject->mdKabina); } + else if( Label == "i-dynamicbrake:" ) { + + btLampkaED.Load( Parser, DynamicObject->mdKabina ); + } else if (Label == "i-braking-ezt:") { btLampkaHamowanie1zes.Load(Parser, DynamicObject->mdKabina); @@ -6330,6 +6324,10 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con // hunter-091012: przyciemnienie swiatla w kabinie ggCabLightDimButton.Load(Parser, DynamicObject->mdKabina); } + else if( Label == "battery_sw:" ) { + + ggBatteryButton.Load( Parser, DynamicObject->mdKabina ); + } // ABu 090305: uniwersalne przyciski lub inne rzeczy else if (Label == "universal1:") { diff --git a/World.cpp b/World.cpp index 2d83718f..9d85ab32 100644 --- a/World.cpp +++ b/World.cpp @@ -335,8 +335,10 @@ bool TWorld::Init(GLFWwindow *w) WriteLog("glLineWidth(1.0f);"); glLineWidth(1.0f); // glLineWidth(2.0f); - WriteLog("glPointSize(2.0f);"); - glPointSize(2.0f); + WriteLog("glPointSize(3.0f);"); + glPointSize(3.0f); +// glHint( GL_POINT_SMOOTH_HINT, GL_NICEST ); // Really Nice Perspective Calculations +// glEnable( GL_POINT_SMOOTH ); // ----------- LIGHTING SETUP ----------- // Light values and coordinates @@ -462,21 +464,21 @@ bool TWorld::Init(GLFWwindow *w) glBegin(GL_QUADS); // Drawing using triangles glTexCoord2f(0.0f, 0.0f); - glVertex3f(-0.28f, -0.22f, 0.0f); // bottom left of the texture and quad + glVertex3f(-1.0f, -1.0f, 0.0f); // bottom left of the texture and quad glTexCoord2f(1.0f, 0.0f); - glVertex3f(0.28f, -0.22f, 0.0f); // bottom right of the texture and quad + glVertex3f(1.0f, -1.0f, 0.0f); // bottom right of the texture and quad glTexCoord2f(1.0f, 1.0f); - glVertex3f(0.28f, 0.22f, 0.0f); // top right of the texture and quad + glVertex3f(1.0f, 1.0f, 0.0f); // top right of the texture and quad glTexCoord2f(0.0f, 1.0f); - glVertex3f(-0.28f, 0.22f, 0.0f); // top left of the texture and quad + glVertex3f(-1.0f, 1.0f, 0.0f); // top left of the texture and quad glEnd(); //~logo; Ra: to jest bez sensu zapis glColor3f(0.0f, 0.0f, 100.0f); if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.09f); + glRasterPos2f(-0.85f, -0.25f); glPrint("Uruchamianie / Initializing..."); - glRasterPos2f(-0.25f, -0.10f); + glRasterPos2f(-0.85f, -0.30f); glPrint("Dzwiek / Sound..."); } @@ -492,7 +494,7 @@ bool TWorld::Init(GLFWwindow *w) WriteLog("Sound Init OK"); if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.11f); + glRasterPos2f(-0.25f, -0.30f); glPrint("OK."); } @@ -502,7 +504,7 @@ bool TWorld::Init(GLFWwindow *w) WriteLog("Textures init"); if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.12f); + glRasterPos2f(-0.85f, -0.35f); glPrint("Tekstury / Textures..."); } glfwSwapBuffers(window); @@ -510,7 +512,7 @@ bool TWorld::Init(GLFWwindow *w) WriteLog("Textures init OK"); if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.13f); + glRasterPos2f(-0.25f, -0.35f); glPrint("OK."); } glfwSwapBuffers(window); @@ -518,7 +520,7 @@ bool TWorld::Init(GLFWwindow *w) WriteLog("Models init"); if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.14f); + glRasterPos2f(-0.85f, -0.40f); glPrint("Modele / Models..."); } glfwSwapBuffers(window); @@ -528,7 +530,7 @@ bool TWorld::Init(GLFWwindow *w) WriteLog("Models init OK"); if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.15f); + glRasterPos2f(-0.25f, -0.40f); glPrint("OK."); } glfwSwapBuffers(window); @@ -536,7 +538,7 @@ bool TWorld::Init(GLFWwindow *w) WriteLog("Ground init"); if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.16f); + glRasterPos2f(-0.85f, -0.45f); glPrint("Sceneria / Scenery (please wait)..."); } glfwSwapBuffers(window); @@ -547,7 +549,7 @@ bool TWorld::Init(GLFWwindow *w) WriteLog("Ground init OK"); if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.17f); + glRasterPos2f(-0.25f, -0.45f); glPrint("OK."); } glfwSwapBuffers(window); @@ -564,7 +566,7 @@ bool TWorld::Init(GLFWwindow *w) char buff[255] = "Player train init: "; if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.18f); + glRasterPos2f(-0.85f, -0.50f); glPrint("Przygotowanie kabiny do sterowania..."); } glfwSwapBuffers(window); @@ -585,7 +587,7 @@ bool TWorld::Init(GLFWwindow *w) WriteLog("Player train init OK"); if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.19f); + glRasterPos2f(-0.25f, -0.50f); glPrint("OK."); } FollowView(); @@ -597,7 +599,7 @@ bool TWorld::Init(GLFWwindow *w) FreeFlyModeFlag = true; // Ra: automatycznie włączone latanie if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.20f); + glRasterPos2f(-0.85f, -0.50f); glPrint("Blad inicjalizacji sterowanego pojazdu!"); } glfwSwapBuffers(window); @@ -613,7 +615,7 @@ bool TWorld::Init(GLFWwindow *w) Error("Player train not exist!"); if (Global::detonatoryOK) { - glRasterPos2f(-0.25f, -0.20f); + glRasterPos2f(-0.85f, -0.55f); glPrint("Wybrany pojazd nie istnieje w scenerii!"); } } @@ -918,7 +920,7 @@ void TWorld::OnKeyUp(int cKey) void TWorld::OnMouseMove(double x, double y) { // McZapkie:060503-definicja obracania myszy - Camera.OnCursorMove(x * Global::fMouseXScale, -y * Global::fMouseYScale); + Camera.OnCursorMove(x * Global::fMouseXScale / Global::ZoomFactor, -y * Global::fMouseYScale / Global::ZoomFactor); } void TWorld::InOutKey() @@ -1204,6 +1206,7 @@ void TWorld::Update_Camera( double const Deltatime ) { // Console::Update(); //tu jest zależne od FPS, co nie jest korzystne + if( glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS ) { Camera.Reset(); // likwidacja obrotów - patrzy horyzontalnie na południe // if (!FreeFlyModeFlag) //jeśli wewnątrz - patrzymy do tyłu @@ -1230,8 +1233,19 @@ TWorld::Update_Camera( double const Deltatime ) if( FreeFlyModeFlag ) Camera.RaLook(); // jednorazowe przestawienie kamery } - else if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS ) //||Console::Pressed(GLFW_KEY_F4)) + else if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS) { //||Console::Pressed(VK_F4)) FollowView( false ); // bez wyciszania dźwięków + } + else if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS) { + // middle mouse button controls zoom. + Global::ZoomFactor = std::min( 4.5f, Global::ZoomFactor + 15.0f * static_cast(Deltatime) ); + } + else if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_MIDDLE) != GLFW_PRESS) { + // reset zoom level if the button is no longer held down. + // NOTE: yes, this is terrible way to go about it. it'll do for now. + Global::ZoomFactor = std::max( 1.0f, Global::ZoomFactor - 15.0f * static_cast( Deltatime ) ); + } + /* else if( Global::iTextMode == -1 ) { // tu mozna dodac dopisywanie do logu przebiegu lokomotywy WriteLog( "Number of textures used: " + std::to_string( Global::iTextures ) ); @@ -1432,6 +1446,12 @@ bool TWorld::Render() // glColor3b(255, 0, 255); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDepthFunc( GL_LEQUAL ); + + glMatrixMode( GL_PROJECTION ); // select the Projection Matrix + glLoadIdentity(); // reset the Projection Matrix + // calculate the aspect ratio of the window + gluPerspective( 45.0f / Global::ZoomFactor, (GLdouble)Global::ScreenWidth / (GLdouble)Global::ScreenHeight, 0.1f * Global::ZoomFactor, 2500.0f * Global::ZoomFactor ); + glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glLoadIdentity(); Camera.SetMatrix(); // ustawienie macierzy kamery względem początku scenerii @@ -1724,6 +1744,14 @@ TWorld::Render_Cab() { void TWorld::Render_UI() { + // set the UI mode projection. TODO: rework it all into somethinig more elegant... eventually + glMatrixMode( GL_PROJECTION ); // select the Projection Matrix + glLoadIdentity(); // reset the Projection Matrix + // calculate the aspect ratio of the window + gluPerspective( 45.0f, (GLdouble)Global::ScreenWidth / (GLdouble)Global::ScreenHeight, 0.2f, 2500.0f ); + glMatrixMode( GL_MODELVIEW ); // Select The Modelview Matrix + glLoadIdentity(); + if( DebugModeFlag && !Global::iTextMode ) { OutText1 = " FPS: "; OutText1 += to_string( Timer::GetFPS(), 2 );