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

replaced the list of dynamic objects on tracks with stl-based version

This commit is contained in:
tmj-fstate
2017-01-27 22:45:47 +01:00
parent ff480e2e1b
commit fe1c52027e
7 changed files with 328 additions and 15 deletions

View File

@@ -241,6 +241,7 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
fVelNext = 30.0; // uzależnić prędkość od promienia; albo niech będzie fVelNext = 30.0; // uzależnić prędkość od promienia; albo niech będzie
// ograniczona w skrzyżowaniu (velocity z ujemną wartością) // ograniczona w skrzyżowaniu (velocity z ujemną wartością)
if ((iFlags & spElapsed) == 0) // jeśli nie wjechał if ((iFlags & spElapsed) == 0) // jeśli nie wjechał
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (trTrack->iNumDynamics > 0) // a skrzyżowanie zawiera pojazd if (trTrack->iNumDynamics > 0) // a skrzyżowanie zawiera pojazd
{ {
if (Global::iWriteLogEnabled & 8) if (Global::iWriteLogEnabled & 8)
@@ -248,6 +249,14 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
fVelNext = fVelNext =
0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto) 0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto)
} }
#else
if( false == trTrack->Dynamics.empty() ) {
if( Global::iWriteLogEnabled & 8 ) {
WriteLog( "Tor " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + std::to_string( trTrack->Dynamics.size() ) + "Dist= " + std::to_string( fDist ) );
fVelNext = 0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto)
}
}
#endif
} }
if (iFlags & spSwitch) // jeśli odcinek zmienny if (iFlags & spSwitch) // jeśli odcinek zmienny
{ {
@@ -262,6 +271,7 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
// na Mydelniczce potrafi skanować na wprost mimo pojechania na bok // na Mydelniczce potrafi skanować na wprost mimo pojechania na bok
} }
// poniższe nie dotyczy trybu łączenia? // poniższe nie dotyczy trybu łączenia?
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if ((iFlags & spElapsed) ? false : if ((iFlags & spElapsed) ? false :
trTrack->iNumDynamics > trTrack->iNumDynamics >
0) // jeśli jeszcze nie wjechano na tor, a coś na nim jest 0) // jeśli jeszcze nie wjechano na tor, a coś na nim jest
@@ -273,6 +283,16 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
// else if (fVelNext==0.0) //jeśli została wyzerowana // else if (fVelNext==0.0) //jeśli została wyzerowana
// fVelNext=trTrack->VelocityGet(); //odczyt prędkości // fVelNext=trTrack->VelocityGet(); //odczyt prędkości
} }
#else
if( ( ( iFlags & spElapsed ) == 0 )
&& ( false == trTrack->Dynamics.empty() ) ) {
// jeśli jeszcze nie wjechano na tor, a coś na nim jest
if( Global::iWriteLogEnabled & 8 ) {
WriteLog( "Rozjazd " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + std::to_string( trTrack->Dynamics.size() ) + "Dist= " + std::to_string( fDist ) );
}
fVelNext = 0.0; // to niech stanie w zwiększonej odległości
}
#endif
} }
} }
} }
@@ -4927,6 +4947,7 @@ double TController::Distance(vector3 &p1,vector3 &n,vector3 &p2)
bool TController::BackwardTrackBusy(TTrack *Track) bool TController::BackwardTrackBusy(TTrack *Track)
{ // najpierw sprawdzamy, czy na danym torze są pojazdy z innego składu { // najpierw sprawdzamy, czy na danym torze są pojazdy z innego składu
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (Track->iNumDynamics) if (Track->iNumDynamics)
{ // jeśli tylko z własnego składu, to tor jest wolny { // jeśli tylko z własnego składu, to tor jest wolny
for (int i = 0; i < Track->iNumDynamics; ++i) for (int i = 0; i < Track->iNumDynamics; ++i)
@@ -4934,6 +4955,17 @@ bool TController::BackwardTrackBusy(TTrack *Track)
return true; // to tor jest zajęty i skanowanie nie obowiązuje return true; // to tor jest zajęty i skanowanie nie obowiązuje
} }
return false; // wolny return false; // wolny
#else
if( false == Track->Dynamics.empty() ) {
for( auto dynamic : Track->Dynamics ) {
if( dynamic->ctOwner != this ) {
// jeśli jest jakiś cudzy to tor jest zajęty i skanowanie nie obowiązuje
return true;
}
}
}
return false; // wolny
#endif
}; };
TEvent * TController::CheckTrackEventBackward(double fDirection, TTrack *Track) TEvent * TController::CheckTrackEventBackward(double fDirection, TTrack *Track)

