diff --git a/.gitignore b/.gitignore index 0d2bd761..549b13c4 100644 --- a/.gitignore +++ b/.gitignore @@ -69,3 +69,5 @@ bin/ ipch/ ref/ *.aps + +builds/ \ No newline at end of file diff --git a/AnimModel.cpp b/AnimModel.cpp index c61267de..6d6907ed 100644 --- a/AnimModel.cpp +++ b/AnimModel.cpp @@ -423,9 +423,9 @@ TAnimModel::TAnimModel() } vAngle.x = vAngle.y = vAngle.z = 0.0; // zerowanie obrotów egzemplarza pAdvanced = NULL; // nie ma zaawansowanej animacji - fDark = 0.25; // standardowy próg zaplania - fOnTime = 0.66; - fOffTime = fOnTime + 0.66; + fDark = 0.25f; // standardowy próg zaplania + fOnTime = 0.66f; + fOffTime = fOnTime + 0.66f; } TAnimModel::~TAnimModel() @@ -546,7 +546,7 @@ TAnimContainer * TAnimModel::GetContainer(char *pName) TAnimContainer *pCurrent; for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext) // if (pCurrent->GetName()==pName) - if (stricmp(pCurrent->NameGet(), pName) == 0) + if (std::string(pName) == pCurrent->NameGet()) return pCurrent; return AddContainer(pName); } @@ -587,7 +587,7 @@ void TAnimModel::RaPrepare() if (LightsOff[i]) LightsOff[i]->iVisible = !state; } - TSubModel::iInstance = (int)this; //żeby nie robić cudzych animacji + TSubModel::iInstance = (size_t)this; //żeby nie robić cudzych animacji TSubModel::pasText = &asText; // przekazanie tekstu do wyÅ›wietlacza (!!!! do przemyÅ›lenia) if (pAdvanced) // jeÅ›li jest zaawansowana animacja Advanced(); // wykonać co tam trzeba diff --git a/AnimModel.h b/AnimModel.h index bc688a5d..5c2899b2 100644 --- a/AnimModel.h +++ b/AnimModel.h @@ -81,9 +81,9 @@ class TAnimContainer // std::string(pSubModel?pSubModel->asName.c_str():""); }; // std::string inline GetName() { return std::string(pSubModel?pSubModel->pName:""); // }; - char * NameGet() + std::string NameGet() { - return (pSubModel ? pSubModel->pName : NULL); + return (pSubModel ? pSubModel->pName : ""); }; // void SetRotateAnim(vector3 vNewRotateAxis, double fNewDesiredAngle, double // fNewRotateSpeed, bool bResetAngle=false); diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..bd25b5ac --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,107 @@ +cmake_minimum_required(VERSION 3.0) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMake_modules/") +project("eu07++ng") + +include_directories("." "Console" "McZapkie") +file(GLOB HEADERS "*.h" "Console/*.h" "McZapkie/*.h") + +set(SOURCES +"Texture.cpp" +"TextureDDS.cpp" +"Timer.cpp" +"Track.cpp" +"Traction.cpp" +"TractionPower.cpp" +"Train.cpp" +"TrkFoll.cpp" +"VBO.cpp" +"wavread.cpp" +"World.cpp" +"AdvSound.cpp" +"AirCoupler.cpp" +"AnimModel.cpp" +"Button.cpp" +"Camera.cpp" +"Console.cpp" +"console/LPT.cpp" +"Console/MWD.cpp" +"console/PoKeys55.cpp" +"Driver.cpp" +"dumb3d.cpp" +"DynObj.cpp" +"EU07.cpp" +"Event.cpp" +"EvLaunch.cpp" +"FadeSound.cpp" +"Float3d.cpp" +"Gauge.cpp" +"Globals.cpp" +"Ground.cpp" +"Logs.cpp" +"mczapkie/friction.cpp" +"mczapkie/hamulce.cpp" +"mczapkie/mctools.cpp" +"mczapkie/Mover.cpp" +"mczapkie/Oerlikon_ESt.cpp" +"MdlMngr.cpp" +"MemCell.cpp" +"Model3d.cpp" +"mtable.cpp" +"parser.cpp" +"renderer.cpp" +"PyInt.cpp" +"RealSound.cpp" +"ResourceManager.cpp" +"sn_utils.cpp" +"Segment.cpp" +"sky.cpp" +"sun.cpp" +"stars.cpp" +"lightarray.cpp" +"skydome.cpp" +"Sound.cpp" +"Spring.cpp" +"shader.cpp" +) + +if (WIN32) + add_definitions(-DHAVE_ROUND) # to make pymath to not redefine round + set(SOURCES ${SOURCES} "windows.cpp") +endif() + +if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC) + set(SOURCES ${SOURCES} "eu07.rc") + set(SOURCES ${SOURCES} "eu07.ico") +endif() + +add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS}) + +if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC) + # /wd4996: disable "deprecation" warnings + # /wd4244: disable warnings for conversion with possible loss of data + set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/wd4996 /wd4244") +endif() + +find_package(OpenGL REQUIRED) +include_directories(${OPENGL_INCLUDE_DIR}) +target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES}) + +find_package(GLEW REQUIRED) +include_directories(${GLEW_INCLUDE_DIRS}) +target_link_libraries(${PROJECT_NAME} ${GLEW_LIBRARIES}) + +find_package(GLFW3 REQUIRED) +include_directories(${GLFW3_INCLUDE_DIR}) +target_link_libraries(${PROJECT_NAME} ${GLFW3_LIBRARIES}) + +find_package(GLUT REQUIRED) +include_directories(${GLUT_INCLUDE_DIR}) +target_link_libraries(${PROJECT_NAME} ${GLUT_LIBRARIES}) + +find_package(PythonLibs 2 REQUIRED) +include_directories(${PYTHON_INCLUDE_DIRS}) +target_link_libraries(${PROJECT_NAME} ${PYTHON_LIBRARIES}) + +find_package(PNG REQUIRED) +include_directories(${PNG_INCLUDE_DIRS}) +target_link_libraries(${PROJECT_NAME} ${PNG_LIBRARIES}) \ No newline at end of file diff --git a/CMake_modules/FindGLFW3.cmake b/CMake_modules/FindGLFW3.cmake new file mode 100644 index 00000000..a92f95a8 --- /dev/null +++ b/CMake_modules/FindGLFW3.cmake @@ -0,0 +1,75 @@ +# - Try to find GLFW3 +# +# If no pkgconfig, define GLFW_ROOT to installation tree +# Will define the following: +# GLFW3_FOUND +# GLFW3_INCLUDE_DIR +# GLFW3_LIBRARIES + +IF(PKG_CONFIG_FOUND) + IF(APPLE) + # homebrew or macports pkgconfig locations + SET(ENV{PKG_CONFIG_PATH} "/usr/local/opt/glfw3/lib/pkgconfig:/opt/local/lib/pkgconfig") + ENDIF() + SET(ENV{PKG_CONFIG_PATH} "${DEPENDS_DIR}/glfw/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}") + PKG_CHECK_MODULES(GLFW3 glfw3) + + FIND_LIBRARY(GLFW3_LIBRARY + NAMES ${GLFW3_LIBRARIES} + HINTS ${GLFW3_LIBRARY_DIR} + ) + SET(GLFW3_LIBRARIES ${GLFW3_LIBRARY}) + + RETURN() +ENDIF() + +FIND_PATH(GLFW3_INCLUDE_DIR + GLFW/glfw3.h + DOC "GLFW include directory " + PATHS + "${DEPENDS_DIR}/glfw" + "$ENV{ProgramW6432}/glfw" + ${GLFW3_ROOT_PATH} + PATH_SUFFIXES + include +) + +# directories in the official binary package +IF(MINGW) + SET(_SUFFIX lib-mingw) +ELSEIF(MSVC11) + SET(_SUFFIX lib-vc2012) +ELSEIF(MSVC12) + SET(_SUFFIX lib-vc2013) +ELSEIF(MSVC14) + SET(_SUFFIX lib-vc2015) +ELSEIF(MSVC) + SET(_SUFFIX lib-vc2012) +ENDIF() + +FIND_LIBRARY(GLFW3_LIBRARIES + NAMES glfw3dll glfw3 + PATHS + "${DEPENDS_DIR}/glfw" + "$ENV{ProgramW6432}/glfw" + ${GLFW3_ROOT_PATH} + PATH_SUFFIXES + lib + ${_SUFFIX} +) + +IF(WIN32) +FIND_FILE(GLFW3_DLL + glfw3.dll + PATHS + "${DEPENDS_DIR}/glfw" + "$ENV{ProgramW6432}/glfw" + ${GLFW3_ROOT_PATH} + PATH_SUFFIXES + ${_SUFFIX} +) +ENDIF() + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLFW3 FOUND_VAR GLFW3_FOUND + REQUIRED_VARS GLFW3_LIBRARIES GLFW3_INCLUDE_DIR) diff --git a/Camera.cpp b/Camera.cpp index 951fdc22..c714fb88 100644 --- a/Camera.cpp +++ b/Camera.cpp @@ -86,8 +86,8 @@ void TCamera::Update() if (Console::Pressed(Global::Keys[k_MechBackward])) Velocity.z += a; // gora-dol - // if (Console::Pressed(VK_NUMPAD9)) Pos.y+=0.1; - // if (Console::Pressed(VK_NUMPAD3)) Pos.y-=0.1; + // if (Console::Pressed(GLFW_KEY_KP_9)) Pos.y+=0.1; + // if (Console::Pressed(GLFW_KEY_KP_3)) Pos.y-=0.1; // McZapkie: zeby nie hustalo przy malym FPS: // Velocity= (Velocity+OldVelocity)/2; diff --git a/Console.cpp b/Console.cpp index 1879dde1..a61a4484 100644 --- a/Console.cpp +++ b/Console.cpp @@ -83,7 +83,7 @@ public static Int32 GetScreenSaverTimeout() TKeyTrans Console::ktTable[4 * 256]; // Ra: do poprawienia -void SetLedState(char Code, bool bOn){ +void SetLedState(unsigned char Code, bool bOn){ // Ra: bajer do migania LED-ami w klawiaturze // NOTE: disabled for the time being // TODO: find non Borland specific equivalent, or get rid of it @@ -244,7 +244,7 @@ void Console::BitsUpdate(int mask) { case 1: // sterowanie Å›wiateÅ‚kami klawiatury: CA/SHP+opory if (mask & 3) // gdy SHP albo CA - SetLedState(VK_CAPITAL, iBits & 3); + SetLedState(VK_CAPITAL, (iBits & 3) != 0); if (mask & 4) // gdy jazda na oporach { // Scroll Lock ma jakoÅ› dziwnie... zmiana stanu na przeciwny SetLedState(VK_SCROLL, true); // przyciÅ›niÄ™ty @@ -254,7 +254,7 @@ void Console::BitsUpdate(int mask) break; case 2: // sterowanie Å›wiateÅ‚kami klawiatury: CA+SHP if (mask & 2) // gdy CA - SetLedState(VK_CAPITAL, iBits & 2); + SetLedState(VK_CAPITAL, (iBits & 2) != 0); if (mask & 1) // gdy SHP { // Scroll Lock ma jakoÅ› dziwnie... zmiana stanu na przeciwny SetLedState(VK_SCROLL, true); // przyciÅ›niÄ™ty @@ -356,10 +356,10 @@ void Console::BitsUpdate(int mask) bool Console::Pressed(int x) { // na razie tak - czyta siÄ™ tylko klawiatura - if( glfwGetKey( Global::window, x ) == GLFW_TRUE ) - return true; - else - return false; + if (glfwGetKey(Global::window, x) == GLFW_TRUE) + return true; + else + return false; }; void Console::ValueSet(int x, double y) diff --git a/Console/LPT.cpp b/Console/LPT.cpp index 2c22fa7c..3f6b2752 100644 --- a/Console/LPT.cpp +++ b/Console/LPT.cpp @@ -45,7 +45,7 @@ bool TLPT::Connect(int port) case 0xBD00: OutPort(address + 0x006, 0); // 0xBC06? czysta improwizacja } - return bool(OutPort); + return OutPort != 0; }; void TLPT::Out(int x) diff --git a/Console/MWD.cpp b/Console/MWD.cpp index 19564b8f..8d075280 100644 --- a/Console/MWD.cpp +++ b/Console/MWD.cpp @@ -189,7 +189,6 @@ bool TMWDComm::ReadData() // odbieranie danych + odczyta danych analogowych i za bool TMWDComm::SendData() // wysyÅ‚anie danych { DWORD bytes_write; - DWORD fdwEvtMask; WriteFile(hComm, &WriteDataBuff[0], BYTETOWRITE, &bytes_write, NULL); diff --git a/Console/PoKeys55.cpp b/Console/PoKeys55.cpp index d642b3fb..8fbb4dbd 100644 --- a/Console/PoKeys55.cpp +++ b/Console/PoKeys55.cpp @@ -70,7 +70,6 @@ bool TPoKeys55::Connect() PBYTE PropertyValueBuffer; bool MatchFound; DWORD ErrorStatus; - HDEVINFO hDevInfo; 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 diff --git a/Dokumentacja zmiennych Python.docx b/Dokumentacja zmiennych Python.docx deleted file mode 100644 index f421014b..00000000 Binary files a/Dokumentacja zmiennych Python.docx and /dev/null differ diff --git a/Driver.cpp b/Driver.cpp index 09b6c79a..e7f95040 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -260,8 +260,8 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len) } if (iFlags & spSwitch) // jeÅ›li odcinek zmienny { - if (bool(trTrack->GetSwitchState() & 1) != - bool(iFlags & spSwitchStatus)) // czy stan siÄ™ zmieniÅ‚? + if (((trTrack->GetSwitchState() & 1) != 0) != + ((iFlags & spSwitchStatus) != 0)) // czy stan siÄ™ zmieniÅ‚? { // Ra: zakÅ‚adam, że sÄ… tylko 2 możliwe stany iFlags ^= spSwitchStatus; // fVelNext=trTrack->VelocityGet(); //nowa prÄ™dkość @@ -389,7 +389,7 @@ void TSpeedPos::Set(TTrack *track, double dist, int flag) fVelNext = (trTrack->iCategoryFlag & 1) ? 0.0 : 20.0; // jeÅ›li koniec, to pociÄ…g stój, a samochód zwolnij - vPos = (bool(iFlags & spReverse) != bool(iFlags & spEnd)) ? + vPos = (((iFlags & spReverse) != 0) != ((iFlags & spEnd) != 0)) ? trTrack->CurrentSegment()->FastGetPoint_1() : trTrack->CurrentSegment()->FastGetPoint_0(); } diff --git a/DynObj.cpp b/DynObj.cpp index 6ff5fb66..cf31b015 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -43,7 +43,7 @@ http://mozilla.org/MPL/2.0/. // vector3 vWorldLeft=CrossProduct(vWorldUp,vWorldFront); #define M_2PI 6.283185307179586476925286766559; -const float maxrot = (M_PI / 3.0); // 60° +const float maxrot = (float)(M_PI / 3.0); // 60° //--------------------------------------------------------------------------- void TAnimPant::AKP_4E() @@ -65,13 +65,13 @@ void TAnimPant::AKP_4E() PantWys = fLenL1 * sin(fAngleL) + fLenU1 * sin(fAngleU) + fHeight; // wysokość poczÄ…tkowa PantTraction = PantWys; hvPowerWire = NULL; - fWidthExtra = 0.381; //(2.032m-1.027)/2 + fWidthExtra = 0.381f; //(2.032m-1.027)/2 // poza obszarem roboczym jest aproksymacja Å‚amanÄ… o 5 odcinkach - fHeightExtra[0] = 0.0; //+0.0762 - fHeightExtra[1] = -0.01; //+0.1524 - fHeightExtra[2] = -0.03; //+0.2286 - fHeightExtra[3] = -0.07; //+0.3048 - fHeightExtra[4] = -0.15; //+0.3810 + fHeightExtra[0] = 0.0f; //+0.0762 + fHeightExtra[1] = -0.01f; //+0.1524 + fHeightExtra[2] = -0.03f; //+0.2286 + fHeightExtra[3] = -0.07f; //+0.3048 + fHeightExtra[4] = -0.15f; //+0.3810 }; //--------------------------------------------------------------------------- int TAnim::TypeSet(int i, int fl) @@ -1168,7 +1168,6 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir, if( false == Track->Dynamics.empty() ) #endif { // sens szukania na tym torze jest tylko, gdy sÄ… na nim pojazdy - double ObjTranslation; // pozycja najblizszego obiektu na torze double MyTranslation; // pozycja szukajÄ…cego na torze double MinDist = Track->Length(); // najmniejsza znaleziona odleglość // (zaczynamy od dÅ‚ugoÅ›ci toru) @@ -1888,11 +1887,11 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424" // dodatkowe parametry yB MoreParams += "."; // wykonuje o jednÄ… iteracjÄ™ za maÅ‚o, wiÄ™c trzeba mu dodać // kropkÄ™ na koniec - int kropka = MoreParams.find("."); // znajdź kropke + size_t kropka = MoreParams.find("."); // znajdź kropke std::string ActPar; // na parametry while (kropka != std::string::npos) // jesli sa kropki jeszcze { - int dlugosc = MoreParams.length(); + size_t dlugosc = MoreParams.length(); ActPar = ToUpper(MoreParams.substr(0, kropka)); // pierwszy parametr; MoreParams = MoreParams.substr(kropka + 1, dlugosc - kropka); // reszta do dalszej // obrobki @@ -2153,8 +2152,8 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424" iNumAxles = 2; // McZapkie-090402: odleglosc miedzy czopami skretu lub osiami fAxleDist = Max0R(MoverParameters->BDist, MoverParameters->ADist); - if (fAxleDist < 0.2) - fAxleDist = 0.2; //żeby siÄ™ daÅ‚o wektory policzyć + if (fAxleDist < 0.2f) + fAxleDist = 0.2f; //żeby siÄ™ daÅ‚o wektory policzyć if (fAxleDist > MoverParameters->Dim.L - 0.2) // nie mogÄ… być za daleko fAxleDist = MoverParameters->Dim.L - 0.2; // bo bÄ™dzie "walenie w mur" double fAxleDistHalf = fAxleDist * 0.5; @@ -2264,18 +2263,18 @@ void TDynamicObject::Move(double fDistance) } if (fDistance > 0.0) { // gdy ruch w stronÄ™ sprzÄ™gu 0, doliczyć korektÄ™ do osi 1 - bEnabled &= Axle0.Move(fDistance, !iAxleFirst); // oÅ› z przodu pojazdu - bEnabled &= Axle1.Move(fDistance /*-fAdjustment*/, iAxleFirst); // oÅ› z tyÅ‚u pojazdu + bEnabled &= Axle0.Move(fDistance, iAxleFirst == 0); // oÅ› z przodu pojazdu + bEnabled &= Axle1.Move(fDistance /*-fAdjustment*/, iAxleFirst != 0); // oÅ› z tyÅ‚u pojazdu } else if (fDistance < 0.0) { // gdy ruch w stronÄ™ sprzÄ™gu 1, doliczyć korektÄ™ do osi 0 - bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oÅ› z tyÅ‚u pojazdu prusza siÄ™ pierwsza - bEnabled &= Axle0.Move(fDistance /*-fAdjustment*/, !iAxleFirst); // oÅ› z przodu pojazdu + bEnabled &= Axle1.Move(fDistance, iAxleFirst != 0); // oÅ› z tyÅ‚u pojazdu prusza siÄ™ pierwsza + bEnabled &= Axle0.Move(fDistance /*-fAdjustment*/, iAxleFirst == 0); // oÅ› z przodu pojazdu } else // gf: bez wywolania Move na postoju nie ma event0 { - bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oÅ› z tyÅ‚u pojazdu prusza siÄ™ pierwsza - bEnabled &= Axle0.Move(fDistance, !iAxleFirst); // oÅ› z przodu pojazdu + bEnabled &= Axle1.Move(fDistance, iAxleFirst != 0); // oÅ› z tyÅ‚u pojazdu prusza siÄ™ pierwsza + bEnabled &= Axle0.Move(fDistance, iAxleFirst == 0); // oÅ› z przodu pojazdu } if (fDistance != 0.0) // nie liczyć ponownie, jeÅ›li stoi { // liczenie pozycji pojazdu tutaj, bo jest używane w wielu miejscach @@ -2353,10 +2352,10 @@ void TDynamicObject::Move(double fDistance) switch (t0->eEnvironment) { // typ zmiany oÅ›wietlenia case e_canyon: - fShade = 0.65; + fShade = 0.65f; break; // zacienienie w kanionie case e_tunnel: - fShade = 0.20; + fShade = 0.20f; break; // zacienienie w tunelu } } @@ -3116,7 +3115,6 @@ bool TDynamicObject::Update(double dt, double dt1) ResetdMoveLen(); // McZapkie-260202 // tupot mew, tfu, stukot kol: - DWORD stat; // taka prowizorka zeby sciszyc stukot dalekiej lokomotywy double ObjectDist; double vol = 0; @@ -3735,7 +3733,7 @@ void TDynamicObject::Render() if (renderme) { - TSubModel::iInstance = (int)this; //żeby nie robić cudzych animacji + TSubModel::iInstance = (size_t)this; //żeby nie robić cudzych animacji // AnsiString asLoadName=""; double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition) / Global::ZoomFactor; ABuLittleUpdate(ObjSqrDist); // ustawianie zmiennych submodeli dla wspólnego modelu @@ -3863,8 +3861,8 @@ void TDynamicObject::Render() { for (int li = 0; li < 3; li++) { - diffuseCabLight[li] *= 0.6; - specularCabLight[li] *= 0.7; + diffuseCabLight[li] *= 0.6f; + specularCabLight[li] *= 0.7f; } } break; @@ -3872,9 +3870,9 @@ void TDynamicObject::Render() { for (int li = 0; li < 3; li++) { - ambientCabLight[li] *= 0.3; - diffuseCabLight[li] *= 0.1; - specularCabLight[li] *= 0.2; + ambientCabLight[li] *= 0.3f; + diffuseCabLight[li] *= 0.1f; + specularCabLight[li] *= 0.2f; } } break; @@ -4280,7 +4278,7 @@ void TDynamicObject::RenderAlpha() { // rysowanie elementów półprzezroczystych if (renderme) { - TSubModel::iInstance = (int)this; //żeby nie robić cudzych animacji + TSubModel::iInstance = (size_t)this; //żeby nie robić cudzych animacji double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition); ABuLittleUpdate(ObjSqrDist); // ustawianie zmiennych submodeli dla wspólnego modelu glPushMatrix(); @@ -4689,7 +4687,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, else if (token == "animwheelprefix:") { // prefiks krÄ™cÄ…cych siÄ™ kół - int i, j, k, m; + int i, k, m; + unsigned int j; parser.getTokens( 1, false ); parser >> token; for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // liczba osi { // McZapkie-050402: wyszukiwanie kol o nazwie str* @@ -5073,7 +5072,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, else if( token == "animdoorprefix:" ) { // nazwa animowanych drzwi - int i, j, k, m; + int i, j; parser.getTokens(1, false); parser >> token; for (i = 0, j = 0; i < ANIM_DOORS; ++i) j += iAnimType[i]; // zliczanie wczeÅ›niejszych animacji diff --git a/EU07.bpr b/EU07.bpr deleted file mode 100644 index 74206a6d..00000000 --- a/EU07.bpr +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -[Version Info] -IncludeVerInfo=1 -AutoIncBuild=0 -MajorVer=16 -MinorVer=1 -Release=1174 -Build=483 -Debug=1 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1045 -CodePage=1250 - -[Version Info Keys] -CompanyName=EU07 Team -FileDescription=MaSzyna EU07-424 -FileVersion=16.1.1174.483 -InternalName=DP+SPKS+asynch+python -LegalCopyright= -LegalTrademarks= -OriginalFilename=eu07.exe -ProductName=MaSzyna EU07-424 -ProductVersion=16.1 -Comments= - -[Excluded Packages] -$(BCB)\Bin\bcbsmp50.bpl=Borland C++ Sample Components -$(BCB)\Bin\dclqrt50.bpl=QuickReport Components -C:\Windows\system32\ibsmp50.bpl=Borland C++ InterBase Alerter Component -$(BCB)\Bin\dcltee50.bpl=TeeChart 5.0 Components -$(BCB)\Bin\applet50.bpl=Borland Control Panel Applet Package - -[HistoryLists\hlIncludePath] -Count=2 -Item0=Console;opengl;McZapkie;$(BCB)\include;$(BCB)\include\vcl;python\include -Item1=Console;opengl;McZapkie;$(BCB)\include;$(BCB)\include\vcl - -[HistoryLists\hlLibraryPath] -Count=2 -Item0=Console;opengl;McZapkie;$(BCB)\lib\obj;$(BCB)\lib;python\libs -Item1=Console;opengl;McZapkie;$(BCB)\lib\obj;$(BCB)\lib - -[HistoryLists\hlDebugSourcePath] -Count=2 -Item0=McZapkie\ -Item1=$(BCB)\source\vcl - -[HistoryLists\hlConditionals] -Count=8 -Item0=GLEW_STATIC;_DEBUG -Item1=GLEW_STATIC -Item2=GLEW_STATIC;_DEBUG;USE_VBO -Item3=GLEW_STATIC;_DEBUG;_USE_OLD_RW_STL -Item4=GLEW_STATIC;USE_VERTEX_ARRAYS;_DEBUG -Item5=GLEW_STATIC;USE_VERTEX_ARRAYS -Item6=GLEW_STATIC;_DEBUG;USE_VERTEX_ARRAYS -Item7=_DEBUG - -[HistoryLists\hlFinalOutputDir] -Count=5 -Item0=E:\Gry\MaSzyna_15_04\ -Item1=D:\Maszyna -Item2=E:\Gry\MaSzyna_15_04 -Item3=D:\EU07\ -Item4=E:\EU07\ - -[Debugging] -DebugSourceDirs=McZapkie\ - -[Parameters] -RunParams=-s td.scn -v EP07-424 -HostApplication= -RemoteHost= -RemotePath= -RemoteDebug=0 - -[Compiler] -ShowInfoMsgs=0 -LinkDebugVcl=0 -LinkCGLIB=0 - -[Language] -ActiveLang= -ProjectLang= -RootDir= - - \ No newline at end of file diff --git a/EU07.cpp b/EU07.cpp index 6c8da4f2..7b795f64 100644 --- a/EU07.cpp +++ b/EU07.cpp @@ -18,8 +18,8 @@ Stele, firleju, szociu, hunter, ZiomalCl, OLI_EU and others */ #include "stdafx.h" - -#include //_clear87() itp. +#include +#include #include "Globals.h" #include "Logs.h" @@ -44,19 +44,57 @@ Stele, firleju, szociu, hunter, ZiomalCl, OLI_EU and others #endif TWorld World; -PCOPYDATASTRUCT pDane; -void window_resize_callback( GLFWwindow *window, int w, int h ) +void screenshot_save_thread(char *img) { - Global::ScreenWidth = w; - Global::ScreenHeight = h; - ::glViewport( 0, 0, w, h ); + png_image png; + memset(&png, 0, sizeof(png_image)); + png.version = PNG_IMAGE_VERSION; + png.width = Global::ScreenWidth; + png.height = Global::ScreenHeight; + png.format = PNG_FORMAT_RGB; + + char datetime[64]; + time_t timer; + struct tm* tm_info; + time(&timer); + tm_info = localtime(&timer); + strftime(datetime, 64, "%Y-%m-%d_%H-%M-%S", tm_info); + + uint64_t perf; + QueryPerformanceCounter((LARGE_INTEGER*)&perf); + + std::string filename = "screenshots/" + std::string(datetime) + + "_" + std::to_string(perf) + ".png"; + + if (png_image_write_to_file(&png, filename.c_str(), 0, img, -Global::ScreenWidth * 3, nullptr) == 1) + WriteLog("saved " + filename + "."); + else + WriteLog("failed to save screenshot."); + + delete[] img; } -void cursor_pos_callback( GLFWwindow *window, double x, double y ) +void make_screenshot() { - World.OnMouseMove( x * 0.005, y * 0.01 ); - ::glfwSetCursorPos( window, 0.0, 0.0 ); + char *img = new char[Global::ScreenWidth * Global::ScreenHeight * 3]; + glReadPixels(0, 0, Global::ScreenWidth, Global::ScreenHeight, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)img); + + std::thread t(screenshot_save_thread, img); + t.detach(); +} + +void window_resize_callback(GLFWwindow *window, int w, int h) +{ + Global::ScreenWidth = w; + Global::ScreenHeight = h; + glViewport(0, 0, w, h); +} + +void cursor_pos_callback(GLFWwindow *window, double x, double y) +{ + World.OnMouseMove(x * 0.005, y * 0.01); + glfwSetCursorPos(window, 0.0, 0.0); } void key_callback( GLFWwindow *window, int key, int scancode, int action, int mods ) @@ -80,6 +118,9 @@ void key_callback( GLFWwindow *window, int key, int scancode, int action, int mo switch( key ) { + case GLFW_KEY_F11: + make_screenshot(); + break; case GLFW_KEY_ESCAPE: { if( ( DebugModeFlag ) //[Esc] pauzuje tylko bez Debugmode @@ -128,84 +169,19 @@ void focus_callback( GLFWwindow *window, int focus ) } #ifdef _WINDOWS - extern "C" { - GLFWAPI HWND glfwGetWin32Window( GLFWwindow* window ); + GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); } -HWND Hwnd; -WNDPROC BaseWindowProc; - -LRESULT APIENTRY WndProc( HWND hWnd, // handle for this window - UINT uMsg, // message for this window - WPARAM wParam, // additional message information - LPARAM lParam) // additional message information -{ - switch( uMsg ) // check for windows messages - { - case WM_COPYDATA: { - // obsÅ‚uga danych przesÅ‚anych przez program sterujÄ…cy - pDane = (PCOPYDATASTRUCT)lParam; - if( pDane->dwData == MAKE_ID4( 'E', 'U', '0', '7' ) ) // sygnatura danych - World.OnCommandGet( (DaneRozkaz *)( pDane->lpData ) ); - break; - } - } - // pass all unhandled messages to DefWindowProc - return CallWindowProc( BaseWindowProc, Hwnd, uMsg, wParam, lParam ); -}; - -void make_minidump( ::EXCEPTION_POINTERS* e ) { - - auto hDbgHelp = ::LoadLibraryA( "dbghelp" ); - if( hDbgHelp == nullptr ) - return; - auto pMiniDumpWriteDump = (decltype( &MiniDumpWriteDump ))::GetProcAddress( hDbgHelp, "MiniDumpWriteDump" ); - if( pMiniDumpWriteDump == nullptr ) - return; - - char name[ MAX_PATH ]; - { - auto nameEnd = name + ::GetModuleFileNameA( ::GetModuleHandleA( 0 ), name, MAX_PATH ); - ::SYSTEMTIME t; - ::GetSystemTime( &t ); - wsprintfA( nameEnd - strlen( ".exe" ), - "_crashdump_%4d%02d%02d_%02d%02d%02d.dmp", - t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond ); - } - - auto hFile = ::CreateFileA( name, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 ); - if( hFile == INVALID_HANDLE_VALUE ) - return; - - ::MINIDUMP_EXCEPTION_INFORMATION exceptionInfo; - exceptionInfo.ThreadId = ::GetCurrentThreadId(); - exceptionInfo.ExceptionPointers = e; - exceptionInfo.ClientPointers = FALSE; - - auto dumped = pMiniDumpWriteDump( - ::GetCurrentProcess(), - ::GetCurrentProcessId(), - hFile, - ::MINIDUMP_TYPE( ::MiniDumpWithIndirectlyReferencedMemory | ::MiniDumpScanMemory ), - e ? &exceptionInfo : nullptr, - nullptr, - nullptr ); - - ::CloseHandle( hFile ); - - return; -} - -LONG CALLBACK unhandled_handler( ::EXCEPTION_POINTERS* e ) { - make_minidump( e ); - return EXCEPTION_CONTINUE_SEARCH; -} +LONG CALLBACK unhandled_handler(::EXCEPTION_POINTERS* e); +LRESULT APIENTRY WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +extern HWND Hwnd; +extern WNDPROC BaseWindowProc; #endif -int main( int argc, char *argv[] ) { - +int main(int argc, char *argv[]) +{ #if defined(_MSC_VER) && defined (_DEBUG) // memory leaks _CrtSetDbgFlag( _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ) | _CRTDBG_LEAK_CHECK_DF ); @@ -219,58 +195,64 @@ int main( int argc, char *argv[] ) { ::SetUnhandledExceptionFilter( unhandled_handler ); #endif - if( !glfwInit() ) - return -1; + if (!glfwInit()) + return -1; - DeleteFile( "errors.txt" ); - Global::LoadIniFile( "eu07.ini" ); + DeleteFile("errors.txt"); + Global::LoadIniFile("eu07.ini"); Global::InitKeys(); // hunter-271211: ukrywanie konsoli - if( Global::iWriteLogEnabled & 2 ) { + if( Global::iWriteLogEnabled & 2 ) + { AllocConsole(); SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN ); } - for( int i = 1; i < argc; i++ ) { - std::string token( argv[ i ] ); + for (int i = 1; i < argc; ++i) + { + std::string token(argv[i]); - if( token == "-modifytga" ) - Global::iModifyTGA = -1; - else if( token == "-e3d" ) { - if( Global::iConvertModels > 0 ) - Global::iConvertModels = -Global::iConvertModels; - else - Global::iConvertModels = -7; // z optymalizacjÄ…, bananami i prawidÅ‚owym Opacity - } - else if( i + 1 < argc && token == "-s" ) - Global::SceneryFile = std::string( argv[ ++i ] ); - else if( i + 1 < argc && token == "-v" ) { - std::string v( argv[ ++i ] ); - std::transform( v.begin(), v.end(), v.begin(), ::tolower ); - Global::asHumanCtrlVehicle = v; - } - else { - std::cout << "usage: " << std::string( argv[ 0 ] ) << " [-s sceneryfilepath] " - << "[-v vehiclename] [-modifytga] [-e3d]" << std::endl; - return -1; - } - } + if (token == "-modifytga") + Global::iModifyTGA = -1; + else if (token == "-e3d") + { + if (Global::iConvertModels > 0) + Global::iConvertModels = -Global::iConvertModels; + else + Global::iConvertModels = -7; // z optymalizacjÄ…, bananami i prawidÅ‚owym Opacity + } + else if (i + 1 < argc && token == "-s") + Global::SceneryFile = std::string(argv[++i]); + else if (i + 1 < argc && token == "-v") + { + std::string v(argv[++i]); + std::transform(v.begin(), v.end(), v.begin(), ::tolower); + Global::asHumanCtrlVehicle = v; + } + else + { + std::cout << "usage: " << std::string(argv[0]) << " [-s sceneryfilepath] " + << "[-v vehiclename] [-modifytga] [-e3d]" << std::endl; + return -1; + } + } // match requested video mode to current to allow for // fullwindow creation when resolution is the same GLFWmonitor *monitor = glfwGetPrimaryMonitor(); - const GLFWvidmode *vmode = glfwGetVideoMode( monitor ); + const GLFWvidmode *vmode = glfwGetVideoMode(monitor); - glfwWindowHint( GLFW_RED_BITS, vmode->redBits ); - glfwWindowHint( GLFW_GREEN_BITS, vmode->greenBits ); - glfwWindowHint( GLFW_BLUE_BITS, vmode->blueBits ); - glfwWindowHint( GLFW_REFRESH_RATE, vmode->refreshRate ); + glfwWindowHint(GLFW_RED_BITS, vmode->redBits); + glfwWindowHint(GLFW_GREEN_BITS, vmode->greenBits); + glfwWindowHint(GLFW_BLUE_BITS, vmode->blueBits); + glfwWindowHint(GLFW_REFRESH_RATE, vmode->refreshRate); - glfwWindowHint( GLFW_AUTO_ICONIFY, GLFW_FALSE ); - glfwWindowHint( GLFW_SAMPLES, 1 << Global::iMultisampling ); + glfwWindowHint(GLFW_AUTO_ICONIFY, GLFW_FALSE); + glfwWindowHint(GLFW_SAMPLES, 1 << Global::iMultisampling); - if( Global::bFullScreen ) { + if (Global::bFullScreen) + { // match screen dimensions with selected monitor, for 'borderless window' in fullscreen mode Global::iWindowWidth = vmode->width; Global::iWindowHeight = vmode->height; @@ -280,25 +262,27 @@ int main( int argc, char *argv[] ) { glfwCreateWindow( Global::iWindowWidth, Global::iWindowHeight, "EU07", Global::bFullScreen ? monitor : nullptr, nullptr ); - if( !window ) { + if (!window) + { std::cout << "failed to create window" << std::endl; return -1; } - glfwMakeContextCurrent( window ); - glfwSwapInterval( (Global::VSync ? 1 : 0) ); //vsync - glfwSetInputMode( window, GLFW_CURSOR, GLFW_CURSOR_DISABLED ); //capture cursor - glfwSetCursorPos( window, 0.0, 0.0 ); - glfwSetFramebufferSizeCallback( window, window_resize_callback ); - glfwSetCursorPosCallback( window, cursor_pos_callback ); - glfwSetKeyCallback( window, key_callback ); - glfwSetWindowFocusCallback( window, focus_callback ); + glfwMakeContextCurrent(window); + glfwSwapInterval(Global::VSync ? 1 : 0); //vsync + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); //capture cursor + glfwSetCursorPos(window, 0.0, 0.0); + glfwSetFramebufferSizeCallback(window, window_resize_callback); + glfwSetCursorPosCallback(window, cursor_pos_callback); + glfwSetKeyCallback(window, key_callback); + glfwSetWindowFocusCallback(window, focus_callback); { int width, height; - glfwGetFramebufferSize( window, &width, &height ); - window_resize_callback( window, width, height ); + glfwGetFramebufferSize(window, &width, &height); + window_resize_callback(window, width, height); } - if( glewInit() != GLEW_OK ) { + if (glewInit() != GLEW_OK) + { std::cout << "failed to init GLEW" << std::endl; return -1; } @@ -306,7 +290,7 @@ int main( int argc, char *argv[] ) { #ifdef _WINDOWS // setup wrapper for base glfw window proc, to handle copydata messages Hwnd = glfwGetWin32Window( window ); - BaseWindowProc = (WNDPROC)::SetWindowLongPtr( Hwnd, GWLP_WNDPROC, (LONG)WndProc ); + BaseWindowProc = (WNDPROC)::SetWindowLongPtr( Hwnd, GWLP_WNDPROC, (LONG_PTR)WndProc ); // switch off the topmost flag ::SetWindowPos( Hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE ); #endif @@ -314,7 +298,8 @@ int main( int argc, char *argv[] ) { GfxRenderer.Init(); Global::pWorld = &World; // Ra: wskaźnik potrzebny do usuwania pojazdów - if( !World.Init( window ) ) { + if (!World.Init(window)) + { std::cout << "failed to init TWorld" << std::endl; return -1; } @@ -335,17 +320,18 @@ int main( int argc, char *argv[] ) { } // po zrobieniu E3D odpalamy normalnie sceneriÄ™, by jÄ… zobaczyć Console::On(); // włączenie konsoli - while( !glfwWindowShouldClose( window ) && World.Update() ) { - glfwSwapBuffers( window ); - glfwPollEvents(); + while (!glfwWindowShouldClose(window) && World.Update()) + { + glfwSwapBuffers(window); + glfwPollEvents(); } Console::Off(); // wyłączenie konsoli (komunikacji zwrotnej) } - TPythonInterpreter::killInstance(); - delete pConsole; + TPythonInterpreter::killInstance(); + delete pConsole; - glfwDestroyWindow( window ); - glfwTerminate(); - return 0; + glfwDestroyWindow(window); + glfwTerminate(); + return 0; } diff --git a/Event.cpp b/Event.cpp index de274e49..566c4fd5 100644 --- a/Event.cpp +++ b/Event.cpp @@ -142,7 +142,6 @@ void TEvent::Load(cParser *parser, vector3 *org) { int i; int ti; - double tf; std::string token; //string str; char *ptr; diff --git a/Float3d.cpp b/Float3d.cpp index 2f82507e..e2f37d7c 100644 --- a/Float3d.cpp +++ b/Float3d.cpp @@ -9,9 +9,28 @@ http://mozilla.org/MPL/2.0/. #include "stdafx.h" #include "float3d.h" +#include "sn_utils.h" //--------------------------------------------------------------------------- +void float4x4::deserialize_float32(std::istream &s) +{ + for (size_t i = 0; i < 16; i++) + e[i] = sn_utils::ld_float32(s); +} + +void float4x4::deserialize_float64(std::istream &s) +{ + for (size_t i = 0; i < 16; i++) + e[i] = (float)sn_utils::ld_float64(s); +} + +void float4x4::serialize_float32(std::ostream &s) +{ + for (size_t i = 0; i < 16; i++) + sn_utils::ls_float32(s, e[i]); +} + 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 e9504e94..d6011163 100644 --- a/Float3d.h +++ b/Float3d.h @@ -196,9 +196,12 @@ struct float8 class float4x4 { // macierz transformacji pojedynczej precyzji +public: float e[16]; - public: + void deserialize_float32(std::istream&); + void deserialize_float64(std::istream&); + void serialize_float32(std::ostream&); float4x4(void){}; float4x4(float f[16]) { @@ -292,6 +295,16 @@ inline float4x4 &float4x4::Rotation(double angle, float3 axis) return *this; }; +inline bool operator==(const float4x4& v1, const float4x4& v2) +{ + for (size_t i = 0; i < 16; i++) + { + if (v1.e[i] != v2.e[i]) + return false; + } + return true; +} + inline float4x4 operator*(const float4x4 &m1, const float4x4 &m2) { // iloczyn macierzy float4x4 retVal; diff --git a/Gauge.cpp b/Gauge.cpp index b9870eab..aead0cca 100644 --- a/Gauge.cpp +++ b/Gauge.cpp @@ -60,7 +60,7 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, do { // pÄ™tla po submodelach potomnych i obracanie ich o kÄ…t zależy od // cyfry w (fValue) - if (sm->pName) + if (sm->pName.size()) { // musi mieć niepustÄ… nazwÄ™ if (sm->pName[0] >= '0') if (sm->pName[0] <= '9') @@ -98,7 +98,7 @@ bool TGauge::Load(cParser &Parser, TModel3d *md1, TModel3d *md2, double mul) Init(sm, gt_Digital, val3, val4, val5); else Init(sm, gt_Rotate, val3, val4, val5); - return (md2); // true, gdy podany model zewnÄ™trzny, a w kabinie nie byÅ‚o + return md2 != nullptr; // true, gdy podany model zewnÄ™trzny, a w kabinie nie byÅ‚o }; void TGauge::PermIncValue(double fNewDesired) @@ -176,7 +176,7 @@ void TGauge::Update() if( n.length() > 10 ) { n.erase( 0, n.length() - 10 ); } // also dumb but should work for now do { // pÄ™tla po submodelach potomnych i obracanie ich o kÄ…t zależy od cyfry w (fValue) - if( sm->pName ) { + if( sm->pName.size() ) { // musi mieć niepustÄ… nazwÄ™ if( ( sm->pName[ 0 ] >= '0' ) && ( sm->pName[ 0 ] <= '9' ) ) { diff --git a/Geom.cpp b/Geom.cpp index 9b2d7b02..6f43ea7f 100644 --- a/Geom.cpp +++ b/Geom.cpp @@ -11,7 +11,7 @@ http://mozilla.org/MPL/2.0/. #include "classes.hpp" #include #include -#include "opengl/glut.h" +#include "GL/glut.h" #pragma hdrstop #include "Texture.h" diff --git a/Globals.cpp b/Globals.cpp index 3261bcba..a8e3af98 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -49,17 +49,17 @@ bool Global::bOpenGL_1_5 = false; // czy sÄ… dostÄ™pne funkcje OpenGL 1.5 double Global::fLuminance = 1.0; // jasność Å›wiatÅ‚a do automatycznego zapalania float Global::SunAngle = 0.0f; int Global::iReCompile = 0; // zwiÄ™kszany, gdy trzeba odÅ›wieżyć siatki -GLFWwindow *Global::window; -bool Global::shiftState; -bool Global::ctrlState; int Global::ScreenWidth = 1; int Global::ScreenHeight = 1; float Global::ZoomFactor = 1.0f; float Global::FieldOfView = 45.0f; +GLFWwindow *Global::window; +bool Global::shiftState; +bool Global::ctrlState; int Global::iCameraLast = -1; std::string Global::asRelease = "16.0.1172.482"; std::string Global::asVersion = - "Compilation 2017-01-10, release " + Global::asRelease + "."; // tutaj, bo wysyÅ‚any +"Compilation 2017-01-10, release " + Global::asRelease + "."; // tutaj, bo wysyÅ‚any int Global::iViewMode = 0; // co aktualnie widać: 0-kabina, 1-latanie, 2-sprzÄ™gi, 3-dokumenty int Global::iTextMode = 0; // tryb pracy wyÅ›wietlacza tekstowego int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0, @@ -94,7 +94,7 @@ std::vector Global::FreeCameraInit; std::vector Global::FreeCameraInitAngle; double Global::fFogStart = 1700; double Global::fFogEnd = 2000; -float Global::Background[3] = {0.2, 0.4, 0.33}; +float Global::Background[3] = {0.2f, 0.4f, 0.33f}; GLfloat Global::AtmoColor[] = {0.423f, 0.702f, 1.0f}; GLfloat Global::FogColor[] = {0.6f, 0.7f, 0.8f}; #ifdef EU07_USE_OLD_LIGHTING_MODEL @@ -127,8 +127,8 @@ bool Global::bFreeFly = false; bool Global::bFullScreen = false; bool Global::VSync{ true }; bool Global::bInactivePause = true; // automatyczna pauza, gdy okno nieaktywne -float Global::fMouseXScale = 1.5; -float Global::fMouseYScale = 0.2; +float Global::fMouseXScale = 1.5f; +float Global::fMouseYScale = 0.2f; 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 @@ -495,10 +495,8 @@ void Global::ConfigParse(cParser &Parser) Parser.getTokens(); Parser >> token; -/* + Global::bUseVBO = (token == "yes"); -*/ - Global::bUseVBO = false; // temporarily disabled until render paths are sorted out } else if (token == "feedbackmode") { @@ -967,91 +965,92 @@ void Global::ConfigParse(cParser &Parser) */ } -void Global::InitKeys() { - Keys[ k_IncMainCtrl ] = GLFW_KEY_KP_ADD; - Keys[ k_IncMainCtrlFAST ] = GLFW_KEY_KP_ADD; - Keys[ k_DecMainCtrl ] = GLFW_KEY_KP_SUBTRACT; - Keys[ k_DecMainCtrlFAST ] = GLFW_KEY_KP_SUBTRACT; - Keys[ k_IncScndCtrl ] = GLFW_KEY_KP_DIVIDE; - Keys[ k_IncScndCtrlFAST ] = GLFW_KEY_KP_DIVIDE; - Keys[ k_DecScndCtrl ] = GLFW_KEY_KP_MULTIPLY; - Keys[ k_DecScndCtrlFAST ] = GLFW_KEY_KP_MULTIPLY; +void Global::InitKeys() +{ + Keys[k_IncMainCtrl] = GLFW_KEY_KP_ADD; + Keys[k_IncMainCtrlFAST] = GLFW_KEY_KP_ADD; + Keys[k_DecMainCtrl] = GLFW_KEY_KP_SUBTRACT; + Keys[k_DecMainCtrlFAST] = GLFW_KEY_KP_SUBTRACT; + Keys[k_IncScndCtrl] = GLFW_KEY_KP_DIVIDE; + Keys[k_IncScndCtrlFAST] = GLFW_KEY_KP_DIVIDE; + Keys[k_DecScndCtrl] = GLFW_KEY_KP_MULTIPLY; + Keys[k_DecScndCtrlFAST] = GLFW_KEY_KP_MULTIPLY; - Keys[ k_IncLocalBrakeLevel ] = GLFW_KEY_KP_1; - Keys[ k_DecLocalBrakeLevel ] = GLFW_KEY_KP_7; - Keys[ k_IncBrakeLevel ] = GLFW_KEY_KP_3; - Keys[ k_DecBrakeLevel ] = GLFW_KEY_KP_9; - Keys[ k_Releaser ] = GLFW_KEY_KP_6; - Keys[ k_EmergencyBrake ] = GLFW_KEY_KP_0; - Keys[ k_Brake3 ] = GLFW_KEY_KP_8; - Keys[ k_Brake2 ] = GLFW_KEY_KP_5; - Keys[ k_Brake1 ] = GLFW_KEY_KP_2; - Keys[ k_Brake0 ] = GLFW_KEY_KP_4; - Keys[ k_WaveBrake ] = GLFW_KEY_KP_DECIMAL; + Keys[k_IncLocalBrakeLevel] = GLFW_KEY_KP_1; + Keys[k_DecLocalBrakeLevel] = GLFW_KEY_KP_7; + Keys[k_IncBrakeLevel] = GLFW_KEY_KP_3; + Keys[k_DecBrakeLevel] = GLFW_KEY_KP_9; + Keys[k_Releaser] = GLFW_KEY_KP_6; + Keys[k_EmergencyBrake] = GLFW_KEY_KP_0; + Keys[k_Brake3] = GLFW_KEY_KP_8; + Keys[k_Brake2] = GLFW_KEY_KP_5; + Keys[k_Brake1] = GLFW_KEY_KP_2; + Keys[k_Brake0] = GLFW_KEY_KP_4; + Keys[k_WaveBrake] = GLFW_KEY_KP_DECIMAL; - Keys[ k_AntiSlipping ] = GLFW_KEY_KP_ENTER; - Keys[ k_Sand ] = 'S'; - Keys[ k_Main ] = 'M'; - Keys[ k_Active ] = 'W'; - Keys[ k_Battery ] = 'J'; - Keys[ k_DirectionForward ] = 'D'; - Keys[ k_DirectionBackward ] = 'R'; - Keys[ k_Fuse ] = 'N'; - Keys[ k_Compressor ] = 'C'; - Keys[ k_Converter ] = 'X'; - Keys[ k_MaxCurrent ] = 'F'; - Keys[ k_CurrentAutoRelay ] = 'G'; - Keys[ k_BrakeProfile ] = 'B'; - Keys[ k_CurrentNext ] = 'Z'; + Keys[k_AntiSlipping] = GLFW_KEY_KP_ENTER; + Keys[k_Sand] = 'S'; + Keys[k_Main] = 'M'; + Keys[k_Active] = 'W'; + Keys[k_Battery] = 'J'; + Keys[k_DirectionForward] = 'D'; + Keys[k_DirectionBackward] = 'R'; + Keys[k_Fuse] = 'N'; + Keys[k_Compressor] = 'C'; + Keys[k_Converter] = 'X'; + Keys[k_MaxCurrent] = 'F'; + Keys[k_CurrentAutoRelay] = 'G'; + Keys[k_BrakeProfile] = 'B'; + Keys[k_CurrentNext] = 'Z'; - Keys[ k_Czuwak ] = ' '; - Keys[ k_Horn ] = 'A'; - Keys[ k_Horn2 ] = 'A'; + Keys[k_Czuwak] = ' '; + Keys[k_Horn] = 'A'; + Keys[k_Horn2] = 'A'; - Keys[ k_FailedEngineCutOff ] = 'E'; + Keys[k_FailedEngineCutOff] = 'E'; - Keys[ k_MechUp ] = GLFW_KEY_PAGE_UP; - Keys[ k_MechDown ] = GLFW_KEY_PAGE_DOWN; - Keys[ k_MechLeft ] = GLFW_KEY_LEFT; - Keys[ k_MechRight ] = GLFW_KEY_RIGHT; - Keys[ k_MechForward ] = GLFW_KEY_UP; - Keys[ k_MechBackward ] = GLFW_KEY_DOWN; + Keys[k_MechUp] = GLFW_KEY_PAGE_UP; + Keys[k_MechDown] = GLFW_KEY_PAGE_DOWN; + Keys[k_MechLeft] = GLFW_KEY_LEFT; + Keys[k_MechRight] = GLFW_KEY_RIGHT; + Keys[k_MechForward] = GLFW_KEY_UP; + Keys[k_MechBackward] = GLFW_KEY_DOWN; - Keys[ k_CabForward ] = GLFW_KEY_HOME; - Keys[ k_CabBackward ] = GLFW_KEY_END; + Keys[k_CabForward] = GLFW_KEY_HOME; + Keys[k_CabBackward] = GLFW_KEY_END; - Keys[ k_Couple ] = GLFW_KEY_INSERT; - Keys[ k_DeCouple ] = GLFW_KEY_DELETE; + Keys[k_Couple] = GLFW_KEY_INSERT; + Keys[k_DeCouple] = GLFW_KEY_DELETE; - Keys[ k_ProgramQuit ] = GLFW_KEY_F10; - Keys[ k_ProgramHelp ] = GLFW_KEY_F1; - Keys[ k_WalkMode ] = GLFW_KEY_F5; + Keys[k_ProgramQuit] = GLFW_KEY_F10; + Keys[k_ProgramHelp] = GLFW_KEY_F1; + Keys[k_WalkMode] = GLFW_KEY_F5; - Keys[ k_OpenLeft ] = ','; - Keys[ k_OpenRight ] = '.'; - Keys[ k_CloseLeft ] = ','; - Keys[ k_CloseRight ] = '.'; - Keys[ k_DepartureSignal ] = '/'; + Keys[k_OpenLeft] = ','; + Keys[k_OpenRight] = '.'; + Keys[k_CloseLeft] = ','; + Keys[k_CloseRight] = '.'; + Keys[k_DepartureSignal] = '/'; // Winger 160204 - obsluga pantografow - Keys[ k_PantFrontUp ] = 'P'; // Ra: zamieniony przedni z tylnym - Keys[ k_PantFrontDown ] = 'P'; - Keys[ k_PantRearUp ] = 'O'; - Keys[ k_PantRearDown ] = 'O'; + Keys[k_PantFrontUp] = 'P'; // Ra: zamieniony przedni z tylnym + Keys[k_PantFrontDown] = 'P'; + Keys[k_PantRearUp] = 'O'; + Keys[k_PantRearDown] = 'O'; // Winger 020304 - ogrzewanie - Keys[ k_Heating ] = 'H'; - Keys[ k_LeftSign ] = 'Y'; - Keys[ k_UpperSign ] = 'U'; - Keys[ k_RightSign ] = 'I'; - Keys[ k_EndSign ] = 'T'; + Keys[k_Heating] = 'H'; + Keys[k_LeftSign] = 'Y'; + Keys[k_UpperSign] = 'U'; + Keys[k_RightSign] = 'I'; + Keys[k_EndSign] = 'T'; - Keys[ k_SmallCompressor ] = 'V'; - Keys[ k_StLinOff ] = 'L'; + Keys[k_SmallCompressor] = 'V'; + Keys[k_StLinOff] = 'L'; // ABu 090305 - przyciski uniwersalne, do roznych bajerow :) - Keys[ k_Univ1 ] = '['; - Keys[ k_Univ2 ] = ']'; - Keys[ k_Univ3 ] = ';'; - Keys[ k_Univ4 ] = '\''; + Keys[k_Univ1] = '['; + Keys[k_Univ2] = ']'; + Keys[k_Univ3] = ';'; + Keys[k_Univ4] = '\''; } /* diff --git a/Globals.h b/Globals.h index 51724f38..1fdb847e 100644 --- a/Globals.h +++ b/Globals.h @@ -12,8 +12,8 @@ http://mozilla.org/MPL/2.0/. #include #include #include "renderer.h" -#include "gl/glew.h" #include "glfw/glfw3.h" +#include "gl/glew.h" #include "dumb3d.h" // definicje klawiszy @@ -264,9 +264,9 @@ class Global static double fLuminance; // jasność Å›wiatÅ‚a do automatycznego zapalania static float SunAngle; // angle of the sun relative to horizon static int iMultiplayer; // blokada dziaÅ‚ania niektórych eventów na rzecz kominikacji - static GLFWwindow *window; - static bool shiftState; //m7todo: brzydko - static bool ctrlState; + static GLFWwindow *window; + static bool shiftState; //m7todo: brzydko + static bool ctrlState; static int ScreenWidth; // current window dimensions. TODO: move it to renderer static int ScreenHeight; static float ZoomFactor; // determines current camera zoom level. TODO: move it to the renderer diff --git a/Ground.cpp b/Ground.cpp index 8ec3fb62..60f19d72 100644 --- a/Ground.cpp +++ b/Ground.cpp @@ -206,8 +206,14 @@ void TGroundNode::InitNormals() } if (Vertices[i].Normal == vector3(0, 0, 0)) Vertices[i].Normal = (n1 + n2) / 2; - if (Vertices[i + 1].Normal == vector3(0, 0, 0)) - Vertices[i + 1].Normal = n2; + if (i + 1 < iNumVerts) + { + if (Vertices[i + 1].Normal == vector3(0, 0, 0)) + Vertices[i + 1].Normal = n2; + } + else + WriteLog("odd number of vertices, normals may be wrong!"); + break; case GL_TRIANGLE_FAN: @@ -289,7 +295,6 @@ void TGroundNode::RenderVBO() (iType != TP_EVLAUNCH)) // McZapkie-070602: nie rysuj odleglych obiektow ale sprawdzaj // wyzwalacz zdarzen return; - int i, a; switch (iType) { case TP_TRACTION: @@ -359,12 +364,11 @@ void TGroundNode::RenderAlphaVBO() return; if (mgn > fSquareRadius) return; - int i, a; #ifdef _PROBLEND if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012 { glDisable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.45); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f + glAlphaFunc(GL_GREATER, 0.45f); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f }; #endif switch (iType) @@ -374,7 +378,7 @@ void TGroundNode::RenderAlphaVBO() { #ifdef _PROBLEND glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.04); + glAlphaFunc(GL_GREATER, 0.04f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); #endif hvTraction->RenderVBO(mgn, iVboPtr); @@ -383,7 +387,7 @@ void TGroundNode::RenderAlphaVBO() case TP_MODEL: #ifdef _PROBLEND glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.04); + glAlphaFunc(GL_GREATER, 0.04f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); #endif Model->RenderAlphaVBO(&pCenter); @@ -411,13 +415,13 @@ void TGroundNode::RenderAlphaVBO() // glEnable(GL_LIGHTING); #ifdef _PROBLEND glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.04); + glAlphaFunc(GL_GREATER, 0.04f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); #endif } #ifdef _PROBLEND glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.04); + glAlphaFunc(GL_GREATER, 0.04f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); #endif return; @@ -427,7 +431,7 @@ void TGroundNode::RenderAlphaVBO() RaRenderVBO(); #ifdef _PROBLEND glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.04); + glAlphaFunc(GL_GREATER, 0.04f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); #endif return; @@ -435,7 +439,7 @@ void TGroundNode::RenderAlphaVBO() } #ifdef _PROBLEND glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.04); + glAlphaFunc(GL_GREATER, 0.04f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); #endif return; @@ -574,7 +578,6 @@ void TGroundNode::RenderDL() // obiektow ale sprawdzaj wyzwalacz // zdarzen return; - int i, a; switch (iType) { case TP_TRACK: @@ -641,7 +644,6 @@ void TGroundNode::RenderAlphaDL() return; if (mgn > fSquareRadius) return; - int i, a; switch (iType) { case TP_TRACTION: @@ -663,7 +665,7 @@ void TGroundNode::RenderAlphaDL() if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012 { glDisable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.45); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f + glAlphaFunc(GL_GREATER, 0.45f); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f }; #endif if (!DisplayListID) //||Global::bReCompile) //Ra: wymuszenie rekompilacji @@ -700,7 +702,7 @@ void TGroundNode::RenderAlphaDL() if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012 { glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.04); + glAlphaFunc(GL_GREATER, 0.04f); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }; #endif @@ -969,7 +971,7 @@ void TSubRect::Sort() */ //... // przeglÄ…danie listy i tworzenie obiektów renderujÄ…cych dla danej tekstury - GLuint t = 0; // pomocniczy kod tekstury + int t = 0; // pomocniczy kod tekstury n1 = nMeshed; // lista obiektów przetwarzanych na statyczne siatki while (n1) { // dla każdej tekstury powinny istnieć co najmniej dwa obiekty, ale dla DL nie ma to znaczenia @@ -994,7 +996,6 @@ void TSubRect::Sort() TTrack * TSubRect::FindTrack(vector3 *Point, int &iConnection, TTrack *Exclude) { // szukanie toru, którego koniec jest najbliższy (*Point) - TTrack *Track; for (int i = 0; i < iTracks; ++i) if (tTracks[i] != Exclude) // można użyć tabelÄ™ torów, bo jest mniejsza { @@ -1031,7 +1032,7 @@ void TSubRect::RaAnimate() return; // nie ma nic do animowania if (Global::bUseVBO) { // odÅ›wieżenie VBO sektora - if (true == GLEW_VERSION_1_5) // modyfikacje VBO sÄ… dostÄ™pne od OpenGL 1.5 + if (GLEW_VERSION_1_5) // modyfikacje VBO sÄ… dostÄ™pne od OpenGL 1.5 glBindBuffer(GL_ARRAY_BUFFER, m_nVBOVertices); else // dla OpenGL 1.4 z GL_ARB_vertex_buffer_object odÅ›wieżenie caÅ‚ego sektora Release(); // opróżnienie VBO sektora, aby siÄ™ odÅ›wieżyÅ‚ z nowymi ustawieniami @@ -1592,16 +1593,15 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) { // wczytanie wpisu typu "node" // parser->LoadTraction=Global::bLoadTraction; //Ra: tu nie potrzeba powtarzać string str, str1, str2, str3, str4, Skin, DriverType, asNodeName; - int nv, ti, i, n; - double tf, r, rmin, tf1, tf2, tf3, tf4, l, dist, mgn; - int int1, int2; - bool bError = false, curve; + int nv, i; + double tf, r, rmin, tf1, tf3; + int int1; + size_t int2; + bool bError = false; vector3 pt, front, up, left, pos, tv; matrix4x4 mat2, mat1, mat; - GLuint TexID; TGroundNode *tmp1; TTrack *Track; - TTextSound *tmpsound; std::string token; parser->getTokens(2); *parser >> r >> rmin; @@ -1612,7 +1612,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) *parser >> token; str = token; //str = AnsiString(token.c_str()); - TGroundNode *tmp, *tmp2; + TGroundNode *tmp; tmp = new TGroundNode(); tmp->asName = (asNodeName == "none" ? string("") : asNodeName); if (r >= 0) @@ -1674,10 +1674,10 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) parser->getTokens(3); *parser >> tmp->hvTraction->NominalVoltage >> tmp->hvTraction->MaxCurrent >> tmp->hvTraction->fResistivity; - if (tmp->hvTraction->fResistivity == 0.01) // tyle jest w sceneriach [om/km] - tmp->hvTraction->fResistivity = 0.075; // taka sensowniejsza wartość za + if (tmp->hvTraction->fResistivity == 0.01f) // tyle jest w sceneriach [om/km] + tmp->hvTraction->fResistivity = 0.075f; // taka sensowniejsza wartość za // http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf - tmp->hvTraction->fResistivity *= 0.001; // teraz [om/m] + tmp->hvTraction->fResistivity *= 0.001f; // teraz [om/m] parser->getTokens(); *parser >> token; // Ra 2014-02: a tutaj damy symbol sieci i jej budowÄ™, np.: @@ -1830,7 +1830,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) *parser >> token; str = token; //str = AnsiString(token.c_str()); - tmp->tsStaticSound = new TTextSound(str, sqrt(tmp->fSquareRadius), tmp->pCenter.x, tmp->pCenter.y, tmp->pCenter.z, false, rmin); + tmp->tsStaticSound = new TTextSound(str, sqrt(tmp->fSquareRadius), tmp->pCenter.x, tmp->pCenter.y, tmp->pCenter.z, false, false, rmin); if (rmin < 0.0) rmin = 0.0; // przywrócenie poprawnej wartoÅ›ci, jeÅ›li sÅ‚użyÅ‚a do wyłączenia efektu Dopplera @@ -1860,7 +1860,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) int2 = str4.find("."); // yB: wykorzystuje tutaj zmienna, ktora potem bedzie ladunkiem if (int2 != string::npos) // yB: jesli znalazl kropke, to ja przetwarza jako parametry { - int dlugosc = str4.length(); + size_t dlugosc = str4.length(); int1 = atoi(str4.substr(0, int2).c_str()); // niech sprzegiem bedzie do kropki cos str4 = str4.substr(int2 + 1, dlugosc - int2); } @@ -2243,7 +2243,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) /* nv = i; */ - nv = TempVerts.size(); + nv = (int)TempVerts.size(); tmp->Init(nv); // utworzenie tablicy wierzchoÅ‚ków tmp->pCenter /= (nv > 0 ? nv : 1); @@ -2544,9 +2544,6 @@ bool TGround::Init(std::string File) int OriginStackTop = 0; vector3 OriginStack[OriginStackMaxDepth]; // stos zagnieżdżenia origin - double tf; - int ParamCount, ParamPos; - // ABu: Jezeli nie ma definicji w scenerii to ustawiane ponizsze wartosci: hh = 10; // godzina startu mm = 30; // minuty startu @@ -3351,7 +3348,7 @@ void TGround::InitTracks() TGroundNode *Current, *Model; TTrack *tmp; // znaleziony tor TTrack *Track; - int iConnection, state; + int iConnection; string name; // tracks=tracksfar=0; for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext) @@ -3770,7 +3767,7 @@ bool TGround::InitLaunchers() { TGroundNode *Current, *tmp; TEventLauncher *EventLauncher; - int i; + for (Current = nRootOfType[TP_EVLAUNCH]; Current; Current = Current->nNext) { EventLauncher = Current->EvLaunch; @@ -3797,8 +3794,6 @@ bool TGround::InitLaunchers() TTrack * TGround::FindTrack(vector3 Point, int &iConnection, TGroundNode *Exclude) { // wyszukiwanie innego toru koÅ„czÄ…cego siÄ™ w (Point) - TTrack *Track; - TGroundNode *Current; TTrack *tmp; iConnection = -1; TSubRect *sr; @@ -3845,8 +3840,6 @@ TTrack * TGround::FindTrack(vector3 Point, int &iConnection, TGroundNode *Exclud TTraction * TGround::FindTraction(vector3 *Point, int &iConnection, TGroundNode *Exclude) { // wyszukiwanie innego przÄ™sÅ‚a koÅ„czÄ…cego siÄ™ w (Point) - TTraction *Traction; - TGroundNode *Current; TTraction *tmp; iConnection = -1; TSubRect *sr; @@ -4314,7 +4307,7 @@ bool TGround::CheckQuery() for (i = 0; i < 8; ++i) { // dodawane do kolejki w kolejnoÅ›ci zapisania if (tmpEvent->Params[i].asEvent) - if (bCondition != bool(tmpEvent->iFlags & (conditional_else << i))) + if (bCondition != (((tmpEvent->iFlags & (conditional_else << i)) != 0))) { if (tmpEvent->Params[i].asEvent != tmpEvent) AddToQuery(tmpEvent->Params[i].asEvent, @@ -4856,11 +4849,10 @@ TGround::Render( Math3D::vector3 const &Camera ) { bool TGround::RenderDL(vector3 pPosition) { // renderowanie scenerii z Display List - faza nieprzezroczystych glDisable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.45); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f + glAlphaFunc(GL_GREATER, 0.45f); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f ++TGroundRect::iFrameNumber; // zwiÄ™szenie licznika ramek (do usuwniania nadanimacji) CameraDirection.x = sin(Global::pCameraRotation); // wektor kierunkowy CameraDirection.z = cos(Global::pCameraRotation); - int tr, tc; TGroundNode *node; glColor3f(1.0f, 1.0f, 1.0f); glEnable(GL_LIGHTING); @@ -4917,7 +4909,7 @@ bool TGround::RenderDL(vector3 pPosition) bool TGround::RenderAlphaDL(vector3 pPosition) { // renderowanie scenerii z Display List - faza przezroczystych glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.04); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f + glAlphaFunc(GL_GREATER, 0.04f); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f TGroundNode *node; glColor4f(1.0f, 1.0f, 1.0f, 1.0f); TSubRect *tmp; @@ -4946,11 +4938,10 @@ bool TGround::RenderAlphaDL(vector3 pPosition) bool TGround::RenderVBO(vector3 pPosition) { // renderowanie scenerii z VBO - faza nieprzezroczystych glDisable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.45); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f + glAlphaFunc(GL_GREATER, 0.45f); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f ++TGroundRect::iFrameNumber; // zwiÄ™szenie licznika ramek CameraDirection.x = sin(Global::pCameraRotation); // wektor kierunkowy CameraDirection.z = cos(Global::pCameraRotation); - int tr, tc; TGroundNode *node; glColor3f(1.0f, 1.0f, 1.0f); glEnable(GL_LIGHTING); @@ -5014,7 +5005,7 @@ bool TGround::RenderVBO(vector3 pPosition) bool TGround::RenderAlphaVBO(vector3 pPosition) { // renderowanie scenerii z VBO - faza przezroczystych glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.04); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f + glAlphaFunc(GL_GREATER, 0.04f); // im mniejsza wartość, tym wiÄ™ksza ramka, domyÅ›lnie 0.1f TGroundNode *node; glColor4f(1.0f, 1.0f, 1.0f, 1.0f); TSubRect *tmp; @@ -5062,14 +5053,14 @@ void TGround::WyslijEvent(const std::string &e, const std::string &d) DaneRozkaz r; r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' ); r.iComm = 2; // 2 - event - int i = e.length(), j = d.length(); + size_t i = e.length(), j = d.length(); r.cString[0] = char(i); strcpy(r.cString + 1, e.c_str()); // zakoÅ„czony zerem r.cString[i + 2] = char(j); // licznik po zerze koÅ„czÄ…cym strcpy(r.cString + 3 + i, d.c_str()); // zakoÅ„czony zerem COPYDATASTRUCT cData; cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura - cData.cbData = 12 + i + j; // 8+dwa liczniki i dwa zera koÅ„czÄ…ce + cData.cbData = (DWORD)(12 + i + j); // 8+dwa liczniki i dwa zera koÅ„czÄ…ce cData.lpData = &r; Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData ); CommLog( Now() + " " + std::to_string(r.iComm) + " " + e + " sent" ); @@ -5080,13 +5071,13 @@ void TGround::WyslijUszkodzenia(const std::string &t, char fl) DaneRozkaz r; r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' ); r.iComm = 13; // numer komunikatu - int i = t.length(); + size_t i = t.length(); r.cString[0] = char(fl); r.cString[1] = char(i); strcpy(r.cString + 2, t.c_str()); // z zerem koÅ„czÄ…cym COPYDATASTRUCT cData; cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura - cData.cbData = 11 + i; // 8+licznik i zero koÅ„czÄ…ce + cData.cbData = (DWORD)(11 + i); // 8+licznik i zero koÅ„czÄ…ce cData.lpData = &r; Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData ); CommLog( Now() + " " + std::to_string(r.iComm) + " " + t + " sent"); @@ -5097,12 +5088,12 @@ void TGround::WyslijString(const std::string &t, int n) DaneRozkaz r; r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' ); r.iComm = n; // numer komunikatu - int i = t.length(); + size_t i = t.length(); r.cString[0] = char(i); strcpy(r.cString + 1, t.c_str()); // z zerem koÅ„czÄ…cym COPYDATASTRUCT cData; - cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura - cData.cbData = 10 + i; // 8+licznik i zero koÅ„czÄ…ce + cData.dwData = 'EU07'; // sygnatura + cData.cbData = (DWORD)(10 + i); // 8+licznik i zero koÅ„czÄ…ce cData.lpData = &r; Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData ); CommLog( Now() + " " + std::to_string(r.iComm) + " " + t + " sent"); @@ -5119,7 +5110,8 @@ void TGround::WyslijNamiary(TGroundNode *t) DaneRozkaz r; r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' ); r.iComm = 7; // 7 - dane pojazdu - int i = 32, j = t->asName.length(); + int i = 32; + size_t j = t->asName.length(); r.iPar[0] = i; // ilość danych liczbowych r.fPar[1] = Global::fTimeAngleDeg / 360.0; // aktualny czas (1.0=doba) r.fPar[2] = t->DynamicObject->MoverParameters->Loc.X; // pozycja X @@ -5179,8 +5171,8 @@ void TGround::WyslijNamiary(TGroundNode *t) r.cString[i] = char(j); // na koÅ„cu nazwa, żeby jakoÅ› zidentyfikować strcpy(r.cString + i + 1, t->asName.c_str()); // zakoÅ„czony zerem COPYDATASTRUCT cData; - cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura - cData.cbData = 10 + i + j; // 8+licznik i zero koÅ„czÄ…ce + cData.dwData = 'EU07'; // sygnatura + cData.cbData = (DWORD)(10 + i + j); // 8+licznik i zero koÅ„czÄ…ce cData.lpData = &r; // WriteLog("Ramka gotowa"); Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData ); @@ -5280,7 +5272,7 @@ TDynamicObject * TGround::DynamicNearest(vector3 pPosition, double distance, boo TDynamicObject *dyn = NULL; int c = GetColFromX(pPosition.x); int r = GetRowFromZ(pPosition.z); - int i, j, k; + int i, j; double sqm = distance * distance, sqd; // maksymalny promien poszukiwaÅ„ do kwadratu for (j = r - 1; j <= r + 1; j++) // plus dwa zewnÄ™trzne sektory, łącznie 9 for (i = c - 1; i <= c + 1; i++) @@ -5318,7 +5310,7 @@ TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, boo TDynamicObject *dyn = NULL; int c = GetColFromX(pPosition.x); int r = GetRowFromZ(pPosition.z); - int i, j, k; + int i, j; double sqm = distance * distance, sqd; // maksymalny promien poszukiwaÅ„ do kwadratu for (j = r - 1; j <= r + 1; j++) // plus dwa zewnÄ™trzne sektory, łącznie 9 for (i = c - 1; i <= c + 1; i++) @@ -5418,7 +5410,6 @@ void TGround::TerrainWrite() // chyba że dla danej tekstury wychodzi tylko jeden submodel. TModel3d *m = new TModel3d(); // wirtualny model roboczy z oddzielnymi submodelami TSubModel *sk; // wskaźnik roboczy na submodel kwadratu - TSubModel *st; // wskaźnik roboczy na submodel tekstury // Zliczamy kwadraty z trójkÄ…tami, ilość tekstur oraz wierzchoÅ‚ków. // Ilość kwadratów i ilość tekstur okreÅ›li ilość submodeli. // int sub=0; //caÅ‚kowita ilość submodeli @@ -5497,7 +5488,6 @@ void TGround::TerrainWrite() void TGround::TrackBusyList() { // wysÅ‚anie informacji o wszystkich zajÄ™tych odcinkach TGroundNode *Current; - TTrack *Track; for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext) if (!Current->asName.empty()) // musi być nazwa #ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY @@ -5538,13 +5528,12 @@ void TGround::IsolatedBusy(const std::string t) void TGround::Silence(vector3 gdzie) { // wyciszenie wszystkiego w sektorach przed przeniesieniem kamery z (gdzie) - int tr, tc; TGroundNode *node; int n = 2 * iNumSubRects; //(2*==2km) promieÅ„ wyÅ›wietlanej mapy w sektorach int c = GetColFromX(gdzie.x); // sektory wg dotychczasowej pozycji kamery int r = GetRowFromZ(gdzie.z); TSubRect *tmp; - int i, j, k; + int i, j; // renderowanie czoÅ‚gowe dla obiektów aktywnych a niewidocznych for (j = r - n; j <= r + n; j++) for (i = c - n; i <= c + n; i++) diff --git a/Ground.h b/Ground.h index 0bcc7522..57fa0d82 100644 --- a/Ground.h +++ b/Ground.h @@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/. #pragma once #include -#include "gl/glew.h" +#include "GL/glew.h" #include "VBO.h" #include "Classes.h" #include "ResourceManager.h" @@ -398,11 +398,11 @@ class TGround TSubRect * FastGetSubRect(int iCol, int iRow); int GetRowFromZ(double z) { - return (z / fSubRectSize + fHalfTotalNumSubRects); + return (int)(z / fSubRectSize + fHalfTotalNumSubRects); }; int GetColFromX(double x) { - return (x / fSubRectSize + fHalfTotalNumSubRects); + return (int)(x / fSubRectSize + fHalfTotalNumSubRects); }; TEvent * FindEvent(const std::string &asEventName); TEvent * FindEventScan(const std::string &asEventName); diff --git a/Logs.cpp b/Logs.cpp index 563003b0..eff68c90 100644 --- a/Logs.cpp +++ b/Logs.cpp @@ -24,7 +24,7 @@ void WriteConsoleOnly(const char *str, double value) sprintf(buf, "%s %f \n", str, value); // stdout= GetStdHandle(STD_OUTPUT_HANDLE); DWORD wr = 0; - WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), buf, strlen(buf), &wr, NULL); + WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), buf, (DWORD)strlen(buf), &wr, NULL); // WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),endstring,strlen(endstring),&wr,NULL); } @@ -34,9 +34,9 @@ void WriteConsoleOnly(const char *str, bool newline) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY); DWORD wr = 0; - WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), str, strlen(str), &wr, NULL); + WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), str, (DWORD)strlen(str), &wr, NULL); if (newline) - WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), endstring, strlen(endstring), &wr, NULL); + WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), endstring, (DWORD)strlen(endstring), &wr, NULL); } void WriteLog(const char *str, double value) diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 42fe6ed5..eb65d3c8 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -5488,7 +5488,7 @@ std::vector x; // ************************************************************************************************* // Q: 20160717 // ************************************************************************************************* -int Pos(std::string str_find, std::string in) +size_t Pos(std::string str_find, std::string in) { size_t pos = in.find(str_find); return (pos != std::string::npos ? pos+1 : 0); diff --git a/Model3d.cpp b/Model3d.cpp index ef1b0704..c8fcb269 100644 --- a/Model3d.cpp +++ b/Model3d.cpp @@ -7,8 +7,8 @@ obtain one at http://mozilla.org/MPL/2.0/. */ /* - MaSzyna EU07 locomotive simulator - Copyright (C) 2001-2004 Marcin Wozniak, Maciej Czapkiewicz and others +MaSzyna EU07 locomotive simulator +Copyright (C) 2001-2004 Marcin Wozniak, Maciej Czapkiewicz and others */ @@ -22,12 +22,13 @@ http://mozilla.org/MPL/2.0/. #include "renderer.h" #include "Timer.h" #include "mtable.h" +#include "sn_utils.h" //--------------------------------------------------------------------------- using namespace Mtable; double TSubModel::fSquareDist = 0; -int TSubModel::iInstance; // numer renderowanego egzemplarza obiektu +size_t TSubModel::iInstance; // numer renderowanego egzemplarza obiektu texture_manager::size_type *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 @@ -41,177 +42,134 @@ std::string *TSubModel::pasText; // 0x3F3F003F - wszystkie wymienne tekstury używane w danym cyklu // Ale w TModel3d okerÅ›la przezroczystość tekstur wymiennych! -int TSubModelInfo::iTotalTransforms = 0; // ilość transformów -int TSubModelInfo::iTotalNames = 0; // dÅ‚ugość obszaru nazw -int TSubModelInfo::iTotalTextures = 0; // dÅ‚ugość obszaru tekstur -int TSubModelInfo::iCurrent = 0; // aktualny obiekt -TSubModelInfo *TSubModelInfo::pTable = NULL; // tabele obiektów pomocniczych - -char *TStringPack::String(int n) -{ // zwraca wskaźnik do Å‚aÅ„cucha o podanym numerze - if (index ? n < (index[1] >> 2) - 2 : false) - return data + 8 + index[n + 2]; // indeks upraszcza kwestiÄ™ wyszukiwania - // jak nie ma indeksu, to trzeba szukać - int max = *((int *)(data + 4)); // dÅ‚ugość obszaru Å‚aÅ„cuchów - char *ptr = data + 8; // poczÄ…ek obszaru Å‚aÅ„cuchów - for (int i = 0; i < n; ++i) - { // wyszukiwanie Å‚aÅ„cuchów nie jest zbyt optymalne, ale nie musi być - while (*ptr) - ++ptr; // wyszukiwanie zera - ++ptr; // pominiÄ™cie zera - if (ptr > data + max) - return NULL; // zbyt wysoki numer - } - return ptr; -}; - TSubModel::TSubModel() { - ZeroMemory(this, sizeof(TSubModel)); // istotne przy zapisywaniu wersji binarnej - FirstInit(); + ZeroMemory(this, sizeof(TSubModel)); // istotne przy zapisywaniu wersji binarnej + FirstInit(); }; void TSubModel::FirstInit() { - eType = TP_ROTATOR; - Vertices = NULL; - uiDisplayList = 0; - iNumVerts = -1; // do sprawdzenia - iVboPtr = -1; - fLight = -1.0; //Å›wietcenie wyłączone - v_RotateAxis = float3(0, 0, 0); - v_TransVector = float3(0, 0, 0); - f_Angle = 0; - b_Anim = at_None; - b_aAnim = at_None; - fVisible = 0.0; // zawsze widoczne - iVisible = 1; - fMatrix = NULL; // to samo co iMatrix=0; - Next = NULL; - Child = NULL; - TextureID = 0; - // TexAlpha=false; - iFlags = 0x0200; // bit 9=1: submodel zostaÅ‚ utworzony a nie ustawiony na - // wczytany plik - // TexHash=false; - // Hits=NULL; - // CollisionPts=NULL; - // CollisionPtsCount=0; - Opacity = 1.0; // przy wczytywaniu modeli byÅ‚o dzielone przez 100... - bWire = false; - fWireSize = 0; - fNearAttenStart = 40; - fNearAttenEnd = 80; - bUseNearAtten = false; - iFarAttenDecay = 0; - fFarDecayRadius = 100; - fCosFalloffAngle = 0.5; // 120°? - fCosHotspotAngle = 0.3; // 145°? - fCosViewAngle = 0; - fSquareMaxDist = 10000 * 10000; // 10km - fSquareMinDist = 0; - iName = -1; // brak nazwy - iTexture = 0; // brak tekstury - // asName=""; - // asTexture=""; - pName = pTexture = NULL; - f4Ambient[0] = f4Ambient[1] = f4Ambient[2] = f4Ambient[3] = 1.0; //{1,1,1,1}; - f4Diffuse[0] = f4Diffuse[1] = f4Diffuse[2] = f4Diffuse[3] = 1.0; //{1,1,1,1}; - f4Specular[0] = f4Specular[1] = f4Specular[2] = 0.0; - f4Specular[3] = 1.0; //{0,0,0,1}; - f4Emision[0] = f4Emision[1] = f4Emision[2] = f4Emision[3] = 1.0; - smLetter = NULL; // używany tylko roboczo dla TP_TEXT, do przyspieszenia wyÅ›wietlania + eType = TP_ROTATOR; + Vertices = NULL; + uiDisplayList = 0; + iNumVerts = -1; // do sprawdzenia + iVboPtr = -1; + fLight = -1.0; //Å›wietcenie wyłączone + v_RotateAxis = float3(0, 0, 0); + v_TransVector = float3(0, 0, 0); + f_Angle = 0; + b_Anim = at_None; + b_aAnim = at_None; + fVisible = 0.0; // zawsze widoczne + iVisible = 1; + fMatrix = NULL; // to samo co iMatrix=0; + Next = NULL; + Child = NULL; + TextureID = 0; + // TexAlpha=false; + iFlags = 0x0200; // bit 9=1: submodel zostaÅ‚ utworzony a nie ustawiony na + // wczytany plik + // TexHash=false; + // Hits=NULL; + // CollisionPts=NULL; + // CollisionPtsCount=0; + Opacity = 1.0; // przy wczytywaniu modeli byÅ‚o dzielone przez 100... + bWire = false; + fWireSize = 0; + fNearAttenStart = 40; + fNearAttenEnd = 80; + bUseNearAtten = false; + iFarAttenDecay = 0; + fFarDecayRadius = 100.0f; + fCosFalloffAngle = 0.5f; // 120°? + fCosHotspotAngle = 0.3f; // 145°? + fCosViewAngle = 0; + fSquareMaxDist = 10000 * 10000; // 10km + fSquareMinDist = 0; + iName = -1; // brak nazwy + iTexture = 0; // brak tekstury + // asName=""; + // asTexture=""; + pName = ""; + pTexture = ""; + f4Ambient[0] = f4Ambient[1] = f4Ambient[2] = f4Ambient[3] = 1.0; //{1,1,1,1}; + f4Diffuse[0] = f4Diffuse[1] = f4Diffuse[2] = f4Diffuse[3] = 1.0; //{1,1,1,1}; + f4Specular[0] = f4Specular[1] = f4Specular[2] = 0.0; + f4Specular[3] = 1.0; //{0,0,0,1}; + f4Emision[0] = f4Emision[1] = f4Emision[2] = f4Emision[3] = 1.0; + smLetter = NULL; // używany tylko roboczo dla TP_TEXT, do przyspieszenia wyÅ›wietlania }; TSubModel::~TSubModel() { - if (uiDisplayList) - glDeleteLists(uiDisplayList, 1); - if (iFlags & 0x0200) - { // wczytany z pliku tekstowego musi sam posprzÄ…tać - // SafeDeleteArray(Indices); - SafeDelete(Next); - SafeDelete(Child); - delete fMatrix; // wÅ‚asny transform trzeba usunąć (zawsze jeden) - delete[] Vertices; - delete[] pTexture; - delete[] pName; - } - /* - else - {//wczytano z pliku binarnego (nie jest wÅ‚aÅ›cicielem tablic) - } - */ - delete[] smLetter; // używany tylko roboczo dla TP_TEXT, do przyspieszenia - // wyÅ›wietlania + if (uiDisplayList) + glDeleteLists(uiDisplayList, 1); + if (iFlags & 0x0200) + { // wczytany z pliku tekstowego musi sam posprzÄ…tać + // SafeDeleteArray(Indices); + SafeDelete(Next); + SafeDelete(Child); + delete fMatrix; // wÅ‚asny transform trzeba usunąć (zawsze jeden) + delete[] Vertices; + } + /* + else + {//wczytano z pliku binarnego (nie jest wÅ‚aÅ›cicielem tablic) + } + */ + delete[] smLetter; // używany tylko roboczo dla TP_TEXT, do przyspieszenia + // wyÅ›wietlania }; void TSubModel::TextureNameSet(const char *n) { // ustawienie nazwy submodelu, o - // ile nie jest wczytany z E3D - if (iFlags & 0x0200) - { // tylko jeżeli submodel zosta utworzony przez new - delete[] pTexture; // usuniÄ™cie poprzedniej - int i = strlen(n); - if (i) - { // utworzenie nowej - pTexture = new char[i + 1]; - strcpy(pTexture, n); - } - else - pTexture = NULL; - } + // ile nie jest wczytany z E3D + if (iFlags & 0x0200) + { // tylko jeżeli submodel zosta utworzony przez new + pTexture = std::string(n); + } }; void TSubModel::NameSet(const char *n) { // ustawienie nazwy submodelu, o ile - // nie jest wczytany z E3D - if (iFlags & 0x0200) - { // tylko jeżeli submodel zosta utworzony przez new - delete[] pName; // usuniÄ™cie poprzedniej - int i = strlen(n); - if (i) - { // utworzenie nowej - pName = new char[i + 1]; - strcpy(pName, n); - } - else - pName = NULL; - } + // nie jest wczytany z E3D + if (iFlags & 0x0200) + pName = std::string(n); }; // int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 // *pt,GLVERTEX // *Vertices) int TSubModel::SeekFaceNormal(unsigned int *Masks, int f, unsigned int dwMask, float3 *pt, - float8 *Vertices) + float8 *Vertices) { // szukanie punktu stycznego - // do (pt), zwraca numer - // wierzchoÅ‚ka, a nie trójkÄ…ta - int iNumFaces = iNumVerts / 3; // bo maska powierzchni jest jedna na trójkÄ…t - // GLVERTEX *p; //roboczy wskaźnik - float8 *p; // roboczy wskaźnik - for (int i = f; i < iNumFaces; ++i) // pÄ™tla po trójkÄ…tach, od trójkÄ…ta (f) - if (Masks[i] & dwMask) // jeÅ›li wspólna maska powierzchni - { - p = Vertices + 3 * i; - if (p->Point == *pt) - return 3 * i; - if ((++p)->Point == *pt) - return 3 * i + 1; - if ((++p)->Point == *pt) - return 3 * i + 2; - } - return -1; // nie znaleziono stycznego wierzchoÅ‚ka + // do (pt), zwraca numer + // wierzchoÅ‚ka, a nie trójkÄ…ta + int iNumFaces = iNumVerts / 3; // bo maska powierzchni jest jedna na trójkÄ…t + // GLVERTEX *p; //roboczy wskaźnik + float8 *p; // roboczy wskaźnik + for (int i = f; i < iNumFaces; ++i) // pÄ™tla po trójkÄ…tach, od trójkÄ…ta (f) + if (Masks[i] & dwMask) // jeÅ›li wspólna maska powierzchni + { + p = Vertices + 3 * i; + if (p->Point == *pt) + return 3 * i; + if ((++p)->Point == *pt) + return 3 * i + 1; + if ((++p)->Point == *pt) + return 3 * i + 2; + } + return -1; // nie znaleziono stycznego wierzchoÅ‚ka } -float emm1[] = {1, 1, 1, 0}; -float emm2[] = {0, 0, 0, 1}; +float emm1[] = { 1, 1, 1, 0 }; +float emm2[] = { 0, 0, 0, 1 }; inline double readIntAsDouble(cParser &parser, int base = 255) { - int value = parser.getToken(false); - return (static_cast(value) / base); + int value = parser.getToken(false); + return (static_cast(value) / base); }; template inline void readColor(cParser &parser, ColorT *color) @@ -226,25 +184,25 @@ template inline void readColor(cParser &parser, ColorT *color) inline void readColor(cParser &parser, int &color) { - int r, g, b, discard; - parser.getTokens(4, false); - parser >> discard >> r >> g >> b; - color = r + (g << 8) + (b << 16); + int r, g, b, discard; + parser.getTokens(4, false); + parser >> discard >> r >> g >> b; + color = r + (g << 8) + (b << 16); }; /* inline void readMatrix(cParser& parser,matrix4x4& 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]); +for (int x=0;x<=3;x++) //wiersze +for (int y=0;y<=3;y++) //kolumny +parser.getToken(matrix(x)[y]); }; */ inline void readMatrix(cParser &parser, float4x4 &matrix) { // Ra: wczytanie transforma - parser.getTokens(16, false); - for (int x = 0; x <= 3; ++x) // wiersze - for (int y = 0; y <= 3; ++y) // kolumny - parser >> 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) @@ -372,8 +330,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) 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 (Opacity > 1.0f) + Opacity *= 0.01f; // 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:")) @@ -433,190 +391,190 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic) else iFlags |= 0x10; - std::string discard; - parser.getTokens(5, false); - parser >> discard >> fSquareMaxDist >> discard >> fSquareMinDist >> discard; + 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; - 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 - unsigned int *sg; // maski przynależnoÅ›ci trójkÄ…tów do powierzchni - if (eType < TP_ROTATOR) - { // wczytywanie wierzchoÅ‚ków - 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); - if (token[0] == '*') - { // jeÅ›li pierwszy znak jest gwiazdkÄ…, poszukać - // submodelu o nazwie bez tej gwiazdki i wziąć z - // niego wierzchoÅ‚ki - Error("Verticles reference not yet supported!"); - } - else - { // normalna lista wierzchoÅ‚ków - iNumVerts = atoi(token.c_str()); - if (iNumVerts % 3) - { - iNumVerts = 0; - Error("Mesh error, (iNumVertices=" + std::to_string(iNumVerts) + ")%3<>0"); - return 0; - } - // Vertices=new GLVERTEX[iNumVerts]; - if (iNumVerts) - { - Vertices = new float8[iNumVerts]; - iNumFaces = iNumVerts / 3; - 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 - int maska = 0; - for (int i = 0; i < iNumVerts; i++) - { // Ra: z konwersjÄ… na ukÅ‚ad scenerii - bÄ™dzie wydajniejsze - // wyÅ›wietlanie - wsp[i] = -1; // wektory normalne nie sÄ… policzone dla tego wierzchoÅ‚ka - if ((i % 3) == 0) - { // jeÅ›li bÄ™dzie maska -1, to dalej bÄ™dÄ… - // wierzchoÅ‚ki z wektorami normalnymi, podanymi - // jawnie - 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.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.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.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 || - Vertices[i - 1].Point == Vertices[i - 2].Point || - Vertices[i - 2].Point == Vertices[i].Point) - { // jeżeli punkty siÄ™ nakÅ‚adajÄ… na siebie - --iNumFaces; // o jeden trójkÄ…t mniej - iNumVerts -= 3; // czyli o 3 wierzchoÅ‚ki - i -= 3; // wczytanie kolejnego w to miejsce - 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ć - if (((Vertices[i].Point - Vertices[i - 1].Point).Length() > 1000.0) || - ((Vertices[i - 1].Point - Vertices[i - 2].Point).Length() > - 1000.0) || - ((Vertices[i - 2].Point - Vertices[i].Point).Length() > 1000.0)) - { // jeżeli sÄ… dalej niż 2km od siebie //Ra 15-01: - // obiekt wstawiany nie powinien być wiÄ™kszy niż - // 300m (trójkÄ…ty terenu w E3D mogÄ… mieć 1.5km) - --iNumFaces; // o jeden trójkÄ…t mniej - iNumVerts -= 3; // czyli o 3 wierzchoÅ‚ki - i -= 3; // wczytanie kolejnego w to miejsce - WriteLog(std::string("Too large triangle ignored in: \"") + pName + - "\""); - } - } - } - int i; // indeks dla trójkÄ…tów - float3 *n = new float3[iNumFaces]; // tablica wektorów normalnych dla trójkÄ…tów - for (i = 0; i < iNumFaces; i++) // pÄ™tla po trójkÄ…tach - bÄ™dzie - // szybciej, jak wstÄ™pnie przeliczymy - // normalne trójkÄ…tów - n[i] = SafeNormalize( - CrossProduct(Vertices[i * 3].Point - Vertices[i * 3 + 1].Point, - Vertices[i * 3].Point - Vertices[i * 3 + 2].Point)); - int v; // indeks dla wierzchoÅ‚ków - int f; // numer trójkÄ…ta stycznego - float3 norm; // roboczy wektor normalny - for (v = 0; v < iNumVerts; v++) - { // pÄ™tla po wierzchoÅ‚kach trójkÄ…tów - if (wsp[v] >= 0) // jeÅ›li już byÅ‚ liczony wektor normalny z użyciem - // tego wierzchoÅ‚ka - Vertices[v].Normal = - Vertices[wsp[v]].Normal; // to wystarczy skopiować policzony wczeÅ›niej - else - { // inaczej musimy dopiero policzyć - i = v / 3; // numer trójkÄ…ta - norm = float3(0, 0, 0); // liczenie zaczynamy od zera - f = v; // zaczynamy dodawanie wektorów normalnych od wÅ‚asnego - while (f >= 0) - { // sumowanie z wektorem normalnym sÄ…siada (włącznie - // ze sobÄ…) - wsp[f] = v; // informacja, że w tym wierzchoÅ‚ku jest już policzony - // wektor normalny - norm += n[f / 3]; - f = SeekFaceNormal(sg, f / 3 + 1, sg[i], &Vertices[v].Point, - Vertices); // i szukanie od kolejnego trójkÄ…ta - } - // Ra 15-01: należaÅ‚o by jeszcze uwzglÄ™dnić skalowanie wprowadzane - // przez transformy, aby normalne po przeskalowaniu byÅ‚y jednostkowe - Vertices[v].Normal = - SafeNormalize(norm); // przepisanie do wierzchoÅ‚ka trójkÄ…ta - } - } - delete[] wsp; - delete[] n; - delete[] sg; - } - else // gdy brak wierzchoÅ‚ków - { - eType = TP_ROTATOR; // submodel pomocniczy, ma tylko macierz przeksztaÅ‚cenia - iVboPtr = iNumVerts = 0; // dla formalnoÅ›ci - } - } // obsÅ‚uga submodelu z wÅ‚asnÄ… listÄ… wierzchoÅ‚ków - } - else if (eType == TP_STARS) - { // punkty Å›wiecÄ…ce dookólnie - skÅ‚adnia jak - // dla smt_Mesh - 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.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 - } - } - // Visible=true; //siÄ™ potem wyłączy w razie potrzeby - // iFlags|=0x0200; //wczytano z pliku tekstowego (jest wÅ‚aÅ›cicielem tablic) - if (iNumVerts < 1) - iFlags &= ~0x3F; // cykl renderowania uzależniony od potomnych - return iNumVerts; // do okreÅ›lenia wielkoÅ›ci VBO + if (fSquareMaxDist >= 0.0) + { + fSquareMaxDist *= fSquareMaxDist; + } + else + { + fSquareMaxDist = 15000 * 15000; + } // 15km to wiÄ™cej, niż siÄ™ obecnie wyÅ›wietla + fSquareMinDist *= fSquareMinDist; + 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 + unsigned int *sg; // maski przynależnoÅ›ci trójkÄ…tów do powierzchni + if (eType < TP_ROTATOR) + { // wczytywanie wierzchoÅ‚ków + 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); + if (token[0] == '*') + { // jeÅ›li pierwszy znak jest gwiazdkÄ…, poszukać + // submodelu o nazwie bez tej gwiazdki i wziąć z + // niego wierzchoÅ‚ki + Error("Verticles reference not yet supported!"); + } + else + { // normalna lista wierzchoÅ‚ków + iNumVerts = atoi(token.c_str()); + if (iNumVerts % 3) + { + iNumVerts = 0; + Error("Mesh error, (iNumVertices=" + std::to_string(iNumVerts) + ")%3<>0"); + return 0; + } + // Vertices=new GLVERTEX[iNumVerts]; + if (iNumVerts) + { + Vertices = new float8[iNumVerts]; + iNumFaces = iNumVerts / 3; + 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 + int maska = 0; + for (int i = 0; i < iNumVerts; i++) + { // Ra: z konwersjÄ… na ukÅ‚ad scenerii - bÄ™dzie wydajniejsze + // wyÅ›wietlanie + wsp[i] = -1; // wektory normalne nie sÄ… policzone dla tego wierzchoÅ‚ka + if ((i % 3) == 0) + { // jeÅ›li bÄ™dzie maska -1, to dalej bÄ™dÄ… + // wierzchoÅ‚ki z wektorami normalnymi, podanymi + // jawnie + 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.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.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.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 || + Vertices[i - 1].Point == Vertices[i - 2].Point || + Vertices[i - 2].Point == Vertices[i].Point) + { // jeżeli punkty siÄ™ nakÅ‚adajÄ… na siebie + --iNumFaces; // o jeden trójkÄ…t mniej + iNumVerts -= 3; // czyli o 3 wierzchoÅ‚ki + i -= 3; // wczytanie kolejnego w to miejsce + 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ć + if (((Vertices[i].Point - Vertices[i - 1].Point).Length() > 1000.0) || + ((Vertices[i - 1].Point - Vertices[i - 2].Point).Length() > + 1000.0) || + ((Vertices[i - 2].Point - Vertices[i].Point).Length() > 1000.0)) + { // jeżeli sÄ… dalej niż 2km od siebie //Ra 15-01: + // obiekt wstawiany nie powinien być wiÄ™kszy niż + // 300m (trójkÄ…ty terenu w E3D mogÄ… mieć 1.5km) + --iNumFaces; // o jeden trójkÄ…t mniej + iNumVerts -= 3; // czyli o 3 wierzchoÅ‚ki + i -= 3; // wczytanie kolejnego w to miejsce + WriteLog(std::string("Too large triangle ignored in: \"") + pName + + "\""); + } + } + } + int i; // indeks dla trójkÄ…tów + float3 *n = new float3[iNumFaces]; // tablica wektorów normalnych dla trójkÄ…tów + for (i = 0; i < iNumFaces; i++) // pÄ™tla po trójkÄ…tach - bÄ™dzie + // szybciej, jak wstÄ™pnie przeliczymy + // normalne trójkÄ…tów + n[i] = SafeNormalize( + CrossProduct(Vertices[i * 3].Point - Vertices[i * 3 + 1].Point, + Vertices[i * 3].Point - Vertices[i * 3 + 2].Point)); + int v; // indeks dla wierzchoÅ‚ków + int f; // numer trójkÄ…ta stycznego + float3 norm; // roboczy wektor normalny + for (v = 0; v < iNumVerts; v++) + { // pÄ™tla po wierzchoÅ‚kach trójkÄ…tów + if (wsp[v] >= 0) // jeÅ›li już byÅ‚ liczony wektor normalny z użyciem + // tego wierzchoÅ‚ka + Vertices[v].Normal = + Vertices[wsp[v]].Normal; // to wystarczy skopiować policzony wczeÅ›niej + else + { // inaczej musimy dopiero policzyć + i = v / 3; // numer trójkÄ…ta + norm = float3(0, 0, 0); // liczenie zaczynamy od zera + f = v; // zaczynamy dodawanie wektorów normalnych od wÅ‚asnego + while (f >= 0) + { // sumowanie z wektorem normalnym sÄ…siada (włącznie + // ze sobÄ…) + wsp[f] = v; // informacja, że w tym wierzchoÅ‚ku jest już policzony + // wektor normalny + norm += n[f / 3]; + f = SeekFaceNormal(sg, f / 3 + 1, sg[i], &Vertices[v].Point, + Vertices); // i szukanie od kolejnego trójkÄ…ta + } + // Ra 15-01: należaÅ‚o by jeszcze uwzglÄ™dnić skalowanie wprowadzane + // przez transformy, aby normalne po przeskalowaniu byÅ‚y jednostkowe + Vertices[v].Normal = + SafeNormalize(norm); // przepisanie do wierzchoÅ‚ka trójkÄ…ta + } + } + delete[] wsp; + delete[] n; + delete[] sg; + } + else // gdy brak wierzchoÅ‚ków + { + eType = TP_ROTATOR; // submodel pomocniczy, ma tylko macierz przeksztaÅ‚cenia + iVboPtr = iNumVerts = 0; // dla formalnoÅ›ci + } + } // obsÅ‚uga submodelu z wÅ‚asnÄ… listÄ… wierzchoÅ‚ków + } + else if (eType == TP_STARS) + { // punkty Å›wiecÄ…ce dookólnie - skÅ‚adnia jak + // dla smt_Mesh + 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.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 + } + } + // Visible=true; //siÄ™ potem wyłączy w razie potrzeby + // iFlags|=0x0200; //wczytano z pliku tekstowego (jest wÅ‚aÅ›cicielem tablic) + if (iNumVerts < 1) + iFlags &= ~0x3F; // cykl renderowania uzależniony od potomnych + return iNumVerts; // do okreÅ›lenia wielkoÅ›ci VBO }; int TSubModel::TriangleAdd(TModel3d *m, texture_manager::size_type tex, int tri) @@ -654,62 +612,62 @@ int TSubModel::TriangleAdd(TModel3d *m, texture_manager::size_type tex, int tri) float8 *TSubModel::TrianglePtr(int tex, int pos, int *la, int *ld, int *ls) { // zwraca wskaźnik do wypeÅ‚nienia tabeli wierzchoÅ‚ków, używane - // przy tworzeniu E3D terenu - TSubModel *s = this; - while (s ? s->TextureID != tex : false) - { // szukanie submodelu o danej teksturze - if (s == this) - s = Child; - else - s = s->Next; - } - if (!s) - return NULL; // coÅ› nie tak poszÅ‚o - if (!s->Vertices) - { // utworznie tabeli trójkÄ…tów - s->Vertices = new float8[s->iNumVerts]; - // iVboPtr=pos; //pozycja submodelu w tabeli wierzchoÅ‚ków - // pos+=iNumVerts; //rezerwacja miejsca w tabeli - s->iVboPtr = iInstance; // pozycja submodelu w tabeli wierzchoÅ‚ków - iInstance += s->iNumVerts; // pozycja dla nastÄ™pnego - } - s->ColorsSet(la, ld, ls); // ustawienie kolorów Å›wiateÅ‚ - return s->Vertices + pos; // wskaźnik na wolne miejsce w tabeli wierzchoÅ‚ków + // przy tworzeniu E3D terenu + TSubModel *s = this; + while (s ? s->TextureID != tex : false) + { // szukanie submodelu o danej teksturze + if (s == this) + s = Child; + else + s = s->Next; + } + if (!s) + return NULL; // coÅ› nie tak poszÅ‚o + if (!s->Vertices) + { // utworznie tabeli trójkÄ…tów + s->Vertices = new float8[s->iNumVerts]; + // iVboPtr=pos; //pozycja submodelu w tabeli wierzchoÅ‚ków + // pos+=iNumVerts; //rezerwacja miejsca w tabeli + s->iVboPtr = iInstance; // pozycja submodelu w tabeli wierzchoÅ‚ków + iInstance += s->iNumVerts; // pozycja dla nastÄ™pnego + } + s->ColorsSet(la, ld, ls); // ustawienie kolorów Å›wiateÅ‚ + return s->Vertices + pos; // wskaźnik na wolne miejsce w tabeli wierzchoÅ‚ków }; void TSubModel::DisplayLists() { // utworznie po jednej skompilowanej liÅ›cie dla - // każdego submodelu - if (Global::bUseVBO) - return; // Ra: przy VBO to siÄ™ nie przyda - // iFlags|=0x4000; //wyłączenie przeliczania wierzchoÅ‚ków, bo nie sÄ… zachowane - if (eType < TP_ROTATOR) - { - if (iNumVerts > 0) - { - uiDisplayList = glGenLists(1); - glNewList(uiDisplayList, GL_COMPILE); - glColor3fv(f4Diffuse); // McZapkie-240702: zamiast ub + // każdego submodelu + if (Global::bUseVBO) + return; // Ra: przy VBO to siÄ™ nie przyda + // iFlags|=0x4000; //wyłączenie przeliczania wierzchoÅ‚ków, bo nie sÄ… zachowane + if (eType < TP_ROTATOR) + { + if (iNumVerts > 0) + { + uiDisplayList = glGenLists(1); + glNewList(uiDisplayList, GL_COMPILE); + glColor3fv(f4Diffuse); // McZapkie-240702: zamiast ub #ifdef USE_VERTEX_ARRAYS - // ShaXbee-121209: przekazywanie wierzcholkow hurtem - glVertexPointer(3, GL_DOUBLE, sizeof(GLVERTEX), &Vertices[0].Point.x); - glNormalPointer(GL_DOUBLE, sizeof(GLVERTEX), &Vertices[0].Normal.x); - glTexCoordPointer(2, GL_FLOAT, sizeof(GLVERTEX), &Vertices[0].tu); - glDrawArrays(eType, 0, iNumVerts); + // ShaXbee-121209: przekazywanie wierzcholkow hurtem + glVertexPointer(3, GL_DOUBLE, sizeof(GLVERTEX), &Vertices[0].Point.x); + glNormalPointer(GL_DOUBLE, sizeof(GLVERTEX), &Vertices[0].Normal.x); + glTexCoordPointer(2, GL_FLOAT, sizeof(GLVERTEX), &Vertices[0].tu); + glDrawArrays(eType, 0, iNumVerts); #else - glBegin(eType); - for (int i = 0; i < iNumVerts; i++) - { - /* - glNormal3dv(&Vertices[i].Normal.x); - glTexCoord2f(Vertices[i].tu,Vertices[i].tv); - glVertex3dv(&Vertices[i].Point.x); - */ - glNormal3fv(&Vertices[i].Normal.x); - glTexCoord2f(Vertices[i].tu, Vertices[i].tv); - glVertex3fv(&Vertices[i].Point.x); - }; - glEnd(); + glBegin(eType); + for (int i = 0; i < iNumVerts; i++) + { + /* + glNormal3dv(&Vertices[i].Normal.x); + glTexCoord2f(Vertices[i].tu,Vertices[i].tv); + glVertex3dv(&Vertices[i].Point.x); + */ + glNormal3fv(&Vertices[i].Normal.x); + glTexCoord2f(Vertices[i].tu, Vertices[i].tv); + glVertex3fv(&Vertices[i].Point.x); + }; + glEnd(); #endif glEndList(); } @@ -834,259 +792,263 @@ void TSubModel::InitialRotate(bool doit) void TSubModel::ChildAdd(TSubModel *SubModel) { // dodanie submodelu potemnego (uzależnionego) - // Ra: zmiana kolejnoÅ›ci, żeby kolejne móc renderować po aktualnym (byÅ‚o - // przed) - if (SubModel) - SubModel->NextAdd(Child); // Ra: zmiana kolejnoÅ›ci renderowania - Child = SubModel; + // Ra: zmiana kolejnoÅ›ci, żeby kolejne móc renderować po aktualnym (byÅ‚o + // przed) + if (SubModel) + SubModel->NextAdd(Child); // Ra: zmiana kolejnoÅ›ci renderowania + Child = SubModel; }; void TSubModel::NextAdd(TSubModel *SubModel) { // dodanie submodelu kolejnego (wspólny przodek) - if (Next) - Next->NextAdd(SubModel); - else - Next = SubModel; + if (Next) + Next->NextAdd(SubModel); + else + Next = SubModel; }; int TSubModel::FlagsCheck() { // analiza koniecznych zmian pomiÄ™dzy submodelami - // samo pomijanie glBindTexture() nie poprawi wydajnoÅ›ci - // ale można sprawdzić, czy można w ogóle pominąć kod do tekstur (sprawdzanie - // replaceskin) - int i = 0; - if (Child) - { // Child jest renderowany po danym submodelu - if (Child->TextureID) // o ile ma teksturÄ™ - if (Child->TextureID != TextureID) // i jest ona inna niż rodzica - Child->iFlags |= 0x80; // to trzeba sprawdzać, jak z teksturami jest - i = Child->FlagsCheck(); - iFlags |= 0x00FF0000 & ((i << 16) | (i) | (i >> 8)); // potomny, rodzeÅ„stwo i dzieci - if (eType == TP_TEXT) - { // wyłączenie renderowania Next dla znaków - // wyÅ›wietlacza tekstowego - TSubModel *p = Child; - while (p) - { - p->iFlags &= 0xC0FFFFFF; - p = p->Next; - } - } - } - if (Next) - { // Next jest renderowany po danym submodelu (kolejność odwrócona - // po wczytaniu T3D) - if (TextureID) // o ile dany ma teksturÄ™ - if ((TextureID != Next->TextureID) || - (i & 0x00800000)) // a ma innÄ… albo dzieci zmieniajÄ… - iFlags |= 0x80; // to dany submodel musi sobie jÄ… ustawiać - i = Next->FlagsCheck(); - iFlags |= 0xFF000000 & ((i << 24) | (i << 8) | (i)); // nastÄ™pny, kolejne i ich dzieci - // tekstury nie ustawiamy tylko wtedy, gdy jest taka sama jak Next i jego - // dzieci nie zmieniajÄ… - } - return iFlags; + // 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 = 0; + if (Child) + { // Child jest renderowany po danym submodelu + if (Child->TextureID) // o ile ma teksturÄ™ + if (Child->TextureID != TextureID) // i jest ona inna niż rodzica + Child->iFlags |= 0x80; // to trzeba sprawdzać, jak z teksturami jest + i = Child->FlagsCheck(); + iFlags |= 0x00FF0000 & ((i << 16) | (i) | (i >> 8)); // potomny, rodzeÅ„stwo i dzieci + if (eType == TP_TEXT) + { // wyłączenie renderowania Next dla znaków + // wyÅ›wietlacza tekstowego + TSubModel *p = Child; + while (p) + { + p->iFlags &= 0xC0FFFFFF; + p = p->Next; + } + } + } + if (Next) + { // Next jest renderowany po danym submodelu (kolejność odwrócona + // po wczytaniu T3D) + if (TextureID) // o ile dany ma teksturÄ™ + if ((TextureID != Next->TextureID) || + (i & 0x00800000)) // a ma innÄ… albo dzieci zmieniajÄ… + iFlags |= 0x80; // to dany submodel musi sobie jÄ… ustawiać + i = Next->FlagsCheck(); + iFlags |= 0xFF000000 & ((i << 24) | (i << 8) | (i)); // nastÄ™pny, kolejne i ich dzieci + // tekstury nie ustawiamy tylko wtedy, gdy jest taka sama jak Next i jego + // dzieci nie zmieniajÄ… + } + return iFlags; }; void TSubModel::SetRotate(float3 vNewRotateAxis, float fNewAngle) { // obrócenie submodelu wg podanej - // osi (np. wskazówki w kabinie) - v_RotateAxis = vNewRotateAxis; - f_Angle = fNewAngle; - if (fNewAngle != 0.0) - { - b_Anim = at_Rotate; - b_aAnim = at_Rotate; - } - iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja + // osi (np. wskazówki w kabinie) + v_RotateAxis = vNewRotateAxis; + f_Angle = fNewAngle; + if (fNewAngle != 0.0) + { + b_Anim = at_Rotate; + b_aAnim = at_Rotate; + } + iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja } void TSubModel::SetRotateXYZ(float3 vNewAngles) { // obrócenie submodelu o - // podane kÄ…ty wokół osi - // lokalnego ukÅ‚adu - v_Angles = vNewAngles; - b_Anim = at_RotateXYZ; - b_aAnim = at_RotateXYZ; - iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja + // podane kÄ…ty wokół osi + // lokalnego ukÅ‚adu + v_Angles = vNewAngles; + b_Anim = at_RotateXYZ; + b_aAnim = at_RotateXYZ; + iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja } void TSubModel::SetRotateXYZ(vector3 vNewAngles) { // obrócenie submodelu o - // podane kÄ…ty wokół osi - // lokalnego ukÅ‚adu - v_Angles.x = vNewAngles.x; - v_Angles.y = vNewAngles.y; - v_Angles.z = vNewAngles.z; - b_Anim = at_RotateXYZ; - b_aAnim = at_RotateXYZ; - iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja + // podane kÄ…ty wokół osi + // lokalnego ukÅ‚adu + v_Angles.x = vNewAngles.x; + v_Angles.y = vNewAngles.y; + v_Angles.z = vNewAngles.z; + b_Anim = at_RotateXYZ; + b_aAnim = at_RotateXYZ; + iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja } void TSubModel::SetTranslate(float3 vNewTransVector) { // przesuniÄ™cie submodelu (np. w kabinie) - v_TransVector = vNewTransVector; - b_Anim = at_Translate; - b_aAnim = at_Translate; - iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja + v_TransVector = vNewTransVector; + b_Anim = at_Translate; + b_aAnim = at_Translate; + iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja } void TSubModel::SetTranslate(vector3 vNewTransVector) { // przesuniÄ™cie submodelu (np. w kabinie) - v_TransVector.x = vNewTransVector.x; - v_TransVector.y = vNewTransVector.y; - v_TransVector.z = vNewTransVector.z; - b_Anim = at_Translate; - b_aAnim = at_Translate; - iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja + v_TransVector.x = vNewTransVector.x; + v_TransVector.y = vNewTransVector.y; + v_TransVector.z = vNewTransVector.z; + b_Anim = at_Translate; + b_aAnim = at_Translate; + iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja } void TSubModel::SetRotateIK1(float3 vNewAngles) { // obrócenie submodelu o - // podane kÄ…ty wokół osi - // lokalnego ukÅ‚adu - v_Angles = vNewAngles; - iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja + // podane kÄ…ty wokół osi + // lokalnego ukÅ‚adu + v_Angles = vNewAngles; + iAnimOwner = iInstance; // zapamiÄ™tanie czyja jest animacja } struct ToLower { - char operator()(char input) - { - return tolower(input); - } + char operator()(char input) + { + return tolower(input); + } }; TSubModel *TSubModel::GetFromName(std::string const &search, bool i) { - return GetFromName(search.c_str(), i); + return GetFromName(search.c_str(), i); }; TSubModel *TSubModel::GetFromName(char const *search, bool i) { - TSubModel *result; - // std::transform(search.begin(),search.end(),search.begin(),ToLower()); - // search=search.LowerCase(); - // AnsiString name=AnsiString(); - if (pName && search) - if ((i ? stricmp(pName, search) : strcmp(pName, search)) == 0) - return this; - else if (pName == search) - return this; // oba NULL - if (Next) - { - result = Next->GetFromName(search); - if (result) - return result; - } - if (Child) - { - result = Child->GetFromName(search); - if (result) - return result; - } - return NULL; + TSubModel *result; + // std::transform(search.begin(),search.end(),search.begin(),ToLower()); + // search=search.LowerCase(); + // AnsiString name=AnsiString(); + std::string search_lc = std::string(search); + if (i) + std::transform(search_lc.begin(), search_lc.end(), search_lc.begin(), ::tolower); + std::string pName_lc = pName; + if (i) + std::transform(pName_lc.begin(), pName_lc.end(), pName_lc.begin(), ::tolower); + if (pName.size() && search) + if (pName_lc == search_lc) + return this; + if (Next) + { + result = Next->GetFromName(search); + if (result) + return result; + } + if (Child) + { + result = Child->GetFromName(search); + if (result) + return result; + } + return NULL; }; // WORD hbIndices[18]={3,0,1,5,4,2,1,0,4,1,5,3,2,3,5,2,4,0}; void TSubModel::RaAnimation(TAnimType a) { // wykonanie animacji niezależnie od renderowania - switch (a) - { // korekcja poÅ‚ożenia, jeÅ›li submodel jest animowany - case at_Translate: // Ra: byÅ‚o "true" - if (iAnimOwner != iInstance) - break; // cudza animacja - glTranslatef(v_TransVector.x, v_TransVector.y, v_TransVector.z); - break; - case at_Rotate: // Ra: byÅ‚o "true" - if (iAnimOwner != iInstance) - break; // cudza animacja - glRotatef(f_Angle, v_RotateAxis.x, v_RotateAxis.y, v_RotateAxis.z); - break; - case at_RotateXYZ: - if (iAnimOwner != iInstance) - break; // cudza animacja - glTranslatef(v_TransVector.x, v_TransVector.y, v_TransVector.z); - glRotatef(v_Angles.x, 1.0, 0.0, 0.0); - glRotatef(v_Angles.y, 0.0, 1.0, 0.0); - glRotatef(v_Angles.z, 0.0, 0.0, 1.0); - break; - case at_SecondsJump: // sekundy z przeskokiem - glRotatef(floor(GlobalTime->mr) * 6.0, 0.0, 1.0, 0.0); - break; - case at_MinutesJump: // minuty z przeskokiem - glRotatef(GlobalTime->mm * 6.0, 0.0, 1.0, 0.0); - break; - case at_HoursJump: // godziny skokowo 12h/360° - glRotatef(GlobalTime->hh * 30.0 * 0.5, 0.0, 1.0, 0.0); - break; - case at_Hours24Jump: // godziny skokowo 24h/360° - glRotatef(GlobalTime->hh * 15.0 * 0.25, 0.0, 1.0, 0.0); - break; - case at_Seconds: // sekundy pÅ‚ynnie - glRotatef(GlobalTime->mr * 6.0, 0.0, 1.0, 0.0); - break; - case at_Minutes: // minuty pÅ‚ynnie - glRotatef(GlobalTime->mm * 6.0 + GlobalTime->mr * 0.1, 0.0, 1.0, 0.0); - break; - case at_Hours: // godziny pÅ‚ynnie 12h/360° - // glRotatef(GlobalTime->hh*30.0+GlobalTime->mm*0.5+GlobalTime->mr/120.0,0.0,1.0,0.0); - glRotatef(2.0 * Global::fTimeAngleDeg, 0.0, 1.0, 0.0); - break; - case at_Hours24: // godziny pÅ‚ynnie 24h/360° - // glRotatef(GlobalTime->hh*15.0+GlobalTime->mm*0.25+GlobalTime->mr/240.0,0.0,1.0,0.0); - glRotatef(Global::fTimeAngleDeg, 0.0, 1.0, 0.0); - break; - case at_Billboard: // obrót w pionie do kamery - { - matrix4x4 mat; // potrzebujemy współrzÄ™dne przesuniÄ™cia Å›rodka ukÅ‚adu - // współrzÄ™dnych submodelu - glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray()); // pobranie aktualnej matrycy - float3 gdzie = float3(mat[3][0], mat[3][1], - mat[3][2]); // poczÄ…tek ukÅ‚adu współrzÄ™dnych submodelu wzglÄ™dem kamery - glLoadIdentity(); // macierz jedynkowa - glTranslatef(gdzie.x, gdzie.y, gdzie.z); // poczÄ…tek ukÅ‚adu zostaje bez - // zmian - glRotated(atan2(gdzie.x, gdzie.z) * 180.0 / M_PI, 0.0, 1.0, - 0.0); // jedynie obracamy w pionie o kÄ…t - } - break; - case at_Wind: // ruch pod wpÅ‚ywem wiatru (wiatr bÄ™dziemy liczyć potem...) - glRotated(1.5 * sin(M_PI * GlobalTime->mr / 6.0), 0.0, 1.0, 0.0); - break; - case at_Sky: // animacja nieba - glRotated(Global::fLatitudeDeg, 1.0, 0.0, 0.0); // ustawienie osi OY na północ - // glRotatef(Global::fTimeAngleDeg,0.0,1.0,0.0); //obrót dobowy osi OX - glRotated(-fmod(Global::fTimeAngleDeg, 360.0), 0.0, 1.0, 0.0); // obrót dobowy osi OX - break; - case at_IK11: // ostatni element animacji szkieletowej (podudzie, stopa) - glRotatef(v_Angles.z, 0.0, 1.0, 0.0); // obrót wzglÄ™dem osi pionowej - // (azymut) - glRotatef(v_Angles.x, 1.0, 0.0, 0.0); // obrót wzglÄ™dem poziomu (deklinacja) - break; - case at_DigiClk: // animacja zegara cyfrowego - { // ustawienie animacji w submodelach potomnych - TSubModel *sm = ChildGet(); - do - { // pÄ™tla po submodelach potomnych i obracanie ich o kÄ…t zależy od czasu - if (sm->pName) - { // musi mieć niepustÄ… nazwÄ™ - if ((sm->pName[0]) >= '0') - if ((sm->pName[0]) <= '5') // zegarek ma 6 cyfr maksymalnie - sm->SetRotate(float3(0, 1, 0), - -Global::fClockAngleDeg[(sm->pName[0]) - '0']); - } - sm = sm->NextGet(); - } while (sm); - } - break; - } - if (mAnimMatrix) // można by to dać np. do at_Translate - { - glMultMatrixf(mAnimMatrix->readArray()); - mAnimMatrix = NULL; // jak animator bÄ™dzie potrzebowaÅ‚, to ustawi ponownie - } + switch (a) + { // korekcja poÅ‚ożenia, jeÅ›li submodel jest animowany + case at_Translate: // Ra: byÅ‚o "true" + if (iAnimOwner != iInstance) + break; // cudza animacja + glTranslatef(v_TransVector.x, v_TransVector.y, v_TransVector.z); + break; + case at_Rotate: // Ra: byÅ‚o "true" + if (iAnimOwner != iInstance) + break; // cudza animacja + glRotatef(f_Angle, v_RotateAxis.x, v_RotateAxis.y, v_RotateAxis.z); + break; + case at_RotateXYZ: + if (iAnimOwner != iInstance) + break; // cudza animacja + glTranslatef(v_TransVector.x, v_TransVector.y, v_TransVector.z); + glRotatef(v_Angles.x, 1.0, 0.0, 0.0); + glRotatef(v_Angles.y, 0.0, 1.0, 0.0); + glRotatef(v_Angles.z, 0.0, 0.0, 1.0); + break; + case at_SecondsJump: // sekundy z przeskokiem + glRotatef(floor(GlobalTime->mr) * 6.0, 0.0, 1.0, 0.0); + break; + case at_MinutesJump: // minuty z przeskokiem + glRotatef(GlobalTime->mm * 6.0, 0.0, 1.0, 0.0); + break; + case at_HoursJump: // godziny skokowo 12h/360° + glRotatef(GlobalTime->hh * 30.0 * 0.5, 0.0, 1.0, 0.0); + break; + case at_Hours24Jump: // godziny skokowo 24h/360° + glRotatef(GlobalTime->hh * 15.0 * 0.25, 0.0, 1.0, 0.0); + break; + case at_Seconds: // sekundy pÅ‚ynnie + glRotatef(GlobalTime->mr * 6.0, 0.0, 1.0, 0.0); + break; + case at_Minutes: // minuty pÅ‚ynnie + glRotatef(GlobalTime->mm * 6.0 + GlobalTime->mr * 0.1, 0.0, 1.0, 0.0); + break; + case at_Hours: // godziny pÅ‚ynnie 12h/360° + // glRotatef(GlobalTime->hh*30.0+GlobalTime->mm*0.5+GlobalTime->mr/120.0,0.0,1.0,0.0); + glRotatef(2.0 * Global::fTimeAngleDeg, 0.0, 1.0, 0.0); + break; + case at_Hours24: // godziny pÅ‚ynnie 24h/360° + // glRotatef(GlobalTime->hh*15.0+GlobalTime->mm*0.25+GlobalTime->mr/240.0,0.0,1.0,0.0); + glRotatef(Global::fTimeAngleDeg, 0.0, 1.0, 0.0); + break; + case at_Billboard: // obrót w pionie do kamery + { + matrix4x4 mat; // potrzebujemy współrzÄ™dne przesuniÄ™cia Å›rodka ukÅ‚adu + // współrzÄ™dnych submodelu + glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray()); // pobranie aktualnej matrycy + float3 gdzie = float3(mat[3][0], mat[3][1], + mat[3][2]); // poczÄ…tek ukÅ‚adu współrzÄ™dnych submodelu wzglÄ™dem kamery + glLoadIdentity(); // macierz jedynkowa + glTranslatef(gdzie.x, gdzie.y, gdzie.z); // poczÄ…tek ukÅ‚adu zostaje bez + // zmian + glRotated(atan2(gdzie.x, gdzie.z) * 180.0 / M_PI, 0.0, 1.0, + 0.0); // jedynie obracamy w pionie o kÄ…t + } + break; + case at_Wind: // ruch pod wpÅ‚ywem wiatru (wiatr bÄ™dziemy liczyć potem...) + glRotated(1.5 * sin(M_PI * GlobalTime->mr / 6.0), 0.0, 1.0, 0.0); + break; + case at_Sky: // animacja nieba + glRotated(Global::fLatitudeDeg, 1.0, 0.0, 0.0); // ustawienie osi OY na północ + // glRotatef(Global::fTimeAngleDeg,0.0,1.0,0.0); //obrót dobowy osi OX + glRotated(-fmod(Global::fTimeAngleDeg, 360.0), 0.0, 1.0, 0.0); // obrót dobowy osi OX + break; + case at_IK11: // ostatni element animacji szkieletowej (podudzie, stopa) + glRotatef(v_Angles.z, 0.0, 1.0, 0.0); // obrót wzglÄ™dem osi pionowej + // (azymut) + glRotatef(v_Angles.x, 1.0, 0.0, 0.0); // obrót wzglÄ™dem poziomu (deklinacja) + break; + case at_DigiClk: // animacja zegara cyfrowego + { // ustawienie animacji w submodelach potomnych + TSubModel *sm = ChildGet(); + do + { // pÄ™tla po submodelach potomnych i obracanie ich o kÄ…t zależy od czasu + if (sm->pName.size()) + { // musi mieć niepustÄ… nazwÄ™ + if ((sm->pName[0]) >= '0') + if ((sm->pName[0]) <= '5') // zegarek ma 6 cyfr maksymalnie + sm->SetRotate(float3(0, 1, 0), + -Global::fClockAngleDeg[(sm->pName[0]) - '0']); + } + sm = sm->NextGet(); + } while (sm); + } + break; + } + if (mAnimMatrix) // można by to dać np. do at_Translate + { + glMultMatrixf(mAnimMatrix->readArray()); + mAnimMatrix = NULL; // jak animator bÄ™dzie potrzebowaÅ‚, to ustawi ponownie + } }; void TSubModel::RenderDL() @@ -1227,9 +1189,8 @@ void TSubModel::RenderAlphaDL() if (eType == TP_TEXT) { // tekst renderujemy w specjalny sposób, zamiast // submodeli z Å‚aÅ„cucha Child - int i, j = pasText->size(); + int i, j = (int)pasText->size(); TSubModel *p; - char c; if (!smLetter) { // jeÅ›li nie ma tablicy, to jÄ… stworzyć; miejsce // nieodpowiednie, ale tymczasowo @@ -1240,7 +1201,7 @@ void TSubModel::RenderAlphaDL() p = Child; while (p) { - smLetter[*p->pName] = p; + smLetter[p->pName[0]] = p; p = p->Next; // kolejny znak } } @@ -1322,45 +1283,45 @@ void TSubModel::RenderVBO() (fCosHotspotAngle - fCosViewAngle) / (fCosHotspotAngle - fCosFalloffAngle); - /* TODO: poprawic to zeby dzialalo + /* TODO: poprawic to zeby dzialalo - 2- Inverse (Applies inverse decay. The formula is luminance=R0/R, where - R0 is - the radial source of the light if no attenuation is - used, or the Near End - value of the light if Attenuation is used. R is the - radial distance of the - illuminated surface from R0.) + 2- Inverse (Applies inverse decay. The formula is luminance=R0/R, where + R0 is + the radial source of the light if no attenuation is + used, or the Near End + value of the light if Attenuation is used. R is the + radial distance of the + illuminated surface from R0.) - 3- Inverse Square (Applies inverse-square decay. The formula for this is - (R0/R)^2. - This is actually the "real-world" decay of light, but - you might find it too dim - in the world of computer graphics.) + 3- Inverse Square (Applies inverse-square decay. The formula for this is + (R0/R)^2. + This is actually the "real-world" decay of light, but + you might find it too dim + in the world of computer graphics.) - .DecayRadius -- The distance over which the decay occurs. + .DecayRadius -- The distance over which the decay occurs. - if (iFarAttenDecay>0) - switch (iFarAttenDecay) - { - case 1: - Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); - //dorobic od kata - break; - case 2: - Distdimm=fFarDecayRadius/(1+fSquareDist); - //dorobic od kata - break; - } - if (Distdimm>1) - Distdimm=1; + if (iFarAttenDecay>0) + switch (iFarAttenDecay) + { + case 1: + Distdimm=fFarDecayRadius/(1+sqrt(fSquareDist)); + //dorobic od kata + break; + case 2: + Distdimm=fFarDecayRadius/(1+fSquareDist); + //dorobic od kata + break; + } + if (Distdimm>1) + Distdimm=1; */ GfxRenderer.Bind(0); // nie teksturować // glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]); // glColorMaterial(GL_FRONT,GL_EMISSION); - float color[4] = {f4Diffuse[0] * Distdimm, f4Diffuse[1] * Distdimm, - f4Diffuse[2] * Distdimm, 0}; + float color[4] = { (float)(f4Diffuse[0] * Distdimm), (float)(f4Diffuse[1] * Distdimm), + (float)(f4Diffuse[2] * Distdimm), 0 }; // glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm); glColorMaterial(GL_FRONT, GL_EMISSION); glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie @@ -1493,317 +1454,183 @@ void TSubModel::RenderAlphaVBO() Next->RenderAlphaVBO(); }; // RaRenderAlpha -//--------------------------------------------------------------------------- + //--------------------------------------------------------------------------- void TSubModel::RaArrayFill(CVertNormTex *Vert) { // wypeÅ‚nianie tablic VBO - if (Child) - Child->RaArrayFill(Vert); - if ((eType < TP_ROTATOR) || (eType == TP_STARS)) - for (int i = 0; i < iNumVerts; ++i) - { - Vert[iVboPtr + i].x = Vertices[i].Point.x; - Vert[iVboPtr + i].y = Vertices[i].Point.y; - Vert[iVboPtr + i].z = Vertices[i].Point.z; - Vert[iVboPtr + i].nx = Vertices[i].Normal.x; - Vert[iVboPtr + i].ny = Vertices[i].Normal.y; - Vert[iVboPtr + i].nz = Vertices[i].Normal.z; - Vert[iVboPtr + i].u = Vertices[i].tu; - Vert[iVboPtr + i].v = Vertices[i].tv; - } - else if (eType == TP_FREESPOTLIGHT) - Vert[iVboPtr].x = Vert[iVboPtr].y = Vert[iVboPtr].z = 0.0; - if (Next) - Next->RaArrayFill(Vert); + if (Child) + Child->RaArrayFill(Vert); + if ((eType < TP_ROTATOR) || (eType == TP_STARS)) + for (int i = 0; i < iNumVerts; ++i) + { + Vert[iVboPtr + i].x = Vertices[i].Point.x; + Vert[iVboPtr + i].y = Vertices[i].Point.y; + Vert[iVboPtr + i].z = Vertices[i].Point.z; + Vert[iVboPtr + i].nx = Vertices[i].Normal.x; + Vert[iVboPtr + i].ny = Vertices[i].Normal.y; + Vert[iVboPtr + i].nz = Vertices[i].Normal.z; + Vert[iVboPtr + i].u = Vertices[i].tu; + Vert[iVboPtr + i].v = Vertices[i].tv; + } + else if (eType == TP_FREESPOTLIGHT) + Vert[iVboPtr].x = Vert[iVboPtr].y = Vert[iVboPtr].z = 0.0; + if (Next) + Next->RaArrayFill(Vert); }; -void TSubModel::Info() -{ // zapisanie informacji o submodelu do obiektu - // pomocniczego - TSubModelInfo *info = TSubModelInfo::pTable + TSubModelInfo::iCurrent; - info->pSubModel = this; - if (fMatrix && (iFlags & 0x8000)) // ma matrycÄ™ i jest ona niejednostkowa - info->iTransform = info->iTotalTransforms++; - if (TextureID > 0) - { // jeÅ›li ma teksturÄ™ niewymiennÄ… - for (int i = 0; i < info->iCurrent; ++i) - if (TextureID == info->pTable[i].pSubModel->TextureID) // porównanie z wczeÅ›niejszym - { - info->iTexture = info->pTable[i].iTexture; // taki jaki już byÅ‚ - break; // koniec sprawdzania - } - if (info->iTexture < 0) // jeÅ›li nie znaleziono we wczeÅ›niejszych - { - info->iTexture = ++info->iTotalTextures; // przydzielenie numeru tekstury - // w pliku (od 1) - std::string t(pTexture); - // trim extension - size_t kropka = t.rfind('.'); - if (kropka != std::string::npos && - (t.substr(kropka) == ".tga" || t.substr(kropka) == ".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.size() + 1; // przygotowanie do zapisania, z zerem na koÅ„cu - } - } - else - info->iTexture = TextureID; // nie ma albo wymienna - // if (asName.Length()) - if (pName) - { - info->iName = info->iTotalNames++; // przydzielenie numeru nazwy w pliku (od 0) - info->iNameLen = strlen(pName) + 1; // z zerem na koÅ„cu - } - ++info->iCurrent; // przejÅ›cie do kolejnego obiektu pomocniczego - if (Child) - { - info->iChild = info->iCurrent; - Child->Info(); - } - if (Next) - { - info->iNext = info->iCurrent; - Next->Info(); - } -}; - -void TSubModel::InfoSet(TSubModelInfo *info) -{ // ustawienie danych wg obiektu - // pomocniczego do zapisania w - // pliku - int ile = (char *)&uiDisplayList - (char *)&eType; // ilość bajtów pomiÄ™dzy tymi zmiennymi - ZeroMemory(this, sizeof(TSubModel)); // zerowaie caÅ‚oÅ›ci - CopyMemory(this, info->pSubModel, ile); // skopiowanie pamiÄ™ci 1:1 - iTexture = info->iTexture; // numer nazwy tekstury, a nie numer w OpenGL - TextureID = info->iTexture; // numer tekstury w OpenGL - iName = info->iName; // numer nazwy w obszarze nazw - iMatrix = info->iTransform; // numer macierzy - Next = (TSubModel *)info->iNext; // numer nastÄ™pnego - Child = (TSubModel *)info->iChild; // numer potomnego - iFlags &= ~0x200; // nie jest wczytany z tekstowego - // asTexture=asName=""; - pTexture = pName = NULL; -}; - -void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TStringPack *n, - bool dynamic) -{ // ustawienie wskaźników w submodelu - iVisible = 1; // tymczasowo używane - Child = ((int)Child > 0) ? s + (int)Child : NULL; // zerowy nie może być potomnym - Next = ((int)Next > 0) ? s + (int)Next : NULL; // zerowy nie może być nastÄ™pnym - fMatrix = ((iMatrix >= 0) && m) ? m + iMatrix : NULL; - // if (n&&(iName>=0)) asName=AnsiString(n->String(iName)); else asName=""; - if (n && (iName >= 0)) - { - pName = n->String(iName); - std::string name(pName); - if (false == name.empty()) - { // jeÅ›li dany submodel jest zgaszonym Å›wiatÅ‚em, to - // domyÅ›lnie go ukrywamy - 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 ((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" - } - } - else - pName = NULL; - if (iTexture > 0) - { // obsÅ‚uga staÅ‚ej tekstury - // TextureID=TTexturesManager::GetTextureID(t->String(TextureID)); - // asTexture=AnsiString(t->String(iTexture)); - pTexture = t->String(iTexture); - std::string tex = pTexture; - if (tex.find_last_of("/\\") == std::string::npos) - tex.insert(0, Global::asCurrentTexturePath); - TextureID = GfxRenderer.GetTextureId( tex, szTexturePath ); - // TexAlpha=TTexturesManager::GetAlpha(TextureID); //zmienna robocza - // ustawienie cyklu przezroczyste/nieprzezroczyste zależnie od wÅ‚asnoÅ›ci - // staÅ‚ej tekstury - // iFlags=(iFlags&~0x30)|(TTexturesManager::GetAlpha(TextureID)?0x20:0x10); - // //0x10-nieprzezroczysta, 0x20-przezroczysta - if (Opacity < 1.0) // przezroczystość z tekstury brana tylko dla Opacity 0! - iFlags |= GfxRenderer.Texture(TextureID).has_alpha ? - 0x20 : - 0x10; // 0x10-nieprzezroczysta, 0x20-przezroczysta - else - iFlags |= 0x10; // normalnie nieprzezroczyste - } - b_aAnim = b_Anim; // skopiowanie animacji do drugiego cyklu - iFlags &= ~0x0200; // wczytano z pliku binarnego (nie jest wÅ‚aÅ›cicielem - // tablic) - Vertices = v + iVboPtr; - // if (!iNumVerts) eType=-1; //tymczasowo zmiana typu, żeby siÄ™ nie - // renderowaÅ‚o na siłę -}; void TSubModel::AdjustDist() { // aktualizacja odlegÅ‚oÅ›ci faz LoD, zależna od - // rozdzielczoÅ›ci pionowej oraz multisamplingu - if (fSquareMaxDist > 0.0) - fSquareMaxDist *= Global::fDistanceFactor; - if (fSquareMinDist > 0.0) - fSquareMinDist *= Global::fDistanceFactor; - // if (fNearAttenStart>0.0) fNearAttenStart*=Global::fDistanceFactor; - // if (fNearAttenEnd>0.0) fNearAttenEnd*=Global::fDistanceFactor; - if (Child) - Child->AdjustDist(); - if (Next) - Next->AdjustDist(); + // rozdzielczoÅ›ci pionowej oraz multisamplingu + if (fSquareMaxDist > 0.0) + fSquareMaxDist *= Global::fDistanceFactor; + if (fSquareMinDist > 0.0) + fSquareMinDist *= Global::fDistanceFactor; + // if (fNearAttenStart>0.0) fNearAttenStart*=Global::fDistanceFactor; + // if (fNearAttenEnd>0.0) fNearAttenEnd*=Global::fDistanceFactor; + if (Child) + Child->AdjustDist(); + if (Next) + Next->AdjustDist(); }; void TSubModel::ColorsSet(int *a, int *d, int *s) { // ustawienie kolorów dla modelu terenu - int i; - if (a) - for (i = 0; i < 4; ++i) - f4Ambient[i] = a[i] / 255.0; - if (d) - for (i = 0; i < 4; ++i) - f4Diffuse[i] = d[i] / 255.0; - if (s) - for (i = 0; i < 4; ++i) - f4Specular[i] = s[i] / 255.0; + int i; + if (a) + for (i = 0; i < 4; ++i) + f4Ambient[i] = a[i] / 255.0; + if (d) + for (i = 0; i < 4; ++i) + f4Diffuse[i] = d[i] / 255.0; + if (s) + for (i = 0; i < 4; ++i) + f4Specular[i] = s[i] / 255.0; }; void TSubModel::ParentMatrix(float4x4 *m) { // pobranie transformacji wzglÄ™dem wstawienia modelu - // jeÅ›li nie zostaÅ‚o wykonane Init() (tzn. zaraz po wczytaniu T3D), to - // dodatkowy obrót - // obrót T3D jest wymagany np. do policzenia wysokoÅ›ci pantografów - *m = float4x4(*fMatrix); // skopiowanie, bo bÄ™dziemy mnożyć - // m(3)[1]=m[3][1]+0.054; //w górÄ™ o wysokość Å›lizgu (na razie tak) - TSubModel *sm = this; - while (sm->Parent) - { // przenieść tÄ™ funkcjÄ™ do modelu - if (sm->Parent->GetMatrix()) - *m = *sm->Parent->GetMatrix() * *m; - sm = sm->Parent; - } - // dla ostatniego może być potrzebny dodatkowy obrót, jeÅ›li wczytano z T3D, a - // nie obrócono jeszcze + // jeÅ›li nie zostaÅ‚o wykonane Init() (tzn. zaraz po wczytaniu T3D), to + // dodatkowy obrót + // obrót T3D jest wymagany np. do policzenia wysokoÅ›ci pantografów + *m = float4x4(*fMatrix); // skopiowanie, bo bÄ™dziemy mnożyć + // m(3)[1]=m[3][1]+0.054; //w górÄ™ o wysokość Å›lizgu (na razie tak) + TSubModel *sm = this; + while (sm->Parent) + { // przenieść tÄ™ funkcjÄ™ do modelu + if (sm->Parent->GetMatrix()) + *m = *sm->Parent->GetMatrix() * *m; + sm = sm->Parent; + } + // dla ostatniego może być potrzebny dodatkowy obrót, jeÅ›li wczytano z T3D, a + // nie obrócono jeszcze }; float TSubModel::MaxY(const float4x4 &m) { // obliczenie maksymalnej wysokoÅ›ci, - // na poczÄ…tek Å›lizgu w pantografie - if (eType != 4) - return 0; // tylko dla trójkÄ…tów liczymy - if (iNumVerts < 1) - return 0; - if (!Vertices) - return 0; - float y, - my = m[0][1] * Vertices[0].Point.x + m[1][1] * Vertices[0].Point.y + - m[2][1] * Vertices[0].Point.z + m[3][1]; - for (int i = 1; i < iNumVerts; ++i) - { - y = m[0][1] * Vertices[i].Point.x + m[1][1] * Vertices[i].Point.y + - m[2][1] * Vertices[i].Point.z + m[3][1]; - if (my < y) - my = y; - } - return my; + // na poczÄ…tek Å›lizgu w pantografie + if (eType != 4) + return 0; // tylko dla trójkÄ…tów liczymy + if (iNumVerts < 1) + return 0; + if (!Vertices) + return 0; + float y, + my = m[0][1] * Vertices[0].Point.x + m[1][1] * Vertices[0].Point.y + + m[2][1] * Vertices[0].Point.z + m[3][1]; + for (int i = 1; i < iNumVerts; ++i) + { + y = m[0][1] * Vertices[i].Point.x + m[1][1] * Vertices[i].Point.y + + m[2][1] * Vertices[i].Point.z + m[3][1]; + if (my < y) + my = y; + } + return my; }; //--------------------------------------------------------------------------- TModel3d::TModel3d() { - // Materials=NULL; - // MaterialsCount=0; - Root = NULL; - iFlags = 0; - iSubModelsCount = 0; - iModel = NULL; // tylko jak wczytany model binarny - iNumVerts = 0; // nie ma jeszcze wierzchoÅ‚ków + // Materials=NULL; + // MaterialsCount=0; + Root = NULL; + iFlags = 0; + iSubModelsCount = 0; + iModel = NULL; // tylko jak wczytany model binarny + iNumVerts = 0; // nie ma jeszcze wierzchoÅ‚ków }; /* - TModel3d::TModel3d(char *FileName) +TModel3d::TModel3d(char *FileName) { // Root=NULL; // Materials=NULL; // MaterialsCount=0; - Root=NULL; - SubModelsCount=0; - iFlags=0; - LoadFromFile(FileName); +Root=NULL; +SubModelsCount=0; +iFlags=0; +LoadFromFile(FileName); }; */ TModel3d::~TModel3d() { - // SafeDeleteArray(Materials); - if (iFlags & 0x0200) - { // wczytany z pliku tekstowego, submodele sprzÄ…tajÄ… - // same - SafeDelete(Root); // submodele siÄ™ usunÄ… rekurencyjnie - } - else - { // wczytano z pliku binarnego (jest wÅ‚aÅ›cicielem tablic) - m_pVNT = NULL; // nie usuwać tego, bo wskazuje na iModel - Root = NULL; - delete[] iModel; // usuwamy caÅ‚y wczytany plik i to wystarczy - } - // później siÄ™ jeszcze usuwa obiekt z którego dziedziczymy tabelÄ™ VBO + // SafeDeleteArray(Materials); + if (iFlags & 0x0200) + { // wczytany z pliku tekstowego, submodele sprzÄ…tajÄ… + // same + SafeDelete(Root); // submodele siÄ™ usunÄ… rekurencyjnie + } + else + { // wczytano z pliku binarnego (jest wÅ‚aÅ›cicielem tablic) + m_pVNT = NULL; // nie usuwać tego, bo wskazuje na iModel + Root = NULL; + delete[] iModel; // usuwamy caÅ‚y wczytany plik i to wystarczy + } + // później siÄ™ jeszcze usuwa obiekt z którego dziedziczymy tabelÄ™ VBO }; TSubModel *TModel3d::AddToNamed(const char *Name, TSubModel *SubModel) { - TSubModel *sm = Name ? GetFromName(Name) : NULL; - AddTo(sm, SubModel); // szukanie nadrzÄ™dnego - return sm; // zwracamy wskaźnik do nadrzÄ™dnego submodelu + TSubModel *sm = Name ? GetFromName(Name) : NULL; + AddTo(sm, SubModel); // szukanie nadrzÄ™dnego + return sm; // zwracamy wskaźnik do nadrzÄ™dnego submodelu }; void TModel3d::AddTo(TSubModel *tmp, TSubModel *SubModel) { // jedyny poprawny sposób dodawania - // submodeli, inaczej mogÄ… zginąć - // przy zapisie E3D - if (tmp) - { // jeÅ›li znaleziony, podłączamy mu jako potomny - tmp->ChildAdd(SubModel); - } - else - { // jeÅ›li nie znaleziony, podczepiamy do Å‚aÅ„cucha głównego - SubModel->NextAdd(Root); // Ra: zmiana kolejnoÅ›ci renderowania wymusza zmianÄ™ tu - Root = SubModel; - } - ++iSubModelsCount; // teraz jest o 1 submodel wiÄ™cej - iFlags |= 0x0200; // submodele sÄ… oddzielne + // submodeli, inaczej mogÄ… zginąć + // przy zapisie E3D + if (tmp) + { // jeÅ›li znaleziony, podłączamy mu jako potomny + tmp->ChildAdd(SubModel); + } + else + { // jeÅ›li nie znaleziony, podczepiamy do Å‚aÅ„cucha głównego + SubModel->NextAdd(Root); // Ra: zmiana kolejnoÅ›ci renderowania wymusza zmianÄ™ tu + Root = SubModel; + } + ++iSubModelsCount; // teraz jest o 1 submodel wiÄ™cej + iFlags |= 0x0200; // submodele sÄ… oddzielne }; TSubModel *TModel3d::GetFromName(const char *sName) { // wyszukanie submodelu po nazwie - if (!sName) - return Root; // potrzebne do terenu z E3D - if (iFlags & 0x0200) // wczytany z pliku tekstowego, wyszukiwanie rekurencyjne - return Root ? Root->GetFromName(sName) : NULL; - else // wczytano z pliku binarnego, można wyszukać iteracyjnie - { - // for (int i=0;iGetFromName(sName) : NULL; - } + if (!sName) + return Root; // potrzebne do terenu z E3D + if (iFlags & 0x0200) // wczytany z pliku tekstowego, wyszukiwanie rekurencyjne + return Root ? Root->GetFromName(sName) : NULL; + else // wczytano z pliku binarnego, można wyszukać iteracyjnie + { + // for (int i=0;iGetFromName(sName) : NULL; + } }; /* TMaterial* TModel3d::GetMaterialFromName(char *sName) { - AnsiString tmp=AnsiString(sName).Trim(); - for (int i=0; i 0) : false; // brak pliku albo problem z wczytaniem - if (false == result) - { - ErrorLog("Failed to load 3d model \"" + FileName + "\""); - } - return result; + asBinary = name + ".e3d"; + if (FileExists(asBinary)) + { + LoadFromBinFile(asBinary, dynamic); + asBinary = ""; // wyłączenie zapisu + Init(); + } + else + { + if (FileExists(name + ".t3d")) + { + LoadFromTextFile(FileName, dynamic); // wczytanie tekstowego + if (!dynamic) // pojazdy dopiero po ustawieniu animacji + Init(); // generowanie siatek i zapis E3D + } + } + bool const result = + Root ? (iSubModelsCount > 0) : false; // brak pliku albo problem z wczytaniem + if (false == result) + { + ErrorLog("Failed to load 3d model \"" + FileName + "\""); + } + return result; +}; + +// E3D serialization +// http://rainsted.com/pl/Format_binarny_modeli_-_E3D + + +//m7todo: wymyÅ›lić lepszÄ… nazwÄ™ +template +size_t get_container_pos(L &list, T o) +{ + auto i = std::find(list.begin(), list.end(), o); + if (i == list.end()) + { + list.push_back(o); + return list.size() - 1; + } + else + { + return std::distance(list.begin(), i); + } +} + +//m7todo: za dużo argumentów, może przenieść do osobnej +//klasy serializera majÄ…cej wÅ‚asny stan, albo zrobić +//strukturÄ™ TModel3d::SerializerContext? +void TSubModel::serialize(std::ostream &s, + std::vector &models, + std::vector &names, + std::vector &textures, + std::vector &transforms) +{ + size_t end = (size_t)s.tellp() + 256; + + if (!Next) + sn_utils::ls_int32(s, -1); + else + sn_utils::ls_int32(s, (int32_t)get_container_pos(models, Next)); + if (!Child) + sn_utils::ls_int32(s, -1); + else + sn_utils::ls_int32(s, (int32_t)get_container_pos(models, Child)); + + sn_utils::ls_int32(s, eType); + if (pName.size() == 0) + sn_utils::ls_int32(s, -1); + else + sn_utils::ls_int32(s, (int32_t)get_container_pos(names, pName)); + sn_utils::ls_int32(s, (int)b_Anim); + + sn_utils::ls_int32(s, iFlags); + sn_utils::ls_int32(s, (int32_t)get_container_pos(transforms, *fMatrix)); + + sn_utils::ls_int32(s, iNumVerts); + sn_utils::ls_int32(s, (int)iVboPtr); + if (TextureID <= 0) + sn_utils::ls_int32(s, TextureID); + else + sn_utils::ls_int32(s, (int32_t)get_container_pos(textures, pTexture)); + + sn_utils::ls_float32(s, fVisible); + sn_utils::ls_float32(s, fLight); + + for (size_t i = 0; i < 4; i++) + sn_utils::ls_float32(s, f4Ambient[i]); + for (size_t i = 0; i < 4; i++) + sn_utils::ls_float32(s, f4Diffuse[i]); + for (size_t i = 0; i < 4; i++) + sn_utils::ls_float32(s, f4Specular[i]); + for (size_t i = 0; i < 4; i++) + sn_utils::ls_float32(s, f4Emision[i]); + + sn_utils::ls_float32(s, fWireSize); + sn_utils::ls_float32(s, fSquareMaxDist); + sn_utils::ls_float32(s, fSquareMinDist); + + sn_utils::ls_float32(s, fNearAttenStart); + sn_utils::ls_float32(s, fNearAttenEnd); + sn_utils::ls_uint32(s, bUseNearAtten ? 1 : 0); + + sn_utils::ls_int32(s, iFarAttenDecay); + sn_utils::ls_float32(s, fFarDecayRadius); + sn_utils::ls_float32(s, fCosFalloffAngle); + sn_utils::ls_float32(s, fCosHotspotAngle); + sn_utils::ls_float32(s, fCosViewAngle); + + size_t fill = end - s.tellp(); + for (size_t i = 0; i < fill; i++) + s.put(0); +} + +void TModel3d::SaveToBinFile(char const *FileName) +{ + WriteLog("saving e3d model.."); + + //m7todo: można by zoptymalizować robiÄ…c unordered_map + //na wyszukiwanie numerów już dodanych stringów i osobno + //vector na wskaźniki do stringów w kolejnoÅ›ci numeracji + //tylko czy potrzeba? + std::vector models; + models.push_back(Root); + std::vector names; + std::vector textures; + textures.push_back(""); + std::vector transforms; + + std::ofstream s(FileName, std::ios::binary); + + sn_utils::ls_uint32(s, MAKE_ID4('E', '3', 'D', '0')); + size_t e3d_spos = s.tellp(); + sn_utils::ls_uint32(s, 0); + + { + sn_utils::ls_uint32(s, MAKE_ID4('S', 'U', 'B', '0')); + size_t sub_spos = s.tellp(); + sn_utils::ls_uint32(s, 0); + for (size_t i = 0; i < models.size(); i++) + models[i]->serialize(s, models, names, textures, transforms); + size_t pos = s.tellp(); + s.seekp(sub_spos); + sn_utils::ls_uint32(s, (uint32_t)(4 + pos - sub_spos)); + s.seekp(pos); + } + + sn_utils::ls_uint32(s, MAKE_ID4('T', 'R', 'A', '0')); + sn_utils::ls_uint32(s, 8 + (uint32_t)transforms.size() * 64); + for (size_t i = 0; i < transforms.size(); i++) + transforms[i].serialize_float32(s); + + MakeArray(iNumVerts); + Root->RaArrayFill(m_pVNT); + sn_utils::ls_uint32(s, MAKE_ID4('V', 'N', 'T', '0')); + sn_utils::ls_uint32(s, 8 + iNumVerts * 32); + for (size_t i = 0; i < (size_t)iNumVerts; i++) + m_pVNT[i].serialize(s); + + if (textures.size()) + { + sn_utils::ls_uint32(s, MAKE_ID4('T', 'E', 'X', '0')); + size_t tex_spos = s.tellp(); + sn_utils::ls_uint32(s, 0); + for (size_t i = 0; i < textures.size(); i++) + sn_utils::s_str(s, textures[i]); + size_t pos = s.tellp(); + s.seekp(tex_spos); + sn_utils::ls_uint32(s, (uint32_t)(4 + pos - tex_spos)); + s.seekp(pos); + } + + if (names.size()) + { + sn_utils::ls_uint32(s, MAKE_ID4('N', 'A', 'M', '0')); + size_t nam_spos = s.tellp(); + sn_utils::ls_uint32(s, 0); + for (size_t i = 0; i < names.size(); i++) + sn_utils::s_str(s, names[i]); + size_t pos = s.tellp(); + s.seekp(nam_spos); + sn_utils::ls_uint32(s, (uint32_t)(4 + pos - nam_spos)); + s.seekp(pos); + } + + size_t end = s.tellp(); + s.seekp(e3d_spos); + sn_utils::ls_uint32(s, (uint32_t)(4 + end - e3d_spos)); + s.close(); + + WriteLog("..done."); +} + +void TSubModel::deserialize(std::istream &s) +{ + iNext = sn_utils::ld_int32(s); + iChild = sn_utils::ld_int32(s); + + eType = sn_utils::ld_int32(s); + iName = sn_utils::ld_int32(s); + + b_Anim = (TAnimType)sn_utils::ld_int32(s); + + iFlags = sn_utils::ld_int32(s); + iMatrix = sn_utils::ld_int32(s); + + iNumVerts = sn_utils::ld_int32(s); + tVboPtr = sn_utils::ld_int32(s); + iTexture = sn_utils::ld_int32(s); + + fVisible = sn_utils::ld_float32(s); + fLight = sn_utils::ld_float32(s); + + for (size_t i = 0; i < 4; i++) + f4Ambient[i] = sn_utils::ld_float32(s); + for (size_t i = 0; i < 4; i++) + f4Diffuse[i] = sn_utils::ld_float32(s); + for (size_t i = 0; i < 4; i++) + f4Specular[i] = sn_utils::ld_float32(s); + for (size_t i = 0; i < 4; i++) + f4Emision[i] = sn_utils::ld_float32(s); + + fWireSize = sn_utils::ld_float32(s); + fSquareMaxDist = sn_utils::ld_float32(s); + fSquareMinDist = sn_utils::ld_float32(s); + + fNearAttenStart = sn_utils::ld_float32(s); + fNearAttenEnd = sn_utils::ld_float32(s); + bUseNearAtten = sn_utils::ld_uint32(s) != 0; + iFarAttenDecay = sn_utils::ld_int32(s); + fFarDecayRadius = sn_utils::ld_float32(s); + fCosFalloffAngle = sn_utils::ld_float32(s); + fCosHotspotAngle = sn_utils::ld_float32(s); + fCosViewAngle = sn_utils::ld_float32(s); +} + +void TModel3d::deserialize(std::istream &s, size_t size, bool dynamic) +{ + m_pVNT = nullptr; + Root = nullptr; + float4x4 *tm = nullptr; + + std::streampos end = s.tellg() + (std::streampos)size; + + while (s.tellg() < end) + { + uint32_t type = sn_utils::ld_uint32(s); + uint32_t size = sn_utils::ld_uint32(s) - 8; + std::streampos end = s.tellg() + (std::streampos)size; + + if (type == MAKE_ID4('V', 'N', 'T', '0')) + { + if (m_pVNT != nullptr) + throw std::runtime_error("e3d: duplicated VNT chunk"); + + size_t vt_cnt = size / 32; + iNumVerts = (int)vt_cnt; + m_nVertexCount = (int)vt_cnt; + m_pVNT = new CVertNormTex[vt_cnt]; + for (size_t i = 0; i < vt_cnt; i++) + m_pVNT[i].deserialize(s); + } + else if ((type & 0x00FFFFFF) == MAKE_ID4('S', 'U', 'B', 0)) + { + if (Root != nullptr) + throw std::runtime_error("e3d: duplicated SUB chunk"); + + size_t sm_size = 256 + 64 * (((type & 0xFF000000) >> 24) - '0'); + size_t sm_cnt = size / sm_size; + iSubModelsCount = (int)sm_cnt; + Root = new TSubModel[sm_cnt]; + size_t pos = s.tellg(); + for (size_t i = 0; i < sm_cnt; i++) + { + s.seekg(pos + sm_size * i); + Root[i].deserialize(s); + } + } + else if (type == MAKE_ID4('T', 'R', 'A', '0')) + { + if (tm != nullptr) + throw std::runtime_error("e3d: duplicated TRA chunk"); + size_t t_cnt = size / 64; + + tm = new float4x4[t_cnt]; + for (size_t i = 0; i < t_cnt; i++) + tm[i].deserialize_float32(s); + } + else if (type == MAKE_ID4('T', 'R', 'A', '1')) + { + if (tm != nullptr) + throw std::runtime_error("e3d: duplicated TRA chunk"); + size_t t_cnt = size / 128; + + tm = new float4x4[t_cnt]; + for (size_t i = 0; i < t_cnt; i++) + tm[i].deserialize_float64(s); + } + else if (type == MAKE_ID4('T', 'E', 'X', '0')) + { + if (Textures.size()) + throw std::runtime_error("e3d: duplicated TEX chunk"); + while (s.tellg() < end) + Textures.push_back(sn_utils::d_str(s)); + } + else if (type == MAKE_ID4('N', 'A', 'M', '0')) + { + if (Names.size()) + throw std::runtime_error("e3d: duplicated NAM chunk"); + while (s.tellg() < end) + Names.push_back(sn_utils::d_str(s)); + } + + s.seekg(end); + } + + if (!Root) + throw std::runtime_error("e3d: no submodels"); + + if (!m_pVNT) + throw std::runtime_error("e3d: no vertices"); + + for (size_t i = 0; (int)i < iSubModelsCount; i++) + { + Root[i].BinInit(Root, tm, (float8*)m_pVNT, &Textures, &Names, dynamic); + + if (Root[i].ChildGet()) + Root[i].ChildGet()->Parent = &Root[i]; + if (Root[i].NextGet()) + Root[i].NextGet()->Parent = Root[i].Parent; + } +} + +void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, + std::vector *t, std::vector *n, bool dynamic) +{ // ustawienie wskaźników w submodelu + //m7todo: brzydko + iVisible = 1; // tymczasowo używane + Child = (iChild > 0) ? s + iChild : nullptr; // zerowy nie może być potomnym + Next = (iNext > 0) ? s + iNext : nullptr; // zerowy nie może być nastÄ™pnym + fMatrix = ((iMatrix >= 0) && m) ? m + iMatrix : nullptr; + if (n->size() && (iName >= 0)) + { + pName = n->at(iName); + if (!pName.empty()) + { // jeÅ›li dany submodel jest zgaszonym Å›wiatÅ‚em, to + // domyÅ›lnie go ukrywamy + if ((pName.size() >= 8) && (pName.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 ((pName.size() >= 3) && (pName.substr(pName.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" + } + } + else + pName = ""; + if (iTexture > 0) + { // obsÅ‚uga staÅ‚ej tekstury + // TextureID=TTexturesManager::GetTextureID(t->String(TextureID)); + // asTexture=AnsiString(t->String(iTexture)); + pTexture = t->at(iTexture); + if (pTexture.find_last_of("/\\") == std::string::npos) + pTexture.insert(0, Global::asCurrentTexturePath); + TextureID = GfxRenderer.GetTextureId(pTexture, szTexturePath); + } + else + TextureID = iTexture; + b_aAnim = b_Anim; // skopiowanie animacji do drugiego cyklu + iFlags &= ~0x0200; // wczytano z pliku binarnego (nie jest wÅ‚aÅ›cicielem + // tablic) + iVboPtr = tVboPtr; + Vertices = v + iVboPtr; + // if (!iNumVerts) eType=-1; //tymczasowo zmiana typu, żeby siÄ™ nie + // renderowaÅ‚o na siłę }; void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic) { // wczytanie modelu z pliku binarnego - WriteLog("Loading - binary model: " + FileName); - int i = 0, j, k, ch, size; + WriteLog("loading e3d model " + FileName + " .."); + + std::ifstream file(FileName, std::ios::binary); - /* 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 == 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 - k = (iModel[i + 1] >> 2); // dÅ‚ugość aktualnej kromki - switch (ch) - { - case MAKE_ID4('M', 'D', 'L', - '0'): // zmienne modelu: 'E3D0',len,(informacje o modelu) - break; - 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 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 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 - for (ch = 1; ch < iSubModelsCount; - ++ch) // trzeba przesunąć bliżej, bo 256 wystarczy - MoveMemory(((char *)Root) + 256 * ch, ((char *)Root) + 320 * ch, 256); - break; - case MAKE_ID4('T', 'R', 'A', '0'): // transformy: 'TRA0',len,(64 bajty na transform) - m = (float4x4 *)(iModel + i + 2); // tabela transformów - break; - 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 MAKE_ID4('I', 'D', 'X', - '1'): // indeksy 1B: 'IDX2',len,(po bajcie na numer wierzchoÅ‚ka) - break; - case MAKE_ID4('I', 'D', 'X', - '2'): // indeksy 2B: 'IDX2',len,(po 2 bajty na numer wierzchoÅ‚ka) - break; - case MAKE_ID4('I', 'D', 'X', - '4'): // indeksy 4B: 'IDX4',len,(po 4 bajty na numer wierzchoÅ‚ka) - break; - 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 MAKE_ID4('T', 'I', 'X', '0'): // indeks nazw tekstur - Textures.InitIndex((int *)(iModel + i)); //łącznie z nagłówkiem - break; - 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 MAKE_ID4('N', 'I', 'X', '0'): // indeks nazw submodeli - Names.InitIndex((int *)(iModel + i)); //łącznie z nagłówkiem - break; - } - i += k; // przejÅ›cie do kolejnej kromki - } - } - i = j; - } - for (i = 0; i < iSubModelsCount; ++i) - { // aktualizacja wskaźników w submodelach - Root[i].BinInit(Root, m, (float8 *)m_pVNT, &Textures, &Names, dynamic); - if (Root[i].ChildGet()) - Root[i].ChildGet()->Parent = Root + i; // wpisanie wskaźnika nadrzÄ™dnego do potmnego - if (Root[i].NextGet()) - Root[i].NextGet()->Parent = - Root[i].Parent; // skopiowanie wskaźnika nadrzÄ™dnego do kolejnego - } - iFlags &= ~0x0200; - return; + uint32_t type = sn_utils::ld_uint32(file); + uint32_t size = sn_utils::ld_uint32(file) - 8; + + if (type != MAKE_ID4('E', '3', 'D', '0')) + throw std::runtime_error("e3d: unknown main chunk"); + + deserialize(file, size, dynamic); + file.close(); + + WriteLog("..done."); }; void TModel3d::LoadFromTextFile(std::string const &FileName, bool dynamic) { // wczytanie submodelu z pliku tekstowego - 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(); - 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 >> 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 - // iSubModelsCount++; - parser.getTokens(); - parser >> token; - } - // Ra: od wersji 334 przechylany jest caÅ‚y model, a nie tylko pierwszy - // submodel - // ale bujanie kabiny nadal używa bananów :( od 393 przywrócone, ale z - // dodatkowym warunkiem - if (Global::iConvertModels & 4) - { // automatyczne banany czasem psuÅ‚y przechylanie kabin... - if (dynamic && Root) - { - if (Root->NextGet()) // jeÅ›li ma jakiekolwiek kolejne - { // dynamic musi mieć "banana", bo tylko pierwszy obiekt jest animowany, - // a nastÄ™pne nie - SubModel = new TSubModel(); // utworzenie pustego - SubModel->ChildAdd(Root); - Root = SubModel; - ++iSubModelsCount; - } - Root->WillBeAnimated(); // bo z tym jest dużo problemów - } - } + 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(); + 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 >> 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 + // iSubModelsCount++; + parser.getTokens(); + parser >> token; + } + // Ra: od wersji 334 przechylany jest caÅ‚y model, a nie tylko pierwszy + // submodel + // ale bujanie kabiny nadal używa bananów :( od 393 przywrócone, ale z + // dodatkowym warunkiem + if (Global::iConvertModels & 4) + { // automatyczne banany czasem psuÅ‚y przechylanie kabin... + if (dynamic && Root) + { + if (Root->NextGet()) // jeÅ›li ma jakiekolwiek kolejne + { // dynamic musi mieć "banana", bo tylko pierwszy obiekt jest animowany, + // a nastÄ™pne nie + SubModel = new TSubModel(); // utworzenie pustego + SubModel->ChildAdd(Root); + Root = SubModel; + ++iSubModelsCount; + } + Root->WillBeAnimated(); // bo z tym jest dużo problemów + } + } } void TModel3d::Init() { // obrócenie poczÄ…tkowe ukÅ‚adu współrzÄ™dnych, dla - // pojazdów wykonywane po analizie animacji - if (iFlags & 0x8000) - return; // operacje zostaÅ‚y już wykonane - if (Root) - { - if (iFlags & 0x0200) // jeÅ›li wczytano z pliku tekstowego - { // jest jakiÅ› dziwny błąd, że obkrÄ™cany ma być tylko ostatni submodel - // głównego Å‚aÅ„cucha - // TSubModel *p=Root; - // do - //{p->InitialRotate(true); //ostatniemu należy siÄ™ konwersja ukÅ‚adu - // współrzÄ™dnych - // p=p->NextGet(); - //} - // while (p->NextGet()) - // Root->InitialRotate(false); //a poprzednim tylko optymalizacja - Root->InitialRotate(true); // argumet okreÅ›la, czy wykonać pierwotny obrót - } - iFlags |= Root->FlagsCheck() | 0x8000; // flagi caÅ‚ego modelu - if (false == asBinary.empty()) // jeÅ›li jest podana nazwa - { - if (Global::iConvertModels) // i włączony zapis - SaveToBinFile(asBinary.c_str()); // utworzy tablicÄ™ (m_pVNT) - asBinary = ""; // zablokowanie powtórnego zapisu - } - if (iNumVerts) - { - if (Global::fDistanceFactor != - 1.0) // trochÄ™ zaoszczÄ™dzi czasu na modelach z wieloma submocelami - Root->AdjustDist(); // aktualizacja odlegÅ‚oÅ›ci faz LoD, zależnie od - // rozdzielczoÅ›ci pionowej oraz multisamplingu - if (Global::bUseVBO) - { - if (!m_pVNT) // jeÅ›li nie ma jeszcze tablicy (wczytano z pliku - // tekstowego) - { // tworzenie tymczasowej tablicy z wierzchoÅ‚kami caÅ‚ego modelu - MakeArray(iNumVerts); // tworzenie tablic dla VBO - Root->RaArrayFill(m_pVNT); // wypeÅ‚nianie tablicy - BuildVBOs(); // tworzenie VBO i usuwanie tablicy z pamiÄ™ci - } - else - BuildVBOs(false); // tworzenie VBO bez usuwania tablicy z pamiÄ™ci - } - else - { // przygotowanie skompilowanych siatek dla DisplayLists - Root->DisplayLists(); // tworzenie skompilowanej listy dla submodelu - } - // if (Root->TextureID) //o ile ma teksturÄ™ - // Root->iFlags|=0x80; //konieczność ustawienia tekstury - } - } -}; - -void TModel3d::SaveToBinFile(char const *FileName) -{ // zapis modelu binarnego - WriteLog("Saving E3D binary model."); - int i, zero = 0; - TSubModelInfo *info = new TSubModelInfo[iSubModelsCount]; - info->Reset(); - Root->Info(); // zebranie informacji o submodelach - int len; //łączna dÅ‚ugość pliku - int sub; // ilość submodeli (w bajtach) - int tra; // wielkość obszaru transformów - int vnt; // wielkość obszaru wierzchoÅ‚ków - int tex = 0; // wielkość obszaru nazw tekstur - int nam = 0; // wielkość obszaru nazw submodeli - sub = 8 + sizeof(TSubModel) * iSubModelsCount; - tra = info->iTotalTransforms ? 8 + 64 * info->iTotalTransforms : 0; - vnt = 8 + 32 * iNumVerts; - for (i = 0; i < iSubModelsCount; ++i) - { - tex += info[i].iTextureLen; - nam += info[i].iNameLen; - } - if (tex) - tex += 9; // 8 na nagłówek i jeden ciÄ…g pusty (tylko znacznik koÅ„ca) - 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); -*/ { - 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; - //&roboczy->asTexture=asT; - delete roboczy; - delete[] info; + // pojazdów wykonywane po analizie animacji + if (iFlags & 0x8000) + return; // operacje zostaÅ‚y już wykonane + if (Root) + { + if (iFlags & 0x0200) // jeÅ›li wczytano z pliku tekstowego + { // jest jakiÅ› dziwny błąd, że obkrÄ™cany ma być tylko ostatni submodel + // głównego Å‚aÅ„cucha + // TSubModel *p=Root; + // do + //{p->InitialRotate(true); //ostatniemu należy siÄ™ konwersja ukÅ‚adu + // współrzÄ™dnych + // p=p->NextGet(); + //} + // while (p->NextGet()) + // Root->InitialRotate(false); //a poprzednim tylko optymalizacja + Root->InitialRotate(true); // argumet okreÅ›la, czy wykonać pierwotny obrót + } + iFlags |= Root->FlagsCheck() | 0x8000; // flagi caÅ‚ego modelu + if (false == asBinary.empty()) // jeÅ›li jest podana nazwa + { + if (Global::iConvertModels) // i włączony zapis + SaveToBinFile(asBinary.c_str()); // utworzy tablicÄ™ (m_pVNT) + asBinary = ""; // zablokowanie powtórnego zapisu + } + if (iNumVerts) + { + if (Global::fDistanceFactor != + 1.0) // trochÄ™ zaoszczÄ™dzi czasu na modelach z wieloma submocelami + Root->AdjustDist(); // aktualizacja odlegÅ‚oÅ›ci faz LoD, zależnie od + // rozdzielczoÅ›ci pionowej oraz multisamplingu + if (Global::bUseVBO) + { + if (!m_pVNT) // jeÅ›li nie ma jeszcze tablicy (wczytano z pliku + // tekstowego) + { // tworzenie tymczasowej tablicy z wierzchoÅ‚kami caÅ‚ego modelu + MakeArray(iNumVerts); // tworzenie tablic dla VBO + Root->RaArrayFill(m_pVNT); // wypeÅ‚nianie tablicy + BuildVBOs(); // tworzenie VBO i usuwanie tablicy z pamiÄ™ci + } + else + BuildVBOs(false); // tworzenie VBO bez usuwania tablicy z pamiÄ™ci + } + else + { // przygotowanie skompilowanych siatek dla DisplayLists + Root->DisplayLists(); // tworzenie skompilowanej listy dla submodelu + } + // if (Root->TextureID) //o ile ma teksturÄ™ + // Root->iFlags|=0x80; //konieczność ustawienia tekstury + } + } }; void TModel3d::BreakHierarhy() { - Error("Not implemented yet :("); + Error("Not implemented yet :("); }; /* @@ -2155,52 +2156,52 @@ ReplacableSkinId,int iAlpha) { // glColor3f(1.0f,1.0f,1.0f); // glColor3f(0.0f,0.0f,0.0f); - glPushMatrix(); +glPushMatrix(); - glTranslated(pPosition.x,pPosition.y,pPosition.z); - if (fAngle!=0) - glRotatef(fAngle,0,1,0); +glTranslated(pPosition.x,pPosition.y,pPosition.z); +if (fAngle!=0) +glRotatef(fAngle,0,1,0); /* - matrix4x4 Identity; - Identity.Identity(); +matrix4x4 Identity; +Identity.Identity(); - matrix4x4 CurrentMatrix; - glGetdoublev(GL_MODELVIEW_MATRIX,CurrentMatrix.getArray()); - vector3 pos=vector3(0,0,0); - pos=CurrentMatrix*pos; - fSquareDist=SquareMagnitude(pos); - * / - fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); +matrix4x4 CurrentMatrix; +glGetdoublev(GL_MODELVIEW_MATRIX,CurrentMatrix.getArray()); +vector3 pos=vector3(0,0,0); +pos=CurrentMatrix*pos; +fSquareDist=SquareMagnitude(pos); +* / +fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); #ifdef _DEBUG - if (Root) - Root->Render(ReplacableSkinId,iAlpha); +if (Root) +Root->Render(ReplacableSkinId,iAlpha); #else - Root->Render(ReplacableSkinId,iAlpha); +Root->Render(ReplacableSkinId,iAlpha); #endif - glPopMatrix(); +glPopMatrix(); }; */ void TModel3d::Render(double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha) { - iAlpha ^= 0x0F0F000F; // odwrócenie flag tekstur, aby wyÅ‚apać nieprzezroczyste - if (iAlpha & iFlags & 0x1F1F001F) // czy w ogóle jest co robić w tym cyklu? - { - TSubModel::fSquareDist = fSquareDistance; // zmienna globalna! - Root->ReplacableSet(ReplacableSkinId, iAlpha); - Root->RenderDL(); - } + iAlpha ^= 0x0F0F000F; // odwrócenie flag tekstur, aby wyÅ‚apać nieprzezroczyste + if (iAlpha & iFlags & 0x1F1F001F) // czy w ogóle jest co robić w tym cyklu? + { + TSubModel::fSquareDist = fSquareDistance; // zmienna globalna! + Root->ReplacableSet(ReplacableSkinId, iAlpha); + Root->RenderDL(); + } }; void TModel3d::RenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha) { - if (iAlpha & iFlags & 0x2F2F002F) - { - TSubModel::fSquareDist = fSquareDistance; // zmienna globalna! - Root->ReplacableSet(ReplacableSkinId, iAlpha); - Root->RenderAlphaDL(); - } + if (iAlpha & iFlags & 0x2F2F002F) + { + TSubModel::fSquareDist = fSquareDistance; // zmienna globalna! + Root->ReplacableSet(ReplacableSkinId, iAlpha); + Root->RenderAlphaDL(); + } }; /* @@ -2210,61 +2211,61 @@ iAlpha) { // glColor3f(1.0f,1.0f,1.0f); // glColor3f(0.0f,0.0f,0.0f); - glPushMatrix(); //zapamiÄ™tanie matrycy przeksztaÅ‚cenia - glTranslated(pPosition.x,pPosition.y,pPosition.z); - if (fAngle!=0) - glRotatef(fAngle,0,1,0); +glPushMatrix(); //zapamiÄ™tanie matrycy przeksztaÅ‚cenia +glTranslated(pPosition.x,pPosition.y,pPosition.z); +if (fAngle!=0) +glRotatef(fAngle,0,1,0); /* - matrix4x4 Identity; - Identity.Identity(); +matrix4x4 Identity; +Identity.Identity(); - matrix4x4 CurrentMatrix; - glGetdoublev(GL_MODELVIEW_MATRIX,CurrentMatrix.getArray()); - vector3 pos=vector3(0,0,0); - pos=CurrentMatrix*pos; - fSquareDist=SquareMagnitude(pos); +matrix4x4 CurrentMatrix; +glGetdoublev(GL_MODELVIEW_MATRIX,CurrentMatrix.getArray()); +vector3 pos=vector3(0,0,0); +pos=CurrentMatrix*pos; +fSquareDist=SquareMagnitude(pos); */ /* - fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna +fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna globalna! - if (StartVBO()) - {//odwrócenie flag, aby wyÅ‚apać nieprzezroczyste - Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F); - Root->RaRender(); - EndVBO(); - } - glPopMatrix(); //przywrócenie ustawieÅ„ przeksztaÅ‚cenia +if (StartVBO()) +{//odwrócenie flag, aby wyÅ‚apać nieprzezroczyste +Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F); +Root->RaRender(); +EndVBO(); +} +glPopMatrix(); //przywrócenie ustawieÅ„ przeksztaÅ‚cenia }; */ -void TModel3d::RaRender( double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha ) +void TModel3d::RaRender(double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha) { // renderowanie specjalne, np. kabiny - iAlpha ^= 0x0F0F000F; // odwrócenie flag tekstur, aby wyÅ‚apać nieprzezroczyste - if (iAlpha & iFlags & 0x1F1F001F) // czy w ogóle jest co robić w tym cyklu? - { - TSubModel::fSquareDist = fSquareDistance; // zmienna globalna! - if (StartVBO()) - { // odwrócenie flag, aby wyÅ‚apać nieprzezroczyste - Root->ReplacableSet(ReplacableSkinId, iAlpha); - Root->pRoot = this; - Root->RenderVBO(); - EndVBO(); - } - } + iAlpha ^= 0x0F0F000F; // odwrócenie flag tekstur, aby wyÅ‚apać nieprzezroczyste + if (iAlpha & iFlags & 0x1F1F001F) // czy w ogóle jest co robić w tym cyklu? + { + TSubModel::fSquareDist = fSquareDistance; // zmienna globalna! + if (StartVBO()) + { // odwrócenie flag, aby wyÅ‚apać nieprzezroczyste + Root->ReplacableSet(ReplacableSkinId, iAlpha); + Root->pRoot = this; + Root->RenderVBO(); + EndVBO(); + } + } }; void TModel3d::RaRenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha) { // renderowanie specjalne, np. kabiny - if (iAlpha & iFlags & 0x2F2F002F) // czy w ogóle jest co robić w tym cyklu? - { - TSubModel::fSquareDist = fSquareDistance; // zmienna globalna! - if (StartVBO()) - { - Root->ReplacableSet(ReplacableSkinId, iAlpha); - Root->RenderAlphaVBO(); - EndVBO(); - } - } + if (iAlpha & iFlags & 0x2F2F002F) // czy w ogóle jest co robić w tym cyklu? + { + TSubModel::fSquareDist = fSquareDistance; // zmienna globalna! + if (StartVBO()) + { + Root->ReplacableSet(ReplacableSkinId, iAlpha); + Root->RenderAlphaVBO(); + EndVBO(); + } + } }; /* @@ -2272,18 +2273,18 @@ void TModel3d::RaRenderAlpha(vector3 pPosition,double fAngle,GLuint *ReplacableSkinId,int iAlpha) { - glPushMatrix(); - glTranslatef(pPosition.x,pPosition.y,pPosition.z); - if (fAngle!=0) - glRotatef(fAngle,0,1,0); - fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna +glPushMatrix(); +glTranslatef(pPosition.x,pPosition.y,pPosition.z); +if (fAngle!=0) +glRotatef(fAngle,0,1,0); +fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna globalna! - if (StartVBO()) - {Root->ReplacableSet(ReplacableSkinId,iAlpha); - Root->RaRenderAlpha(); - EndVBO(); - } - glPopMatrix(); +if (StartVBO()) +{Root->ReplacableSet(ReplacableSkinId,iAlpha); +Root->RaRenderAlpha(); +EndVBO(); +} +glPopMatrix(); }; */ @@ -2293,78 +2294,78 @@ globalna! void TModel3d::Render(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId, int iAlpha) { // nieprzezroczyste, Display List - glPushMatrix(); - glTranslated(vPosition->x, vPosition->y, vPosition->z); - if (vAngle->y != 0.0) - glRotated(vAngle->y, 0.0, 1.0, 0.0); - if (vAngle->x != 0.0) - glRotated(vAngle->x, 1.0, 0.0, 0.0); - if (vAngle->z != 0.0) - glRotated(vAngle->z, 0.0, 0.0, 1.0); - TSubModel::fSquareDist = - SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna! - // odwrócenie flag, aby wyÅ‚apać nieprzezroczyste - Root->ReplacableSet(ReplacableSkinId, iAlpha ^ 0x0F0F000F); - Root->RenderDL(); - glPopMatrix(); + glPushMatrix(); + glTranslated(vPosition->x, vPosition->y, vPosition->z); + if (vAngle->y != 0.0) + glRotated(vAngle->y, 0.0, 1.0, 0.0); + if (vAngle->x != 0.0) + glRotated(vAngle->x, 1.0, 0.0, 0.0); + if (vAngle->z != 0.0) + glRotated(vAngle->z, 0.0, 0.0, 1.0); + TSubModel::fSquareDist = + SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna! + // odwrócenie flag, aby wyÅ‚apać nieprzezroczyste + Root->ReplacableSet(ReplacableSkinId, iAlpha ^ 0x0F0F000F); + Root->RenderDL(); + glPopMatrix(); }; void TModel3d::RenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId, - int iAlpha) + int iAlpha) { // przezroczyste, Display List - glPushMatrix(); - glTranslated(vPosition->x, vPosition->y, vPosition->z); - if (vAngle->y != 0.0) - glRotated(vAngle->y, 0.0, 1.0, 0.0); - if (vAngle->x != 0.0) - glRotated(vAngle->x, 1.0, 0.0, 0.0); - if (vAngle->z != 0.0) - glRotated(vAngle->z, 0.0, 0.0, 1.0); - TSubModel::fSquareDist = - SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna! - Root->ReplacableSet(ReplacableSkinId, iAlpha); - Root->RenderAlphaDL(); - glPopMatrix(); + glPushMatrix(); + glTranslated(vPosition->x, vPosition->y, vPosition->z); + if (vAngle->y != 0.0) + glRotated(vAngle->y, 0.0, 1.0, 0.0); + if (vAngle->x != 0.0) + glRotated(vAngle->x, 1.0, 0.0, 0.0); + if (vAngle->z != 0.0) + glRotated(vAngle->z, 0.0, 0.0, 1.0); + TSubModel::fSquareDist = + SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna! + Root->ReplacableSet(ReplacableSkinId, iAlpha); + Root->RenderAlphaDL(); + glPopMatrix(); }; -void TModel3d::RaRender( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId, int iAlpha ) +void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId, int iAlpha) { // nieprzezroczyste, VBO - glPushMatrix(); - glTranslated(vPosition->x, vPosition->y, vPosition->z); - if (vAngle->y != 0.0) - glRotated(vAngle->y, 0.0, 1.0, 0.0); - if (vAngle->x != 0.0) - glRotated(vAngle->x, 1.0, 0.0, 0.0); - if (vAngle->z != 0.0) - glRotated(vAngle->z, 0.0, 0.0, 1.0); - TSubModel::fSquareDist = - SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna! - if (StartVBO()) - { // odwrócenie flag, aby wyÅ‚apać nieprzezroczyste - Root->ReplacableSet(ReplacableSkinId, iAlpha ^ 0x0F0F000F); - Root->RenderVBO(); - EndVBO(); - } - glPopMatrix(); + glPushMatrix(); + glTranslated(vPosition->x, vPosition->y, vPosition->z); + if (vAngle->y != 0.0) + glRotated(vAngle->y, 0.0, 1.0, 0.0); + if (vAngle->x != 0.0) + glRotated(vAngle->x, 1.0, 0.0, 0.0); + if (vAngle->z != 0.0) + glRotated(vAngle->z, 0.0, 0.0, 1.0); + TSubModel::fSquareDist = + SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna! + if (StartVBO()) + { // odwrócenie flag, aby wyÅ‚apać nieprzezroczyste + Root->ReplacableSet(ReplacableSkinId, iAlpha ^ 0x0F0F000F); + Root->RenderVBO(); + EndVBO(); + } + glPopMatrix(); }; void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId, - int iAlpha) + int iAlpha) { // przezroczyste, VBO - glPushMatrix(); - glTranslated(vPosition->x, vPosition->y, vPosition->z); - if (vAngle->y != 0.0) - glRotated(vAngle->y, 0.0, 1.0, 0.0); - if (vAngle->x != 0.0) - glRotated(vAngle->x, 1.0, 0.0, 0.0); - if (vAngle->z != 0.0) - glRotated(vAngle->z, 0.0, 0.0, 1.0); - TSubModel::fSquareDist = - SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna! - if (StartVBO()) - { - Root->ReplacableSet(ReplacableSkinId, iAlpha); - Root->RenderAlphaVBO(); - EndVBO(); - } - glPopMatrix(); + glPushMatrix(); + glTranslated(vPosition->x, vPosition->y, vPosition->z); + if (vAngle->y != 0.0) + glRotated(vAngle->y, 0.0, 1.0, 0.0); + if (vAngle->x != 0.0) + glRotated(vAngle->x, 1.0, 0.0, 0.0); + if (vAngle->z != 0.0) + glRotated(vAngle->z, 0.0, 0.0, 1.0); + TSubModel::fSquareDist = + SquareMagnitude(*vPosition - Global::GetCameraPosition()); // zmienna globalna! + if (StartVBO()) + { + Root->ReplacableSet(ReplacableSkinId, iAlpha); + Root->RenderAlphaVBO(); + EndVBO(); + } + glPopMatrix(); }; //----------------------------------------------------------------------------- @@ -2373,49 +2374,49 @@ void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manage int TModel3d::TerrainCount() { // zliczanie kwadratów kilometrowych (główna - // linia po Next) do tworznia tablicy - int i = 0; - TSubModel *r = Root; - while (r) - { - r = r->NextGet(); - ++i; - } - return i; + // linia po Next) do tworznia tablicy + int i = 0; + TSubModel *r = Root; + while (r) + { + r = r->NextGet(); + ++i; + } + return i; }; TSubModel *TModel3d::TerrainSquare(int n) { // pobieranie wskaźnika do submodelu (n) - int i = 0; - TSubModel *r = Root; - while (i < n) - { - r = r->NextGet(); - ++i; - } - r->UnFlagNext(); // blokowanie wyÅ›wietlania po Next głównej listy - return r; + int i = 0; + TSubModel *r = Root; + while (i < n) + { + r = r->NextGet(); + ++i; + } + r->UnFlagNext(); // blokowanie wyÅ›wietlania po Next głównej listy + return r; }; void TModel3d::TerrainRenderVBO(int n) { // renderowanie terenu z VBO - glPushMatrix(); - // glTranslated(vPosition->x,vPosition->y,vPosition->z); - // if (vAngle->y!=0.0) glRotated(vAngle->y,0.0,1.0,0.0); - // if (vAngle->x!=0.0) glRotated(vAngle->x,1.0,0.0,0.0); - // if (vAngle->z!=0.0) glRotated(vAngle->z,0.0,0.0,1.0); - // TSubModel::fSquareDist=SquareMagnitude(*vPosition-Global::GetCameraPosition()); - // //zmienna globalna! - if (StartVBO()) - { // odwrócenie flag, aby wyÅ‚apać nieprzezroczyste - // Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F); - TSubModel *r = Root; - while (r) - { - if (r->iVisible == - n) // tylko jeÅ›li ma być widoczny w danej ramce (problem dla 0==false) - r->RenderVBO(); // sub kolejne (Next) siÄ™ nie wyrenderujÄ… - r = r->NextGet(); - } - EndVBO(); - } - glPopMatrix(); + glPushMatrix(); + // glTranslated(vPosition->x,vPosition->y,vPosition->z); + // if (vAngle->y!=0.0) glRotated(vAngle->y,0.0,1.0,0.0); + // if (vAngle->x!=0.0) glRotated(vAngle->x,1.0,0.0,0.0); + // if (vAngle->z!=0.0) glRotated(vAngle->z,0.0,0.0,1.0); + // TSubModel::fSquareDist=SquareMagnitude(*vPosition-Global::GetCameraPosition()); + // //zmienna globalna! + if (StartVBO()) + { // odwrócenie flag, aby wyÅ‚apać nieprzezroczyste + // Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F); + TSubModel *r = Root; + while (r) + { + if (r->iVisible == + n) // tylko jeÅ›li ma być widoczny w danej ramce (problem dla 0==false) + r->RenderVBO(); // sub kolejne (Next) siÄ™ nie wyrenderujÄ… + r = r->NextGet(); + } + EndVBO(); + } + glPopMatrix(); }; diff --git a/Model3d.h b/Model3d.h index efb00404..a67bd66f 100644 --- a/Model3d.h +++ b/Model3d.h @@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/. #ifndef Model3dH #define Model3dH -#include "gl/glew.h" +#include "GL/glew.h" #include "Parser.h" #include "dumb3d.h" #include "Float3d.h" @@ -21,109 +21,78 @@ using namespace Math3D; struct GLVERTEX { - vector3 Point; - vector3 Normal; - float tu, tv; -}; - -class TStringPack -{ - char *data; - //+0 - 4 bajty: typ kromki - //+4 - 4 bajty: dÅ‚ugość łącznie z nagłówkiem - //+8 - obszar Å‚aÅ„cuchów znakowych, każdy zakoÅ„czony zerem - int *index; - //+0 - 4 bajty: typ kromki - //+4 - 4 bajty: dÅ‚ugość łącznie z nagłówkiem - //+8 - tabela indeksów - public: - char *String(int n); - char *StringAt(int n) - { - return data + 9 + n; - }; - TStringPack() - { - data = NULL; - index = NULL; - }; - void Init(char *d) - { - data = d; - }; - void InitIndex(int *i) - { - index = i; - }; + vector3 Point; + vector3 Normal; + float tu, tv; }; class TMaterialColor { - public: - TMaterialColor(){}; - TMaterialColor(char V) - { - r = g = b = V; - }; - // TMaterialColor(double R, double G, double B) - TMaterialColor(char R, char G, char B) - { - r = R; - g = G; - b = B; - }; +public: + TMaterialColor() {}; + TMaterialColor(char V) + { + r = g = b = V; + }; + // TMaterialColor(double R, double G, double B) + TMaterialColor(char R, char G, char B) + { + r = R; + g = G; + b = B; + }; - char r, g, b; + char r, g, b; }; /* struct TMaterial { - int ID; - AnsiString Name; +int ID; +AnsiString Name; //McZapkie-240702: lepiej uzywac wartosci float do opisu koloru bo funkcje opengl chyba tego na ogol uzywaja - float Ambient[4]; - float Diffuse[4]; - float Specular[4]; - float Transparency; - GLuint TextureID; +float Ambient[4]; +float Diffuse[4]; +float Specular[4]; +float Transparency; +GLuint TextureID; }; */ /* struct THitBoxContainer { - TPlane Planes[6]; - int Index; - inline void Reset() { Planes[0]= TPlane(vector3(0,0,0),0.0f); }; - inline bool Inside(vector3 Point) - { - bool Hit= true; +TPlane Planes[6]; +int Index; +inline void Reset() { Planes[0]= TPlane(vector3(0,0,0),0.0f); }; +inline bool Inside(vector3 Point) +{ +bool Hit= true; - if (Planes[0].Defined()) - for (int i=0; i<6; i++) - { - if (Planes[i].GetSide(Point)>0) - { - Hit= false; - break; - }; +if (Planes[0].Defined()) +for (int i=0; i<6; i++) +{ +if (Planes[i].GetSide(Point)>0) +{ +Hit= false; +break; +}; - } - else return(false); - return(Hit); - }; +} +else return(false); +return(Hit); +}; }; */ /* Ra: tego nie bÄ™dziemy już używać, bo można wycisnąć wiÄ™cej typedef enum {smt_Unknown, //nieznany - smt_Mesh, //siatka - smt_Point, - smt_FreeSpotLight, //punkt Å›wietlny - smt_Text, //generator tekstu - smt_Stars //wiele punktów Å›wietlnych +smt_Mesh, //siatka +smt_Point, +smt_FreeSpotLight, //punkt Å›wietlny +smt_Text, //generator tekstu +smt_Stars //wiele punktów Å›wietlnych } TSubModelType; */ // Ra: specjalne typy submodeli, poza tym GL_TRIANGLES itp. @@ -134,319 +103,296 @@ const int TP_TEXT = 259; enum TAnimType // rodzaj animacji { - at_None, // brak - at_Rotate, // obrót wzglÄ™dem wektora o kÄ…t - at_RotateXYZ, // obrót wzglÄ™dem osi o kÄ…ty - at_Translate, // przesuniÄ™cie - at_SecondsJump, // sekundy z przeskokiem - at_MinutesJump, // minuty z przeskokiem - at_HoursJump, // godziny z przeskokiem 12h/360° - at_Hours24Jump, // godziny z przeskokiem 24h/360° - at_Seconds, // sekundy pÅ‚ynnie - at_Minutes, // minuty pÅ‚ynnie - at_Hours, // godziny pÅ‚ynnie 12h/360° - at_Hours24, // godziny pÅ‚ynnie 24h/360° - at_Billboard, // obrót w pionie do kamery - at_Wind, // ruch pod wpÅ‚ywem wiatru - at_Sky, // animacja nieba - at_IK = 0x100, // odwrotna kinematyka - submodel sterujÄ…cy (np. staw skokowy) - at_IK11 = 0x101, // odwrotna kinematyka - submodel nadrzÄ™dny do sterowango (np. stopa) - at_IK21 = 0x102, // odwrotna kinematyka - submodel nadrzÄ™dny do sterowango (np. podudzie) - at_IK22 = 0x103, // odwrotna kinematyka - submodel nadrzÄ™dny do nadrzÄ™dnego sterowango (np. udo) - at_Digital = 0x200, // dziesiÄ™ciocyfrowy licznik mechaniczny (z cylindrami) - at_DigiClk = 0x201, // zegar cyfrowy jako licznik na dziesiÄ™cioÅ›cianach - at_Undefined = 0x800000FF // animacja chwilowo nieokreÅ›lona + at_None, // brak + at_Rotate, // obrót wzglÄ™dem wektora o kÄ…t + at_RotateXYZ, // obrót wzglÄ™dem osi o kÄ…ty + at_Translate, // przesuniÄ™cie + at_SecondsJump, // sekundy z przeskokiem + at_MinutesJump, // minuty z przeskokiem + at_HoursJump, // godziny z przeskokiem 12h/360° + at_Hours24Jump, // godziny z przeskokiem 24h/360° + at_Seconds, // sekundy pÅ‚ynnie + at_Minutes, // minuty pÅ‚ynnie + at_Hours, // godziny pÅ‚ynnie 12h/360° + at_Hours24, // godziny pÅ‚ynnie 24h/360° + at_Billboard, // obrót w pionie do kamery + at_Wind, // ruch pod wpÅ‚ywem wiatru + at_Sky, // animacja nieba + at_IK = 0x100, // odwrotna kinematyka - submodel sterujÄ…cy (np. staw skokowy) + at_IK11 = 0x101, // odwrotna kinematyka - submodel nadrzÄ™dny do sterowango (np. stopa) + at_IK21 = 0x102, // odwrotna kinematyka - submodel nadrzÄ™dny do sterowango (np. podudzie) + at_IK22 = 0x103, // odwrotna kinematyka - submodel nadrzÄ™dny do nadrzÄ™dnego sterowango (np. udo) + at_Digital = 0x200, // dziesiÄ™ciocyfrowy licznik mechaniczny (z cylindrami) + at_DigiClk = 0x201, // zegar cyfrowy jako licznik na dziesiÄ™cioÅ›cianach + at_Undefined = 0x800000FF // animacja chwilowo nieokreÅ›lona }; class TModel3d; -class TSubModelInfo; class TSubModel { // klasa submodelu - pojedyncza siatka, punkt Å›wietlny albo grupa punktów - // Ra: ta klasa ma mieć wielkość 256 bajtów, aby pokryÅ‚a siÄ™ z formatem binarnym - // Ra: nie przestawiać zmiennych, bo wczytujÄ… siÄ™ z pliku binarnego! - private: - TSubModel *Next; - TSubModel *Child; - int eType; // Ra: modele binarne dajÄ… wiÄ™cej możliwoÅ›ci niż mesh zÅ‚ożony z trójkÄ…tów - int iName; // numer Å‚aÅ„cucha z nazwÄ… submodelu, albo -1 gdy anonimowy - public: // chwilowo - TAnimType b_Anim; + //m7todo: zrobić normalnÄ… serializacjÄ™ +private: + int iNext; + int iChild; + int eType; // Ra: modele binarne dajÄ… wiÄ™cej możliwoÅ›ci niż mesh zÅ‚ożony z trójkÄ…tów + int iName; // numer Å‚aÅ„cucha z nazwÄ… submodelu, albo -1 gdy anonimowy +public: // chwilowo + TAnimType b_Anim; - private: - int iFlags; // flagi informacyjne: - // bit 0: =1 faza rysowania zależy od wymiennej tekstury 0 - // bit 1: =1 faza rysowania zależy od wymiennej tekstury 1 - // bit 2: =1 faza rysowania zależy od wymiennej tekstury 2 - // bit 3: =1 faza rysowania zależy od wymiennej tekstury 3 - // bit 4: =1 rysowany w fazie nieprzezroczystych (staÅ‚a tekstura albo brak) - // bit 5: =1 rysowany w fazie przezroczystych (staÅ‚a tekstura) - // bit 7: =1 ta sama tekstura, co poprzedni albo nadrzÄ™dny - // bit 8: =1 wierzchoÅ‚ki wyÅ›wietlane z indeksów - // bit 9: =1 wczytano z pliku tekstowego (jest wÅ‚aÅ›cicielem tablic) - // bit 13: =1 wystarczy przesuniÄ™cie zamiast mnożenia macierzy (trzy jedynki) - // bit 14: =1 wymagane przechowanie macierzy (animacje) - // bit 15: =1 wymagane przechowanie macierzy (transform niejedynkowy) - union - { // transform, nie każdy submodel musi mieć - float4x4 *fMatrix; // pojedyncza precyzja wystarcza - // matrix4x4 *dMatrix; //do testu macierz podwójnej precyzji - int iMatrix; // w pliku binarnym jest numer matrycy - }; - int iNumVerts; // ilość wierzchoÅ‚ków (1 dla FreeSpotLight) - int iVboPtr; // poczÄ…tek na liÅ›cie wierzchoÅ‚ków albo indeksów - int iTexture; // numer nazwy tekstury, -1 wymienna, 0 brak - float fVisible; // próg jasnoÅ›ci Å›wiatÅ‚a do załączenia submodelu - float fLight; // próg jasnoÅ›ci Å›wiatÅ‚a do zadziaÅ‚ania selfillum - float f4Ambient[4]; - float f4Diffuse[4]; // float ze wzglÄ™du na glMaterialfv() - float f4Specular[4]; - float f4Emision[4]; - float fWireSize; // nie używane, ale wczytywane - float fSquareMaxDist; - float fSquareMinDist; - // McZapkie-050702: parametry dla swiatla: - float fNearAttenStart; - float fNearAttenEnd; - 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 - float fCosHotspotAngle; // cosinus kÄ…ta stożka pod którym widać aureolÄ™ i zwiÄ™kszone natężenie - // Å›wiatÅ‚a - float fCosViewAngle; // cos kata pod jakim sie teraz patrzy - // Ra: dalej sÄ… zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy - texture_manager::size_type TextureID; // numer tekstury, -1 wymienna, 0 brak - 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 - // ABu: te same zmienne, ale zdublowane dla Render i RenderAlpha, - // bo sie chrzanilo przemieszczanie obiektow. - // Ra: już siÄ™ nie chrzani - float f_Angle; - float3 v_RotateAxis; - float3 v_Angles; +private: + int iFlags; // flagi informacyjne: + // bit 0: =1 faza rysowania zależy od wymiennej tekstury 0 + // bit 1: =1 faza rysowania zależy od wymiennej tekstury 1 + // bit 2: =1 faza rysowania zależy od wymiennej tekstury 2 + // bit 3: =1 faza rysowania zależy od wymiennej tekstury 3 + // bit 4: =1 rysowany w fazie nieprzezroczystych (staÅ‚a tekstura albo brak) + // bit 5: =1 rysowany w fazie przezroczystych (staÅ‚a tekstura) + // bit 7: =1 ta sama tekstura, co poprzedni albo nadrzÄ™dny + // bit 8: =1 wierzchoÅ‚ki wyÅ›wietlane z indeksów + // bit 9: =1 wczytano z pliku tekstowego (jest wÅ‚aÅ›cicielem tablic) + // bit 13: =1 wystarczy przesuniÄ™cie zamiast mnożenia macierzy (trzy jedynki) + // bit 14: =1 wymagane przechowanie macierzy (animacje) + // bit 15: =1 wymagane przechowanie macierzy (transform niejedynkowy) + union + { // transform, nie każdy submodel musi mieć + float4x4 *fMatrix; // pojedyncza precyzja wystarcza + // matrix4x4 *dMatrix; //do testu macierz podwójnej precyzji + int iMatrix; // w pliku binarnym jest numer matrycy + }; + int iNumVerts; // ilość wierzchoÅ‚ków (1 dla FreeSpotLight) + int tVboPtr; // poczÄ…tek na liÅ›cie wierzchoÅ‚ków albo indeksów + int iTexture; // numer nazwy tekstury, -1 wymienna, 0 brak + float fVisible; // próg jasnoÅ›ci Å›wiatÅ‚a do załączenia submodelu + float fLight; // próg jasnoÅ›ci Å›wiatÅ‚a do zadziaÅ‚ania selfillum + float f4Ambient[4]; + float f4Diffuse[4]; // float ze wzglÄ™du na glMaterialfv() + float f4Specular[4]; + float f4Emision[4]; + float fWireSize; // nie używane, ale wczytywane + float fSquareMaxDist; + float fSquareMinDist; + // McZapkie-050702: parametry dla swiatla: + float fNearAttenStart; + float fNearAttenEnd; + 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 + float fCosHotspotAngle; // cosinus kÄ…ta stożka pod którym widać aureolÄ™ i zwiÄ™kszone natężenie + // Å›wiatÅ‚a + float fCosViewAngle; // cos kata pod jakim sie teraz patrzy - public: // chwilowo - float3 v_TransVector; - float8 *Vertices; // roboczy wskaźnik - wczytanie T3D do VBO - int iAnimOwner; // roboczy numer egzemplarza, który ustawiÅ‚ animacjÄ™ - TAnimType b_aAnim; // kody animacji oddzielnie, bo zerowane - public: - float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer) - char space[8]; // wolne miejsce na przyszÅ‚e zmienne (zmniejszyć w miarÄ™ potrzeby) - public: - TSubModel ** - smLetter; // wskaźnik na tablicÄ™ submdeli do generoania tekstu (docelowo zapisać do E3D) - TSubModel *Parent; // nadrzÄ™dny, np. do wymnażania macierzy - int iVisible; // roboczy stan widocznoÅ›ci - // AnsiString asTexture; //robocza nazwa tekstury do zapisania w pliku binarnym - // AnsiString asName; //robocza nazwa - char *pTexture; // robocza nazwa tekstury do zapisania w pliku binarnym - char *pName; // robocza nazwa - private: - // int SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX - // *Vertices); - int SeekFaceNormal(unsigned int *Masks, int f, unsigned int dwMask, float3 *pt, float8 *Vertices); - void RaAnimation(TAnimType a); + TSubModel *Next; + TSubModel *Child; + intptr_t iVboPtr; + texture_manager::size_type TextureID; // numer tekstury, -1 wymienna, 0 brak + 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 //m7todo: wywalić to + // ABu: te same zmienne, ale zdublowane dla Render i RenderAlpha, + // bo sie chrzanilo przemieszczanie obiektow. + // Ra: już siÄ™ nie chrzani + float f_Angle; + float3 v_RotateAxis; + float3 v_Angles; - public: - static int iInstance; // identyfikator egzemplarza, który aktualnie renderuje model - static texture_manager::size_type *ReplacableSkinId; - static int iAlpha; // maska bitowa dla danego przebiegu - static double fSquareDist; - static TModel3d *pRoot; - static std::string *pasText; // tekst dla wyÅ›wietlacza (!!!! do przemyÅ›lenia) - TSubModel(); - ~TSubModel(); - void FirstInit(); - int Load(cParser &Parser, TModel3d *Model, int Pos, bool dynamic); - void ChildAdd(TSubModel *SubModel); - void NextAdd(TSubModel *SubModel); - TSubModel * NextGet() - { - return Next; - }; - TSubModel * ChildGet() - { - return Child; - }; - int TriangleAdd(TModel3d *m, texture_manager::size_type tex, int tri); - float8 * TrianglePtr(int tex, int pos, int *la, int *ld, int *ls); - // float8* TrianglePtr(const char *tex,int tri); - // void SetRotate(vector3 vNewRotateAxis,float fNewAngle); - void SetRotate(float3 vNewRotateAxis, float fNewAngle); - void SetRotateXYZ(vector3 vNewAngles); - void SetRotateXYZ(float3 vNewAngles); - void SetTranslate(vector3 vNewTransVector); - void SetTranslate(float3 vNewTransVector); - void SetRotateIK1(float3 vNewAngles); - TSubModel * GetFromName(std::string const &search, bool i = true); - TSubModel * GetFromName(char const *search, bool i = true); - void RenderDL(); - void RenderAlphaDL(); - void RenderVBO(); - void RenderAlphaVBO(); - // inline matrix4x4* GetMatrix() {return dMatrix;}; - inline float4x4 * GetMatrix() - { - return fMatrix; - }; - // matrix4x4* GetTransform() {return Matrix;}; - inline void Hide() - { - iVisible = 0; - }; - void RaArrayFill(CVertNormTex *Vert); - // void Render(); - int FlagsCheck(); - void WillBeAnimated() - { - if (this) - iFlags |= 0x4000; - }; - void InitialRotate(bool doit); - void DisplayLists(); - void Info(); - void InfoSet(TSubModelInfo *info); - void BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TStringPack *n = NULL, - bool dynamic = false); - void ReplacableSet(texture_manager::size_type *r, int a) - { - ReplacableSkinId = r; - iAlpha = a; - }; - void TextureNameSet(const char *n); - void NameSet(const char *n); - // Ra: funkcje do budowania terenu z E3D - int Flags() - { - return iFlags; - }; - void UnFlagNext() - { - iFlags &= 0x00FFFFFF; - }; - void ColorsSet(int *a, int *d, int *s); - inline float3 Translation1Get() - { - return fMatrix ? *(fMatrix->TranslationGet()) + v_TransVector : v_TransVector; - } - inline float3 Translation2Get() - { - return *(fMatrix->TranslationGet()) + Child->Translation1Get(); - } - int GetTextureId() - { - return TextureID; - } - void ParentMatrix(float4x4 *m); - float MaxY(const float4x4 &m); - void AdjustDist(); -}; +public: // chwilowo + float3 v_TransVector; + float8 *Vertices; // roboczy wskaźnik - wczytanie T3D do VBO + size_t iAnimOwner; // roboczy numer egzemplarza, który ustawiÅ‚ animacjÄ™ + TAnimType b_aAnim; // kody animacji oddzielnie, bo zerowane +public: + float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer) +public: + TSubModel ** + smLetter; // wskaźnik na tablicÄ™ submdeli do generoania tekstu (docelowo zapisać do E3D) + TSubModel *Parent; // nadrzÄ™dny, np. do wymnażania macierzy + int iVisible; // roboczy stan widocznoÅ›ci + // AnsiString asTexture; //robocza nazwa tekstury do zapisania w pliku binarnym + // AnsiString asName; //robocza nazwa + std::string pTexture; // robocza nazwa tekstury do zapisania w pliku binarnym + std::string pName; // robocza nazwa +private: + // int SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX + // *Vertices); + int SeekFaceNormal(unsigned int *Masks, int f, unsigned int dwMask, float3 *pt, float8 *Vertices); + void RaAnimation(TAnimType a); -class TSubModelInfo -{ // klasa z informacjami o submodelach, do tworzenia pliku binarnego - public: - TSubModel *pSubModel; // wskaźnik na submodel - int iTransform; // numer transformu (-1 gdy brak) - int iName; // numer nazwy - int iTexture; // numer tekstury - int iNameLen; // dÅ‚ugość nazwy - int iTextureLen; // dÅ‚ugość tekstury - int iNext, iChild; // numer nastÄ™pnego i potomnego - static int iTotalTransforms; // ilość transformów - static int iTotalNames; // ilość nazw - static int iTotalTextures; // ilość tekstur - static int iCurrent; // aktualny obiekt - static TSubModelInfo *pTable; // tabele obiektów pomocniczych - TSubModelInfo() - { - pSubModel = NULL; - iTransform = iName = iTexture = iNext = iChild = -1; // nie ma - iNameLen = iTextureLen = 0; - } - void Reset() - { - pTable = this; // ustawienie wskaźnika tabeli obiektów - iTotalTransforms = iTotalNames = iTotalTextures = iCurrent = 0; // zerowanie liczników - } - ~TSubModelInfo(){}; +public: + static size_t iInstance; // identyfikator egzemplarza, który aktualnie renderuje model + static texture_manager::size_type *ReplacableSkinId; + static int iAlpha; // maska bitowa dla danego przebiegu + static double fSquareDist; + static TModel3d *pRoot; + static std::string *pasText; // tekst dla wyÅ›wietlacza (!!!! do przemyÅ›lenia) + TSubModel(); + ~TSubModel(); + void FirstInit(); + int Load(cParser &Parser, TModel3d *Model, int Pos, bool dynamic); + void ChildAdd(TSubModel *SubModel); + void NextAdd(TSubModel *SubModel); + TSubModel * NextGet() + { + return Next; + }; + TSubModel * ChildGet() + { + return Child; + }; + int TriangleAdd(TModel3d *m, texture_manager::size_type tex, int tri); + float8 * TrianglePtr(int tex, int pos, int *la, int *ld, int *ls); + // float8* TrianglePtr(const char *tex,int tri); + // void SetRotate(vector3 vNewRotateAxis,float fNewAngle); + void SetRotate(float3 vNewRotateAxis, float fNewAngle); + void SetRotateXYZ(vector3 vNewAngles); + void SetRotateXYZ(float3 vNewAngles); + void SetTranslate(vector3 vNewTransVector); + void SetTranslate(float3 vNewTransVector); + void SetRotateIK1(float3 vNewAngles); + TSubModel * GetFromName(std::string const &search, bool i = true); + TSubModel * GetFromName(char const *search, bool i = true); + void RenderDL(); + void RenderAlphaDL(); + void RenderVBO(); + void RenderAlphaVBO(); + // inline matrix4x4* GetMatrix() {return dMatrix;}; + inline float4x4 * GetMatrix() + { + return fMatrix; + }; + // matrix4x4* GetTransform() {return Matrix;}; + inline void Hide() + { + iVisible = 0; + }; + void RaArrayFill(CVertNormTex *Vert); + // void Render(); + int FlagsCheck(); + void WillBeAnimated() + { + if (this) + iFlags |= 0x4000; + }; + void InitialRotate(bool doit); + void DisplayLists(); + void BinInit(TSubModel *s, float4x4 *m, float8 *v, + std::vector *t, std::vector *n, bool dynamic); + void ReplacableSet(texture_manager::size_type *r, int a) + { + ReplacableSkinId = r; + iAlpha = a; + }; + void TextureNameSet(const char *n); + void NameSet(const char *n); + // Ra: funkcje do budowania terenu z E3D + int Flags() + { + return iFlags; + }; + void UnFlagNext() + { + iFlags &= 0x00FFFFFF; + }; + void ColorsSet(int *a, int *d, int *s); + inline float3 Translation1Get() + { + return fMatrix ? *(fMatrix->TranslationGet()) + v_TransVector : v_TransVector; + } + inline float3 Translation2Get() + { + return *(fMatrix->TranslationGet()) + Child->Translation1Get(); + } + int GetTextureId() + { + return TextureID; + } + void ParentMatrix(float4x4 *m); + float MaxY(const float4x4 &m); + void AdjustDist(); + + void deserialize(std::istream&); + void TSubModel::serialize(std::ostream&, + std::vector&, + std::vector&, + std::vector&, + std::vector&); }; class TModel3d : public CMesh { - private: - // TMaterial *Materials; - // int MaterialsCount; //Ra: nie używane - // bool TractionPart; //Ra: nie używane - TSubModel *Root; // drzewo submodeli - int iFlags; // Ra: czy submodele majÄ… przezroczyste tekstury - public: // Ra: tymczasowo - int iNumVerts; // ilość wierzchoÅ‚ków (gdy nie ma VBO, to m_nVertexCount=0) - private: - TStringPack Textures; // nazwy tekstur - TStringPack Names; // nazwy submodeli - int *iModel; // zawartość pliku binarnego - int iSubModelsCount; // Ra: używane do tworzenia binarnych - std::string asBinary; // nazwa pod którÄ… zapisać model binarny - public: - inline TSubModel * GetSMRoot() - { - return (Root); - }; - // double Radius; //Ra: nie używane - TModel3d(); - TModel3d(char *FileName); - ~TModel3d(); - TSubModel * GetFromName(const char *sName); - // TMaterial* GetMaterialFromName(char *sName); - TSubModel * AddToNamed(const char *Name, TSubModel *SubModel); - void AddTo(TSubModel *tmp, TSubModel *SubModel); - 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, texture_manager::size_type *ReplacableSkinId = NULL, int iAlpha = 0x30300030); - void RenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RaRender(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL, int iAlpha = 0x30300030); - void RaRenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - // jeden kÄ…t obrotu - void Render(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RenderAlpha(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RaRender(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RaRenderAlpha(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - // trzy kÄ…ty obrotu - void Render( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RenderAlpha( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RaRender( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - void RaRenderAlpha( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL, - int iAlpha = 0x30300030); - // inline int GetSubModelsCount() { return (SubModelsCount); }; - int Flags() - { - return iFlags; - }; - void Init(); - char * NameGet() - { - return Root ? Root->pName : NULL; - }; - int TerrainCount(); - TSubModel * TerrainSquare(int n); - void TerrainRenderVBO(int n); +private: + // TMaterial *Materials; + // int MaterialsCount; //Ra: nie używane + // bool TractionPart; //Ra: nie używane + TSubModel *Root; // drzewo submodeli + int iFlags; // Ra: czy submodele majÄ… przezroczyste tekstury +public: // Ra: tymczasowo + int iNumVerts; // ilość wierzchoÅ‚ków (gdy nie ma VBO, to m_nVertexCount=0) +private: + std::vector Textures; // nazwy tekstur + std::vector Names; // nazwy submodeli + int *iModel; // zawartość pliku binarnego + int iSubModelsCount; // Ra: używane do tworzenia binarnych + std::string asBinary; // nazwa pod którÄ… zapisać model binarny +public: + inline TSubModel * GetSMRoot() + { + return (Root); + }; + // double Radius; //Ra: nie używane + TModel3d(); + TModel3d(char *FileName); + ~TModel3d(); + TSubModel * GetFromName(const char *sName); + // TMaterial* GetMaterialFromName(char *sName); + TSubModel * AddToNamed(const char *Name, TSubModel *SubModel); + void AddTo(TSubModel *tmp, TSubModel *SubModel); + 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, texture_manager::size_type *ReplacableSkinId = NULL, int iAlpha = 0x30300030); + void RenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); + void RaRender(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL, int iAlpha = 0x30300030); + void RaRenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); + // jeden kÄ…t obrotu + void Render(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); + void RenderAlpha(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); + void RaRender(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); + void RaRenderAlpha(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); + // trzy kÄ…ty obrotu + void Render(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); + void RenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); + void RaRender(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); + void RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL, + int iAlpha = 0x30300030); + // inline int GetSubModelsCount() { return (SubModelsCount); }; + int Flags() + { + return iFlags; + }; + void Init(); + std::string NameGet() + { + return Root ? Root->pName : NULL; + }; + int TerrainCount(); + TSubModel * TerrainSquare(int n); + void TerrainRenderVBO(int n); + void deserialize(std::istream &s, size_t size, bool dynamic); }; //--------------------------------------------------------------------------- diff --git a/PyInt.cpp b/PyInt.cpp index 43d9c975..5c6c9c91 100644 --- a/PyInt.cpp +++ b/PyInt.cpp @@ -14,7 +14,10 @@ TPythonInterpreter *TPythonInterpreter::_instance = NULL; TPythonInterpreter::TPythonInterpreter() { WriteLog("Loading Python ..."); - Py_SetPythonHome("python"); + if (sizeof(void*) == 8) + Py_SetPythonHome("python64"); + else + Py_SetPythonHome("python"); Py_Initialize(); _main = PyImport_ImportModule("__main__"); if (_main == NULL) @@ -64,7 +67,7 @@ bool TPythonInterpreter::loadClassFile( std::string const &lookupPath, std::stri long fsize = ftell(sourceFile); char *buffer = (char *)calloc(fsize + 1, sizeof(char)); fseek(sourceFile, 0, SEEK_SET); - long freaded = fread(buffer, sizeof(char), fsize, sourceFile); + size_t freaded = fread(buffer, sizeof(char), fsize, sourceFile); buffer[freaded] = 0; // z jakiegos powodu czytamy troche mniej i trzczeba dodac konczace // zero do bufora (mimo ze calloc teoretycznie powiniene zwrocic // wyzerowana pamiec) diff --git a/RealSound.cpp b/RealSound.cpp index 17cd51f3..6f667148 100644 --- a/RealSound.cpp +++ b/RealSound.cpp @@ -176,7 +176,7 @@ void TRealSound::Stop() void TRealSound::AdjFreq(double Freq, double dt) // McZapkie TODO: dorobic tu efekt Dopplera // Freq moze byc liczba dodatnia mniejsza od 1 lub wieksza od 1 { - float df, Vlist, Vsrc; + float df, Vlist; if ((Global::bSoundEnabled) && (AM != 0)) { if (dt > 0) @@ -247,7 +247,7 @@ void TTextSound::Init(std::string const &SoundName, double SoundAttenuation, dou fTime = GetWaveTime(); std::string txt(SoundName); txt.erase( txt.rfind( '.' ) ); // obciÄ™cie rozszerzenia - for (int i = txt.length(); i > 0; --i) + for (size_t 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 diff --git a/Segment.cpp b/Segment.cpp index f83d1935..85f67dc3 100644 --- a/Segment.cpp +++ b/Segment.cpp @@ -599,7 +599,7 @@ void TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *Shap double fOffsetX) { // tworzenie siatki trójkÄ…tów dla iglicy vector3 pos1, pos2, dir, parallel1, parallel2, pt; - double a1, a2, s, step, offset, tv1, tv2, t, t2, t2step, oldt2, sp, oldsp; + double a1, a2, s, step, offset, tv1, tv2, t, t2step, oldt2; int i, j; if (bCurve) { // dla toru odchylonego @@ -736,7 +736,7 @@ void TSegment::Render() { vector3 pt; GfxRenderer.Bind(0); - int i; + if (bCurve) { glColor3f(0, 0, 1.0f); diff --git a/Sound.cpp b/Sound.cpp index 101a3fdf..eb8c4893 100644 --- a/Sound.cpp +++ b/Sound.cpp @@ -8,7 +8,6 @@ http://mozilla.org/MPL/2.0/. */ #include "stdafx.h" -#define STRICT #include "Sound.h" #include "Globals.h" #include "Logs.h" @@ -219,7 +218,6 @@ LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(const char *Name, bool Dynamic, Dynamic = false; // wczytanie z "sounds/" } TSoundContainer *Next = First; - DWORD dwStatus; for (int i = 0; i < Count; i++) { if (strcmp(Name, Next->Name) == 0) @@ -277,11 +275,6 @@ void TSoundsManager::RestoreAll() for (int i = 0; i < Count; i++) { - - if (FAILED(hr = Next->DSBuffer->GetStatus(&dwStatus))) - ; - // return hr; - if (dwStatus & DSBSTATUS_BUFFERLOST) { // Since the app could have just been activated, then @@ -375,7 +368,4 @@ void TSoundsManager::Init(HWND hWnd) return; SAFE_RELEASE(pDSBPrimary); -}; - -//--------------------------------------------------------------------------- -#pragma package(smart_init) +}; \ No newline at end of file diff --git a/Texture.cpp b/Texture.cpp index a8b8027f..878c4f3d 100644 --- a/Texture.cpp +++ b/Texture.cpp @@ -17,10 +17,12 @@ http://mozilla.org/MPL/2.0/. #include "texture.h" #include +#include "GL/glew.h" #include "usefull.h" #include "globals.h" #include "logs.h" +#include "sn_utils.h" texture_manager::texture_manager() { @@ -80,7 +82,7 @@ opengl_texture::load_BMP() { if( infosize > sizeof( info ) ) { WriteLog( "Warning - BMP header is larger than expected, possible format difference." ); } - file.read( (char *)&info, std::min( infosize, sizeof( info ) ) ); + file.read( (char *)&info, std::min( (size_t)infosize, sizeof( info ) ) ); data_width = info.bmiHeader.biWidth; data_height = info.bmiHeader.biHeight; @@ -118,6 +120,70 @@ opengl_texture::load_BMP() { return; } +DDCOLORKEY opengl_texture::deserialize_ddck(std::istream &s) +{ + DDCOLORKEY ddck; + + ddck.dwColorSpaceLowValue = sn_utils::ld_uint32(s); + ddck.dwColorSpaceHighValue = sn_utils::ld_uint32(s); + + return ddck; +} + +DDPIXELFORMAT opengl_texture::deserialize_ddpf(std::istream &s) +{ + DDPIXELFORMAT ddpf; + + ddpf.dwSize = sn_utils::ld_uint32(s); + ddpf.dwFlags = sn_utils::ld_uint32(s); + ddpf.dwFourCC = sn_utils::ld_uint32(s); + ddpf.dwRGBBitCount = sn_utils::ld_uint32(s); + ddpf.dwRBitMask = sn_utils::ld_uint32(s); + ddpf.dwGBitMask = sn_utils::ld_uint32(s); + ddpf.dwBBitMask = sn_utils::ld_uint32(s); + ddpf.dwRGBAlphaBitMask = sn_utils::ld_uint32(s); + + return ddpf; +} + +DDSCAPS2 opengl_texture::deserialize_ddscaps(std::istream &s) +{ + DDSCAPS2 ddsc; + + ddsc.dwCaps = sn_utils::ld_uint32(s); + ddsc.dwCaps2 = sn_utils::ld_uint32(s); + ddsc.dwCaps3 = sn_utils::ld_uint32(s); + ddsc.dwCaps4 = sn_utils::ld_uint32(s); + + return ddsc; +} + +DDSURFACEDESC2 opengl_texture::deserialize_ddsd(std::istream &s) +{ + DDSURFACEDESC2 ddsd; + + ddsd.dwSize = sn_utils::ld_uint32(s); + ddsd.dwFlags = sn_utils::ld_uint32(s); + ddsd.dwHeight = sn_utils::ld_uint32(s); + ddsd.dwWidth = sn_utils::ld_uint32(s); + ddsd.lPitch = sn_utils::ld_uint32(s); + ddsd.dwBackBufferCount = sn_utils::ld_uint32(s); + ddsd.dwMipMapCount = sn_utils::ld_uint32(s); + ddsd.dwAlphaBitDepth = sn_utils::ld_uint32(s); + ddsd.dwReserved = sn_utils::ld_uint32(s); + sn_utils::ld_uint32(s); + ddsd.lpSurface = nullptr; + ddsd.ddckCKDestOverlay = deserialize_ddck(s); + ddsd.ddckCKDestBlt = deserialize_ddck(s); + ddsd.ddckCKSrcOverlay = deserialize_ddck(s); + ddsd.ddckCKSrcBlt = deserialize_ddck(s); + ddsd.ddpfPixelFormat = deserialize_ddpf(s); + ddsd.ddsCaps = deserialize_ddscaps(s); + ddsd.dwTextureStage = sn_utils::ld_uint32(s); + + return ddsd; +} + void opengl_texture::load_DDS() { @@ -136,9 +202,8 @@ opengl_texture::load_DDS() { return; } - DDSURFACEDESC2 ddsd; - file.read((char *)&ddsd, sizeof(ddsd)); - filesize -= sizeof( ddsd ); + DDSURFACEDESC2 ddsd = deserialize_ddsd(file); + filesize -= 124; // // This .dds loader supports the loading of compressed formats DXT1, DXT3 @@ -189,7 +254,7 @@ opengl_texture::load_DDS() { return; } - int datasize = filesize - offset; + size_t datasize = filesize - offset; /* // this approach loads only the first mipmap and relies on graphics card to fill the rest data_mapcount = 1; @@ -467,7 +532,7 @@ opengl_texture::create() { ::glCompressedTexImage2D( GL_TEXTURE_2D, maplevel, data_format, datawidth, dataheight, 0, - datasize, (GLubyte *)&data[0] + dataoffset ); + datasize, (GLubyte *)&data[dataoffset] ); dataoffset += datasize; datawidth = std::max( datawidth / 2, 1 ); @@ -653,7 +718,7 @@ texture_manager::GetTextureId( std::string Filename, std::string const &Dir, int traits += '#'; } texture.traits = traits; - auto const textureindex = m_textures.size(); + auto const textureindex = (texture_manager::size_type)m_textures.size(); m_textures.emplace_back( texture ); m_texturemappings.emplace( filename, textureindex ); diff --git a/Texture.h b/Texture.h index 115ee426..4c122e05 100644 --- a/Texture.h +++ b/Texture.h @@ -9,8 +9,10 @@ http://mozilla.org/MPL/2.0/. #pragma once +#include +#include #include -#include "gl/glew.h" +#include "GL/glew.h" enum class resource_state { none, @@ -20,12 +22,16 @@ enum class resource_state { }; struct opengl_texture { + static DDSURFACEDESC2 deserialize_ddsd(std::istream&); + static DDCOLORKEY deserialize_ddck(std::istream&); + static DDPIXELFORMAT deserialize_ddpf(std::istream&); + static DDSCAPS2 deserialize_ddscaps(std::istream&); // methods void load(); void create(); // members - GLuint id{ (GLuint) -1 }; // associated GL resource + GLuint id{ (GLuint)-1 }; // associated GL resource bool has_alpha{ false }; // indicates the texture has alpha channel bool is_ready{ false }; // indicates the texture was processed and is ready for use std::string traits; // requested texture attributes: wrapping modes etc diff --git a/TextureDDS.cpp b/TextureDDS.cpp index 74df0b07..1d218422 100644 --- a/TextureDDS.cpp +++ b/TextureDDS.cpp @@ -196,7 +196,7 @@ void DecompressDXT3(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da void DecompressDXT5(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Data) { - GLint x, y, z, i, j, k; + GLint x, y, i, j, k; GLuint Select; const GLubyte *Temp; //, r0, g0, b0, r1, g1, b1; Color8888 colours[4], *col; diff --git a/TextureDDS.h b/TextureDDS.h index 66dcc2e4..8645a115 100644 --- a/TextureDDS.h +++ b/TextureDDS.h @@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/. #ifndef TEXTURE_DDS_H #define TEXTURE_DDS_H 1 -#include "gl/glew.h" +#include "GL/glew.h" #pragma hdrstop diff --git a/Track.cpp b/Track.cpp index e0d6f27a..d36ea6f1 100644 --- a/Track.cpp +++ b/Track.cpp @@ -412,10 +412,9 @@ vector3 LoadPoint(cParser *parser) void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name) { // pobranie obiektu trajektorii ruchu vector3 pt, vec, p1, p2, cp1, cp2, p3, p4, cp3, cp4; // dodatkowe punkty potrzebne do skrzyżowaÅ„ - double a1, a2, r1, r2, r3, r4, d1, d2, a; + double a1, a2, r1, r2, r3, r4; string str; - bool bCurve; - int i; //,state; //Ra: teraz już nie ma poczÄ…tkowego stanu zwrotnicy we wpisie + size_t i; //,state; //Ra: teraz już nie ma poczÄ…tkowego stanu zwrotnicy we wpisie std::string token; parser->getTokens(); @@ -1557,7 +1556,7 @@ void TTrack::Compile(GLuint tex) // 2014-07: na poczÄ…tek rysować brzegi jak dla Å‚uków // punkty brzegu nawierzchni uzyskujemy podczas renderowania boków (bez sensu, ale // najszybciej byÅ‚o zrobić) - int i, j; // ile punktów (może byc różna ilość punktów miÄ™dzy drogami) + int i; // ile punktów (może byc różna ilość punktów miÄ™dzy drogami) if (!SwitchExtension->vPoints) { // jeÅ›li tablica punktów nie jest jeszcze utworzona, zliczamy punkty i tworzymy jÄ… if (SwitchExtension->iRoads == 3) // mogÄ… być tylko 3 drogi zamiast 4 @@ -1735,7 +1734,7 @@ void TTrack::Compile(GLuint tex) if (!SwitchExtension->bPoints) // jeÅ›li tablica nie wypeÅ‚niona if (b) // ale jest wskaźnik do tablicy - może nie być? { // coÅ› siÄ™ gubi w obliczeniach na wskaźnikach - i = (int((void *)(b)) - int((void *)(SwitchExtension->vPoints))) / + i = (int)(((size_t)(b)) - ((size_t)(SwitchExtension->vPoints))) / sizeof(vector3); // ustalenie liczby punktów, bo mogÅ‚o wyjść inaczej niż // policzone z góry if (i > 0) @@ -2913,7 +2912,7 @@ TTrack * TTrack::RaAnimate() } if (Global::bUseVBO) { // dla OpenGL 1.4 odÅ›wieży siÄ™ caÅ‚y sektor, w późniejszych poprawiamy fragment - if (true == GLEW_VERSION_1_5) // dla OpenGL 1.4 to siÄ™ nie wykona poprawnie + if (GLEW_VERSION_1_5) // dla OpenGL 1.4 to siÄ™ nie wykona poprawnie if (TextureID1) // Ra: !!!! tu jest do poprawienia { // iglice liczone tylko dla zwrotnic vector6 rpts3[24], rpts4[24]; @@ -3024,7 +3023,7 @@ TTrack * TTrack::RaAnimate() if (Global::bUseVBO) { // dla OpenGL 1.4 odÅ›wieży siÄ™ caÅ‚y sektor, w późniejszych poprawiamy fragment // aktualizacja pojazdów na torze - if (true == GLEW_VERSION_1_5) // dla OpenGL 1.4 to siÄ™ nie wykona poprawnie + if (GLEW_VERSION_1_5) // dla OpenGL 1.4 to siÄ™ nie wykona poprawnie { int size = RaArrayPrepare(); // wielkość tabeli potrzebna dla tej obrotnicy diff --git a/Track.h b/Track.h index f8f1678b..3b33fd4d 100644 --- a/Track.h +++ b/Track.h @@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/. #pragma once #include -#include "gl/glew.h" +#include "GL/glew.h" #include "ResourceManager.h" #include "Segment.h" #include "Texture.h" @@ -139,12 +139,12 @@ class TTrack : public Resource // McZapkie-070402: dodalem zmienne opisujace rozmiary tekstur texture_manager::size_type TextureID1 = 0; // tekstura szyn albo nawierzchni texture_manager::size_type TextureID2 = 0; // tekstura automatycznej podsypki albo pobocza - float fTexLength = 4.0; // dÅ‚ugość powtarzania tekstury w metrach - float fTexRatio1 = 1.0; // proporcja boków tekstury nawierzchni (żeby zaoszczÄ™dzić na rozmiarach tekstur...) - float fTexRatio2 = 1.0; // proporcja boków tekstury chodnika (żeby zaoszczÄ™dzić na rozmiarach tekstur...) - float fTexHeight1 = 0.6; // wysokość brzegu wzglÄ™dem trajektorii - float fTexWidth = 0.9; // szerokość boku - float fTexSlope = 0.9; + float fTexLength = 4.0f; // dÅ‚ugość powtarzania tekstury w metrach + float fTexRatio1 = 1.0f; // proporcja boków tekstury nawierzchni (żeby zaoszczÄ™dzić na rozmiarach tekstur...) + float fTexRatio2 = 1.0f; // proporcja boków tekstury chodnika (żeby zaoszczÄ™dzić na rozmiarach tekstur...) + float fTexHeight1 = 0.6f; // wysokość brzegu wzglÄ™dem trajektorii + float fTexWidth = 0.9f; // szerokość boku + float fTexSlope = 0.9f; double fRadiusTable[ 2 ]; // dwa promienie, drugi dla zwrotnicy int iTrapezoid = 0; // 0-standard, 1-przechyÅ‚ka, 2-trapez, 3-oba GLuint DisplayListID = 0; @@ -176,10 +176,10 @@ class TTrack : public Resource int iPrevDirection = 0; // domyÅ›lnie wirtualne odcinki dołączamy stronÄ… od Point1 TTrackType eType = tt_Normal; // domyÅ›lnie zwykÅ‚y int iCategoryFlag = 1; // 0x100 - usuwanie pojazów // 1-tor, 2-droga, 4-rzeka, 8-samolot? - float fTrackWidth = 1.435; // szerokość w punkcie 1 // rozstaw toru, szerokość nawierzchni - float fTrackWidth2 = 0.0; // szerokość w punkcie 2 (głównie drogi i rzeki) - float fFriction = 0.15; // współczynnik tarcia - float fSoundDistance = -1.0; + float fTrackWidth = 1.435f; // szerokość w punkcie 1 // rozstaw toru, szerokość nawierzchni + float fTrackWidth2 = 0.0f; // szerokość w punkcie 2 (głównie drogi i rzeki) + float fFriction = 0.15f; // współczynnik tarcia + float fSoundDistance = -1.0f; int iQualityFlag = 20; int iDamageFlag = 0; TEnvironmentType eEnvironment = e_flat; // dźwiÄ™k i oÅ›wietlenie diff --git a/Traction.cpp b/Traction.cpp index 9328e3e1..c0b5f181 100644 --- a/Traction.cpp +++ b/Traction.cpp @@ -256,11 +256,11 @@ void TTraction::RenderDL(float mgn) // McZapkie: mgn to odleglosc od obserwatora if (!Global::bSmoothTraction) glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wyglÄ…da - robi gradient float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness - if (linealpha > 1.2) - linealpha = 1.2; // zbyt grube nie sÄ… dobre + if (linealpha > 1.2f) + linealpha = 1.2f; // zbyt grube nie sÄ… dobre glLineWidth(linealpha); - if (linealpha > 1.0) - linealpha = 1.0; + if (linealpha > 1.0f) + linealpha = 1.0f; // McZapkie-261102: kolor zalezy od materialu i zasniedzenia float r, g, b; switch (Material) @@ -269,59 +269,59 @@ void TTraction::RenderDL(float mgn) // McZapkie: mgn to odleglosc od obserwatora case 1: if (TestFlag(DamageFlag, 1)) { - r = 0.00000; - g = 0.32549; - b = 0.2882353; // zielona miedź + r = 0.00000f; + g = 0.32549f; + b = 0.2882353f; // zielona miedź } else { - r = 0.35098; - g = 0.22549; - b = 0.1; // czerwona miedź + r = 0.35098f; + g = 0.22549f; + b = 0.1f; // czerwona miedź } break; case 2: if (TestFlag(DamageFlag, 1)) { - r = 0.10; - g = 0.10; - b = 0.10; // czarne Al + r = 0.10f; + g = 0.10f; + b = 0.10f; // czarne Al } else { - r = 0.25; - g = 0.25; - b = 0.25; // srebrne Al + r = 0.25f; + g = 0.25f; + b = 0.25f; // srebrne Al } break; // tymczasowo pokazanie zasilanych odcinków case 4: - r = 0.5; - g = 0.5; - b = 1.0; + r = 0.5f; + g = 0.5f; + b = 1.0f; break; // niebieskie z podłączonym zasilaniem case 5: - r = 1.0; - g = 0.0; - b = 0.0; + r = 1.0f; + g = 0.0f; + b = 0.0f; break; // czerwone z podłączonym zasilaniem 1 case 6: - r = 0.0; - g = 1.0; - b = 0.0; + r = 0.0f; + g = 1.0f; + b = 0.0f; break; // zielone z podłączonym zasilaniem 2 case 7: - r = 1.0; - g = 1.0; - b = 0.0; + r = 1.0f; + g = 1.0f; + b = 0.0f; break; //żółte z podłączonym zasilaniem z obu stron } if (DebugModeFlag) if (hvParallel) { // jeÅ›li z bieżniÄ… wspólnÄ…, to dodatkowo przyciemniamy - r *= 0.6; - g *= 0.6; - b *= 0.6; + r *= 0.6f; + g *= 0.6f; + b *= 0.6f; } #ifdef EU07_USE_OLD_LIGHTING_MODEL r *= Global::ambientDayLight[ 0 ]; // w zaleźnoÅ›ci od koloru swiatÅ‚a @@ -332,8 +332,8 @@ void TTraction::RenderDL(float mgn) // McZapkie: mgn to odleglosc od obserwatora g *= Global::DayLight.ambient[ 1 ]; b *= Global::DayLight.ambient[2]; #endif - if (linealpha > 1.0) - linealpha = 1.0; // trzeba ograniczyć do <=1 + if (linealpha > 1.0f) + linealpha = 1.0f; // trzeba ograniczyć do <=1 glColor4f(r, g, b, linealpha); if (!uiDisplayList) Optimize(); // generowanie DL w miarÄ™ potrzeby @@ -475,8 +475,8 @@ void TTraction::RenderVBO(float mgn, int iPtr) if (!Global::bSmoothTraction) glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wyglÄ…da - robi gradient float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness - if (linealpha > 1.2) - linealpha = 1.2; // zbyt grube nie sÄ… dobre + if (linealpha > 1.2f) + linealpha = 1.2f; // zbyt grube nie sÄ… dobre glLineWidth(linealpha); // McZapkie-261102: kolor zalezy od materialu i zasniedzenia float r, g, b; @@ -486,51 +486,51 @@ void TTraction::RenderVBO(float mgn, int iPtr) case 1: if (TestFlag(DamageFlag, 1)) { - r = 0.00000; - g = 0.32549; - b = 0.2882353; // zielona miedź + r = 0.00000f; + g = 0.32549f; + b = 0.2882353f; // zielona miedź } else { - r = 0.35098; - g = 0.22549; - b = 0.1; // czerwona miedź + r = 0.35098f; + g = 0.22549f; + b = 0.1f; // czerwona miedź } break; case 2: if (TestFlag(DamageFlag, 1)) { - r = 0.10; - g = 0.10; - b = 0.10; // czarne Al + r = 0.10f; + g = 0.10f; + b = 0.10f; // czarne Al } else { - r = 0.25; - g = 0.25; - b = 0.25; // srebrne Al + r = 0.25f; + g = 0.25f; + b = 0.25f; // srebrne Al } break; // tymczasowo pokazanie zasilanych odcinków case 4: - r = 0.5; - g = 0.5; - b = 1.0; + r = 0.5f; + g = 0.5f; + b = 1.0f; break; // niebieskie z podłączonym zasilaniem case 5: - r = 1.0; - g = 0.0; - b = 0.0; + r = 1.0f; + g = 0.0f; + b = 0.0f; break; // czerwone z podłączonym zasilaniem 1 case 6: - r = 0.0; - g = 1.0; - b = 0.0; + r = 0.0f; + g = 1.0f; + b = 0.0f; break; // zielone z podłączonym zasilaniem 2 case 7: - r = 1.0; - g = 1.0; - b = 0.0; + r = 1.0f; + g = 1.0f; + b = 0.0f; break; //żółte z podłączonym zasilaniem z obu stron } #ifdef EU07_USE_OLD_LIGHTING_MODEL @@ -542,8 +542,8 @@ void TTraction::RenderVBO(float mgn, int iPtr) g *= Global::DayLight.ambient[ 1 ]; b *= Global::DayLight.ambient[ 2 ]; #endif - if (linealpha > 1.0) - linealpha = 1.0; // trzeba ograniczyć do <=1 + if (linealpha > 1.0f) + linealpha = 1.0f; // trzeba ograniczyć do <=1 glColor4f(r, g, b, linealpha); glDrawArrays(GL_LINES, iPtr, iLines); glLineWidth(1.0); @@ -680,7 +680,7 @@ double TTraction::VoltageGet(double u, double i) return psPowered->CurrentGet(res) * res; // yB: dla zasilanego nie baw siÄ™ w gwiazdy, tylko bierz bezpoÅ›rednio double r0t, r1t, r0g, r1g; - double u0, u1, i0, i1; + double i0, i1; r0t = fResistance[0]; //Å›redni pomysÅ‚, ale lepsze niż nic r1t = fResistance[1]; // bo nie uwzglÄ™dnia spadków z innych pojazdów if (psPower[0] && psPower[1]) diff --git a/Traction.h b/Traction.h index e63a4e11..7dcbd496 100644 --- a/Traction.h +++ b/Traction.h @@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/. #pragma once #include -#include "gl/glew.h" +#include "GL/glew.h" #include "VBO.h" #include "dumb3d.h" diff --git a/Train.cpp b/Train.cpp index 9c48f5ae..83489ad5 100644 --- a/Train.cpp +++ b/Train.cpp @@ -776,7 +776,7 @@ if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || dsbSwitch->Play(0, 0, 0); } /* - if (Console::Pressed(VK_CONTROL)) + if (Global::ctrlState) {//z [Ctrl] zapalamy albo gasimy Å›wiateÅ‚ko w kabinie if (iCabLightFlag<2) ++iCabLightFlag; //zapalenie } @@ -1369,7 +1369,7 @@ if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || } else if (cKey == Global::Keys[k_Brake0]) { - if( Global::ctrlState ) + if (Global::ctrlState) { mvOccupied->BrakeCtrlPos2 = 0; // wyrownaj kapturek } @@ -1431,7 +1431,7 @@ if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || else if (cKey == Global::Keys[k_Fuse]) //--------------- { - if( Global::ctrlState ) // z controlem + if (Global::ctrlState) // z controlem { ggConverterFuseButton.PutValue(1); // hunter-261211 if ((mvControlled->Mains == false) && (ggConverterButton.GetValue() == 0) && @@ -1472,7 +1472,7 @@ if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || } else if (cKey == Global::Keys[k_DirectionBackward]) // r { - if( Global::ctrlState ) + if (Global::ctrlState) { // wciÅ›niÄ™ty [Ctrl] if (mvOccupied->Radio == true) { @@ -1554,7 +1554,7 @@ if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || int CouplNr = -2; if (!FreeFlyModeFlag) { - if( Global::ctrlState ) + if (Global::ctrlState) if (mvOccupied->BrakeDelaySwitch(bdelay_R)) { dsbPneumaticRelay->SetVolume(DSBVOLUME_MAX); @@ -1581,7 +1581,7 @@ if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) || } if (temp) { - if( Global::ctrlState ) + if (Global::ctrlState) if (temp->MoverParameters->BrakeDelaySwitch(bdelay_R)) { dsbPneumaticRelay->SetVolume(DSBVOLUME_MAX); @@ -1838,9 +1838,8 @@ if ctrain_pneumatic)) { rsHiss.Play(1, DSBPLAY_LOOPING, true, tmp->GetPosition()); - DynamicObject->SetPneumatic(CouplNr, - 1); // Ra: to mi siÄ™ nie podoba !!!! - tmp->SetPneumatic(CouplNr, 1); + DynamicObject->SetPneumatic(CouplNr != 0, true); // Ra: to mi siÄ™ nie podoba !!!! + tmp->SetPneumatic(CouplNr != 0, true); } } else if (!TestFlag(tmp->MoverParameters->Couplers[CouplNr].CouplingFlag, @@ -1860,9 +1859,8 @@ if // rsHiss.Play(1,DSBPLAY_LOOPING,true,tmp->GetPosition()); dsbCouplerDetach->SetVolume(DSBVOLUME_MAX); dsbCouplerDetach->Play(0, 0, 0); - DynamicObject->SetPneumatic(CouplNr, - 0); // Ra: to mi siÄ™ nie podoba !!!! - tmp->SetPneumatic(CouplNr, 0); + DynamicObject->SetPneumatic(CouplNr != 0, false); // Ra: to mi siÄ™ nie podoba !!!! + tmp->SetPneumatic(CouplNr != 0, false); } } else if (!TestFlag(tmp->MoverParameters->Couplers[CouplNr].CouplingFlag, @@ -1900,8 +1898,8 @@ if // rsHiss.Play(1,DSBPLAY_LOOPING,true,tmp->GetPosition()); dsbCouplerDetach->SetVolume(DSBVOLUME_MAX); dsbCouplerDetach->Play(0, 0, 0); - DynamicObject->SetPneumatic(CouplNr, 0); - tmp->SetPneumatic(CouplNr, 0); + DynamicObject->SetPneumatic(CouplNr != 0, false); + tmp->SetPneumatic(CouplNr != 0, false); } } } @@ -1983,7 +1981,7 @@ if // przyciemnienia pod Univ4) else if (cKey == Global::Keys[k_Univ3]) { - if( Global::ctrlState ) + if (Global::ctrlState) { if (bCabLight == true) //(ggCabLightButton.GetValue()!=0) { @@ -1999,7 +1997,7 @@ if dsbSwitch->Play(0, 0, 0); } /* - if (Console::Pressed(VK_CONTROL)) + if (Global::ctrlState) {//z [Ctrl] zapalamy albo gasimy Å›wiateÅ‚ko w kabinie if (iCabLightFlag) --iCabLightFlag; //gaszenie } */ @@ -2010,7 +2008,7 @@ if // hunter-091012: dzwiek dla przyciemnienia swiatelka w kabinie else if (cKey == Global::Keys[k_Univ4]) { - if( Global::ctrlState ) + if (Global::ctrlState) { if (bCabLightDim == true) //(ggCabLightDimButton.GetValue()!=0) { @@ -2091,7 +2089,7 @@ if { if (false == (mvOccupied->LightsPosNo > 0)) { - if( ( Global::ctrlState ) && + if ((Global::ctrlState) && (ggRearLeftLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu // 17.02.17 changed rear to opposite side, so the same key actually controls both lights on the left side, from the driver's point of view // TODO: do it a more elegant way. preferably along with the rest of the controlling code @@ -2204,7 +2202,7 @@ if SetLights(); } } - else if( ( Global::ctrlState ) && + else if ((Global::ctrlState) && (ggRearUpperLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu { //------------------------------ @@ -2258,7 +2256,7 @@ if { if (false == (mvOccupied->LightsPosNo > 0)) { - if( ( Global::ctrlState ) && + if ((Global::ctrlState) && (ggRearRightLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu // 17.02.17 changed rear to opposite side, so the same key actually controls both lights on the left side, from the driver's point of view // TODO: do it a more elegant way. preferably along with the rest of the controlling code @@ -2398,7 +2396,7 @@ if right *= -1.0f; } // if (!GetAsyncKeyState(VK_SHIFT)<0) // bez shifta - if( !Global::ctrlState ) // gdy [Ctrl] zwolniony (dodatkowe widoki) + if (!Global::ctrlState) // gdy [Ctrl] zwolniony (dodatkowe widoki) { if (cKey == Global::Keys[k_MechLeft]) { @@ -4428,7 +4426,7 @@ bool TTrain::Update( double const Deltatime ) } // if ( - // Console::Pressed(VK_SHIFT)&&Console::Pressed(Global::Keys[k_Compressor])&&((mvControlled->EngineType==ElectricSeriesMotor)||(mvControlled->TrainType==dt_EZT)) + // Global::shiftState&&Console::Pressed(Global::Keys[k_Compressor])&&((mvControlled->EngineType==ElectricSeriesMotor)||(mvControlled->TrainType==dt_EZT)) // ) //NBMX 14-09-2003: sprezarka wl if (Global::shiftState && Console::Pressed(Global::Keys[k_Compressor]) && (mvControlled->CompressorPower < 2)) // hunter-091012: tak jest poprawnie @@ -4448,7 +4446,7 @@ bool TTrain::Update( double const Deltatime ) } // if ( - // !Console::Pressed(VK_SHIFT)&&Console::Pressed(Global::Keys[k_Compressor])&&((mvControlled->EngineType==ElectricSeriesMotor)||(mvControlled->TrainType==dt_EZT)) + // !Global::shiftState&&Console::Pressed(Global::Keys[k_Compressor])&&((mvControlled->EngineType==ElectricSeriesMotor)||(mvControlled->TrainType==dt_EZT)) // ) //NBMX 14-09-2003: sprezarka wl if (!Global::shiftState && Console::Pressed(Global::Keys[k_Compressor]) && (mvControlled->CompressorPower < 2)) // hunter-091012: tak jest poprawnie @@ -4509,7 +4507,7 @@ bool TTrain::Update( double const Deltatime ) if (!DebugModeFlag) { if (ggUniversal1Button.SubModel) - if( Global::shiftState ) + if (Global::shiftState) ggUniversal1Button.IncValue(dt / 2); else ggUniversal1Button.DecValue(dt / 2); @@ -4525,7 +4523,7 @@ bool TTrain::Update( double const Deltatime ) if (!DebugModeFlag) { if (ggUniversal2Button.SubModel) - if( Global::shiftState ) + if (Global::shiftState) ggUniversal2Button.IncValue(dt / 2); else ggUniversal2Button.DecValue(dt / 2); @@ -4535,7 +4533,7 @@ bool TTrain::Update( double const Deltatime ) // hunter-091012: zrobione z uwzglednieniem przelacznika swiatla if (Console::Pressed(Global::Keys[k_Univ3])) { - if( Global::shiftState ) + if (Global::shiftState) { if (Global::ctrlState) { @@ -4591,10 +4589,10 @@ bool TTrain::Update( double const Deltatime ) if (ggUniversal3Button.SubModel) - if (Console::Pressed(VK_CONTROL)) + if (Global::ctrlState) {//z [Ctrl] zapalamy albo gasimy Å›wiateÅ‚ko w kabinie //tutaj jest bez sensu, trzeba reagować na wciskanie klawisza! - if (Console::Pressed(VK_SHIFT)) + if (Global::shiftState) {//zapalenie if (iCabLightFlag<2) ++iCabLightFlag; } @@ -4606,7 +4604,7 @@ bool TTrain::Update( double const Deltatime ) } else {//bez [Ctrl] przełączamy coÅ›tem - if (Console::Pressed(VK_SHIFT)) + if (Global::shiftState) { ggUniversal3Button.PutValue(1); //hunter-131211: z UpdateValue na PutValue - by zachowywal sie jak pozostale przelaczniki @@ -4647,7 +4645,7 @@ bool TTrain::Update( double const Deltatime ) if (Console::Pressed(Global::Keys[k_Univ4])) { if (ggUniversal4Button.SubModel) - if (Console::Pressed(VK_SHIFT)) + if (Global::shiftState) { ActiveUniversal4=true; //ggUniversal4Button.UpdateValue(1); @@ -4664,7 +4662,7 @@ bool TTrain::Update( double const Deltatime ) // swiatla if (Console::Pressed(Global::Keys[k_Univ4])) { - if( Global::shiftState ) + if (Global::shiftState) { if (Global::ctrlState) { @@ -4737,7 +4735,7 @@ bool TTrain::Update( double const Deltatime ) // ((mvOccupied->BrakeHandle==FV4a)&&(Console::Pressed(Global::Keys[k_DecBrakeLevel]))) if ((Console::Pressed(Global::Keys[k_DecBrakeLevel]))) { - if( Global::ctrlState ) + if (Global::ctrlState) { // mvOccupied->BrakeCtrlPos2+=(mvOccupied->BrakeCtrlPos2>2?0:dt/20.0); // if (mvOccupied->BrakeCtrlPos2<-3) mvOccupied->BrakeCtrlPos2=-3; @@ -4753,7 +4751,7 @@ bool TTrain::Update( double const Deltatime ) if ((mvOccupied->BrakeHandle == FV4a) && (Console::Pressed(Global::Keys[k_IncBrakeLevel]))) { - if( Global::ctrlState ) + if (Global::ctrlState) { mvOccupied->BrakeCtrlPos2 -= dt / 20.0; if (mvOccupied->BrakeCtrlPos2 < -1.5) @@ -4770,7 +4768,7 @@ bool TTrain::Update( double const Deltatime ) if ((mvOccupied->BrakeHandle == FV4a) && (Console::Pressed(Global::Keys[k_DecBrakeLevel]))) { - if( Global::ctrlState ) + if (Global::ctrlState) { mvOccupied->BrakeCtrlPos2 += (mvOccupied->BrakeCtrlPos2 > 2 ? 0 : dt / 20.0); if (mvOccupied->BrakeCtrlPos2 < -3) @@ -4851,7 +4849,7 @@ bool TTrain::Update( double const Deltatime ) if (Global::shiftState) { // if (Console::Pressed(k_CurrentNext)) - { // Ra: byÅ‚o pod VK_F3 + { // Ra: byÅ‚o pod GLFW_KEY_F3 if ((mvOccupied->EpFuseSwitch(true))) { dsbPneumaticSwitch->SetVolume(-10); @@ -4862,7 +4860,7 @@ bool TTrain::Update( double const Deltatime ) else { // if (Console::Pressed(k_CurrentNext)) - { // Ra: byÅ‚o pod VK_F3 + { // Ra: byÅ‚o pod GLFW_KEY_F3 if (Global::ctrlState) { if ((mvOccupied->EpFuseSwitch(false))) @@ -4905,7 +4903,7 @@ bool TTrain::Update( double const Deltatime ) if (Console::Pressed(Global::Keys[k_PantRearUp])) { - if( Global::shiftState ) + if (Global::shiftState) ggPantRearButton.PutValue(1); else ggPantFrontButtonOff.PutValue(1); @@ -5105,7 +5103,6 @@ bool TTrain::CabChange(int iDirection) // wczytywanie pliku z danymi multimedialnymi (dzwieki, kontrolki, kabiny) bool TTrain::LoadMMediaFile(std::string const &asFileName) { - double dSDist; cParser parser(asFileName, cParser::buffer_FILE); // NOTE: yaml-style comments are disabled until conflict in use of # is resolved // parser.addCommentStyle( "#", "\n" ); @@ -5412,7 +5409,6 @@ bool TTrain::InitializeCab(int NewCabNo, std::string const &asFileName) pyScreens.reset(this); pyScreens.setLookupPath(DynamicObject->asBaseDir); bool parse = false; - double dSDist; int cabindex = 0; DynamicObject->mdKabina = NULL; // likwidacja wskaźnika na dotychczasowÄ… kabinÄ™ switch (NewCabNo) diff --git a/Train.h b/Train.h index 75252156..560a75e9 100644 --- a/Train.h +++ b/Train.h @@ -32,10 +32,10 @@ const int maxcab = 2; // const double fCzuwakTime= 90.0f; const double fCzuwakBlink = 0.15; -const float fConverterPrzekaznik = 1.5; // hunter-261211: do przekaznika nadmiarowego przetwornicy +const float fConverterPrzekaznik = 1.5f; // hunter-261211: do przekaznika nadmiarowego przetwornicy // 0.33f // const double fBuzzerTime= 5.0f; -const float fHaslerTime = 1.2; +const float fHaslerTime = 1.2f; // const double fStycznTime= 0.5f; // const double fDblClickTime= 0.2f; diff --git a/TrkFoll.cpp b/TrkFoll.cpp index 349fa859..d610058e 100644 --- a/TrkFoll.cpp +++ b/TrkFoll.cpp @@ -303,8 +303,8 @@ bool TTrackFollower::ComputatePosition() return false; } #if RENDER_CONE -#include "opengl/glew.h" -#include "opengl/glut.h" +#include "GL/glew.h" +#include "GL/glut.h" void TTrackFollower::Render(float fNr) { // funkcja rysujÄ…ca stożek w miejscu osi glPushMatrix(); // matryca kamery diff --git a/VBO.cpp b/VBO.cpp index 6b8777bf..cd9483d3 100644 --- a/VBO.cpp +++ b/VBO.cpp @@ -9,9 +9,39 @@ http://mozilla.org/MPL/2.0/. #include "stdafx.h" #include "VBO.h" +#include "GL/glew.h" #include "usefull.h" +#include "sn_utils.h" //--------------------------------------------------------------------------- +void CVertNormTex::deserialize(std::istream &s) +{ + x = sn_utils::ld_float32(s); + y = sn_utils::ld_float32(s); + z = sn_utils::ld_float32(s); + + nx = sn_utils::ld_float32(s); + ny = sn_utils::ld_float32(s); + nz = sn_utils::ld_float32(s); + + u = sn_utils::ld_float32(s); + v = sn_utils::ld_float32(s); +} + +void CVertNormTex::serialize(std::ostream &s) +{ + sn_utils::ls_float32(s, x); + sn_utils::ls_float32(s, y); + sn_utils::ls_float32(s, z); + + sn_utils::ls_float32(s, nx); + sn_utils::ls_float32(s, ny); + sn_utils::ls_float32(s, nz); + + sn_utils::ls_float32(s, u); + sn_utils::ls_float32(s, v); +} + CMesh::CMesh() { // utworzenie pustego obiektu m_pVNT = nullptr; diff --git a/VBO.h b/VBO.h index 368563be..3c0ec334 100644 --- a/VBO.h +++ b/VBO.h @@ -21,6 +21,9 @@ class CVertNormTex float nz = 0.0; // Z wektora normalnego float u = 0.0; // U mapowania float v = 0.0; // V mapowania + + void deserialize(std::istream&); + void serialize(std::ostream&); }; class CMesh diff --git a/World.h b/World.h index 5def8d8a..67b0ece1 100644 --- a/World.h +++ b/World.h @@ -9,6 +9,7 @@ http://mozilla.org/MPL/2.0/. #pragma once +#include #include #include "Camera.h" #include "Ground.h" diff --git a/color.h b/color.h index 68890616..ed334551 100644 --- a/color.h +++ b/color.h @@ -7,9 +7,9 @@ float3 XYZtoRGB( float3 const &XYZ ) { // M^-1 for Adobe RGB from http://www.brucelindbloom.com/Eqn_RGB_XYZ_Matrix.html - float const mi[ 3 ][ 3 ] = { 2.041369, -0.969266, 0.0134474, -0.5649464, 1.8760108, -0.1183897, -0.3446944, 0.041556, 1.0154096 }; + float const mi[ 3 ][ 3 ] = { 2.041369f, -0.969266f, 0.0134474f, -0.5649464f, 1.8760108f, -0.1183897f, -0.3446944f, 0.041556f, 1.0154096f }; // m^-1 for sRGB: -// float const mi[ 3 ][ 3 ] = { 3.240479, -0.969256, 0.055648, -1.53715, 1.875991, -0.204043, -0.49853, 0.041556, 1.057311 }; +// float const mi[ 3 ][ 3 ] = { 3.240479f, -0.969256f, 0.055648f, -1.53715f, 1.875991f, -0.204043f, -0.49853f, 0.041556f, 1.057311f }; return float3{ XYZ.x*mi[ 0 ][ 0 ] + XYZ.y*mi[ 1 ][ 0 ] + XYZ.z*mi[ 2 ][ 0 ], diff --git a/eu07.rc b/eu07.rc new file mode 100644 index 00000000..8e594be8 --- /dev/null +++ b/eu07.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON "eu07.ico" \ No newline at end of file diff --git a/geometry.h b/geometry.h index 12cee7c5..85f0e586 100644 --- a/geometry.h +++ b/geometry.h @@ -9,7 +9,7 @@ http://mozilla.org/MPL/2.0/. #ifndef GeometryH #define GeometryH -#include "gl/glew.h" +#include "GL/glew.h" #include "dumb3d.h" using namespace Math3D; //--------------------------------------------------------------------------- diff --git a/mtable.cpp b/mtable.cpp index 877271b8..f7b0948c 100644 --- a/mtable.cpp +++ b/mtable.cpp @@ -513,7 +513,7 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax) } } } - return !(bool)ConversionError; + return ConversionError == 0; } void TMTableTime::UpdateMTableTime(double deltaT) diff --git a/parser.cpp b/parser.cpp index 9276a063..f66a3e99 100644 --- a/parser.cpp +++ b/parser.cpp @@ -65,7 +65,7 @@ cParser::~cParser() } // methods -bool cParser::getTokens(int Count, bool ToLower, const char *Break) +bool cParser::getTokens(unsigned int Count, bool ToLower, const char *Break) { tokens.clear(); // emulates old parser behaviour. TODO, TBD: allow manual reset? /* @@ -79,7 +79,7 @@ bool cParser::getTokens(int Count, bool ToLower, const char *Break) this->str(""); this->clear(); */ - for (int i = 0; i < Count; ++i) + for (unsigned int i = 0; i < Count; ++i) { std::string token = readToken(ToLower, Break); if( true == token.empty() ) { diff --git a/parser.h b/parser.h index d3d5f746..9dd49df8 100644 --- a/parser.h +++ b/parser.h @@ -77,7 +77,7 @@ class cParser //: public std::stringstream { return !mStream->fail(); }; - bool getTokens(int Count = 1, bool ToLower = true, const char *Break = "\n\r\t ;"); + bool getTokens(unsigned int Count = 1, bool ToLower = true, const char *Break = "\n\r\t ;"); // returns percentage of file processed so far int getProgress() const; // add custom definition of text which should be ignored when retrieving tokens diff --git a/python_var_doc.md b/python_var_doc.md new file mode 100644 index 00000000..2f24dcbb --- /dev/null +++ b/python_var_doc.md @@ -0,0 +1,17 @@ +| nazwa | typ | opis | +|------------------------|-------|------------------------------------------------------------| +| direction | int | kiernek jazdy (-1: do ty³u, 0: ¿aden, 1: do przodu) | +| slipping_wheels | bool | poœlizg | +| converter | bool | dzia³anie przetwornicy | +| main_ctrl_actual_pos | int | numer pozycji nastawnika (wskaŸnik RList) | +| scnd_ctrl_actual_pos | int | numer pozycji bocznika (wskaŸnik MotorParam) | +| fuse | bool | wy³¹cznik szybki (bezpiecznik nadmiarowy) | +| converter_overload | bool | wy³¹cznik nadmiarowy przetwornicy i ogrzewania | +| voltage | float | napiêcie w sieci | +| velocity | float | aktualna prêdkoœæ | +| im | float | pr¹d silnika | +| compress | bool | dzia³anie sprê¿arki | +| hours | int | aktualny czas | +| minutes | int | aktualny czas | +| seconds | int | aktualny czas | +| velocity_desired | float | prêdkosæ zadana | diff --git a/renderer.cpp b/renderer.cpp index 509632d9..3f539555 100644 --- a/renderer.cpp +++ b/renderer.cpp @@ -35,7 +35,7 @@ opengl_renderer::Init() { void opengl_renderer::Update_Lights( light_array const &Lights ) { - int const count = std::min( m_lights.size(), Lights.data.size() ); + size_t const count = std::min( m_lights.size(), Lights.data.size() ); if( count == 0 ) { return; } auto renderlight = m_lights.begin(); @@ -86,9 +86,9 @@ opengl_renderer::Update_Lights( light_array const &Lights ) { void opengl_renderer::Disable_Lights() { - for( int idx = 0; idx < m_lights.size() + 1; ++idx ) { + for( size_t idx = 0; idx < m_lights.size() + 1; ++idx ) { - ::glDisable( GL_LIGHT0 + idx ); + ::glDisable( GL_LIGHT0 + (int)idx ); } } //--------------------------------------------------------------------------- diff --git a/renderer.h b/renderer.h index dc613ac5..719d78ae 100644 --- a/renderer.h +++ b/renderer.h @@ -9,14 +9,14 @@ http://mozilla.org/MPL/2.0/. #pragma once -#include "gl/glew.h" +#include "GL/glew.h" #include "texture.h" #include "lightarray.h" #include "dumb3d.h" struct opengl_light { - GLuint id{ -1 }; + GLuint id{ (GLuint)-1 }; Math3D::vector3 direction; GLfloat position[ 4 ]; // 4th parameter specifies directional(0) or omni-directional(1) light source GLfloat ambient[ 4 ]; @@ -42,7 +42,7 @@ struct opengl_light { glLightfv( id, GL_POSITION, position ); if( position[ 3 ] == 1.0f ) { - GLfloat directionarray[] = { direction.x, direction.y, direction.z }; + GLfloat directionarray[] = { (GLfloat)direction.x, (GLfloat)direction.y, (GLfloat)direction.z }; glLightfv( id, GL_SPOT_DIRECTION, directionarray ); } } diff --git a/skydome.h b/skydome.h index 67347a59..ba625975 100644 --- a/skydome.h +++ b/skydome.h @@ -45,9 +45,9 @@ private: std::vector m_indices; // std::vector m_normals; std::vector m_colours; - GLuint m_vertexbuffer{ -1 }; - GLuint m_indexbuffer{ -1 }; - GLuint m_coloursbuffer{ -1 }; + GLuint m_vertexbuffer{ (GLuint)-1 }; + GLuint m_indexbuffer{ (GLuint)-1 }; + GLuint m_coloursbuffer{ (GLuint)-1 }; static float m_distributionluminance[ 5 ][ 2 ]; static float m_distributionxcomp[ 5 ][ 2 ]; diff --git a/sn_utils.cpp b/sn_utils.cpp new file mode 100644 index 00000000..f454fc3c --- /dev/null +++ b/sn_utils.cpp @@ -0,0 +1,136 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public +* License, v. 2.0. If a copy of the MPL was not distributed with this +* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "stdafx.h" +#include "sn_utils.h" + +// sanity checks +static_assert(std::numeric_limits::is_iec559, "IEEE754 required"); +static_assert(sizeof(float) == 4, "Float must be 4 bytes"); +static_assert(sizeof(double) == 8, "Double must be 8 bytes"); +static_assert(-1 == ~0, "Two's complement required"); + +// deserialize little endian uint16 +uint16_t sn_utils::ld_uint16(std::istream &s) +{ + uint8_t buf[2]; + s.read((char*)buf, 2); + uint16_t v = (buf[1] << 8) | buf[0]; + return reinterpret_cast(v); +} + +// deserialize little endian uint32 +uint32_t sn_utils::ld_uint32(std::istream &s) +{ + uint8_t buf[4]; + s.read((char*)buf, 4); + uint32_t v = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + return reinterpret_cast(v); +} + +// deserialize little endian int32 +int32_t sn_utils::ld_int32(std::istream &s) +{ + uint8_t buf[4]; + s.read((char*)buf, 4); + uint32_t v = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + return reinterpret_cast(v); +} + +// deserialize little endian ieee754 float32 +float sn_utils::ld_float32(std::istream &s) +{ + uint8_t buf[4]; + s.read((char*)buf, 4); + uint32_t v = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0]; + return reinterpret_cast(v); +} + +// deserialize little endian ieee754 float64 +double sn_utils::ld_float64(std::istream &s) +{ + uint8_t buf[8]; + s.read((char*)buf, 8); + uint64_t v = ((uint64_t)buf[7] << 56) | ((uint64_t)buf[6] << 48) | + ((uint64_t)buf[5] << 40) | ((uint64_t)buf[4] << 32) | + ((uint64_t)buf[3] << 24) | ((uint64_t)buf[2] << 16) | + ((uint64_t)buf[1] << 8) | (uint64_t)buf[0]; + return reinterpret_cast(v); +} + +// deserialize null-terminated string +std::string sn_utils::d_str(std::istream &s) +{ + std::string r; + r.reserve(32); + char buf[1]; + while (true) + { + s.read(buf, 1); + if (buf[0] == 0) + break; + r.push_back(buf[0]); + } + return r; +} + +void sn_utils::ls_uint16(std::ostream &s, uint16_t v) +{ + uint8_t buf[2]; + buf[0] = v; + buf[1] = v >> 8; + s.write((char*)buf, 2); +} + +void sn_utils::ls_uint32(std::ostream &s, uint32_t v) +{ + uint8_t buf[4]; + buf[0] = v; + buf[1] = v >> 8; + buf[2] = v >> 16; + buf[3] = v >> 24; + s.write((char*)buf, 4); +} + +void sn_utils::ls_int32(std::ostream &s, int32_t v) +{ + uint8_t buf[4]; + buf[0] = v; + buf[1] = v >> 8; + buf[2] = v >> 16; + buf[3] = v >> 24; + s.write((char*)buf, 4); +} + +void sn_utils::ls_float32(std::ostream &s, float t) +{ + uint32_t v = reinterpret_cast(t); + uint8_t buf[4]; + buf[0] = v; + buf[1] = v >> 8; + buf[2] = v >> 16; + buf[3] = v >> 24; + s.write((char*)buf, 4); +} + +void sn_utils::ls_float64(std::ostream &s, double t) +{ + uint64_t v = reinterpret_cast(t); + uint8_t buf[8]; + buf[0] = v; + buf[1] = v >> 8; + buf[2] = v >> 16; + buf[3] = v >> 24; + buf[4] = v >> 32; + buf[5] = v >> 40; + buf[6] = v >> 48; + buf[7] = v >> 56; + s.write((char*)buf, 8); +} + +void sn_utils::s_str(std::ostream &s, std::string v) +{ + const char* buf = v.c_str(); + s.write(buf, v.size() + 1); +} \ No newline at end of file diff --git a/sn_utils.h b/sn_utils.h new file mode 100644 index 00000000..dd269121 --- /dev/null +++ b/sn_utils.h @@ -0,0 +1,23 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public +* License, v. 2.0. If a copy of the MPL was not distributed with this +* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include + +class sn_utils +{ +public: + static uint16_t ld_uint16(std::istream&); + static uint32_t ld_uint32(std::istream&); + static int32_t ld_int32(std::istream&); + static float ld_float32(std::istream&); + static double ld_float64(std::istream&); + static std::string d_str(std::istream&); + + static void ls_uint16(std::ostream&, uint16_t); + static void ls_uint32(std::ostream&, uint32_t); + static void ls_int32(std::ostream&, int32_t); + static void ls_float32(std::ostream&, float); + static void ls_float64(std::ostream&, double); + static void s_str(std::ostream&, std::string); +}; \ No newline at end of file diff --git a/stdafx.h b/stdafx.h index 7acb8d8c..f4b609b7 100644 --- a/stdafx.h +++ b/stdafx.h @@ -18,12 +18,14 @@ #endif // _DEBUG #endif // operating system +#ifdef _WINDOWS #include "targetver.h" #define NOMINMAX #include #include #undef NOMINMAX #include +#endif // stl #include #include @@ -65,4 +67,5 @@ #define GLFW_DLL #endif #define GLFW_INCLUDE_GLU +//m7todo: jest tu bo nie chcia³o mi siê wpychaæ do wszystkich plików #include \ No newline at end of file diff --git a/sun.h b/sun.h index bc275f3d..03711464 100644 --- a/sun.h +++ b/sun.h @@ -1,8 +1,8 @@ #pragma once #include "windows.h" -#include "gl/glew.h" -#include "gl/wglew.h" +#include "GL/glew.h" +#include "GL/wglew.h" #include "dumb3d.h" diff --git a/windows.cpp b/windows.cpp new file mode 100644 index 00000000..49ef578b --- /dev/null +++ b/windows.cpp @@ -0,0 +1,72 @@ +#include "stdafx.h" +#include "World.h" +#include "usefull.h" + +#pragma warning (disable: 4091) +#include + +LONG CALLBACK unhandled_handler(::EXCEPTION_POINTERS* e) +{ + auto hDbgHelp = ::LoadLibraryA("dbghelp"); + if (hDbgHelp == nullptr) + return EXCEPTION_CONTINUE_SEARCH; + auto pMiniDumpWriteDump = (decltype(&MiniDumpWriteDump))::GetProcAddress(hDbgHelp, "MiniDumpWriteDump"); + if (pMiniDumpWriteDump == nullptr) + return EXCEPTION_CONTINUE_SEARCH; + + char name[MAX_PATH]; + { + auto nameEnd = name + ::GetModuleFileNameA(::GetModuleHandleA(0), name, MAX_PATH); + ::SYSTEMTIME t; + ::GetSystemTime(&t); + wsprintfA(nameEnd - strlen(".exe"), + "_crashdump_%4d%02d%02d_%02d%02d%02d.dmp", + t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond); + } + + auto hFile = ::CreateFileA(name, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); + if (hFile == INVALID_HANDLE_VALUE) + return EXCEPTION_CONTINUE_SEARCH; + + ::MINIDUMP_EXCEPTION_INFORMATION exceptionInfo; + exceptionInfo.ThreadId = ::GetCurrentThreadId(); + exceptionInfo.ExceptionPointers = e; + exceptionInfo.ClientPointers = FALSE; + + auto dumped = pMiniDumpWriteDump( + ::GetCurrentProcess(), + ::GetCurrentProcessId(), + hFile, + ::MINIDUMP_TYPE(::MiniDumpWithIndirectlyReferencedMemory | ::MiniDumpScanMemory), + e ? &exceptionInfo : nullptr, + nullptr, + nullptr); + + ::CloseHandle(hFile); + + return EXCEPTION_CONTINUE_SEARCH; +} + +HWND Hwnd; +WNDPROC BaseWindowProc; +PCOPYDATASTRUCT pDane; +extern TWorld World; + +LRESULT APIENTRY WndProc( HWND hWnd, // handle for this window + UINT uMsg, // message for this window + WPARAM wParam, // additional message information + LPARAM lParam) // additional message information +{ + switch( uMsg ) // check for windows messages + { + case WM_COPYDATA: { + // obsÅ‚uga danych przesÅ‚anych przez program sterujÄ…cy + pDane = (PCOPYDATASTRUCT)lParam; + if( pDane->dwData == MAKE_ID4('E', 'U', '0', '7')) // sygnatura danych + World.OnCommandGet( (DaneRozkaz *)( pDane->lpData ) ); + break; + } + } + // pass all unhandled messages to DefWindowProc + return CallWindowProc( BaseWindowProc, Hwnd, uMsg, wParam, lParam ); +}; \ No newline at end of file