16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-23 15:39:19 +02:00

milek7's branch merge; model file serialization, 64bit compatibility

This commit is contained in:
tmj-fstate
2017-03-06 18:20:26 +01:00
61 changed files with 2765 additions and 2431 deletions

2
.gitignore vendored
View File

@@ -69,3 +69,5 @@ bin/
ipch/ ipch/
ref/ ref/
*.aps *.aps
builds/

View File

@@ -423,9 +423,9 @@ TAnimModel::TAnimModel()
} }
vAngle.x = vAngle.y = vAngle.z = 0.0; // zerowanie obrotów egzemplarza vAngle.x = vAngle.y = vAngle.z = 0.0; // zerowanie obrotów egzemplarza
pAdvanced = NULL; // nie ma zaawansowanej animacji pAdvanced = NULL; // nie ma zaawansowanej animacji
fDark = 0.25; // standardowy próg zaplania fDark = 0.25f; // standardowy próg zaplania
fOnTime = 0.66; fOnTime = 0.66f;
fOffTime = fOnTime + 0.66; fOffTime = fOnTime + 0.66f;
} }
TAnimModel::~TAnimModel() TAnimModel::~TAnimModel()
@@ -546,7 +546,7 @@ TAnimContainer * TAnimModel::GetContainer(char *pName)
TAnimContainer *pCurrent; TAnimContainer *pCurrent;
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext) for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
// if (pCurrent->GetName()==pName) // if (pCurrent->GetName()==pName)
if (stricmp(pCurrent->NameGet(), pName) == 0) if (std::string(pName) == pCurrent->NameGet())
return pCurrent; return pCurrent;
return AddContainer(pName); return AddContainer(pName);
} }
@@ -587,7 +587,7 @@ void TAnimModel::RaPrepare()
if (LightsOff[i]) if (LightsOff[i])
LightsOff[i]->iVisible = !state; 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) TSubModel::pasText = &asText; // przekazanie tekstu do wyświetlacza (!!!! do przemyślenia)
if (pAdvanced) // jeśli jest zaawansowana animacja if (pAdvanced) // jeśli jest zaawansowana animacja
Advanced(); // wykonać co tam trzeba Advanced(); // wykonać co tam trzeba

View File

@@ -81,9 +81,9 @@ class TAnimContainer
// std::string(pSubModel?pSubModel->asName.c_str():""); }; // std::string(pSubModel?pSubModel->asName.c_str():""); };
// std::string inline GetName() { return std::string(pSubModel?pSubModel->pName:""); // 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 // void SetRotateAnim(vector3 vNewRotateAxis, double fNewDesiredAngle, double
// fNewRotateSpeed, bool bResetAngle=false); // fNewRotateSpeed, bool bResetAngle=false);

107
CMakeLists.txt Normal file
View File

@@ -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})

View File

@@ -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)

View File

@@ -86,8 +86,8 @@ void TCamera::Update()
if (Console::Pressed(Global::Keys[k_MechBackward])) if (Console::Pressed(Global::Keys[k_MechBackward]))
Velocity.z += a; Velocity.z += a;
// gora-dol // gora-dol
// if (Console::Pressed(VK_NUMPAD9)) Pos.y+=0.1; // if (Console::Pressed(GLFW_KEY_KP_9)) Pos.y+=0.1;
// if (Console::Pressed(VK_NUMPAD3)) Pos.y-=0.1; // if (Console::Pressed(GLFW_KEY_KP_3)) Pos.y-=0.1;
// McZapkie: zeby nie hustalo przy malym FPS: // McZapkie: zeby nie hustalo przy malym FPS:
// Velocity= (Velocity+OldVelocity)/2; // Velocity= (Velocity+OldVelocity)/2;

View File

@@ -83,7 +83,7 @@ public static Int32 GetScreenSaverTimeout()
TKeyTrans Console::ktTable[4 * 256]; TKeyTrans Console::ktTable[4 * 256];
// Ra: do poprawienia // Ra: do poprawienia
void SetLedState(char Code, bool bOn){ void SetLedState(unsigned char Code, bool bOn){
// Ra: bajer do migania LED-ami w klawiaturze // Ra: bajer do migania LED-ami w klawiaturze
// NOTE: disabled for the time being // NOTE: disabled for the time being
// TODO: find non Borland specific equivalent, or get rid of it // 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 case 1: // sterowanie światełkami klawiatury: CA/SHP+opory
if (mask & 3) // gdy SHP albo CA 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 if (mask & 4) // gdy jazda na oporach
{ // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny { // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny
SetLedState(VK_SCROLL, true); // przyciśnięty SetLedState(VK_SCROLL, true); // przyciśnięty
@@ -254,7 +254,7 @@ void Console::BitsUpdate(int mask)
break; break;
case 2: // sterowanie światełkami klawiatury: CA+SHP case 2: // sterowanie światełkami klawiatury: CA+SHP
if (mask & 2) // gdy CA if (mask & 2) // gdy CA
SetLedState(VK_CAPITAL, iBits & 2); SetLedState(VK_CAPITAL, (iBits & 2) != 0);
if (mask & 1) // gdy SHP if (mask & 1) // gdy SHP
{ // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny { // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny
SetLedState(VK_SCROLL, true); // przyciśnięty SetLedState(VK_SCROLL, true); // przyciśnięty

View File

@@ -45,7 +45,7 @@ bool TLPT::Connect(int port)
case 0xBD00: case 0xBD00:
OutPort(address + 0x006, 0); // 0xBC06? czysta improwizacja OutPort(address + 0x006, 0); // 0xBC06? czysta improwizacja
} }
return bool(OutPort); return OutPort != 0;
}; };
void TLPT::Out(int x) void TLPT::Out(int x)

View File

