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

coś było źle

This commit is contained in:
VB
2017-02-14 21:17:22 +01:00
parent 20f95c5f3b
commit 7c98a177da
2 changed files with 2405 additions and 2420 deletions

View File

@@ -7,8 +7,8 @@ obtain one at
http://mozilla.org/MPL/2.0/. http://mozilla.org/MPL/2.0/.
*/ */
/* /*
MaSzyna EU07 locomotive simulator MaSzyna EU07 locomotive simulator
Copyright (C) 2001-2004 Marcin Wozniak, Maciej Czapkiewicz and others Copyright (C) 2001-2004 Marcin Wozniak, Maciej Czapkiewicz and others
*/ */
@@ -27,7 +27,7 @@ http://mozilla.org/MPL/2.0/.
using namespace Mtable; using namespace Mtable;
double TSubModel::fSquareDist = 0; double TSubModel::fSquareDist = 0;
size_t TSubModel::iInstance; // numer renderowanego egzemplarza obiektu int TSubModel::iInstance; // numer renderowanego egzemplarza obiektu
texture_manager::size_type *TSubModel::ReplacableSkinId = NULL; texture_manager::size_type *TSubModel::ReplacableSkinId = NULL;
int TSubModel::iAlpha = 0x30300030; // maska do testowania flag tekstur wymiennych int TSubModel::iAlpha = 0x30300030; // maska do testowania flag tekstur wymiennych
TModel3d *TSubModel::pRoot; // Ra: tymczasowo wskaźnik na model widoczny z submodelu TModel3d *TSubModel::pRoot; // Ra: tymczasowo wskaźnik na model widoczny z submodelu
@@ -104,8 +104,8 @@ void TSubModel::FirstInit()
fNearAttenEnd = 80; fNearAttenEnd = 80;
bUseNearAtten = false; bUseNearAtten = false;
iFarAttenDecay = 0; iFarAttenDecay = 0;
fFarDecayRadius = 100; fFarDecayRadius = 100.0f;
fCosFalloffAngle = 0.5; // 120°? fCosFalloffAngle = 0.5f; // 120°?
fCosHotspotAngle = 0.3f; // 145°? fCosHotspotAngle = 0.3f; // 145°?
fCosViewAngle = 0; fCosViewAngle = 0;
fSquareMaxDist = 10000 * 10000; // 10km fSquareMaxDist = 10000 * 10000; // 10km
@@ -152,7 +152,7 @@ void TSubModel::TextureNameSet(const char *n)
if (iFlags & 0x0200) if (iFlags & 0x0200)
{ // tylko jeżeli submodel zosta utworzony przez new { // tylko jeżeli submodel zosta utworzony przez new
delete[] pTexture; // usunięcie poprzedniej delete[] pTexture; // usunięcie poprzedniej
size_t i = strlen(n); int i = strlen(n);
if (i) if (i)
{ // utworzenie nowej { // utworzenie nowej
pTexture = new char[i + 1]; pTexture = new char[i + 1];
@@ -169,7 +169,7 @@ void TSubModel::NameSet(const char *n)
if (iFlags & 0x0200) if (iFlags & 0x0200)
{ // tylko jeżeli submodel zosta utworzony przez new { // tylko jeżeli submodel zosta utworzony przez new
delete[] pName; // usunięcie poprzedniej delete[] pName; // usunięcie poprzedniej
size_t i = strlen(n); int i = strlen(n);
if (i) if (i)
{ // utworzenie nowej { // utworzenie nowej
pName = new char[i + 1]; pName = new char[i + 1];
@@ -205,8 +205,8 @@ int TSubModel::SeekFaceNormal(unsigned int *Masks, int f, unsigned int dwMask, f
return -1; // nie znaleziono stycznego wierzchołka return -1; // nie znaleziono stycznego wierzchołka
} }
float emm1[] = {1, 1, 1, 0}; float emm1[] = { 1, 1, 1, 0 };
float emm2[] = {0, 0, 0, 1}; float emm2[] = { 0, 0, 0, 1 };
inline double readIntAsDouble(cParser &parser, int base = 255) inline double readIntAsDouble(cParser &parser, int base = 255)
{ {
@@ -231,9 +231,9 @@ inline void readColor(cParser &parser, int &color)
/* /*
inline void readMatrix(cParser& parser,matrix4x4& matrix) inline void readMatrix(cParser& parser,matrix4x4& matrix)
{//Ra: wczytanie transforma {//Ra: wczytanie transforma
for (int x=0;x<=3;x++) //wiersze for (int x=0;x<=3;x++) //wiersze
for (int y=0;y<=3;y++) //kolumny for (int y=0;y<=3;y++) //kolumny
parser.getToken(matrix(x)[y]); parser.getToken(matrix(x)[y]);
}; };
*/ */
inline void readMatrix(cParser &parser, float4x4 &matrix) inline void readMatrix(cParser &parser, float4x4 &matrix)
@@ -368,8 +368,8 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
parser >> discard >> bWire >> discard >> fWireSize >> discard; parser >> discard >> bWire >> discard >> fWireSize >> discard;
Opacity = readIntAsDouble(parser, Opacity = readIntAsDouble(parser,
100.0f); // wymagane jest 0 dla szyb, 100 idzie w nieprzezroczyste 100.0f); // wymagane jest 0 dla szyb, 100 idzie w nieprzezroczyste
if (Opacity > 1.0f) if (Opacity > 1.0)
Opacity *= 0.01f; // w 2013 był błąd i aby go obejść, trzeba było wpisać 10000.0 Opacity *= 0.01; // w 2013 był błąd i aby go obejść, trzeba było wpisać 10000.0
if ((Global::iConvertModels & 1) == 0) // dla zgodności wstecz if ((Global::iConvertModels & 1) == 0) // dla zgodności wstecz
Opacity = 0.0; // wszystko idzie w przezroczyste albo zależnie od tekstury Opacity = 0.0; // wszystko idzie w przezroczyste albo zależnie od tekstury
if (!parser.expectToken("map:")) if (!parser.expectToken("map:"))
@@ -411,7 +411,7 @@ 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 = TextureManager.GetTextureId( texture, szTexturePath ); TextureID = TextureManager.GetTextureId(texture, szTexturePath);
// 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
@@ -603,7 +603,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
parser >> Vertices[i].Point.x >> Vertices[i].Point.y >> Vertices[i].Point.z >> parser >> Vertices[i].Point.x >> Vertices[i].Point.y >> Vertices[i].Point.z >>
j // zakodowany kolor j // zakodowany kolor
>> discard; >> discard;
Vertices[i].Normal.x = ((j)&0xFF) / 255.0; // R Vertices[i].Normal.x = ((j) & 0xFF) / 255.0; // R
Vertices[i].Normal.y = ((j >> 8) & 0xFF) / 255.0; // G Vertices[i].Normal.y = ((j >> 8) & 0xFF) / 255.0; // G
Vertices[i].Normal.z = ((j >> 16) & 0xFF) / 255.0; // B Vertices[i].Normal.z = ((j >> 16) & 0xFF) / 255.0; // B
} }
@@ -1220,7 +1220,7 @@ void TSubModel::RenderAlphaDL()
if (eType == TP_TEXT) if (eType == TP_TEXT)
{ // tekst renderujemy w specjalny sposób, zamiast { // tekst renderujemy w specjalny sposób, zamiast
// submodeli z łańcucha Child // submodeli z łańcucha Child
size_t i, j = pasText->size(); int i, j = pasText->size();
TSubModel *p; TSubModel *p;
if (!smLetter) if (!smLetter)
{ // jeśli nie ma tablicy, to ją stworzyć; miejsce { // jeśli nie ma tablicy, to ją stworzyć; miejsce
@@ -1288,12 +1288,12 @@ void TSubModel::RenderVBO()
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
glDrawArrays(eType, (GLint)iVboPtr, glDrawArrays(eType, iVboPtr,
iNumVerts); // narysuj naraz wszystkie trójkąty z VBO iNumVerts); // narysuj naraz wszystkie trójkąty z VBO
glMaterialfv(GL_FRONT, GL_EMISSION, emm2); glMaterialfv(GL_FRONT, GL_EMISSION, emm2);
} }
else else
glDrawArrays(eType, (GLint)iVboPtr, glDrawArrays(eType, iVboPtr,
iNumVerts); // narysuj naraz wszystkie trójkąty z VBO iNumVerts); // narysuj naraz wszystkie trójkąty z VBO
} }
} }
@@ -1351,15 +1351,15 @@ void TSubModel::RenderVBO()
TextureManager.Bind(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] = {(float)(f4Diffuse[0] * Distdimm), (float)(f4Diffuse[1] * Distdimm), float color[4] = { (float)(f4Diffuse[0] * Distdimm), (float)(f4Diffuse[1] * Distdimm),
(float)(f4Diffuse[2] * Distdimm, 0)}; (float)(f4Diffuse[2] * Distdimm), 0 };
// glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm); // glColor3f(f4Diffuse[0]*Distdimm,f4Diffuse[1]*Distdimm,f4Diffuse[2]*Distdimm);
glColorMaterial(GL_FRONT, GL_EMISSION); glColorMaterial(GL_FRONT, GL_EMISSION);
glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie glDisable(GL_LIGHTING); // Tolaris-030603: bo mu punkty swiecace sie
// blendowaly // blendowaly
glColor3fv(color); // inaczej są białe glColor3fv(color); // inaczej są białe
glMaterialfv(GL_FRONT, GL_EMISSION, color); glMaterialfv(GL_FRONT, GL_EMISSION, color);
glDrawArrays(GL_POINTS, (GLint)iVboPtr, iNumVerts); // narysuj wierzchołek z glDrawArrays(GL_POINTS, iVboPtr, iNumVerts); // narysuj wierzchołek z
// VBO // VBO
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // co ma ustawiać glColor glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // co ma ustawiać glColor
@@ -1383,7 +1383,7 @@ void TSubModel::RenderVBO()
// blendowaly // blendowaly
// glMaterialfv(GL_FRONT,GL_EMISSION,f4Diffuse); //zeby swiecilo na // glMaterialfv(GL_FRONT,GL_EMISSION,f4Diffuse); //zeby swiecilo na
// kolorowo // kolorowo
glDrawArrays(GL_POINTS, (GLint)iVboPtr, glDrawArrays(GL_POINTS, iVboPtr,
iNumVerts); // narysuj naraz wszystkie punkty z VBO iNumVerts); // narysuj naraz wszystkie punkty z VBO
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
@@ -1459,12 +1459,12 @@ void TSubModel::RenderAlphaVBO()
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
glDrawArrays(eType, (GLint)iVboPtr, glDrawArrays(eType, iVboPtr,
iNumVerts); // narysuj naraz wszystkie trójkąty z VBO iNumVerts); // narysuj naraz wszystkie trójkąty z VBO
glMaterialfv(GL_FRONT, GL_EMISSION, emm2); glMaterialfv(GL_FRONT, GL_EMISSION, emm2);
} }
else else
glDrawArrays(eType, (GLint)iVboPtr, glDrawArrays(eType, iVboPtr,
iNumVerts); // narysuj naraz wszystkie trójkąty z VBO iNumVerts); // narysuj naraz wszystkie trójkąty z VBO
} }
} }
@@ -1485,7 +1485,7 @@ void TSubModel::RenderAlphaVBO()
Next->RenderAlphaVBO(); Next->RenderAlphaVBO();
}; // RaRenderAlpha }; // RaRenderAlpha
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void TSubModel::RaArrayFill(CVertNormTex *Vert) void TSubModel::RaArrayFill(CVertNormTex *Vert)
{ // wypełnianie tablic VBO { // wypełnianie tablic VBO
@@ -1541,7 +1541,7 @@ void TSubModel::Info()
// pName=new char[token.length()+1]; //nie ma sensu skracać tabeli // pName=new char[token.length()+1]; //nie ma sensu skracać tabeli
strcpy(pTexture, t.c_str()); strcpy(pTexture, t.c_str());
} }
info->iTextureLen = (int)(t.size() + 1); // przygotowanie do zapisania, z zerem na końcu info->iTextureLen = t.size() + 1; // przygotowanie do zapisania, z zerem na końcu
} }
} }
else else
@@ -1550,7 +1550,7 @@ void TSubModel::Info()
if (pName) if (pName)
{ {
info->iName = info->iTotalNames++; // przydzielenie numeru nazwy w pliku (od 0) info->iName = info->iTotalNames++; // przydzielenie numeru nazwy w pliku (od 0)
info->iNameLen = (int)(strlen(pName) + 1); // z zerem na końcu info->iNameLen = strlen(pName) + 1; // z zerem na końcu
} }
++info->iCurrent; // przejście do kolejnego obiektu pomocniczego ++info->iCurrent; // przejście do kolejnego obiektu pomocniczego
if (Child) if (Child)
@@ -1587,8 +1587,8 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TS
bool dynamic) bool dynamic)
{ // ustawienie wskaźników w submodelu { // ustawienie wskaźników w submodelu
iVisible = 1; // tymczasowo używane iVisible = 1; // tymczasowo używane
Child = ((size_t)Child > 0) ? s + (size_t)Child : NULL; // zerowy nie może być potomnym Child = ((int)Child > 0) ? s + (int)Child : NULL; // zerowy nie może być potomnym
Next = ((size_t)Next > 0) ? s + (size_t)Next : NULL; // zerowy nie może być następnym Next = ((int)Next > 0) ? s + (int)Next : NULL; // zerowy nie może być następnym
fMatrix = ((iMatrix >= 0) && m) ? m + iMatrix : NULL; fMatrix = ((iMatrix >= 0) && m) ? m + iMatrix : NULL;
// if (n&&(iName>=0)) asName=AnsiString(n->String(iName)); else asName=""; // if (n&&(iName>=0)) asName=AnsiString(n->String(iName)); else asName="";
if (n && (iName >= 0)) if (n && (iName >= 0))
@@ -1623,7 +1623,7 @@ 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 = TextureManager.GetTextureId( tex, szTexturePath ); TextureID = TextureManager.GetTextureId(tex, szTexturePath);
// 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
@@ -1722,15 +1722,15 @@ TModel3d::TModel3d()
iNumVerts = 0; // nie ma jeszcze wierzchołków iNumVerts = 0; // nie ma jeszcze wierzchołków
}; };
/* /*
TModel3d::TModel3d(char *FileName) TModel3d::TModel3d(char *FileName)
{ {
// Root=NULL; // Root=NULL;
// Materials=NULL; // Materials=NULL;
// MaterialsCount=0; // MaterialsCount=0;
Root=NULL; Root=NULL;
SubModelsCount=0; SubModelsCount=0;
iFlags=0; iFlags=0;
LoadFromFile(FileName); LoadFromFile(FileName);
}; };
*/ */
TModel3d::~TModel3d() TModel3d::~TModel3d()
@@ -1790,12 +1790,12 @@ TSubModel *TModel3d::GetFromName(const char *sName)
/* /*
TMaterial* TModel3d::GetMaterialFromName(char *sName) TMaterial* TModel3d::GetMaterialFromName(char *sName)
{ {
AnsiString tmp=AnsiString(sName).Trim(); AnsiString tmp=AnsiString(sName).Trim();
for (int i=0; i<MaterialsCount; i++) for (int i=0; i<MaterialsCount; i++)
if (strcmp(sName,Materials[i].Name.c_str())==0) if (strcmp(sName,Materials[i].Name.c_str())==0)
// if (Trim()==Materials[i].Name.tmp) // if (Trim()==Materials[i].Name.tmp)
return Materials+i; return Materials+i;
return Materials; return Materials;
} }
*/ */
@@ -1836,12 +1836,6 @@ bool TModel3d::LoadFromFile(std::string const &FileName, bool dynamic)
void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic) void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic)
{ // wczytanie modelu z pliku binarnego { // wczytanie modelu z pliku binarnego
if (sizeof(TSubModel) != 256)
{
std::cout << "E3D files unsupported in current build" << std::endl;
exit(-1);
}
WriteLog("Loading - binary model: " + FileName); WriteLog("Loading - binary model: " + FileName);
int i = 0, j, k, ch, size; int i = 0, j, k, ch, size;
@@ -1850,7 +1844,7 @@ void TModel3d::LoadFromBinFile(std::string const &FileName, bool dynamic)
iModel = new int[size]; // ten wskaźnik musi być w modelu, aby zwolnić pamięć iModel = new int[size]; // ten wskaźnik musi być w modelu, aby zwolnić pamięć
fs->Read(iModel, fs->Size); // wczytanie pliku fs->Read(iModel, fs->Size); // wczytanie pliku
delete fs; delete fs;
*/ { */ {
std::ifstream file(FileName, std::ios::binary | std::ios::ate); std::ifstream file(FileName, std::ios::binary | std::ios::ate);
file.unsetf(std::ios::skipws); file.unsetf(std::ios::skipws);
size = file.tellg(); // ios::ate already positioned us at the end of the file size = file.tellg(); // ios::ate already positioned us at the end of the file
@@ -2050,12 +2044,6 @@ void TModel3d::Init()
void TModel3d::SaveToBinFile(char const *FileName) void TModel3d::SaveToBinFile(char const *FileName)
{ // zapis modelu binarnego { // zapis modelu binarnego
if (sizeof(TSubModel) != 256)
{
std::cout << "E3D files unsupported in current build" << std::endl;
exit(-1);
}
WriteLog("Saving E3D binary model."); WriteLog("Saving E3D binary model.");
int i, zero = 0; int i, zero = 0;
TSubModelInfo *info = new TSubModelInfo[iSubModelsCount]; TSubModelInfo *info = new TSubModelInfo[iSubModelsCount];
@@ -2084,7 +2072,7 @@ void TModel3d::SaveToBinFile(char const *FileName)
// AnsiString *asN=&roboczy->asName,*asT=&roboczy->asTexture; // AnsiString *asN=&roboczy->asName,*asT=&roboczy->asTexture;
// roboczy->FirstInit(); //żeby delete nie usuwało czego nie powinno // roboczy->FirstInit(); //żeby delete nie usuwało czego nie powinno
/* TFileStream *fs = new TFileStream(AnsiString(FileName), fmCreate); /* TFileStream *fs = new TFileStream(AnsiString(FileName), fmCreate);
*/ { */ {
std::ofstream file(FileName, std::ios::binary); std::ofstream file(FileName, std::ios::binary);
file.unsetf(std::ios::skipws); file.unsetf(std::ios::skipws);
file.write("E3D0", 4); // kromka główna file.write("E3D0", 4); // kromka główna
@@ -2159,30 +2147,30 @@ ReplacableSkinId,int iAlpha)
{ {
// glColor3f(1.0f,1.0f,1.0f); // glColor3f(1.0f,1.0f,1.0f);
// glColor3f(0.0f,0.0f,0.0f); // glColor3f(0.0f,0.0f,0.0f);
glPushMatrix(); glPushMatrix();
glTranslated(pPosition.x,pPosition.y,pPosition.z); glTranslated(pPosition.x,pPosition.y,pPosition.z);
if (fAngle!=0) if (fAngle!=0)
glRotatef(fAngle,0,1,0); glRotatef(fAngle,0,1,0);
/* /*
matrix4x4 Identity; matrix4x4 Identity;
Identity.Identity(); Identity.Identity();
matrix4x4 CurrentMatrix; matrix4x4 CurrentMatrix;
glGetdoublev(GL_MODELVIEW_MATRIX,CurrentMatrix.getArray()); glGetdoublev(GL_MODELVIEW_MATRIX,CurrentMatrix.getArray());
vector3 pos=vector3(0,0,0); vector3 pos=vector3(0,0,0);
pos=CurrentMatrix*pos; pos=CurrentMatrix*pos;
fSquareDist=SquareMagnitude(pos); fSquareDist=SquareMagnitude(pos);
* / * /
fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition());
#ifdef _DEBUG #ifdef _DEBUG
if (Root) if (Root)
Root->Render(ReplacableSkinId,iAlpha); Root->Render(ReplacableSkinId,iAlpha);
#else #else
Root->Render(ReplacableSkinId,iAlpha); Root->Render(ReplacableSkinId,iAlpha);
#endif #endif
glPopMatrix(); glPopMatrix();
}; };
*/ */
@@ -2214,34 +2202,34 @@ iAlpha)
{ {
// glColor3f(1.0f,1.0f,1.0f); // glColor3f(1.0f,1.0f,1.0f);
// glColor3f(0.0f,0.0f,0.0f); // glColor3f(0.0f,0.0f,0.0f);
glPushMatrix(); //zapamiętanie matrycy przekształcenia glPushMatrix(); //zapamiętanie matrycy przekształcenia
glTranslated(pPosition.x,pPosition.y,pPosition.z); glTranslated(pPosition.x,pPosition.y,pPosition.z);
if (fAngle!=0) if (fAngle!=0)
glRotatef(fAngle,0,1,0); glRotatef(fAngle,0,1,0);
/* /*
matrix4x4 Identity; matrix4x4 Identity;
Identity.Identity(); Identity.Identity();
matrix4x4 CurrentMatrix; matrix4x4 CurrentMatrix;
glGetdoublev(GL_MODELVIEW_MATRIX,CurrentMatrix.getArray()); glGetdoublev(GL_MODELVIEW_MATRIX,CurrentMatrix.getArray());
vector3 pos=vector3(0,0,0); vector3 pos=vector3(0,0,0);
pos=CurrentMatrix*pos; pos=CurrentMatrix*pos;
fSquareDist=SquareMagnitude(pos); fSquareDist=SquareMagnitude(pos);
*/ */
/* /*
fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna
globalna! globalna!
if (StartVBO()) if (StartVBO())
{//odwrócenie flag, aby wyłapać nieprzezroczyste {//odwrócenie flag, aby wyłapać nieprzezroczyste
Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F); Root->ReplacableSet(ReplacableSkinId,iAlpha^0x0F0F000F);
Root->RaRender(); Root->RaRender();
EndVBO(); EndVBO();
} }
glPopMatrix(); //przywrócenie ustawień przekształcenia glPopMatrix(); //przywrócenie ustawień przekształcenia
}; };
*/ */
void TModel3d::RaRender( double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha ) void TModel3d::RaRender(double fSquareDistance, texture_manager::size_type *ReplacableSkinId, int iAlpha)
{ // renderowanie specjalne, np. kabiny { // 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?
@@ -2276,18 +2264,18 @@ void TModel3d::RaRenderAlpha(vector3 pPosition,double fAngle,GLuint
*ReplacableSkinId,int *ReplacableSkinId,int
iAlpha) iAlpha)
{ {
glPushMatrix(); glPushMatrix();
glTranslatef(pPosition.x,pPosition.y,pPosition.z); glTranslatef(pPosition.x,pPosition.y,pPosition.z);
if (fAngle!=0) if (fAngle!=0)
glRotatef(fAngle,0,1,0); glRotatef(fAngle,0,1,0);
fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna fSquareDist=SquareMagnitude(pPosition-Global::GetCameraPosition()); //zmienna
globalna! globalna!
if (StartVBO()) if (StartVBO())
{Root->ReplacableSet(ReplacableSkinId,iAlpha); {Root->ReplacableSet(ReplacableSkinId,iAlpha);
Root->RaRenderAlpha(); Root->RaRenderAlpha();
EndVBO(); EndVBO();
} }
glPopMatrix(); glPopMatrix();
}; };
*/ */
@@ -2329,7 +2317,7 @@ void TModel3d::RenderAlpha(vector3 *vPosition, vector3 *vAngle, texture_manager:
Root->RenderAlphaDL(); Root->RenderAlphaDL();
glPopMatrix(); glPopMatrix();
}; };
void TModel3d::RaRender( vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId, int iAlpha ) void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, texture_manager::size_type *ReplacableSkinId, int iAlpha)
{ // nieprzezroczyste, VBO { // nieprzezroczyste, VBO
glPushMatrix(); glPushMatrix();
glTranslated(vPosition->x, vPosition->y, vPosition->z); glTranslated(vPosition->x, vPosition->y, vPosition->z);

117
Model3d.h
View File

@@ -36,7 +36,7 @@ class TStringPack
//+0 - 4 bajty: typ kromki //+0 - 4 bajty: typ kromki
//+4 - 4 bajty: długość łącznie z nagłówkiem //+4 - 4 bajty: długość łącznie z nagłówkiem
//+8 - tabela indeksów //+8 - tabela indeksów
public: public:
char *String(int n); char *String(int n);
char *StringAt(int n) char *StringAt(int n)
{ {
@@ -59,8 +59,8 @@ class TStringPack
class TMaterialColor class TMaterialColor
{ {
public: public:
TMaterialColor(){}; TMaterialColor() {};
TMaterialColor(char V) TMaterialColor(char V)
{ {
r = g = b = V; r = g = b = V;
@@ -79,51 +79,51 @@ class TMaterialColor
/* /*
struct TMaterial struct TMaterial
{ {
int ID; int ID;
AnsiString Name; AnsiString Name;
//McZapkie-240702: lepiej uzywac wartosci float do opisu koloru bo funkcje opengl chyba tego na ogol //McZapkie-240702: lepiej uzywac wartosci float do opisu koloru bo funkcje opengl chyba tego na ogol
uzywaja uzywaja
float Ambient[4]; float Ambient[4];
float Diffuse[4]; float Diffuse[4];
float Specular[4]; float Specular[4];
float Transparency; float Transparency;
GLuint TextureID; GLuint TextureID;
}; };
*/ */
/* /*
struct THitBoxContainer struct THitBoxContainer
{ {
TPlane Planes[6]; TPlane Planes[6];
int Index; int Index;
inline void Reset() { Planes[0]= TPlane(vector3(0,0,0),0.0f); }; inline void Reset() { Planes[0]= TPlane(vector3(0,0,0),0.0f); };
inline bool Inside(vector3 Point) inline bool Inside(vector3 Point)
{ {
bool Hit= true; bool Hit= true;
if (Planes[0].Defined()) if (Planes[0].Defined())
for (int i=0; i<6; i++) for (int i=0; i<6; i++)
{ {
if (Planes[i].GetSide(Point)>0) if (Planes[i].GetSide(Point)>0)
{ {
Hit= false; Hit= false;
break; break;
}; };
} }
else return(false); else return(false);
return(Hit); return(Hit);
}; };
}; };
*/ */
/* Ra: tego nie będziemy już używać, bo można wycisnąć więcej /* Ra: tego nie będziemy już używać, bo można wycisnąć więcej
typedef enum typedef enum
{smt_Unknown, //nieznany {smt_Unknown, //nieznany
smt_Mesh, //siatka smt_Mesh, //siatka
smt_Point, smt_Point,
smt_FreeSpotLight, //punkt świetlny smt_FreeSpotLight, //punkt świetlny
smt_Text, //generator tekstu smt_Text, //generator tekstu
smt_Stars //wiele punktów świetlnych smt_Stars //wiele punktów świetlnych
} TSubModelType; } TSubModelType;
*/ */
// Ra: specjalne typy submodeli, poza tym GL_TRIANGLES itp. // Ra: specjalne typy submodeli, poza tym GL_TRIANGLES itp.
@@ -165,15 +165,15 @@ class TSubModel
{ // klasa submodelu - pojedyncza siatka, punkt świetlny albo grupa punktów { // klasa submodelu - pojedyncza siatka, punkt świetlny albo grupa punktów
// Ra: ta klasa ma mieć wielkość 256 bajtów, aby pokryła się z formatem binarnym // 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! // Ra: nie przestawiać zmiennych, bo wczytują się z pliku binarnego!
private: private:
TSubModel *Next; TSubModel *Next;
TSubModel *Child; TSubModel *Child;
int eType; // Ra: modele binarne dają więcej możliwości niż mesh złożony z trójkątów int eType; // Ra: modele binarne dają więcej możliwości niż mesh złożony z trójkątów
int iName; // numer łańcucha z nazwą submodelu, albo -1 gdy anonimowy int iName; // numer łańcucha z nazwą submodelu, albo -1 gdy anonimowy
public: // chwilowo public: // chwilowo
TAnimType b_Anim; TAnimType b_Anim;
private: private:
int iFlags; // flagi informacyjne: int iFlags; // flagi informacyjne:
// bit 0: =1 faza rysowania zależy od wymiennej tekstury 0 // bit 0: =1 faza rysowania zależy od wymiennej tekstury 0
// bit 1: =1 faza rysowania zależy od wymiennej tekstury 1 // bit 1: =1 faza rysowania zależy od wymiennej tekstury 1
@@ -194,7 +194,7 @@ class TSubModel
int iMatrix; // w pliku binarnym jest numer matrycy int iMatrix; // w pliku binarnym jest numer matrycy
}; };
int iNumVerts; // ilość wierzchołków (1 dla FreeSpotLight) int iNumVerts; // ilość wierzchołków (1 dla FreeSpotLight)
size_t iVboPtr; // początek na liście wierzchołków albo indeksów int iVboPtr; // początek na liście wierzchołków albo indeksów
int iTexture; // numer nazwy tekstury, -1 wymienna, 0 brak int iTexture; // numer nazwy tekstury, -1 wymienna, 0 brak
float fVisible; // próg jasności światła do załączenia submodelu float fVisible; // próg jasności światła do załączenia submodelu
float fLight; // próg jasności światła do zadziałania selfillum float fLight; // próg jasności światła do zadziałania selfillum
@@ -228,17 +228,15 @@ class TSubModel
float3 v_RotateAxis; float3 v_RotateAxis;
float3 v_Angles; float3 v_Angles;
public: // chwilowo public: // chwilowo
float3 v_TransVector; float3 v_TransVector;
float8 *Vertices; // roboczy wskaźnik - wczytanie T3D do VBO float8 *Vertices; // roboczy wskaźnik - wczytanie T3D do VBO
size_t iAnimOwner; // roboczy numer egzemplarza, który ustawił animację int iAnimOwner; // roboczy numer egzemplarza, który ustawił animację
TAnimType b_aAnim; // kody animacji oddzielnie, bo zerowane TAnimType b_aAnim; // kody animacji oddzielnie, bo zerowane
public: public:
float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer) float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer)
char space[8]; // wolne miejsce na przyszłe zmienne (zmniejszyć w miarę potrzeby)
char space[8]; public:
public:
TSubModel ** TSubModel **
smLetter; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D) smLetter; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D)
TSubModel *Parent; // nadrzędny, np. do wymnażania macierzy TSubModel *Parent; // nadrzędny, np. do wymnażania macierzy
@@ -247,14 +245,14 @@ class TSubModel
// AnsiString asName; //robocza nazwa // AnsiString asName; //robocza nazwa
char *pTexture; // robocza nazwa tekstury do zapisania w pliku binarnym char *pTexture; // robocza nazwa tekstury do zapisania w pliku binarnym
char *pName; // robocza nazwa char *pName; // robocza nazwa
private: private:
// int SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX // int SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX
// *Vertices); // *Vertices);
int SeekFaceNormal(unsigned int *Masks, int f, unsigned int dwMask, float3 *pt, float8 *Vertices); int SeekFaceNormal(unsigned int *Masks, int f, unsigned int dwMask, float3 *pt, float8 *Vertices);
void RaAnimation(TAnimType a); void RaAnimation(TAnimType a);
public: public:
static size_t iInstance; // identyfikator egzemplarza, który aktualnie renderuje model static int iInstance; // identyfikator egzemplarza, który aktualnie renderuje model
static texture_manager::size_type *ReplacableSkinId; static texture_manager::size_type *ReplacableSkinId;
static int iAlpha; // maska bitowa dla danego przebiegu static int iAlpha; // maska bitowa dla danego przebiegu
static double fSquareDist; static double fSquareDist;
@@ -350,14 +348,14 @@ class TSubModel
class TSubModelInfo class TSubModelInfo
{ // klasa z informacjami o submodelach, do tworzenia pliku binarnego { // klasa z informacjami o submodelach, do tworzenia pliku binarnego
public: public:
TSubModel *pSubModel; // wskaźnik na submodel TSubModel *pSubModel; // wskaźnik na submodel
int iTransform; // numer transformu (-1 gdy brak) int iTransform; // numer transformu (-1 gdy brak)
int iName; // numer nazwy int iName; // numer nazwy
int iTexture; // numer tekstury int iTexture; // numer tekstury
int iNameLen; // długość nazwy int iNameLen; // długość nazwy
int iTextureLen; // długość tekstury int iTextureLen; // długość tekstury
size_t iNext, iChild; // numer następnego i potomnego int iNext, iChild; // numer następnego i potomnego
static int iTotalTransforms; // ilość transformów static int iTotalTransforms; // ilość transformów
static int iTotalNames; // ilość nazw static int iTotalNames; // ilość nazw
static int iTotalTextures; // ilość tekstur static int iTotalTextures; // ilość tekstur
@@ -366,8 +364,7 @@ class TSubModelInfo
TSubModelInfo() TSubModelInfo()
{ {
pSubModel = NULL; pSubModel = NULL;
iTransform = iName = iTexture = -1; iTransform = iName = iTexture = iNext = iChild = -1; // nie ma
iNext = iChild = -1; // nie ma
iNameLen = iTextureLen = 0; iNameLen = iTextureLen = 0;
} }
void Reset() void Reset()
@@ -375,26 +372,26 @@ class TSubModelInfo
pTable = this; // ustawienie wskaźnika tabeli obiektów pTable = this; // ustawienie wskaźnika tabeli obiektów
iTotalTransforms = iTotalNames = iTotalTextures = iCurrent = 0; // zerowanie liczników iTotalTransforms = iTotalNames = iTotalTextures = iCurrent = 0; // zerowanie liczników
} }
~TSubModelInfo(){}; ~TSubModelInfo() {};
}; };
class TModel3d : public CMesh class TModel3d : public CMesh
{ {
private: private:
// TMaterial *Materials; // TMaterial *Materials;
// int MaterialsCount; //Ra: nie używane // int MaterialsCount; //Ra: nie używane
// bool TractionPart; //Ra: nie używane // bool TractionPart; //Ra: nie używane
TSubModel *Root; // drzewo submodeli TSubModel *Root; // drzewo submodeli
int iFlags; // Ra: czy submodele mają przezroczyste tekstury int iFlags; // Ra: czy submodele mają przezroczyste tekstury
public: // Ra: tymczasowo public: // Ra: tymczasowo
int iNumVerts; // ilość wierzchołków (gdy nie ma VBO, to m_nVertexCount=0) int iNumVerts; // ilość wierzchołków (gdy nie ma VBO, to m_nVertexCount=0)
private: private:
TStringPack Textures; // nazwy tekstur TStringPack Textures; // nazwy tekstur
TStringPack Names; // nazwy submodeli TStringPack Names; // nazwy submodeli
int *iModel; // zawartość pliku binarnego int *iModel; // zawartość pliku binarnego
int iSubModelsCount; // Ra: używane do tworzenia binarnych int iSubModelsCount; // Ra: używane do tworzenia binarnych
std::string asBinary; // nazwa pod którą zapisać model binarny std::string asBinary; // nazwa pod którą zapisać model binarny
public: public:
inline TSubModel * GetSMRoot() inline TSubModel * GetSMRoot()
{ {
return (Root); return (Root);
@@ -429,13 +426,13 @@ class TModel3d : public CMesh
void RaRenderAlpha(vector3 pPosition, double fAngle = 0, texture_manager::size_type *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, texture_manager::size_type *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, texture_manager::size_type *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, texture_manager::size_type *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, texture_manager::size_type *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()