mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-18 00:49:19 +02:00
post-merge cleanup
This commit is contained in:
85
Ground.cpp
85
Ground.cpp
@@ -70,31 +70,17 @@ TGroundNode::TGroundNode()
|
||||
iType = GL_POINTS;
|
||||
Vertices = NULL;
|
||||
nNext = nNext2 = NULL;
|
||||
/*
|
||||
pCenter = vector3(0, 0, 0);
|
||||
*/
|
||||
iCount = 0; // wierzchołków w trójkącie
|
||||
// iNumPts=0; //punktów w linii
|
||||
TextureID = 0;
|
||||
iFlags = 0; // tryb przezroczystości nie zbadany
|
||||
DisplayListID = 0;
|
||||
Pointer = NULL; // zerowanie wskaźnika kontekstowego
|
||||
bVisible = false; // czy widoczny
|
||||
fSquareRadius = 10000 * 10000;
|
||||
fSquareMinRadius = 0;
|
||||
asName = "";
|
||||
fLineThickness=1.0; //mm dla linii
|
||||
/*
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
Ambient[i] = Global::whiteLight[i] * 255;
|
||||
Diffuse[i] = Global::whiteLight[i] * 255;
|
||||
Specular[i] = Global::noLight[i] * 255;
|
||||
}
|
||||
*/
|
||||
nNext3 = NULL; // nie wyświetla innych
|
||||
iVboPtr = -1; // indeks w VBO sektora (-1: nie używa VBO)
|
||||
iVersion = 0; // wersja siatki
|
||||
}
|
||||
|
||||
TGroundNode::~TGroundNode()
|
||||
@@ -182,7 +168,7 @@ void TGroundNode::InitNormals()
|
||||
glm::dvec3 v1, v2, v3, v4, v5;
|
||||
glm::vec3 n1, n2, n3, n4;
|
||||
glm::vec2 t1;
|
||||
std::size_t i;
|
||||
int i;
|
||||
switch (iType)
|
||||
{
|
||||
case GL_TRIANGLE_STRIP:
|
||||
@@ -246,14 +232,7 @@ void TGroundNode::InitNormals()
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*
|
||||
void TGroundNode::Release()
|
||||
{
|
||||
if (DisplayListID)
|
||||
glDeleteLists(DisplayListID, 1);
|
||||
DisplayListID = 0;
|
||||
};
|
||||
*/
|
||||
|
||||
void TGroundNode::RenderHidden()
|
||||
{ // renderowanie obiektów niewidocznych
|
||||
double mgn = SquareMagnitude(pCenter - Global::pCameraPosition);
|
||||
@@ -285,10 +264,6 @@ void TGroundNode::RenderHidden()
|
||||
//------------------------------------------------------------------------------
|
||||
TSubRect::~TSubRect()
|
||||
{
|
||||
/*
|
||||
if (Global::bManageNodes) // Ra: tu się coś sypie
|
||||
ResourceManager::Unregister(this); // wyrejestrowanie ze sprzątacza
|
||||
*/
|
||||
// TODO: usunąć obiekty z listy (nRootMesh), bo są one tworzone dla sektora
|
||||
delete[] tTracks;
|
||||
}
|
||||
@@ -477,7 +452,7 @@ void TSubRect::LoadNodes() {
|
||||
switch (node->iType) {
|
||||
case GL_TRIANGLES: {
|
||||
vertex_array vertices;
|
||||
for( std::size_t idx = 0; idx < node->iNumVerts; ++idx ) {
|
||||
for( int idx = 0; idx < node->iNumVerts; ++idx ) {
|
||||
vertices.emplace_back(
|
||||
node->Vertices[ idx ].position - node->m_rootposition,
|
||||
node->Vertices[ idx ].normal,
|
||||
@@ -490,7 +465,7 @@ void TSubRect::LoadNodes() {
|
||||
}
|
||||
case GL_LINES: {
|
||||
vertex_array vertices;
|
||||
for( std::size_t idx = 0; idx < node->iNumPts; ++idx ) {
|
||||
for( int idx = 0; idx < node->iNumPts; ++idx ) {
|
||||
vertices.emplace_back(
|
||||
node->Points[ idx ] - node->m_rootposition,
|
||||
glm::vec3(),
|
||||
@@ -513,16 +488,8 @@ void TSubRect::LoadNodes() {
|
||||
}
|
||||
node = node->nNext2; // następny z sektora
|
||||
}
|
||||
/*
|
||||
if (Global::bManageNodes)
|
||||
ResourceManager::Register(this); // dodanie do automatu zwalniającego pamięć
|
||||
*/
|
||||
}
|
||||
/*
|
||||
void TSubRect::Release()
|
||||
{ // wirtualne zwolnienie zasobów przez sprzątacz albo destruktor
|
||||
};
|
||||
*/
|
||||
|
||||
void TSubRect::RenderSounds()
|
||||
{ // aktualizacja dźwięków w pojazdach sektora (sektor może nie być wyświetlany)
|
||||
for (int j = 0; j < iTracks; ++j)
|
||||
@@ -575,9 +542,6 @@ TGround::TGround()
|
||||
nRootOfType[ i ] = nullptr; // zerowanie tablic wyszukiwania
|
||||
}
|
||||
::SecureZeroMemory( TempConnectionType, sizeof( TempConnectionType ) );
|
||||
/*
|
||||
::SecureZeroMemory( pRendered, sizeof( pRendered ) );
|
||||
*/
|
||||
// set bounding area information for ground rectangles
|
||||
float const rectsize = 1000.0f;
|
||||
glm::vec3 const worldcenter;
|
||||
@@ -780,14 +744,6 @@ void TGround::RaTriangleDivider(TGroundNode *node)
|
||||
ntri->Init(3);
|
||||
ntri->TextureID = node->TextureID;
|
||||
ntri->iFlags = node->iFlags;
|
||||
/*
|
||||
for (int j = 0; j < 4; ++j)
|
||||
{
|
||||
ntri->Ambient[j] = node->Ambient[j];
|
||||
ntri->Diffuse[j] = node->Diffuse[j];
|
||||
ntri->Specular[j] = node->Specular[j];
|
||||
}
|
||||
*/
|
||||
ntri->Ambient = node->Ambient;
|
||||
ntri->Diffuse = node->Diffuse;
|
||||
ntri->Specular = node->Specular;
|
||||
@@ -1256,7 +1212,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
||||
tmp->nNode[0].iType = TP_MODEL; // pierwszy zawiera model (dla delete)
|
||||
tmp->nNode[0].Model = Global::pTerrainCompact;
|
||||
tmp->nNode[0].iFlags = 0x200; // nie wyświetlany, ale usuwany
|
||||
for (std::size_t i = 1; i < tmp->iCount; ++i)
|
||||
for (int i = 1; i < tmp->iCount; ++i)
|
||||
{ // a reszta to submodele
|
||||
tmp->nNode[i].iType = TP_SUBMODEL; //
|
||||
tmp->nNode[i].smTerrain = Global::pTerrainCompact->TerrainSquare(i - 1);
|
||||
@@ -2073,7 +2029,7 @@ bool TGround::Init(std::string File)
|
||||
bool TGround::InitEvents()
|
||||
{ //łączenie eventów z pozostałymi obiektami
|
||||
TGroundNode *tmp, *trk;
|
||||
char buff[255];
|
||||
char buff[ 255 ]; std::string cellastext;
|
||||
int i;
|
||||
for (TEvent *Current = RootEvent; Current; Current = Current->evNext2)
|
||||
{
|
||||
@@ -2166,19 +2122,16 @@ bool TGround::InitEvents()
|
||||
else
|
||||
ErrorLog("Bad copyvalues: event \"" + Current->asName +
|
||||
"\" cannot find memcell \"" + Current->asNodeName + "\"");
|
||||
strcpy(
|
||||
buff,
|
||||
Current->Params[9].asText); // skopiowanie nazwy drugiej komórki do bufora roboczego
|
||||
cellastext = Current->Params[ 9 ].asText;
|
||||
SafeDeleteArray(Current->Params[9].asText); // usunięcie nazwy komórki
|
||||
tmp = FindGroundNode(buff, TP_MEMCELL); // komórka źódłowa
|
||||
if (tmp)
|
||||
{
|
||||
tmp = FindGroundNode( cellastext, TP_MEMCELL); // komórka źódłowa
|
||||
if (tmp != nullptr ) {
|
||||
Current->Params[8].nGroundNode = tmp;
|
||||
Current->Params[9].asMemCell = tmp->MemCell; // komórka źródłowa
|
||||
}
|
||||
else
|
||||
ErrorLog("Bad copyvalues: event \"" + Current->asName +
|
||||
"\" cannot find memcell \"" + buff + "\"");
|
||||
"\" cannot find memcell \"" + cellastext + "\"");
|
||||
break;
|
||||
case tp_Animation: // animacja modelu
|
||||
tmp = FindGroundNode(Current->asNodeName, TP_MODEL); // egzemplarza modelu do animowania
|
||||
@@ -4024,13 +3977,17 @@ void TGround::DynamicRemove(TDynamicObject *dyn)
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void TGround::TerrainRead(std::string const &f){
|
||||
// Ra: wczytanie trójkątów terenu z pliku E3D
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void TGround::TerrainWrite()
|
||||
{ // Ra: zapisywanie trójkątów terenu do pliku E3D
|
||||
// TODO: re-implement
|
||||
/*
|
||||
if (Global::pTerrainCompact->TerrainLoaded())
|
||||
return; // jeśli zostało wczytane, to nie ma co dalej robić
|
||||
if (Global::asTerrainModel.empty())
|
||||
@@ -4092,16 +4049,6 @@ void TGround::TerrainWrite()
|
||||
ver[ k ].position = Current->Vertices[ k ].position;
|
||||
ver[ k ].normal = Current->Vertices[ k ].normal;
|
||||
ver[ k ].texture = Current->Vertices[ k ].texture;
|
||||
/*
|
||||
ver[k].position.x = Current->Vertices[k].position.x;
|
||||
ver[k].position.y = Current->Vertices[k].position.y;
|
||||
ver[k].position.z = Current->Vertices[k].position.z;
|
||||
ver[k].normal.x = Current->Vertices[k].normal.x;
|
||||
ver[k].normal.y = Current->Vertices[k].normal.y;
|
||||
ver[k].normal.z = Current->Vertices[k].normal.z;
|
||||
ver[k].texture.s = Current->Vertices[k].tu;
|
||||
ver[k].texture.t = Current->Vertices[k].tv;
|
||||
*/
|
||||
}
|
||||
break;
|
||||
case GL_TRIANGLE_STRIP: // na razie nie, bo trzeba przerabiać na pojedyncze trójkąty
|
||||
@@ -4111,7 +4058,9 @@ void TGround::TerrainWrite()
|
||||
}
|
||||
}
|
||||
m->SaveToBinFile(strdup(("models\\" + Global::asTerrainModel).c_str()));
|
||||
*/
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void TGround::TrackBusyList()
|
||||
|
||||
4
Ground.h
4
Ground.h
@@ -139,9 +139,6 @@ public:
|
||||
int iNumPts; // dla linii
|
||||
int iCount; // dla terenu
|
||||
};
|
||||
int iVersion; // wersja siatki (do wykonania rekompilacji)
|
||||
GLuint DisplayListID; // numer siatki DisplayLists
|
||||
int iVboPtr; // indeks w buforze VBO
|
||||
// NOTE: geometry handle is duplicated in (anim)model(3d), as well as in track and traction type nodes
|
||||
// TODO: clean this up when node types are refactored into an inheritance/composition scheme
|
||||
geometry_handle m_geometry; // geometry of the submodel
|
||||
@@ -273,6 +270,7 @@ class TGround
|
||||
TEvent *RootEvent = nullptr; // lista zdarzeń
|
||||
TEvent *QueryRootEvent = nullptr,
|
||||
*tmpEvent = nullptr;
|
||||
/*
|
||||
TSubRect *pRendered[1500]; // lista renderowanych sektorów
|
||||
*/
|
||||
int iNumNodes = 0;
|
||||
|
||||
20
Model3d.cpp
20
Model3d.cpp
@@ -187,18 +187,8 @@ inline void readColor(cParser &parser, glm::vec4 &color)
|
||||
>> color.g
|
||||
>> color.b;
|
||||
color /= 255.0f;
|
||||
/*
|
||||
color = r + (g << 8) + (b << 16);
|
||||
*/
|
||||
};
|
||||
/*
|
||||
inline void readMatrix(cParser& parser,matrix4x4& matrix)
|
||||
{//Ra: wczytanie transforma
|
||||
for (int x=0;x<=3;x++) //wiersze
|
||||
for (int y=0;y<=3;y++) //kolumny
|
||||
parser.getToken(matrix(x)[y]);
|
||||
};
|
||||
*/
|
||||
|
||||
inline void readMatrix(cParser &parser, float4x4 &matrix)
|
||||
{ // Ra: wczytanie transforma
|
||||
parser.getTokens(16, false);
|
||||
@@ -597,8 +587,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
|
||||
};
|
||||
|
||||
int TSubModel::TriangleAdd(TModel3d *m, texture_handle tex, int tri)
|
||||
{ // dodanie trójkątów do submodelu, używane
|
||||
// przy tworzeniu E3D terenu
|
||||
{ // dodanie trójkątów do submodelu, używane przy tworzeniu E3D terenu
|
||||
TSubModel *s = this;
|
||||
while (s ? (s->TextureID != tex) : false)
|
||||
{ // szukanie submodelu o danej teksturze
|
||||
@@ -616,7 +605,7 @@ int TSubModel::TriangleAdd(TModel3d *m, texture_handle tex, int tri)
|
||||
s = new TSubModel();
|
||||
m->AddTo(this, s);
|
||||
}
|
||||
s->TextureNameSet(GfxRenderer.Texture(tex).name.c_str());
|
||||
s->TextureNameSet(GfxRenderer.Texture(tex).name);
|
||||
s->TextureID = tex;
|
||||
s->eType = GL_TRIANGLES;
|
||||
}
|
||||
@@ -628,8 +617,7 @@ int TSubModel::TriangleAdd(TModel3d *m, texture_handle tex, int tri)
|
||||
};
|
||||
|
||||
basic_vertex *TSubModel::TrianglePtr(int tex, int pos, glm::vec3 const &Ambient, glm::vec3 const &Diffuse, glm::vec3 const &Specular )
|
||||
{ // zwraca wskaźnik do wypełnienia tabeli wierzchołków, używane
|
||||
// przy tworzeniu E3D terenu
|
||||
{ // zwraca wskaźnik do wypełnienia tabeli wierzchołków, używane przy tworzeniu E3D terenu
|
||||
TSubModel *s = this;
|
||||
while (s ? s->TextureID != tex : false)
|
||||
{ // szukanie submodelu o danej teksturze
|
||||
|
||||
670
Track.cpp
670
Track.cpp
@@ -202,9 +202,6 @@ TTrack * TTrack::Create400m(int what, double dx)
|
||||
TSubRect *r = Global::pGround->GetSubRect(tmp->pCenter.x, tmp->pCenter.z);
|
||||
r->NodeAdd(tmp); // dodanie toru do segmentu
|
||||
r->Sort(); //żeby wyświetlał tabor z dodanego toru
|
||||
/*
|
||||
r->Release(); // usunięcie skompilowanych zasobów
|
||||
*/
|
||||
return trk;
|
||||
};
|
||||
|
||||
@@ -314,9 +311,6 @@ TTrack * TTrack::NullCreate(int dir)
|
||||
if (tmp2)
|
||||
r->NodeAdd(tmp2); // drugiego też
|
||||
r->Sort(); //żeby wyświetlał tabor z dodanego toru
|
||||
/*
|
||||
r->Release(); // usunięcie skompilowanych zasobów
|
||||
*/
|
||||
return trk;
|
||||
};
|
||||
|
||||
@@ -1026,652 +1020,7 @@ const vector6 iglica[nnumPts] = // iglica - vextor3(x,y,mapowanie tekstury)
|
||||
vector6(-0.040, -0.180, 1.00, -1.000, 0.000,
|
||||
0.000) // 1mm więcej, żeby nie nachodziły tekstury?
|
||||
};
|
||||
/*
|
||||
void TTrack::Compile(GLuint tex)
|
||||
{
|
||||
basic_vertex *immediate{ nullptr };
|
||||
|
||||
// generowanie treści dla Display Lists - model proceduralny
|
||||
if (!tex)
|
||||
{ // jeśli nie podana tekstura, to każdy tor ma wlasne DL
|
||||
if (DisplayListID)
|
||||
Release(); // zwolnienie zasobów w celu ponownego utworzenia
|
||||
if (Global::bManageNodes)
|
||||
{
|
||||
DisplayListID = glGenLists(1); // otwarcie nowej listy
|
||||
glNewList(DisplayListID, GL_COMPILE);
|
||||
};
|
||||
}
|
||||
glColor3f(1.0f, 1.0f, 1.0f); // to tutaj potrzebne?
|
||||
// Ra: nie zmieniamy oświetlenia przy kompilowaniu, ponieważ ono się zmienia w czasie!
|
||||
// trochę podliczonych zmiennych, co się potem przydadzą
|
||||
double fHTW = 0.5 * fabs(fTrackWidth); // połowa szerokości
|
||||
double side = fabs(fTexWidth); // szerokść podsypki na zewnątrz szyny albo pobocza
|
||||
double slop = fabs(fTexSlope); // szerokość pochylenia
|
||||
double rozp = fHTW + side + slop; // brzeg zewnętrzny
|
||||
double hypot1 = hypot(slop, fTexHeight1); // rozmiar pochylenia do liczenia normalnych
|
||||
if (hypot1 == 0.0)
|
||||
hypot1 = 1.0;
|
||||
vector3 normal1 = vector3(fTexSlope / hypot1, fTexHeight1 / hypot1, 0.0); // wektor normalny
|
||||
double fHTW2, side2, slop2, rozp2, fTexHeight2, hypot2;
|
||||
vector3 normal2;
|
||||
if (iTrapezoid & 2) // ten bit oznacza, że istnieje odpowiednie pNext
|
||||
{ // Ra: jest OK
|
||||
fHTW2 = 0.5 * fabs(trNext->fTrackWidth); // połowa rozstawu/nawierzchni
|
||||
side2 = fabs(trNext->fTexWidth);
|
||||
slop2 = fabs(trNext->fTexSlope);
|
||||
rozp2 = fHTW2 + side2 + slop2; // szerokość podstawy
|
||||
fTexHeight2 = trNext->fTexHeight1;
|
||||
hypot2 = hypot(slop2, fTexHeight2);
|
||||
if (hypot2 == 0.0)
|
||||
hypot2 = 1.0;
|
||||
normal2 = vector3(trNext->fTexSlope / hypot2, fTexHeight2 / hypot2, 0.0);
|
||||
}
|
||||
else // gdy nie ma następnego albo jest nieodpowiednim końcem podpięty
|
||||
{
|
||||
fHTW2 = fHTW;
|
||||
side2 = side;
|
||||
slop2 = slop;
|
||||
rozp2 = rozp;
|
||||
fTexHeight2 = fTexHeight1;
|
||||
hypot2 = hypot1;
|
||||
normal2 = normal1;
|
||||
}
|
||||
|
||||
auto const origin { pMyNode->m_rootposition };
|
||||
|
||||
double roll1, roll2;
|
||||
switch (iCategoryFlag & 15)
|
||||
{
|
||||
case 1: // tor
|
||||
{
|
||||
Segment->GetRolls(roll1, roll2);
|
||||
double sin1 = sin(roll1), cos1 = cos(roll1), sin2 = sin(roll2), cos2 = cos(roll2);
|
||||
// zwykla szyna: //Ra: czemu główki są asymetryczne na wysokości 0.140?
|
||||
vector6 rpts1[24], rpts2[24], rpts3[24], rpts4[24];
|
||||
int i;
|
||||
for (i = 0; i < 12; ++i)
|
||||
{
|
||||
rpts1[i] =
|
||||
vector6(
|
||||
(fHTW + szyna[i].x) * cos1 + szyna[i].y * sin1,
|
||||
-(fHTW + szyna[i].x) * sin1 + szyna[i].y * cos1,
|
||||
szyna[i].z,
|
||||
+szyna[i].n.x * cos1 + szyna[i].n.y * sin1,
|
||||
-szyna[i].n.x * sin1 + szyna[i].n.y * cos1,
|
||||
0.0);
|
||||
rpts2[11 - i] =
|
||||
vector6(
|
||||
(-fHTW - szyna[i].x) * cos1 + szyna[i].y * sin1,
|
||||
-(-fHTW - szyna[i].x) * sin1 + szyna[i].y * cos1,
|
||||
szyna[i].z,
|
||||
-szyna[i].n.x * cos1 + szyna[i].n.y * sin1,
|
||||
+szyna[i].n.x * sin1 + szyna[i].n.y * cos1,
|
||||
0.0);
|
||||
}
|
||||
if (iTrapezoid) // jak trapez albo przechyłki, to oddzielne punkty na końcu
|
||||
for (i = 0; i < 12; ++i)
|
||||
{
|
||||
rpts1[12 + i] =
|
||||
vector6(
|
||||
(fHTW2 + szyna[i].x) * cos2 + szyna[i].y * sin2,
|
||||
-(fHTW2 + szyna[i].x) * sin2 + szyna[i].y * cos2,
|
||||
szyna[i].z,
|
||||
+szyna[i].n.x * cos2 + szyna[i].n.y * sin2,
|
||||
-szyna[i].n.x * sin2 + szyna[i].n.y * cos2,
|
||||
0.0);
|
||||
rpts2[23 - i] =
|
||||
vector6(
|
||||
(-fHTW2 - szyna[i].x) * cos2 + szyna[i].y * sin2,
|
||||
-(-fHTW2 - szyna[i].x) * sin2 + szyna[i].y * cos2,
|
||||
szyna[i].z,
|
||||
-szyna[i].n.x * cos2 + szyna[i].n.y * sin2,
|
||||
+szyna[i].n.x * sin2 + szyna[i].n.y * cos2,
|
||||
0.0);
|
||||
}
|
||||
switch (eType) // dalej zależnie od typu
|
||||
{
|
||||
case tt_Table: // obrotnica jak zwykły tor, animacja wykonywana w RaAnimate(), tutaj tylko
|
||||
// regeneracja siatek
|
||||
case tt_Normal:
|
||||
if (TextureID2)
|
||||
if (tex ? TextureID2 == tex : true) // jeśli pasuje do grupy (tex)
|
||||
{ // podsypka z podkładami jest tylko dla zwykłego toru
|
||||
vector6 bpts1[8]; // punkty głównej płaszczyzny nie przydają się do robienia boków
|
||||
if (fTexLength == 4.0) // jeśli stare mapowanie na profil 0.2 0.5 1.1 (również 6-9-9/noil)
|
||||
{ // stare mapowanie z różną gęstością pikseli i oddzielnymi teksturami na każdy
|
||||
// profil
|
||||
if (iTrapezoid) // trapez albo przechyłki
|
||||
{ // podsypka z podkladami trapezowata
|
||||
// ewentualnie poprawić mapowanie, żeby środek mapował się na 1.435/4.671 ((0.3464,0.6536)
|
||||
// bo się tekstury podsypki rozjeżdżają po zmianie proporcji profilu
|
||||
bpts1[0] = vector6(rozp, -fTexHeight1 - 0.18, 0.00, normal1.x, -normal1.y, 0.0); // lewy brzeg
|
||||
bpts1[1] = vector6((fHTW + side) * cos1, -(fHTW + side) * sin1 - 0.18, 0.33, 0.0, 1.0, 0.0); // krawędź załamania
|
||||
bpts1[2] = vector6(-bpts1[1].x, +(fHTW + side) * sin1 - 0.18, 0.67, -normal1.x, -normal1.y, 0.0); // prawy brzeg początku symetrycznie
|
||||
bpts1[3] = vector6(-rozp, -fTexHeight1 - 0.18, 1.00, -normal1.x, -normal1.y, 0.0); // prawy skos
|
||||
// przekrój końcowy
|
||||
bpts1[4] = vector6(rozp2, -fTexHeight2 - 0.18, 0.00, normal2.x, -normal2.y, 0.0); // lewy brzeg
|
||||
bpts1[5] = vector6((fHTW2 + side2) * cos2, -(fHTW2 + side2) * sin2 - 0.18, 0.33, 0.0, 1.0, 0.0); // krawędź załamania
|
||||
bpts1[6] = vector6(-bpts1[5].x, +(fHTW2 + side2) * sin2 - 0.18, 0.67, 0.0, 1.0, 0.0); // prawy brzeg początku symetrycznie
|
||||
bpts1[7] = vector6(-rozp2, -fTexHeight2 - 0.18, 1.00, -normal2.x, -normal2.y, 0.0); // prawy skos
|
||||
}
|
||||
else
|
||||
{
|
||||
bpts1[0] = vector6(rozp, -fTexHeight1 - 0.18, 0.0, +normal1.x, -normal1.y, 0.0); // lewy brzeg
|
||||
bpts1[1] = vector6(fHTW + side, -0.18, 0.33, +normal1.x, -normal1.y, 0.0); // krawędź załamania
|
||||
bpts1[2] = vector6(-fHTW - side, -0.18, 0.67, -normal1.x, -normal1.y, 0.0); // druga
|
||||
bpts1[3] = vector6(-rozp, -fTexHeight1 - 0.18, 1.0, -normal1.x, -normal1.y, 0.0); // prawy skos
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // mapowanie proporcjonalne do powierzchni, rozmiar w poprzek określa fTexLength
|
||||
double max = fTexRatio2 * fTexLength; // szerokość proporcjonalna do długości
|
||||
double map11 = (
|
||||
max > 0.0 ?
|
||||
(fHTW + side) / max :
|
||||
0.25 ); // załamanie od strony 1
|
||||
double map12 = (
|
||||
max > 0.0 ?
|
||||
(fHTW + side + hypot1) / max :
|
||||
0.5 ); // brzeg od strony 1
|
||||
if (iTrapezoid) // trapez albo przechyłki
|
||||
{ // podsypka z podkladami trapezowata
|
||||
double map21 = (
|
||||
max > 0.0 ?
|
||||
(fHTW2 + side2) / max :
|
||||
0.25 ); // załamanie od strony 2
|
||||
double map22 = (
|
||||
max > 0.0 ?
|
||||
(fHTW2 + side2 + hypot2) / max :
|
||||
0.5 ); // brzeg od strony 2
|
||||
// ewentualnie poprawić mapowanie, żeby środek mapował się na 1.435/4.671 ((0.3464,0.6536)
|
||||
// bo się tekstury podsypki rozjeżdżają po zmianie proporcji profilu
|
||||
bpts1[0] = vector6(rozp, -fTexHeight1 - 0.18, 0.5 - map12, normal1.x, -normal1.y, 0.0); // lewy brzeg
|
||||
bpts1[1] = vector6((fHTW + side) * cos1, -(fHTW + side) * sin1 - 0.18, 0.5 - map11, 0.0, 1.0, 0.0); // krawędź załamania
|
||||
bpts1[2] = vector6(-bpts1[1].x, +(fHTW + side) * sin1 - 0.18, 0.5 + map11, 0.0, 1.0, 0.0); // prawy brzeg początku symetrycznie
|
||||
bpts1[3] = vector6(-rozp, -fTexHeight1 - 0.18, 0.5 + map12, -normal1.x, -normal1.y, 0.0); // prawy skos
|
||||
// przekrój końcowy
|
||||
bpts1[4] = vector6(rozp2, -fTexHeight2 - 0.18, 0.5 - map22, normal2.x, -normal2.y, 0.0); // lewy brzeg
|
||||
bpts1[5] = vector6((fHTW2 + side2) * cos2, -(fHTW2 + side2) * sin2 - 0.18, 0.5 - map21, 0.0, 1.0, 0.0); // krawędź załamania
|
||||
bpts1[6] = vector6(-bpts1[5].x, +(fHTW2 + side2) * sin2 - 0.18, 0.5 + map21, 0.0, 1.0, 0.0); // prawy brzeg początku symetrycznie
|
||||
bpts1[7] = vector6(-rozp2, -fTexHeight2 - 0.18, 0.5 + map22, -normal2.x, -normal2.y, 0.0); // prawy skos
|
||||
}
|
||||
else
|
||||
{
|
||||
bpts1[0] = vector6(rozp, -fTexHeight1 - 0.18, 0.5 - map12, +normal1.x, -normal1.y, 0.0); // lewy brzeg
|
||||
bpts1[1] = vector6(fHTW + side, -0.18, 0.5 - map11, +normal1.x, -normal1.y, 0.0); // krawędź załamania
|
||||
bpts1[2] = vector6(-fHTW - side, -0.18, 0.5 + map11, -normal1.x, -normal1.y, 0.0); // druga
|
||||
bpts1[3] = vector6(-rozp, -fTexHeight1 - 0.18, 0.5 + map12, -normal1.x, -normal1.y, 0.0); // prawy skos
|
||||
}
|
||||
}
|
||||
if (!tex)
|
||||
GfxRenderer.Bind( TextureID2 );
|
||||
Segment->RenderLoft( immediate, origin, bpts1, iTrapezoid ? -4 : 4, fTexLength);
|
||||
}
|
||||
if (TextureID1)
|
||||
if (tex ? TextureID1 == tex : true) // jeśli pasuje do grupy (tex)
|
||||
{ // szyny
|
||||
if (!tex)
|
||||
GfxRenderer.Bind( TextureID1 );
|
||||
Segment->RenderLoft( immediate, origin, rpts1, iTrapezoid ? -nnumPts : nnumPts, fTexLength);
|
||||
Segment->RenderLoft( immediate, origin, rpts2, iTrapezoid ? -nnumPts : nnumPts, fTexLength);
|
||||
}
|
||||
break;
|
||||
case tt_Switch: // dla zwrotnicy dwa razy szyny
|
||||
if (TextureID1 || TextureID2) // zwrotnice nie są grupowane, aby prościej było je animować
|
||||
{ // iglice liczone tylko dla zwrotnic
|
||||
// Ra: TODO: oddzielna animacja każdej iglicy, opór na docisku
|
||||
vector6 rpts3[24], rpts4[24];
|
||||
for (i = 0; i < 12; ++i)
|
||||
{
|
||||
rpts3[i] =
|
||||
vector6(+(fHTW + iglica[i].x) * cos1 + iglica[i].y * sin1,
|
||||
-(+fHTW + iglica[i].x) * sin1 + iglica[i].y * cos1, iglica[i].z);
|
||||
rpts3[i + 12] =
|
||||
vector6(+(fHTW2 + szyna[i].x) * cos2 + szyna[i].y * sin2,
|
||||
-(+fHTW2 + szyna[i].x) * sin2 + iglica[i].y * cos2, szyna[i].z);
|
||||
rpts4[11 - i] =
|
||||
vector6((-fHTW - iglica[i].x) * cos1 + iglica[i].y * sin1,
|
||||
-(-fHTW - iglica[i].x) * sin1 + iglica[i].y * cos1, iglica[i].z);
|
||||
rpts4[23 - i] =
|
||||
vector6((-fHTW2 - szyna[i].x) * cos2 + szyna[i].y * sin2,
|
||||
-(-fHTW2 - szyna[i].x) * sin2 + iglica[i].y * cos2, szyna[i].z);
|
||||
}
|
||||
// McZapkie-130302 - poprawione rysowanie szyn
|
||||
if (SwitchExtension->RightSwitch)
|
||||
{ // zwrotnica prawa
|
||||
if( TextureID1 ) {
|
||||
GfxRenderer.Bind( TextureID1 );
|
||||
SwitchExtension->Segments[ 0 ]->RenderLoft( immediate, origin, rpts3, -nnumPts, fTexLength, 1.0, 0, 2, SwitchExtension->fOffset2 ); // prawa iglica
|
||||
SwitchExtension->Segments[ 0 ]->RenderLoft( immediate, origin, rpts1, nnumPts, fTexLength, 1.0, 2 ); // prawa szyna za iglicą
|
||||
SwitchExtension->Segments[ 0 ]->RenderLoft( immediate, origin, rpts2, nnumPts, fTexLength ); // lewa szyna normalnie cała
|
||||
}
|
||||
if( TextureID2 ) {
|
||||
GfxRenderer.Bind( TextureID2 );
|
||||
SwitchExtension->Segments[ 1 ]->RenderLoft( immediate, origin, rpts1, nnumPts, fTexLength ); // prawa szyna normalna cała
|
||||
SwitchExtension->Segments[ 1 ]->RenderLoft( immediate, origin, rpts4, -nnumPts, fTexLength, 1.0, 0, 2, -fMaxOffset + SwitchExtension->fOffset1 ); // lewa iglica
|
||||
SwitchExtension->Segments[ 1 ]->RenderLoft( immediate, origin, rpts2, nnumPts, fTexLength, 1.0, 2 ); // lewa szyna za iglicą
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // lewa kiedyś działała lepiej niż prawa
|
||||
if( TextureID1 ) {
|
||||
GfxRenderer.Bind( TextureID1 );
|
||||
SwitchExtension->Segments[ 0 ]->RenderLoft( immediate, origin, rpts1, nnumPts, fTexLength ); // prawa szyna normalna cała
|
||||
SwitchExtension->Segments[ 0 ]->RenderLoft( immediate, origin, rpts4, -nnumPts, fTexLength, 1.0, 0, 2, -SwitchExtension->fOffset2 ); // lewa iglica
|
||||
SwitchExtension->Segments[ 0 ]->RenderLoft( immediate, origin, rpts2, nnumPts, fTexLength, 1.0, 2 ); // lewa szyna za iglicą
|
||||
}
|
||||
if( TextureID2 ) {
|
||||
// nie wiadomo, czy OpenGL to optymalizuje
|
||||
GfxRenderer.Bind( TextureID2 );
|
||||
SwitchExtension->Segments[ 1 ]->RenderLoft( immediate, origin, rpts3, -nnumPts, fTexLength, 1.0, 0, 2, fMaxOffset - SwitchExtension->fOffset1 ); // prawa iglica
|
||||
SwitchExtension->Segments[ 1 ]->RenderLoft( immediate, origin, rpts1, nnumPts, fTexLength, 1.0, 2 ); // prawa szyna za iglicą
|
||||
SwitchExtension->Segments[ 1 ]->RenderLoft( immediate, origin, rpts2, nnumPts, fTexLength ); // lewa szyna normalnie cała
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
} // koniec obsługi torów
|
||||
break;
|
||||
case 2: // McZapkie-260302 - droga - rendering
|
||||
// McZapkie:240702-zmieniony zakres widzialnosci
|
||||
switch (eType) // dalej zależnie od typu
|
||||
{
|
||||
case tt_Normal: // drogi proste, bo skrzyżowania osobno
|
||||
{
|
||||
vector6 bpts1[4]; // punkty głównej płaszczyzny przydają się do robienia boków
|
||||
if (TextureID1 || TextureID2) // punkty się przydadzą, nawet jeśli nawierzchni nie ma
|
||||
{ // double max=2.0*(fHTW>fHTW2?fHTW:fHTW2); //z szerszej strony jest 100%
|
||||
double max = fTexRatio1 * fTexLength; // test: szerokość proporcjonalna do długości
|
||||
double map1 = max > 0.0 ? fHTW / max : 0.5; // obcięcie tekstury od strony 1
|
||||
double map2 = max > 0.0 ? fHTW2 / max : 0.5; // obcięcie tekstury od strony 2
|
||||
if (iTrapezoid) // trapez albo przechyłki
|
||||
{ // nawierzchnia trapezowata
|
||||
Segment->GetRolls(roll1, roll2);
|
||||
bpts1[0] = vector6(fHTW * cos(roll1), -fHTW * sin(roll1), 0.5 - map1, sin(roll1), cos(roll1), 0.0); // lewy brzeg początku
|
||||
bpts1[1] = vector6(-bpts1[0].x, -bpts1[0].y, 0.5 + map1, -sin(roll1), cos(roll1), 0.0); // prawy brzeg początku symetrycznie
|
||||
bpts1[2] = vector6(fHTW2 * cos(roll2), -fHTW2 * sin(roll2), 0.5 - map2, sin(roll2), cos(roll2), 0.0); // lewy brzeg końca
|
||||
bpts1[3] = vector6(-bpts1[2].x, -bpts1[2].y, 0.5 + map2, -sin(roll2), cos(roll2), 0.0); // prawy brzeg początku symetrycznie
|
||||
}
|
||||
else
|
||||
{
|
||||
bpts1[0] = vector6(fHTW, 0.0, 0.5 - map1, 0.0, 1.0, 0.0);
|
||||
bpts1[1] = vector6(-fHTW, 0.0, 0.5 + map1, 0.0, 1.0, 0.0);
|
||||
}
|
||||
}
|
||||
if (TextureID1) // jeśli podana była tekstura, generujemy trójkąty
|
||||
if (tex ? TextureID1 == tex : true) // jeśli pasuje do grupy (tex)
|
||||
{ // tworzenie trójkątów nawierzchni szosy
|
||||
if (!tex)
|
||||
GfxRenderer.Bind( TextureID1 );
|
||||
Segment->RenderLoft( immediate, origin, bpts1, iTrapezoid ? -2 : 2, fTexLength);
|
||||
}
|
||||
if (TextureID2)
|
||||
if (tex ? TextureID2 == tex : true) // jeśli pasuje do grupy (tex)
|
||||
{ // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w Midtown Madness 2?)
|
||||
if (!tex)
|
||||
GfxRenderer.Bind( TextureID2 );
|
||||
vector6
|
||||
rpts1[6],
|
||||
rpts2[6]; // współrzędne przekroju i mapowania dla prawej i lewej strony
|
||||
if (fTexHeight1 >= 0.0)
|
||||
{ // standardowo: od zewnątrz pochylenie, a od wewnątrz poziomo
|
||||
rpts1[0] = vector6(rozp, -fTexHeight1, 0.0); // lewy brzeg podstawy
|
||||
rpts1[1] = vector6(bpts1[0].x + side, bpts1[0].y, 0.5); // lewa krawędź załamania
|
||||
rpts1[2] = vector6(bpts1[0].x, bpts1[0].y, 1.0); // lewy brzeg pobocza (mapowanie może być inne
|
||||
rpts2[0] = vector6(bpts1[1].x, bpts1[1].y, 1.0); // prawy brzeg pobocza
|
||||
rpts2[1] = vector6(bpts1[1].x - side, bpts1[1].y, 0.5); // prawa krawędź załamania
|
||||
rpts2[2] = vector6(-rozp, -fTexHeight1, 0.0); // prawy brzeg podstawy
|
||||
if (iTrapezoid) // trapez albo przechyłki
|
||||
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony odcinka
|
||||
rpts1[3] = vector6(rozp2, -fTexHeight2, 0.0); // lewy brzeg lewego pobocza
|
||||
rpts1[4] = vector6(bpts1[2].x + side2, bpts1[2].y, 0.5); // krawędź załamania
|
||||
rpts1[5] = vector6(bpts1[2].x, bpts1[2].y, 1.0); // brzeg pobocza
|
||||
rpts2[3] = vector6(bpts1[3].x, bpts1[3].y, 1.0);
|
||||
rpts2[4] = vector6(bpts1[3].x - side2, bpts1[3].y, 0.5);
|
||||
rpts2[5] = vector6(-rozp2, -fTexHeight2, 0.0); // prawy brzeg prawego pobocza
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // wersja dla chodnika: skos 1:3.75, każdy chodnik innej szerokości
|
||||
// mapowanie propocjonalne do szerokości chodnika
|
||||
// krawężnik jest mapowany od 31/64 do 32/64 lewy i od 32/64 do 33/64 prawy
|
||||
double d = -fTexHeight1 / 3.75; // krawężnik o wysokości 150mm jest pochylony 40mm
|
||||
double max = fTexRatio2 * fTexLength; // test: szerokość proporcjonalna do długości
|
||||
double map1l = (
|
||||
max > 0.0 ?
|
||||
side / max :
|
||||
0.484375 ); // obcięcie tekstury od lewej strony punktu 1
|
||||
double map1r = (
|
||||
max > 0.0 ?
|
||||
slop / max :
|
||||
0.484375 ); // obcięcie tekstury od prawej strony punktu 1
|
||||
double h1r = (
|
||||
slop > d ?
|
||||
-fTexHeight1 :
|
||||
0 );
|
||||
double h1l = (
|
||||
side > d ?
|
||||
-fTexHeight1 :
|
||||
0 );
|
||||
rpts1[ 0 ] = vector6( bpts1[ 0 ].x + slop, bpts1[ 0 ].y + h1r, 0.515625 + map1r ); // prawy brzeg prawego chodnika
|
||||
rpts1[ 1 ] = vector6( bpts1[ 0 ].x + d, bpts1[ 0 ].y + h1r, 0.515625 ); // prawy krawężnik u góry
|
||||
rpts1[ 2 ] = vector6( bpts1[ 0 ].x, bpts1[ 0 ].y, 0.515625 - d / 2.56 ); // prawy krawężnik u dołu
|
||||
rpts2[ 0 ] = vector6( bpts1[ 1 ].x, bpts1[ 1 ].y, 0.484375 + d / 2.56 ); // lewy krawężnik u dołu
|
||||
rpts2[ 1 ] = vector6( bpts1[ 1 ].x - d, bpts1[ 1 ].y + h1l, 0.484375 ); // lewy krawężnik u góry
|
||||
rpts2[ 2 ] = vector6( bpts1[ 1 ].x - side, bpts1[ 1 ].y + h1l, 0.484375 - map1l ); // lewy brzeg lewego chodnika
|
||||
if (iTrapezoid) // trapez albo przechyłki
|
||||
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony odcinka
|
||||
slop2 = (
|
||||
fabs( ( iTrapezoid & 2 ) ?
|
||||
slop2 :
|
||||
slop ) ); // szerokość chodnika po prawej
|
||||
double map2l = (
|
||||
max > 0.0 ?
|
||||
side2 / max :
|
||||
0.484375 ); // obcięcie tekstury od lewej strony punktu 2
|
||||
double map2r = (
|
||||
max > 0.0 ?
|
||||
slop2 / max :
|
||||
0.484375 ); // obcięcie tekstury od prawej strony punktu 2
|
||||
double h2r = ( slop2 > d ) ? -fTexHeight2 : 0;
|
||||
double h2l = ( side2 > d ) ? -fTexHeight2 : 0;
|
||||
rpts1[ 3 ] = vector6( bpts1[ 2 ].x + slop2, bpts1[ 2 ].y + h2r, 0.515625 + map2r ); // prawy brzeg prawego chodnika
|
||||
rpts1[ 4 ] = vector6( bpts1[ 2 ].x + d, bpts1[ 2 ].y + h2r, 0.515625 ); // prawy krawężnik u góry
|
||||
rpts1[ 5 ] = vector6( bpts1[ 2 ].x, bpts1[ 2 ].y, 0.515625 - d / 2.56 ); // prawy krawężnik u dołu
|
||||
rpts2[ 3 ] = vector6( bpts1[ 3 ].x, bpts1[ 3 ].y, 0.484375 + d / 2.56 ); // lewy krawężnik u dołu
|
||||
rpts2[ 4 ] = vector6( bpts1[ 3 ].x - d, bpts1[ 3 ].y + h2l, 0.484375 ); // lewy krawężnik u góry
|
||||
rpts2[ 5 ] = vector6( bpts1[ 3 ].x - side2, bpts1[ 3 ].y + h2l, 0.484375 - map2l ); // lewy brzeg lewego chodnika
|
||||
}
|
||||
}
|
||||
if (iTrapezoid) // trapez albo przechyłki
|
||||
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony
|
||||
// odcinka
|
||||
if ((fTexHeight1 >= 0.0) ? true : (slop != 0.0))
|
||||
Segment->RenderLoft( immediate, origin, rpts1, -3, fTexLength); // tylko jeśli jest z prawej
|
||||
if ((fTexHeight1 >= 0.0) ? true : (side != 0.0))
|
||||
Segment->RenderLoft( immediate, origin, rpts2, -3, fTexLength); // tylko jeśli jest z lewej
|
||||
}
|
||||
else
|
||||
{ // pobocza zwykłe, brak przechyłki
|
||||
if ((fTexHeight1 >= 0.0) ? true : (slop != 0.0))
|
||||
Segment->RenderLoft( immediate, origin, rpts1, 3, fTexLength);
|
||||
if ((fTexHeight1 >= 0.0) ? true : (side != 0.0))
|
||||
Segment->RenderLoft( immediate, origin, rpts2, 3, fTexLength);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case tt_Cross: // skrzyżowanie dróg rysujemy inaczej
|
||||
{ // ustalenie współrzędnych środka - przecięcie Point1-Point2 z CV4-Point4
|
||||
double a[4]; // kąty osi ulic wchodzących
|
||||
vector3 p[4]; // punkty się przydadzą do obliczeń
|
||||
// na razie połowa odległości pomiędzy Point1 i Point2, potem się dopracuje
|
||||
a[0] = a[1] = 0.5; // parametr do poszukiwania przecięcia łuków
|
||||
// modyfikować a[0] i a[1] tak, aby trafić na przecięcie odcinka 34
|
||||
p[0] = SwitchExtension->Segments[0]->FastGetPoint(a[0]); // współrzędne środka pierwszego odcinka
|
||||
p[1] = SwitchExtension->Segments[1]->FastGetPoint(a[1]); //-//- drugiego
|
||||
// p[2]=p[1]-p[0]; //jeśli różne od zera, przeliczyć a[0] i a[1] i wyznaczyć nowe punkty
|
||||
vector3 oxz = p[0]; // punkt mapowania środka tekstury skrzyżowania
|
||||
p[0] = SwitchExtension->Segments[0]->GetDirection1(); // Point1 - pobranie wektorów kontrolnych
|
||||
p[1] = SwitchExtension->Segments[1]->GetDirection2(); // Point3 (bo zamienione)
|
||||
p[2] = SwitchExtension->Segments[0]->GetDirection2(); // Point2
|
||||
p[3] = SwitchExtension->Segments[1]->GetDirection1(); // Point4 (bo zamienione)
|
||||
a[0] = atan2(-p[0].x, p[0].z); // kąty stycznych osi dróg
|
||||
a[1] = atan2(-p[1].x, p[1].z);
|
||||
a[2] = atan2(-p[2].x, p[2].z);
|
||||
a[3] = atan2(-p[3].x, p[3].z);
|
||||
p[0] = SwitchExtension->Segments[0]->FastGetPoint_0(); // Point1 - pobranie współrzędnych końców
|
||||
p[1] = SwitchExtension->Segments[1]->FastGetPoint_1(); // Point3
|
||||
p[2] = SwitchExtension->Segments[0]->FastGetPoint_1(); // Point2
|
||||
p[3] = SwitchExtension->Segments[1]->FastGetPoint_0(); // Point4 - przy trzech drogach pokrywa się z Point1
|
||||
// 2014-07: na początek rysować brzegi jak dla łuków
|
||||
// punkty brzegu nawierzchni uzyskujemy podczas renderowania boków (bez sensu, ale najszybciej było zrobić)
|
||||
int i; // ile punktów (może byc różna ilość punktów między drogami)
|
||||
if (!SwitchExtension->vPoints)
|
||||
{ // jeśli tablica punktów nie jest jeszcze utworzona, zliczamy punkty i tworzymy ją
|
||||
if( SwitchExtension->iRoads == 3 ) {
|
||||
// mogą być tylko 3 drogi zamiast 4
|
||||
SwitchExtension->iPoints =
|
||||
SwitchExtension->Segments[ 0 ]->RaSegCount()
|
||||
+ SwitchExtension->Segments[ 1 ]->RaSegCount()
|
||||
+ SwitchExtension->Segments[ 2 ]->RaSegCount();
|
||||
}
|
||||
else {
|
||||
SwitchExtension->iPoints =
|
||||
SwitchExtension->Segments[ 2 ]->RaSegCount()
|
||||
+ SwitchExtension->Segments[ 3 ]->RaSegCount()
|
||||
+ SwitchExtension->Segments[ 4 ]->RaSegCount()
|
||||
+ SwitchExtension->Segments[ 5 ]->RaSegCount();
|
||||
}
|
||||
// tablica utworzona z zapasem, ale nie wypełniona współrzędnymi
|
||||
SwitchExtension->vPoints = new vector3[ SwitchExtension->iPoints + SwitchExtension->iRoads ];
|
||||
}
|
||||
vector3 *b =
|
||||
SwitchExtension->bPoints ?
|
||||
nullptr :
|
||||
SwitchExtension->vPoints; // zmienna robocza, NULL gdy tablica punktów już jest wypełniona
|
||||
vector6 bpts1[4]; // punkty głównej płaszczyzny przydają się do robienia boków
|
||||
if (TextureID1 || TextureID2) // punkty się przydadzą, nawet jeśli nawierzchni nie ma
|
||||
{ // double max=2.0*(fHTW>fHTW2?fHTW:fHTW2); //z szerszej strony jest 100%
|
||||
double max = fTexRatio1 * fTexLength; // test: szerokość proporcjonalna do długości
|
||||
double map1 = max > 0.0 ? fHTW / max : 0.5; // obcięcie tekstury od strony 1
|
||||
double map2 = max > 0.0 ? fHTW2 / max : 0.5; // obcięcie tekstury od strony 2
|
||||
// if (iTrapezoid) //trapez albo przechyłki
|
||||
{ // nawierzchnia trapezowata
|
||||
Segment->GetRolls(roll1, roll2);
|
||||
bpts1[0] = vector6(fHTW * cos(roll1), -fHTW * sin(roll1), 0.5 - map1, sin(roll1), cos(roll1), 0.0); // lewy brzeg początku
|
||||
bpts1[1] = vector6(-bpts1[0].x, -bpts1[0].y, 0.5 + map1, -sin(roll1), cos(roll1), 0.0); // prawy brzeg początku symetrycznie
|
||||
bpts1[2] = vector6(fHTW2 * cos(roll2), -fHTW2 * sin(roll2), 0.5 - map2, sin(roll2), cos(roll2), 0.0); // lewy brzeg końca
|
||||
bpts1[3] = vector6(-bpts1[2].x, -bpts1[2].y, 0.5 + map2, -sin(roll2), cos(roll2), 0.0); // prawy brzeg początku symetrycznie
|
||||
}
|
||||
}
|
||||
// najpierw renderowanie poboczy i zapamiętywanie punktów
|
||||
// problem ze skrzyżowaniami jest taki, że teren chce się pogrupować wg tekstur, ale zaczyna od nawierzchni
|
||||
// sama nawierzchnia nie wypełni tablicy punktów, bo potrzebne są pobocza
|
||||
// ale pobocza renderują się później, więc nawierzchnia nie załapuje się na renderowanie w swoim czasie
|
||||
{ // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w Midtown Madness 2?)
|
||||
if (TextureID2)
|
||||
if (!tex)
|
||||
GfxRenderer.Bind( TextureID2 );
|
||||
vector6 rpts1[6],
|
||||
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 sąsiednich dróg
|
||||
if (fTexHeight1 >= 0.0)
|
||||
{ // standardowo: od zewnątrz pochylenie, a od wewnątrz poziomo
|
||||
rpts1[0] = vector6(rozp, -fTexHeight1, 0.0); // lewy brzeg podstawy
|
||||
rpts1[1] = vector6(bpts1[0].x + side, bpts1[0].y, 0.5); // lewa krawędź załamania
|
||||
rpts1[2] = vector6(bpts1[0].x, bpts1[0].y, 1.0); // lewy brzeg pobocza (mapowanie może być inne
|
||||
rpts2[0] = vector6(bpts1[1].x, bpts1[1].y, 1.0); // prawy brzeg pobocza
|
||||
rpts2[1] = vector6(bpts1[1].x - side, bpts1[1].y, 0.5); // prawa krawędź załamania
|
||||
rpts2[2] = vector6(-rozp, -fTexHeight1, 0.0); // prawy brzeg podstawy
|
||||
// if (iTrapezoid) //trapez albo przechyłki
|
||||
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony odcinka
|
||||
rpts1[3] = vector6(rozp2, -fTexHeight2, 0.0); // lewy brzeg lewego pobocza
|
||||
rpts1[4] = vector6(bpts1[2].x + side2, bpts1[2].y, 0.5); // krawędź załamania
|
||||
rpts1[5] = vector6(bpts1[2].x, bpts1[2].y, 1.0); // brzeg pobocza
|
||||
rpts2[3] = vector6(bpts1[3].x, bpts1[3].y, 1.0);
|
||||
rpts2[4] = vector6(bpts1[3].x - side2, bpts1[3].y, 0.5);
|
||||
rpts2[5] = vector6(-rozp2, -fTexHeight2, 0.0); // prawy brzeg prawego pobocza
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // wersja dla chodnika: skos 1:3.75, każdy chodnik innej szerokości
|
||||
// mapowanie propocjonalne do szerokości chodnika
|
||||
// krawężnik jest mapowany od 31/64 do 32/64 lewy i od 32/64 do 33/64 prawy
|
||||
double d = -fTexHeight1 / 3.75; // krawężnik o wysokości 150mm jest pochylony 40mm
|
||||
double max = fTexRatio2 * fTexLength; // test: szerokość proporcjonalna do długości
|
||||
double map1l = max > 0.0 ?
|
||||
side / max :
|
||||
0.484375; // obcięcie tekstury od lewej strony punktu 1
|
||||
double map1r = max > 0.0 ?
|
||||
slop / max :
|
||||
0.484375; // obcięcie tekstury od prawej strony punktu 1
|
||||
rpts1[0] = vector6(bpts1[0].x + slop, bpts1[0].y - fTexHeight1, 0.515625 + map1r); // prawy brzeg prawego chodnika
|
||||
rpts1[1] = vector6(bpts1[0].x + d, bpts1[0].y - fTexHeight1, 0.515625); // prawy krawężnik u góry
|
||||
rpts1[2] = vector6(bpts1[0].x, bpts1[0].y, 0.515625 - d / 2.56); // prawy krawężnik u dołu
|
||||
rpts2[0] = vector6(bpts1[1].x, bpts1[1].y, 0.484375 + d / 2.56); // lewy krawężnik u dołu
|
||||
rpts2[1] = vector6(bpts1[1].x - d, bpts1[1].y - fTexHeight1, 0.484375); // lewy krawężnik u góry
|
||||
rpts2[2] = vector6(bpts1[1].x - side, bpts1[1].y - fTexHeight1, 0.484375 - map1l); // lewy brzeg lewego chodnika
|
||||
// if (iTrapezoid) //trapez albo przechyłki
|
||||
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony odcinka
|
||||
slop2 = fabs((iTrapezoid & 2) ? slop2 : slop); // szerokość chodnika po prawej
|
||||
double map2l = max > 0.0 ?
|
||||
side2 / max :
|
||||
0.484375; // obcięcie tekstury od lewej strony punktu 2
|
||||
double map2r = max > 0.0 ?
|
||||
slop2 / max :
|
||||
0.484375; // obcięcie tekstury od prawej strony punktu 2
|
||||
rpts1[3] = vector6(bpts1[2].x + slop2, bpts1[2].y - fTexHeight2, 0.515625 + map2r); // prawy brzeg prawego chodnika
|
||||
rpts1[4] = vector6(bpts1[2].x + d, bpts1[2].y - fTexHeight2, 0.515625); // prawy krawężnik u góry
|
||||
rpts1[5] = vector6(bpts1[2].x, bpts1[2].y, 0.515625 - d / 2.56); // prawy krawężnik u dołu
|
||||
rpts2[3] = vector6(bpts1[3].x, bpts1[3].y, 0.484375 + d / 2.56); // lewy krawężnik u dołu
|
||||
rpts2[4] = vector6(bpts1[3].x - d, bpts1[3].y - fTexHeight2, 0.484375); // lewy krawężnik u góry
|
||||
rpts2[5] = vector6(bpts1[3].x - side2, bpts1[3].y - fTexHeight2, 0.484375 - map2l); // lewy brzeg lewego chodnika
|
||||
}
|
||||
}
|
||||
bool render = (
|
||||
TextureID2 ? (
|
||||
tex ?
|
||||
TextureID2 == tex :
|
||||
true ) :
|
||||
false ); // renderować nie trzeba, ale trzeba wyznaczyć punkty brzegowe nawierzchni
|
||||
// if (iTrapezoid) //trapez albo przechyłki
|
||||
if (SwitchExtension->iRoads == 4)
|
||||
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony odcinka
|
||||
if( ( fTexHeight1 >= 0.0 ) || ( side != 0.0 ) ) {
|
||||
SwitchExtension->Segments[ 2 ]->RenderLoft( immediate, origin, rpts2, -3, fTexLength, 1.0, 0, 0, 0.0, &b, render );
|
||||
SwitchExtension->Segments[ 3 ]->RenderLoft( immediate, origin, rpts2, -3, fTexLength, 1.0, 0, 0, 0.0, &b, render );
|
||||
SwitchExtension->Segments[ 4 ]->RenderLoft( immediate, origin, rpts2, -3, fTexLength, 1.0, 0, 0, 0.0, &b, render );
|
||||
SwitchExtension->Segments[ 5 ]->RenderLoft( immediate, origin, rpts2, -3, fTexLength, 1.0, 0, 0, 0.0, &b, render );
|
||||
}
|
||||
}
|
||||
else
|
||||
// to będzie ewentualnie dla prostego na skrzyżowaniu trzech dróg
|
||||
{ // punkt 3 pokrywa się z punktem 1, jak w zwrotnicy; połączenie 1->2 nie musi być prostoliniowe
|
||||
if( ( fTexHeight1 >= 0.0 ) || ( side != 0.0 ) ) {
|
||||
SwitchExtension->Segments[ 2 ]->RenderLoft( immediate, origin, rpts2, -3, fTexLength, 1.0, 0, 0, 0.0, &b, render ); // z P2 do P4
|
||||
SwitchExtension->Segments[ 1 ]->RenderLoft( immediate, origin, rpts2, -3, fTexLength, 1.0, 0, 0, 0.0, &b, render ); // z P4 do P3=P1 (odwrócony)
|
||||
SwitchExtension->Segments[ 0 ]->RenderLoft( immediate, origin, rpts2, -3, fTexLength, 1.0, 0, 0, 0.0, &b, render ); // z P1 do P2
|
||||
}
|
||||
}
|
||||
}
|
||||
// renderowanie nawierzchni na końcu
|
||||
double sina0 = sin(a[0]), cosa0 = cos(a[0]);
|
||||
double u, v;
|
||||
if( ( false == SwitchExtension->bPoints ) // jeśli tablica nie wypełniona
|
||||
&& ( b != nullptr ) ) {
|
||||
SwitchExtension->bPoints = true; // tablica punktów została wypełniona
|
||||
}
|
||||
|
||||
if (TextureID1) // jeśli podana tekstura nawierzchni
|
||||
if ( (tex == TextureID1) || (tex == 0) ) // jeśli pasuje do grupy (tex)
|
||||
{
|
||||
if (!tex)
|
||||
GfxRenderer.Bind( TextureID1 );
|
||||
glBegin(GL_TRIANGLE_FAN); // takie kółeczko będzie
|
||||
// we start with a vertex in the middle...
|
||||
glNormal3f(0, 1, 0);
|
||||
glTexCoord2f(0.5, 0.5); //środek tekstury na środku skrzyżowania
|
||||
glVertex3f(
|
||||
oxz.x - origin.x,
|
||||
oxz.y - origin.y,
|
||||
oxz.z - origin.z );
|
||||
// ...and add one extra vertex to close the fan...
|
||||
glNormal3f( 0, 1, 0 );
|
||||
// mapowanie we współrzędnych scenerii
|
||||
u = ( SwitchExtension->vPoints[ 0 ].x - oxz.x + origin.x ) / fTexLength;
|
||||
v = ( SwitchExtension->vPoints[ 0 ].z - oxz.z + origin.z ) / ( fTexRatio1 * fTexLength );
|
||||
glTexCoord2f(
|
||||
cosa0 * u + sina0 * v + 0.5,
|
||||
-sina0 * u + cosa0 * v + 0.5 );
|
||||
glVertex3f(
|
||||
SwitchExtension->vPoints[ 0 ].x,
|
||||
SwitchExtension->vPoints[ 0 ].y,
|
||||
SwitchExtension->vPoints[ 0 ].z );
|
||||
|
||||
for ( i = SwitchExtension->iPoints + SwitchExtension->iRoads - 1; i >= 0; --i )
|
||||
{
|
||||
glNormal3f(0, 1, 0);
|
||||
// mapowanie we współrzędnych scenerii
|
||||
u = (SwitchExtension->vPoints[i].x - oxz.x + origin.x) / fTexLength;
|
||||
v = (SwitchExtension->vPoints[i].z - oxz.z + origin.z) / (fTexRatio1 * fTexLength);
|
||||
glTexCoord2f(
|
||||
cosa0 * u + sina0 * v + 0.5,
|
||||
-sina0 * u + cosa0 * v + 0.5);
|
||||
glVertex3f(
|
||||
SwitchExtension->vPoints[i].x,
|
||||
SwitchExtension->vPoints[i].y,
|
||||
SwitchExtension->vPoints[i].z);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 4: // McZapkie-260302 - rzeka- rendering
|
||||
// Ra: rzeki na razie bez zmian, przechyłki na pewno nie mają
|
||||
// Ra: przemyśleć wyrównanie u góry trawą do czworoboku
|
||||
vector6 bpts1[numPts] = {vector6(fHTW, 0.0, 0.0), vector6(fHTW, 0.2, 0.33),
|
||||
vector6(-fHTW, 0.0, 0.67), vector6(-fHTW, 0.0, 1.0)};
|
||||
// Ra: dziwnie ten kształt wygląda
|
||||
if (TextureID1)
|
||||
if (tex ? TextureID1 == tex : true) // jeśli pasuje do grupy (tex)
|
||||
{
|
||||
if (!tex)
|
||||
GfxRenderer.Bind( TextureID1 );
|
||||
Segment->RenderLoft( immediate, origin, bpts1, numPts, fTexLength);
|
||||
}
|
||||
if (TextureID2)
|
||||
if (tex ? TextureID2 == tex : true) // jeśli pasuje do grupy (tex)
|
||||
{ // brzegi rzeki prawie jak pobocze derogi, tylko inny znak ma wysokość
|
||||
// znak jest zmieniany przy wczytywaniu, więc tu musi byc minus fTexHeight
|
||||
vector6 rpts1[3] = {vector6(rozp, -fTexHeight1, 0.0),
|
||||
vector6(fHTW + side, 0.0, 0.5), vector6(fHTW, 0.0, 1.0)};
|
||||
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?
|
||||
if (!tex)
|
||||
GfxRenderer.Bind( TextureID2 ); // brzeg rzeki
|
||||
Segment->RenderLoft( immediate, origin, rpts1, 3, fTexLength );
|
||||
Segment->RenderLoft( immediate, origin, rpts2, 3, fTexLength );
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (!tex)
|
||||
if (Global::bManageNodes)
|
||||
glEndList();
|
||||
};
|
||||
*/
|
||||
void TTrack::Release()
|
||||
{
|
||||
/*
|
||||
if (DisplayListID)
|
||||
glDeleteLists(DisplayListID, 1);
|
||||
DisplayListID = 0;
|
||||
*/
|
||||
};
|
||||
/*
|
||||
void TTrack::Render()
|
||||
{
|
||||
if (bVisible) // Ra: tory są renderowane sektorami i nie ma sensu każdorazowo liczyć odległości
|
||||
{
|
||||
if (!DisplayListID)
|
||||
{
|
||||
Compile();
|
||||
if (Global::bManageNodes)
|
||||
ResourceManager::Register(this);
|
||||
};
|
||||
SetLastUsage(Timer::GetSimulationTime());
|
||||
EnvironmentSet(); // oświetlenie nie może być skompilowane, bo może się zmieniać z czasem
|
||||
glCallList(DisplayListID);
|
||||
EnvironmentReset(); // ustawienie oświetlenia na zwykłe
|
||||
if (InMovement())
|
||||
Release(); // zwrotnica w trakcie animacji do odrysowania
|
||||
}
|
||||
};
|
||||
*/
|
||||
bool TTrack::CheckDynamicObject(TDynamicObject *Dynamic)
|
||||
{ // sprawdzenie, czy pojazd jest przypisany do toru
|
||||
for( auto dynamic : Dynamics ) {
|
||||
@@ -3064,25 +2413,6 @@ TTrack * TTrack::RaAnimate()
|
||||
// minimalny ruch, aby przeliczyć pozycję
|
||||
dynamic->Move( 0.000001 );
|
||||
}
|
||||
// kąty
|
||||
/*
|
||||
if (Global::bUseVBO)
|
||||
{ // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment
|
||||
// aktualizacja pojazdów na torze
|
||||
if (GLEW_VERSION_1_5) // dla OpenGL 1.4 to się nie wykona poprawnie
|
||||
{
|
||||
int size = RaArrayPrepare(); // wielkość tabeli potrzebna dla tej obrotnicy
|
||||
basic_vertex *Vert = new basic_vertex[size]; // bufor roboczy
|
||||
// basic_vertex *v=Vert; //zmieniane przez
|
||||
RaArrayFill(Vert, Vert - SwitchExtension->iLeftVBO, size); // iLeftVBO powinno zostać niezmienione
|
||||
::glBufferSubData(
|
||||
GL_ARRAY_BUFFER, SwitchExtension->iLeftVBO * sizeof(basic_vertex),
|
||||
size * sizeof(basic_vertex), Vert); // wysłanie fragmentu bufora VBO
|
||||
}
|
||||
}
|
||||
else // gdy Display List
|
||||
Release(); // niszczenie skompilowanej listy, aby się wygenerowała nowa
|
||||
*/
|
||||
// NOTE: passing empty handle is a bit of a hack here. could be refactored into something more elegant
|
||||
create_geometry( geometrybank_handle() );
|
||||
} // animacja trwa nadal
|
||||
|
||||
6
Track.h
6
Track.h
@@ -118,7 +118,7 @@ class TIsolated
|
||||
};
|
||||
|
||||
// trajektoria ruchu - opakowanie
|
||||
class TTrack : public Resource {
|
||||
class TTrack /*: public Resource*/ {
|
||||
|
||||
friend class opengl_renderer;
|
||||
|
||||
@@ -225,9 +225,9 @@ public:
|
||||
bool CheckDynamicObject(TDynamicObject *Dynamic);
|
||||
bool AddDynamicObject(TDynamicObject *Dynamic);
|
||||
bool RemoveDynamicObject(TDynamicObject *Dynamic);
|
||||
|
||||
void Release();
|
||||
/*
|
||||
void Release();
|
||||
|
||||
void Compile(GLuint tex = 0);
|
||||
void Render(); // renderowanie z Display Lists
|
||||
int RaArrayPrepare(); // zliczanie rozmiaru dla VBO sektroa
|
||||
|
||||
@@ -60,7 +60,8 @@ struct geometry_handle {
|
||||
/*
|
||||
return bank << 14 | chunk; }
|
||||
*/
|
||||
return bank << 32 | chunk; }
|
||||
return ( std::uint64_t { bank } << 32 | chunk );
|
||||
}
|
||||
|
||||
// members
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user