mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-18 03:09:18 +02:00
build 170810. multi-texture materials, reflection map support
This commit is contained in:
60
Track.cpp
60
Track.cpp
@@ -483,20 +483,20 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name)
|
||||
{
|
||||
parser->getTokens();
|
||||
*parser >> str; // railtex
|
||||
TextureID1 = (
|
||||
m_material1 = (
|
||||
str == "none" ?
|
||||
NULL :
|
||||
GfxRenderer.Fetch_Texture( str ) );
|
||||
GfxRenderer.Fetch_Material( str ) );
|
||||
parser->getTokens();
|
||||
*parser >> fTexLength; // tex tile length
|
||||
if (fTexLength < 0.01)
|
||||
fTexLength = 4; // Ra: zabezpiecznie przed zawieszeniem
|
||||
parser->getTokens();
|
||||
*parser >> str; // sub || railtex
|
||||
TextureID2 = (
|
||||
m_material2 = (
|
||||
str == "none" ?
|
||||
NULL :
|
||||
GfxRenderer.Fetch_Texture( str ) );
|
||||
GfxRenderer.Fetch_Material( str ) );
|
||||
parser->getTokens(3);
|
||||
*parser >> fTexHeight1 >> fTexWidth >> fTexSlope;
|
||||
if (iCategoryFlag & 4)
|
||||
@@ -547,15 +547,15 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name)
|
||||
SwitchExtension->Segments[0]->Init(p1, p2, segsize); // kopia oryginalnego toru
|
||||
}
|
||||
else if (iCategoryFlag & 2)
|
||||
if (TextureID1 && fTexLength)
|
||||
if (m_material1 && fTexLength)
|
||||
{ // dla drogi trzeba ustalić proporcje boków nawierzchni
|
||||
float w, h;
|
||||
GfxRenderer.Bind(TextureID1);
|
||||
GfxRenderer.Bind_Material(m_material1);
|
||||
glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
|
||||
glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
|
||||
if (h != 0.0)
|
||||
fTexRatio1 = w / h; // proporcja boków
|
||||
GfxRenderer.Bind(TextureID2);
|
||||
GfxRenderer.Bind_Material(m_material2);
|
||||
glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
|
||||
glGetTexLevelParameterfv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h);
|
||||
if (h != 0.0)
|
||||
@@ -1205,7 +1205,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
{
|
||||
case tt_Table: // obrotnica jak zwykły tor, tylko animacja dochodzi
|
||||
case tt_Normal:
|
||||
if (TextureID2)
|
||||
if (m_material2)
|
||||
{ // 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
|
||||
@@ -1275,7 +1275,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
GfxRenderer.Replace( vertices, Geometry2[ 0 ] );
|
||||
}
|
||||
}
|
||||
if (TextureID1)
|
||||
if (m_material1)
|
||||
{ // szyny - generujemy dwie, najwyżej rysować się będzie jedną
|
||||
vertex_array vertices;
|
||||
if( ( Bank != 0 ) && ( true == Geometry1.empty() ) ) {
|
||||
@@ -1296,7 +1296,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
}
|
||||
break;
|
||||
case tt_Switch: // dla zwrotnicy dwa razy szyny
|
||||
if( TextureID1 || TextureID2 )
|
||||
if( m_material1 || m_material2 )
|
||||
{ // iglice liczone tylko dla zwrotnic
|
||||
vector6 rpts3[24], rpts4[24];
|
||||
for (i = 0; i < 12; ++i)
|
||||
@@ -1326,7 +1326,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
if (SwitchExtension->RightSwitch)
|
||||
{ // nowa wersja z SPKS, ale odwrotnie lewa/prawa
|
||||
vertex_array vertices;
|
||||
if( TextureID1 ) {
|
||||
if( m_material1 ) {
|
||||
// fixed parts
|
||||
SwitchExtension->Segments[ 0 ]->RenderLoft( vertices, origin, rpts2, nnumPts, fTexLength );
|
||||
Geometry1.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
||||
@@ -1339,7 +1339,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
Geometry1.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
||||
vertices.clear();
|
||||
}
|
||||
if( TextureID2 ) {
|
||||
if( m_material2 ) {
|
||||
// fixed parts
|
||||
SwitchExtension->Segments[ 1 ]->RenderLoft( vertices, origin, rpts1, nnumPts, fTexLength );
|
||||
Geometry2.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
||||
@@ -1356,7 +1356,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
else
|
||||
{ // lewa działa lepiej niż prawa
|
||||
vertex_array vertices;
|
||||
if( TextureID1 ) {
|
||||
if( m_material1 ) {
|
||||
// fixed parts
|
||||
SwitchExtension->Segments[ 0 ]->RenderLoft( vertices, origin, rpts1, nnumPts, fTexLength ); // lewa szyna normalna cała
|
||||
Geometry1.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
||||
@@ -1369,7 +1369,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
Geometry1.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
||||
vertices.clear();
|
||||
}
|
||||
if( TextureID2 ) {
|
||||
if( m_material2 ) {
|
||||
// fixed parts
|
||||
SwitchExtension->Segments[ 1 ]->RenderLoft( vertices, origin, rpts2, nnumPts, fTexLength ); // prawa szyna normalnie cała
|
||||
Geometry2.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
||||
@@ -1394,7 +1394,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
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
|
||||
if (m_material1 || m_material2) // 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
|
||||
@@ -1413,13 +1413,13 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
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 (m_material1) // jeśli podana była tekstura, generujemy trójkąty
|
||||
{ // tworzenie trójkątów nawierzchni szosy
|
||||
vertex_array vertices;
|
||||
Segment->RenderLoft(vertices, origin, bpts1, iTrapezoid ? -2 : 2, fTexLength);
|
||||
Geometry1.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
||||
}
|
||||
if (TextureID2)
|
||||
if (m_material2)
|
||||
{ // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w Midtown Madness 2?)
|
||||
vector6
|
||||
rpts1[6],
|
||||
@@ -1574,7 +1574,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
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
|
||||
if (m_material1 || m_material2) // 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
|
||||
@@ -1592,7 +1592,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
// 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
|
||||
if( TextureID2 )
|
||||
if( m_material2 )
|
||||
{ // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w Midtown Madness 2?)
|
||||
vector6
|
||||
rpts1[6],
|
||||
@@ -1651,7 +1651,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
rpts2[5] = vector6(bpts1[3].x - side2, bpts1[3].y - fTexHeight2, 0.484375 - map2l); // lewy brzeg lewego chodnika
|
||||
}
|
||||
}
|
||||
bool render = ( TextureID2 != 0 ); // renderować nie trzeba, ale trzeba wyznaczyć punkty brzegowe nawierzchni
|
||||
bool render = ( m_material2 != 0 ); // renderować nie trzeba, ale trzeba wyznaczyć punkty brzegowe nawierzchni
|
||||
vertex_array vertices;
|
||||
if (SwitchExtension->iRoads == 4)
|
||||
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony odcinka
|
||||
@@ -1707,7 +1707,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
SwitchExtension->bPoints = true; // tablica punktów została wypełniona
|
||||
}
|
||||
|
||||
if( TextureID1 ) {
|
||||
if( m_material1 ) {
|
||||
vertex_array vertices;
|
||||
// jeśli podana tekstura nawierzchni
|
||||
// we start with a vertex in the middle...
|
||||
@@ -1759,7 +1759,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
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
|
||||
if (m_material1 || m_material2) // punkty się przydadzą, nawet jeśli nawierzchni nie ma
|
||||
{ // double max=2.0*(fHTW>fHTW2?fHTW:fHTW2); //z szerszej strony jest 100%
|
||||
double max = (iCategoryFlag & 4) ?
|
||||
0.0 :
|
||||
@@ -1784,13 +1784,13 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
bpts1[1] = vector6(-fHTW, 0.0, 0.5 + map1);
|
||||
}
|
||||
}
|
||||
if (TextureID1) // jeśli podana była tekstura, generujemy trójkąty
|
||||
if (m_material1) // jeśli podana była tekstura, generujemy trójkąty
|
||||
{ // tworzenie trójkątów nawierzchni szosy
|
||||
vertex_array vertices;
|
||||
Segment->RenderLoft(vertices, origin, bpts1, iTrapezoid ? -2 : 2, fTexLength);
|
||||
Geometry1.emplace_back( GfxRenderer.Insert( vertices, Bank, GL_TRIANGLE_STRIP ) );
|
||||
}
|
||||
if (TextureID2)
|
||||
if (m_material2)
|
||||
{ // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w Midtown Madness 2?)
|
||||
vertex_array vertices;
|
||||
vector6 rpts1[6],
|
||||
@@ -2105,8 +2105,8 @@ TTrack * TTrack::RaAnimate()
|
||||
}
|
||||
}
|
||||
// skip the geometry update if no geometry for this track was generated yet
|
||||
if( ( ( TextureID1 != 0 )
|
||||
|| ( TextureID2 != 0 ) )
|
||||
if( ( ( m_material1 != 0 )
|
||||
|| ( m_material2 != 0 ) )
|
||||
&& ( ( false == Geometry1.empty() )
|
||||
|| ( false == Geometry2.empty() ) ) ) {
|
||||
// iglice liczone tylko dla zwrotnic
|
||||
@@ -2143,13 +2143,13 @@ TTrack * TTrack::RaAnimate()
|
||||
|
||||
if (SwitchExtension->RightSwitch)
|
||||
{ // nowa wersja z SPKS, ale odwrotnie lewa/prawa
|
||||
if( TextureID1 ) {
|
||||
if( m_material1 ) {
|
||||
// left blade
|
||||
SwitchExtension->Segments[ 0 ]->RenderLoft( vertices, origin, rpts3, -nnumPts, fTexLength, 1.0, 0, 2, SwitchExtension->fOffset2 );
|
||||
GfxRenderer.Replace( vertices, Geometry1[ 2 ] );
|
||||
vertices.clear();
|
||||
}
|
||||
if( TextureID2 ) {
|
||||
if( m_material2 ) {
|
||||
// right blade
|
||||
SwitchExtension->Segments[ 1 ]->RenderLoft( vertices, origin, rpts4, -nnumPts, fTexLength, 1.0, 0, 2, -fMaxOffset + SwitchExtension->fOffset1 );
|
||||
GfxRenderer.Replace( vertices, Geometry2[ 2 ] );
|
||||
@@ -2157,13 +2157,13 @@ TTrack * TTrack::RaAnimate()
|
||||
}
|
||||
}
|
||||
else { // lewa działa lepiej niż prawa
|
||||
if( TextureID1 ) {
|
||||
if( m_material1 ) {
|
||||
// right blade
|
||||
SwitchExtension->Segments[ 0 ]->RenderLoft( vertices, origin, rpts4, -nnumPts, fTexLength, 1.0, 0, 2, -SwitchExtension->fOffset2 );
|
||||
GfxRenderer.Replace( vertices, Geometry1[ 2 ] );
|
||||
vertices.clear();
|
||||
}
|
||||
if( TextureID2 ) {
|
||||
if( m_material2 ) {
|
||||
// left blade
|
||||
SwitchExtension->Segments[ 1 ]->RenderLoft( vertices, origin, rpts3, -nnumPts, fTexLength, 1.0, 0, 2, fMaxOffset - SwitchExtension->fOffset1 );
|
||||
GfxRenderer.Replace( vertices, Geometry2[ 2 ] );
|
||||
|
||||
Reference in New Issue
Block a user