mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-19 06:29:18 +02:00
support for vertex data streams selection, t3d model loading fixes
This commit is contained in:
201
Track.cpp
201
Track.cpp
@@ -1112,52 +1112,7 @@ void TTrack::RaAssign(TGroundNode *gn, TAnimModel *am, TEvent *done, TEvent *joi
|
||||
am->GetContainer(NULL)->EventAssign(done); // zdarzenie zakończenia animacji
|
||||
}
|
||||
};
|
||||
/*
|
||||
int TTrack::RaArrayPrepare()
|
||||
{ // przygotowanie tablic do skopiowania do VBO (zliczanie wierzchołków)
|
||||
if (bVisible) // o ile w ogóle widać
|
||||
switch (iCategoryFlag & 15)
|
||||
{
|
||||
case 1: // tor
|
||||
if (eType == tt_Switch) // dla zwrotnicy tylko szyny
|
||||
return 48 * ((TextureID1 ? SwitchExtension->Segments[0]->RaSegCount() : 0) +
|
||||
(TextureID2 ? SwitchExtension->Segments[1]->RaSegCount() : 0));
|
||||
else // dla toru podsypka plus szyny
|
||||
return (Segment->RaSegCount()) * ((TextureID1 ? 48 : 0) + (TextureID2 ? 8 : 0));
|
||||
case 2: // droga
|
||||
if (eType == tt_Cross) // tylko dla skrzyżowania dróg
|
||||
{ // specjalny sposób obliczania liczby wierzchołków w skrzyżowaniu
|
||||
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();
|
||||
}
|
||||
// each sub-segment covers only one side of the road, so it has points for single sideroad, if any
|
||||
return ( ( TextureID1 ? SwitchExtension->iPoints + SwitchExtension->iRoads + 2 : 0 ) + ( TextureID2 ? SwitchExtension->iPoints * 6 : 0 ) );
|
||||
}
|
||||
else // standardowo dla zwykłej drogi
|
||||
if (fTexHeight1 >= 0) // jeśli fTexHeight1<0, to są chodniki i może któregoś nie być
|
||||
return ( Segment->RaSegCount()) *
|
||||
((TextureID1 ? 4 : 0) + (TextureID2 ? 12 : 0)); // może nie być poziomego!
|
||||
else
|
||||
return (Segment->RaSegCount()) *
|
||||
((TextureID1 ? 4 : 0) +
|
||||
(TextureID2 ? (fTexWidth != 0.0 ? 6 : 0) + (fTexSlope != 0.0 ? 6 : 0) : 0));
|
||||
case 4: // rzeki do przemyślenia
|
||||
return (Segment->RaSegCount()) * ((TextureID1 ? 4 : 0) + (TextureID2 ? 12 : 0));
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
*/
|
||||
|
||||
// wypełnianie tablic VBO
|
||||
void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
// Ra: trzeba rozdzielić szyny od podsypki, aby móc grupować wg tekstur
|
||||
@@ -1875,159 +1830,7 @@ void TTrack::create_geometry( geometrybank_handle const &Bank ) {
|
||||
}
|
||||
return;
|
||||
};
|
||||
/*
|
||||
void TTrack::RaRenderVBO( int iPtr ) { // renderowanie z użyciem VBO
|
||||
// Ra 2014-07: trzeba wymienić GL_TRIANGLE_STRIP na GL_TRIANGLES i renderować trójkąty sektora dla kolejnych tekstur!
|
||||
EnvironmentSet();
|
||||
int seg;
|
||||
switch( iCategoryFlag & 15 ) {
|
||||
case 1: {
|
||||
// tor
|
||||
if( eType == tt_Switch ) // dla zwrotnicy tylko szyny
|
||||
{
|
||||
int const bladesegmentcount = 2;
|
||||
if( TextureID1 ) {
|
||||
if( ( seg = SwitchExtension->Segments[ 0 ]->RaSegCount() ) > 0 ) {
|
||||
GfxRenderer.Bind( TextureID1 ); // szyny +
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 24 * seg );
|
||||
iPtr += 24 * seg;
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 24 * ( seg - bladesegmentcount ) );
|
||||
// NOTE: due to way blades bend need to render each segment separately, or some unwanted edges may show
|
||||
iPtr += 24 * ( seg - bladesegmentcount );
|
||||
for( int i = 0; i < bladesegmentcount; ++i ) {
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 24 );
|
||||
iPtr += 24;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( TextureID2 ) {
|
||||
if( ( seg = SwitchExtension->Segments[ 1 ]->RaSegCount() ) > 0 ) {
|
||||
GfxRenderer.Bind( TextureID2 );
|
||||
// NOTE: due to way blades bend need to render each segment separately, or some unwanted edges may show
|
||||
for( int i = 0; i < bladesegmentcount; ++i ) {
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 24 );
|
||||
iPtr += 24;
|
||||
}
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 24 * ( seg - bladesegmentcount ) );
|
||||
iPtr += 24 * ( seg - bladesegmentcount );
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 24 * seg );
|
||||
iPtr += 24 * seg;
|
||||
}
|
||||
}
|
||||
}
|
||||
else // dla toru podsypka plus szyny
|
||||
{
|
||||
if( ( seg = Segment->RaSegCount() ) > 0 ) {
|
||||
if( TextureID2 ) {
|
||||
GfxRenderer.Bind( TextureID2 ); // podsypka
|
||||
glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 8 * seg );
|
||||
iPtr += 8 * seg; // pominięcie podsypki
|
||||
}
|
||||
if( TextureID1 ) {
|
||||
GfxRenderer.Bind( TextureID1 ); // szyny
|
||||
glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 24 * seg );
|
||||
iPtr += 24 * seg; // pominięcie lewej szyny
|
||||
glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 24 * seg );
|
||||
iPtr += 24 * seg;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
// droga
|
||||
switch( eType ) {
|
||||
case tt_Normal: {
|
||||
if( ( seg = Segment->RaSegCount() ) > 0 ) {
|
||||
if( TextureID1 ) {
|
||||
GfxRenderer.Bind( TextureID1 ); // nawierzchnia
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 4 * seg );
|
||||
iPtr += 4 * seg;
|
||||
}
|
||||
if( TextureID2 ) {
|
||||
GfxRenderer.Bind( TextureID2 ); // pobocze
|
||||
if( fTexHeight1 >= 0.0 ) { // normalna droga z poboczem
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * seg );
|
||||
iPtr += 6 * seg; // pominięcie lewego pobocza
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * seg );
|
||||
iPtr += 6 * seg;
|
||||
}
|
||||
else { // z chodnikami o różnych szerokociach
|
||||
if( fTexWidth != 0.0 ) {
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * seg );
|
||||
iPtr += 6 * seg; // pominięcie lewego pobocza
|
||||
}
|
||||
if( fTexSlope != 0.0 ) {
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * seg );
|
||||
iPtr += 6 * seg;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case tt_Cross: {
|
||||
if( (seg = SwitchExtension->iPoints) > 0 ) {
|
||||
if( TextureID2 ) {
|
||||
// sidewalks
|
||||
GfxRenderer.Bind( TextureID2 );
|
||||
if( fTexHeight1 != 0.0 ) {
|
||||
if( SwitchExtension->iRoads == 4 ) {
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * SwitchExtension->Segments[ 2 ]->RaSegCount() );
|
||||
iPtr += 6 * SwitchExtension->Segments[ 2 ]->RaSegCount();
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * SwitchExtension->Segments[ 3 ]->RaSegCount() );
|
||||
iPtr += 6 * SwitchExtension->Segments[ 3 ]->RaSegCount();
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * SwitchExtension->Segments[ 4 ]->RaSegCount() );
|
||||
iPtr += 6 * SwitchExtension->Segments[ 4 ]->RaSegCount();
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * SwitchExtension->Segments[ 5 ]->RaSegCount() );
|
||||
iPtr += 6 * SwitchExtension->Segments[ 5 ]->RaSegCount();
|
||||
}
|
||||
else {
|
||||
// presumed 3 roads otherwise, as we only support 3 & 4 road crossings
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * SwitchExtension->Segments[ 2 ]->RaSegCount() );
|
||||
iPtr += 6 * SwitchExtension->Segments[ 2 ]->RaSegCount();
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * SwitchExtension->Segments[ 1 ]->RaSegCount() );
|
||||
iPtr += 6 * SwitchExtension->Segments[ 1 ]->RaSegCount();
|
||||
::glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * SwitchExtension->Segments[ 0 ]->RaSegCount() );
|
||||
iPtr += 6 * SwitchExtension->Segments[ 0 ]->RaSegCount();
|
||||
}
|
||||
}
|
||||
}
|
||||
if( TextureID1 ) {
|
||||
// roads
|
||||
GfxRenderer.Bind( TextureID1 );
|
||||
::glDrawArrays( GL_TRIANGLE_FAN, iPtr, SwitchExtension->iPoints + SwitchExtension->iRoads + 2 );
|
||||
iPtr += SwitchExtension->iPoints;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: { break; }
|
||||
} //switch etype
|
||||
break;
|
||||
}
|
||||
case 4: {
|
||||
// rzeki - jeszcze do przemyślenia
|
||||
if( ( seg = Segment->RaSegCount() ) > 0 ) {
|
||||
if( TextureID1 ) {
|
||||
GfxRenderer.Bind( TextureID1 ); // nawierzchnia
|
||||
glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 4 * seg );
|
||||
iPtr += 4 * seg;
|
||||
}
|
||||
if( TextureID2 ) {
|
||||
GfxRenderer.Bind( TextureID2 ); // pobocze
|
||||
glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * seg );
|
||||
iPtr += 6 * seg; // pominięcie lewego pobocza
|
||||
glDrawArrays( GL_TRIANGLE_STRIP, iPtr, 6 * seg );
|
||||
iPtr += 6 * seg;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
EnvironmentReset();
|
||||
};
|
||||
*/
|
||||
|
||||
void TTrack::EnvironmentSet()
|
||||
{ // ustawienie zmienionego światła
|
||||
glColor3f(1.0f, 1.0f, 1.0f); // Ra: potrzebne to?
|
||||
|
||||
Reference in New Issue
Block a user