mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 22:09:19 +02:00
build 181010. ai disconnect logic tweak, fog-driven freespot blur
This commit is contained in:
251
Driver.cpp
251
Driver.cpp
@@ -4262,123 +4262,6 @@ TController::UpdateSituation(double dt) {
|
|||||||
fMaxProximityDist = 10.0; //[m]
|
fMaxProximityDist = 10.0; //[m]
|
||||||
fVelPlus = 1.0; // dopuszczalne przekroczenie prędkości na ograniczeniu bez hamowania
|
fVelPlus = 1.0; // dopuszczalne przekroczenie prędkości na ograniczeniu bez hamowania
|
||||||
fVelMinus = 0.5; // margines prędkości powodujący załączenie napędu
|
fVelMinus = 0.5; // margines prędkości powodujący załączenie napędu
|
||||||
if (AIControllFlag) {
|
|
||||||
if (iVehicleCount >= 0) {
|
|
||||||
// jeśli była podana ilość wagonów
|
|
||||||
if (iDrivigFlags & movePress) {
|
|
||||||
// jeśli dociskanie w celu odczepienia
|
|
||||||
// 3. faza odczepiania.
|
|
||||||
SetVelocity(2, 0); // jazda w ustawionym kierunku z prędkością 2
|
|
||||||
if ((mvControlling->MainCtrlPos > 0) ||
|
|
||||||
(mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic)) // jeśli jazda
|
|
||||||
{
|
|
||||||
WriteLog(mvOccupied->Name + " odczepianie w kierunku " + std::to_string(mvOccupied->DirAbsolute));
|
|
||||||
TDynamicObject *p =
|
|
||||||
pVehicle; // pojazd do odczepienia, w (pVehicle) siedzi AI
|
|
||||||
int d; // numer sprzęgu, który sprawdzamy albo odczepiamy
|
|
||||||
int n = iVehicleCount; // ile wagonów ma zostać
|
|
||||||
do
|
|
||||||
{ // szukanie pojazdu do odczepienia
|
|
||||||
d = p->DirectionGet() > 0 ?
|
|
||||||
0 :
|
|
||||||
1; // numer sprzęgu od strony czoła składu
|
|
||||||
// if (p->MoverParameters->Couplers[d].CouplerType==Articulated)
|
|
||||||
// //jeśli sprzęg typu wózek (za mało)
|
|
||||||
if (p->MoverParameters->Couplers[d].CouplingFlag &
|
|
||||||
ctrain_depot) // jeżeli sprzęg zablokowany
|
|
||||||
// if (p->GetTrack()->) //a nie stoi na torze warsztatowym
|
|
||||||
// (ustalić po czym poznać taki tor)
|
|
||||||
++n; // to liczymy człony jako jeden
|
|
||||||
p->MoverParameters->BrakeReleaser(1); // wyluzuj pojazd, aby dało się dopychać
|
|
||||||
p->MoverParameters->BrakeLevelSet(0); // hamulec na zero, aby nie hamował
|
|
||||||
if (n)
|
|
||||||
{ // jeśli jeszcze nie koniec
|
|
||||||
p = p->Prev(); // kolejny w stronę czoła składu (licząc od
|
|
||||||
// tyłu), bo dociskamy
|
|
||||||
if (!p)
|
|
||||||
iVehicleCount = -2,
|
|
||||||
n = 0; // nie ma co dalej sprawdzać, doczepianie zakończone
|
|
||||||
}
|
|
||||||
} while (n--);
|
|
||||||
if( p ? p->MoverParameters->Couplers[ d ].CouplingFlag == coupling::faux : true ) {
|
|
||||||
// no target, or already just virtual coupling
|
|
||||||
WriteLog( mvOccupied->Name + " didn't find anything to disconnect." );
|
|
||||||
iVehicleCount = -2; // odczepiono, co było do odczepienia
|
|
||||||
} else if ( p->Dettach(d) == coupling::faux ) {
|
|
||||||
// tylko jeśli odepnie
|
|
||||||
WriteLog( mvOccupied->Name + " odczepiony." );
|
|
||||||
iVehicleCount = -2;
|
|
||||||
} // a jak nie, to dociskać dalej
|
|
||||||
}
|
|
||||||
if (iVehicleCount >= 0) // zmieni się po odczepieniu
|
|
||||||
if (!mvOccupied->DecLocalBrakeLevel(1))
|
|
||||||
{ // dociśnij sklad
|
|
||||||
WriteLog( mvOccupied->Name + " dociskanie..." );
|
|
||||||
// mvOccupied->BrakeReleaser(); //wyluzuj lokomotywę
|
|
||||||
// Ready=true; //zamiast sprawdzenia odhamowania całego składu
|
|
||||||
IncSpeed(); // dla (Ready)==false nie ruszy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((mvOccupied->Vel < 0.01) && !(iDrivigFlags & movePress))
|
|
||||||
{ // 2. faza odczepiania: zmień kierunek na przeciwny i dociśnij
|
|
||||||
// za radą yB ustawiamy pozycję 3 kranu (ruszanie kranem w innych miejscach
|
|
||||||
// powino zostać wyłączone)
|
|
||||||
// WriteLog("Zahamowanie składu");
|
|
||||||
mvOccupied->BrakeLevelSet(
|
|
||||||
mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic ?
|
|
||||||
1 :
|
|
||||||
3 );
|
|
||||||
double p = mvOccupied->BrakePressureActual.PipePressureVal;
|
|
||||||
if( p < 3.9 ) {
|
|
||||||
// tu może być 0 albo -1 nawet
|
|
||||||
// TODO: zabezpieczenie przed dziwnymi CHK do czasu wyjaśnienia sensu 0 oraz -1 w tym miejscu
|
|
||||||
p = 3.9;
|
|
||||||
}
|
|
||||||
if (mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic ?
|
|
||||||
mvOccupied->BrakePress > 2 :
|
|
||||||
mvOccupied->PipePress < p + 0.1)
|
|
||||||
{ // jeśli w miarę został zahamowany (ciśnienie mniejsze niż podane na
|
|
||||||
// pozycji 3, zwyle 0.37)
|
|
||||||
if (mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic)
|
|
||||||
mvOccupied->BrakeLevelSet(0); // wyłączenie EP, gdy wystarczy (może
|
|
||||||
// nie być potrzebne, bo na początku
|
|
||||||
// jest)
|
|
||||||
WriteLog("Luzowanie lokomotywy i zmiana kierunku");
|
|
||||||
mvOccupied->BrakeReleaser(1); // wyluzuj lokomotywę; a ST45?
|
|
||||||
mvOccupied->DecLocalBrakeLevel(LocalBrakePosNo); // zwolnienie hamulca
|
|
||||||
iDrivigFlags |= movePress; // następnie będzie dociskanie
|
|
||||||
DirectionForward(mvOccupied->ActiveDir < 0); // zmiana kierunku jazdy na przeciwny (dociskanie)
|
|
||||||
CheckVehicles(); // od razu zmienić światła (zgasić) - bez tego się nie odczepi
|
|
||||||
/*
|
|
||||||
// NOTE: disabled to prevent closing the door before passengers can disembark
|
|
||||||
fStopTime = 0.0; // nie ma na co czekać z odczepianiem
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if( mvOccupied->Vel > 0.01 ) {
|
|
||||||
// 1st phase(?)
|
|
||||||
// bring it to stop if it's not already stopped
|
|
||||||
SetVelocity( 0, 0, stopJoin ); // wyłączyć przyspieszanie
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // odczepiania
|
|
||||||
else // to poniżej jeśli ilość wagonów ujemna
|
|
||||||
if (iDrivigFlags & movePress)
|
|
||||||
{ // 4. faza odczepiania: zwolnij i zmień kierunek
|
|
||||||
SetVelocity(0, 0, stopJoin); // wyłączyć przyspieszanie
|
|
||||||
if (!DecSpeed()) // jeśli już bardziej wyłączyć się nie da
|
|
||||||
{ // ponowna zmiana kierunku
|
|
||||||
WriteLog( mvOccupied->Name + " ponowna zmiana kierunku" );
|
|
||||||
DirectionForward(mvOccupied->ActiveDir < 0); // zmiana kierunku jazdy na właściwy
|
|
||||||
iDrivigFlags &= ~movePress; // koniec dociskania
|
|
||||||
JumpToNextOrder(); // zmieni światła
|
|
||||||
TableClear(); // skanowanie od nowa
|
|
||||||
iDrivigFlags &= ~moveStartHorn; // bez trąbienia przed ruszeniem
|
|
||||||
SetVelocity(fShuntVelocity, fShuntVelocity); // ustawienie prędkości jazdy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Shunt: {
|
case Shunt: {
|
||||||
@@ -4593,10 +4476,13 @@ TController::UpdateSituation(double dt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ustalanie zadanej predkosci
|
// ustalanie zadanej predkosci
|
||||||
if (iDrivigFlags & moveActive) // jeśli może skanować sygnały i reagować na komendy
|
if (iDrivigFlags & moveActive) {
|
||||||
{ // jeśli jest wybrany kierunek jazdy, można ustalić prędkość jazdy
|
|
||||||
// Ra: tu by jeszcze trzeba było wstawić uzależnienie (VelDesired) od odległości od
|
SetDriverPsyche(); // ustawia AccPreferred (potrzebne tu?)
|
||||||
// przeszkody
|
|
||||||
|
// jeśli może skanować sygnały i reagować na komendy
|
||||||
|
// jeśli jest wybrany kierunek jazdy, można ustalić prędkość jazdy
|
||||||
|
// Ra: tu by jeszcze trzeba było wstawić uzależnienie (VelDesired) od odległości od przeszkody
|
||||||
// no chyba żeby to uwzgldnić już w (ActualProximityDist)
|
// no chyba żeby to uwzgldnić już w (ActualProximityDist)
|
||||||
VelDesired = fVelMax; // wstępnie prędkość maksymalna dla pojazdu(-ów), będzie
|
VelDesired = fVelMax; // wstępnie prędkość maksymalna dla pojazdu(-ów), będzie
|
||||||
// następnie ograniczana
|
// następnie ograniczana
|
||||||
@@ -4605,9 +4491,6 @@ TController::UpdateSituation(double dt) {
|
|||||||
// jeśli ma rozkład i ograniczenie w rozkładzie to nie przekraczać rozkladowej
|
// jeśli ma rozkład i ograniczenie w rozkładzie to nie przekraczać rozkladowej
|
||||||
VelDesired = min_speed( VelDesired, TrainParams->TTVmax );
|
VelDesired = min_speed( VelDesired, TrainParams->TTVmax );
|
||||||
}
|
}
|
||||||
|
|
||||||
SetDriverPsyche(); // ustawia AccPreferred (potrzebne tu?)
|
|
||||||
|
|
||||||
// szukanie optymalnych wartości
|
// szukanie optymalnych wartości
|
||||||
AccDesired = AccPreferred; // AccPreferred wynika z osobowości mechanika
|
AccDesired = AccPreferred; // AccPreferred wynika z osobowości mechanika
|
||||||
VelNext = VelDesired; // maksymalna prędkość wynikająca z innych czynników niż trajektoria ruchu
|
VelNext = VelDesired; // maksymalna prędkość wynikająca z innych czynników niż trajektoria ruchu
|
||||||
@@ -4655,6 +4538,126 @@ TController::UpdateSituation(double dt) {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// disconnect mode potentially overrides scan results
|
||||||
|
// TBD: when in this mode skip scanning altogether?
|
||||||
|
if( ( OrderCurrentGet() & Disconnect ) != 0 ) {
|
||||||
|
|
||||||
|
if (AIControllFlag) {
|
||||||
|
if (iVehicleCount >= 0) {
|
||||||
|
// jeśli była podana ilość wagonów
|
||||||
|
if (iDrivigFlags & movePress) {
|
||||||
|
// jeśli dociskanie w celu odczepienia
|
||||||
|
// 3. faza odczepiania.
|
||||||
|
SetVelocity(2, 0); // jazda w ustawionym kierunku z prędkością 2
|
||||||
|
if ((mvControlling->MainCtrlPos > 0) ||
|
||||||
|
(mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic)) // jeśli jazda
|
||||||
|
{
|
||||||
|
WriteLog(mvOccupied->Name + " odczepianie w kierunku " + std::to_string(mvOccupied->DirAbsolute));
|
||||||
|
TDynamicObject *p =
|
||||||
|
pVehicle; // pojazd do odczepienia, w (pVehicle) siedzi AI
|
||||||
|
int d; // numer sprzęgu, który sprawdzamy albo odczepiamy
|
||||||
|
int n = iVehicleCount; // ile wagonów ma zostać
|
||||||
|
do
|
||||||
|
{ // szukanie pojazdu do odczepienia
|
||||||
|
d = p->DirectionGet() > 0 ?
|
||||||
|
0 :
|
||||||
|
1; // numer sprzęgu od strony czoła składu
|
||||||
|
// if (p->MoverParameters->Couplers[d].CouplerType==Articulated)
|
||||||
|
// //jeśli sprzęg typu wózek (za mało)
|
||||||
|
if (p->MoverParameters->Couplers[d].CouplingFlag & ctrain_depot) // jeżeli sprzęg zablokowany
|
||||||
|
// if (p->GetTrack()->) //a nie stoi na torze warsztatowym
|
||||||
|
// (ustalić po czym poznać taki tor)
|
||||||
|
++n; // to liczymy człony jako jeden
|
||||||
|
p->MoverParameters->BrakeReleaser(1); // wyluzuj pojazd, aby dało się dopychać
|
||||||
|
p->MoverParameters->BrakeLevelSet(0); // hamulec na zero, aby nie hamował
|
||||||
|
if (n)
|
||||||
|
{ // jeśli jeszcze nie koniec
|
||||||
|
p = p->Prev(); // kolejny w stronę czoła składu (licząc od
|
||||||
|
// tyłu), bo dociskamy
|
||||||
|
if (!p)
|
||||||
|
iVehicleCount = -2,
|
||||||
|
n = 0; // nie ma co dalej sprawdzać, doczepianie zakończone
|
||||||
|
}
|
||||||
|
} while (n--);
|
||||||
|
if( p ? p->MoverParameters->Couplers[ d ].CouplingFlag == coupling::faux : true ) {
|
||||||
|
// no target, or already just virtual coupling
|
||||||
|
WriteLog( mvOccupied->Name + " didn't find anything to disconnect." );
|
||||||
|
iVehicleCount = -2; // odczepiono, co było do odczepienia
|
||||||
|
} else if ( p->Dettach(d) == coupling::faux ) {
|
||||||
|
// tylko jeśli odepnie
|
||||||
|
WriteLog( mvOccupied->Name + " odczepiony." );
|
||||||
|
iVehicleCount = -2;
|
||||||
|
} // a jak nie, to dociskać dalej
|
||||||
|
}
|
||||||
|
if (iVehicleCount >= 0) // zmieni się po odczepieniu
|
||||||
|
if (!mvOccupied->DecLocalBrakeLevel(1))
|
||||||
|
{ // dociśnij sklad
|
||||||
|
WriteLog( mvOccupied->Name + " dociskanie..." );
|
||||||
|
// mvOccupied->BrakeReleaser(); //wyluzuj lokomotywę
|
||||||
|
// Ready=true; //zamiast sprawdzenia odhamowania całego składu
|
||||||
|
IncSpeed(); // dla (Ready)==false nie ruszy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((mvOccupied->Vel < 0.01) && !(iDrivigFlags & movePress))
|
||||||
|
{ // 2. faza odczepiania: zmień kierunek na przeciwny i dociśnij
|
||||||
|
// za radą yB ustawiamy pozycję 3 kranu (ruszanie kranem w innych miejscach
|
||||||
|
// powino zostać wyłączone)
|
||||||
|
// WriteLog("Zahamowanie składu");
|
||||||
|
mvOccupied->BrakeLevelSet(
|
||||||
|
mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic ?
|
||||||
|
1 :
|
||||||
|
3 );
|
||||||
|
double p = mvOccupied->BrakePressureActual.PipePressureVal;
|
||||||
|
if( p < 3.9 ) {
|
||||||
|
// tu może być 0 albo -1 nawet
|
||||||
|
// TODO: zabezpieczenie przed dziwnymi CHK do czasu wyjaśnienia sensu 0 oraz -1 w tym miejscu
|
||||||
|
p = 3.9;
|
||||||
|
}
|
||||||
|
if (mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic ?
|
||||||
|
mvOccupied->BrakePress > 2 :
|
||||||
|
mvOccupied->PipePress < p + 0.1)
|
||||||
|
{ // jeśli w miarę został zahamowany (ciśnienie mniejsze niż podane na
|
||||||
|
// pozycji 3, zwyle 0.37)
|
||||||
|
if (mvOccupied->BrakeSystem == TBrakeSystem::ElectroPneumatic)
|
||||||
|
mvOccupied->BrakeLevelSet(0); // wyłączenie EP, gdy wystarczy (może
|
||||||
|
// nie być potrzebne, bo na początku jest)
|
||||||
|
WriteLog("Luzowanie lokomotywy i zmiana kierunku");
|
||||||
|
mvOccupied->BrakeReleaser(1); // wyluzuj lokomotywę; a ST45?
|
||||||
|
mvOccupied->DecLocalBrakeLevel(LocalBrakePosNo); // zwolnienie hamulca
|
||||||
|
iDrivigFlags |= movePress; // następnie będzie dociskanie
|
||||||
|
DirectionForward(mvOccupied->ActiveDir < 0); // zmiana kierunku jazdy na przeciwny (dociskanie)
|
||||||
|
CheckVehicles(); // od razu zmienić światła (zgasić) - bez tego się nie odczepi
|
||||||
|
/*
|
||||||
|
// NOTE: disabled to prevent closing the door before passengers can disembark
|
||||||
|
fStopTime = 0.0; // nie ma na co czekać z odczepianiem
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if( mvOccupied->Vel > 0.01 ) {
|
||||||
|
// 1st phase(?)
|
||||||
|
// bring it to stop if it's not already stopped
|
||||||
|
SetVelocity( 0, 0, stopJoin ); // wyłączyć przyspieszanie
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // odczepiania
|
||||||
|
else // to poniżej jeśli ilość wagonów ujemna
|
||||||
|
if (iDrivigFlags & movePress)
|
||||||
|
{ // 4. faza odczepiania: zwolnij i zmień kierunek
|
||||||
|
SetVelocity(0, 0, stopJoin); // wyłączyć przyspieszanie
|
||||||
|
if (!DecSpeed()) // jeśli już bardziej wyłączyć się nie da
|
||||||
|
{ // ponowna zmiana kierunku
|
||||||
|
WriteLog( mvOccupied->Name + " ponowna zmiana kierunku" );
|
||||||
|
DirectionForward(mvOccupied->ActiveDir < 0); // zmiana kierunku jazdy na właściwy
|
||||||
|
iDrivigFlags &= ~movePress; // koniec dociskania
|
||||||
|
JumpToNextOrder(); // zmieni światła
|
||||||
|
TableClear(); // skanowanie od nowa
|
||||||
|
iDrivigFlags &= ~moveStartHorn; // bez trąbienia przed ruszeniem
|
||||||
|
SetVelocity(fShuntVelocity, fShuntVelocity); // ustawienie prędkości jazdy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( true == TestFlag( OrderList[ OrderPos ], Change_direction ) ) {
|
if( true == TestFlag( OrderList[ OrderPos ], Change_direction ) ) {
|
||||||
// if ordered to change direction, try to stop
|
// if ordered to change direction, try to stop
|
||||||
|
|||||||
66
renderer.cpp
66
renderer.cpp
@@ -1058,9 +1058,9 @@ opengl_renderer::setup_drawing( bool const Alpha ) {
|
|||||||
// setup fog
|
// setup fog
|
||||||
if( Global.fFogEnd > 0 ) {
|
if( Global.fFogEnd > 0 ) {
|
||||||
// fog setup
|
// fog setup
|
||||||
auto const adjustedfogrange { Global.fFogEnd / std::max( 1.f, Global.Overcast * 2.f ) };
|
m_fogrange = Global.fFogEnd / std::max( 1.f, Global.Overcast * 2.f );
|
||||||
::glFogfv( GL_FOG_COLOR, glm::value_ptr( Global.FogColor ) );
|
::glFogfv( GL_FOG_COLOR, glm::value_ptr( Global.FogColor ) );
|
||||||
::glFogf( GL_FOG_DENSITY, static_cast<GLfloat>( 1.0 / adjustedfogrange ) );
|
::glFogf( GL_FOG_DENSITY, static_cast<GLfloat>( 1.0 / m_fogrange ) );
|
||||||
::glEnable( GL_FOG );
|
::glEnable( GL_FOG );
|
||||||
}
|
}
|
||||||
else { ::glDisable( GL_FOG ); }
|
else { ::glDisable( GL_FOG ); }
|
||||||
@@ -2549,44 +2549,65 @@ opengl_renderer::Render( TSubModel *Submodel ) {
|
|||||||
float const anglefactor = clamp(
|
float const anglefactor = clamp(
|
||||||
( Submodel->fCosViewAngle - Submodel->fCosFalloffAngle ) / ( Submodel->fCosHotspotAngle - Submodel->fCosFalloffAngle ),
|
( Submodel->fCosViewAngle - Submodel->fCosFalloffAngle ) / ( Submodel->fCosHotspotAngle - Submodel->fCosFalloffAngle ),
|
||||||
0.f, 1.f );
|
0.f, 1.f );
|
||||||
// distance attenuation. NOTE: since it's fixed pipeline with built-in gamma correction we're using linear attenuation
|
lightlevel *= anglefactor;
|
||||||
// we're capping how much effect the distance attenuation can have, otherwise the lights get too tiny at regular distances
|
float const precipitationfactor { interpolate( 1.f, 0.25f, clamp( Global.Overcast * 0.75f - 0.5f, 0.f, 1.f ) ) };
|
||||||
float const distancefactor { std::max( 0.5f, ( Submodel->fSquareMaxDist - TSubModel::fSquareDist ) / Submodel->fSquareMaxDist ) };
|
lightlevel *= precipitationfactor;
|
||||||
float const precipitationfactor { std::max( 1.f, 0.5f * ( Global.Overcast - 1.f ) ) };
|
|
||||||
|
|
||||||
if( lightlevel > 0.f ) {
|
if( lightlevel > 0.f ) {
|
||||||
// material configuration:
|
// distance attenuation. NOTE: since it's fixed pipeline with built-in gamma correction we're using linear attenuation
|
||||||
::glPushAttrib( GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_POINT_BIT );
|
// we're capping how much effect the distance attenuation can have, otherwise the lights get too tiny at regular distances
|
||||||
|
float const distancefactor { std::max( 0.5f, ( Submodel->fSquareMaxDist - TSubModel::fSquareDist ) / Submodel->fSquareMaxDist ) };
|
||||||
|
auto const pointsize { std::max( 3.f, 5.f * distancefactor * anglefactor ) };
|
||||||
|
|
||||||
|
// material configuration:
|
||||||
Bind_Material( null_handle );
|
Bind_Material( null_handle );
|
||||||
::glPointSize( std::max( 3.f, 5.f * distancefactor * anglefactor ) );
|
// limit impact of dense fog on the lights
|
||||||
::glColor4f( Submodel->f4Diffuse[ 0 ], Submodel->f4Diffuse[ 1 ], Submodel->f4Diffuse[ 2 ], Submodel->fVisible * std::min( 1.f, lightlevel * anglefactor * precipitationfactor ) );
|
::glFogf( GL_FOG_DENSITY, static_cast<GLfloat>( 1.0 / std::min<float>( Global.fFogEnd, m_fogrange * 2 ) ) );
|
||||||
|
|
||||||
|
::glPushAttrib( GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_POINT_BIT );
|
||||||
::glDisable( GL_LIGHTING );
|
::glDisable( GL_LIGHTING );
|
||||||
::glDisable( GL_FOG );
|
|
||||||
::glEnable( GL_BLEND );
|
::glEnable( GL_BLEND );
|
||||||
::glAlphaFunc( GL_GREATER, 0.f );
|
::glAlphaFunc( GL_GREATER, 0.f );
|
||||||
|
|
||||||
::glPushMatrix();
|
::glPushMatrix();
|
||||||
::glLoadIdentity();
|
::glLoadIdentity();
|
||||||
::glTranslatef( lightcenter.x, lightcenter.y, lightcenter.z ); // początek układu zostaje bez zmian
|
::glTranslatef( lightcenter.x, lightcenter.y, lightcenter.z ); // początek układu zostaje bez zmian
|
||||||
/*
|
|
||||||
setup_shadow_color( colors::white );
|
|
||||||
*/
|
|
||||||
auto const unitstate = m_unitstate;
|
auto const unitstate = m_unitstate;
|
||||||
switch_units( m_unitstate.diffuse, false, false );
|
switch_units( m_unitstate.diffuse, false, false );
|
||||||
|
|
||||||
// main draw call
|
// main draw call
|
||||||
|
if( Global.Overcast > 1.f ) {
|
||||||
|
// fake fog halo
|
||||||
|
float const fogfactor {
|
||||||
|
interpolate(
|
||||||
|
2.f, 1.f,
|
||||||
|
clamp<float>( Global.fFogEnd / 2000, 0.f, 1.f ) )
|
||||||
|
* std::max( 1.f, Global.Overcast ) };
|
||||||
|
::glPointSize( pointsize * fogfactor );
|
||||||
|
::glColor4f(
|
||||||
|
Submodel->f4Diffuse[ 0 ],
|
||||||
|
Submodel->f4Diffuse[ 1 ],
|
||||||
|
Submodel->f4Diffuse[ 2 ],
|
||||||
|
Submodel->fVisible * std::min( 1.f, lightlevel ) * 0.5f );
|
||||||
|
::glDepthMask( GL_FALSE );
|
||||||
|
m_geometry.draw( Submodel->m_geometry );
|
||||||
|
::glDepthMask( GL_TRUE );
|
||||||
|
}
|
||||||
|
::glPointSize( pointsize );
|
||||||
|
::glColor4f(
|
||||||
|
Submodel->f4Diffuse[ 0 ],
|
||||||
|
Submodel->f4Diffuse[ 1 ],
|
||||||
|
Submodel->f4Diffuse[ 2 ],
|
||||||
|
Submodel->fVisible * std::min( 1.f, lightlevel ) );
|
||||||
m_geometry.draw( Submodel->m_geometry );
|
m_geometry.draw( Submodel->m_geometry );
|
||||||
|
|
||||||
// post-draw reset
|
// post-draw reset
|
||||||
// re-enable shadows
|
|
||||||
/*
|
|
||||||
setup_shadow_color( m_shadowcolor );
|
|
||||||
*/
|
|
||||||
switch_units( unitstate.diffuse, unitstate.shadows, unitstate.reflections );
|
switch_units( unitstate.diffuse, unitstate.shadows, unitstate.reflections );
|
||||||
|
|
||||||
::glPopMatrix();
|
::glPopMatrix();
|
||||||
::glPopAttrib();
|
::glPopAttrib();
|
||||||
|
::glFogf( GL_FOG_DENSITY, static_cast<GLfloat>( 1.0 / m_fogrange ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -3455,16 +3476,19 @@ opengl_renderer::Render_Alpha( TSubModel *Submodel ) {
|
|||||||
static_cast<float>( TSubModel::fSquareDist / Submodel->fSquareMaxDist ) ); // pozycja punktu świecącego względem kamery
|
static_cast<float>( TSubModel::fSquareDist / Submodel->fSquareMaxDist ) ); // pozycja punktu świecącego względem kamery
|
||||||
Submodel->fCosViewAngle = glm::dot( glm::normalize( modelview * glm::vec4( 0.f, 0.f, -1.f, 1.f ) - lightcenter ), glm::normalize( -lightcenter ) );
|
Submodel->fCosViewAngle = glm::dot( glm::normalize( modelview * glm::vec4( 0.f, 0.f, -1.f, 1.f ) - lightcenter ), glm::normalize( -lightcenter ) );
|
||||||
|
|
||||||
float glarelevel = 0.6f; // luminosity at night is at level of ~0.1, so the overall resulting transparency in clear conditions is ~0.5 at full 'brightness'
|
|
||||||
if( Submodel->fCosViewAngle > Submodel->fCosFalloffAngle ) {
|
if( Submodel->fCosViewAngle > Submodel->fCosFalloffAngle ) {
|
||||||
// only bother if the viewer is inside the visibility cone
|
// only bother if the viewer is inside the visibility cone
|
||||||
|
// luminosity at night is at level of ~0.1, so the overall resulting transparency in clear conditions is ~0.5 at full 'brightness'
|
||||||
auto glarelevel { clamp(
|
auto glarelevel { clamp(
|
||||||
std::max<float>(
|
std::max<float>(
|
||||||
0.6f - Global.fLuminance, // reduce the glare in bright daylight
|
0.6f - Global.fLuminance, // reduce the glare in bright daylight
|
||||||
Global.Overcast - 1.f ), // ensure some glare in rainy/foggy conditions
|
Global.Overcast - 1.f ), // ensure some glare in rainy/foggy conditions
|
||||||
0.f, 1.f ) };
|
0.f, 1.f ) };
|
||||||
// scale it down based on view angle
|
// view angle attenuation
|
||||||
glarelevel *= ( Submodel->fCosViewAngle - Submodel->fCosFalloffAngle ) / ( 1.0f - Submodel->fCosFalloffAngle );
|
float const anglefactor { clamp(
|
||||||
|
( Submodel->fCosViewAngle - Submodel->fCosFalloffAngle ) / ( Submodel->fCosHotspotAngle - Submodel->fCosFalloffAngle ),
|
||||||
|
0.f, 1.f ) };
|
||||||
|
glarelevel *= anglefactor;
|
||||||
|
|
||||||
if( glarelevel > 0.0f ) {
|
if( glarelevel > 0.0f ) {
|
||||||
// setup
|
// setup
|
||||||
|
|||||||
@@ -386,6 +386,7 @@ private:
|
|||||||
|
|
||||||
glm::vec4 m_baseambient { 0.0f, 0.0f, 0.0f, 1.0f };
|
glm::vec4 m_baseambient { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
glm::vec4 m_shadowcolor { colors::shadow };
|
glm::vec4 m_shadowcolor { colors::shadow };
|
||||||
|
float m_fogrange { 2000.f };
|
||||||
// TEnvironmentType m_environment { e_flat };
|
// TEnvironmentType m_environment { e_flat };
|
||||||
float m_specularopaquescalefactor { 1.f };
|
float m_specularopaquescalefactor { 1.f };
|
||||||
float m_speculartranslucentscalefactor { 1.f };
|
float m_speculartranslucentscalefactor { 1.f };
|
||||||
|
|||||||
Reference in New Issue
Block a user