diff --git a/AdvSound.cpp b/AdvSound.cpp index 6872b5e7..f9319fda 100644 --- a/AdvSound.cpp +++ b/AdvSound.cpp @@ -7,14 +7,10 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - -#include "Timer.h" +#include "stdafx.h" #include "AdvSound.h" +#include "Timer.h" //--------------------------------------------------------------------------- -#pragma package(smart_init) TAdvancedSound::TAdvancedSound() { @@ -36,8 +32,8 @@ void TAdvancedSound::Free() { } -void TAdvancedSound::Init(char *NameOn, char *Name, char *NameOff, double DistanceAttenuation, - vector3 pPosition) +void TAdvancedSound::Init( std::string const &NameOn, std::string const &Name, std::string const &NameOff, double DistanceAttenuation, + vector3 const &pPosition) { SoundStart.Init(NameOn, DistanceAttenuation, pPosition.x, pPosition.y, pPosition.z, true); SoundCommencing.Init(Name, DistanceAttenuation, pPosition.x, pPosition.y, pPosition.z, true); @@ -60,13 +56,17 @@ void TAdvancedSound::Init(char *NameOn, char *Name, char *NameOff, double Distan SoundShut.FA = 0.0; } -void TAdvancedSound::Load(TQueryParserComp *Parser, vector3 pPosition) +void TAdvancedSound::Load(cParser &Parser, vector3 const &pPosition) { - AnsiString NameOn = Parser->GetNextSymbol().LowerCase(); - AnsiString Name = Parser->GetNextSymbol().LowerCase(); - AnsiString NameOff = Parser->GetNextSymbol().LowerCase(); - double DistanceAttenuation = Parser->GetNextSymbol().ToDouble(); - Init(NameOn.c_str(), Name.c_str(), NameOff.c_str(), DistanceAttenuation, pPosition); + std::string nameon, name, nameoff; + double attenuation; + Parser.getTokens( 4 ); + Parser + >> nameon + >> name + >> nameoff + >> attenuation; + Init( nameon, name, nameoff, attenuation, pPosition ); } void TAdvancedSound::TurnOn(bool ListenerInside, vector3 NewPosition) diff --git a/AdvSound.h b/AdvSound.h index 2eb97358..d0a2b03a 100644 --- a/AdvSound.h +++ b/AdvSound.h @@ -12,7 +12,7 @@ http://mozilla.org/MPL/2.0/. #include "Sound.h" #include "RealSound.h" -#include "QueryParserComp.hpp" +#include "parser.h" typedef enum { @@ -37,9 +37,8 @@ class TAdvancedSound public: TAdvancedSound(); ~TAdvancedSound(); - void Init(char *NameOn, char *Name, char *NameOff, double DistanceAttenuation, - vector3 pPosition); - void Load(TQueryParserComp *Parser, vector3 pPosition); + void Init( std::string const &NameOn, std::string const &Name, std::string const &NameOff, double DistanceAttenuation, vector3 const &pPosition); + void Load(cParser &Parser, vector3 const &pPosition); void TurnOn(bool ListenerInside, vector3 NewPosition); void TurnOff(bool ListenerInside, vector3 NewPosition); void Free(); diff --git a/AirCoupler.cpp b/AirCoupler.cpp index 91a6c592..1226c6f3 100644 --- a/AirCoupler.cpp +++ b/AirCoupler.cpp @@ -7,12 +7,8 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "AirCoupler.h" -#include "Timer.h" TAirCoupler::TAirCoupler() { @@ -42,20 +38,22 @@ void TAirCoupler::Clear() bxOn = false; } -void TAirCoupler::Init(AnsiString asName, TModel3d *pModel) +void TAirCoupler::Init(std::string const &asName, TModel3d *pModel) { // wyszukanie submodeli if (!pModel) return; // nie ma w czym szukać - pModelOn = pModel->GetFromName(AnsiString(asName + "_on").c_str()); // połączony na wprost - pModelOff = pModel->GetFromName(AnsiString(asName + "_off").c_str()); // odwieszony - pModelxOn = pModel->GetFromName(AnsiString(asName + "_xon").c_str()); // połączony na skos + pModelOn = pModel->GetFromName( (asName + "_on").c_str() ); // połączony na wprost + pModelOff = pModel->GetFromName( (asName + "_off").c_str() ); // odwieszony + pModelxOn = pModel->GetFromName( (asName + "_xon").c_str() ); // połączony na skos } -void TAirCoupler::Load(TQueryParserComp *Parser, TModel3d *pModel) +void TAirCoupler::Load(cParser *Parser, TModel3d *pModel) { - AnsiString str = Parser->GetNextSymbol().LowerCase(); - if (pModel) - Init(str, pModel); + std::string name = Parser->getToken(); + if( pModel ) { + + Init( name, pModel ); + } else { pModelOn = NULL; @@ -78,5 +76,3 @@ void TAirCoupler::Update() } //--------------------------------------------------------------------------- - -#pragma package(smart_init) diff --git a/AirCoupler.h b/AirCoupler.h index 12131049..8cdebaea 100644 --- a/AirCoupler.h +++ b/AirCoupler.h @@ -7,11 +7,10 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef AirCouplerH -#define AirCouplerH +#pragma once #include "Model3d.h" -#include "QueryParserComp.hpp" +#include "parser.h" class TAirCoupler { @@ -46,10 +45,9 @@ class TAirCoupler }; // inline bool Active() { if ((pModelOn)||(pModelOff)) return true; return false;}; int GetStatus(); - void Init(AnsiString asName, TModel3d *pModel); - void Load(TQueryParserComp *Parser, TModel3d *pModel); + void Init(std::string const &asName, TModel3d *pModel); + void Load(cParser *Parser, TModel3d *pModel); // bool Render(); }; //--------------------------------------------------------------------------- -#endif diff --git a/AnimModel.cpp b/AnimModel.cpp index 878d298e..2de57116 100644 --- a/AnimModel.cpp +++ b/AnimModel.cpp @@ -12,20 +12,19 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "AnimModel.h" + +#include "Globals.h" +#include "Logs.h" #include "usefull.h" +#include "McZapkie/mctools.h" #include "Timer.h" #include "MdlMngr.h" // McZapkie: #include "Texture.h" -#include "Globals.h" -//--------------------------------------------------------------------------- -#pragma package(smart_init) //--------------------------------------------------------------------------- +TAnimContainer *TAnimModel::acAnimList = NULL; TAnimAdvanced::TAnimAdvanced(){}; @@ -437,18 +436,17 @@ TAnimModel::~TAnimModel() bool TAnimModel::Init(TModel3d *pNewModel) { - fBlinkTimer = double(random(1000 * fOffTime)) / (1000 * fOffTime); + fBlinkTimer = double(Random(1000 * fOffTime)) / (1000 * fOffTime); ; pModel = pNewModel; return (pModel != NULL); } -bool TAnimModel::Init(AnsiString asName, AnsiString asReplacableTexture) +bool TAnimModel::Init(std::string const &asName, std::string const &asReplacableTexture) { - if (asReplacableTexture.SubString(1, 1) == + if (asReplacableTexture.substr(0, 1) == "*") // od gwiazdki zaczynają się teksty na wyświetlaczach - asText = asReplacableTexture.SubString(2, asReplacableTexture.Length() - - 1); // zapamiętanie tekstu + asText = asReplacableTexture.substr(1, asReplacableTexture.length() - 1); // zapamiętanie tekstu else if (asReplacableTexture != "none") ReplacableSkinId[1] = TTexturesManager::GetTextureID(NULL, NULL, asReplacableTexture.c_str()); @@ -463,26 +461,22 @@ bool TAnimModel::Init(AnsiString asName, AnsiString asReplacableTexture) bool TAnimModel::Load(cParser *parser, bool ter) { // rozpoznanie wpisu modelu i ustawienie świateł - std::string str; - std::string token; - parser->getTokens(); // nazwa modelu - *parser >> str; - //str = token; - parser->getTokens(1, false); // tekstura (zmienia na małe) - *parser >> token; - if (!Init(AnsiString(str.c_str()), AnsiString(token.c_str()))) + std::string name = parser->getToken(); + std::string texture = parser->getToken(false); // tekstura (zmienia na małe) + if (!Init( name, texture )) { - if (str != "notload") + if (name != "notload") { // gdy brak modelu if (ter) // jeśli teren { - if (str.substr(str.length() - 3, 4) == ".t3d") - str[str.length() - 2] = 'e'; - Global::asTerrainModel = str; - WriteLog("Terrain model \"" + str + "\" will be created."); + if( name.substr( name.rfind( '.' ) ) == ".t3d" ) { + name[ name.length() - 2 ] = 'e'; + } + Global::asTerrainModel = name; + WriteLog("Terrain model \"" + name + "\" will be created."); } else - ErrorLog("Missed file: " + str); + ErrorLog("Missed file: " + name); } } else @@ -507,26 +501,20 @@ bool TAnimModel::Load(cParser *parser, bool ter) for (int i = 0; i < iMaxNumLights; ++i) if (LightsOn[i] || LightsOff[i]) // Ra: zlikwidowałem wymóg istnienia obu iNumLights = i + 1; - int i = 0; - int ti; - parser->getTokens(); - *parser >> token; - - if (token.compare("lights") == 0) + if ( parser->getToken() == "lights" ) { - parser->getTokens(); - *parser >> str; - //str = AnsiString(token.c_str()); - do - { - ti = atof(str.c_str()); // stan światła jest liczbą z ułamkiem - LightSet(i, ti); - i++; - parser->getTokens(); - *parser >> str; - //str = AnsiString(token.c_str()); - } while (str != "endmodel"); + int i = 0; + std::string token = parser->getToken(); + while( ( token != "" ) + && ( token != "endmodel" ) ) { + + LightSet( i, std::stod( token ) ); // stan światła jest liczbą z ułamkiem + ++i; + + token = ""; + parser->getTokens(); *parser >> token; + } } return true; } @@ -606,7 +594,7 @@ void TAnimModel::RaPrepare() // for (pCurrent=pRoot;pCurrent!=NULL;pCurrent=pCurrent->pNext) //albo osobny łańcuch // pCurrent->UpdateModelIK(); //przeliczenie odwrotnej kinematyki } - +/* void TAnimModel::RenderVBO(vector3 pPosition, double fAngle) { // sprawdza światła i rekurencyjnie renderuje TModel3d RaAnimate(); // jednorazowe przeliczenie animacji @@ -636,7 +624,7 @@ void TAnimModel::RenderAlphaDL(vector3 pPosition, double fAngle) if (pModel) pModel->RenderAlpha(pPosition, fAngle, ReplacableSkinId, iTexAlpha); }; - +*/ int TAnimModel::Flags() { // informacja dla TGround, czy ma być w Render, RenderAlpha, czy RenderMixed int i = pModel ? pModel->Flags() : 0; // pobranie flag całego modelu @@ -744,10 +732,10 @@ void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double // w opisach jest podawane 24 albo 36 jako standard => powiedzmy, parametr (d) to FPS animacji delete pAdvanced; // usunięcie ewentualnego poprzedniego pAdvanced = NULL; // gdyby się nie udało rozpoznać pliku - if (AnsiString((char *)pData) == "Vocaloid Motion Data 0002") + if (std::string(static_cast(pData)) == "Vocaloid Motion Data 0002") { pAdvanced = new TAnimAdvanced(); - pAdvanced->pVocaloidMotionData = (char *)pData; // podczepienie pliku danych + pAdvanced->pVocaloidMotionData = static_cast(pData); // podczepienie pliku danych pAdvanced->iMovements = *((int *)(((char *)pData) + 50)); // numer ostatniej klatki pAdvanced->pMovementData = (TAnimVocaloidFrame *)(((char *)pData) + 54); // rekordy animacji // WriteLog(sizeof(TAnimVocaloidFrame)); @@ -765,7 +753,7 @@ void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double */ int i, j, k, idx; - AnsiString name; + std::string name; TAnimContainer *pSub; for (i = 0; i < pAdvanced->iMovements; ++i) { @@ -778,7 +766,7 @@ void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double pSub->AnimSetVMD(0.0); // usuawienie pozycji początkowej (powinna być zerowa, // inaczej będzie skok) } - name = AnsiString(pAdvanced->pMovementData[i].cBone); // nowa nazwa do pomijania + name = std::string(pAdvanced->pMovementData[i].cBone); // nowa nazwa do pomijania } if (pAdvanced->fLast < pAdvanced->pMovementData[i].iFrame) pAdvanced->fLast = pAdvanced->pMovementData[i].iFrame; diff --git a/AnimModel.h b/AnimModel.h index be855881..33e9e0b5 100644 --- a/AnimModel.h +++ b/AnimModel.h @@ -138,7 +138,7 @@ class TAnimModel TSubModel *LightsOff[iMaxNumLights]; vector3 vAngle; // bazowe obroty egzemplarza względem osi int iTexAlpha; //żeby nie sprawdzać za każdym razem, dla 4 wymiennych tekstur - AnsiString asText; // tekst dla wyświetlacza znakowego + std::string asText; // tekst dla wyświetlacza znakowego TAnimAdvanced *pAdvanced; void Advanced(); TLightState lsLights[iMaxNumLights]; @@ -154,15 +154,15 @@ class TAnimModel TAnimModel(); ~TAnimModel(); bool Init(TModel3d *pNewModel); - bool Init(AnsiString asName, AnsiString asReplacableTexture); + bool Init(std::string const &asName, std::string const &asReplacableTexture); bool Load(cParser *parser, bool ter = false); TAnimContainer * AddContainer(char *pName); TAnimContainer * GetContainer(char *pName); - void RenderDL(vector3 pPosition = vector3(0, 0, 0), double fAngle = 0); +/* void RenderDL(vector3 pPosition = vector3(0, 0, 0), double fAngle = 0); void RenderAlphaDL(vector3 pPosition = vector3(0, 0, 0), double fAngle = 0); void RenderVBO(vector3 pPosition = vector3(0, 0, 0), double fAngle = 0); void RenderAlphaVBO(vector3 pPosition = vector3(0, 0, 0), double fAngle = 0); - void RenderDL(vector3 *vPosition); +*/ void RenderDL(vector3 *vPosition); void RenderAlphaDL(vector3 *vPosition); void RenderVBO(vector3 *vPosition); void RenderAlphaVBO(vector3 *vPosition); @@ -181,7 +181,7 @@ class TAnimModel void LightSet(int n, float v); static void AnimUpdate(double dt); }; -TAnimContainer *TAnimModel::acAnimList = NULL; + //--------------------------------------------------------------------------- #endif diff --git a/Button.cpp b/Button.cpp index 3f2f51b2..c9995139 100644 --- a/Button.cpp +++ b/Button.cpp @@ -7,17 +7,12 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "Button.h" #include "Console.h" //--------------------------------------------------------------------------- -#pragma package(smart_init) - TButton::TButton() { iFeedbackBit = 0; @@ -37,25 +32,25 @@ void TButton::Clear(int i) Update(); // kasowanie bitu Feedback, o ile jakiś ustawiony }; -void TButton::Init(AnsiString asName, TModel3d *pModel, bool bNewOn) +void TButton::Init(std::string const &asName, TModel3d *pModel, bool bNewOn) { if (!pModel) return; // nie ma w czym szukać - pModelOn = pModel->GetFromName(AnsiString(asName + "_on").c_str()); - pModelOff = pModel->GetFromName(AnsiString(asName + "_off").c_str()); + pModelOn = pModel->GetFromName( (asName + "_on").c_str() ); + pModelOff = pModel->GetFromName( (asName + "_off").c_str() ); bOn = bNewOn; Update(); }; -void TButton::Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel2) +void TButton::Load(cParser &Parser, TModel3d *pModel1, TModel3d *pModel2) { - AnsiString str = Parser->GetNextSymbol().LowerCase(); + std::string const token = Parser.getToken(); if (pModel1) { // poszukiwanie submodeli w modelu - Init(str, pModel1, false); + Init(token, pModel1, false); if (pModel2) if (!pModelOn && !pModelOff) - Init(str, pModel2, false); // może w drugim będzie (jak nie w kabinie, + Init(token, pModel2, false); // może w drugim będzie (jak nie w kabinie, // to w zewnętrznym) } else diff --git a/Button.h b/Button.h index a7dbffb5..dc0f5a7d 100644 --- a/Button.h +++ b/Button.h @@ -10,8 +10,9 @@ http://mozilla.org/MPL/2.0/. #ifndef ButtonH #define ButtonH +#include #include "Model3d.h" -#include "QueryParserComp.hpp" +#include "parser.h" class TButton { // animacja dwustanowa, włącza jeden z dwóch submodeli (jednego @@ -55,8 +56,8 @@ 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 Init(std::string const &asName, TModel3d *pModel, bool bNewOn = false); + void Load(cParser &Parser, TModel3d *pModel1, TModel3d *pModel2 = NULL); void AssignBool(bool *bValue); }; diff --git a/Camera.cpp b/Camera.cpp index c7e5daa1..9bbfd990 100644 --- a/Camera.cpp +++ b/Camera.cpp @@ -7,22 +7,15 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" - -#include "opengl/glew.h" -#include "opengl/glut.h" - -#pragma hdrstop - +#include "stdafx.h" #include "Camera.h" -#include "Usefull.h" + #include "Globals.h" +#include "Usefull.h" +#include "Console.h" #include "Timer.h" #include "mover.h" -#include "Console.h" //--------------------------------------------------------------------------- -#pragma package(smart_init) // TViewPyramid TCamera::OrgViewPyramid; //={vector3(-1,1,1),vector3(1,1,1),vector3(-1,-1,1),vector3(1,-1,1),vector3(0,0,0)}; diff --git a/Classes.h b/Classes.h index 4e9efaa4..7351a197 100644 --- a/Classes.h +++ b/Classes.h @@ -19,7 +19,7 @@ class TDynamicObject; // pojazd w scenerii class TGroundNode; // statyczny obiekt scenerii class TAnimModel; // opakowanie egzemplarz modelu class TAnimContainer; // fragment opakowania egzemplarza modelu -// class TModel3d; //siatka modelu wspólna dla egzemplarzy +class TModel3d; //siatka modelu wspólna dla egzemplarzy class TSubModel; // fragment modelu (tu do wyświetlania terenu) class TMemCell; // komórka pamięci class cParser; @@ -29,10 +29,6 @@ class TEventLauncher; class TTraction; // drut class TTractionPowerSource; // zasilanie drutów -class TMoverParameters; -class TLocation; -class TRotation; - namespace Mtable { class TTrainParameters; // rozkład jazdy diff --git a/Console.cpp b/Console.cpp index e58fd93b..414130a4 100644 --- a/Console.cpp +++ b/Console.cpp @@ -7,17 +7,15 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include -#pragma hdrstop - +#include "stdafx.h" #include "Console.h" #include "Globals.h" #include "Logs.h" #include "PoKeys55.h" #include "LPT.h" +#include "mczapkie/mctools.h" //--------------------------------------------------------------------------- -#pragma package(smart_init) // Ra: klasa statyczna gromadząca sygnały sterujące oraz informacje zwrotne // Ra: stan wejścia zmieniany klawiaturą albo dedykowanym urządzeniem // Ra: stan wyjścia zmieniany przez symulację (mierniki, kontrolki) @@ -80,10 +78,15 @@ public static Int32 GetScreenSaverTimeout() }; */ +// static class member storage allocation +TKeyTrans Console::ktTable[ 4 * 256 ]; + // Ra: do poprawienia void SetLedState(char Code, bool bOn) { // Ra: bajer do migania LED-ami w klawiaturze - if (Win32Platform == VER_PLATFORM_WIN32_NT) +// NOTE: disabled for the time being +// TODO: find non Borland specific equivalent, or get rid of it +/* if (Win32Platform == VER_PLATFORM_WIN32_NT) { // WriteLog(AnsiString(int(GetAsyncKeyState(Code)))); if (bool(GetAsyncKeyState(Code)) != bOn) @@ -99,6 +102,7 @@ void SetLedState(char Code, bool bOn) KBState[Code] = bOn ? 1 : 0; SetKeyboardState(KBState); }; +*/ }; //--------------------------------------------------------------------------- @@ -198,7 +202,7 @@ void Console::BitsSet(int mask, int entry) iBits |= mask; BitsUpdate(old ^ iBits); // 1 dla bitów zmienionych if (iMode == 4) - WriteLog("PoKeys::BitsSet: mask: " + AnsiString(mask) + " iBits: " + AnsiString(iBits)); + WriteLog("PoKeys::BitsSet: mask: " + std::to_string(mask) + " iBits: " + std::to_string(iBits)); } }; @@ -290,22 +294,22 @@ void Console::ValueSet(int x, double y) { x = Global::iPoKeysPWM[x]; if (Global::iCalibrateOutDebugInfo == x) - WriteLog("CalibrateOutDebugInfo: oryginal=" + AnsiString(y), false); + WriteLog("CalibrateOutDebugInfo: oryginal=" + std::to_string(y), false); if (Global::fCalibrateOutMax[x] > 0) { y = Global::CutValueToRange(0, y, Global::fCalibrateOutMax[x]); if (Global::iCalibrateOutDebugInfo == x) - WriteLog(" cutted=" + AnsiString(y),false); + WriteLog(" cutted=" + std::to_string(y),false); y = y / Global::fCalibrateOutMax[x]; // sprowadzenie do <0,1> jeśli podana maksymalna wartość if (Global::iCalibrateOutDebugInfo == x) - WriteLog(" fraction=" + AnsiString(y),false); + WriteLog(" fraction=" + std::to_string(y),false); } double temp = (((((Global::fCalibrateOut[x][5] * y) + Global::fCalibrateOut[x][4]) * y + Global::fCalibrateOut[x][3]) * y + Global::fCalibrateOut[x][2]) * y + Global::fCalibrateOut[x][1]) * y + Global::fCalibrateOut[x][0]; // zakres <0;1> if (Global::iCalibrateOutDebugInfo == x) - WriteLog(" calibrated=" + AnsiString(temp)); + WriteLog(" calibrated=" + std::to_string(temp)); PoKeys55[0]->PWM(x, temp); } }; diff --git a/Console/LPT.cpp b/Console/LPT.cpp index 3cba85f8..202e480e 100644 --- a/Console/LPT.cpp +++ b/Console/LPT.cpp @@ -7,8 +7,8 @@ obtain one at http://mozilla.org/MPL/2.0/. */ +#include "stdafx.h" #include "LPT.h" -#include // LPT na USB: // USB\VID_067B&PID_2305&REV_0200 diff --git a/Console/PoKeys55.cpp b/Console/PoKeys55.cpp index bd2c3454..3490c3d4 100644 --- a/Console/PoKeys55.cpp +++ b/Console/PoKeys55.cpp @@ -7,13 +7,11 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include -#pragma hdrstop - -#include +#include "stdafx.h" #include "PoKeys55.h" +#include +#include "mczapkie/mctools.h" //--------------------------------------------------------------------------- -#pragma package(smart_init) // HIDscaner: http://forum.simflight.com/topic/68257-latest-lua-package-for-fsuipc-and-wideclient/ //#define MY_DEVICE_ID "Vid_04d8&Pid_003F" //#define MY_DEVICE_ID "Vid_1dc3&Pid_1001&Rev_1000&MI_01" @@ -44,7 +42,7 @@ TPoKeys55::~TPoKeys55() Close(); }; //--------------------------------------------------------------------------- -bool TPoKeys55::Close() +void TPoKeys55::Close() { // rozłączenie komunikacji if (WriteHandle != INVALID_HANDLE_VALUE) CloseHandle(WriteHandle); @@ -73,8 +71,8 @@ bool TPoKeys55::Connect() bool MatchFound; DWORD ErrorStatus; HDEVINFO hDevInfo; - String DeviceIDFromRegistry; - String DeviceIDToFind = "Vid_1dc3&Pid_1001&Rev_1000&MI_01"; + std::string DeviceIDFromRegistry; + std::string DeviceIDToFind = "Vid_1dc3&Pid_1001&Rev_1000&MI_01"; // First populate a list of plugged in devices (by specifying "DIGCF_PRESENT"), which are of the // specified class GUID. DeviceInfoTable = @@ -118,7 +116,7 @@ bool TPoKeys55::Connect() &dwRegType, NULL, 0, &dwRegSize); // Allocate a buffer for the hardware ID. // PropertyValueBuffer=(BYTE*)malloc(dwRegSize); - PropertyValueBuffer = new char[dwRegSize]; + PropertyValueBuffer = new BYTE[dwRegSize]; if (PropertyValueBuffer == NULL) // if null,error,couldn't allocate enough memory { // Can't really recover from this situation,just exit instead. // ShowMessage("Allocation PropertyValueBuffer impossible"); @@ -137,17 +135,17 @@ bool TPoKeys55::Connect() &dwRegType, PropertyValueBuffer, dwRegSize, NULL); // Now check if the first string in the hardware ID matches the device ID of my USB device. // ListBox1->Items->Add((char*)PropertyValueBuffer); - DeviceIDFromRegistry = StrPas((char *)PropertyValueBuffer); + DeviceIDFromRegistry = reinterpret_cast(PropertyValueBuffer); // free(PropertyValueBuffer); //No longer need the PropertyValueBuffer,free the memory to // prevent potential memory leaks delete PropertyValueBuffer; // No longer need the PropertyValueBuffer,free the memory to // prevent potential memory leaks // Convert both strings to lower case. This makes the code more robust/portable accross OS // Versions - DeviceIDFromRegistry = DeviceIDFromRegistry.LowerCase(); - DeviceIDToFind = DeviceIDToFind.LowerCase(); + DeviceIDFromRegistry = ToLower( DeviceIDFromRegistry ); + DeviceIDToFind = ToLower( DeviceIDToFind ); // Now check if the hardware ID we are looking at contains the correct VID/PID - MatchFound = (DeviceIDFromRegistry.AnsiPos(DeviceIDToFind) > 0); + MatchFound = ( DeviceIDFromRegistry.find( DeviceIDToFind ) != std::string::npos ); if (MatchFound == true) { // Device must have been found. Open read and write handles. In order to do this,we @@ -258,16 +256,16 @@ bool TPoKeys55::ReadLoop(int i) return false; } //--------------------------------------------------------------------------- -AnsiString TPoKeys55::Version() +std::string TPoKeys55::Version() { // zwraca numer wersji, funkcja nieoptymalna czasowo (czeka na odpowiedź) if (!WriteHandle) return ""; Write(0x00, 0); // 0x00 - Read serial number, version if (ReadLoop(10)) { // 3: serial MSB; 4: serial LSB; 5: software version (v(1+[4-7]).([0-3])); 6: revision number - AnsiString s = "PoKeys55 #" + AnsiString((InputBuffer[3] << 8) + InputBuffer[4]); - s += " v" + AnsiString(1 + (InputBuffer[5] >> 4)) + "." + AnsiString(InputBuffer[5] & 15) + - "." + AnsiString(InputBuffer[6]); + std::string s = "PoKeys55 #" + std::to_string((InputBuffer[3] << 8) + InputBuffer[4]); + s += " v" + std::to_string(1 + (InputBuffer[5] >> 4)) + "." + std::to_string(InputBuffer[5] & 15) + + "." + std::to_string(InputBuffer[6]); /* //Ra: pozyskiwanie daty można sobie darować, jest poniekąd bez sensu Write(0x04,0); //0x04 - Read build date: drugi argument zmieniać od 0 do 2, uzyskując kolejno po 4 znaki diff --git a/Console/PoKeys55.h b/Console/PoKeys55.h index 44274617..4025e62d 100644 --- a/Console/PoKeys55.h +++ b/Console/PoKeys55.h @@ -6,9 +6,9 @@ distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#pragma once -#ifndef PoKeys55H -#define PoKeys55H +#include //--------------------------------------------------------------------------- class TPoKeys55 { // komunikacja z PoKeys bez określania przeznaczenia pinów @@ -27,13 +27,12 @@ class TPoKeys55 TPoKeys55(); ~TPoKeys55(); bool Connect(); - bool Close(); + void Close(); bool Write(unsigned char c, unsigned char b3, unsigned char b4 = 0, unsigned char b5 = 0); bool Read(); bool ReadLoop(int i); - AnsiString Version(); + std::string Version(); bool PWM(int x, float y); bool Update(bool pause); }; //--------------------------------------------------------------------------- -#endif diff --git a/Driver.cpp b/Driver.cpp index 026a8c8a..14247b85 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -12,20 +12,18 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "Driver.h" + +#include +#include "Globals.h" +#include "Logs.h" #include "mtable.h" #include "DynObj.h" -#include -#include "Globals.h" #include "Event.h" #include "Ground.h" #include "MemCell.h" #include "World.h" -#include "dir.h" #include "McZapkie/mctools.h" #include "McZapkie/MOVER.h" @@ -247,7 +245,7 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) { if (Global::iWriteLogEnabled & 8) WriteLog("Tor " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + - to_string(trTrack->iNumDynamics) + "Dist= " + to_string(fDist)); + std::to_string(trTrack->iNumDynamics) + "Dist= " + std::to_string(fDist)); fVelNext = 0.0; // to zabroniďż˝ wjazdu (chyba ďż˝e ten z przodu teďż˝ jedzie prosto) } @@ -271,7 +269,7 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) { if (Global::iWriteLogEnabled & 8) WriteLog("Rozjazd " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + - to_string(trTrack->iNumDynamics) + "Dist= "+ to_string(fDist)); + std::to_string(trTrack->iNumDynamics) + "Dist= "+ std::to_string(fDist)); //fDist -= 30.0; fVelNext = 0.0; // to niech stanie w zwiďż˝kszonej odlegďż˝oďż˝ci // else if (fVelNext==0.0) //jeďż˝li zostaďż˝a wyzerowana @@ -301,7 +299,7 @@ std::string TSpeedPos::TableText() if (iFlags & spEnabled) { // o ile pozycja istotna return "Flags=#" + to_hex_str(iFlags, 8) + ", Dist=" + to_string(fDist, 1, 7) + - ", Vel=" + to_string(fVelNext) + ", Name=" + GetName(); + ", Vel=" + std::to_string(fVelNext) + ", Name=" + GetName(); //if (iFlags & spTrack) // jeďż˝li tor // return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1) + // ", Vel=" + AnsiString(fVelNext) + ", Track=" + trTrack->NameGet(); @@ -597,7 +595,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) fLastDir = -fLastDir; if (AIControllFlag) // dla AI na razie losujemy kierunek na kolejnym // skrzyďż˝owaniu - iRouteWanted = 1 + random(3); + iRouteWanted = 1 + Random(3); } } } @@ -833,7 +831,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN // juďż˝ semafora) #if LOGSTOPS WriteLog(pVehicle->asName + " as " + TrainParams->TrainName + ": at " + - to_string(GlobalTime->hh) + ":" + to_string(GlobalTime->mm) + + std::to_string(GlobalTime->hh) + ":" + std::to_string(GlobalTime->mm) + " skipped " + asNextStop); // informacja #endif fLastStopExpDist = mvOccupied->DistCounter + 0.250 + @@ -1004,8 +1002,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN // TableClear(); //aby od nowa sprawdziďż˝o W4 z innďż˝ nazwďż˝ juďż˝ - to nie jest dobry pomysďż˝ #if LOGSTOPS WriteLog(pVehicle->asName + " as " + TrainParams->TrainName + - ": at " + to_string(GlobalTime->hh) + ":" + - to_string(GlobalTime->mm) + " next " + + ": at " + std::to_string(GlobalTime->hh) + ":" + + std::to_string(GlobalTime->mm) + " next " + asNextStop); // informacja #endif if (int(floor(sSpeedTable[i].evEvent->ValueGet(1))) & 1) @@ -1031,8 +1029,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN { // jeďż˝li dojechaliďż˝my do koďż˝ca rozkďż˝adu #if LOGSTOPS WriteLog(pVehicle->asName + " as " + TrainParams->TrainName + - ": at " + to_string(GlobalTime->hh) + ":" + - to_string(GlobalTime->mm) + + ": at " + std::to_string(GlobalTime->hh) + ":" + + std::to_string(GlobalTime->mm) + " end of route."); // informacja #endif asNextStop = TrainParams->NextStop(); // informacja o koďż˝cu trasy @@ -1425,7 +1423,7 @@ void TController::TablePurger() sSpeedTable = t; // bo jest nowe iSpeedTableSize += 16; if (Global::iWriteLogEnabled & 8) - WriteLog("Tabelka powiďż˝kszona do "+AnsiString(iSpeedTableSize)+" pozycji"); + WriteLog("Tabelka powiďż˝kszona do " + std::to_string(iSpeedTableSize) + " pozycji"); }; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- @@ -1644,7 +1642,7 @@ std::string TController::Order2Str(TOrders Order) std::string TController::OrderCurrent() { // pobranie aktualnego rozkazu celem wyďż˝wietlenia - return to_string(OrderPos) + ". " + Order2Str(OrderList[OrderPos]); + return std::to_string(OrderPos) + ". " + Order2Str(OrderList[OrderPos]); }; void TController::OrdersClear() @@ -2023,8 +2021,8 @@ void TController::SetVelocity(double NewVel, double NewVelNext, TStopReason r) { // ustawienie nowej prďż˝dkoďż˝ci WaitingTime = -WaitingExpireTime; // przypisujemy -WaitingExpireTime, a potem porďż˝wnujemy z // zerem - MaxVelFlag = False; // Ra: to nie jest uďż˝ywane - MinVelFlag = False; // Ra: to nie jest uďż˝ywane + MaxVelFlag = false; // Ra: to nie jest uďż˝ywane + MinVelFlag = false; // Ra: to nie jest uďż˝ywane /* nie uďż˝ywane if ((NewVel>NewVelNext) //jeďż˝li oczekiwana wiďż˝ksza niďż˝ nastďż˝pna || (NewVelVel)) //albo aktualna jest mniejsza niďż˝ aktualna @@ -2866,7 +2864,7 @@ void TController::Doors(bool what) mvOccupied->DoorLeft(false); // zamykanie drzwi mvOccupied->DoorRight(false); // Ra: trzeba by ustawiďż˝ jakiďż˝ czas oczekiwania na zamkniďż˝cie siďż˝ drzwi - fActionTime = -1.5 - 0.1 * random(10); // czekanie sekundďż˝, moďż˝e trochďż˝ dďż˝uďż˝ej + fActionTime = -1.5 - 0.1 * Random(10); // czekanie sekundďż˝, moďż˝e trochďż˝ dďż˝uďż˝ej iDrivigFlags &= ~moveDoorOpened; // nie wykonywaďż˝ drugi raz } } @@ -2880,7 +2878,7 @@ void TController::Doors(bool what) p = p->Next(); // pojazd pod��czony z tyďż˝u (patrzďż˝c od czoďż˝a) } // WaitingSet(5); //10 sekund tu to za dďż˝ugo, op��nia odjazd o p�� minuty - fActionTime = -1.5 - 0.1 * random(10); // czekanie sekundďż˝, moďż˝e trochďż˝ dďż˝uďż˝ej + fActionTime = -1.5 - 0.1 * Random(10); // czekanie sekundďż˝, moďż˝e trochďż˝ dďż˝uďż˝ej iDrivigFlags &= ~moveDoorOpened; // zostaďż˝y zamkniďż˝te - nie wykonywaďż˝ drugi raz } } @@ -2951,7 +2949,7 @@ bool TController::PutCommand(std::string NewCommand, double NewValue1, double Ne if (ConversionError == -8) ErrorLog("Missed timetable: " + NewCommand); WriteLog("Cannot load timetable file " + NewCommand + "\r\nError " + - to_string(ConversionError) + " in position " + to_string(TrainParams->StationCount)); + std::to_string(ConversionError) + " in position " + std::to_string(TrainParams->StationCount)); NewCommand = ""; // puste, dla wymiennej tekstury } else @@ -2963,7 +2961,7 @@ bool TController::PutCommand(std::string NewCommand, double NewValue1, double Ne asNextStop = TrainParams->NextStop(); iDrivigFlags |= movePrimary; // skoro dostaďż˝ rozkďż˝ad, to jest teraz g��wnym NewCommand = Global::asCurrentSceneryPath + NewCommand + ".wav"; // na razie jeden - if (fileExists(NewCommand)) + if (FileExists(NewCommand)) { // wczytanie dďż˝wiďż˝ku odjazdu podawanego bezpoďż˝renido tsGuardSignal = new TTextSound(NewCommand.c_str(), 30, pVehicle->GetPosition().x, pVehicle->GetPosition().y, pVehicle->GetPosition().z, @@ -2974,7 +2972,7 @@ bool TController::PutCommand(std::string NewCommand, double NewValue1, double Ne else { NewCommand = NewCommand.insert(NewCommand.find_last_of("."),"radio"); // wstawienie przed kropkďż˝ - if (fileExists(NewCommand)) + if (FileExists(NewCommand)) { // wczytanie dďż˝wiďż˝ku odjazdu w wersji radiowej (sďż˝ychaďż˝ tylko w kabinie) tsGuardSignal = new TTextSound(NewCommand.c_str(), -1, pVehicle->GetPosition().x, pVehicle->GetPosition().y, pVehicle->GetPosition().z, @@ -3405,7 +3403,7 @@ bool TController::UpdateSituation(double dt) .MinV) // gdy roz��czenie WS z powodu niskiego napiďż˝cia if (fActionTime >= 0) // jeďż˝li czas oczekiwania nie zostaďż˝ ustawiony fActionTime = - -2 - random(10); // losowy czas oczekiwania przed ponownym za��czeniem jazdy + -2 - Random(10); // losowy czas oczekiwania przed ponownym za��czeniem jazdy } if (mvOccupied->Vel > 0.0) { // jeďż˝eli jedzie @@ -4882,7 +4880,7 @@ void TController::OrdersDump() WriteLog("Orders for " + pVehicle->asName + ":"); for (int b = 0; b < maxorders; ++b) { - WriteLog(to_string(b) + ": " + Order2Str(OrderList[b]) + (OrderPos == b ? " <-" : "")); + WriteLog(std::to_string(b) + ": " + Order2Str(OrderList[b]) + (OrderPos == b ? " <-" : "")); if (b) // z wyjďż˝tkiem pierwszej pozycji if (OrderList[b] == Wait_for_orders) // jeďż˝li koďż˝cowa komenda break; // dalej nie trzeba @@ -4935,10 +4933,10 @@ void TController::OrdersInit(double fVel) { t = TrainParams->TimeTable + i; if (DebugModeFlag) // normalnie nie ma po co tego wypisywaďż˝ - WriteLog(AnsiString(t->StationName.c_str()) + " " + AnsiString((int)t->Ah) + ":" + - AnsiString((int)t->Am) + ", " + AnsiString((int)t->Dh) + ":" + - AnsiString((int)t->Dm) + " " + AnsiString(t->StationWare.c_str())); - if (AnsiString(t->StationWare.c_str()).Pos("@")) + WriteLog( t->StationName + " " + std::to_string(t->Ah) + ":" + + std::to_string(t->Am) + ", " + std::to_string(t->Dh) + ":" + + std::to_string(t->Dm) + " " + t->StationWare); + if( t->StationWare.find('@') != std::string::npos ) { // zmiana kierunku i dalsza jazda wg rozkďż˝adu if (iDrivigFlags & movePushPull) // SZT rďż˝wnieďż˝! SN61 zaleďż˝nie od wagonďż˝w... { // jeďż˝li skďż˝ad zespolony, wystarczy zmieniďż˝ kierunek jazdy @@ -5302,11 +5300,11 @@ std::string TController::NextStop() return ""; // tu nie powinno nigdy wej�� TMTableLine *t = TrainParams->TimeTable + TrainParams->StationIndex; if (t->Dh >= 0) // jeďż˝li jest godzina odjazdu - return asNextStop.substr(19, 30) + " " + to_string(t->Dh) + ":" + - to_string(t->Dm); // odjazd + return asNextStop.substr(19, 30) + " " + std::to_string(t->Dh) + ":" + + std::to_string(t->Dm); // odjazd else if (t->Ah >= 0) // przyjazd - return asNextStop.substr(19, 30) + " (" + to_string(t->Ah) + ":" + - to_string(t->Am) + ")"; // przyjazd + return asNextStop.substr(19, 30) + " (" + std::to_string(t->Ah) + ":" + + std::to_string(t->Am) + ")"; // przyjazd return ""; }; diff --git a/Driver.h b/Driver.h index 9dc80884..e4f6aba4 100644 --- a/Driver.h +++ b/Driver.h @@ -7,16 +7,15 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef DriverH -#define DriverH +#pragma once +//#include +#include #include "Classes.h" #include "dumb3d.h" -#include -#include +#include "mczapkie/mover.h" using namespace Math3D; using namespace Mtable; -using namespace std; enum TOrders { // rozkazy dla AI @@ -379,7 +378,7 @@ class TController public: void PhysicsLog(); - string StopReasonText(); + std::string StopReasonText(); ~TController(); std::string NextStop(); void TakeControl(bool yes); @@ -403,5 +402,3 @@ class TController void RouteSwitch(int d); std::string OwnerName(); }; - -#endif diff --git a/DynObj.cpp b/DynObj.cpp index 8209f140..77013c63 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -12,12 +12,11 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "DynObj.h" +#include "logs.h" +#include "MdlMngr.h" #include "Timer.h" #include "Usefull.h" // McZapkie-260202 @@ -32,12 +31,10 @@ http://mozilla.org/MPL/2.0/. #include "Camera.h" //bo likwidujemy trzęsienie #include "Console.h" #include "Traction.h" -#include -#pragma package(smart_init) // Ra: taki zapis funkcjonuje lepiej, ale może nie jest optymalny -#define vWorldFront vector3(0, 0, 1) -#define vWorldUp vector3(0, 1, 0) +#define vWorldFront Math3D::vector3(0, 0, 1) +#define vWorldUp Math3D::vector3(0, 1, 0) #define vWorldLeft CrossProduct(vWorldUp, vWorldFront) // Ra: bo te poniżej to się powielały w każdym module odobno @@ -115,7 +112,7 @@ int TAnim::TypeSet(int i, int fl) default: iFlags = 0; } - yUpdate = NULL; + yUpdate = nullptr; return iFlags & 15; // ile wskaźników rezerwować dla danego typu animacji }; TAnim::TAnim() @@ -341,7 +338,9 @@ int TDynamicObject::GetPneumatic(bool front, bool red) void TDynamicObject::SetPneumatic(bool front, bool red) { - int x = 0, ten, tamten; + int x = 0, + ten = 0, + tamten = 0; ten = GetPneumatic(front, red); // 1=lewy skos,2=prawy skos,3=dwa proste if (front) if (PrevConnected) // pojazd od strony sprzęgu 0 @@ -1118,7 +1117,7 @@ void TDynamicObject::ABuCheckMyTrack() // Ra: w poniższej funkcji jest problem ze sprzęgami TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir, - Byte &CouplFound, double &dist) + BYTE &CouplFound, double &dist) { // Zwraca wskaźnik najbliższego obiektu znajdującego się // na torze w określonym kierunku, ale tylko wtedy, kiedy // obiekty mogą się zderzyć, tzn. nie mijają się. @@ -1373,9 +1372,9 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist) 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 + 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) + 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, @@ -1663,26 +1662,26 @@ TDynamicObject::~TDynamicObject() } double -TDynamicObject::Init(string Name, // nazwa pojazdu, np. "EU07-424" - string BaseDir, // z którego katalogu wczytany, np. "PKP/EU07" - string asReplacableSkin, // nazwa wymiennej tekstury - string Type_Name, // nazwa CHK/MMD, np. "303E" +TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424" + std::string BaseDir, // z którego katalogu wczytany, np. "PKP/EU07" + std::string asReplacableSkin, // nazwa wymiennej tekstury + std::string Type_Name, // nazwa CHK/MMD, np. "303E" TTrack *Track, // tor początkowy wstwawienia (początek składu) double fDist, // dystans względem punktu 1 - string DriverType, // typ obsady + std::string DriverType, // typ obsady double fVel, // prędkość początkowa - string TrainName, // nazwa składu, np. "PE2307" albo Vmax, jeśli pliku + std::string TrainName, // nazwa składu, np. "PE2307" albo Vmax, jeśli pliku // nie ma a są cyfry float Load, // ilość ładunku - string LoadType, // nazwa ładunku + std::string LoadType, // nazwa ładunku bool Reversed, // true, jeśli ma stać odwrotnie w składzie - string MoreParams // dodatkowe parametry wczytywane w postaci tekstowej + std::string MoreParams // dodatkowe parametry wczytywane w postaci tekstowej ) { // Ustawienie początkowe pojazdu iDirection = (Reversed ? 0 : 1); // Ra: 0, jeśli ma być wstawiony jako obrócony tyłem asBaseDir = "dynamic\\" + BaseDir + "\\"; // McZapkie-310302 asName = Name; - string asAnimName = ""; // zmienna robocza do wyszukiwania osi i wózków + std::string asAnimName = ""; // zmienna robocza do wyszukiwania osi i wózków // Ra: zmieniamy znaczenie obsady na jednoliterowe, żeby dosadzić kierownika if (DriverType == "headdriver") DriverType = "1"; // sterujący kabiną +1 @@ -1702,7 +1701,7 @@ TDynamicObject::Init(string Name, // nazwa pojazdu, np. "EU07-424" Cab = -1; // iDirection?-1:1; else if (DriverType == "p") { - if (random(6) < 3) + if (Random(6) < 3) Cab = 1; else Cab = -1; // losowy przydział kabiny @@ -1762,7 +1761,7 @@ TDynamicObject::Init(string Name, // nazwa pojazdu, np. "EU07-424" MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać // kropkę na koniec int kropka = MoreParams.find("."); // znajdź kropke - string ActPar; // na parametry + std::string ActPar; // na parametry while (kropka > 0) // jesli sa kropki jeszcze { int dlugosc = MoreParams.length(); @@ -1774,42 +1773,42 @@ TDynamicObject::Init(string Name, // nazwa pojazdu, np. "EU07-424" if (ActPar.substr(0, 1) == "B") // jesli hamulce { // sprawdzanie kolejno nastaw WriteLog("Wpis hamulca: " + ActPar); - if (ActPar.find("G") != string::npos) + if (ActPar.find('G') != std::string::npos) { MoverParameters->BrakeDelaySwitch(bdelay_G); } - if (ActPar.find("P") != string::npos) + if( ActPar.find( 'P' ) != std::string::npos ) { MoverParameters->BrakeDelaySwitch(bdelay_P); } - if (ActPar.find("R") != string::npos) + if( ActPar.find( 'R' ) != std::string::npos ) { MoverParameters->BrakeDelaySwitch(bdelay_R); } - if (ActPar.find("M") != string::npos) + if( ActPar.find( 'M' ) != std::string::npos ) { MoverParameters->BrakeDelaySwitch(bdelay_R); MoverParameters->BrakeDelaySwitch(bdelay_R + bdelay_M); } // wylaczanie hamulca - if (ActPar.find("<>") != string::npos) // wylaczanie na probe hamowania naglego + if (ActPar.find("<>") != std::string::npos) // wylaczanie na probe hamowania naglego { MoverParameters->BrakeStatus |= 128; // wylacz } - if (ActPar.find("0") != string::npos) // wylaczanie na sztywno + if (ActPar.find('0') != std::string::npos) // wylaczanie na sztywno { MoverParameters->BrakeStatus |= 128; // wylacz MoverParameters->Hamulec->ForceEmptiness(); MoverParameters->BrakeReleaser(1); // odluznij automatycznie } - if (ActPar.find("E") != string::npos) // oprozniony + if (ActPar.find('E') != std::string::npos) // oprozniony { MoverParameters->Hamulec->ForceEmptiness(); MoverParameters->BrakeReleaser(1); // odluznij automatycznie MoverParameters->Pipe->CreatePress(0); MoverParameters->Pipe2->CreatePress(0); } - if (ActPar.find("Q") != string::npos) // oprozniony + if (ActPar.find('Q') != std::string::npos) // oprozniony { // MoverParameters->Hamulec->ForceEmptiness(); //TODO: sprawdzic, // dlaczego @@ -1824,7 +1823,7 @@ TDynamicObject::Init(string Name, // nazwa pojazdu, np. "EU07-424" MoverParameters->CompressedVolume = 0; } - if (ActPar.find("1") != string::npos) // wylaczanie 10% + if (ActPar.find('1') != std::string::npos) // wylaczanie 10% { if (Random(10) < 1) // losowanie 1/10 { @@ -1833,7 +1832,7 @@ TDynamicObject::Init(string Name, // nazwa pojazdu, np. "EU07-424" MoverParameters->BrakeReleaser(1); // odluznij automatycznie } } - if (ActPar.find("X") != string::npos) // agonalny wylaczanie 20%, usrednienie przekladni + if (ActPar.find('X') != std::string::npos) // agonalny wylaczanie 20%, usrednienie przekladni { if (Random(100) < 20) // losowanie 20/100 { @@ -1867,23 +1866,23 @@ TDynamicObject::Init(string Name, // nazwa pojazdu, np. "EU07-424" } } // nastawianie ladunku - if (ActPar.find("T") != string::npos) // prozny + if (ActPar.find('T') != std::string::npos) // prozny { MoverParameters->DecBrakeMult(); MoverParameters->DecBrakeMult(); } // dwa razy w dol - if (ActPar.find("H") != string::npos) // ladowny I (dla P-Ł dalej prozny) + if (ActPar.find('H') != std::string::npos) // ladowny I (dla P-Ł dalej prozny) { MoverParameters->IncBrakeMult(); MoverParameters->IncBrakeMult(); MoverParameters->DecBrakeMult(); } // dwa razy w gore i obniz - if (ActPar.find("F") != string::npos) // ladowny II + if (ActPar.find('F') != std::string::npos) // ladowny II { MoverParameters->IncBrakeMult(); MoverParameters->IncBrakeMult(); } // dwa razy w gore - if (ActPar.find("N") != string::npos) // parametr neutralny + if (ActPar.find('N') != std::string::npos) // parametr neutralny { } } // koniec hamulce @@ -2005,11 +2004,11 @@ TDynamicObject::Init(string Name, // nazwa pojazdu, np. "EU07-424" if (mdModel) // jeśli ma w czym szukać for (int i = 0; i < 2; i++) { - asAnimName = string("buffer_left0") + to_string(i + 1); + asAnimName = std::string("buffer_left0") + to_string(i + 1); smBuforLewy[i] = mdModel->GetFromName(asAnimName.c_str()); if (smBuforLewy[i]) smBuforLewy[i]->WillBeAnimated(); // ustawienie flagi animacji - asAnimName = string("buffer_right0") + to_string(i + 1); + asAnimName = std::string("buffer_right0") + to_string(i + 1); smBuforPrawy[i] = mdModel->GetFromName(asAnimName.c_str()); if (smBuforPrawy[i]) smBuforPrawy[i]->WillBeAnimated(); @@ -2346,14 +2345,14 @@ void TDynamicObject::LoadUpdate() // Ra: nie próbujemy wczytywać modeli miliony razy podczas renderowania!!! if ((mdLoad == NULL) && (MoverParameters->Load > 0)) { - string asLoadName = + std::string asLoadName = asBaseDir + MoverParameters->LoadType + ".t3d"; // zapamiętany katalog pojazdu // asLoadName=MoverParameters->LoadType; // if (MoverParameters->LoadType!=AnsiString("passengers")) Global::asCurrentTexturePath = asBaseDir; // bieżąca ścieżka do tekstur to dynamic/... mdLoad = TModelsManager::GetModel(asLoadName.c_str()); // nowy ładunek Global::asCurrentTexturePath = - string(szTexturePath); // z powrotem defaultowa sciezka do tekstur + std::string(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 // załadowania @@ -2679,7 +2678,7 @@ bool TDynamicObject::Update(double dt, double dt1) { // hamulcem lacznie dla calego pociagu/ezt bool kier = (DirectionGet() * MoverParameters->ActiveCab > 0); float FED = 0; - float np = 0; + int np = 0; float masa = 0; float FrED = 0; float masamax = 0; @@ -3441,7 +3440,7 @@ bool TDynamicObject::Update(double dt, double dt1) ABuScanObjects(-1, fScanDist); // WriteLog(asName+" - block 1: "+AnsiString(fTrackBlock)); } - CouplCounter = random(20); // ponowne sprawdzenie po losowym czasie + CouplCounter = Random(20); // ponowne sprawdzenie po losowym czasie } if (MoverParameters->Vel > 0.1) //[km/h] ++CouplCounter; // jazda sprzyja poszukiwaniu połączenia @@ -3794,7 +3793,7 @@ void TDynamicObject::RenderSounds() (MoverParameters->EnginePower < 100)) { float volrnd = - random(100) * MoverParameters->enrot / (1 + MoverParameters->nmax); + Random(100) * MoverParameters->enrot / (1 + MoverParameters->nmax); if (volrnd < 2) vol = vol + volrnd / 200.0; } @@ -4221,56 +4220,36 @@ void TDynamicObject::RenderAlpha() // McZapkie-250202 // wczytywanie pliku z danymi multimedialnymi (dzwieki) -void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, - string ReplacableSkin) +void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, + std::string ReplacableSkin) { double dSDist; // asBaseDir=BaseDir; Global::asCurrentDynamicPath = BaseDir; - string asFileName = BaseDir + TypeName + ".mmd"; - string asLoadName = BaseDir + MoverParameters->LoadType + ".t3d"; - ifstream *fs = new ifstream(asFileName.c_str()); + std::string asFileName = BaseDir + TypeName + ".mmd"; + std::string asLoadName = BaseDir + MoverParameters->LoadType + ".t3d"; - if (!fs->is_open()) - { - ErrorLog("Missed file: " + asFileName); // brak MMD - delete fs; - return; - } - // if (fs->width() == 0) - // { - // return delete fs; - // }; - string asAnimName; + std::string asAnimName; bool Stop_InternalData = false; - //char *buf = new char[size + 1]; // ciąg bajtów o długości równej rozmiwarowi pliku - stringstream buffer; - buffer << fs->rdbuf(); - //buf[size] = '\0'; // zakończony zerem na wszelki wypadek - delete fs; - TQueryParserComp *Parser; - Parser = new TQueryParserComp(NULL); - Parser->TextToParse = AnsiString(buffer.str().c_str()); - //delete[] buf; - AnsiString str; - // Parser->LoadStringToParse(asFile); - Parser->First(); - // DecimalSeparator= '.'; pants = NULL; // wskaźnik pierwszego obiektu animującego dla pantografów - int i; - while (!Parser->EndOfFile && !Stop_InternalData) - { - str = Parser->GetNextSymbol().LowerCase(); - if (str == AnsiString("models:")) // modele i podmodele - { + cParser parser( TypeName + ".mmd", cParser::buffer_FILE, BaseDir ); + std::string token; + int i; + do { + token = ""; + parser.getTokens(); parser >> token; + + if( token == "models:") { + // modele i podmodele iMultiTex = 0; // czy jest wiele tekstur wymiennych? - asModel = Parser->GetNextSymbol().LowerCase().c_str(); - if (asModel.find("#") == asModel.length()) // Ra 2015-01: nie podoba mi się to + parser.getTokens(); + parser >> asModel; + if (asModel.find('#') == asModel.length()) // Ra 2015-01: nie podoba mi się to { // model wymaga wielu tekstur wymiennych iMultiTex = 1; asModel = asModel.substr(0, asModel.length() - 1); } - if ((i = asModel.find(",")) != string::npos) + if ((i = asModel.find(',')) != std::string::npos) { // Ra 2015-01: może szukać przecinka w // nazwie modelu, a po przecinku była by // liczba @@ -4285,14 +4264,14 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, 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); + mdModel = TModelsManager::GetModel(asModel, true); if (ReplacableSkin != "none") { // tekstura wymienna jest raczej jedynie w "dynamic\" ReplacableSkin = Global::asCurrentTexturePath + ReplacableSkin; // skory tez z dynamic/... - string x = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie + std::string x = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie if (!x.empty()) - ReplacableSkinID[4] = TTexturesManager::GetTextureID(NULL, NULL, (Global::asCurrentTexturePath + "nowhere").c_str(), 9); + ReplacableSkinID[4] = TTexturesManager::GetTextureID(NULL, NULL, Global::asCurrentTexturePath + "nowhere", 9); /* if ((i = ReplacableSkin.Pos("|")) > 0) // replacable dzielone { @@ -4356,22 +4335,22 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, if (iMultiTex > 0) { // jeśli model ma 4 tekstury ReplacableSkinID[1] = TTexturesManager::GetTextureID( - NULL, NULL, (ReplacableSkin + ",1").c_str(), Global::iDynamicFiltering); + NULL, NULL, ReplacableSkin + ",1", Global::iDynamicFiltering); if (ReplacableSkinID[1]) { // pierwsza z zestawu znaleziona ReplacableSkinID[2] = TTexturesManager::GetTextureID( - NULL, NULL, (ReplacableSkin + ",2").c_str(), Global::iDynamicFiltering); + NULL, NULL, ReplacableSkin + ",2", Global::iDynamicFiltering); if (ReplacableSkinID[2]) { iMultiTex = 2; // już są dwie ReplacableSkinID[3] = TTexturesManager::GetTextureID( - NULL, NULL, (ReplacableSkin + ",3").c_str(), + NULL, NULL, ReplacableSkin + ",3", Global::iDynamicFiltering); if (ReplacableSkinID[3]) { iMultiTex = 3; // a teraz nawet trzy ReplacableSkinID[4] = TTexturesManager::GetTextureID( - NULL, NULL, (ReplacableSkin + ",4").c_str(), + NULL, NULL, ReplacableSkin + ",4", Global::iDynamicFiltering); if (ReplacableSkinID[4]) iMultiTex = 4; // jak są cztery, to blokujemy podmianę tekstury @@ -4383,13 +4362,13 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, { // zestaw nie zadziałał, próbujemy normanie iMultiTex = 0; ReplacableSkinID[1] = TTexturesManager::GetTextureID( - NULL, NULL, ReplacableSkin.c_str(), Global::iDynamicFiltering); + NULL, NULL, ReplacableSkin, Global::iDynamicFiltering); } } else ReplacableSkinID[1] = TTexturesManager::GetTextureID( - NULL, NULL, ReplacableSkin.c_str(), Global::iDynamicFiltering); + NULL, NULL, ReplacableSkin, Global::iDynamicFiltering); if (TTexturesManager::GetAlpha(ReplacableSkinID[1])) iAlpha = 0x31310031; // tekstura -1 z kanałem alfa - nie renderować w cyklu // nieprzezroczystych @@ -4418,7 +4397,7 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, { asModel = "przedsionki.t3d"; asModel = BaseDir + asModel; - mdPrzedsionek = TModelsManager::GetModel(asModel.c_str(), true); + mdPrzedsionek = TModelsManager::GetModel(asModel, true); } if (!MoverParameters->LoadAccepted.empty()) // if (MoverParameters->LoadAccepted!=AnsiString("")); // && @@ -4455,26 +4434,24 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, } } else // Ra: tu wczytywanie modelu ładunku jest w porządku - mdLoad = TModelsManager::GetModel(asLoadName.c_str(), true); // ladunek - Global::asCurrentTexturePath = - string(szTexturePath); // z powrotem defaultowa sciezka do tekstur - while (!Parser->EndOfFile && str != AnsiString("endmodels")) - { - str = Parser->GetNextSymbol().LowerCase(); - if (str == AnsiString("animations:")) - { // Ra: ustawienie ilości - // poszczególnych animacji - - // musi być jako pierwsze, - // inaczej - // ilości będą domyślne - if (!pAnimations) + mdLoad = TModelsManager::GetModel(asLoadName, true); // ladunek + Global::asCurrentTexturePath = szTexturePath; // z powrotem defaultowa sciezka do tekstur + do { + token = ""; + parser.getTokens(); parser >> token; + + if( token == "animations:" ) { + // Ra: ustawienie ilości poszczególnych animacji - + // musi być jako pierwsze, inaczej ilości będą domyślne + if( nullptr == pAnimations ) { // jeśli nie ma jeszcze tabeli animacji, można // odczytać nowe ilości - int co = 0, ile; + int co = 0, ile = -1; iAnimations = 0; do { // kolejne liczby to ilość animacj, -1 to znacznik końca - ile = Parser->GetNextSymbol().ToIntDef(-1); // ilość danego typu + parser.getTokens( 1, false ); + parser >> ile; // animacji // if (co==ANIM_PANTS) // if (!Global::bLoadTraction) @@ -4489,13 +4466,16 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, } ++co; } while (ile >= 0); //-1 to znacznik końca - while (co < ANIM_TYPES) - iAnimType[co++] = 0; // zerowanie pozostałych - str = Parser->GetNextSymbol().LowerCase(); + + while( co < ANIM_TYPES ) { + iAnimType[ co++ ] = 0; // zerowanie pozostałych + } + + parser.getTokens(); parser >> token; // NOTE: should this be here? seems at best superfluous } // WriteLog("Total animations: "+AnsiString(iAnimations)); } - if (!pAnimations) + if( nullptr == pAnimations ) { // Ra: tworzenie tabeli animacji, jeśli jeszcze nie // było if (!iAnimations) // jeśli nie podano jawnie, ile ma być animacji @@ -4532,44 +4512,50 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, pAnimations[k].iShift; // przydzielenie wskaźnika do tabelki } } - if (str == AnsiString("lowpolyinterior:")) // ABu: wnetrze lowpoly - { - asModel = Parser->GetNextSymbol().LowerCase().c_str(); - 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); + + if(token == "lowpolyinterior:") { + // ABu: wnetrze lowpoly + parser.getTokens(); + parser >> asModel; + 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, true); // Global::asCurrentTexturePath=AnsiString(szTexturePath); //kiedyś // uproszczone // wnętrze mieszało tekstury nieba } - if (str == AnsiString("brakemode:")) - { // Ra 15-01: gałka nastawy hamulca - asAnimName = Parser->GetNextSymbol().LowerCase().c_str(); + + if( token == "brakemode:" ) { + // Ra 15-01: gałka nastawy hamulca + parser.getTokens(); + parser >> asAnimName; smBrakeMode = mdModel->GetFromName(asAnimName.c_str()); // jeszcze wczytać kąty obrotu dla poszczególnych ustawień } - if (str == AnsiString("loadmode:")) - { // Ra 15-01: gałka nastawy hamulca - asAnimName = Parser->GetNextSymbol().LowerCase().c_str(); + + if( token == "loadmode:" ) { + // Ra 15-01: gałka nastawy hamulca + parser.getTokens(); + parser >> asAnimName; smLoadMode = mdModel->GetFromName(asAnimName.c_str()); // jeszcze wczytać kąty obrotu dla poszczególnych ustawień } - else if (str == AnsiString("animwheelprefix:")) - { // prefiks kręcących się kół + + else if (token == "animwheelprefix:") { + // prefiks kręcących się kół int i, j, k, m; - str = Parser->GetNextSymbol(); + parser.getTokens( 1, false ); parser >> token; for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // liczba osi { // McZapkie-050402: wyszukiwanie kol o nazwie str* - asAnimName = str.c_str() + to_string(i + 1); + asAnimName = token + std::to_string(i + 1); pAnimations[i].smAnimated = mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu if (pAnimations[i].smAnimated) { //++iAnimatedAxles; pAnimations[i].smAnimated->WillBeAnimated(); // wyłączenie optymalizacji // transformu - pAnimations[i].yUpdate = UpdateAxle; // animacja osi +/* pAnimations[i].yUpdate = UpdateAxle; // animacja osi +*/ pAnimations[ i ].yUpdate = std::bind( &TDynamicObject::UpdateAxle, this, std::placeholders::_1 ); pAnimations[i].fMaxDist = 50 * MoverParameters->WheelDiameter; // nie kręcić w większej odległości @@ -4631,22 +4617,23 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, // smWiazary[i-1]->WillBeAnimated(); // } // } - else if (str == AnsiString("animpantprefix:")) - { // Ra: pantografy po + + else if( token == "animpantprefix:" ) { + // Ra: pantografy po // nowemu mają literki // i numerki } // Pantografy - Winger 160204 - if (str == AnsiString("animpantrd1prefix:")) - { // prefiks ramion dolnych 1 - str = Parser->GetNextSymbol(); + if( token == "animpantrd1prefix:" ) { + // prefiks ramion dolnych 1 + parser.getTokens(); parser >> token; float4x4 m; // macierz do wyliczenia pozycji i wektora ruchu pantografu TSubModel *sm; if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie // str* - asAnimName = str.c_str() + to_string(i + 1); + asAnimName = token + std::to_string(i + 1); sm = mdModel->GetFromName(asAnimName.c_str()); pants[i].smElement[0] = sm; // jak NULL, to nie będzie animowany if (sm) @@ -4732,7 +4719,7 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, // obrót, jeśli wczytano z T3D, tzn. // przed wykonaniem Init() float det = Det(m); - if (fabs(det - 1.0) < 0.001) // dopuszczamy 1 promil błędu + if (std::fabs(det - 1.0) < 0.001) // dopuszczamy 1 promil błędu // na skalowaniu ślizgu { // skalowanie jest w normie, można pobrać wymiary z modelu pants[i].fParamPants->fHeight = @@ -4754,7 +4741,7 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, 0.0; // niech będzie odczyt z pantfactors: ErrorLog("Bad model: " + asModel + ", scale of " + (sm->pName) + " is " + - to_string(100.0 * det) + "%"); + std::to_string(100.0 * det) + "%"); } } } @@ -4764,167 +4751,170 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, asAnimName); // brak ramienia } } - else if (str == AnsiString("animpantrd2prefix:")) - { // prefiks ramion dolnych 2 - str = Parser->GetNextSymbol(); + + else if( token == "animpantrd2prefix:" ) { + // prefiks ramion dolnych 2 + parser.getTokens(); parser >> token; float4x4 m; // macierz do wyliczenia pozycji i wektora ruchu pantografu TSubModel *sm; - if (pants) - for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie - // str* - asAnimName = str.c_str() + to_string(i + 1); - sm = mdModel->GetFromName(asAnimName.c_str()); - pants[i].smElement[1] = sm; // jak NULL, to nie będzie animowany - if (sm) - { // 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 - //!!!! docelowo zrobić niezależną animację ramion z każdej - // strony - m = float4x4( - *sm->GetMatrix()); // skopiowanie, bo będziemy mnożyć - m(3)[1] = - m[3][1] + 0.054; // w górę o wysokość ślizgu (na razie tak) - while (sm->Parent) - { - if (sm->Parent->GetMatrix()) - m = *sm->Parent->GetMatrix() * m; - sm = sm->Parent; - } - pants[i].fParamPants->vPos.z = - m[3][0]; // przesunięcie w bok (asymetria) - pants[i].fParamPants->vPos.y = - m[3][1]; // przesunięcie w górę odczytane z modelu - } - } - else - ErrorLog("Bad model: " + asFileName + " - missed submodel " + - asAnimName); // brak ramienia - } + if( pants ) { + for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* + asAnimName = token + std::to_string( i + 1 ); + sm = mdModel->GetFromName( asAnimName.c_str() ); + pants[ i ].smElement[ 1 ] = sm; // jak NULL, to nie będzie animowany + if( sm ) { // 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 + //!!!! docelowo zrobić niezależną animację ramion z każdej + // strony + m = float4x4( + *sm->GetMatrix() ); // skopiowanie, bo będziemy mnożyć + m( 3 )[ 1 ] = + m[ 3 ][ 1 ] + 0.054; // w górę o wysokość ślizgu (na razie tak) + while( sm->Parent ) { + if( sm->Parent->GetMatrix() ) + m = *sm->Parent->GetMatrix() * m; + sm = sm->Parent; + } + pants[ i ].fParamPants->vPos.z = + m[ 3 ][ 0 ]; // przesunięcie w bok (asymetria) + pants[ i ].fParamPants->vPos.y = + m[ 3 ][ 1 ]; // przesunięcie w górę odczytane z modelu + } + } + else + ErrorLog( "Bad model: " + asFileName + " - missed submodel " + + asAnimName ); // brak ramienia + } + } } - else if (str == AnsiString("animpantrg1prefix:")) - { // prefiks ramion górnych 1 - str = Parser->GetNextSymbol(); - if (pants) - for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie - // str* - asAnimName = str.c_str() + to_string(i + 1); - pants[i].smElement[2] = mdModel->GetFromName(asAnimName.c_str()); - pants[i].smElement[2]->WillBeAnimated(); - } + + else if( token == "animpantrg1prefix:" ) { + // prefiks ramion górnych 1 + parser.getTokens(); parser >> token; + if( pants ) { + for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* + asAnimName = token + std::to_string( i + 1 ); + pants[ i ].smElement[ 2 ] = mdModel->GetFromName( asAnimName.c_str() ); + pants[ i ].smElement[ 2 ]->WillBeAnimated(); + } + } } - else if (str == AnsiString("animpantrg2prefix:")) - { // prefiks ramion górnych 2 - str = Parser->GetNextSymbol(); - if (pants) - for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie - // str* - asAnimName = str.c_str() + to_string(i + 1); - pants[i].smElement[3] = mdModel->GetFromName(asAnimName.c_str()); - pants[i].smElement[3]->WillBeAnimated(); - } + + else if( token == "animpantrg2prefix:" ) { + // prefiks ramion górnych 2 + parser.getTokens(); parser >> token; + if( pants ) { + for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* + asAnimName = token + std::to_string( i + 1 ); + pants[ i ].smElement[ 3 ] = mdModel->GetFromName( asAnimName.c_str() ); + pants[ i ].smElement[ 3 ]->WillBeAnimated(); + } + } } - else if (str == AnsiString("animpantslprefix:")) - { // prefiks ślizgaczy - str = Parser->GetNextSymbol(); - if (pants) - for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie - // str* - asAnimName = str.c_str() + to_string(i + 1); - pants[i].smElement[4] = mdModel->GetFromName(asAnimName.c_str()); - pants[i].smElement[4]->WillBeAnimated(); - pants[i].yUpdate = UpdatePant; - pants[i].fMaxDist = 300 * 300; // nie podnosić w większej odległości - pants[i].iNumber = i; - } + + else if( token == "animpantslprefix:" ) { + // prefiks ślizgaczy + parser.getTokens(); parser >> token; + if( pants ) { + for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie + // str* + asAnimName = token + std::to_string( i + 1 ); + pants[ i ].smElement[ 4 ] = mdModel->GetFromName( asAnimName.c_str() ); + pants[ i ].smElement[ 4 ]->WillBeAnimated(); +/* pants[ i ].yUpdate = UpdatePant; +*/ pants[ i ].yUpdate = std::bind( &TDynamicObject::UpdatePant, this, std::placeholders::_1 ); + pants[ i ].fMaxDist = 300 * 300; // nie podnosić w większej odległości + pants[ i ].iNumber = i; + } + } } - else if (str == AnsiString("pantfactors:")) - { // Winger 010304: + else if( token == "pantfactors:" ) { + // Winger 010304: // parametry pantografow - double pant1x = Parser->GetNextSymbol().ToDouble(); - double pant2x = Parser->GetNextSymbol().ToDouble(); - double pant1h = Parser->GetNextSymbol().ToDouble(); // wysokość pierwszego - // ślizgu - double pant2h = Parser->GetNextSymbol().ToDouble(); // wysokość drugiego ślizgu - if (pant1h > 0.5) - pant1h = pant2h; // tu może być zbyt duża wartość + double pant1x, pant2x, pant1h, pant2h; + parser.getTokens( 4, false ); + parser + >> pant1x + >> pant2x + >> pant1h // wysokość pierwszego ślizgu + >> pant2h;// wysokość drugiego ślizgu + if( pant1h > 0.5 ) { + pant1h = pant2h; // tu może być zbyt duża wartość + } if ((pant1x < 0) && (pant2x > 0)) // pierwsza powinna być dodatnia, a druga ujemna { pant1x = -pant1x; pant2x = -pant2x; } - if (pants) - for (int i = 0; i < iAnimType[ANIM_PANTS]; ++i) - { // 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 = - pants[i].fParamPants->fAngleU0; // początkowy kąt - // pants[i].fParamPants->PantWys=1.22*sin(pants[i].fParamPants->fAngleL)+1.755*sin(pants[i].fParamPants->fAngleU); - // //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 - pants[i].fParamPants->vPos.x = (i & 1) ? pant2x : pant1x; - pants[i].fParamPants->fHeight = - (i & 1) ? pant2h : - pant1h; // wysokość ślizgu jest zapisana w MMD - } - pants[i].fParamPants->PantWys = - pants[i].fParamPants->fLenL1 * sin(pants[i].fParamPants->fAngleL) + - pants[i].fParamPants->fLenU1 * sin(pants[i].fParamPants->fAngleU) + - pants[i].fParamPants->fHeight; // wysokość początkowa - // pants[i].fParamPants->vPos.y=panty-panth-pants[i].fParamPants->PantWys; - // //np. 4.429-0.097=4.332=~4.335 - // pants[i].fParamPants->vPos.z=0; //niezerowe dla pantografów - // asymetrycznych - pants[i].fParamPants->PantTraction = pants[i].fParamPants->PantWys; - pants[i].fParamPants->fWidth = - 0.5 * - MoverParameters->EnginePowerSource.CollectorParameters - .CSW; // połowa szerokości ślizgu; jest w "Power: CSW=" - } + if( pants ) { + for( int i = 0; i < iAnimType[ ANIM_PANTS ]; ++i ) { // 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 = + pants[ i ].fParamPants->fAngleU0; // początkowy kąt + // pants[i].fParamPants->PantWys=1.22*sin(pants[i].fParamPants->fAngleL)+1.755*sin(pants[i].fParamPants->fAngleU); + // //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 + pants[ i ].fParamPants->vPos.x = ( i & 1 ) ? pant2x : pant1x; + pants[ i ].fParamPants->fHeight = + ( i & 1 ) ? pant2h : + pant1h; // wysokość ślizgu jest zapisana w MMD + } + pants[ i ].fParamPants->PantWys = + pants[ i ].fParamPants->fLenL1 * sin( pants[ i ].fParamPants->fAngleL ) + + pants[ i ].fParamPants->fLenU1 * sin( pants[ i ].fParamPants->fAngleU ) + + pants[ i ].fParamPants->fHeight; // wysokość początkowa + // pants[i].fParamPants->vPos.y=panty-panth-pants[i].fParamPants->PantWys; + // //np. 4.429-0.097=4.332=~4.335 + // pants[i].fParamPants->vPos.z=0; //niezerowe dla pantografów + // asymetrycznych + pants[ i ].fParamPants->PantTraction = pants[ i ].fParamPants->PantWys; + pants[ i ].fParamPants->fWidth = + 0.5 * + MoverParameters->EnginePowerSource.CollectorParameters + .CSW; // połowa szerokości ślizgu; jest w "Power: CSW=" + } + } } - else if (str == AnsiString("animpistonprefix:")) - { // prefiks tłoczysk - // - na razie - // używamy modeli - // pantografów - str = Parser->GetNextSymbol(); - for (int i = 1; i <= 2; i++) + + else if (token == "animpistonprefix:") { + // prefiks tłoczysk - na razie używamy modeli pantografów + parser.getTokens(1, false); parser >> token; + for( int i = 1; i <= 2; ++i ) { // asAnimName=str+i; // smPatykird1[i-1]=mdModel->GetFromName(asAnimName.c_str()); // smPatykird1[i-1]->WillBeAnimated(); } } - else if (str == AnsiString("animconrodprefix:")) - { // prefiks korbowodów - na - // razie używamy modeli - // pantografów - str = Parser->GetNextSymbol(); - for (int i = 1; i <= 2; i++) + + else if( token == "animconrodprefix:" ) { + // prefiks korbowodów - na razie używamy modeli pantografów + parser.getTokens(); parser >> token; + for( int i = 1; i <= 2; i++ ) { // asAnimName=str+i; // smPatykirg1[i-1]=mdModel->GetFromName(asAnimName.c_str()); // smPatykirg1[i-1]->WillBeAnimated(); } } - else if (str == AnsiString("pistonfactors:")) - { // Ra: parametry + + else if( token == "pistonfactors:" ) { + // Ra: parametry // silnika parowego // (tłoka) /* //Ra: tymczasowo wyłączone ze względu na porządkowanie animacji @@ -4942,44 +4932,45 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, 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 - str = Parser->GetNextSymbol(); - for (int i = 1; i <= 2; i++) + + else if( token == "animreturnprefix:" ) { + // prefiks drążka mimośrodowego - na razie używamy modeli pantografów + parser.getTokens(1, false); parser >> token; + for( int i = 1; i <= 2; i++ ) { // asAnimName=str+i; // smPatykird2[i-1]=mdModel->GetFromName(asAnimName.c_str()); // smPatykird2[i-1]->WillBeAnimated(); } } - else if (str == AnsiString("animexplinkprefix:")) // animreturnprefix: - { // prefiks jarzma - na razie używamy modeli pantografów - str = Parser->GetNextSymbol(); - for (int i = 1; i <= 2; i++) + + else if (token == "animexplinkprefix:"){ // animreturnprefix: + // prefiks jarzma - na razie używamy modeli pantografów + parser.getTokens(1, false); parser >> token; + for( int i = 1; i <= 2; i++ ) { // asAnimName=str+i; // smPatykirg2[i-1]=mdModel->GetFromName(asAnimName.c_str()); // smPatykirg2[i-1]->WillBeAnimated(); } } - else if (str == AnsiString("animpendulumprefix:")) - { // prefiks wahaczy - str = Parser->GetNextSymbol(); - asAnimName = ""; + + else if( token == "animpendulumprefix:" ) { + // prefiks wahaczy + parser.getTokens(); parser >> token; + asAnimName = ""; for (int i = 1; i <= 4; i++) { // McZapkie-050402: wyszukiwanie max 4 // wahaczy o nazwie str* - asAnimName = str.c_str() + to_string(i); + asAnimName = token + std::to_string(i); smWahacze[i - 1] = mdModel->GetFromName(asAnimName.c_str()); smWahacze[i - 1]->WillBeAnimated(); } - str = Parser->GetNextSymbol().LowerCase(); - if (str == AnsiString("pendulumamplitude:")) - fWahaczeAmp = Parser->GetNextSymbol().ToDouble(); + parser.getTokens(); parser >> token; + if( token == "pendulumamplitude:" ) { + parser.getTokens( 1, false ); + parser >> fWahaczeAmp; + } } /* else if (str == AnsiString("engineer:")) @@ -4998,15 +4989,16 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, // smMechanik0->WillBeAnimated(); //to będziemy go obracać } */ - else if (str == AnsiString("animdoorprefix:")) - { // nazwa animowanych drzwi + + else if( token == "animdoorprefix:" ) { + // nazwa animowanych drzwi int i, j, k, m; - str = Parser->GetNextSymbol(); + parser.getTokens(1, false); parser >> token; for (i = 0, j = 0; i < ANIM_DOORS; ++i) j += iAnimType[i]; // zliczanie wcześniejszych animacji for (i = 0; i < iAnimType[ANIM_DOORS]; ++i) // liczba drzwi { // NBMX wrzesien 2003: wyszukiwanie drzwi o nazwie str* - asAnimName = str.c_str() + to_string(i + 1); + asAnimName = token + std::to_string(i + 1); pAnimations[i + j].smAnimated = mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu if (pAnimations[i + j].smAnimated) @@ -5019,284 +5011,376 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, // potrzebny typ // animacji case 1: - pAnimations[i + j].yUpdate = UpdateDoorTranslate; +/* pAnimations[i + j].yUpdate = UpdateDoorTranslate; +*/ pAnimations[ i + j ].yUpdate = std::bind( &TDynamicObject::UpdateDoorTranslate, this, std::placeholders::_1 ); break; case 2: - pAnimations[i + j].yUpdate = UpdateDoorRotate; +/* pAnimations[i + j].yUpdate = UpdateDoorRotate; +*/ pAnimations[ i + j ].yUpdate = std::bind( &TDynamicObject::UpdateDoorRotate, this, std::placeholders::_1 ); break; case 3: - pAnimations[i + j].yUpdate = UpdateDoorFold; +/* pAnimations[i + j].yUpdate = UpdateDoorFold; +*/ pAnimations[ i + j ].yUpdate = std::bind( &TDynamicObject::UpdateDoorFold, this, std::placeholders::_1 ); break; // obrót 3 kolejnych submodeli case 4: - pAnimations[i + j].yUpdate = UpdateDoorPlug; +/* pAnimations[i + j].yUpdate = UpdateDoorPlug; +*/ pAnimations[ i + j ].yUpdate = std::bind( &TDynamicObject::UpdateDoorPlug, this, std::placeholders::_1 ); + break; + default: break; } - pAnimations[i + j].iNumber = - i; // parzyste działają inaczej niż nieparzyste + pAnimations[i + j].iNumber = i; // parzyste działają inaczej niż nieparzyste pAnimations[i + j].fMaxDist = 300 * 300; // drzwi to z daleka widać - pAnimations[i + j].fSpeed = - random(150); // oryginalny koncept z DoorSpeedFactor + 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 } } } - } + + } while( ( token != "" ) + && ( token != "endmodels" ) ); + } - else if (str == AnsiString("sounds:")) // dzwieki - while (!Parser->EndOfFile && str != AnsiString("endsounds")) - { - str = Parser->GetNextSymbol().LowerCase(); - if (str == AnsiString("wheel_clatter:")) // polozenia osi w/m srodka pojazdu + + else if( token == "sounds:" ) { + // dzwieki + do { + token = ""; + parser.getTokens(); parser >> token; + if( token == "wheel_clatter:" ){ + // polozenia osi w/m srodka pojazdu + parser.getTokens( 1, false ); + parser >> dSDist; + for( int i = 0; i < iAxles; i++ ) { + parser.getTokens( 1, false ); + parser >> dWheelsPosition[ i ]; + parser.getTokens(); + parser >> token; + if( token != "end" ) { + rsStukot[ i ].Init( token, dSDist, GetPosition().x, + GetPosition().y + dWheelsPosition[ i ], GetPosition().z, + true ); + } + } + if( token != "end" ) { + // TODO: double-check if this if() and/or retrieval makes sense here + parser.getTokens( 1, false ); parser >> token; + } + } + + else if( ( token == "engine:" ) + && ( MoverParameters->Power > 0 ) ) { + // plik z dzwiekiem silnika, mnozniki i ofsety amp. i czest. + double attenuation; + parser.getTokens( 2, false ); + parser + >> token + >> attenuation; + rsSilnik.Init( + token, attenuation, + GetPosition().x, GetPosition().y, GetPosition().z, + true, true ); + if( rsSilnik.GetWaveTime() == 0 ) { + ErrorLog( "Missed sound: \"" + token + "\" for " + asFileName ); + } + parser.getTokens( 1, false ); + parser >> rsSilnik.AM; + if( MoverParameters->EngineType == DieselEngine ) { + + rsSilnik.AM /= ( MoverParameters->Power + MoverParameters->nmax * 60 ); + } + else if( MoverParameters->EngineType == DieselElectric ) { + + rsSilnik.AM /= ( MoverParameters->Power * 3 ); + } + else { + + rsSilnik.AM /= ( MoverParameters->Power + MoverParameters->nmax * 60 + MoverParameters->Power + MoverParameters->Power ); + } + parser.getTokens( 3, false ); + parser + >> rsSilnik.AA + >> rsSilnik.FM // MoverParameters->nmax; + >> rsSilnik.FA; + } + + else if( ( token == "ventilator:" ) + && ( ( MoverParameters->EngineType == ElectricSeriesMotor ) + || ( MoverParameters->EngineType == ElectricInductionMotor ) ) ) { + // plik z dzwiekiem wentylatora, mnozniki i ofsety amp. i czest. + double attenuation; + parser.getTokens( 2, false ); + parser + >> token + >> attenuation; + rsWentylator.Init( + token, attenuation, + GetPosition().x, GetPosition().y, GetPosition().z, + true, true ); + parser.getTokens( 4, false ); + parser + >> rsWentylator.AM + >> rsWentylator.AA + >> rsWentylator.FM + >> rsWentylator.FA; + rsWentylator.AM /= MoverParameters->RVentnmax; + rsWentylator.FM /= MoverParameters->RVentnmax; + } + + else if( ( token == "transmission:" ) + && ( MoverParameters->EngineType == ElectricSeriesMotor ) ) { + // plik z dzwiekiem, mnozniki i ofsety amp. i czest. + double attenuation; + parser.getTokens( 2, false ); + parser + >> token + >> attenuation; + rsPrzekladnia.Init( + token, attenuation, + GetPosition().x, GetPosition().y, GetPosition().z, + true ); + rsPrzekladnia.AM = 0.029; + rsPrzekladnia.AA = 0.1; + rsPrzekladnia.FM = 0.005; + rsPrzekladnia.FA = 1.0; + } + + else if( token == "brake:" ){ + // plik z piskiem hamulca, mnozniki i ofsety amplitudy. + double attenuation; + parser.getTokens( 2, false ); + parser + >> token + >> attenuation; + rsPisk.Init( + token, attenuation, + GetPosition().x, GetPosition().y, GetPosition().z, + true ); + rsPisk.AM = parser.getToken(); + rsPisk.AA = parser.getToken() * ( 105 - Random( 10 ) ) / 100; + rsPisk.FM = 1.0; + rsPisk.FA = 0.0; + } + + else if( token == "brakeacc:" ) { + // plik z przyspieszaczem (upust po zlapaniu hamowania) + // sBrakeAcc.Init(str.c_str(),Parser->GetNextSymbol().ToDouble(),GetPosition().x,GetPosition().y,GetPosition().z,true); + parser.getTokens( 1, false ); parser >> token; + sBrakeAcc = TSoundsManager::GetFromName( token.c_str(), true ); + bBrakeAcc = true; + // sBrakeAcc.AM=1.0; + // sBrakeAcc.AA=0.0; + // sBrakeAcc.FM=1.0; + // sBrakeAcc.FA=0.0; + } + + else if( token == "unbrake:" ) { + // plik z piskiem hamulca, mnozniki i ofsety amplitudy. + double attenuation; + parser.getTokens( 2, false ); + parser + >> token + >> attenuation; + rsUnbrake.Init( + token, attenuation, + GetPosition().x, GetPosition().y, GetPosition().z, + true ); + rsUnbrake.AM = 1.0; + rsUnbrake.AA = 0.0; + rsUnbrake.FM = 1.0; + rsUnbrake.FA = 0.0; + } + + else if( token == "derail:" ) { + // dzwiek przy wykolejeniu + double attenuation; + parser.getTokens( 2, false ); + parser + >> token + >> attenuation; + rsDerailment.Init( + token, attenuation, + GetPosition().x, GetPosition().y, GetPosition().z, + true ); + rsDerailment.AM = 1.0; + rsDerailment.AA = 0.0; + rsDerailment.FM = 1.0; + rsDerailment.FA = 0.0; + } + + else if( token == "dieselinc:" ) { + // dzwiek przy wlazeniu na obroty woodwarda + double attenuation; + parser.getTokens( 2, false ); + parser + >> token + >> attenuation; + rsDiesielInc.Init( + token, attenuation, + GetPosition().x, GetPosition().y, GetPosition().z, + true ); + rsDiesielInc.AM = 1.0; + rsDiesielInc.AA = 0.0; + rsDiesielInc.FM = 1.0; + rsDiesielInc.FA = 0.0; + } + + else if( token == "curve:" ) { + + double attenuation; + parser.getTokens( 2, false ); + parser + >> token + >> attenuation; + rscurve.Init( + token, attenuation, + GetPosition().x, GetPosition().y, GetPosition().z, + true ); + rscurve.AM = 1.0; + rscurve.AA = 0.0; + rscurve.FM = 1.0; + rscurve.FA = 0.0; + } + + else if( token == "horn1:" ) { + // pliki z trabieniem + sHorn1.Load( parser, GetPosition() ); + } + + else if( token == "horn2:" ) { + // pliki z trabieniem wysokoton. + sHorn2.Load( parser, GetPosition() ); + if( iHornWarning ) { + iHornWarning = 2; // numer syreny do użycia po otrzymaniu sygnału do jazdy + } + } + + else if( token == "departuresignal:" ) { + // pliki z sygnalem odjazdu + sDepartureSignal.Load( parser, GetPosition() ); + } + + else if( token == "pantographup:" ) { + // pliki dzwiekow pantografow + parser.getTokens( 1, false ); parser >> token; + sPantUp.Init( + 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:" ) { + // pliki dzwiekow pantografow + parser.getTokens( 1, false ); parser >> token; + sPantDown.Init( + 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:" ) { + // pliki ze sprezarka + sCompressor.Load( parser, GetPosition() ); + } + + else if( token == "converter:" ) { + // pliki z przetwornica + // if (MoverParameters->EngineType==DieselElectric) //będzie modulowany? + sConverter.Load( parser, GetPosition() ); + } + + else if( token == "turbo:" ) { + // pliki z turbogeneratorem + sTurbo.Load( parser, GetPosition() ); + } + + else if( token == "small-compressor:" ) { + // pliki z przetwornica + sSmallCompressor.Load( parser, GetPosition() ); + } + + else if( token == "dooropen:" ) { + + parser.getTokens( 1, false ); parser >> token; + rsDoorOpen.Init( + 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:" ) { + + parser.getTokens( 1, false ); parser >> token; + rsDoorClose.Init( + 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:" ) { + // pliki z piasecznica + sSand.Load( parser, GetPosition() ); + } + + else if( token == "releaser:" ) { + // pliki z odluzniaczem + sReleaser.Load( parser, GetPosition() ); + } + + } while( ( token != "" ) + && ( token != "endsounds" ) ); + + } + + else if (token == "internaldata:") { + // dalej nie czytaj + do { + // zbieranie informacji o kabinach + token = ""; + parser.getTokens(); parser >> token; + if(token == "cab0model:") { - dSDist = Parser->GetNextSymbol().ToDouble(); - for (int i = 0; i < iAxles; i++) - { - str = Parser->GetNextSymbol(); - dWheelsPosition[i] = str.ToDouble(); - str = Parser->GetNextSymbol().LowerCase(); - if (str != AnsiString("end")) - rsStukot[i].Init(str.c_str(), dSDist, GetPosition().x, - GetPosition().y + dWheelsPosition[i], GetPosition().z, - true); - } - if (str != AnsiString("end")) - str = Parser->GetNextSymbol(); + parser.getTokens(); parser >> token; + if( token != "none" ) { iCabs = 2; } } - else if ((str == AnsiString("engine:")) && - (MoverParameters->Power > 0)) // plik z dzwiekiem silnika, - // mnozniki i ofsety amp. i - // czest. + else if (token == "cab1model:") { - str = Parser->GetNextSymbol(); - rsSilnik.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), GetPosition().x, - GetPosition().y, GetPosition().z, true, true); - if (rsSilnik.GetWaveTime() == 0) - ErrorLog("Missed sound: \"" + string(str.c_str()) + "\" for " + asFileName); - if (MoverParameters->EngineType == DieselEngine) - rsSilnik.AM = Parser->GetNextSymbol().ToDouble() / - (MoverParameters->Power + MoverParameters->nmax * 60); - else if (MoverParameters->EngineType == DieselElectric) - rsSilnik.AM = - Parser->GetNextSymbol().ToDouble() / (MoverParameters->Power * 3); - else - rsSilnik.AM = Parser->GetNextSymbol().ToDouble() / - (MoverParameters->Power + MoverParameters->nmax * 60 + - MoverParameters->Power + MoverParameters->Power); - rsSilnik.AA = Parser->GetNextSymbol().ToDouble(); - rsSilnik.FM = Parser->GetNextSymbol().ToDouble(); // MoverParameters->nmax; - rsSilnik.FA = Parser->GetNextSymbol().ToDouble(); + parser.getTokens(); parser >> token; + if( token != "none" ) { iCabs = 1; } } - else if (((str == AnsiString("ventilator:")) && - ((MoverParameters->EngineType == ElectricSeriesMotor) || - (MoverParameters->EngineType == - ElectricInductionMotor)))) // plik z dzwiekiem - // wentylatora, mnozniki i - // ofsety amp. i czest. + else if (token == "cab2model:") { - str = Parser->GetNextSymbol(); - rsWentylator.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), - GetPosition().x, GetPosition().y, GetPosition().z, true, - true); - rsWentylator.AM = - Parser->GetNextSymbol().ToDouble() / MoverParameters->RVentnmax; - rsWentylator.AA = Parser->GetNextSymbol().ToDouble(); - rsWentylator.FM = - Parser->GetNextSymbol().ToDouble() / MoverParameters->RVentnmax; - rsWentylator.FA = Parser->GetNextSymbol().ToDouble(); + parser.getTokens(); parser >> token; + if( token != "none" ) { iCabs = 4; } } - else if ((str == AnsiString("transmission:")) && - (MoverParameters->EngineType == - ElectricSeriesMotor)) // plik z dzwiekiem, mnozniki i ofsety - // amp. i czest. - { - str = Parser->GetNextSymbol(); - rsPrzekladnia.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), - GetPosition().x, GetPosition().y, GetPosition().z, true); - rsPrzekladnia.AM = 0.029; - rsPrzekladnia.AA = 0.1; - rsPrzekladnia.FM = 0.005; - rsPrzekladnia.FA = 1.0; - } - 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, - GetPosition().y, GetPosition().z, true); - rsPisk.AM = Parser->GetNextSymbol().ToDouble(); - rsPisk.AA = Parser->GetNextSymbol().ToDouble() * (105 - random(10)) / 100; - rsPisk.FM = 1.0; - rsPisk.FA = 0.0; - } - 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); - sBrakeAcc = TSoundsManager::GetFromName(str.c_str(), true); - bBrakeAcc = true; - // sBrakeAcc.AM=1.0; - // sBrakeAcc.AA=0.0; - // sBrakeAcc.FM=1.0; - // sBrakeAcc.FA=0.0; - } - 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, - GetPosition().y, GetPosition().z, true); - rsUnbrake.AM = 1.0; - rsUnbrake.AA = 0.0; - rsUnbrake.FM = 1.0; - rsUnbrake.FA = 0.0; - } - else if (str == AnsiString("derail:")) // dzwiek przy wykolejeniu - { - str = Parser->GetNextSymbol(); - rsDerailment.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), - GetPosition().x, GetPosition().y, GetPosition().z, true); - rsDerailment.AM = 1.0; - rsDerailment.AA = 0.0; - rsDerailment.FM = 1.0; - rsDerailment.FA = 0.0; - } - else if (str == AnsiString("dieselinc:")) // dzwiek przy wlazeniu na obroty - // woodwarda - { - str = Parser->GetNextSymbol(); - rsDiesielInc.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), - GetPosition().x, GetPosition().y, GetPosition().z, true); - rsDiesielInc.AM = 1.0; - rsDiesielInc.AA = 0.0; - rsDiesielInc.FM = 1.0; - rsDiesielInc.FA = 0.0; - } - else if (str == AnsiString("curve:")) - { - str = Parser->GetNextSymbol(); - rscurve.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), GetPosition().x, - GetPosition().y, GetPosition().z, true); - rscurve.AM = 1.0; - rscurve.AA = 0.0; - rscurve.FM = 1.0; - rscurve.FA = 0.0; - } - else if (str == AnsiString("horn1:")) // pliki z trabieniem - { - sHorn1.Load(Parser, GetPosition()); - } - if (str == AnsiString("horn2:")) // pliki z trabieniem wysokoton. - { - sHorn2.Load(Parser, GetPosition()); - if (iHornWarning) - iHornWarning = 2; // numer syreny do użycia po otrzymaniu sygnału do jazdy - } - if (str == AnsiString("departuresignal:")) // pliki z sygnalem odjazdu - { - sDepartureSignal.Load(Parser, GetPosition()); - } - if (str == AnsiString("pantographup:")) // pliki dzwiekow pantografow - { - str = Parser->GetNextSymbol(); - sPantUp.Init(str.c_str(), 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; - } - if (str == AnsiString("pantographdown:")) // pliki dzwiekow pantografow - { - str = Parser->GetNextSymbol(); - sPantDown.Init(str.c_str(), 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 (str == AnsiString("compressor:")) // pliki ze sprezarka - { - sCompressor.Load(Parser, GetPosition()); - } - else if (str == AnsiString("converter:")) // pliki z przetwornica - { - // if (MoverParameters->EngineType==DieselElectric) //będzie - // modulowany? - sConverter.Load(Parser, GetPosition()); - } - else if (str == AnsiString("turbo:")) // pliki z turbogeneratorem - { - sTurbo.Load(Parser, GetPosition()); - } - else if (str == AnsiString("small-compressor:")) // pliki z przetwornica - { - sSmallCompressor.Load(Parser, GetPosition()); - } - else if (str == AnsiString("dooropen:")) - { - str = Parser->GetNextSymbol(); - rsDoorOpen.Init(str.c_str(), 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 (str == AnsiString("doorclose:")) - { - str = Parser->GetNextSymbol(); - rsDoorClose.Init(str.c_str(), 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 (str == AnsiString("sand:")) // pliki z piasecznica - { - sSand.Load(Parser, GetPosition()); - } - else if (str == AnsiString("releaser:")) // pliki z odluzniaczem - { - sReleaser.Load(Parser, GetPosition()); - } - } - else if (str == AnsiString("internaldata:")) // dalej nie czytaj - { - while (!Parser->EndOfFile) - { // zbieranie informacji o kabinach - str = Parser->GetNextSymbol().LowerCase(); - if (str == "cab0model:") - { - str = Parser->GetNextSymbol(); - if (str != "none") - iCabs = 2; - } - else if (str == "cab1model:") - { - str = Parser->GetNextSymbol(); - if (str != "none") - iCabs = 1; - } - else if (str == "cab2model:") - { - str = Parser->GetNextSymbol(); - if (str != "none") - iCabs = 4; - } - } - Stop_InternalData = true; + + } while( token != "" ); + + Stop_InternalData = true; } - } - // ABu 050205 - tego wczesniej nie bylo i uciekala pamiec: - delete Parser; - if (mdModel) + + } while( ( token != "" ) + && ( false == Stop_InternalData ) ); + + if (mdModel) mdModel->Init(); // obrócenie modelu oraz optymalizacja, również zapisanie // binarnego if (mdLoad) @@ -5306,8 +5390,7 @@ void TDynamicObject::LoadMMediaFile(string BaseDir, string TypeName, if (mdLowPolyInt) mdLowPolyInt->Init(); // sHorn2.CopyIfEmpty(sHorn1); //żeby jednak trąbił też drugim - Global::asCurrentTexturePath = - string(szTexturePath); // kiedyś uproszczone wnętrze mieszało tekstury nieba + Global::asCurrentTexturePath = szTexturePath; // kiedyś uproszczone wnętrze mieszało tekstury nieba } //--------------------------------------------------------------------------- @@ -5662,9 +5745,9 @@ int TDynamicObject::RouteWish(TTrack *tr) return Mechanik ? Mechanik->CrossRoute(tr) : 0; // wg AI albo prosto }; -string TDynamicObject::TextureTest(string &name) +std::string TDynamicObject::TextureTest(std::string const &name) { // Ra 2015-01: sprawdzenie dostępności tekstury o podanej nazwie - string x = name + ".dds"; // na razie prymitywnie + std::string x = name + ".dds"; // na razie prymitywnie if (FileExists(x.c_str())) return x; else @@ -5682,7 +5765,7 @@ string TDynamicObject::TextureTest(string &name) return ""; // nie znaleziona }; -void TDynamicObject::DestinationSet(string to, string numer) +void TDynamicObject::DestinationSet(std::string to, std::string numer) { // ustawienie stacji // docelowej oraz wymiennej // tekstury 4, jeśli @@ -5696,17 +5779,16 @@ void TDynamicObject::DestinationSet(string to, string numer) numer = Global::Bezogonkow(numer); asDestination = to; to = Global::Bezogonkow(to); // do szukania pliku obcinamy ogonki - string x; - x = TextureTest(asBaseDir + numer + "@" + MoverParameters->TypeName); + std::string x = TextureTest(asBaseDir + numer + "@" + MoverParameters->TypeName); if (!x.empty()) { - ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się + ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x, 9); // rozmywania 0,1,4,5 nie nadają się return; } x = TextureTest(asBaseDir + numer ); if (!x.empty()) { - ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się + ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x, 9); // rozmywania 0,1,4,5 nie nadają się return; } if (to.empty()) @@ -5714,17 +5796,17 @@ void TDynamicObject::DestinationSet(string to, string numer) x = TextureTest(asBaseDir + to + "@" + MoverParameters->TypeName); // w pierwszej kolejności z nazwą FIZ/MMD if (!x.empty()) { - ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się + ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x, 9); // rozmywania 0,1,4,5 nie nadają się return; } x = TextureTest(asBaseDir + to); // na razie prymitywnie if (!x.empty()) - ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x.c_str(), 9); // rozmywania 0,1,4,5 nie nadają się + ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x, 9); // rozmywania 0,1,4,5 nie nadają się else { x = TextureTest(asBaseDir + "nowhere"); // jak nie znalazł dedykowanej, to niech daje nowhere if (!x.empty()) - ReplacableSkinID[4] = TTexturesManager::GetTextureID(NULL, NULL, x.c_str(), 9); + ReplacableSkinID[4] = TTexturesManager::GetTextureID(NULL, NULL, x, 9); } // Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa // tekstury nr 4 diff --git a/DynObj.h b/DynObj.h index 0766feaf..8cfa62c5 100644 --- a/DynObj.h +++ b/DynObj.h @@ -7,42 +7,36 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef DynObjH -#define DynObjH +#pragma once + +#include +#include -#include "Classes.h" #include "TrkFoll.h" -#include "QueryParserComp.hpp" -#include "Mover.h" -#include "TractionPower.h" // McZapkie: -#include "MdlMngr.h" #include "RealSound.h" #include "AdvSound.h" #include "Button.h" #include "AirCoupler.h" -#include - -using namespace std; - //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- -const ANIM_TYPES = 7; // Ra: ilość typów animacji -const ANIM_WHEELS = 0; // koła -const ANIM_DOORS = 1; // drzwi -const ANIM_LEVERS = 2; // elementy obracane (wycieraczki, koła skrętne, przestawiacze, klocki ham.) -const ANIM_BUFFERS = 3; // elementy przesuwane (zderzaki) -const ANIM_BOOGIES = 4; // wózki (są skręcane w dwóch osiach) -const ANIM_PANTS = 5; // pantografy -const ANIM_STEAMS = 6; // napęd parowozu +int const ANIM_TYPES = 7; // Ra: ilość typów animacji +int const ANIM_WHEELS = 0; // koła +int const ANIM_DOORS = 1; // drzwi +int const ANIM_LEVERS = 2; // elementy obracane (wycieraczki, koła skrętne, przestawiacze, klocki ham.) +int const ANIM_BUFFERS = 3; // elementy przesuwane (zderzaki) +int const ANIM_BOOGIES = 4; // wózki (są skręcane w dwóch osiach) +int const ANIM_PANTS = 5; // pantografy +int const ANIM_STEAMS = 6; // napęd parowozu class TAnim; -typedef void(__closure *TUpdate)(TAnim *pAnim); // typ funkcji aktualizującej położenie submodeli +//typedef void(__closure *TUpdate)(TAnim *pAnim); // typ funkcji aktualizującej położenie submodeli +typedef std::function TUpdate; // __closure is Borland-specific extension // McZapkie-250202 -const MaxAxles = 16; // ABu 280105: zmienione z 8 na 16 +int const MaxAxles = 16; // ABu 280105: zmienione z 8 na 16 // const MaxAnimatedAxles=16; //i to tez. // const MaxAnimatedDoors=16; //NBMX wrzesien 2003 /* @@ -335,7 +329,7 @@ class TDynamicObject void ABuScanObjects(int ScanDir, double ScanDist); protected: - TDynamicObject * ABuFindObject(TTrack *Track, int ScanDir, Byte &CouplFound, + TDynamicObject * ABuFindObject(TTrack *Track, int ScanDir, BYTE &CouplFound, double &dist); void ABuCheckMyTrack(); @@ -469,7 +463,7 @@ class TDynamicObject // void UpdatePos(); // McZapkie-260202 - void LoadMMediaFile(string BaseDir, string TypeName, string ReplacableSkin); + void LoadMMediaFile(std::string BaseDir, std::string TypeName, std::string ReplacableSkin); inline double ABuGetDirection() // ABu. { @@ -512,10 +506,9 @@ class TDynamicObject int RouteWish(TTrack *tr); // zapytanie do AI, po którym segmencie skrzyżowania // jechać void DestinationSet(std::string to, std::string numer); - std::string TextureTest(std::string &name); + std::string TextureTest(std::string const &name); void OverheadTrack(float o); double MED[9][8]; // lista zmiennych do debugowania hamulca ED }; //--------------------------------------------------------------------------- -#endif diff --git a/EU07.cpp b/EU07.cpp index 908b3141..dd229f29 100644 --- a/EU07.cpp +++ b/EU07.cpp @@ -16,80 +16,28 @@ Authors: MarcinW, McZapkie, Shaxbee, ABu, nbmx, youBy, Ra, winger, mamut, Q424, Stele, firleju, szociu, hunter, ZiomalCl, OLI_EU and others */ -#include "opengl/glew.h" -#include "opengl/glut.h" -#include "opengl/ARB_Multisample.h" -#include "system.hpp" -#include "classes.hpp" -#include "Globals.h" -#include "Console.h" -#include "QueryParserComp.hpp" -#include "Mover.h" -#include "Logs.h" -#pragma hdrstop +#include "stdafx.h" #include //_clear87() itp. -USERES("EU07.res"); -USEUNIT("dumb3d.cpp"); -USEUNIT("Camera.cpp"); -USEUNIT("Texture.cpp"); -USEUNIT("World.cpp"); -USELIB("opengl\glut32.lib"); -USELIB("omf_python27.lib"); -USEUNIT("Model3d.cpp"); -USEUNIT("MdlMngr.cpp"); -USEUNIT("Train.cpp"); -USEUNIT("wavread.cpp"); -USEUNIT("Timer.cpp"); -USEUNIT("Event.cpp"); -USEUNIT("MemCell.cpp"); -USEUNIT("Logs.cpp"); -USELIB("DirectX\Dsound.lib"); -USEUNIT("Spring.cpp"); -USEUNIT("Button.cpp"); -USEUNIT("Globals.cpp"); -USEUNIT("Gauge.cpp"); -USEUNIT("AnimModel.cpp"); -USEUNIT("Ground.cpp"); -USEUNIT("TrkFoll.cpp"); -USEUNIT("Segment.cpp"); -USEUNIT("Sound.cpp"); -USEUNIT("AdvSound.cpp"); -USEUNIT("Track.cpp"); -USEUNIT("DynObj.cpp"); -USEUNIT("RealSound.cpp"); -USEUNIT("EvLaunch.cpp"); -USEUNIT("QueryParserComp.pas"); -USEUNIT("FadeSound.cpp"); -USEUNIT("Traction.cpp"); -USEUNIT("TractionPower.cpp"); -USEUNIT("parser.cpp"); -USEUNIT("sky.cpp"); -USEUNIT("AirCoupler.cpp"); -USEUNIT("opengl\glew.c"); -USEUNIT("ResourceManager.cpp"); -USEUNIT("VBO.cpp"); -USEUNIT("mtable.cpp"); -USEUNIT("TextureDDS.cpp"); -USEUNIT("opengl\ARB_Multisample.cpp"); -USEUNIT("Float3d.cpp"); -USEUNIT("Classes.cpp"); -USEUNIT("Driver.cpp"); -USEUNIT("Names.cpp"); -USEUNIT("Console.cpp"); -USEUNIT("McZapkie\Mover.cpp"); -USEUNIT("McZapkie\hamulce.cpp"); -USEUNIT("McZapkie\Oerlikon_ESt.cpp"); -USEUNIT("McZapkie\friction.cpp"); -USEUNIT("McZapkie\mctools.cpp"); -USEUNIT("Console\PoKeys55.cpp"); -USEUNIT("Forth.cpp"); -USEUNIT("Console\LPT.cpp"); -USEUNIT("PyInt.cpp"); -//--------------------------------------------------------------------------- +#include "opengl/glew.h" +#include "opengl/wglew.h" +#include "opengl/ARB_Multisample.h" + +#include "Globals.h" +#include "Console.h" +#include "Logs.h" #include "World.h" +#include "Mover.h" + +#pragma comment( lib, "glew32.lib" ) +#pragma comment( lib, "glu32.lib" ) +#pragma comment( lib, "opengl32.lib" ) +#pragma comment( lib, "dsound.lib" ) +#pragma comment( lib, "winmm.lib" ) +#pragma comment( lib, "setupapi.lib" ) +#pragma comment( lib, "python27.lib" ) HDC hDC = NULL; // Private GDI Device Context HGLRC hRC = NULL; // Permanent Rendering Context @@ -452,7 +400,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, // handle for this window WPARAM wParam, // additional message information LPARAM lParam) // additional message information { - TRect rect; + RECT rect; switch (uMsg) // check for windows messages { case WM_PASTE: //[Ctrl]+[V] potrzebujemy do innych celów @@ -623,18 +571,13 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance LPSTR lpCmdLine, // command line parameters int nCmdShow) // window show state { +#ifdef _MSC_VER + _CrtSetDbgFlag( _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ) | _CRTDBG_LEAK_CHECK_DF ); +#endif + MSG msg; // windows message structure BOOL done = FALSE; // bool variable to exit loop fullscreen = true; - DecimalSeparator = '.'; - /* //Ra: tutaj to nie działa - zwraca NULL - //najpierw ustalmy wersję OpenGL - AnsiString glver=((char*)glGetString(GL_VERSION)); - while (glver.LastDelimiter(".")>glver.Pos(".")) - glver=glver.SubString(1,glver.LastDelimiter(".")-1); //obcięcie od drugiej kropki - try {Global::fOpenGL=glver.ToDouble();} catch (...) {Global::fOpenGL=0.0;} - Global::bOpenGL_1_5=(Global::fOpenGL>=1.5); - */ DeleteFile("errors.txt"); // usunięcie starego Global::LoadIniFile("eu07.ini"); // teraz dopiero można przejrzeć plik z ustawieniami Global::InitKeys("keys.ini"); // wczytanie mapowania klawiszy - jest na stałe @@ -645,31 +588,31 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance AllocConsole(); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN); } - AnsiString str = lpCmdLine; // parametry uruchomienia - if (!str.IsEmpty()) + std::string commandline( lpCmdLine ); // parametry uruchomienia + if( false == commandline.empty() ) { // analizowanie parametrów - TQueryParserComp *Parser; - Parser = new TQueryParserComp(NULL); - Parser->TextToParse = lpCmdLine; - Parser->First(); - while (!Parser->EndOfFile) - { - str = Parser->GetNextSymbol().LowerCase(); - if (str == AnsiString("-s")) + cParser parser( commandline ); + std::string token; + do { + parser.getTokens(); + token.clear(); + parser >> token; + + if( token == "-s" ) { // nazwa scenerii - str = Parser->GetNextSymbol().LowerCase(); - strcpy(Global::szSceneryFile, str.c_str()); + parser.getTokens(); + parser >> Global::SceneryFile; } - else if (str == AnsiString("-v")) + else if( token == "-v") { // nazwa wybranego pojazdu - str = Parser->GetNextSymbol().LowerCase(); - Global::asHumanCtrlVehicle = str.c_str(); + parser.getTokens(); + parser >> Global::asHumanCtrlVehicle; } - else if (str == AnsiString("-modifytga")) + else if( token == "-modifytga" ) { // wykonanie modyfikacji wszystkich plików TGA Global::iModifyTGA = -1; // specjalny tryb wykonania totalnej modyfikacji } - else if (str == AnsiString("-e3d")) + else if( token == "-e3d" ) { // wygenerowanie wszystkich plików E3D if (Global::iConvertModels > 0) Global::iConvertModels = -Global::iConvertModels; // specjalny tryb @@ -680,8 +623,8 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance Error( "Program usage: EU07 [-s sceneryfilepath] [-v vehiclename] [-modifytga] [-e3d]", !Global::iWriteLogEnabled); - } - delete Parser; // ABu 050205: tego wczesniej nie bylo + } + while( false == token.empty() ); } /* MC: usunalem tymczasowo bo sie gryzlo z nowym parserem - 8.6.2003 AnsiString csp=AnsiString(Global::szSceneryFile); diff --git a/EvLaunch.cpp b/EvLaunch.cpp index 2bcb4683..bd989e9f 100644 --- a/EvLaunch.cpp +++ b/EvLaunch.cpp @@ -13,17 +13,16 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#pragma hdrstop - +#include "stdafx.h" +#include "EvLaunch.h" +#include "Globals.h" +#include "Logs.h" +#include "Usefull.h" +#include "McZapkie/mctools.h" +#include "Event.h" +#include "MemCell.h" #include "mtable.h" #include "Timer.h" -#include "Globals.h" -#include "EvLaunch.h" -#include "Event.h" - -#include "Usefull.h" -#include "MemCell.h" #include "parser.h" #include "Console.h" @@ -79,8 +78,8 @@ bool TEventLauncher::Load(cParser *parser) iMinute = int(DeltaTime) % 100; // minuty są najmłodszymi cyframi dziesietnymi iHour = int(DeltaTime - iMinute) / 100; // godzina to setki DeltaTime = 0; // bez powtórzeń - WriteLog("EventLauncher at " + to_string(iHour) + ":" + - to_string(iMinute)); // wyświetlenie czasu + WriteLog("EventLauncher at " + std::to_string(iHour) + ":" + + std::to_string(iMinute)); // wyświetlenie czasu } parser->getTokens(); *parser >> token; @@ -189,5 +188,3 @@ bool TEventLauncher::IsGlobal() return false; }; //--------------------------------------------------------------------------- - -#pragma package(smart_init) diff --git a/EvLaunch.h b/EvLaunch.h index 64e8bd57..5446d4d0 100644 --- a/EvLaunch.h +++ b/EvLaunch.h @@ -10,10 +10,8 @@ http://mozilla.org/MPL/2.0/. #ifndef EvLaunchH #define EvLaunchH -#include "Classes.h" #include - -using namespace std; +#include "Classes.h" class TEventLauncher { @@ -27,9 +25,9 @@ class TEventLauncher int iHour, iMinute; // minuta uruchomienia public: double dRadius; - string asEvent1Name; - string asEvent2Name; - string asMemCellName; + std::string asEvent1Name; + std::string asEvent2Name; + std::string asMemCellName; TEvent *Event1; TEvent *Event2; TMemCell *MemCell; diff --git a/Event.cpp b/Event.cpp index 08cd8092..7be970cc 100644 --- a/Event.cpp +++ b/Event.cpp @@ -13,19 +13,16 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "Event.h" +#include "Globals.h" +#include "Logs.h" +#include "Usefull.h" #include "parser.h" #include "Timer.h" -#include "Usefull.h" #include "MemCell.h" -#include "Globals.h" #include "Ground.h" #include "McZapkie\mctools.h" -#pragma package(smart_init) TEvent::TEvent(string m) { @@ -491,12 +488,16 @@ void TEvent::Load(cParser *parser, vector3 *org) } else if (token.substr(token.length() - 4, 4) == ".vmd") // na razie tu, może będzie inaczej { // animacja z pliku VMD - TFileStream *fs = new TFileStream("models\\" + AnsiString(token.c_str()), fmOpenRead); - Params[7].asInt = fs->Size; - Params[8].asPointer = new char[fs->Size]; - fs->Read(Params[8].asPointer, fs->Size); // wczytanie pliku - delete fs; - parser->getTokens(); +// TFileStream *fs = new TFileStream( "models\\" + AnsiString( token.c_str() ), fmOpenRead ); + { + std::ifstream file( "models\\" + token, std::ios::binary | std::ios::ate ); file.unsetf( std::ios::skipws ); + auto size = file.tellg(); // ios::ate already positioned us at the end of the file + file.seekg( 0, std::ios::beg ); // rewind the caret afterwards + Params[ 7 ].asInt = size; + Params[8].asPointer = new char[size]; + file.read( static_cast(Params[ 8 ].asPointer), size ); // wczytanie pliku + } + parser->getTokens(); *parser >> token; Params[9].asText = new char[255]; // nazwa submodelu strcpy(Params[9].asText, token.c_str()); diff --git a/Event.h b/Event.h index 057919a3..8070ea95 100644 --- a/Event.h +++ b/Event.h @@ -7,16 +7,13 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef EventH -#define EventH +#pragma once -#include -#include "Classes.h" -#include "dumb3d.h" #include +#include "dumb3d.h" +#include "Classes.h" using namespace Math3D; -using namespace std; typedef enum { @@ -85,7 +82,7 @@ union TParam class TEvent // zmienne: ev* { // zdarzenie private: - void Conditions(cParser *parser, string s); + void Conditions(cParser *parser, std::string s); public: std::string asName; @@ -100,16 +97,16 @@ class TEvent // zmienne: ev* TDynamicObject *Activator; TParam Params[13]; // McZapkie-070502 //Ra: zamienić to na union/struct unsigned int iFlags; // zamiast Params[8] z flagami warunku - string asNodeName; // McZapkie-100302 - dodalem zeby zapamietac nazwe toru + std::string asNodeName; // McZapkie-100302 - dodalem zeby zapamietac nazwe toru TEvent *evJoined; // kolejny event z tą samą nazwą - od wersji 378 double fRandomDelay; // zakres dodatkowego opóźnienia public: // metody - TEvent(string m = ""); + TEvent(std::string m = ""); ~TEvent(); void Init(); void Load(cParser *parser, vector3 *org); void AddToQuery(TEvent *e); - string CommandGet(); + std::string CommandGet(); TCommandType Command(); double ValueGet(int n); vector3 PositionGet(); @@ -119,4 +116,3 @@ class TEvent // zmienne: ev* }; //--------------------------------------------------------------------------- -#endif diff --git a/FadeSound.cpp b/FadeSound.cpp index f369d85d..2a7dc9ed 100644 --- a/FadeSound.cpp +++ b/FadeSound.cpp @@ -12,12 +12,9 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - -#include "Timer.h" +#include "stdafx.h" #include "FadeSound.h" +#include "Timer.h" TFadeSound::TFadeSound() { @@ -101,5 +98,3 @@ void TFadeSound::Volume(long vol) } //--------------------------------------------------------------------------- - -#pragma package(smart_init) diff --git a/Float3d.cpp b/Float3d.cpp index f449390c..2f82507e 100644 --- a/Float3d.cpp +++ b/Float3d.cpp @@ -7,15 +7,11 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include -#pragma hdrstop - +#include "stdafx.h" #include "float3d.h" //--------------------------------------------------------------------------- -#pragma package(smart_init) - void float4x4::Quaternion(float4 *q) { // konwersja kwaternionu obrotu na macierz obrotu float xx = q->x * q->x, yy = q->y * q->y, zz = q->z * q->z; diff --git a/Float3d.h b/Float3d.h index a6bbb376..5b9cdd6b 100644 --- a/Float3d.h +++ b/Float3d.h @@ -7,9 +7,9 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef float3dH -#define float3dH -#include +#pragma once + +#include //--------------------------------------------------------------------------- class float3 @@ -130,6 +130,7 @@ inline float4 Normalize(const float4 &v) else return v / sqrt(l); // pierwiastek liczony tylko jeśli trzeba wykonać dzielenia }; +inline float Dot(const float4 &q1, const float4 &q2) { // iloczyn skalarny return q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w; @@ -304,6 +305,7 @@ inline float Det3x3(float a1, float a2, float a3, float b1, float b2, float b3, return +a1 * Det2x2(b2, b3, c2, c3) - b1 * Det2x2(a2, a3, c2, c3) + c1 * Det2x2(a2, a3, b2, b3); }; +inline float Det(const float4x4 &m) { // obliczenie wyznacznika macierzy 4×4 float a1 = m[0][0], a2 = m[1][0], a3 = m[2][0], a4 = m[3][0]; @@ -315,5 +317,3 @@ float Det(const float4x4 &m) c1 * Det3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4) - d1 * Det3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4); }; - -#endif diff --git a/Gauge.cpp b/Gauge.cpp index 9c65a502..c0ea2c10 100644 --- a/Gauge.cpp +++ b/Gauge.cpp @@ -13,15 +13,11 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - -#include "Timer.h" -#include "QueryParserComp.hpp" -#include "Model3d.h" +#include "stdafx.h" #include "Gauge.h" -#include "Console.h" +#include "Timer.h" +#include "parser.h" +#include "Model3d.h" TGauge::TGauge() { @@ -78,14 +74,18 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, } }; -bool TGauge::Load(TQueryParserComp *Parser, TModel3d *md1, TModel3d *md2, double mul) +bool TGauge::Load(cParser &Parser, TModel3d *md1, TModel3d *md2, double mul) { - AnsiString str1 = Parser->GetNextSymbol(); - AnsiString str2 = Parser->GetNextSymbol().LowerCase(); - double val3 = Parser->GetNextSymbol().ToDouble() * mul; - double val4 = Parser->GetNextSymbol().ToDouble(); - double val5 = Parser->GetNextSymbol().ToDouble(); - TSubModel *sm = md1->GetFromName(str1.c_str()); + std::string str1 = Parser.getToken(false); + std::string str2 = Parser.getToken(); + Parser.getTokens( 3, false ); + double val3, val4, val5; + Parser + >> val3 + >> val4 + >> val5; + val3 *= mul; + TSubModel *sm = md1->GetFromName( str1.c_str() ); if (sm) // jeśli nie znaleziony md2 = NULL; // informacja, że znaleziony else if (md2) // a jest podany drugi model (np. zewnętrzny) @@ -171,8 +171,9 @@ 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 +/* std::string n = FormatFloat( "0000000000", floor( fValue ) ); // na razie tak trochę bez sensu +*/ 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) @@ -224,5 +225,3 @@ void TGauge::UpdateValue() }; //--------------------------------------------------------------------------- - -#pragma package(smart_init) diff --git a/Gauge.h b/Gauge.h index 703c3f4b..891c9c73 100644 --- a/Gauge.h +++ b/Gauge.h @@ -7,14 +7,9 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef GaugeH -#define GaugeH +#pragma once -//#include "Classes.h" -#include "QueryParserComp.hpp" -// class Queryparsercomp::TQueryParserComp; -class TSubModel; -class TModel3d; +#include "Classes.h" typedef enum { // typ ruchu @@ -50,7 +45,7 @@ class TGauge // zmienne "gg" void Clear(); void Init(TSubModel *NewSubModel, TGaugeType eNewTyp, double fNewScale = 1, double fNewOffset = 0, double fNewFriction = 0, double fNewValue = 0); - bool Load(TQueryParserComp *Parser, TModel3d *md1, TModel3d *md2 = NULL, double mul = 1.0); + bool Load(cParser &Parser, TModel3d *md1, TModel3d *md2 = NULL, double mul = 1.0); void PermIncValue(double fNewDesired); void IncValue(double fNewDesired); void DecValue(double fNewDesired); @@ -70,4 +65,3 @@ class TGauge // zmienne "gg" }; //--------------------------------------------------------------------------- -#endif diff --git a/Globals.cpp b/Globals.cpp index b9b115a9..ce0dc899 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -12,22 +12,16 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "Globals.h" -#include "QueryParserComp.hpp" #include "usefull.h" -#include "Mover.h" +//#include "Mover.h" #include "Driver.h" #include "Console.h" -#include //do odczytu daty #include "World.h" -#include -#include -#include -#include -#include +#include "parser.h" +#include "Logs.h" +#include "PyInt.h" // namespace Global { @@ -73,7 +67,6 @@ bool Global::bActive = true; // czy jest aktywnym oknem int Global::iErorrCounter = 0; // licznik sprawdzań do śledzenia błędów OpenGL int Global::iTextures = 0; // licznik użytych tekstur TWorld *Global::pWorld = NULL; -Queryparsercomp::TQueryParserComp *Global::qParser = NULL; cParser *Global::pParser = NULL; int Global::iSegmentsRendered = 90; // ilość segmentów do regulacji wydajności TCamera *Global::pCamera = NULL; // parametry kamery @@ -119,14 +112,14 @@ bool Global::bFullScreen = false; bool Global::bInactivePause = true; // automatyczna pauza, gdy okno nieaktywne float Global::fMouseXScale = 1.5; float Global::fMouseYScale = 0.2; -char Global::szSceneryFile[256] = "td.scn"; +std::string Global::SceneryFile = "td.scn"; std::string Global::asHumanCtrlVehicle = "EU07-424"; int Global::iMultiplayer = 0; // blokada działania niektórych funkcji na rzecz komunikacji double Global::fMoveLight = -1; // ruchome światło double Global::fLatitudeDeg = 52.0; // szerokość geograficzna float Global::fFriction = 1.0; // mnożnik tarcia - KURS90 double Global::fBrakeStep = 1.0; // krok zmiany hamulca dla klawiszy [Num3] i [Num9] -AnsiString Global::asLang = "pl"; // domyślny język - http://tools.ietf.org/html/bcp47 +std::string Global::asLang = "pl"; // domyślny język - http://tools.ietf.org/html/bcp47 // parametry wydajnościowe (np. regulacja FPS, szybkość wczytywania) bool Global::bAdjustScreenFreq = true; @@ -196,348 +189,464 @@ int Global::iBpp = 32; // chyba ju //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- -AnsiString Global::GetNextSymbol() +std::string Global::GetNextSymbol() { // pobranie tokenu z aktualnego parsera - if (qParser) - return qParser->EndOfFile ? AnsiString("endconfig") : qParser->GetNextSymbol(); - if (pParser) - { - std::string token; + + std::string token; + if( pParser != nullptr ) { + pParser->getTokens(); *pParser >> token; - return AnsiString(token.c_str()); }; - return ""; + return token; }; void Global::LoadIniFile(std::string asFileName) { - int i; - for (i = 0; i < 10; ++i) + for ( int i = 0; i < 10; ++i) { // zerowanie pozycji kamer pFreeCameraInit[i] = vector3(0, 0, 0); // współrzędne w scenerii pFreeCameraInitAngle[i] = vector3(0, 0, 0); // kąty obrotu w radianach } - ifstream f = ifstream(asFileName.c_str()); - stringstream buffer; - buffer << f.rdbuf(); - //TFileStream *fs; - // fs = new TFileStream(asFileName, fmOpenRead | fmShareCompat); - // if (!fs) - // return; - AnsiString str = AnsiString(buffer.str().c_str()); - //int size = fs->Size; - //str.SetLength(size); - //fs->Read(str.c_str(), size); - // str+=""; - //delete fs; - TQueryParserComp *Parser; - Parser = new TQueryParserComp(NULL); - Parser->TextToParse = str; - // Parser->LoadStringToParse(asFile); - Parser->First(); - ConfigParse(Parser); - delete Parser; // Ra: tego jak zwykle nie było wcześniej :] + cParser parser( asFileName, cParser::buffer_FILE ); + ConfigParse( parser ); }; -void Global::ConfigParse(TQueryParserComp *qp, cParser *cp) -{ // Ra: trzeba by przerobić na cParser, żeby to działało w scenerii - pParser = cp; - qParser = qp; - AnsiString str; - int i; - do - { - str = GetNextSymbol().LowerCase(); - if (str == AnsiString("sceneryfile")) - { - str = GetNextSymbol().LowerCase(); - strcpy(szSceneryFile, str.c_str()); - } - else if (str == AnsiString("humanctrlvehicle")) - { - str = GetNextSymbol().LowerCase(); - asHumanCtrlVehicle = string(str.c_str()); - } - else if (str == AnsiString("width")) - iWindowWidth = GetNextSymbol().ToInt(); - else if (str == AnsiString("height")) - iWindowHeight = GetNextSymbol().ToInt(); - else if (str == AnsiString("heightbase")) - fDistanceFactor = GetNextSymbol().ToInt(); - else if (str == AnsiString("bpp")) - iBpp = ((GetNextSymbol().LowerCase() == AnsiString("32")) ? 32 : 16); - else if (str == AnsiString("fullscreen")) - bFullScreen = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("freefly")) // Mczapkie-130302 - { - bFreeFly = (GetNextSymbol().LowerCase() == AnsiString("yes")); - pFreeCameraInit[0].x = GetNextSymbol().ToDouble(); - pFreeCameraInit[0].y = GetNextSymbol().ToDouble(); - pFreeCameraInit[0].z = GetNextSymbol().ToDouble(); - } - else if (str == AnsiString("wireframe")) - bWireFrame = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("debugmode")) // McZapkie! - DebugModeFlag uzywana w mover.pas, - // warto tez blokowac cheaty gdy false - DebugModeFlag = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("soundenabled")) // McZapkie-040302 - blokada dzwieku - przyda - // sie do debugowania oraz na komp. bez karty - // dzw. - bSoundEnabled = (GetNextSymbol().LowerCase() == AnsiString("yes")); - // else if (str==AnsiString("renderalpha")) //McZapkie-1312302 - dwuprzebiegowe renderowanie - // bRenderAlpha=(GetNextSymbol().LowerCase()==AnsiString("yes")); - else if (str == AnsiString("physicslog")) // McZapkie-030402 - logowanie parametrow - // fizycznych dla kazdego pojazdu z maszynista - WriteLogFlag = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("physicsdeactivation")) // McZapkie-291103 - usypianie fizyki - PhysicActivationFlag = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("debuglog")) - { // McZapkie-300402 - wylaczanie log.txt - str = GetNextSymbol().LowerCase(); - if (str == "yes") - iWriteLogEnabled = 3; - else if (str == "no") - iWriteLogEnabled = 0; - else - iWriteLogEnabled = str.ToIntDef(3); - } - else if (str == AnsiString("adjustscreenfreq")) - { // McZapkie-240403 - czestotliwosc odswiezania ekranu - str = GetNextSymbol(); - bAdjustScreenFreq = (str.LowerCase() == AnsiString("yes")); - } - else if (str == AnsiString("mousescale")) - { // McZapkie-060503 - czulosc ruchu myszy (krecenia glowa) - str = GetNextSymbol(); - fMouseXScale = str.ToDouble(); - str = GetNextSymbol(); - fMouseYScale = str.ToDouble(); - } - else if (str == AnsiString("enabletraction")) - { // Winger 040204 - 'zywe' patyki dostosowujace sie do trakcji; Ra 2014-03: teraz łamanie - bEnableTraction = (GetNextSymbol().LowerCase() == AnsiString("yes")); - } - else if (str == AnsiString("loadtraction")) - { // Winger 140404 - ladowanie sie trakcji - bLoadTraction = (GetNextSymbol().LowerCase() == AnsiString("yes")); - } - else if (str == AnsiString("friction")) // mnożnik tarcia - KURS90 - fFriction = GetNextSymbol().ToDouble(); - else if (str == AnsiString("livetraction")) - { // Winger 160404 - zaleznosc napiecia loka od trakcji; Ra 2014-03: teraz prąd przy braku - // sieci - bLiveTraction = (GetNextSymbol().LowerCase() == AnsiString("yes")); - } - else if (str == AnsiString("skyenabled")) - { // youBy - niebo - if (GetNextSymbol().LowerCase() == AnsiString("yes")) - asSky = "1"; - else - asSky = "0"; - } - else if (str == AnsiString("managenodes")) - { - bManageNodes = (GetNextSymbol().LowerCase() == AnsiString("yes")); - } - else if (str == AnsiString("decompressdds")) - { - bDecompressDDS = (GetNextSymbol().LowerCase() == AnsiString("yes")); - } - // ShaXbee - domyslne rozszerzenie tekstur - else if (str == AnsiString("defaultext")) - { - str = GetNextSymbol().LowerCase(); // rozszerzenie - if (str == "tga") - szDefaultExt = szTexturesTGA; // domyślnie od TGA - // szDefaultExt=AnsiString(Parser->GetNextSymbol().LowerCase().c_str()); - } - else if (str == AnsiString("newaircouplers")) - bnewAirCouplers = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("defaultfiltering")) - iDefaultFiltering = GetNextSymbol().ToIntDef(-1); - else if (str == AnsiString("ballastfiltering")) - iBallastFiltering = GetNextSymbol().ToIntDef(-1); - else if (str == AnsiString("railprofiltering")) - iRailProFiltering = GetNextSymbol().ToIntDef(-1); - else if (str == AnsiString("dynamicfiltering")) - iDynamicFiltering = GetNextSymbol().ToIntDef(-1); - else if (str == AnsiString("usevbo")) - bUseVBO = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("feedbackmode")) - iFeedbackMode = GetNextSymbol().ToIntDef(1); // domyślnie 1 - else if (str == AnsiString("feedbackport")) - iFeedbackPort = GetNextSymbol().ToIntDef(0); // domyślnie 0 - else if (str == AnsiString("multiplayer")) - iMultiplayer = GetNextSymbol().ToIntDef(0); // domyślnie 0 - else if (str == AnsiString("maxtexturesize")) - { // wymuszenie przeskalowania tekstur - i = GetNextSymbol().ToIntDef(16384); // domyślnie duże - if (i <= 64) - iMaxTextureSize = 64; - else if (i <= 128) - iMaxTextureSize = 128; - else if (i <= 256) - iMaxTextureSize = 256; - else if (i <= 512) - iMaxTextureSize = 512; - else if (i <= 1024) - iMaxTextureSize = 1024; - else if (i <= 2048) - iMaxTextureSize = 2048; - else if (i <= 4096) - iMaxTextureSize = 4096; - else if (i <= 8192) - iMaxTextureSize = 8192; - else - iMaxTextureSize = 16384; - } - else if (str == AnsiString("doubleambient")) // podwójna jasność ambient - bDoubleAmbient = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("movelight")) // numer dnia w roku albo -1 - { - fMoveLight = GetNextSymbol().ToIntDef(-1); // numer dnia 1..365 - if (fMoveLight == 0.0) - { // pobranie daty z systemu - unsigned short y, m, d; - TDate date = Now(); - date.DecodeDate(&y, &m, &d); - fMoveLight = - (double)date - (double)TDate(y, 1, 1) + 1; // numer bieżącego dnia w roku - } - if (fMoveLight > 0.0) // tu jest nadal zwiększone o 1 - { // obliczenie deklinacji wg: - // http://naturalfrequency.com/Tregenza_Sharples/Daylight_Algorithms/algorithm_1_11.htm - // Spencer J W Fourier series representation of the position of the sun Search 2 (5) - // 172 (1971) - fMoveLight = M_PI / 182.5 * (Global::fMoveLight - 1.0); // numer dnia w postaci kąta - fSunDeclination = 0.006918 - 0.3999120 * cos(fMoveLight) + - 0.0702570 * sin(fMoveLight) - 0.0067580 * cos(2 * fMoveLight) + - 0.0009070 * sin(2 * fMoveLight) - - 0.0026970 * cos(3 * fMoveLight) + 0.0014800 * sin(3 * fMoveLight); - } - } - else if (str == AnsiString("smoothtraction")) // podwójna jasność ambient - bSmoothTraction = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("timespeed")) // przyspieszenie czasu, zmienna do testów - fTimeSpeed = GetNextSymbol().ToIntDef(1); - else if (str == AnsiString("multisampling")) // tryb antyaliasingu: 0=brak,1=2px,2=4px - iMultisampling = GetNextSymbol().ToIntDef(2); // domyślnie 2 - else if (str == AnsiString("glutfont")) // tekst generowany przez GLUT - bGlutFont = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("latitude")) // szerokość geograficzna - fLatitudeDeg = GetNextSymbol().ToDouble(); - else if (str == AnsiString("convertmodels")) // tworzenie plików binarnych - iConvertModels = GetNextSymbol().ToIntDef(7); // domyślnie 7 - else if (str == AnsiString("inactivepause")) // automatyczna pauza, gdy okno nieaktywne - bInactivePause = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("slowmotion")) // tworzenie plików binarnych - iSlowMotionMask = GetNextSymbol().ToIntDef(-1); // domyślnie -1 - else if (str == AnsiString("modifytga")) // czy korygować pliki TGA dla szybszego - // wczytywania - iModifyTGA = GetNextSymbol().ToIntDef(0); // domyślnie 0 - else if (str == AnsiString("hideconsole")) // hunter-271211: ukrywanie konsoli - bHideConsole = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("oldsmudge")) - bOldSmudge = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == - AnsiString( - "rollfix")) // Ra: poprawianie przechyłki, aby wewnętrzna szyna była "pozioma" - bRollFix = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("fpsaverage")) // oczekiwana wartosć FPS - fFpsAverage = GetNextSymbol().ToDouble(); - else if (str == AnsiString("fpsdeviation")) // odchylenie standardowe FPS - fFpsDeviation = GetNextSymbol().ToDouble(); - else if (str == AnsiString("fpsradiusmax")) // maksymalny promień renderowania - fFpsRadiusMax = GetNextSymbol().ToDouble(); - else if (str == AnsiString("calibratein")) // parametry kalibracji wejść - { // - i = GetNextSymbol().ToIntDef(-1); // numer wejścia - if ((i < 0) || (i > 5)) - i = 5; // na ostatni, bo i tak trzeba pominąć wartości - fCalibrateIn[i][0] = GetNextSymbol().ToDouble(); // wyraz wolny - fCalibrateIn[i][1] = GetNextSymbol().ToDouble(); // mnożnik - fCalibrateIn[i][2] = GetNextSymbol().ToDouble(); // mnożnik dla kwadratu - fCalibrateIn[i][3] = GetNextSymbol().ToDouble(); // mnożnik dla sześcianu - fCalibrateIn[i][4] = 0.0; // mnożnik 4 potęgi - fCalibrateIn[i][5] = 0.0; // mnożnik 5 potęgi +void Global::ConfigParse(cParser &Parser) { + + std::string token; + do { + + token = ""; + Parser.getTokens(); Parser >> token; + + if( token == "sceneryfile" ) { + + Parser.getTokens(); Parser >> Global::SceneryFile; } - else if (str == AnsiString("calibrate5din")) // parametry kalibracji wejść - { // - i = GetNextSymbol().ToIntDef(-1); // numer wejścia - if ((i < 0) || (i > 5)) - i = 5; // na ostatni, bo i tak trzeba pominąć wartości - fCalibrateIn[i][0] = GetNextSymbol().ToDouble(); // wyraz wolny - fCalibrateIn[i][1] = GetNextSymbol().ToDouble(); // mnożnik - fCalibrateIn[i][2] = GetNextSymbol().ToDouble(); // mnożnik dla kwadratu - fCalibrateIn[i][3] = GetNextSymbol().ToDouble(); // mnożnik dla sześcianu - fCalibrateIn[i][4] = GetNextSymbol().ToDouble(); // mnożnik 4 potęgi - fCalibrateIn[i][5] = GetNextSymbol().ToDouble(); // mnożnik 5 potęgi + else if( token == "humanctrlvehicle" ) { + + Parser.getTokens(); Parser >> Global::asHumanCtrlVehicle; } - else if (str == AnsiString("calibrateout")) // parametry kalibracji wyjść - { // - i = GetNextSymbol().ToIntDef(-1); // numer wejścia - if ((i < 0) || (i > 6)) - i = 6; // na ostatni, bo i tak trzeba pominąć wartości - fCalibrateOut[i][0] = GetNextSymbol().ToDouble(); // wyraz wolny - fCalibrateOut[i][1] = GetNextSymbol().ToDouble(); // mnożnik liniowy - fCalibrateOut[i][2] = GetNextSymbol().ToDouble(); // mnożnik dla kwadratu - fCalibrateOut[i][3] = GetNextSymbol().ToDouble(); // mnożnik dla sześcianu - fCalibrateOut[i][4] = 0.0; // mnożnik dla 4 potęgi - fCalibrateOut[i][5] = 0.0; // mnożnik dla 5 potęgi + else if( token == "width" ) { + + Parser.getTokens( 1, false ); Parser >> Global::iWindowWidth; + } + else if( token == "height" ) { + + Parser.getTokens( 1, false ); Parser >> Global::iWindowHeight; + } + else if( token == "heightbase" ) { + + Parser.getTokens( 1, false ); Parser >> Global::fDistanceFactor; + } + else if( token == "bpp" ) { + + Parser.getTokens(); Parser >> token; + Global::iBpp = ( token == "32" ? 32 : 16 ); + } + else if( token == "fullscreen" ) { + + Parser.getTokens(); Parser >> token; + Global::bFullScreen = ( token == "yes" ); + } + else if( token == "freefly" ) { // Mczapkie-130302 + + Parser.getTokens(); Parser >> token; + Global::bFreeFly = ( token == "yes" ); + Parser.getTokens( 3, false ); + Parser >> + Global::pFreeCameraInit[ 0 ].x, + Global::pFreeCameraInit[ 0 ].y, + Global::pFreeCameraInit[ 0 ].z; + } + else if( token == "wireframe" ) { + + Parser.getTokens(); Parser >> token; + Global::bWireFrame = ( token == "yes" ); + } + else if( token == "debugmode" ) { // McZapkie! - DebugModeFlag uzywana w mover.pas, + // warto tez blokowac cheaty gdy false + Parser.getTokens(); Parser >> token; + DebugModeFlag = ( token == "yes" ); + } + else if( token == "soundenabled" ) { // McZapkie-040302 - blokada dzwieku - przyda + // sie do debugowania oraz na komp. bez karty + // dzw. + Parser.getTokens(); Parser >> token; + Global::bSoundEnabled = ( token == "yes" ); + } + // else if (str==AnsiString("renderalpha")) //McZapkie-1312302 - dwuprzebiegowe renderowanie + // bRenderAlpha=(GetNextSymbol().LowerCase()==AnsiString("yes")); + else if( token == "physicslog" ) { // McZapkie-030402 - logowanie parametrow + // fizycznych dla kazdego pojazdu z maszynista + Parser.getTokens(); Parser >> token; + WriteLogFlag = ( token == "yes" ); + } + else if( token == "physicsdeactivation" ) { // McZapkie-291103 - usypianie fizyki + + Parser.getTokens(); Parser >> token; + PhysicActivationFlag = ( token == "yes" ); + } + else if( token == "debuglog" ) { + // McZapkie-300402 - wylaczanie log.txt + Parser.getTokens(); Parser >> token; + if( token == "yes" ) { Global::iWriteLogEnabled = 3; } + else if( token == "no" ) { Global::iWriteLogEnabled = 0; } + else { Global::iWriteLogEnabled = std::atoi( token.c_str() ); } + } + else if( token == "adjustscreenfreq" ) { + // McZapkie-240403 - czestotliwosc odswiezania ekranu + Parser.getTokens(); Parser >> token; + Global::bAdjustScreenFreq = ( token == "yes" ); + } + else if( token == "mousescale" ) { + // McZapkie-060503 - czulosc ruchu myszy (krecenia glowa) + Parser.getTokens( 2, false ); + Parser + >> Global::fMouseXScale + >> Global::fMouseYScale; + } + else if( token == "enabletraction" ) { + // Winger 040204 - 'zywe' patyki dostosowujace sie do trakcji; Ra 2014-03: teraz łamanie + Parser.getTokens(); Parser >> token; + Global::bEnableTraction = ( token == "yes" ); + } + else if( token == "loadtraction" ) { + // Winger 140404 - ladowanie sie trakcji + Parser.getTokens(); Parser >> token; + Global::bLoadTraction = ( token == "yes" ); + } + else if( token == "friction" ) { // mnożnik tarcia - KURS90 + + Parser.getTokens( 1, false ); + Parser >> Global::fFriction; + } + else if( token == "livetraction" ) { + // Winger 160404 - zaleznosc napiecia loka od trakcji; + // Ra 2014-03: teraz prąd przy braku sieci + Parser.getTokens(); Parser >> token; + Global::bLiveTraction = ( token == "yes" ); + } + else if( token == "skyenabled" ) { + // youBy - niebo + Parser.getTokens(); Parser >> token; + Global::asSky = ( token == "yes" ? "1" : "0" ); + } + else if( token == "managenodes" ) { + + Parser.getTokens(); Parser >> token; + Global::bManageNodes = ( token == "yes" ); + } + else if( token == "decompressdds" ) { + + Parser.getTokens(); Parser >> token; + Global::bDecompressDDS = ( token == "yes" ); + } + else if( token == "defaultext" ) { + // ShaXbee - domyslne rozszerzenie tekstur + Parser.getTokens(); Parser >> token; + if( token == "tga" ) { + // domyślnie od TGA + Global::szDefaultExt = Global::szTexturesTGA; + } + } + else if( token == "newaircouplers" ) { + + Parser.getTokens(); Parser >> token; + Global::bnewAirCouplers = ( token == "yes" ); + } + else if( token == "defaultfiltering" ) { + + Parser.getTokens( 1, false ); + Parser >> Global::iDefaultFiltering; + } + else if( token == "ballastfiltering" ) { + + Parser.getTokens( 1, false ); + Parser >> Global::iBallastFiltering; + } + else if( token == "railprofiltering" ) { + + Parser.getTokens( 1, false ); + Parser >> Global::iRailProFiltering; + } + else if( token == "dynamicfiltering" ) { + + Parser.getTokens( 1, false ); + Parser >> Global::iDynamicFiltering; + } + else if( token == "usevbo" ) { + + Parser.getTokens(); Parser >> token; + Global::bUseVBO = ( token == "yes" ); + } + else if( token == "feedbackmode" ) { + + Parser.getTokens( 1, false ); + Parser >> Global::iFeedbackMode; + } + else if( token == "feedbackport" ) { + + Parser.getTokens( 1, false ); + Parser >> Global::iFeedbackPort; + } + else if( token == "multiplayer" ) { + + Parser.getTokens( 1, false ); + Parser >> Global::iMultiplayer; + } + else if( token == "maxtexturesize" ) { + // wymuszenie przeskalowania tekstur + Parser.getTokens( 1, false ); + int size; Parser >> size; + if( size <= 64 ) { Global::iMaxTextureSize = 64; } + else if( size <= 128 ) { Global::iMaxTextureSize = 128; } + else if( size <= 256 ) { Global::iMaxTextureSize = 256; } + else if( size <= 512 ) { Global::iMaxTextureSize = 512; } + else if( size <= 1024 ) { Global::iMaxTextureSize = 1024; } + else if( size <= 2048 ) { Global::iMaxTextureSize = 2048; } + else if( size <= 4096 ) { Global::iMaxTextureSize = 4096; } + else if( size <= 8192 ) { Global::iMaxTextureSize = 8192; } + else { Global::iMaxTextureSize = 16384; } + } + else if( token == "doubleambient" ) { + // podwójna jasność ambient + Parser.getTokens(); Parser >> token; + Global::bDoubleAmbient = ( token == "yes" ); + } + else if( token == "movelight" ) { + // numer dnia w roku albo -1 + Parser.getTokens( 1, false ); + Parser >> Global::fMoveLight; + if( Global::fMoveLight == 0.f ) { // pobranie daty z systemu + std::time_t timenow = std::time( 0 ); + std::tm *localtime = std::localtime( &timenow ); + Global::fMoveLight = localtime->tm_yday + 1; // numer bieżącego dnia w roku + } + if( Global::fMoveLight > 0.f ) // tu jest nadal zwiększone o 1 + { // obliczenie deklinacji wg: + // http://naturalfrequency.com/Tregenza_Sharples/Daylight_Algorithms/algorithm_1_11.htm + // Spencer J W Fourier series representation of the position of the sun Search 2 (5) + // 172 (1971) + Global::fMoveLight = M_PI / 182.5 * ( Global::fMoveLight - 1.0 ); // numer dnia w postaci kąta + fSunDeclination = 0.006918 - 0.3999120 * std::cos( fMoveLight ) + + 0.0702570 * std::sin( fMoveLight ) - 0.0067580 * std::cos( 2 * fMoveLight ) + + 0.0009070 * std::sin( 2 * fMoveLight ) - + 0.0026970 * std::cos( 3 * fMoveLight ) + 0.0014800 * std::sin( 3 * fMoveLight ); + } + } + else if( token == "smoothtraction" ) { + // podwójna jasność ambient + Parser.getTokens(); Parser >> token; + Global::bSmoothTraction = ( token == "yes" ); + } + else if( token == "timespeed" ) { + // przyspieszenie czasu, zmienna do testów + Parser.getTokens( 1, false ); + Parser >> Global::fTimeSpeed; + } + else if( token == "multisampling" ) { + // tryb antyaliasingu: 0=brak,1=2px,2=4px + Parser.getTokens( 1, false ); + Parser >> Global::iMultisampling; + } + else if( token == "glutfont" ) { + // tekst generowany przez GLUT + Parser.getTokens(); Parser >> token; + Global::bGlutFont = ( token == "yes" ); + } + else if( token == "latitude" ) { + // szerokość geograficzna + Parser.getTokens( 1, false ); + Parser >> Global::fLatitudeDeg; + } + else if( token == "convertmodels" ) { + // tworzenie plików binarnych + Parser.getTokens( 1, false ); + Parser >> Global::iConvertModels; + } + else if( token == "inactivepause" ) { + // automatyczna pauza, gdy okno nieaktywne + Parser.getTokens(); Parser >> token; + Global::bInactivePause = ( token == "yes" ); + } + else if( token == "slowmotion" ) { + // tworzenie plików binarnych + Parser.getTokens( 1, false ); + Parser >> Global::iSlowMotionMask; + } + else if( token == "modifytga" ) { + // czy korygować pliki TGA dla szybszego wczytywania + Parser.getTokens( 1, false ); + Parser >> Global::iModifyTGA; + } + else if( token == "hideconsole" ) { + // hunter-271211: ukrywanie konsoli + Parser.getTokens(); Parser >> token; + Global::bHideConsole = ( token == "yes" ); + } + else if( token == "oldsmudge" ) { + + Parser.getTokens(); Parser >> token; + Global::bOldSmudge = ( token == "yes" ); + } + else if( token == "rollfix" ) { + // Ra: poprawianie przechyłki, aby wewnętrzna szyna była "pozioma" + Parser.getTokens(); Parser >> token; + Global::bRollFix = ( token == "yes" ); + } + else if( token == "fpsaverage" ) { + // oczekiwana wartosć FPS + Parser.getTokens( 1, false ); + Parser >> Global::fFpsAverage; + } + else if( token == "fpsdeviation" ) { + // odchylenie standardowe FPS + Parser.getTokens( 1, false ); + Parser >> Global::fFpsDeviation; + } + else if( token == "fpsradiusmax" ) { + // maksymalny promień renderowania + Parser.getTokens( 1, false ); + Parser >> Global::fFpsRadiusMax; + } + else if(token == "calibratein"){ + // parametry kalibracji wejść + Parser.getTokens( 1, false ); + int in; Parser >> in; + if( ( in < 0 ) || ( in > 5 ) ) { + in = 5; // na ostatni, bo i tak trzeba pominąć wartości + } + Parser.getTokens( 4, false ); + Parser + >> Global::fCalibrateIn[ in ][ 0 ] // wyraz wolny + >> Global::fCalibrateIn[ in ][ 1 ] // mnożnik + >> Global::fCalibrateIn[ in ][ 2 ] // mnożnik dla kwadratu + >> Global::fCalibrateIn[ in ][ 3 ]; // mnożnik dla sześcianu + Global::fCalibrateIn[ in ][ 4 ] = 0.0; // mnożnik 4 potęgi + Global::fCalibrateIn[ in ][ 5 ] = 0.0; // mnożnik 5 potęgi + } + else if(token == "calibrate5din"){ + // parametry kalibracji wejść + Parser.getTokens( 1, false ); + int in; Parser >> in; + if( ( in < 0 ) || ( in > 5 ) ) { + in = 5; // na ostatni, bo i tak trzeba pominąć wartości + } + Parser.getTokens( 6, false ); + Parser + >> Global::fCalibrateIn[ in ][ 0 ] // wyraz wolny + >> Global::fCalibrateIn[ in ][ 1 ] // mnożnik + >> Global::fCalibrateIn[ in ][ 2 ] // mnożnik dla kwadratu + >> Global::fCalibrateIn[ in ][ 3 ] // mnożnik dla sześcianu + >> Global::fCalibrateIn[ in ][ 4 ] // mnożnik 4 potęgi + >> Global::fCalibrateIn[ in ][ 5 ]; // mnożnik 5 potęgi + } + else if(token == "calibrateout"){ + // parametry kalibracji wyjść + Parser.getTokens( 1, false ); + int out; Parser >> out; + if( ( out < 0 ) || ( out > 6 ) ) { + out = 6; // na ostatni, bo i tak trzeba pominąć wartości + } + Parser.getTokens( 4, false ); + Parser + >> Global::fCalibrateOut[ out ][ 0 ] // wyraz wolny + >> Global::fCalibrateOut[ out ][ 1 ] // mnożnik liniowy + >> Global::fCalibrateOut[ out ][ 2 ] // mnożnik dla kwadratu + >> Global::fCalibrateOut[ out ][ 3 ]; // mnożnik dla sześcianu + Global::fCalibrateOut[ out ][ 4 ] = 0.0; // mnożnik dla 4 potęgi + Global::fCalibrateOut[ out ][ 5 ] = 0.0; // mnożnik dla 5 potęgi } - else if (str == AnsiString("calibrate5dout")) // parametry kalibracji wyjść - { // - i = GetNextSymbol().ToIntDef(-1); // numer wejścia - if ((i < 0) || (i > 6)) - i = 6; // na ostatni, bo i tak trzeba pominąć wartości - fCalibrateOut[i][0] = GetNextSymbol().ToDouble(); // wyraz wolny - fCalibrateOut[i][1] = GetNextSymbol().ToDouble(); // mnożnik liniowy - fCalibrateOut[i][2] = GetNextSymbol().ToDouble(); // mnożnik dla kwadratu - fCalibrateOut[i][3] = GetNextSymbol().ToDouble(); // mnożnik dla sześcianu - fCalibrateOut[i][4] = GetNextSymbol().ToDouble(); // mnożnik dla 4 potęgi - fCalibrateOut[i][5] = GetNextSymbol().ToDouble(); // mnożnik dla 5 potęgi + else if(token == "calibrate5dout"){ + // parametry kalibracji wyjść + Parser.getTokens( 1, false ); + int out; Parser >> out; + if( ( out < 0 ) || ( out > 6 ) ) { + out = 6; // na ostatni, bo i tak trzeba pominąć wartości + } + Parser.getTokens( 6, false ); + Parser + >> Global::fCalibrateOut[ out ][ 0 ] // wyraz wolny + >> Global::fCalibrateOut[ out ][ 1 ] // mnożnik liniowy + >> Global::fCalibrateOut[ out ][ 2 ] // mnożnik dla kwadratu + >> Global::fCalibrateOut[ out ][ 3 ] // mnożnik dla sześcianu + >> Global::fCalibrateOut[ out ][ 4 ] // mnożnik dla 4 potęgi + >> Global::fCalibrateOut[ out ][ 5 ]; // mnożnik dla 5 potęgi } - else if (str == AnsiString("calibrateoutmaxvalues")) - { // maksymalne wartości jakie można wyświetlić na mierniku - fCalibrateOutMax[0] = GetNextSymbol().ToDouble(); - fCalibrateOutMax[1] = GetNextSymbol().ToDouble(); - fCalibrateOutMax[2] = GetNextSymbol().ToDouble(); - fCalibrateOutMax[3] = GetNextSymbol().ToDouble(); - fCalibrateOutMax[4] = GetNextSymbol().ToDouble(); - fCalibrateOutMax[5] = GetNextSymbol().ToDouble(); - fCalibrateOutMax[6] = GetNextSymbol().ToDouble(); + else if(token == "calibrateoutmaxvalues"){ + // maksymalne wartości jakie można wyświetlić na mierniku + Parser.getTokens( 7, false ); + Parser + >> Global::fCalibrateOutMax[ 0 ] + >> Global::fCalibrateOutMax[ 1 ] + >> Global::fCalibrateOutMax[ 2 ] + >> Global::fCalibrateOutMax[ 3 ] + >> Global::fCalibrateOutMax[ 4 ] + >> Global::fCalibrateOutMax[ 5 ] + >> Global::fCalibrateOutMax[ 6 ]; } - else if (str == AnsiString("calibrateoutdebuginfo")) // wyjście z info o przebiegu kalibracji - iCalibrateOutDebugInfo = GetNextSymbol().ToInt(); - else if (str == AnsiString("pwm")) // zmiana numerów wyjść PWM - { - int pwm_out = GetNextSymbol().ToInt(); - int pwm_no = GetNextSymbol().ToInt(); - iPoKeysPWM[pwm_out] = pwm_no; + else if( token == "calibrateoutdebuginfo" ) { + // wyjście z info o przebiegu kalibracji + Parser.getTokens( 1, false ); + Parser >> Global::iCalibrateOutDebugInfo; } - else if (str == AnsiString("brakestep")) // krok zmiany hamulca dla klawiszy [Num3] i [Num9] - fBrakeStep = GetNextSymbol().ToDouble(); - else if (str == - AnsiString("joinduplicatedevents")) // czy grupować eventy o tych samych nazwach - bJoinEvents = (GetNextSymbol().LowerCase() == AnsiString("yes")); - else if (str == AnsiString("hiddenevents")) // czy łączyć eventy z torami poprzez nazwę toru - iHiddenEvents = GetNextSymbol().ToIntDef(0); - else if (str == AnsiString("pause")) // czy po wczytaniu ma być pauza? - iPause |= (GetNextSymbol().LowerCase() == AnsiString("yes")) ? 1 : 0; - else if (str == AnsiString("lang")) - asLang = GetNextSymbol(); // domyślny język - http://tools.ietf.org/html/bcp47 - else if (str == AnsiString("opengl")) // deklarowana wersja OpenGL, żeby powstrzymać błędy - fOpenGL = GetNextSymbol().ToDouble(); // wymuszenie wersji OpenGL - else if (str == AnsiString("pyscreenrendererpriority")) // priority of python screen renderer - TPythonInterpreter::getInstance()->setScreenRendererPriority(GetNextSymbol().LowerCase().c_str()); - else if (str == AnsiString("background")) - { - Background[0] = GetNextSymbol().ToDouble(); // r - Background[1] = GetNextSymbol().ToDouble(); // g - Background[2] = GetNextSymbol().ToDouble(); // b + else if( token == "pwm" ) { + // zmiana numerów wyjść PWM + Parser.getTokens( 2, false ); + int pwm_out, pwm_no; + Parser + >> pwm_out + >> pwm_no; + Global::iPoKeysPWM[ pwm_out ] = pwm_no; } - } while (str != "endconfig"); //(!Parser->EndOfFile) + else if( token == "brakestep" ) { + // krok zmiany hamulca dla klawiszy [Num3] i [Num9] + Parser.getTokens( 1, false ); + Parser >> Global::fBrakeStep; + } + else if( token == "joinduplicatedevents" ) { + // czy grupować eventy o tych samych nazwach + Parser.getTokens(); Parser >> token; + Global::bJoinEvents = ( token == "yes" ); + } + else if( token == "hiddenevents" ) { + // czy łączyć eventy z torami poprzez nazwę toru + Parser.getTokens( 1, false ); + Parser >> Global::iHiddenEvents; + } + else if( token == "pause" ) { + // czy po wczytaniu ma być pauza? + Parser.getTokens(); Parser >> token; + iPause |= ( token == "yes" ? 1 : 0 ); + } + else if( token == "lang" ) { + // domyślny język - http://tools.ietf.org/html/bcp47 + Parser.getTokens( 1, false ); + Parser >> Global::asLang; + } + else if( token == "opengl" ) { + // deklarowana wersja OpenGL, żeby powstrzymać błędy + Parser.getTokens( 1, false ); + Parser >> Global::fOpenGL; + } + else if( token == "pyscreenrendererpriority" ) { + // priority of python screen renderer + Parser.getTokens(); Parser >> token; + TPythonInterpreter::getInstance()->setScreenRendererPriority( token.c_str() ); + } + else if( token == "background" ) { + + Parser.getTokens( 3, false ); + Parser + >> Global::Background[ 0 ] // r + >> Global::Background[ 1 ] // g + >> Global::Background[ 2 ];// b + } + } + while( ( token != "" ) + && ( token != "endconfig" ) ); //(!Parser->EndOfFile) // na koniec trochę zależności if (!bLoadTraction) // wczytywanie drutów i słupów { // tutaj wyłączenie, bo mogą nie być zdefiniowane w INI @@ -562,6 +671,8 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp) fFpsDeviation; // górna granica FPS, przy której promień scenerii będzie zwiększany if (iPause) iTextMode = VK_F1; // jak pauza, to pokazać zegar +/* this won't execute anymore with the old parser removed + // TBD: remove, or launch depending on passed flag? if (qp) { // to poniżej wykonywane tylko raz, jedynie po wczytaniu eu07.ini Console::ModeSet(iFeedbackMode, iFeedbackPort); // tryb pracy konsoli sterowniczej @@ -579,6 +690,7 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp) fDistanceFactor; // do kwadratu, bo większość odległości to ich kwadraty } } +*/ } void Global::InitKeys(std::string asFileName) @@ -783,7 +895,7 @@ TTranscripts::TTranscripts() fRefreshTime = 360.0; // wartośc zaporowa }; TTranscripts::~TTranscripts(){}; -void TTranscripts::AddLine(char *txt, float show, float hide, bool it) +void TTranscripts::AddLine(char const *txt, float show, float hide, bool it) { // dodanie linii do tabeli, (show) i (hide) w [s] od aktualnego czasu if (show == hide) return; // komentarz jest ignorowany @@ -820,7 +932,7 @@ void TTranscripts::AddLine(char *txt, float show, float hide, bool it) break; // więcej już nic } }; -void TTranscripts::Add(char *txt, float len, bool backgorund) +void TTranscripts::Add(char const *txt, float len, bool backgorund) { // dodanie tekstów, długość dźwięku, czy istotne if (!txt) return; // pusty tekst @@ -893,14 +1005,14 @@ void TTranscripts::Update() }; // Ra: tymczasowe rozwiązanie kwestii zagranicznych (czeskich) napisów -char bezogonkowo[128] = "E?,?\"_++?%Sstzz" - " ^^L$A|S^CS<--RZo±,l'uP.,as>L\"lz" - "RAAAALCCCEEEEIIDDNNOOOOxRUUUUYTB" - "raaaalccceeeeiiddnnoooo-ruuuuyt?"; +char bezogonkowo[] = "E?,?\"_++?%Sstzz" + " ^^L$A|S^CS<--RZo±,l'uP.,as>L\"lz" + "RAAAALCCCEEEEIIDDNNOOOOxRUUUUYTB" + "raaaalccceeeeiiddnnoooo-ruuuuyt?"; std::string Global::Bezogonkow(std::string str, bool _) { // wycięcie liter z ogonkami, bo OpenGL nie umie wyświetlić - for (int i = 1; i <= str.length(); ++i) + for (unsigned int i = 1; i <= str.length(); ++i) if (str[i] & 0x80) str[i] = bezogonkowo[str[i] & 0x7F]; else if (str[i] < ' ') // znaki sterujące nie są obsługiwane @@ -913,10 +1025,8 @@ std::string Global::Bezogonkow(std::string str, bool _) double Global::Min0RSpeed(double vel1, double vel2) { // rozszerzenie funkcji Min0R o wartości -1.0 - if (vel1 == -1.0) - vel1 = std::numeric_limits::max(); - if (vel2 == -1.0) - vel2 = std::numeric_limits::max(); + if( vel1 == -1.0 ) { vel1 = std::numeric_limits::max(); } + if( vel2 == -1.0 ) { vel2 = std::numeric_limits::max(); } return Min0R(vel1, vel2); }; @@ -926,6 +1036,3 @@ double Global::CutValueToRange(double min, double value, double max) value = Min0R(value, max); return value; }; - - -#pragma package(smart_init) diff --git a/Globals.h b/Globals.h index 464b983d..c181c1de 100644 --- a/Globals.h +++ b/Globals.h @@ -7,17 +7,12 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef GlobalsH -#define GlobalsH +#pragma once #include -#include "system.hpp" +#include #include "opengl/glew.h" #include "dumb3d.h" -#include "PyInt.h" -//#include "Classes.h" - -using namespace Math3D; // definicje klawiszy const int k_IncMainCtrl = 0; //[Num+] @@ -121,10 +116,6 @@ class TWorld; class TCamera; class TDynamicObject; class TAnimModel; // obiekt terenu -namespace Queryparsercomp -{ -class TQueryParserComp; // stary(?) parser -} class cParser; // nowy (powolny!) parser class TEvent; class TTextSound; @@ -150,8 +141,8 @@ class TTranscripts public: TTranscripts(); ~TTranscripts(); - void AddLine(char *txt, float show, float hide, bool it); - void Add(char *txt, float len, + void AddLine(char const *txt, float show, float hide, bool it); + void Add(char const *txt, float len, bool backgorund = false); // dodanie tekstów, długość dźwięku, czy istotne void Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekundę) }; @@ -163,12 +154,12 @@ class Global public: // double Global::tSinceStart; static int Keys[MaxKeys]; - static vector3 pCameraPosition; // pozycja kamery w świecie + static Math3D::vector3 pCameraPosition; // pozycja kamery w świecie static double pCameraRotation; // kierunek bezwzględny kamery w świecie: 0=północ, 90°=zachód (-azymut) static double pCameraRotationDeg; // w stopniach, dla animacji billboard - static vector3 pFreeCameraInit[10]; // pozycje kamery - static vector3 pFreeCameraInitAngle[10]; + static Math3D::vector3 pFreeCameraInit[ 10 ]; // pozycje kamery + static Math3D::vector3 pFreeCameraInitAngle[ 10 ]; static int iWindowWidth; static int iWindowHeight; static float fDistanceFactor; @@ -194,7 +185,7 @@ class Global static double fFogEnd; static TGround *pGround; static char **szDefaultExt; - static char szSceneryFile[256]; + static std::string SceneryFile; static char CreatorName1[20]; static char CreatorName2[20]; static char CreatorName3[20]; @@ -207,11 +198,11 @@ class Global static std::string asHumanCtrlVehicle; static void LoadIniFile(std::string asFileName); static void InitKeys(std::string asFileName); - inline static vector3 GetCameraPosition() + inline static Math3D::vector3 GetCameraPosition() { return pCameraPosition; }; - static void SetCameraPosition(vector3 pNewCameraPosition); + static void SetCameraPosition(Math3D::vector3 pNewCameraPosition); static void SetCameraRotation(double Yaw); static int iWriteLogEnabled; // maska bitowa: 1-zapis do pliku, 2-okienko // McZapkie-221002: definicja swiatla dziennego @@ -286,7 +277,6 @@ class Global static TAnimModel *pTerrainCompact; // obiekt terenu do ewentualnego zapisania w pliku static std::string asTerrainModel; // nazwa obiektu terenu do zapisania w pliku static bool bRollFix; // czy wykonać przeliczanie przechyłki - static Queryparsercomp::TQueryParserComp *qParser; static cParser *pParser; static int iSegmentsRendered; // ilość segmentów do regulacji wydajności static double fFpsAverage; // oczekiwana wartosć FPS @@ -308,15 +298,15 @@ class Global static bool bSmudge; // czy wyświetlać smugę, a pojazd użytkownika na końcu static std::string asTranscript[5]; // napisy na ekranie (widoczne) static TTranscripts tranTexts; // obiekt obsługujący stenogramy dźwięków na ekranie - static AnsiString asLang; // domyślny język - http://tools.ietf.org/html/bcp47 + static std::string asLang; // domyślny język - http://tools.ietf.org/html/bcp47 static int iHiddenEvents; // czy łączyć eventy z torami poprzez nazwę toru static TTextSound *tsRadioBusy[10]; // zajętość kanałów radiowych (wskaźnik na odgrywany dźwięk) static int iPoKeysPWM[7]; // numery wejść dla PWM // metody static void TrainDelete(TDynamicObject *d); - static void ConfigParse(Queryparsercomp::TQueryParserComp *qp, cParser *cp = NULL); - static AnsiString GetNextSymbol(); + static void ConfigParse(cParser &parser); + static std::string GetNextSymbol(); static TDynamicObject * DynamicNearest(); static TDynamicObject * CouplerNearest(); static bool AddToQuery(TEvent *event, TDynamicObject *who); @@ -325,8 +315,4 @@ class Global static double Min0RSpeed(double vel1, double vel2); static double CutValueToRange(double min, double value, double max); }; - - - //--------------------------------------------------------------------------- -#endif diff --git a/Ground.cpp b/Ground.cpp index 5067c0c5..929d2d04 100644 --- a/Ground.cpp +++ b/Ground.cpp @@ -13,18 +13,17 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" +#include "stdafx.h" +#include "Ground.h" #include "opengl/glew.h" #include "opengl/glut.h" -#pragma hdrstop - +#include "Globals.h" +#include "Logs.h" +#include "usefull.h" #include "Timer.h" #include "Texture.h" -#include "Ground.h" -#include "Globals.h" #include "Event.h" #include "EvLaunch.h" #include "TractionPower.h" @@ -1412,7 +1411,7 @@ TGroundNode *nTrainSetNode = NULL; // poprzedni pojazd do TGroundNode *nTrainSetDriver = NULL; // pojazd, któremu zostanie wysłany rozkład TGroundVertex TempVerts[10000]; // tu wczytywane są trójkąty -Byte TempConnectionType[200]; // Ra: sprzęgi w składzie; ujemne, gdy odwrotnie +BYTE TempConnectionType[200]; // Ra: sprzęgi w składzie; ujemne, gdy odwrotnie void TGround::RaTriangleDivider(TGroundNode *node) { // tworzy dodatkowe trójkąty i zmiejsza podany @@ -2834,7 +2833,7 @@ bool TGround::Init(std::string asFile, HDC hDC) } else if (str == "config") { // możliwość przedefiniowania parametrów w scenerii - Global::ConfigParse(NULL, &parser); // parsowanie dodatkowych ustawień + Global::ConfigParse(parser); // parsowanie dodatkowych ustawień } else if (str != "") { // pomijanie od nierozpoznanej komendy do jej zakończenia @@ -2862,7 +2861,6 @@ bool TGround::Init(std::string asFile, HDC hDC) parser >> token; } - delete parser; sTracks->Sort(TP_TRACK); // finalne sortowanie drzewa torów sTracks->Sort(TP_MEMCELL); // finalne sortowanie drzewa komórek pamięci sTracks->Sort(TP_MODEL); // finalne sortowanie drzewa modeli @@ -3787,15 +3785,15 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node) &Event->Params[4].nGroundNode->pCenter); //if (DebugModeFlag) WriteLog("EVENT EXECUTED: AddValues & Track command - " + - string(Event->Params[0].asText) + " " + - to_string(Event->Params[1].asdouble) + " " + - to_string(Event->Params[2].asdouble)); + std::string(Event->Params[0].asText) + " " + + std::to_string(Event->Params[1].asdouble) + " " + + std::to_string(Event->Params[2].asdouble)); } //else if (DebugModeFlag) WriteLog("EVENT EXECUTED: AddValues - " + - string(Event->Params[0].asText) + " " + - to_string(Event->Params[1].asdouble) + " " + - to_string(Event->Params[2].asdouble)); + std::string(Event->Params[0].asText) + " " + + std::to_string(Event->Params[1].asdouble) + " " + + std::to_string(Event->Params[2].asdouble)); } Event = Event @@ -3808,7 +3806,7 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node) Event->fStartTime = fabs(Event->fDelay) + Timer::GetTime(); // czas od uruchomienia scenerii if (Event->fRandomDelay > 0.0) - Event->fStartTime += Event->fRandomDelay * random(10000) * + Event->fStartTime += Event->fRandomDelay * Random(10000) * 0.0001; // doliczenie losowego czasu opóźnienia ++Event->iQueued; // zabezpieczenie przed podwójnym dodaniem do kolejki if (QueryRootEvent ? Event->fStartTime >= QueryRootEvent->fStartTime : false) @@ -3834,8 +3832,8 @@ bool TGround::EventConditon(TEvent *e) else if (e->iFlags & conditional_propability) { double rprobability = 1.0 * rand() / RAND_MAX; - WriteLog("Random integer: " + CurrToStr(rprobability) + "/" + - CurrToStr(e->Params[10].asdouble)); + WriteLog("Random integer: " + std::to_string(rprobability) + "/" + + std::to_string(e->Params[10].asdouble)); return (e->Params[10].asdouble > rprobability); } else if (e->iFlags & conditional_memcompare) @@ -3979,14 +3977,14 @@ bool TGround::CheckQuery() &tmpEvent->Params[4].nGroundNode->pCenter); //if (DebugModeFlag) WriteLog("Type: UpdateValues & Track command - " + - AnsiString(tmpEvent->Params[0].asText) + " " + - AnsiString(tmpEvent->Params[1].asdouble) + " " + - AnsiString(tmpEvent->Params[2].asdouble)); + std::string(tmpEvent->Params[0].asText) + " " + + std::to_string(tmpEvent->Params[1].asdouble) + " " + + std::to_string(tmpEvent->Params[2].asdouble)); } else //if (DebugModeFlag) - WriteLog("Type: UpdateValues - " + AnsiString(tmpEvent->Params[0].asText) + - " " + AnsiString(tmpEvent->Params[1].asdouble) + " " + - AnsiString(tmpEvent->Params[2].asdouble)); + WriteLog("Type: UpdateValues - " + std::string( tmpEvent->Params[0].asText ) + + " " + std::to_string(tmpEvent->Params[1].asdouble) + " " + + std::to_string(tmpEvent->Params[2].asdouble)); } break; case tp_GetValues: @@ -4193,14 +4191,14 @@ bool TGround::CheckQuery() if (tmpEvent->Params[9].asMemCell) // jeśli była podana nazwa komórki WriteLog("Memcell \"" + tmpEvent->asNodeName + "\": " + tmpEvent->Params[9].asMemCell->Text() + " " + - to_string(tmpEvent->Params[9].asMemCell->Value1()) + " " + - to_string(tmpEvent->Params[9].asMemCell->Value2())); + std::to_string(tmpEvent->Params[9].asMemCell->Value1()) + " " + + std::to_string(tmpEvent->Params[9].asMemCell->Value2())); else // lista wszystkich for (TGroundNode *Current = nRootOfType[TP_MEMCELL]; Current; Current = Current->nNext) WriteLog("Memcell \"" + Current->asName + "\": " + - Current->MemCell->Text() + " " + to_string(Current->MemCell->Value1()) + " " + - to_string(Current->MemCell->Value2())); + Current->MemCell->Text() + " " + std::to_string(Current->MemCell->Value1()) + " " + + std::to_string(Current->MemCell->Value2())); break; case tp_Voltage: // zmiana napięcia w zasilaczu (TractionPowerSource) if (tmpEvent->Params[9].psPower) @@ -4769,7 +4767,7 @@ bool TGround::RenderAlphaVBO(vector3 pPosition) }; //--------------------------------------------------------------------------- -void TGround::Navigate(String ClassName, UINT Msg, WPARAM wParam, LPARAM lParam) +void TGround::Navigate(std::string const &ClassName, UINT Msg, WPARAM wParam, LPARAM lParam) { // wysłanie komunikatu do sterującego HWND h = FindWindow(ClassName.c_str(), 0); // można by to zapamiętać if (h == 0) @@ -4792,7 +4790,7 @@ void TGround::WyslijEvent(const std::string &e, const std::string &d) cData.cbData = 12 + i + j; // 8+dwa liczniki i dwa zera kończące cData.lpData = &r; Navigate("TEU07SRK", WM_COPYDATA, (WPARAM)Global::hWnd, (LPARAM)&cData); - CommLog(to_string(BorlandTime()) + " " + to_string(r.iComm) + " " + e + " sent"); + CommLog( Now() + " " + std::to_string(r.iComm) + " " + e + " sent" ); }; //--------------------------------------------------------------------------- void TGround::WyslijUszkodzenia(const std::string &t, char fl) @@ -4809,7 +4807,7 @@ void TGround::WyslijUszkodzenia(const std::string &t, char fl) cData.cbData = 11 + i; // 8+licznik i zero kończące cData.lpData = &r; Navigate("TEU07SRK", WM_COPYDATA, (WPARAM)Global::hWnd, (LPARAM)&cData); - CommLog(to_string(BorlandTime()) + " " + to_string(r.iComm) + " " + t + " sent"); + CommLog( Now() + " " + std::to_string(r.iComm) + " " + t + " sent"); }; //--------------------------------------------------------------------------- void TGround::WyslijString(const std::string &t, int n) @@ -4825,7 +4823,7 @@ void TGround::WyslijString(const std::string &t, int n) cData.cbData = 10 + i; // 8+licznik i zero kończące cData.lpData = &r; Navigate("TEU07SRK", WM_COPYDATA, (WPARAM)Global::hWnd, (LPARAM)&cData); - CommLog(to_string(BorlandTime()) + " " + to_string(r.iComm) + " " + t + " sent"); + CommLog( Now() + " " + std::to_string(r.iComm) + " " + t + " sent"); }; //--------------------------------------------------------------------------- void TGround::WyslijWolny(const std::string &t) @@ -4905,7 +4903,7 @@ void TGround::WyslijNamiary(TGroundNode *t) // WriteLog("Ramka gotowa"); Navigate("TEU07SRK", WM_COPYDATA, (WPARAM)Global::hWnd, (LPARAM)&cData); // WriteLog("Ramka poszla!"); - CommLog(to_string(BorlandTime()) + " " + to_string(r.iComm) + " " + t->asName + " sent"); + CommLog( Now() + " " + std::to_string(r.iComm) + " " + t->asName + " sent"); }; // void TGround::WyslijObsadzone() @@ -4913,7 +4911,7 @@ void TGround::WyslijObsadzone() DaneRozkaz2 r; r.iSygn = 'EU07'; r.iComm = 12; // kod 12 - for (int i; i<1984; i++) r.cString[i] = 0; + for (int i=0; i<1984; ++i) r.cString[i] = 0; int i = 0; for (TGroundNode *Current = nRootDynamic; Current; Current = Current->nNext) @@ -4947,7 +4945,7 @@ void TGround::WyslijObsadzone() cData.lpData = &r; // WriteLog("Ramka gotowa"); Navigate("TEU07SRK", WM_COPYDATA, (WPARAM)Global::hWnd, (LPARAM)&cData); - CommLog(to_string(BorlandTime()) + " " + to_string(r.iComm) + " obsadzone" + " sent"); + CommLog( Now() + " " + std::to_string(r.iComm) + " obsadzone" + " sent"); } //-------------------------------- @@ -5087,7 +5085,7 @@ void TGround::DynamicRemove(TDynamicObject *dyn) }; //--------------------------------------------------------------------------- -void TGround::TerrainRead(const AnsiString &f){ +void TGround::TerrainRead(std::string const &f){ // Ra: wczytanie trójkątów terenu z pliku E3D }; @@ -5122,8 +5120,7 @@ void TGround::TerrainWrite() sk = new TSubModel(); // nowy submodel dla kawadratu // numer kwadratu XXXZZZ, przy czym X jest ujemne - XXX rośnie na wschód, ZZZ rośnie // na północ - sk->NameSet(AnsiString(1000 * (500 + i - iNumRects / 2) + (500 + j - iNumRects / 2)) - .c_str()); // nazwa=numer kwadratu + sk->NameSet( std::to_string(1000 * (500 + i - iNumRects / 2) + (500 + j - iNumRects / 2)).c_str() ); // nazwa=numer kwadratu m->AddTo(NULL, sk); // dodanie submodelu dla kwadratu for (Current = Rects[i][j].nRootNode; Current; Current = Current->nNext2) if (Current->TextureID) @@ -5187,7 +5184,6 @@ void TGround::TrackBusyList() { // wysłanie informacji o wszystkich zajętych odcinkach TGroundNode *Current; TTrack *Track; - AnsiString name; for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext) if (!Current->asName.empty()) // musi być nazwa if (Current->pTrack->iNumDynamics) // osi to chyba nie ma jak policzyć diff --git a/Ground.h b/Ground.h index f5a4f0af..77751b9d 100644 --- a/Ground.h +++ b/Ground.h @@ -7,17 +7,16 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef groundH -#define groundH +#pragma once -#include "dumb3d.h" -#include "ResourceManager.h" +#include +#include "opengl/glew.h" #include "VBO.h" #include "Classes.h" -#include +#include "ResourceManager.h" +#include "dumb3d.h" using namespace Math3D; -using namespace std; // Ra: zmniejszone liczby, aby zrobić tabelkę i zoptymalizować wyszukiwanie const int TP_MODEL = 10; @@ -383,14 +382,14 @@ class TGround { return (x / fSubRectSize + fHalfTotalNumSubRects); }; - TEvent * FindEvent(const string &asEventName); - TEvent * FindEventScan(const string &asEventName); + TEvent * FindEvent(const std::string &asEventName); + TEvent * FindEventScan(const std::string &asEventName); void TrackJoin(TGroundNode *Current); private: void OpenGLUpdate(HDC hDC); void RaTriangleDivider(TGroundNode *node); - void Navigate(String ClassName, UINT Msg, WPARAM wParam, LPARAM lParam); + void Navigate(std::string const &ClassName, UINT Msg, WPARAM wParam, LPARAM lParam); bool PROBLEND; public: @@ -409,7 +408,7 @@ class TGround TDynamicObject * CouplerNearest(vector3 pPosition, double distance = 20.0, bool mech = false); void DynamicRemove(TDynamicObject *dyn); - void TerrainRead(const AnsiString &f); + void TerrainRead(std::string const &f); void TerrainWrite(); void TrackBusyList(); void IsolatedBusyList(); @@ -417,4 +416,3 @@ class TGround void Silence(vector3 gdzie); }; //--------------------------------------------------------------------------- -#endif diff --git a/Logs.cpp b/Logs.cpp index b8a46063..b5736191 100644 --- a/Logs.cpp +++ b/Logs.cpp @@ -7,16 +7,10 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include "classes.hpp" -#include "system.hpp" -#pragma hdrstop - -#include "Globals.h" +#include "stdafx.h" #include "Logs.h" -#include -#include -#include +#include "Globals.h" std::ofstream output; // standardowy "log.txt", można go wyłączyć std::ofstream errors; // lista błędów "errors.txt", zawsze działa @@ -89,13 +83,6 @@ void ErrorLog(const char *str) errors.flush(); }; -void Error(const AnsiString &asMessage, bool box) -{ - // if (box) - // MessageBox(NULL, asMessage.c_str(), string("EU07 " + Global::asRelease).c_str(), MB_OK); - ErrorLog(asMessage.c_str()); -} - void Error(const std::string &asMessage, bool box) { // if (box) @@ -117,17 +104,6 @@ void ErrorLog(const std::string &str, bool newline) WriteLog(str.c_str(), newline); } -void ErrorLog(const AnsiString &asMessage) -{ // zapisywanie błędów "errors.txt" - ErrorLog(asMessage.c_str()); - WriteLog(asMessage.c_str()); // do "log.txt" ewentualnie też -} - -void WriteLog(const AnsiString &str, bool newline) -{ // Ra: wersja z AnsiString jest zamienna z Error() - WriteLog(str.c_str(), newline); -}; - void WriteLog(const std::string &str, bool newline) { // Ra: wersja z AnsiString jest zamienna z Error() WriteLog(str.c_str(), newline); @@ -155,11 +131,4 @@ void CommLog(const std::string &str) WriteLog(str); }; -void CommLog(const AnsiString &str) -{ // Ra: wersja z AnsiString jest zamienna z Error() - CommLog(str.c_str()); -}; - //--------------------------------------------------------------------------- - -#pragma package(smart_init) diff --git a/Logs.h b/Logs.h index 30e80b3c..88bade05 100644 --- a/Logs.h +++ b/Logs.h @@ -7,24 +7,16 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef LogsH -#define LogsH -#include +#pragma once #include void WriteConsoleOnly(const char *str, double value); void WriteConsoleOnly(const char *str, bool newline = true); void WriteLog(const char *str, double value); void WriteLog(const char *str, bool newline = true); -void Error(const AnsiString &asMessage, bool box = false); void Error(const std::string &asMessage, bool box = false); void Error(const char* &asMessage, bool box = false); void ErrorLog(const std::string &str, bool newline = true); -//void ErrorLog(const AnsiString &asMessage); -void WriteLog(const AnsiString &str, bool newline = true); void WriteLog(const std::string &str, bool newline = true); void CommLog(const char *str); void CommLog(const std::string &str); -void CommLog(const AnsiString &str); -//--------------------------------------------------------------------------- -#endif diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 313b71d0..ceaf46f6 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -7,16 +7,11 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef MoverH -#define MoverH +#pragma once //--------------------------------------------------------------------------- -//#include "Mover.hpp" //Q: 20160805 - odlaczenie pliku fizyki .pas od kompilacji -#include "Oerlikon_ESt.h" -#include "hamulce.h" -#include -#include "mctools.h" +//Q: 20160805 - odlaczenie pliku fizyki .pas od kompilacji #include - +#include "hamulce.h" /* MaSzyna EU07 locomotive simulator Copyright (C) 2001-2004 Maciej Czapkiewicz and others @@ -247,60 +242,43 @@ enum TProblem // lista problem }; /*ogolne*/ +/*lokacja*/ struct TLocation { - double X; - double Y; - double Z; /*lokacja*/ - inline TLocation() { - X, Y, Z = 0.0; - } + double X = 0.0; + double Y = 0.0; + double Z = 0.0; }; +/*rotacja*/ struct TRotation { - double Rx; - double Ry; - double Rz; /*rotacja*/ - inline TRotation() { - Rx, Ry, Rz = 0.0; - } + double Rx = 0.0; + double Ry = 0.0; + double Rz = 0.0; }; +/*wymiary*/ struct TDimension { - double W; - double L; - double H; /*wymiary*/ - inline TDimension() - { - W = 0.0; - L = 0.0; - H = 0.0; - } + double W = 0.0; + double L = 0.0; + double H = 0.0; }; struct TCommand { std::string Command; /*komenda*/ - double Value1; - double Value2; /*argumenty komendy*/ + double Value1 = 0.0; /*argumenty komendy*/ + double Value2 = 0.0; TLocation Location; - inline TCommand() { - Command = ""; - Value1, Value2 = 0.0; - Location = TLocation(); - } }; /*tory*/ struct TTrackShape -{/*ksztalt odcinka - promien, dlugosc, nachylenie, przechylka*/ - double R; - double Len; - double dHtrack; - double dHrail; - inline TTrackShape() { - R, Len, dHrail, dHtrack = 0.0; - } +{/*ksztalt odcinka*/ + double R = 0.0; // promien + double Len = 0.0; // dlugosc + double dHtrack = 0.0; // nachylenie + double dHrail = 0.0; // przechylka }; struct TTrackParam @@ -977,8 +955,8 @@ public: TMoverParameters(double VelInitial, std::string TypeNameInit, std::string NameInit, int LoadInitial, std::string LoadTypeInitial, int Cab); // obsługa sprzęgów double Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1, const TDimension &Dim2); - double Distance(const vector3 &Loc1, const vector3 &Loc2, const vector3 &Dim1, const vector3 &Dim2); - //bool AttachA(int ConnectNo, int ConnectToNr, TMoverParameters *ConnectTo, int CouplingType, bool Forced = false); +/* double Distance(const vector3 &Loc1, const vector3 &Loc2, const vector3 &Dim1, const vector3 &Dim2); +*/ //bool AttachA(int ConnectNo, int ConnectToNr, TMoverParameters *ConnectTo, int CouplingType, bool Forced = false); bool Attach(int ConnectNo, int ConnectToNr, TMoverParameters *ConnectTo, int CouplingType, bool Forced = false); int DettachStatus(int ConnectNo); bool Dettach(int ConnectNo); @@ -1146,5 +1124,3 @@ public: }; extern double Distance(TLocation Loc1, TLocation Loc2, TDimension Dim1, TDimension Dim2); - -#endif diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 9b1be6fd..804213bb 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -7,28 +7,12 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include -#include -#include -#include // std::ifstream -#include -#include -#include -#include // sprintf() -#include -#include -#include -#include - +#include "stdafx.h" #include "Mover.h" #include "../globals.h" -//#include "../qutils.h" -#include "mctools.h" #include "../logs.h" -#include "hamulce.h" #include "Oerlikon_ESt.h" //--------------------------------------------------------------------------- -#pragma package(smart_init) // Ra: tu należy przenosić funcje z mover.pas, które nie są z niego wywoływane. // Jeśli jakieś zmienne nie są używane w mover.pas, też można je przenosić. @@ -753,13 +737,13 @@ double TMoverParameters::Distance(const TLocation &Loc1, const TLocation &Loc2, { // zwraca odległość pomiędzy pojazdami (Loc1) i (Loc2) z uwzględnieneim ich długości (kule!) return hypot(Loc2.X - Loc1.X, Loc1.Y - Loc2.Y) - 0.5 * (Dim2.L + Dim1.L); }; - +/* double TMoverParameters::Distance(const vector3 &s1, const vector3 &s2, const vector3 &d1, const vector3 &d2){ // obliczenie odległości prostopadłościanów o środkach (s1) i (s2) i wymiarach (d1) i (d2) // return 0.0; //będzie zgłaszać warning - funkcja do usunięcia, chyba że się przyda... }; - +*/ double TMoverParameters::CouplerDist(int Coupler) { // obliczenie odległości pomiędzy sprzęgami (kula!) return Couplers[Coupler].CoupleDist = @@ -1417,7 +1401,6 @@ double TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShap HVCouplers[0][0] = 0; HVCouplers[1][0] = 0; } - ClearPendingExceptions(); // ma byc if (!TestFlag(DamageFlag, dtrain_out)) { // Ra: to przepisywanie tu jest bez sensu @@ -1620,8 +1603,6 @@ double TMoverParameters::FastComputeMovement(double dt, const TTrackShape &Shape int b; // T_MoverParameters::FastComputeMovement(dt, Shape, Track, NewLoc, NewRot); - ClearPendingExceptions(); // nie bylo - Loc = NewLoc; Rot = NewRot; NewRot.Rx = 0.0; @@ -5237,7 +5218,7 @@ bool TMoverParameters::PantFront(bool State) bool TMoverParameters::PantRear(bool State) { double pf1; - bool PR; + bool PR = false; if (Battery == true) { @@ -5854,7 +5835,7 @@ std::string tS(std::string val) int Pos(std::string str_find, std::string in) { size_t pos = in.find(str_find); - return (pos != string::npos ? pos+1 : 0); + return (pos != std::string::npos ? pos+1 : 0); } // ************************************************************************************************* @@ -5863,7 +5844,7 @@ int Pos(std::string str_find, std::string in) bool issection(std::string name) { sectionname = name; - if (xline.find(name) != string::npos) + if (xline.find(name) != std::string::npos) { lastsectionname = name; return true; @@ -5890,7 +5871,7 @@ std::string getkeyval(int rettype, std::string key) int klen = key.length(); int kpos = Pos(key, xline) - 1; temp.erase(0, kpos + klen); - if (temp.find(" ") != string::npos) + if (temp.find(" ") != std::string::npos) to = temp.find(" "); else to = 255; @@ -5919,7 +5900,7 @@ int MARKERROR(int code, std::string type, std::string msg) return code; } -int s2NPW(string s) +int s2NPW(std::string s) { // wylicza ilosc osi napednych z opisu ukladu osi const char A = 64; int k; @@ -5932,7 +5913,7 @@ int s2NPW(string s) return NPW; } -int s2NNW(string s) +int s2NNW(std::string s) { // wylicza ilosc osi nienapedzanych z opisu ukladu osi const char Zero = 48; int k; @@ -5995,7 +5976,7 @@ bool TMoverParameters::readMPT(int ln, std::string line) // parsowanie RList bool TMoverParameters::readRLIST(int ln, std::string line) { - char *xxx; + char *xxx = nullptr; startRLIST = true; if (ln > 0) // 0 to nazwa sekcji - RList: @@ -6046,7 +6027,7 @@ bool TMoverParameters::readRLIST(int ln, std::string line) // parsowanie Brake Param Table bool TMoverParameters::readBPT(int ln, std::string line) { - char *xxx; + char *xxx = nullptr; startBPT = true; int k; @@ -6342,7 +6323,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath) int b, OKFlag; std::string lines, s, appdir; std::string APPDIR, filetocheck, line, node, key, file, CERR; - string wers; + std::string wers; bool noexist = false; bool OK; @@ -6362,7 +6343,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath) // appdir = ExtractFilePath(ParamStr(0)); - ifstream in(file.c_str()); + std::ifstream in(file.c_str()); if (!in.is_open()) { WriteLog("E8 - FIZ FILE NOT EXIST."); @@ -6385,7 +6366,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath) xline = wers.c_str(); ishash = xline.find("#"); // if ((ishash == 1)) WriteLog("zakomentowane " + xline); - if ((ishash == string::npos)) + if ((ishash == std::string::npos)) { if (xline.length() == 0) @@ -7685,7 +7666,6 @@ bool TMoverParameters::RunCommand(std::string Command, double CValue1, double CV bool OK; std::string testload; OK = false; - ClearPendingExceptions(); if (Command == "MainCtrl") { diff --git a/McZapkie/Oerlikon_ESt.cpp b/McZapkie/Oerlikon_ESt.cpp index f8ad795c..467aebda 100644 --- a/McZapkie/Oerlikon_ESt.cpp +++ b/McZapkie/Oerlikon_ESt.cpp @@ -12,8 +12,8 @@ Brakes. Oerlikon ESt. Copyright (C) 2007-2014 Maciej Cierniak */ +#include "stdafx.h" #include "Oerlikon_ESt.h" -#include double d2A(double d) { diff --git a/McZapkie/friction.cpp b/McZapkie/friction.cpp index 503b4968..8899a5a5 100644 --- a/McZapkie/friction.cpp +++ b/McZapkie/friction.cpp @@ -12,8 +12,8 @@ Friction coefficient. Copyright (C) 2007-2013 Maciej Cierniak */ +#include "stdafx.h" #include "friction.h" -#include double TFricMat::GetFC(double N, double Vel) { diff --git a/McZapkie/hamulce.cpp b/McZapkie/hamulce.cpp index be4ffb68..1cba8862 100644 --- a/McZapkie/hamulce.cpp +++ b/McZapkie/hamulce.cpp @@ -12,10 +12,10 @@ Brakes. Oerlikon ESt. Copyright (C) 2007-2014 Maciej Cierniak */ +#include "stdafx.h" #include "hamulce.h" -#include "Mover.h" -#include #include +#include "Mover.h" //---FUNKCJE OGOLNE--- @@ -82,11 +82,6 @@ double PF1(double P1, double P2, double S) return FM; } -long lround(double value) -{ - return floorl(value + 0.5); -} - double PFVa(double PH, double PL, double S, double LIM, double DP) // zawor napelniajacy z PH do PL, PL do LIM { @@ -252,7 +247,7 @@ TBrake::TBrake(double i_mbp, double i_bcr, double i_bcd, double i_brc, int i_bcn MaxBP = i_mbp; BCN = i_bcn; BCM = 1; - BCA = i_bcn * i_bcr * i_bcr * pi; + BCA = i_bcn * i_bcr * i_bcr * M_PI; BA = i_ba; NBpA = i_nbpa; BrakeDelays = i_BD; diff --git a/McZapkie/hamulce.h b/McZapkie/hamulce.h index a5284d8d..2914c975 100644 --- a/McZapkie/hamulce.h +++ b/McZapkie/hamulce.h @@ -835,8 +835,6 @@ Knorr/West EP - extern double PFVa(double PH, double PL, double S, double LIM, double DP = 0.1); //zawor napelniajacy z PH do PL, PL do LIM extern double PFVd(double PH, double PL, double S, double LIM, double DP = 0.1); //zawor wypuszczajacy z PH do PL, PH do LIM - extern long lround(double value); //zastepuje funkcje nieobecna w C++99 - #if !defined(NO_IMPLICIT_NAMESPACE_USE) #endif #endif//INCLUDED_HAMULCE_H diff --git a/McZapkie/mctools.cpp b/McZapkie/mctools.cpp index 54e0102c..2002ecff 100644 --- a/McZapkie/mctools.cpp +++ b/McZapkie/mctools.cpp @@ -11,15 +11,9 @@ MaSzyna EU07 - SPKS Brakes. Copyright (C) 2007-2014 Maciej Cierniak */ +#include "stdafx.h" #include "mctools.h" -#include -#include -#include -#include -#include -#include -using namespace std; /*================================================*/ int ConversionError = 0; @@ -73,6 +67,31 @@ double Min0R(double x1, double x2) return x2; } +// shitty replacement for Borland timestamp function +// TODO: replace with something sensible +std::string Now() { + + std::time_t timenow = std::time( nullptr ); + std::tm tm = *std::localtime( &timenow ); + std::stringstream converter; + std::string output; + converter << std::put_time( &tm, "%c" ); + converter >> output; + return output; + +/* char buffer[ 256 ]; + sprintf( buffer, + "%d-%02d-%02d %02d:%02d:%02d.%03d", + st.wYear, + st.wMonth, + st.wDay, + st.wHour, + st.wMinute, + st.wSecond, + st.wMilliseconds ); +*/ +} + bool TestFlag(int Flag, int Value) { if ((Flag & Value) == Value) @@ -141,10 +160,10 @@ std::string ReadWord(std::ifstream& infile) while ((!infile.eof()) && (!nextword)) { infile.get(c); - if (_spacesigns.find(c) != string::npos) + if (_spacesigns.find(c) != std::string::npos) if (s != "") nextword = true; - if (_spacesigns.find(c) == string::npos) + if (_spacesigns.find(c) == std::string::npos) s += c; } return s; @@ -181,7 +200,7 @@ std::string TrimSpace(std::string &s, int Just) if (s.empty()) return ""; size_t first = s.find_first_not_of(' '); - if (first == string::npos) + if (first == std::string::npos) return ""; size_t last = s.find_last_not_of(' '); return s.substr(first, (last - first + 1)); @@ -193,7 +212,7 @@ char* TrimAndReduceSpaces(const char* s) if (s) { - tmp = strdup(s); + tmp = _strdup(s); char* from = tmp + strspn(tmp, " "); char* to = tmp; @@ -212,7 +231,7 @@ std::string ExtractKeyWord(std::string InS, std::string KeyWord) std::string s; InS = InS + " "; std::size_t kwp = InS.find(KeyWord); - if (kwp != string::npos) + if (kwp != std::string::npos) { s = InS.substr(kwp, InS.length()); //s = Copy(InS, kwp, length(InS)); @@ -233,30 +252,30 @@ std::string DUE(std::string s) /*Delete Before Equal sign*/ std::string DWE(std::string s) /*Delete After Equal sign*/ { size_t ep = s.find("="); - if (ep != string::npos) + if (ep != std::string::npos) //DWE = Copy(s, 1, ep - 1); return s.substr(0, ep); else return s; } -std::string Ld2Sp(std::string s) /*Low dash to Space sign*/ +std::string Ld2Sp(std::string const &s) /*Low dash to Space sign*/ { - //std::string s2 = ""; - char tmp[] = { (char)"_", (char)" " }; - for (int b = 0; b < s.length(); ++b) - if (s[b] == tmp[0]) - s[b] = tmp[1]; + std::string s2( s ); + char tmp[] = { '_', ' ' }; + for (int b = 0; b < s2.length(); ++b) + if (s2[b] == tmp[0]) + s2[b] = tmp[1]; //{ // if (s[b] == tmp[0]) // s2 = s2 + " "; // else // s2 = s2 + s[b]; //} - // return s2; + return s2; } -std::string Tab2Sp(std::string s) /*Tab to Space sign*/ +std::string Tab2Sp(std::string const &s) /*Tab to Space sign*/ { std::string s2 = ""; char tmp = (char)9; @@ -275,7 +294,7 @@ std::string Tab2Sp(std::string s) /*Tab to Space sign*/ return s2; } -std::string ExchangeCharInString(string s, const char &aim, const char &target) +std::string ExchangeCharInString(std::string s, const char &aim, const char &target) { char *tmp = new char[s.length()]; for (int b = 0; b < s.length(); ++b) @@ -288,7 +307,7 @@ std::string ExchangeCharInString(string s, const char &aim, const char &target) else tmp[b] = s[b]; } - return string(tmp); + return std::string(tmp); } std::vector &Split(const std::string &s, char delim, std::vector &elems) @@ -411,16 +430,18 @@ int stol_def(const std::string &str, const int &DefaultValue) return result; } -std::string ToLower(std::string text) +std::string ToLower(std::string const &text) { - std::transform(text.begin(), text.end(), text.begin(), ::tolower); - return text; + std::string lowercase( text ); + std::transform(text.begin(), text.end(), lowercase.begin(), ::tolower); + return lowercase; } -std::string ToUpper(std::string text) +std::string ToUpper(std::string const &text) { - std::transform(text.begin(), text.end(), text.begin(), ::toupper); - return text; + std::string uppercase( text ); + std::transform(text.begin(), text.end(), uppercase.begin(), ::toupper); + return uppercase; } void ComputeArc(double X0, double Y0, double Xn, double Yn, double R, double L, double dL, @@ -443,11 +464,11 @@ void ComputeArc(double X0, double Y0, double Xn, double Yn, double R, double L, if (dX != 0) gamma = atan(dY * 1.0 / dX); else if (dY > 0) - gamma = pi * 1.0 / 2; + gamma = M_PI * 1.0 / 2; else - gamma = 3 * pi * 1.0 / 2; + gamma = 3 * M_PI * 1.0 / 2; alfa = L * 1.0 / R; - phi = gamma - (alfa + pi * Round(R * 1.0 / AbsR)) * 1.0 / 2; + phi = gamma - (alfa + M_PI * Round(R * 1.0 / AbsR)) * 1.0 / 2; Xc = X0 - AbsR * cos(phi); Yc = Y0 - AbsR * sin(phi); phi = phi + alfa * dL * 1.0 / L; @@ -471,16 +492,24 @@ void ComputeALine(double X0, double Y0, double Xn, double Yn, double L, double R if (dX != 0) gamma = atan(dY * 1.0 / dX); else if (dY > 0) - gamma = pi * 1.0 / 2; + gamma = M_PI * 1.0 / 2; else - gamma = 3 * pi * 1.0 / 2; + gamma = 3 * M_PI * 1.0 / 2; if (R != 0) alfa = L * 1.0 / R; Xout = X0 + L * cos(alfa * 1.0 / 2 - gamma); Yout = Y0 + L * sin(alfa * 1.0 / 2 - gamma); } -/*graficzne:*/ +bool FileExists( std::string const &Filename ) { + + std::ifstream file( Filename ); + if( file.is_open() == false ) { return false; } + else { return true; } +} + +/* +//graficzne: double Xhor(double h) { @@ -515,7 +544,9 @@ long Vert(double Y) else return -INT_MAX; } +*/ +// NOTE: this now does nothing. void ClearPendingExceptions() // resetuje błędy FPU, wymagane dla Trunc() { @@ -525,4 +556,3 @@ void ClearPendingExceptions() } // END - diff --git a/McZapkie/mctools.h b/McZapkie/mctools.h index 6f1332f0..7e7835b7 100644 --- a/McZapkie/mctools.h +++ b/McZapkie/mctools.h @@ -1,7 +1,4 @@ #pragma once -#ifndef INCLUDED_MCTOOLS_H -#define INCLUDED_MCTOOLS_H - /* This Source Code Form is subject to the @@ -17,13 +14,11 @@ http://mozilla.org/MPL/2.0/. #include #include -#include +#include #include #include #include -using namespace std; - /*Ra: te stałe nie są używane... _FileName = ['a'..'z','A'..'Z',':','\','.','*','?','0'..'9','_','-']; _RealNum = ['0'..'9','-','+','.','E','e']; @@ -34,13 +29,11 @@ using namespace std; _Delimiter_Space=_Delimiter+[' ']; */ static char _EOL[2] = { (char)13, (char)10 }; - //static char const _SPACE = " "; -static char _Spacesigns[4] = { (char)" ",(char)9, (char)13, (char)10}; -static string _spacesigns = " " + (char)9 + (char)13 + (char)10; +static char _Spacesigns[4] = { (char)' ', (char)9, (char)13, (char)10 }; +static std::string _spacesigns = " " + (char)9 + (char)13 + (char)10; static int const CutLeft = -1; static int const CutRight = 1; static int const CutBoth = 0; /*Cut_Space*/ -static double const pi = 3.141592653589793; extern int ConversionError; extern int LineCount; @@ -77,14 +70,14 @@ inline long Round(float f) inline int Random() { - srand(time(NULL)); - return rand(); + std::srand(std::time(NULL)); + return std::rand(); } inline double Random(double a, double b) { - srand(time(NULL)); - return a + rand() / (float)RAND_MAX * (b - a); + std::srand(std::time(NULL)); + return a + std::rand() / (float)RAND_MAX * (b - a); } inline double Random(double b) @@ -92,16 +85,6 @@ inline double Random(double b) return Random(0.0, b); } -inline double abs(double _val) -{ - return _val < 0 ? -_val : _val; -} - -inline long abs(long _val) -{ - return _val < 0 ? -_val : _val; -} - inline double BorlandTime() { std::tm epoch; @@ -116,6 +99,8 @@ inline double BorlandTime() return (difftime(raw_t, basetime) / 24) + 2; } +std::string Now(); + /*funkcje logiczne*/ extern bool TestFlag(int Flag, int Value); extern bool SetFlag( int & Flag, int Value); @@ -135,9 +120,9 @@ char* TrimAndReduceSpaces(const char* s); std::string ExtractKeyWord(std::string InS, std::string KeyWord); /*wyciaga slowo kluczowe i lancuch do pierwszej spacji*/ std::string DUE(std::string s); /*Delete Until Equal sign*/ std::string DWE(std::string s); /*Delete While Equal sign*/ -std::string Ld2Sp(std::string s); /*Low dash to Space sign*/ -std::string Tab2Sp(std::string s); /*Tab to Space sign*/ -std::string ExchangeCharInString(string s, const char &aim, const char &target); // zamienia jeden znak na drugi +std::string Ld2Sp(std::string const &s); /*Low dash to Space sign*/ +std::string Tab2Sp(std::string const &s); /*Tab to Space sign*/ +std::string ExchangeCharInString(std::string s, const char &aim, const char &target); // zamienia jeden znak na drugi std::vector &Split(const std::string &s, char delim, std::vector &elems); std::vector Split(const std::string &s, char delim); std::vector Split(const std::string &s); @@ -152,25 +137,26 @@ std::string to_string(double _Val, int precision, int width); std::string to_hex_str(double _Val, int precision = 0, int width = 0); inline std::string to_string(bool _Val) { - return to_string((int)_Val); + return _Val == true ? "true" : "false"; } int stol_def(const std::string & str, const int & DefaultValue); -std::string ToLower(std::string text); -std::string ToUpper(std::string text); +std::string ToLower(std::string const &text); +std::string ToUpper(std::string const &text); /*procedury, zmienne i funkcje graficzne*/ void ComputeArc(double X0, double Y0, double Xn, double Yn, double R, double L, double dL, double & phi, double & Xout, double & Yout); /*wylicza polozenie Xout Yout i orientacje phi punktu na elemencie dL luku*/ void ComputeALine(double X0, double Y0, double Xn, double Yn, double L, double R, double & Xout, double & Yout); - +/* inline bool fileExists(const std::string &name) { struct stat buffer; return (stat(name.c_str(), &buffer) == 0); -} - +}*/ +bool FileExists( std::string const &Filename ); +/* extern double Xmin; extern double Ymin; extern double Xmax; @@ -182,20 +168,17 @@ extern double Vstep; extern int Vsize; extern int Hsize; -double Xhor( double h); - /* Converts horizontal screen coordinate into real X-coordinate. */ -double Yver( double v); - /* Converts vertical screen coordinate into real Y-coordinate. */ +// Converts horizontal screen coordinate into real X-coordinate. +double Xhor( double h ); + +// Converts vertical screen coordinate into real Y-coordinate. +double Yver( double v ); long Horiz(double x); long Vert(double Y); +*/ void ClearPendingExceptions(); -/*------------------------------------------------*/ - - -#endif//INCLUDED_MCTOOLS_H -//END diff --git a/MdlMngr.cpp b/MdlMngr.cpp index c8b0303a..a60ecf41 100644 --- a/MdlMngr.cpp +++ b/MdlMngr.cpp @@ -13,23 +13,19 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#include "Texture.h" -#pragma hdrstop - +#include "stdafx.h" #include "MdlMngr.h" + #include "Globals.h" -#include +#include "Logs.h" +#include "McZapkie/mctools.h" -#define SeekFiles AnsiString("*.t3d") +//#define SeekFiles std::string("*.t3d") -TModel3d * TMdlContainer::LoadModel(char *newName, bool dynamic) +TModel3d * TMdlContainer::LoadModel(std::string const &NewName, bool dynamic) { // wczytanie modelu do kontenerka - SafeDeleteArray(Name); SafeDelete(Model); - Name = new char[strlen(newName) + 1]; - strcpy(Name, newName); + Name = NewName; Model = new TModel3d(); if (!Model->LoadFromFile(Name, dynamic)) // np. "models\\pkp/head1-y.t3d" SafeDelete(Model); @@ -38,7 +34,7 @@ TModel3d * TMdlContainer::LoadModel(char *newName, bool dynamic) TMdlContainer *TModelsManager::Models; int TModelsManager::Count; -const MAX_MODELS = 1000; +int const MAX_MODELS = 1000; void TModelsManager::Init() { @@ -63,7 +59,7 @@ void TModelsManager::Free() SafeDeleteArray(Models); } -TModel3d * TModelsManager::LoadModel(char *Name, bool dynamic) +TModel3d * TModelsManager::LoadModel(std::string const &Name, bool dynamic) { // wczytanie modelu do tablicy TModel3d *mdl = NULL; if (Count >= MAX_MODELS) @@ -77,7 +73,7 @@ TModel3d * TModelsManager::LoadModel(char *Name, bool dynamic) return mdl; } -TModel3d * TModelsManager::GetModel(const char *Name, bool dynamic) +TModel3d * TModelsManager::GetModel(std::string const &Name, bool dynamic) { // model może być we wpisie "node...model" albo "node...dynamic", a także być dodatkowym w dynamic // (kabina, wnętrze, ładunek) // dla "node...dynamic" mamy podaną ścieżkę w "\dynamic\" i musi być co najmniej 1 poziom, zwkle @@ -99,7 +95,7 @@ TModel3d * TModelsManager::GetModel(const char *Name, bool dynamic) // - wczytanie uproszczonego wnętrza, ścieżka dokładna, tekstury z katalogu modelu // - niebo animowane, ścieżka brana ze wpisu, tekstury nieokreślone // - wczytanie modelu animowanego - Init() - sprawdzić - char buf[255]; + std::string buf; std::string buftp = Global::asCurrentTexturePath; // zapamiętanie aktualnej ścieżki do tekstur, // bo będzie tyczmasowo zmieniana /* @@ -143,11 +139,11 @@ TModel3d * TModelsManager::GetModel(const char *Name, bool dynamic) } }; */ - if (strchr(Name, '\\') == NULL) + if( Name.find('\\') == std::string::npos ) { - strcpy(buf, "models\\"); // Ra: było by lepiej katalog dodać w parserze - strcat(buf, Name); - if (strchr(Name, '/') != NULL) + buf = "models\\"; // Ra: było by lepiej katalog dodać w parserze + buf.append( Name ); + if( Name.find( '/') != std::string::npos) { Global::asCurrentTexturePath = Global::asCurrentTexturePath + Name; Global::asCurrentTexturePath.erase(Global::asCurrentTexturePath.find("/") + 1, @@ -156,19 +152,19 @@ TModel3d * TModelsManager::GetModel(const char *Name, bool dynamic) } else { - strcpy(buf, Name); + buf = Name; if (dynamic) // na razie tak, bo nie wiadomo, jaki może mieć wpływ na pozostałe modele - if (strchr(Name, '/') != NULL) + if (Name.find( '/') != std::string::npos) { // pobieranie tekstur z katalogu, w którym jest model Global::asCurrentTexturePath = Global::asCurrentTexturePath + Name; Global::asCurrentTexturePath.erase(Global::asCurrentTexturePath.find("/") + 1, Global::asCurrentTexturePath.length() - 1); } } - StrLower(buf); - for (int i = 0; i < Count; i++) + buf = ToLower( buf ); + for (int i = 0; i < Count; ++i) { - if (strcmp(buf, Models[i].Name) == 0) + if ( buf == Models[i].Name ) { Global::asCurrentTexturePath = buftp; return (Models[i].Model); @@ -197,4 +193,3 @@ TModel3d TModelsManager::GetModel(char *Name, AnsiString asReplacableTexture) */ //--------------------------------------------------------------------------- -#pragma package(smart_init) diff --git a/MdlMngr.h b/MdlMngr.h index 9ff23adf..bdd465cd 100644 --- a/MdlMngr.h +++ b/MdlMngr.h @@ -6,8 +6,7 @@ distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef MdlMngrH -#define MdlMngrH +#pragma once #include "Model3d.h" #include "usefull.h" @@ -17,17 +16,15 @@ class TMdlContainer friend class TModelsManager; TMdlContainer() { - Name = NULL; Model = NULL; }; ~TMdlContainer() { - SafeDeleteArray(Name); SafeDelete(Model); }; - TModel3d * LoadModel(char *newName, bool dynamic); + TModel3d * LoadModel(std::string const &NewName, bool dynamic); TModel3d *Model; - char *Name; + std::string Name; }; class TModelsManager @@ -35,7 +32,7 @@ class TModelsManager private: static TMdlContainer *Models; static int Count; - static TModel3d * LoadModel(char *Name, bool dynamic); + static TModel3d * LoadModel(std::string const &Name, bool dynamic); public: // TModelsManager(); @@ -43,7 +40,6 @@ class TModelsManager static void Init(); static void Free(); // McZapkie: dodalem sciezke, notabene Path!=Patch :) - static TModel3d * GetModel(const char *Name, bool dynamic = false); + static TModel3d * GetModel(std::string const &Name, bool dynamic = false); }; //--------------------------------------------------------------------------- -#endif diff --git a/MemCell.cpp b/MemCell.cpp index 3dcb98b2..cef4451d 100644 --- a/MemCell.cpp +++ b/MemCell.cpp @@ -13,21 +13,16 @@ http://mozilla.org/MPL/2.0/. */ -//#include "system.hpp" -//#include "classes.hpp" -#pragma hdrstop - -#include "Driver.h" -#include "mctools.h" +#include "stdafx.h" #include "MemCell.h" + +#include "Globals.h" +#include "Logs.h" +#include "Usefull.h" +#include "Driver.h" #include "Event.h" #include "parser.h" -#include "Usefull.h" -#include "Globals.h" - -//--------------------------------------------------------------------------- -#pragma package(smart_init) //--------------------------------------------------------------------------- TMemCell::TMemCell(vector3 *p) @@ -148,17 +143,35 @@ bool TMemCell::Compare(char *szTestText, double fTestValue1, double fTestValue2, { // porównanie zawartości komórki pamięci z podanymi wartościami if (TestFlag(CheckMask, conditional_memstring)) { // porównać teksty - char *pos = StrPos(szTestText, "*"); // zwraca wskaźnik na pozycję albo NULL - if (pos) - { // porównanie fragmentu łańcucha - int i = pos - szTestText; // ilość porównywanych znaków - if (i) // jeśli nie jest pierwszym znakiem - if (AnsiString(szTestText, i) != AnsiString(szText, i)) - return false; // początki o długości (i) są różne +/* char *pos = std::strstr(szTestText, "*"); // zwraca wskaźnik na pozycję albo NULL + if( nullptr != pos ) { // porównanie fragmentu łańcucha + int i = pos - szTestText; // ilość porównywanych znaków + if( i ) { // jeśli nie jest pierwszym znakiem + if( std::string( szTestText ).substr( 0, i ) != std::string( szText ).substr( 0, i ) ) { + return false; // początki o długości (i) są różne + } + } } - else if (AnsiString(szTestText) != AnsiString(szText)) - return false; //łąńcuchy są różne - } + else if( std::string( szTestText ) != std::string( szText ) ) { + return false; //łąńcuchy są różne + } +*/ std::string + source( szText ), + match( szTestText ); + auto range = match.find( '*' ); + if( range != std::string::npos ) { + // compare string parts + if( 0 != source.compare( 0, range, match, 0, range ) ) { + return false; + } + } + else { + // compare full strings + if( source != match ) { + return false; + } + } + } // tekst zgodny, porównać resztę return ((!TestFlag(CheckMask, conditional_memval1) || (fValue1 == fTestValue1)) && (!TestFlag(CheckMask, conditional_memval2) || (fValue2 == fTestValue2))); diff --git a/Model3d.cpp b/Model3d.cpp index 10160151..033b28d5 100644 --- a/Model3d.cpp +++ b/Model3d.cpp @@ -12,19 +12,17 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "Model3d.h" + +#include "Globals.h" +#include "logs.h" +#include "mczapkie/mctools.h" #include "Usefull.h" #include "Texture.h" -#include "logs.h" -#include "Globals.h" #include "Timer.h" #include "mtable.h" //--------------------------------------------------------------------------- -#pragma package(smart_init) using namespace Mtable; @@ -33,7 +31,7 @@ int TSubModel::iInstance; // numer renderowanego egzemplarza obiektu GLuint *TSubModel::ReplacableSkinId = NULL; int TSubModel::iAlpha = 0x30300030; // maska do testowania flag tekstur wymiennych TModel3d *TSubModel::pRoot; // Ra: tymczasowo wskaźnik na model widoczny z submodelu -AnsiString *TSubModel::pasText; +std::string *TSubModel::pasText; // przykłady dla TSubModel::iAlpha: // 0x30300030 - wszystkie bez kanału alfa // 0x31310031 - tekstura -1 używana w danym cyklu, pozostałe nie @@ -185,7 +183,7 @@ void TSubModel::NameSet(const char *n) // 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) +int TSubModel::SeekFaceNormal(unsigned int *Masks, int f, unsigned int dwMask, float3 *pt, float8 *Vertices) { // szukanie punktu stycznego // do (pt), zwraca numer // wierzchołka, a nie trójkąta @@ -211,26 +209,30 @@ float emm2[] = {0, 0, 0, 1}; inline double readIntAsDouble(cParser &parser, int base = 255) { - int value; - parser.getToken(value); - return double(value) / base; + int value = parser.getToken(false); + return ( static_cast(value) / base ); }; template inline void readColor(cParser &parser, ColorT *color) { - parser.ignoreToken(); - color[0] = readIntAsDouble(parser); - color[1] = readIntAsDouble(parser); - color[2] = readIntAsDouble(parser); + double discard; + parser.getTokens( 4, false ); + parser + >> discard + >> color[ 0 ] + >> color[ 1 ] + >> color[ 2 ]; }; inline void readColor(cParser &parser, int &color) { - int r, g, b; - parser.ignoreToken(); - parser.getToken(r); - parser.getToken(g); - parser.getToken(b); + int r, g, b, discard; + parser.getTokens( 4, false ); + parser + >> discard + >> r + >> g + >> b; color = r + (g << 8) + (b << 16); }; /* @@ -243,9 +245,10 @@ inline void readMatrix(cParser& parser,matrix4x4& matrix) */ inline void readMatrix(cParser &parser, float4x4 &matrix) { // Ra: wczytanie transforma - for (int x = 0; x <= 3; x++) // wiersze - for (int y = 0; y <= 3; y++) // kolumny - parser.getToken(matrix(x)[y]); + parser.getTokens( 16, false ); + for( int x = 0; x <= 3; ++x ) // wiersze + for( int y = 0; y <= 3; ++y ) // kolumny + parser >> matrix( x )[ y ]; }; int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) @@ -258,8 +261,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) if (!parser.expectToken("type:")) Error("Model type parse failure!"); { - std::string type; - parser.getToken(type); + std::string type = parser.getToken(); if (type == "mesh") eType = GL_TRIANGLES; // submodel - trójkaty else if (type == "point") @@ -291,8 +293,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) if (parser.expectToken("anim:")) // Ra: ta informacja by się przydała! { // rodzaj animacji - std::string type; - parser.getToken(type); + std::string type = parser.getToken(); if (type != "false") { iFlags |= 0x4000; // jak animacja, to trzeba przechowywać macierz zawsze @@ -341,55 +342,57 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) readColor(parser, f4Specular); parser.ignoreTokens(1); // zignorowanie nazwy "SelfIllum:" { - std::string light; - parser.getToken(light); + std::string light = parser.getToken(); if (light == "true") fLight = 2.0; // zawsze świeci else if (light == "false") fLight = -1.0; // zawsze ciemy else - fLight = atof(light.c_str()); + fLight = std::stod(light); }; if (eType == TP_FREESPOTLIGHT) { - if (!parser.expectToken("nearattenstart:")) - Error("Model light parse failure!"); - parser.getToken(fNearAttenStart); - parser.ignoreToken(); - parser.getToken(fNearAttenEnd); - parser.ignoreToken(); - bUseNearAtten = parser.expectToken("true"); - parser.ignoreToken(); - parser.getToken(iFarAttenDecay); - parser.ignoreToken(); - parser.getToken(fFarDecayRadius); - parser.ignoreToken(); - parser.getToken(fCosFalloffAngle); // kąt liczony dla średnicy, a nie promienia - fCosFalloffAngle = cos(DegToRad(0.5 * fCosFalloffAngle)); - parser.ignoreToken(); - parser.getToken(fCosHotspotAngle); // kąt liczony dla średnicy, a nie promienia - fCosHotspotAngle = cos(DegToRad(0.5 * fCosHotspotAngle)); + if( !parser.expectToken( "nearattenstart:" ) ) { Error( "Model light parse failure!" ); } + std::string discard; + parser.getTokens( 13, false ); + parser + >> fNearAttenStart + >> discard + >> fNearAttenEnd + >> discard + >> bUseNearAtten + >> discard + >> iFarAttenDecay + >> discard + >> fFarDecayRadius + >> discard + >> fCosFalloffAngle // kąt liczony dla średnicy, a nie promienia + >> discard + >> fCosHotspotAngle; // kąt liczony dla średnicy, a nie promienia + fCosFalloffAngle = cos( DegToRad( 0.5 * fCosFalloffAngle ) ); + fCosHotspotAngle = cos( DegToRad( 0.5 * fCosHotspotAngle ) ); iNumVerts = 1; iFlags |= 0x4010; // rysowane w cyklu nieprzezroczystych, macierz musi // zostać bez zmiany } else if (eType < TP_ROTATOR) { - parser.ignoreToken(); - bWire = parser.expectToken("true"); - parser.ignoreToken(); - parser.getToken(fWireSize); - parser.ignoreToken(); - Opacity = readIntAsDouble(parser, - 100.0f); // wymagane jest 0 dla szyb, 100 idzie w nieprzezroczyste + std::string discard; + parser.getTokens( 5, false ); + parser + >> discard + >> bWire + >> discard + >> fWireSize + >> discard; + Opacity = readIntAsDouble(parser, 100.0f); // wymagane jest 0 dla szyb, 100 idzie w nieprzezroczyste if (Opacity > 1.0) Opacity *= 0.01; // w 2013 był błąd i aby go obejść, trzeba było wpisać 10000.0 if ((Global::iConvertModels & 1) == 0) // dla zgodności wstecz Opacity = 0.0; // wszystko idzie w przezroczyste albo zależnie od tekstury if (!parser.expectToken("map:")) Error("Model map parse failure!"); - std::string texture; - parser.getToken(texture); + std::string texture = parser.getToken(); if (texture == "none") { // rysowanie podanym kolorem TextureID = 0; @@ -444,32 +447,37 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) } else iFlags |= 0x10; - parser.ignoreToken(); - parser.getToken(fSquareMaxDist); - if (fSquareMaxDist >= 0.0) - fSquareMaxDist *= fSquareMaxDist; - else - fSquareMaxDist = 15000 * 15000; // 15km to więcej, niż się obecnie wyświetla - parser.ignoreToken(); - parser.getToken(fSquareMinDist); + + std::string discard; + parser.getTokens( 5, false ); + parser + >> discard + >> fSquareMaxDist + >> discard + >> fSquareMinDist + >> discard; + + if( fSquareMaxDist >= 0.0 ) { fSquareMaxDist *= fSquareMaxDist; } + else { fSquareMaxDist = 15000 * 15000; }// 15km to więcej, niż się obecnie wyświetla fSquareMinDist *= fSquareMinDist; - parser.ignoreToken(); fMatrix = new float4x4(); readMatrix(parser, *fMatrix); // wczytanie transform if (!fMatrix->IdentityIs()) iFlags |= 0x8000; // transform niejedynkowy - trzeba go przechować int iNumFaces; // ilość trójkątów - DWORD *sg; // maski przynależności trójkątów do powierzchni + unsigned int *sg; // maski przynależności trójkątów do powierzchni if (eType < TP_ROTATOR) { // wczytywanie wierzchołków - parser.ignoreToken(); + parser.getTokens( 2, false ); + parser + >> discard + >> token; // 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 @@ -482,7 +490,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) if (iNumVerts % 3) { iNumVerts = 0; - Error("Mesh error, (iNumVertices=" + AnsiString(iNumVerts) + ")%3<>0"); + Error("Mesh error, (iNumVertices=" + std::to_string(iNumVerts) + ")%3<>0"); return 0; } // Vertices=new GLVERTEX[iNumVerts]; @@ -490,7 +498,7 @@ 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 + sg = new unsigned int[iNumFaces]; // maski powierzchni: 0 oznacza brak // użredniania wektorów normalnych int *wsp = new int[iNumVerts]; // z którego wierzchołka kopiować wektor // normalny @@ -503,23 +511,29 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) { // 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 + maska = parser.getToken(false); // 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 } - parser.getToken(Vertices[i].Point.x); - parser.getToken(Vertices[i].Point.y); - parser.getToken(Vertices[i].Point.z); + parser.getTokens( 3, false ); + parser + >> Vertices[i].Point.x + >> Vertices[i].Point.y + >> Vertices[i].Point.z; if (maska == -1) { // jeśli wektory normalne podane jawnie - parser.getToken(Vertices[i].Normal.x); - parser.getToken(Vertices[i].Normal.y); - parser.getToken(Vertices[i].Normal.z); + parser.getTokens( 3, false ); + parser + >> Vertices[i].Normal.x + >> Vertices[i].Normal.y + >> Vertices[i].Normal.z; wsp[i] = i; // wektory normalne "są już policzone" } - parser.getToken(Vertices[i].tu); - parser.getToken(Vertices[i].tv); + parser.getTokens( 2, false ); + parser + >> Vertices[i].tu + >> Vertices[i].tv; if (i % 3 == 2) // jeżeli wczytano 3 punkty { if (Vertices[i].Point == Vertices[i - 1].Point || @@ -529,8 +543,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) --iNumFaces; // o jeden trójkąt mniej iNumVerts -= 3; // czyli o 3 wierzchołki i -= 3; // wczytanie kolejnego w to miejsce - WriteLog(AnsiString("Degenerated triangle ignored in: \"") + - AnsiString(pName) + "\", verticle " + AnsiString(i)); + WriteLog(std::string("Degenerated triangle ignored in: \"") + pName + "\", verticle " + std::to_string(i)); } if (i > 0) // jeśli pierwszy trójkąt będzie zdegenerowany, to // zostanie usunięty i nie ma co sprawdzać @@ -544,8 +557,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) --iNumFaces; // o jeden trójkąt mniej iNumVerts -= 3; // czyli o 3 wierzchołki i -= 3; // wczytanie kolejnego w to miejsce - WriteLog(AnsiString("Too large triangle ignored in: \"") + - AnsiString(pName) + "\""); + WriteLog( std::string("Too large triangle ignored in: \"") + pName + "\""); } } } @@ -600,20 +612,26 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) else if (eType == TP_STARS) { // punkty świecące dookólnie - składnia jak // dla smt_Mesh - parser.ignoreToken(); - parser.getToken(iNumVerts); + std::string discard; + parser.getTokens( 2, false ); + parser + >> discard + >> iNumVerts; // Vertices=new GLVERTEX[iNumVerts]; Vertices = new float8[iNumVerts]; int i, j; for (i = 0; i < iNumVerts; i++) { - if (i % 3 == 0) - parser.ignoreToken(); // maska powierzchni trójkąta - parser.getToken(Vertices[i].Point.x); - parser.getToken(Vertices[i].Point.y); - parser.getToken(Vertices[i].Point.z); - parser.getToken(j); // zakodowany kolor - parser.ignoreToken(); + if( i % 3 == 0 ) { + parser.ignoreToken(); // maska powierzchni trójkąta + } + parser.getTokens( 5, false ); + parser + >> Vertices[ i ].Point.x + >> Vertices[ i ].Point.y + >> Vertices[ i ].Point.z + >> j // zakodowany kolor + >> discard; Vertices[i].Normal.x = ((j)&0xFF) / 255.0; // R Vertices[i].Normal.y = ((j >> 8) & 0xFF) / 255.0; // G Vertices[i].Normal.z = ((j >> 16) & 0xFF) / 255.0; // B @@ -858,7 +876,7 @@ int TSubModel::FlagsCheck() // samo pomijanie glBindTexture() nie poprawi wydajności // ale można sprawdzić, czy można w ogóle pominąć kod do tekstur (sprawdzanie // replaceskin) - int i; + int i = 0; if (Child) { // Child jest renderowany po danym submodelu if (Child->TextureID) // o ile ma teksturę @@ -961,12 +979,12 @@ struct ToLower } }; -TSubModel * TSubModel::GetFromName(AnsiString search, bool i) +TSubModel * TSubModel::GetFromName(std::string const &search, bool i) { return GetFromName(search.c_str(), i); }; -TSubModel * TSubModel::GetFromName(char *search, bool i) +TSubModel * TSubModel::GetFromName(char const *search, bool i) { TSubModel *result; // std::transform(search.begin(),search.end(),search.begin(),ToLower()); @@ -1231,7 +1249,7 @@ void TSubModel::RenderAlphaDL() if (eType == TP_TEXT) { // tekst renderujemy w specjalny sposób, zamiast // submodeli z łańcucha Child - int i, j = pasText->Length(); + int i, j = pasText->size(); TSubModel *p; char c; if (!smLetter) @@ -1540,17 +1558,16 @@ void TSubModel::Info() { 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); - else if (t.SubString(t.Length() - 3, 4) == ".dds") - t.Delete(t.Length() - 3, 4); - if (t != AnsiString(pTexture)) + std::string t( pTexture ); + // trim extension + if( t.substr( t.rfind( '.' ) ) == ".tga" ) { t.erase( t.rfind( '.' ) ); } + else if( t.substr( t.rfind( '.' ) ) == ".dds" ) { t.erase( t.rfind( '.' ) ); } + if (t != std::string(pTexture)) { // jeśli się zmieniło // pName=new char[token.length()+1]; //nie ma sensu skracać tabeli strcpy(pTexture, t.c_str()); } - info->iTextureLen = t.Length() + 1; // przygotowanie do zapisania, z zerem na końcu + info->iTextureLen = t.size() + 1; // przygotowanie do zapisania, z zerem na końcu } } else @@ -1603,17 +1620,19 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS if (n && (iName >= 0)) { pName = n->String(iName); - AnsiString s = AnsiString(pName); - if (!s.IsEmpty()) + std::string name(pName); + if( false == name.empty() ) { // 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 + if( (name.size() >= 8) && (name.substr( 0, 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" - 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 + else if( dynamic ) {// inaczej wyłączało smugę w latarniach + if( (name.size() >= 3) && (name.substr( name.size() - 3, 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" } } @@ -1624,8 +1643,8 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS // TextureID=TTexturesManager::GetTextureID(t->String(TextureID)); // asTexture=AnsiString(t->String(iTexture)); pTexture = t->String(iTexture); - string tex = pTexture; - if (tex.find_last_of("/\\") == string::npos) + std::string tex = pTexture; + if (tex.find_last_of("/\\") == std::string::npos) tex.insert(0, Global::asCurrentTexturePath); TextureID = TTexturesManager::GetTextureID( szTexturePath, const_cast(Global::asCurrentTexturePath.c_str()), tex); @@ -1803,17 +1822,16 @@ TMaterial* TModel3d::GetMaterialFromName(char *sName) } */ -bool TModel3d::LoadFromFile(char *FileName, bool dynamic) -{ // wczytanie modelu z pliku - AnsiString name = AnsiString(FileName).LowerCase(); - int i = name.LastDelimiter("."); - if (i) - if (name.SubString(i, name.Length() - i + 1) == ".t3d") - name.Delete(i, 4); - asBinary = name + ".e3d"; +bool TModel3d::LoadFromFile(std::string const &FileName, bool dynamic) { + // wczytanie modelu z pliku + std::string name = ToLower( FileName ); + // trim extension if needed + if( name.substr( name.rfind( '.' ) ) == ".t3d" ) { name.erase( name.rfind( '.' ) ); } + + asBinary = name + ".e3d"; if (FileExists(asBinary)) { - LoadFromBinFile(asBinary.c_str(), dynamic); + LoadFromBinFile(asBinary, dynamic); asBinary = ""; // wyłączenie zapisu Init(); } @@ -1829,43 +1847,51 @@ bool TModel3d::LoadFromFile(char *FileName, bool dynamic) return Root ? (iSubModelsCount > 0) : false; // brak pliku albo problem z wczytaniem }; -void TModel3d::LoadFromBinFile(char *FileName, bool dynamic) +void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic) { // wczytanie modelu z pliku binarnego - WriteLog("Loading - binary model: " + AnsiString(FileName)); + WriteLog("Loading - binary model: " + FileName); int i = 0, j, k, ch, size; - TFileStream *fs = new TFileStream(AnsiString(FileName), fmOpenRead); + +/* TFileStream *fs = new TFileStream(AnsiString(FileName), fmOpenRead); size = fs->Size >> 2; iModel = new int[size]; // ten wskaźnik musi być w modelu, aby zwolnić pamięć fs->Read(iModel, fs->Size); // wczytanie pliku delete fs; +*/ { + std::ifstream file( FileName, std::ios::binary | std::ios::ate ); file.unsetf( std::ios::skipws ); + size = file.tellg(); // ios::ate already positioned us at the end of the file + iModel = new int[ size >> 2 ]; // ten wskaźnik musi być w modelu, aby zwolnić pamięć + file.seekg( 0, std::ios::beg ); // rewind the caret afterwards + file.read( reinterpret_cast(iModel), size ); + } float4x4 *m = NULL; // transformy // zestaw kromek: while ((i << 2) < size) // w pliku może być kilka modeli { ch = iModel[i]; // nazwa kromki j = i + (iModel[i + 1] >> 2); // początek następnej kromki - if (ch == 'E3D0') // główna: 'E3D0',len,pod-kromki + if( ch == MAKE_ID4('E','3','D','0')) // główna: 'E3D0',len,pod-kromki { // tylko tę kromkę znamy, może kiedyś jeszcze DOF się zrobi i += 2; while (i < j) { // przetwarzanie kromek wewnętrznych - ch = iModel[i]; // nazwa kromki + ch = iModel[ i ]; // nazwa kromki k = (iModel[i + 1] >> 2); // długość aktualnej kromki switch (ch) { - case 'MDL0': // zmienne modelu: 'E3D0',len,(informacje o modelu) + case MAKE_ID4('M','D','L','0'): // zmienne modelu: 'E3D0',len,(informacje o modelu) break; - case 'VNT0': // wierzchołki: 'VNT0',len,(32 bajty na wierzchołek) + case MAKE_ID4('V','N','T','0'): // wierzchołki: 'VNT0',len,(32 bajty na wierzchołek) iNumVerts = (k - 2) >> 3; m_nVertexCount = iNumVerts; m_pVNT = (CVertNormTex *)(iModel + i + 2); break; - case 'SUB0': // submodele: 'SUB0',len,(256 bajtów na submodel) + case MAKE_ID4('S','U','B','0'): // submodele: 'SUB0',len,(256 bajtów na submodel) iSubModelsCount = (k - 2) / 64; Root = (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy później break; - case 'SUB1': // submodele: 'SUB1',len,(320 bajtów na submodel) + case MAKE_ID4('S','U','B','1'): // submodele: 'SUB1',len,(320 bajtów na submodel) iSubModelsCount = (k - 2) / 80; Root = (TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy później @@ -1873,32 +1899,32 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic) ++ch) // trzeba przesunąć bliżej, bo 256 wystarczy MoveMemory(((char *)Root) + 256 * ch, ((char *)Root) + 320 * ch, 256); break; - case 'TRA0': // transformy: 'TRA0',len,(64 bajty na transform) + case MAKE_ID4('T','R','A','0'): // transformy: 'TRA0',len,(64 bajty na transform) m = (float4x4 *)(iModel + i + 2); // tabela transformów break; - case 'TRA1': // transformy: 'TRA1',len,(128 bajtów na transform) + case MAKE_ID4('T','R','A','1'): // transformy: 'TRA1',len,(128 bajtów na transform) m = (float4x4 *)(iModel + i + 2); // tabela transformów for (ch = 0; ch < ((k - 2) >> 1); ++ch) *(((float *)m) + ch) = *(((double *)m) + ch); // przepisanie double do float break; - case 'IDX1': // indeksy 1B: 'IDX2',len,(po bajcie na numer wierzchołka) + case MAKE_ID4('I','D','X','1'): // indeksy 1B: 'IDX2',len,(po bajcie na numer wierzchołka) break; - case 'IDX2': // indeksy 2B: 'IDX2',len,(po 2 bajty na numer wierzchołka) + case MAKE_ID4('I','D','X','2'): // indeksy 2B: 'IDX2',len,(po 2 bajty na numer wierzchołka) break; - case 'IDX4': // indeksy 4B: 'IDX4',len,(po 4 bajty na numer wierzchołka) + case MAKE_ID4('I','D','X','4'): // indeksy 4B: 'IDX4',len,(po 4 bajty na numer wierzchołka) break; - case 'TEX0': // tekstury: 'TEX0',len,(łańcuchy zakończone zerem - pliki + case MAKE_ID4('T','E','X','0'): // 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 + case MAKE_ID4('T','I','X','0'): // indeks nazw tekstur Textures.InitIndex((int *)(iModel + i)); //łącznie z nagłówkiem break; - case 'NAM0': // nazwy: 'NAM0',len,(łańcuchy zakończone zerem - nazwy + case MAKE_ID4('N','A','M','0'): // 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 + case MAKE_ID4('N','I','X','0'): // indeks nazw submodeli Names.InitIndex((int *)(iModel + i)); //łącznie z nagłówkiem break; } @@ -1920,31 +1946,28 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic) return; }; -void TModel3d::LoadFromTextFile(char *FileName, bool dynamic) +void TModel3d::LoadFromTextFile(std::string const &FileName, bool dynamic) { // wczytanie submodelu z pliku tekstowego - WriteLog("Loading - text model: " + AnsiString(FileName)); + WriteLog("Loading - text model: " + FileName); iFlags |= 0x0200; // wczytano z pliku tekstowego (właścicielami tablic są submodle) cParser parser(FileName, cParser::buffer_FILE); // Ra: tu powinno być "models\\"... TSubModel *SubModel; - std::string token; - parser.getToken(token); + std::string token = parser.getToken(); iNumVerts = 0; // w konstruktorze to jest while (token != "" || parser.eof()) { 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 + AddToNamed(parent.c_str(), SubModel); // będzie potrzebne do wyliczenia pozycji, np. pantografu // iSubModelsCount++; - parser.getToken(token); + parser.getTokens(); parser >> token; } // Ra: od wersji 334 przechylany jest cały model, a nie tylko pierwszy // submodel @@ -1988,7 +2011,7 @@ void TModel3d::Init() Root->InitialRotate(true); // argumet określa, czy wykonać pierwotny obrót } iFlags |= Root->FlagsCheck() | 0x8000; // flagi całego modelu - if (!asBinary.IsEmpty()) // jeśli jest podana nazwa + if (false == asBinary.empty()) // jeśli jest podana nazwa { if (Global::iConvertModels) // i włączony zapis SaveToBinFile(asBinary.c_str()); // utworzy tablicę (m_pVNT) @@ -2022,7 +2045,7 @@ void TModel3d::Init() } }; -void TModel3d::SaveToBinFile(char *FileName) +void TModel3d::SaveToBinFile(char const *FileName) { // zapis modelu binarnego WriteLog("Saving E3D binary model."); int i, zero = 0; @@ -2048,60 +2071,59 @@ void TModel3d::SaveToBinFile(char *FileName) if (nam) nam += 8; len = 8 + sub + tra + vnt + tex + ((-tex) & 3) + nam + ((-nam) & 3); - TSubModel *roboczy = new TSubModel(); // bufor używany do zapisywania - // AnsiString *asN=&roboczy->asName,*asT=&roboczy->asTexture; - // roboczy->FirstInit(); //żeby delete nie usuwało czego nie powinno - TFileStream *fs = new TFileStream(AnsiString(FileName), fmCreate); - fs->Write("E3D0", 4); // kromka główna - fs->Write(&len, 4); - { - fs->Write("SUB0", 4); // dane submodeli - fs->Write(&sub, 4); - for (i = 0; i < iSubModelsCount; ++i) - { - roboczy->InfoSet(info + i); - fs->Write(roboczy, sizeof(TSubModel)); // zapis jednego submodelu - } - } - if (tra) - { // zapis transformów - fs->Write("TRA0", 4); // transformy - fs->Write(&tra, 4); - for (i = 0; i < iSubModelsCount; ++i) - if (info[i].iTransform >= 0) - fs->Write(info[i].pSubModel->GetMatrix(), 16 * 4); - } - { // zapis wierzchołków - MakeArray(iNumVerts); // tworzenie tablic dla VBO - Root->RaArrayFill(m_pVNT); // wypełnianie tablicy - fs->Write("VNT0", 4); // wierzchołki - fs->Write(&vnt, 4); - fs->Write(m_pVNT, 32 * iNumVerts); - } - if (tex) // może być jeden submodel ze zmienną teksturą i nazwy nie będzie - { // zapis nazw tekstur - fs->Write("TEX0", 4); // nazwy tekstur - i = (tex + 3) & ~3; // zaokrąglenie w górę - fs->Write(&i, 4); - fs->Write(&zero, 1); // ciąg o numerze zero nie jest używany, ma tylko znacznik końca - for (i = 0; i < iSubModelsCount; ++i) - if (info[i].iTextureLen) - fs->Write(info[i].pSubModel->pTexture, info[i].iTextureLen); - if ((-tex) & 3) - fs->Write(&zero, ((-tex) & 3)); // wyrównanie do wielokrotności 4 bajtów - } - if (nam) // może być jeden anonimowy submodel w modelu - { // zapis nazw submodeli - fs->Write("NAM0", 4); // nazwy submodeli - i = (nam + 3) & ~3; // zaokrąglenie w górę - fs->Write(&i, 4); - for (i = 0; i < iSubModelsCount; ++i) - if (info[i].iNameLen) - fs->Write(info[i].pSubModel->pName, info[i].iNameLen); - if ((-nam) & 3) - fs->Write(&zero, ((-nam) & 3)); // wyrównanie do wielokrotności 4 bajtów - } - delete fs; + TSubModel *roboczy = new TSubModel(); // bufor używany do zapisywania + // AnsiString *asN=&roboczy->asName,*asT=&roboczy->asTexture; + // roboczy->FirstInit(); //żeby delete nie usuwało czego nie powinno + /* TFileStream *fs = new TFileStream(AnsiString(FileName), fmCreate); +*/ { + std::ofstream file( FileName, std::ios::binary ); file.unsetf( std::ios::skipws ); + file.write( "E3D0", 4 ); // kromka główna + file.write( reinterpret_cast( &len ), 4 ); + + file.write( "SUB0", 4 ); // dane submodeli + file.write( reinterpret_cast( &sub ), 4 ); + for( i = 0; i < iSubModelsCount; ++i ) { + roboczy->InfoSet( info + i ); + file.write( reinterpret_cast( roboczy ), sizeof( TSubModel ) ); // zapis jednego submodelu + } + if( tra ) { // zapis transformów + file.write( "TRA0", 4 ); // transformy + file.write( reinterpret_cast( &tra ), 4 ); + for( i = 0; i < iSubModelsCount; ++i ) + if( info[ i ].iTransform >= 0 ) + file.write( reinterpret_cast( info[ i ].pSubModel->GetMatrix() ), 16 * 4 ); + } + { // zapis wierzchołków + MakeArray( iNumVerts ); // tworzenie tablic dla VBO + Root->RaArrayFill( m_pVNT ); // wypełnianie tablicy + file.write( "VNT0", 4 ); // wierzchołki + file.write( reinterpret_cast( &vnt ), 4 ); + file.write( reinterpret_cast( m_pVNT ), 32 * iNumVerts ); + } + if( tex ) // może być jeden submodel ze zmienną teksturą i nazwy nie będzie + { // zapis nazw tekstur + file.write( "TEX0", 4 ); // nazwy tekstur + i = ( tex + 3 ) & ~3; // zaokrąglenie w górę + file.write( reinterpret_cast( &i ), 4 ); + file.write( reinterpret_cast( &zero ), 1 ); // ciąg o numerze zero nie jest używany, ma tylko znacznik końca + for( i = 0; i < iSubModelsCount; ++i ) + if( info[ i ].iTextureLen ) + file.write( info[ i ].pSubModel->pTexture, info[ i ].iTextureLen ); + if( ( -tex ) & 3 ) + file.write( reinterpret_cast( &zero ), ( ( -tex ) & 3 ) ); // wyrównanie do wielokrotności 4 bajtów + } + if( nam ) // może być jeden anonimowy submodel w modelu + { // zapis nazw submodeli + file.write( "NAM0", 4 ); // nazwy submodeli + i = ( nam + 3 ) & ~3; // zaokrąglenie w górę + file.write( reinterpret_cast( &i ), 4 ); + for( i = 0; i < iSubModelsCount; ++i ) + if( info[ i ].iNameLen ) + file.write( info[ i ].pSubModel->pName, info[ i ].iNameLen ); + if( ( -nam ) & 3 ) + file.write( reinterpret_cast( &zero ), ( ( -nam ) & 3 ) ); // wyrównanie do wielokrotności 4 bajtów + } + } // file autocloses on getting out of scope // roboczy->FirstInit(); //żeby delete nie usuwało czego nie powinno // roboczy->iFlags=0; //żeby delete nie usuwało czego nie powinno // roboczy->asName)=asN; diff --git a/Model3d.h b/Model3d.h index 9ffa52d0..51ddb63e 100644 --- a/Model3d.h +++ b/Model3d.h @@ -13,10 +13,11 @@ http://mozilla.org/MPL/2.0/. #include "opengl/glew.h" #include "Parser.h" #include "dumb3d.h" -using namespace Math3D; #include "Float3d.h" #include "VBO.h" +using namespace Math3D; + struct GLVERTEX { vector3 Point; @@ -206,7 +207,7 @@ class TSubModel // McZapkie-050702: parametry dla swiatla: float fNearAttenStart; float fNearAttenEnd; - int bUseNearAtten; // te 3 zmienne okreslaja rysowanie aureoli wokol zrodla swiatla + bool bUseNearAtten; // te 3 zmienne okreslaja rysowanie aureoli wokol zrodla swiatla int iFarAttenDecay; // ta zmienna okresla typ zaniku natezenia swiatla (0:brak, 1,2: potega 1/R) float fFarDecayRadius; // normalizacja j.w. float fCosFalloffAngle; // cosinus kąta stożka pod którym widać światło @@ -215,7 +216,7 @@ class TSubModel float fCosViewAngle; // cos kata pod jakim sie teraz patrzy // Ra: dalej są zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy int TextureID; // numer tekstury, -1 wymienna, 0 brak - int bWire; // nie używane, ale wczytywane + bool bWire; // nie używane, ale wczytywane // short TexAlpha; //Ra: nie używane już GLuint uiDisplayList; // roboczy numer listy wyświetlania float Opacity; // nie używane, ale wczytywane @@ -246,7 +247,7 @@ class TSubModel private: // int SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX // *Vertices); - int SeekFaceNormal(DWORD *Masks, int f, DWORD dwMask, float3 *pt, float8 *Vertices); + int SeekFaceNormal(unsigned int *Masks, int f, unsigned int dwMask, float3 *pt, float8 *Vertices); void RaAnimation(TAnimType a); public: @@ -255,7 +256,7 @@ class TSubModel static int iAlpha; // maska bitowa dla danego przebiegu static double fSquareDist; static TModel3d *pRoot; - static AnsiString *pasText; // tekst dla wyświetlacza (!!!! do przemyślenia) + static std::string *pasText; // tekst dla wyświetlacza (!!!! do przemyślenia) TSubModel(); ~TSubModel(); void FirstInit(); @@ -280,8 +281,8 @@ class TSubModel void SetTranslate(vector3 vNewTransVector); void SetTranslate(float3 vNewTransVector); void SetRotateIK1(float3 vNewAngles); - TSubModel * GetFromName(AnsiString search, bool i = true); - TSubModel * GetFromName(char *search, bool i = true); + TSubModel * GetFromName(std::string const &search, bool i = true); + TSubModel * GetFromName(char const *search, bool i = true); void RenderDL(); void RenderAlphaDL(); void RenderVBO(); @@ -388,7 +389,7 @@ class TModel3d : public CMesh TStringPack Names; // nazwy submodeli int *iModel; // zawartość pliku binarnego int iSubModelsCount; // Ra: używane do tworzenia binarnych - AnsiString asBinary; // nazwa pod którą zapisać model binarny + std::string asBinary; // nazwa pod którą zapisać model binarny public: inline TSubModel * GetSMRoot() { @@ -402,10 +403,10 @@ class TModel3d : public CMesh // TMaterial* GetMaterialFromName(char *sName); TSubModel * AddToNamed(const char *Name, TSubModel *SubModel); void AddTo(TSubModel *tmp, TSubModel *SubModel); - void LoadFromTextFile(char *FileName, bool dynamic); - void LoadFromBinFile(char *FileName, bool dynamic); - bool LoadFromFile(char *FileName, bool dynamic); - void SaveToBinFile(char *FileName); + void LoadFromTextFile(std::string const &FileName, bool dynamic); + void LoadFromBinFile(std::string const &FileName, bool dynamic); + bool LoadFromFile(std::string const &FileName, bool dynamic); + void SaveToBinFile(char const *FileName); void BreakHierarhy(); // renderowanie specjalne void Render(double fSquareDistance, GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); diff --git a/Names.cpp b/Names.cpp index 6c673e08..9aa7ff03 100644 --- a/Names.cpp +++ b/Names.cpp @@ -7,14 +7,11 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include -#pragma hdrstop - +#include"stdafx.h" #include "Names.h" //--------------------------------------------------------------------------- -#pragma package(smart_init) /* Moduł zarządzający plikami oraz wyszukiwaniem obiektów wg nazw. 1. Ma przydzielony z góry (EU07.INI) obszar pamięci (rzędu 16MB). diff --git a/PyInt.cpp b/PyInt.cpp index 0de4f4d4..75b5c82c 100644 --- a/PyInt.cpp +++ b/PyInt.cpp @@ -1,9 +1,10 @@ +#include "stdafx.h" #include "PyInt.h" #include "Train.h" #include "Logs.h" -#include -#include -#include +//#include +//#include +//#include TPythonInterpreter *TPythonInterpreter::_instance = NULL; @@ -400,15 +401,18 @@ void TPythonScreens::reset(void *train) _train = train; } -void TPythonScreens::init(TQueryParserComp *parser, TModel3d *model, string name, int cab) +void TPythonScreens::init(cParser &parser, TModel3d *model, std::string const &name, int const cab) { char buff[255]; - AnsiString asSubModelName = parser->GetNextSymbol(); - AnsiString asPyClassName = parser->GetNextSymbol(); - char *subModelName = (char *)calloc(asSubModelName.Length() + 1, sizeof(char)); - strcpy(subModelName, asSubModelName.LowerCase().c_str()); - char *pyClassName = (char *)calloc(asPyClassName.Length() + 1, sizeof(char)); - strcpy(pyClassName, asPyClassName.LowerCase().c_str()); + std::string asSubModelName, asPyClassName; + parser.getTokens( 2, false ); + parser + >> asSubModelName + >> asPyClassName; + char *subModelName = (char *)calloc(asSubModelName.length() + 1, sizeof(char)); + strcpy(subModelName, ToLower( asSubModelName).c_str()); + char *pyClassName = (char *)calloc(asPyClassName.length() + 1, sizeof(char)); + strcpy(pyClassName, ToLower( asPyClassName ).c_str()); TSubModel *subModel = model->GetFromName(subModelName); if (subModel == NULL) { @@ -471,7 +475,7 @@ void TPythonScreens::update() _cleanupReadyFlag = true; } -void TPythonScreens::setLookupPath(string path) +void TPythonScreens::setLookupPath(std::string const &path) { if (_lookupPath != NULL) { @@ -566,7 +570,7 @@ void TPythonScreens::start() if (_screens.size() > 0) { _thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ScreenRendererThread, this, - CREATE_SUSPENDED, &_threadId); + CREATE_SUSPENDED, reinterpret_cast(&_threadId)); if (_thread != NULL) { SetThreadPriority(_thread, diff --git a/PyInt.h b/PyInt.h index 20a32072..db9f372a 100644 --- a/PyInt.h +++ b/PyInt.h @@ -3,14 +3,13 @@ #undef _DEBUG // bez tego macra Py_DECREF powoduja problemy przy linkowaniu -#include "Python.h" -#include "QueryParserComp.hpp" -#include "Model3d.h" #include #include #include -using namespace std; +#include "Python.h" +#include "parser.h" +#include "Model3d.h" #define PyGetFloat(param) PyFloat_FromDouble(param >= 0 ? param : -param) #define PyGetFloatS(param) PyFloat_FromDouble(param) @@ -77,8 +76,8 @@ class TPythonScreens bool _cleanupReadyFlag; bool _renderReadyFlag; bool _terminationFlag; - HANDLE _thread; - DWORD _threadId; + void *_thread; + unsigned int _threadId; std::vector _screens; char *_lookupPath; void *_train; @@ -88,8 +87,8 @@ class TPythonScreens public: void reset(void *train); - void setLookupPath(string path); - void init(TQueryParserComp *parser, TModel3d *model, string name, int cab); + void setLookupPath(std::string const &path); + void init(cParser &parser, TModel3d *model, std::string const &name, int const cab); void update(); TPythonScreens(); ~TPythonScreens(); diff --git a/RealSound.cpp b/RealSound.cpp index a493eeb1..e25dd541 100644 --- a/RealSound.cpp +++ b/RealSound.cpp @@ -12,16 +12,13 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - -#include "math.h" +#include "stdafx.h" #include "RealSound.h" #include "Globals.h" -#include "Timer.h" #include "Logs.h" -#include "McZapkie\mctools.h" +//#include "math.h" +#include "Timer.h" +#include "mczapkie/mctools.h" TRealSound::TRealSound() { @@ -55,11 +52,11 @@ void TRealSound::Free() { } -void TRealSound::Init(const char *SoundName, double DistanceAttenuation, double X, double Y, double Z, +void TRealSound::Init(std::string const &SoundName, double DistanceAttenuation, double X, double Y, double Z, bool Dynamic, bool freqmod, double rmin) { // Nazwa=SoundName; //to tak raczej nie zadziała, (SoundName) jest tymczasowe - pSound = TSoundsManager::GetFromName(SoundName, Dynamic, &fFrequency); + pSound = TSoundsManager::GetFromName(SoundName.c_str(), Dynamic, &fFrequency); if (pSound) { if (freqmod) @@ -67,7 +64,7 @@ void TRealSound::Init(const char *SoundName, double DistanceAttenuation, double { // dla modulowanych nie może być zmiany mnożnika, bo częstotliwość w nagłówku byłą // ignorowana, a mogła być inna niż 22050 fFrequency = 22050.0; - ErrorLog("Bad sound: " + string(SoundName) + + ErrorLog("Bad sound: " + std::string(SoundName) + ", as modulated, should have 22.05kHz in header"); } AM = 1.0; @@ -76,7 +73,7 @@ void TRealSound::Init(const char *SoundName, double DistanceAttenuation, double else { // nie ma dźwięku, to jest wysyp AM = 0; - ErrorLog("Missed sound: " + string(SoundName)); + ErrorLog("Missed sound: " + std::string(SoundName)); } if (DistanceAttenuation > 0.0) { @@ -260,14 +257,14 @@ TTextSound::TTextSound(const char *SoundName, double SoundAttenuation, double X, Init(SoundName, SoundAttenuation, X, Y, Z, Dynamic, freqmod, rmin); } -void TTextSound::Init(const char *SoundName, double SoundAttenuation, double X, double Y, double Z, +void TTextSound::Init(std::string const &SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic, bool freqmod, double rmin) { // dodatkowo doczytuje plik tekstowy //TRealSound::Init(SoundName, SoundAttenuation, X, Y, Z, Dynamic, freqmod, rmin); fTime = GetWaveTime(); - AnsiString txt = AnsiString(SoundName); - txt.Delete(txt.Length() - 3, 4); // obcięcie rozszerzenia - for (int i = txt.Length(); i > 0; --i) + std::string txt(SoundName); + txt.erase( txt.rfind( '.' ) ); // obcięcie rozszerzenia + for (int i = txt.length(); i > 0; --i) if (txt[i] == '/') txt[i] = '\\'; // bo nie rozumi txt += "-" + Global::asLang + ".txt"; // już może być w różnych językach @@ -275,39 +272,41 @@ void TTextSound::Init(const char *SoundName, double SoundAttenuation, double X, txt = "sounds\\" + txt; //ścieżka może nie być podana if (FileExists(txt)) { // wczytanie - TFileStream *ts = new TFileStream(txt, fmOpenRead); +/* TFileStream *ts = new TFileStream(txt, fmOpenRead); asText = AnsiString::StringOfChar(' ', ts->Size); ts->Read(asText.c_str(), ts->Size); delete ts; - } +*/ std::ifstream inputfile( txt ); + asText.assign( std::istreambuf_iterator( inputfile ), std::istreambuf_iterator() ); + } }; void TTextSound::Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition) { - if (!asText.IsEmpty()) + if (false == asText.empty()) { // jeśli ma powiązany tekst DWORD stat; pSound->GetStatus(&stat); if (!(stat & DSBSTATUS_PLAYING)) // jeśli nie jest aktualnie odgrywany { - int i; - AnsiString t = asText; + std::string t( asText ); + size_t i; do { // na razie zrobione jakkolwiek, docelowo przenieść teksty do tablicy nazw - i = t.Pos("\r"); // znak nowej linii - if (!i) - Global::tranTexts.Add(t.c_str(), fTime, true); + i = t.find('\r'); // znak nowej linii + if( i == std::string::npos ) { + Global::tranTexts.Add( t.c_str(), fTime, true ); + } else { - Global::tranTexts.Add(t.SubString(1, i - 1).c_str(), fTime, true); - t.Delete(1, i); - while (t.IsEmpty() ? false : (unsigned char)(t[1]) < 33) - t.Delete(1, 1); + Global::tranTexts.Add(t.substr(0, i).c_str(), fTime, true); + t.erase(0, i + 1); + while (t.empty() ? false : (unsigned char)(t[1]) < 33) + t.erase(0, 1); } - } while (i > 0); + } while (i != std::string::npos); } } TRealSound::Play(Volume, Looping, ListenerInside, NewPosition); }; //--------------------------------------------------------------------------- -#pragma package(smart_init) diff --git a/RealSound.h b/RealSound.h index 5b96bb49..c62aee22 100644 --- a/RealSound.h +++ b/RealSound.h @@ -10,12 +10,9 @@ http://mozilla.org/MPL/2.0/. #ifndef RealSoundH #define RealSoundH -#include "system.hpp" -#include "classes.hpp" - +#include #include "Sound.h" #include "Geometry.h" -#include class TRealSound { @@ -38,7 +35,7 @@ class TRealSound bool freqmod = false, double rmin = 0.0); ~TRealSound(); void Free(); - void Init(const char *SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic, + void Init(std::string const &SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic, bool freqmod = false, double rmin = 0.0); double ListenerDistance(vector3 ListenerPosition); void Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition); @@ -54,12 +51,12 @@ class TRealSound class TTextSound : public TRealSound { // dźwięk ze stenogramem - AnsiString asText; + std::string asText; float fTime; // czas trwania public: TTextSound(const char *SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic, bool freqmod = false, double rmin = 0.0); - void Init(const char *SoundName, double SoundAttenuation, double X, double Y, double Z, + void Init(std::string const &SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic, bool freqmod = false, double rmin = 0.0); void Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition); }; diff --git a/ResourceManager.cpp b/ResourceManager.cpp index 79d2ac4e..979a55a5 100644 --- a/ResourceManager.cpp +++ b/ResourceManager.cpp @@ -7,11 +7,10 @@ obtain one at http://mozilla.org/MPL/2.0/. */ +#include "stdafx.h" #include "ResourceManager.h" #include "Logs.h" -#include - ResourceManager::Resources ResourceManager::_resources; double ResourceManager::_expiry = 5.0f; double ResourceManager::_lastUpdate = 0.0f; diff --git a/Segment.cpp b/Segment.cpp index 379c95f3..a41df46e 100644 --- a/Segment.cpp +++ b/Segment.cpp @@ -7,28 +7,23 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#pragma hdrstop -#include "opengl/glew.h" -//#include "opengl/glut.h" - +#include "stdafx.h" #include "Segment.h" -#include "Usefull.h" +#include "opengl/glew.h" + #include "Globals.h" +#include "Logs.h" +#include "Usefull.h" #include "Track.h" -#include -//#define Precision 10000 - -#pragma package(smart_init) //--------------------------------------------------------------------------- // 101206 Ra: trapezoidalne drogi // 110806 Ra: odwrócone mapowanie wzdłuż - Point1 == 1.0 -string Where(vector3 p) +std::string Where(vector3 p) { // zamiana współrzędnych na tekst, używana w błędach - return to_string(p.x) + " " + to_string(p.y) + " " + to_string(p.z); + return std::to_string(p.x) + " " + std::to_string(p.y) + " " + std::to_string(p.z); }; TSegment::TSegment(TTrack *owner) diff --git a/Sound.cpp b/Sound.cpp index 92eca7f7..392442e0 100644 --- a/Sound.cpp +++ b/Sound.cpp @@ -7,15 +7,13 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #define STRICT #include "Sound.h" -#include "Usefull.h" #include "Globals.h" -#include +#include "Logs.h" +#include "Usefull.h" +#include "mczapkie/mctools.h" //#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } #define SAFE_RELEASE(p) \ { \ @@ -59,7 +57,7 @@ TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, const char *Directory, const { // SetFileUI( hDlg, TEXT("Bad wave file.") ); return; - ErrorLog("Missed sound: " + string(strFileName)); + ErrorLog( "Missed sound: " + std::string(strFileName) ); } strcpy(Name, ToLower(strFileName).c_str()); @@ -206,10 +204,10 @@ void TSoundsManager::LoadSounds(char *Directory) LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(const char *Name, bool Dynamic, float *fSamplingRate) { // wyszukanie dźwięku w pamięci albo wczytanie z pliku - AnsiString file; + std::string file; if (Dynamic) { // próba wczytania z katalogu pojazdu - file = AnsiString(Global::asCurrentDynamicPath.c_str()) + AnsiString(Name); + file = Global::asCurrentDynamicPath + Name; if (FileExists(file)) Name = file.c_str(); // nowa nazwa else @@ -260,7 +258,7 @@ LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(const char *Name, bool Dynamic, *fSamplingRate = Next->fSamplingRate; // częstotliwość return Next->GetUnique(pDS); } - ErrorLog("Missed sound: " + string(Name)); + ErrorLog("Missed sound: " + std::string(Name) ); return (NULL); }; diff --git a/Spring.cpp b/Spring.cpp index 8a832db1..525c4c03 100644 --- a/Spring.cpp +++ b/Spring.cpp @@ -7,14 +7,8 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#include "opengl/glew.h" -#include "opengl/glut.h" -#pragma hdrstop - +#include "stdafx.h" #include "Spring.h" -#include "Usefull.h" TSpring::TSpring() { @@ -79,5 +73,3 @@ void TSpring::Render() } //--------------------------------------------------------------------------- - -#pragma package(smart_init) diff --git a/Texture.cpp b/Texture.cpp index a408f671..faa0d73c 100644 --- a/Texture.cpp +++ b/Texture.cpp @@ -13,23 +13,18 @@ http://mozilla.org/MPL/2.0/. */ -#include -#include -#include "opengl/glew.h" -#include - -#include "system.hpp" -#include "classes.hpp" -#include "stdio.h" -#pragma hdrstop - -#include "Usefull.h" +#include "stdafx.h" #include "Texture.h" -#include "TextureDDS.h" -#include "logs.h" +#include +#include +#include +#include "opengl/glew.h" + #include "Globals.h" -#include "io.h" +#include "logs.h" +#include "Usefull.h" +#include "TextureDDS.h" TTexturesManager::Alphas TTexturesManager::_alphas; TTexturesManager::Names TTexturesManager::_names; @@ -260,7 +255,6 @@ TTexturesManager::AlphaValue TTexturesManager::LoadBMP(std::string fileName) }; BITMAPFILEHEADER header; - size_t bytes; file.read((char *)&header, sizeof(BITMAPFILEHEADER)); if (file.eof()) @@ -342,8 +336,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int // check if width, height and bpp is correct if (!width || !height || (header[4] != 24 && header[4] != 32)) { - WriteLog("Bad texture: " + AnsiString(fileName.c_str()) + - " has wrong header or bits per pixel"); + WriteLog("Bad texture: " + fileName + " has wrong header or bits per pixel"); file.close(); return fail; }; @@ -357,8 +350,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int if (i & 1) ++j; if (j != 1) - WriteLog("Bad texture: " + AnsiString(fileName.c_str()) + " is " + AnsiString(width) + - "×" + AnsiString(height)); + WriteLog("Bad texture: " + fileName + " is " + std::to_string(width) + "×" + std::to_string(height) ); } GLuint bpp = header[4]; // grab the TGA's bits per pixel (24 or 32) GLuint bytesPerPixel = bpp / 8; // divide by 8 to get the bytes per pixel @@ -367,7 +359,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int GLubyte *imageData = new GLubyte[imageSize]; // reserve memory to hold the TGA data if (!compressed) { // WriteLog("Not compressed."); - file.read(imageData, imageSize); + file.read(reinterpret_cast(imageData), imageSize); if (file.eof()) { delete[] imageData; @@ -379,9 +371,9 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int { // skompresowany plik TGA GLuint filesize; // current byte GLuint colorbuffer[1]; // Storage for 1 pixel - file.seekg(0, ios::end); // na koniec + file.seekg(0, std::ios::end); // na koniec filesize = (int)file.tellg() - 18; // rozmiar bez nagłówka - file.seekg(18, ios::beg); // ponownie za nagłówkiem + file.seekg(18, std::ios::beg); // ponownie za nagłówkiem GLubyte *copyto = imageData; // gdzie wstawiać w buforze GLubyte *copyend = imageData + imageSize; // za ostatnim bajtem bufora GLubyte *copyfrom = imageData + imageSize - filesize; // gdzie jest początek @@ -389,7 +381,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int if (filesize < imageSize) // jeśli po kompresji jest mniejszy niż przed { // Ra: nowe wczytywanie skompresowanych: czytamy całe od razu, dekompresja w pamięci GLuint copybytes; - file.read(copyfrom, filesize); // wczytanie reszty po nagłówku + file.read(reinterpret_cast(copyfrom), filesize); // wczytanie reszty po nagłówku // najpierw trzeba ustalić, ile skopiowanych pikseli jest na samym końcu copyto = copyfrom; // roboczo przelatujemy wczytane dane copybytes = 0; // licznik bajtów obrazka @@ -413,7 +405,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int int extraend = copyend - copyto; // długość śmieci na końcu if (extraend > 0) { // przesuwamy bufor do końca obszaru dekompresji - WriteLog("Extra bytes: " + AnsiString(extraend)); + WriteLog("Extra bytes: " + std::to_string(extraend)); memmove(copyfrom + extraend, copyfrom, filesize - extraend); copyfrom += extraend; file.close(); @@ -421,10 +413,12 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int if (Global::iModifyTGA & 2) // flaga obcinania śmieci { // najlepiej by było obciąć plik, ale fstream tego nie potrafi int handle; - for (unsigned int i = 0; i < fileName.length(); ++i) - if (fileName[i] == '/') - fileName[i] == '\\'; // bo to Windows + for( unsigned int i = 0; i < fileName.length(); ++i ) { + if( fileName[ i ] == '/' ) { fileName[ i ] = '\\'; } // bo to Windows } + } WriteLog("Truncating extra bytes"); + // NOTE: this posix code is unsafe, and being deprecated in visual c + // TODO: replace with something up to date handle = open(fileName.c_str(), O_RDWR | O_BINARY); chsize(handle, 18 + filesize); // obcięcie śmieci close(handle); @@ -454,7 +448,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int writeback = imageData + imageSize + extraend - copyfrom; // ile bajtów skompresowanych zostało do końca copyfrom = copyto; // adres piksela do zapisania - file.seekg(-writeback, ios::end); // odległość od końca (ujemna) + file.seekg(-writeback, std::ios::end); // odległość od końca (ujemna) if ((filesize > 128) || !(Global::iModifyTGA & 4)) // gdy za dużo pikseli albo wyłączone writeback = -1; // zapis możliwe jeśli ilość problematycznych pikseli nie @@ -478,7 +472,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int __int32 bgra = *((__int32 *)++copyfrom); // kolor wypełniający (4 bajty) for (int counter = 0; counter < chunkheader; counter++) *ptr++ = bgra; - copyto = (char *)(ptr); // rzutowanie, żeby nie dodawać + copyto = reinterpret_cast(ptr); // rzutowanie, żeby nie dodawać copyfrom += 4; } else @@ -516,7 +510,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int { // if the header is < 128, it means the that is the number of RAW color packets minus // 1 chunkheader++; // add 1 to get number of following color values - file.read(copyto, chunkheader * bytesPerPixel); + file.read(reinterpret_cast(copyto), chunkheader * bytesPerPixel); copyto += chunkheader * bytesPerPixel; } else @@ -529,7 +523,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int __int32 *ptr = (__int32 *)(copyto), bgra = *((__int32 *)colorbuffer); for (int counter = 0; counter < chunkheader; counter++) *ptr++ = bgra; - copyto = (char *)(ptr); // rzutowanie, żeby nie dodawać + copyto = reinterpret_cast(ptr); // rzutowanie, żeby nie dodawać } else for (int counter = 0; counter < chunkheader; counter++) @@ -547,9 +541,9 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int WriteLog("Rewriting end of file..."); chunkheader = filesize - 1; // licznik jest o 1 mniejszy file.open(fileName.c_str(), std::ios::binary | std::ios::out | std::ios::in); - file.seekg(-writeback, ios::end); // odległość od końca (ujemna) + file.seekg(-writeback, std::ios::end); // odległość od końca (ujemna) file.write((char *)&chunkheader, 1); // zapisanie licznika - file.write(copyfrom, filesize * bytesPerPixel); // piksele bez kompresji + file.write(reinterpret_cast(copyfrom), filesize * bytesPerPixel); // piksele bez kompresji } else { // zapisywanie całości pliku, będzie krótszy, więc trzeba usunąć go w całości @@ -558,7 +552,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int file.open(fileName.c_str(), std::ios::binary | std::ios::out | std::ios::trunc); file.write((char *)TGAcompare, sizeof(TGAcompare)); file.write((char *)header, sizeof(header)); - file.write(imageData, imageSize); + file.write(reinterpret_cast(imageData), imageSize); } } }; @@ -602,7 +596,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTEX(std::string fileName) AlphaValue fail(0, false); - std::ifstream file(fileName.c_str(), ios::binary); + std::ifstream file(fileName.c_str(), std::ios::binary); char head[5]; file.read(head, 4); @@ -636,7 +630,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTEX(std::string fileName) GLuint size = width * height * bpp; GLubyte *data = new GLubyte[size]; - file.read(data, size); + file.read(reinterpret_cast(data), size); bool hash = (fileName.find('#') != std::string::npos); @@ -651,7 +645,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadDDS(std::string fileName, int AlphaValue fail(0, false); - std::ifstream file(fileName.c_str(), ios::binary); + std::ifstream file(fileName.c_str(), std::ios::binary); char filecode[5]; file.read(filecode, 4); @@ -720,8 +714,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadDDS(std::string fileName, int if (i & 1) ++j; if (j != 1) - WriteLog("Bad texture: " + AnsiString(fileName.c_str()) + " is " + - AnsiString(data.width) + "×" + AnsiString(data.height)); + WriteLog( "Bad texture: " + fileName + " is " + std::to_string(data.width) + "×" + std::to_string(data.height) ); } if (ddsd.ddpfPixelFormat.dwFourCC == FOURCC_DXT1) @@ -846,7 +839,7 @@ void TTexturesManager::SetFiltering(bool alpha, bool hash) }; /////////////////////////////////////////////////////////////////////////////// -GLuint TTexturesManager::CreateTexture(char *buff, GLint bpp, int width, int height, bool bHasAlpha, +GLuint TTexturesManager::CreateTexture(GLubyte *buff, GLint bpp, int width, int height, bool bHasAlpha, bool bHash, bool bDollar, int filter) { // Ra: używane tylko dla TGA i TEX // Ra: dodana obsługa GL_BGR oraz GL_BGRA dla TGA - szybciej się wczytuje @@ -873,8 +866,12 @@ GLuint TTexturesManager::CreateTexture(char *buff, GLint bpp, int width, int hei void TTexturesManager::Free() { // usunięcie wszyskich tekstur (bez usuwania struktury) - for (Names::iterator iter = _names.begin(); iter != _names.end(); iter++) - glDeleteTextures(1, &(iter->second)); + // for (Names::iterator iter = _names.begin(); iter != _names.end(); iter++) + if( false == _names.empty() ) { + for( auto texture : _names ) { + glDeleteTextures( 1, &texture.second ); + } + } } std::string TTexturesManager::GetName(GLuint id) @@ -884,4 +881,3 @@ std::string TTexturesManager::GetName(GLuint id) return iter->first; return ""; }; -#pragma package(smart_init) diff --git a/Texture.h b/Texture.h index e4a195a0..c4b2ee30 100644 --- a/Texture.h +++ b/Texture.h @@ -7,14 +7,10 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef TextureH -#define TextureH +#pragma once -#include #include - #include "opengl/glew.h" -#include "usefull.h" /* //Ra: miejsce umieszczenia tego jest deczko bezsensowne @@ -54,7 +50,7 @@ class TTexturesManager static void SetFiltering(int filter); static void SetFiltering(bool alpha, bool hash); - static GLuint CreateTexture(char *buff, GLint bpp, int width, int height, bool bHasAlpha, + static GLuint CreateTexture(GLubyte *buff, GLint bpp, int width, int height, bool bHasAlpha, bool bHash, bool bDollar = true, int filter = -1); static Names _names; @@ -62,4 +58,3 @@ class TTexturesManager // std::list Textures; }; //--------------------------------------------------------------------------- -#endif diff --git a/TextureDDS.cpp b/TextureDDS.cpp index 74af43bb..74df0b07 100644 --- a/TextureDDS.cpp +++ b/TextureDDS.cpp @@ -7,6 +7,7 @@ obtain one at http://mozilla.org/MPL/2.0/. */ +#include "stdafx.h" #include "TextureDDS.h" void DxtcReadColors(const GLubyte *Data, Color8888 *result) diff --git a/Timer.cpp b/Timer.cpp index 1e6ad3ce..2c339958 100644 --- a/Timer.cpp +++ b/Timer.cpp @@ -7,10 +7,7 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "Timer.h" #include "Globals.h" @@ -119,5 +116,3 @@ void UpdateTimers(bool pause) }; //--------------------------------------------------------------------------- - -#pragma package(smart_init) diff --git a/Track.cpp b/Track.cpp index 03331108..6c33572d 100644 --- a/Track.cpp +++ b/Track.cpp @@ -12,14 +12,13 @@ http://mozilla.org/MPL/2.0/. */ -// nagłówki identyczne w każdym pliku... -#pragma hdrstop - +#include "stdafx.h" #include "Track.h" +#include "Globals.h" +#include "Logs.h" #include "Usefull.h" #include "Texture.h" #include "Timer.h" -#include "Globals.h" #include "Ground.h" #include "parser.h" #include "Mover.h" @@ -28,8 +27,6 @@ http://mozilla.org/MPL/2.0/. #include "MemCell.h" #include "Event.h" -#pragma package(smart_init) - // 101206 Ra: trapezoidalne drogi i tory // 110720 Ra: rozprucie zwrotnicy i odcinki izolowane @@ -3136,13 +3133,13 @@ void TTrack::ConnectionsLog() for (i = 0; i < 2; ++i) { if (SwitchExtension->pPrevs[i]) - WriteLog("Point " + to_string(i + i + 1) + " -> track " + + WriteLog("Point " + std::to_string(i + i + 1) + " -> track " + SwitchExtension->pPrevs[i]->pMyNode->asName + ":" + - to_string(int(SwitchExtension->iPrevDirection[i]))); + std::to_string(int(SwitchExtension->iPrevDirection[i]))); if (SwitchExtension->pNexts[i]) - WriteLog("Point " + to_string(i + i + 2) + " -> track " + + WriteLog("Point " + std::to_string(i + i + 2) + " -> track " + SwitchExtension->pNexts[i]->pMyNode->asName + ":" + - to_string(int(SwitchExtension->iNextDirection[i]))); + std::to_string(int(SwitchExtension->iNextDirection[i]))); } }; diff --git a/Track.h b/Track.h index 4c73159c..401425cf 100644 --- a/Track.h +++ b/Track.h @@ -7,17 +7,12 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef TrackH -#define TrackH +#pragma once -#include "Segment.h" -#include "ResourceManager.h" -#include "opengl/glew.h" -#include -#include "Classes.h" #include - -using namespace std; +#include "opengl/glew.h" +#include "ResourceManager.h" +#include "Segment.h" class TEvent; @@ -109,10 +104,10 @@ class TIsolated TEvent *evFree; // zdarzenie wyzwalane po całkowitym zwolnieniu zajętości grupy TMemCell *pMemCell; // automatyczna komórka pamięci, która współpracuje z odcinkiem izolowanym TIsolated(); - TIsolated(const string &n, TIsolated *i); + TIsolated(const std::string &n, TIsolated *i); ~TIsolated(); static TIsolated * Find( - const string &n); // znalezienie obiektu albo utworzenie nowego + const std::string &n); // znalezienie obiektu albo utworzenie nowego void Modify(int i, TDynamicObject *o); // dodanie lub odjęcie osi bool Busy() { @@ -160,12 +155,12 @@ class TTrack : public Resource TEvent *evEvent0; // McZapkie-280503: wyzwalany tylko gdy headdriver TEvent *evEvent1; TEvent *evEvent2; - string asEventall0Name; // nazwy eventów - string asEventall1Name; - string asEventall2Name; - string asEvent0Name; - string asEvent1Name; - string asEvent2Name; + std::string asEventall0Name; // nazwy eventów + std::string asEventall1Name; + std::string asEventall2Name; + std::string asEvent0Name; + std::string asEvent1Name; + std::string asEvent2Name; int iNextDirection; // 0:Point1, 1:Point2, 3:do odchylonego na zwrotnicy int iPrevDirection; TTrackType eType; @@ -268,7 +263,7 @@ class TTrack : public Resource if (pIsolated) pIsolated->Modify(i, o); }; // dodanie lub odjęcie osi - string IsolatedName(); + std::string IsolatedName(); bool IsolatedEventsAssign(TEvent *busy, TEvent *free); double WidthTotal(); GLuint TextureGet(int i) @@ -278,7 +273,7 @@ class TTrack : public Resource bool IsGroupable(); int TestPoint(vector3 *Point); void MovedUp1(double dh); - string NameGet(); + std::string NameGet(); void VelocitySet(float v); float VelocityGet(); void ConnectionsLog(); @@ -289,4 +284,3 @@ class TTrack : public Resource }; //--------------------------------------------------------------------------- -#endif diff --git a/Traction.cpp b/Traction.cpp index 9696e1ee..e649a3a9 100644 --- a/Traction.cpp +++ b/Traction.cpp @@ -12,19 +12,14 @@ http://mozilla.org/MPL/2.0/. */ -//#include "system.hpp" -//#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "Traction.h" -#include "mctools.h" #include "Globals.h" -#include "Usefull.h" +#include "logs.h" +#include "mctools.h" #include "TractionPower.h" //--------------------------------------------------------------------------- - -#pragma package(smart_init) /* === Koncepcja dwustronnego zasilania sekcji sieci trakcyjnej, Ra 2014-02 === @@ -472,8 +467,8 @@ void TTraction::RaArrayFill(CVertNormTex *Vert) } } if ((Vert - old) != iLines) - WriteLog("!!! Wygenerowano punktów " + AnsiString(Vert - old) + ", powinno być " + - AnsiString(iLines)); + WriteLog("!!! Wygenerowano punktów " + std::to_string(Vert - old) + ", powinno być " + + std::to_string(iLines)); }; void TTraction::RenderVBO(float mgn, int iPtr) diff --git a/Traction.h b/Traction.h index 80344949..86f53a58 100644 --- a/Traction.h +++ b/Traction.h @@ -7,16 +7,14 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef TractionH -#define TractionH +#pragma once -#include "opengl/glew.h" -#include "dumb3d.h" -#include "VBO.h" #include +#include "opengl/glew.h" +#include "VBO.h" +#include "dumb3d.h" using namespace Math3D; -using namespace std; class TTractionPowerSource; @@ -52,10 +50,10 @@ class TTraction DWORD DamageFlag; // 1: zasniedziale, 128: zerwana int Wires; float WireOffset; - string asPowerSupplyName; // McZapkie: nazwa podstacji trakcyjnej + std::string asPowerSupplyName; // McZapkie: nazwa podstacji trakcyjnej TTractionPowerSource * psSection; // zasilacz (opcjonalnie może to być pulpit sterujący EL2 w hali!) - string asParallel; // nazwa przęsła, z którym może być bieżnia wspólna + std::string asParallel; // nazwa przęsła, z którym może być bieżnia wspólna TTraction *hvParallel; // jednokierunkowa i zapętlona lista przęseł ewentualnej bieżni wspólnej float fResistance[2]; // rezystancja zastępcza do punktu zasilania (0: przęsło zasilane, <0: do // policzenia) @@ -86,4 +84,3 @@ class TTraction double VoltageGet(double u, double i); }; //--------------------------------------------------------------------------- -#endif diff --git a/TractionPower.cpp b/TractionPower.cpp index 5a119697..2fca9d33 100644 --- a/TractionPower.cpp +++ b/TractionPower.cpp @@ -13,17 +13,9 @@ http://mozilla.org/MPL/2.0/. */ -//#include "system.hpp" -//#include "classes.hpp" -#pragma hdrstop - -#include "Mover.h" -#include "mctools.h" -#include "Timer.h" -#include "Globals.h" +#include "stdafx.h" #include "TractionPower.h" - -#include "Usefull.h" +#include "Logs.h" #include "Ground.h" //--------------------------------------------------------------------------- @@ -111,11 +103,11 @@ bool TTractionPowerSource::Update(double dt) { SlowFuse = true; ErrorLog("Power overload: \"" + gMyNode->asName + "\" disabled for " + - to_string(SlowFuseTimeOut) + "s"); + std::to_string(SlowFuseTimeOut) + "s"); } else ErrorLog("Power overload: \"" + gMyNode->asName + "\" disabled for " + - to_string(FastFuseTimeOut) + "s"); + std::to_string(FastFuseTimeOut) + "s"); FuseTimer = 0; } if (FastFuse || SlowFuse) @@ -171,5 +163,3 @@ void TTractionPowerSource::PowerSet(TTractionPowerSource *ps) }; //--------------------------------------------------------------------------- - -#pragma package(smart_init) diff --git a/Train.cpp b/Train.cpp index 397f2626..b93d1a38 100644 --- a/Train.cpp +++ b/Train.cpp @@ -12,24 +12,19 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "Train.h" -#include "MdlMngr.h" + #include "Globals.h" +#include "Logs.h" +#include "MdlMngr.h" #include "Timer.h" #include "Driver.h" #include "Console.h" #include "McZapkie\hamulce.h" #include "McZapkie\MOVER.h" -#include -#include //--------------------------------------------------------------------------- -#pragma package(smart_init) - using namespace Timer; TCab::TCab() @@ -66,31 +61,36 @@ void TCab::Init(double Initx1, double Inity1, double Initz1, double Initx2, doub bOccupied = InitOccupied; } -void TCab::Load(TQueryParserComp *Parser) +void TCab::Load(cParser &Parser) { - AnsiString str = Parser->GetNextSymbol().LowerCase(); - if (str == AnsiString("cablight")) + std::string token; + Parser.getTokens(); Parser >> token; + if (token == "cablight") { - dimm_r = Parser->GetNextSymbol().ToDouble(); - dimm_g = Parser->GetNextSymbol().ToDouble(); - dimm_b = Parser->GetNextSymbol().ToDouble(); - intlit_r = Parser->GetNextSymbol().ToDouble(); - intlit_g = Parser->GetNextSymbol().ToDouble(); - intlit_b = Parser->GetNextSymbol().ToDouble(); - intlitlow_r = Parser->GetNextSymbol().ToDouble(); - intlitlow_g = Parser->GetNextSymbol().ToDouble(); - intlitlow_b = Parser->GetNextSymbol().ToDouble(); - str = Parser->GetNextSymbol().LowerCase(); + Parser.getTokens( 9, false ); + Parser + >> dimm_r + >> dimm_g + >> dimm_b + >> intlit_r + >> intlit_g + >> intlit_b + >> intlitlow_r + >> intlitlow_g + >> intlitlow_b; + Parser.getTokens(); Parser >> token; } - CabPos1.x = str.ToDouble(); - CabPos1.y = Parser->GetNextSymbol().ToDouble(); - CabPos1.z = Parser->GetNextSymbol().ToDouble(); - CabPos2.x = Parser->GetNextSymbol().ToDouble(); - CabPos2.y = Parser->GetNextSymbol().ToDouble(); - CabPos2.z = Parser->GetNextSymbol().ToDouble(); + CabPos1.x = std::stod( token ); + Parser.getTokens( 5, false ); + Parser + >> CabPos1.y + >> CabPos1.z + >> CabPos2.x + >> CabPos2.y + >> CabPos2.z; - bEnabled = True; - bOccupied = True; + bEnabled = true; + bOccupied = true; } TCab::~TCab() @@ -295,31 +295,33 @@ PyObject *TTrain::GetTrainState() PyDict_SetItemString(dict, "minutes", PyGetInt(GlobalTime->mm)); PyDict_SetItemString(dict, "seconds", PyGetInt(GlobalTime->mr)); PyDict_SetItemString(dict, "velocity_desired", PyGetFloat(DynamicObject->Mechanik->VelDesired)); - Char* TXTT[10] = { "fd","fdt","fdb","pd","pdt","pdb","itothv","1","2","3" }; - Char* TXTC[10] = { "fr","frt","frb","pr","prt","prb","im","vm","ihv","uhv" }; - Char* TXTP[3] = { "bc","bp","sp" }; - for (int j = 0; j<10; j++) - PyDict_SetItemString(dict, (AnsiString("eimp_t_") + AnsiString(TXTT[j])).c_str(), PyGetFloatS(fEIMParams[0][j])); + char* TXTT[10] = { "fd","fdt","fdb","pd","pdt","pdb","itothv","1","2","3" }; + char* TXTC[10] = { "fr","frt","frb","pr","prt","prb","im","vm","ihv","uhv" }; + char* TXTP[3] = { "bc","bp","sp" }; + for( int j = 0; j < 10; j++ ) { + PyDict_SetItemString( dict, std::string( "eimp_t_" + std::string(TXTT[ j ]) ).c_str(), PyGetFloatS( fEIMParams[ 0 ][ j ] ) ); + } for (int i = 0; i<8; i++) { - for (int j = 0; j<10; j++) - PyDict_SetItemString(dict, (AnsiString("eimp_c") + IntToStr(i + 1) + AnsiString("_") + AnsiString(TXTC[j])).c_str(), PyGetFloatS(fEIMParams[i + 1][j])); - PyDict_SetItemString(dict, (AnsiString("eimp_c") + IntToStr(i + 1) + AnsiString("_ms")).c_str(), PyGetBool(bMains[i])); - PyDict_SetItemString(dict, (AnsiString("eimp_c") + IntToStr(i + 1) + AnsiString("_cv")).c_str(), PyGetFloatS(fCntVol[i])); - PyDict_SetItemString(dict, (AnsiString("eimp_u") + IntToStr(i + 1) + AnsiString("_pf")).c_str(), PyGetBool(bPants[i][0])); - PyDict_SetItemString(dict, (AnsiString("eimp_u") + IntToStr(i + 1) + AnsiString("_pr")).c_str(), PyGetBool(bPants[i][1])); - PyDict_SetItemString(dict, (AnsiString("eimp_c") + IntToStr(i + 1) + AnsiString("_fuse")).c_str(), PyGetBool(bFuse[i])); - PyDict_SetItemString(dict, (AnsiString("eimp_c") + IntToStr(i + 1) + AnsiString("_batt")).c_str(), PyGetBool(bBatt[i])); - PyDict_SetItemString(dict, (AnsiString("eimp_c") + IntToStr(i + 1) + AnsiString("_conv")).c_str(), PyGetBool(bConv[i])); - PyDict_SetItemString(dict, (AnsiString("eimp_u") + IntToStr(i + 1) + AnsiString("_comp_a")).c_str(), PyGetBool(bComp[i][0])); - PyDict_SetItemString(dict, (AnsiString("eimp_u") + IntToStr(i + 1) + AnsiString("_comp_w")).c_str(), PyGetBool(bComp[i][1])); - PyDict_SetItemString(dict, (AnsiString("eimp_c") + IntToStr(i + 1) + AnsiString("_heat")).c_str(), PyGetBool(bHeat[i])); + for( int j = 0; j < 10; j++ ) { + PyDict_SetItemString( dict, ( std::string( "eimp_c" ) + std::to_string( i + 1 ) + "_" + std::string( TXTC[ j ] ) ).c_str(), PyGetFloatS( fEIMParams[ i + 1 ][ j ] ) ); + } + PyDict_SetItemString( dict, ( std::string( "eimp_c" ) + std::to_string( i + 1 ) + "_ms" ).c_str(), PyGetBool( bMains[ i ] ) ); + PyDict_SetItemString( dict, ( std::string( "eimp_c" ) + std::to_string( i + 1 ) + "_cv" ).c_str(), PyGetFloatS( fCntVol[ i ] ) ); + PyDict_SetItemString( dict, ( std::string( "eimp_u" ) + std::to_string( i + 1 ) + "_pf" ).c_str(), PyGetBool( bPants[ i ][ 0 ] ) ); + PyDict_SetItemString( dict, ( std::string( "eimp_u" ) + std::to_string( i + 1 ) + "_pr" ).c_str(), PyGetBool( bPants[ i ][ 1 ] ) ); + PyDict_SetItemString( dict, ( std::string( "eimp_c" ) + std::to_string( i + 1 ) + "_fuse" ).c_str(), PyGetBool( bFuse[ i ] ) ); + PyDict_SetItemString( dict, ( std::string( "eimp_c" ) + std::to_string( i + 1 ) + "_batt" ).c_str(), PyGetBool( bBatt[ i ] ) ); + PyDict_SetItemString( dict, ( std::string( "eimp_c" ) + std::to_string( i + 1 ) + "_conv" ).c_str(), PyGetBool( bConv[ i ] ) ); + PyDict_SetItemString( dict, ( std::string( "eimp_u" ) + std::to_string( i + 1 ) + "_comp_a" ).c_str(), PyGetBool( bComp[ i ][ 0 ] ) ); + PyDict_SetItemString( dict, ( std::string( "eimp_u" ) + std::to_string( i + 1 ) + "_comp_w" ).c_str(), PyGetBool( bComp[ i ][ 1 ] ) ); + PyDict_SetItemString( dict, ( std::string( "eimp_c" ) + std::to_string( i + 1 ) + "_heat" ).c_str(), PyGetBool( bHeat[ i ] ) ); } for (int i = 0; i<20; i++) { for (int j = 0; j<3; j++) - PyDict_SetItemString(dict, (AnsiString("eimp_pn") + IntToStr(i + 1) + AnsiString("_") + AnsiString(TXTP[j])).c_str(), + PyDict_SetItemString( dict, ( std::string( "eimp_pn" ) + std::to_string( i + 1 ) + "_" + std::string( TXTP[ j ] ) ).c_str(), PyGetFloatS(fPress[i][j])); } bool bEP, bPN; @@ -336,13 +338,12 @@ PyObject *TTrain::GetTrainState() PyDict_SetItemString(dict, "indir_brake", PyGetBool(bPN)); for (int i = 0; i<20; i++) { - PyDict_SetItemString(dict, (AnsiString("doors_") + IntToStr(i + 1)).c_str(), PyGetFloatS(bDoors[i][0])); - PyDict_SetItemString(dict, (AnsiString("doors_r_") + IntToStr(i + 1)).c_str(), PyGetFloatS(bDoors[i][1])); - PyDict_SetItemString(dict, (AnsiString("doors_l_") + IntToStr(i + 1)).c_str(), PyGetFloatS(bDoors[i][2])); - PyDict_SetItemString(dict, (AnsiString("doors_no_") + IntToStr(i + 1)).c_str(), PyGetInt(iDoorNo[i])); - PyDict_SetItemString(dict, (AnsiString("code_") + IntToStr(i + 1)).c_str(), PyGetString(AnsiString(IntToStr(iUnits[i]) + - cCode[i]).c_str())); - PyDict_SetItemString(dict, (AnsiString("car_name") + IntToStr(i + 1)).c_str(), PyGetString(asCarName[i].c_str())); + PyDict_SetItemString( dict, ( std::string( "doors_" ) + std::to_string( i + 1 ) ).c_str(), PyGetFloatS( bDoors[ i ][ 0 ] ) ); + PyDict_SetItemString( dict, ( std::string( "doors_r_" ) + std::to_string( i + 1 ) ).c_str(), PyGetFloatS( bDoors[ i ][ 1 ] ) ); + PyDict_SetItemString( dict, ( std::string( "doors_l_" ) + std::to_string( i + 1 ) ).c_str(), PyGetFloatS( bDoors[ i ][ 2 ] ) ); + PyDict_SetItemString( dict, ( std::string( "doors_no_" ) + std::to_string( i + 1 ) ).c_str(), PyGetInt( iDoorNo[ i ] ) ); + PyDict_SetItemString( dict, ( std::string( "code_" ) + std::to_string( i + 1 ) ).c_str(), PyGetString( std::string( std::to_string( iUnits[ i ] ) + cCode[ i ] ).c_str() ) ); + PyDict_SetItemString( dict, ( std::string( "car_name" ) + std::to_string( i + 1 ) ).c_str(), PyGetString( asCarName[ i ].c_str() ) ); } PyDict_SetItemString(dict, "car_no", PyGetInt(iCarNo)); PyDict_SetItemString(dict, "power_no", PyGetInt(iPowerNo)); @@ -2506,13 +2507,13 @@ void TTrain::UpdateMechPosition(double dt) if (!Global::iSlowMotion // musi być pełna prędkość && (pMechOffset.y < 4.0)) // Ra 15-01: przy oglądaniu pantografu bujanie przeszkadza { - if (!(random((GetFPS() + 1) / 15) > 0)) + if (!(Random((GetFPS() + 1) / 15) > 0)) { - if ((iVel > 0) && (random(155 - iVel) < 16)) + if ((iVel > 0) && (Random(155 - iVel) < 16)) { - r1 = (double(random(iVel * 2) - iVel) / ((iVel * 2) * 4)) * fMechSpringX; - r2 = (double(random(iVel * 2) - iVel) / ((iVel * 2) * 4)) * fMechSpringY; - r3 = (double(random(iVel * 2) - iVel) / ((iVel * 2) * 4)) * fMechSpringZ; + r1 = (double(Random(iVel * 2) - iVel) / ((iVel * 2) * 4)) * fMechSpringX; + r2 = (double(Random(iVel * 2) - iVel) / ((iVel * 2) * 4)) * fMechSpringY; + r3 = (double(Random(iVel * 2) - iVel) / ((iVel * 2) * 4)) * fMechSpringZ; MechSpring.ComputateForces(vector3(r1, r2, r3), pMechShake); // MechSpring.ComputateForces(vector3(double(random(200)-100)/200,double(random(200)-100)/200,double(random(200)-100)/500),pMechShake); } @@ -2611,7 +2612,7 @@ bool TTrain::Update() if (ff != fTachoTimer) // jesli w tej sekundzie nie zmienial { if (fTachoVelocity > 1) // jedzie - fTachoVelocityJump = fTachoVelocity + (2 - random(3) + random(3)) * 0.5; + fTachoVelocityJump = fTachoVelocity + (2 - Random(3) + Random(3)) * 0.5; else fTachoVelocityJump = 0; // stoi fTachoTimer = ff; // juz zmienil @@ -5009,325 +5010,275 @@ bool TTrain::CabChange(int iDirection) // McZapkie-310302 // wczytywanie pliku z danymi multimedialnymi (dzwieki, kontrolki, kabiny) -bool TTrain::LoadMMediaFile(std::string asFileName) +bool TTrain::LoadMMediaFile(std::string const &asFileName) { double dSDist; - std::ifstream t(asFileName.c_str()); - std::stringstream buffer; - buffer << t.rdbuf(); - //TFileStream *fs; - //fs = new TFileStream(asFileName, fmOpenRead | fmShareCompat); - AnsiString str = AnsiString(buffer.str().c_str()); - // DecimalSeparator='.'; - //int size = fs->Size; - //str.SetLength(size); - //fs->Read(str.c_str(), size); - //str += ""; - //delete fs; - TQueryParserComp *Parser; - Parser = new TQueryParserComp(NULL); - Parser->TextToParse = str; - // Parser->LoadStringToParse(asFile); - Parser->First(); - str = ""; + cParser parser( asFileName, cParser::buffer_FILE ); //Wartości domyślne by nie wysypywało przy wybrakowanych mmd @240816 Stele dsbPneumaticSwitch = TSoundsManager::GetFromName("silence1.wav", true); dsbBufferClamp = TSoundsManager::GetFromName("en57_bufferclamp.wav", true); dsbCouplerDetach = TSoundsManager::GetFromName("couplerdetach.wav", true); dsbCouplerStretch = TSoundsManager::GetFromName("en57_couplerstretch.wav", true); dsbCouplerAttach = TSoundsManager::GetFromName("couplerattach.wav", true); - while ((!Parser->EndOfFile) && (str != AnsiString("internaldata:"))) - { - str = Parser->GetNextSymbol().LowerCase(); - } - if (str == AnsiString("internaldata:")) - { - while (!Parser->EndOfFile) - { - str = Parser->GetNextSymbol().LowerCase(); + std::string token; + do { + token = ""; + parser.getTokens(); parser >> token; + } while( ( token != "" ) + && ( token != "internaldata:" ) ); + + if( token == "internaldata:" ) { + + do { + token = ""; + parser.getTokens(); parser >> token; // SEKCJA DZWIEKOW - if (str == AnsiString("ctrl:")) // nastawnik: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbNastawnikJazdy = TSoundsManager::GetFromName(str.c_str(), true); + if (token == "ctrl:") { + // nastawnik: + dsbNastawnikJazdy = TSoundsManager::GetFromName( parser.getToken().c_str(), true); } - else - //--------------- + else if( token == "ctrlscnd:" ) { // hunter-081211: nastawnik bocznikowania - if (str == AnsiString("ctrlscnd:")) // nastawnik bocznikowania: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbNastawnikBocz = TSoundsManager::GetFromName(str.c_str(), true); + dsbNastawnikBocz = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else - //--------------- + else if( token == "reverserkey:" ) { // hunter-131211: dzwiek kierunkowego - if (str == AnsiString("reverserkey:")) // nastawnik kierunkowy - { - str = Parser->GetNextSymbol().LowerCase(); - dsbReverserKey = TSoundsManager::GetFromName(str.c_str(), true); + dsbReverserKey = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else - //--------------- - if (str == AnsiString("buzzer:")) // bzyczek shp: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbBuzzer = TSoundsManager::GetFromName(str.c_str(), true); + else if (token == "buzzer:") { + // bzyczek shp: + dsbBuzzer = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("slipalarm:")) // Bombardier 011010: alarm przy poslizgu: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbSlipAlarm = TSoundsManager::GetFromName(str.c_str(), true); + else if( token == "slipalarm:") { + // Bombardier 011010: alarm przy poslizgu: + dsbSlipAlarm = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("tachoclock:")) // cykanie rejestratora: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbHasler = TSoundsManager::GetFromName(str.c_str(), true); + else if (token == "tachoclock:") { + // cykanie rejestratora: + dsbHasler = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("switch:")) // przelaczniki: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbSwitch = TSoundsManager::GetFromName(str.c_str(), true); + else if (token == "switch:") { + // przelaczniki: + dsbSwitch = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("pneumaticswitch:")) // stycznik EP: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbPneumaticSwitch = TSoundsManager::GetFromName(str.c_str(), true); + else if (token == "pneumaticswitch:") { + // stycznik EP: + dsbPneumaticSwitch = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else - //--------------- - // hunter-111211: wydzielenie wejscia na bezoporowa i na drugi uklad - // do pliku - if (str == AnsiString("wejscie_na_bezoporow:")) - { - str = Parser->GetNextSymbol().LowerCase(); - dsbWejscie_na_bezoporow = TSoundsManager::GetFromName(str.c_str(), true); + else if( token == "wejscie_na_bezoporow:" ) { + // hunter-111211: wydzielenie wejscia na bezoporowa i na drugi uklad do pliku + dsbWejscie_na_bezoporow = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("wejscie_na_drugi_uklad:")) - { - str = Parser->GetNextSymbol().LowerCase(); - dsbWejscie_na_drugi_uklad = TSoundsManager::GetFromName(str.c_str(), true); + else if (token == "wejscie_na_drugi_uklad:") { + + dsbWejscie_na_drugi_uklad = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else - //--------------- - if (str == AnsiString("relay:")) // styczniki itp: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbRelay = TSoundsManager::GetFromName(str.c_str(), true); - if (!dsbWejscie_na_bezoporow) // hunter-111211: domyslne, gdy brak - dsbWejscie_na_bezoporow = - TSoundsManager::GetFromName("wejscie_na_bezoporow.wav", true); - if (!dsbWejscie_na_drugi_uklad) - dsbWejscie_na_drugi_uklad = - TSoundsManager::GetFromName("wescie_na_drugi_uklad.wav", true); + else if (token == "relay:") { + // styczniki itp: + dsbRelay = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); + if( !dsbWejscie_na_bezoporow ) {// hunter-111211: domyslne, gdy brak + dsbWejscie_na_bezoporow = TSoundsManager::GetFromName( "wejscie_na_bezoporow.wav", true ); + } + if( !dsbWejscie_na_drugi_uklad ) { + dsbWejscie_na_drugi_uklad = TSoundsManager::GetFromName( "wescie_na_drugi_uklad.wav", true ); + } } - else if (str == AnsiString("pneumaticrelay:")) // wylaczniki pneumatyczne: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbPneumaticRelay = TSoundsManager::GetFromName(str.c_str(), true); + else if (token == "pneumaticrelay:") { + // wylaczniki pneumatyczne: + dsbPneumaticRelay = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("couplerattach:")) // laczenie: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbCouplerAttach = TSoundsManager::GetFromName(str.c_str(), true); + else if (token == "couplerattach:") { + // laczenie: + dsbCouplerAttach = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("couplerstretch:")) // laczenie: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbCouplerStretch = TSoundsManager::GetFromName(str.c_str(), true); // McZapkie-090503: PROWIZORKA!!! "en57_couplerstretch.wav" + else if (token == "couplerstretch:") { + // laczenie: + dsbCouplerStretch = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); // McZapkie-090503: PROWIZORKA!!! "en57_couplerstretch.wav" } - else if (str == AnsiString("couplerdetach:")) // rozlaczanie: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbCouplerDetach = TSoundsManager::GetFromName(str.c_str(), true); - + else if (token == "couplerdetach:") { + // rozlaczanie: + dsbCouplerDetach = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("bufferclamp:")) // laczenie: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbBufferClamp = TSoundsManager::GetFromName(str.c_str(), true); // McZapkie-090503: PROWIZORKA!!! "en57_bufferclamp.wav" + else if (token == "bufferclamp:") { + // laczenie: + dsbBufferClamp = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); // McZapkie-090503: PROWIZORKA!!! "en57_bufferclamp.wav" } - else if (str == AnsiString("ignition:")) - { // odpalanie silnika - str = Parser->GetNextSymbol().LowerCase(); - dsbDieselIgnition = TSoundsManager::GetFromName(str.c_str(), true); + else if( token == "ignition:" ) { + // odpalanie silnika + dsbDieselIgnition = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("brakesound:")) // hamowanie zwykle: - { - str = Parser->GetNextSymbol(); - rsBrake.Init(str.c_str(), -1, 0, 0, 0, true, true); - rsBrake.AM = - Parser->GetNextSymbol().ToDouble() / (1 + mvOccupied->MaxBrakeForce * 1000); - rsBrake.AA = Parser->GetNextSymbol().ToDouble(); - rsBrake.FM = Parser->GetNextSymbol().ToDouble() / (1 + mvOccupied->Vmax); - rsBrake.FA = Parser->GetNextSymbol().ToDouble(); + else if (token == "brakesound:") { + // hamowanie zwykle: + rsBrake.Init( parser.getToken(), -1, 0, 0, 0, true, true ); + parser.getTokens( 4, false ); + parser + >> rsBrake.AM + >> rsBrake.AA + >> rsBrake.FM + >> rsBrake.FA; + rsBrake.AM /= ( 1 + mvOccupied->MaxBrakeForce * 1000 ); + rsBrake.FM /= ( 1 + mvOccupied->Vmax ); } - else if (str == AnsiString("slipperysound:")) // sanie: - { - str = Parser->GetNextSymbol(); - rsSlippery.Init(str.c_str(), -1, 0, 0, 0, true); - rsSlippery.AM = Parser->GetNextSymbol().ToDouble() / (1 + mvOccupied->Vmax); - rsSlippery.AA = Parser->GetNextSymbol().ToDouble(); + else if (token == "slipperysound:") { + // sanie: + rsSlippery.Init( parser.getToken(), -1, 0, 0, 0, true ); + parser.getTokens( 2, false ); + parser + >> rsSlippery.AM + >> rsSlippery.AA; rsSlippery.FM = 0.0; rsSlippery.FA = 1.0; + rsSlippery.AM /= ( 1 + mvOccupied->Vmax ); } - else if (str == AnsiString("airsound:")) // syk: - { - str = Parser->GetNextSymbol(); - rsHiss.Init(str.c_str(), -1, 0, 0, 0, true); - rsHiss.AM = Parser->GetNextSymbol().ToDouble(); - rsHiss.AA = Parser->GetNextSymbol().ToDouble(); + else if (token == "airsound:"){ + // syk: + rsHiss.Init( parser.getToken(), -1, 0, 0, 0, true ); + parser.getTokens( 2, false ); + parser + >> rsHiss.AM + >> rsHiss.AA; rsHiss.FM = 0.0; rsHiss.FA = 1.0; } - else if (str == AnsiString("airsound2:")) // syk: - { - str = Parser->GetNextSymbol(); - rsHissU.Init(str.c_str(), -1, 0, 0, 0, true); - rsHissU.AM = Parser->GetNextSymbol().ToDouble(); - rsHissU.AA = Parser->GetNextSymbol().ToDouble(); + else if (token == "airsound2:") { + // syk: + rsHissU.Init( parser.getToken(), -1, 0, 0, 0, true ); + parser.getTokens( 2, false ); + parser + >> rsHissU.AM + >> rsHissU.AA; rsHissU.FM = 0.0; rsHissU.FA = 1.0; } - else if (str == AnsiString("airsound3:")) // syk: - { - str = Parser->GetNextSymbol(); - rsHissE.Init(str.c_str(), -1, 0, 0, 0, true); - rsHissE.AM = Parser->GetNextSymbol().ToDouble(); - rsHissE.AA = Parser->GetNextSymbol().ToDouble(); + else if (token == "airsound3:") { + // syk: + rsHissE.Init( parser.getToken(), -1, 0, 0, 0, true ); + parser.getTokens( 2, false ); + parser + >> rsHissE.AM + >> rsHissE.AA; rsHissE.FM = 0.0; rsHissE.FA = 1.0; } - else if (str == AnsiString("airsound4:")) // syk: - { - str = Parser->GetNextSymbol(); - rsHissX.Init(str.c_str(), -1, 0, 0, 0, true); - rsHissX.AM = Parser->GetNextSymbol().ToDouble(); - rsHissX.AA = Parser->GetNextSymbol().ToDouble(); + else if (token == "airsound4:") { + // syk: + rsHissX.Init( parser.getToken(), -1, 0, 0, 0, true ); + parser.getTokens( 2, false ); + parser + >> rsHissX.AM + >> rsHissX.AA; rsHissX.FM = 0.0; rsHissX.FA = 1.0; } - else if (str == AnsiString("airsound5:")) // syk: - { - str = Parser->GetNextSymbol(); - rsHissT.Init(str.c_str(), -1, 0, 0, 0, true); - rsHissT.AM = Parser->GetNextSymbol().ToDouble(); - rsHissT.AA = Parser->GetNextSymbol().ToDouble(); + else if (token == "airsound5:") { + // syk: + rsHissT.Init( parser.getToken(), -1, 0, 0, 0, true ); + parser.getTokens( 2, false ); + parser + >> rsHissT.AM + >> rsHissT.AA; rsHissT.FM = 0.0; rsHissT.FA = 1.0; } - else if (str == AnsiString("fadesound:")) // syk: - { - str = Parser->GetNextSymbol(); - rsFadeSound.Init(str.c_str(), -1, 0, 0, 0, true); + else if (token == "fadesound:") { + // syk: + rsFadeSound.Init( parser.getToken(), -1, 0, 0, 0, true ); rsFadeSound.AM = 1.0; rsFadeSound.AA = 1.0; rsFadeSound.FM = 1.0; rsFadeSound.FA = 1.0; } - else if (str == AnsiString("localbrakesound:")) // syk: - { - str = Parser->GetNextSymbol(); - rsSBHiss.Init(str.c_str(), -1, 0, 0, 0, true); - rsSBHiss.AM = Parser->GetNextSymbol().ToDouble(); - rsSBHiss.AA = Parser->GetNextSymbol().ToDouble(); + else if (token == "localbrakesound:") { + // syk: + rsSBHiss.Init( parser.getToken(), -1, 0, 0, 0, true ); + parser.getTokens( 2, false ); + parser + >> rsSBHiss.AM + >> rsSBHiss.AA; rsSBHiss.FM = 0.0; rsSBHiss.FA = 1.0; } - else if (str == AnsiString("runningnoise:")) // szum podczas jazdy: - { - str = Parser->GetNextSymbol(); - rsRunningNoise.Init(str.c_str(), -1, 0, 0, 0, true, true); - rsRunningNoise.AM = Parser->GetNextSymbol().ToDouble() / (1 + mvOccupied->Vmax); - rsRunningNoise.AA = Parser->GetNextSymbol().ToDouble(); - rsRunningNoise.FM = Parser->GetNextSymbol().ToDouble() / (1 + mvOccupied->Vmax); - rsRunningNoise.FA = Parser->GetNextSymbol().ToDouble(); + else if (token == "runningnoise:") { + // szum podczas jazdy: + rsRunningNoise.Init( parser.getToken(), -1, 0, 0, 0, true, true ); + parser.getTokens( 4, false ); + parser + >> rsRunningNoise.AM + >> rsRunningNoise.AA + >> rsRunningNoise.FM + >> rsRunningNoise.FA; + rsRunningNoise.AM /= ( 1 + mvOccupied->Vmax ); + rsRunningNoise.FM /= ( 1 + mvOccupied->Vmax ); } - else if (str == AnsiString("engageslippery:")) // tarcie tarcz sprzegla: - { - str = Parser->GetNextSymbol(); - rsEngageSlippery.Init(str.c_str(), -1, 0, 0, 0, true, true); - rsEngageSlippery.AM = Parser->GetNextSymbol().ToDouble(); - rsEngageSlippery.AA = Parser->GetNextSymbol().ToDouble(); - rsEngageSlippery.FM = Parser->GetNextSymbol().ToDouble() / (1 + mvOccupied->nmax); - rsEngageSlippery.FA = Parser->GetNextSymbol().ToDouble(); + else if (token == "engageslippery:") { + // tarcie tarcz sprzegla: + rsEngageSlippery.Init( parser.getToken(), -1, 0, 0, 0, true, true ); + parser.getTokens( 4, false ); + parser + >> rsEngageSlippery.AM + >> rsEngageSlippery.AA + >> rsEngageSlippery.FM + >> rsEngageSlippery.FA; + rsEngageSlippery.FM /= ( 1 + mvOccupied->nmax ); } - else if (str == AnsiString("mechspring:")) // parametry bujania kamery: - { - str = Parser->GetNextSymbol(); - MechSpring.Init(0, str.ToDouble(), Parser->GetNextSymbol().ToDouble()); - fMechSpringX = Parser->GetNextSymbol().ToDouble(); - fMechSpringY = Parser->GetNextSymbol().ToDouble(); - fMechSpringZ = Parser->GetNextSymbol().ToDouble(); - fMechMaxSpring = Parser->GetNextSymbol().ToDouble(); - fMechRoll = Parser->GetNextSymbol().ToDouble(); - fMechPitch = Parser->GetNextSymbol().ToDouble(); + else if (token == "mechspring:") { + // parametry bujania kamery: + double ks, kd; + parser.getTokens( 2, false ); + parser + >> ks + >> kd; + MechSpring.Init(0, ks, kd); + parser.getTokens( 6, false ); + parser + >> fMechSpringX + >> fMechSpringY + >> fMechSpringZ + >> fMechMaxSpring + >> fMechRoll + >> fMechPitch; } - else if (str == AnsiString("pantographup:")) // podniesienie patyka: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbPantUp = TSoundsManager::GetFromName(str.c_str(), true); + else if (token == "pantographup:") { + // podniesienie patyka: + dsbPantUp = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("pantographdown:")) // podniesienie patyka: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbPantDown = TSoundsManager::GetFromName(str.c_str(), true); + else if (token == "pantographdown:") { + // podniesienie patyka: + dsbPantDown = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("doorclose:")) // zamkniecie drzwi: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbDoorClose = TSoundsManager::GetFromName(str.c_str(), true); + else if (token == "doorclose:"){ + // zamkniecie drzwi: + dsbDoorClose = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - else if (str == AnsiString("dooropen:")) // otwarcie drzwi: - { - str = Parser->GetNextSymbol().LowerCase(); - dsbDoorOpen = TSoundsManager::GetFromName(str.c_str(), true); + else if (token == "dooropen:") { + // otwarcie drzwi: + dsbDoorOpen = TSoundsManager::GetFromName( parser.getToken().c_str(), true ); } - } + + } while( token != "" ); } - else - return false; // nie znalazl sekcji internal - 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 + else { return false; } // nie znalazl sekcji internal + + if( !InitializeCab( mvOccupied->ActiveCab, asFileName ) ) { + // zle zainicjowana kabina + return false; + } + else { + if( DynamicObject->Controller == Humandriver ) { + // McZapkie-030303: mozliwosc wyswietlania kabiny, w przyszlosci dac opcje w mmd + DynamicObject->bDisplayCab = true; + } return true; } } -bool TTrain::InitializeCab(int NewCabNo, std::string asFileName) +bool TTrain::InitializeCab(int NewCabNo, std::string const &asFileName) { pyScreens.reset(this); pyScreens.setLookupPath(DynamicObject->asBaseDir); bool parse = false; double dSDist; - std::ifstream t(asFileName.c_str()); - std::stringstream buffer; - buffer << t.rdbuf(); - //TFileStream *fs; - //fs = new TFileStream(asFileName, fmOpenRead | fmShareCompat); - AnsiString str = AnsiString(buffer.str().c_str()); - // DecimalSeparator='.'; - //int size = fs->Size; - //str.SetLength(size); - //fs->Read(str.c_str(), size); - //str += ""; - //delete fs; - TQueryParserComp *Parser; - Parser = new TQueryParserComp(NULL); - Parser->TextToParse = str; - // Parser->LoadStringToParse(asFile); - Parser->First(); - 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 @@ -5339,633 +5290,121 @@ bool TTrain::InitializeCab(int NewCabNo, std::string asFileName) break; case 0: cabindex = 0; + break; } - AnsiString cabstr = AnsiString("cab") + cabindex + AnsiString("definition:"); - while ((!Parser->EndOfFile) && (AnsiCompareStr(str, cabstr) != 0)) - str = Parser->GetNextSymbol().LowerCase(); // szukanie kabiny - if (cabindex != 1) - if (AnsiCompareStr(str, cabstr) != 0) // jeśli nie znaleziony wpis kabiny - { // próba szukania kabiny 1 - cabstr = AnsiString("cab1definition:"); - Parser->First(); - while ((!Parser->EndOfFile) && (AnsiCompareStr(str, cabstr) != 0)) - str = Parser->GetNextSymbol().LowerCase(); // szukanie kabiny - } - if (AnsiCompareStr(str, cabstr) == 0) // jeśli znaleziony wpis kabiny - { - Cabine[cabindex].Load(Parser); - str = Parser->GetNextSymbol().LowerCase(); - if (AnsiCompareStr(AnsiString("driver") + cabindex + AnsiString("pos:"), - str) == 0) // pozycja poczatkowa maszynisty - { - pMechOffset.x = Parser->GetNextSymbol().ToDouble(); - pMechOffset.y = Parser->GetNextSymbol().ToDouble(); - pMechOffset.z = Parser->GetNextSymbol().ToDouble(); - pMechSittingPosition.x = pMechOffset.x; - pMechSittingPosition.y = pMechOffset.y; - pMechSittingPosition.z = pMechOffset.z; - } - // ABu: pozycja siedzaca mechanika - str = Parser->GetNextSymbol().LowerCase(); - if (AnsiCompareStr(AnsiString("driver") + cabindex + AnsiString("sitpos:"), - str) == 0) // ABu 180404 pozycja siedzaca maszynisty - { - pMechSittingPosition.x = Parser->GetNextSymbol().ToDouble(); - pMechSittingPosition.y = Parser->GetNextSymbol().ToDouble(); - pMechSittingPosition.z = Parser->GetNextSymbol().ToDouble(); - parse = true; - } - // else parse=false; - while (!Parser->EndOfFile) - { // ABu: wstawione warunki, wczesniej tylko to: - // str=Parser->GetNextSymbol().LowerCase(); - if (parse) - str = Parser->GetNextSymbol().LowerCase(); - 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 - { - str = Parser->GetNextSymbol().LowerCase(); - if (str != AnsiString("none")) - { - str = AnsiString(DynamicObject->asBaseDir.c_str()) + str; - Global::asCurrentTexturePath = - DynamicObject->asBaseDir; // bieżąca sciezka do tekstur to dynamic/... - TModel3d *k = TModelsManager::GetModel( - str.c_str(), true); // szukaj kabinę jako oddzielny model - Global::asCurrentTexturePath = - szTexturePath; // z powrotem defaultowa sciezka do tekstur - // 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 - // 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 - ActiveUniversal4 = false; - ggMainCtrl.Clear(); - ggMainCtrlAct.Clear(); - ggScndCtrl.Clear(); - ggDirKey.Clear(); - ggBrakeCtrl.Clear(); - ggLocalBrake.Clear(); - ggManualBrake.Clear(); - ggBrakeProfileCtrl.Clear(); - ggBrakeProfileG.Clear(); - ggBrakeProfileR.Clear(); - ggMaxCurrentCtrl.Clear(); - ggMainOffButton.Clear(); - ggMainOnButton.Clear(); - ggSecurityResetButton.Clear(); - ggReleaserButton.Clear(); - ggSandButton.Clear(); - ggAntiSlipButton.Clear(); - ggHornButton.Clear(); - ggNextCurrentButton.Clear(); - ggUniversal1Button.Clear(); - ggUniversal2Button.Clear(); - ggUniversal3Button.Clear(); - // hunter-091012 - ggCabLightButton.Clear(); - ggCabLightDimButton.Clear(); - //------- - ggUniversal4Button.Clear(); - ggFuseButton.Clear(); - ggConverterFuseButton.Clear(); - ggStLinOffButton.Clear(); - ggDoorLeftButton.Clear(); - ggDoorRightButton.Clear(); - ggDepartureSignalButton.Clear(); - ggCompressorButton.Clear(); - ggConverterButton.Clear(); - ggPantFrontButton.Clear(); - ggPantRearButton.Clear(); - ggPantFrontButtonOff.Clear(); - ggPantAllDownButton.Clear(); - ggZbS.Clear(); - ggI1B.Clear(); - ggI2B.Clear(); - ggI3B.Clear(); - ggItotalB.Clear(); + std::string cabstr( "cab" + std::to_string( cabindex ) + "definition:" ); - ggClockSInd.Clear(); - ggClockMInd.Clear(); - ggClockHInd.Clear(); - ggEngineVoltage.Clear(); - ggLVoltage.Clear(); - // ggLVoltage.Output(0); //Ra: sterowanie miernikiem: niskie napięcie - // ggEnrot1m.Clear(); - // ggEnrot2m.Clear(); - // ggEnrot3m.Clear(); - // ggEngageRatio.Clear(); - ggMainGearStatus.Clear(); - ggIgnitionKey.Clear(); - // Jeśli ustawiamy nową wartość dla PoKeys wolna jest 15 - // Numer 14 jest używany dla buczka SHP w innym miejscu - btLampkaPoslizg.Clear(6); - btLampkaStyczn.Clear(5); - btLampkaNadmPrzetw.Clear( - (mvControlled->TrainType & (dt_EZT)) ? -1 : 7); // EN57 nie ma tej lampki - btLampkaPrzetw.Clear((mvControlled->TrainType & (dt_EZT)) ? 7 : -1); // za to ma tę - btLampkaPrzekRozn.Clear(); - btLampkaPrzekRoznPom.Clear(); - btLampkaNadmSil.Clear(4); - btLampkaUkrotnienie.Clear(); - btLampkaHamPosp.Clear(); - btLampkaWylSzybki.Clear(3); - btLampkaNadmWent.Clear(9); - btLampkaNadmSpr.Clear(8); - btLampkaOpory.Clear(2); - btLampkaWysRozr.Clear( - (mvControlled->TrainType & (dt_ET22)) ? -1 : 10); // ET22 nie ma tej lampki - btLampkaBezoporowa.Clear(); - btLampkaBezoporowaB.Clear(); - btLampkaMaxSila.Clear(); - btLampkaPrzekrMaxSila.Clear(); - btLampkaRadio.Clear(); - btLampkaHamulecReczny.Clear(); - btLampkaBlokadaDrzwi.Clear(); - btLampkaUniversal3.Clear(); - btLampkaWentZaluzje.Clear(); - btLampkaOgrzewanieSkladu.Clear(11); - btLampkaSHP.Clear(0); - btLampkaCzuwaka.Clear(1); - btLampkaDoorLeft.Clear(); - btLampkaDoorRight.Clear(); - btLampkaDepartureSignal.Clear(); - btLampkaRezerwa.Clear(); - btLampkaBoczniki.Clear(); - btLampkaBocznik1.Clear(); - btLampkaBocznik2.Clear(); - btLampkaBocznik3.Clear(); - btLampkaBocznik4.Clear(); - btLampkaRadiotelefon.Clear(); - btLampkaHamienie.Clear(); - btLampkaSprezarka.Clear(); - btLampkaSprezarkaB.Clear(); - btLampkaNapNastHam.Clear(); - btLampkaJazda.Clear(); - btLampkaStycznB.Clear(); - btLampkaHamowanie1zes.Clear(); - btLampkaHamowanie2zes.Clear(); - btLampkaNadmPrzetwB.Clear(); - btLampkaPrzetwB.Clear(); - btLampkaWylSzybkiB.Clear(); - btLampkaForward.Clear(); - btLampkaBackward.Clear(); - btCabLight.Clear(); // hunter-171012 - ggLeftLightButton.Clear(); - ggRightLightButton.Clear(); - ggUpperLightButton.Clear(); - ggLeftEndLightButton.Clear(); - ggRightEndLightButton.Clear(); - ggLightsButton.Clear(); - // hunter-230112 - ggRearLeftLightButton.Clear(); - ggRearRightLightButton.Clear(); - ggRearUpperLightButton.Clear(); - ggRearLeftEndLightButton.Clear(); - ggRearRightEndLightButton.Clear(); - btHaslerBrakes.Clear(12); // ciśnienie w cylindrach do odbijania na haslerze - btHaslerCurrent.Clear(13); // prąd na silnikach do odbijania na haslerze - } - // SEKCJA REGULATOROW - else if (str == AnsiString("mainctrl:")) // nastawnik - { - if (!DynamicObject->mdKabina) - { - delete Parser; - WriteLog("Cab not initialised!"); - return false; - } - else - ggMainCtrl.Load(Parser, DynamicObject->mdKabina); - } - else if (str == AnsiString("mainctrlact:")) // zabek pozycji aktualnej - ggMainCtrlAct.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("scndctrl:")) // bocznik - ggScndCtrl.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("dirkey:")) // klucz kierunku - ggDirKey.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("brakectrl:")) // hamulec zasadniczy - ggBrakeCtrl.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("localbrake:")) // hamulec pomocniczy - ggLocalBrake.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("manualbrake:")) // hamulec reczny - ggManualBrake.Load(Parser, DynamicObject->mdKabina); - // sekcja przelacznikow obrotowych - else if (str == AnsiString("brakeprofile_sw:")) // przelacznik tow/osob/posp - ggBrakeProfileCtrl.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("brakeprofileg_sw:")) // przelacznik tow/osob - ggBrakeProfileG.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("brakeprofiler_sw:")) // przelacznik osob/posp - ggBrakeProfileR.Load(Parser, DynamicObject->mdKabina); - 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) - ggMainOffButton.Load(Parser, DynamicObject->mdKabina); - 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); - else if (str == AnsiString("releaser_bt:")) // przycisk odluzniacza - ggReleaserButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("sand_bt:")) // przycisk piasecznicy - ggSandButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("antislip_bt:")) // przycisk antyposlizgowy - ggAntiSlipButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("horn_bt:")) // dzwignia syreny - 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. - ggConverterFuseButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("stlinoff_bt:")) // st. liniowe - ggStLinOffButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("door_left_sw:")) // drzwi lewe - ggDoorLeftButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("door_right_sw:")) // drzwi prawe - ggDoorRightButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("departure_signal_bt:")) // sygnal odjazdu - ggDepartureSignalButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("upperlight_sw:")) // swiatlo - ggUpperLightButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("leftlight_sw:")) // swiatlo - ggLeftLightButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("rightlight_sw:")) // swiatlo - ggRightLightButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("leftend_sw:")) // swiatlo - ggLeftEndLightButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("rightend_sw:")) // swiatlo - ggRightEndLightButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("lights_sw:")) // swiatla wszystkie - ggLightsButton.Load(Parser, DynamicObject->mdKabina); - //--------------------- - // hunter-230112: przelaczniki swiatel tylnich - else if (str == AnsiString("rearupperlight_sw:")) // swiatlo - ggRearUpperLightButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("rearleftlight_sw:")) // swiatlo - ggRearLeftLightButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("rearrightlight_sw:")) // swiatlo - ggRearRightLightButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("rearleftend_sw:")) // swiatlo - ggRearLeftEndLightButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("rearrightend_sw:")) // swiatlo - ggRearRightEndLightButton.Load(Parser, DynamicObject->mdKabina); - //------------------ - else if (str == AnsiString("compressor_sw:")) // sprezarka - ggCompressorButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("converter_sw:")) // przetwornica - ggConverterButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("converteroff_sw:")) // przetwornica wyl - ggConverterOffButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("main_sw:")) // wyl szybki (ezt) - ggMainButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("radio_sw:")) // radio - ggRadioButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("pantfront_sw:")) // patyk przedni - ggPantFrontButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("pantrear_sw:")) // patyk tylny - ggPantRearButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("pantfrontoff_sw:")) // patyk przedni w dol - ggPantFrontButtonOff.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("pantalloff_sw:")) // patyk przedni w dol - ggPantAllDownButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("trainheating_sw:")) // grzanie skladu - ggTrainHeatingButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("signalling_sw:")) // Sygnalizacja hamowania - ggSignallingButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("door_signalling_sw:")) // Sygnalizacja blokady drzwi - ggDoorSignallingButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("nextcurrent_sw:")) // prąd drugiego członu - ggNextCurrentButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("cablight_sw:")) // hunter-091012: swiatlo w kabinie - ggCabLightButton.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("cablightdim_sw:")) - ggCabLightDimButton.Load( - Parser, - DynamicObject->mdKabina); // hunter-091012: przyciemnienie swiatla w kabinie - // ABu 090305: uniwersalne przyciski lub inne rzeczy - else if (str == AnsiString("universal1:")) - ggUniversal1Button.Load(Parser, DynamicObject->mdKabina, DynamicObject->mdModel); - else if (str == AnsiString("universal2:")) - ggUniversal2Button.Load(Parser, DynamicObject->mdKabina, DynamicObject->mdModel); - else if (str == AnsiString("universal3:")) - ggUniversal3Button.Load(Parser, DynamicObject->mdKabina, DynamicObject->mdModel); - else if (str == AnsiString("universal4:")) - ggUniversal4Button.Load(Parser, DynamicObject->mdKabina, DynamicObject->mdModel); - // SEKCJA WSKAZNIKOW - else if ((str == AnsiString("tachometer:")) || (str == AnsiString("tachometerb:"))) - { // 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 - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina); - gg->AssignFloat(&fTachoVelocity); - } - else if (str == AnsiString("tachometerd:")) - { // predkosciomierz cyfrowy - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina); - gg->AssignFloat(&fTachoVelocity); - } - else if ((str == AnsiString("hvcurrent1:")) || (str == AnsiString("hvcurrent1b:"))) - { // 1szy amperomierz - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina); - gg->AssignFloat(fHCurrent + 1); - } - else if ((str == AnsiString("hvcurrent2:")) || (str == AnsiString("hvcurrent2b:"))) - { // 2gi amperomierz - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina); - gg->AssignFloat(fHCurrent + 2); - } - else if ((str == AnsiString("hvcurrent3:")) || (str == AnsiString("hvcurrent3b:"))) - { // 3ci amperomierz - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina); - gg->AssignFloat(fHCurrent + 3); - } - else if ((str == AnsiString("hvcurrent:")) || (str == AnsiString("hvcurrentb:"))) - { // amperomierz calkowitego pradu - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - 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("brakes:")) - { // 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(&fPress[i - 1][j]); + std::shared_ptr parser = std::make_shared( asFileName, cParser::buffer_FILE ); + std::string token; + do { + // szukanie kabiny + token = ""; + parser->getTokens(); *parser >> token; + + } while( ( token != "" ) + && ( token != cabstr ) ); + + if( ( cabindex != 1 ) + && ( token != cabstr ) ) { + // jeśli nie znaleziony wpis kabiny, próba szukania kabiny 1 + cabstr = "cab1definition:"; + // crude way to start parsing from beginning + parser = std::make_shared( asFileName, cParser::buffer_FILE ); + do { + token = ""; + parser->getTokens(); *parser >> token; + } while( ( token != "" ) + && ( token != cabstr ) ); + } + if( token == cabstr ) { + // jeśli znaleziony wpis kabiny + Cabine[ cabindex ].Load( *parser ); + // NOTE: the next part is likely to break if sitpos doesn't follow pos + parser->getTokens(); *parser >> token; + if( token == std::string( "driver" + std::to_string( cabindex ) + "pos:" ) ) { + // pozycja poczatkowa maszynisty + parser->getTokens( 3, false ); + *parser + >> pMechOffset.x + >> pMechOffset.y + >> pMechOffset.z; + pMechSittingPosition.x = pMechOffset.x; + pMechSittingPosition.y = pMechOffset.y; + pMechSittingPosition.z = pMechOffset.z; + } + // ABu: pozycja siedzaca mechanika + parser->getTokens(); *parser >> token; + if( token == std::string( "driver" + std::to_string( cabindex ) + "sitpos:" ) ) { + // ABu 180404 pozycja siedzaca maszynisty + parser->getTokens( 3, false ); + *parser + >> pMechSittingPosition.x + >> pMechSittingPosition.y + >> pMechSittingPosition.z; + parse = true; + } + // else parse=false; + do { + // ABu: wstawione warunki, wczesniej tylko to: + // str=Parser->GetNextSymbol().LowerCase(); + if( parse == true ) { + + token = ""; + parser->getTokens(); *parser >> token; } - else if ((str == AnsiString("brakepress:")) || (str == AnsiString("brakepressb:"))) - { // 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); - } - else if ((str == AnsiString("pipepress:")) || (str == AnsiString("pipepressb:"))) - { // manometr przewodu hamulcowego - TGauge *gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina, NULL, 0.1); - gg->AssignDouble(&mvOccupied->PipePress); - } - 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 - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina, NULL, 0.1); - gg->AssignDouble(&mvControlled->PantPress); - } - else if ((str == AnsiString("compressor:")) || (str == AnsiString("compressorb:"))) - { // 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); - } - // yB - dla drugiej sekcji - else if (str == AnsiString("hvbcurrent1:")) // 1szy amperomierz - ggI1B.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("hvbcurrent2:")) // 2gi amperomierz - ggI2B.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("hvbcurrent3:")) // 3ci amperomierz - ggI3B.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("hvbcurrent:")) // amperomierz calkowitego pradu - ggItotalB.Load(Parser, DynamicObject->mdKabina); - //************************************************************* - else if (str == AnsiString("clock:")) // zegar analogowy - { - if (Parser->GetNextSymbol() == AnsiString("analog")) - { - // McZapkie-300302: zegarek - ggClockSInd.Init(DynamicObject->mdKabina->GetFromName("ClockShand"), gt_Rotate, - 0.016666667, 0, 0); - ggClockMInd.Init(DynamicObject->mdKabina->GetFromName("ClockMhand"), gt_Rotate, - 0.016666667, 0, 0); - ggClockHInd.Init(DynamicObject->mdKabina->GetFromName("ClockHhand"), gt_Rotate, - 0.083333333, 0, 0); - } - } - else if (str == AnsiString("evoltage:")) // woltomierz napiecia silnikow - ggEngineVoltage.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("hvoltage:")) - { // woltomierz wysokiego napiecia - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina); - gg->AssignFloat(&fHVoltage); - } - else if (str == AnsiString("lvoltage:")) // woltomierz niskiego napiecia - ggLVoltage.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("enrot1m:")) - { // obrotomierz - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina); - gg->AssignFloat(fEngine + 1); - } // ggEnrot1m.Load(Parser,DynamicObject->mdKabina); - else if (str == AnsiString("enrot2m:")) - { // obrotomierz - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina); - gg->AssignFloat(fEngine + 2); - } // ggEnrot2m.Load(Parser,DynamicObject->mdKabina); - else if (str == AnsiString("enrot3m:")) - { // obrotomierz - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina); - gg->AssignFloat(fEngine + 3); - } // ggEnrot3m.Load(Parser,DynamicObject->mdKabina); - else if (str == AnsiString("engageratio:")) - { // np. ciśnienie sterownika sprzęgła - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - 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 - ggMainGearStatus.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("ignitionkey:")) // - ggIgnitionKey.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("distcounter:")) - { // Ra 2014-07: licznik kilometrów - gg = Cabine[cabindex].Gauge(-1); // pierwsza wolna gałka - gg->Load(Parser, DynamicObject->mdKabina); - gg->AssignDouble(&mvControlled->DistCounter); - } - // SEKCJA LAMPEK - else if (str == AnsiString("i-maxft:")) - btLampkaMaxSila.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-maxftt:")) - btLampkaPrzekrMaxSila.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-radio:")) - btLampkaRadio.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-manual_brake:")) - btLampkaHamulecReczny.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-door_blocked:")) - btLampkaBlokadaDrzwi.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-slippery:")) - btLampkaPoslizg.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-contactors:")) - btLampkaStyczn.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-conv_ovld:")) - btLampkaNadmPrzetw.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-converter:")) - btLampkaPrzetw.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-diff_relay:")) - btLampkaPrzekRozn.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-diff_relay2:")) - btLampkaPrzekRoznPom.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-motor_ovld:")) - btLampkaNadmSil.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-train_controll:")) - btLampkaUkrotnienie.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-brake_delay_r:")) - btLampkaHamPosp.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-mainbreaker:")) - btLampkaWylSzybki.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-vent_ovld:")) - btLampkaNadmWent.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-comp_ovld:")) - btLampkaNadmSpr.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-resistors:")) - btLampkaOpory.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-no_resistors:")) - btLampkaBezoporowa.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-no_resistors_b:")) - btLampkaBezoporowaB.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-highcurrent:")) - btLampkaWysRozr.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-universal3:")) - { - btLampkaUniversal3.Load(Parser, DynamicObject->mdKabina, DynamicObject->mdModel); - LampkaUniversal3_typ = 0; - } - else if (str == AnsiString("i-universal3_M:")) - { - btLampkaUniversal3.Load(Parser, DynamicObject->mdKabina, DynamicObject->mdModel); - LampkaUniversal3_typ = 1; - } - else if (str == AnsiString("i-universal3_C:")) - { - btLampkaUniversal3.Load(Parser, DynamicObject->mdKabina, DynamicObject->mdModel); - LampkaUniversal3_typ = 2; - } - else if (str == AnsiString("i-vent_trim:")) - btLampkaWentZaluzje.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-trainheating:")) - btLampkaOgrzewanieSkladu.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-security_aware:")) - btLampkaCzuwaka.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-security_cabsignal:")) - btLampkaSHP.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-door_left:")) - btLampkaDoorLeft.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-door_right:")) - btLampkaDoorRight.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-departure_signal:")) - btLampkaDepartureSignal.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-reserve:")) - btLampkaRezerwa.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-scnd:")) - btLampkaBoczniki.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-scnd1:")) - btLampkaBocznik1.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-scnd2:")) - btLampkaBocznik2.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-scnd3:")) - btLampkaBocznik3.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-scnd4:")) - btLampkaBocznik4.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-braking:")) - btLampkaHamienie.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-braking-ezt:")) - btLampkaHamowanie1zes.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-braking-ezt2:")) - btLampkaHamowanie2zes.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-compressor:")) - btLampkaSprezarka.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-compressorb:")) - btLampkaSprezarkaB.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-voltbrake:")) - btLampkaNapNastHam.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-mainbreakerb:")) - btLampkaWylSzybkiB.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-resistorsb:")) - btLampkaOporyB.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-contactorsb:")) - btLampkaStycznB.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-conv_ovldb:")) - btLampkaNadmPrzetwB.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-converterb:")) - btLampkaPrzetwB.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-forward:")) - btLampkaForward.Load(Parser, DynamicObject->mdKabina); - else if (str == AnsiString("i-backward:")) - 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[0] + 3 * i); + else { + parse = true; } - else if (str == AnsiString("pyscreen:")) - pyScreens.init(Parser, DynamicObject->mdKabina, DynamicObject->GetName(), NewCabNo); - // btLampkaUnknown.Init("unknown",mdKabina,false); - } - } - else - { - delete Parser; + // 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( token == std::string( "cab" + std::to_string(cabindex) + "model:" ) ) { + // model kabiny + parser->getTokens(); *parser >> token; + if( token != "none" ) { + + Global::asCurrentTexturePath = DynamicObject->asBaseDir; // bieżąca sciezka do tekstur to dynamic/... + TModel3d *kabina = TModelsManager::GetModel( DynamicObject->asBaseDir + token, true ); // szukaj kabinę jako oddzielny model + Global::asCurrentTexturePath = szTexturePath; // z powrotem defaultowa sciezka do tekstur + // if (DynamicObject->mdKabina!=k) + if( kabina != nullptr ) { + DynamicObject->mdKabina = kabina; // 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 + // 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 + } + ActiveUniversal4 = false; + clear_cab_controls(); + } + if( nullptr == DynamicObject->mdKabina ) { + // don't bother with other parts until the cab is initialised + continue; + } + else if( true == initialize_gauge( *parser, token, cabindex ) ) { + // matched the token, grab the next one + continue; + } + else if( true == initialize_button( *parser, token, cabindex ) ) { + // matched the token, grab the next one + continue; + } + else if( token == "pyscreen:" ) { + pyScreens.init( *parser, DynamicObject->mdKabina, DynamicObject->GetName(), NewCabNo ); + } + // btLampkaUnknown.Init("unknown",mdKabina,false); + } while( token != "" ); + } + else { return false; } - // ABu 050205: tego wczesniej nie bylo: - delete Parser; pyScreens.start(); if (DynamicObject->mdKabina) { @@ -5973,7 +5412,7 @@ bool TTrain::InitializeCab(int NewCabNo, std::string asFileName) // również zapisanie binarnego return true; } - return AnsiCompareStr(str, AnsiString("none")); + return( token == "none" ); } void TTrain::MechStop() @@ -6153,3 +5592,734 @@ void TTrain::SetLights() mvOccupied->Lights[1 - xs][mvOccupied->LightsPos - 1]); } }; + +// clears state of all cabin controls +void +TTrain::clear_cab_controls() { + + ggMainCtrl.Clear(); + ggMainCtrlAct.Clear(); + ggScndCtrl.Clear(); + ggDirKey.Clear(); + ggBrakeCtrl.Clear(); + ggLocalBrake.Clear(); + ggManualBrake.Clear(); + ggBrakeProfileCtrl.Clear(); + ggBrakeProfileG.Clear(); + ggBrakeProfileR.Clear(); + ggMaxCurrentCtrl.Clear(); + ggMainOffButton.Clear(); + ggMainOnButton.Clear(); + ggSecurityResetButton.Clear(); + ggReleaserButton.Clear(); + ggSandButton.Clear(); + ggAntiSlipButton.Clear(); + ggHornButton.Clear(); + ggNextCurrentButton.Clear(); + ggUniversal1Button.Clear(); + ggUniversal2Button.Clear(); + ggUniversal3Button.Clear(); + // hunter-091012 + ggCabLightButton.Clear(); + ggCabLightDimButton.Clear(); + //------- + ggUniversal4Button.Clear(); + ggFuseButton.Clear(); + ggConverterFuseButton.Clear(); + ggStLinOffButton.Clear(); + ggDoorLeftButton.Clear(); + ggDoorRightButton.Clear(); + ggDepartureSignalButton.Clear(); + ggCompressorButton.Clear(); + ggConverterButton.Clear(); + ggPantFrontButton.Clear(); + ggPantRearButton.Clear(); + ggPantFrontButtonOff.Clear(); + ggPantAllDownButton.Clear(); + ggZbS.Clear(); + ggI1B.Clear(); + ggI2B.Clear(); + ggI3B.Clear(); + ggItotalB.Clear(); + + ggClockSInd.Clear(); + ggClockMInd.Clear(); + ggClockHInd.Clear(); + ggEngineVoltage.Clear(); + ggLVoltage.Clear(); + // ggLVoltage.Output(0); //Ra: sterowanie miernikiem: niskie napięcie + // ggEnrot1m.Clear(); + // ggEnrot2m.Clear(); + // ggEnrot3m.Clear(); + // ggEngageRatio.Clear(); + ggMainGearStatus.Clear(); + ggIgnitionKey.Clear(); + // Jeśli ustawiamy nową wartość dla PoKeys wolna jest 15 + // Numer 14 jest używany dla buczka SHP w innym miejscu + btLampkaPoslizg.Clear( 6 ); + btLampkaStyczn.Clear( 5 ); + btLampkaNadmPrzetw.Clear( + ( mvControlled->TrainType & ( dt_EZT ) ) ? -1 : 7 ); // EN57 nie ma tej lampki + btLampkaPrzetw.Clear( ( mvControlled->TrainType & ( dt_EZT ) ) ? 7 : -1 ); // za to ma tę + btLampkaPrzekRozn.Clear(); + btLampkaPrzekRoznPom.Clear(); + btLampkaNadmSil.Clear( 4 ); + btLampkaUkrotnienie.Clear(); + btLampkaHamPosp.Clear(); + btLampkaWylSzybki.Clear( 3 ); + btLampkaNadmWent.Clear( 9 ); + btLampkaNadmSpr.Clear( 8 ); + btLampkaOpory.Clear( 2 ); + btLampkaWysRozr.Clear( + ( mvControlled->TrainType & ( dt_ET22 ) ) ? -1 : 10 ); // ET22 nie ma tej lampki + btLampkaBezoporowa.Clear(); + btLampkaBezoporowaB.Clear(); + btLampkaMaxSila.Clear(); + btLampkaPrzekrMaxSila.Clear(); + btLampkaRadio.Clear(); + btLampkaHamulecReczny.Clear(); + btLampkaBlokadaDrzwi.Clear(); + btLampkaUniversal3.Clear(); + btLampkaWentZaluzje.Clear(); + btLampkaOgrzewanieSkladu.Clear( 11 ); + btLampkaSHP.Clear( 0 ); + btLampkaCzuwaka.Clear( 1 ); + btLampkaDoorLeft.Clear(); + btLampkaDoorRight.Clear(); + btLampkaDepartureSignal.Clear(); + btLampkaRezerwa.Clear(); + btLampkaBoczniki.Clear(); + btLampkaBocznik1.Clear(); + btLampkaBocznik2.Clear(); + btLampkaBocznik3.Clear(); + btLampkaBocznik4.Clear(); + btLampkaRadiotelefon.Clear(); + btLampkaHamienie.Clear(); + btLampkaSprezarka.Clear(); + btLampkaSprezarkaB.Clear(); + btLampkaNapNastHam.Clear(); + btLampkaJazda.Clear(); + btLampkaStycznB.Clear(); + btLampkaHamowanie1zes.Clear(); + btLampkaHamowanie2zes.Clear(); + btLampkaNadmPrzetwB.Clear(); + btLampkaPrzetwB.Clear(); + btLampkaWylSzybkiB.Clear(); + btLampkaForward.Clear(); + btLampkaBackward.Clear(); + btCabLight.Clear(); // hunter-171012 + ggLeftLightButton.Clear(); + ggRightLightButton.Clear(); + ggUpperLightButton.Clear(); + ggLeftEndLightButton.Clear(); + ggRightEndLightButton.Clear(); + ggLightsButton.Clear(); + // hunter-230112 + ggRearLeftLightButton.Clear(); + ggRearRightLightButton.Clear(); + ggRearUpperLightButton.Clear(); + ggRearLeftEndLightButton.Clear(); + ggRearRightEndLightButton.Clear(); + btHaslerBrakes.Clear( 12 ); // ciśnienie w cylindrach do odbijania na haslerze + btHaslerCurrent.Clear( 13 ); // prąd na silnikach do odbijania na haslerze +} + +// initializes a button matching provided label. returns: true if the label was found, false otherwise +// NOTE: this is temporary work-around for compiler else-if limit +// TODO: refactor the cabin controls into some sensible structure +bool +TTrain::initialize_button( cParser &Parser, std::string const &Label, int const Cabindex ) { + + TButton *bt; // roboczy wsaźnik na obiekt animujący lampkę + + // SEKCJA LAMPEK + if( Label == "i-maxft:" ) { + btLampkaMaxSila.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-maxftt:" ) { + btLampkaPrzekrMaxSila.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-radio:" ) { + btLampkaRadio.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-manual_brake:" ) { + btLampkaHamulecReczny.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-door_blocked:" ) { + btLampkaBlokadaDrzwi.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-slippery:" ) { + btLampkaPoslizg.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-contactors:" ) { + btLampkaStyczn.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-conv_ovld:" ) { + btLampkaNadmPrzetw.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-converter:" ) { + btLampkaPrzetw.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-diff_relay:" ) { + btLampkaPrzekRozn.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-diff_relay2:" ) { + btLampkaPrzekRoznPom.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-motor_ovld:" ) { + btLampkaNadmSil.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-train_controll:" ) { + btLampkaUkrotnienie.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-brake_delay_r:" ) { + btLampkaHamPosp.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-mainbreaker:" ) { + btLampkaWylSzybki.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-vent_ovld:" ) { + btLampkaNadmWent.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-comp_ovld:" ) { + btLampkaNadmSpr.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-resistors:" ) { + btLampkaOpory.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-no_resistors:" ) { + btLampkaBezoporowa.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-no_resistors_b:" ) { + btLampkaBezoporowaB.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-highcurrent:" ) { + btLampkaWysRozr.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-universal3:" ) { + btLampkaUniversal3.Load( Parser, DynamicObject->mdKabina, DynamicObject->mdModel ); + LampkaUniversal3_typ = 0; + } + else if( Label == "i-universal3_M:" ) { + btLampkaUniversal3.Load( Parser, DynamicObject->mdKabina, DynamicObject->mdModel ); + LampkaUniversal3_typ = 1; + } + else if( Label == "i-universal3_C:" ) { + btLampkaUniversal3.Load( Parser, DynamicObject->mdKabina, DynamicObject->mdModel ); + LampkaUniversal3_typ = 2; + } + else if( Label == "i-vent_trim:" ) { + btLampkaWentZaluzje.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-trainheating:" ) { + btLampkaOgrzewanieSkladu.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-security_aware:" ) { + btLampkaCzuwaka.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-security_cabsignal:" ) { + btLampkaSHP.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-door_left:" ) { + btLampkaDoorLeft.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-door_right:" ) { + btLampkaDoorRight.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-departure_signal:" ) { + btLampkaDepartureSignal.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-reserve:" ) { + btLampkaRezerwa.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-scnd:" ) { + btLampkaBoczniki.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-scnd1:" ) { + btLampkaBocznik1.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-scnd2:" ) { + btLampkaBocznik2.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-scnd3:" ) { + btLampkaBocznik3.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-scnd4:" ) { + btLampkaBocznik4.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-braking:" ) { + btLampkaHamienie.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-braking-ezt:" ) { + btLampkaHamowanie1zes.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-braking-ezt2:" ) { + btLampkaHamowanie2zes.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-compressor:" ) { + btLampkaSprezarka.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-compressorb:" ) { + btLampkaSprezarkaB.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-voltbrake:" ) { + btLampkaNapNastHam.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-mainbreakerb:" ) { + btLampkaWylSzybkiB.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-resistorsb:" ) { + btLampkaOporyB.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-contactorsb:" ) { + btLampkaStycznB.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-conv_ovldb:" ) { + btLampkaNadmPrzetwB.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-converterb:" ) { + btLampkaPrzetwB.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-forward:" ) { + btLampkaForward.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-backward:" ) { + btLampkaBackward.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-cablight:" ) { // hunter-171012 + btCabLight.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "i-doors:" ) { + int i = Parser.getToken() - 1; + bt = Cabine[ Cabindex ].Button( -1 ); // pierwsza wolna lampka + bt->Load( Parser, DynamicObject->mdKabina ); + bt->AssignBool( bDoors[ 0 ] + 3 * i ); + } + else { + // failed to match the label + return false; + } + + return true; +} + +// initializes a gauge matching provided label. returns: true if the label was found, false otherwise +// NOTE: this is temporary work-around for compiler else-if limit +// TODO: refactor the cabin controls into some sensible structure +bool +TTrain::initialize_gauge( cParser &Parser, std::string const &Label, int const Cabindex ) { + + TGauge *gg; // roboczy wsaźnik na obiekt animujący gałkę + +/* sanity check + if( !DynamicObject->mdKabina ) { + WriteLog( "Cab not initialised!" ); + return false; + } +*/ + // SEKCJA REGULATOROW + if( Label == "mainctrl:" ) { + // nastawnik + ggMainCtrl.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "mainctrlact:" ) { + // zabek pozycji aktualnej + ggMainCtrlAct.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "scndctrl:" ) { + // bocznik + ggScndCtrl.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "dirkey:" ) { + // klucz kierunku + ggDirKey.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "brakectrl:" ) { + // hamulec zasadniczy + ggBrakeCtrl.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "localbrake:" ) { + // hamulec pomocniczy + ggLocalBrake.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "manualbrake:" ) { + // hamulec reczny + ggManualBrake.Load( Parser, DynamicObject->mdKabina ); + } + // sekcja przelacznikow obrotowych + else if( Label == "brakeprofile_sw:" ) { + // przelacznik tow/osob/posp + ggBrakeProfileCtrl.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "brakeprofileg_sw:" ) { + // przelacznik tow/osob + ggBrakeProfileG.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "brakeprofiler_sw:" ) { + // przelacznik osob/posp + ggBrakeProfileR.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "maxcurrent_sw:" ) { + // przelacznik rozruchu + ggMaxCurrentCtrl.Load( Parser, DynamicObject->mdKabina ); + } + // SEKCJA przyciskow sprezynujacych + else if( Label == "main_off_bt:" ) { + // przycisk wylaczajacy (w EU07 wyl szybki czerwony) + ggMainOffButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "main_on_bt:" ) { + // przycisk wlaczajacy (w EU07 wyl szybki zielony) + ggMainOnButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "security_reset_bt:" ) { + // przycisk zbijajacy SHP/czuwak + ggSecurityResetButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "releaser_bt:" ) { + // przycisk odluzniacza + ggReleaserButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "sand_bt:" ) { + // przycisk piasecznicy + ggSandButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "antislip_bt:" ) { + // przycisk antyposlizgowy + ggAntiSlipButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "horn_bt:" ) { + // dzwignia syreny + ggHornButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "fuse_bt:" ) { + // bezp. nadmiarowy + ggFuseButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "converterfuse_bt:" ) { + // hunter-261211: + // odblokowanie przekaznika nadm. przetw. i ogrz. + ggConverterFuseButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "stlinoff_bt:" ) { + // st. liniowe + ggStLinOffButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "door_left_sw:" ) { + // drzwi lewe + ggDoorLeftButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "door_right_sw:" ) { + // drzwi prawe + ggDoorRightButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "departure_signal_bt:" ) { + // sygnal odjazdu + ggDepartureSignalButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "upperlight_sw:" ) { + // swiatlo + ggUpperLightButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "leftlight_sw:" ) { + // swiatlo + ggLeftLightButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "rightlight_sw:" ) { + // swiatlo + ggRightLightButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "leftend_sw:" ) { + // swiatlo + ggLeftEndLightButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "rightend_sw:" ) { + // swiatlo + ggRightEndLightButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "lights_sw:" ) { + // swiatla wszystkie + ggLightsButton.Load( Parser, DynamicObject->mdKabina ); + } + //--------------------- + // hunter-230112: przelaczniki swiatel tylnich + else if( Label == "rearupperlight_sw:" ) { + // swiatlo + ggRearUpperLightButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "rearleftlight_sw:" ) { + // swiatlo + ggRearLeftLightButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "rearrightlight_sw:" ) { + // swiatlo + ggRearRightLightButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "rearleftend_sw:" ) { + // swiatlo + ggRearLeftEndLightButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "rearrightend_sw:" ) { + // swiatlo + ggRearRightEndLightButton.Load( Parser, DynamicObject->mdKabina ); + } + //------------------ + else if( Label == "compressor_sw:" ) { + // sprezarka + ggCompressorButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "converter_sw:" ) { + // przetwornica + ggConverterButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "converteroff_sw:" ) { + // przetwornica wyl + ggConverterOffButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "main_sw:" ) { + // wyl szybki (ezt) + ggMainButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "radio_sw:" ) { + // radio + ggRadioButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "pantfront_sw:" ) { + // patyk przedni + ggPantFrontButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "pantrear_sw:" ) { + // patyk tylny + ggPantRearButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "pantfrontoff_sw:" ) { + // patyk przedni w dol + ggPantFrontButtonOff.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "pantalloff_sw:" ) { + // patyk przedni w dol + ggPantAllDownButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "trainheating_sw:" ) { + // grzanie skladu + ggTrainHeatingButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "signalling_sw:" ) { + // Sygnalizacja hamowania + ggSignallingButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "door_signalling_sw:" ) { + // Sygnalizacja blokady drzwi + ggDoorSignallingButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "nextcurrent_sw:" ) { + // prąd drugiego członu + ggNextCurrentButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "cablight_sw:" ) { + // hunter-091012: swiatlo w kabinie + ggCabLightButton.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "cablightdim_sw:" ) { + // hunter-091012: przyciemnienie swiatla w kabinie + ggCabLightDimButton.Load( Parser, DynamicObject->mdKabina ); + } + // ABu 090305: uniwersalne przyciski lub inne rzeczy + else if( Label == "universal1:" ) { + ggUniversal1Button.Load( Parser, DynamicObject->mdKabina, DynamicObject->mdModel ); + } + else if( Label == "universal2:" ) { + ggUniversal2Button.Load( Parser, DynamicObject->mdKabina, DynamicObject->mdModel ); + } + else if( Label == "universal3:" ) { + ggUniversal3Button.Load( Parser, DynamicObject->mdKabina, DynamicObject->mdModel ); + } + else if( Label == "universal4:" ) { + ggUniversal4Button.Load( Parser, DynamicObject->mdKabina, DynamicObject->mdModel ); + } + // SEKCJA WSKAZNIKOW + else if( ( Label == "tachometer:" ) + || ( Label == "tachometerb:" ) ) { + // predkosciomierz wskazówkowy z szarpaniem + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( &fTachoVelocityJump ); + } + else if( Label == "tachometern:" ) { + // predkosciomierz wskazówkowy bez szarpania + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( &fTachoVelocity ); + } + else if( Label == "tachometerd:" ) { + // predkosciomierz cyfrowy + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( &fTachoVelocity ); + } + else if( ( Label == "hvcurrent1:" ) + || ( Label == "hvcurrent1b:" ) ) { + // 1szy amperomierz + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( fHCurrent + 1 ); + } + else if( ( Label == "hvcurrent2:" ) + || ( Label == "hvcurrent2b:" ) ) { + // 2gi amperomierz + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( fHCurrent + 2 ); + } + else if( ( Label == "hvcurrent3:" ) + || ( Label == "hvcurrent3b:" ) ) { + // 3ci amperomierz + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( fHCurrent + 3 ); + } + else if( ( Label == "hvcurrent:" ) + || ( Label == "hvcurrentb:" ) ) { + // amperomierz calkowitego pradu + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( fHCurrent ); + } + else if( Label == "eimscreen:" ) { + // amperomierz calkowitego pradu + int i, j; + Parser.getTokens( 2, false ); + Parser + >> i + >> j; + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( &fEIMParams[ i ][ j ] ); + } + else if( Label == "brakes:" ) { + // amperomierz calkowitego pradu + int i, j; + Parser.getTokens( 2, false ); + Parser + >> i + >> j; + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( &fPress[ i - 1 ][ j ] ); + } + else if( ( Label == "brakepress:" ) + || ( Label == "brakepressb:" ) ) { + // 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 ); + } + else if( ( Label == "pipepress:" ) + || ( Label == "pipepressb:" ) ) { + // manometr przewodu hamulcowego + TGauge *gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina, NULL, 0.1 ); + gg->AssignDouble( &mvOccupied->PipePress ); + } + else if( Label == "limpipepress:" ) { + // manometr zbiornika sterujacego zaworu maszynisty + ggZbS.Load( Parser, DynamicObject->mdKabina, NULL, 0.1 ); + } + else if( Label == "cntrlpress:" ) { + // manometr zbiornika kontrolnego/rorządu + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina, NULL, 0.1 ); + gg->AssignDouble( &mvControlled->PantPress ); + } + else if( ( Label == "compressor:" ) + || ( Label == "compressorb:" ) ) { + // 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 ); + } + // yB - dla drugiej sekcji + else if( Label == "hvbcurrent1:" ) { + // 1szy amperomierz + ggI1B.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "hvbcurrent2:" ) { + // 2gi amperomierz + ggI2B.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "hvbcurrent3:" ) { + // 3ci amperomierz + ggI3B.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "hvbcurrent:" ) { + // amperomierz calkowitego pradu + ggItotalB.Load( Parser, DynamicObject->mdKabina ); + } + //************************************************************* + else if( Label == "clock:" ) { + // zegar analogowy + if( Parser.getToken() == "analog" ) { + // McZapkie-300302: zegarek + ggClockSInd.Init( DynamicObject->mdKabina->GetFromName( "ClockShand" ), gt_Rotate, 0.016666667, 0, 0 ); + ggClockMInd.Init( DynamicObject->mdKabina->GetFromName( "ClockMhand" ), gt_Rotate, 0.016666667, 0, 0 ); + ggClockHInd.Init( DynamicObject->mdKabina->GetFromName( "ClockHhand" ), gt_Rotate, 0.083333333, 0, 0 ); + } + } + else if( Label == "evoltage:" ) { + // woltomierz napiecia silnikow + ggEngineVoltage.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "hvoltage:" ) { + // woltomierz wysokiego napiecia + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( &fHVoltage ); + } + else if( Label == "lvoltage:" ) { + // woltomierz niskiego napiecia + ggLVoltage.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "enrot1m:" ) { + // obrotomierz + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( fEngine + 1 ); + } // ggEnrot1m.Load(Parser,DynamicObject->mdKabina); + else if( Label == "enrot2m:" ) { + // obrotomierz + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( fEngine + 2 ); + } // ggEnrot2m.Load(Parser,DynamicObject->mdKabina); + else if( Label == "enrot3m:" ) { // obrotomierz + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignFloat( fEngine + 3 ); + } // ggEnrot3m.Load(Parser,DynamicObject->mdKabina); + else if( Label == "engageratio:" ) { + // np. ciśnienie sterownika sprzęgła + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignDouble( &mvControlled->dizel_engage ); + } // ggEngageRatio.Load(Parser,DynamicObject->mdKabina); + else if( Label == "maingearstatus:" ) { + // np. ciśnienie sterownika skrzyni biegów + ggMainGearStatus.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "ignitionkey:" ) { + ggIgnitionKey.Load( Parser, DynamicObject->mdKabina ); + } + else if( Label == "distcounter:" ) { + // Ra 2014-07: licznik kilometrów + gg = Cabine[ Cabindex ].Gauge( -1 ); // pierwsza wolna gałka + gg->Load( Parser, DynamicObject->mdKabina ); + gg->AssignDouble( &mvControlled->DistCounter ); + } + else { + // failed to match the label + return false; + } + + return true; +} diff --git a/Train.h b/Train.h index af79bead..8a482618 100644 --- a/Train.h +++ b/Train.h @@ -10,8 +10,8 @@ http://mozilla.org/MPL/2.0/. #ifndef TrainH #define TrainH -#include "Track.h" -#include "TrkFoll.h" +//#include "Track.h" +//#include "TrkFoll.h" #include "Model3d.h" #include "Spring.h" #include "Gauge.h" @@ -47,7 +47,7 @@ class TCab ~TCab(); void Init(double Initx1, double Inity1, double Initz1, double Initx2, double Inity2, double Initz2, bool InitEnabled, bool InitOccupied); - void Load(TQueryParserComp *Parser); + void Load(cParser &Parser); vector3 CabPos1; vector3 CabPos2; bool bEnabled; @@ -74,7 +74,7 @@ class TTrain bool CabChange(int iDirection); bool ActiveUniversal4; bool ShowNextCurrent; // pokaz przd w podlaczonej lokomotywie (ET41) - bool InitializeCab(int NewCabNo, std::string asFileName); + bool InitializeCab(int NewCabNo, std::string const &asFileName); TTrain(); ~TTrain(); // bool Init(TTrack *Track); @@ -99,9 +99,20 @@ class TTrain void SetLights(); // virtual bool RenderAlpha(); // McZapkie-310302: ladowanie parametrow z pliku - bool LoadMMediaFile(std::string asFileName); + bool LoadMMediaFile(std::string const &asFileName); PyObject *GetTrainState(); +private: + // clears state of all cabin controls + void + clear_cab_controls(); + // initializes a gauge matching provided label. returns: true if the label was found, false otherwise + bool + initialize_gauge( cParser &Parser, std::string const &Label, int const Cabindex ); + // initializes a button matching provided label. returns: true if the label was found, false otherwise + bool + initialize_button( cParser &Parser, std::string const &Label, int const Cabindex ); + private: //żeby go nic z zewnątrz nie przestawiało TDynamicObject *DynamicObject; // przestawia zmiana pojazdu [F5] private: //żeby go nic z zewnątrz nie przestawiało @@ -388,7 +399,7 @@ class TTrain int iUnits[20]; // numer jednostki int iDoorNo[20]; // liczba drzwi char cCode[20]; //kod pojazdu - string asCarName[20]; //nazwa czlonu + std::string asCarName[20]; //nazwa czlonu bool bMains[8]; //WSy float fCntVol[8]; //napiecie NN bool bPants[8][2]; //podniesienie pantografow diff --git a/TrkFoll.cpp b/TrkFoll.cpp index 2af9e161..682577e9 100644 --- a/TrkFoll.cpp +++ b/TrkFoll.cpp @@ -13,20 +13,13 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" - -#include "opengl/glew.h" -#include "opengl/glut.h" - -#pragma hdrstop - +#include "stdafx.h" #include "TrkFoll.h" #include "Globals.h" -#include "DynObj.h" -#include "Ground.h" -#include "Event.h" +#include "Logs.h" #include "Driver.h" +#include "DynObj.h" +#include "Event.h" TTrackFollower::TTrackFollower() { diff --git a/VBO.cpp b/VBO.cpp index cf69d660..7c443b50 100644 --- a/VBO.cpp +++ b/VBO.cpp @@ -7,19 +7,15 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include -#pragma hdrstop - +#include "stdafx.h" #include "VBO.h" #include "opengl/glew.h" #include "usefull.h" //--------------------------------------------------------------------------- -#pragma package(smart_init) - CMesh::CMesh() { // utworzenie pustego obiektu - m_pVNT = NULL; + m_pVNT = nullptr; m_nVertexCount = -1; m_nVBOVertices = 0; // nie zarezerwowane }; @@ -71,9 +67,9 @@ bool CMesh::StartVBO() if (m_nVBOVertices) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices); - glVertexPointer(3, GL_FLOAT, sizeof(CVertNormTex), ((char *)NULL)); // pozycje - glNormalPointer(GL_FLOAT, sizeof(CVertNormTex), ((char *)NULL) + 12); // normalne - glTexCoordPointer(2, GL_FLOAT, sizeof(CVertNormTex), ((char *)NULL) + 24); // wierzchołki + glVertexPointer( 3, GL_FLOAT, sizeof(CVertNormTex), static_cast(nullptr) ); // pozycje + glNormalPointer( GL_FLOAT, sizeof( CVertNormTex ), static_cast( nullptr ) + 12 ); // normalne + glTexCoordPointer( 2, GL_FLOAT, sizeof( CVertNormTex ), static_cast( nullptr ) + 24 ); // wierzchołki } return true; // można rysować z VBO }; @@ -87,9 +83,9 @@ bool CMesh::StartColorVBO() if (m_nVBOVertices) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices); - glVertexPointer(3, GL_FLOAT, sizeof(CVertNormTex), ((char *)NULL)); // pozycje + glVertexPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast( nullptr ) ); // pozycje // glColorPointer(3,GL_UNSIGNED_BYTE,sizeof(CVertNormTex),((char*)NULL)+12); //kolory - glColorPointer(3, GL_FLOAT, sizeof(CVertNormTex), ((char *)NULL) + 12); // kolory + glColorPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast( nullptr ) + 12 ); // kolory } return true; // można rysować z VBO }; diff --git a/World.cpp b/World.cpp index 56ff9cdf..ed676e23 100644 --- a/World.cpp +++ b/World.cpp @@ -12,26 +12,25 @@ http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" +#include "stdafx.h" +#include "World.h" #include "opengl/glew.h" #include "opengl/glut.h" -#pragma hdrstop +#include "Globals.h" +#include "Logs.h" +#include "MdlMngr.h" +#include "Texture.h" #include "Timer.h" #include "mtable.h" #include "Sound.h" -#include "World.h" -#include "Logs.h" -#include "Globals.h" #include "Camera.h" #include "ResourceManager.h" #include "Event.h" #include "Train.h" #include "Driver.h" #include "Console.h" -#include #define TEXTURE_FILTER_CONTROL_EXT 0x8500 #define TEXTURE_LOD_BIAS_EXT 0x8501 @@ -44,8 +43,6 @@ HINSTANCE hinstGLUT32 = NULL; // wska // GLUTAPI void APIENTRY glutBitmapCharacterDLL(void *font, int character); TDynamicObject *Controlled = NULL; // pojazd, który prowadzimy -using namespace Timer; - const double fTimeMax = 1.00; //[s] maksymalny czas aktualizacji w jednek klatce TWorld::TWorld() @@ -170,16 +167,16 @@ BOOL GetDisplayMonitorInfo(int nDeviceIndex, LPSTR lpszMonitorInfo) bool TWorld::Init(HWND NhWnd, HDC hDC) { - double time = (double)Now(); + auto timestart = std::chrono::system_clock::now(); Global::hWnd = NhWnd; // do WM_COPYDATA Global::pCamera = &Camera; // Ra: wskaźnik potrzebny do likwidacji drgań Global::detonatoryOK = true; WriteLog("Starting MaSzyna rail vehicle simulator."); WriteLog(Global::asVersion); -#if sizeof(TSubModel) != 256 - Error("Wrong sizeof(TSubModel) is " + AnsiString(sizeof(TSubModel))); - return false; -#endif + if( sizeof( TSubModel ) != 256 ) { + Error( "Wrong sizeof(TSubModel) is " + std::to_string(sizeof( TSubModel )) ); + return false; + } WriteLog("Online documentation and additional files on http://eu07.pl"); WriteLog("Authors: Marcin_EU, McZapkie, ABu, Winger, Tolaris, nbmx, OLO_EU, Bart, Quark-t, " "ShaXbee, Oli_EU, youBy, KURS90, Ra, hunter, szociu, Stele, Q, firleju and others"); @@ -188,7 +185,7 @@ bool TWorld::Init(HWND NhWnd, HDC hDC) WriteLog("Vendor:"); // Winger030405: sprawdzanie sterownikow WriteLog((char *)glGetString(GL_VENDOR)); - AnsiString glver = ((char *)glGetString(GL_VERSION)); + std::string glver = ((char *)glGetString(GL_VERSION)); WriteLog("OpenGL Version:"); WriteLog(glver); if ((glver == "1.5.1") || (glver == "1.5.2")) @@ -201,12 +198,13 @@ bool TWorld::Init(HWND NhWnd, HDC hDC) else Global::detonatoryOK = true; // Ra: umieszczone w EU07.cpp jakoś nie chce działać - while (glver.LastDelimiter(".") > glver.Pos(".")) - glver = glver.SubString(1, glver.LastDelimiter(".") - 1); // obcięcie od drugiej kropki + while( glver.rfind( '.' ) > glver.find( '.' ) ) { + glver = glver.substr( 0, glver.rfind( '.' ) - 1 ); // obcięcie od drugiej kropki + } double ogl; try { - ogl = glver.ToDouble(); + ogl = std::stod( glver ); } catch (...) { @@ -224,10 +222,9 @@ bool TWorld::Init(HWND NhWnd, HDC hDC) WriteLog("Supported extensions:"); WriteLog((char *)glGetString(GL_EXTENSIONS)); - if (glewGetExtension("GL_ARB_vertex_buffer_object")) // czy jest VBO w karcie graficznej + if (GL_ARB_vertex_buffer_object) // czy jest VBO w karcie graficznej { - if (AnsiString((char *)glGetString(GL_VENDOR)) - .Pos("Intel")) // wymuszenie tylko dla kart Intel + if( std::string( (char *)glGetString(GL_VENDOR) ).find("Intel") != std::string::npos ) // wymuszenie tylko dla kart Intel { // karty Intel nie nadają się do grafiki 3D, ale robimy wyjątek, bo to w końcu symulator Global::iMultisampling = 0; // to robi problemy na "Intel(R) HD Graphics Family" - czarny ekran @@ -251,20 +248,20 @@ bool TWorld::Init(HWND NhWnd, HDC hDC) else { Global::bDecompressDDS = - !glewGetExtension("GL_EXT_texture_compression_s3tc"); // czy obsługiwane? + !(GL_EXT_texture_compression_s3tc); // czy obsługiwane? if (Global::bDecompressDDS) // czy jest obsługa DDS w karcie graficznej WriteLog("DDS textures are not supported."); else // brak obsługi DDS - trzeba włączyć programową dekompresję WriteLog("DDS textures are supported."); } if (Global::iMultisampling) - WriteLog("Used multisampling of " + AnsiString(Global::iMultisampling) + " samples."); + WriteLog("Used multisampling of " + std::to_string(Global::iMultisampling) + " samples."); { // ograniczenie maksymalnego rozmiaru tekstur - parametr dla skalowania tekstur GLint i; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &i); if (i < Global::iMaxTextureSize) Global::iMaxTextureSize = i; - WriteLog("Max texture size: " + AnsiString(Global::iMaxTextureSize)); + WriteLog("Max texture size: " + std::to_string(Global::iMaxTextureSize)); } /*-----------------------Render Initialization----------------------*/ if (Global::fOpenGL >= 1.2) // poniższe nie działa w 1.1 @@ -566,7 +563,7 @@ bool TWorld::Init(HWND NhWnd, HDC hDC) } SwapBuffers(hDC); // Swap Buffers (Double Buffering) - Ground.Init(Global::szSceneryFile, hDC); + Ground.Init(Global::SceneryFile, hDC); // Global::tSinceStart= 0; Clouds.Init(); WriteLog("Ground init OK"); @@ -670,9 +667,8 @@ bool TWorld::Init(HWND NhWnd, HDC hDC) else light = TTexturesManager::GetTextureID(szTexturePath, szSceneryPath, "smuga2.tga"); // Camera.Reset(); - ResetTimers(); - WriteLog("Load time: " + FloatToStrF((86400.0 * ((double)Now() - time)), ffFixed, 7, 1) + - " seconds"); + Timer::ResetTimers(); + WriteLog( "Load time: " + std::to_string( ( std::chrono::system_clock::now() - timestart ).count() ) + " seconds"); if (DebugModeFlag) // w Debugmode automatyczne włączenie AI if (Train) if (Train->Dynamic()->Mechanik) @@ -689,7 +685,7 @@ void TWorld::OnKeyDown(int cKey) // przekodowania if (!Global::iPause) { // podczas pauzy klawisze nie działają - AnsiString info = "Key pressed: ["; + std::string info = "Key pressed: ["; if (Console::Pressed(VK_SHIFT)) info += "Shift]+["; if (Console::Pressed(VK_CONTROL)) @@ -697,19 +693,19 @@ void TWorld::OnKeyDown(int cKey) if (cKey > 192) // coś tam jeszcze ciekawego jest? { if (cKey < 255) // 255 to [Fn] w laptopach - WriteLog(info + AnsiString(char(cKey - 128)) + "]"); + WriteLog(info + (char)(cKey - 128) + "]"); } else if (cKey >= 186) - WriteLog(info + AnsiString(";=,-./~").SubString(cKey - 185, 1) + "]"); + WriteLog(info + std::string(";=,-./~").substr(cKey - 186, 1) + "]"); else if (cKey > 123) // coś tam jeszcze ciekawego jest? - WriteLog(info + AnsiString(cKey) + "]"); // numer klawisza + WriteLog(info + std::to_string(cKey) + "]"); // numer klawisza else if (cKey >= 112) // funkcyjne - WriteLog(info + "F" + AnsiString(cKey - 111) + "]"); + WriteLog(info + "F" + std::to_string(cKey - 111) + "]"); else if (cKey >= 96) - WriteLog(info + "Num" + AnsiString("0123456789*+?-./").SubString(cKey - 95, 1) + "]"); + WriteLog(info + "Num" + std::string("0123456789*+?-./").substr(cKey - 96, 1) + "]"); else if (((cKey >= '0') && (cKey <= '9')) || ((cKey >= 'A') && (cKey <= 'Z')) || (cKey == ' ')) - WriteLog(info + AnsiString(char(cKey)) + "]"); + WriteLog(info + (char)(cKey) + "]"); else if (cKey == '-') WriteLog(info + "Insert]"); else if (cKey == '.') @@ -719,7 +715,7 @@ void TWorld::OnKeyDown(int cKey) else if (cKey == '#') WriteLog(info + "End]"); else if (cKey > 'Z') //żeby nie logować kursorów - WriteLog(info + AnsiString(cKey) + "]"); // numer klawisza + WriteLog(info + std::to_string(cKey) + "]"); // numer klawisza } if ((cKey <= '9') ? (cKey >= '0') : false) // klawisze cyfrowe { @@ -744,15 +740,15 @@ void TWorld::OnKeyDown(int cKey) Global::pFreeCameraInitAngle[i].z = Camera.Roll; // logowanie, żeby można było do scenerii przepisać WriteLog( - "camera " + FloatToStrF(Global::pFreeCameraInit[i].x, ffFixed, 7, 3) + " " + - FloatToStrF(Global::pFreeCameraInit[i].y, ffFixed, 7, 3) + " " + - FloatToStrF(Global::pFreeCameraInit[i].z, ffFixed, 7, 3) + " " + - FloatToStrF(RadToDeg(Global::pFreeCameraInitAngle[i].x), ffFixed, 7, 3) + + "camera " + std::to_string( Global::pFreeCameraInit[i].x ) + " " + + std::to_string(Global::pFreeCameraInit[i].y ) + " " + + std::to_string(Global::pFreeCameraInit[i].z ) + " " + + std::to_string(RadToDeg(Global::pFreeCameraInitAngle[i].x)) + " " + - FloatToStrF(RadToDeg(Global::pFreeCameraInitAngle[i].y), ffFixed, 7, 3) + + std::to_string(RadToDeg(Global::pFreeCameraInitAngle[i].y)) + " " + - FloatToStrF(RadToDeg(Global::pFreeCameraInitAngle[i].z), ffFixed, 7, 3) + - " " + AnsiString(i) + " endcamera"); + std::to_string(RadToDeg(Global::pFreeCameraInitAngle[i].z)) + + " " + std::to_string(i) + " endcamera"); } else // również przeskakiwanie { // Ra: to z tą kamerą (Camera.Pos i Global::pCameraPosition) jest trochę bez sensu @@ -1106,29 +1102,29 @@ bool TWorld::Update() --iCheckFPS; else { // jak doszło do zera, to sprawdzamy wydajność - if (GetFPS() < Global::fFpsMin) + if (Timer::GetFPS() < Global::fFpsMin) { Global::iSegmentsRendered -= - random(10); // floor(0.5+Global::iSegmentsRendered/Global::fRadiusFactor); + Random(10); // floor(0.5+Global::iSegmentsRendered/Global::fRadiusFactor); if (Global::iSegmentsRendered < 10) // jeśli jest co zmniejszać Global::iSegmentsRendered = 10; // 10=minimalny promień to 600m } - else if (GetFPS() > Global::fFpsMax) // jeśli jest dużo FPS + else if (Timer::GetFPS() > Global::fFpsMax) // jeśli jest dużo FPS if (Global::iSegmentsRendered < Global::iFpsRadiusMax) // jeśli jest co zwiększać { Global::iSegmentsRendered += - random(5); // floor(0.5+Global::iSegmentsRendered*Global::fRadiusFactor); + Random(5); // floor(0.5+Global::iSegmentsRendered*Global::fRadiusFactor); if (Global::iSegmentsRendered > Global::iFpsRadiusMax) // 5.6km (22*22*M_PI) Global::iSegmentsRendered = Global::iFpsRadiusMax; } - if ((GetFPS() < 12) && (Global::iSlowMotion < 7)) + if ((Timer::GetFPS() < 12) && (Global::iSlowMotion < 7)) { Global::iSlowMotion = (Global::iSlowMotion << 1) + 1; // zapalenie kolejnego bitu if (Global::iSlowMotionMask & 1) if (Global::iMultisampling) // a multisampling jest włączony glDisable(GL_MULTISAMPLE); // wyłączenie multisamplingu powinno poprawić FPS } - else if ((GetFPS() > 20) && Global::iSlowMotion) + else if ((Timer::GetFPS() > 20) && Global::iSlowMotion) { // FPS się zwiększył, można włączyć bajery Global::iSlowMotion = (Global::iSlowMotion >> 1); // zgaszenie bitu if (Global::iSlowMotion == 0) // jeśli jest pełna prędkość @@ -1151,12 +1147,12 @@ bool TWorld::Update() WriteLog("Phisics step switched to 0.01s!"); } */ - iCheckFPS = 0.25 * GetFPS(); // tak za 0.25 sekundy sprawdzić ponownie (jeszcze przycina?) + iCheckFPS = 0.25 * Timer::GetFPS(); // tak za 0.25 sekundy sprawdzić ponownie (jeszcze przycina?) } - UpdateTimers(Global::iPause); + Timer::UpdateTimers(Global::iPause); if (!Global::iPause) { // jak pauza, to nie ma po co tego przeliczać - GlobalTime->UpdateMTableTime(GetDeltaTime()); // McZapkie-300302: czas rozkladowy + GlobalTime->UpdateMTableTime(Timer::GetDeltaTime()); // McZapkie-300302: czas rozkladowy // Ra 2014-07: przeliczenie kąta czasu (do animacji zależnych od czasu) Global::fTimeAngleDeg = GlobalTime->hh * 15.0 + GlobalTime->mm * 0.25 + GlobalTime->mr / 240.0; @@ -1300,18 +1296,18 @@ bool TWorld::Update() FollowView(false); // bez wyciszania dźwięków else if (Global::iTextMode == -1) { // tu mozna dodac dopisywanie do logu przebiegu lokomotywy - WriteLog("Number of textures used: " + AnsiString(Global::iTextures)); + WriteLog("Number of textures used: " + std::to_string(Global::iTextures)); return false; } Camera.Update(); // uwzględnienie ruchu wywołanego klawiszami } // koniec bloku pomijanego przy nieaktywnym oknie // poprzednie jakoś tam działało - double dt = GetDeltaRenderTime(); // nie uwzględnia pauzowania ani mnożenia czasu + double dt = Timer::GetDeltaRenderTime(); // nie uwzględnia pauzowania ani mnożenia czasu fTime50Hz += dt; // w pauzie też trzeba zliczać czas, bo przy dużym FPS będzie problem z odczytem ramek if (fTime50Hz >= 0.2) Console::Update(); // to i tak trzeba wywoływać - dt = GetDeltaTime(); // 0.0 gdy pauza + dt = Timer::GetDeltaTime(); // 0.0 gdy pauza fTimeBuffer += dt; //[s] dodanie czasu od poprzedniej ramki if (fTimeBuffer >= fMaxDt) // jest co najmniej jeden krok; normalnie 0.01s { // Ra: czas dla fizyki jest skwantowany - fizykę lepiej przeliczać stałym krokiem @@ -1369,7 +1365,7 @@ bool TWorld::Update() Ground.Update(dt, n); Ground.Update(dt, n); // 5 razy } - dt = GetDeltaTime(); // czas niekwantowany + dt = Timer::GetDeltaTime(); // czas niekwantowany if (Camera.Type == tp_Follow) { if (Train) @@ -1715,10 +1711,10 @@ bool TWorld::Update() if (DebugModeFlag && !Global::iTextMode) { OutText1 = " FPS: "; - OutText1 += to_string(GetFPS(), 2); + OutText1 += to_string(Timer::GetFPS(), 2); OutText1 += Global::iSlowMotion ? "s" : "n"; - OutText1 += (GetDeltaTime() >= 0.2) ? "!" : " "; + OutText1 += (Timer::GetDeltaTime() >= 0.2) ? "!" : " "; // if (GetDeltaTime()>=0.2) //Ra: to za bardzo miota tekstem! // { // OutText1+= " Slowing Down !!! "; @@ -1733,7 +1729,7 @@ bool TWorld::Update() { Global::iViewMode = VK_F8; OutText1 = " FPS: "; - OutText1 += to_string(GetFPS(), 2); + OutText1 += to_string(Timer::GetFPS(), 2); //OutText1 += sprintf(); if (Global::iSlowMotion) OutText1 += " (slowmotion " + to_string(Global::iSlowMotion) + ")"; @@ -1868,7 +1864,7 @@ bool TWorld::Update() if (Controlled) SetWindowText(hWnd, Controlled->MoverParameters->Name.c_str()); else - SetWindowText(hWnd, Global::szSceneryFile); // nazwa scenerii + SetWindowText(hWnd, Global::SceneryFile.c_str()); // nazwa scenerii glBindTexture(GL_TEXTURE_2D, 0); glColor4f(1.0f, 0.0f, 0.0f, 1.0f); glLoadIdentity(); @@ -1908,9 +1904,9 @@ bool TWorld::Update() } else if (Global::iTextMode == VK_F12) { // opcje włączenia i wyłączenia logowania - OutText1 = "[0] Debugmode " + string(DebugModeFlag ? "(on)" : "(off)"); - OutText2 = "[1] log.txt " + string((Global::iWriteLogEnabled & 1) ? "(on)" : "(off)"); - OutText3 = "[2] Console " + string((Global::iWriteLogEnabled & 2) ? "(on)" : "(off)"); + OutText1 = "[0] Debugmode " + std::string(DebugModeFlag ? "(on)" : "(off)"); + OutText2 = "[1] log.txt " + std::string((Global::iWriteLogEnabled & 1) ? "(on)" : "(off)"); + OutText3 = "[2] Console " + std::string((Global::iWriteLogEnabled & 2) ? "(on)" : "(off)"); } else if (Global::iTextMode == VK_F2) { // ABu: info dla najblizszego pojazdu! @@ -2109,12 +2105,12 @@ bool TWorld::Update() "C0=" + (tmp->PrevConnected ? tmp->PrevConnected->GetName() + ":" + to_string(tmp->MoverParameters->Couplers[0].CouplingFlag) : - string("NULL")); + std::string("NULL")); OutText4 += " C1=" + (tmp->NextConnected ? tmp->NextConnected->GetName() + ":" + to_string(tmp->MoverParameters->Couplers[1].CouplingFlag) : - string("NULL")); + std::string("NULL")); if (Console::Pressed(VK_F2)) { WriteLog(OutText1); @@ -2185,7 +2181,7 @@ bool TWorld::Update() to_string(180.0 - RadToDeg(Camera.Yaw), 0); // ma być azymut, czyli 0 na północy i rośnie na wschód OutText1 += " " + - string("S SEE NEN NWW SW") + std::string("S SEE NEN NWW SW") .substr(1 + 2 * floor(fmod(8 + (Camera.Yaw + 0.5 * M_PI_4) / M_PI_4, 8)), 2); } // OutText3= AnsiString(" Online documentation (PL, ENG, DE, soon CZ): @@ -2472,7 +2468,7 @@ bool TWorld::Update() { // informacja o wersji, sposobie wyświetlania i błędach OpenGL // Global::iViewMode=VK_F9; OutText1 = Global::asVersion; // informacja o wersji - OutText2 = string("Rendering mode: ") + (Global::bUseVBO ? "VBO" : "Display Lists"); + OutText2 = std::string("Rendering mode: ") + (Global::bUseVBO ? "VBO" : "Display Lists"); if (Global::iMultiplayer) OutText2 += ". Multiplayer is active"; OutText2 += "."; @@ -2515,11 +2511,11 @@ bool TWorld::Update() OutText2 = (t->Ah >= 0) ? to_string(int(100 + t->Ah)).substr(1, 2) + ":" + to_string(int(100 + t->Am)).substr(1, 2) : - string(" "); + std::string(" "); OutText3 = (t->Dh >= 0) ? to_string(int(100 + t->Dh)).substr(1, 2) + ":" + to_string(int(100 + t->Dm)).substr(1, 2) : - string(" "); + std::string(" "); OutText4 = " " + to_string(t->vmax, 0); OutText4 = OutText4.substr(OutText4.length() - 3, 3); // z wyrównaniem do prawej @@ -2789,20 +2785,20 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz) switch (pRozkaz->iComm) { case 0: // odesłanie identyfikatora wersji - CommLog(AnsiString(Now()) + " " + IntToStr(pRozkaz->iComm) + " version" + " rcvd"); + CommLog( Now() + " " + std::to_string(pRozkaz->iComm) + " version" + " rcvd"); Ground.WyslijString(Global::asVersion, 0); // przedsatwienie się break; case 1: // odesłanie identyfikatora wersji - CommLog(AnsiString(Now()) + " " + IntToStr(pRozkaz->iComm) + " scenery" + " rcvd"); - Ground.WyslijString(Global::szSceneryFile, 1); // nazwa scenerii + CommLog( Now() + " " + std::to_string(pRozkaz->iComm) + " scenery" + " rcvd"); + Ground.WyslijString(Global::SceneryFile, 1); // nazwa scenerii break; case 2: // event - CommLog(AnsiString(Now()) + " " + IntToStr(pRozkaz->iComm) + " " + - AnsiString(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])) + " rcvd"); + CommLog( Now() + " " + std::to_string(pRozkaz->iComm) + " " + + std::string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])) + " rcvd"); if (Global::iMultiplayer) { // WriteLog("Komunikat: "+AnsiString(pRozkaz->Name1)); TEvent *e = Ground.FindEvent( - string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0]))); + std::string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0]))); if (e) if ((e->Type == tp_Multiple) || (e->Type == tp_Lights) || bool(e->evJoined)) // tylko jawne albo niejawne Multiple @@ -2817,27 +2813,27 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz) int(pRozkaz->cString[8]); // długość pierwszego łańcucha (z przodu dwa floaty) CommLog( to_string(BorlandTime()) + " " + to_string(pRozkaz->iComm) + " " + - string(pRozkaz->cString + 11 + i, (unsigned)(pRozkaz->cString[10 + i])) + + std::string(pRozkaz->cString + 11 + i, (unsigned)(pRozkaz->cString[10 + i])) + " rcvd"); TGroundNode *t = Ground.DynamicFind( - string(pRozkaz->cString + 11 + i, + std::string(pRozkaz->cString + 11 + i, (unsigned)pRozkaz->cString[10 + i])); // nazwa pojazdu jest druga if (t) if (t->DynamicObject->Mechanik) { - t->DynamicObject->Mechanik->PutCommand(string(pRozkaz->cString + 9, i), + t->DynamicObject->Mechanik->PutCommand(std::string(pRozkaz->cString + 9, i), pRozkaz->fPar[0], pRozkaz->fPar[1], NULL, stopExt); // floaty są z przodu - WriteLog("AI command: " + string(pRozkaz->cString + 9, i)); + WriteLog("AI command: " + std::string(pRozkaz->cString + 9, i)); } } break; case 4: // badanie zajętości toru { CommLog(to_string(BorlandTime()) + " " + to_string(pRozkaz->iComm) + " " + - string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])) + " rcvd"); + std::string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])) + " rcvd"); TGroundNode *t = Ground.FindGroundNode( - string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])), TP_TRACK); + std::string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])), TP_TRACK); if (t) if (t->pTrack->IsEmpty()) Ground.WyslijWolny(t->asName); @@ -2871,7 +2867,7 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz) if (Global::iMultiplayer) { // Ra 2014-12: to ma działać również dla pojazdów bez obsady CommLog(to_string(BorlandTime()) + " " + to_string(pRozkaz->iComm) + " " + - string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])) + + std::string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])) + " rcvd"); if (pRozkaz->cString[0]) // jeśli długość nazwy jest niezerowa { // szukamy pierwszego pojazdu o takiej nazwie i odsyłamy parametry ramką #7 @@ -2880,7 +2876,7 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz) t = Ground.DynamicFind( Global::asHumanCtrlVehicle); // nazwa pojazdu użytkownika else - t = Ground.DynamicFindAny(string( + t = Ground.DynamicFindAny(std::string( pRozkaz->cString + 1, (unsigned)pRozkaz->cString[0])); // nazwa pojazdu if (t) Ground.WyslijNamiary(t); // wysłanie informacji o pojeździe @@ -2902,8 +2898,8 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz) break; case 10: // badanie zajętości jednego odcinka izolowanego CommLog(to_string(BorlandTime()) + " " + to_string(pRozkaz->iComm) + " " + - string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])) + " rcvd"); - Ground.IsolatedBusy(string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0]))); + std::string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])) + " rcvd"); + Ground.IsolatedBusy(std::string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0]))); break; case 11: // ustawienie parametrów ruchu pojazdu // Ground.IsolatedBusy(AnsiString(pRozkaz->cString+1,(unsigned)(pRozkaz->cString[0]))); @@ -2917,7 +2913,7 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz) // WriteLog("Przyszlo 13!"); // WriteLog(pRozkaz->cString); CommLog(to_string(BorlandTime()) + " " + to_string(pRozkaz->iComm) + " " + - string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])) + + std::string(pRozkaz->cString + 1, (unsigned)(pRozkaz->cString[0])) + " rcvd"); if (pRozkaz->cString[1]) // jeśli długość nazwy jest niezerowa { // szukamy pierwszego pojazdu o takiej nazwie i odsyłamy parametry ramką #13 @@ -2927,7 +2923,7 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz) Global::asHumanCtrlVehicle); // nazwa pojazdu użytkownika else t = Ground.DynamicFindAny( - string(pRozkaz->cString + 2, + std::string(pRozkaz->cString + 2, (unsigned)pRozkaz->cString[1])); // nazwa pojazdu if (t) { @@ -2952,9 +2948,10 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz) }; //--------------------------------------------------------------------------- -void TWorld::ModifyTGA(const AnsiString &dir) +void TWorld::ModifyTGA(const std::string &dir) { // rekurencyjna modyfikacje plików TGA - TSearchRec sr; +/* TODO: implement version without Borland stuff + TSearchRec sr; if (FindFirst(dir + "*.*", faDirectory | faArchive, sr) == 0) { do @@ -2967,12 +2964,15 @@ void TWorld::ModifyTGA(const AnsiString &dir) } while (FindNext(sr) == 0); FindClose(sr); } +*/ }; //--------------------------------------------------------------------------- -AnsiString last; // zmienne używane w rekurencji +std::string last; // zmienne używane w rekurencji double shift = 0; -void TWorld::CreateE3D(const AnsiString &dir, bool dyn) +void TWorld::CreateE3D(std::string const &dir, bool dyn) { // rekurencyjna generowanie plików E3D + +/* TODO: remove Borland file access stuff TTrack *trk; double at; TSearchRec sr; @@ -3061,6 +3061,7 @@ void TWorld::CreateE3D(const AnsiString &dir, bool dyn) } while (FindNext(sr) == 0); FindClose(sr); } +*/ }; //--------------------------------------------------------------------------- void TWorld::CabChange(TDynamicObject *old, TDynamicObject *now) diff --git a/World.h b/World.h index b80b1226..0c6589f3 100644 --- a/World.h +++ b/World.h @@ -7,18 +7,13 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef WorldH -#define WorldH +#pragma once -#include "Usefull.h" -#include "Classes.h" -#include "Texture.h" +#include #include "Camera.h" #include "Ground.h" -#include "MdlMngr.h" -#include "Globals.h" #include "sky.h" -//#include +#include "mczapkie/mover.h" class TWorld { @@ -41,10 +36,10 @@ class TWorld ~TWorld(); // double Aspect; private: - string OutText1; // teksty na ekranie - string OutText2; - string OutText3; - string OutText4; + std::string OutText1; // teksty na ekranie + std::string OutText2; + std::string OutText3; + std::string OutText4; void ShowHints(); bool Render(); TCamera Camera; @@ -66,9 +61,9 @@ class TWorld int tprev; // poprzedni czas double Acc; // przyspieszenie styczne public: - void ModifyTGA(const AnsiString &dir = ""); - void CreateE3D(const AnsiString &dir = "", bool dyn = false); + void ModifyTGA(std::string const &dir = ""); + void CreateE3D(std::string const &dir = "", bool dyn = false); void CabChange(TDynamicObject *old, TDynamicObject *now); }; //--------------------------------------------------------------------------- -#endif + diff --git a/dumb3d.cpp b/dumb3d.cpp index fc0b139e..187777ee 100644 --- a/dumb3d.cpp +++ b/dumb3d.cpp @@ -7,8 +7,8 @@ obtain one at http://mozilla.org/MPL/2.0/. */ +#include "stdafx.h" #include "dumb3d.h" -#include "fastmath.h" #include namespace Math3D diff --git a/dumb3d.h b/dumb3d.h index 05da2130..ecce43ba 100644 --- a/dumb3d.h +++ b/dumb3d.h @@ -7,11 +7,9 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef MATH3D_H -#define MATH3D_H +#pragma once -//#include -#include +#include namespace Math3D { @@ -29,15 +27,15 @@ typedef double scalar_t; // written in this style to allow for easy substitution with more efficient versions inline scalar_t SINE_FUNCTION(scalar_t x) { - return sin(x); + return std::sin(x); } inline scalar_t COSINE_FUNCTION(scalar_t x) { - return cos(x); + return std::cos(x); } inline scalar_t SQRT_FUNCTION(scalar_t x) { - return sqrt(x); + return std::sqrt(x); } // 2 element vector @@ -113,11 +111,11 @@ class vector3 // }; bool inline Equal(vector3 *v) { // sprawdzenie odległości punktów - if (fabs(x - v->x) > 0.02) + if (std::fabs(x - v->x) > 0.02) return false; // sześcian zamiast kuli - if (fabs(z - v->z) > 0.02) + if (std::fabs(z - v->z) > 0.02) return false; - if (fabs(y - v->y) > 0.02) + if (std::fabs(y - v->y) > 0.02) return false; return true; }; @@ -635,5 +633,3 @@ std::ostream &operator<<(std::ostream &os, const Math3D::matrix4x4 &m) return os; } #endif // OSTREAM_MATH3D - -#endif diff --git a/eu07.ico b/eu07.ico index 29b0bba1..8103741a 100644 Binary files a/eu07.ico and b/eu07.ico differ diff --git a/mtable.cpp b/mtable.cpp index b5ce2492..5bf47fde 100644 --- a/mtable.cpp +++ b/mtable.cpp @@ -11,8 +11,8 @@ obtain one at http://mozilla.org/MPL/2.0/. */ +#include "stdafx.h" #include "mtable.h" -#include //using namespace Mtable; TMTableTime *Mtable::GlobalTime; diff --git a/mtable.h b/mtable.h index a6e4dec8..f383938d 100644 --- a/mtable.h +++ b/mtable.h @@ -7,13 +7,9 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef MTABLE_H -#define MTABLE_H +#pragma once -#include "McZapkie/mctools.h" #include -// using namespace std; -//#include "sysutils.h" namespace Mtable { @@ -109,5 +105,3 @@ namespace Mtable #if !defined(NO_IMPLICIT_NAMESPACE_USE) using namespace Mtable; #endif - -#endif // MTABLE_H diff --git a/opengl/ARB_Multisample.cpp b/opengl/ARB_Multisample.cpp index e943bfc6..0c58a540 100644 --- a/opengl/ARB_Multisample.cpp +++ b/opengl/ARB_Multisample.cpp @@ -8,14 +8,10 @@ ========================================================================================*/ -#include -#include -#include -#include "wglext.h" //WGL extensions -#include "glext.h" //GL extensions - - +#include "stdafx.h" #include "arb_multisample.h" +#include "glew.h" +#include "wglew.h" // Declairations We'll Use #define WGL_SAMPLE_BUFFERS_ARB 0x2041 diff --git a/opengl/ARB_Multisample.h b/opengl/ARB_Multisample.h index 984a5925..a688e851 100644 --- a/opengl/ARB_Multisample.h +++ b/opengl/ARB_Multisample.h @@ -10,11 +10,8 @@ #ifndef __ARB_MULTISAMPLE_H__ #define __ARB_MULTISAMPLE_H__ -//#include "wglext.h" //WGL extensions -//#include "glext.h" //GL extensions #include - //Globals extern bool arbMultisampleSupported; extern int arbMultisampleFormat; diff --git a/parser.cpp b/parser.cpp index e56b9e33..43d8e929 100644 --- a/parser.cpp +++ b/parser.cpp @@ -7,8 +7,7 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#define _USE_OLD_RW_STL - +#include "stdafx.h" #include "parser.h" #include "logs.h" @@ -205,5 +204,5 @@ std::string cParser::readComment(const std::string Break) int cParser::getProgress() const { - return mStream->rdbuf()->pubseekoff(0, std::ios_base::cur) * 100 / mSize; + return static_cast( mStream->rdbuf()->pubseekoff(0, std::ios_base::cur) * 100 / mSize ); } diff --git a/parser.h b/parser.h index e4707895..5cd57c30 100644 --- a/parser.h +++ b/parser.h @@ -7,17 +7,13 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#if !defined(rainKERNELTEXTPARSER_H_INCLUDED) -#define rainKERNELTEXTPARSER_H_INCLUDED - -#pragma warning(disable : 4786) // 'containers too long for debug' warning +#pragma once #include #include -#include -#include #include -#include +#include +#include ///////////////////////////////////////////////////////////////////////////////////////////////////// // cParser -- generic class for parsing text data, either from file or provided string @@ -37,11 +33,21 @@ class cParser : public std::stringstream // destructor: virtual ~cParser(); // methods: - template inline void getToken(OutputT &output) + template + _Output + getToken( bool const ToLower = true ) { - getTokens(); + getTokens( 1, ToLower ); + _Output output; *this >> output; + return output; }; + template <> + bool + getToken( bool const ToLower ) { + + return ( getToken() == "true" ); + } inline void ignoreToken() { readToken(); @@ -77,11 +83,24 @@ class cParser : public std::stringstream // members: std::istream *mStream; // relevant kind of buffer is attached on creation. std::string mPath; // path to open stream, for relative path lookups. - int mSize; // size of open stream, for progress report. + std::streamoff mSize; // size of open stream, for progress report. typedef std::map commentmap; commentmap mComments; cParser *mIncludeParser; // child class to handle include directives. std::vector parameters; // parameter list for included file. }; -#endif // ..!defined(rainKERNELTEXTPARSER_H_INCLUDED) +inline +cParser& +operator>>( cParser &Parser, bool &Right ) { + + std::istream::sentry const streamokay( Parser ); + if( streamokay ) { + + std::string value; + Parser >> value; + Right = ( value == "true" ); + } + + return Parser; +} diff --git a/sky.cpp b/sky.cpp index 72becf25..21d20b92 100644 --- a/sky.cpp +++ b/sky.cpp @@ -7,12 +7,11 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#include "system.hpp" -#include "classes.hpp" -#pragma hdrstop - +#include "stdafx.h" #include "sky.h" +#include "Logs.h" #include "Globals.h" +#include "MdlMngr.h" //--------------------------------------------------------------------------- GLfloat lightPos[4] = {0.0f, 0.0f, 0.0f, 1.0f}; @@ -59,5 +58,3 @@ void TSky::Render() }; //--------------------------------------------------------------------------- - -#pragma package(smart_init) diff --git a/sky.h b/sky.h index 409f06c5..c7d43372 100644 --- a/sky.h +++ b/sky.h @@ -1,9 +1,8 @@ //--------------------------------------------------------------------------- -#ifndef skyH -#define skyH +#pragma once -#include "MdlMngr.h" +#include "Model3d.h" class TSky { @@ -18,7 +17,6 @@ class TSky }; //--------------------------------------------------------------------------- -#endif /* This Source Code Form is subject to the terms of the Mozilla Public License, v. diff --git a/stdafx.cpp b/stdafx.cpp new file mode 100644 index 00000000..948e1249 --- /dev/null +++ b/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// kernel.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/stdafx.h b/stdafx.h new file mode 100644 index 00000000..83a2ebaa --- /dev/null +++ b/stdafx.h @@ -0,0 +1,50 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#ifdef _MSC_VER +// memory debug functions +#define _CRTDBG_MAP_ALLOC +#include +#include +#endif +// operating system +#include "targetver.h" +#define NOMINMAX +#include +#include +#undef NOMINMAX +// stl +#include +#define _USE_MATH_DEFINES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/targetver.h b/targetver.h new file mode 100644 index 00000000..8128c7d5 --- /dev/null +++ b/targetver.h @@ -0,0 +1,13 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0600 // _WIN32_WINNT_VISTA +#endif + +#include diff --git a/usefull.h b/usefull.h index 9845f42a..07dc7828 100644 --- a/usefull.h +++ b/usefull.h @@ -7,11 +7,7 @@ obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef UsefullH -#define UsefullH - -#include "dumb3d.h" -#include "Logs.h" +#pragma once //#define B1(t) (t*t*t) //#define B2(t) (3*t*t*(1-t)) @@ -28,12 +24,12 @@ http://mozilla.org/MPL/2.0/. #define SafeDelete(a) \ { \ delete (a); \ - a = NULL; \ + a = nullptr; \ } #define SafeDeleteArray(a) \ { \ delete[](a); \ - a = NULL; \ + a = nullptr; \ } #define sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0)) @@ -49,8 +45,8 @@ http://mozilla.org/MPL/2.0/. a = c; \ } -#define asModelsPath AnsiString("models\\") -#define asSceneryPath AnsiString("scenery\\") +#define asModelsPath std::string("models\\") +#define asSceneryPath std::string("scenery\\") //#define asTexturePath AnsiString("textures\\") //#define asTextureExt AnsiString(".bmp") #define szSceneryPath "scenery\\" @@ -60,5 +56,6 @@ http://mozilla.org/MPL/2.0/. //#define DevelopTime //FIXME //#define EditorMode +#define MAKE_ID4(a,b,c,d) (((std::uint32_t)(d)<<24)|((std::uint32_t)(c)<<16)|((std::uint32_t)(b)<<8)|(std::uint32_t)(a)) + //--------------------------------------------------------------------------- -#endif diff --git a/wavread.cpp b/wavread.cpp index 930bbcf6..d55dd9be 100644 --- a/wavread.cpp +++ b/wavread.cpp @@ -15,7 +15,7 @@ http://mozilla.org/MPL/2.0/. // // Copyright (c) 1999 Microsoft Corp. All rights reserved. //----------------------------------------------------------------------------- -#include +#include "stdafx.h" #include "WavRead.h" //-----------------------------------------------------------------------------