mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-19 11:09:19 +02:00
LCD Screens in python
Merge with python branch
This commit is contained in:
202
DynObj.cpp
202
DynObj.cpp
@@ -54,7 +54,7 @@ void TAnimPant::AKP_4E()
|
||||
fLenL1 = 1.22; // 1.176289 w modelach
|
||||
fLenU1 = 1.755; // 1.724482197 w modelach
|
||||
fHoriz = 0.535; // 0.54555075 przesunięcie ślizgu w długości pojazdu względem osi obrotu dolnego
|
||||
// ramienia
|
||||
// ramienia
|
||||
fHeight = 0.07; // wysokość ślizgu ponad oś obrotu
|
||||
fWidth = 0.635; // połowa szerokości ślizgu, 0.635 dla AKP-1 i AKP-4E
|
||||
fAngleL0 = DegToRad(2.8547285515689267247882521833308);
|
||||
@@ -68,7 +68,7 @@ void TAnimPant::AKP_4E()
|
||||
hvPowerWire = NULL;
|
||||
fWidthExtra = 0.381; //(2.032m-1.027)/2
|
||||
// poza obszarem roboczym jest aproksymacja łamaną o 5 odcinkach
|
||||
fHeightExtra[0] = 0.0; //+0.0762
|
||||
fHeightExtra[0] = 0.0; //+0.0762
|
||||
fHeightExtra[1] = -0.01; //+0.1524
|
||||
fHeightExtra[2] = -0.03; //+0.2286
|
||||
fHeightExtra[3] = -0.07; //+0.3048
|
||||
@@ -131,7 +131,8 @@ TAnim::~TAnim()
|
||||
break;
|
||||
}
|
||||
};
|
||||
void TAnim::Parovoz(){// animowanie tłoka i rozrządu parowozu
|
||||
void TAnim::Parovoz(){
|
||||
// animowanie tłoka i rozrządu parowozu
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
TDynamicObject *__fastcall TDynamicObject::FirstFind(int &coupler_nr)
|
||||
@@ -288,7 +289,10 @@ TDynamicObject* TDynamicObject::GetFirstCabDynamic(int cpl_type)
|
||||
};
|
||||
*/
|
||||
|
||||
void TDynamicObject::ABuSetModelShake(vector3 mShake) { modelShake = mShake; };
|
||||
void TDynamicObject::ABuSetModelShake(vector3 mShake)
|
||||
{
|
||||
modelShake = mShake;
|
||||
};
|
||||
|
||||
int TDynamicObject::GetPneumatic(bool front, bool red)
|
||||
{
|
||||
@@ -413,7 +417,7 @@ void TDynamicObject::UpdateDoorRotate(TAnim *pAnim)
|
||||
{ // animacja drzwi - obrót
|
||||
if (pAnim->smAnimated)
|
||||
{ // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac
|
||||
// submodelami i ShiftL=90,R=180)
|
||||
// submodelami i ShiftL=90,R=180)
|
||||
if (pAnim->iNumber & 1)
|
||||
pAnim->smAnimated->SetRotate(float3(1, 0, 0), dDoorMoveR);
|
||||
else
|
||||
@@ -425,7 +429,7 @@ void TDynamicObject::UpdateDoorFold(TAnim *pAnim)
|
||||
{ // animacja drzwi - obrót
|
||||
if (pAnim->smAnimated)
|
||||
{ // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac
|
||||
// submodelami i ShiftL=90,R=180)
|
||||
// submodelami i ShiftL=90,R=180)
|
||||
if (pAnim->iNumber & 1)
|
||||
{
|
||||
pAnim->smAnimated->SetRotate(float3(0, 0, 1), dDoorMoveR);
|
||||
@@ -849,7 +853,7 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
|
||||
}
|
||||
if (MoverParameters->Battery)
|
||||
{ // sygnały czoła pociagu //Ra: wyświetlamy bez ograniczeń odległości, by były widoczne z
|
||||
// daleka
|
||||
// daleka
|
||||
if (TestFlag(iLights[0], 1))
|
||||
{
|
||||
btHeadSignals11.TurnOn();
|
||||
@@ -899,7 +903,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track,
|
||||
TDynamicObject *MyPointer,
|
||||
int &CouplNr)
|
||||
{ // zwraca wskaznik do obiektu znajdujacego sie na torze (Track), którego sprzęg jest najblizszy
|
||||
// kamerze
|
||||
// kamerze
|
||||
// służy np. do łączenia i rozpinania sprzęgów
|
||||
// WE: Track - tor, na ktorym odbywa sie poszukiwanie
|
||||
// MyPointer - wskaznik do obiektu szukajacego
|
||||
@@ -926,7 +930,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track,
|
||||
{ // wektor [kamera-sprzeg0], potem [kamera-sprzeg1]
|
||||
// Powinno byc wyliczone, ale nie zaszkodzi drugi raz:
|
||||
//(bo co, jesli nie wykonuje sie obrotow wozkow?) - Ra: ale zawsze są liczone
|
||||
//współrzędne sprzęgów
|
||||
// współrzędne sprzęgów
|
||||
// Track->Dynamics[i]->modelRot.z=ABuAcos(Track->Dynamics[i]->Axle0.pPosition-Track->Dynamics[i]->Axle1.pPosition);
|
||||
// poz=Track->Dynamics[i]->vPosition; //pozycja środka pojazdu
|
||||
// kon=vector3( //położenie przodu względem środka
|
||||
@@ -1101,7 +1105,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan
|
||||
0; // to, bo (ScanDir>=0)
|
||||
if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy
|
||||
{ // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej
|
||||
// szynie i się mija
|
||||
// szynie i się mija
|
||||
// Ra: mijanie samochodów wcale nie jest proste
|
||||
// Przesuniecie wzgledne pojazdow. Wyznaczane, zeby sprawdzic,
|
||||
// czy pojazdy faktycznie sie zderzaja (moga byc przesuniete
|
||||
@@ -1120,7 +1124,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan
|
||||
if (RelOffsetH + RelOffsetH >
|
||||
MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W)
|
||||
continue; // odległość większa od połowy sumy szerokości - kolizji
|
||||
// nie będzie
|
||||
// nie będzie
|
||||
// jeśli zahaczenie jest niewielkie, a jest miejsce na poboczu, to
|
||||
// zjechać na pobocze
|
||||
}
|
||||
@@ -1147,7 +1151,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan
|
||||
1; // odwrotnie, bo (ScanDir<0)
|
||||
if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy
|
||||
{ // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej
|
||||
// szynie i się mija
|
||||
// szynie i się mija
|
||||
// Ra: mijanie samochodów wcale nie jest proste
|
||||
// Przesunięcie względne pojazdów. Wyznaczane, żeby sprawdzić,
|
||||
// czy pojazdy faktycznie się zderzają (mogą być przesunięte
|
||||
@@ -1166,7 +1170,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan
|
||||
if (RelOffsetH + RelOffsetH >
|
||||
MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W)
|
||||
continue; // odległość większa od połowy sumy szerokości - kolizji
|
||||
// nie będzie
|
||||
// nie będzie
|
||||
}
|
||||
iMinDist = i; // potencjalna kolizja
|
||||
MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów
|
||||
@@ -1175,7 +1179,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan
|
||||
}
|
||||
}
|
||||
dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka do przeskanowanej
|
||||
// odległości
|
||||
// odległości
|
||||
return (iMinDist >= 0) ? Track->Dynamics[iMinDist] : NULL;
|
||||
}
|
||||
dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej odległości
|
||||
@@ -1227,7 +1231,7 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir)
|
||||
if ((PrevConnectedNo ? PrevConnected->NextConnected :
|
||||
PrevConnected->PrevConnected) == this)
|
||||
{ // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w
|
||||
// innym kierunku)
|
||||
// innym kierunku)
|
||||
PrevConnected->MoverParameters->Couplers[PrevConnectedNo].Connected = NULL;
|
||||
if (PrevConnectedNo == 0)
|
||||
{
|
||||
@@ -1257,7 +1261,7 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir)
|
||||
if ((NextConnectedNo ? NextConnected->NextConnected :
|
||||
NextConnected->PrevConnected) == this)
|
||||
{ // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w
|
||||
// innym kierunku)
|
||||
// innym kierunku)
|
||||
NextConnected->MoverParameters->Couplers[NextConnectedNo].Connected = NULL;
|
||||
if (NextConnectedNo == 0)
|
||||
{
|
||||
@@ -1289,7 +1293,7 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist)
|
||||
FirstAxle->GetTrack(); // tor na którym "stoi" skrajny wózek (może być inny niż tor pojazdu)
|
||||
if (FirstAxle->GetDirection() < 0) // czy oś jest ustawiona w stronę Point1?
|
||||
ScanDir = -ScanDir; // jeśli tak, to kierunek szukania będzie przeciwny (teraz względem
|
||||
// toru)
|
||||
// toru)
|
||||
Byte MyCouplFound; // numer sprzęgu do podłączenia w obiekcie szukajacym
|
||||
MyCouplFound = (MyScanDir < 0) ? 1 : 0;
|
||||
Byte CouplFound; // numer sprzęgu w znalezionym obiekcie (znaleziony wypełni)
|
||||
@@ -1511,7 +1515,7 @@ TDynamicObject::TDynamicObject()
|
||||
cp1 = cp2 = sp1 = sp2 = 0;
|
||||
iDirection = 1; // stoi w kierunku tradycyjnym (0, gdy jest odwrócony)
|
||||
iAxleFirst = 0; // numer pierwszej osi w kierunku ruchu (przełączenie następuje, gdy osie sa na
|
||||
// tym samym torze)
|
||||
// tym samym torze)
|
||||
iInventory = 0; // flagi bitowe posiadanych submodeli (zaktualizuje się po wczytaniu MMD)
|
||||
RaLightsSet(0, 0); // początkowe zerowanie stanu świateł
|
||||
// Ra: domyślne ilości animacji dla zgodności wstecz (gdy brak ilości podanych w MMD)
|
||||
@@ -1536,7 +1540,7 @@ TDynamicObject::TDynamicObject()
|
||||
fScanDist = 300.0; // odległość skanowania, zwiększana w trybie łączenia
|
||||
ctOwner = NULL; // na początek niczyj
|
||||
iOverheadMask = 0; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały
|
||||
// jazdę bezprądową
|
||||
// jazdę bezprądową
|
||||
tmpTraction.TractionVoltage =
|
||||
0; // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało WS pod izolatorem
|
||||
fAdjustment = 0.0; // korekcja odległości pomiędzy wózkami (np. na łukach)
|
||||
@@ -1651,7 +1655,7 @@ double TDynamicObject::Init(
|
||||
int dlugosc = MoreParams.Length();
|
||||
ActPar = MoreParams.SubString(1, kropka - 1).UpperCase(); // pierwszy parametr;
|
||||
MoreParams = MoreParams.SubString(kropka + 1, dlugosc - kropka); // reszta do dalszej
|
||||
// obrobki
|
||||
// obrobki
|
||||
kropka = MoreParams.Pos(".");
|
||||
|
||||
if (ActPar.SubString(1, 1) == "B") // jesli hamulce
|
||||
@@ -1780,13 +1784,13 @@ double TDynamicObject::Init(
|
||||
{ // ustawianie samochodow na poboczu albo na środku drogi
|
||||
if (Track->fTrackWidth < 3.5) // jeśli droga wąska
|
||||
MoverParameters->OffsetTrackH = 0.0; // to stawiamy na środku, niezależnie od stanu
|
||||
// ruchu
|
||||
// ruchu
|
||||
else if (driveractive) // od 3.5m do 8.0m jedzie po środku pasa, dla szerszych w odległości
|
||||
// 1.5m
|
||||
// 1.5m
|
||||
MoverParameters->OffsetTrackH =
|
||||
Track->fTrackWidth <= 8.0 ? -Track->fTrackWidth * 0.25 : -1.5;
|
||||
else // jak stoi, to kołem na poboczu i pobieramy szerokość razem z poboczem, ale nie z
|
||||
// chodnikiem
|
||||
// chodnikiem
|
||||
MoverParameters->OffsetTrackH =
|
||||
-0.5 * (Track->WidthTotal() - MoverParameters->Dim.W) + 0.05;
|
||||
iHornWarning = 0; // nie będzie trąbienia po podaniu zezwolenia na jazdę
|
||||
@@ -1889,7 +1893,7 @@ double TDynamicObject::Init(
|
||||
smBuforPrawy[i]->WillBeAnimated();
|
||||
}
|
||||
for (int i = 0; i < iAxles; i++) // wyszukiwanie osi (0 jest na końcu, dlatego dodajemy
|
||||
// długość?)
|
||||
// długość?)
|
||||
dRailPosition[i] =
|
||||
(Reversed ? -dWheelsPosition[i] : (dWheelsPosition[i] + MoverParameters->Dim.L)) +
|
||||
fDist;
|
||||
@@ -1943,7 +1947,7 @@ double TDynamicObject::Init(
|
||||
break;
|
||||
}
|
||||
Move(0.0001); // potrzebne do wyliczenia aktualnej pozycji; nie może być zero, bo nie przeliczy
|
||||
// pozycji
|
||||
// pozycji
|
||||
// teraz jeszcze trzeba przypisać pojazdy do nowego toru, bo przesuwanie początkowe osi nie
|
||||
// zrobiło tego
|
||||
ABuCheckMyTrack(); // zmiana toru na ten, co oś Axle0 (oś z przodu)
|
||||
@@ -2009,11 +2013,11 @@ void TDynamicObject::Move(double fDistance)
|
||||
bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oś z tyłu pojazdu prusza się pierwsza
|
||||
bEnabled &= Axle0.Move(fDistance /*-fAdjustment*/, !iAxleFirst); // oś z przodu pojazdu
|
||||
}
|
||||
else //gf: bez wywolania Move na postoju nie ma event0
|
||||
{
|
||||
bEnabled&=Axle1.Move(fDistance,iAxleFirst); //oś z tyłu pojazdu prusza się pierwsza
|
||||
bEnabled&=Axle0.Move(fDistance,!iAxleFirst); //oś z przodu pojazdu
|
||||
}
|
||||
else // gf: bez wywolania Move na postoju nie ma event0
|
||||
{
|
||||
bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oś z tyłu pojazdu prusza się pierwsza
|
||||
bEnabled &= Axle0.Move(fDistance, !iAxleFirst); // oś z przodu pojazdu
|
||||
}
|
||||
if (fDistance != 0.0) // nie liczyć ponownie, jeśli stoi
|
||||
{ // liczenie pozycji pojazdu tutaj, bo jest używane w wielu miejscach
|
||||
vPosition = 0.5 * (Axle1.pPosition + Axle0.pPosition); //środek między skrajnymi osiami
|
||||
@@ -2049,7 +2053,7 @@ void TDynamicObject::Move(double fDistance)
|
||||
}
|
||||
mMatrix.Identity(); // to też można by od razu policzyć, ale potrzebne jest do wyświetlania
|
||||
mMatrix.BasisChange(vLeft, vUp, vFront); // przesuwanie jest jednak rzadziej niż
|
||||
// renderowanie
|
||||
// renderowanie
|
||||
mMatrix =
|
||||
Inverse(mMatrix); // wyliczenie macierzy dla pojazdu (potrzebna tylko do wyświetlania?)
|
||||
// if (MoverParameters->CategoryFlag&2)
|
||||
@@ -2076,7 +2080,7 @@ void TDynamicObject::Move(double fDistance)
|
||||
TTrack *t0 = Axle0.GetTrack(); // już po przesunięciu
|
||||
TTrack *t1 = Axle1.GetTrack();
|
||||
if ((t0->eEnvironment == e_flat) && (t1->eEnvironment == e_flat)) // może być
|
||||
// e_bridge...
|
||||
// e_bridge...
|
||||
fShade = 0.0; // standardowe oświetlenie
|
||||
else
|
||||
{ // jeżeli te tory mają niestandardowy stopień zacienienia (e_canyon, e_tunnel)
|
||||
@@ -2171,11 +2175,11 @@ void TDynamicObject::AttachPrev(TDynamicObject *Object, int iType)
|
||||
if ((MoverParameters->Power < 1.0) &&
|
||||
(Object->MoverParameters->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma
|
||||
iLights = Object->MoverParameters->iLights; // to w tym z mocą będą światła
|
||||
// załączane, a w tym bez tylko widoczne
|
||||
// załączane, a w tym bez tylko widoczne
|
||||
else if ((MoverParameters->Power > 1.0) &&
|
||||
(Object->MoverParameters->Power < 1.0)) // my mamy moc, ale ten drugi nie ma
|
||||
Object->iLights = MoverParameters->iLights; // to w tym z mocą będą światła
|
||||
// załączane, a w tym bez tylko widoczne
|
||||
// załączane, a w tym bez tylko widoczne
|
||||
return;
|
||||
// SetPneumatic(1,1); //Ra: to i tak się nie wykonywało po return
|
||||
// SetPneumatic(1,0);
|
||||
@@ -2337,10 +2341,10 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
// if ((!MoverParameters->PantCompFlag)&&(MoverParameters->CompressedVolume>=2.8))
|
||||
// MoverParameters->PantVolume=MoverParameters->CompressedVolume;
|
||||
if (MoverParameters->PantPress < (MoverParameters->TrainType == dt_EZT ? 2.4 : 3.5))
|
||||
{ // 3.5 wg http://www.transportszynowy.pl/eu06-07pneumat.php
|
||||
{ // 3.5 wg http://www.transportszynowy.pl/eu06-07pneumat.php
|
||||
//"Wyłączniki ciśnieniowe odbieraków prądu wyłączają sterowanie wyłącznika szybkiego
|
||||
//oraz uniemożliwiają podniesienie odbieraków prądu, gdy w instalacji rozrządu
|
||||
//ciśnienie spadnie poniżej wartości 3,5 bara."
|
||||
// oraz uniemożliwiają podniesienie odbieraków prądu, gdy w instalacji rozrządu
|
||||
// ciśnienie spadnie poniżej wartości 3,5 bara."
|
||||
// Ra 2013-12: Niebugocław mówi, że w EZT podnoszą się przy 2.5
|
||||
// if (!MoverParameters->PantCompFlag)
|
||||
// MoverParameters->PantVolume=MoverParameters->CompressedVolume;
|
||||
@@ -2375,7 +2379,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
ts.R = -0.5 * MoverParameters->BDist / sin(ts.R * 0.5);
|
||||
if ((ts.R > 15000.0) || (ts.R < -15000.0))
|
||||
ts.R = 0.0; // szkoda czasu na zbyt duże promienie, 4km to promień nie wymagający
|
||||
// przechyłki
|
||||
// przechyłki
|
||||
}
|
||||
else
|
||||
ts.R = 0.0;
|
||||
@@ -2383,7 +2387,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
// Ra: składową pochylenia wzdłużnego mamy policzoną w jednostkowym wektorze vFront
|
||||
ts.Len = 1.0; // Max0R(MoverParameters->BDist,MoverParameters->ADist);
|
||||
ts.dHtrack = -vFront.y; // Axle1.pPosition.y-Axle0.pPosition.y; //wektor między skrajnymi osiami
|
||||
// (!!!odwrotny)
|
||||
// (!!!odwrotny)
|
||||
ts.dHrail = (Axle1.GetRoll() + Axle0.GetRoll()) * 0.5; //średnia przechyłka pudła
|
||||
// TTrackParam tp;
|
||||
tp.Width = MyTrack->fTrackWidth;
|
||||
@@ -2447,14 +2451,14 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
*/
|
||||
NoVoltTime = NoVoltTime + dt;
|
||||
if (NoVoltTime > 0.2) // jeśli brak zasilania dłużej niż 0.2 sekundy (25km/h pod
|
||||
// izolatorem daje 0.15s)
|
||||
// izolatorem daje 0.15s)
|
||||
{ // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało WS pod
|
||||
// izolatorem
|
||||
// izolatorem
|
||||
if (MoverParameters->Vel > 0.5) // jeśli jedzie
|
||||
if (MoverParameters->PantFrontUp ||
|
||||
MoverParameters->PantRearUp) // Ra 2014-07: doraźna blokada logowania
|
||||
// zimnych lokomotyw - zrobić to trzeba
|
||||
// inaczej
|
||||
// zimnych lokomotyw - zrobić to trzeba
|
||||
// inaczej
|
||||
// if (NoVoltTime>0.02) //tu można ograniczyć czas rozłączenia
|
||||
// if (DebugModeFlag) //logowanie nie zawsze
|
||||
if (MoverParameters->Mains)
|
||||
@@ -2744,7 +2748,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
if (pants[0].fParamPants->hvPowerWire &&
|
||||
pants[1].fParamPants->hvPowerWire) // i oba podłączone do drutów
|
||||
fPantCurrent = fCurrent * 0.5; // to dzielimy prąd równo na oba (trochę bez
|
||||
// sensu, ale lepiej tak niż podwoić prąd)
|
||||
// sensu, ale lepiej tak niż podwoić prąd)
|
||||
for (int i = 0; i < iAnimType[ANIM_PANTS]; ++i)
|
||||
{ // pętla po wszystkich pantografach
|
||||
p = pants[i].fParamPants;
|
||||
@@ -2780,7 +2784,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
(MoverParameters->PantRearVolt == 0.0))
|
||||
sPantUp.Play(vol, 0, MechInside, vPosition);
|
||||
if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i
|
||||
// wstawić do GetVoltage()
|
||||
// wstawić do GetVoltage()
|
||||
{
|
||||
MoverParameters->PantFrontVolt =
|
||||
p->hvPowerWire->VoltageGet(MoverParameters->Voltage, fPantCurrent);
|
||||
@@ -2804,7 +2808,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
(MoverParameters->PantFrontVolt == 0.0))
|
||||
sPantUp.Play(vol, 0, MechInside, vPosition);
|
||||
if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i
|
||||
// wstawić do GetVoltage()
|
||||
// wstawić do GetVoltage()
|
||||
{
|
||||
MoverParameters->PantRearVolt =
|
||||
p->hvPowerWire->VoltageGet(MoverParameters->Voltage, fPantCurrent);
|
||||
@@ -2833,7 +2837,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
{
|
||||
if (PantDiff > 0.001) // jeśli nie dolega do drutu
|
||||
{ // jeśli poprzednia wysokość jest mniejsza niż pożądana, zwiększyć kąt dolnego
|
||||
// ramienia zgodnie z ciśnieniem
|
||||
// ramienia zgodnie z ciśnieniem
|
||||
if (pantspeedfactor >
|
||||
0.55 * PantDiff) // 0.55 to około pochodna kąta po wysokości
|
||||
k += 0.55 * PantDiff; // ograniczenie "skoku" w danej klatce
|
||||
@@ -2889,7 +2893,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
{ // to coś wyłączało dźwięk silnika w ST43!
|
||||
MoverParameters->ConverterFlag = false;
|
||||
MoverParameters->CompressorFlag = false; // Ra: to jest wątpliwe - wyłączenie
|
||||
// sprężarki powinno być w jednym miejscu!
|
||||
// sprężarki powinno być w jednym miejscu!
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3013,7 +3017,7 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
else
|
||||
{
|
||||
CouplCounter = 25; // a bezruch nie, ale trzeba zaktualizować odległość, bo zawalidroga może
|
||||
// sobie pojechać
|
||||
// sobie pojechać
|
||||
}
|
||||
if (MoverParameters->DerailReason > 0)
|
||||
{
|
||||
@@ -3366,7 +3370,7 @@ void TDynamicObject::RenderSounds()
|
||||
if ((MoverParameters->DynamicBrakeFlag) && (MoverParameters->EnginePower > 0.1) &&
|
||||
(MoverParameters->EngineType ==
|
||||
ElectricSeriesMotor)) // Szociu - 29012012 - jeżeli uruchomiony jest hamulec
|
||||
// elektrodynamiczny, odtwarzany jest dźwięk silnika
|
||||
// elektrodynamiczny, odtwarzany jest dźwięk silnika
|
||||
vol += 0.8;
|
||||
|
||||
if (enginevolume > 0.0001)
|
||||
@@ -3601,7 +3605,7 @@ void TDynamicObject::RenderSounds()
|
||||
if (MoverParameters->DoorClosureWarning)
|
||||
{
|
||||
if (MoverParameters->DepartureSignal) // NBMX sygnal odjazdu, MC: pod warunkiem ze jest
|
||||
// zdefiniowane w chk
|
||||
// zdefiniowane w chk
|
||||
sDepartureSignal.TurnOn(MechInside, GetPosition());
|
||||
else
|
||||
sDepartureSignal.TurnOff(MechInside, GetPosition());
|
||||
@@ -3755,7 +3759,7 @@ void TDynamicObject::RenderAlpha()
|
||||
// McZapkie-250202
|
||||
// wczytywanie pliku z danymi multimedialnymi (dzwieki)
|
||||
void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
AnsiString ReplacableSkin)
|
||||
AnsiString ReplacableSkin)
|
||||
{
|
||||
double dSDist;
|
||||
TFileStream *fs;
|
||||
@@ -3806,7 +3810,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
}
|
||||
if ((i = asModel.Pos(",")) > 0)
|
||||
{ // Ra 2015-01: może szukać przecinka w nazwie modelu, a po przecinku była by liczba
|
||||
// tekstur?
|
||||
// tekstur?
|
||||
if (i < asModel.Length())
|
||||
iMultiTex = asModel[i + 1] - '0';
|
||||
if (iMultiTex < 0)
|
||||
@@ -3866,7 +3870,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
if (!ReplacableSkin.IsEmpty())
|
||||
{ // próba wycięcia trzeciej nazwy
|
||||
iMultiTex = -4; // skoro zostało coś po kresce, to są co
|
||||
// najmniej cztery
|
||||
// najmniej cztery
|
||||
ReplacableSkinID[-iMultiTex] =
|
||||
TTexturesManager::GetTextureID(
|
||||
NULL, NULL,
|
||||
@@ -3902,7 +3906,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
Global::iDynamicFiltering);
|
||||
if (ReplacableSkinID[4])
|
||||
iMultiTex = 4; // jak są cztery, to blokujemy podmianę tekstury
|
||||
// rozkładem
|
||||
// rozkładem
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3918,22 +3922,22 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
NULL, NULL, ReplacableSkin.c_str(), Global::iDynamicFiltering);
|
||||
if (TTexturesManager::GetAlpha(ReplacableSkinID[1]))
|
||||
iAlpha = 0x31310031; // tekstura -1 z kanałem alfa - nie renderować w cyklu
|
||||
// nieprzezroczystych
|
||||
// nieprzezroczystych
|
||||
else
|
||||
iAlpha = 0x30300030; // wszystkie tekstury nieprzezroczyste - nie renderować w
|
||||
// cyklu przezroczystych
|
||||
// cyklu przezroczystych
|
||||
if (ReplacableSkinID[2])
|
||||
if (TTexturesManager::GetAlpha(ReplacableSkinID[2]))
|
||||
iAlpha |= 0x02020002; // tekstura -2 z kanałem alfa - nie renderować w cyklu
|
||||
// nieprzezroczystych
|
||||
// nieprzezroczystych
|
||||
if (ReplacableSkinID[3])
|
||||
if (TTexturesManager::GetAlpha(ReplacableSkinID[3]))
|
||||
iAlpha |= 0x04040004; // tekstura -3 z kanałem alfa - nie renderować w cyklu
|
||||
// nieprzezroczystych
|
||||
// nieprzezroczystych
|
||||
if (ReplacableSkinID[4])
|
||||
if (TTexturesManager::GetAlpha(ReplacableSkinID[4]))
|
||||
iAlpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować w cyklu
|
||||
// nieprzezroczystych
|
||||
// nieprzezroczystych
|
||||
}
|
||||
// Winger 040304 - ladowanie przedsionkow dla EZT
|
||||
if (MoverParameters->TrainType == dt_EZT)
|
||||
@@ -3984,7 +3988,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
str = Parser->GetNextSymbol().LowerCase();
|
||||
if (str == AnsiString("animations:"))
|
||||
{ // Ra: ustawienie ilości poszczególnych animacji - musi być jako pierwsze, inaczej
|
||||
// ilości będą domyślne
|
||||
// ilości będą domyślne
|
||||
if (!pAnimations)
|
||||
{ // jeśli nie ma jeszcze tabeli animacji, można odczytać nowe ilości
|
||||
int co = 0, ile;
|
||||
@@ -3992,7 +3996,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
do
|
||||
{ // kolejne liczby to ilość animacj, -1 to znacznik końca
|
||||
ile = Parser->GetNextSymbol().ToIntDef(-1); // ilość danego typu
|
||||
// animacji
|
||||
// animacji
|
||||
// if (co==ANIM_PANTS)
|
||||
// if (!Global::bLoadTraction)
|
||||
// if (!DebugModeFlag) //w debugmode pantografy mają "niby działać"
|
||||
@@ -4030,7 +4034,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
if (j == ANIM_PANTS) // zliczamy poprzednie animacje
|
||||
if (!pants)
|
||||
if (iAnimType[ANIM_PANTS]) // o ile jakieś pantografy są (a
|
||||
// domyślnie są)
|
||||
// domyślnie są)
|
||||
pants = pAnimations +
|
||||
k; // zapamiętanie na potrzeby wyszukania submodeli
|
||||
pAnimations[k].iShift = sm; // przesunięcie do przydzielenia wskaźnika
|
||||
@@ -4082,7 +4086,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
if (pAnimations[i].smAnimated)
|
||||
{ //++iAnimatedAxles;
|
||||
pAnimations[i].smAnimated->WillBeAnimated(); // wyłączenie optymalizacji
|
||||
// transformu
|
||||
// transformu
|
||||
pAnimations[i].yUpdate = UpdateAxle; // animacja osi
|
||||
pAnimations[i].fMaxDist =
|
||||
50 *
|
||||
@@ -4092,8 +4096,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
MoverParameters
|
||||
->WheelDiameter; // 50m do kwadratu, a średnica do trzeciej
|
||||
pAnimations[i].fMaxDist *= Global::fDistanceFactor; // współczynnik
|
||||
// przeliczeniowy
|
||||
// jakości ekranu
|
||||
// przeliczeniowy
|
||||
// jakości ekranu
|
||||
}
|
||||
}
|
||||
// Ra: ustawianie indeksów osi
|
||||
@@ -4121,12 +4125,12 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
else if ((k >= '1') && (k <= '9'))
|
||||
{
|
||||
pAnimations[i++].dWheelAngle = dWheelAngle + m; // obrót osi
|
||||
// tocznych
|
||||
// tocznych
|
||||
--k; // następna będzie albo taka sama, albo bierzemy kolejny znak
|
||||
}
|
||||
else
|
||||
k = MoverParameters->AxleArangement[j++]; // pobranie kolejnego
|
||||
// znaku
|
||||
// znaku
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4162,17 +4166,17 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
// m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie tak)
|
||||
if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z T3D
|
||||
m.InitialRotate(); // może być potrzebny dodatkowy obrót, jeśli
|
||||
// wczytano z T3D, tzn. przed wykonaniem
|
||||
// Init()
|
||||
// wczytano z T3D, tzn. przed wykonaniem
|
||||
// Init()
|
||||
pants[i].fParamPants->vPos.z =
|
||||
m[3][0]; // przesunięcie w bok (asymetria)
|
||||
pants[i].fParamPants->vPos.y =
|
||||
m[3][1]; // przesunięcie w górę odczytane z modelu
|
||||
if ((sm = pants[i].smElement[0]->ChildGet()) != NULL)
|
||||
{ // jeśli ma potomny, można policzyć długość (odległość potomnego
|
||||
// od osi obrotu)
|
||||
// od osi obrotu)
|
||||
m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, nie
|
||||
// trzeba kopiować
|
||||
// trzeba kopiować
|
||||
// może trzeba: pobrać macierz dolnego ramienia, wyzerować
|
||||
// przesunięcie, przemnożyć przez macierz górnego
|
||||
pants[i].fParamPants->fHoriz = -fabs(m[3][1]);
|
||||
@@ -4189,18 +4193,18 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
// pants[i].fParamPants->fAngleL0=pants[i].fParamPants->fAngleL;
|
||||
pants[i].fParamPants->fAngleL =
|
||||
pants[i].fParamPants->fAngleL0; // początkowy kąt dolnego
|
||||
// ramienia
|
||||
// ramienia
|
||||
if ((sm = sm->ChildGet()) != NULL)
|
||||
{ // jeśli dalej jest ślizg, można policzyć długość górnego
|
||||
// ramienia
|
||||
// ramienia
|
||||
m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik,
|
||||
// nie trzeba kopiować
|
||||
// nie trzeba kopiować
|
||||
// trzeba by uwzględnić macierz dolnego ramienia, żeby
|
||||
// uzyskać kąt do poziomu...
|
||||
pants[i].fParamPants->fHoriz +=
|
||||
fabs(m(3)[1]); // różnica długości rzutów ramion na
|
||||
// płaszczyznę podstawy (jedna dodatnia,
|
||||
// druga ujemna)
|
||||
// płaszczyznę podstawy (jedna dodatnia,
|
||||
// druga ujemna)
|
||||
pants[i].fParamPants->fLenU1 =
|
||||
hypot(m[3][1], m[3][2]); // po osi OX nie potrzeba
|
||||
// pants[i].fParamPants->pantu=acos((1.22*cos(pants[i].fParamPants->fAngleL)+0.535)/1.755);
|
||||
@@ -4210,7 +4214,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
pants[i].fParamPants->fAngleU0 =
|
||||
atan2(fabs(m[3][2]),
|
||||
fabs(m[3][1])); // początkowy kąt górnego
|
||||
// ramienia, odczytany z modelu
|
||||
// ramienia, odczytany z modelu
|
||||
// if (pants[i].fParamPants->fAngleU0<M_PI_2)
|
||||
// pants[i].fParamPants->fAngleU0+=M_PI; //gdyby w odwrotną
|
||||
// stronę wyszło
|
||||
@@ -4225,25 +4229,25 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
// Ra: ze względu na to, że niektóre modele pantografów są
|
||||
// zrąbane, ich mierzenie ma obecnie ograniczony sens
|
||||
sm->ParentMatrix(&m); // pobranie macierzy transformacji
|
||||
// pivota ślizgu względem wstawienia
|
||||
// pojazdu
|
||||
// pivota ślizgu względem wstawienia
|
||||
// pojazdu
|
||||
if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z
|
||||
// T3D
|
||||
// T3D
|
||||
m.InitialRotate(); // może być potrzebny dodatkowy
|
||||
// obrót, jeśli wczytano z T3D, tzn.
|
||||
// przed wykonaniem Init()
|
||||
// obrót, jeśli wczytano z T3D, tzn.
|
||||
// przed wykonaniem Init()
|
||||
float det = Det(m);
|
||||
if (fabs(det - 1.0) < 0.001) // dopuszczamy 1 promil błędu
|
||||
// na skalowaniu ślizgu
|
||||
// na skalowaniu ślizgu
|
||||
{ // skalowanie jest w normie, można pobrać wymiary z modelu
|
||||
pants[i].fParamPants->fHeight =
|
||||
sm->MaxY(m); // przeliczenie maksimum wysokości
|
||||
// wierzchołków względem macierzy
|
||||
// wierzchołków względem macierzy
|
||||
pants[i].fParamPants->fHeight -=
|
||||
m[3][1]; // odjęcie wysokości pivota ślizgu
|
||||
pants[i].fParamPants->vPos.x =
|
||||
m[3][2]; // przy okazji odczytać z modelu pozycję w
|
||||
// długości
|
||||
// długości
|
||||
// ErrorLog("Model OK: "+asModel+",
|
||||
// height="+pants[i].fParamPants->fHeight);
|
||||
// ErrorLog("Model OK: "+asModel+",
|
||||
@@ -4282,7 +4286,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
if (pants[i].fParamPants->vPos.y == 0.0)
|
||||
{ // jeśli pierwsze ramię nie ustawiło tej wartości, próbować drugim
|
||||
//!!!! docelowo zrobić niezależną animację ramion z każdej
|
||||
//strony
|
||||
// strony
|
||||
m = float4x4(
|
||||
*sm->GetMatrix()); // skopiowanie, bo będziemy mnożyć
|
||||
m(3)[1] =
|
||||
@@ -4345,7 +4349,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
double pant1x = Parser->GetNextSymbol().ToDouble();
|
||||
double pant2x = Parser->GetNextSymbol().ToDouble();
|
||||
double pant1h = Parser->GetNextSymbol().ToDouble(); // wysokość pierwszego
|
||||
// ślizgu
|
||||
// ślizgu
|
||||
double pant2h = Parser->GetNextSymbol().ToDouble(); // wysokość drugiego ślizgu
|
||||
if (pant1h > 0.5)
|
||||
pant1h = pant2h; // tu może być zbyt duża wartość
|
||||
@@ -4484,8 +4488,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
if (pAnimations[i + j].smAnimated)
|
||||
{ //++iAnimatedDoors;
|
||||
pAnimations[i + j].smAnimated->WillBeAnimated(); // wyłączenie
|
||||
// optymalizacji
|
||||
// transformu
|
||||
// optymalizacji
|
||||
// transformu
|
||||
switch (MoverParameters->DoorOpenMethod)
|
||||
{ // od razu zapinamy potrzebny typ animacji
|
||||
case 1:
|
||||
@@ -4557,7 +4561,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
((MoverParameters->EngineType == ElectricSeriesMotor) ||
|
||||
(MoverParameters->EngineType ==
|
||||
ElectricInductionMotor)))) // plik z dzwiekiem wentylatora, mnozniki i
|
||||
// ofsety amp. i czest.
|
||||
// ofsety amp. i czest.
|
||||
{
|
||||
str = Parser->GetNextSymbol();
|
||||
rsWentylator.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(),
|
||||
@@ -4630,7 +4634,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
|
||||
rsDerailment.FA = 0.0;
|
||||
}
|
||||
else if (str == AnsiString("dieselinc:")) // dzwiek przy wlazeniu na obroty
|
||||
// woodwarda
|
||||
// woodwarda
|
||||
{
|
||||
str = Parser->GetNextSymbol();
|
||||
rsDiesielInc.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(),
|
||||
@@ -4769,7 +4773,7 @@ void TDynamicObject::RadioStop()
|
||||
{ // zatrzymanie pojazdu
|
||||
if (Mechanik) // o ile ktoś go prowadzi
|
||||
if (MoverParameters->SecuritySystem.RadioStop) // jeśli pojazd ma RadioStop i jest on
|
||||
// aktywny
|
||||
// aktywny
|
||||
Mechanik->PutCommand("Emergency_brake", 1.0, 1.0, &vPosition, stopRadio);
|
||||
};
|
||||
|
||||
@@ -4828,7 +4832,7 @@ int TDynamicObject::DirectionSet(int d)
|
||||
ABuScanObjects(-1, 300);
|
||||
}
|
||||
return 1 - (iDirection ? NextConnectedNo : PrevConnectedNo); // informacja o położeniu
|
||||
// następnego
|
||||
// następnego
|
||||
};
|
||||
|
||||
TDynamicObject *__fastcall TDynamicObject::PrevAny()
|
||||
@@ -4865,7 +4869,7 @@ double TDynamicObject::NextDistance(double d)
|
||||
|
||||
TDynamicObject *__fastcall TDynamicObject::Neightbour(int &dir)
|
||||
{ // ustalenie następnego (1) albo poprzedniego (0) w składzie bez względu na prawidłowość
|
||||
// iDirection
|
||||
// iDirection
|
||||
int d = dir; // zapamiętanie kierunku
|
||||
dir = 1 - (dir ? NextConnectedNo : PrevConnectedNo); // nowa wartość
|
||||
return (d ? (MoverParameters->Couplers[1].CouplingFlag ? NextConnected : NULL) :
|
||||
@@ -4891,14 +4895,14 @@ void TDynamicObject::CoupleDist()
|
||||
if (MoverParameters->Couplers[0].CouplingFlag == 0) // jeśli wirtualny
|
||||
if (MoverParameters->Couplers[0].CoupleDist < 300.0) // i mniej niż 300m
|
||||
{ // przez MoverParameters->Couplers[0].Connected nie da się dostać do DynObj, stąd
|
||||
// prowizorka
|
||||
// prowizorka
|
||||
// WriteLog("Collision of
|
||||
// "+AnsiString(MoverParameters->Couplers[0].CoupleDist)+"m detected by
|
||||
// "+asName+":0.");
|
||||
w = 0.5 * (MoverParameters->Couplers[0].Connected->Dim.W +
|
||||
MoverParameters->Dim.W); // minimalna odległość minięcia
|
||||
d = -DotProduct(vLeft, vCoulpler[0]); // odległość prostej ruchu od początku
|
||||
// układu współrzędnych
|
||||
// układu współrzędnych
|
||||
d = fabs(
|
||||
DotProduct(vLeft,
|
||||
((TMoverParameters *)(MoverParameters->Couplers[0].Connected))
|
||||
@@ -4919,7 +4923,7 @@ void TDynamicObject::CoupleDist()
|
||||
w = 0.5 * (MoverParameters->Couplers[1].Connected->Dim.W +
|
||||
MoverParameters->Dim.W); // minimalna odległość minięcia
|
||||
d = -DotProduct(vLeft, vCoulpler[1]); // odległość prostej ruchu od początku
|
||||
// układu współrzędnych
|
||||
// układu współrzędnych
|
||||
d = fabs(
|
||||
DotProduct(vLeft,
|
||||
((TMoverParameters *)(MoverParameters->Couplers[1].Connected))
|
||||
@@ -4935,7 +4939,7 @@ void TDynamicObject::CoupleDist()
|
||||
|
||||
TDynamicObject *__fastcall TDynamicObject::ControlledFind()
|
||||
{ // taka proteza: chcę podłączyć kabinę EN57 bezpośrednio z silnikowym, aby nie robić tego przez
|
||||
// ukrotnienie
|
||||
// ukrotnienie
|
||||
// drugi silnikowy i tak musi być ukrotniony, podobnie jak kolejna jednostka
|
||||
// lepiej by było przesyłać komendy sterowania, co jednak wymaga przebudowy transmisji komend
|
||||
// (LD)
|
||||
|
||||
Reference in New Issue
Block a user