@@ -189,7 +189,6 @@ bool TMWDComm::ReadData() // odbieranie danych + odczyta danych analogowych i za
bool TMWDComm::SendData() // wysyłanie danych bool TMWDComm::SendData() // wysyłanie danych
{ {
DWORD bytes_write; DWORD bytes_write;
DWORD fdwEvtMask;
WriteFile(hComm, &WriteDataBuff[0], BYTETOWRITE, &bytes_write, NULL); WriteFile(hComm, &WriteDataBuff[0], BYTETOWRITE, &bytes_write, NULL);

View File

@@ -70,7 +70,6 @@ bool TPoKeys55::Connect()
PBYTE PropertyValueBuffer; PBYTE PropertyValueBuffer;
bool MatchFound; bool MatchFound;
DWORD ErrorStatus; DWORD ErrorStatus;
HDEVINFO hDevInfo;
std::string DeviceIDFromRegistry; std::string DeviceIDFromRegistry;
std::string DeviceIDToFind = "Vid_1dc3&Pid_1001&Rev_1000&MI_01"; 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 // First populate a list of plugged in devices (by specifying "DIGCF_PRESENT"), which are of the

Binary file not shown.

View File

@@ -260,8 +260,8 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
} }
if (iFlags & spSwitch) // jeśli odcinek zmienny if (iFlags & spSwitch) // jeśli odcinek zmienny
{ {
if (bool(trTrack->GetSwitchState() & 1) != if (((trTrack->GetSwitchState() & 1) != 0) !=
bool(iFlags & spSwitchStatus)) // czy stan się zmienił? ((iFlags & spSwitchStatus) != 0)) // czy stan się zmienił?
{ // Ra: zakładam, że są tylko 2 możliwe stany { // Ra: zakładam, że są tylko 2 możliwe stany
iFlags ^= spSwitchStatus; iFlags ^= spSwitchStatus;
// fVelNext=trTrack->VelocityGet(); //nowa prędkość // fVelNext=trTrack->VelocityGet(); //nowa prędkość
@@ -389,7 +389,7 @@ void TSpeedPos::Set(TTrack *track, double dist, int flag)
fVelNext = (trTrack->iCategoryFlag & 1) ? fVelNext = (trTrack->iCategoryFlag & 1) ?
0.0 : 0.0 :
20.0; // jeśli koniec, to pociąg stój, a samochód zwolnij 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_1() :
trTrack->CurrentSegment()->FastGetPoint_0(); trTrack->CurrentSegment()->FastGetPoint_0();
} }

View File

@@ -43,7 +43,7 @@ http://mozilla.org/MPL/2.0/.
// vector3 vWorldLeft=CrossProduct(vWorldUp,vWorldFront); // vector3 vWorldLeft=CrossProduct(vWorldUp,vWorldFront);
#define M_2PI 6.283185307179586476925286766559; #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() void TAnimPant::AKP_4E()
@@ -65,13 +65,13 @@ void TAnimPant::AKP_4E()
PantWys = fLenL1 * sin(fAngleL) + fLenU1 * sin(fAngleU) + fHeight; // wysokość początkowa PantWys = fLenL1 * sin(fAngleL) + fLenU1 * sin(fAngleU) + fHeight; // wysokość początkowa
PantTraction = PantWys; PantTraction = PantWys;
hvPowerWire = NULL; 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 // poza obszarem roboczym jest aproksymacja łamaną o 5 odcinkach
fHeightExtra[0] = 0.0; //+0.0762 fHeightExtra[0] = 0.0f; //+0.0762
fHeightExtra[1] = -0.01; //+0.1524 fHeightExtra[1] = -0.01f; //+0.1524
fHeightExtra[2] = -0.03; //+0.2286 fHeightExtra[2] = -0.03f; //+0.2286
fHeightExtra[3] = -0.07; //+0.3048 fHeightExtra[3] = -0.07f; //+0.3048
fHeightExtra[4] = -0.15; //+0.3810 fHeightExtra[4] = -0.15f; //+0.3810
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
int TAnim::TypeSet(int i, int fl) int TAnim::TypeSet(int i, int fl)
@@ -1168,7 +1168,6 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir,
if( false == Track->Dynamics.empty() ) if( false == Track->Dynamics.empty() )
#endif #endif
{ // sens szukania na tym torze jest tylko, gdy są na nim pojazdy { // 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 MyTranslation; // pozycja szukającego na torze
double MinDist = Track->Length(); // najmniejsza znaleziona odleglość double MinDist = Track->Length(); // najmniejsza znaleziona odleglość
// (zaczynamy od długości toru) // (zaczynamy od długości toru)
@@ -1888,11 +1887,11 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
// dodatkowe parametry yB // dodatkowe parametry yB
MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać
// kropkę na koniec // kropkę na koniec
int kropka = MoreParams.find("."); // znajdź kropke size_t kropka = MoreParams.find("."); // znajdź kropke
std::string ActPar; // na parametry std::string ActPar; // na parametry
while (kropka != std::string::npos) // jesli sa kropki jeszcze 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; ActPar = ToUpper(MoreParams.substr(0, kropka)); // pierwszy parametr;
MoreParams = MoreParams.substr(kropka + 1, dlugosc - kropka); // reszta do dalszej MoreParams = MoreParams.substr(kropka + 1, dlugosc - kropka); // reszta do dalszej
// obrobki // obrobki
@@ -2153,8 +2152,8 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
iNumAxles = 2; iNumAxles = 2;
// McZapkie-090402: odleglosc miedzy czopami skretu lub osiami // McZapkie-090402: odleglosc miedzy czopami skretu lub osiami
fAxleDist = Max0R(MoverParameters->BDist, MoverParameters->ADist); fAxleDist = Max0R(MoverParameters->BDist, MoverParameters->ADist);
if (fAxleDist < 0.2) if (fAxleDist < 0.2f)
fAxleDist = 0.2; //żeby się dało wektory policzyć fAxleDist = 0.2f; //żeby się dało wektory policzyć
if (fAxleDist > MoverParameters->Dim.L - 0.2) // nie mogą być za daleko if (fAxleDist > MoverParameters->Dim.L - 0.2) // nie mogą być za daleko
fAxleDist = MoverParameters->Dim.L - 0.2; // bo będzie "walenie w mur" fAxleDist = MoverParameters->Dim.L - 0.2; // bo będzie "walenie w mur"
double fAxleDistHalf = fAxleDist * 0.5; double fAxleDistHalf = fAxleDist * 0.5;
@@ -2264,18 +2263,18 @@ void TDynamicObject::Move(double fDistance)
} }
if (fDistance > 0.0) if (fDistance > 0.0)
{ // gdy ruch w stronę sprzęgu 0, doliczyć korektę do osi 1 { // gdy ruch w stronę sprzęgu 0, doliczyć korektę do osi 1
bEnabled &= Axle0.Move(fDistance, !iAxleFirst); // oś z przodu pojazdu bEnabled &= Axle0.Move(fDistance, iAxleFirst == 0); // oś z przodu pojazdu
bEnabled &= Axle1.Move(fDistance /*-fAdjustment*/, iAxleFirst); // oś z tyłu pojazdu bEnabled &= Axle1.Move(fDistance /*-fAdjustment*/, iAxleFirst != 0); // oś z tyłu pojazdu
} }
else if (fDistance < 0.0) else if (fDistance < 0.0)
{ // gdy ruch w stronę sprzęgu 1, doliczyć korektę do osi 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 &= Axle1.Move(fDistance, iAxleFirst != 0); // oś z tyłu pojazdu prusza się pierwsza
bEnabled &= Axle0.Move(fDistance /*-fAdjustment*/, !iAxleFirst); // oś z przodu pojazdu bEnabled &= Axle0.Move(fDistance /*-fAdjustment*/, iAxleFirst == 0); // oś z przodu pojazdu
} }
else // gf: bez wywolania Move na postoju nie ma event0 else // gf: bez wywolania Move na postoju nie ma event0
{ {
bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oś z tyłu pojazdu prusza się pierwsza bEnabled &= Axle1.Move(fDistance, iAxleFirst != 0); // oś z tyłu pojazdu prusza się pierwsza
bEnabled &= Axle0.Move(fDistance, !iAxleFirst); // oś z przodu pojazdu bEnabled &= Axle0.Move(fDistance, iAxleFirst == 0); // oś z przodu pojazdu
} }
if (fDistance != 0.0) // nie liczyć ponownie, jeśli stoi if (fDistance != 0.0) // nie liczyć ponownie, jeśli stoi
{ // liczenie pozycji pojazdu tutaj, bo jest używane w wielu miejscach { // liczenie pozycji pojazdu tutaj, bo jest używane w wielu miejscach
@@ -2353,10 +2352,10 @@ void TDynamicObject::Move(double fDistance)
switch (t0->eEnvironment) switch (t0->eEnvironment)
{ // typ zmiany oświetlenia { // typ zmiany oświetlenia
case e_canyon: case e_canyon:
fShade = 0.65; fShade = 0.65f;
break; // zacienienie w kanionie break; // zacienienie w kanionie
case e_tunnel: case e_tunnel:
fShade = 0.20; fShade = 0.20f;
break; // zacienienie w tunelu break; // zacienienie w tunelu
} }
} }
@@ -3116,7 +3115,6 @@ bool TDynamicObject::Update(double dt, double dt1)
ResetdMoveLen(); ResetdMoveLen();
// McZapkie-260202 // McZapkie-260202
// tupot mew, tfu, stukot kol: // tupot mew, tfu, stukot kol:
DWORD stat;
// taka prowizorka zeby sciszyc stukot dalekiej lokomotywy // taka prowizorka zeby sciszyc stukot dalekiej lokomotywy
double ObjectDist; double ObjectDist;
double vol = 0; double vol = 0;
@@ -3735,7 +3733,7 @@ void TDynamicObject::Render()
if (renderme) if (renderme)
{ {
TSubModel::iInstance = (int)this; //żeby nie robić cudzych animacji TSubModel::iInstance = (size_t)this; //żeby nie robić cudzych animacji
// AnsiString asLoadName=""; // AnsiString asLoadName="";
double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition) / Global::ZoomFactor; double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition) / Global::ZoomFactor;
ABuLittleUpdate(ObjSqrDist); // ustawianie zmiennych submodeli dla wspólnego modelu ABuLittleUpdate(ObjSqrDist); // ustawianie zmiennych submodeli dla wspólnego modelu
@@ -3863,8 +3861,8 @@ void TDynamicObject::Render()
{ {
for (int li = 0; li < 3; li++) for (int li = 0; li < 3; li++)
{ {
diffuseCabLight[li] *= 0.6; diffuseCabLight[li] *= 0.6f;
specularCabLight[li] *= 0.7; specularCabLight[li] *= 0.7f;
} }
} }
break; break;
@@ -3872,9 +3870,9 @@ void TDynamicObject::Render()
{ {
for (int li = 0; li < 3; li++) for (int li = 0; li < 3; li++)
{ {
ambientCabLight[li] *= 0.3; ambientCabLight[li] *= 0.3f;
diffuseCabLight[li] *= 0.1; diffuseCabLight[li] *= 0.1f;
specularCabLight[li] *= 0.2; specularCabLight[li] *= 0.2f;
} }
} }
break; break;
@@ -4280,7 +4278,7 @@ void TDynamicObject::RenderAlpha()
{ // rysowanie elementów półprzezroczystych { // rysowanie elementów półprzezroczystych
if (renderme) 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); double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition);
ABuLittleUpdate(ObjSqrDist); // ustawianie zmiennych submodeli dla wspólnego modelu ABuLittleUpdate(ObjSqrDist); // ustawianie zmiennych submodeli dla wspólnego modelu
glPushMatrix(); glPushMatrix();
@@ -4689,7 +4687,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
else if (token == "animwheelprefix:") { else if (token == "animwheelprefix:") {
// prefiks kręcących się kół // prefiks kręcących się kół
int i, j, k, m; int i, k, m;
unsigned int j;
parser.getTokens( 1, false ); parser >> token; parser.getTokens( 1, false ); parser >> token;
for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // liczba osi for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // liczba osi
{ // McZapkie-050402: wyszukiwanie kol o nazwie str* { // McZapkie-050402: wyszukiwanie kol o nazwie str*
@@ -5073,7 +5072,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
else if( token == "animdoorprefix:" ) { else if( token == "animdoorprefix:" ) {
// nazwa animowanych drzwi // nazwa animowanych drzwi
int i, j, k, m; int i, j;
parser.getTokens(1, false); parser >> token; parser.getTokens(1, false); parser >> token;
for (i = 0, j = 0; i < ANIM_DOORS; ++i) for (i = 0, j = 0; i < ANIM_DOORS; ++i)
j += iAnimType[i]; // zliczanie wcześniejszych animacji j += iAnimType[i]; // zliczanie wcześniejszych animacji

144
EU07.bpr
View File

@@ -1,144 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!-- C++Builder XML Project -->
<PROJECT>
<MACROS>
<VERSION value="BCB.05.03"/>
<PROJECT value="E:\Gry\MaSzyna_15_04\EU07.exe"/>
<OBJFILES value="QueryParserComp.obj EU07.obj dumb3d.obj Camera.obj Texture.obj World.obj
Model3d.obj MdlMngr.obj Train.obj wavread.obj Timer.obj Event.obj
MemCell.obj Logs.obj Spring.obj Button.obj Globals.obj Gauge.obj
AnimModel.obj Ground.obj TrkFoll.obj Segment.obj Sound.obj AdvSound.obj
Track.obj DynObj.obj RealSound.obj EvLaunch.obj FadeSound.obj Traction.obj
TractionPower.obj parser.obj sky.obj AirCoupler.obj opengl\glew.obj
ResourceManager.obj VBO.obj mtable.obj TextureDDS.obj
opengl\ARB_Multisample.obj Float3d.obj Classes.obj Driver.obj Names.obj
Console.obj McZapkie\Mover.obj McZapkie\hamulce.obj
McZapkie\Oerlikon_ESt.obj McZapkie\friction.obj McZapkie\mctools.obj
Console\PoKeys55.obj Forth.obj Console\LPT.obj PyInt.obj"/>
<RESFILES value="EU07.res"/>
<IDLFILES value=""/>
<IDLGENFILES value=""/>
<DEFFILE value=""/>
<RESDEPEN value="$(RESFILES)"/>
<LIBFILES value="opengl\glut32.lib omf_python27.lib DirectX\Dsound.lib"/>
<LIBRARIES value="dclocx50.bpi bcbsmp50.bpi VCLX50.lib bcbsmp50.lib Vcl50.lib"/>
<SPARELIBS value="Vcl50.lib bcbsmp50.lib VCLX50.lib bcbsmp50.bpi dclocx50.bpi"/>
<PACKAGES value="Vcl50.bpi Vclx50.bpi"/>
<PATHCPP value=".;opengl;McZapkie;Console"/>
<PATHPAS value=".;"/>
<PATHRC value=".;"/>
<PATHASM value=".;"/>
<DEBUGLIBPATH value="$(BCB)\lib\debug"/>
<RELEASELIBPATH value="$(BCB)\lib\release"/>
<LINKER value="tlink32"/>
<USERDEFINES value="GLEW_STATIC;_DEBUG"/>
<SYSDEFINES value="NO_STRICT;_RTLDLL"/>
<MAINSOURCE value="EU07.cpp"/>
<INCLUDEPATH value="Console;opengl;McZapkie;$(BCB)\include;$(BCB)\include\vcl;python\include"/>
<LIBPATH value="Console;opengl;McZapkie;$(BCB)\lib\obj;$(BCB)\lib;python\libs"/>
<WARNINGS value="-w-par"/>
</MACROS>
<OPTIONS>
<IDLCFLAGS value="-src_suffix cpp -DGLEW_STATIC -D_DEBUG -IConsole -Iopengl -IMcZapkie
-I$(BCB)\include -I$(BCB)\include\vcl -Ipython\include -boa"/>
<CFLAG1 value="-Od -w- -Vx -Ve -X- -r- -a1 -6 -b- -k -y -v -vi- -c -tW -tWM"/>
<PFLAGS value="-$Y+ -$W -$O- -v -JPHNE -M"/>
<RFLAGS value=""/>
<AFLAGS value="/mx /w2 /zi"/>
<LFLAGS value="-D&quot;&quot; -aa -Tpe -x -Gn -v"/>
</OPTIONS>
<LINKER>
<ALLOBJ value="c0w32.obj Memmgr.Lib sysinit.obj $(OBJFILES)"/>
<ALLRES value="$(RESFILES)"/>
<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib"/>
</LINKER>
<IDEOPTIONS>
[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=
</IDEOPTIONS>
</PROJECT>

162
EU07.cpp
View File

@@ -18,8 +18,8 @@ Stele, firleju, szociu, hunter, ZiomalCl, OLI_EU and others
*/ */
#include "stdafx.h" #include "stdafx.h"
#include <png.h>
#include <dsound.h> //_clear87() itp. #include <thread>
#include "Globals.h" #include "Globals.h"
#include "Logs.h" #include "Logs.h"
@@ -44,19 +44,57 @@ Stele, firleju, szociu, hunter, ZiomalCl, OLI_EU and others
#endif #endif
TWorld World; TWorld World;
PCOPYDATASTRUCT pDane;
void screenshot_save_thread(char *img)
{
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 make_screenshot()
{
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) void window_resize_callback(GLFWwindow *window, int w, int h)
{ {
Global::ScreenWidth = w; Global::ScreenWidth = w;
Global::ScreenHeight = h; Global::ScreenHeight = h;
::glViewport( 0, 0, w, h ); glViewport(0, 0, w, h);
} }
void cursor_pos_callback(GLFWwindow *window, double x, double y) void cursor_pos_callback(GLFWwindow *window, double x, double y)
{ {
World.OnMouseMove(x * 0.005, y * 0.01); World.OnMouseMove(x * 0.005, y * 0.01);
::glfwSetCursorPos( window, 0.0, 0.0 ); glfwSetCursorPos(window, 0.0, 0.0);
} }
void key_callback( GLFWwindow *window, int key, int scancode, int action, int mods ) 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 ) switch( key )
{ {
case GLFW_KEY_F11:
make_screenshot();
break;
case GLFW_KEY_ESCAPE: { case GLFW_KEY_ESCAPE: {
if( ( DebugModeFlag ) //[Esc] pauzuje tylko bez Debugmode if( ( DebugModeFlag ) //[Esc] pauzuje tylko bez Debugmode
@@ -128,84 +169,19 @@ void focus_callback( GLFWwindow *window, int focus )
} }
#ifdef _WINDOWS #ifdef _WINDOWS
extern "C" extern "C"
{ {
GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);
} }
HWND Hwnd; LONG CALLBACK unhandled_handler(::EXCEPTION_POINTERS* e);
WNDPROC BaseWindowProc; LRESULT APIENTRY WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
extern HWND Hwnd;
LRESULT APIENTRY WndProc( HWND hWnd, // handle for this window extern WNDPROC BaseWindowProc;
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;
}
#endif #endif
int main( int argc, char *argv[] ) { int main(int argc, char *argv[])
{
#if defined(_MSC_VER) && defined (_DEBUG) #if defined(_MSC_VER) && defined (_DEBUG)
// memory leaks // memory leaks
_CrtSetDbgFlag( _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ) | _CRTDBG_LEAK_CHECK_DF ); _CrtSetDbgFlag( _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ) | _CRTDBG_LEAK_CHECK_DF );
@@ -227,17 +203,20 @@ int main( int argc, char *argv[] ) {
Global::InitKeys(); Global::InitKeys();
// hunter-271211: ukrywanie konsoli // hunter-271211: ukrywanie konsoli
if( Global::iWriteLogEnabled & 2 ) { if( Global::iWriteLogEnabled & 2 )
{
AllocConsole(); AllocConsole();
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN ); SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN );
} }
for( int i = 1; i < argc; i++ ) { for (int i = 1; i < argc; ++i)
{
std::string token(argv[i]); std::string token(argv[i]);
if (token == "-modifytga") if (token == "-modifytga")
Global::iModifyTGA = -1; Global::iModifyTGA = -1;
else if( token == "-e3d" ) { else if (token == "-e3d")
{
if (Global::iConvertModels > 0) if (Global::iConvertModels > 0)
Global::iConvertModels = -Global::iConvertModels; Global::iConvertModels = -Global::iConvertModels;
else else
@@ -245,12 +224,14 @@ int main( int argc, char *argv[] ) {
} }
else if (i + 1 < argc && token == "-s") else if (i + 1 < argc && token == "-s")
Global::SceneryFile = std::string(argv[++i]); Global::SceneryFile = std::string(argv[++i]);
else if( i + 1 < argc && token == "-v" ) { else if (i + 1 < argc && token == "-v")
{
std::string v(argv[++i]); std::string v(argv[++i]);
std::transform(v.begin(), v.end(), v.begin(), ::tolower); std::transform(v.begin(), v.end(), v.begin(), ::tolower);
Global::asHumanCtrlVehicle = v; Global::asHumanCtrlVehicle = v;
} }
else { else
{
std::cout << "usage: " << std::string(argv[0]) << " [-s sceneryfilepath] " std::cout << "usage: " << std::string(argv[0]) << " [-s sceneryfilepath] "
<< "[-v vehiclename] [-modifytga] [-e3d]" << std::endl; << "[-v vehiclename] [-modifytga] [-e3d]" << std::endl;
return -1; return -1;
@@ -270,7 +251,8 @@ int main( int argc, char *argv[] ) {
glfwWindowHint(GLFW_AUTO_ICONIFY, GLFW_FALSE); glfwWindowHint(GLFW_AUTO_ICONIFY, GLFW_FALSE);
glfwWindowHint(GLFW_SAMPLES, 1 << Global::iMultisampling); glfwWindowHint(GLFW_SAMPLES, 1 << Global::iMultisampling);
if( Global::bFullScreen ) { if (Global::bFullScreen)
{
// match screen dimensions with selected monitor, for 'borderless window' in fullscreen mode // match screen dimensions with selected monitor, for 'borderless window' in fullscreen mode
Global::iWindowWidth = vmode->width; Global::iWindowWidth = vmode->width;
Global::iWindowHeight = vmode->height; Global::iWindowHeight = vmode->height;
@@ -280,12 +262,13 @@ int main( int argc, char *argv[] ) {
glfwCreateWindow( Global::iWindowWidth, Global::iWindowHeight, glfwCreateWindow( Global::iWindowWidth, Global::iWindowHeight,
"EU07", Global::bFullScreen ? monitor : nullptr, nullptr ); "EU07", Global::bFullScreen ? monitor : nullptr, nullptr );
if( !window ) { if (!window)
{
std::cout << "failed to create window" << std::endl; std::cout << "failed to create window" << std::endl;
return -1; return -1;
} }
glfwMakeContextCurrent(window); glfwMakeContextCurrent(window);
glfwSwapInterval( (Global::VSync ? 1 : 0) ); //vsync glfwSwapInterval(Global::VSync ? 1 : 0); //vsync
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); //capture cursor glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); //capture cursor
glfwSetCursorPos(window, 0.0, 0.0); glfwSetCursorPos(window, 0.0, 0.0);
glfwSetFramebufferSizeCallback(window, window_resize_callback); glfwSetFramebufferSizeCallback(window, window_resize_callback);
@@ -298,7 +281,8 @@ int main( int argc, char *argv[] ) {
window_resize_callback(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; std::cout << "failed to init GLEW" << std::endl;
return -1; return -1;
} }
@@ -306,7 +290,7 @@ int main( int argc, char *argv[] ) {
#ifdef _WINDOWS #ifdef _WINDOWS
// setup wrapper for base glfw window proc, to handle copydata messages // setup wrapper for base glfw window proc, to handle copydata messages
Hwnd = glfwGetWin32Window( window ); 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 // switch off the topmost flag
::SetWindowPos( Hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE ); ::SetWindowPos( Hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
#endif #endif
@@ -314,7 +298,8 @@ int main( int argc, char *argv[] ) {
GfxRenderer.Init(); GfxRenderer.Init();
Global::pWorld = &World; // Ra: wskaźnik potrzebny do usuwania pojazdów 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; std::cout << "failed to init TWorld" << std::endl;
return -1; return -1;
} }
@@ -335,7 +320,8 @@ int main( int argc, char *argv[] ) {
} // po zrobieniu E3D odpalamy normalnie scenerię, by ją zobaczyć } // po zrobieniu E3D odpalamy normalnie scenerię, by ją zobaczyć
Console::On(); // włączenie konsoli Console::On(); // włączenie konsoli
while( !glfwWindowShouldClose( window ) && World.Update() ) { while (!glfwWindowShouldClose(window) && World.Update())
{
glfwSwapBuffers(window); glfwSwapBuffers(window);
glfwPollEvents(); glfwPollEvents();
} }

View File

@@ -142,7 +142,6 @@ void TEvent::Load(cParser *parser, vector3 *org)
{ {
int i; int i;
int ti; int ti;
double tf;
std::string token; std::string token;
//string str; //string str;
char *ptr; char *ptr;

View File

@@ -9,9 +9,28 @@ http://mozilla.org/MPL/2.0/.
#include "stdafx.h" #include "stdafx.h"
#include "float3d.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) void float4x4::Quaternion(float4 *q)
{ // konwersja kwaternionu obrotu na macierz obrotu { // konwersja kwaternionu obrotu na macierz obrotu
float xx = q->x * q->x, yy = q->y * q->y, zz = q->z * q->z; float xx = q->x * q->x, yy = q->y * q->y, zz = q->z * q->z;

View File

@@ -196,9 +196,12 @@ struct float8
class float4x4 class float4x4
{ // macierz transformacji pojedynczej precyzji { // macierz transformacji pojedynczej precyzji
public:
float e[16]; float e[16];
public: void deserialize_float32(std::istream&);
void deserialize_float64(std::istream&);
void serialize_float32(std::ostream&);
float4x4(void){}; float4x4(void){};
float4x4(float f[16]) float4x4(float f[16])
{ {
@@ -292,6 +295,16 @@ inline float4x4 &float4x4::Rotation(double angle, float3 axis)
return *this; 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) inline float4x4 operator*(const float4x4 &m1, const float4x4 &m2)
{ // iloczyn macierzy { // iloczyn macierzy
float4x4 retVal; float4x4 retVal;

View File

@@ -60,7 +60,7 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale,
do do
{ // pętla po submodelach potomnych i obracanie ich o kąt zależy od { // pętla po submodelach potomnych i obracanie ich o kąt zależy od
// cyfry w (fValue) // cyfry w (fValue)
if (sm->pName) if (sm->pName.size())
{ // musi mieć niepustą nazwę { // musi mieć niepustą nazwę
if (sm->pName[0] >= '0') if (sm->pName[0] >= '0')
if (sm->pName[0] <= '9') 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); Init(sm, gt_Digital, val3, val4, val5);
else else
Init(sm, gt_Rotate, val3, val4, val5); 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) 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 if( n.length() > 10 ) { n.erase( 0, n.length() - 10 ); } // also dumb but should work for now
do do
{ // pętla po submodelach potomnych i obracanie ich o kąt zależy od cyfry w (fValue) { // pętla po submodelach potomnych i obracanie ich o kąt zależy od cyfry w (fValue)
if( sm->pName ) { if( sm->pName.size() ) {
// musi mieć niepustą nazwę // musi mieć niepustą nazwę
if( ( sm->pName[ 0 ] >= '0' ) if( ( sm->pName[ 0 ] >= '0' )
&& ( sm->pName[ 0 ] <= '9' ) ) { && ( sm->pName[ 0 ] <= '9' ) ) {

View File

@@ -11,7 +11,7 @@ http://mozilla.org/MPL/2.0/.
#include "classes.hpp" #include "classes.hpp"
#include <gl/gl.h> #include <gl/gl.h>
#include <gl/glu.h> #include <gl/glu.h>
#include "opengl/glut.h" #include "GL/glut.h"
#pragma hdrstop #pragma hdrstop
#include "Texture.h" #include "Texture.h"

View File

@@ -49,13 +49,13 @@ 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 double Global::fLuminance = 1.0; // jasność światła do automatycznego zapalania
float Global::SunAngle = 0.0f; float Global::SunAngle = 0.0f;
int Global::iReCompile = 0; // zwiększany, gdy trzeba odświeżyć siatki 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::ScreenWidth = 1;
int Global::ScreenHeight = 1; int Global::ScreenHeight = 1;
float Global::ZoomFactor = 1.0f; float Global::ZoomFactor = 1.0f;
float Global::FieldOfView = 45.0f; float Global::FieldOfView = 45.0f;
GLFWwindow *Global::window;
bool Global::shiftState;
bool Global::ctrlState;
int Global::iCameraLast = -1; int Global::iCameraLast = -1;
std::string Global::asRelease = "16.0.1172.482"; std::string Global::asRelease = "16.0.1172.482";
std::string Global::asVersion = std::string Global::asVersion =
@@ -94,7 +94,7 @@ std::vector<vector3> Global::FreeCameraInit;
std::vector<vector3> Global::FreeCameraInitAngle; std::vector<vector3> Global::FreeCameraInitAngle;
double Global::fFogStart = 1700; double Global::fFogStart = 1700;
double Global::fFogEnd = 2000; 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::AtmoColor[] = {0.423f, 0.702f, 1.0f};
GLfloat Global::FogColor[] = {0.6f, 0.7f, 0.8f}; GLfloat Global::FogColor[] = {0.6f, 0.7f, 0.8f};
#ifdef EU07_USE_OLD_LIGHTING_MODEL #ifdef EU07_USE_OLD_LIGHTING_MODEL
@@ -127,8 +127,8 @@ bool Global::bFreeFly = false;
bool Global::bFullScreen = false; bool Global::bFullScreen = false;
bool Global::VSync{ true }; bool Global::VSync{ true };
bool Global::bInactivePause = true; // automatyczna pauza, gdy okno nieaktywne bool Global::bInactivePause = true; // automatyczna pauza, gdy okno nieaktywne
float Global::fMouseXScale = 1.5; float Global::fMouseXScale = 1.5f;
float Global::fMouseYScale = 0.2; float Global::fMouseYScale = 0.2f;
std::string Global::SceneryFile = "td.scn"; std::string Global::SceneryFile = "td.scn";
std::string Global::asHumanCtrlVehicle = "EU07-424"; std::string Global::asHumanCtrlVehicle = "EU07-424";
int Global::iMultiplayer = 0; // blokada działania niektórych funkcji na rzecz komunikacji 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.getTokens();
Parser >> token; Parser >> token;
/*
Global::bUseVBO = (token == "yes"); Global::bUseVBO = (token == "yes");
*/
Global::bUseVBO = false; // temporarily disabled until render paths are sorted out
} }
else if (token == "feedbackmode") else if (token == "feedbackmode")
{ {
@@ -967,7 +965,8 @@ void Global::ConfigParse(cParser &Parser)
*/ */
} }
void Global::InitKeys() { void Global::InitKeys()
{
Keys[k_IncMainCtrl] = GLFW_KEY_KP_ADD; Keys[k_IncMainCtrl] = GLFW_KEY_KP_ADD;
Keys[k_IncMainCtrlFAST] = GLFW_KEY_KP_ADD; Keys[k_IncMainCtrlFAST] = GLFW_KEY_KP_ADD;
Keys[k_DecMainCtrl] = GLFW_KEY_KP_SUBTRACT; Keys[k_DecMainCtrl] = GLFW_KEY_KP_SUBTRACT;

View File

@@ -12,8 +12,8 @@ http://mozilla.org/MPL/2.0/.
#include <string> #include <string>
#include <Windows.h> #include <Windows.h>
#include "renderer.h" #include "renderer.h"
#include "gl/glew.h"
#include "glfw/glfw3.h" #include "glfw/glfw3.h"
#include "gl/glew.h"
#include "dumb3d.h" #include "dumb3d.h"
// definicje klawiszy // definicje klawiszy

View File

@@ -206,8 +206,14 @@ void TGroundNode::InitNormals()
} }
if (Vertices[i].Normal == vector3(0, 0, 0)) if (Vertices[i].Normal == vector3(0, 0, 0))
Vertices[i].Normal = (n1 + n2) / 2; Vertices[i].Normal = (n1 + n2) / 2;
if (i + 1 < iNumVerts)
{
if (Vertices[i + 1].Normal == vector3(0, 0, 0)) if (Vertices[i + 1].Normal == vector3(0, 0, 0))
Vertices[i + 1].Normal = n2; Vertices[i + 1].Normal = n2;
}
else
WriteLog("odd number of vertices, normals may be wrong!");
break; break;
case GL_TRIANGLE_FAN: case GL_TRIANGLE_FAN:
@@ -289,7 +295,6 @@ void TGroundNode::RenderVBO()
(iType != TP_EVLAUNCH)) // McZapkie-070602: nie rysuj odleglych obiektow ale sprawdzaj (iType != TP_EVLAUNCH)) // McZapkie-070602: nie rysuj odleglych obiektow ale sprawdzaj
// wyzwalacz zdarzen // wyzwalacz zdarzen
return; return;
int i, a;
switch (iType) switch (iType)
{ {
case TP_TRACTION: case TP_TRACTION:
@@ -359,12 +364,11 @@ void TGroundNode::RenderAlphaVBO()
return; return;
if (mgn > fSquareRadius) if (mgn > fSquareRadius)
return; return;
int i, a;
#ifdef _PROBLEND #ifdef _PROBLEND
if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012 if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012
{ {
glDisable(GL_BLEND); 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 #endif
switch (iType) switch (iType)
@@ -374,7 +378,7 @@ void TGroundNode::RenderAlphaVBO()
{ {
#ifdef _PROBLEND #ifdef _PROBLEND
glEnable(GL_BLEND); glEnable(GL_BLEND);
glAlphaFunc(GL_GREATER, 0.04); glAlphaFunc(GL_GREATER, 0.04f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
#endif #endif
hvTraction->RenderVBO(mgn, iVboPtr); hvTraction->RenderVBO(mgn, iVboPtr);
@@ -383,7 +387,7 @@ void TGroundNode::RenderAlphaVBO()
case TP_MODEL: case TP_MODEL:
#ifdef _PROBLEND #ifdef _PROBLEND
glEnable(GL_BLEND); glEnable(GL_BLEND);
glAlphaFunc(GL_GREATER, 0.04); glAlphaFunc(GL_GREATER, 0.04f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
#endif #endif
Model->RenderAlphaVBO(&pCenter); Model->RenderAlphaVBO(&pCenter);
@@ -411,13 +415,13 @@ void TGroundNode::RenderAlphaVBO()
// glEnable(GL_LIGHTING); // glEnable(GL_LIGHTING);
#ifdef _PROBLEND #ifdef _PROBLEND
glEnable(GL_BLEND); glEnable(GL_BLEND);
glAlphaFunc(GL_GREATER, 0.04); glAlphaFunc(GL_GREATER, 0.04f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
#endif #endif
} }
#ifdef _PROBLEND #ifdef _PROBLEND
glEnable(GL_BLEND); glEnable(GL_BLEND);
glAlphaFunc(GL_GREATER, 0.04); glAlphaFunc(GL_GREATER, 0.04f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
#endif #endif
return; return;
@@ -427,7 +431,7 @@ void TGroundNode::RenderAlphaVBO()
RaRenderVBO(); RaRenderVBO();
#ifdef _PROBLEND #ifdef _PROBLEND
glEnable(GL_BLEND); glEnable(GL_BLEND);
glAlphaFunc(GL_GREATER, 0.04); glAlphaFunc(GL_GREATER, 0.04f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
#endif #endif
return; return;
@@ -435,7 +439,7 @@ void TGroundNode::RenderAlphaVBO()
} }
#ifdef _PROBLEND #ifdef _PROBLEND
glEnable(GL_BLEND); glEnable(GL_BLEND);
glAlphaFunc(GL_GREATER, 0.04); glAlphaFunc(GL_GREATER, 0.04f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
#endif #endif
return; return;
@@ -574,7 +578,6 @@ void TGroundNode::RenderDL()
// obiektow ale sprawdzaj wyzwalacz // obiektow ale sprawdzaj wyzwalacz
// zdarzen // zdarzen
return; return;
int i, a;
switch (iType) switch (iType)
{ {
case TP_TRACK: case TP_TRACK:
@@ -641,7 +644,6 @@ void TGroundNode::RenderAlphaDL()
return; return;
if (mgn > fSquareRadius) if (mgn > fSquareRadius)
return; return;
int i, a;
switch (iType) switch (iType)
{ {
case TP_TRACTION: case TP_TRACTION:
@@ -663,7 +665,7 @@ void TGroundNode::RenderAlphaDL()
if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012 if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012
{ {
glDisable(GL_BLEND); 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 #endif
if (!DisplayListID) //||Global::bReCompile) //Ra: wymuszenie rekompilacji 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 if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012
{ {
glEnable(GL_BLEND); glEnable(GL_BLEND);
glAlphaFunc(GL_GREATER, 0.04); glAlphaFunc(GL_GREATER, 0.04f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}; };
#endif #endif
@@ -969,7 +971,7 @@ void TSubRect::Sort()
*/ */
//... //...
// przeglądanie listy i tworzenie obiektów renderujących dla danej tekstury // 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 n1 = nMeshed; // lista obiektów przetwarzanych na statyczne siatki
while (n1) while (n1)
{ // dla każdej tekstury powinny istnieć co najmniej dwa obiekty, ale dla DL nie ma to znaczenia { // 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) TTrack * TSubRect::FindTrack(vector3 *Point, int &iConnection, TTrack *Exclude)
{ // szukanie toru, którego koniec jest najbliższy (*Point) { // szukanie toru, którego koniec jest najbliższy (*Point)
TTrack *Track;
for (int i = 0; i < iTracks; ++i) for (int i = 0; i < iTracks; ++i)
if (tTracks[i] != Exclude) // można użyć tabelę torów, bo jest mniejsza 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 return; // nie ma nic do animowania
if (Global::bUseVBO) if (Global::bUseVBO)
{ // odświeżenie VBO sektora { // 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); glBindBuffer(GL_ARRAY_BUFFER, m_nVBOVertices);
else // dla OpenGL 1.4 z GL_ARB_vertex_buffer_object odświeżenie całego sektora 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 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" { // wczytanie wpisu typu "node"
// parser->LoadTraction=Global::bLoadTraction; //Ra: tu nie potrzeba powtarzać // parser->LoadTraction=Global::bLoadTraction; //Ra: tu nie potrzeba powtarzać
string str, str1, str2, str3, str4, Skin, DriverType, asNodeName; string str, str1, str2, str3, str4, Skin, DriverType, asNodeName;
int nv, ti, i, n; int nv, i;
double tf, r, rmin, tf1, tf2, tf3, tf4, l, dist, mgn; double tf, r, rmin, tf1, tf3;
int int1, int2; int int1;
bool bError = false, curve; size_t int2;
bool bError = false;
vector3 pt, front, up, left, pos, tv; vector3 pt, front, up, left, pos, tv;
matrix4x4 mat2, mat1, mat; matrix4x4 mat2, mat1, mat;
GLuint TexID;
TGroundNode *tmp1; TGroundNode *tmp1;
TTrack *Track; TTrack *Track;
TTextSound *tmpsound;
std::string token; std::string token;
parser->getTokens(2); parser->getTokens(2);
*parser >> r >> rmin; *parser >> r >> rmin;
@@ -1612,7 +1612,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
*parser >> token; *parser >> token;
str = token; str = token;
//str = AnsiString(token.c_str()); //str = AnsiString(token.c_str());
TGroundNode *tmp, *tmp2; TGroundNode *tmp;
tmp = new TGroundNode(); tmp = new TGroundNode();
tmp->asName = (asNodeName == "none" ? string("") : asNodeName); tmp->asName = (asNodeName == "none" ? string("") : asNodeName);
if (r >= 0) if (r >= 0)
@@ -1674,10 +1674,10 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
parser->getTokens(3); parser->getTokens(3);
*parser >> tmp->hvTraction->NominalVoltage >> tmp->hvTraction->MaxCurrent >> *parser >> tmp->hvTraction->NominalVoltage >> tmp->hvTraction->MaxCurrent >>
tmp->hvTraction->fResistivity; tmp->hvTraction->fResistivity;
if (tmp->hvTraction->fResistivity == 0.01) // tyle jest w sceneriach [om/km] if (tmp->hvTraction->fResistivity == 0.01f) // tyle jest w sceneriach [om/km]
tmp->hvTraction->fResistivity = 0.075; // taka sensowniejsza wartość za tmp->hvTraction->fResistivity = 0.075f; // taka sensowniejsza wartość za
// http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf // 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->getTokens();
*parser >> token; *parser >> token;
// Ra 2014-02: a tutaj damy symbol sieci i jej budowę, np.: // Ra 2014-02: a tutaj damy symbol sieci i jej budowę, np.:
@@ -1830,7 +1830,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
*parser >> token; *parser >> token;
str = token; str = token;
//str = AnsiString(token.c_str()); //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) if (rmin < 0.0)
rmin = rmin =
0.0; // przywrócenie poprawnej wartości, jeśli służyła do wyłączenia efektu Dopplera 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 int2 = str4.find("."); // yB: wykorzystuje tutaj zmienna, ktora potem bedzie ladunkiem
if (int2 != string::npos) // yB: jesli znalazl kropke, to ja przetwarza jako parametry 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 int1 = atoi(str4.substr(0, int2).c_str()); // niech sprzegiem bedzie do kropki cos
str4 = str4.substr(int2 + 1, dlugosc - int2); str4 = str4.substr(int2 + 1, dlugosc - int2);
} }
@@ -2243,7 +2243,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
/* /*
nv = i; nv = i;
*/ */
nv = TempVerts.size(); nv = (int)TempVerts.size();
tmp->Init(nv); // utworzenie tablicy wierzchołków tmp->Init(nv); // utworzenie tablicy wierzchołków
tmp->pCenter /= (nv > 0 ? nv : 1); tmp->pCenter /= (nv > 0 ? nv : 1);
@@ -2544,9 +2544,6 @@ bool TGround::Init(std::string File)
int OriginStackTop = 0; int OriginStackTop = 0;
vector3 OriginStack[OriginStackMaxDepth]; // stos zagnieżdżenia origin vector3 OriginStack[OriginStackMaxDepth]; // stos zagnieżdżenia origin
double tf;
int ParamCount, ParamPos;
// ABu: Jezeli nie ma definicji w scenerii to ustawiane ponizsze wartosci: // ABu: Jezeli nie ma definicji w scenerii to ustawiane ponizsze wartosci:
hh = 10; // godzina startu hh = 10; // godzina startu
mm = 30; // minuty startu mm = 30; // minuty startu
@@ -3351,7 +3348,7 @@ void TGround::InitTracks()
TGroundNode *Current, *Model; TGroundNode *Current, *Model;
TTrack *tmp; // znaleziony tor TTrack *tmp; // znaleziony tor
TTrack *Track; TTrack *Track;
int iConnection, state; int iConnection;
string name; string name;
// tracks=tracksfar=0; // tracks=tracksfar=0;
for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext) for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext)
@@ -3770,7 +3767,7 @@ bool TGround::InitLaunchers()
{ {
TGroundNode *Current, *tmp; TGroundNode *Current, *tmp;
TEventLauncher *EventLauncher; TEventLauncher *EventLauncher;
int i;
for (Current = nRootOfType[TP_EVLAUNCH]; Current; Current = Current->nNext) for (Current = nRootOfType[TP_EVLAUNCH]; Current; Current = Current->nNext)
{ {
EventLauncher = Current->EvLaunch; EventLauncher = Current->EvLaunch;
@@ -3797,8 +3794,6 @@ bool TGround::InitLaunchers()
TTrack * TGround::FindTrack(vector3 Point, int &iConnection, TGroundNode *Exclude) TTrack * TGround::FindTrack(vector3 Point, int &iConnection, TGroundNode *Exclude)
{ // wyszukiwanie innego toru kończącego się w (Point) { // wyszukiwanie innego toru kończącego się w (Point)
TTrack *Track;
TGroundNode *Current;
TTrack *tmp; TTrack *tmp;
iConnection = -1; iConnection = -1;
TSubRect *sr; TSubRect *sr;
@@ -3845,8 +3840,6 @@ TTrack * TGround::FindTrack(vector3 Point, int &iConnection, TGroundNode *Exclud
TTraction * TGround::FindTraction(vector3 *Point, int &iConnection, TGroundNode *Exclude) TTraction * TGround::FindTraction(vector3 *Point, int &iConnection, TGroundNode *Exclude)
{ // wyszukiwanie innego przęsła kończącego się w (Point) { // wyszukiwanie innego przęsła kończącego się w (Point)
TTraction *Traction;
TGroundNode *Current;
TTraction *tmp; TTraction *tmp;
iConnection = -1; iConnection = -1;
TSubRect *sr; TSubRect *sr;
@@ -4314,7 +4307,7 @@ bool TGround::CheckQuery()
for (i = 0; i < 8; ++i) for (i = 0; i < 8; ++i)
{ // dodawane do kolejki w kolejności zapisania { // dodawane do kolejki w kolejności zapisania
if (tmpEvent->Params[i].asEvent) 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) if (tmpEvent->Params[i].asEvent != tmpEvent)
AddToQuery(tmpEvent->Params[i].asEvent, AddToQuery(tmpEvent->Params[i].asEvent,
@@ -4856,11 +4849,10 @@ TGround::Render( Math3D::vector3 const &Camera ) {
bool TGround::RenderDL(vector3 pPosition) bool TGround::RenderDL(vector3 pPosition)
{ // renderowanie scenerii z Display List - faza nieprzezroczystych { // renderowanie scenerii z Display List - faza nieprzezroczystych
glDisable(GL_BLEND); 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) ++TGroundRect::iFrameNumber; // zwięszenie licznika ramek (do usuwniania nadanimacji)
CameraDirection.x = sin(Global::pCameraRotation); // wektor kierunkowy CameraDirection.x = sin(Global::pCameraRotation); // wektor kierunkowy
CameraDirection.z = cos(Global::pCameraRotation); CameraDirection.z = cos(Global::pCameraRotation);
int tr, tc;
TGroundNode *node; TGroundNode *node;
glColor3f(1.0f, 1.0f, 1.0f); glColor3f(1.0f, 1.0f, 1.0f);
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
@@ -4917,7 +4909,7 @@ bool TGround::RenderDL(vector3 pPosition)
bool TGround::RenderAlphaDL(vector3 pPosition) bool TGround::RenderAlphaDL(vector3 pPosition)
{ // renderowanie scenerii z Display List - faza przezroczystych { // renderowanie scenerii z Display List - faza przezroczystych
glEnable(GL_BLEND); 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; TGroundNode *node;
glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
TSubRect *tmp; TSubRect *tmp;
@@ -4946,11 +4938,10 @@ bool TGround::RenderAlphaDL(vector3 pPosition)
bool TGround::RenderVBO(vector3 pPosition) bool TGround::RenderVBO(vector3 pPosition)
{ // renderowanie scenerii z VBO - faza nieprzezroczystych { // renderowanie scenerii z VBO - faza nieprzezroczystych
glDisable(GL_BLEND); 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 ++TGroundRect::iFrameNumber; // zwięszenie licznika ramek
CameraDirection.x = sin(Global::pCameraRotation); // wektor kierunkowy CameraDirection.x = sin(Global::pCameraRotation); // wektor kierunkowy
CameraDirection.z = cos(Global::pCameraRotation); CameraDirection.z = cos(Global::pCameraRotation);
int tr, tc;
TGroundNode *node; TGroundNode *node;
glColor3f(1.0f, 1.0f, 1.0f); glColor3f(1.0f, 1.0f, 1.0f);
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
@@ -5014,7 +5005,7 @@ bool TGround::RenderVBO(vector3 pPosition)
bool TGround::RenderAlphaVBO(vector3 pPosition) bool TGround::RenderAlphaVBO(vector3 pPosition)
{ // renderowanie scenerii z VBO - faza przezroczystych { // renderowanie scenerii z VBO - faza przezroczystych
glEnable(GL_BLEND); 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; TGroundNode *node;
glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
TSubRect *tmp; TSubRect *tmp;
@@ -5062,14 +5053,14 @@ void TGround::WyslijEvent(const std::string &e, const std::string &d)
DaneRozkaz r; DaneRozkaz r;
r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' ); r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' );
r.iComm = 2; // 2 - event 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); r.cString[0] = char(i);
strcpy(r.cString + 1, e.c_str()); // zakończony zerem strcpy(r.cString + 1, e.c_str()); // zakończony zerem
r.cString[i + 2] = char(j); // licznik po zerze kończącym r.cString[i + 2] = char(j); // licznik po zerze kończącym
strcpy(r.cString + 3 + i, d.c_str()); // zakończony zerem strcpy(r.cString + 3 + i, d.c_str()); // zakończony zerem
COPYDATASTRUCT cData; COPYDATASTRUCT cData;
cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura 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; cData.lpData = &r;
Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData ); Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData );
CommLog( Now() + " " + std::to_string(r.iComm) + " " + e + " sent" ); CommLog( Now() + " " + std::to_string(r.iComm) + " " + e + " sent" );
@@ -5080,13 +5071,13 @@ void TGround::WyslijUszkodzenia(const std::string &t, char fl)
DaneRozkaz r; DaneRozkaz r;
r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' ); r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' );
r.iComm = 13; // numer komunikatu r.iComm = 13; // numer komunikatu
int i = t.length(); size_t i = t.length();
r.cString[0] = char(fl); r.cString[0] = char(fl);
r.cString[1] = char(i); r.cString[1] = char(i);
strcpy(r.cString + 2, t.c_str()); // z zerem kończącym strcpy(r.cString + 2, t.c_str()); // z zerem kończącym
COPYDATASTRUCT cData; COPYDATASTRUCT cData;
cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura 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; cData.lpData = &r;
Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData ); Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData );
CommLog( Now() + " " + std::to_string(r.iComm) + " " + t + " sent"); CommLog( Now() + " " + std::to_string(r.iComm) + " " + t + " sent");
@@ -5097,12 +5088,12 @@ void TGround::WyslijString(const std::string &t, int n)
DaneRozkaz r; DaneRozkaz r;
r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' ); r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' );
r.iComm = n; // numer komunikatu r.iComm = n; // numer komunikatu
int i = t.length(); size_t i = t.length();
r.cString[0] = char(i); r.cString[0] = char(i);
strcpy(r.cString + 1, t.c_str()); // z zerem kończącym strcpy(r.cString + 1, t.c_str()); // z zerem kończącym
COPYDATASTRUCT cData; COPYDATASTRUCT cData;
cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura cData.dwData = 'EU07'; // sygnatura
cData.cbData = 10 + i; // 8+licznik i zero kończące cData.cbData = (DWORD)(10 + i); // 8+licznik i zero kończące
cData.lpData = &r; cData.lpData = &r;
Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData ); Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData );
CommLog( Now() + " " + std::to_string(r.iComm) + " " + t + " sent"); CommLog( Now() + " " + std::to_string(r.iComm) + " " + t + " sent");
@@ -5119,7 +5110,8 @@ void TGround::WyslijNamiary(TGroundNode *t)
DaneRozkaz r; DaneRozkaz r;
r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' ); r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' );
r.iComm = 7; // 7 - dane pojazdu 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.iPar[0] = i; // ilość danych liczbowych
r.fPar[1] = Global::fTimeAngleDeg / 360.0; // aktualny czas (1.0=doba) r.fPar[1] = Global::fTimeAngleDeg / 360.0; // aktualny czas (1.0=doba)
r.fPar[2] = t->DynamicObject->MoverParameters->Loc.X; // pozycja X 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ć r.cString[i] = char(j); // na końcu nazwa, żeby jakoś zidentyfikować
strcpy(r.cString + i + 1, t->asName.c_str()); // zakończony zerem strcpy(r.cString + i + 1, t->asName.c_str()); // zakończony zerem
COPYDATASTRUCT cData; COPYDATASTRUCT cData;
cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura cData.dwData = 'EU07'; // sygnatura
cData.cbData = 10 + i + j; // 8+licznik i zero kończące cData.cbData = (DWORD)(10 + i + j); // 8+licznik i zero kończące
cData.lpData = &r; cData.lpData = &r;
// WriteLog("Ramka gotowa"); // WriteLog("Ramka gotowa");
Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData ); 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; TDynamicObject *dyn = NULL;
int c = GetColFromX(pPosition.x); int c = GetColFromX(pPosition.x);
int r = GetRowFromZ(pPosition.z); int r = GetRowFromZ(pPosition.z);
int i, j, k; int i, j;
double sqm = distance * distance, sqd; // maksymalny promien poszukiwań do kwadratu 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 (j = r - 1; j <= r + 1; j++) // plus dwa zewnętrzne sektory, łącznie 9
for (i = c - 1; i <= c + 1; i++) for (i = c - 1; i <= c + 1; i++)
@@ -5318,7 +5310,7 @@ TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, boo
TDynamicObject *dyn = NULL; TDynamicObject *dyn = NULL;
int c = GetColFromX(pPosition.x); int c = GetColFromX(pPosition.x);
int r = GetRowFromZ(pPosition.z); int r = GetRowFromZ(pPosition.z);
int i, j, k; int i, j;
double sqm = distance * distance, sqd; // maksymalny promien poszukiwań do kwadratu 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 (j = r - 1; j <= r + 1; j++) // plus dwa zewnętrzne sektory, łącznie 9
for (i = c - 1; i <= c + 1; i++) for (i = c - 1; i <= c + 1; i++)
@@ -5418,7 +5410,6 @@ void TGround::TerrainWrite()
// chyba że dla danej tekstury wychodzi tylko jeden submodel. // chyba że dla danej tekstury wychodzi tylko jeden submodel.
TModel3d *m = new TModel3d(); // wirtualny model roboczy z oddzielnymi submodelami TModel3d *m = new TModel3d(); // wirtualny model roboczy z oddzielnymi submodelami
TSubModel *sk; // wskaźnik roboczy na submodel kwadratu 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. // Zliczamy kwadraty z trójkątami, ilość tekstur oraz wierzchołków.
// Ilość kwadratów i ilość tekstur określi ilość submodeli. // Ilość kwadratów i ilość tekstur określi ilość submodeli.
// int sub=0; //całkowita ilość submodeli // int sub=0; //całkowita ilość submodeli
@@ -5497,7 +5488,6 @@ void TGround::TerrainWrite()
void TGround::TrackBusyList() void TGround::TrackBusyList()
{ // wysłanie informacji o wszystkich zajętych odcinkach { // wysłanie informacji o wszystkich zajętych odcinkach
TGroundNode *Current; TGroundNode *Current;
TTrack *Track;
for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext) for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext)
if (!Current->asName.empty()) // musi być nazwa if (!Current->asName.empty()) // musi być nazwa
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY #ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
@@ -5538,13 +5528,12 @@ void TGround::IsolatedBusy(const std::string t)
void TGround::Silence(vector3 gdzie) void TGround::Silence(vector3 gdzie)
{ // wyciszenie wszystkiego w sektorach przed przeniesieniem kamery z (gdzie) { // wyciszenie wszystkiego w sektorach przed przeniesieniem kamery z (gdzie)
int tr, tc;
TGroundNode *node; TGroundNode *node;
int n = 2 * iNumSubRects; //(2*==2km) promień wyświetlanej mapy w sektorach int n = 2 * iNumSubRects; //(2*==2km) promień wyświetlanej mapy w sektorach
int c = GetColFromX(gdzie.x); // sektory wg dotychczasowej pozycji kamery int c = GetColFromX(gdzie.x); // sektory wg dotychczasowej pozycji kamery
int r = GetRowFromZ(gdzie.z); int r = GetRowFromZ(gdzie.z);
TSubRect *tmp; TSubRect *tmp;
int i, j, k; int i, j;
// renderowanie czołgowe dla obiektów aktywnych a niewidocznych // renderowanie czołgowe dla obiektów aktywnych a niewidocznych
for (j = r - n; j <= r + n; j++) for (j = r - n; j <= r + n; j++)
for (i = c - n; i <= c + n; i++) for (i = c - n; i <= c + n; i++)

View File

@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
#pragma once #pragma once
#include <string> #include <string>
#include "gl/glew.h" #include "GL/glew.h"
#include "VBO.h" #include "VBO.h"
#include "Classes.h" #include "Classes.h"
#include "ResourceManager.h" #include "ResourceManager.h"
@@ -398,11 +398,11 @@ class TGround
TSubRect * FastGetSubRect(int iCol, int iRow); TSubRect * FastGetSubRect(int iCol, int iRow);
int GetRowFromZ(double z) int GetRowFromZ(double z)
{ {
return (z / fSubRectSize + fHalfTotalNumSubRects); return (int)(z / fSubRectSize + fHalfTotalNumSubRects);
}; };
int GetColFromX(double x) int GetColFromX(double x)
{ {
return (x / fSubRectSize + fHalfTotalNumSubRects); return (int)(x / fSubRectSize + fHalfTotalNumSubRects);
}; };
TEvent * FindEvent(const std::string &asEventName); TEvent * FindEvent(const std::string &asEventName);
TEvent * FindEventScan(const std::string &asEventName); TEvent * FindEventScan(const std::string &asEventName);

View File

@@ -24,7 +24,7 @@ void WriteConsoleOnly(const char *str, double value)
sprintf(buf, "%s %f \n", str, value); sprintf(buf, "%s %f \n", str, value);
// stdout= GetStdHandle(STD_OUTPUT_HANDLE); // stdout= GetStdHandle(STD_OUTPUT_HANDLE);
DWORD wr = 0; 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); // 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), SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN | FOREGROUND_INTENSITY); FOREGROUND_GREEN | FOREGROUND_INTENSITY);
DWORD wr = 0; 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) 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) void WriteLog(const char *str, double value)

View File

@@ -5488,7 +5488,7 @@ std::vector<std::string> x;
// ************************************************************************************************* // *************************************************************************************************
// Q: 20160717 // 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); size_t pos = in.find(str_find);
return (pos != std::string::npos ? pos+1 : 0); return (pos != std::string::npos ? pos+1 : 0);

View File

@@ -22,12 +22,13 @@ http://mozilla.org/MPL/2.0/.
#include "renderer.h" #include "renderer.h"
#include "Timer.h" #include "Timer.h"
#include "mtable.h" #include "mtable.h"
#include "sn_utils.h"
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
using namespace Mtable; using namespace Mtable;
double TSubModel::fSquareDist = 0; 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; texture_manager::size_type *TSubModel::ReplacableSkinId = NULL;
int TSubModel::iAlpha = 0x30300030; // maska do testowania flag tekstur wymiennych int TSubModel::iAlpha = 0x30300030; // maska do testowania flag tekstur wymiennych
TModel3d *TSubModel::pRoot; // Ra: tymczasowo wskaźnik na model widoczny z submodelu TModel3d *TSubModel::pRoot; // Ra: tymczasowo wskaźnik na model widoczny z submodelu
@@ -41,30 +42,6 @@ std::string *TSubModel::pasText;
// 0x3F3F003F - wszystkie wymienne tekstury używane w danym cyklu // 0x3F3F003F - wszystkie wymienne tekstury używane w danym cyklu
// Ale w TModel3d okerśla przezroczystość tekstur wymiennych! // 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() TSubModel::TSubModel()
{ {
ZeroMemory(this, sizeof(TSubModel)); // istotne przy zapisywaniu wersji binarnej ZeroMemory(this, sizeof(TSubModel)); // istotne przy zapisywaniu wersji binarnej
@@ -104,9 +81,9 @@ void TSubModel::FirstInit()
fNearAttenEnd = 80; fNearAttenEnd = 80;
bUseNearAtten = false; bUseNearAtten = false;
iFarAttenDecay = 0; iFarAttenDecay = 0;
fFarDecayRadius = 100; fFarDecayRadius = 100.0f;
fCosFalloffAngle = 0.5; // 120°? fCosFalloffAngle = 0.5f; // 120°?
fCosHotspotAngle = 0.3; // 145°? fCosHotspotAngle = 0.3f; // 145°?
fCosViewAngle = 0; fCosViewAngle = 0;
fSquareMaxDist = 10000 * 10000; // 10km fSquareMaxDist = 10000 * 10000; // 10km
fSquareMinDist = 0; fSquareMinDist = 0;
@@ -114,7 +91,8 @@ void TSubModel::FirstInit()
iTexture = 0; // brak tekstury iTexture = 0; // brak tekstury
// asName=""; // asName="";
// asTexture=""; // asTexture="";
pName = pTexture = NULL; pName = "";
pTexture = "";
f4Ambient[0] = f4Ambient[1] = f4Ambient[2] = f4Ambient[3] = 1.0; //{1,1,1,1}; 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}; f4Diffuse[0] = f4Diffuse[1] = f4Diffuse[2] = f4Diffuse[3] = 1.0; //{1,1,1,1};
f4Specular[0] = f4Specular[1] = f4Specular[2] = 0.0; f4Specular[0] = f4Specular[1] = f4Specular[2] = 0.0;
@@ -134,8 +112,6 @@ TSubModel::~TSubModel()
SafeDelete(Child); SafeDelete(Child);
delete fMatrix; // własny transform trzeba usunąć (zawsze jeden) delete fMatrix; // własny transform trzeba usunąć (zawsze jeden)
delete[] Vertices; delete[] Vertices;
delete[] pTexture;
delete[] pName;
} }
/* /*
else else
@@ -151,15 +127,7 @@ void TSubModel::TextureNameSet(const char *n)
// ile nie jest wczytany z E3D // ile nie jest wczytany z E3D
if (iFlags & 0x0200) if (iFlags & 0x0200)
{ // tylko jeżeli submodel zosta utworzony przez new { // tylko jeżeli submodel zosta utworzony przez new
delete[] pTexture; // usunięcie poprzedniej pTexture = std::string(n);
int i = strlen(n);
if (i)
{ // utworzenie nowej
pTexture = new char[i + 1];
strcpy(pTexture, n);
}
else
pTexture = NULL;
} }
}; };
@@ -167,17 +135,7 @@ void TSubModel::NameSet(const char *n)
{ // ustawienie nazwy submodelu, o ile { // ustawienie nazwy submodelu, o ile
// nie jest wczytany z E3D // nie jest wczytany z E3D
if (iFlags & 0x0200) if (iFlags & 0x0200)
{ // tylko jeżeli submodel zosta utworzony przez new pName = std::string(n);
delete[] pName; // usunięcie poprzedniej
int i = strlen(n);
if (i)
{ // utworzenie nowej
pName = new char[i + 1];
strcpy(pName, n);
}
else
pName = NULL;
}
}; };
// int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 // int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3
@@ -372,8 +330,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
parser >> discard >> bWire >> discard >> fWireSize >> discard; parser >> discard >> bWire >> discard >> fWireSize >> discard;
Opacity = readIntAsDouble(parser, Opacity = readIntAsDouble(parser,
100.0f); // wymagane jest 0 dla szyb, 100 idzie w nieprzezroczyste 100.0f); // wymagane jest 0 dla szyb, 100 idzie w nieprzezroczyste
if (Opacity > 1.0) if (Opacity > 1.0f)
Opacity *= 0.01; // w 2013 był błąd i aby go obejść, trzeba było wpisać 10000.0 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 if ((Global::iConvertModels & 1) == 0) // dla zgodności wstecz
Opacity = 0.0; // wszystko idzie w przezroczyste albo zależnie od tekstury Opacity = 0.0; // wszystko idzie w przezroczyste albo zależnie od tekstury
if (!parser.expectToken("map:")) if (!parser.expectToken("map:"))
@@ -968,11 +926,15 @@ TSubModel *TSubModel::GetFromName(char const *search, bool i)
// std::transform(search.begin(),search.end(),search.begin(),ToLower()); // std::transform(search.begin(),search.end(),search.begin(),ToLower());
// search=search.LowerCase(); // search=search.LowerCase();
// AnsiString name=AnsiString(); // AnsiString name=AnsiString();
if (pName && search) std::string search_lc = std::string(search);
if ((i ? stricmp(pName, search) : strcmp(pName, search)) == 0) 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; return this;
else if (pName == search)
return this; // oba NULL
if (Next) if (Next)
{ {
result = Next->GetFromName(search); result = Next->GetFromName(search);
@@ -1070,7 +1032,7 @@ void TSubModel::RaAnimation(TAnimType a)
TSubModel *sm = ChildGet(); TSubModel *sm = ChildGet();
do do
{ // pętla po submodelach potomnych i obracanie ich o kąt zależy od czasu { // pętla po submodelach potomnych i obracanie ich o kąt zależy od czasu
if (sm->pName) if (sm->pName.size())
{ // musi mieć niepustą nazwę { // musi mieć niepustą nazwę
if ((sm->pName[0]) >= '0') if ((sm->pName[0]) >= '0')
if ((sm->pName[0]) <= '5') // zegarek ma 6 cyfr maksymalnie if ((sm->pName[0]) <= '5') // zegarek ma 6 cyfr maksymalnie
@@ -1227,9 +1189,8 @@ void TSubModel::RenderAlphaDL()
if (eType == TP_TEXT) if (eType == TP_TEXT)
{ // tekst renderujemy w specjalny sposób, zamiast { // tekst renderujemy w specjalny sposób, zamiast
// submodeli z łańcucha Child // submodeli z łańcucha Child
int i, j = pasText->size(); int i, j = (int)pasText->size();
TSubModel *p; TSubModel *p;
char c;
if (!smLetter) if (!smLetter)
{ // jeśli nie ma tablicy, to ją stworzyć; miejsce { // jeśli nie ma tablicy, to ją stworzyć; miejsce
// nieodpowiednie, ale tymczasowo // nieodpowiednie, ale tymczasowo
@@ -1240,7 +1201,7 @@ void TSubModel::RenderAlphaDL()
p = Child; p = Child;
while (p) while (p)
{ {
smLetter[*p->pName] = p; smLetter[p->pName[0]] = p;
p = p->Next; // kolejny znak p = p->Next; // kolejny znak
} }
} }
@@ -1359,8 +1320,8 @@ void TSubModel::RenderVBO()
GfxRenderer.Bind(0); // nie teksturować GfxRenderer.Bind(0); // nie teksturować
// glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]); // glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]);
// glColorMaterial(GL_FRONT,GL_EMISSION); // glColorMaterial(GL_FRONT,GL_EMISSION);
float color[4] = {f4Diffuse[0] * Distdimm, f4Diffuse[1] * Distdimm, float color[4] = { (float)(f4Diffuse[0] * Distdimm), (float)(f4Diffuse[1] * Distdimm),
f4Diffuse[2] * Distdimm, 0}; (float)(f4Diffuse[2] * Distdimm), 0 };
// glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm); // glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm);
glColorMaterial(GL_FRONT, GL_EMISSION); glColorMaterial(GL_FRONT, GL_EMISSION);
glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie
@@ -1517,140 +1478,6 @@ void TSubModel::RaArrayFill(CVertNormTex *Vert)
Next->RaArrayFill(Vert); 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() void TSubModel::AdjustDist()
{ // aktualizacja odległości faz LoD, zależna od { // aktualizacja odległości faz LoD, zależna od
// rozdzielczości pionowej oraz multisamplingu // rozdzielczości pionowej oraz multisamplingu
@@ -1842,112 +1669,380 @@ bool TModel3d::LoadFromFile(std::string const &FileName, bool dynamic)
return result; return result;
}; };
// E3D serialization
// http://rainsted.com/pl/Format_binarny_modeli_-_E3D
//m7todo: wymyślić lepszą nazwę
template <typename L, typename T>
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<TSubModel*> &models,
std::vector<std::string> &names,
std::vector<std::string> &textures,
std::vector<float4x4> &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<TSubModel*> models;
models.push_back(Root);
std::vector<std::string> names;
std::vector<std::string> textures;
textures.push_back("");
std::vector<float4x4> 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<std::string> *t, std::vector<std::string> *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) void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic)
{ // wczytanie modelu z pliku binarnego { // wczytanie modelu z pliku binarnego
WriteLog("Loading - binary model: " + FileName); WriteLog("loading e3d model " + FileName + " ..");
int i = 0, j, k, ch, size;
/* TFileStream *fs = new TFileStream(AnsiString(FileName), fmOpenRead); std::ifstream file(FileName, std::ios::binary);
size = fs->Size >> 2;
iModel = new int[size]; // ten wskaźnik musi być w modelu, aby zwolnić pamięć uint32_t type = sn_utils::ld_uint32(file);
fs->Read(iModel, fs->Size); // wczytanie pliku uint32_t size = sn_utils::ld_uint32(file) - 8;
delete fs;
*/ { if (type != MAKE_ID4('E', '3', 'D', '0'))
std::ifstream file(FileName, std::ios::binary | std::ios::ate); throw std::runtime_error("e3d: unknown main chunk");
file.unsetf(std::ios::skipws);
size = file.tellg(); // ios::ate already positioned us at the end of the file deserialize(file, size, dynamic);
iModel = new int[size >> 2]; // ten wskaźnik musi być w modelu, aby zwolnić pamięć file.close();
file.seekg(0, std::ios::beg); // rewind the caret afterwards
file.read(reinterpret_cast<char *>(iModel), size); WriteLog("..done.");
}
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;
}; };
void TModel3d::LoadFromTextFile(std::string const &FileName, bool dynamic) void TModel3d::LoadFromTextFile(std::string const &FileName, bool dynamic)
@@ -2050,100 +2145,6 @@ void TModel3d::Init()
} }
}; };
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<char *>(&len), 4);
file.write("SUB0", 4); // dane submodeli
file.write(reinterpret_cast<char *>(&sub), 4);
for (i = 0; i < iSubModelsCount; ++i)
{
roboczy->InfoSet(info + i);
file.write(reinterpret_cast<char *>(roboczy),
sizeof(TSubModel)); // zapis jednego submodelu
}
if (tra)
{ // zapis transformów
file.write("TRA0", 4); // transformy
file.write(reinterpret_cast<char *>(&tra), 4);
for (i = 0; i < iSubModelsCount; ++i)
if (info[i].iTransform >= 0)
file.write(reinterpret_cast<char *>(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<char *>(&vnt), 4);
file.write(reinterpret_cast<char *>(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<char *>(&i), 4);
file.write(reinterpret_cast<char *>(&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<char *>(&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<char *>(&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<char *>(&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;
};
void TModel3d::BreakHierarhy() void TModel3d::BreakHierarhy()
{ {
Error("Not implemented yet :("); Error("Not implemented yet :(");

106
Model3d.h
View File

@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
#ifndef Model3dH #ifndef Model3dH
#define Model3dH #define Model3dH
#include "gl/glew.h" #include "GL/glew.h"
#include "Parser.h" #include "Parser.h"
#include "dumb3d.h" #include "dumb3d.h"
#include "Float3d.h" #include "Float3d.h"
@@ -26,37 +26,6 @@ struct GLVERTEX
float tu, tv; 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;
};
};
class TMaterialColor class TMaterialColor
{ {
public: public:
@@ -159,15 +128,13 @@ enum TAnimType // rodzaj animacji
}; };
class TModel3d; class TModel3d;
class TSubModelInfo;
class TSubModel class TSubModel
{ // klasa submodelu - pojedyncza siatka, punkt świetlny albo grupa punktów { // 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 //m7todo: zrobić normalną serializację
// Ra: nie przestawiać zmiennych, bo wczytują się z pliku binarnego!
private: private:
TSubModel *Next; int iNext;
TSubModel *Child; int iChild;
int eType; // Ra: modele binarne dają więcej możliwości niż mesh złożony z trójkątów 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 int iName; // numer łańcucha z nazwą submodelu, albo -1 gdy anonimowy
public: // chwilowo public: // chwilowo
@@ -194,7 +161,7 @@ class TSubModel
int iMatrix; // w pliku binarnym jest numer matrycy int iMatrix; // w pliku binarnym jest numer matrycy
}; };
int iNumVerts; // ilość wierzchołków (1 dla FreeSpotLight) int iNumVerts; // ilość wierzchołków (1 dla FreeSpotLight)
int iVboPtr; // początek na liście wierzchołków albo indeksów int tVboPtr; // początek na liście wierzchołków albo indeksów
int iTexture; // numer nazwy tekstury, -1 wymienna, 0 brak int iTexture; // numer nazwy tekstury, -1 wymienna, 0 brak
float fVisible; // próg jasności światła do załączenia submodelu 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 fLight; // próg jasności światła do zadziałania selfillum
@@ -215,12 +182,15 @@ class TSubModel
float fCosHotspotAngle; // cosinus kąta stożka pod którym widać aureolę i zwiększone natężenie float fCosHotspotAngle; // cosinus kąta stożka pod którym widać aureolę i zwiększone natężenie
// światła // światła
float fCosViewAngle; // cos kata pod jakim sie teraz patrzy float fCosViewAngle; // cos kata pod jakim sie teraz patrzy
// Ra: dalej są zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy
TSubModel *Next;
TSubModel *Child;
intptr_t iVboPtr;
texture_manager::size_type TextureID; // numer tekstury, -1 wymienna, 0 brak texture_manager::size_type TextureID; // numer tekstury, -1 wymienna, 0 brak
bool bWire; // nie używane, ale wczytywane bool bWire; // nie używane, ale wczytywane
// short TexAlpha; //Ra: nie używane już // short TexAlpha; //Ra: nie używane już
GLuint uiDisplayList; // roboczy numer listy wyświetlania GLuint uiDisplayList; // roboczy numer listy wyświetlania
float Opacity; // nie używane, ale wczytywane float Opacity; // nie używane, ale wczytywane //m7todo: wywalić to
// ABu: te same zmienne, ale zdublowane dla Render i RenderAlpha, // ABu: te same zmienne, ale zdublowane dla Render i RenderAlpha,
// bo sie chrzanilo przemieszczanie obiektow. // bo sie chrzanilo przemieszczanie obiektow.
// Ra: już się nie chrzani // Ra: już się nie chrzani
@@ -231,11 +201,10 @@ class TSubModel
public: // chwilowo public: // chwilowo
float3 v_TransVector; float3 v_TransVector;
float8 *Vertices; // roboczy wskaźnik - wczytanie T3D do VBO float8 *Vertices; // roboczy wskaźnik - wczytanie T3D do VBO
int iAnimOwner; // roboczy numer egzemplarza, który ustawił animację size_t iAnimOwner; // roboczy numer egzemplarza, który ustawił animację
TAnimType b_aAnim; // kody animacji oddzielnie, bo zerowane TAnimType b_aAnim; // kody animacji oddzielnie, bo zerowane
public: public:
float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer) float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer)
char space[8]; // wolne miejsce na przyszłe zmienne (zmniejszyć w miarę potrzeby)
public: public:
TSubModel ** TSubModel **
smLetter; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D) smLetter; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D)
@@ -243,8 +212,8 @@ class TSubModel
int iVisible; // roboczy stan widoczności int iVisible; // roboczy stan widoczności
// AnsiString asTexture; //robocza nazwa tekstury do zapisania w pliku binarnym // AnsiString asTexture; //robocza nazwa tekstury do zapisania w pliku binarnym
// AnsiString asName; //robocza nazwa // AnsiString asName; //robocza nazwa
char *pTexture; // robocza nazwa tekstury do zapisania w pliku binarnym std::string pTexture; // robocza nazwa tekstury do zapisania w pliku binarnym
char *pName; // robocza nazwa std::string pName; // robocza nazwa
private: private:
// int SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX // int SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX
// *Vertices); // *Vertices);
@@ -252,7 +221,7 @@ class TSubModel
void RaAnimation(TAnimType a); void RaAnimation(TAnimType a);
public: public:
static int iInstance; // identyfikator egzemplarza, który aktualnie renderuje model static size_t iInstance; // identyfikator egzemplarza, który aktualnie renderuje model
static texture_manager::size_type *ReplacableSkinId; static texture_manager::size_type *ReplacableSkinId;
static int iAlpha; // maska bitowa dla danego przebiegu static int iAlpha; // maska bitowa dla danego przebiegu
static double fSquareDist; static double fSquareDist;
@@ -308,10 +277,8 @@ class TSubModel
}; };
void InitialRotate(bool doit); void InitialRotate(bool doit);
void DisplayLists(); void DisplayLists();
void Info(); void BinInit(TSubModel *s, float4x4 *m, float8 *v,
void InfoSet(TSubModelInfo *info); std::vector<std::string> *t, std::vector<std::string> *n, bool dynamic);
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) void ReplacableSet(texture_manager::size_type *r, int a)
{ {
ReplacableSkinId = r; ReplacableSkinId = r;
@@ -344,35 +311,13 @@ class TSubModel
void ParentMatrix(float4x4 *m); void ParentMatrix(float4x4 *m);
float MaxY(const float4x4 &m); float MaxY(const float4x4 &m);
void AdjustDist(); void AdjustDist();
};
class TSubModelInfo void deserialize(std::istream&);
{ // klasa z informacjami o submodelach, do tworzenia pliku binarnego void TSubModel::serialize(std::ostream&,
public: std::vector<TSubModel*>&,
TSubModel *pSubModel; // wskaźnik na submodel std::vector<std::string>&,
int iTransform; // numer transformu (-1 gdy brak) std::vector<std::string>&,
int iName; // numer nazwy std::vector<float4x4>&);
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(){};
}; };
class TModel3d : public CMesh class TModel3d : public CMesh
@@ -386,8 +331,8 @@ class TModel3d : public CMesh
public: // Ra: tymczasowo public: // Ra: tymczasowo
int iNumVerts; // ilość wierzchołków (gdy nie ma VBO, to m_nVertexCount=0) int iNumVerts; // ilość wierzchołków (gdy nie ma VBO, to m_nVertexCount=0)
private: private:
TStringPack Textures; // nazwy tekstur std::vector<std::string> Textures; // nazwy tekstur
TStringPack Names; // nazwy submodeli std::vector<std::string> Names; // nazwy submodeli
int *iModel; // zawartość pliku binarnego int *iModel; // zawartość pliku binarnego
int iSubModelsCount; // Ra: używane do tworzenia binarnych int iSubModelsCount; // Ra: używane do tworzenia binarnych
std::string asBinary; // nazwa pod którą zapisać model binarny std::string asBinary; // nazwa pod którą zapisać model binarny
@@ -440,13 +385,14 @@ class TModel3d : public CMesh
return iFlags; return iFlags;
}; };
void Init(); void Init();
char * NameGet() std::string NameGet()
{ {
return Root ? Root->pName : NULL; return Root ? Root->pName : NULL;
}; };
int TerrainCount(); int TerrainCount();
TSubModel * TerrainSquare(int n); TSubModel * TerrainSquare(int n);
void TerrainRenderVBO(int n); void TerrainRenderVBO(int n);
void deserialize(std::istream &s, size_t size, bool dynamic);
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -14,6 +14,9 @@ TPythonInterpreter *TPythonInterpreter::_instance = NULL;
TPythonInterpreter::TPythonInterpreter() TPythonInterpreter::TPythonInterpreter()
{ {
WriteLog("Loading Python ..."); WriteLog("Loading Python ...");
if (sizeof(void*) == 8)
Py_SetPythonHome("python64");
else
Py_SetPythonHome("python"); Py_SetPythonHome("python");
Py_Initialize(); Py_Initialize();
_main = PyImport_ImportModule("__main__"); _main = PyImport_ImportModule("__main__");
@@ -64,7 +67,7 @@ bool TPythonInterpreter::loadClassFile( std::string const &lookupPath, std::stri
long fsize = ftell(sourceFile); long fsize = ftell(sourceFile);
char *buffer = (char *)calloc(fsize + 1, sizeof(char)); char *buffer = (char *)calloc(fsize + 1, sizeof(char));
fseek(sourceFile, 0, SEEK_SET); 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 buffer[freaded] = 0; // z jakiegos powodu czytamy troche mniej i trzczeba dodac konczace
// zero do bufora (mimo ze calloc teoretycznie powiniene zwrocic // zero do bufora (mimo ze calloc teoretycznie powiniene zwrocic
// wyzerowana pamiec) // wyzerowana pamiec)

View File

@@ -176,7 +176,7 @@ void TRealSound::Stop()
void TRealSound::AdjFreq(double Freq, double dt) // McZapkie TODO: dorobic tu efekt Dopplera 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 // 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 ((Global::bSoundEnabled) && (AM != 0))
{ {
if (dt > 0) if (dt > 0)
@@ -247,7 +247,7 @@ void TTextSound::Init(std::string const &SoundName, double SoundAttenuation, dou
fTime = GetWaveTime(); fTime = GetWaveTime();
std::string txt(SoundName); std::string txt(SoundName);
txt.erase( txt.rfind( '.' ) ); // obcięcie rozszerzenia 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] == '/') if (txt[i] == '/')
txt[i] = '\\'; // bo nie rozumi txt[i] = '\\'; // bo nie rozumi
txt += "-" + Global::asLang + ".txt"; // już może być w różnych językach txt += "-" + Global::asLang + ".txt"; // już może być w różnych językach

View File

@@ -599,7 +599,7 @@ void TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *Shap
double fOffsetX) double fOffsetX)
{ // tworzenie siatki trójkątów dla iglicy { // tworzenie siatki trójkątów dla iglicy
vector3 pos1, pos2, dir, parallel1, parallel2, pt; 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; int i, j;
if (bCurve) if (bCurve)
{ // dla toru odchylonego { // dla toru odchylonego
@@ -736,7 +736,7 @@ void TSegment::Render()
{ {
vector3 pt; vector3 pt;
GfxRenderer.Bind(0); GfxRenderer.Bind(0);
int i;
if (bCurve) if (bCurve)
{ {
glColor3f(0, 0, 1.0f); glColor3f(0, 0, 1.0f);

View File

@@ -8,7 +8,6 @@ http://mozilla.org/MPL/2.0/.
*/ */
#include "stdafx.h" #include "stdafx.h"
#define STRICT
#include "Sound.h" #include "Sound.h"
#include "Globals.h" #include "Globals.h"
#include "Logs.h" #include "Logs.h"
@@ -219,7 +218,6 @@ LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(const char *Name, bool Dynamic,
Dynamic = false; // wczytanie z "sounds/" Dynamic = false; // wczytanie z "sounds/"
} }
TSoundContainer *Next = First; TSoundContainer *Next = First;
DWORD dwStatus;
for (int i = 0; i < Count; i++) for (int i = 0; i < Count; i++)
{ {
if (strcmp(Name, Next->Name) == 0) if (strcmp(Name, Next->Name) == 0)
@@ -277,11 +275,6 @@ void TSoundsManager::RestoreAll()
for (int i = 0; i < Count; i++) for (int i = 0; i < Count; i++)
{ {
if (FAILED(hr = Next->DSBuffer->GetStatus(&dwStatus)))
;
// return hr;
if (dwStatus & DSBSTATUS_BUFFERLOST) if (dwStatus & DSBSTATUS_BUFFERLOST)
{ {
// Since the app could have just been activated, then // Since the app could have just been activated, then
@@ -376,6 +369,3 @@ void TSoundsManager::Init(HWND hWnd)
SAFE_RELEASE(pDSBPrimary); SAFE_RELEASE(pDSBPrimary);
}; };
//---------------------------------------------------------------------------
#pragma package(smart_init)

View File

@@ -17,10 +17,12 @@ http://mozilla.org/MPL/2.0/.
#include "texture.h" #include "texture.h"
#include <ddraw.h> #include <ddraw.h>
#include "GL/glew.h"
#include "usefull.h" #include "usefull.h"
#include "globals.h" #include "globals.h"
#include "logs.h" #include "logs.h"
#include "sn_utils.h"
texture_manager::texture_manager() { texture_manager::texture_manager() {
@@ -80,7 +82,7 @@ opengl_texture::load_BMP() {
if( infosize > sizeof( info ) ) { if( infosize > sizeof( info ) ) {
WriteLog( "Warning - BMP header is larger than expected, possible format difference." ); 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_width = info.bmiHeader.biWidth;
data_height = info.bmiHeader.biHeight; data_height = info.bmiHeader.biHeight;
@@ -118,6 +120,70 @@ opengl_texture::load_BMP() {
return; 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 void
opengl_texture::load_DDS() { opengl_texture::load_DDS() {
@@ -136,9 +202,8 @@ opengl_texture::load_DDS() {
return; return;
} }
DDSURFACEDESC2 ddsd; DDSURFACEDESC2 ddsd = deserialize_ddsd(file);
file.read((char *)&ddsd, sizeof(ddsd)); filesize -= 124;
filesize -= sizeof( ddsd );
// //
// This .dds loader supports the loading of compressed formats DXT1, DXT3 // This .dds loader supports the loading of compressed formats DXT1, DXT3
@@ -189,7 +254,7 @@ opengl_texture::load_DDS() {
return; 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 // this approach loads only the first mipmap and relies on graphics card to fill the rest
data_mapcount = 1; data_mapcount = 1;
@@ -467,7 +532,7 @@ opengl_texture::create() {
::glCompressedTexImage2D( ::glCompressedTexImage2D(
GL_TEXTURE_2D, maplevel, data_format, GL_TEXTURE_2D, maplevel, data_format,
datawidth, dataheight, 0, datawidth, dataheight, 0,
datasize, (GLubyte *)&data[0] + dataoffset ); datasize, (GLubyte *)&data[dataoffset] );
dataoffset += datasize; dataoffset += datasize;
datawidth = std::max( datawidth / 2, 1 ); datawidth = std::max( datawidth / 2, 1 );
@@ -653,7 +718,7 @@ texture_manager::GetTextureId( std::string Filename, std::string const &Dir, int
traits += '#'; traits += '#';
} }
texture.traits = 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_textures.emplace_back( texture );
m_texturemappings.emplace( filename, textureindex ); m_texturemappings.emplace( filename, textureindex );

View File

@@ -9,8 +9,10 @@ http://mozilla.org/MPL/2.0/.
#pragma once #pragma once
#include <istream>
#include <ddraw.h>
#include <string> #include <string>
#include "gl/glew.h" #include "GL/glew.h"
enum class resource_state { enum class resource_state {
none, none,
@@ -20,6 +22,10 @@ enum class resource_state {
}; };
struct opengl_texture { 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 // methods
void load(); void load();

View File

@@ -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) 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; GLuint Select;
const GLubyte *Temp; //, r0, g0, b0, r1, g1, b1; const GLubyte *Temp; //, r0, g0, b0, r1, g1, b1;
Color8888 colours[4], *col; Color8888 colours[4], *col;

View File

@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
#ifndef TEXTURE_DDS_H #ifndef TEXTURE_DDS_H
#define TEXTURE_DDS_H 1 #define TEXTURE_DDS_H 1
#include "gl/glew.h" #include "GL/glew.h"
#pragma hdrstop #pragma hdrstop

View File

@@ -412,10 +412,9 @@ vector3 LoadPoint(cParser *parser)
void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name) void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name)
{ // pobranie obiektu trajektorii ruchu { // pobranie obiektu trajektorii ruchu
vector3 pt, vec, p1, p2, cp1, cp2, p3, p4, cp3, cp4; // dodatkowe punkty potrzebne do skrzyżowań 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; string str;
bool bCurve; size_t i; //,state; //Ra: teraz już nie ma początkowego stanu zwrotnicy we wpisie
int i; //,state; //Ra: teraz już nie ma początkowego stanu zwrotnicy we wpisie
std::string token; std::string token;
parser->getTokens(); parser->getTokens();
@@ -1557,7 +1556,7 @@ void TTrack::Compile(GLuint tex)
// 2014-07: na początek rysować brzegi jak dla łuków // 2014-07: na początek rysować brzegi jak dla łuków
// punkty brzegu nawierzchni uzyskujemy podczas renderowania boków (bez sensu, ale // punkty brzegu nawierzchni uzyskujemy podczas renderowania boków (bez sensu, ale
// najszybciej było zrobić) // 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) if (!SwitchExtension->vPoints)
{ // jeśli tablica punktów nie jest jeszcze utworzona, zliczamy punkty i tworzymy ją { // 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 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 (!SwitchExtension->bPoints) // jeśli tablica nie wypełniona
if (b) // ale jest wskaźnik do tablicy - może nie być? if (b) // ale jest wskaźnik do tablicy - może nie być?
{ // coś się gubi w obliczeniach na wskaźnikach { // 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ż sizeof(vector3); // ustalenie liczby punktów, bo mogło wyjść inaczej niż
// policzone z góry // policzone z góry
if (i > 0) if (i > 0)
@@ -2913,7 +2912,7 @@ TTrack * TTrack::RaAnimate()
} }
if (Global::bUseVBO) if (Global::bUseVBO)
{ // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment { // 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 if (TextureID1) // Ra: !!!! tu jest do poprawienia
{ // iglice liczone tylko dla zwrotnic { // iglice liczone tylko dla zwrotnic
vector6 rpts3[24], rpts4[24]; vector6 rpts3[24], rpts4[24];
@@ -3024,7 +3023,7 @@ TTrack * TTrack::RaAnimate()
if (Global::bUseVBO) if (Global::bUseVBO)
{ // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment { // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment
// aktualizacja pojazdów na torze // 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 = int size =
RaArrayPrepare(); // wielkość tabeli potrzebna dla tej obrotnicy RaArrayPrepare(); // wielkość tabeli potrzebna dla tej obrotnicy

22
Track.h
View File

@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
#pragma once #pragma once
#include <string> #include <string>
#include "gl/glew.h" #include "GL/glew.h"
#include "ResourceManager.h" #include "ResourceManager.h"
#include "Segment.h" #include "Segment.h"
#include "Texture.h" #include "Texture.h"
@@ -139,12 +139,12 @@ class TTrack : public Resource
// McZapkie-070402: dodalem zmienne opisujace rozmiary tekstur // McZapkie-070402: dodalem zmienne opisujace rozmiary tekstur
texture_manager::size_type TextureID1 = 0; // tekstura szyn albo nawierzchni texture_manager::size_type TextureID1 = 0; // tekstura szyn albo nawierzchni
texture_manager::size_type TextureID2 = 0; // tekstura automatycznej podsypki albo pobocza texture_manager::size_type TextureID2 = 0; // tekstura automatycznej podsypki albo pobocza
float fTexLength = 4.0; // długość powtarzania tekstury w metrach float fTexLength = 4.0f; // długość powtarzania tekstury w metrach
float fTexRatio1 = 1.0; // proporcja boków tekstury nawierzchni (żeby zaoszczędzić na rozmiarach tekstur...) float fTexRatio1 = 1.0f; // 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 fTexRatio2 = 1.0f; // proporcja boków tekstury chodnika (żeby zaoszczędzić na rozmiarach tekstur...)
float fTexHeight1 = 0.6; // wysokość brzegu względem trajektorii float fTexHeight1 = 0.6f; // wysokość brzegu względem trajektorii
float fTexWidth = 0.9; // szerokość boku float fTexWidth = 0.9f; // szerokość boku
float fTexSlope = 0.9; float fTexSlope = 0.9f;
double fRadiusTable[ 2 ]; // dwa promienie, drugi dla zwrotnicy double fRadiusTable[ 2 ]; // dwa promienie, drugi dla zwrotnicy
int iTrapezoid = 0; // 0-standard, 1-przechyłka, 2-trapez, 3-oba int iTrapezoid = 0; // 0-standard, 1-przechyłka, 2-trapez, 3-oba
GLuint DisplayListID = 0; GLuint DisplayListID = 0;
@@ -176,10 +176,10 @@ class TTrack : public Resource
int iPrevDirection = 0; // domyślnie wirtualne odcinki dołączamy stroną od Point1 int iPrevDirection = 0; // domyślnie wirtualne odcinki dołączamy stroną od Point1
TTrackType eType = tt_Normal; // domyślnie zwykły TTrackType eType = tt_Normal; // domyślnie zwykły
int iCategoryFlag = 1; // 0x100 - usuwanie pojazów // 1-tor, 2-droga, 4-rzeka, 8-samolot? 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 fTrackWidth = 1.435f; // szerokość w punkcie 1 // rozstaw toru, szerokość nawierzchni
float fTrackWidth2 = 0.0; // szerokość w punkcie 2 (głównie drogi i rzeki) float fTrackWidth2 = 0.0f; // szerokość w punkcie 2 (głównie drogi i rzeki)
float fFriction = 0.15; // współczynnik tarcia float fFriction = 0.15f; // współczynnik tarcia
float fSoundDistance = -1.0; float fSoundDistance = -1.0f;
int iQualityFlag = 20; int iQualityFlag = 20;
int iDamageFlag = 0; int iDamageFlag = 0;
TEnvironmentType eEnvironment = e_flat; // dźwięk i oświetlenie TEnvironmentType eEnvironment = e_flat; // dźwięk i oświetlenie

View File

@@ -256,11 +256,11 @@ void TTraction::RenderDL(float mgn) // McZapkie: mgn to odleglosc od obserwatora
if (!Global::bSmoothTraction) if (!Global::bSmoothTraction)
glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient
float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness
if (linealpha > 1.2) if (linealpha > 1.2f)
linealpha = 1.2; // zbyt grube nie są dobre linealpha = 1.2f; // zbyt grube nie są dobre
glLineWidth(linealpha); glLineWidth(linealpha);
if (linealpha > 1.0) if (linealpha > 1.0f)
linealpha = 1.0; linealpha = 1.0f;
// McZapkie-261102: kolor zalezy od materialu i zasniedzenia // McZapkie-261102: kolor zalezy od materialu i zasniedzenia
float r, g, b; float r, g, b;
switch (Material) switch (Material)
@@ -269,59 +269,59 @@ void TTraction::RenderDL(float mgn) // McZapkie: mgn to odleglosc od obserwatora
case 1: case 1:
if (TestFlag(DamageFlag, 1)) if (TestFlag(DamageFlag, 1))
{ {
r = 0.00000; r = 0.00000f;
g = 0.32549; g = 0.32549f;
b = 0.2882353; // zielona miedź b = 0.2882353f; // zielona miedź
} }
else else
{ {
r = 0.35098; r = 0.35098f;
g = 0.22549; g = 0.22549f;
b = 0.1; // czerwona miedź b = 0.1f; // czerwona miedź
} }
break; break;
case 2: case 2:
if (TestFlag(DamageFlag, 1)) if (TestFlag(DamageFlag, 1))
{ {
r = 0.10; r = 0.10f;
g = 0.10; g = 0.10f;
b = 0.10; // czarne Al b = 0.10f; // czarne Al
} }
else else
{ {
r = 0.25; r = 0.25f;
g = 0.25; g = 0.25f;
b = 0.25; // srebrne Al b = 0.25f; // srebrne Al
} }
break; break;
// tymczasowo pokazanie zasilanych odcinków // tymczasowo pokazanie zasilanych odcinków
case 4: case 4:
r = 0.5; r = 0.5f;
g = 0.5; g = 0.5f;
b = 1.0; b = 1.0f;
break; // niebieskie z podłączonym zasilaniem break; // niebieskie z podłączonym zasilaniem
case 5: case 5:
r = 1.0; r = 1.0f;
g = 0.0; g = 0.0f;
b = 0.0; b = 0.0f;
break; // czerwone z podłączonym zasilaniem 1 break; // czerwone z podłączonym zasilaniem 1
case 6: case 6:
r = 0.0; r = 0.0f;
g = 1.0; g = 1.0f;
b = 0.0; b = 0.0f;
break; // zielone z podłączonym zasilaniem 2 break; // zielone z podłączonym zasilaniem 2
case 7: case 7:
r = 1.0; r = 1.0f;
g = 1.0; g = 1.0f;
b = 0.0; b = 0.0f;
break; //żółte z podłączonym zasilaniem z obu stron break; //żółte z podłączonym zasilaniem z obu stron
} }
if (DebugModeFlag) if (DebugModeFlag)
if (hvParallel) if (hvParallel)
{ // jeśli z bieżnią wspólną, to dodatkowo przyciemniamy { // jeśli z bieżnią wspólną, to dodatkowo przyciemniamy
r *= 0.6; r *= 0.6f;
g *= 0.6; g *= 0.6f;
b *= 0.6; b *= 0.6f;
} }
#ifdef EU07_USE_OLD_LIGHTING_MODEL #ifdef EU07_USE_OLD_LIGHTING_MODEL
r *= Global::ambientDayLight[ 0 ]; // w zaleźności od koloru swiatła 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 ]; g *= Global::DayLight.ambient[ 1 ];
b *= Global::DayLight.ambient[2]; b *= Global::DayLight.ambient[2];
#endif #endif
if (linealpha > 1.0) if (linealpha > 1.0f)
linealpha = 1.0; // trzeba ograniczyć do <=1 linealpha = 1.0f; // trzeba ograniczyć do <=1
glColor4f(r, g, b, linealpha); glColor4f(r, g, b, linealpha);
if (!uiDisplayList) if (!uiDisplayList)
Optimize(); // generowanie DL w miarę potrzeby Optimize(); // generowanie DL w miarę potrzeby
@@ -475,8 +475,8 @@ void TTraction::RenderVBO(float mgn, int iPtr)
if (!Global::bSmoothTraction) if (!Global::bSmoothTraction)
glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient
float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness
if (linealpha > 1.2) if (linealpha > 1.2f)
linealpha = 1.2; // zbyt grube nie są dobre linealpha = 1.2f; // zbyt grube nie są dobre
glLineWidth(linealpha); glLineWidth(linealpha);
// McZapkie-261102: kolor zalezy od materialu i zasniedzenia // McZapkie-261102: kolor zalezy od materialu i zasniedzenia
float r, g, b; float r, g, b;
@@ -486,51 +486,51 @@ void TTraction::RenderVBO(float mgn, int iPtr)
case 1: case 1:
if (TestFlag(DamageFlag, 1)) if (TestFlag(DamageFlag, 1))
{ {
r = 0.00000; r = 0.00000f;
g = 0.32549; g = 0.32549f;
b = 0.2882353; // zielona miedź b = 0.2882353f; // zielona miedź
} }
else else
{ {
r = 0.35098; r = 0.35098f;
g = 0.22549; g = 0.22549f;
b = 0.1; // czerwona miedź b = 0.1f; // czerwona miedź
} }
break; break;
case 2: case 2:
if (TestFlag(DamageFlag, 1)) if (TestFlag(DamageFlag, 1))
{ {
r = 0.10; r = 0.10f;
g = 0.10; g = 0.10f;
b = 0.10; // czarne Al b = 0.10f; // czarne Al
} }
else else
{ {
r = 0.25; r = 0.25f;
g = 0.25; g = 0.25f;
b = 0.25; // srebrne Al b = 0.25f; // srebrne Al
} }
break; break;
// tymczasowo pokazanie zasilanych odcinków // tymczasowo pokazanie zasilanych odcinków
case 4: case 4:
r = 0.5; r = 0.5f;
g = 0.5; g = 0.5f;
b = 1.0; b = 1.0f;
break; // niebieskie z podłączonym zasilaniem break; // niebieskie z podłączonym zasilaniem
case 5: case 5:
r = 1.0; r = 1.0f;
g = 0.0; g = 0.0f;
b = 0.0; b = 0.0f;
break; // czerwone z podłączonym zasilaniem 1 break; // czerwone z podłączonym zasilaniem 1
case 6: case 6:
r = 0.0; r = 0.0f;
g = 1.0; g = 1.0f;
b = 0.0; b = 0.0f;
break; // zielone z podłączonym zasilaniem 2 break; // zielone z podłączonym zasilaniem 2
case 7: case 7:
r = 1.0; r = 1.0f;
g = 1.0; g = 1.0f;
b = 0.0; b = 0.0f;
break; //żółte z podłączonym zasilaniem z obu stron break; //żółte z podłączonym zasilaniem z obu stron
} }
#ifdef EU07_USE_OLD_LIGHTING_MODEL #ifdef EU07_USE_OLD_LIGHTING_MODEL
@@ -542,8 +542,8 @@ void TTraction::RenderVBO(float mgn, int iPtr)
g *= Global::DayLight.ambient[ 1 ]; g *= Global::DayLight.ambient[ 1 ];
b *= Global::DayLight.ambient[ 2 ]; b *= Global::DayLight.ambient[ 2 ];
#endif #endif
if (linealpha > 1.0) if (linealpha > 1.0f)
linealpha = 1.0; // trzeba ograniczyć do <=1 linealpha = 1.0f; // trzeba ograniczyć do <=1
glColor4f(r, g, b, linealpha); glColor4f(r, g, b, linealpha);
glDrawArrays(GL_LINES, iPtr, iLines); glDrawArrays(GL_LINES, iPtr, iLines);
glLineWidth(1.0); glLineWidth(1.0);
@@ -680,7 +680,7 @@ double TTraction::VoltageGet(double u, double i)
return psPowered->CurrentGet(res) * return psPowered->CurrentGet(res) *
res; // yB: dla zasilanego nie baw się w gwiazdy, tylko bierz bezpośrednio res; // yB: dla zasilanego nie baw się w gwiazdy, tylko bierz bezpośrednio
double r0t, r1t, r0g, r1g; double r0t, r1t, r0g, r1g;
double u0, u1, i0, i1; double i0, i1;
r0t = fResistance[0]; //średni pomysł, ale lepsze niż nic r0t = fResistance[0]; //średni pomysł, ale lepsze niż nic
r1t = fResistance[1]; // bo nie uwzględnia spadków z innych pojazdów r1t = fResistance[1]; // bo nie uwzględnia spadków z innych pojazdów
if (psPower[0] && psPower[1]) if (psPower[0] && psPower[1])

View File

@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
#pragma once #pragma once
#include <string> #include <string>
#include "gl/glew.h" #include "GL/glew.h"
#include "VBO.h" #include "VBO.h"
#include "dumb3d.h" #include "dumb3d.h"

View File

@@ -776,7 +776,7 @@ if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) ||
dsbSwitch->Play(0, 0, 0); dsbSwitch->Play(0, 0, 0);
} }
/* /*
if (Console::Pressed(VK_CONTROL)) if (Global::ctrlState)
{//z [Ctrl] zapalamy albo gasimy światełko w kabinie {//z [Ctrl] zapalamy albo gasimy światełko w kabinie
if (iCabLightFlag<2) ++iCabLightFlag; //zapalenie if (iCabLightFlag<2) ++iCabLightFlag; //zapalenie
} }
@@ -1838,9 +1838,8 @@ if
ctrain_pneumatic)) ctrain_pneumatic))
{ {
rsHiss.Play(1, DSBPLAY_LOOPING, true, tmp->GetPosition()); rsHiss.Play(1, DSBPLAY_LOOPING, true, tmp->GetPosition());
DynamicObject->SetPneumatic(CouplNr, DynamicObject->SetPneumatic(CouplNr != 0, true); // Ra: to mi się nie podoba !!!!
1); // Ra: to mi się nie podoba !!!! tmp->SetPneumatic(CouplNr != 0, true);
tmp->SetPneumatic(CouplNr, 1);
} }
} }
else if (!TestFlag(tmp->MoverParameters->Couplers[CouplNr].CouplingFlag, else if (!TestFlag(tmp->MoverParameters->Couplers[CouplNr].CouplingFlag,
@@ -1860,9 +1859,8 @@ if
// rsHiss.Play(1,DSBPLAY_LOOPING,true,tmp->GetPosition()); // rsHiss.Play(1,DSBPLAY_LOOPING,true,tmp->GetPosition());
dsbCouplerDetach->SetVolume(DSBVOLUME_MAX); dsbCouplerDetach->SetVolume(DSBVOLUME_MAX);
dsbCouplerDetach->Play(0, 0, 0); dsbCouplerDetach->Play(0, 0, 0);
DynamicObject->SetPneumatic(CouplNr, DynamicObject->SetPneumatic(CouplNr != 0, false); // Ra: to mi się nie podoba !!!!
0); // Ra: to mi się nie podoba !!!! tmp->SetPneumatic(CouplNr != 0, false);
tmp->SetPneumatic(CouplNr, 0);
} }
} }
else if (!TestFlag(tmp->MoverParameters->Couplers[CouplNr].CouplingFlag, else if (!TestFlag(tmp->MoverParameters->Couplers[CouplNr].CouplingFlag,
@@ -1900,8 +1898,8 @@ if
// rsHiss.Play(1,DSBPLAY_LOOPING,true,tmp->GetPosition()); // rsHiss.Play(1,DSBPLAY_LOOPING,true,tmp->GetPosition());
dsbCouplerDetach->SetVolume(DSBVOLUME_MAX); dsbCouplerDetach->SetVolume(DSBVOLUME_MAX);
dsbCouplerDetach->Play(0, 0, 0); dsbCouplerDetach->Play(0, 0, 0);
DynamicObject->SetPneumatic(CouplNr, 0); DynamicObject->SetPneumatic(CouplNr != 0, false);
tmp->SetPneumatic(CouplNr, 0); tmp->SetPneumatic(CouplNr != 0, false);
} }
} }
} }
@@ -1999,7 +1997,7 @@ if
dsbSwitch->Play(0, 0, 0); dsbSwitch->Play(0, 0, 0);
} }
/* /*
if (Console::Pressed(VK_CONTROL)) if (Global::ctrlState)
{//z [Ctrl] zapalamy albo gasimy światełko w kabinie {//z [Ctrl] zapalamy albo gasimy światełko w kabinie
if (iCabLightFlag) --iCabLightFlag; //gaszenie if (iCabLightFlag) --iCabLightFlag; //gaszenie
} */ } */
@@ -4428,7 +4426,7 @@ bool TTrain::Update( double const Deltatime )
} }
// if ( // 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 // ) //NBMX 14-09-2003: sprezarka wl
if (Global::shiftState && Console::Pressed(Global::Keys[k_Compressor]) && if (Global::shiftState && Console::Pressed(Global::Keys[k_Compressor]) &&
(mvControlled->CompressorPower < 2)) // hunter-091012: tak jest poprawnie (mvControlled->CompressorPower < 2)) // hunter-091012: tak jest poprawnie
@@ -4448,7 +4446,7 @@ bool TTrain::Update( double const Deltatime )
} }
// if ( // 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 // ) //NBMX 14-09-2003: sprezarka wl
if (!Global::shiftState && Console::Pressed(Global::Keys[k_Compressor]) && if (!Global::shiftState && Console::Pressed(Global::Keys[k_Compressor]) &&
(mvControlled->CompressorPower < 2)) // hunter-091012: tak jest poprawnie (mvControlled->CompressorPower < 2)) // hunter-091012: tak jest poprawnie
@@ -4591,10 +4589,10 @@ bool TTrain::Update( double const Deltatime )
if (ggUniversal3Button.SubModel) if (ggUniversal3Button.SubModel)
if (Console::Pressed(VK_CONTROL)) if (Global::ctrlState)
{//z [Ctrl] zapalamy albo gasimy światełko w kabinie {//z [Ctrl] zapalamy albo gasimy światełko w kabinie
//tutaj jest bez sensu, trzeba reagować na wciskanie klawisza! //tutaj jest bez sensu, trzeba reagować na wciskanie klawisza!
if (Console::Pressed(VK_SHIFT)) if (Global::shiftState)
{//zapalenie {//zapalenie
if (iCabLightFlag<2) ++iCabLightFlag; if (iCabLightFlag<2) ++iCabLightFlag;
} }
@@ -4606,7 +4604,7 @@ bool TTrain::Update( double const Deltatime )
} }
else else
{//bez [Ctrl] przełączamy cośtem {//bez [Ctrl] przełączamy cośtem
if (Console::Pressed(VK_SHIFT)) if (Global::shiftState)
{ {
ggUniversal3Button.PutValue(1); //hunter-131211: z UpdateValue na ggUniversal3Button.PutValue(1); //hunter-131211: z UpdateValue na
PutValue - by zachowywal sie jak pozostale przelaczniki 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 (Console::Pressed(Global::Keys[k_Univ4]))
{ {
if (ggUniversal4Button.SubModel) if (ggUniversal4Button.SubModel)
if (Console::Pressed(VK_SHIFT)) if (Global::shiftState)
{ {
ActiveUniversal4=true; ActiveUniversal4=true;
//ggUniversal4Button.UpdateValue(1); //ggUniversal4Button.UpdateValue(1);
@@ -4851,7 +4849,7 @@ bool TTrain::Update( double const Deltatime )
if (Global::shiftState) if (Global::shiftState)
{ {
// if (Console::Pressed(k_CurrentNext)) // if (Console::Pressed(k_CurrentNext))
{ // Ra: było pod VK_F3 { // Ra: było pod GLFW_KEY_F3
if ((mvOccupied->EpFuseSwitch(true))) if ((mvOccupied->EpFuseSwitch(true)))
{ {
dsbPneumaticSwitch->SetVolume(-10); dsbPneumaticSwitch->SetVolume(-10);
@@ -4862,7 +4860,7 @@ bool TTrain::Update( double const Deltatime )
else else
{ {
// if (Console::Pressed(k_CurrentNext)) // if (Console::Pressed(k_CurrentNext))
{ // Ra: było pod VK_F3 { // Ra: było pod GLFW_KEY_F3
if (Global::ctrlState) if (Global::ctrlState)
{ {
if ((mvOccupied->EpFuseSwitch(false))) if ((mvOccupied->EpFuseSwitch(false)))
@@ -5105,7 +5103,6 @@ bool TTrain::CabChange(int iDirection)
// wczytywanie pliku z danymi multimedialnymi (dzwieki, kontrolki, kabiny) // wczytywanie pliku z danymi multimedialnymi (dzwieki, kontrolki, kabiny)
bool TTrain::LoadMMediaFile(std::string const &asFileName) bool TTrain::LoadMMediaFile(std::string const &asFileName)
{ {
double dSDist;
cParser parser(asFileName, cParser::buffer_FILE); cParser parser(asFileName, cParser::buffer_FILE);
// NOTE: yaml-style comments are disabled until conflict in use of # is resolved // NOTE: yaml-style comments are disabled until conflict in use of # is resolved
// parser.addCommentStyle( "#", "\n" ); // parser.addCommentStyle( "#", "\n" );
@@ -5412,7 +5409,6 @@ bool TTrain::InitializeCab(int NewCabNo, std::string const &asFileName)
pyScreens.reset(this); pyScreens.reset(this);
pyScreens.setLookupPath(DynamicObject->asBaseDir); pyScreens.setLookupPath(DynamicObject->asBaseDir);
bool parse = false; bool parse = false;
double dSDist;
int cabindex = 0; int cabindex = 0;
DynamicObject->mdKabina = NULL; // likwidacja wskaźnika na dotychczasową kabinę DynamicObject->mdKabina = NULL; // likwidacja wskaźnika na dotychczasową kabinę
switch (NewCabNo) switch (NewCabNo)

View File

@@ -32,10 +32,10 @@ const int maxcab = 2;
// const double fCzuwakTime= 90.0f; // const double fCzuwakTime= 90.0f;
const double fCzuwakBlink = 0.15; 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 // 0.33f
// const double fBuzzerTime= 5.0f; // const double fBuzzerTime= 5.0f;
const float fHaslerTime = 1.2; const float fHaslerTime = 1.2f;
// const double fStycznTime= 0.5f; // const double fStycznTime= 0.5f;
// const double fDblClickTime= 0.2f; // const double fDblClickTime= 0.2f;

View File

@@ -303,8 +303,8 @@ bool TTrackFollower::ComputatePosition()
return false; return false;
} }
#if RENDER_CONE #if RENDER_CONE
#include "opengl/glew.h" #include "GL/glew.h"
#include "opengl/glut.h" #include "GL/glut.h"
void TTrackFollower::Render(float fNr) void TTrackFollower::Render(float fNr)
{ // funkcja rysująca stożek w miejscu osi { // funkcja rysująca stożek w miejscu osi
glPushMatrix(); // matryca kamery glPushMatrix(); // matryca kamery

30
VBO.cpp
View File

@@ -9,9 +9,39 @@ http://mozilla.org/MPL/2.0/.
#include "stdafx.h" #include "stdafx.h"
#include "VBO.h" #include "VBO.h"
#include "GL/glew.h"
#include "usefull.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() CMesh::CMesh()
{ // utworzenie pustego obiektu { // utworzenie pustego obiektu
m_pVNT = nullptr; m_pVNT = nullptr;

3
VBO.h
View File

@@ -21,6 +21,9 @@ class CVertNormTex
float nz = 0.0; // Z wektora normalnego float nz = 0.0; // Z wektora normalnego
float u = 0.0; // U mapowania float u = 0.0; // U mapowania
float v = 0.0; // V mapowania float v = 0.0; // V mapowania
void deserialize(std::istream&);
void serialize(std::ostream&);
}; };
class CMesh class CMesh

View File

@@ -9,6 +9,7 @@ http://mozilla.org/MPL/2.0/.
#pragma once #pragma once
#include <GLFW/glfw3.h>
#include <string> #include <string>
#include "Camera.h" #include "Camera.h"
#include "Ground.h" #include "Ground.h"

View File

@@ -7,9 +7,9 @@ float3
XYZtoRGB( float3 const &XYZ ) { XYZtoRGB( float3 const &XYZ ) {
// M^-1 for Adobe RGB from http://www.brucelindbloom.com/Eqn_RGB_XYZ_Matrix.html // 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: // 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{ return float3{
XYZ.x*mi[ 0 ][ 0 ] + XYZ.y*mi[ 1 ][ 0 ] + XYZ.z*mi[ 2 ][ 0 ], XYZ.x*mi[ 0 ][ 0 ] + XYZ.y*mi[ 1 ][ 0 ] + XYZ.z*mi[ 2 ][ 0 ],

1
eu07.rc Normal file
View File

@@ -0,0 +1 @@
IDI_ICON1 ICON "eu07.ico"

View File

@@ -9,7 +9,7 @@ http://mozilla.org/MPL/2.0/.
#ifndef GeometryH #ifndef GeometryH
#define GeometryH #define GeometryH
#include "gl/glew.h" #include "GL/glew.h"
#include "dumb3d.h" #include "dumb3d.h"
using namespace Math3D; using namespace Math3D;
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -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) void TMTableTime::UpdateMTableTime(double deltaT)

View File

@@ -65,7 +65,7 @@ cParser::~cParser()
} }
// methods // 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? 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->str("");
this->clear(); this->clear();
*/ */
for (int i = 0; i < Count; ++i) for (unsigned int i = 0; i < Count; ++i)
{ {
std::string token = readToken(ToLower, Break); std::string token = readToken(ToLower, Break);
if( true == token.empty() ) { if( true == token.empty() ) {

View File

@@ -77,7 +77,7 @@ class cParser //: public std::stringstream
{ {
return !mStream->fail(); 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 // returns percentage of file processed so far
int getProgress() const; int getProgress() const;
// add custom definition of text which should be ignored when retrieving tokens // add custom definition of text which should be ignored when retrieving tokens

17
python_var_doc.md Normal file
View File

@@ -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 |

View File

@@ -35,7 +35,7 @@ opengl_renderer::Init() {
void void
opengl_renderer::Update_Lights( light_array const &Lights ) { 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; } if( count == 0 ) { return; }
auto renderlight = m_lights.begin(); auto renderlight = m_lights.begin();
@@ -86,9 +86,9 @@ opengl_renderer::Update_Lights( light_array const &Lights ) {
void void
opengl_renderer::Disable_Lights() { 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 );
} }
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -9,14 +9,14 @@ http://mozilla.org/MPL/2.0/.
#pragma once #pragma once
#include "gl/glew.h" #include "GL/glew.h"
#include "texture.h" #include "texture.h"
#include "lightarray.h" #include "lightarray.h"
#include "dumb3d.h" #include "dumb3d.h"
struct opengl_light { struct opengl_light {
GLuint id{ -1 }; GLuint id{ (GLuint)-1 };
Math3D::vector3 direction; Math3D::vector3 direction;
GLfloat position[ 4 ]; // 4th parameter specifies directional(0) or omni-directional(1) light source GLfloat position[ 4 ]; // 4th parameter specifies directional(0) or omni-directional(1) light source
GLfloat ambient[ 4 ]; GLfloat ambient[ 4 ];
@@ -42,7 +42,7 @@ struct opengl_light {
glLightfv( id, GL_POSITION, position ); glLightfv( id, GL_POSITION, position );
if( position[ 3 ] == 1.0f ) { 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 ); glLightfv( id, GL_SPOT_DIRECTION, directionarray );
} }
} }

View File

@@ -45,9 +45,9 @@ private:
std::vector<std::uint16_t> m_indices; std::vector<std::uint16_t> m_indices;
// std::vector<float3> m_normals; // std::vector<float3> m_normals;
std::vector<float3> m_colours; std::vector<float3> m_colours;
GLuint m_vertexbuffer{ -1 }; GLuint m_vertexbuffer{ (GLuint)-1 };
GLuint m_indexbuffer{ -1 }; GLuint m_indexbuffer{ (GLuint)-1 };
GLuint m_coloursbuffer{ -1 }; GLuint m_coloursbuffer{ (GLuint)-1 };
static float m_distributionluminance[ 5 ][ 2 ]; static float m_distributionluminance[ 5 ][ 2 ];
static float m_distributionxcomp[ 5 ][ 2 ]; static float m_distributionxcomp[ 5 ][ 2 ];

136
sn_utils.cpp Normal file
View File

@@ -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<double>::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<uint16_t&>(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<uint32_t&>(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<int32_t&>(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<float&>(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<double&>(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<uint32_t&>(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<uint64_t&>(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);
}

23
sn_utils.h Normal file
View File

@@ -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 <string>
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);
};

View File

@@ -18,12 +18,14 @@
#endif // _DEBUG #endif // _DEBUG
#endif #endif
// operating system // operating system
#ifdef _WINDOWS
#include "targetver.h" #include "targetver.h"
#define NOMINMAX #define NOMINMAX
#include <windows.h> #include <windows.h>
#include <shlobj.h> #include <shlobj.h>
#undef NOMINMAX #undef NOMINMAX
#include <dbghelp.h> #include <dbghelp.h>
#endif
// stl // stl
#include <cstdlib> #include <cstdlib>
#include <cassert> #include <cassert>
@@ -65,4 +67,5 @@
#define GLFW_DLL #define GLFW_DLL
#endif #endif
#define GLFW_INCLUDE_GLU #define GLFW_INCLUDE_GLU
//m7todo: jest tu bo nie chcia³o mi siê wpychaæ do wszystkich plików
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>

4
sun.h
View File

@@ -1,8 +1,8 @@
#pragma once #pragma once
#include "windows.h" #include "windows.h"
#include "gl/glew.h" #include "GL/glew.h"
#include "gl/wglew.h" #include "GL/wglew.h"
#include "dumb3d.h" #include "dumb3d.h"

72
windows.cpp Normal file
View File

@@ -0,0 +1,72 @@
#include "stdafx.h"
#include "World.h"
#include "usefull.h"
#pragma warning (disable: 4091)
#include <dbghelp.h>
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 );
};