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

bug fixes for speed table creation and update

This commit is contained in:
tmj-fstate
2017-08-15 19:10:43 +02:00
parent 7e51d5d2e0
commit 72760ee9a8
2 changed files with 27 additions and 18 deletions

View File

@@ -657,6 +657,14 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
if( ( iLast == -1 ) if( ( iLast == -1 )
|| ( false == TestFlag( sSpeedTable[iLast].iFlags, spEnabled | spEnd ) ) ) { || ( false == TestFlag( sSpeedTable[iLast].iFlags, spEnabled | spEnd ) ) ) {
// only if we haven't already marked end of the track // only if we haven't already marked end of the track
if( tLast == sSpeedTable[ iLast ].trTrack ) {
// don't add the same track twice, it messes up distance calculations in speed point update
sSpeedTable[ iLast ].iFlags |= (
fLastDir < 0 ?
spEnabled | spEnd | spReverse :
spEnabled | spEnd );
}
else {
if( TableAddNew() ) { if( TableAddNew() ) {
// zapisanie ostatniego sprawdzonego toru // zapisanie ostatniego sprawdzonego toru
sSpeedTable[ iLast ].Set( sSpeedTable[ iLast ].Set(
@@ -666,6 +674,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
spEnabled | spEnd ) ); spEnabled | spEnd ) );
} }
} }
}
// to ostatnia pozycja, bo NULL nic nie da, a może się podpiąć obrotnica, czy jakieś transportery // to ostatnia pozycja, bo NULL nic nie da, a może się podpiąć obrotnica, czy jakieś transportery
return; return;
} }
@@ -691,7 +700,7 @@ void TController::TableCheck(double fDistance)
vector3 dir = pVehicles[0]->VectorFront() * pVehicles[0]->DirectionGet(); // wektor kierunku jazdy vector3 dir = pVehicles[0]->VectorFront() * pVehicles[0]->DirectionGet(); // wektor kierunku jazdy
vector3 pos = pVehicles[0]->HeadPosition(); // zaczynamy od pozycji pojazdu vector3 pos = pVehicles[0]->HeadPosition(); // zaczynamy od pozycji pojazdu
double len = 0.0; // odległość będziemy zliczać narastająco double len = 0.0; // odległość będziemy zliczać narastająco
for( int i = 0; i <= iLast; ++i ) for( int i = 0; i < iLast; ++i )
{ // aktualizacja rekordów z wyjątkiem ostatniego { // aktualizacja rekordów z wyjątkiem ostatniego
if (sSpeedTable[i].iFlags & spEnabled) // jeśli pozycja istotna if (sSpeedTable[i].iFlags & spEnabled) // jeśli pozycja istotna
{ {
@@ -1283,20 +1292,18 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
else // event trzyma tylko jeśli VelNext=0, nawet po przejechaniu (nie powinno else // event trzyma tylko jeśli VelNext=0, nawet po przejechaniu (nie powinno
// dotyczyć samochodów?) // dotyczyć samochodów?)
a = (v == 0.0 ? -1.0 : fAcc); // ruszanie albo hamowanie a = (v == 0.0 ? -1.0 : fAcc); // ruszanie albo hamowanie
if (a < fAcc && v == Min0R(v, fNext))
{ // mniejsze przyspieszenie to mniejsza możliwość rozpędzenia się albo konieczność if ((a < fAcc) && (v == std::min(v, fNext))) {
// hamowania // mniejsze przyspieszenie to mniejsza możliwość rozpędzenia się albo konieczność hamowania
// jeśli droga wolna, to może być a>1.0 i się tu nie załapuje // jeśli droga wolna, to może być a>1.0 i się tu nie załapuje
// if (mvOccupied->Vel>10.0)
fAcc = a; // zalecane przyspieszenie (nie musi być uwzględniane przez AI) fAcc = a; // zalecane przyspieszenie (nie musi być uwzględniane przez AI)
fNext = v; // istotna jest prędkość na końcu tego odcinka fNext = v; // istotna jest prędkość na końcu tego odcinka
fDist = d; // dlugość odcinka fDist = d; // dlugość odcinka
} }
else if ((fAcc > 0) && (v > 0) && (v <= fNext)) else if ((fAcc > 0) && (v > 0) && (v <= fNext)) {
{ // jeśli nie ma wskazań do hamowania, można podać drogę i prędkość na jej końcu // jeśli nie ma wskazań do hamowania, można podać drogę i prędkość na jej końcu
fNext = v; // istotna jest prędkość na końcu tego odcinka fNext = v; // istotna jest prędkość na końcu tego odcinka
fDist = d; // dlugość odcinka (kolejne pozycje mogą wydłużać drogę, jeśli fDist = d; // dlugość odcinka (kolejne pozycje mogą wydłużać drogę, jeśli prędkość jest stała)
// prędkość jest stała)
} }
} // if (v>=0.0) } // if (v>=0.0)
if (fNext >= 0.0) if (fNext >= 0.0)

View File

@@ -314,7 +314,9 @@ void TSubRect::NodeAdd(TGroundNode *Node)
// przygotowanie sektora do renderowania // przygotowanie sektora do renderowania
void TSubRect::Sort() { void TSubRect::Sort() {
assert( tTracks == nullptr ); if( tTracks != nullptr ) {
SafeDelete( tTracks );
}
if( iTracks > 0 ) { if( iTracks > 0 ) {
tTracks = new TTrack *[ iTracks ]; // tworzenie tabeli torów do renderowania pojazdów tTracks = new TTrack *[ iTracks ]; // tworzenie tabeli torów do renderowania pojazdów
int i = 0; int i = 0;