mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 01:19:19 +02:00
ai improvements and fixes for acceleration and brake handling, fix for automatic sandbox activation
This commit is contained in:
259
Driver.cpp
259
Driver.cpp
@@ -1223,42 +1223,49 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (sSpeedTable[i].evEvent->StopCommand())
|
else if (sSpeedTable[i].evEvent->StopCommand())
|
||||||
{ // jeśli prędkość jest zerowa, a komórka zawiera komendę
|
{ // jeśli prędkość jest zerowa, a komórka zawiera komendę
|
||||||
eSignNext = sSpeedTable[i].evEvent; // dla informacji
|
eSignNext = sSpeedTable[ i ].evEvent; // dla informacji
|
||||||
if (iDrivigFlags &
|
if( true == TestFlag( iDrivigFlags, moveStopHere ) ) {
|
||||||
moveStopHere) // jeśli ma stać, dostaje komendę od razu
|
// jeśli ma stać, dostaje komendę od razu
|
||||||
go = cm_Command; // komenda z komórki, do wykonania po zatrzymaniu
|
go = cm_Command; // komenda z komórki, do wykonania po zatrzymaniu
|
||||||
else if (sSpeedTable[i].fDist <= 20.0) // jeśli ma dociągnąć, to niech
|
}
|
||||||
// dociąga (moveStopCloser
|
else if( sSpeedTable[ i ].fDist <= 20.0 ) {
|
||||||
// dotyczy dociągania do W4, nie
|
// jeśli ma dociągnąć, to niech dociąga
|
||||||
// semafora)
|
// (moveStopCloser dotyczy dociągania do W4, nie semafora)
|
||||||
go = cm_Command; // komenda z komórki, do wykonania po zatrzymaniu
|
go = cm_Command; // komenda z komórki, do wykonania po zatrzymaniu
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} // jeśli nie ma zawalidrogi
|
} // jeśli nie ma zawalidrogi
|
||||||
} // jeśli event
|
} // jeśli event
|
||||||
if (v >= 0.0)
|
if (v >= 0.0)
|
||||||
{ // pozycje z prędkością -1 można spokojnie pomijać
|
{ // pozycje z prędkością -1 można spokojnie pomijać
|
||||||
d = sSpeedTable[i].fDist;
|
d = sSpeedTable[i].fDist;
|
||||||
if ((sSpeedTable[i].iFlags & spElapsed) ?
|
if( ( d > 0.0 )
|
||||||
false :
|
&& ( false == TestFlag( sSpeedTable[ i ].iFlags, spElapsed ) ) ) {
|
||||||
d > 0.0) // sygnał lub ograniczenie z przodu (+32=przejechane)
|
// sygnał lub ograniczenie z przodu (+32=przejechane)
|
||||||
{ // 2014-02: jeśli stoi, a ma do przejechania kawałek, to niech jedzie
|
// 2014-02: jeśli stoi, a ma do przejechania kawałek, to niech jedzie
|
||||||
if ((mvOccupied->Vel == 0.0) ?
|
if( ( mvOccupied->Vel == 0.0 )
|
||||||
((sSpeedTable[i].iFlags &
|
&& ( d > fMaxProximityDist )
|
||||||
(spEnabled | spEvent | spPassengerStopPoint)) ==
|
&& ( true == TestFlag( sSpeedTable[ i ].iFlags, ( spEnabled | spEvent | spPassengerStopPoint ) ) ) ) {
|
||||||
(spEnabled | spEvent | spPassengerStopPoint)) &&
|
// ma podjechać bliżej - czy na pewno w tym miejscu taki warunek?
|
||||||
(d > fMaxProximityDist) :
|
a = (
|
||||||
false)
|
iDrivigFlags & moveStopCloser ?
|
||||||
a = (iDrivigFlags & moveStopCloser) ? fAcc : 0.0; // ma podjechać bliżej -
|
fAcc :
|
||||||
// czy na pewno w tym
|
0.0 );
|
||||||
// miejscu taki warunek?
|
}
|
||||||
else
|
else {
|
||||||
{
|
// przyspieszenie: ujemne, gdy trzeba hamować
|
||||||
a = (v * v - mvOccupied->Vel * mvOccupied->Vel) /
|
a = ( v * v - mvOccupied->Vel * mvOccupied->Vel ) / ( 25.92 * d );
|
||||||
(25.92 * d); // przyspieszenie: ujemne, gdy trzeba hamować
|
if( fBrakeDist > 0.0 ) {
|
||||||
if (d < fMinProximityDist) // jak jest już blisko
|
// maintain desired acc while we have enough room to brake safely, when close enough start paying attention
|
||||||
if (v < fVelDes)
|
// try to make a smooth transition instead of sharp change
|
||||||
fVelDes = v; // ograniczenie aktualnej prędkości
|
a = interpolate( a, fAcc, clamp( ( d - fBrakeDist ) / fBrakeDist, 0.0, 1.0 ) );
|
||||||
|
}
|
||||||
|
if( ( d < fMinProximityDist )
|
||||||
|
&& ( v < fVelDes ) ) {
|
||||||
|
// jak jest już blisko, ograniczenie aktualnej prędkości
|
||||||
|
fVelDes = v;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (sSpeedTable[i].iFlags & spTrack) // jeśli tor
|
else if (sSpeedTable[i].iFlags & spTrack) // jeśli tor
|
||||||
@@ -4350,12 +4357,12 @@ bool TController::UpdateSituation(double dt)
|
|||||||
//(AbsAccS) - chwilowe przyspieszenie pojazu (uwzględnia grawitację), ujemne działa
|
//(AbsAccS) - chwilowe przyspieszenie pojazu (uwzględnia grawitację), ujemne działa
|
||||||
// przeciwnie do zadanego kierunku jazdy
|
// przeciwnie do zadanego kierunku jazdy
|
||||||
//(AccDesired) porównujemy z (fAccGravity) albo (AbsAccS)
|
//(AccDesired) porównujemy z (fAccGravity) albo (AbsAccS)
|
||||||
// if ((VelNext>=0.0)&&(ActualProximityDist>=0)&&(mvOccupied->Vel>=VelNext)) //gdy
|
if( ( VelNext >= 0.0 )
|
||||||
// zbliza sie i jest za szybko do NOWEGO
|
&& ( ActualProximityDist <= scanmax )
|
||||||
if ((VelNext >= 0.0) && (ActualProximityDist <= scanmax) && (vel >= VelNext))
|
&& ( vel >= VelNext ) ) {
|
||||||
{ // gdy zbliża się i jest za szybki do nowej prędkości, albo stoi na zatrzymaniu
|
// gdy zbliża się i jest za szybki do nowej prędkości, albo stoi na zatrzymaniu
|
||||||
if (vel > 0.0)
|
if (vel > 0.0) {
|
||||||
{ // jeśli jedzie
|
// jeśli jedzie
|
||||||
if ((vel < VelNext) ?
|
if ((vel < VelNext) ?
|
||||||
(ActualProximityDist > fMaxProximityDist * (1 + 0.1 * vel)) :
|
(ActualProximityDist > fMaxProximityDist * (1 + 0.1 * vel)) :
|
||||||
false) // dojedz do semafora/przeszkody
|
false) // dojedz do semafora/przeszkody
|
||||||
@@ -4365,21 +4372,17 @@ bool TController::UpdateSituation(double dt)
|
|||||||
AccDesired = AccPreferred;
|
AccDesired = AccPreferred;
|
||||||
// VelDesired:=Min0R(VelDesired,VelReduced+VelNext);
|
// VelDesired:=Min0R(VelDesired,VelReduced+VelNext);
|
||||||
}
|
}
|
||||||
else if (ActualProximityDist > fMinProximityDist)
|
else if (ActualProximityDist > fMinProximityDist) {
|
||||||
{ // jedzie szybciej, niż trzeba na końcu ActualProximityDist, ale jeszcze
|
// jedzie szybciej, niż trzeba na końcu ActualProximityDist, ale jeszcze jest daleko
|
||||||
// jest daleko
|
if (ActualProximityDist < fMaxProximityDist) {
|
||||||
if (ActualProximityDist <
|
// jak minął już maksymalny dystans po prostu hamuj (niski stopień)
|
||||||
fMaxProximityDist) // jak minął już maksymalny dystans
|
// ma stanąć, a jest w drodze hamowania albo ma jechać
|
||||||
{ // po prostu hamuj (niski stopień) //ma stanąć, a jest w
|
// hamowanie tak, aby stanąć
|
||||||
// drodze hamowania albo ma jechać
|
AccDesired = ( VelNext * VelNext - vel * vel ) / ( 25.92 * ( ActualProximityDist + 0.1 - 0.5*fMinProximityDist ) );
|
||||||
AccDesired = (VelNext * VelNext - vel * vel) /
|
|
||||||
(25.92 * (ActualProximityDist +
|
|
||||||
0.1 - 0.5*fMinProximityDist)); // hamowanie tak, aby stanąć
|
|
||||||
AccDesired = std::min(AccDesired, fAccThreshold);
|
AccDesired = std::min(AccDesired, fAccThreshold);
|
||||||
VelDesired = 0.0; // Min0R(VelDesired,VelNext);
|
VelDesired = 0.0;
|
||||||
}
|
}
|
||||||
else if ((vel <
|
else if ((vel < VelNext + 20.0)&&(false)) // dwustopniowe hamowanie - niski przy małej różnicy
|
||||||
VelNext + 20.0)&&(false)) // dwustopniowe hamowanie - niski przy małej różnicy
|
|
||||||
{ // jeśli jedzie wolniej niż VelNext+35km/h //Ra: 40, żeby nie
|
{ // jeśli jedzie wolniej niż VelNext+35km/h //Ra: 40, żeby nie
|
||||||
// kombinował na zwrotnicach
|
// kombinował na zwrotnicach
|
||||||
if (VelNext == 0.0)
|
if (VelNext == 0.0)
|
||||||
@@ -4431,16 +4434,24 @@ bool TController::UpdateSituation(double dt)
|
|||||||
AccDesired = (VelNext * VelNext - vel * vel) /
|
AccDesired = (VelNext * VelNext - vel * vel) /
|
||||||
(25.92 * ActualProximityDist +
|
(25.92 * ActualProximityDist +
|
||||||
0.1); // mniejsze opóźnienie przy małej różnicy
|
0.1); // mniejsze opóźnienie przy małej różnicy
|
||||||
if (ActualProximityDist < fMaxProximityDist)
|
if( ActualProximityDist < fMaxProximityDist ) {
|
||||||
ReactionTime = 0.1; // i orientuj się szybciej, jeśli w
|
// i orientuj się szybciej, jeśli w krytycznym przedziale
|
||||||
// krytycznym przedziale
|
ReactionTime = 0.1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else { // przy dużej różnicy wysoki stopień (1,00 potrzebnego opoznienia)
|
else { // przy dużej różnicy wysoki stopień (1,00 potrzebnego opoznienia)
|
||||||
double dist = 0;// (VelNext * VelNext - (VelNext + 20) * (VelNext + 20)) / (25.92)*(-1 / fBrake_a0[0] - 1 / fAccThreshold);
|
double dist = 0;// (VelNext * VelNext - (VelNext + 20) * (VelNext + 20)) / (25.92)*(-1 / fBrake_a0[0] - 1 / fAccThreshold);
|
||||||
AccDesired = (VelNext * VelNext - vel * vel) /
|
// ensure some minimal coasting speed, otherwise a vehicle entering this zone at very low speed will be crawling forever
|
||||||
(25.92 * std::max(ActualProximityDist - VelNext - dist, std::min(ActualProximityDist, VelNext+dist)) +
|
AccDesired =
|
||||||
0.1); // najpierw hamuje mocniej, potem zluzuje
|
( VelNext * VelNext - vel * vel )
|
||||||
|
/ ( 25.92
|
||||||
|
* std::max(
|
||||||
|
ActualProximityDist - VelNext - dist,
|
||||||
|
std::min(
|
||||||
|
ActualProximityDist,
|
||||||
|
VelNext + dist ) )
|
||||||
|
+ 0.1 ); // najpierw hamuje mocniej, potem zluzuje
|
||||||
}
|
}
|
||||||
if (AccPreferred < AccDesired)
|
if (AccPreferred < AccDesired)
|
||||||
AccDesired = AccPreferred; //(1+abs(AccDesired))
|
AccDesired = AccPreferred; //(1+abs(AccDesired))
|
||||||
@@ -4451,33 +4462,35 @@ bool TController::UpdateSituation(double dt)
|
|||||||
// //aby szybkosc hamowania zalezala od przyspieszenia i opoznienia
|
// //aby szybkosc hamowania zalezala od przyspieszenia i opoznienia
|
||||||
// hamulcow
|
// hamulcow
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{ // jest bliżej niż fMinProximityDist
|
// jest bliżej niż fMinProximityDist
|
||||||
VelDesired =
|
VelDesired = std::min( VelDesired, VelNext ); // utrzymuj predkosc bo juz blisko
|
||||||
Min0R(VelDesired, VelNext); // utrzymuj predkosc bo juz blisko
|
if( vel < VelNext + fVelPlus ) {
|
||||||
if (vel <
|
// jeśli niewielkie przekroczenie, ale ma jechać
|
||||||
VelNext + fVelPlus) // jeśli niewielkie przekroczenie, ale ma jechać
|
AccDesired = std::min( 0.0, AccPreferred ); // to olej (zacznij luzować)
|
||||||
AccDesired = Min0R(0.0, AccPreferred); // to olej (zacznij luzować)
|
}
|
||||||
ReactionTime = 0.1; // i orientuj się szybciej
|
ReactionTime = 0.1; // i orientuj się szybciej
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // zatrzymany (vel==0.0)
|
else {
|
||||||
// if (iDrivigFlags&moveStopHere) //to nie dotyczy podczepiania
|
// zatrzymany (vel==0.0)
|
||||||
// if ((VelNext>0.0)||(ActualProximityDist>fMaxProximityDist*1.2))
|
if( VelNext > 0.0 ) {
|
||||||
if (VelNext > 0.0)
|
// można jechać
|
||||||
AccDesired = AccPreferred; // można jechać
|
AccDesired = AccPreferred;
|
||||||
else // jeśli daleko jechać nie można
|
}
|
||||||
if (ActualProximityDist >
|
else {
|
||||||
fMaxProximityDist) // ale ma kawałek do sygnalizatora
|
// jeśli daleko jechać nie można
|
||||||
{ // if ((iDrivigFlags&moveStopHere)?false:AccPreferred>0)
|
if( ActualProximityDist > fMaxProximityDist ) {
|
||||||
if (AccPreferred > 0)
|
// ale ma kawałek do sygnalizatora
|
||||||
AccDesired = AccPreferred; // dociagnij do semafora;
|
if( AccPreferred > 0 ) { AccDesired = AccPreferred; } // dociagnij do semafora;
|
||||||
else
|
else { VelDesired = 0.0; } //stoj
|
||||||
VelDesired = 0.0; //,AccDesired=-fabs(fAccGravity); //stoj (hamuj z siłą
|
}
|
||||||
// równą składowej stycznej grawitacji)
|
else {
|
||||||
|
// VelNext=0 i stoi bliżej niż fMaxProximityDist
|
||||||
|
VelDesired = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
VelDesired = 0.0; // VelNext=0 i stoi bliżej niż fMaxProximityDist
|
|
||||||
}
|
}
|
||||||
else // gdy jedzie wolniej niż potrzeba, albo nie ma przeszkód na drodze
|
else // gdy jedzie wolniej niż potrzeba, albo nie ma przeszkód na drodze
|
||||||
AccDesired = (VelDesired != 0.0 ? AccPreferred : -0.01); // normalna jazda
|
AccDesired = (VelDesired != 0.0 ? AccPreferred : -0.01); // normalna jazda
|
||||||
@@ -4601,48 +4614,68 @@ bool TController::UpdateSituation(double dt)
|
|||||||
AccDesired = fAccDesiredAv =
|
AccDesired = fAccDesiredAv =
|
||||||
0.2 * AccDesired +
|
0.2 * AccDesired +
|
||||||
0.8 * fAccDesiredAv; // uśrednione, żeby ograniczyć migotanie
|
0.8 * fAccDesiredAv; // uśrednione, żeby ograniczyć migotanie
|
||||||
if (VelDesired == 0.0)
|
if( VelDesired == 0.0 ) {
|
||||||
if (AccDesired >= -0.01)
|
// Ra 2F1J: jeszcze jedna prowizoryczna łatka
|
||||||
AccDesired = -0.01; // Ra 2F1J: jeszcze jedna prowizoryczna łatka
|
if( AccDesired >= -0.01 ) {
|
||||||
if (AccDesired >= 0.0)
|
AccDesired = -0.01;
|
||||||
if (iDrivigFlags & movePress)
|
}
|
||||||
mvOccupied->BrakeReleaser(1); // wyluzuj lokomotywę - może być więcej!
|
}
|
||||||
else if (OrderList[OrderPos] !=
|
if( AccDesired >= 0.0 ) {
|
||||||
Disconnect) // przy odłączaniu nie zwalniamy tu hamulca
|
if( true == TestFlag( iDrivigFlags, movePress ) ) {
|
||||||
if (fAccGravity * fAccGravity <
|
// wyluzuj lokomotywę - może być więcej!
|
||||||
0.001) // luzuj tylko na plaskim lub przy ruszaniu
|
mvOccupied->BrakeReleaser( 1 );
|
||||||
{
|
}
|
||||||
while (DecBrake())
|
else if( OrderList[ OrderPos ] != Disconnect ) {
|
||||||
; // jeśli przyspieszamy, to nie hamujemy
|
// przy odłączaniu nie zwalniamy tu hamulca
|
||||||
if ((mvOccupied->BrakePress > 0.4) && (mvOccupied->Hamulec->GetCRP() > 4.9))
|
if( ( fAccGravity * fAccGravity < 0.001 ?
|
||||||
mvOccupied->BrakeReleaser(
|
true :
|
||||||
1); // wyluzuj lokomotywę, to szybciej ruszymy
|
AccDesired > 0.0 ) ) {
|
||||||
else
|
// on slopes disengage the brakes only if you actually intend to accelerate
|
||||||
mvOccupied->BrakeReleaser(0);
|
while( true == DecBrake() ) { ; } // jeśli przyspieszamy, to nie hamujemy
|
||||||
|
if( ( mvOccupied->BrakePress > 0.4 )
|
||||||
|
&& ( mvOccupied->Hamulec->GetCRP() > 4.9 ) ) {
|
||||||
|
// wyluzuj lokomotywę, to szybciej ruszymy
|
||||||
|
mvOccupied->BrakeReleaser( 1 );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if( mvOccupied->PipePress >= 3.0 ) {
|
||||||
|
// TODO: combine all releaser handling in single decision tree instead of having bits all over the place
|
||||||
|
mvOccupied->BrakeReleaser( 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// margines dla prędkości jest doliczany tylko jeśli oczekiwana prędkość jest
|
}
|
||||||
// większa od 5km/h
|
}
|
||||||
if (!(iDrivigFlags & movePress))
|
// margines dla prędkości jest doliczany tylko jeśli oczekiwana prędkość jest większa od 5km/h
|
||||||
{ // jeśli nie dociskanie
|
if( false == TestFlag( iDrivigFlags, movePress ) ) {
|
||||||
if (AccDesired < -0.1)
|
// jeśli nie dociskanie
|
||||||
while (DecSpeed())
|
if( AccDesired < -0.1 ) {
|
||||||
; // jeśli hamujemy, to nie przyspieszamy
|
while( true == DecSpeed() ) { ; } // jeśli hamujemy, to nie przyspieszamy
|
||||||
else if (((fAccGravity < -0.01) ? AccDesired < 0.0 :
|
}
|
||||||
AbsAccS > AccDesired) ||
|
else if( ( vel > VelDesired )
|
||||||
(vel > VelDesired)) // jak za bardzo przyspiesza albo prędkość
|
|| ( fAccGravity < -0.01 ?
|
||||||
// przekroczona
|
AccDesired < 0.0 :
|
||||||
|
AbsAccS > AccDesired ) ) {
|
||||||
|
// jak za bardzo przyspiesza albo prędkość przekroczona
|
||||||
DecSpeed(); // pojedyncze cofnięcie pozycji, bo na zero to przesada
|
DecSpeed(); // pojedyncze cofnięcie pozycji, bo na zero to przesada
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// yB: usunięte różne dziwne warunki, oddzielamy część zadającą od wykonawczej
|
// yB: usunięte różne dziwne warunki, oddzielamy część zadającą od wykonawczej
|
||||||
// zwiekszanie predkosci
|
// zwiekszanie predkosci
|
||||||
// Ra 2F1H: jest konflikt histerezy pomiędzy nastawioną pozycją a uzyskiwanym
|
// Ra 2F1H: jest konflikt histerezy pomiędzy nastawioną pozycją a uzyskiwanym
|
||||||
// przyspieszeniem - utrzymanie pozycji powoduje przekroczenie przyspieszenia
|
// przyspieszeniem - utrzymanie pozycji powoduje przekroczenie przyspieszenia
|
||||||
if (AbsAccS <
|
if( AbsAccS < AccDesired ) {
|
||||||
AccDesired) // jeśli przyspieszenie pojazdu jest mniejsze niż żądane oraz
|
// jeśli przyspieszenie pojazdu jest mniejsze niż żądane oraz
|
||||||
if (vel < VelDesired - fVelMinus) // jeśli prędkość w kierunku czoła jest
|
if( vel < VelDesired - fVelMinus ) {
|
||||||
// mniejsza od dozwolonej o margines
|
// jeśli prędkość w kierunku czoła jest mniejsza od dozwolonej o margines
|
||||||
if ((ActualProximityDist > fMaxProximityDist) ? true : (vel < VelNext))
|
if( ( ActualProximityDist > fMaxProximityDist ?
|
||||||
IncSpeed(); // to można przyspieszyć
|
true :
|
||||||
|
vel < VelNext ) ) {
|
||||||
|
// to można przyspieszyć
|
||||||
|
IncSpeed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// if ((AbsAccS<AccDesired)&&(vel<VelDesired))
|
// if ((AbsAccS<AccDesired)&&(vel<VelDesired))
|
||||||
// if (!MaxVelFlag) //Ra: to nie jest używane
|
// if (!MaxVelFlag) //Ra: to nie jest używane
|
||||||
// if (!IncSpeed()) //Ra: to tutaj jest bez sensu, bo nie dociągnie do
|
// if (!IncSpeed()) //Ra: to tutaj jest bez sensu, bo nie dociągnie do
|
||||||
|
|||||||
6
Driver.h
6
Driver.h
@@ -52,12 +52,10 @@ enum TMovementStatus
|
|||||||
moveGuardSignal = 0x8000, // sygnał od kierownika (minął czas postoju)
|
moveGuardSignal = 0x8000, // sygnał od kierownika (minął czas postoju)
|
||||||
moveVisibility = 0x10000, // jazda na widoczność po przejechaniu S1 na SBL
|
moveVisibility = 0x10000, // jazda na widoczność po przejechaniu S1 na SBL
|
||||||
moveDoorOpened = 0x20000, // drzwi zostały otwarte - doliczyć czas na zamknięcie
|
moveDoorOpened = 0x20000, // drzwi zostały otwarte - doliczyć czas na zamknięcie
|
||||||
movePushPull =
|
movePushPull = 0x40000, // zmiana czoła przez zmianę kabiny - nie odczepiać przy zmianie kierunku
|
||||||
0x40000, // zmiana czoła przez zmianę kabiny - nie odczepiać przy zmianie kierunku
|
|
||||||
moveSemaphorFound = 0x80000, // na drodze skanowania został znaleziony semafor
|
moveSemaphorFound = 0x80000, // na drodze skanowania został znaleziony semafor
|
||||||
moveSemaphorWasElapsed = 0x100000, // minięty został semafor
|
moveSemaphorWasElapsed = 0x100000, // minięty został semafor
|
||||||
moveTrainInsideStation =
|
moveTrainInsideStation = 0x200000, // pociąg między semaforem a rozjazdami lub następnym semaforem
|
||||||
0x200000, // pociąg między semaforem a rozjazdami lub następnym semaforem
|
|
||||||
moveSpeedLimitFound = 0x400000 // pociąg w ograniczeniu z podaną jego długością
|
moveSpeedLimitFound = 0x400000 // pociąg w ograniczeniu z podaną jego długością
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -4650,36 +4650,26 @@ double TMoverParameters::TractionForce(double dt)
|
|||||||
else
|
else
|
||||||
tmp = 4; // szybkie malenie, powolne wzrastanie
|
tmp = 4; // szybkie malenie, powolne wzrastanie
|
||||||
}
|
}
|
||||||
// if SlippingWheels then begin PosRatio:=0; tmp:=10; SandDoseOn;
|
|
||||||
// end;//przeciwposlizg
|
|
||||||
|
|
||||||
// if(Flat)then //PRZECIWPOŚLIZG
|
|
||||||
dmoment = eimv[eimv_Fful];
|
dmoment = eimv[eimv_Fful];
|
||||||
// else
|
|
||||||
// dmoment:=eimc[eimc_p_F0]*0.99;
|
|
||||||
// NOTE: the commands to operate the sandbox are likely to conflict with other similar ai decisions
|
// NOTE: the commands to operate the sandbox are likely to conflict with other similar ai decisions
|
||||||
// TODO: gather these in single place so they can be resolved together
|
// TODO: gather these in single place so they can be resolved together
|
||||||
if ((abs((PosRatio + 9.66 * dizel_fill) * dmoment * 100) >
|
if( ( std::abs( ( PosRatio + 9.66 * dizel_fill ) * dmoment * 100 ) > 0.95 * Adhesive( RunningTrack.friction ) * TotalMassxg ) ) {
|
||||||
0.95 * Adhesive(RunningTrack.friction) * TotalMassxg))
|
|
||||||
{
|
|
||||||
PosRatio = 0;
|
PosRatio = 0;
|
||||||
tmp = 4;
|
tmp = 4;
|
||||||
Sandbox( true, range::local );
|
|
||||||
} // przeciwposlizg
|
} // przeciwposlizg
|
||||||
if ((abs((PosRatio + 9.80 * dizel_fill) * dmoment * 100) >
|
if( ( std::abs( ( PosRatio + 9.80 * dizel_fill ) * dmoment * 100 ) > 0.95 * Adhesive( RunningTrack.friction ) * TotalMassxg ) ) {
|
||||||
0.95 * Adhesive(RunningTrack.friction) * TotalMassxg))
|
PosRatio = 0;
|
||||||
{
|
tmp = 9;
|
||||||
|
} // przeciwposlizg
|
||||||
|
if( ( SlippingWheels ) ) {
|
||||||
PosRatio = 0;
|
PosRatio = 0;
|
||||||
tmp = 9;
|
tmp = 9;
|
||||||
Sandbox( true, range::local );
|
Sandbox( true, range::local );
|
||||||
} // przeciwposlizg
|
} // przeciwposlizg
|
||||||
if ((SlippingWheels))
|
else {
|
||||||
{
|
// switch sandbox off
|
||||||
// PosRatio = -PosRatio * 0; // serio -0 ???
|
Sandbox( false, range::local );
|
||||||
PosRatio = 0;
|
}
|
||||||
tmp = 9;
|
|
||||||
Sandbox( true, range::local );
|
|
||||||
} // przeciwposlizg
|
|
||||||
|
|
||||||
dizel_fill += Max0R(Min0R(PosRatio - dizel_fill, 0.1), -0.1) * 2 *
|
dizel_fill += Max0R(Min0R(PosRatio - dizel_fill, 0.1), -0.1) * 2 *
|
||||||
(tmp /*2{+4*byte(PosRatio<dizel_fill)*/) *
|
(tmp /*2{+4*byte(PosRatio<dizel_fill)*/) *
|
||||||
|
|||||||
@@ -48,40 +48,30 @@ std::string Now() {
|
|||||||
return converter.str();
|
return converter.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TestFlag(int Flag, int Value)
|
bool SetFlag( int &Flag, int const Value ) {
|
||||||
{
|
|
||||||
if ((Flag & Value) == Value)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SetFlag(int &Flag, int Value) {
|
if( Value > 0 ) {
|
||||||
|
if( false == TestFlag( Flag, Value ) ) {
|
||||||
if (Value > 0)
|
|
||||||
{
|
|
||||||
if ((Flag & Value) == 0)
|
|
||||||
{
|
|
||||||
Flag |= Value;
|
Flag |= Value;
|
||||||
return true; // true, gdy było wcześniej 0 i zostało ustawione
|
return true; // true, gdy było wcześniej 0 i zostało ustawione
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (Value < 0)
|
else if( Value < 0 ) {
|
||||||
{
|
// Value jest ujemne, czyli zerowanie flagi
|
||||||
Value = abs(Value);
|
return ClearFlag( Flag, -Value );
|
||||||
if ((Flag & Value) == Value)
|
|
||||||
{
|
|
||||||
Flag &= ~Value; // Value jest ujemne, czyli zerowanie flagi
|
|
||||||
return true; // true, gdy było wcześniej 1 i zostało wyzerowane
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UnSetFlag(int &Flag, int Value)
|
bool ClearFlag( int &Flag, int const Value ) {
|
||||||
{
|
|
||||||
Flag &= ~Value;
|
if( true == TestFlag( Flag, Value ) ) {
|
||||||
return true;
|
Flag &= ~Value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline double Random(double a, double b)
|
inline double Random(double a, double b)
|
||||||
|
|||||||
@@ -63,9 +63,9 @@ inline double BorlandTime()
|
|||||||
std::string Now();
|
std::string Now();
|
||||||
|
|
||||||
/*funkcje logiczne*/
|
/*funkcje logiczne*/
|
||||||
bool TestFlag(int Flag, int Value);
|
inline bool TestFlag( int const Flag, int const Value ) { return ( ( Flag & Value ) == Value ); }
|
||||||
bool SetFlag( int & Flag, int Value);
|
bool SetFlag( int &Flag, int const Value);
|
||||||
bool UnSetFlag(int &Flag, int Value);
|
bool ClearFlag(int &Flag, int const Value);
|
||||||
|
|
||||||
bool FuzzyLogic(double Test, double Threshold, double Probability);
|
bool FuzzyLogic(double Test, double Threshold, double Probability);
|
||||||
/*jesli Test>Threshold to losowanie*/
|
/*jesli Test>Threshold to losowanie*/
|
||||||
|
|||||||
16
World.cpp
16
World.cpp
@@ -1536,23 +1536,23 @@ TWorld::Update_UI() {
|
|||||||
*/
|
*/
|
||||||
if( tmp->Mechanik ) {
|
if( tmp->Mechanik ) {
|
||||||
// o ile jest ktoś w środku
|
// o ile jest ktoś w środku
|
||||||
std::string flags = "bwaccmlshhhoibsgvdp; "; // flagi AI (definicja w Driver.h)
|
std::string flags = "cpapcplhhndoiefgvdpseil "; // flagi AI (definicja w Driver.h)
|
||||||
for( int i = 0, j = 1; i < 19; ++i, j <<= 1 )
|
for( int i = 0, j = 1; i < 23; ++i, j <<= 1 )
|
||||||
if( tmp->Mechanik->DrivigFlags() & j ) // jak bit ustawiony
|
if( false == ( tmp->Mechanik->DrivigFlags() & j ) ) // jak bit ustawiony
|
||||||
flags[ i + 1 ] = std::toupper( flags[ i + 1 ] ); // ^= 0x20; // to zmiana na wielką literę
|
flags[ i ] = '.';// std::toupper( flags[ i ] ); // ^= 0x20; // to zmiana na wielką literę
|
||||||
|
|
||||||
uitextline4 = flags;
|
uitextline4 = flags;
|
||||||
|
|
||||||
uitextline4 +=
|
uitextline4 +=
|
||||||
"Driver: Vd=" + to_string( tmp->Mechanik->VelDesired, 0 )
|
"Driver: Vd=" + to_string( tmp->Mechanik->VelDesired, 0 )
|
||||||
+ " ad=" + to_string( tmp->Mechanik->AccDesired, 2 )
|
+ " Ad=" + to_string( tmp->Mechanik->AccDesired, 2 )
|
||||||
+ " ah=" + to_string(tmp->Mechanik->fAccThreshold, 2)
|
+ " Ah=" + to_string(tmp->Mechanik->fAccThreshold, 2)
|
||||||
+ "@" + to_string(tmp->Mechanik->fBrake_a0[0], 2)
|
+ "@" + to_string(tmp->Mechanik->fBrake_a0[0], 2)
|
||||||
+ "+" + to_string(tmp->Mechanik->fBrake_a1[0], 2)
|
+ "+" + to_string(tmp->Mechanik->fBrake_a1[0], 2)
|
||||||
+ " Pd=" + to_string( tmp->Mechanik->ActualProximityDist, 0 )
|
+ " Pd=" + to_string( tmp->Mechanik->ActualProximityDist, 0 )
|
||||||
+ " Vn=" + to_string( tmp->Mechanik->VelNext, 0 )
|
+ " Vn=" + to_string( tmp->Mechanik->VelNext, 0 )
|
||||||
+ " VSm=" + to_string( tmp->Mechanik->VelSignalLast, 0 )
|
+ " VSl=" + to_string( tmp->Mechanik->VelSignalLast, 0 )
|
||||||
+ " VLm=" + to_string( tmp->Mechanik->VelLimitLast, 0 )
|
+ " VLl=" + to_string( tmp->Mechanik->VelLimitLast, 0 )
|
||||||
+ " VRd=" + to_string( tmp->Mechanik->VelRoad, 0 );
|
+ " VRd=" + to_string( tmp->Mechanik->VelRoad, 0 );
|
||||||
|
|
||||||
if( ( tmp->Mechanik->VelNext == 0.0 )
|
if( ( tmp->Mechanik->VelNext == 0.0 )
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<LocalDebuggerWorkingDirectory>D:\MaSzyna</LocalDebuggerWorkingDirectory>
|
<LocalDebuggerWorkingDirectory>..\..\..\development\maszyna</LocalDebuggerWorkingDirectory>
|
||||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||||
<LocalDebuggerCommandArguments>
|
<LocalDebuggerCommandArguments>
|
||||||
</LocalDebuggerCommandArguments>
|
</LocalDebuggerCommandArguments>
|
||||||
|
|||||||
10
renderer.cpp
10
renderer.cpp
@@ -572,11 +572,13 @@ opengl_renderer::Render_reflections() {
|
|||||||
|
|
||||||
auto const &time = simulation::Time.data();
|
auto const &time = simulation::Time.data();
|
||||||
auto const timestamp = time.wDay * 60 * 24 + time.wHour * 60 + time.wMinute;
|
auto const timestamp = time.wDay * 60 * 24 + time.wHour * 60 + time.wMinute;
|
||||||
if( timestamp - m_environmenttimestamp < 5 ) {
|
if( ( timestamp - m_environmentupdatetime < 5 )
|
||||||
// run update every 5+ mins of simulation time
|
&& ( glm::length( m_renderpass.camera.position() - m_environmentupdatelocation ) < 1000.0 ) ) {
|
||||||
|
// run update every 5+ mins of simulation time, or at least 1km from the last location
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
m_environmenttimestamp = timestamp;
|
m_environmentupdatetime = timestamp;
|
||||||
|
m_environmentupdatelocation = m_renderpass.camera.position();
|
||||||
|
|
||||||
::glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_environmentframebuffer );
|
::glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_environmentframebuffer );
|
||||||
::glViewport( 0, 0, EU07_ENVIRONMENTBUFFERSIZE, EU07_ENVIRONMENTBUFFERSIZE );
|
::glViewport( 0, 0, EU07_ENVIRONMENTBUFFERSIZE, EU07_ENVIRONMENTBUFFERSIZE );
|
||||||
@@ -655,7 +657,7 @@ opengl_renderer::setup_pass( renderpass_config &Config, rendermode const Mode, f
|
|||||||
auto const lightvector =
|
auto const lightvector =
|
||||||
glm::normalize( glm::vec3{
|
glm::normalize( glm::vec3{
|
||||||
Global::DayLight.direction.x,
|
Global::DayLight.direction.x,
|
||||||
std::min( Global::DayLight.direction.y, -0.15f ),
|
std::min( Global::DayLight.direction.y, -0.2f ),
|
||||||
Global::DayLight.direction.z } );
|
Global::DayLight.direction.z } );
|
||||||
// ...place the light source at the calculated centre and setup world space light view matrix...
|
// ...place the light source at the calculated centre and setup world space light view matrix...
|
||||||
camera.position() = worldview.camera.position() + glm::dvec3{ frustumchunkcentre };
|
camera.position() = worldview.camera.position() + glm::dvec3{ frustumchunkcentre };
|
||||||
|
|||||||
@@ -341,7 +341,8 @@ private:
|
|||||||
GLuint m_environmentdepthbuffer { NULL };
|
GLuint m_environmentdepthbuffer { NULL };
|
||||||
bool m_environmentcubetexturesupport { false }; // indicates whether we can use the dynamic environment cube map
|
bool m_environmentcubetexturesupport { false }; // indicates whether we can use the dynamic environment cube map
|
||||||
int m_environmentcubetextureface { NULL }; // helper, currently processed cube map face
|
int m_environmentcubetextureface { NULL }; // helper, currently processed cube map face
|
||||||
int m_environmenttimestamp { 0 }; // time of the most recent environment map update
|
int m_environmentupdatetime { 0 }; // time of the most recent environment map update
|
||||||
|
glm::dvec3 m_environmentupdatelocation; // coordinates of most recent environment map update
|
||||||
|
|
||||||
int m_helpertextureunit { GL_TEXTURE0 };
|
int m_helpertextureunit { GL_TEXTURE0 };
|
||||||
int m_shadowtextureunit { GL_TEXTURE1 };
|
int m_shadowtextureunit { GL_TEXTURE1 };
|
||||||
|
|||||||
Reference in New Issue
Block a user