View File

@@ -965,6 +965,7 @@ TDynamicObject * TDynamicObject::ABuFindNearestObject(TTrack *Track,
// Uwaga! Jesli CouplNr==-2 to szukamy njblizszego obiektu, a nie sprzegu!!! // Uwaga! Jesli CouplNr==-2 to szukamy njblizszego obiektu, a nie sprzegu!!!
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if ((Track->iNumDynamics) > 0) if ((Track->iNumDynamics) > 0)
{ // o ile w ogóle jest co przeglądać na tym torze { // o ile w ogóle jest co przeglądać na tym torze
// vector3 poz; //pozycja pojazdu XYZ w scenerii // vector3 poz; //pozycja pojazdu XYZ w scenerii
@@ -1013,7 +1014,33 @@ TDynamicObject * TDynamicObject::ABuFindNearestObject(TTrack *Track,
} }
return NULL; return NULL;
} }
return NULL; #else
for( auto dynamic : Track->Dynamics ) {
if( CouplNr == -2 ) {
// wektor [kamera-obiekt] - poszukiwanie obiektu
if( LengthSquared3( Global::GetCameraPosition() - dynamic->vPosition ) < 100.0 ) {
// 10 metrów
return dynamic;
}
}
else {
// jeśli (CouplNr) inne niz -2, szukamy sprzęgu
if( LengthSquared3( Global::GetCameraPosition() - dynamic->vCoulpler[ 0 ] ) < 25.0 ) {
// 5 metrów
CouplNr = 0;
return dynamic;
}
if( LengthSquared3( Global::GetCameraPosition() - dynamic->vCoulpler[ 1 ] ) < 25.0 ) {
// 5 metrów
CouplNr = 1;
return dynamic;
}
}
}
// empty track or nothing found
return nullptr;
#endif
} }
TDynamicObject * TDynamicObject::ABuScanNearestObject(TTrack *Track, double ScanDir, TDynamicObject * TDynamicObject::ABuScanNearestObject(TTrack *Track, double ScanDir,
@@ -1135,14 +1162,22 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir,
// WY: wskaznik do znalezionego obiektu. // WY: wskaznik do znalezionego obiektu.
// CouplFound - nr sprzegu znalezionego obiektu // CouplFound - nr sprzegu znalezionego obiektu
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (Track->iNumDynamics > 0) if (Track->iNumDynamics > 0)
#else
if( false == Track->Dynamics.empty() )
#endif
{ // sens szukania na tym torze jest tylko, gdy są na nim pojazdy { // sens szukania na tym torze jest tylko, gdy są na nim pojazdy
double ObjTranslation; // pozycja najblizszego obiektu na torze double ObjTranslation; // pozycja najblizszego obiektu na torze
double MyTranslation; // pozycja szukającego na torze double MyTranslation; // pozycja szukającego na torze
double MinDist = Track->Length(); // najmniejsza znaleziona odleglość double MinDist = Track->Length(); // najmniejsza znaleziona odleglość
// (zaczynamy od długości toru) // (zaczynamy od długości toru)
double TestDist; // robocza odległość od kolejnych pojazdów na danym odcinku double TestDist; // robocza odległość od kolejnych pojazdów na danym odcinku
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
int iMinDist = -1; // indeks wykrytego obiektu int iMinDist = -1; // indeks wykrytego obiektu
#else
TDynamicObject *collider = nullptr;
#endif
// if (Track->iNumDynamics>1) // if (Track->iNumDynamics>1)
// iMinDist+=0; //tymczasowo pułapka // iMinDist+=0; //tymczasowo pułapka
if (MyTrack == Track) // gdy szukanie na tym samym torze if (MyTrack == Track) // gdy szukanie na tym samym torze
@@ -1154,7 +1189,8 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir,
MyTranslation = MinDist; // szukanie w kierunku Point1 (do zera) - jesteśmy w Point2 MyTranslation = MinDist; // szukanie w kierunku Point1 (do zera) - jesteśmy w Point2
if (ScanDir >= 0) if (ScanDir >= 0)
{ // jeśli szukanie w kierunku Point2 { // jeśli szukanie w kierunku Point2
for (int i = 0; i < Track->iNumDynamics; i++) #ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( int i = 0; i < Track->iNumDynamics; i++ )
{ // pętla po pojazdach { // pętla po pojazdach
if (Track->Dynamics[i] != this) // szukający się nie liczy if (Track->Dynamics[i] != this) // szukający się nie liczy
{ {
@@ -1200,10 +1236,56 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir,
} }
} }
} }
#else
for( auto dynamic : Track->Dynamics ) {
// pętla po pojazdach
if( dynamic == this ) {
// szukający się nie liczy
continue;
}
TestDist = ( dynamic->RaTranslationGet() ) - MyTranslation; // odległogłość tamtego od szukającego
if( ( TestDist > 0 ) && ( TestDist <= MinDist ) ) { // gdy jest po właściwej stronie i bliżej
// niż jakiś wcześniejszy
CouplFound = ( dynamic->RaDirectionGet() > 0 ) ? 1 : 0; // to, bo (ScanDir>=0)
if( Track->iCategoryFlag & 254 ) {
// trajektoria innego typu niż tor kolejowy
// dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej szynie i się mija
// Ra: mijanie samochodów wcale nie jest proste
// Przesuniecie wzgledne pojazdow. Wyznaczane, zeby sprawdzic,
// czy pojazdy faktycznie sie zderzaja (moga byc przesuniete
// w/m siebie tak, ze nie zachodza na siebie i wtedy sie mijaja).
double RelOffsetH; // wzajemna odległość poprzeczna
if( CouplFound ) {
// my na tym torze byśmy byli w kierunku Point2
// dla CouplFound=1 są zwroty zgodne - istotna różnica przesunięć
RelOffsetH = ( MoverParameters->OffsetTrackH - dynamic->MoverParameters->OffsetTrackH );
}
else {
// dla CouplFound=0 są zwroty przeciwne - przesunięcia sumują się
RelOffsetH = ( MoverParameters->OffsetTrackH + dynamic->MoverParameters->OffsetTrackH );
}
if( RelOffsetH < 0 ) {
RelOffsetH = -RelOffsetH;
}
if( RelOffsetH + RelOffsetH > MoverParameters->Dim.W + dynamic->MoverParameters->Dim.W ) {
// odległość większa od połowy sumy szerokości - kolizji nie będzie
continue;
}
// jeśli zahaczenie jest niewielkie, a jest miejsce na poboczu, to
// zjechać na pobocze
}
collider = dynamic; // potencjalna kolizja
MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów
}
}
#endif
} }
else //(ScanDir<0) else //(ScanDir<0)
{ {
for (int i = 0; i < Track->iNumDynamics; i++) #ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( int i = 0; i < Track->iNumDynamics; i++ )
{ {
if (Track->Dynamics[i] != this) if (Track->Dynamics[i] != this)
{ {
@@ -1247,15 +1329,54 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir,
} }
} }
} }
#else
for( auto dynamic : Track->Dynamics ) {
if( dynamic == this ) { continue; }
TestDist = MyTranslation - ( dynamic->RaTranslationGet() ); //???-przesunięcie wózka względem Point1 toru
if( ( TestDist > 0 ) && ( TestDist < MinDist ) ) {
CouplFound = ( dynamic->RaDirectionGet() > 0 ) ? 0 : 1; // odwrotnie, bo (ScanDir<0)
if( Track->iCategoryFlag & 254 ) // trajektoria innego typu niż tor kolejowy
{ // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej szynie i się mija
// Ra: mijanie samochodów wcale nie jest proste
// Przesunięcie względne pojazdów. Wyznaczane, żeby sprawdzić,
// czy pojazdy faktycznie się zderzają (mogą być przesunięte
// w/m siebie tak, że nie zachodzą na siebie i wtedy sie mijają).
double RelOffsetH; // wzajemna odległość poprzeczna
if( CouplFound ) {
// my na tym torze byśmy byli w kierunku Point1
// dla CouplFound=1 są zwroty zgodne - istotna różnica przesunięć
RelOffsetH = ( MoverParameters->OffsetTrackH - dynamic->MoverParameters->OffsetTrackH );
}
else {
// dla CouplFound=0 są zwroty przeciwne - przesunięcia sumują się
RelOffsetH = ( MoverParameters->OffsetTrackH + dynamic->MoverParameters->OffsetTrackH );
}
if( RelOffsetH < 0 ) {
RelOffsetH = -RelOffsetH;
}
if( RelOffsetH + RelOffsetH > MoverParameters->Dim.W + dynamic->MoverParameters->Dim.W ) {
// odległość większa od połowy sumy szerokości - kolizji nie będzie
continue;
}
}
collider = dynamic; // potencjalna kolizja
MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów
}
}
#endif
} }
dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka do przeskanowanej odległości
// do przeskanowanej #ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
// odległości return ( iMinDist >= 0 ) ? Track->Dynamics[ iMinDist ] : NULL;
return (iMinDist >= 0) ? Track->Dynamics[iMinDist] : NULL; #else
return collider;
#endif
} }
dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej
// odległości // odległości
return NULL; // nie ma pojazdów na torze, to jest NULL return nullptr; // nie ma pojazdów na torze, to jest NULL
} }
int TDynamicObject::DettachStatus(int dir) int TDynamicObject::DettachStatus(int dir)

