mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-21 00:09:19 +02:00
merge, with tmj renderer
This commit is contained in:
196
DynObj.cpp
196
DynObj.cpp
@@ -186,9 +186,10 @@ float TDynamicObject::GetEPP()
|
||||
// od strony sprzegu (coupler_nr) obiektu (start)
|
||||
TDynamicObject *temp = this;
|
||||
int coupler_nr = 0;
|
||||
float eq = 0, am = 0;
|
||||
double eq = 0.0;
|
||||
double am = 0.0;
|
||||
|
||||
for (int i = 0; i < 300; i++) // ograniczenie do 300 na wypadek zapętlenia składu
|
||||
for (int i = 0; i < 300; ++i) // ograniczenie do 300 na wypadek zapętlenia składu
|
||||
{
|
||||
if (!temp)
|
||||
break; // Ra: zabezpieczenie przed ewentaulnymi błędami sprzęgów
|
||||
@@ -1729,7 +1730,7 @@ TDynamicObject::Init(std::string Name, // nazwa pojazdu, np. "EU07-424"
|
||||
if (ConversionError == -8)
|
||||
ErrorLog("Missed file: " + BaseDir + "\\" + Type_Name + ".fiz");
|
||||
Error("Cannot load dynamic object " + asName + " from:\r\n" + BaseDir + "\\" + Type_Name +
|
||||
".fiz\r\nError " + to_string(ConversionError) + " in line " + to_string(LineCount));
|
||||
".fiz\r\nError " + to_string(ConversionError));
|
||||
return 0.0; // zerowa długość to brak pojazdu
|
||||
}
|
||||
bool driveractive = (fVel != 0.0); // jeśli prędkość niezerowa, to aktywujemy ruch
|
||||
@@ -2744,26 +2745,20 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
if (Mechanik)
|
||||
{ // Ra 2F3F: do Driver.cpp to przenieść?
|
||||
MoverParameters->EqvtPipePress = GetEPP(); // srednie cisnienie w PG
|
||||
if ((Mechanik->Primary()) &&
|
||||
(MoverParameters->EngineType == ElectricInductionMotor)) // jesli glowny i z
|
||||
// asynchronami, to
|
||||
// niech steruje
|
||||
{ // hamulcem lacznie dla calego pociagu/ezt
|
||||
bool kier = (DirectionGet() * MoverParameters->ActiveCab > 0);
|
||||
float FED = 0;
|
||||
int np = 0;
|
||||
float masa = 0;
|
||||
float FrED = 0;
|
||||
float masamax = 0;
|
||||
float FmaxPN = 0;
|
||||
float FfulED = 0;
|
||||
float FmaxED = 0;
|
||||
float Fzad = 0;
|
||||
float FzadED = 0;
|
||||
float FzadPN = 0;
|
||||
float Frj = 0;
|
||||
float amax = 0;
|
||||
float osie = 0;
|
||||
if( ( Mechanik->Primary() )
|
||||
&& ( MoverParameters->EngineType == ElectricInductionMotor ) ) {
|
||||
// jesli glowny i z asynchronami, to niech steruje hamulcem lacznie dla calego pociagu/ezt
|
||||
auto const kier = (DirectionGet() * MoverParameters->ActiveCab > 0);
|
||||
auto FED { 0.0 };
|
||||
auto np { 0 };
|
||||
auto masa { 0.0 };
|
||||
auto FrED { 0.0 };
|
||||
auto masamax { 0.0 };
|
||||
auto FmaxPN { 0.0 };
|
||||
auto FfulED { 0.0 };
|
||||
auto FmaxED { 0.0 };
|
||||
auto Frj { 0.0 };
|
||||
auto osie { 0 };
|
||||
// 1. ustal wymagana sile hamowania calego pociagu
|
||||
// - opoznienie moze byc ustalane na podstawie charakterystyki
|
||||
// - opoznienie moze byc ustalane na podstawie mas i cisnien granicznych
|
||||
@@ -2774,11 +2769,14 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
for (TDynamicObject *p = GetFirstDynamic(MoverParameters->ActiveCab < 0 ? 1 : 0, 4); p;
|
||||
(kier ? p = p->NextC(4) : p = p->PrevC(4)))
|
||||
{
|
||||
np++;
|
||||
masamax += p->MoverParameters->MBPM +
|
||||
(p->MoverParameters->MBPM > 1 ? 0 : p->MoverParameters->Mass) +
|
||||
p->MoverParameters->Mred;
|
||||
float Nmax = ((p->MoverParameters->P2FTrans * p->MoverParameters->MaxBrakePress[0] -
|
||||
++np;
|
||||
masamax +=
|
||||
p->MoverParameters->MBPM
|
||||
+ ( p->MoverParameters->MBPM > 1.0 ?
|
||||
0.0 :
|
||||
p->MoverParameters->Mass )
|
||||
+ p->MoverParameters->Mred;
|
||||
auto const Nmax = ((p->MoverParameters->P2FTrans * p->MoverParameters->MaxBrakePress[0] -
|
||||
p->MoverParameters->BrakeCylSpring) *
|
||||
p->MoverParameters->BrakeCylMult[0] -
|
||||
p->MoverParameters->BrakeSlckAdj) *
|
||||
@@ -2792,18 +2790,19 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
0) ?
|
||||
p->MoverParameters->eimc[eimc_p_Fh] * 1000 :
|
||||
0); // chwilowy max ED -> do rozdzialu sil
|
||||
FED -= Min0R(p->MoverParameters->eimv[eimv_Fmax], 0) *
|
||||
FED -= std::min(p->MoverParameters->eimv[eimv_Fmax], 0.0) *
|
||||
1000; // chwilowy max ED -> do rozdzialu sil
|
||||
FfulED = Min0R(p->MoverParameters->eimv[eimv_Fful], 0) *
|
||||
FfulED = std::min(p->MoverParameters->eimv[eimv_Fful], 0.0) *
|
||||
1000; // chwilowy max ED -> do rozdzialu sil
|
||||
FrED -= Min0R(p->MoverParameters->eimv[eimv_Fr], 0) *
|
||||
FrED -= std::min(p->MoverParameters->eimv[eimv_Fr], 0.0) *
|
||||
1000; // chwilowo realizowane ED -> do pneumatyki
|
||||
Frj += Max0R(p->MoverParameters->eimv[eimv_Fr], 0) *
|
||||
Frj += std::max(p->MoverParameters->eimv[eimv_Fr], 0.0) *
|
||||
1000;// chwilowo realizowany napęd -> do utrzymującego
|
||||
masa += p->MoverParameters->TotalMass;
|
||||
osie += p->MoverParameters->NAxles;
|
||||
}
|
||||
amax = FmaxPN / masamax;
|
||||
|
||||
auto const amax = FmaxPN / masamax;
|
||||
if ((MoverParameters->Vel < 0.5) && (MoverParameters->BrakePress > 0.2) ||
|
||||
(dDoorMoveL > 0.001) || (dDoorMoveR > 0.001))
|
||||
{
|
||||
@@ -2820,24 +2819,28 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
MoverParameters->ShuntModeAllow = (MoverParameters->BrakePress > 0.2) &&
|
||||
(MoverParameters->LocalBrakeRatio() < 0.01);
|
||||
}
|
||||
Fzad = amax * MoverParameters->LocalBrakeRatio() * masa;
|
||||
auto Fzad = amax * MoverParameters->LocalBrakeRatio() * masa;
|
||||
if ((MoverParameters->ScndS) &&
|
||||
(MoverParameters->Vel > MoverParameters->eimc[eimc_p_Vh1]) && (FmaxED > 0))
|
||||
{
|
||||
Fzad = Min0R(MoverParameters->LocalBrakeRatio() * FmaxED, FfulED);
|
||||
Fzad = std::min(MoverParameters->LocalBrakeRatio() * FmaxED, FfulED);
|
||||
}
|
||||
if (((MoverParameters->ShuntMode) && (Frj < 0.0015 * masa)) ||
|
||||
(MoverParameters->V * MoverParameters->DirAbsolute < -0.2))
|
||||
{
|
||||
Fzad = Max0R(MoverParameters->StopBrakeDecc * masa, Fzad);
|
||||
Fzad = std::max(MoverParameters->StopBrakeDecc * masa, Fzad);
|
||||
}
|
||||
|
||||
if (MoverParameters->BrakeHandle == MHZ_EN57?MoverParameters->BrakeOpModeFlag & bom_MED:MoverParameters->EpFuse)
|
||||
FzadED = Min0R(Fzad, FmaxED);
|
||||
else
|
||||
FzadED = 0;
|
||||
FzadPN = Fzad - FrED;
|
||||
auto FzadED { 0.0 };
|
||||
if( ( MoverParameters->EpFuse )
|
||||
|| ( ( MoverParameters->BrakeHandle == MHZ_EN57 )
|
||||
&& ( MoverParameters->BrakeOpModeFlag & bom_MED ) ) ) {
|
||||
FzadED = std::min( Fzad, FmaxED );
|
||||
}
|
||||
auto const FzadPN = Fzad - FrED;
|
||||
//np = 0;
|
||||
// BUG: likely memory leak, allocation per inner loop, deleted only once outside
|
||||
// TODO: sort this shit out
|
||||
bool* PrzekrF = new bool[np];
|
||||
float nPrzekrF = 0;
|
||||
bool test = true;
|
||||
@@ -2861,7 +2864,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
for (TDynamicObject *p = GetFirstDynamic(MoverParameters->ActiveCab < 0 ? 1 : 0, 4); p;
|
||||
p = (kier == true ? p->NextC(4) : p->PrevC(4)) )
|
||||
{
|
||||
float Nmax = ((p->MoverParameters->P2FTrans * p->MoverParameters->MaxBrakePress[0] -
|
||||
auto const Nmax = ((p->MoverParameters->P2FTrans * p->MoverParameters->MaxBrakePress[0] -
|
||||
p->MoverParameters->BrakeCylSpring) *
|
||||
p->MoverParameters->BrakeCylMult[0] -
|
||||
p->MoverParameters->BrakeSlckAdj) *
|
||||
@@ -2876,8 +2879,8 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
FzED[i] = (FmaxED > 0 ? FzadED / FmaxED : 0);
|
||||
p->MoverParameters->AnPos =
|
||||
(MoverParameters->ScndS ? MoverParameters->LocalBrakeRatio() : FzED[i]);
|
||||
FzEP[i] = FzadPN * p->MoverParameters->NAxles / osie;
|
||||
i++;
|
||||
FzEP[ i ] = static_cast<float>( FzadPN * p->MoverParameters->NAxles ) / static_cast<float>( osie );
|
||||
++i;
|
||||
p->MoverParameters->ShuntMode = MoverParameters->ShuntMode;
|
||||
p->MoverParameters->ShuntModeAllow = MoverParameters->ShuntModeAllow;
|
||||
}
|
||||
@@ -2908,7 +2911,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
FzEP[i] = 0;
|
||||
przek += przek1;
|
||||
}
|
||||
i++;
|
||||
++i;
|
||||
}
|
||||
i = 0;
|
||||
przek = przek / (np - nPrzekrF);
|
||||
@@ -2919,7 +2922,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
{
|
||||
FzEP[i] += przek;
|
||||
}
|
||||
i++;
|
||||
++i;
|
||||
}
|
||||
}
|
||||
i = 0;
|
||||
@@ -2950,31 +2953,8 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
p->MoverParameters->LocalBrakePosA = p->MoverParameters->LocalBrakePosA;
|
||||
else
|
||||
p->MoverParameters->LocalBrakePosA = 0;
|
||||
i++;
|
||||
++i;
|
||||
}
|
||||
/* ////ALGORYTM 1 - KAZDEMU PO ROWNO
|
||||
for (TDynamicObject *p = GetFirstDynamic(MoverParameters->ActiveCab < 0 ? 1 : 0); p;
|
||||
(iDirection > 0 ? p = p->NextC(4) : p = p->PrevC(4)))
|
||||
{
|
||||
|
||||
float Nmax = ((p->MoverParameters->P2FTrans * p->MoverParameters->MaxBrakePress[0] -
|
||||
p->MoverParameters->BrakeCylSpring) *
|
||||
p->MoverParameters->BrakeCylMult[0] -
|
||||
p->MoverParameters->BrakeSlckAdj) *
|
||||
p->MoverParameters->BrakeCylNo * p->MoverParameters->BrakeRigEff;
|
||||
float FmaxPoj = Nmax *
|
||||
p->MoverParameters->Hamulec->GetFC(
|
||||
Nmax / (p->MoverParameters->NAxles * p->MoverParameters->NBpA),
|
||||
p->MoverParameters->Vel) *
|
||||
1000; // sila hamowania pn
|
||||
// Fpoj=(FED>0?-FzadED*p->MoverParameters->eimv[eimv_Fmax]*1000/FED:0);
|
||||
// p->MoverParameters->AnPos=(p->MoverParameters->eimc[eimc_p_Fh]>1?0.001f*Fpoj/(p->MoverParameters->eimc[eimc_p_Fh]):0);
|
||||
p->MoverParameters->AnPos = (FmaxED > 0 ? FzadED / FmaxED : 0);
|
||||
// Fpoj = FzadPN * Min0R(p->MoverParameters->TotalMass / masa, 1);
|
||||
// p->MoverParameters->LocalBrakePosA =
|
||||
// (p->MoverParameters->SlippingWheels ? 0 : Min0R(Max0R(Fpoj / FmaxPoj, 0), 1));
|
||||
p->MoverParameters->LocalBrakePosA = (p->MoverParameters->SlippingWheels ? 0 : FzadPN / FmaxPN);
|
||||
} */
|
||||
|
||||
MED[0][0] = masa*0.001;
|
||||
MED[0][1] = amax;
|
||||
@@ -2991,14 +2971,6 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
delete[] FmaxEP;
|
||||
}
|
||||
|
||||
// yB: cos (AI) tu jest nie kompatybilne z czyms (hamulce)
|
||||
// if (Controller!=Humandriver)
|
||||
// if (Mechanik->LastReactionTime>0.5)
|
||||
// {
|
||||
// MoverParameters->BrakeCtrlPos=0;
|
||||
// Mechanik->LastReactionTime=0;
|
||||
// }
|
||||
|
||||
Mechanik->UpdateSituation(dt1); // przebłyski świadomości AI
|
||||
}
|
||||
|
||||
@@ -4095,7 +4067,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
||||
{
|
||||
std::string nowheretexture = TextureTest(Global::asCurrentTexturePath + "nowhere"); // na razie prymitywnie
|
||||
if( false == nowheretexture.empty() ) {
|
||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.GetTextureId( nowheretexture, "", 9 );
|
||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.Fetch_Material( nowheretexture );
|
||||
}
|
||||
|
||||
if (m_materialdata.multi_textures > 0) {
|
||||
@@ -4107,7 +4079,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
||||
int skinindex = 0;
|
||||
std::string texturename; nameparser >> texturename;
|
||||
while( ( texturename != "" ) && ( skinindex < 4 ) ) {
|
||||
m_materialdata.replacable_skins[ skinindex + 1 ] = GfxRenderer.GetTextureId( Global::asCurrentTexturePath + texturename, "" );
|
||||
m_materialdata.replacable_skins[ skinindex + 1 ] = GfxRenderer.Fetch_Material( Global::asCurrentTexturePath + texturename );
|
||||
++skinindex;
|
||||
texturename = ""; nameparser >> texturename;
|
||||
}
|
||||
@@ -4117,24 +4089,24 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
||||
// otherwise try the basic approach
|
||||
int skinindex = 0;
|
||||
do {
|
||||
texture_handle texture = GfxRenderer.GetTextureId( Global::asCurrentTexturePath + ReplacableSkin + "," + std::to_string( skinindex + 1 ), "", Global::iDynamicFiltering, true );
|
||||
if( texture == 0 ) {
|
||||
material_handle material = GfxRenderer.Fetch_Material( Global::asCurrentTexturePath + ReplacableSkin + "," + std::to_string( skinindex + 1 ), true );
|
||||
if( material == null_handle ) {
|
||||
break;
|
||||
}
|
||||
m_materialdata.replacable_skins[ skinindex + 1 ] = texture;
|
||||
m_materialdata.replacable_skins[ skinindex + 1 ] = material;
|
||||
++skinindex;
|
||||
} while( skinindex < 4 );
|
||||
m_materialdata.multi_textures = skinindex;
|
||||
if( m_materialdata.multi_textures == 0 ) {
|
||||
// zestaw nie zadziałał, próbujemy normanie
|
||||
m_materialdata.replacable_skins[ 1 ] = GfxRenderer.GetTextureId( Global::asCurrentTexturePath + ReplacableSkin, "", Global::iDynamicFiltering );
|
||||
m_materialdata.replacable_skins[ 1 ] = GfxRenderer.Fetch_Material( Global::asCurrentTexturePath + ReplacableSkin );
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_materialdata.replacable_skins[ 1 ] = GfxRenderer.GetTextureId( Global::asCurrentTexturePath + ReplacableSkin, "", Global::iDynamicFiltering );
|
||||
m_materialdata.replacable_skins[ 1 ] = GfxRenderer.Fetch_Material( Global::asCurrentTexturePath + ReplacableSkin );
|
||||
}
|
||||
if( GfxRenderer.Texture( 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
|
||||
m_materialdata.textures_alpha = 0x31310031;
|
||||
}
|
||||
@@ -4144,17 +4116,17 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
||||
}
|
||||
|
||||
if( ( m_materialdata.replacable_skins[ 2 ] )
|
||||
&& ( GfxRenderer.Texture( m_materialdata.replacable_skins[ 2 ] ).has_alpha ) ) {
|
||||
&& ( GfxRenderer.Material( m_materialdata.replacable_skins[ 2 ] ).has_alpha ) ) {
|
||||
// tekstura -2 z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||
m_materialdata.textures_alpha |= 0x02020002;
|
||||
}
|
||||
if( ( m_materialdata.replacable_skins[ 3 ] )
|
||||
&& ( GfxRenderer.Texture( m_materialdata.replacable_skins[ 3 ] ).has_alpha ) ) {
|
||||
&& ( GfxRenderer.Material( m_materialdata.replacable_skins[ 3 ] ).has_alpha ) ) {
|
||||
// tekstura -3 z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||
m_materialdata.textures_alpha |= 0x04040004;
|
||||
}
|
||||
if( ( m_materialdata.replacable_skins[ 4 ] )
|
||||
&& ( GfxRenderer.Texture( m_materialdata.replacable_skins[ 4 ] ).has_alpha ) ) {
|
||||
&& ( GfxRenderer.Material( m_materialdata.replacable_skins[ 4 ] ).has_alpha ) ) {
|
||||
// tekstura -4 z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||
m_materialdata.textures_alpha |= 0x08080008;
|
||||
}
|
||||
@@ -5400,7 +5372,7 @@ int TDynamicObject::RouteWish(TTrack *tr)
|
||||
|
||||
std::string TDynamicObject::TextureTest(std::string const &name)
|
||||
{ // Ra 2015-01: sprawdzenie dostępności tekstury o podanej nazwie
|
||||
std::vector<std::string> extensions = { ".dds", ".tga", ".bmp" };
|
||||
std::vector<std::string> extensions = { ".mat", ".dds", ".tga", ".bmp" };
|
||||
for( auto const &extension : extensions ) {
|
||||
if( true == FileExists( name + extension ) ) {
|
||||
return name + extension;
|
||||
@@ -5422,36 +5394,22 @@ void TDynamicObject::DestinationSet(std::string to, std::string numer)
|
||||
numer = Global::Bezogonkow(numer);
|
||||
asDestination = to;
|
||||
to = Global::Bezogonkow(to); // do szukania pliku obcinamy ogonki
|
||||
std::string x = TextureTest(asBaseDir + numer + "@" + MoverParameters->TypeName);
|
||||
if (!x.empty())
|
||||
{
|
||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.GetTextureId( x, "", 9 ); // rozmywania 0,1,4,5 nie nadają się
|
||||
return;
|
||||
|
||||
std::vector<std::string> destinations = {
|
||||
asBaseDir + numer + "@" + MoverParameters->TypeName,
|
||||
asBaseDir + numer,
|
||||
asBaseDir + to + "@" + MoverParameters->TypeName,
|
||||
asBaseDir + to,
|
||||
asBaseDir + "nowhere" };
|
||||
|
||||
for( auto const &destination : destinations ) {
|
||||
|
||||
auto material = TextureTest( destination );
|
||||
if( false == material.empty() ) {
|
||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.Fetch_Material( material );
|
||||
break;
|
||||
}
|
||||
}
|
||||
x = TextureTest(asBaseDir + numer );
|
||||
if (!x.empty())
|
||||
{
|
||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.GetTextureId( x, "", 9 ); // rozmywania 0,1,4,5 nie nadają się
|
||||
return;
|
||||
}
|
||||
if (to.empty())
|
||||
to = "nowhere";
|
||||
x = TextureTest(asBaseDir + to + "@" + MoverParameters->TypeName); // w pierwszej kolejności z nazwą FIZ/MMD
|
||||
if (!x.empty())
|
||||
{
|
||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.GetTextureId( x, "", 9 ); // rozmywania 0,1,4,5 nie nadają się
|
||||
return;
|
||||
}
|
||||
x = TextureTest(asBaseDir + to); // na razie prymitywnie
|
||||
if (!x.empty())
|
||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.GetTextureId( x, "", 9 ); // rozmywania 0,1,4,5 nie nadają się
|
||||
else
|
||||
{
|
||||
x = TextureTest(asBaseDir + "nowhere"); // jak nie znalazł dedykowanej, to niech daje nowhere
|
||||
if (!x.empty())
|
||||
m_materialdata.replacable_skins[ 4 ] = GfxRenderer.GetTextureId( x, "", 9 );
|
||||
}
|
||||
// Ra 2015-01: żeby zalogować błąd, trzeba by mieć pewność, że model używa tekstury nr 4
|
||||
};
|
||||
|
||||
void TDynamicObject::OverheadTrack(float o)
|
||||
|
||||
Reference in New Issue
Block a user