mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-23 05:09:19 +02:00
vehicle heating system tweaks, vehicle destination sign system enhancements
This commit is contained in:
@@ -2127,6 +2127,11 @@ bool TController::CheckVehicles(TOrders user)
|
|||||||
&& ( ( p->MoverParameters->Couplers[ end::rear ].CouplingFlag & ( coupling::control ) ) == 0 ) ) {
|
&& ( ( p->MoverParameters->Couplers[ end::rear ].CouplingFlag & ( coupling::control ) ) == 0 ) ) {
|
||||||
// NOTE: don't set battery in the occupied vehicle, let the user/ai do it explicitly
|
// NOTE: don't set battery in the occupied vehicle, let the user/ai do it explicitly
|
||||||
p->MoverParameters->BatterySwitch( true );
|
p->MoverParameters->BatterySwitch( true );
|
||||||
|
// enable heating and converter in carriages with can be heated
|
||||||
|
if( p->MoverParameters->HeatingPower > 0 ) {
|
||||||
|
p->MoverParameters->HeatingAllow = true;
|
||||||
|
p->MoverParameters->ConverterSwitch( true, range_t::local );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->asDestination == "none")
|
if (p->asDestination == "none")
|
||||||
@@ -2358,6 +2363,7 @@ double TController::BrakeAccFactor() const
|
|||||||
double Factor = 1.0;
|
double Factor = 1.0;
|
||||||
|
|
||||||
if( ( fAccThreshold != 0.0 )
|
if( ( fAccThreshold != 0.0 )
|
||||||
|
&& ( AccDesired < 0.0 )
|
||||||
&& ( ( ActualProximityDist > fMinProximityDist )
|
&& ( ( ActualProximityDist > fMinProximityDist )
|
||||||
|| ( mvOccupied->Vel > VelDesired + fVelPlus ) ) ) {
|
|| ( mvOccupied->Vel > VelDesired + fVelPlus ) ) ) {
|
||||||
Factor += ( fBrakeReaction * ( /*mvOccupied->BrakeCtrlPosR*/BrakeCtrlPosition < 0.5 ? 1.5 : 1 ) ) * mvOccupied->Vel / ( std::max( 0.0, ActualProximityDist ) + 1 ) * ( ( AccDesired - AbsAccS_pub ) / fAccThreshold );
|
Factor += ( fBrakeReaction * ( /*mvOccupied->BrakeCtrlPosR*/BrakeCtrlPosition < 0.5 ? 1.5 : 1 ) ) * mvOccupied->Vel / ( std::max( 0.0, ActualProximityDist ) + 1 ) * ( ( AccDesired - AbsAccS_pub ) / fAccThreshold );
|
||||||
@@ -3551,7 +3557,7 @@ void TController::Doors( bool const Open, int const Side ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( AIControllFlag ) {
|
if( AIControllFlag ) {
|
||||||
if( ( true == mvOccupied->Doors.has_autowarning )
|
if( ( true == mvOccupied->Doors.has_warning )
|
||||||
&& ( false == mvOccupied->DepartureSignal )
|
&& ( false == mvOccupied->DepartureSignal )
|
||||||
&& ( true == TestFlag( iDrivigFlags, moveDoorOpened ) ) ) {
|
&& ( true == TestFlag( iDrivigFlags, moveDoorOpened ) ) ) {
|
||||||
mvOccupied->signal_departure( true ); // załącenie bzyczka
|
mvOccupied->signal_departure( true ); // załącenie bzyczka
|
||||||
|
|||||||
95
DynObj.cpp
95
DynObj.cpp
@@ -919,6 +919,8 @@ void TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
|
|||||||
btEndSignalsTab2.Turn( true );
|
btEndSignalsTab2.Turn( true );
|
||||||
btnOn = true;
|
btnOn = true;
|
||||||
}
|
}
|
||||||
|
// destination signs
|
||||||
|
update_destinations();
|
||||||
// else btEndSignalsTab2.TurnOff();
|
// else btEndSignalsTab2.TurnOff();
|
||||||
// McZapkie-181002: krecenie wahaczem (korzysta z kata obrotu silnika)
|
// McZapkie-181002: krecenie wahaczem (korzysta z kata obrotu silnika)
|
||||||
if (iAnimType[ANIM_LEVERS])
|
if (iAnimType[ANIM_LEVERS])
|
||||||
@@ -1946,6 +1948,10 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
|
|||||||
init_sections( mdLowPolyInt, nameprefix );
|
init_sections( mdLowPolyInt, nameprefix );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// destination sign
|
||||||
|
if( mdModel ) {
|
||||||
|
init_destination( mdModel );
|
||||||
|
}
|
||||||
// 'external_load' is an optional special section in the main model, pointing to submodel of external load
|
// 'external_load' is an optional special section in the main model, pointing to submodel of external load
|
||||||
if( mdModel ) {
|
if( mdModel ) {
|
||||||
init_sections( mdModel, "external_load" );
|
init_sections( mdModel, "external_load" );
|
||||||
@@ -2069,6 +2075,16 @@ TDynamicObject::init_sections( TModel3d const *Model, std::string const &Namepre
|
|||||||
return sectioncount;
|
return sectioncount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
TDynamicObject::init_destination( TModel3d *Model ) {
|
||||||
|
|
||||||
|
if( Model->GetSMRoot() == nullptr ) { return false; }
|
||||||
|
|
||||||
|
std::tie( DestinationSign.sign, DestinationSign.has_light ) = Model->GetSMRoot()->find_replacable4();
|
||||||
|
|
||||||
|
return DestinationSign.sign != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
TDynamicObject::create_controller( std::string const Type, bool const Trainset ) {
|
TDynamicObject::create_controller( std::string const Type, bool const Trainset ) {
|
||||||
|
|
||||||
@@ -2553,6 +2569,27 @@ na sprzęgach, opóźnienie działania hamulca itp. Oczywiście musi mieć to pe
|
|||||||
histerezę czasową, aby te tryby pracy nie przełączały się zbyt szybko.
|
histerezę czasową, aby te tryby pracy nie przełączały się zbyt szybko.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
void TDynamicObject::update_destinations() {
|
||||||
|
|
||||||
|
if( DestinationSign.sign == nullptr ) { return; }
|
||||||
|
|
||||||
|
DestinationSign.sign->fLight = (
|
||||||
|
( ( DestinationSign.has_light ) && ( MoverParameters->Battery ) ) ?
|
||||||
|
2.0 :
|
||||||
|
-1.0 );
|
||||||
|
|
||||||
|
// jak są 4 tekstury wymienne, to nie zmieniać rozkładem
|
||||||
|
if( std::abs( m_materialdata.multi_textures ) >= 4 ) { return; }
|
||||||
|
// TODO: dedicated setting to discern electronic signs, instead of fallback on light presence
|
||||||
|
m_materialdata.replacable_skins[ 4 ] = (
|
||||||
|
( ( DestinationSign.destination != null_handle )
|
||||||
|
&& ( ( false == DestinationSign.has_light ) // physical destination signs remain up until manually changed
|
||||||
|
|| ( ( true == MoverParameters->Battery ) // lcd signs are off without power
|
||||||
|
&& ( ctOwner != nullptr ) ) ) ) ? // lcd signs are off for carriages without engine, potentially left on a siding
|
||||||
|
DestinationSign.destination :
|
||||||
|
DestinationSign.destination_off );
|
||||||
|
}
|
||||||
|
|
||||||
bool TDynamicObject::Update(double dt, double dt1)
|
bool TDynamicObject::Update(double dt, double dt1)
|
||||||
{
|
{
|
||||||
if (dt1 == 0)
|
if (dt1 == 0)
|
||||||
@@ -4235,7 +4272,8 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co
|
|||||||
}
|
}
|
||||||
|
|
||||||
// potentially set blank destination texture
|
// potentially set blank destination texture
|
||||||
DestinationSet( {}, {} );
|
DestinationSign.destination_off = DestinationFind( "nowhere" );
|
||||||
|
// DestinationSet( {}, {} );
|
||||||
|
|
||||||
if( GfxRenderer.Material( m_materialdata.replacable_skins[ 1 ] ).has_alpha ) {
|
if( GfxRenderer.Material( m_materialdata.replacable_skins[ 1 ] ).has_alpha ) {
|
||||||
// tekstura -1 z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
// tekstura -1 z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||||
@@ -6087,45 +6125,60 @@ int TDynamicObject::RouteWish(TTrack *tr)
|
|||||||
return Mechanik ? Mechanik->CrossRoute(tr) : 0; // wg AI albo prosto
|
return Mechanik ? Mechanik->CrossRoute(tr) : 0; // wg AI albo prosto
|
||||||
};
|
};
|
||||||
|
|
||||||
void TDynamicObject::DestinationSet(std::string to, std::string numer)
|
void TDynamicObject::DestinationSet(std::string to, std::string numer) {
|
||||||
{ // ustawienie stacji docelowej oraz wymiennej tekstury 4, jeśli istnieje plik
|
// ustawienie stacji docelowej oraz wymiennej tekstury 4, jeśli istnieje plik
|
||||||
// w zasadzie, to każdy wagon mógłby mieć inną stację docelową
|
// w zasadzie, to każdy wagon mógłby mieć inną stację docelową
|
||||||
// zwłaszcza w towarowych, pod kątem zautomatyzowania maewrów albo pracy górki
|
// zwłaszcza w towarowych, pod kątem zautomatyzowania maewrów albo pracy górki
|
||||||
// ale to jeszcze potrwa, zanim będzie możliwe, na razie można wpisać stację z
|
// ale to jeszcze potrwa, zanim będzie możliwe, na razie można wpisać stację z
|
||||||
// rozkładu
|
// rozkładu
|
||||||
if( std::abs( m_materialdata.multi_textures ) >= 4 ) {
|
|
||||||
// jak są 4 tekstury wymienne, to nie zmieniać rozkładem
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
numer = Bezogonkow(numer);
|
|
||||||
asDestination = to;
|
asDestination = to;
|
||||||
to = Bezogonkow(to); // do szukania pliku obcinamy ogonki
|
|
||||||
if( true == to.empty() ) {
|
if( std::abs( m_materialdata.multi_textures ) >= 4 ) { return; } // jak są 4 tekstury wymienne, to nie zmieniać rozkładem
|
||||||
to = "nowhere";
|
if( DestinationSign.sign == nullptr ) { return; } // no sign submodel, no problem
|
||||||
|
|
||||||
|
// now see if we can find any version of the destination texture
|
||||||
|
std::vector<std::string> const destinations = {
|
||||||
|
numer, // try dedicated timetable sign first...
|
||||||
|
to }; // ...then generic destination sign
|
||||||
|
|
||||||
|
for( auto const &destination : destinations ) {
|
||||||
|
|
||||||
|
DestinationSign.destination = DestinationFind( destination );
|
||||||
|
if( DestinationSign.destination != null_handle ) {
|
||||||
|
// got what we wanted, we're done here
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
material_handle TDynamicObject::DestinationFind( std::string Destination ) {
|
||||||
|
|
||||||
|
if( Destination.empty() ) { return null_handle; }
|
||||||
|
|
||||||
|
Destination = Bezogonkow( Destination ); // do szukania pliku obcinamy ogonki
|
||||||
// destination textures are kept in the vehicle's directory so we point the current texture path there
|
// destination textures are kept in the vehicle's directory so we point the current texture path there
|
||||||
auto const currenttexturepath { Global.asCurrentTexturePath };
|
auto const currenttexturepath { Global.asCurrentTexturePath };
|
||||||
Global.asCurrentTexturePath = asBaseDir;
|
Global.asCurrentTexturePath = asBaseDir;
|
||||||
// now see if we can find any version of the texture
|
// now see if we can find any version of the texture
|
||||||
std::vector<std::string> destinations = {
|
std::vector<std::string> const destinations {
|
||||||
numer + '@' + MoverParameters->TypeName,
|
Destination + '@' + MoverParameters->TypeName,
|
||||||
numer,
|
Destination };
|
||||||
to + '@' + MoverParameters->TypeName,
|
|
||||||
to,
|
auto destinationhandle { null_handle };
|
||||||
"nowhere" + '@' + MoverParameters->TypeName,
|
|
||||||
"nowhere" };
|
|
||||||
|
|
||||||
for( auto const &destination : destinations ) {
|
for( auto const &destination : destinations ) {
|
||||||
|
|
||||||
auto material = TextureTest( ToLower( destination ) );
|
auto material = TextureTest( ToLower( destination ) );
|
||||||
if( false == material.empty() ) {
|
if( false == material.empty() ) {
|
||||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.Fetch_Material( material );
|
destinationhandle = GfxRenderer.Fetch_Material( material );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// whether we got anything, restore previous texture path
|
// whether we got anything, restore previous texture path
|
||||||
Global.asCurrentTexturePath = currenttexturepath;
|
Global.asCurrentTexturePath = currenttexturepath;
|
||||||
};
|
|
||||||
|
return destinationhandle;
|
||||||
|
}
|
||||||
|
|
||||||
void TDynamicObject::OverheadTrack(float o)
|
void TDynamicObject::OverheadTrack(float o)
|
||||||
{ // ewentualne wymuszanie jazdy
|
{ // ewentualne wymuszanie jazdy
|
||||||
|
|||||||
9
DynObj.h
9
DynObj.h
@@ -200,6 +200,12 @@ public:
|
|||||||
TModel3d *mdLowPolyInt; // ABu 010305: wnetrze lowpoly
|
TModel3d *mdLowPolyInt; // ABu 010305: wnetrze lowpoly
|
||||||
std::array<TSubModel *, 3> LowPolyIntCabs {}; // pointers to low fidelity version of individual driver cabs
|
std::array<TSubModel *, 3> LowPolyIntCabs {}; // pointers to low fidelity version of individual driver cabs
|
||||||
bool JointCabs{ false }; // flag for vehicles with multiple virtual 'cabs' sharing location and 3d model(s)
|
bool JointCabs{ false }; // flag for vehicles with multiple virtual 'cabs' sharing location and 3d model(s)
|
||||||
|
struct destination_data {
|
||||||
|
TSubModel *sign { nullptr }; // submodel mapped with replacable texture -4
|
||||||
|
bool has_light { false }; // the submodel was originally configured with self-illumination attribute
|
||||||
|
material_handle destination { null_handle }; // most recently assigned non-blank destination texture
|
||||||
|
material_handle destination_off { null_handle }; // blank destination sign
|
||||||
|
} DestinationSign;
|
||||||
float fShade; // zacienienie: 0:normalnie, -1:w ciemności, +1:dodatkowe światło (brak koloru?)
|
float fShade; // zacienienie: 0:normalnie, -1:w ciemności, +1:dodatkowe światło (brak koloru?)
|
||||||
float LoadOffset { 0.f };
|
float LoadOffset { 0.f };
|
||||||
std::unordered_map<std::string, std::string> LoadModelOverrides; // potential overrides of default load visualization models
|
std::unordered_map<std::string, std::string> LoadModelOverrides; // potential overrides of default load visualization models
|
||||||
@@ -517,6 +523,7 @@ private:
|
|||||||
TTrack *Track, double fDist, std::string DriverType, double fVel, std::string TrainName,
|
TTrack *Track, double fDist, std::string DriverType, double fVel, std::string TrainName,
|
||||||
float Load, std::string LoadType, bool Reversed, std::string);
|
float Load, std::string LoadType, bool Reversed, std::string);
|
||||||
int init_sections( TModel3d const *Model, std::string const &Nameprefix );
|
int init_sections( TModel3d const *Model, std::string const &Nameprefix );
|
||||||
|
bool init_destination( TModel3d *Model );
|
||||||
void create_controller( std::string const Type, bool const Trainset );
|
void create_controller( std::string const Type, bool const Trainset );
|
||||||
void AttachPrev(TDynamicObject *Object, int iType = 1);
|
void AttachPrev(TDynamicObject *Object, int iType = 1);
|
||||||
bool UpdateForce(double dt);
|
bool UpdateForce(double dt);
|
||||||
@@ -531,6 +538,7 @@ private:
|
|||||||
void update_load_visibility();
|
void update_load_visibility();
|
||||||
void update_load_offset();
|
void update_load_offset();
|
||||||
void shuffle_load_sections();
|
void shuffle_load_sections();
|
||||||
|
void update_destinations();
|
||||||
bool Update(double dt, double dt1);
|
bool Update(double dt, double dt1);
|
||||||
bool FastUpdate(double dt);
|
bool FastUpdate(double dt);
|
||||||
void Move(double fDistance);
|
void Move(double fDistance);
|
||||||
@@ -633,6 +641,7 @@ private:
|
|||||||
// zapytanie do AI, po którym segmencie skrzyżowania jechać
|
// zapytanie do AI, po którym segmencie skrzyżowania jechać
|
||||||
int RouteWish(TTrack *tr);
|
int RouteWish(TTrack *tr);
|
||||||
void DestinationSet(std::string to, std::string numer);
|
void DestinationSet(std::string to, std::string numer);
|
||||||
|
material_handle DestinationFind( std::string Destination );
|
||||||
void OverheadTrack(float o);
|
void OverheadTrack(float o);
|
||||||
|
|
||||||
double MED[9][8]; // lista zmiennych do debugowania hamulca ED
|
double MED[9][8]; // lista zmiennych do debugowania hamulca ED
|
||||||
|
|||||||
@@ -1351,6 +1351,7 @@ public:
|
|||||||
std::string StLinSwitchType;
|
std::string StLinSwitchType;
|
||||||
|
|
||||||
bool Heating = false; //ogrzewanie 'Winger 020304
|
bool Heating = false; //ogrzewanie 'Winger 020304
|
||||||
|
bool HeatingAllow { false }; // heating switch // TODO: wrap heating in a basic device
|
||||||
int DoubleTr = 1; //trakcja ukrotniona - przedni pojazd 'Winger 160304
|
int DoubleTr = 1; //trakcja ukrotniona - przedni pojazd 'Winger 160304
|
||||||
|
|
||||||
bool PhysicActivation = true;
|
bool PhysicActivation = true;
|
||||||
@@ -1497,6 +1498,7 @@ public:
|
|||||||
|
|
||||||
/*-funkcje typowe dla lokomotywy elektrycznej*/
|
/*-funkcje typowe dla lokomotywy elektrycznej*/
|
||||||
void ConverterCheck( double const Timestep ); // przetwornica
|
void ConverterCheck( double const Timestep ); // przetwornica
|
||||||
|
void HeatingCheck( double const Timestep );
|
||||||
void WaterPumpCheck( double const Timestep );
|
void WaterPumpCheck( double const Timestep );
|
||||||
void WaterHeaterCheck( double const Timestep );
|
void WaterHeaterCheck( double const Timestep );
|
||||||
void FuelPumpCheck( double const Timestep );
|
void FuelPumpCheck( double const Timestep );
|
||||||
|
|||||||
@@ -1075,11 +1075,13 @@ double TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShap
|
|||||||
|
|
||||||
for( int side = 0; side < 2; ++side ) {
|
for( int side = 0; side < 2; ++side ) {
|
||||||
// przekazywanie napiec
|
// przekazywanie napiec
|
||||||
auto const oppositeside = ( side == end::front ? end::rear : end::front );
|
auto const oppositeside { ( side == end::front ? end::rear : end::front ) };
|
||||||
|
auto const liveconnection{
|
||||||
|
( Couplers[ side ].CouplingFlag & ctrain_power )
|
||||||
|
|| ( ( Couplers[ side ].CouplingFlag & ctrain_heating )
|
||||||
|
&& ( Couplers[ side ].Connected->Heating ) ) };
|
||||||
|
|
||||||
if( ( Couplers[ side ].CouplingFlag & ctrain_power )
|
if( liveconnection ) {
|
||||||
|| ( ( Heating )
|
|
||||||
&& ( Couplers[ side ].CouplingFlag & ctrain_heating ) ) ) {
|
|
||||||
auto const &connectedcoupler = Couplers[ side ].Connected->Couplers[ Couplers[ side ].ConnectedNr ];
|
auto const &connectedcoupler = Couplers[ side ].Connected->Couplers[ Couplers[ side ].ConnectedNr ];
|
||||||
Couplers[ oppositeside ].power_high.voltage =
|
Couplers[ oppositeside ].power_high.voltage =
|
||||||
std::max(
|
std::max(
|
||||||
@@ -1103,8 +1105,8 @@ double TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShap
|
|||||||
Couplers[ side ].power_high.local = false; // power, if any, will be from external source
|
Couplers[ side ].power_high.local = false; // power, if any, will be from external source
|
||||||
|
|
||||||
if( ( Couplers[ side ].CouplingFlag & ctrain_power )
|
if( ( Couplers[ side ].CouplingFlag & ctrain_power )
|
||||||
|| ( ( Heating )
|
|| ( ( Couplers[ side ].CouplingFlag & ctrain_heating )
|
||||||
&& ( Couplers[ side ].CouplingFlag & ctrain_heating ) ) ) {
|
&& ( Couplers[ side ].Connected->Heating ) ) ) {
|
||||||
auto const &connectedcoupler =
|
auto const &connectedcoupler =
|
||||||
Couplers[ side ].Connected->Couplers[
|
Couplers[ side ].Connected->Couplers[
|
||||||
( Couplers[ side ].ConnectedNr == end::front ?
|
( Couplers[ side ].ConnectedNr == end::front ?
|
||||||
@@ -1127,8 +1129,8 @@ double TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShap
|
|||||||
Couplers[ side ].power_high.local = true; // power is coming from local pantographs
|
Couplers[ side ].power_high.local = true; // power is coming from local pantographs
|
||||||
|
|
||||||
if( ( Couplers[ side ].CouplingFlag & ctrain_power )
|
if( ( Couplers[ side ].CouplingFlag & ctrain_power )
|
||||||
|| ( ( Heating )
|
|| ( ( Couplers[ side ].CouplingFlag & ctrain_heating )
|
||||||
&& ( Couplers[ side ].CouplingFlag & ctrain_heating ) ) ) {
|
&& ( Couplers[ side ].Connected->Heating ) ) ) {
|
||||||
auto const &connectedcoupler =
|
auto const &connectedcoupler =
|
||||||
Couplers[ side ].Connected->Couplers[
|
Couplers[ side ].Connected->Couplers[
|
||||||
( Couplers[ side ].ConnectedNr == end::front ?
|
( Couplers[ side ].ConnectedNr == end::front ?
|
||||||
@@ -1409,6 +1411,8 @@ void TMoverParameters::compute_movement_( double const Deltatime ) {
|
|||||||
// w rozrządczym nie (jest błąd w FIZ!) - Ra 2014-07: teraz we wszystkich
|
// w rozrządczym nie (jest błąd w FIZ!) - Ra 2014-07: teraz we wszystkich
|
||||||
UpdatePantVolume( Deltatime ); // Ra 2014-07: obsługa zbiornika rozrządu oraz pantografów
|
UpdatePantVolume( Deltatime ); // Ra 2014-07: obsługa zbiornika rozrządu oraz pantografów
|
||||||
}
|
}
|
||||||
|
// heating
|
||||||
|
HeatingCheck( Deltatime );
|
||||||
|
|
||||||
UpdateBrakePressure(Deltatime);
|
UpdateBrakePressure(Deltatime);
|
||||||
UpdatePipePressure(Deltatime);
|
UpdatePipePressure(Deltatime);
|
||||||
@@ -1462,7 +1466,8 @@ void TMoverParameters::ConverterCheck( double const Timestep ) {
|
|||||||
if( ( ConverterAllow )
|
if( ( ConverterAllow )
|
||||||
&& ( ConverterAllowLocal )
|
&& ( ConverterAllowLocal )
|
||||||
&& ( false == PantPressLockActive )
|
&& ( false == PantPressLockActive )
|
||||||
&& ( Mains ) ) {
|
&& ( ( Mains )
|
||||||
|
|| ( GetTrainsetVoltage() > 0 ) ) ) {
|
||||||
// delay timer can be optionally configured, and is set anew whenever converter goes off
|
// delay timer can be optionally configured, and is set anew whenever converter goes off
|
||||||
if( ConverterStartDelayTimer <= 0.0 ) {
|
if( ConverterStartDelayTimer <= 0.0 ) {
|
||||||
ConverterFlag = true;
|
ConverterFlag = true;
|
||||||
@@ -1477,6 +1482,17 @@ void TMoverParameters::ConverterCheck( double const Timestep ) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// heating system status check
|
||||||
|
void TMoverParameters::HeatingCheck( double const Timestep ) {
|
||||||
|
|
||||||
|
Heating = (
|
||||||
|
( true == HeatingAllow )
|
||||||
|
// powered vehicles are generally required to activate their power source to provide heating
|
||||||
|
// passive vehicles get a pass in this regard
|
||||||
|
&& ( ( Power < 0.1 )
|
||||||
|
|| ( true == Mains ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
// water pump status check
|
// water pump status check
|
||||||
void TMoverParameters::WaterPumpCheck( double const Timestep ) {
|
void TMoverParameters::WaterPumpCheck( double const Timestep ) {
|
||||||
// NOTE: breaker override with start type is sm42 specific hack, replace with ability to define the presence of the breaker
|
// NOTE: breaker override with start type is sm42 specific hack, replace with ability to define the presence of the breaker
|
||||||
@@ -7256,14 +7272,14 @@ double TMoverParameters::GetTrainsetVoltage(void)
|
|||||||
return std::max(
|
return std::max(
|
||||||
( ( ( Couplers[end::front].Connected )
|
( ( ( Couplers[end::front].Connected )
|
||||||
&& ( ( Couplers[ end::front ].CouplingFlag & ctrain_power )
|
&& ( ( Couplers[ end::front ].CouplingFlag & ctrain_power )
|
||||||
|| ( ( Heating )
|
|| ( ( Couplers[ end::front ].CouplingFlag & ctrain_heating )
|
||||||
&& ( Couplers[ end::front ].CouplingFlag & ctrain_heating ) ) ) ) ?
|
&& ( Couplers[ end::front ].Connected->Heating ) ) ) ) ?
|
||||||
Couplers[end::front].Connected->Couplers[ Couplers[end::front].ConnectedNr ].power_high.voltage :
|
Couplers[end::front].Connected->Couplers[ Couplers[end::front].ConnectedNr ].power_high.voltage :
|
||||||
0.0 ),
|
0.0 ),
|
||||||
( ( ( Couplers[end::rear].Connected )
|
( ( ( Couplers[end::rear].Connected )
|
||||||
&& ( ( Couplers[ end::rear ].CouplingFlag & ctrain_power )
|
&& ( ( Couplers[ end::rear ].CouplingFlag & ctrain_power )
|
||||||
|| ( ( Heating )
|
|| ( ( Couplers[ end::rear ].CouplingFlag & ctrain_heating )
|
||||||
&& ( Couplers[ end::rear ].CouplingFlag & ctrain_heating ) ) ) ) ?
|
&& ( Couplers[ end::rear ].Connected->Heating ) ) ) ) ?
|
||||||
Couplers[ end::rear ].Connected->Couplers[ Couplers[ end::rear ].ConnectedNr ].power_high.voltage :
|
Couplers[ end::rear ].Connected->Couplers[ Couplers[ end::rear ].ConnectedNr ].power_high.voltage :
|
||||||
0.0 ) );
|
0.0 ) );
|
||||||
}
|
}
|
||||||
|
|||||||
21
Model3d.cpp
21
Model3d.cpp
@@ -789,6 +789,27 @@ int TSubModel::count_children() {
|
|||||||
1 + Child->count_siblings() );
|
1 + Child->count_siblings() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// locates submodel mapped with replacable -4
|
||||||
|
std::tuple<TSubModel *, bool>
|
||||||
|
TSubModel::find_replacable4() {
|
||||||
|
|
||||||
|
if( m_material == -4 ) {
|
||||||
|
return std::make_tuple( this, ( fLight != -1.0 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( Next != nullptr ) {
|
||||||
|
auto lookup { Next->find_replacable4() };
|
||||||
|
if( std::get<TSubModel *>( lookup ) != nullptr ) { return lookup; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if( Child != nullptr ) {
|
||||||
|
auto lookup { Child->find_replacable4() };
|
||||||
|
if( std::get<TSubModel *>( lookup ) != nullptr ) { return lookup; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::make_tuple( nullptr, false );
|
||||||
|
}
|
||||||
|
|
||||||
int TSubModel::FlagsCheck()
|
int TSubModel::FlagsCheck()
|
||||||
{ // analiza koniecznych zmian pomiędzy submodelami
|
{ // analiza koniecznych zmian pomiędzy submodelami
|
||||||
// samo pomijanie glBindTexture() nie poprawi wydajności
|
// samo pomijanie glBindTexture() nie poprawi wydajności
|
||||||
|
|||||||
@@ -166,6 +166,8 @@ public:
|
|||||||
TSubModel * ChildGet() { return Child; };
|
TSubModel * ChildGet() { return Child; };
|
||||||
int count_siblings();
|
int count_siblings();
|
||||||
int count_children();
|
int count_children();
|
||||||
|
// locates submodel mapped with replacable -4
|
||||||
|
std::tuple<TSubModel *, bool> find_replacable4();
|
||||||
int TriangleAdd(TModel3d *m, material_handle tex, int tri);
|
int TriangleAdd(TModel3d *m, material_handle tex, int tri);
|
||||||
void SetRotate(float3 vNewRotateAxis, float fNewAngle);
|
void SetRotate(float3 vNewRotateAxis, float fNewAngle);
|
||||||
void SetRotateXYZ( Math3D::vector3 vNewAngles);
|
void SetRotateXYZ( Math3D::vector3 vNewAngles);
|
||||||
|
|||||||
15
Train.cpp
15
Train.cpp
@@ -4153,7 +4153,7 @@ void TTrain::OnCommand_heatingtoggle( TTrain *Train, command_data const &Command
|
|||||||
|
|
||||||
if( Command.action == GLFW_PRESS ) {
|
if( Command.action == GLFW_PRESS ) {
|
||||||
// only reacting to press, so the switch doesn't flip back and forth if key is held down
|
// only reacting to press, so the switch doesn't flip back and forth if key is held down
|
||||||
if( false == Train->mvControlled->Heating ) {
|
if( false == Train->mvControlled->HeatingAllow ) {
|
||||||
// turn on
|
// turn on
|
||||||
OnCommand_heatingenable( Train, Command );
|
OnCommand_heatingenable( Train, Command );
|
||||||
}
|
}
|
||||||
@@ -4167,24 +4167,20 @@ void TTrain::OnCommand_heatingtoggle( TTrain *Train, command_data const &Command
|
|||||||
void TTrain::OnCommand_heatingenable( TTrain *Train, command_data const &Command ) {
|
void TTrain::OnCommand_heatingenable( TTrain *Train, command_data const &Command ) {
|
||||||
|
|
||||||
if( Command.action == GLFW_PRESS ) {
|
if( Command.action == GLFW_PRESS ) {
|
||||||
|
|
||||||
|
Train->mvControlled->HeatingAllow = true;
|
||||||
// visual feedback
|
// visual feedback
|
||||||
Train->ggTrainHeatingButton.UpdateValue( 1.0, Train->dsbSwitch );
|
Train->ggTrainHeatingButton.UpdateValue( 1.0, Train->dsbSwitch );
|
||||||
|
|
||||||
if( true == Train->mvControlled->Heating ) { return; } // already enabled
|
|
||||||
|
|
||||||
Train->mvControlled->Heating = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TTrain::OnCommand_heatingdisable( TTrain *Train, command_data const &Command ) {
|
void TTrain::OnCommand_heatingdisable( TTrain *Train, command_data const &Command ) {
|
||||||
|
|
||||||
if( Command.action == GLFW_PRESS ) {
|
if( Command.action == GLFW_PRESS ) {
|
||||||
|
|
||||||
|
Train->mvControlled->HeatingAllow = false;
|
||||||
// visual feedback
|
// visual feedback
|
||||||
Train->ggTrainHeatingButton.UpdateValue( 0.0, Train->dsbSwitch );
|
Train->ggTrainHeatingButton.UpdateValue( 0.0, Train->dsbSwitch );
|
||||||
|
|
||||||
if( false == Train->mvControlled->Heating ) { return; } // already disabled
|
|
||||||
|
|
||||||
Train->mvControlled->Heating = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6027,7 +6023,6 @@ bool TTrain::Update( double const Deltatime )
|
|||||||
//---------
|
//---------
|
||||||
// hunter-080812: poprawka na ogrzewanie w elektrykach - usuniete uzaleznienie od przetwornicy
|
// hunter-080812: poprawka na ogrzewanie w elektrykach - usuniete uzaleznienie od przetwornicy
|
||||||
if( ( mvControlled->Heating == true )
|
if( ( mvControlled->Heating == true )
|
||||||
&& ( mvControlled->Mains == true )
|
|
||||||
&& ( mvControlled->ConvOvldFlag == false ) )
|
&& ( mvControlled->ConvOvldFlag == false ) )
|
||||||
btLampkaOgrzewanieSkladu.Turn( true );
|
btLampkaOgrzewanieSkladu.Turn( true );
|
||||||
else
|
else
|
||||||
|
|||||||
Reference in New Issue
Block a user