View File

@@ -3814,10 +3814,18 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node)
if (Event->Params[6].asTrack) if (Event->Params[6].asTrack)
{ // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla { // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla
// wszystkich 'dynamic' na danym torze // wszystkich 'dynamic' na danym torze
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for (int i = 0; i < Event->Params[6].asTrack->iNumDynamics; ++i) for (int i = 0; i < Event->Params[6].asTrack->iNumDynamics; ++i)
Event->Params[5].asMemCell->PutCommand( Event->Params[5].asMemCell->PutCommand(
Event->Params[6].asTrack->Dynamics[i]->Mechanik, Event->Params[6].asTrack->Dynamics[i]->Mechanik,
&Event->Params[4].nGroundNode->pCenter); &Event->Params[4].nGroundNode->pCenter);
#else
for( auto dynamic : Event->Params[ 6 ].asTrack->Dynamics ) {
Event->Params[ 5 ].asMemCell->PutCommand(
dynamic->Mechanik,
&Event->Params[ 4 ].nGroundNode->pCenter );
}
#endif
//if (DebugModeFlag) //if (DebugModeFlag)
WriteLog("EVENT EXECUTED: AddValues & Track command - " + WriteLog("EVENT EXECUTED: AddValues & Track command - " +
std::string(Event->Params[0].asText) + " " + std::string(Event->Params[0].asText) + " " +
@@ -4006,10 +4014,18 @@ bool TGround::CheckQuery()
if (tmpEvent->Params[6].asTrack) if (tmpEvent->Params[6].asTrack)
{ // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla { // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla
// wszystkich 'dynamic' na danym torze // wszystkich 'dynamic' na danym torze
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for (int i = 0; i < tmpEvent->Params[6].asTrack->iNumDynamics; ++i) for (int i = 0; i < tmpEvent->Params[6].asTrack->iNumDynamics; ++i)
tmpEvent->Params[5].asMemCell->PutCommand( tmpEvent->Params[5].asMemCell->PutCommand(
tmpEvent->Params[6].asTrack->Dynamics[i]->Mechanik, tmpEvent->Params[6].asTrack->Dynamics[i]->Mechanik,
&tmpEvent->Params[4].nGroundNode->pCenter); &tmpEvent->Params[4].nGroundNode->pCenter);
#else
for( auto dynamic : tmpEvent->Params[ 6 ].asTrack->Dynamics ) {
tmpEvent->Params[ 5 ].asMemCell->PutCommand(
dynamic->Mechanik,
&tmpEvent->Params[ 4 ].nGroundNode->pCenter );
}
#endif
//if (DebugModeFlag) //if (DebugModeFlag)
WriteLog("Type: UpdateValues & Track command - " + WriteLog("Type: UpdateValues & Track command - " +
std::string(tmpEvent->Params[0].asText) + " " + std::string(tmpEvent->Params[0].asText) + " " +
@@ -5038,7 +5054,8 @@ TDynamicObject * TGround::DynamicNearest(vector3 pPosition, double distance, boo
if ((tmp = FastGetSubRect(i, j)) != NULL) if ((tmp = FastGetSubRect(i, j)) != NULL)
for (node = tmp->nRootNode; node; node = node->nNext2) // następny z sektora for (node = tmp->nRootNode; node; node = node->nNext2) // następny z sektora
if (node->iType == TP_TRACK) // Ra: przebudować na użycie tabeli torów? if (node->iType == TP_TRACK) // Ra: przebudować na użycie tabeli torów?
for (k = 0; k < node->pTrack->iNumDynamics; k++) #ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( k = 0; k < node->pTrack->iNumDynamics; k++ )
if (mech ? (node->pTrack->Dynamics[k]->Mechanik != NULL) : if (mech ? (node->pTrack->Dynamics[k]->Mechanik != NULL) :
true) // czy ma mieć obsadę true) // czy ma mieć obsadę
if ((sqd = SquareMagnitude( if ((sqd = SquareMagnitude(
@@ -5048,6 +5065,17 @@ TDynamicObject * TGround::DynamicNearest(vector3 pPosition, double distance, boo
sqm = sqd; // nowa odległość sqm = sqd; // nowa odległość
dyn = node->pTrack->Dynamics[k]; // nowy lider dyn = node->pTrack->Dynamics[k]; // nowy lider
} }
#else
for( auto dynamic : node->pTrack->Dynamics ) {
if( mech ? ( dynamic->Mechanik != nullptr ) : true ) {
// czy ma mieć obsadę
if( ( sqd = SquareMagnitude( dynamic->GetPosition() - pPosition ) ) < sqm ) {
sqm = sqd; // nowa odległość
dyn = dynamic; // nowy lider
}
}
}
#endif
return dyn; return dyn;
}; };
TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, bool mech) TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, bool mech)
@@ -5064,7 +5092,8 @@ TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, boo
if ((tmp = FastGetSubRect(i, j)) != NULL) if ((tmp = FastGetSubRect(i, j)) != NULL)
for (node = tmp->nRootNode; node; node = node->nNext2) // następny z sektora for (node = tmp->nRootNode; node; node = node->nNext2) // następny z sektora
if (node->iType == TP_TRACK) // Ra: przebudować na użycie tabeli torów? if (node->iType == TP_TRACK) // Ra: przebudować na użycie tabeli torów?
for (k = 0; k < node->pTrack->iNumDynamics; k++) #ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( k = 0; k < node->pTrack->iNumDynamics; k++ )
if (mech ? (node->pTrack->Dynamics[k]->Mechanik != NULL) : if (mech ? (node->pTrack->Dynamics[k]->Mechanik != NULL) :
true) // czy ma mieć obsadę true) // czy ma mieć obsadę
{ {
@@ -5083,6 +5112,21 @@ TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, boo
dyn = node->pTrack->Dynamics[k]; // nowy lider dyn = node->pTrack->Dynamics[k]; // nowy lider
} }
} }
#else
for( auto dynamic : node->pTrack->Dynamics ) {
if( mech ? ( dynamic->Mechanik != nullptr ) : true ) {
// czy ma mieć obsadę
if( ( sqd = SquareMagnitude( dynamic->HeadPosition() - pPosition ) ) < sqm ) {
sqm = sqd; // nowa odległość
dyn = dynamic; // nowy lider
}
if( ( sqd = SquareMagnitude( dynamic->RearPosition() - pPosition ) ) < sqm ) {
sqm = sqd; // nowa odległość
dyn = dynamic; // nowy lider
}
}
}
#endif
return dyn; return dyn;
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -5221,7 +5265,11 @@ void TGround::TrackBusyList()
TTrack *Track; TTrack *Track;
for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext) for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext)
if (!Current->asName.empty()) // musi być nazwa if (!Current->asName.empty()) // musi być nazwa
if (Current->pTrack->iNumDynamics) // osi to chyba nie ma jak policzyć #ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if( Current->pTrack->iNumDynamics ) // osi to chyba nie ma jak policzyć
#else
if( false == Current->pTrack->Dynamics.empty() )
#endif
WyslijString(Current->asName, 8); // zajęty WyslijString(Current->asName, 8); // zajęty
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -672,7 +672,7 @@ public:
/*nastawniki:*/ /*nastawniki:*/
int MainCtrlPosNo = 0; /*ilosc pozycji nastawnika*/ int MainCtrlPosNo = 0; /*ilosc pozycji nastawnika*/
int ScndCtrlPosNo = 0; int ScndCtrlPosNo = 0;
int LightsPosNo = 1; int LightsPosNo = 0; // NOTE: values higher than 0 seem to break the current code for light switches
int LightsDefPos = 0; int LightsDefPos = 0;
bool LightsWrap = false; bool LightsWrap = false;
int Lights[2][17]; // pozycje świateł, przód - tył, 1 .. 16 int Lights[2][17]; // pozycje świateł, przód - tył, 1 .. 16

View File

@@ -298,7 +298,7 @@ Name( NameInit )
} }
for (int b = 0; b < 2; ++b) for (int b = 0; b < 2; ++b)
for (int k = 1; k <= 17; ++k) for (int k = 0; k < 17; ++k)
Lights[b][k] = 0; Lights[b][k] = 0;
for (int b = -1; b <= MainBrakeMaxPos; ++b) for (int b = -1; b <= MainBrakeMaxPos; ++b)

105
Track.cpp
View File

@@ -145,7 +145,9 @@ void TIsolated::Modify(int i, TDynamicObject *o)
TTrack::TTrack(TGroundNode *g) : TTrack::TTrack(TGroundNode *g) :
pMyNode( g ) // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode pMyNode( g ) // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode
{ {
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
::SecureZeroMemory( Dynamics, sizeof( Dynamics ) ); ::SecureZeroMemory( Dynamics, sizeof( Dynamics ) );
#endif
fRadiusTable[ 0 ] = 0.0; fRadiusTable[ 0 ] = 0.0;
fRadiusTable[ 1 ] = 0.0; fRadiusTable[ 1 ] = 0.0;
nFouling[ 0 ] = nullptr; nFouling[ 0 ] = nullptr;
@@ -997,6 +999,7 @@ bool TTrack::AddDynamicObject(TDynamicObject *Dynamic)
Dynamic->MyTrack = NULL; // trzeba by to uzależnić od kierunku ruchu... Dynamic->MyTrack = NULL; // trzeba by to uzależnić od kierunku ruchu...
return true; return true;
} }
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (Global::iMultiplayer) // jeśli multiplayer if (Global::iMultiplayer) // jeśli multiplayer
if (!iNumDynamics) // pierwszy zajmujący if (!iNumDynamics) // pierwszy zajmujący
if (pMyNode->asName != "none") if (pMyNode->asName != "none")
@@ -1016,6 +1019,25 @@ bool TTrack::AddDynamicObject(TDynamicObject *Dynamic)
Error("Too many dynamics on track " + pMyNode->asName); Error("Too many dynamics on track " + pMyNode->asName);
return false; return false;
} }
#else
if( Global::iMultiplayer ) {
// jeśli multiplayer
if( true == Dynamics.empty() ) {
// pierwszy zajmujący
if( pMyNode->asName != "none" ) {
// przekazanie informacji o zajętości toru
Global::pGround->WyslijString( pMyNode->asName, 8 );
}
}
}
Dynamics.emplace_back( Dynamic );
Dynamic->MyTrack = this; // ABu: na ktorym torze jesteśmy
if( Dynamic->iOverheadMask ) {
// jeśli ma pantografy
Dynamic->OverheadTrack( fOverhead ); // przekazanie informacji o jeździe bezprądowej na tym odcinku toru
}
return true;
#endif
}; };
void TTrack::MoveMe(vector3 pPosition) void TTrack::MoveMe(vector3 pPosition)
@@ -1833,14 +1855,24 @@ void TTrack::Render()
bool TTrack::CheckDynamicObject(TDynamicObject *Dynamic) bool TTrack::CheckDynamicObject(TDynamicObject *Dynamic)
{ // sprawdzenie, czy pojazd jest przypisany do toru { // sprawdzenie, czy pojazd jest przypisany do toru
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for (int i = 0; i < iNumDynamics; i++) for (int i = 0; i < iNumDynamics; i++)
if (Dynamic == Dynamics[i]) if (Dynamic == Dynamics[i])
return true; return true;
return false; return false;
#else
for( auto dynamic : Dynamics ) {
if( dynamic == Dynamic ) {
return true;
}
}
return false;
#endif
}; };
bool TTrack::RemoveDynamicObject(TDynamicObject *Dynamic) bool TTrack::RemoveDynamicObject(TDynamicObject *Dynamic)
{ // usunięcie pojazdu z listy przypisanych do toru { // usunięcie pojazdu z listy przypisanych do toru
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for (int i = 0; i < iNumDynamics; i++) for (int i = 0; i < iNumDynamics; i++)
{ // sprawdzanie wszystkich po kolei { // sprawdzanie wszystkich po kolei
if (Dynamic == Dynamics[i]) if (Dynamic == Dynamics[i])
@@ -1858,6 +1890,41 @@ bool TTrack::RemoveDynamicObject(TDynamicObject *Dynamic)
} }
Error("Cannot remove dynamic from track"); Error("Cannot remove dynamic from track");
return false; return false;
#else
bool result = false;
if( *Dynamics.begin() == Dynamic ) {
// most likely the object getting removed it's at the front...
Dynamics.pop_front();
result = true;
}
else if( *( --Dynamics.end() ) == Dynamic ) {
// ...or the back of the queue...
Dynamics.pop_back();
result = true;
}
else {
// ... if these fail, check all objects one by one, just in case
// TODO: check if this is ever needed, remove if it isn't.
for( auto idx = Dynamics.begin(); idx != Dynamics.end(); ++idx ) {
if( *idx == Dynamic ) {
Dynamics.erase( idx );
result = true;
}
}
}
if( Global::iMultiplayer ) {
// jeśli multiplayer
if( true == Dynamics.empty() ) {
// jeśli już nie ma żadnego
if( pMyNode->asName != "none" ) {
// przekazanie informacji o zwolnieniu toru
Global::pGround->WyslijString( pMyNode->asName, 9 );
}
}
}
return result;
#endif
} }
bool TTrack::InMovement() bool TTrack::InMovement()
@@ -2551,28 +2618,48 @@ void TTrack::EnvironmentReset()
void TTrack::RenderDyn() void TTrack::RenderDyn()
{ // renderowanie nieprzezroczystych fragmentów pojazdów { // renderowanie nieprzezroczystych fragmentów pojazdów
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (!iNumDynamics) if (!iNumDynamics)
return; // po co kombinować, jeśli nie ma pojazdów? return; // po co kombinować, jeśli nie ma pojazdów?
// EnvironmentSet(); //Ra: pojazdy sobie same teraz liczą cienie // EnvironmentSet(); //Ra: pojazdy sobie same teraz liczą cienie
for (int i = 0; i < iNumDynamics; i++) for (int i = 0; i < iNumDynamics; i++)
Dynamics[i]->Render(); // sam sprawdza, czy VBO; zmienia kontekst VBO! Dynamics[i]->Render(); // sam sprawdza, czy VBO; zmienia kontekst VBO!
// EnvironmentReset(); // EnvironmentReset();
#else
for( auto dynamic : Dynamics ) {
// sam sprawdza, czy VBO; zmienia kontekst VBO!
dynamic->Render();
}
#endif
}; };
void TTrack::RenderDynAlpha() void TTrack::RenderDynAlpha()
{ // renderowanie przezroczystych fragmentów pojazdów { // renderowanie przezroczystych fragmentów pojazdów
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (!iNumDynamics) if (!iNumDynamics)
return; // po co kombinować, jeśli nie ma pojazdów? return; // po co kombinować, jeśli nie ma pojazdów?
// EnvironmentSet(); //Ra: pojazdy sobie same teraz liczą cienie // EnvironmentSet(); //Ra: pojazdy sobie same teraz liczą cienie
for (int i = 0; i < iNumDynamics; i++) for (int i = 0; i < iNumDynamics; i++)
Dynamics[i]->RenderAlpha(); // sam sprawdza, czy VBO; zmienia kontekst VBO! Dynamics[i]->RenderAlpha(); // sam sprawdza, czy VBO; zmienia kontekst VBO!
// EnvironmentReset(); // EnvironmentReset();
#else
for( auto dynamic : Dynamics ) {
// sam sprawdza, czy VBO; zmienia kontekst VBO!
dynamic->RenderAlpha();
}
#endif
}; };
void TTrack::RenderDynSounds() void TTrack::RenderDynSounds()
{ // odtwarzanie dźwięków pojazdów jest niezależne od ich wyświetlania { // odtwarzanie dźwięków pojazdów jest niezależne od ich wyświetlania
for (int i = 0; i < iNumDynamics; i++) #ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( int i = 0; i < iNumDynamics; i++ )
Dynamics[i]->RenderSounds(); Dynamics[i]->RenderSounds();
#else
for( auto dynamic : Dynamics ) {
dynamic->RenderSounds();
}
#endif
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool TTrack::SetConnections(int i) bool TTrack::SetConnections(int i)
@@ -2906,8 +2993,15 @@ TTrack * TTrack::RaAnimate()
SwitchExtension->vTrans; // SwitchExtension->Segments[0]->FastGetPoint(0.5); SwitchExtension->vTrans; // SwitchExtension->Segments[0]->FastGetPoint(0.5);
Segment->Init(middle + vector3(sina, 0.0, cosa), Segment->Init(middle + vector3(sina, 0.0, cosa),
middle - vector3(sina, 0.0, cosa), 5.0); // nowy odcinek middle - vector3(sina, 0.0, cosa), 5.0); // nowy odcinek
for (int i = 0; i < iNumDynamics; i++) #ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( int i = 0; i < iNumDynamics; i++ )
Dynamics[i]->Move(0.000001); // minimalny ruch, aby przeliczyć pozycję i Dynamics[i]->Move(0.000001); // minimalny ruch, aby przeliczyć pozycję i
#else
for( auto dynamic : Dynamics ) {
// minimalny ruch, aby przeliczyć pozycję
dynamic->Move( 0.000001 );
}
#endif
// kąty // kąty
if (Global::bUseVBO) if (Global::bUseVBO)
{ // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment { // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment
@@ -2939,8 +3033,15 @@ TTrack * TTrack::RaAnimate()
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void TTrack::RadioStop() void TTrack::RadioStop()
{ // przekazanie pojazdom rozkazu zatrzymania { // przekazanie pojazdom rozkazu zatrzymania
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for (int i = 0; i < iNumDynamics; i++) for (int i = 0; i < iNumDynamics; i++)
Dynamics[i]->RadioStop(); Dynamics[i]->RadioStop();
#else
for( auto dynamic : Dynamics ) {
dynamic->RadioStop();
}
#endif
}; };
double TTrack::WidthTotal() double TTrack::WidthTotal()

11
Track.h
View File

@@ -94,7 +94,9 @@ class TSwitchExtension
private: private:
}; };
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
const int iMaxNumDynamics = 40; // McZapkie-100303 const int iMaxNumDynamics = 40; // McZapkie-100303
#endif
class TIsolated class TIsolated
{ // obiekt zbierający zajętości z kilku odcinków { // obiekt zbierający zajętości z kilku odcinków
@@ -149,8 +151,13 @@ class TTrack : public Resource
TGroundNode * TGroundNode *
pMyNode = nullptr; // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode pMyNode = nullptr; // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode
public: public:
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
int iNumDynamics = 0; int iNumDynamics = 0;
TDynamicObject *Dynamics[iMaxNumDynamics]; TDynamicObject *Dynamics[iMaxNumDynamics];
#else
typedef std::deque<TDynamicObject *> dynamics_sequence;
dynamics_sequence Dynamics;
#endif
int iEvents = 0; // Ra: flaga informująca o obecności eventów int iEvents = 0; // Ra: flaga informująca o obecności eventów
TEvent *evEventall0 = nullptr; // McZapkie-140302: wyzwalany gdy pojazd stoi TEvent *evEventall0 = nullptr; // McZapkie-140302: wyzwalany gdy pojazd stoi
TEvent *evEventall1 = nullptr; TEvent *evEventall1 = nullptr;
@@ -196,7 +203,11 @@ class TTrack : public Resource
TTrack * NullCreate(int dir); TTrack * NullCreate(int dir);
inline bool IsEmpty() inline bool IsEmpty()
{ {
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
return (iNumDynamics <= 0); return (iNumDynamics <= 0);
#else
return Dynamics.empty();
#endif
}; };
void ConnectPrevPrev(TTrack *pNewPrev, int typ); void ConnectPrevPrev(TTrack *pNewPrev, int typ);
void ConnectPrevNext(TTrack *pNewPrev, int typ); void ConnectPrevNext(TTrack *pNewPrev, int typ);