16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 12:49:18 +02:00

merge branch 'renderer_upgrades'

This commit is contained in:
tmj-fstate
2017-02-13 22:16:31 +01:00
21 changed files with 863 additions and 989 deletions

View File

@@ -449,12 +449,16 @@ bool TAnimModel::Init(std::string const &asName, std::string const &asReplacable
asText = asReplacableTexture.substr(1, asReplacableTexture.length() - 1); // zapamiętanie tekstu asText = asReplacableTexture.substr(1, asReplacableTexture.length() - 1); // zapamiętanie tekstu
else if (asReplacableTexture != "none") else if (asReplacableTexture != "none")
ReplacableSkinId[1] = ReplacableSkinId[1] =
TTexturesManager::GetTextureID(NULL, NULL, asReplacableTexture.c_str()); TextureManager.GetTextureId( asReplacableTexture, "" );
if (TTexturesManager::GetAlpha(ReplacableSkinId[1])) if( ( ReplacableSkinId[ 1 ] != 0 )
iTexAlpha = && ( TextureManager.Texture( ReplacableSkinId[ 1 ] ).has_alpha ) ) {
0x31310031; // tekstura z kanałem alfa - nie renderować w cyklu nieprzezroczystych // tekstura z kanałem alfa - nie renderować w cyklu nieprzezroczystych
else iTexAlpha = 0x31310031;
iTexAlpha = 0x30300030; // tekstura nieprzezroczysta - nie renderować w cyklu }
else{
// tekstura nieprzezroczysta - nie renderować w cyklu
iTexAlpha = 0x30300030;
}
// przezroczystych // przezroczystych
return (Init(TModelsManager::GetModel(asName.c_str()))); return (Init(TModelsManager::GetModel(asName.c_str())));
} }

View File

@@ -16,6 +16,7 @@ http://mozilla.org/MPL/2.0/.
#define AnimModelH #define AnimModelH
#include "Model3d.h" #include "Model3d.h"
#include "Texture.h"
const int iMaxNumLights = 8; const int iMaxNumLights = 8;
@@ -148,7 +149,7 @@ class TAnimModel
void RaAnimate(); // przeliczenie animacji egzemplarza void RaAnimate(); // przeliczenie animacji egzemplarza
void RaPrepare(); // ustawienie animacji egzemplarza na wzorcu void RaPrepare(); // ustawienie animacji egzemplarza na wzorcu
public: public:
GLuint ReplacableSkinId[5]; // McZapkie-020802: zmienialne skory texture_manager::size_type ReplacableSkinId[5]; // McZapkie-020802: zmienialne skory
static TAnimContainer *acAnimList; // lista animacji z eventem, które muszą być przeliczane static TAnimContainer *acAnimList; // lista animacji z eventem, które muszą być przeliczane
// również bez wyświetlania // również bez wyświetlania
TAnimModel(); TAnimModel();

View File

@@ -4424,7 +4424,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
Global::asCurrentTexturePath + ReplacableSkin; // skory tez z dynamic/... Global::asCurrentTexturePath + ReplacableSkin; // skory tez z dynamic/...
std::string x = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie std::string x = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie
if (!x.empty()) if (!x.empty())
ReplacableSkinID[4] = TTexturesManager::GetTextureID(NULL, NULL, Global::asCurrentTexturePath + "nowhere", 9); ReplacableSkinID[4] = TextureManager.GetTextureId( Global::asCurrentTexturePath + "nowhere", "", 9);
/* /*
if ((i = ReplacableSkin.Pos("|")) > 0) // replacable dzielone if ((i = ReplacableSkin.Pos("|")) > 0) // replacable dzielone
{ {
@@ -4487,24 +4487,22 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
*/ */
if (iMultiTex > 0) if (iMultiTex > 0)
{ // jeśli model ma 4 tekstury { // jeśli model ma 4 tekstury
ReplacableSkinID[1] = TTexturesManager::GetTextureID( ReplacableSkinID[1] = TextureManager.GetTextureId(
NULL, NULL, ReplacableSkin + ",1", Global::iDynamicFiltering); ReplacableSkin + ",1", "", Global::iDynamicFiltering);
if (ReplacableSkinID[1]) if (ReplacableSkinID[1])
{ // pierwsza z zestawu znaleziona { // pierwsza z zestawu znaleziona
ReplacableSkinID[2] = TTexturesManager::GetTextureID( ReplacableSkinID[2] = TextureManager.GetTextureId(
NULL, NULL, ReplacableSkin + ",2", Global::iDynamicFiltering); ReplacableSkin + ",2", "", Global::iDynamicFiltering);
if (ReplacableSkinID[2]) if (ReplacableSkinID[2])
{ {
iMultiTex = 2; // już są dwie iMultiTex = 2; // już są dwie
ReplacableSkinID[3] = TTexturesManager::GetTextureID( ReplacableSkinID[3] = TextureManager.GetTextureId(
NULL, NULL, ReplacableSkin + ",3", ReplacableSkin + ",3", "", Global::iDynamicFiltering);
Global::iDynamicFiltering);
if (ReplacableSkinID[3]) if (ReplacableSkinID[3])
{ {
iMultiTex = 3; // a teraz nawet trzy iMultiTex = 3; // a teraz nawet trzy
ReplacableSkinID[4] = TTexturesManager::GetTextureID( ReplacableSkinID[4] = TextureManager.GetTextureId(
NULL, NULL, ReplacableSkin + ",4", ReplacableSkin + ",4", "", Global::iDynamicFiltering);
Global::iDynamicFiltering);
if (ReplacableSkinID[4]) if (ReplacableSkinID[4])
iMultiTex = 4; // jak są cztery, to blokujemy podmianę tekstury iMultiTex = 4; // jak są cztery, to blokujemy podmianę tekstury
// rozkładem // rozkładem
@@ -4514,14 +4512,14 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
else else
{ // zestaw nie zadziałał, próbujemy normanie { // zestaw nie zadziałał, próbujemy normanie
iMultiTex = 0; iMultiTex = 0;
ReplacableSkinID[1] = TTexturesManager::GetTextureID( ReplacableSkinID[1] = TextureManager.GetTextureId(
NULL, NULL, ReplacableSkin, Global::iDynamicFiltering); ReplacableSkin, "", Global::iDynamicFiltering);
} }
} }
else else
ReplacableSkinID[1] = TTexturesManager::GetTextureID( ReplacableSkinID[1] = TextureManager.GetTextureId(
NULL, NULL, ReplacableSkin, Global::iDynamicFiltering); ReplacableSkin, "", Global::iDynamicFiltering);
if (TTexturesManager::GetAlpha(ReplacableSkinID[1])) if (TextureManager.Texture(ReplacableSkinID[1]).has_alpha)
iAlpha = 0x31310031; // tekstura -1 z kanałem alfa - nie renderować w cyklu iAlpha = 0x31310031; // tekstura -1 z kanałem alfa - nie renderować w cyklu
// nieprzezroczystych // nieprzezroczystych
else else
@@ -4529,21 +4527,22 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
// renderować w // renderować w
// cyklu przezroczystych // cyklu przezroczystych
if (ReplacableSkinID[2]) if (ReplacableSkinID[2])
if (TTexturesManager::GetAlpha(ReplacableSkinID[2])) if (TextureManager.Texture(ReplacableSkinID[2]).has_alpha)
iAlpha |= 0x02020002; // tekstura -2 z kanałem alfa - nie renderować iAlpha |= 0x02020002; // tekstura -2 z kanałem alfa - nie renderować
// w cyklu // w cyklu
// nieprzezroczystych // nieprzezroczystych
if (ReplacableSkinID[3]) if (ReplacableSkinID[3])
if (TTexturesManager::GetAlpha(ReplacableSkinID[3])) if (TextureManager.Texture(ReplacableSkinID[3]).has_alpha)
iAlpha |= 0x04040004; // tekstura -3 z kanałem alfa - nie renderować iAlpha |= 0x04040004; // tekstura -3 z kanałem alfa - nie renderować
// w cyklu // w cyklu
// nieprzezroczystych // nieprzezroczystych
if (ReplacableSkinID[4]) if (ReplacableSkinID[4])
if (TTexturesManager::GetAlpha(ReplacableSkinID[4])) if (TextureManager.Texture(ReplacableSkinID[4]).has_alpha)
iAlpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować iAlpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować
// w cyklu // w cyklu
// nieprzezroczystych // nieprzezroczystych
} }
/*
// Winger 040304 - ladowanie przedsionkow dla EZT // Winger 040304 - ladowanie przedsionkow dla EZT
if (MoverParameters->TrainType == dt_EZT) if (MoverParameters->TrainType == dt_EZT)
{ {
@@ -4551,6 +4550,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
asModel = BaseDir + asModel; asModel = BaseDir + asModel;
mdPrzedsionek = TModelsManager::GetModel(asModel, true); mdPrzedsionek = TModelsManager::GetModel(asModel, true);
} }
*/
if (!MoverParameters->LoadAccepted.empty()) if (!MoverParameters->LoadAccepted.empty())
// if (MoverParameters->LoadAccepted!=AnsiString("")); // && // if (MoverParameters->LoadAccepted!=AnsiString("")); // &&
// MoverParameters->LoadType!=AnsiString("passengers")) // MoverParameters->LoadType!=AnsiString("passengers"))
@@ -5856,13 +5856,13 @@ void TDynamicObject::DestinationSet(std::string to, std::string numer)
std::string x = TextureTest(asBaseDir + numer + "@" + MoverParameters->TypeName); std::string x = TextureTest(asBaseDir + numer + "@" + MoverParameters->TypeName);
if (!x.empty()) if (!x.empty())
{ {
ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x, 9); // rozmywania 0,1,4,5 nie nadają się ReplacableSkinID[4] = TextureManager.GetTextureId( x, "", 9); // rozmywania 0,1,4,5 nie nadają się
return; return;
} }
x = TextureTest(asBaseDir + numer ); x = TextureTest(asBaseDir + numer );
if (!x.empty()) if (!x.empty())
{ {
ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x, 9); // rozmywania 0,1,4,5 nie nadają się ReplacableSkinID[4] = TextureManager.GetTextureId( x, "", 9); // rozmywania 0,1,4,5 nie nadają się
return; return;
} }
if (to.empty()) if (to.empty())
@@ -5870,17 +5870,17 @@ void TDynamicObject::DestinationSet(std::string to, std::string numer)
x = TextureTest(asBaseDir + to + "@" + MoverParameters->TypeName); // w pierwszej kolejności z nazwą FIZ/MMD x = TextureTest(asBaseDir + to + "@" + MoverParameters->TypeName); // w pierwszej kolejności z nazwą FIZ/MMD
if (!x.empty()) if (!x.empty())
{ {
ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x, 9); // rozmywania 0,1,4,5 nie nadają się ReplacableSkinID[4] = TextureManager.GetTextureId( x, "", 9); // rozmywania 0,1,4,5 nie nadają się
return; return;
} }
x = TextureTest(asBaseDir + to); // na razie prymitywnie x = TextureTest(asBaseDir + to); // na razie prymitywnie
if (!x.empty()) if (!x.empty())
ReplacableSkinID[4] = TTexturesManager::GetTextureID( NULL, NULL, x, 9); // rozmywania 0,1,4,5 nie nadają się ReplacableSkinID[4] = TextureManager.GetTextureId( x, "", 9); // rozmywania 0,1,4,5 nie nadają się
else else
{ {
x = TextureTest(asBaseDir + "nowhere"); // jak nie znalazł dedykowanej, to niech daje nowhere x = TextureTest(asBaseDir + "nowhere"); // jak nie znalazł dedykowanej, to niech daje nowhere
if (!x.empty()) if (!x.empty())
ReplacableSkinID[4] = TTexturesManager::GetTextureID(NULL, NULL, x, 9); ReplacableSkinID[4] = TextureManager.GetTextureId( x, "", 9);
} }
// Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa // Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa
// tekstury nr 4 // tekstury nr 4

