mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-23 14:29:18 +02:00
milek7's branch merge; model file serialization, 64bit compatibility
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -69,3 +69,5 @@ bin/
|
||||
ipch/
|
||||
ref/
|
||||
*.aps
|
||||
|
||||
builds/
|
||||
@@ -423,9 +423,9 @@ TAnimModel::TAnimModel()
|
||||
}
|
||||
vAngle.x = vAngle.y = vAngle.z = 0.0; // zerowanie obrotów egzemplarza
|
||||
pAdvanced = NULL; // nie ma zaawansowanej animacji
|
||||
fDark = 0.25; // standardowy próg zaplania
|
||||
fOnTime = 0.66;
|
||||
fOffTime = fOnTime + 0.66;
|
||||
fDark = 0.25f; // standardowy próg zaplania
|
||||
fOnTime = 0.66f;
|
||||
fOffTime = fOnTime + 0.66f;
|
||||
}
|
||||
|
||||
TAnimModel::~TAnimModel()
|
||||
@@ -546,7 +546,7 @@ TAnimContainer * TAnimModel::GetContainer(char *pName)
|
||||
TAnimContainer *pCurrent;
|
||||
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
|
||||
// if (pCurrent->GetName()==pName)
|
||||
if (stricmp(pCurrent->NameGet(), pName) == 0)
|
||||
if (std::string(pName) == pCurrent->NameGet())
|
||||
return pCurrent;
|
||||
return AddContainer(pName);
|
||||
}
|
||||
@@ -587,7 +587,7 @@ void TAnimModel::RaPrepare()
|
||||
if (LightsOff[i])
|
||||
LightsOff[i]->iVisible = !state;
|
||||
}
|
||||
TSubModel::iInstance = (int)this; //żeby nie robić cudzych animacji
|
||||
TSubModel::iInstance = (size_t)this; //żeby nie robić cudzych animacji
|
||||
TSubModel::pasText = &asText; // przekazanie tekstu do wyświetlacza (!!!! do przemyślenia)
|
||||
if (pAdvanced) // jeśli jest zaawansowana animacja
|
||||
Advanced(); // wykonać co tam trzeba
|
||||
|
||||
@@ -81,9 +81,9 @@ class TAnimContainer
|
||||
// std::string(pSubModel?pSubModel->asName.c_str():""); };
|
||||
// std::string inline GetName() { return std::string(pSubModel?pSubModel->pName:"");
|
||||
// };
|
||||
char * NameGet()
|
||||
std::string NameGet()
|
||||
{
|
||||
return (pSubModel ? pSubModel->pName : NULL);
|
||||
return (pSubModel ? pSubModel->pName : "");
|
||||
};
|
||||
// void SetRotateAnim(vector3 vNewRotateAxis, double fNewDesiredAngle, double
|
||||
// fNewRotateSpeed, bool bResetAngle=false);
|
||||
|
||||
107
CMakeLists.txt
Normal file
107
CMakeLists.txt
Normal 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})
|
||||
75
CMake_modules/FindGLFW3.cmake
Normal file
75
CMake_modules/FindGLFW3.cmake
Normal 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)
|
||||
@@ -86,8 +86,8 @@ void TCamera::Update()
|
||||
if (Console::Pressed(Global::Keys[k_MechBackward]))
|
||||
Velocity.z += a;
|
||||
// gora-dol
|
||||
// if (Console::Pressed(VK_NUMPAD9)) Pos.y+=0.1;
|
||||
// if (Console::Pressed(VK_NUMPAD3)) Pos.y-=0.1;
|
||||
// if (Console::Pressed(GLFW_KEY_KP_9)) Pos.y+=0.1;
|
||||
// if (Console::Pressed(GLFW_KEY_KP_3)) Pos.y-=0.1;
|
||||
|
||||
// McZapkie: zeby nie hustalo przy malym FPS:
|
||||
// Velocity= (Velocity+OldVelocity)/2;
|
||||
|
||||
@@ -83,7 +83,7 @@ public static Int32 GetScreenSaverTimeout()
|
||||
TKeyTrans Console::ktTable[4 * 256];
|
||||
|
||||
// Ra: do poprawienia
|
||||
void SetLedState(char Code, bool bOn){
|
||||
void SetLedState(unsigned char Code, bool bOn){
|
||||
// Ra: bajer do migania LED-ami w klawiaturze
|
||||
// NOTE: disabled for the time being
|
||||
// TODO: find non Borland specific equivalent, or get rid of it
|
||||
@@ -244,7 +244,7 @@ void Console::BitsUpdate(int mask)
|
||||
{
|
||||
case 1: // sterowanie światełkami klawiatury: CA/SHP+opory
|
||||
if (mask & 3) // gdy SHP albo CA
|
||||
SetLedState(VK_CAPITAL, iBits & 3);
|
||||
SetLedState(VK_CAPITAL, (iBits & 3) != 0);
|
||||
if (mask & 4) // gdy jazda na oporach
|
||||
{ // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny
|
||||
SetLedState(VK_SCROLL, true); // przyciśnięty
|
||||
@@ -254,7 +254,7 @@ void Console::BitsUpdate(int mask)
|
||||
break;
|
||||
case 2: // sterowanie światełkami klawiatury: CA+SHP
|
||||
if (mask & 2) // gdy CA
|
||||
SetLedState(VK_CAPITAL, iBits & 2);
|
||||
SetLedState(VK_CAPITAL, (iBits & 2) != 0);
|
||||
if (mask & 1) // gdy SHP
|
||||
{ // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny
|
||||
SetLedState(VK_SCROLL, true); // przyciśnięty
|
||||
|
||||
@@ -45,7 +45,7 @@ bool TLPT::Connect(int port)
|
||||
case 0xBD00:
|
||||
OutPort(address + 0x006, 0); // 0xBC06? czysta improwizacja
|
||||
}
|
||||
return bool(OutPort);
|
||||
return OutPort != 0;
|
||||
};
|
||||
|
||||
void TLPT::Out(int x)
|
||||
|
||||
@@ -189,7 +189,6 @@ bool TMWDComm::ReadData() // odbieranie danych + odczyta danych analogowych i za
|
||||
bool TMWDComm::SendData() // wysyłanie danych
|
||||
{
|
||||
DWORD bytes_write;
|
||||
DWORD fdwEvtMask;
|
||||
|
||||
WriteFile(hComm, &WriteDataBuff[0], BYTETOWRITE, &bytes_write, NULL);
|
||||
|
||||
|
||||
@@ -70,7 +70,6 @@ bool TPoKeys55::Connect()
|
||||
PBYTE PropertyValueBuffer;
|
||||
bool MatchFound;
|
||||
DWORD ErrorStatus;
|
||||
HDEVINFO hDevInfo;
|
||||
std::string DeviceIDFromRegistry;
|
||||
std::string DeviceIDToFind = "Vid_1dc3&Pid_1001&Rev_1000&MI_01";
|
||||
// First populate a list of plugged in devices (by specifying "DIGCF_PRESENT"), which are of the
|
||||
|
||||
Binary file not shown.
@@ -260,8 +260,8 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
|
||||
}
|
||||
if (iFlags & spSwitch) // jeśli odcinek zmienny
|
||||
{
|
||||
if (bool(trTrack->GetSwitchState() & 1) !=
|
||||
bool(iFlags & spSwitchStatus)) // czy stan się zmienił?
|
||||
if (((trTrack->GetSwitchState() & 1) != 0) !=
|
||||
((iFlags & spSwitchStatus) != 0)) // czy stan się zmienił?
|
||||
{ // Ra: zakładam, że są tylko 2 możliwe stany
|
||||
iFlags ^= spSwitchStatus;
|
||||
// fVelNext=trTrack->VelocityGet(); //nowa prędkość
|
||||
@@ -389,7 +389,7 @@ void TSpeedPos::Set(TTrack *track, double dist, int flag)
|
||||
fVelNext = (trTrack->iCategoryFlag & 1) ?
|
||||
0.0 :
|
||||
20.0; // jeśli koniec, to pociąg stój, a samochód zwolnij
|
||||
vPos = (bool(iFlags & spReverse) != bool(iFlags & spEnd)) ?
|
||||
vPos = (((iFlags & spReverse) != 0) != ((iFlags & spEnd) != 0)) ?
|
||||
trTrack->CurrentSegment()->FastGetPoint_1() :
|
||||
trTrack->CurrentSegment()->FastGetPoint_0();
|
||||
}
|
||||
|
||||
59
DynObj.cpp
59
DynObj.cpp
@@ -43,7 +43,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
// vector3 vWorldLeft=CrossProduct(vWorldUp,vWorldFront);
|
||||
|
||||
#define M_2PI 6.283185307179586476925286766559;
|
||||
const float maxrot = (M_PI / 3.0); // 60°
|
||||
const float maxrot = (float)(M_PI / 3.0); // 60°
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
void TAnimPant::AKP_4E()
|
||||
@@ -65,13 +65,13 @@ void TAnimPant::AKP_4E()
|
||||
PantWys = fLenL1 * sin(fAngleL) + fLenU1 * sin(fAngleU) + fHeight; // wysokość początkowa
|
||||
PantTraction = PantWys;
|
||||
hvPowerWire = NULL;
|
||||
fWidthExtra = 0.381; //(2.032m-1.027)/2
|
||||
fWidthExtra = 0.381f; //(2.032m-1.027)/2
|
||||
// poza obszarem roboczym jest aproksymacja łamaną o 5 odcinkach
|
||||
fHeightExtra[0] = 0.0; //+0.0762
|
||||
fHeightExtra[1] = -0.01; //+0.1524
|
||||
fHeightExtra[2] = -0.03; //+0.2286
|
||||
fHeightExtra[3] = -0.07; //+0.3048
|
||||
fHeightExtra[4] = -0.15; //+0.3810
|
||||
fHeightExtra[0] = 0.0f; //+0.0762
|
||||
fHeightExtra[1] = -0.01f; //+0.1524
|
||||
fHeightExtra[2] = -0.03f; //+0.2286
|
||||
fHeightExtra[3] = -0.07f; //+0.3048
|
||||
fHeightExtra[4] = -0.15f; //+0.3810
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
int TAnim::TypeSet(int i, int fl)
|
||||
@@ -1168,7 +1168,6 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir,
|
||||
if( false == Track->Dynamics.empty() )
|
||||
#endif
|
||||
{ // sens szukania na tym torze jest tylko, gdy są na nim pojazdy
|
||||
double ObjTranslation; // pozycja najblizszego obiektu na torze
|
||||
double MyTranslation; // pozycja szukającego na torze
|
||||
double MinDist = Track->Length(); // najmniejsza znaleziona odleglość
|
||||
// (zaczynamy od długości toru)
|
||||
@@ -1888,11 +1887,11 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
|
||||
// dodatkowe parametry yB
|
||||
MoreParams += "."; // wykonuje o jedną iterację za mało, więc trzeba mu dodać
|
||||
// kropkę na koniec
|
||||
int kropka = MoreParams.find("."); // znajdź kropke
|
||||
size_t kropka = MoreParams.find("."); // znajdź kropke
|
||||
std::string ActPar; // na parametry
|
||||
while (kropka != std::string::npos) // jesli sa kropki jeszcze
|
||||
{
|
||||
int dlugosc = MoreParams.length();
|
||||
size_t dlugosc = MoreParams.length();
|
||||
ActPar = ToUpper(MoreParams.substr(0, kropka)); // pierwszy parametr;
|
||||
MoreParams = MoreParams.substr(kropka + 1, dlugosc - kropka); // reszta do dalszej
|
||||
// obrobki
|
||||
@@ -2153,8 +2152,8 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
|
||||
iNumAxles = 2;
|
||||
// McZapkie-090402: odleglosc miedzy czopami skretu lub osiami
|
||||
fAxleDist = Max0R(MoverParameters->BDist, MoverParameters->ADist);
|
||||
if (fAxleDist < 0.2)
|
||||
fAxleDist = 0.2; //żeby się dało wektory policzyć
|
||||
if (fAxleDist < 0.2f)
|
||||
fAxleDist = 0.2f; //żeby się dało wektory policzyć
|
||||
if (fAxleDist > MoverParameters->Dim.L - 0.2) // nie mogą być za daleko
|
||||
fAxleDist = MoverParameters->Dim.L - 0.2; // bo będzie "walenie w mur"
|
||||
double fAxleDistHalf = fAxleDist * 0.5;
|
||||
@@ -2264,18 +2263,18 @@ void TDynamicObject::Move(double fDistance)
|
||||
}
|
||||
if (fDistance > 0.0)
|
||||
{ // gdy ruch w stronę sprzęgu 0, doliczyć korektę do osi 1
|
||||
bEnabled &= Axle0.Move(fDistance, !iAxleFirst); // oś z przodu pojazdu
|
||||
bEnabled &= Axle1.Move(fDistance /*-fAdjustment*/, iAxleFirst); // oś z tyłu pojazdu
|
||||
bEnabled &= Axle0.Move(fDistance, iAxleFirst == 0); // oś z przodu pojazdu
|
||||
bEnabled &= Axle1.Move(fDistance /*-fAdjustment*/, iAxleFirst != 0); // oś z tyłu pojazdu
|
||||
}
|
||||
else if (fDistance < 0.0)
|
||||
{ // gdy ruch w stronę sprzęgu 1, doliczyć korektę do osi 0
|
||||
bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oś z tyłu pojazdu prusza się pierwsza
|
||||
bEnabled &= Axle0.Move(fDistance /*-fAdjustment*/, !iAxleFirst); // oś z przodu pojazdu
|
||||
bEnabled &= Axle1.Move(fDistance, iAxleFirst != 0); // oś z tyłu pojazdu prusza się pierwsza
|
||||
bEnabled &= Axle0.Move(fDistance /*-fAdjustment*/, iAxleFirst == 0); // oś z przodu pojazdu
|
||||
}
|
||||
else // gf: bez wywolania Move na postoju nie ma event0
|
||||
{
|
||||
bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oś z tyłu pojazdu prusza się pierwsza
|
||||
bEnabled &= Axle0.Move(fDistance, !iAxleFirst); // oś z przodu pojazdu
|
||||
bEnabled &= Axle1.Move(fDistance, iAxleFirst != 0); // oś z tyłu pojazdu prusza się pierwsza
|
||||
bEnabled &= Axle0.Move(fDistance, iAxleFirst == 0); // oś z przodu pojazdu
|
||||
}
|
||||
if (fDistance != 0.0) // nie liczyć ponownie, jeśli stoi
|
||||
{ // liczenie pozycji pojazdu tutaj, bo jest używane w wielu miejscach
|
||||
@@ -2353,10 +2352,10 @@ void TDynamicObject::Move(double fDistance)
|
||||
switch (t0->eEnvironment)
|
||||
{ // typ zmiany oświetlenia
|
||||
case e_canyon:
|
||||
fShade = 0.65;
|
||||
fShade = 0.65f;
|
||||
break; // zacienienie w kanionie
|
||||
case e_tunnel:
|
||||
fShade = 0.20;
|
||||
fShade = 0.20f;
|
||||
break; // zacienienie w tunelu
|
||||
}
|
||||
}
|
||||
@@ -3116,7 +3115,6 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
ResetdMoveLen();
|
||||
// McZapkie-260202
|
||||
// tupot mew, tfu, stukot kol:
|
||||
DWORD stat;
|
||||
// taka prowizorka zeby sciszyc stukot dalekiej lokomotywy
|
||||
double ObjectDist;
|
||||
double vol = 0;
|
||||
@@ -3735,7 +3733,7 @@ void TDynamicObject::Render()
|
||||
|
||||
if (renderme)
|
||||
{
|
||||
TSubModel::iInstance = (int)this; //żeby nie robić cudzych animacji
|
||||
TSubModel::iInstance = (size_t)this; //żeby nie robić cudzych animacji
|
||||
// AnsiString asLoadName="";
|
||||
double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition) / Global::ZoomFactor;
|
||||
ABuLittleUpdate(ObjSqrDist); // ustawianie zmiennych submodeli dla wspólnego modelu
|
||||
@@ -3863,8 +3861,8 @@ void TDynamicObject::Render()
|
||||
{
|
||||
for (int li = 0; li < 3; li++)
|
||||
{
|
||||
diffuseCabLight[li] *= 0.6;
|
||||
specularCabLight[li] *= 0.7;
|
||||
diffuseCabLight[li] *= 0.6f;
|
||||
specularCabLight[li] *= 0.7f;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -3872,9 +3870,9 @@ void TDynamicObject::Render()
|
||||
{
|
||||
for (int li = 0; li < 3; li++)
|
||||
{
|
||||
ambientCabLight[li] *= 0.3;
|
||||
diffuseCabLight[li] *= 0.1;
|
||||
specularCabLight[li] *= 0.2;
|
||||
ambientCabLight[li] *= 0.3f;
|
||||
diffuseCabLight[li] *= 0.1f;
|
||||
specularCabLight[li] *= 0.2f;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -4280,7 +4278,7 @@ void TDynamicObject::RenderAlpha()
|
||||
{ // rysowanie elementów półprzezroczystych
|
||||
if (renderme)
|
||||
{
|
||||
TSubModel::iInstance = (int)this; //żeby nie robić cudzych animacji
|
||||
TSubModel::iInstance = (size_t)this; //żeby nie robić cudzych animacji
|
||||
double ObjSqrDist = SquareMagnitude(Global::pCameraPosition - vPosition);
|
||||
ABuLittleUpdate(ObjSqrDist); // ustawianie zmiennych submodeli dla wspólnego modelu
|
||||
glPushMatrix();
|
||||
@@ -4689,7 +4687,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
||||
|
||||
else if (token == "animwheelprefix:") {
|
||||
// prefiks kręcących się kół
|
||||
int i, j, k, m;
|
||||
int i, k, m;
|
||||
unsigned int j;
|
||||
parser.getTokens( 1, false ); parser >> token;
|
||||
for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // liczba osi
|
||||
{ // McZapkie-050402: wyszukiwanie kol o nazwie str*
|
||||
@@ -5073,7 +5072,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
||||
|
||||
else if( token == "animdoorprefix:" ) {
|
||||
// nazwa animowanych drzwi
|
||||
int i, j, k, m;
|
||||
int i, j;
|
||||
parser.getTokens(1, false); parser >> token;
|
||||
for (i = 0, j = 0; i < ANIM_DOORS; ++i)
|
||||
j += iAnimType[i]; // zliczanie wcześniejszych animacji
|
||||
|
||||
144
EU07.bpr
144
EU07.bpr
@@ -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"" -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
162
EU07.cpp
@@ -18,8 +18,8 @@ Stele, firleju, szociu, hunter, ZiomalCl, OLI_EU and others
|
||||
*/
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
#include <dsound.h> //_clear87() itp.
|
||||
#include <png.h>
|
||||
#include <thread>
|
||||
|
||||
#include "Globals.h"
|
||||
#include "Logs.h"
|
||||
@@ -44,19 +44,57 @@ Stele, firleju, szociu, hunter, ZiomalCl, OLI_EU and others
|
||||
#endif
|
||||
|
||||
TWorld World;
|
||||
PCOPYDATASTRUCT pDane;
|
||||
|
||||
void 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)
|
||||
{
|
||||
Global::ScreenWidth = w;
|
||||
Global::ScreenHeight = h;
|
||||
::glViewport( 0, 0, w, h );
|
||||
glViewport(0, 0, w, h);
|
||||
}
|
||||
|
||||
void cursor_pos_callback(GLFWwindow *window, double x, double y)
|
||||
{
|
||||
World.OnMouseMove(x * 0.005, y * 0.01);
|
||||
::glfwSetCursorPos( window, 0.0, 0.0 );
|
||||
glfwSetCursorPos(window, 0.0, 0.0);
|
||||
}
|
||||
|
||||
void key_callback( GLFWwindow *window, int key, int scancode, int action, int mods )
|
||||
@@ -80,6 +118,9 @@ void key_callback( GLFWwindow *window, int key, int scancode, int action, int mo
|
||||
|
||||
switch( key )
|
||||
{
|
||||
case GLFW_KEY_F11:
|
||||
make_screenshot();
|
||||
break;
|
||||
case GLFW_KEY_ESCAPE: {
|
||||
|
||||
if( ( DebugModeFlag ) //[Esc] pauzuje tylko bez Debugmode
|
||||
@@ -128,84 +169,19 @@ void focus_callback( GLFWwindow *window, int focus )
|
||||
}
|
||||
|
||||
#ifdef _WINDOWS
|
||||
|
||||
extern "C"
|
||||
{
|
||||
GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);
|
||||
}
|
||||
|
||||
HWND Hwnd;
|
||||
WNDPROC BaseWindowProc;
|
||||
|
||||
LRESULT APIENTRY WndProc( HWND hWnd, // handle for this window
|
||||
UINT uMsg, // message for this window
|
||||
WPARAM wParam, // additional message information
|
||||
LPARAM lParam) // additional message information
|
||||
{
|
||||
switch( uMsg ) // check for windows messages
|
||||
{
|
||||
case WM_COPYDATA: {
|
||||
// obsługa danych przesłanych przez program sterujący
|
||||
pDane = (PCOPYDATASTRUCT)lParam;
|
||||
if( pDane->dwData == MAKE_ID4( 'E', 'U', '0', '7' ) ) // sygnatura danych
|
||||
World.OnCommandGet( (DaneRozkaz *)( pDane->lpData ) );
|
||||
break;
|
||||
}
|
||||
}
|
||||
// pass all unhandled messages to DefWindowProc
|
||||
return CallWindowProc( BaseWindowProc, Hwnd, uMsg, wParam, lParam );
|
||||
};
|
||||
|
||||
void make_minidump( ::EXCEPTION_POINTERS* e ) {
|
||||
|
||||
auto hDbgHelp = ::LoadLibraryA( "dbghelp" );
|
||||
if( hDbgHelp == nullptr )
|
||||
return;
|
||||
auto pMiniDumpWriteDump = (decltype( &MiniDumpWriteDump ))::GetProcAddress( hDbgHelp, "MiniDumpWriteDump" );
|
||||
if( pMiniDumpWriteDump == nullptr )
|
||||
return;
|
||||
|
||||
char name[ MAX_PATH ];
|
||||
{
|
||||
auto nameEnd = name + ::GetModuleFileNameA( ::GetModuleHandleA( 0 ), name, MAX_PATH );
|
||||
::SYSTEMTIME t;
|
||||
::GetSystemTime( &t );
|
||||
wsprintfA( nameEnd - strlen( ".exe" ),
|
||||
"_crashdump_%4d%02d%02d_%02d%02d%02d.dmp",
|
||||
t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond );
|
||||
}
|
||||
|
||||
auto hFile = ::CreateFileA( name, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 );
|
||||
if( hFile == INVALID_HANDLE_VALUE )
|
||||
return;
|
||||
|
||||
::MINIDUMP_EXCEPTION_INFORMATION exceptionInfo;
|
||||
exceptionInfo.ThreadId = ::GetCurrentThreadId();
|
||||
exceptionInfo.ExceptionPointers = e;
|
||||
exceptionInfo.ClientPointers = FALSE;
|
||||
|
||||
auto dumped = pMiniDumpWriteDump(
|
||||
::GetCurrentProcess(),
|
||||
::GetCurrentProcessId(),
|
||||
hFile,
|
||||
::MINIDUMP_TYPE( ::MiniDumpWithIndirectlyReferencedMemory | ::MiniDumpScanMemory ),
|
||||
e ? &exceptionInfo : nullptr,
|
||||
nullptr,
|
||||
nullptr );
|
||||
|
||||
::CloseHandle( hFile );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
LONG CALLBACK unhandled_handler( ::EXCEPTION_POINTERS* e ) {
|
||||
make_minidump( e );
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
LONG CALLBACK unhandled_handler(::EXCEPTION_POINTERS* e);
|
||||
LRESULT APIENTRY WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
extern HWND Hwnd;
|
||||
extern WNDPROC BaseWindowProc;
|
||||
#endif
|
||||
|
||||
int main( int argc, char *argv[] ) {
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#if defined(_MSC_VER) && defined (_DEBUG)
|
||||
// memory leaks
|
||||
_CrtSetDbgFlag( _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ) | _CRTDBG_LEAK_CHECK_DF );
|
||||
@@ -227,17 +203,20 @@ int main( int argc, char *argv[] ) {
|
||||
Global::InitKeys();
|
||||
|
||||
// hunter-271211: ukrywanie konsoli
|
||||
if( Global::iWriteLogEnabled & 2 ) {
|
||||
if( Global::iWriteLogEnabled & 2 )
|
||||
{
|
||||
AllocConsole();
|
||||
SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN );
|
||||
}
|
||||
|
||||
for( int i = 1; i < argc; i++ ) {
|
||||
for (int i = 1; i < argc; ++i)
|
||||
{
|
||||
std::string token(argv[i]);
|
||||
|
||||
if (token == "-modifytga")
|
||||
Global::iModifyTGA = -1;
|
||||
else if( token == "-e3d" ) {
|
||||
else if (token == "-e3d")
|
||||
{
|
||||
if (Global::iConvertModels > 0)
|
||||
Global::iConvertModels = -Global::iConvertModels;
|
||||
else
|
||||
@@ -245,12 +224,14 @@ int main( int argc, char *argv[] ) {
|
||||
}
|
||||
else if (i + 1 < argc && token == "-s")
|
||||
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::transform(v.begin(), v.end(), v.begin(), ::tolower);
|
||||
Global::asHumanCtrlVehicle = v;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
std::cout << "usage: " << std::string(argv[0]) << " [-s sceneryfilepath] "
|
||||
<< "[-v vehiclename] [-modifytga] [-e3d]" << std::endl;
|
||||
return -1;
|
||||
@@ -270,7 +251,8 @@ int main( int argc, char *argv[] ) {
|
||||
glfwWindowHint(GLFW_AUTO_ICONIFY, GLFW_FALSE);
|
||||
glfwWindowHint(GLFW_SAMPLES, 1 << Global::iMultisampling);
|
||||
|
||||
if( Global::bFullScreen ) {
|
||||
if (Global::bFullScreen)
|
||||
{
|
||||
// match screen dimensions with selected monitor, for 'borderless window' in fullscreen mode
|
||||
Global::iWindowWidth = vmode->width;
|
||||
Global::iWindowHeight = vmode->height;
|
||||
@@ -280,12 +262,13 @@ int main( int argc, char *argv[] ) {
|
||||
glfwCreateWindow( Global::iWindowWidth, Global::iWindowHeight,
|
||||
"EU07", Global::bFullScreen ? monitor : nullptr, nullptr );
|
||||
|
||||
if( !window ) {
|
||||
if (!window)
|
||||
{
|
||||
std::cout << "failed to create window" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
glfwMakeContextCurrent(window);
|
||||
glfwSwapInterval( (Global::VSync ? 1 : 0) ); //vsync
|
||||
glfwSwapInterval(Global::VSync ? 1 : 0); //vsync
|
||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); //capture cursor
|
||||
glfwSetCursorPos(window, 0.0, 0.0);
|
||||
glfwSetFramebufferSizeCallback(window, window_resize_callback);
|
||||
@@ -298,7 +281,8 @@ int main( int argc, char *argv[] ) {
|
||||
window_resize_callback(window, width, height);
|
||||
}
|
||||
|
||||
if( glewInit() != GLEW_OK ) {
|
||||
if (glewInit() != GLEW_OK)
|
||||
{
|
||||
std::cout << "failed to init GLEW" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
@@ -306,7 +290,7 @@ int main( int argc, char *argv[] ) {
|
||||
#ifdef _WINDOWS
|
||||
// setup wrapper for base glfw window proc, to handle copydata messages
|
||||
Hwnd = glfwGetWin32Window( window );
|
||||
BaseWindowProc = (WNDPROC)::SetWindowLongPtr( Hwnd, GWLP_WNDPROC, (LONG)WndProc );
|
||||
BaseWindowProc = (WNDPROC)::SetWindowLongPtr( Hwnd, GWLP_WNDPROC, (LONG_PTR)WndProc );
|
||||
// switch off the topmost flag
|
||||
::SetWindowPos( Hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
|
||||
#endif
|
||||
@@ -314,7 +298,8 @@ int main( int argc, char *argv[] ) {
|
||||
GfxRenderer.Init();
|
||||
|
||||
Global::pWorld = &World; // Ra: wskaźnik potrzebny do usuwania pojazdów
|
||||
if( !World.Init( window ) ) {
|
||||
if (!World.Init(window))
|
||||
{
|
||||
std::cout << "failed to init TWorld" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
@@ -335,7 +320,8 @@ int main( int argc, char *argv[] ) {
|
||||
} // po zrobieniu E3D odpalamy normalnie scenerię, by ją zobaczyć
|
||||
|
||||
Console::On(); // włączenie konsoli
|
||||
while( !glfwWindowShouldClose( window ) && World.Update() ) {
|
||||
while (!glfwWindowShouldClose(window) && World.Update())
|
||||
{
|
||||
glfwSwapBuffers(window);
|
||||
glfwPollEvents();
|
||||
}
|
||||
|
||||
@@ -142,7 +142,6 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
||||
{
|
||||
int i;
|
||||
int ti;
|
||||
double tf;
|
||||
std::string token;
|
||||
//string str;
|
||||
char *ptr;
|
||||
|
||||
19
Float3d.cpp
19
Float3d.cpp
@@ -9,9 +9,28 @@ http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "float3d.h"
|
||||
#include "sn_utils.h"
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void float4x4::deserialize_float32(std::istream &s)
|
||||
{
|
||||
for (size_t i = 0; i < 16; i++)
|
||||
e[i] = sn_utils::ld_float32(s);
|
||||
}
|
||||
|
||||
void float4x4::deserialize_float64(std::istream &s)
|
||||
{
|
||||
for (size_t i = 0; i < 16; i++)
|
||||
e[i] = (float)sn_utils::ld_float64(s);
|
||||
}
|
||||
|
||||
void float4x4::serialize_float32(std::ostream &s)
|
||||
{
|
||||
for (size_t i = 0; i < 16; i++)
|
||||
sn_utils::ls_float32(s, e[i]);
|
||||
}
|
||||
|
||||
void float4x4::Quaternion(float4 *q)
|
||||
{ // konwersja kwaternionu obrotu na macierz obrotu
|
||||
float xx = q->x * q->x, yy = q->y * q->y, zz = q->z * q->z;
|
||||
|
||||
15
Float3d.h
15
Float3d.h
@@ -196,9 +196,12 @@ struct float8
|
||||
|
||||
class float4x4
|
||||
{ // macierz transformacji pojedynczej precyzji
|
||||
public:
|
||||
float e[16];
|
||||
|
||||
public:
|
||||
void deserialize_float32(std::istream&);
|
||||
void deserialize_float64(std::istream&);
|
||||
void serialize_float32(std::ostream&);
|
||||
float4x4(void){};
|
||||
float4x4(float f[16])
|
||||
{
|
||||
@@ -292,6 +295,16 @@ inline float4x4 &float4x4::Rotation(double angle, float3 axis)
|
||||
return *this;
|
||||
};
|
||||
|
||||
inline bool operator==(const float4x4& v1, const float4x4& v2)
|
||||
{
|
||||
for (size_t i = 0; i < 16; i++)
|
||||
{
|
||||
if (v1.e[i] != v2.e[i])
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
inline float4x4 operator*(const float4x4 &m1, const float4x4 &m2)
|
||||
{ // iloczyn macierzy
|
||||
float4x4 retVal;
|
||||
|
||||
@@ -60,7 +60,7 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale,
|
||||
do
|
||||
{ // pętla po submodelach potomnych i obracanie ich o kąt zależy od
|
||||
// cyfry w (fValue)
|
||||
if (sm->pName)
|
||||
if (sm->pName.size())
|
||||
{ // musi mieć niepustą nazwę
|
||||
if (sm->pName[0] >= '0')
|
||||
if (sm->pName[0] <= '9')
|
||||
@@ -98,7 +98,7 @@ bool TGauge::Load(cParser &Parser, TModel3d *md1, TModel3d *md2, double mul)
|
||||
Init(sm, gt_Digital, val3, val4, val5);
|
||||
else
|
||||
Init(sm, gt_Rotate, val3, val4, val5);
|
||||
return (md2); // true, gdy podany model zewnętrzny, a w kabinie nie było
|
||||
return md2 != nullptr; // true, gdy podany model zewnętrzny, a w kabinie nie było
|
||||
};
|
||||
|
||||
void TGauge::PermIncValue(double fNewDesired)
|
||||
@@ -176,7 +176,7 @@ void TGauge::Update()
|
||||
if( n.length() > 10 ) { n.erase( 0, n.length() - 10 ); } // also dumb but should work for now
|
||||
do
|
||||
{ // pętla po submodelach potomnych i obracanie ich o kąt zależy od cyfry w (fValue)
|
||||
if( sm->pName ) {
|
||||
if( sm->pName.size() ) {
|
||||
// musi mieć niepustą nazwę
|
||||
if( ( sm->pName[ 0 ] >= '0' )
|
||||
&& ( sm->pName[ 0 ] <= '9' ) ) {
|
||||
|
||||
2
Geom.cpp
2
Geom.cpp
@@ -11,7 +11,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "classes.hpp"
|
||||
#include <gl/gl.h>
|
||||
#include <gl/glu.h>
|
||||
#include "opengl/glut.h"
|
||||
#include "GL/glut.h"
|
||||
#pragma hdrstop
|
||||
|
||||
#include "Texture.h"
|
||||
|
||||
19
Globals.cpp
19
Globals.cpp
@@ -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
|
||||
float Global::SunAngle = 0.0f;
|
||||
int Global::iReCompile = 0; // zwiększany, gdy trzeba odświeżyć siatki
|
||||
GLFWwindow *Global::window;
|
||||
bool Global::shiftState;
|
||||
bool Global::ctrlState;
|
||||
int Global::ScreenWidth = 1;
|
||||
int Global::ScreenHeight = 1;
|
||||
float Global::ZoomFactor = 1.0f;
|
||||
float Global::FieldOfView = 45.0f;
|
||||
GLFWwindow *Global::window;
|
||||
bool Global::shiftState;
|
||||
bool Global::ctrlState;
|
||||
int Global::iCameraLast = -1;
|
||||
std::string Global::asRelease = "16.0.1172.482";
|
||||
std::string Global::asVersion =
|
||||
@@ -94,7 +94,7 @@ std::vector<vector3> Global::FreeCameraInit;
|
||||
std::vector<vector3> Global::FreeCameraInitAngle;
|
||||
double Global::fFogStart = 1700;
|
||||
double Global::fFogEnd = 2000;
|
||||
float Global::Background[3] = {0.2, 0.4, 0.33};
|
||||
float Global::Background[3] = {0.2f, 0.4f, 0.33f};
|
||||
GLfloat Global::AtmoColor[] = {0.423f, 0.702f, 1.0f};
|
||||
GLfloat Global::FogColor[] = {0.6f, 0.7f, 0.8f};
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
@@ -127,8 +127,8 @@ bool Global::bFreeFly = false;
|
||||
bool Global::bFullScreen = false;
|
||||
bool Global::VSync{ true };
|
||||
bool Global::bInactivePause = true; // automatyczna pauza, gdy okno nieaktywne
|
||||
float Global::fMouseXScale = 1.5;
|
||||
float Global::fMouseYScale = 0.2;
|
||||
float Global::fMouseXScale = 1.5f;
|
||||
float Global::fMouseYScale = 0.2f;
|
||||
std::string Global::SceneryFile = "td.scn";
|
||||
std::string Global::asHumanCtrlVehicle = "EU07-424";
|
||||
int Global::iMultiplayer = 0; // blokada działania niektórych funkcji na rzecz komunikacji
|
||||
@@ -495,10 +495,8 @@ void Global::ConfigParse(cParser &Parser)
|
||||
|
||||
Parser.getTokens();
|
||||
Parser >> token;
|
||||
/*
|
||||
|
||||
Global::bUseVBO = (token == "yes");
|
||||
*/
|
||||
Global::bUseVBO = false; // temporarily disabled until render paths are sorted out
|
||||
}
|
||||
else if (token == "feedbackmode")
|
||||
{
|
||||
@@ -967,7 +965,8 @@ void Global::ConfigParse(cParser &Parser)
|
||||
*/
|
||||
}
|
||||
|
||||
void Global::InitKeys() {
|
||||
void Global::InitKeys()
|
||||
{
|
||||
Keys[k_IncMainCtrl] = GLFW_KEY_KP_ADD;
|
||||
Keys[k_IncMainCtrlFAST] = GLFW_KEY_KP_ADD;
|
||||
Keys[k_DecMainCtrl] = GLFW_KEY_KP_SUBTRACT;
|
||||
|
||||
@@ -12,8 +12,8 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include <string>
|
||||
#include <Windows.h>
|
||||
#include "renderer.h"
|
||||
#include "gl/glew.h"
|
||||
#include "glfw/glfw3.h"
|
||||
#include "gl/glew.h"
|
||||
#include "dumb3d.h"
|
||||
|
||||
// definicje klawiszy
|
||||
|
||||
111
Ground.cpp
111
Ground.cpp
@@ -206,8 +206,14 @@ void TGroundNode::InitNormals()
|
||||
}
|
||||
if (Vertices[i].Normal == vector3(0, 0, 0))
|
||||
Vertices[i].Normal = (n1 + n2) / 2;
|
||||
if (i + 1 < iNumVerts)
|
||||
{
|
||||
if (Vertices[i + 1].Normal == vector3(0, 0, 0))
|
||||
Vertices[i + 1].Normal = n2;
|
||||
}
|
||||
else
|
||||
WriteLog("odd number of vertices, normals may be wrong!");
|
||||
|
||||
break;
|
||||
case GL_TRIANGLE_FAN:
|
||||
|
||||
@@ -289,7 +295,6 @@ void TGroundNode::RenderVBO()
|
||||
(iType != TP_EVLAUNCH)) // McZapkie-070602: nie rysuj odleglych obiektow ale sprawdzaj
|
||||
// wyzwalacz zdarzen
|
||||
return;
|
||||
int i, a;
|
||||
switch (iType)
|
||||
{
|
||||
case TP_TRACTION:
|
||||
@@ -359,12 +364,11 @@ void TGroundNode::RenderAlphaVBO()
|
||||
return;
|
||||
if (mgn > fSquareRadius)
|
||||
return;
|
||||
int i, a;
|
||||
#ifdef _PROBLEND
|
||||
if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012
|
||||
{
|
||||
glDisable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.45); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
glAlphaFunc(GL_GREATER, 0.45f); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
};
|
||||
#endif
|
||||
switch (iType)
|
||||
@@ -374,7 +378,7 @@ void TGroundNode::RenderAlphaVBO()
|
||||
{
|
||||
#ifdef _PROBLEND
|
||||
glEnable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.04);
|
||||
glAlphaFunc(GL_GREATER, 0.04f);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
#endif
|
||||
hvTraction->RenderVBO(mgn, iVboPtr);
|
||||
@@ -383,7 +387,7 @@ void TGroundNode::RenderAlphaVBO()
|
||||
case TP_MODEL:
|
||||
#ifdef _PROBLEND
|
||||
glEnable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.04);
|
||||
glAlphaFunc(GL_GREATER, 0.04f);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
#endif
|
||||
Model->RenderAlphaVBO(&pCenter);
|
||||
@@ -411,13 +415,13 @@ void TGroundNode::RenderAlphaVBO()
|
||||
// glEnable(GL_LIGHTING);
|
||||
#ifdef _PROBLEND
|
||||
glEnable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.04);
|
||||
glAlphaFunc(GL_GREATER, 0.04f);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
#endif
|
||||
}
|
||||
#ifdef _PROBLEND
|
||||
glEnable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.04);
|
||||
glAlphaFunc(GL_GREATER, 0.04f);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
#endif
|
||||
return;
|
||||
@@ -427,7 +431,7 @@ void TGroundNode::RenderAlphaVBO()
|
||||
RaRenderVBO();
|
||||
#ifdef _PROBLEND
|
||||
glEnable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.04);
|
||||
glAlphaFunc(GL_GREATER, 0.04f);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
#endif
|
||||
return;
|
||||
@@ -435,7 +439,7 @@ void TGroundNode::RenderAlphaVBO()
|
||||
}
|
||||
#ifdef _PROBLEND
|
||||
glEnable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.04);
|
||||
glAlphaFunc(GL_GREATER, 0.04f);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
#endif
|
||||
return;
|
||||
@@ -574,7 +578,6 @@ void TGroundNode::RenderDL()
|
||||
// obiektow ale sprawdzaj wyzwalacz
|
||||
// zdarzen
|
||||
return;
|
||||
int i, a;
|
||||
switch (iType)
|
||||
{
|
||||
case TP_TRACK:
|
||||
@@ -641,7 +644,6 @@ void TGroundNode::RenderAlphaDL()
|
||||
return;
|
||||
if (mgn > fSquareRadius)
|
||||
return;
|
||||
int i, a;
|
||||
switch (iType)
|
||||
{
|
||||
case TP_TRACTION:
|
||||
@@ -663,7 +665,7 @@ void TGroundNode::RenderAlphaDL()
|
||||
if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012
|
||||
{
|
||||
glDisable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.45); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
glAlphaFunc(GL_GREATER, 0.45f); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
};
|
||||
#endif
|
||||
if (!DisplayListID) //||Global::bReCompile) //Ra: wymuszenie rekompilacji
|
||||
@@ -700,7 +702,7 @@ void TGroundNode::RenderAlphaDL()
|
||||
if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012
|
||||
{
|
||||
glEnable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.04);
|
||||
glAlphaFunc(GL_GREATER, 0.04f);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
};
|
||||
#endif
|
||||
@@ -969,7 +971,7 @@ void TSubRect::Sort()
|
||||
*/
|
||||
//...
|
||||
// przeglądanie listy i tworzenie obiektów renderujących dla danej tekstury
|
||||
GLuint t = 0; // pomocniczy kod tekstury
|
||||
int t = 0; // pomocniczy kod tekstury
|
||||
n1 = nMeshed; // lista obiektów przetwarzanych na statyczne siatki
|
||||
while (n1)
|
||||
{ // dla każdej tekstury powinny istnieć co najmniej dwa obiekty, ale dla DL nie ma to znaczenia
|
||||
@@ -994,7 +996,6 @@ void TSubRect::Sort()
|
||||
|
||||
TTrack * TSubRect::FindTrack(vector3 *Point, int &iConnection, TTrack *Exclude)
|
||||
{ // szukanie toru, którego koniec jest najbliższy (*Point)
|
||||
TTrack *Track;
|
||||
for (int i = 0; i < iTracks; ++i)
|
||||
if (tTracks[i] != Exclude) // można użyć tabelę torów, bo jest mniejsza
|
||||
{
|
||||
@@ -1031,7 +1032,7 @@ void TSubRect::RaAnimate()
|
||||
return; // nie ma nic do animowania
|
||||
if (Global::bUseVBO)
|
||||
{ // odświeżenie VBO sektora
|
||||
if (true == GLEW_VERSION_1_5) // modyfikacje VBO są dostępne od OpenGL 1.5
|
||||
if (GLEW_VERSION_1_5) // modyfikacje VBO są dostępne od OpenGL 1.5
|
||||
glBindBuffer(GL_ARRAY_BUFFER, m_nVBOVertices);
|
||||
else // dla OpenGL 1.4 z GL_ARB_vertex_buffer_object odświeżenie całego sektora
|
||||
Release(); // opróżnienie VBO sektora, aby się odświeżył z nowymi ustawieniami
|
||||
@@ -1592,16 +1593,15 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
{ // wczytanie wpisu typu "node"
|
||||
// parser->LoadTraction=Global::bLoadTraction; //Ra: tu nie potrzeba powtarzać
|
||||
string str, str1, str2, str3, str4, Skin, DriverType, asNodeName;
|
||||
int nv, ti, i, n;
|
||||
double tf, r, rmin, tf1, tf2, tf3, tf4, l, dist, mgn;
|
||||
int int1, int2;
|
||||
bool bError = false, curve;
|
||||
int nv, i;
|
||||
double tf, r, rmin, tf1, tf3;
|
||||
int int1;
|
||||
size_t int2;
|
||||
bool bError = false;
|
||||
vector3 pt, front, up, left, pos, tv;
|
||||
matrix4x4 mat2, mat1, mat;
|
||||
GLuint TexID;
|
||||
TGroundNode *tmp1;
|
||||
TTrack *Track;
|
||||
TTextSound *tmpsound;
|
||||
std::string token;
|
||||
parser->getTokens(2);
|
||||
*parser >> r >> rmin;
|
||||
@@ -1612,7 +1612,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
*parser >> token;
|
||||
str = token;
|
||||
//str = AnsiString(token.c_str());
|
||||
TGroundNode *tmp, *tmp2;
|
||||
TGroundNode *tmp;
|
||||
tmp = new TGroundNode();
|
||||
tmp->asName = (asNodeName == "none" ? string("") : asNodeName);
|
||||
if (r >= 0)
|
||||
@@ -1674,10 +1674,10 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
parser->getTokens(3);
|
||||
*parser >> tmp->hvTraction->NominalVoltage >> tmp->hvTraction->MaxCurrent >>
|
||||
tmp->hvTraction->fResistivity;
|
||||
if (tmp->hvTraction->fResistivity == 0.01) // tyle jest w sceneriach [om/km]
|
||||
tmp->hvTraction->fResistivity = 0.075; // taka sensowniejsza wartość za
|
||||
if (tmp->hvTraction->fResistivity == 0.01f) // tyle jest w sceneriach [om/km]
|
||||
tmp->hvTraction->fResistivity = 0.075f; // taka sensowniejsza wartość za
|
||||
// http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf
|
||||
tmp->hvTraction->fResistivity *= 0.001; // teraz [om/m]
|
||||
tmp->hvTraction->fResistivity *= 0.001f; // teraz [om/m]
|
||||
parser->getTokens();
|
||||
*parser >> token;
|
||||
// Ra 2014-02: a tutaj damy symbol sieci i jej budowę, np.:
|
||||
@@ -1830,7 +1830,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
*parser >> token;
|
||||
str = token;
|
||||
//str = AnsiString(token.c_str());
|
||||
tmp->tsStaticSound = new TTextSound(str, sqrt(tmp->fSquareRadius), tmp->pCenter.x, tmp->pCenter.y, tmp->pCenter.z, false, rmin);
|
||||
tmp->tsStaticSound = new TTextSound(str, sqrt(tmp->fSquareRadius), tmp->pCenter.x, tmp->pCenter.y, tmp->pCenter.z, false, false, rmin);
|
||||
if (rmin < 0.0)
|
||||
rmin =
|
||||
0.0; // przywrócenie poprawnej wartości, jeśli służyła do wyłączenia efektu Dopplera
|
||||
@@ -1860,7 +1860,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
int2 = str4.find("."); // yB: wykorzystuje tutaj zmienna, ktora potem bedzie ladunkiem
|
||||
if (int2 != string::npos) // yB: jesli znalazl kropke, to ja przetwarza jako parametry
|
||||
{
|
||||
int dlugosc = str4.length();
|
||||
size_t dlugosc = str4.length();
|
||||
int1 = atoi(str4.substr(0, int2).c_str()); // niech sprzegiem bedzie do kropki cos
|
||||
str4 = str4.substr(int2 + 1, dlugosc - int2);
|
||||
}
|
||||
@@ -2243,7 +2243,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
/*
|
||||
nv = i;
|
||||
*/
|
||||
nv = TempVerts.size();
|
||||
nv = (int)TempVerts.size();
|
||||
tmp->Init(nv); // utworzenie tablicy wierzchołków
|
||||
tmp->pCenter /= (nv > 0 ? nv : 1);
|
||||
|
||||
@@ -2544,9 +2544,6 @@ bool TGround::Init(std::string File)
|
||||
int OriginStackTop = 0;
|
||||
vector3 OriginStack[OriginStackMaxDepth]; // stos zagnieżdżenia origin
|
||||
|
||||
double tf;
|
||||
int ParamCount, ParamPos;
|
||||
|
||||
// ABu: Jezeli nie ma definicji w scenerii to ustawiane ponizsze wartosci:
|
||||
hh = 10; // godzina startu
|
||||
mm = 30; // minuty startu
|
||||
@@ -3351,7 +3348,7 @@ void TGround::InitTracks()
|
||||
TGroundNode *Current, *Model;
|
||||
TTrack *tmp; // znaleziony tor
|
||||
TTrack *Track;
|
||||
int iConnection, state;
|
||||
int iConnection;
|
||||
string name;
|
||||
// tracks=tracksfar=0;
|
||||
for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext)
|
||||
@@ -3770,7 +3767,7 @@ bool TGround::InitLaunchers()
|
||||
{
|
||||
TGroundNode *Current, *tmp;
|
||||
TEventLauncher *EventLauncher;
|
||||
int i;
|
||||
|
||||
for (Current = nRootOfType[TP_EVLAUNCH]; Current; Current = Current->nNext)
|
||||
{
|
||||
EventLauncher = Current->EvLaunch;
|
||||
@@ -3797,8 +3794,6 @@ bool TGround::InitLaunchers()
|
||||
|
||||
TTrack * TGround::FindTrack(vector3 Point, int &iConnection, TGroundNode *Exclude)
|
||||
{ // wyszukiwanie innego toru kończącego się w (Point)
|
||||
TTrack *Track;
|
||||
TGroundNode *Current;
|
||||
TTrack *tmp;
|
||||
iConnection = -1;
|
||||
TSubRect *sr;
|
||||
@@ -3845,8 +3840,6 @@ TTrack * TGround::FindTrack(vector3 Point, int &iConnection, TGroundNode *Exclud
|
||||
|
||||
TTraction * TGround::FindTraction(vector3 *Point, int &iConnection, TGroundNode *Exclude)
|
||||
{ // wyszukiwanie innego przęsła kończącego się w (Point)
|
||||
TTraction *Traction;
|
||||
TGroundNode *Current;
|
||||
TTraction *tmp;
|
||||
iConnection = -1;
|
||||
TSubRect *sr;
|
||||
@@ -4314,7 +4307,7 @@ bool TGround::CheckQuery()
|
||||
for (i = 0; i < 8; ++i)
|
||||
{ // dodawane do kolejki w kolejności zapisania
|
||||
if (tmpEvent->Params[i].asEvent)
|
||||
if (bCondition != bool(tmpEvent->iFlags & (conditional_else << i)))
|
||||
if (bCondition != (((tmpEvent->iFlags & (conditional_else << i)) != 0)))
|
||||
{
|
||||
if (tmpEvent->Params[i].asEvent != tmpEvent)
|
||||
AddToQuery(tmpEvent->Params[i].asEvent,
|
||||
@@ -4856,11 +4849,10 @@ TGround::Render( Math3D::vector3 const &Camera ) {
|
||||
bool TGround::RenderDL(vector3 pPosition)
|
||||
{ // renderowanie scenerii z Display List - faza nieprzezroczystych
|
||||
glDisable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.45); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
glAlphaFunc(GL_GREATER, 0.45f); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
++TGroundRect::iFrameNumber; // zwięszenie licznika ramek (do usuwniania nadanimacji)
|
||||
CameraDirection.x = sin(Global::pCameraRotation); // wektor kierunkowy
|
||||
CameraDirection.z = cos(Global::pCameraRotation);
|
||||
int tr, tc;
|
||||
TGroundNode *node;
|
||||
glColor3f(1.0f, 1.0f, 1.0f);
|
||||
glEnable(GL_LIGHTING);
|
||||
@@ -4917,7 +4909,7 @@ bool TGround::RenderDL(vector3 pPosition)
|
||||
bool TGround::RenderAlphaDL(vector3 pPosition)
|
||||
{ // renderowanie scenerii z Display List - faza przezroczystych
|
||||
glEnable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.04); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
glAlphaFunc(GL_GREATER, 0.04f); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
TGroundNode *node;
|
||||
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
TSubRect *tmp;
|
||||
@@ -4946,11 +4938,10 @@ bool TGround::RenderAlphaDL(vector3 pPosition)
|
||||
bool TGround::RenderVBO(vector3 pPosition)
|
||||
{ // renderowanie scenerii z VBO - faza nieprzezroczystych
|
||||
glDisable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.45); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
glAlphaFunc(GL_GREATER, 0.45f); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
++TGroundRect::iFrameNumber; // zwięszenie licznika ramek
|
||||
CameraDirection.x = sin(Global::pCameraRotation); // wektor kierunkowy
|
||||
CameraDirection.z = cos(Global::pCameraRotation);
|
||||
int tr, tc;
|
||||
TGroundNode *node;
|
||||
glColor3f(1.0f, 1.0f, 1.0f);
|
||||
glEnable(GL_LIGHTING);
|
||||
@@ -5014,7 +5005,7 @@ bool TGround::RenderVBO(vector3 pPosition)
|
||||
bool TGround::RenderAlphaVBO(vector3 pPosition)
|
||||
{ // renderowanie scenerii z VBO - faza przezroczystych
|
||||
glEnable(GL_BLEND);
|
||||
glAlphaFunc(GL_GREATER, 0.04); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
glAlphaFunc(GL_GREATER, 0.04f); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
|
||||
TGroundNode *node;
|
||||
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
TSubRect *tmp;
|
||||
@@ -5062,14 +5053,14 @@ void TGround::WyslijEvent(const std::string &e, const std::string &d)
|
||||
DaneRozkaz r;
|
||||
r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' );
|
||||
r.iComm = 2; // 2 - event
|
||||
int i = e.length(), j = d.length();
|
||||
size_t i = e.length(), j = d.length();
|
||||
r.cString[0] = char(i);
|
||||
strcpy(r.cString + 1, e.c_str()); // zakończony zerem
|
||||
r.cString[i + 2] = char(j); // licznik po zerze kończącym
|
||||
strcpy(r.cString + 3 + i, d.c_str()); // zakończony zerem
|
||||
COPYDATASTRUCT cData;
|
||||
cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura
|
||||
cData.cbData = 12 + i + j; // 8+dwa liczniki i dwa zera kończące
|
||||
cData.cbData = (DWORD)(12 + i + j); // 8+dwa liczniki i dwa zera kończące
|
||||
cData.lpData = &r;
|
||||
Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData );
|
||||
CommLog( Now() + " " + std::to_string(r.iComm) + " " + e + " sent" );
|
||||
@@ -5080,13 +5071,13 @@ void TGround::WyslijUszkodzenia(const std::string &t, char fl)
|
||||
DaneRozkaz r;
|
||||
r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' );
|
||||
r.iComm = 13; // numer komunikatu
|
||||
int i = t.length();
|
||||
size_t i = t.length();
|
||||
r.cString[0] = char(fl);
|
||||
r.cString[1] = char(i);
|
||||
strcpy(r.cString + 2, t.c_str()); // z zerem kończącym
|
||||
COPYDATASTRUCT cData;
|
||||
cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura
|
||||
cData.cbData = 11 + i; // 8+licznik i zero kończące
|
||||
cData.cbData = (DWORD)(11 + i); // 8+licznik i zero kończące
|
||||
cData.lpData = &r;
|
||||
Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData );
|
||||
CommLog( Now() + " " + std::to_string(r.iComm) + " " + t + " sent");
|
||||
@@ -5097,12 +5088,12 @@ void TGround::WyslijString(const std::string &t, int n)
|
||||
DaneRozkaz r;
|
||||
r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' );
|
||||
r.iComm = n; // numer komunikatu
|
||||
int i = t.length();
|
||||
size_t i = t.length();
|
||||
r.cString[0] = char(i);
|
||||
strcpy(r.cString + 1, t.c_str()); // z zerem kończącym
|
||||
COPYDATASTRUCT cData;
|
||||
cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura
|
||||
cData.cbData = 10 + i; // 8+licznik i zero kończące
|
||||
cData.dwData = 'EU07'; // sygnatura
|
||||
cData.cbData = (DWORD)(10 + i); // 8+licznik i zero kończące
|
||||
cData.lpData = &r;
|
||||
Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData );
|
||||
CommLog( Now() + " " + std::to_string(r.iComm) + " " + t + " sent");
|
||||
@@ -5119,7 +5110,8 @@ void TGround::WyslijNamiary(TGroundNode *t)
|
||||
DaneRozkaz r;
|
||||
r.iSygn = MAKE_ID4( 'E', 'U', '0', '7' );
|
||||
r.iComm = 7; // 7 - dane pojazdu
|
||||
int i = 32, j = t->asName.length();
|
||||
int i = 32;
|
||||
size_t j = t->asName.length();
|
||||
r.iPar[0] = i; // ilość danych liczbowych
|
||||
r.fPar[1] = Global::fTimeAngleDeg / 360.0; // aktualny czas (1.0=doba)
|
||||
r.fPar[2] = t->DynamicObject->MoverParameters->Loc.X; // pozycja X
|
||||
@@ -5179,8 +5171,8 @@ void TGround::WyslijNamiary(TGroundNode *t)
|
||||
r.cString[i] = char(j); // na końcu nazwa, żeby jakoś zidentyfikować
|
||||
strcpy(r.cString + i + 1, t->asName.c_str()); // zakończony zerem
|
||||
COPYDATASTRUCT cData;
|
||||
cData.dwData = MAKE_ID4( 'E', 'U', '0', '7' ); // sygnatura
|
||||
cData.cbData = 10 + i + j; // 8+licznik i zero kończące
|
||||
cData.dwData = 'EU07'; // sygnatura
|
||||
cData.cbData = (DWORD)(10 + i + j); // 8+licznik i zero kończące
|
||||
cData.lpData = &r;
|
||||
// WriteLog("Ramka gotowa");
|
||||
Navigate( "TEU07SRK", WM_COPYDATA, (WPARAM)glfwGetWin32Window( Global::window ), (LPARAM)&cData );
|
||||
@@ -5280,7 +5272,7 @@ TDynamicObject * TGround::DynamicNearest(vector3 pPosition, double distance, boo
|
||||
TDynamicObject *dyn = NULL;
|
||||
int c = GetColFromX(pPosition.x);
|
||||
int r = GetRowFromZ(pPosition.z);
|
||||
int i, j, k;
|
||||
int i, j;
|
||||
double sqm = distance * distance, sqd; // maksymalny promien poszukiwań do kwadratu
|
||||
for (j = r - 1; j <= r + 1; j++) // plus dwa zewnętrzne sektory, łącznie 9
|
||||
for (i = c - 1; i <= c + 1; i++)
|
||||
@@ -5318,7 +5310,7 @@ TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, boo
|
||||
TDynamicObject *dyn = NULL;
|
||||
int c = GetColFromX(pPosition.x);
|
||||
int r = GetRowFromZ(pPosition.z);
|
||||
int i, j, k;
|
||||
int i, j;
|
||||
double sqm = distance * distance, sqd; // maksymalny promien poszukiwań do kwadratu
|
||||
for (j = r - 1; j <= r + 1; j++) // plus dwa zewnętrzne sektory, łącznie 9
|
||||
for (i = c - 1; i <= c + 1; i++)
|
||||
@@ -5418,7 +5410,6 @@ void TGround::TerrainWrite()
|
||||
// chyba że dla danej tekstury wychodzi tylko jeden submodel.
|
||||
TModel3d *m = new TModel3d(); // wirtualny model roboczy z oddzielnymi submodelami
|
||||
TSubModel *sk; // wskaźnik roboczy na submodel kwadratu
|
||||
TSubModel *st; // wskaźnik roboczy na submodel tekstury
|
||||
// Zliczamy kwadraty z trójkątami, ilość tekstur oraz wierzchołków.
|
||||
// Ilość kwadratów i ilość tekstur określi ilość submodeli.
|
||||
// int sub=0; //całkowita ilość submodeli
|
||||
@@ -5497,7 +5488,6 @@ void TGround::TerrainWrite()
|
||||
void TGround::TrackBusyList()
|
||||
{ // wysłanie informacji o wszystkich zajętych odcinkach
|
||||
TGroundNode *Current;
|
||||
TTrack *Track;
|
||||
for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext)
|
||||
if (!Current->asName.empty()) // musi być nazwa
|
||||
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
|
||||
@@ -5538,13 +5528,12 @@ void TGround::IsolatedBusy(const std::string t)
|
||||
|
||||
void TGround::Silence(vector3 gdzie)
|
||||
{ // wyciszenie wszystkiego w sektorach przed przeniesieniem kamery z (gdzie)
|
||||
int tr, tc;
|
||||
TGroundNode *node;
|
||||
int n = 2 * iNumSubRects; //(2*==2km) promień wyświetlanej mapy w sektorach
|
||||
int c = GetColFromX(gdzie.x); // sektory wg dotychczasowej pozycji kamery
|
||||
int r = GetRowFromZ(gdzie.z);
|
||||
TSubRect *tmp;
|
||||
int i, j, k;
|
||||
int i, j;
|
||||
// renderowanie czołgowe dla obiektów aktywnych a niewidocznych
|
||||
for (j = r - n; j <= r + n; j++)
|
||||
for (i = c - n; i <= c + n; i++)
|
||||
|
||||
6
Ground.h
6
Ground.h
@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include "gl/glew.h"
|
||||
#include "GL/glew.h"
|
||||
#include "VBO.h"
|
||||
#include "Classes.h"
|
||||
#include "ResourceManager.h"
|
||||
@@ -398,11 +398,11 @@ class TGround
|
||||
TSubRect * FastGetSubRect(int iCol, int iRow);
|
||||
int GetRowFromZ(double z)
|
||||
{
|
||||
return (z / fSubRectSize + fHalfTotalNumSubRects);
|
||||
return (int)(z / fSubRectSize + fHalfTotalNumSubRects);
|
||||
};
|
||||
int GetColFromX(double x)
|
||||
{
|
||||
return (x / fSubRectSize + fHalfTotalNumSubRects);
|
||||
return (int)(x / fSubRectSize + fHalfTotalNumSubRects);
|
||||
};
|
||||
TEvent * FindEvent(const std::string &asEventName);
|
||||
TEvent * FindEventScan(const std::string &asEventName);
|
||||
|
||||
6
Logs.cpp
6
Logs.cpp
@@ -24,7 +24,7 @@ void WriteConsoleOnly(const char *str, double value)
|
||||
sprintf(buf, "%s %f \n", str, value);
|
||||
// stdout= GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
DWORD wr = 0;
|
||||
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), buf, strlen(buf), &wr, NULL);
|
||||
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), buf, (DWORD)strlen(buf), &wr, NULL);
|
||||
// WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),endstring,strlen(endstring),&wr,NULL);
|
||||
}
|
||||
|
||||
@@ -34,9 +34,9 @@ void WriteConsoleOnly(const char *str, bool newline)
|
||||
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
|
||||
FOREGROUND_GREEN | FOREGROUND_INTENSITY);
|
||||
DWORD wr = 0;
|
||||
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), str, strlen(str), &wr, NULL);
|
||||
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), str, (DWORD)strlen(str), &wr, NULL);
|
||||
if (newline)
|
||||
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), endstring, strlen(endstring), &wr, NULL);
|
||||
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), endstring, (DWORD)strlen(endstring), &wr, NULL);
|
||||
}
|
||||
|
||||
void WriteLog(const char *str, double value)
|
||||
|
||||
@@ -5488,7 +5488,7 @@ std::vector<std::string> x;
|
||||
// *************************************************************************************************
|
||||
// Q: 20160717
|
||||
// *************************************************************************************************
|
||||
int Pos(std::string str_find, std::string in)
|
||||
size_t Pos(std::string str_find, std::string in)
|
||||
{
|
||||
size_t pos = in.find(str_find);
|
||||
return (pos != std::string::npos ? pos+1 : 0);
|
||||
|
||||
789
Model3d.cpp
789
Model3d.cpp
@@ -22,12 +22,13 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "renderer.h"
|
||||
#include "Timer.h"
|
||||
#include "mtable.h"
|
||||
#include "sn_utils.h"
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
using namespace Mtable;
|
||||
|
||||
double TSubModel::fSquareDist = 0;
|
||||
int TSubModel::iInstance; // numer renderowanego egzemplarza obiektu
|
||||
size_t TSubModel::iInstance; // numer renderowanego egzemplarza obiektu
|
||||
texture_manager::size_type *TSubModel::ReplacableSkinId = NULL;
|
||||
int TSubModel::iAlpha = 0x30300030; // maska do testowania flag tekstur wymiennych
|
||||
TModel3d *TSubModel::pRoot; // Ra: tymczasowo wskaźnik na model widoczny z submodelu
|
||||
@@ -41,30 +42,6 @@ std::string *TSubModel::pasText;
|
||||
// 0x3F3F003F - wszystkie wymienne tekstury używane w danym cyklu
|
||||
// Ale w TModel3d okerśla przezroczystość tekstur wymiennych!
|
||||
|
||||
int TSubModelInfo::iTotalTransforms = 0; // ilość transformów
|
||||
int TSubModelInfo::iTotalNames = 0; // długość obszaru nazw
|
||||
int TSubModelInfo::iTotalTextures = 0; // długość obszaru tekstur
|
||||
int TSubModelInfo::iCurrent = 0; // aktualny obiekt
|
||||
TSubModelInfo *TSubModelInfo::pTable = NULL; // tabele obiektów pomocniczych
|
||||
|
||||
char *TStringPack::String(int n)
|
||||
{ // zwraca wskaźnik do łańcucha o podanym numerze
|
||||
if (index ? n < (index[1] >> 2) - 2 : false)
|
||||
return data + 8 + index[n + 2]; // indeks upraszcza kwestię wyszukiwania
|
||||
// jak nie ma indeksu, to trzeba szukać
|
||||
int max = *((int *)(data + 4)); // długość obszaru łańcuchów
|
||||
char *ptr = data + 8; // począek obszaru łańcuchów
|
||||
for (int i = 0; i < n; ++i)
|
||||
{ // wyszukiwanie łańcuchów nie jest zbyt optymalne, ale nie musi być
|
||||
while (*ptr)
|
||||
++ptr; // wyszukiwanie zera
|
||||
++ptr; // pominięcie zera
|
||||
if (ptr > data + max)
|
||||
return NULL; // zbyt wysoki numer
|
||||
}
|
||||
return ptr;
|
||||
};
|
||||
|
||||
TSubModel::TSubModel()
|
||||
{
|
||||
ZeroMemory(this, sizeof(TSubModel)); // istotne przy zapisywaniu wersji binarnej
|
||||
@@ -104,9 +81,9 @@ void TSubModel::FirstInit()
|
||||
fNearAttenEnd = 80;
|
||||
bUseNearAtten = false;
|
||||
iFarAttenDecay = 0;
|
||||
fFarDecayRadius = 100;
|
||||
fCosFalloffAngle = 0.5; // 120°?
|
||||
fCosHotspotAngle = 0.3; // 145°?
|
||||
fFarDecayRadius = 100.0f;
|
||||
fCosFalloffAngle = 0.5f; // 120°?
|
||||
fCosHotspotAngle = 0.3f; // 145°?
|
||||
fCosViewAngle = 0;
|
||||
fSquareMaxDist = 10000 * 10000; // 10km
|
||||
fSquareMinDist = 0;
|
||||
@@ -114,7 +91,8 @@ void TSubModel::FirstInit()
|
||||
iTexture = 0; // brak tekstury
|
||||
// asName="";
|
||||
// asTexture="";
|
||||
pName = pTexture = NULL;
|
||||
pName = "";
|
||||
pTexture = "";
|
||||
f4Ambient[0] = f4Ambient[1] = f4Ambient[2] = f4Ambient[3] = 1.0; //{1,1,1,1};
|
||||
f4Diffuse[0] = f4Diffuse[1] = f4Diffuse[2] = f4Diffuse[3] = 1.0; //{1,1,1,1};
|
||||
f4Specular[0] = f4Specular[1] = f4Specular[2] = 0.0;
|
||||
@@ -134,8 +112,6 @@ TSubModel::~TSubModel()
|
||||
SafeDelete(Child);
|
||||
delete fMatrix; // własny transform trzeba usunąć (zawsze jeden)
|
||||
delete[] Vertices;
|
||||
delete[] pTexture;
|
||||
delete[] pName;
|
||||
}
|
||||
/*
|
||||
else
|
||||
@@ -151,15 +127,7 @@ void TSubModel::TextureNameSet(const char *n)
|
||||
// ile nie jest wczytany z E3D
|
||||
if (iFlags & 0x0200)
|
||||
{ // tylko jeżeli submodel zosta utworzony przez new
|
||||
delete[] pTexture; // usunięcie poprzedniej
|
||||
int i = strlen(n);
|
||||
if (i)
|
||||
{ // utworzenie nowej
|
||||
pTexture = new char[i + 1];
|
||||
strcpy(pTexture, n);
|
||||
}
|
||||
else
|
||||
pTexture = NULL;
|
||||
pTexture = std::string(n);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -167,17 +135,7 @@ void TSubModel::NameSet(const char *n)
|
||||
{ // ustawienie nazwy submodelu, o ile
|
||||
// nie jest wczytany z E3D
|
||||
if (iFlags & 0x0200)
|
||||
{ // tylko jeżeli submodel zosta utworzony przez new
|
||||
delete[] pName; // usunięcie poprzedniej
|
||||
int i = strlen(n);
|
||||
if (i)
|
||||
{ // utworzenie nowej
|
||||
pName = new char[i + 1];
|
||||
strcpy(pName, n);
|
||||
}
|
||||
else
|
||||
pName = NULL;
|
||||
}
|
||||
pName = std::string(n);
|
||||
};
|
||||
|
||||
// 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;
|
||||
Opacity = readIntAsDouble(parser,
|
||||
100.0f); // wymagane jest 0 dla szyb, 100 idzie w nieprzezroczyste
|
||||
if (Opacity > 1.0)
|
||||
Opacity *= 0.01; // w 2013 był błąd i aby go obejść, trzeba było wpisać 10000.0
|
||||
if (Opacity > 1.0f)
|
||||
Opacity *= 0.01f; // w 2013 był błąd i aby go obejść, trzeba było wpisać 10000.0
|
||||
if ((Global::iConvertModels & 1) == 0) // dla zgodności wstecz
|
||||
Opacity = 0.0; // wszystko idzie w przezroczyste albo zależnie od tekstury
|
||||
if (!parser.expectToken("map:"))
|
||||
@@ -968,11 +926,15 @@ TSubModel *TSubModel::GetFromName(char const *search, bool i)
|
||||
// std::transform(search.begin(),search.end(),search.begin(),ToLower());
|
||||
// search=search.LowerCase();
|
||||
// AnsiString name=AnsiString();
|
||||
if (pName && search)
|
||||
if ((i ? stricmp(pName, search) : strcmp(pName, search)) == 0)
|
||||
std::string search_lc = std::string(search);
|
||||
if (i)
|
||||
std::transform(search_lc.begin(), search_lc.end(), search_lc.begin(), ::tolower);
|
||||
std::string pName_lc = pName;
|
||||
if (i)
|
||||
std::transform(pName_lc.begin(), pName_lc.end(), pName_lc.begin(), ::tolower);
|
||||
if (pName.size() && search)
|
||||
if (pName_lc == search_lc)
|
||||
return this;
|
||||
else if (pName == search)
|
||||
return this; // oba NULL
|
||||
if (Next)
|
||||
{
|
||||
result = Next->GetFromName(search);
|
||||
@@ -1070,7 +1032,7 @@ void TSubModel::RaAnimation(TAnimType a)
|
||||
TSubModel *sm = ChildGet();
|
||||
do
|
||||
{ // 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ę
|
||||
if ((sm->pName[0]) >= '0')
|
||||
if ((sm->pName[0]) <= '5') // zegarek ma 6 cyfr maksymalnie
|
||||
@@ -1227,9 +1189,8 @@ void TSubModel::RenderAlphaDL()
|
||||
if (eType == TP_TEXT)
|
||||
{ // tekst renderujemy w specjalny sposób, zamiast
|
||||
// submodeli z łańcucha Child
|
||||
int i, j = pasText->size();
|
||||
int i, j = (int)pasText->size();
|
||||
TSubModel *p;
|
||||
char c;
|
||||
if (!smLetter)
|
||||
{ // jeśli nie ma tablicy, to ją stworzyć; miejsce
|
||||
// nieodpowiednie, ale tymczasowo
|
||||
@@ -1240,7 +1201,7 @@ void TSubModel::RenderAlphaDL()
|
||||
p = Child;
|
||||
while (p)
|
||||
{
|
||||
smLetter[*p->pName] = p;
|
||||
smLetter[p->pName[0]] = p;
|
||||
p = p->Next; // kolejny znak
|
||||
}
|
||||
}
|
||||
@@ -1359,8 +1320,8 @@ void TSubModel::RenderVBO()
|
||||
GfxRenderer.Bind(0); // nie teksturować
|
||||
// glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]);
|
||||
// glColorMaterial(GL_FRONT,GL_EMISSION);
|
||||
float color[4] = {f4Diffuse[0] * Distdimm, f4Diffuse[1] * Distdimm,
|
||||
f4Diffuse[2] * Distdimm, 0};
|
||||
float color[4] = { (float)(f4Diffuse[0] * Distdimm), (float)(f4Diffuse[1] * Distdimm),
|
||||
(float)(f4Diffuse[2] * Distdimm), 0 };
|
||||
// glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm);
|
||||
glColorMaterial(GL_FRONT, GL_EMISSION);
|
||||
glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie
|
||||
@@ -1517,140 +1478,6 @@ void TSubModel::RaArrayFill(CVertNormTex *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()
|
||||
{ // aktualizacja odległości faz LoD, zależna od
|
||||
// rozdzielczości pionowej oraz multisamplingu
|
||||
@@ -1842,112 +1669,380 @@ bool TModel3d::LoadFromFile(std::string const &FileName, bool dynamic)
|
||||
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)
|
||||
{ // wczytanie modelu z pliku binarnego
|
||||
WriteLog("Loading - binary model: " + FileName);
|
||||
int i = 0, j, k, ch, size;
|
||||
WriteLog("loading e3d model " + FileName + " ..");
|
||||
|
||||
/* TFileStream *fs = new TFileStream(AnsiString(FileName), fmOpenRead);
|
||||
size = fs->Size >> 2;
|
||||
iModel = new int[size]; // ten wskaźnik musi być w modelu, aby zwolnić pamięć
|
||||
fs->Read(iModel, fs->Size); // wczytanie pliku
|
||||
delete fs;
|
||||
*/ {
|
||||
std::ifstream file(FileName, std::ios::binary | std::ios::ate);
|
||||
file.unsetf(std::ios::skipws);
|
||||
size = file.tellg(); // ios::ate already positioned us at the end of the file
|
||||
iModel = new int[size >> 2]; // ten wskaźnik musi być w modelu, aby zwolnić pamięć
|
||||
file.seekg(0, std::ios::beg); // rewind the caret afterwards
|
||||
file.read(reinterpret_cast<char *>(iModel), size);
|
||||
}
|
||||
float4x4 *m = NULL; // transformy
|
||||
// zestaw kromek:
|
||||
while ((i << 2) < size) // w pliku może być kilka modeli
|
||||
{
|
||||
ch = iModel[i]; // nazwa kromki
|
||||
j = i + (iModel[i + 1] >> 2); // początek następnej kromki
|
||||
if (ch == MAKE_ID4('E', '3', 'D', '0')) // główna: 'E3D0',len,pod-kromki
|
||||
{ // tylko tę kromkę znamy, może kiedyś jeszcze DOF się zrobi
|
||||
i += 2;
|
||||
while (i < j)
|
||||
{ // przetwarzanie kromek wewnętrznych
|
||||
ch = iModel[i]; // nazwa kromki
|
||||
k = (iModel[i + 1] >> 2); // długość aktualnej kromki
|
||||
switch (ch)
|
||||
{
|
||||
case MAKE_ID4('M', 'D', 'L',
|
||||
'0'): // zmienne modelu: 'E3D0',len,(informacje o modelu)
|
||||
break;
|
||||
case MAKE_ID4('V', 'N', 'T',
|
||||
'0'): // wierzchołki: 'VNT0',len,(32 bajty na wierzchołek)
|
||||
iNumVerts = (k - 2) >> 3;
|
||||
m_nVertexCount = iNumVerts;
|
||||
m_pVNT = (CVertNormTex *)(iModel + i + 2);
|
||||
break;
|
||||
case MAKE_ID4('S', 'U', 'B', '0'): // submodele: 'SUB0',len,(256 bajtów na submodel)
|
||||
iSubModelsCount = (k - 2) / 64;
|
||||
Root =
|
||||
(TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy później
|
||||
break;
|
||||
case MAKE_ID4('S', 'U', 'B', '1'): // submodele: 'SUB1',len,(320 bajtów na submodel)
|
||||
iSubModelsCount = (k - 2) / 80;
|
||||
Root =
|
||||
(TSubModel *)(iModel + i + 2); // numery na wskaźniki przetworzymy później
|
||||
for (ch = 1; ch < iSubModelsCount;
|
||||
++ch) // trzeba przesunąć bliżej, bo 256 wystarczy
|
||||
MoveMemory(((char *)Root) + 256 * ch, ((char *)Root) + 320 * ch, 256);
|
||||
break;
|
||||
case MAKE_ID4('T', 'R', 'A', '0'): // transformy: 'TRA0',len,(64 bajty na transform)
|
||||
m = (float4x4 *)(iModel + i + 2); // tabela transformów
|
||||
break;
|
||||
case MAKE_ID4('T', 'R', 'A',
|
||||
'1'): // transformy: 'TRA1',len,(128 bajtów na transform)
|
||||
m = (float4x4 *)(iModel + i + 2); // tabela transformów
|
||||
for (ch = 0; ch < ((k - 2) >> 1); ++ch)
|
||||
*(((float *)m) + ch) = *(((double *)m) + ch); // przepisanie double do float
|
||||
break;
|
||||
case MAKE_ID4('I', 'D', 'X',
|
||||
'1'): // indeksy 1B: 'IDX2',len,(po bajcie na numer wierzchołka)
|
||||
break;
|
||||
case MAKE_ID4('I', 'D', 'X',
|
||||
'2'): // indeksy 2B: 'IDX2',len,(po 2 bajty na numer wierzchołka)
|
||||
break;
|
||||
case MAKE_ID4('I', 'D', 'X',
|
||||
'4'): // indeksy 4B: 'IDX4',len,(po 4 bajty na numer wierzchołka)
|
||||
break;
|
||||
case MAKE_ID4('T', 'E', 'X',
|
||||
'0'): // tekstury: 'TEX0',len,(łańcuchy zakończone zerem - pliki
|
||||
// tekstur)
|
||||
Textures.Init((char *)(iModel + i)); //łącznie z nagłówkiem
|
||||
break;
|
||||
case MAKE_ID4('T', 'I', 'X', '0'): // indeks nazw tekstur
|
||||
Textures.InitIndex((int *)(iModel + i)); //łącznie z nagłówkiem
|
||||
break;
|
||||
case MAKE_ID4('N', 'A', 'M',
|
||||
'0'): // nazwy: 'NAM0',len,(łańcuchy zakończone zerem - nazwy
|
||||
// submodeli)
|
||||
Names.Init((char *)(iModel + i)); //łącznie z nagłówkiem
|
||||
break;
|
||||
case MAKE_ID4('N', 'I', 'X', '0'): // indeks nazw submodeli
|
||||
Names.InitIndex((int *)(iModel + i)); //łącznie z nagłówkiem
|
||||
break;
|
||||
}
|
||||
i += k; // przejście do kolejnej kromki
|
||||
}
|
||||
}
|
||||
i = j;
|
||||
}
|
||||
for (i = 0; i < iSubModelsCount; ++i)
|
||||
{ // aktualizacja wskaźników w submodelach
|
||||
Root[i].BinInit(Root, m, (float8 *)m_pVNT, &Textures, &Names, dynamic);
|
||||
if (Root[i].ChildGet())
|
||||
Root[i].ChildGet()->Parent = Root + i; // wpisanie wskaźnika nadrzędnego do potmnego
|
||||
if (Root[i].NextGet())
|
||||
Root[i].NextGet()->Parent =
|
||||
Root[i].Parent; // skopiowanie wskaźnika nadrzędnego do kolejnego
|
||||
}
|
||||
iFlags &= ~0x0200;
|
||||
return;
|
||||
std::ifstream file(FileName, std::ios::binary);
|
||||
|
||||
uint32_t type = sn_utils::ld_uint32(file);
|
||||
uint32_t size = sn_utils::ld_uint32(file) - 8;
|
||||
|
||||
if (type != MAKE_ID4('E', '3', 'D', '0'))
|
||||
throw std::runtime_error("e3d: unknown main chunk");
|
||||
|
||||
deserialize(file, size, dynamic);
|
||||
file.close();
|
||||
|
||||
WriteLog("..done.");
|
||||
};
|
||||
|
||||
void TModel3d::LoadFromTextFile(std::string const &FileName, bool dynamic)
|
||||
@@ -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()
|
||||
{
|
||||
Error("Not implemented yet :(");
|
||||
|
||||
106
Model3d.h
106
Model3d.h
@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#ifndef Model3dH
|
||||
#define Model3dH
|
||||
|
||||
#include "gl/glew.h"
|
||||
#include "GL/glew.h"
|
||||
#include "Parser.h"
|
||||
#include "dumb3d.h"
|
||||
#include "Float3d.h"
|
||||
@@ -26,37 +26,6 @@ struct GLVERTEX
|
||||
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
|
||||
{
|
||||
public:
|
||||
@@ -159,15 +128,13 @@ enum TAnimType // rodzaj animacji
|
||||
};
|
||||
|
||||
class TModel3d;
|
||||
class TSubModelInfo;
|
||||
|
||||
class TSubModel
|
||||
{ // klasa submodelu - pojedyncza siatka, punkt świetlny albo grupa punktów
|
||||
// Ra: ta klasa ma mieć wielkość 256 bajtów, aby pokryła się z formatem binarnym
|
||||
// Ra: nie przestawiać zmiennych, bo wczytują się z pliku binarnego!
|
||||
//m7todo: zrobić normalną serializację
|
||||
private:
|
||||
TSubModel *Next;
|
||||
TSubModel *Child;
|
||||
int iNext;
|
||||
int iChild;
|
||||
int eType; // Ra: modele binarne dają więcej możliwości niż mesh złożony z trójkątów
|
||||
int iName; // numer łańcucha z nazwą submodelu, albo -1 gdy anonimowy
|
||||
public: // chwilowo
|
||||
@@ -194,7 +161,7 @@ class TSubModel
|
||||
int iMatrix; // w pliku binarnym jest numer matrycy
|
||||
};
|
||||
int iNumVerts; // ilość wierzchołków (1 dla FreeSpotLight)
|
||||
int iVboPtr; // początek na liście wierzchołków albo indeksów
|
||||
int tVboPtr; // początek na liście wierzchołków albo indeksów
|
||||
int iTexture; // numer nazwy tekstury, -1 wymienna, 0 brak
|
||||
float fVisible; // próg jasności światła do załączenia submodelu
|
||||
float fLight; // próg jasności światła do zadziałania selfillum
|
||||
@@ -215,12 +182,15 @@ class TSubModel
|
||||
float fCosHotspotAngle; // cosinus kąta stożka pod którym widać aureolę i zwiększone natężenie
|
||||
// światła
|
||||
float fCosViewAngle; // cos kata pod jakim sie teraz patrzy
|
||||
// Ra: dalej są zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy
|
||||
|
||||
TSubModel *Next;
|
||||
TSubModel *Child;
|
||||
intptr_t iVboPtr;
|
||||
texture_manager::size_type TextureID; // numer tekstury, -1 wymienna, 0 brak
|
||||
bool bWire; // nie używane, ale wczytywane
|
||||
// short TexAlpha; //Ra: nie używane już
|
||||
GLuint uiDisplayList; // roboczy numer listy wyświetlania
|
||||
float Opacity; // nie używane, ale wczytywane
|
||||
float Opacity; // nie używane, ale wczytywane //m7todo: wywalić to
|
||||
// ABu: te same zmienne, ale zdublowane dla Render i RenderAlpha,
|
||||
// bo sie chrzanilo przemieszczanie obiektow.
|
||||
// Ra: już się nie chrzani
|
||||
@@ -231,11 +201,10 @@ class TSubModel
|
||||
public: // chwilowo
|
||||
float3 v_TransVector;
|
||||
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
|
||||
public:
|
||||
float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer)
|
||||
char space[8]; // wolne miejsce na przyszłe zmienne (zmniejszyć w miarę potrzeby)
|
||||
public:
|
||||
TSubModel **
|
||||
smLetter; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D)
|
||||
@@ -243,8 +212,8 @@ class TSubModel
|
||||
int iVisible; // roboczy stan widoczności
|
||||
// AnsiString asTexture; //robocza nazwa tekstury do zapisania w pliku binarnym
|
||||
// AnsiString asName; //robocza nazwa
|
||||
char *pTexture; // robocza nazwa tekstury do zapisania w pliku binarnym
|
||||
char *pName; // robocza nazwa
|
||||
std::string pTexture; // robocza nazwa tekstury do zapisania w pliku binarnym
|
||||
std::string pName; // robocza nazwa
|
||||
private:
|
||||
// int SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX
|
||||
// *Vertices);
|
||||
@@ -252,7 +221,7 @@ class TSubModel
|
||||
void RaAnimation(TAnimType a);
|
||||
|
||||
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 int iAlpha; // maska bitowa dla danego przebiegu
|
||||
static double fSquareDist;
|
||||
@@ -308,10 +277,8 @@ class TSubModel
|
||||
};
|
||||
void InitialRotate(bool doit);
|
||||
void DisplayLists();
|
||||
void Info();
|
||||
void InfoSet(TSubModelInfo *info);
|
||||
void BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TStringPack *n = NULL,
|
||||
bool dynamic = false);
|
||||
void BinInit(TSubModel *s, float4x4 *m, float8 *v,
|
||||
std::vector<std::string> *t, std::vector<std::string> *n, bool dynamic);
|
||||
void ReplacableSet(texture_manager::size_type *r, int a)
|
||||
{
|
||||
ReplacableSkinId = r;
|
||||
@@ -344,35 +311,13 @@ class TSubModel
|
||||
void ParentMatrix(float4x4 *m);
|
||||
float MaxY(const float4x4 &m);
|
||||
void AdjustDist();
|
||||
};
|
||||
|
||||
class TSubModelInfo
|
||||
{ // klasa z informacjami o submodelach, do tworzenia pliku binarnego
|
||||
public:
|
||||
TSubModel *pSubModel; // wskaźnik na submodel
|
||||
int iTransform; // numer transformu (-1 gdy brak)
|
||||
int iName; // numer nazwy
|
||||
int iTexture; // numer tekstury
|
||||
int iNameLen; // długość nazwy
|
||||
int iTextureLen; // długość tekstury
|
||||
int iNext, iChild; // numer następnego i potomnego
|
||||
static int iTotalTransforms; // ilość transformów
|
||||
static int iTotalNames; // ilość nazw
|
||||
static int iTotalTextures; // ilość tekstur
|
||||
static int iCurrent; // aktualny obiekt
|
||||
static TSubModelInfo *pTable; // tabele obiektów pomocniczych
|
||||
TSubModelInfo()
|
||||
{
|
||||
pSubModel = NULL;
|
||||
iTransform = iName = iTexture = iNext = iChild = -1; // nie ma
|
||||
iNameLen = iTextureLen = 0;
|
||||
}
|
||||
void Reset()
|
||||
{
|
||||
pTable = this; // ustawienie wskaźnika tabeli obiektów
|
||||
iTotalTransforms = iTotalNames = iTotalTextures = iCurrent = 0; // zerowanie liczników
|
||||
}
|
||||
~TSubModelInfo(){};
|
||||
void deserialize(std::istream&);
|
||||
void TSubModel::serialize(std::ostream&,
|
||||
std::vector<TSubModel*>&,
|
||||
std::vector<std::string>&,
|
||||
std::vector<std::string>&,
|
||||
std::vector<float4x4>&);
|
||||
};
|
||||
|
||||
class TModel3d : public CMesh
|
||||
@@ -386,8 +331,8 @@ class TModel3d : public CMesh
|
||||
public: // Ra: tymczasowo
|
||||
int iNumVerts; // ilość wierzchołków (gdy nie ma VBO, to m_nVertexCount=0)
|
||||
private:
|
||||
TStringPack Textures; // nazwy tekstur
|
||||
TStringPack Names; // nazwy submodeli
|
||||
std::vector<std::string> Textures; // nazwy tekstur
|
||||
std::vector<std::string> Names; // nazwy submodeli
|
||||
int *iModel; // zawartość pliku binarnego
|
||||
int iSubModelsCount; // Ra: używane do tworzenia binarnych
|
||||
std::string asBinary; // nazwa pod którą zapisać model binarny
|
||||
@@ -440,13 +385,14 @@ class TModel3d : public CMesh
|
||||
return iFlags;
|
||||
};
|
||||
void Init();
|
||||
char * NameGet()
|
||||
std::string NameGet()
|
||||
{
|
||||
return Root ? Root->pName : NULL;
|
||||
};
|
||||
int TerrainCount();
|
||||
TSubModel * TerrainSquare(int n);
|
||||
void TerrainRenderVBO(int n);
|
||||
void deserialize(std::istream &s, size_t size, bool dynamic);
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -14,6 +14,9 @@ TPythonInterpreter *TPythonInterpreter::_instance = NULL;
|
||||
TPythonInterpreter::TPythonInterpreter()
|
||||
{
|
||||
WriteLog("Loading Python ...");
|
||||
if (sizeof(void*) == 8)
|
||||
Py_SetPythonHome("python64");
|
||||
else
|
||||
Py_SetPythonHome("python");
|
||||
Py_Initialize();
|
||||
_main = PyImport_ImportModule("__main__");
|
||||
@@ -64,7 +67,7 @@ bool TPythonInterpreter::loadClassFile( std::string const &lookupPath, std::stri
|
||||
long fsize = ftell(sourceFile);
|
||||
char *buffer = (char *)calloc(fsize + 1, sizeof(char));
|
||||
fseek(sourceFile, 0, SEEK_SET);
|
||||
long freaded = fread(buffer, sizeof(char), fsize, sourceFile);
|
||||
size_t freaded = fread(buffer, sizeof(char), fsize, sourceFile);
|
||||
buffer[freaded] = 0; // z jakiegos powodu czytamy troche mniej i trzczeba dodac konczace
|
||||
// zero do bufora (mimo ze calloc teoretycznie powiniene zwrocic
|
||||
// wyzerowana pamiec)
|
||||
|
||||
@@ -176,7 +176,7 @@ void TRealSound::Stop()
|
||||
void TRealSound::AdjFreq(double Freq, double dt) // McZapkie TODO: dorobic tu efekt Dopplera
|
||||
// Freq moze byc liczba dodatnia mniejsza od 1 lub wieksza od 1
|
||||
{
|
||||
float df, Vlist, Vsrc;
|
||||
float df, Vlist;
|
||||
if ((Global::bSoundEnabled) && (AM != 0))
|
||||
{
|
||||
if (dt > 0)
|
||||
@@ -247,7 +247,7 @@ void TTextSound::Init(std::string const &SoundName, double SoundAttenuation, dou
|
||||
fTime = GetWaveTime();
|
||||
std::string txt(SoundName);
|
||||
txt.erase( txt.rfind( '.' ) ); // obcięcie rozszerzenia
|
||||
for (int i = txt.length(); i > 0; --i)
|
||||
for (size_t i = txt.length(); i > 0; --i)
|
||||
if (txt[i] == '/')
|
||||
txt[i] = '\\'; // bo nie rozumi
|
||||
txt += "-" + Global::asLang + ".txt"; // już może być w różnych językach
|
||||
|
||||
@@ -599,7 +599,7 @@ void TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *Shap
|
||||
double fOffsetX)
|
||||
{ // tworzenie siatki trójkątów dla iglicy
|
||||
vector3 pos1, pos2, dir, parallel1, parallel2, pt;
|
||||
double a1, a2, s, step, offset, tv1, tv2, t, t2, t2step, oldt2, sp, oldsp;
|
||||
double a1, a2, s, step, offset, tv1, tv2, t, t2step, oldt2;
|
||||
int i, j;
|
||||
if (bCurve)
|
||||
{ // dla toru odchylonego
|
||||
@@ -736,7 +736,7 @@ void TSegment::Render()
|
||||
{
|
||||
vector3 pt;
|
||||
GfxRenderer.Bind(0);
|
||||
int i;
|
||||
|
||||
if (bCurve)
|
||||
{
|
||||
glColor3f(0, 0, 1.0f);
|
||||
|
||||
10
Sound.cpp
10
Sound.cpp
@@ -8,7 +8,6 @@ http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#include "stdafx.h"
|
||||
#define STRICT
|
||||
#include "Sound.h"
|
||||
#include "Globals.h"
|
||||
#include "Logs.h"
|
||||
@@ -219,7 +218,6 @@ LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(const char *Name, bool Dynamic,
|
||||
Dynamic = false; // wczytanie z "sounds/"
|
||||
}
|
||||
TSoundContainer *Next = First;
|
||||
DWORD dwStatus;
|
||||
for (int i = 0; i < Count; i++)
|
||||
{
|
||||
if (strcmp(Name, Next->Name) == 0)
|
||||
@@ -277,11 +275,6 @@ void TSoundsManager::RestoreAll()
|
||||
|
||||
for (int i = 0; i < Count; i++)
|
||||
{
|
||||
|
||||
if (FAILED(hr = Next->DSBuffer->GetStatus(&dwStatus)))
|
||||
;
|
||||
// return hr;
|
||||
|
||||
if (dwStatus & DSBSTATUS_BUFFERLOST)
|
||||
{
|
||||
// Since the app could have just been activated, then
|
||||
@@ -376,6 +369,3 @@ void TSoundsManager::Init(HWND hWnd)
|
||||
|
||||
SAFE_RELEASE(pDSBPrimary);
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
#pragma package(smart_init)
|
||||
|
||||
79
Texture.cpp
79
Texture.cpp
@@ -17,10 +17,12 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "texture.h"
|
||||
|
||||
#include <ddraw.h>
|
||||
#include "GL/glew.h"
|
||||
|
||||
#include "usefull.h"
|
||||
#include "globals.h"
|
||||
#include "logs.h"
|
||||
#include "sn_utils.h"
|
||||
|
||||
texture_manager::texture_manager() {
|
||||
|
||||
@@ -80,7 +82,7 @@ opengl_texture::load_BMP() {
|
||||
if( infosize > sizeof( info ) ) {
|
||||
WriteLog( "Warning - BMP header is larger than expected, possible format difference." );
|
||||
}
|
||||
file.read( (char *)&info, std::min( infosize, sizeof( info ) ) );
|
||||
file.read( (char *)&info, std::min( (size_t)infosize, sizeof( info ) ) );
|
||||
|
||||
data_width = info.bmiHeader.biWidth;
|
||||
data_height = info.bmiHeader.biHeight;
|
||||
@@ -118,6 +120,70 @@ opengl_texture::load_BMP() {
|
||||
return;
|
||||
}
|
||||
|
||||
DDCOLORKEY opengl_texture::deserialize_ddck(std::istream &s)
|
||||
{
|
||||
DDCOLORKEY ddck;
|
||||
|
||||
ddck.dwColorSpaceLowValue = sn_utils::ld_uint32(s);
|
||||
ddck.dwColorSpaceHighValue = sn_utils::ld_uint32(s);
|
||||
|
||||
return ddck;
|
||||
}
|
||||
|
||||
DDPIXELFORMAT opengl_texture::deserialize_ddpf(std::istream &s)
|
||||
{
|
||||
DDPIXELFORMAT ddpf;
|
||||
|
||||
ddpf.dwSize = sn_utils::ld_uint32(s);
|
||||
ddpf.dwFlags = sn_utils::ld_uint32(s);
|
||||
ddpf.dwFourCC = sn_utils::ld_uint32(s);
|
||||
ddpf.dwRGBBitCount = sn_utils::ld_uint32(s);
|
||||
ddpf.dwRBitMask = sn_utils::ld_uint32(s);
|
||||
ddpf.dwGBitMask = sn_utils::ld_uint32(s);
|
||||
ddpf.dwBBitMask = sn_utils::ld_uint32(s);
|
||||
ddpf.dwRGBAlphaBitMask = sn_utils::ld_uint32(s);
|
||||
|
||||
return ddpf;
|
||||
}
|
||||
|
||||
DDSCAPS2 opengl_texture::deserialize_ddscaps(std::istream &s)
|
||||
{
|
||||
DDSCAPS2 ddsc;
|
||||
|
||||
ddsc.dwCaps = sn_utils::ld_uint32(s);
|
||||
ddsc.dwCaps2 = sn_utils::ld_uint32(s);
|
||||
ddsc.dwCaps3 = sn_utils::ld_uint32(s);
|
||||
ddsc.dwCaps4 = sn_utils::ld_uint32(s);
|
||||
|
||||
return ddsc;
|
||||
}
|
||||
|
||||
DDSURFACEDESC2 opengl_texture::deserialize_ddsd(std::istream &s)
|
||||
{
|
||||
DDSURFACEDESC2 ddsd;
|
||||
|
||||
ddsd.dwSize = sn_utils::ld_uint32(s);
|
||||
ddsd.dwFlags = sn_utils::ld_uint32(s);
|
||||
ddsd.dwHeight = sn_utils::ld_uint32(s);
|
||||
ddsd.dwWidth = sn_utils::ld_uint32(s);
|
||||
ddsd.lPitch = sn_utils::ld_uint32(s);
|
||||
ddsd.dwBackBufferCount = sn_utils::ld_uint32(s);
|
||||
ddsd.dwMipMapCount = sn_utils::ld_uint32(s);
|
||||
ddsd.dwAlphaBitDepth = sn_utils::ld_uint32(s);
|
||||
ddsd.dwReserved = sn_utils::ld_uint32(s);
|
||||
sn_utils::ld_uint32(s);
|
||||
ddsd.lpSurface = nullptr;
|
||||
ddsd.ddckCKDestOverlay = deserialize_ddck(s);
|
||||
ddsd.ddckCKDestBlt = deserialize_ddck(s);
|
||||
ddsd.ddckCKSrcOverlay = deserialize_ddck(s);
|
||||
ddsd.ddckCKSrcBlt = deserialize_ddck(s);
|
||||
ddsd.ddpfPixelFormat = deserialize_ddpf(s);
|
||||
ddsd.ddsCaps = deserialize_ddscaps(s);
|
||||
ddsd.dwTextureStage = sn_utils::ld_uint32(s);
|
||||
|
||||
return ddsd;
|
||||
}
|
||||
|
||||
void
|
||||
opengl_texture::load_DDS() {
|
||||
|
||||
@@ -136,9 +202,8 @@ opengl_texture::load_DDS() {
|
||||
return;
|
||||
}
|
||||
|
||||
DDSURFACEDESC2 ddsd;
|
||||
file.read((char *)&ddsd, sizeof(ddsd));
|
||||
filesize -= sizeof( ddsd );
|
||||
DDSURFACEDESC2 ddsd = deserialize_ddsd(file);
|
||||
filesize -= 124;
|
||||
|
||||
//
|
||||
// This .dds loader supports the loading of compressed formats DXT1, DXT3
|
||||
@@ -189,7 +254,7 @@ opengl_texture::load_DDS() {
|
||||
return;
|
||||
}
|
||||
|
||||
int datasize = filesize - offset;
|
||||
size_t datasize = filesize - offset;
|
||||
/*
|
||||
// this approach loads only the first mipmap and relies on graphics card to fill the rest
|
||||
data_mapcount = 1;
|
||||
@@ -467,7 +532,7 @@ opengl_texture::create() {
|
||||
::glCompressedTexImage2D(
|
||||
GL_TEXTURE_2D, maplevel, data_format,
|
||||
datawidth, dataheight, 0,
|
||||
datasize, (GLubyte *)&data[0] + dataoffset );
|
||||
datasize, (GLubyte *)&data[dataoffset] );
|
||||
|
||||
dataoffset += datasize;
|
||||
datawidth = std::max( datawidth / 2, 1 );
|
||||
@@ -653,7 +718,7 @@ texture_manager::GetTextureId( std::string Filename, std::string const &Dir, int
|
||||
traits += '#';
|
||||
}
|
||||
texture.traits = traits;
|
||||
auto const textureindex = m_textures.size();
|
||||
auto const textureindex = (texture_manager::size_type)m_textures.size();
|
||||
m_textures.emplace_back( texture );
|
||||
m_texturemappings.emplace( filename, textureindex );
|
||||
|
||||
|
||||
@@ -9,8 +9,10 @@ http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <istream>
|
||||
#include <ddraw.h>
|
||||
#include <string>
|
||||
#include "gl/glew.h"
|
||||
#include "GL/glew.h"
|
||||
|
||||
enum class resource_state {
|
||||
none,
|
||||
@@ -20,6 +22,10 @@ enum class resource_state {
|
||||
};
|
||||
|
||||
struct opengl_texture {
|
||||
static DDSURFACEDESC2 deserialize_ddsd(std::istream&);
|
||||
static DDCOLORKEY deserialize_ddck(std::istream&);
|
||||
static DDPIXELFORMAT deserialize_ddpf(std::istream&);
|
||||
static DDSCAPS2 deserialize_ddscaps(std::istream&);
|
||||
|
||||
// methods
|
||||
void load();
|
||||
|
||||
@@ -196,7 +196,7 @@ void DecompressDXT3(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
|
||||
|
||||
void DecompressDXT5(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Data)
|
||||
{
|
||||
GLint x, y, z, i, j, k;
|
||||
GLint x, y, i, j, k;
|
||||
GLuint Select;
|
||||
const GLubyte *Temp; //, r0, g0, b0, r1, g1, b1;
|
||||
Color8888 colours[4], *col;
|
||||
|
||||
@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#ifndef TEXTURE_DDS_H
|
||||
#define TEXTURE_DDS_H 1
|
||||
|
||||
#include "gl/glew.h"
|
||||
#include "GL/glew.h"
|
||||
|
||||
#pragma hdrstop
|
||||
|
||||
|
||||
13
Track.cpp
13
Track.cpp
@@ -412,10 +412,9 @@ vector3 LoadPoint(cParser *parser)
|
||||
void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name)
|
||||
{ // pobranie obiektu trajektorii ruchu
|
||||
vector3 pt, vec, p1, p2, cp1, cp2, p3, p4, cp3, cp4; // dodatkowe punkty potrzebne do skrzyżowań
|
||||
double a1, a2, r1, r2, r3, r4, d1, d2, a;
|
||||
double a1, a2, r1, r2, r3, r4;
|
||||
string str;
|
||||
bool bCurve;
|
||||
int i; //,state; //Ra: teraz już nie ma początkowego stanu zwrotnicy we wpisie
|
||||
size_t i; //,state; //Ra: teraz już nie ma początkowego stanu zwrotnicy we wpisie
|
||||
std::string token;
|
||||
|
||||
parser->getTokens();
|
||||
@@ -1557,7 +1556,7 @@ void TTrack::Compile(GLuint tex)
|
||||
// 2014-07: na początek rysować brzegi jak dla łuków
|
||||
// punkty brzegu nawierzchni uzyskujemy podczas renderowania boków (bez sensu, ale
|
||||
// najszybciej było zrobić)
|
||||
int i, j; // ile punktów (może byc różna ilość punktów między drogami)
|
||||
int i; // ile punktów (może byc różna ilość punktów między drogami)
|
||||
if (!SwitchExtension->vPoints)
|
||||
{ // jeśli tablica punktów nie jest jeszcze utworzona, zliczamy punkty i tworzymy ją
|
||||
if (SwitchExtension->iRoads == 3) // mogą być tylko 3 drogi zamiast 4
|
||||
@@ -1735,7 +1734,7 @@ void TTrack::Compile(GLuint tex)
|
||||
if (!SwitchExtension->bPoints) // jeśli tablica nie wypełniona
|
||||
if (b) // ale jest wskaźnik do tablicy - może nie być?
|
||||
{ // coś się gubi w obliczeniach na wskaźnikach
|
||||
i = (int((void *)(b)) - int((void *)(SwitchExtension->vPoints))) /
|
||||
i = (int)(((size_t)(b)) - ((size_t)(SwitchExtension->vPoints))) /
|
||||
sizeof(vector3); // ustalenie liczby punktów, bo mogło wyjść inaczej niż
|
||||
// policzone z góry
|
||||
if (i > 0)
|
||||
@@ -2913,7 +2912,7 @@ TTrack * TTrack::RaAnimate()
|
||||
}
|
||||
if (Global::bUseVBO)
|
||||
{ // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment
|
||||
if (true == GLEW_VERSION_1_5) // dla OpenGL 1.4 to się nie wykona poprawnie
|
||||
if (GLEW_VERSION_1_5) // dla OpenGL 1.4 to się nie wykona poprawnie
|
||||
if (TextureID1) // Ra: !!!! tu jest do poprawienia
|
||||
{ // iglice liczone tylko dla zwrotnic
|
||||
vector6 rpts3[24], rpts4[24];
|
||||
@@ -3024,7 +3023,7 @@ TTrack * TTrack::RaAnimate()
|
||||
if (Global::bUseVBO)
|
||||
{ // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment
|
||||
// aktualizacja pojazdów na torze
|
||||
if (true == GLEW_VERSION_1_5) // dla OpenGL 1.4 to się nie wykona poprawnie
|
||||
if (GLEW_VERSION_1_5) // dla OpenGL 1.4 to się nie wykona poprawnie
|
||||
{
|
||||
int size =
|
||||
RaArrayPrepare(); // wielkość tabeli potrzebna dla tej obrotnicy
|
||||
|
||||
22
Track.h
22
Track.h
@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include "gl/glew.h"
|
||||
#include "GL/glew.h"
|
||||
#include "ResourceManager.h"
|
||||
#include "Segment.h"
|
||||
#include "Texture.h"
|
||||
@@ -139,12 +139,12 @@ class TTrack : public Resource
|
||||
// McZapkie-070402: dodalem zmienne opisujace rozmiary tekstur
|
||||
texture_manager::size_type TextureID1 = 0; // tekstura szyn albo nawierzchni
|
||||
texture_manager::size_type TextureID2 = 0; // tekstura automatycznej podsypki albo pobocza
|
||||
float fTexLength = 4.0; // długość powtarzania tekstury w metrach
|
||||
float fTexRatio1 = 1.0; // proporcja boków tekstury nawierzchni (żeby zaoszczędzić na rozmiarach tekstur...)
|
||||
float fTexRatio2 = 1.0; // proporcja boków tekstury chodnika (żeby zaoszczędzić na rozmiarach tekstur...)
|
||||
float fTexHeight1 = 0.6; // wysokość brzegu względem trajektorii
|
||||
float fTexWidth = 0.9; // szerokość boku
|
||||
float fTexSlope = 0.9;
|
||||
float fTexLength = 4.0f; // długość powtarzania tekstury w metrach
|
||||
float fTexRatio1 = 1.0f; // proporcja boków tekstury nawierzchni (żeby zaoszczędzić na rozmiarach tekstur...)
|
||||
float fTexRatio2 = 1.0f; // proporcja boków tekstury chodnika (żeby zaoszczędzić na rozmiarach tekstur...)
|
||||
float fTexHeight1 = 0.6f; // wysokość brzegu względem trajektorii
|
||||
float fTexWidth = 0.9f; // szerokość boku
|
||||
float fTexSlope = 0.9f;
|
||||
double fRadiusTable[ 2 ]; // dwa promienie, drugi dla zwrotnicy
|
||||
int iTrapezoid = 0; // 0-standard, 1-przechyłka, 2-trapez, 3-oba
|
||||
GLuint DisplayListID = 0;
|
||||
@@ -176,10 +176,10 @@ class TTrack : public Resource
|
||||
int iPrevDirection = 0; // domyślnie wirtualne odcinki dołączamy stroną od Point1
|
||||
TTrackType eType = tt_Normal; // domyślnie zwykły
|
||||
int iCategoryFlag = 1; // 0x100 - usuwanie pojazów // 1-tor, 2-droga, 4-rzeka, 8-samolot?
|
||||
float fTrackWidth = 1.435; // szerokość w punkcie 1 // rozstaw toru, szerokość nawierzchni
|
||||
float fTrackWidth2 = 0.0; // szerokość w punkcie 2 (głównie drogi i rzeki)
|
||||
float fFriction = 0.15; // współczynnik tarcia
|
||||
float fSoundDistance = -1.0;
|
||||
float fTrackWidth = 1.435f; // szerokość w punkcie 1 // rozstaw toru, szerokość nawierzchni
|
||||
float fTrackWidth2 = 0.0f; // szerokość w punkcie 2 (głównie drogi i rzeki)
|
||||
float fFriction = 0.15f; // współczynnik tarcia
|
||||
float fSoundDistance = -1.0f;
|
||||
int iQualityFlag = 20;
|
||||
int iDamageFlag = 0;
|
||||
TEnvironmentType eEnvironment = e_flat; // dźwięk i oświetlenie
|
||||
|
||||
124
Traction.cpp
124
Traction.cpp
@@ -256,11 +256,11 @@ void TTraction::RenderDL(float mgn) // McZapkie: mgn to odleglosc od obserwatora
|
||||
if (!Global::bSmoothTraction)
|
||||
glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient
|
||||
float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness
|
||||
if (linealpha > 1.2)
|
||||
linealpha = 1.2; // zbyt grube nie są dobre
|
||||
if (linealpha > 1.2f)
|
||||
linealpha = 1.2f; // zbyt grube nie są dobre
|
||||
glLineWidth(linealpha);
|
||||
if (linealpha > 1.0)
|
||||
linealpha = 1.0;
|
||||
if (linealpha > 1.0f)
|
||||
linealpha = 1.0f;
|
||||
// McZapkie-261102: kolor zalezy od materialu i zasniedzenia
|
||||
float r, g, b;
|
||||
switch (Material)
|
||||
@@ -269,59 +269,59 @@ void TTraction::RenderDL(float mgn) // McZapkie: mgn to odleglosc od obserwatora
|
||||
case 1:
|
||||
if (TestFlag(DamageFlag, 1))
|
||||
{
|
||||
r = 0.00000;
|
||||
g = 0.32549;
|
||||
b = 0.2882353; // zielona miedź
|
||||
r = 0.00000f;
|
||||
g = 0.32549f;
|
||||
b = 0.2882353f; // zielona miedź
|
||||
}
|
||||
else
|
||||
{
|
||||
r = 0.35098;
|
||||
g = 0.22549;
|
||||
b = 0.1; // czerwona miedź
|
||||
r = 0.35098f;
|
||||
g = 0.22549f;
|
||||
b = 0.1f; // czerwona miedź
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (TestFlag(DamageFlag, 1))
|
||||
{
|
||||
r = 0.10;
|
||||
g = 0.10;
|
||||
b = 0.10; // czarne Al
|
||||
r = 0.10f;
|
||||
g = 0.10f;
|
||||
b = 0.10f; // czarne Al
|
||||
}
|
||||
else
|
||||
{
|
||||
r = 0.25;
|
||||
g = 0.25;
|
||||
b = 0.25; // srebrne Al
|
||||
r = 0.25f;
|
||||
g = 0.25f;
|
||||
b = 0.25f; // srebrne Al
|
||||
}
|
||||
break;
|
||||
// tymczasowo pokazanie zasilanych odcinków
|
||||
case 4:
|
||||
r = 0.5;
|
||||
g = 0.5;
|
||||
b = 1.0;
|
||||
r = 0.5f;
|
||||
g = 0.5f;
|
||||
b = 1.0f;
|
||||
break; // niebieskie z podłączonym zasilaniem
|
||||
case 5:
|
||||
r = 1.0;
|
||||
g = 0.0;
|
||||
b = 0.0;
|
||||
r = 1.0f;
|
||||
g = 0.0f;
|
||||
b = 0.0f;
|
||||
break; // czerwone z podłączonym zasilaniem 1
|
||||
case 6:
|
||||
r = 0.0;
|
||||
g = 1.0;
|
||||
b = 0.0;
|
||||
r = 0.0f;
|
||||
g = 1.0f;
|
||||
b = 0.0f;
|
||||
break; // zielone z podłączonym zasilaniem 2
|
||||
case 7:
|
||||
r = 1.0;
|
||||
g = 1.0;
|
||||
b = 0.0;
|
||||
r = 1.0f;
|
||||
g = 1.0f;
|
||||
b = 0.0f;
|
||||
break; //żółte z podłączonym zasilaniem z obu stron
|
||||
}
|
||||
if (DebugModeFlag)
|
||||
if (hvParallel)
|
||||
{ // jeśli z bieżnią wspólną, to dodatkowo przyciemniamy
|
||||
r *= 0.6;
|
||||
g *= 0.6;
|
||||
b *= 0.6;
|
||||
r *= 0.6f;
|
||||
g *= 0.6f;
|
||||
b *= 0.6f;
|
||||
}
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
r *= Global::ambientDayLight[ 0 ]; // w zaleźności od koloru swiatła
|
||||
@@ -332,8 +332,8 @@ void TTraction::RenderDL(float mgn) // McZapkie: mgn to odleglosc od obserwatora
|
||||
g *= Global::DayLight.ambient[ 1 ];
|
||||
b *= Global::DayLight.ambient[2];
|
||||
#endif
|
||||
if (linealpha > 1.0)
|
||||
linealpha = 1.0; // trzeba ograniczyć do <=1
|
||||
if (linealpha > 1.0f)
|
||||
linealpha = 1.0f; // trzeba ograniczyć do <=1
|
||||
glColor4f(r, g, b, linealpha);
|
||||
if (!uiDisplayList)
|
||||
Optimize(); // generowanie DL w miarę potrzeby
|
||||
@@ -475,8 +475,8 @@ void TTraction::RenderVBO(float mgn, int iPtr)
|
||||
if (!Global::bSmoothTraction)
|
||||
glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient
|
||||
float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness
|
||||
if (linealpha > 1.2)
|
||||
linealpha = 1.2; // zbyt grube nie są dobre
|
||||
if (linealpha > 1.2f)
|
||||
linealpha = 1.2f; // zbyt grube nie są dobre
|
||||
glLineWidth(linealpha);
|
||||
// McZapkie-261102: kolor zalezy od materialu i zasniedzenia
|
||||
float r, g, b;
|
||||
@@ -486,51 +486,51 @@ void TTraction::RenderVBO(float mgn, int iPtr)
|
||||
case 1:
|
||||
if (TestFlag(DamageFlag, 1))
|
||||
{
|
||||
r = 0.00000;
|
||||
g = 0.32549;
|
||||
b = 0.2882353; // zielona miedź
|
||||
r = 0.00000f;
|
||||
g = 0.32549f;
|
||||
b = 0.2882353f; // zielona miedź
|
||||
}
|
||||
else
|
||||
{
|
||||
r = 0.35098;
|
||||
g = 0.22549;
|
||||
b = 0.1; // czerwona miedź
|
||||
r = 0.35098f;
|
||||
g = 0.22549f;
|
||||
b = 0.1f; // czerwona miedź
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (TestFlag(DamageFlag, 1))
|
||||
{
|
||||
r = 0.10;
|
||||
g = 0.10;
|
||||
b = 0.10; // czarne Al
|
||||
r = 0.10f;
|
||||
g = 0.10f;
|
||||
b = 0.10f; // czarne Al
|
||||
}
|
||||
else
|
||||
{
|
||||
r = 0.25;
|
||||
g = 0.25;
|
||||
b = 0.25; // srebrne Al
|
||||
r = 0.25f;
|
||||
g = 0.25f;
|
||||
b = 0.25f; // srebrne Al
|
||||
}
|
||||
break;
|
||||
// tymczasowo pokazanie zasilanych odcinków
|
||||
case 4:
|
||||
r = 0.5;
|
||||
g = 0.5;
|
||||
b = 1.0;
|
||||
r = 0.5f;
|
||||
g = 0.5f;
|
||||
b = 1.0f;
|
||||
break; // niebieskie z podłączonym zasilaniem
|
||||
case 5:
|
||||
r = 1.0;
|
||||
g = 0.0;
|
||||
b = 0.0;
|
||||
r = 1.0f;
|
||||
g = 0.0f;
|
||||
b = 0.0f;
|
||||
break; // czerwone z podłączonym zasilaniem 1
|
||||
case 6:
|
||||
r = 0.0;
|
||||
g = 1.0;
|
||||
b = 0.0;
|
||||
r = 0.0f;
|
||||
g = 1.0f;
|
||||
b = 0.0f;
|
||||
break; // zielone z podłączonym zasilaniem 2
|
||||
case 7:
|
||||
r = 1.0;
|
||||
g = 1.0;
|
||||
b = 0.0;
|
||||
r = 1.0f;
|
||||
g = 1.0f;
|
||||
b = 0.0f;
|
||||
break; //żółte z podłączonym zasilaniem z obu stron
|
||||
}
|
||||
#ifdef EU07_USE_OLD_LIGHTING_MODEL
|
||||
@@ -542,8 +542,8 @@ void TTraction::RenderVBO(float mgn, int iPtr)
|
||||
g *= Global::DayLight.ambient[ 1 ];
|
||||
b *= Global::DayLight.ambient[ 2 ];
|
||||
#endif
|
||||
if (linealpha > 1.0)
|
||||
linealpha = 1.0; // trzeba ograniczyć do <=1
|
||||
if (linealpha > 1.0f)
|
||||
linealpha = 1.0f; // trzeba ograniczyć do <=1
|
||||
glColor4f(r, g, b, linealpha);
|
||||
glDrawArrays(GL_LINES, iPtr, iLines);
|
||||
glLineWidth(1.0);
|
||||
@@ -680,7 +680,7 @@ double TTraction::VoltageGet(double u, double i)
|
||||
return psPowered->CurrentGet(res) *
|
||||
res; // yB: dla zasilanego nie baw się w gwiazdy, tylko bierz bezpośrednio
|
||||
double r0t, r1t, r0g, r1g;
|
||||
double u0, u1, i0, i1;
|
||||
double i0, i1;
|
||||
r0t = fResistance[0]; //średni pomysł, ale lepsze niż nic
|
||||
r1t = fResistance[1]; // bo nie uwzględnia spadków z innych pojazdów
|
||||
if (psPower[0] && psPower[1])
|
||||
|
||||
@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include "gl/glew.h"
|
||||
#include "GL/glew.h"
|
||||
#include "VBO.h"
|
||||
#include "dumb3d.h"
|
||||
|
||||
|
||||
36
Train.cpp
36
Train.cpp
@@ -776,7 +776,7 @@ if ((mvControlled->PantFrontVolt) || (mvControlled->PantRearVolt) ||
|
||||
dsbSwitch->Play(0, 0, 0);
|
||||
}
|
||||
/*
|
||||
if (Console::Pressed(VK_CONTROL))
|
||||
if (Global::ctrlState)
|
||||
{//z [Ctrl] zapalamy albo gasimy światełko w kabinie
|
||||
if (iCabLightFlag<2) ++iCabLightFlag; //zapalenie
|
||||
}
|
||||
@@ -1838,9 +1838,8 @@ if
|
||||
ctrain_pneumatic))
|
||||
{
|
||||
rsHiss.Play(1, DSBPLAY_LOOPING, true, tmp->GetPosition());
|
||||
DynamicObject->SetPneumatic(CouplNr,
|
||||
1); // Ra: to mi się nie podoba !!!!
|
||||
tmp->SetPneumatic(CouplNr, 1);
|
||||
DynamicObject->SetPneumatic(CouplNr != 0, true); // Ra: to mi się nie podoba !!!!
|
||||
tmp->SetPneumatic(CouplNr != 0, true);
|
||||
}
|
||||
}
|
||||
else if (!TestFlag(tmp->MoverParameters->Couplers[CouplNr].CouplingFlag,
|
||||
@@ -1860,9 +1859,8 @@ if
|
||||
// rsHiss.Play(1,DSBPLAY_LOOPING,true,tmp->GetPosition());
|
||||
dsbCouplerDetach->SetVolume(DSBVOLUME_MAX);
|
||||
dsbCouplerDetach->Play(0, 0, 0);
|
||||
DynamicObject->SetPneumatic(CouplNr,
|
||||
0); // Ra: to mi się nie podoba !!!!
|
||||
tmp->SetPneumatic(CouplNr, 0);
|
||||
DynamicObject->SetPneumatic(CouplNr != 0, false); // Ra: to mi się nie podoba !!!!
|
||||
tmp->SetPneumatic(CouplNr != 0, false);
|
||||
}
|
||||
}
|
||||
else if (!TestFlag(tmp->MoverParameters->Couplers[CouplNr].CouplingFlag,
|
||||
@@ -1900,8 +1898,8 @@ if
|
||||
// rsHiss.Play(1,DSBPLAY_LOOPING,true,tmp->GetPosition());
|
||||
dsbCouplerDetach->SetVolume(DSBVOLUME_MAX);
|
||||
dsbCouplerDetach->Play(0, 0, 0);
|
||||
DynamicObject->SetPneumatic(CouplNr, 0);
|
||||
tmp->SetPneumatic(CouplNr, 0);
|
||||
DynamicObject->SetPneumatic(CouplNr != 0, false);
|
||||
tmp->SetPneumatic(CouplNr != 0, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1999,7 +1997,7 @@ if
|
||||
dsbSwitch->Play(0, 0, 0);
|
||||
}
|
||||
/*
|
||||
if (Console::Pressed(VK_CONTROL))
|
||||
if (Global::ctrlState)
|
||||
{//z [Ctrl] zapalamy albo gasimy światełko w kabinie
|
||||
if (iCabLightFlag) --iCabLightFlag; //gaszenie
|
||||
} */
|
||||
@@ -4428,7 +4426,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
}
|
||||
|
||||
// if (
|
||||
// Console::Pressed(VK_SHIFT)&&Console::Pressed(Global::Keys[k_Compressor])&&((mvControlled->EngineType==ElectricSeriesMotor)||(mvControlled->TrainType==dt_EZT))
|
||||
// Global::shiftState&&Console::Pressed(Global::Keys[k_Compressor])&&((mvControlled->EngineType==ElectricSeriesMotor)||(mvControlled->TrainType==dt_EZT))
|
||||
// ) //NBMX 14-09-2003: sprezarka wl
|
||||
if (Global::shiftState && Console::Pressed(Global::Keys[k_Compressor]) &&
|
||||
(mvControlled->CompressorPower < 2)) // hunter-091012: tak jest poprawnie
|
||||
@@ -4448,7 +4446,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
}
|
||||
|
||||
// if (
|
||||
// !Console::Pressed(VK_SHIFT)&&Console::Pressed(Global::Keys[k_Compressor])&&((mvControlled->EngineType==ElectricSeriesMotor)||(mvControlled->TrainType==dt_EZT))
|
||||
// !Global::shiftState&&Console::Pressed(Global::Keys[k_Compressor])&&((mvControlled->EngineType==ElectricSeriesMotor)||(mvControlled->TrainType==dt_EZT))
|
||||
// ) //NBMX 14-09-2003: sprezarka wl
|
||||
if (!Global::shiftState && Console::Pressed(Global::Keys[k_Compressor]) &&
|
||||
(mvControlled->CompressorPower < 2)) // hunter-091012: tak jest poprawnie
|
||||
@@ -4591,10 +4589,10 @@ bool TTrain::Update( double const Deltatime )
|
||||
if (ggUniversal3Button.SubModel)
|
||||
|
||||
|
||||
if (Console::Pressed(VK_CONTROL))
|
||||
if (Global::ctrlState)
|
||||
{//z [Ctrl] zapalamy albo gasimy światełko w kabinie
|
||||
//tutaj jest bez sensu, trzeba reagować na wciskanie klawisza!
|
||||
if (Console::Pressed(VK_SHIFT))
|
||||
if (Global::shiftState)
|
||||
{//zapalenie
|
||||
if (iCabLightFlag<2) ++iCabLightFlag;
|
||||
}
|
||||
@@ -4606,7 +4604,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
}
|
||||
else
|
||||
{//bez [Ctrl] przełączamy cośtem
|
||||
if (Console::Pressed(VK_SHIFT))
|
||||
if (Global::shiftState)
|
||||
{
|
||||
ggUniversal3Button.PutValue(1); //hunter-131211: z UpdateValue na
|
||||
PutValue - by zachowywal sie jak pozostale przelaczniki
|
||||
@@ -4647,7 +4645,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
if (Console::Pressed(Global::Keys[k_Univ4]))
|
||||
{
|
||||
if (ggUniversal4Button.SubModel)
|
||||
if (Console::Pressed(VK_SHIFT))
|
||||
if (Global::shiftState)
|
||||
{
|
||||
ActiveUniversal4=true;
|
||||
//ggUniversal4Button.UpdateValue(1);
|
||||
@@ -4851,7 +4849,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
if (Global::shiftState)
|
||||
{
|
||||
// if (Console::Pressed(k_CurrentNext))
|
||||
{ // Ra: było pod VK_F3
|
||||
{ // Ra: było pod GLFW_KEY_F3
|
||||
if ((mvOccupied->EpFuseSwitch(true)))
|
||||
{
|
||||
dsbPneumaticSwitch->SetVolume(-10);
|
||||
@@ -4862,7 +4860,7 @@ bool TTrain::Update( double const Deltatime )
|
||||
else
|
||||
{
|
||||
// if (Console::Pressed(k_CurrentNext))
|
||||
{ // Ra: było pod VK_F3
|
||||
{ // Ra: było pod GLFW_KEY_F3
|
||||
if (Global::ctrlState)
|
||||
{
|
||||
if ((mvOccupied->EpFuseSwitch(false)))
|
||||
@@ -5105,7 +5103,6 @@ bool TTrain::CabChange(int iDirection)
|
||||
// wczytywanie pliku z danymi multimedialnymi (dzwieki, kontrolki, kabiny)
|
||||
bool TTrain::LoadMMediaFile(std::string const &asFileName)
|
||||
{
|
||||
double dSDist;
|
||||
cParser parser(asFileName, cParser::buffer_FILE);
|
||||
// NOTE: yaml-style comments are disabled until conflict in use of # is resolved
|
||||
// parser.addCommentStyle( "#", "\n" );
|
||||
@@ -5412,7 +5409,6 @@ bool TTrain::InitializeCab(int NewCabNo, std::string const &asFileName)
|
||||
pyScreens.reset(this);
|
||||
pyScreens.setLookupPath(DynamicObject->asBaseDir);
|
||||
bool parse = false;
|
||||
double dSDist;
|
||||
int cabindex = 0;
|
||||
DynamicObject->mdKabina = NULL; // likwidacja wskaźnika na dotychczasową kabinę
|
||||
switch (NewCabNo)
|
||||
|
||||
4
Train.h
4
Train.h
@@ -32,10 +32,10 @@ const int maxcab = 2;
|
||||
|
||||
// const double fCzuwakTime= 90.0f;
|
||||
const double fCzuwakBlink = 0.15;
|
||||
const float fConverterPrzekaznik = 1.5; // hunter-261211: do przekaznika nadmiarowego przetwornicy
|
||||
const float fConverterPrzekaznik = 1.5f; // hunter-261211: do przekaznika nadmiarowego przetwornicy
|
||||
// 0.33f
|
||||
// const double fBuzzerTime= 5.0f;
|
||||
const float fHaslerTime = 1.2;
|
||||
const float fHaslerTime = 1.2f;
|
||||
|
||||
// const double fStycznTime= 0.5f;
|
||||
// const double fDblClickTime= 0.2f;
|
||||
|
||||
@@ -303,8 +303,8 @@ bool TTrackFollower::ComputatePosition()
|
||||
return false;
|
||||
}
|
||||
#if RENDER_CONE
|
||||
#include "opengl/glew.h"
|
||||
#include "opengl/glut.h"
|
||||
#include "GL/glew.h"
|
||||
#include "GL/glut.h"
|
||||
void TTrackFollower::Render(float fNr)
|
||||
{ // funkcja rysująca stożek w miejscu osi
|
||||
glPushMatrix(); // matryca kamery
|
||||
|
||||
30
VBO.cpp
30
VBO.cpp
@@ -9,9 +9,39 @@ http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "VBO.h"
|
||||
#include "GL/glew.h"
|
||||
#include "usefull.h"
|
||||
#include "sn_utils.h"
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void CVertNormTex::deserialize(std::istream &s)
|
||||
{
|
||||
x = sn_utils::ld_float32(s);
|
||||
y = sn_utils::ld_float32(s);
|
||||
z = sn_utils::ld_float32(s);
|
||||
|
||||
nx = sn_utils::ld_float32(s);
|
||||
ny = sn_utils::ld_float32(s);
|
||||
nz = sn_utils::ld_float32(s);
|
||||
|
||||
u = sn_utils::ld_float32(s);
|
||||
v = sn_utils::ld_float32(s);
|
||||
}
|
||||
|
||||
void CVertNormTex::serialize(std::ostream &s)
|
||||
{
|
||||
sn_utils::ls_float32(s, x);
|
||||
sn_utils::ls_float32(s, y);
|
||||
sn_utils::ls_float32(s, z);
|
||||
|
||||
sn_utils::ls_float32(s, nx);
|
||||
sn_utils::ls_float32(s, ny);
|
||||
sn_utils::ls_float32(s, nz);
|
||||
|
||||
sn_utils::ls_float32(s, u);
|
||||
sn_utils::ls_float32(s, v);
|
||||
}
|
||||
|
||||
CMesh::CMesh()
|
||||
{ // utworzenie pustego obiektu
|
||||
m_pVNT = nullptr;
|
||||
|
||||
3
VBO.h
3
VBO.h
@@ -21,6 +21,9 @@ class CVertNormTex
|
||||
float nz = 0.0; // Z wektora normalnego
|
||||
float u = 0.0; // U mapowania
|
||||
float v = 0.0; // V mapowania
|
||||
|
||||
void deserialize(std::istream&);
|
||||
void serialize(std::ostream&);
|
||||
};
|
||||
|
||||
class CMesh
|
||||
|
||||
1
World.h
1
World.h
@@ -9,6 +9,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <string>
|
||||
#include "Camera.h"
|
||||
#include "Ground.h"
|
||||
|
||||
4
color.h
4
color.h
@@ -7,9 +7,9 @@ float3
|
||||
XYZtoRGB( float3 const &XYZ ) {
|
||||
|
||||
// M^-1 for Adobe RGB from http://www.brucelindbloom.com/Eqn_RGB_XYZ_Matrix.html
|
||||
float const mi[ 3 ][ 3 ] = { 2.041369, -0.969266, 0.0134474, -0.5649464, 1.8760108, -0.1183897, -0.3446944, 0.041556, 1.0154096 };
|
||||
float const mi[ 3 ][ 3 ] = { 2.041369f, -0.969266f, 0.0134474f, -0.5649464f, 1.8760108f, -0.1183897f, -0.3446944f, 0.041556f, 1.0154096f };
|
||||
// m^-1 for sRGB:
|
||||
// float const mi[ 3 ][ 3 ] = { 3.240479, -0.969256, 0.055648, -1.53715, 1.875991, -0.204043, -0.49853, 0.041556, 1.057311 };
|
||||
// float const mi[ 3 ][ 3 ] = { 3.240479f, -0.969256f, 0.055648f, -1.53715f, 1.875991f, -0.204043f, -0.49853f, 0.041556f, 1.057311f };
|
||||
|
||||
return float3{
|
||||
XYZ.x*mi[ 0 ][ 0 ] + XYZ.y*mi[ 1 ][ 0 ] + XYZ.z*mi[ 2 ][ 0 ],
|
||||
|
||||
@@ -9,7 +9,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
#ifndef GeometryH
|
||||
#define GeometryH
|
||||
|
||||
#include "gl/glew.h"
|
||||
#include "GL/glew.h"
|
||||
#include "dumb3d.h"
|
||||
using namespace Math3D;
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -65,7 +65,7 @@ cParser::~cParser()
|
||||
}
|
||||
|
||||
// methods
|
||||
bool cParser::getTokens(int Count, bool ToLower, const char *Break)
|
||||
bool cParser::getTokens(unsigned int Count, bool ToLower, const char *Break)
|
||||
{
|
||||
tokens.clear(); // emulates old parser behaviour. TODO, TBD: allow manual reset?
|
||||
/*
|
||||
@@ -79,7 +79,7 @@ bool cParser::getTokens(int Count, bool ToLower, const char *Break)
|
||||
this->str("");
|
||||
this->clear();
|
||||
*/
|
||||
for (int i = 0; i < Count; ++i)
|
||||
for (unsigned int i = 0; i < Count; ++i)
|
||||
{
|
||||
std::string token = readToken(ToLower, Break);
|
||||
if( true == token.empty() ) {
|
||||
|
||||
2
parser.h
2
parser.h
@@ -77,7 +77,7 @@ class cParser //: public std::stringstream
|
||||
{
|
||||
return !mStream->fail();
|
||||
};
|
||||
bool getTokens(int Count = 1, bool ToLower = true, const char *Break = "\n\r\t ;");
|
||||
bool getTokens(unsigned int Count = 1, bool ToLower = true, const char *Break = "\n\r\t ;");
|
||||
// returns percentage of file processed so far
|
||||
int getProgress() const;
|
||||
// add custom definition of text which should be ignored when retrieving tokens
|
||||
|
||||
17
python_var_doc.md
Normal file
17
python_var_doc.md
Normal 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 |
|
||||
@@ -35,7 +35,7 @@ opengl_renderer::Init() {
|
||||
void
|
||||
opengl_renderer::Update_Lights( light_array const &Lights ) {
|
||||
|
||||
int const count = std::min( m_lights.size(), Lights.data.size() );
|
||||
size_t const count = std::min( m_lights.size(), Lights.data.size() );
|
||||
if( count == 0 ) { return; }
|
||||
|
||||
auto renderlight = m_lights.begin();
|
||||
@@ -86,9 +86,9 @@ opengl_renderer::Update_Lights( light_array const &Lights ) {
|
||||
void
|
||||
opengl_renderer::Disable_Lights() {
|
||||
|
||||
for( int idx = 0; idx < m_lights.size() + 1; ++idx ) {
|
||||
for( size_t idx = 0; idx < m_lights.size() + 1; ++idx ) {
|
||||
|
||||
::glDisable( GL_LIGHT0 + idx );
|
||||
::glDisable( GL_LIGHT0 + (int)idx );
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -9,14 +9,14 @@ http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "gl/glew.h"
|
||||
#include "GL/glew.h"
|
||||
#include "texture.h"
|
||||
#include "lightarray.h"
|
||||
#include "dumb3d.h"
|
||||
|
||||
struct opengl_light {
|
||||
|
||||
GLuint id{ -1 };
|
||||
GLuint id{ (GLuint)-1 };
|
||||
Math3D::vector3 direction;
|
||||
GLfloat position[ 4 ]; // 4th parameter specifies directional(0) or omni-directional(1) light source
|
||||
GLfloat ambient[ 4 ];
|
||||
@@ -42,7 +42,7 @@ struct opengl_light {
|
||||
|
||||
glLightfv( id, GL_POSITION, position );
|
||||
if( position[ 3 ] == 1.0f ) {
|
||||
GLfloat directionarray[] = { direction.x, direction.y, direction.z };
|
||||
GLfloat directionarray[] = { (GLfloat)direction.x, (GLfloat)direction.y, (GLfloat)direction.z };
|
||||
glLightfv( id, GL_SPOT_DIRECTION, directionarray );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,9 +45,9 @@ private:
|
||||
std::vector<std::uint16_t> m_indices;
|
||||
// std::vector<float3> m_normals;
|
||||
std::vector<float3> m_colours;
|
||||
GLuint m_vertexbuffer{ -1 };
|
||||
GLuint m_indexbuffer{ -1 };
|
||||
GLuint m_coloursbuffer{ -1 };
|
||||
GLuint m_vertexbuffer{ (GLuint)-1 };
|
||||
GLuint m_indexbuffer{ (GLuint)-1 };
|
||||
GLuint m_coloursbuffer{ (GLuint)-1 };
|
||||
|
||||
static float m_distributionluminance[ 5 ][ 2 ];
|
||||
static float m_distributionxcomp[ 5 ][ 2 ];
|
||||
|
||||
136
sn_utils.cpp
Normal file
136
sn_utils.cpp
Normal 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
23
sn_utils.h
Normal 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);
|
||||
};
|
||||
3
stdafx.h
3
stdafx.h
@@ -18,12 +18,14 @@
|
||||
#endif // _DEBUG
|
||||
#endif
|
||||
// operating system
|
||||
#ifdef _WINDOWS
|
||||
#include "targetver.h"
|
||||
#define NOMINMAX
|
||||
#include <windows.h>
|
||||
#include <shlobj.h>
|
||||
#undef NOMINMAX
|
||||
#include <dbghelp.h>
|
||||
#endif
|
||||
// stl
|
||||
#include <cstdlib>
|
||||
#include <cassert>
|
||||
@@ -65,4 +67,5 @@
|
||||
#define GLFW_DLL
|
||||
#endif
|
||||
#define GLFW_INCLUDE_GLU
|
||||
//m7todo: jest tu bo nie chcia³o mi siê wpychaæ do wszystkich plików
|
||||
#include <GLFW/glfw3.h>
|
||||
4
sun.h
4
sun.h
@@ -1,8 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "windows.h"
|
||||
#include "gl/glew.h"
|
||||
#include "gl/wglew.h"
|
||||
#include "GL/glew.h"
|
||||
#include "GL/wglew.h"
|
||||
#include "dumb3d.h"
|
||||
|
||||
|
||||
|
||||
72
windows.cpp
Normal file
72
windows.cpp
Normal 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 );
|
||||
};
|
||||
Reference in New Issue
Block a user