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

Improve lights dimming so it wont affect iLights

This commit is contained in:
2025-09-18 22:11:05 +02:00
parent 1f29aff90f
commit da8e0c8dd0
4 changed files with 137 additions and 28 deletions

View File

@@ -1206,7 +1206,9 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
{ // sygnały czoła pociagu //Ra: wyświetlamy bez { // sygnały czoła pociagu //Ra: wyświetlamy bez
// ograniczeń odległości, by były widoczne z // ograniczeń odległości, by były widoczne z
// daleka // daleka
if (TestFlag(MoverParameters->iLights[end::front], light::headlight_left))
if (TestFlag(MoverParameters->iLights[end::front], light::headlight_left)
&& !HeadlightsAoff && !HighBeamLights)
{ {
if( DimHeadlights ) { if( DimHeadlights ) {
m_headlamp13.TurnxOnWithOnAsFallback(); m_headlamp13.TurnxOnWithOnAsFallback();
@@ -1216,7 +1218,8 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
} }
btnOn = true; btnOn = true;
} }
if (TestFlag(MoverParameters->iLights[end::front], light::headlight_upper)) if (TestFlag(MoverParameters->iLights[end::front], light::headlight_upper)
&& !HeadlightsAoff)
{ {
if( DimHeadlights ) { if( DimHeadlights ) {
m_headlamp11.TurnxOnWithOnAsFallback(); m_headlamp11.TurnxOnWithOnAsFallback();
@@ -1226,7 +1229,8 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
} }
btnOn = true; btnOn = true;
} }
if (TestFlag(MoverParameters->iLights[end::front], light::headlight_right)) if (TestFlag(MoverParameters->iLights[end::front], light::headlight_right)
&& !HeadlightsAoff && !HighBeamLights)
{ {
if( DimHeadlights ) { if( DimHeadlights ) {
m_headlamp12.TurnxOnWithOnAsFallback(); m_headlamp12.TurnxOnWithOnAsFallback();
@@ -1237,7 +1241,8 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
btnOn = true; btnOn = true;
} }
// else btHeadSignals13.TurnOff(); // else btHeadSignals13.TurnOff();
if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_left)) if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_left)
&& !HeadlightsBoff && !HighBeamLights)
{ {
if( DimHeadlights ) { if( DimHeadlights ) {
m_headlamp23.TurnxOnWithOnAsFallback(); m_headlamp23.TurnxOnWithOnAsFallback();
@@ -1247,7 +1252,8 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
} }
btnOn = true; btnOn = true;
} }
if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_upper)) if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_upper)
&& !HeadlightsBoff)
{ {
if( DimHeadlights ) { if( DimHeadlights ) {
m_headlamp21.TurnxOnWithOnAsFallback(); m_headlamp21.TurnxOnWithOnAsFallback();
@@ -1257,7 +1263,8 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
} }
btnOn = true; btnOn = true;
} }
if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_right)) if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_right)
&& !HeadlightsBoff && !HighBeamLights)
{ {
if( DimHeadlights ) { if( DimHeadlights ) {
m_headlamp22.TurnxOnWithOnAsFallback(); m_headlamp22.TurnxOnWithOnAsFallback();
@@ -1268,7 +1275,7 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
btnOn = true; btnOn = true;
} }
// auxiliary lights // auxiliary lights
if (TestFlag(MoverParameters->iLights[end::front], light::auxiliary_left)) if (TestFlag(MoverParameters->iLights[end::front], light::auxiliary_left) && !HeadlightsAoff)
{ {
if( DimHeadlights ) { if( DimHeadlights ) {
m_headsignal13.TurnxOnWithOnAsFallback(); m_headsignal13.TurnxOnWithOnAsFallback();
@@ -1278,7 +1285,7 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
} }
btnOn = true; btnOn = true;
} }
if (TestFlag(MoverParameters->iLights[end::front], light::auxiliary_right)) if (TestFlag(MoverParameters->iLights[end::front], light::auxiliary_right) && !HeadlightsAoff)
{ {
if( DimHeadlights ) { if( DimHeadlights ) {
m_headsignal12.TurnxOnWithOnAsFallback(); m_headsignal12.TurnxOnWithOnAsFallback();
@@ -1288,7 +1295,7 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
} }
btnOn = true; btnOn = true;
} }
if (TestFlag(MoverParameters->iLights[end::rear], light::auxiliary_left)) if (TestFlag(MoverParameters->iLights[end::rear], light::auxiliary_left) && !HeadlightsBoff)
{ {
if( DimHeadlights ) { if( DimHeadlights ) {
m_headsignal23.TurnxOnWithOnAsFallback(); m_headsignal23.TurnxOnWithOnAsFallback();
@@ -1298,7 +1305,7 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
} }
btnOn = true; btnOn = true;
} }
if (TestFlag(MoverParameters->iLights[end::rear], light::auxiliary_right)) if (TestFlag(MoverParameters->iLights[end::rear], light::auxiliary_right) && !HeadlightsBoff)
{ {
if( DimHeadlights ) { if( DimHeadlights ) {
m_headsignal22.TurnxOnWithOnAsFallback(); m_headsignal22.TurnxOnWithOnAsFallback();
@@ -1310,23 +1317,27 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
} }
// logika dlugich // logika dlugich
if (TestFlag(MoverParameters->iLights[end::front], light::highbeamlight_left)) if (TestFlag(MoverParameters->iLights[end::front], light::headlight_left)
&& !HeadlightsAoff && HighBeamLights)
m_highbeam13.TurnxOnWithOnAsFallback(); m_highbeam13.TurnxOnWithOnAsFallback();
else else
m_highbeam13.TurnOff(); m_highbeam13.TurnOff();
if (TestFlag(MoverParameters->iLights[end::front], light::highbeamlight_right)) if (TestFlag(MoverParameters->iLights[end::front], light::headlight_right)
&& !HeadlightsAoff && HighBeamLights)
m_highbeam12.TurnxOnWithOnAsFallback(); m_highbeam12.TurnxOnWithOnAsFallback();
else else
m_highbeam12.TurnOff(); m_highbeam12.TurnOff();
// i to samo od dupy strony // i to samo od dupy strony
if (TestFlag(MoverParameters->iLights[end::rear], light::highbeamlight_left)) if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_left)
&& !HeadlightsBoff && HighBeamLights)
m_highbeam23.TurnxOnWithOnAsFallback(); m_highbeam23.TurnxOnWithOnAsFallback();
else else
m_highbeam23.TurnOff(); m_highbeam23.TurnOff();
if (TestFlag(MoverParameters->iLights[end::rear], light::highbeamlight_right)) if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_right)
&& !HeadlightsBoff && HighBeamLights)
m_highbeam22.TurnxOnWithOnAsFallback(); m_highbeam22.TurnxOnWithOnAsFallback();
else else
m_highbeam22.TurnOff(); m_highbeam22.TurnOff();
@@ -7378,9 +7389,34 @@ void TDynamicObject::RaLightsSet(int head, int rear)
// obsługa OFF // obsługa OFF
if (dps.isOff) if (dps.isOff)
{ {
MoverParameters->iLights[vehicleend] &= 0 | light::rearendsignals; // zostawiamy tylko tabliczki jesli sa //MoverParameters->iLights[vehicleend] &= 0 | light::rearendsignals; // zostawiamy tylko tabliczki jesli sa
HighBeamLights = false; HighBeamLights = false;
DimHeadlights = false; DimHeadlights = false;
switch (vehicleend)
{
case end::front:
HeadlightsAoff = true;
break;
case end::rear:
HeadlightsAoff = true;
break;
default:
break;
}
}
else
{
switch (vehicleend)
{
case end::front:
HeadlightsAoff = false;
break;
case end::rear:
HeadlightsAoff = false;
break;
default:
break;
}
} }
// obsługa przyciemnionych // obsługa przyciemnionych
@@ -7390,11 +7426,6 @@ void TDynamicObject::RaLightsSet(int head, int rear)
if (dps.isHighBeam) if (dps.isHighBeam)
{ {
HighBeamLights = true; HighBeamLights = true;
MoverParameters->iLights[vehicleend] &=
light::headlight_upper | light::rearendsignals | light::redmarker_left | light::redmarker_right | light::rearendsignals; // nie ruszamy gornych i koncowek
MoverParameters->iLights[vehicleend] |= tLeft ? light::highbeamlight_left : 0; // jesli swiatlo z lewej zapalone to odpal dlugie
MoverParameters->iLights[vehicleend] |= tRight ? light::highbeamlight_right : 0; // a tu z prawej
} }
} }
@@ -7405,6 +7436,68 @@ void TDynamicObject::RaLightsSet(int head, int rear)
} }
}; };
void TDynamicObject::SetLightDimmings()
{
auto const vehicleend{iDirection > 0 ? end::front : end::rear};
if (Controller == Humandriver)
{
int &currentDimPos = MoverParameters->modernDimmerPosition;
auto &dimmerPositions = MoverParameters->dimPositions;
TMoverParameters::dimPosition dps = dimmerPositions[currentDimPos];
// domyślnie
HighBeamLights = false;
DimHeadlights = false;
// obsługa OFF
if (dps.isOff)
{
// MoverParameters->iLights[vehicleend] &= 0 | light::rearendsignals; // zostawiamy tylko tabliczki jesli sa
HighBeamLights = false;
DimHeadlights = false;
switch (vehicleend)
{
case end::front:
HeadlightsAoff = true;
break;
case end::rear:
HeadlightsAoff = true;
break;
default:
break;
}
}
else
{
switch (vehicleend)
{
case end::front:
HeadlightsAoff = false;
break;
case end::rear:
HeadlightsAoff = false;
break;
default:
break;
}
}
// obsługa przyciemnionych
DimHeadlights = dps.isDimmed;
// obsługa długich
if (dps.isHighBeam)
{
// obsługa długich
if (dps.isHighBeam)
{
HighBeamLights = true;
}
}
}
}
bool TDynamicObject::has_signal_pc1_on() const { bool TDynamicObject::has_signal_pc1_on() const {
auto const vehicleend { iDirection > 0 ? end::front : end::rear }; auto const vehicleend { iDirection > 0 ? end::front : end::rear };

View File

@@ -608,6 +608,8 @@ private:
public: public:
bool DimHeadlights{ false }; // status of the headlight dimming toggle. NOTE: single toggle for all lights is a simplification. TODO: separate per-light switches bool DimHeadlights{ false }; // status of the headlight dimming toggle. NOTE: single toggle for all lights is a simplification. TODO: separate per-light switches
bool HighBeamLights { false }; // status of the highbeam toggle bool HighBeamLights { false }; // status of the highbeam toggle
bool HeadlightsAoff{false}; // wygaszone swiatelki A
bool HeadlightsBoff{false}; // wygaszone swiatelki B
// checks whether there's unbroken connection of specified type to specified vehicle // checks whether there's unbroken connection of specified type to specified vehicle
bool is_connected( TDynamicObject const *Vehicle, coupling const Coupling = coupling::coupler ) const; bool is_connected( TDynamicObject const *Vehicle, coupling const Coupling = coupling::coupler ) const;
TDynamicObject * PrevAny() const; TDynamicObject * PrevAny() const;
@@ -768,6 +770,7 @@ private:
void Damage(char flag); void Damage(char flag);
void pants_up(); void pants_up();
void SetLights(); void SetLights();
void SetLightDimmings();
void RaLightsSet(int head, int rear); void RaLightsSet(int head, int rear);
int LightList( end const Side ) const { return iInventory[ Side ]; } int LightList( end const Side ) const { return iInventory[ Side ]; }
bool has_signal_pc1_on() const; bool has_signal_pc1_on() const;

View File

@@ -4938,7 +4938,9 @@ void TTrain::OnCommand_modernlightdimmerincrease(TTrain* Train, command_data con
else else
return; // już na minimum i nie można cyklicznie return; // już na minimum i nie można cyklicznie
// update lightning // update lightning
Train->Dynamic()->SetLights(); //Train->Dynamic()->SetLights();
Train->Dynamic()->SetLightDimmings();
// visual feedback // visual feedback
if (Train->ggModernLightDimSw.SubModel != nullptr) if (Train->ggModernLightDimSw.SubModel != nullptr)
@@ -4965,7 +4967,8 @@ void TTrain::OnCommand_modernlightdimmerdecrease(TTrain *Train, command_data con
else else
return; // już na minimum i nie można cyklicznie return; // już na minimum i nie można cyklicznie
Train->Dynamic()->SetLights(); //Train->Dynamic()->SetLights();
Train->Dynamic()->SetLightDimmings();
if (Train->ggModernLightDimSw.SubModel != nullptr) if (Train->ggModernLightDimSw.SubModel != nullptr)
Train->ggModernLightDimSw.UpdateValue(dimPos, Train->dsbSwitch); Train->ggModernLightDimSw.UpdateValue(dimPos, Train->dsbSwitch);

View File

@@ -69,16 +69,23 @@ light_array::update() {
+ ( ( lights & light::highbeamlight_left ) ? 1: 0) + ( ( lights & light::highbeamlight_left ) ? 1: 0)
+ ( ( lights & light::highbeamlight_right ) ? 1 : 0); + ( ( lights & light::highbeamlight_right ) ? 1 : 0);
// set intensity
if( light.count > 0 ) { if( light.count > 0 ) {
bool isEnabled = light.index == end::front ? !light.owner->HeadlightsAoff : !light.owner->HeadlightsBoff;
light.intensity = std::max(0.0f, std::log((float)light.count + 1.0f)); light.intensity = std::max(0.0f, std::log((float)light.count + 1.0f));
if (light.owner->DimHeadlights && !light.owner->HighBeamLights) // tylko przyciemnione if (light.owner->DimHeadlights && !light.owner->HighBeamLights && isEnabled) // tylko przyciemnione
light.intensity *= light.owner->MoverParameters->dimMultiplier; light.intensity *= light.owner->MoverParameters->dimMultiplier;
else if (!light.owner->DimHeadlights && !light.owner->HighBeamLights) // normalne else if (!light.owner->DimHeadlights && !light.owner->HighBeamLights && isEnabled) // normalne
light.intensity *= light.owner->MoverParameters->normMultiplier; light.intensity *= light.owner->MoverParameters->normMultiplier;
else if (light.owner->DimHeadlights && light.owner->HighBeamLights) // przyciemnione dlugie else if (light.owner->DimHeadlights && light.owner->HighBeamLights && isEnabled) // przyciemnione dlugie
light.intensity *= light.owner->MoverParameters->highDimMultiplier; light.intensity *= light.owner->MoverParameters->highDimMultiplier;
else if (!light.owner->DimHeadlights && light.owner->HighBeamLights) // dlugie zwykle else if (!light.owner->DimHeadlights && light.owner->HighBeamLights && isEnabled) // dlugie zwykle
light.intensity *= light.owner->MoverParameters->highMultiplier; light.intensity *= light.owner->MoverParameters->highMultiplier;
else if (!isEnabled)
{
light.intensity = 0.0f;
}
// TBD, TODO: intensity can be affected further by other factors // TBD, TODO: intensity can be affected further by other factors
light.state = { light.state = {
@@ -94,13 +101,16 @@ light_array::update() {
if (light.owner->DimHeadlights && !light.owner->HighBeamLights) // tylko przyciemnione if (light.owner->DimHeadlights && !light.owner->HighBeamLights) // tylko przyciemnione
light.state *= light.owner->MoverParameters->dimMultiplier; light.state *= light.owner->MoverParameters->dimMultiplier;
else if (!light.owner->DimHeadlights && !light.owner->HighBeamLights) else if (!light.owner->DimHeadlights && !light.owner->HighBeamLights) // normalne
light.state *= light.owner->MoverParameters->normMultiplier; light.state *= light.owner->MoverParameters->normMultiplier;
else if (light.owner->DimHeadlights && light.owner->HighBeamLights) // przyciemnione dlugie else if (light.owner->DimHeadlights && light.owner->HighBeamLights) // przyciemnione dlugie
light.state *= light.owner->MoverParameters->highDimMultiplier; light.state *= light.owner->MoverParameters->highDimMultiplier;
else if (!light.owner->DimHeadlights && light.owner->HighBeamLights) // dlugie zwykle else if (!light.owner->DimHeadlights && light.owner->HighBeamLights) // dlugie zwykle
light.state *= light.owner->MoverParameters->highMultiplier; light.state *= light.owner->MoverParameters->highMultiplier;
else if (!isEnabled)
{
light.state = glm::vec3{0.f};
}
} }
else { else {
light.intensity = 0.0f; light.intensity = 0.0f;