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