View File

@@ -395,7 +395,7 @@ private:
int iCabs; // maski bitowe modeli kabin int iCabs; // maski bitowe modeli kabin
TTrack *MyTrack; // McZapkie-030303: tor na ktorym stoi, ABu TTrack *MyTrack; // McZapkie-030303: tor na ktorym stoi, ABu
std::string asBaseDir; std::string asBaseDir;
GLuint ReplacableSkinID[5]; // McZapkie:zmienialne nadwozie texture_manager::size_type ReplacableSkinID[5]; // McZapkie:zmienialne nadwozie
int iAlpha; // maska przezroczystości tekstur int iAlpha; // maska przezroczystości tekstur
int iMultiTex; //<0 tekstury wskazane wpisem, >0 tekstury z przecinkami, =0 jedna int iMultiTex; //<0 tekstury wskazane wpisem, >0 tekstury z przecinkami, =0 jedna
int iOverheadMask; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały int iOverheadMask; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały

View File

@@ -63,6 +63,13 @@ int InitGL(GLvoid) // All Setup For OpenGL Goes Here
// _clear87(); // _clear87();
// _control87(MCW_EM, MCW_EM); // _control87(MCW_EM, MCW_EM);
glewInit(); glewInit();
if( !GLEW_VERSION_1_4 ) {
// experimental: require at least openGL 1.4
Error( "This application requires openGL version 1.4 (or better)" );
return 0;
}
// hunter-271211: przeniesione // hunter-271211: przeniesione
// AllocConsole(); // AllocConsole();
// SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN); // SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);

View File

