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
// ograniczeń odległości, by były widoczne z
// daleka
if (TestFlag(MoverParameters->iLights[end::front], light::headlight_left))
if (TestFlag(MoverParameters->iLights[end::front], light::headlight_left)
&& !HeadlightsAoff && !HighBeamLights)
{
if( DimHeadlights ) {
m_headlamp13.TurnxOnWithOnAsFallback();
@@ -1216,7 +1218,8 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
}
btnOn = true;
}
if (TestFlag(MoverParameters->iLights[end::front], light::headlight_upper))
if (TestFlag(MoverParameters->iLights[end::front], light::headlight_upper)
&& !HeadlightsAoff)
{
if( DimHeadlights ) {
m_headlamp11.TurnxOnWithOnAsFallback();
@@ -1226,7 +1229,8 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
}
btnOn = true;
}
if (TestFlag(MoverParameters->iLights[end::front], light::headlight_right))
if (TestFlag(MoverParameters->iLights[end::front], light::headlight_right)
&& !HeadlightsAoff && !HighBeamLights)
{
if( DimHeadlights ) {
m_headlamp12.TurnxOnWithOnAsFallback();
@@ -1237,7 +1241,8 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
btnOn = true;
}
// 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 ) {
m_headlamp23.TurnxOnWithOnAsFallback();
@@ -1247,7 +1252,8 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
}
btnOn = true;
}
if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_upper))
if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_upper)
&& !HeadlightsBoff)
{
if( DimHeadlights ) {
m_headlamp21.TurnxOnWithOnAsFallback();
@@ -1257,7 +1263,8 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
}
btnOn = true;
}
if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_right))
if (TestFlag(MoverParameters->iLights[end::rear], light::headlight_right)
&& !HeadlightsBoff && !HighBeamLights)
{
if( DimHeadlights ) {
m_headlamp22.TurnxOnWithOnAsFallback();
@@ -1268,7 +1275,7 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
btnOn = true;
}
// auxiliary lights
if (TestFlag(MoverParameters->iLights[end::front], light::auxiliary_left))
if (TestFlag(MoverParameters->iLights[end::front], light::auxiliary_left) && !HeadlightsAoff)
{
if( DimHeadlights ) {
m_headsignal13.TurnxOnWithOnAsFallback();
@@ -1278,7 +1285,7 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
}
btnOn = true;
}
if (TestFlag(MoverParameters->iLights[end::front], light::auxiliary_right))
if (TestFlag(MoverParameters->iLights[end::front], light::auxiliary_right) && !HeadlightsAoff)
{
if( DimHeadlights ) {
m_headsignal12.TurnxOnWithOnAsFallback();
@@ -1288,7 +1295,7 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
}
btnOn = true;
}
if (TestFlag(MoverParameters->iLights[end::rear], light::auxiliary_left))
if (TestFlag(MoverParameters->iLights[end::rear], light::auxiliary_left) && !HeadlightsBoff)
{
if( DimHeadlights ) {
m_headsignal23.TurnxOnWithOnAsFallback();
@@ -1298,7 +1305,7 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
}
btnOn = true;
}
if (TestFlag(MoverParameters->iLights[end::rear], light::auxiliary_right))
if (TestFlag(MoverParameters->iLights[end::rear], light::auxiliary_right) && !HeadlightsBoff)
{
if( DimHeadlights ) {
m_headsignal22.TurnxOnWithOnAsFallback();
@@ -1310,23 +1317,27 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
}
// 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();
else
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();
else
m_highbeam12.TurnOff();
// 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();
else
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();
else
m_highbeam22.TurnOff();
@@ -7378,10 +7389,35 @@ void TDynamicObject::RaLightsSet(int head, int rear)
// obsługa OFF
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;
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;
@@ -7390,11 +7426,6 @@ void TDynamicObject::RaLightsSet(int head, int rear)
if (dps.isHighBeam)
{
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 {
auto const vehicleend { iDirection > 0 ? end::front : end::rear };

View File

@@ -608,6 +608,8 @@ private:
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 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
bool is_connected( TDynamicObject const *Vehicle, coupling const Coupling = coupling::coupler ) const;
TDynamicObject * PrevAny() const;
@@ -768,6 +770,7 @@ private:
void Damage(char flag);
void pants_up();
void SetLights();
void SetLightDimmings();
void RaLightsSet(int head, int rear);
int LightList( end const Side ) const { return iInventory[ Side ]; }
bool has_signal_pc1_on() const;

View File

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

View File

@@ -69,16 +69,23 @@ light_array::update() {
+ ( ( lights & light::highbeamlight_left ) ? 1: 0)
+ ( ( lights & light::highbeamlight_right ) ? 1 : 0);
// set intensity
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));
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;
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;
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;
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;
else if (!isEnabled)
{
light.intensity = 0.0f;
}
// TBD, TODO: intensity can be affected further by other factors
light.state = {
@@ -94,13 +101,16 @@ light_array::update() {
if (light.owner->DimHeadlights && !light.owner->HighBeamLights) // tylko przyciemnione
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;
else if (light.owner->DimHeadlights && light.owner->HighBeamLights) // przyciemnione dlugie
light.state *= light.owner->MoverParameters->highDimMultiplier;
else if (!light.owner->DimHeadlights && light.owner->HighBeamLights) // dlugie zwykle
light.state *= light.owner->MoverParameters->highMultiplier;
else if (!isEnabled)
{
light.state = glm::vec3{0.f};
}
}
else {
light.intensity = 0.0f;