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