@@ -60,8 +60,8 @@ int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0,
double Global::fSunDeclination = 0.0; // deklinacja Słońca double Global::fSunDeclination = 0.0; // deklinacja Słońca
double Global::fTimeAngleDeg = 0.0; // godzina w postaci kąta double Global::fTimeAngleDeg = 0.0; // godzina w postaci kąta
float Global::fClockAngleDeg[6]; // kąty obrotu cylindrów dla zegara cyfrowego float Global::fClockAngleDeg[6]; // kąty obrotu cylindrów dla zegara cyfrowego
char *Global::szTexturesTGA[4] = {"tga", "dds", "tex", "bmp"}; // lista tekstur od TGA std::string Global::szTexturesTGA = ".tga"; // lista tekstur od TGA
char *Global::szTexturesDDS[4] = {"dds", "tga", "tex", "bmp"}; // lista tekstur od DDS std::string Global::szTexturesDDS = ".dds"; // lista tekstur od DDS
int Global::iKeyLast = 0; // ostatnio naciśnięty klawisz w celu logowania int Global::iKeyLast = 0; // ostatnio naciśnięty klawisz w celu logowania
GLuint Global::iTextureId = 0; // ostatnio użyta tekstura 2D GLuint Global::iTextureId = 0; // ostatnio użyta tekstura 2D
int Global::iPause = 0x10; // globalna pauza ruchu int Global::iPause = 0x10; // globalna pauza ruchu
@@ -135,7 +135,7 @@ int Global::iDynamicFiltering = 5; // domyślne rozmywanie tekstur pojazdów
bool Global::bUseVBO = false; // czy jest VBO w karcie graficznej (czy użyć) bool Global::bUseVBO = false; // czy jest VBO w karcie graficznej (czy użyć)
GLint Global::iMaxTextureSize = 16384; // maksymalny rozmiar tekstury GLint Global::iMaxTextureSize = 16384; // maksymalny rozmiar tekstury
bool Global::bSmoothTraction = false; // wygładzanie drutów starym sposobem bool Global::bSmoothTraction = false; // wygładzanie drutów starym sposobem
char **Global::szDefaultExt = Global::szTexturesDDS; // domyślnie od DDS std::string Global::szDefaultExt = Global::szTexturesDDS; // domyślnie od DDS
int Global::iMultisampling = 2; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px int Global::iMultisampling = 2; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px
bool Global::bGlutFont = false; // czy tekst generowany przez GLUT32.DLL bool Global::bGlutFont = false; // czy tekst generowany przez GLUT32.DLL
int Global::iConvertModels = 7; // tworzenie plików binarnych, +2-optymalizacja transformów int Global::iConvertModels = 7; // tworzenie plików binarnych, +2-optymalizacja transformów
@@ -422,6 +422,12 @@ void Global::ConfigParse(cParser &Parser)
// domyślnie od TGA // domyślnie od TGA
Global::szDefaultExt = Global::szTexturesTGA; Global::szDefaultExt = Global::szTexturesTGA;
} }
else {
Global::szDefaultExt =
( token[ 0 ] == '.' ?
token :
"." + token );
}
} }
else if (token == "newaircouplers") else if (token == "newaircouplers")
{ {

View File

@@ -184,7 +184,7 @@ class Global
static double fFogStart; static double fFogStart;
static double fFogEnd; static double fFogEnd;
static TGround *pGround; static TGround *pGround;
static char **szDefaultExt; static std::string szDefaultExt;
static std::string SceneryFile; static std::string SceneryFile;
static char CreatorName1[20]; static char CreatorName1[20];
static char CreatorName2[20]; static char CreatorName2[20];
@@ -258,8 +258,8 @@ class Global
static double fTimeAngleDeg; // godzina w postaci kąta static double fTimeAngleDeg; // godzina w postaci kąta
static float fClockAngleDeg[6]; // kąty obrotu cylindrów dla zegara cyfrowego static float fClockAngleDeg[6]; // kąty obrotu cylindrów dla zegara cyfrowego
static double fLatitudeDeg; // szerokość geograficzna static double fLatitudeDeg; // szerokość geograficzna
static char *szTexturesTGA[4]; // lista tekstur od TGA static std::string szTexturesTGA; // lista tekstur od TGA
static char *szTexturesDDS[4]; // lista tekstur od DDS static std::string szTexturesDDS; // lista tekstur od DDS
static int iMultisampling; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px static int iMultisampling; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px
static bool bGlutFont; // tekst generowany przez GLUT static bool bGlutFont; // tekst generowany przez GLUT
static int iKeyLast; // ostatnio naciśnięty klawisz w celu logowania static int iKeyLast; // ostatnio naciśnięty klawisz w celu logowania

View File

@@ -276,7 +276,7 @@ void TGroundNode::RaRenderVBO()
{ // renderowanie z domyslnego bufora VBO { // renderowanie z domyslnego bufora VBO
glColor3ub(Diffuse[0], Diffuse[1], Diffuse[2]); glColor3ub(Diffuse[0], Diffuse[1], Diffuse[2]);
if (TextureID) if (TextureID)
glBindTexture(GL_TEXTURE_2D, TextureID); // Ustaw aktywną teksturę TextureManager.Bind(TextureID); // Ustaw aktywną teksturę
glDrawArrays(iType, iVboPtr, iNumVerts); // Narysuj naraz wszystkie trójkąty glDrawArrays(iType, iVboPtr, iNumVerts); // Narysuj naraz wszystkie trójkąty
} }
@@ -445,7 +445,7 @@ void TGroundNode::Compile(bool many)
#ifdef USE_VERTEX_ARRAYS #ifdef USE_VERTEX_ARRAYS
glVertexPointer(3, GL_DOUBLE, sizeof(vector3), &Points[0].x); glVertexPointer(3, GL_DOUBLE, sizeof(vector3), &Points[0].x);
#endif #endif
glBindTexture(GL_TEXTURE_2D, 0); TextureManager.Bind(0);
#ifdef USE_VERTEX_ARRAYS #ifdef USE_VERTEX_ARRAYS
glDrawArrays(iType, 0, iNumPts); glDrawArrays(iType, 0, iNumPts);
#else #else
@@ -466,7 +466,7 @@ void TGroundNode::Compile(bool many)
glTexCoordPointer(2, GL_FLOAT, sizeof(TGroundVertex), &tri->Vertices[0].tu); glTexCoordPointer(2, GL_FLOAT, sizeof(TGroundVertex), &tri->Vertices[0].tu);
#endif #endif
glColor3ub(tri->Diffuse[0], tri->Diffuse[1], tri->Diffuse[2]); glColor3ub(tri->Diffuse[0], tri->Diffuse[1], tri->Diffuse[2]);
glBindTexture(GL_TEXTURE_2D, Global::bWireFrame ? 0 : tri->TextureID); TextureManager.Bind(Global::bWireFrame ? 0 : tri->TextureID);
#ifdef USE_VERTEX_ARRAYS #ifdef USE_VERTEX_ARRAYS
glDrawArrays(Global::bWireFrame ? GL_LINE_LOOP : tri->iType, 0, tri->iNumVerts); glDrawArrays(Global::bWireFrame ? GL_LINE_LOOP : tri->iType, 0, tri->iNumVerts);
#else #else
@@ -494,7 +494,7 @@ void TGroundNode::Compile(bool many)
else if (iType == TP_MESH) else if (iType == TP_MESH)
{ // grupa ze wspólną teksturą - wrzucanie do wspólnego Display List { // grupa ze wspólną teksturą - wrzucanie do wspólnego Display List
if (TextureID) if (TextureID)
glBindTexture(GL_TEXTURE_2D, TextureID); // Ustaw aktywną teksturę TextureManager.Bind(TextureID); // Ustaw aktywną teksturę
TGroundNode *n = nNode; TGroundNode *n = nNode;
while (n ? n->TextureID == TextureID : false) while (n ? n->TextureID == TextureID : false)
{ // wszystkie obiekty o tej samej testurze { // wszystkie obiekty o tej samej testurze
@@ -2103,14 +2103,14 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
// PROBLEND Q: 13122011 - Szociu: 27012012 // PROBLEND Q: 13122011 - Szociu: 27012012
PROBLEND = true; // domyslnie uruchomione nowe wyświetlanie PROBLEND = true; // domyslnie uruchomione nowe wyświetlanie
tmp->PROBLEND = true; // odwolanie do tgroundnode, bo rendering jest w tej klasie tmp->PROBLEND = true; // odwolanie do tgroundnode, bo rendering jest w tej klasie
if (str.find("@") != string::npos) // sprawdza, czy w nazwie tekstury jest znak "@" if (str.find('@') != string::npos) // sprawdza, czy w nazwie tekstury jest znak "@"
{ {
PROBLEND = false; // jeśli jest, wyswietla po staremu PROBLEND = false; // jeśli jest, wyswietla po staremu
tmp->PROBLEND = false; tmp->PROBLEND = false;
} }
#endif #endif
tmp->TextureID = TTexturesManager::GetTextureID(szTexturePath, szSceneryPath, str.c_str()); tmp->TextureID = TextureManager.GetTextureId( str, szTexturePath );
tmp->iFlags = TTexturesManager::GetAlpha(tmp->TextureID) ? 0x220 : 0x210; // z usuwaniem tmp->iFlags = TextureManager.Texture(tmp->TextureID).has_alpha ? 0x220 : 0x210; // z usuwaniem
if (((tmp->iType == GL_TRIANGLES) && (tmp->iFlags & 0x10)) ? if (((tmp->iType == GL_TRIANGLES) && (tmp->iFlags & 0x10)) ?
Global::pTerrainCompact->TerrainLoaded() : Global::pTerrainCompact->TerrainLoaded() :
false) false)

View File

@@ -14,6 +14,7 @@ http://mozilla.org/MPL/2.0/.
#include "VBO.h" #include "VBO.h"
#include "Classes.h" #include "Classes.h"
#include "ResourceManager.h" #include "ResourceManager.h"
#include "Texture.h"
#include "dumb3d.h" #include "dumb3d.h"
#include "Names.h" #include "Names.h"
@@ -141,7 +142,7 @@ class TGroundNode : public Resource
GLuint DisplayListID; // numer siatki DisplayLists GLuint DisplayListID; // numer siatki DisplayLists
bool PROBLEND; bool PROBLEND;
int iVboPtr; // indeks w buforze VBO int iVboPtr; // indeks w buforze VBO
GLuint TextureID; // główna (jedna) tekstura obiektu texture_manager::size_type TextureID; // główna (jedna) tekstura obiektu
int iFlags; // tryb przezroczystości: 0x10-nieprz.,0x20-przezroczysty,0x30-mieszany int iFlags; // tryb przezroczystości: 0x10-nieprz.,0x20-przezroczysty,0x30-mieszany
int Ambient[4], Diffuse[4], Specular[4]; // oświetlenie int Ambient[4], Diffuse[4], Specular[4]; // oświetlenie
bool bVisible; bool bVisible;

View File

@@ -28,7 +28,7 @@ using namespace Mtable;
double TSubModel::fSquareDist = 0; double TSubModel::fSquareDist = 0;
int TSubModel::iInstance; // numer renderowanego egzemplarza obiektu int TSubModel::iInstance; // numer renderowanego egzemplarza obiektu
GLuint *TSubModel::ReplacableSkinId = NULL; texture_manager::size_type *TSubModel::ReplacableSkinId = NULL;
int TSubModel::iAlpha = 0x30300030; // maska do testowania flag tekstur wymiennych int TSubModel::iAlpha = 0x30300030; // maska do testowania flag tekstur wymiennych
TModel3d *TSubModel::pRoot; // Ra: tymczasowo wskaźnik na model widoczny z submodelu TModel3d *TSubModel::pRoot; // Ra: tymczasowo wskaźnik na model widoczny z submodelu
std::string *TSubModel::pasText; std::string *TSubModel::pasText;
@@ -411,13 +411,12 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
TextureNameSet(texture.c_str()); TextureNameSet(texture.c_str());
if (texture.find_first_of("/\\") == texture.npos) if (texture.find_first_of("/\\") == texture.npos)
texture.insert(0, Global::asCurrentTexturePath.c_str()); texture.insert(0, Global::asCurrentTexturePath.c_str());
TextureID = TTexturesManager::GetTextureID( TextureID = TextureManager.GetTextureId( texture, szTexturePath );
szTexturePath, const_cast<char *>(Global::asCurrentTexturePath.c_str()), texture);
// TexAlpha=TTexturesManager::GetAlpha(TextureID); // TexAlpha=TTexturesManager::GetAlpha(TextureID);
// iFlags|=TexAlpha?0x20:0x10; //0x10-nieprzezroczysta, 0x20-przezroczysta // iFlags|=TexAlpha?0x20:0x10; //0x10-nieprzezroczysta, 0x20-przezroczysta
if (Opacity < 1.0) // przezroczystość z tekstury brana tylko dla Opacity if (Opacity < 1.0) // przezroczystość z tekstury brana tylko dla Opacity
// 0! // 0!
iFlags |= TTexturesManager::GetAlpha(TextureID) ? iFlags |= TextureManager.Texture(TextureID).has_alpha ?
0x20 : 0x20 :
0x10; // 0x10-nieprzezroczysta, 0x20-przezroczysta 0x10; // 0x10-nieprzezroczysta, 0x20-przezroczysta
else else
@@ -616,7 +615,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
return iNumVerts; // do określenia wielkości VBO return iNumVerts; // do określenia wielkości VBO
}; };
int TSubModel::TriangleAdd(TModel3d *m, int tex, int tri) int TSubModel::TriangleAdd(TModel3d *m, texture_manager::size_type tex, int tri)
{ // dodanie trójkątów do submodelu, używane { // dodanie trójkątów do submodelu, używane
// przy tworzeniu E3D terenu // przy tworzeniu E3D terenu
TSubModel *s = this; TSubModel *s = this;
@@ -637,7 +636,7 @@ int TSubModel::TriangleAdd(TModel3d *m, int tex, int tri)
m->AddTo(this, s); m->AddTo(this, s);
} }
// s->asTexture=AnsiString(TTexturesManager::GetName(tex).c_str()); // s->asTexture=AnsiString(TTexturesManager::GetName(tex).c_str());
s->TextureNameSet(TTexturesManager::GetName(tex).c_str()); s->TextureNameSet(TextureManager.Texture(tex).name.c_str());
s->TextureID = tex; s->TextureID = tex;
s->eType = GL_TRIANGLES; s->eType = GL_TRIANGLES;
// iAnimOwner=0; //roboczy wskaźnik na wierzchołek // iAnimOwner=0; //roboczy wskaźnik na wierzchołek
@@ -715,7 +714,7 @@ void TSubModel::DisplayLists()
{ {
uiDisplayList = glGenLists(1); uiDisplayList = glGenLists(1);
glNewList(uiDisplayList, GL_COMPILE); glNewList(uiDisplayList, GL_COMPILE);
glBindTexture(GL_TEXTURE_2D, 0); TextureManager.Bind(0);
// if (eType==smt_FreeSpotLight) // if (eType==smt_FreeSpotLight)
// { // {
// if (iFarAttenDecay==0) // if (iFarAttenDecay==0)
@@ -738,7 +737,7 @@ void TSubModel::DisplayLists()
{ // punkty świecące dookólnie { // punkty świecące dookólnie
uiDisplayList = glGenLists(1); uiDisplayList = glGenLists(1);
glNewList(uiDisplayList, GL_COMPILE); glNewList(uiDisplayList, GL_COMPILE);
glBindTexture(GL_TEXTURE_2D, 0); // tekstury nie ma TextureManager.Bind(0); // tekstury nie ma
glColorMaterial(GL_FRONT, GL_EMISSION); glColorMaterial(GL_FRONT, GL_EMISSION);
glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie blendowaly
glBegin(GL_POINTS); glBegin(GL_POINTS);
@@ -1101,11 +1100,11 @@ void TSubModel::RenderDL()
{ {
if (TextureID < 0) // && (ReplacableSkinId!=0)) if (TextureID < 0) // && (ReplacableSkinId!=0))
{ // zmienialne skóry { // zmienialne skóry
glBindTexture(GL_TEXTURE_2D, ReplacableSkinId[-TextureID]); TextureManager.Bind(ReplacableSkinId[-TextureID]);
// TexAlpha=!(iAlpha&1); //zmiana tylko w przypadku wymienej tekstury // TexAlpha=!(iAlpha&1); //zmiana tylko w przypadku wymienej tekstury
} }
else else
glBindTexture(GL_TEXTURE_2D, TextureID); // również 0 TextureManager.Bind(TextureID); // również 0
if (Global::fLuminance < fLight) if (Global::fLuminance < fLight)
{ {
glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo
@@ -1198,11 +1197,11 @@ void TSubModel::RenderAlphaDL()
{ {
if (TextureID < 0) // && (ReplacableSkinId!=0)) if (TextureID < 0) // && (ReplacableSkinId!=0))
{ // zmienialne skóry { // zmienialne skóry
glBindTexture(GL_TEXTURE_2D, ReplacableSkinId[-TextureID]); TextureManager.Bind(ReplacableSkinId[-TextureID]);
// TexAlpha=iAlpha&1; //zmiana tylko w przypadku wymienej tekstury // TexAlpha=iAlpha&1; //zmiana tylko w przypadku wymienej tekstury
} }
else else
glBindTexture(GL_TEXTURE_2D, TextureID); // również 0 TextureManager.Bind(TextureID); // również 0
if (Global::fLuminance < fLight) if (Global::fLuminance < fLight)
{ {
glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo
@@ -1279,11 +1278,11 @@ void TSubModel::RenderVBO()
{ {
if (TextureID < 0) // && (ReplacableSkinId!=0)) if (TextureID < 0) // && (ReplacableSkinId!=0))
{ // zmienialne skóry { // zmienialne skóry
glBindTexture(GL_TEXTURE_2D, ReplacableSkinId[-TextureID]); TextureManager.Bind(ReplacableSkinId[-TextureID]);
// TexAlpha=!(iAlpha&1); //zmiana tylko w przypadku wymienej tekstury // TexAlpha=!(iAlpha&1); //zmiana tylko w przypadku wymienej tekstury
} }
else else
glBindTexture(GL_TEXTURE_2D, TextureID); // również 0 TextureManager.Bind(TextureID); // również 0
glColor3fv(f4Diffuse); // McZapkie-240702: zamiast ub glColor3fv(f4Diffuse); // McZapkie-240702: zamiast ub
// glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,f4Diffuse); //to samo, // glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,f4Diffuse); //to samo,
// co glColor // co glColor
@@ -1350,7 +1349,7 @@ void TSubModel::RenderVBO()
Distdimm=1; Distdimm=1;
*/ */
glBindTexture(GL_TEXTURE_2D, 0); // nie teksturować TextureManager.Bind(0); // nie teksturować
// glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]); // glColor3f(f4Diffuse[0],f4Diffuse[1],f4Diffuse[2]);
// glColorMaterial(GL_FRONT,GL_EMISSION); // glColorMaterial(GL_FRONT,GL_EMISSION);
float color[4] = {f4Diffuse[0] * Distdimm, f4Diffuse[1] * Distdimm, float color[4] = {f4Diffuse[0] * Distdimm, f4Diffuse[1] * Distdimm,
@@ -1379,7 +1378,7 @@ void TSubModel::RenderVBO()
if (pRoot->StartColorVBO()) if (pRoot->StartColorVBO())
{ // wyświetlanie kolorowych punktów zamiast { // wyświetlanie kolorowych punktów zamiast
// trójkątów // trójkątów
glBindTexture(GL_TEXTURE_2D, 0); // tekstury nie ma TextureManager.Bind(0); // tekstury nie ma
glColorMaterial(GL_FRONT, GL_EMISSION); glColorMaterial(GL_FRONT, GL_EMISSION);
glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie
// blendowaly // blendowaly
@@ -1453,11 +1452,11 @@ void TSubModel::RenderAlphaVBO()
{ {
if (TextureID < 0) // && (ReplacableSkinId!=0)) if (TextureID < 0) // && (ReplacableSkinId!=0))
{ // zmienialne skory { // zmienialne skory
glBindTexture(GL_TEXTURE_2D, ReplacableSkinId[-TextureID]); TextureManager.Bind(ReplacableSkinId[-TextureID]);
// TexAlpha=iAlpha&1; //zmiana tylko w przypadku wymienej tekstury // TexAlpha=iAlpha&1; //zmiana tylko w przypadku wymienej tekstury
} }
else else
glBindTexture(GL_TEXTURE_2D, TextureID); // również 0 TextureManager.Bind(TextureID); // również 0
if (Global::fLuminance < fLight) if (Global::fLuminance < fLight)
{ {
glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo glMaterialfv(GL_FRONT, GL_EMISSION, f4Diffuse); // zeby swiecilo na kolorowo
@@ -1625,15 +1624,14 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS
std::string tex = pTexture; std::string tex = pTexture;
if (tex.find_last_of("/\\") == std::string::npos) if (tex.find_last_of("/\\") == std::string::npos)
tex.insert(0, Global::asCurrentTexturePath); tex.insert(0, Global::asCurrentTexturePath);
TextureID = TTexturesManager::GetTextureID( TextureID = TextureManager.GetTextureId( tex, szTexturePath );
szTexturePath, const_cast<char *>(Global::asCurrentTexturePath.c_str()), tex);
// TexAlpha=TTexturesManager::GetAlpha(TextureID); //zmienna robocza // TexAlpha=TTexturesManager::GetAlpha(TextureID); //zmienna robocza
// ustawienie cyklu przezroczyste/nieprzezroczyste zależnie od własności // ustawienie cyklu przezroczyste/nieprzezroczyste zależnie od własności
// stałej tekstury // stałej tekstury
// iFlags=(iFlags&~0x30)|(TTexturesManager::GetAlpha(TextureID)?0x20:0x10); // iFlags=(iFlags&~0x30)|(TTexturesManager::GetAlpha(TextureID)?0x20:0x10);
// //0x10-nieprzezroczysta, 0x20-przezroczysta // //0x10-nieprzezroczysta, 0x20-przezroczysta
if (Opacity < 1.0) // przezroczystość z tekstury brana tylko dla Opacity 0! if (Opacity < 1.0) // przezroczystość z tekstury brana tylko dla Opacity 0!
iFlags |= TTexturesManager::GetAlpha(TextureID) ? iFlags |= TextureManager.Texture(TextureID).has_alpha ?
0x20 : 0x20 :
0x10; // 0x10-nieprzezroczysta, 0x20-przezroczysta 0x10; // 0x10-nieprzezroczysta, 0x20-przezroczysta
else else
@@ -2177,7 +2175,7 @@ ReplacableSkinId,int iAlpha)
}; };
*/ */
void TModel3d::Render(double fSquareDistance, GLuint *ReplacableSkinId, int iAlpha) void TModel3d::Render(double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha)
{ {
iAlpha ^= 0x0F0F000F; // odwrócenie flag tekstur, aby wyłapać nieprzezroczyste iAlpha ^= 0x0F0F000F; // odwrócenie flag tekstur, aby wyłapać nieprzezroczyste
if (iAlpha & iFlags & 0x1F1F001F) // czy w ogóle jest co robić w tym cyklu? if (iAlpha & iFlags & 0x1F1F001F) // czy w ogóle jest co robić w tym cyklu?
@@ -2188,7 +2186,7 @@ void TModel3d::Render(double fSquareDistance, GLuint *ReplacableSkinId, int iAlp
} }
}; };
void TModel3d::RenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, int iAlpha) void TModel3d::RenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha)
{ {
if (iAlpha & iFlags & 0x2F2F002F) if (iAlpha & iFlags & 0x2F2F002F)
{ {
@@ -2232,7 +2230,7 @@ globalna!
}; };
*/ */
void TModel3d::RaRender(double fSquareDistance, GLuint *ReplacableSkinId, int iAlpha) void TModel3d::RaRender( double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha )
{ // renderowanie specjalne, np. kabiny { // renderowanie specjalne, np. kabiny
iAlpha ^= 0x0F0F000F; // odwrócenie flag tekstur, aby wyłapać nieprzezroczyste iAlpha ^= 0x0F0F000F; // odwrócenie flag tekstur, aby wyłapać nieprzezroczyste
if (iAlpha & iFlags & 0x1F1F001F) // czy w ogóle jest co robić w tym cyklu? if (iAlpha & iFlags & 0x1F1F001F) // czy w ogóle jest co robić w tym cyklu?
@@ -2248,7 +2246,7 @@ void TModel3d::RaRender(double fSquareDistance, GLuint *ReplacableSkinId, int iA
} }
}; };
void TModel3d::RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, int iAlpha) void TModel3d::RaRenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha)
{ // renderowanie specjalne, np. kabiny { // renderowanie specjalne, np. kabiny
if (iAlpha & iFlags & 0x2F2F002F) // czy w ogóle jest co robić w tym cyklu? if (iAlpha & iFlags & 0x2F2F002F) // czy w ogóle jest co robić w tym cyklu?
{ {
@@ -2286,7 +2284,7 @@ globalna!
// 2011-03-16 cztery nowe funkcje renderowania z możliwością pochylania obiektów // 2011-03-16 cztery nowe funkcje renderowania z możliwością pochylania obiektów
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void TModel3d::Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, int iAlpha) void TModel3d::Render(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId, int iAlpha)
{ // nieprzezroczyste, Display List { // nieprzezroczyste, Display List
glPushMatrix(); glPushMatrix();
glTranslated(vPosition->x, vPosition->y, vPosition->z); glTranslated(vPosition->x, vPosition->y, vPosition->z);
@@ -2303,7 +2301,7 @@ void TModel3d::Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSki
Root->RenderDL(); Root->RenderDL();
glPopMatrix(); glPopMatrix();
}; };
void TModel3d::RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, void TModel3d::RenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId,
int iAlpha) int iAlpha)
{ // przezroczyste, Display List { // przezroczyste, Display List
glPushMatrix(); glPushMatrix();
@@ -2320,7 +2318,7 @@ void TModel3d::RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *Replacab
Root->RenderAlphaDL(); Root->RenderAlphaDL();
glPopMatrix(); glPopMatrix();
}; };
void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, int iAlpha) void TModel3d::RaRender( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId, int iAlpha )
{ // nieprzezroczyste, VBO { // nieprzezroczyste, VBO
glPushMatrix(); glPushMatrix();
glTranslated(vPosition->x, vPosition->y, vPosition->z); glTranslated(vPosition->x, vPosition->y, vPosition->z);
@@ -2340,7 +2338,7 @@ void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableS
} }
glPopMatrix(); glPopMatrix();
}; };
void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId,
int iAlpha) int iAlpha)
{ // przezroczyste, VBO { // przezroczyste, VBO
glPushMatrix(); glPushMatrix();

View File

@@ -15,6 +15,7 @@ http://mozilla.org/MPL/2.0/.
#include "dumb3d.h" #include "dumb3d.h"
#include "Float3d.h" #include "Float3d.h"
#include "VBO.h" #include "VBO.h"
#include "Texture.h"
using namespace Math3D; using namespace Math3D;
@@ -215,7 +216,7 @@ class TSubModel
// światła // światła
float fCosViewAngle; // cos kata pod jakim sie teraz patrzy float fCosViewAngle; // cos kata pod jakim sie teraz patrzy
// Ra: dalej są zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy // Ra: dalej są zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy
int TextureID; // numer tekstury, -1 wymienna, 0 brak texture_manager::size_type TextureID; // numer tekstury, -1 wymienna, 0 brak
bool bWire; // nie używane, ale wczytywane bool bWire; // nie używane, ale wczytywane
// short TexAlpha; //Ra: nie używane już // short TexAlpha; //Ra: nie używane już
GLuint uiDisplayList; // roboczy numer listy wyświetlania GLuint uiDisplayList; // roboczy numer listy wyświetlania
@@ -252,7 +253,7 @@ class TSubModel
public: public:
static int iInstance; // identyfikator egzemplarza, który aktualnie renderuje model static int iInstance; // identyfikator egzemplarza, który aktualnie renderuje model
static GLuint *ReplacableSkinId; static texture_manager::size_type *ReplacableSkinId;
static int iAlpha; // maska bitowa dla danego przebiegu static int iAlpha; // maska bitowa dla danego przebiegu
static double fSquareDist; static double fSquareDist;
static TModel3d *pRoot; static TModel3d *pRoot;
@@ -271,7 +272,7 @@ class TSubModel
{ {
return Child; return Child;
}; };
int TriangleAdd(TModel3d *m, int tex, int tri); int TriangleAdd(TModel3d *m, texture_manager::size_type tex, int tri);
float8 * TrianglePtr(int tex, int pos, int *la, int *ld, int *ls); float8 * TrianglePtr(int tex, int pos, int *la, int *ld, int *ls);
// float8* TrianglePtr(const char *tex,int tri); // float8* TrianglePtr(const char *tex,int tri);
// void SetRotate(vector3 vNewRotateAxis,float fNewAngle); // void SetRotate(vector3 vNewRotateAxis,float fNewAngle);
@@ -311,7 +312,7 @@ class TSubModel
void InfoSet(TSubModelInfo *info); void InfoSet(TSubModelInfo *info);
void BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TStringPack *n = NULL, void BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TStringPack *n = NULL,
bool dynamic = false); bool dynamic = false);
void ReplacableSet(GLuint *r, int a) void ReplacableSet(texture_manager::size_type *r, int a)
{ {
ReplacableSkinId = r; ReplacableSkinId = r;
iAlpha = a; iAlpha = a;
@@ -409,29 +410,29 @@ class TModel3d : public CMesh
void SaveToBinFile(char const *FileName); void SaveToBinFile(char const *FileName);
void BreakHierarhy(); void BreakHierarhy();
// renderowanie specjalne // renderowanie specjalne
void Render(double fSquareDistance, GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); void Render(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
void RenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL, void RenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RaRender(double fSquareDistance, GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); void RaRender(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
void RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL, void RaRenderAlpha(double fSquareDistance, texture_manager::size_type *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
// jeden kąt obrotu // jeden kąt obrotu
void Render(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL, void Render(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RenderAlpha(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL, void RenderAlpha(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RaRender(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL, void RaRender(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RaRenderAlpha(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL, void RaRenderAlpha(vector3 pPosition, double fAngle = 0, texture_manager::size_type *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
// trzy kąty obrotu // trzy kąty obrotu
void Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL, void Render( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL, void RenderAlpha( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL, void RaRender( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL, void RaRenderAlpha( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
// inline int GetSubModelsCount() { return (SubModelsCount); }; // inline int GetSubModelsCount() { return (SubModelsCount); };
int Flags() int Flags()

View File

@@ -453,7 +453,7 @@ void TPythonScreens::init(cParser &parser, TModel3d *model, std::string const &n
WriteLog( "Python Screen: submodel " + subModelName + " not found - Ignoring screen" ); WriteLog( "Python Screen: submodel " + subModelName + " not found - Ignoring screen" );
return; // nie ma takiego sub modelu w danej kabinie pomijamy return; // nie ma takiego sub modelu w danej kabinie pomijamy
} }
int textureId = subModel->GetTextureId(); int textureId = TextureManager.Texture(subModel->GetTextureId()).id;
if (textureId <= 0) if (textureId <= 0)
{ {
WriteLog( "Python Screen: invalid texture id " + std::to_string(textureId) + " - Ignoring screen" ); WriteLog( "Python Screen: invalid texture id " + std::to_string(textureId) + " - Ignoring screen" );

View File

@@ -641,7 +641,7 @@ void TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *Shap
void TSegment::Render() void TSegment::Render()
{ {
vector3 pt; vector3 pt;
glBindTexture(GL_TEXTURE_2D, 0); TextureManager.Bind(0);
int i; int i;
if (bCurve) if (bCurve)
{ {

File diff suppressed because it is too large Load Diff

127
Texture.h
View File

@@ -12,49 +12,90 @@ http://mozilla.org/MPL/2.0/.
#include <string> #include <string>
#include "opengl/glew.h" #include "opengl/glew.h"
enum class resource_state {
none,
loading,
good,
failed
};
struct opengl_texture {
// methods
void load();
void create();
// members
GLuint id{ -1 }; // associated GL resource
bool has_alpha{ false }; // indicates the texture has alpha channel
bool is_ready{ false }; // indicates the texture was processed and is ready for use
std::string traits; // requested texture attributes: wrapping modes etc
std::string name; // name of the texture source file
private:
// methods
void load_BMP();
void load_DDS();
void load_TEX();
void load_TGA();
void set_filtering();
// members
std::vector<char> data; // texture data
resource_state data_state{ resource_state::none }; // current state of texture data
int data_width{ 0 },
data_height{ 0 },
data_mapcount{ 0 };
GLuint data_format{ 0 },
data_components{ 0 };
/* /*
//Ra: miejsce umieszczenia tego jest deczko bezsensowne std::atomic<bool> is_loaded{ false }; // indicates the texture data was loaded and can be processed
void glDebug() std::atomic<bool> is_good{ false }; // indicates the texture data was retrieved without errors
{//logowanie błędów OpenGL
GLenum err;
if (Global::iErorrCounter==326) //tu wpisz o 1 mniej niz wartość, przy której się wyłożyło
Global::iErorrCounter=Global::iErorrCounter+0; //do zastawiania pułapki przed błędnym kodem
while ((err=glGetError())!=GL_NO_ERROR) //dalej jest pułapka po wykonaniu błędnego kodu
WriteLog("OpenGL error found: "+AnsiString(err)+", step:"+AnsiString(Global::iErorrCounter));
++Global::iErorrCounter;
};
*/ */
class TTexturesManager
{
public:
static void Init();
static void Free();
static GLuint GetTextureID(char *dir, char *where, std::string name, int filter = -1);
static bool GetAlpha(GLuint ID); // McZapkie-141203: czy tekstura ma polprzeroczystosc
static std::string GetName(GLuint id);
private:
typedef std::pair<GLuint, bool> AlphaValue;
typedef std::map<std::string, GLuint> Names;
typedef std::map<GLuint, bool> Alphas;
static Names::iterator LoadFromFile(std::string name, int filter = -1);
static AlphaValue LoadBMP(std::string const &fileName);
static AlphaValue LoadTEX(std::string fileName);
static AlphaValue LoadTGA(std::string fileName, int filter = -1);
static AlphaValue LoadDDS(std::string fileName, int filter = -1);
static void SetFiltering(int filter);
static void SetFiltering(bool alpha, bool hash);
static GLuint CreateTexture(GLubyte *buff, GLint bpp, int width, int height, bool bHasAlpha,
bool bHash, bool bDollar = true, int filter = -1);
static Names _names;
static Alphas _alphas;
// std::list<TTexture> Textures;
}; };
//---------------------------------------------------------------------------
class texture_manager {
private:
typedef std::vector<opengl_texture> opengltexture_array;
public:
// typedef opengltexture_array::size_type size_type;
typedef int size_type;
texture_manager();
~texture_manager() { Free(); }
size_type GetTextureId( std::string Filename, std::string const &Dir, int const Filter = -1, bool const Loadnow = true );
void Bind( size_type const Id );
opengl_texture &Texture( size_type const Id ) { return m_textures.at( Id ); }
void Init();
void Free();
private:
typedef std::unordered_map<std::string, size_type> index_map;
/*
opengltexture_array::size_type LoadFromFile(std::string name, int filter = -1);
*/
/*
bool LoadBMP( std::string const &fileName);
bool LoadTEX( std::string fileName );
bool LoadTGA( std::string fileName, int filter = -1 );
bool LoadDDS( std::string fileName, int filter = -1 );
*/
// checks whether specified texture is in the texture bank. returns texture id, or npos.
size_type find_in_databank( std::string const &Texturename );
// checks whether specified file exists. returns name of the located file, or empty string.
std::string find_on_disk( std::string const &Texturename );
/*
void SetFiltering(int filter);
void SetFiltering(bool alpha, bool hash);
GLuint CreateTexture(GLubyte *buff, GLint bpp, int width, int height, bool bHasAlpha,
bool bHash, bool bDollar = true, int filter = -1);
*/
static const size_type npos{ 0 }; // should be -1, but the rest of the code uses -1 for something else
opengltexture_array m_textures;
index_map m_texturemappings;
size_type m_activetexture{ 0 }; // last i.e. currently bound texture
};
extern texture_manager TextureManager;

View File

@@ -508,8 +508,8 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name)
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = token; // railtex str = token; // railtex
TextureID1 = (str == "none" ? 0 : TTexturesManager::GetTextureID( TextureID1 = (str == "none" ? 0 : TextureManager.GetTextureId(
szTexturePath, szSceneryPath, str, str, szTexturePath,
(iCategoryFlag & 1) ? Global::iRailProFiltering : (iCategoryFlag & 1) ? Global::iRailProFiltering :
Global::iBallastFiltering)); Global::iBallastFiltering));
parser->getTokens(); parser->getTokens();
@@ -519,8 +519,8 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name)
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = token; // sub || railtex str = token; // sub || railtex
TextureID2 = (str == "none" ? 0 : TTexturesManager::GetTextureID( TextureID2 = (str == "none" ? 0 : TextureManager.GetTextureId(
szTexturePath, szSceneryPath, str, str, szTexturePath,
(eType == tt_Normal) ? Global::iBallastFiltering : (eType == tt_Normal) ? Global::iBallastFiltering :
Global::iRailProFiltering)); Global::iRailProFiltering));
parser->getTokens(3); parser->getTokens(3);
@@ -579,12 +579,12 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name)
if (TextureID1 && fTexLength) if (TextureID1 && fTexLength)
{ // dla drogi trzeba ustalić proporcje boków nawierzchni { // dla drogi trzeba ustalić proporcje boków nawierzchni
float w, h; float w, h;
glBindTexture(GL_TEXTURE_2D, TextureID1); TextureManager.Bind(TextureID1);
glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h); glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
if (h != 0.0) if (h != 0.0)
fTexRatio1 = w / h; // proporcja boków fTexRatio1 = w / h; // proporcja boków
glBindTexture(GL_TEXTURE_2D, TextureID2); TextureManager.Bind(TextureID2);
glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h); glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
if (h != 0.0) if (h != 0.0)
@@ -1299,14 +1299,14 @@ void TTrack::Compile(GLuint tex)
} }
} }
if (!tex) if (!tex)
glBindTexture(GL_TEXTURE_2D, TextureID2); TextureManager.Bind( TextureID2 );
Segment->RenderLoft(bpts1, iTrapezoid ? -4 : 4, fTexLength); Segment->RenderLoft(bpts1, iTrapezoid ? -4 : 4, fTexLength);
} }
if (TextureID1) if (TextureID1)
if (tex ? TextureID1 == tex : true) // jeśli pasuje do grupy (tex) if (tex ? TextureID1 == tex : true) // jeśli pasuje do grupy (tex)
{ // szyny { // szyny
if (!tex) if (!tex)
glBindTexture(GL_TEXTURE_2D, TextureID1); TextureManager.Bind( TextureID1 );
Segment->RenderLoft(rpts1, iTrapezoid ? -nnumPts : nnumPts, fTexLength); Segment->RenderLoft(rpts1, iTrapezoid ? -nnumPts : nnumPts, fTexLength);
Segment->RenderLoft(rpts2, iTrapezoid ? -nnumPts : nnumPts, fTexLength); Segment->RenderLoft(rpts2, iTrapezoid ? -nnumPts : nnumPts, fTexLength);
} }
@@ -1345,7 +1345,7 @@ void TTrack::Compile(GLuint tex)
// McZapkie-130302 - poprawione rysowanie szyn // McZapkie-130302 - poprawione rysowanie szyn
if (SwitchExtension->RightSwitch) if (SwitchExtension->RightSwitch)
{ // zwrotnica prawa { // zwrotnica prawa
glBindTexture(GL_TEXTURE_2D, TextureID1); TextureManager.Bind( TextureID1 );
SwitchExtension->Segments[0]->RenderLoft(rpts1, nnumPts, fTexLength, SwitchExtension->Segments[0]->RenderLoft(rpts1, nnumPts, fTexLength,
2); // prawa szyna za iglicą 2); // prawa szyna za iglicą
SwitchExtension->Segments[0]->RenderSwitchRail( SwitchExtension->Segments[0]->RenderSwitchRail(
@@ -1354,7 +1354,7 @@ void TTrack::Compile(GLuint tex)
SwitchExtension->Segments[0]->RenderLoft( SwitchExtension->Segments[0]->RenderLoft(
rpts2, nnumPts, fTexLength); // lewa szyna normalnie cała rpts2, nnumPts, fTexLength); // lewa szyna normalnie cała
if (TextureID2 != TextureID1) // nie wiadomo, czy OpenGL to optymalizuje if (TextureID2 != TextureID1) // nie wiadomo, czy OpenGL to optymalizuje
glBindTexture(GL_TEXTURE_2D, TextureID2); TextureManager.Bind( TextureID2 );
SwitchExtension->Segments[1]->RenderLoft( SwitchExtension->Segments[1]->RenderLoft(
rpts1, nnumPts, fTexLength); // prawa szyna normalna cała rpts1, nnumPts, fTexLength); // prawa szyna normalna cała
SwitchExtension->Segments[1]->RenderLoft(rpts2, nnumPts, fTexLength, SwitchExtension->Segments[1]->RenderLoft(rpts2, nnumPts, fTexLength,
@@ -1365,7 +1365,7 @@ void TTrack::Compile(GLuint tex)
} }
else else
{ // lewa kiedyś działała lepiej niż prawa { // lewa kiedyś działała lepiej niż prawa
glBindTexture(GL_TEXTURE_2D, TextureID1); TextureManager.Bind( TextureID1 );
SwitchExtension->Segments[0]->RenderLoft( SwitchExtension->Segments[0]->RenderLoft(
rpts1, nnumPts, fTexLength); // prawa szyna normalna cała rpts1, nnumPts, fTexLength); // prawa szyna normalna cała
SwitchExtension->Segments[0]->RenderLoft(rpts2, nnumPts, fTexLength, SwitchExtension->Segments[0]->RenderLoft(rpts2, nnumPts, fTexLength,
@@ -1374,7 +1374,7 @@ void TTrack::Compile(GLuint tex)
rpts2, rpts4, nnumPts, fTexLength, 2, rpts2, rpts4, nnumPts, fTexLength, 2,
-SwitchExtension->fOffset2); // lewa iglica -SwitchExtension->fOffset2); // lewa iglica
if (TextureID2 != TextureID1) // nie wiadomo, czy OpenGL to optymalizuje if (TextureID2 != TextureID1) // nie wiadomo, czy OpenGL to optymalizuje
glBindTexture(GL_TEXTURE_2D, TextureID2); TextureManager.Bind( TextureID2 );
SwitchExtension->Segments[1]->RenderLoft(rpts1, nnumPts, fTexLength, SwitchExtension->Segments[1]->RenderLoft(rpts1, nnumPts, fTexLength,
2); // prawa szyna za iglicą 2); // prawa szyna za iglicą
SwitchExtension->Segments[1]->RenderSwitchRail( SwitchExtension->Segments[1]->RenderSwitchRail(
@@ -1422,7 +1422,7 @@ void TTrack::Compile(GLuint tex)
if (tex ? TextureID1 == tex : true) // jeśli pasuje do grupy (tex) if (tex ? TextureID1 == tex : true) // jeśli pasuje do grupy (tex)
{ // tworzenie trójkątów nawierzchni szosy { // tworzenie trójkątów nawierzchni szosy
if (!tex) if (!tex)
glBindTexture(GL_TEXTURE_2D, TextureID1); TextureManager.Bind( TextureID1 );
Segment->RenderLoft(bpts1, iTrapezoid ? -2 : 2, fTexLength); Segment->RenderLoft(bpts1, iTrapezoid ? -2 : 2, fTexLength);
} }
if (TextureID2) if (TextureID2)
@@ -1430,7 +1430,7 @@ void TTrack::Compile(GLuint tex)
{ // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak { // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak
// w Midtown Madness 2?) // w Midtown Madness 2?)
if (!tex) if (!tex)
glBindTexture(GL_TEXTURE_2D, TextureID2); TextureManager.Bind( TextureID2 );
vector6 rpts1[6], vector6 rpts1[6],
rpts2[6]; // współrzędne przekroju i mapowania dla prawej i lewej strony rpts2[6]; // współrzędne przekroju i mapowania dla prawej i lewej strony
if (fTexHeight1 >= 0.0) if (fTexHeight1 >= 0.0)
@@ -1610,7 +1610,7 @@ void TTrack::Compile(GLuint tex)
// Midtown Madness 2?) // Midtown Madness 2?)
if (TextureID2) if (TextureID2)
if (!tex) if (!tex)
glBindTexture(GL_TEXTURE_2D, TextureID2); TextureManager.Bind( TextureID2 );
vector6 rpts1[6], vector6 rpts1[6],
rpts2[6]; // współrzędne przekroju i mapowania dla prawej i lewej strony rpts2[6]; // współrzędne przekroju i mapowania dla prawej i lewej strony
// Ra 2014-07: trzeba to przerobić na pętlę i pobierać profile (przynajmniej 2..4) z // Ra 2014-07: trzeba to przerobić na pętlę i pobierać profile (przynajmniej 2..4) z
@@ -1755,7 +1755,7 @@ void TTrack::Compile(GLuint tex)
if (tex ? TextureID1 == tex : true) // jeśli pasuje do grupy (tex) if (tex ? TextureID1 == tex : true) // jeśli pasuje do grupy (tex)
{ {
if (!tex) if (!tex)
glBindTexture(GL_TEXTURE_2D, TextureID1); TextureManager.Bind( TextureID1 );
glBegin(GL_TRIANGLE_FAN); // takie kółeczko będzie glBegin(GL_TRIANGLE_FAN); // takie kółeczko będzie
glNormal3f(0, 1, 0); glNormal3f(0, 1, 0);
glTexCoord2f(0.5, 0.5); //środek tekstury na środku skrzyżowania glTexCoord2f(0.5, 0.5); //środek tekstury na środku skrzyżowania
@@ -1787,7 +1787,7 @@ void TTrack::Compile(GLuint tex)
if (tex ? TextureID1 == tex : true) // jeśli pasuje do grupy (tex) if (tex ? TextureID1 == tex : true) // jeśli pasuje do grupy (tex)
{ {
if (!tex) if (!tex)
glBindTexture(GL_TEXTURE_2D, TextureID1); TextureManager.Bind( TextureID1 );
Segment->RenderLoft(bpts1, numPts, fTexLength); Segment->RenderLoft(bpts1, numPts, fTexLength);
} }
if (TextureID2) if (TextureID2)
@@ -1799,7 +1799,7 @@ void TTrack::Compile(GLuint tex)
vector6 rpts2[3] = {vector6(-fHTW, 0.0, 1.0), vector6(-fHTW - side, 0.0, 0.5), vector6 rpts2[3] = {vector6(-fHTW, 0.0, 1.0), vector6(-fHTW - side, 0.0, 0.5),
vector6(-rozp, -fTexHeight1, 0.0)}; // Ra: po kiego 0.1? vector6(-rozp, -fTexHeight1, 0.0)}; // Ra: po kiego 0.1?
if (!tex) if (!tex)
glBindTexture(GL_TEXTURE_2D, TextureID2); // brzeg rzeki TextureManager.Bind( TextureID2 ); // brzeg rzeki
Segment->RenderLoft(rpts1, 3, fTexLength); Segment->RenderLoft(rpts1, 3, fTexLength);
Segment->RenderLoft(rpts2, 3, fTexLength); Segment->RenderLoft(rpts2, 3, fTexLength);
} }
@@ -2473,7 +2473,7 @@ void TTrack::RaRenderVBO(int iPtr)
if (TextureID1) if (TextureID1)
if ((seg = SwitchExtension->Segments[0]->RaSegCount()) > 0) if ((seg = SwitchExtension->Segments[0]->RaSegCount()) > 0)
{ {
glBindTexture(GL_TEXTURE_2D, TextureID1); // szyny + TextureManager.Bind( TextureID1 ); // szyny +
for (i = 0; i < seg; ++i) for (i = 0; i < seg; ++i)
glDrawArrays(GL_TRIANGLE_STRIP, iPtr + 24 * i, 24); glDrawArrays(GL_TRIANGLE_STRIP, iPtr + 24 * i, 24);
iPtr += 24 * seg; // pominięcie lewej szyny iPtr += 24 * seg; // pominięcie lewej szyny
@@ -2484,7 +2484,7 @@ void TTrack::RaRenderVBO(int iPtr)
if (TextureID2) if (TextureID2)
if ((seg = SwitchExtension->Segments[1]->RaSegCount()) > 0) if ((seg = SwitchExtension->Segments[1]->RaSegCount()) > 0)
{ {
glBindTexture(GL_TEXTURE_2D, TextureID2); // szyny - TextureManager.Bind( TextureID2 ); // szyny -
for (i = 0; i < seg; ++i) for (i = 0; i < seg; ++i)
glDrawArrays(GL_TRIANGLE_STRIP, iPtr + 24 * i, 24); glDrawArrays(GL_TRIANGLE_STRIP, iPtr + 24 * i, 24);
iPtr += 24 * seg; // pominięcie lewej szyny iPtr += 24 * seg; // pominięcie lewej szyny
@@ -2498,14 +2498,14 @@ void TTrack::RaRenderVBO(int iPtr)
{ {
if (TextureID2) if (TextureID2)
{ {
glBindTexture(GL_TEXTURE_2D, TextureID2); // podsypka TextureManager.Bind( TextureID2 ); // podsypka
for (i = 0; i < seg; ++i) for (i = 0; i < seg; ++i)
glDrawArrays(GL_TRIANGLE_STRIP, iPtr + 8 * i, 8); glDrawArrays(GL_TRIANGLE_STRIP, iPtr + 8 * i, 8);
iPtr += 8 * seg; // pominięcie podsypki iPtr += 8 * seg; // pominięcie podsypki
} }
if (TextureID1) if (TextureID1)
{ {
glBindTexture(GL_TEXTURE_2D, TextureID1); // szyny TextureManager.Bind( TextureID1 ); // szyny
for (i = 0; i < seg; ++i) for (i = 0; i < seg; ++i)
glDrawArrays(GL_TRIANGLE_STRIP, iPtr + 24 * i, 24); glDrawArrays(GL_TRIANGLE_STRIP, iPtr + 24 * i, 24);
iPtr += 24 * seg; // pominięcie lewej szyny iPtr += 24 * seg; // pominięcie lewej szyny
@@ -2520,7 +2520,7 @@ void TTrack::RaRenderVBO(int iPtr)
{ {
if (TextureID1) if (TextureID1)
{ {
glBindTexture(GL_TEXTURE_2D, TextureID1); // nawierzchnia TextureManager.Bind( TextureID1 ); // nawierzchnia
for (i = 0; i < seg; ++i) for (i = 0; i < seg; ++i)
{ {
glDrawArrays(GL_TRIANGLE_STRIP, iPtr, 4); glDrawArrays(GL_TRIANGLE_STRIP, iPtr, 4);
@@ -2529,7 +2529,7 @@ void TTrack::RaRenderVBO(int iPtr)
} }
if (TextureID2) if (TextureID2)
{ {
glBindTexture(GL_TEXTURE_2D, TextureID2); // pobocze TextureManager.Bind( TextureID2 ); // pobocze
if (fTexHeight1 >= 0.0) if (fTexHeight1 >= 0.0)
{ // normalna droga z poboczem { // normalna droga z poboczem
for (i = 0; i < seg; ++i) for (i = 0; i < seg; ++i)
@@ -2558,7 +2558,7 @@ void TTrack::RaRenderVBO(int iPtr)
{ {
if (TextureID1) if (TextureID1)
{ {
glBindTexture(GL_TEXTURE_2D, TextureID1); // nawierzchnia TextureManager.Bind( TextureID1 ); // nawierzchnia
for (i = 0; i < seg; ++i) for (i = 0; i < seg; ++i)
{ {
glDrawArrays(GL_TRIANGLE_STRIP, iPtr, 4); glDrawArrays(GL_TRIANGLE_STRIP, iPtr, 4);
@@ -2567,7 +2567,7 @@ void TTrack::RaRenderVBO(int iPtr)
} }
if (TextureID2) if (TextureID2)
{ {
glBindTexture(GL_TEXTURE_2D, TextureID2); // pobocze TextureManager.Bind( TextureID2 ); // pobocze
for (i = 0; i < seg; ++i) for (i = 0; i < seg; ++i)
glDrawArrays(GL_TRIANGLE_STRIP, iPtr + 6 * i, 6); glDrawArrays(GL_TRIANGLE_STRIP, iPtr + 6 * i, 6);
iPtr += 6 * seg; // pominięcie lewego pobocza iPtr += 6 * seg; // pominięcie lewego pobocza

View File

@@ -13,6 +13,7 @@ http://mozilla.org/MPL/2.0/.
#include "opengl/glew.h" #include "opengl/glew.h"
#include "ResourceManager.h" #include "ResourceManager.h"
#include "Segment.h" #include "Segment.h"
#include "Texture.h"
class TEvent; class TEvent;
@@ -136,8 +137,8 @@ class TTrack : public Resource
TTrack *trNext = nullptr; // odcinek od strony punktu 2 - to powinno być w segmencie TTrack *trNext = nullptr; // odcinek od strony punktu 2 - to powinno być w segmencie
TTrack *trPrev = nullptr; // odcinek od strony punktu 1 TTrack *trPrev = nullptr; // odcinek od strony punktu 1
// McZapkie-070402: dodalem zmienne opisujace rozmiary tekstur // McZapkie-070402: dodalem zmienne opisujace rozmiary tekstur
GLuint TextureID1 = 0; // tekstura szyn albo nawierzchni texture_manager::size_type TextureID1 = 0; // tekstura szyn albo nawierzchni
GLuint TextureID2 = 0; // tekstura automatycznej podsypki albo pobocza texture_manager::size_type TextureID2 = 0; // tekstura automatycznej podsypki albo pobocza
float fTexLength = 4.0; // długość powtarzania tekstury w metrach float fTexLength = 4.0; // długość powtarzania tekstury w metrach
float fTexRatio1 = 1.0; // proporcja boków tekstury nawierzchni (żeby zaoszczędzić na rozmiarach tekstur...) 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 fTexRatio2 = 1.0; // proporcja boków tekstury chodnika (żeby zaoszczędzić na rozmiarach tekstur...)

View File

@@ -18,6 +18,7 @@ http://mozilla.org/MPL/2.0/.
#include "logs.h" #include "logs.h"
#include "mctools.h" #include "mctools.h"
#include "TractionPower.h" #include "TractionPower.h"
#include "Texture.h"
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
/* /*
@@ -115,7 +116,7 @@ void TTraction::Optimize()
uiDisplayList = glGenLists(1); uiDisplayList = glGenLists(1);
glNewList(uiDisplayList, GL_COMPILE); glNewList(uiDisplayList, GL_COMPILE);
glBindTexture(GL_TEXTURE_2D, 0); TextureManager.Bind(0);
// glColor3ub(0,0,0); McZapkie: to do render // glColor3ub(0,0,0); McZapkie: to do render
// glPushMatrix(); // glPushMatrix();
@@ -462,7 +463,7 @@ void TTraction::RenderVBO(float mgn, int iPtr)
{ // renderowanie z użyciem VBO { // renderowanie z użyciem VBO
if (Wires != 0 && !TestFlag(DamageFlag, 128)) // rysuj jesli sa druty i nie zerwana if (Wires != 0 && !TestFlag(DamageFlag, 128)) // rysuj jesli sa druty i nie zerwana
{ {
glBindTexture(GL_TEXTURE_2D, 0); TextureManager.Bind(0);
glDisable(GL_LIGHTING); // aby nie używało wektorów normalnych do kolorowania glDisable(GL_LIGHTING); // aby nie używało wektorów normalnych do kolorowania
glColor4f(0, 0, 0, 1); // jak nieznany kolor to czarne nieprzezroczyste glColor4f(0, 0, 0, 1); // jak nieznany kolor to czarne nieprzezroczyste
if (!Global::bSmoothTraction) if (!Global::bSmoothTraction)

View File

@@ -71,7 +71,6 @@ TWorld::~TWorld()
// Ground.Free(); //Ra: usunięcie obiektów przed usunięciem dźwięków - sypie się // Ground.Free(); //Ra: usunięcie obiektów przed usunięciem dźwięków - sypie się
TSoundsManager::Free(); TSoundsManager::Free();
TModelsManager::Free(); TModelsManager::Free();
TTexturesManager::Free();
glDeleteLists(base, 96); glDeleteLists(base, 96);
if (hinstGLUT32) if (hinstGLUT32)
FreeLibrary(hinstGLUT32); FreeLibrary(hinstGLUT32);
@@ -479,9 +478,8 @@ bool TWorld::Init(HWND NhWnd, HDC hDC)
glDisable(GL_DEPTH_TEST); // Disables depth testing glDisable(GL_DEPTH_TEST); // Disables depth testing
glColor3f(3.0f, 3.0f, 3.0f); glColor3f(3.0f, 3.0f, 3.0f);
GLuint logo; auto logo = TextureManager.GetTextureId( "logo", szTexturePath, 6 );
logo = TTexturesManager::GetTextureID(szTexturePath, szSceneryPath, "logo", 6); TextureManager.Bind(logo); // Select our texture
glBindTexture(GL_TEXTURE_2D, logo); // Select our texture
glBegin(GL_QUADS); // Drawing using triangles glBegin(GL_QUADS); // Drawing using triangles
glTexCoord2f(0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f);
@@ -527,8 +525,9 @@ bool TWorld::Init(HWND NhWnd, HDC hDC)
glPrint("Tekstury / Textures..."); glPrint("Tekstury / Textures...");
} }
SwapBuffers(hDC); // Swap Buffers (Double Buffering) SwapBuffers(hDC); // Swap Buffers (Double Buffering)
/*
TTexturesManager::Init(); TTexturesManager.Init();
*/
WriteLog("Textures init OK"); WriteLog("Textures init OK");
if (Global::detonatoryOK) if (Global::detonatoryOK)
{ {
@@ -663,9 +662,9 @@ bool TWorld::Init(HWND NhWnd, HDC hDC)
// glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //{Texture blends with object // glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //{Texture blends with object
// background} // background}
if (Global::bOldSmudge == true) if (Global::bOldSmudge == true)
light = TTexturesManager::GetTextureID(szTexturePath, szSceneryPath, "smuga.tga"); light = TextureManager.GetTextureId( "smuga.tga", szTexturePath );
else else
light = TTexturesManager::GetTextureID(szTexturePath, szSceneryPath, "smuga2.tga"); light = TextureManager.GetTextureId( "smuga2.tga", szTexturePath );
// Camera.Reset(); // Camera.Reset();
Timer::ResetTimers(); Timer::ResetTimers();
WriteLog( "Load time: " + WriteLog( "Load time: " +
@@ -1604,7 +1603,7 @@ TWorld::Render_Cab() {
glDisable( GL_DEPTH_TEST ); glDisable( GL_DEPTH_TEST );
glDisable( GL_LIGHTING ); glDisable( GL_LIGHTING );
glDisable( GL_FOG ); glDisable( GL_FOG );
glBindTexture( GL_TEXTURE_2D, light ); // Select our texture TextureManager.Bind( light ); // Select our texture
glBegin( GL_QUADS ); glBegin( GL_QUADS );
float fSmudge = float fSmudge =
dynamic->MoverParameters->DimHalf.y + 7; // gdzie zaczynać smugę dynamic->MoverParameters->DimHalf.y + 7; // gdzie zaczynać smugę
@@ -1646,7 +1645,7 @@ TWorld::Render_Cab() {
glDisable( GL_LIGHTING ); glDisable( GL_LIGHTING );
glDisable( GL_FOG ); glDisable( GL_FOG );
//glColor4f(0.15f, 0.15f, 0.15f, 0.25f); //glColor4f(0.15f, 0.15f, 0.15f, 0.25f);
glBindTexture( GL_TEXTURE_2D, light ); // Select our texture TextureManager.Bind( light ); // Select our texture
//float ddl = (0.15*Global::diffuseDayLight[0]+0.295*Global::diffuseDayLight[1]+0.055*Global::diffuseDayLight[2]); //0.24:0 //float ddl = (0.15*Global::diffuseDayLight[0]+0.295*Global::diffuseDayLight[1]+0.055*Global::diffuseDayLight[2]); //0.24:0
glBegin( GL_QUADS ); glBegin( GL_QUADS );
float fSmudge = dynamic->MoverParameters->DimHalf.y + 7; // gdzie zaczynać smugę float fSmudge = dynamic->MoverParameters->DimHalf.y + 7; // gdzie zaczynać smugę
@@ -1947,7 +1946,7 @@ TWorld::Render_UI() {
SetWindowText( hWnd, Controlled->MoverParameters->Name.c_str() ); SetWindowText( hWnd, Controlled->MoverParameters->Name.c_str() );
else else
SetWindowText( hWnd, Global::SceneryFile.c_str() ); // nazwa scenerii SetWindowText( hWnd, Global::SceneryFile.c_str() ); // nazwa scenerii
glBindTexture( GL_TEXTURE_2D, 0 ); TextureManager.Bind( 0 );
glColor4f( 1.0f, 0.0f, 0.0f, 1.0f ); glColor4f( 1.0f, 0.0f, 0.0f, 1.0f );
glLoadIdentity(); glLoadIdentity();
glTranslatef( 0.0f, 0.0f, -0.50f ); glTranslatef( 0.0f, 0.0f, -0.50f );

View File

@@ -51,7 +51,7 @@ class TWorld
TDynamicObject *pDynamicNearest; TDynamicObject *pDynamicNearest;
bool Paused; bool Paused;
GLuint base; // numer DL dla znaków w napisach GLuint base; // numer DL dla znaków w napisach
GLuint light; // numer tekstury dla smugi texture_manager::size_type light; // numer tekstury dla smugi
TSky Clouds; TSky Clouds;
TEvent *KeyEvents[10]; // eventy wyzwalane z klawiaury TEvent *KeyEvents[10]; // eventy wyzwalane z klawiaury
TMoverParameters *mvControlled; // wskaźnik na człon silnikowy, do wyświetlania jego parametrów TMoverParameters *mvControlled; // wskaźnik na człon silnikowy, do wyświetlania jego parametrów

View File

@@ -54,6 +54,7 @@
#include <limits> #include <limits>
#include <memory> #include <memory>
#include <thread> #include <thread>
#include <atomic>
#include <mutex> #include <mutex>
#include <condition_variable> #include <condition_variable>
#include <typeinfo> #include <typeinfo>