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

fixed initialization of track classes and basic 3d types

This commit is contained in:
tmj-fstate
2017-01-27 00:50:54 +01:00
parent 647e1f9000
commit 71cd60b543
6 changed files with 97 additions and 144 deletions

View File

@@ -26,13 +26,13 @@ class Resource
} }
protected: protected:
void SetLastUsage(double lastUsage) void SetLastUsage(double const lastUsage)
{ {
_lastUsage = lastUsage; _lastUsage = lastUsage;
} }
private: private:
double _lastUsage; double _lastUsage = 0.0;
}; };
class ResourceManager class ResourceManager

View File

@@ -26,15 +26,11 @@ std::string Where(vector3 p)
return std::to_string(p.x) + " " + std::to_string(p.y) + " " + std::to_string(p.z); return std::to_string(p.x) + " " + std::to_string(p.y) + " " + std::to_string(p.z);
}; };
TSegment::TSegment(TTrack *owner) TSegment::TSegment(TTrack *owner) :
pOwner( owner )
{ {
Point1 = CPointOut = CPointIn = Point2 = vector3(0.0f, 0.0f, 0.0f); fAngle[ 0 ] = 0.0;
fLength = 0; fAngle[ 1 ] = 0.0;
fRoll1 = 0;
fRoll2 = 0;
fTsBuffer = NULL;
fStep = 0;
pOwner = owner;
}; };
TSegment::~TSegment() TSegment::~TSegment()

View File

@@ -52,18 +52,20 @@ class TSegment
{ // aproksymacja toru (zwrotnica ma dwa takie, jeden z nich jest aktywny) { // aproksymacja toru (zwrotnica ma dwa takie, jeden z nich jest aktywny)
private: private:
vector3 Point1, CPointOut, CPointIn, Point2; vector3 Point1, CPointOut, CPointIn, Point2;
double fRoll1, fRoll2; // przechyłka na końcach double fRoll1 = 0.0,
double fLength; // długość policzona fRoll2 = 0.0; // przechyłka na końcach
double *fTsBuffer; // wartości parametru krzywej dla równych odcinków double fLength = 0.0; // długość policzona
double fStep; double *fTsBuffer = nullptr; // wartości parametru krzywej dla równych odcinków
int iSegCount; // ilość odcinków do rysowania krzywej double fStep = 0.0;
double fDirection; // Ra: kąt prostego w planie; dla łuku kąt od Point1 int iSegCount = 0; // ilość odcinków do rysowania krzywej
double fStoop; // Ra: kąt wzniesienia; dla łuku od Point1 double fDirection = 0.0; // Ra: kąt prostego w planie; dla łuku kąt od Point1
double fStoop = 0.0; // Ra: kąt wzniesienia; dla łuku od Point1
vector3 vA, vB, vC; // współczynniki wielomianów trzeciego stopnia vD==Point1 vector3 vA, vB, vC; // współczynniki wielomianów trzeciego stopnia vD==Point1
// TSegment *pPrev; //odcinek od strony punktu 1 - w segmencie, żeby nie skakać na zwrotnicach // TSegment *pPrev; //odcinek od strony punktu 1 - w segmencie, żeby nie skakać na zwrotnicach
// TSegment *pNext; //odcinek od strony punktu 2 // TSegment *pNext; //odcinek od strony punktu 2
TTrack *pOwner; // wskaźnik na właściciela TTrack *pOwner = nullptr; // wskaźnik na właściciela
double fAngle[2]; // kąty zakończenia drogi na przejazdach double fAngle[2]; // kąty zakończenia drogi na przejazdach
vector3 GetFirstDerivative(double fTime); vector3 GetFirstDerivative(double fTime);
double RombergIntegral(double fA, double fB); double RombergIntegral(double fA, double fB);
double GetTFromS(double s); double GetTFromS(double s);
@@ -72,7 +74,7 @@ class TSegment
// TSegment *segNeightbour[2]; //sąsiednie odcinki - musi być przeniesione z Track // TSegment *segNeightbour[2]; //sąsiednie odcinki - musi być przeniesione z Track
// int iNeightbour[2]; //do którego końca doczepiony // int iNeightbour[2]; //do którego końca doczepiony
public: public:
bool bCurve; bool bCurve = false;
// int iShape; //Ra: flagi kształtu dadzą więcej możliwości optymalizacji // int iShape; //Ra: flagi kształtu dadzą więcej możliwości optymalizacji
// (0-Bezier,1-prosty,2/3-łuk w lewo/prawo,6/7-przejściowa w lewo/prawo) // (0-Bezier,1-prosty,2/3-łuk w lewo/prawo,6/7-przejściowa w lewo/prawo)
TSegment(TTrack *owner); TSegment(TTrack *owner);

View File

@@ -45,20 +45,14 @@ const int iEnds3[13] = {3, 0, 2, 1, 2, 0, -1,
1, 0, 2, 0, 3, 1}; // numer sąsiedniego toru na końcu segmentu "-1" 1, 0, 2, 0, 3, 1}; // numer sąsiedniego toru na końcu segmentu "-1"
TIsolated *TIsolated::pRoot = NULL; TIsolated *TIsolated::pRoot = NULL;
TSwitchExtension::TSwitchExtension(TTrack *owner, int what) TSwitchExtension::TSwitchExtension(TTrack *owner, int const what)
{ // na początku wszystko puste { // na początku wszystko puste
CurrentIndex = 0; pNexts[0] = nullptr; // wskaźniki do kolejnych odcinków ruchu
pNexts[0] = NULL; // wskaźniki do kolejnych odcinków ruchu pNexts[1] = nullptr;
pNexts[1] = NULL; pPrevs[0] = nullptr;
pPrevs[0] = NULL; pPrevs[1] = nullptr;
pPrevs[1] = NULL;
fOffsetSpeed = 0.1; // prędkość liniowa iglic
fOffsetDelay = 0.05; // dodatkowy ruch drugiej iglicy po zablokowaniu pierwszej na opornicy
fOffset1 = fOffset = fDesiredOffset = -fOffsetDelay; // położenie zasadnicze fOffset1 = fOffset = fDesiredOffset = -fOffsetDelay; // położenie zasadnicze
fOffset2 = 0.0; // w zasadniczym wewnętrzna iglica dolega fOffset2 = 0.0; // w zasadniczym wewnętrzna iglica dolega
pOwner = NULL;
pNextAnim = NULL;
bMovement = false; // nie potrzeba przeliczać fOffset1
Segments[0] = std::make_shared<TSegment>(owner); // z punktu 1 do 2 Segments[0] = std::make_shared<TSegment>(owner); // z punktu 1 do 2
Segments[1] = std::make_shared<TSegment>(owner); // z punktu 3 do 4 (1=3 dla zwrotnic; odwrócony dla skrzyżowań, ewentualnie 1=4) Segments[1] = std::make_shared<TSegment>(owner); // z punktu 3 do 4 (1=3 dla zwrotnic; odwrócony dla skrzyżowań, ewentualnie 1=4)
Segments[2] = (what >= 3) ? Segments[2] = (what >= 3) ?
@@ -73,9 +67,6 @@ TSwitchExtension::TSwitchExtension(TTrack *owner, int what)
Segments[5] = (what >= 6) ? Segments[5] = (what >= 6) ?
std::make_shared<TSegment>(owner) : std::make_shared<TSegment>(owner) :
nullptr; // z punktu 3 do 2 2 2 1 1 nullptr; // z punktu 3 do 2 2 2 1 1
evPlus = evMinus = NULL;
fVelocity = -1.0; // maksymalne ograniczenie prędkości (ustawianej eventem)
vTrans = vector3(0, 0, 0); // docelowa translacja przesuwnicy
} }
TSwitchExtension::~TSwitchExtension() TSwitchExtension::~TSwitchExtension()
{ // nie ma nic do usuwania { // nie ma nic do usuwania
@@ -153,56 +144,15 @@ void TIsolated::Modify(int i, TDynamicObject *o)
} }
}; };
TTrack::TTrack(TGroundNode *g) // tworzenie nowego odcinka ruchu
{ // tworzenie nowego odcinka ruchu TTrack::TTrack(TGroundNode *g) :
trNext = trPrev = NULL; // sąsiednie pMyNode( g ) // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode
Segment = NULL; // dane odcinka {
SwitchExtension = NULL; // dodatkowe parametry zwrotnicy i obrotnicy ::SecureZeroMemory( Dynamics, sizeof( Dynamics ) );
TextureID1 = 0; // tekstura szyny fRadiusTable[ 0 ] = 0.0;
fTexLength = 4.0; // powtarzanie tekstury fRadiusTable[ 1 ] = 0.0;
TextureID2 = 0; // tekstura podsypki albo drugiego toru zwrotnicy nFouling[ 0 ] = nullptr;
fTexHeight1 = 0.6; // nowy profil podsypki ;) nFouling[ 1 ] = nullptr;
fTexWidth = 0.9;
fTexSlope = 0.9;
eType = tt_Normal; // domyślnie zwykły
iCategoryFlag = 1; // 1-tor, 2-droga, 4-rzeka, 8-samolot?
fTrackWidth = 1.435; // rozstaw toru, szerokość nawierzchni
fFriction = 0.15; // współczynnik tarcia
fSoundDistance = -1;
iQualityFlag = 20;
iDamageFlag = 0;
eEnvironment = e_flat;
bVisible = true;
iEvents = 0; // Ra: flaga informująca o obecności eventów
evEvent0 = NULL;
evEvent1 = NULL;
evEvent2 = NULL;
evEventall0 = NULL;
evEventall1 = NULL;
evEventall2 = NULL;
fVelocity = -1; // ograniczenie prędkości
fTrackLength = 100.0;
fRadius = 0; // promień wybranego toru zwrotnicy
fRadiusTable[0] = 0; // dwa promienie nawet dla prostego
fRadiusTable[1] = 0;
iNumDynamics = 0;
ScannedFlag = false;
DisplayListID = 0;
iTrapezoid = 0; // parametry kształtu: 0-standard, 1-przechyłka, 2-trapez, 3-oba
hvOverhead = NULL; // drut zasilający, najbliższy Point1 toru
fTexRatio1 =
1.0; // proporcja boków tekstury nawierzchni (żeby zaoszczędzić na rozmiarach tekstur...)
fTexRatio2 =
1.0; // proporcja boków tekstury chodnika (żeby zaoszczędzić na rozmiarach tekstur...)
iPrevDirection = 0; // domyślnie wirtualne odcinki dołączamy stroną od Point1
iNextDirection = 0;
pIsolated = NULL;
pMyNode = g; // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode
iAction = 0; // normalnie może być pomijany podczas skanowania
fOverhead = -1.0; // można normalnie pobierać prąd (0 dla jazdy bezprądowej po danym odcinku
nFouling[0] = NULL; // ukres albo kozioł od strony Point1
nFouling[1] = NULL; // ukres albo kozioł od strony Point2
trColides = NULL; // tor kolizyjny, na którym trzeba sprawdzać pojazdy pod kątem zderzenia
} }
TTrack::~TTrack() TTrack::~TTrack()

120
Track.h
View File

@@ -46,25 +46,26 @@ class TTraction;
class TSwitchExtension class TSwitchExtension
{ // dodatkowe dane do toru, który jest zwrotnicą { // dodatkowe dane do toru, który jest zwrotnicą
public: public:
TSwitchExtension(TTrack *owner, int what); TSwitchExtension(TTrack *owner, int const what);
~TSwitchExtension(); ~TSwitchExtension();
std::shared_ptr<TSegment> Segments[6]; // dwa tory od punktu 1, pozosta³e dwa od 2? Ra 140101: 6 po³¹czeñ dla std::shared_ptr<TSegment> Segments[6]; // dwa tory od punktu 1, pozosta³e dwa od 2? Ra 140101: 6 po³¹czeñ dla skrzy¿owañ
// skrzy¿owañ
// TTrack *trNear[4]; //tory do³¹czone do punktów 1, 2, 3 i 4 // TTrack *trNear[4]; //tory do³¹czone do punktów 1, 2, 3 i 4
// dotychczasowe [2]+[2] wskaŸniki zamieniæ na nowe [4] // dotychczasowe [2]+[2] wskaŸniki zamieniæ na nowe [4]
TTrack *pNexts[2]; // tory do³¹czone do punktów 2 i 4 TTrack *pNexts[2]; // tory do³¹czone do punktów 2 i 4
TTrack *pPrevs[2]; // tory do³¹czone do punktów 1 i 3 TTrack *pPrevs[2]; // tory do³¹czone do punktów 1 i 3
int iNextDirection[2]; // to te¿ z [2]+[2] przerobiæ na [4] int iNextDirection[2]; // to te¿ z [2]+[2] przerobiæ na [4]
int iPrevDirection[2]; int iPrevDirection[2];
int CurrentIndex; // dla zwrotnicy int CurrentIndex = 0; // dla zwrotnicy
double fOffset, fDesiredOffset; // aktualne i docelowe położenie napędu iglic double fOffset = 0.0,
double fOffsetSpeed; // prędkość liniowa ruchu iglic fDesiredOffset = 0.0; // aktualne i docelowe położenie napędu iglic
double fOffsetDelay; // opóźnienie ruchu drugiej iglicy względem pierwszej double fOffsetSpeed = 0.1; // prędkość liniowa ruchu iglic
double fOffsetDelay = 0.05; // opóźnienie ruchu drugiej iglicy względem pierwszej // dodatkowy ruch drugiej iglicy po zablokowaniu pierwszej na opornicy
union union
{ {
struct struct
{ // zmienne potrzebne tylko dla zwrotnicy { // zmienne potrzebne tylko dla zwrotnicy
double fOffset1, fOffset2; // przesunięcia iglic - 0=na wprost double fOffset1,
fOffset2; // przesunięcia iglic - 0=na wprost
bool RightSwitch; // czy zwrotnica w prawo bool RightSwitch; // czy zwrotnica w prawo
}; };
struct struct
@@ -81,12 +82,14 @@ class TSwitchExtension
int iRoads; // ile dróg się spotyka? int iRoads; // ile dróg się spotyka?
}; };
}; };
bool bMovement; // czy w trakcie animacji bool bMovement = false; // czy w trakcie animacji
int iLeftVBO, iRightVBO; // indeksy iglic w VBO int iLeftVBO = 0,
TSubRect *pOwner; // sektor, któremu trzeba zgłosić animację iRightVBO = 0; // indeksy iglic w VBO
TTrack *pNextAnim; // następny tor do animowania TSubRect *pOwner = nullptr; // sektor, któremu trzeba zgłosić animację
TEvent *evPlus, *evMinus; // zdarzenia sygnalizacji rozprucia TTrack *pNextAnim = nullptr; // następny tor do animowania
float fVelocity; // maksymalne ograniczenie prędkości (ustawianej eventem) TEvent *evPlus = nullptr,
*evMinus = nullptr; // zdarzenia sygnalizacji rozprucia
float fVelocity = -1.0; // maksymalne ograniczenie prędkości (ustawianej eventem)
vector3 vTrans; // docelowa translacja przesuwnicy vector3 vTrans; // docelowa translacja przesuwnicy
private: private:
}; };
@@ -128,64 +131,63 @@ class TTrack : public Resource
private: private:
std::shared_ptr<TSwitchExtension> SwitchExtension; // dodatkowe dane do toru, który jest zwrotnicą std::shared_ptr<TSwitchExtension> SwitchExtension; // dodatkowe dane do toru, który jest zwrotnicą
std::shared_ptr<TSegment> Segment; std::shared_ptr<TSegment> Segment;
TTrack *trNext; // odcinek od strony punktu 2 - to powinno być w segmencie TTrack *trNext = nullptr; // odcinek od strony punktu 2 - to powinno być w segmencie
TTrack *trPrev; // odcinek od strony punktu 1 TTrack *trPrev = nullptr; // odcinek od strony punktu 1
// McZapkie-070402: dodalem zmienne opisujace rozmiary tekstur // McZapkie-070402: dodalem zmienne opisujace rozmiary tekstur
GLuint TextureID1; // tekstura szyn albo nawierzchni GLuint TextureID1 = 0; // tekstura szyn albo nawierzchni
GLuint TextureID2; // tekstura automatycznej podsypki albo pobocza GLuint TextureID2 = 0; // tekstura automatycznej podsypki albo pobocza
float fTexLength; // długość powtarzania tekstury w metrach float fTexLength = 4.0; // długość powtarzania tekstury w metrach
float fTexRatio1; // proporcja rozmiarów tekstury dla nawierzchni drogi float fTexRatio1 = 1.0; // proporcja boków tekstury nawierzchni (żeby zaoszczędzić na rozmiarach tekstur...)
float fTexRatio2; // proporcja rozmiarów tekstury dla chodnika float fTexRatio2 = 1.0; // proporcja boków tekstury chodnika (żeby zaoszczędzić na rozmiarach tekstur...)
float fTexHeight1; // wysokość brzegu względem trajektorii float fTexHeight1 = 0.6; // wysokość brzegu względem trajektorii
float fTexWidth; // szerokość boku float fTexWidth = 0.9; // szerokość boku
float fTexSlope; float fTexSlope = 0.9;
double fRadiusTable[2]; // dwa promienie, drugi dla zwrotnicy double fRadiusTable[ 2 ]; // dwa promienie, drugi dla zwrotnicy
int iTrapezoid; // 0-standard, 1-przechyłka, 2-trapez, 3-oba int iTrapezoid = 0; // 0-standard, 1-przechyłka, 2-trapez, 3-oba
GLuint DisplayListID; GLuint DisplayListID = 0;
TIsolated *pIsolated; // obwód izolowany obsługujący zajęcia/zwolnienia grupy torów TIsolated *pIsolated = nullptr; // obwód izolowany obsługujący zajęcia/zwolnienia grupy torów
TGroundNode * TGroundNode *
pMyNode; // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode pMyNode = nullptr; // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode
public: public:
int iNumDynamics; int iNumDynamics = 0;
TDynamicObject *Dynamics[iMaxNumDynamics]; TDynamicObject *Dynamics[iMaxNumDynamics];
int iEvents; // Ra: flaga informująca o obecności eventów int iEvents = 0; // Ra: flaga informująca o obecności eventów
TEvent *evEventall0; // McZapkie-140302: wyzwalany gdy pojazd stoi TEvent *evEventall0 = nullptr; // McZapkie-140302: wyzwalany gdy pojazd stoi
TEvent *evEventall1; TEvent *evEventall1 = nullptr;
TEvent *evEventall2; TEvent *evEventall2 = nullptr;
TEvent *evEvent0; // McZapkie-280503: wyzwalany tylko gdy headdriver TEvent *evEvent0 = nullptr; // McZapkie-280503: wyzwalany tylko gdy headdriver
TEvent *evEvent1; TEvent *evEvent1 = nullptr;
TEvent *evEvent2; TEvent *evEvent2 = nullptr;
std::string asEventall0Name; // nazwy eventów std::string asEventall0Name; // nazwy eventów
std::string asEventall1Name; std::string asEventall1Name;
std::string asEventall2Name; std::string asEventall2Name;
std::string asEvent0Name; std::string asEvent0Name;
std::string asEvent1Name; std::string asEvent1Name;
std::string asEvent2Name; std::string asEvent2Name;
int iNextDirection; // 0:Point1, 1:Point2, 3:do odchylonego na zwrotnicy int iNextDirection = 0; // 0:Point1, 1:Point2, 3:do odchylonego na zwrotnicy
int iPrevDirection; int iPrevDirection = 0; // domyślnie wirtualne odcinki dołączamy stroną od Point1
TTrackType eType; TTrackType eType = tt_Normal; // domyślnie zwykły
int iCategoryFlag; // 0x100 - usuwanie pojazów int iCategoryFlag = 1; // 0x100 - usuwanie pojazów // 1-tor, 2-droga, 4-rzeka, 8-samolot?
float fTrackWidth; // szerokość w punkcie 1 float fTrackWidth = 1.435; // szerokość w punkcie 1 // rozstaw toru, szerokość nawierzchni
float fTrackWidth2; // szerokość w punkcie 2 (głównie drogi i rzeki) float fTrackWidth2 = 0.0; // szerokość w punkcie 2 (głównie drogi i rzeki)
float fFriction; // współczynnik tarcia float fFriction = 0.15; // współczynnik tarcia
float fSoundDistance; float fSoundDistance = -1.0;
int iQualityFlag; int iQualityFlag = 20;
int iDamageFlag; int iDamageFlag = 0;
TEnvironmentType eEnvironment; // dźwięk i oświetlenie TEnvironmentType eEnvironment = e_flat; // dźwięk i oświetlenie
bool bVisible; // czy rysowany bool bVisible = true; // czy rysowany
int iAction; // czy modyfikowany eventami (specjalna obsługa przy skanowaniu) int iAction = 0; // czy modyfikowany eventami (specjalna obsługa przy skanowaniu)
float fOverhead; // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i float fOverhead = -1.0; // można normalnie pobierać prąd (0 dla jazdy bezprądowej po danym odcinku, >0-z opuszczonym i ograniczeniem prędkości)
// ograniczeniem prędkości
private: private:
double fVelocity; // prędkość dla AI (powyżej rośnie prawdopowobieństwo wykolejenia) double fVelocity = -1.0; // ograniczenie prędkości // prędkość dla AI (powyżej rośnie prawdopowobieństwo wykolejenia)
public: public:
// McZapkie-100502: // McZapkie-100502:
double fTrackLength; // długość z wpisu, nigdzie nie używana double fTrackLength = 100.0; // długość z wpisu, nigdzie nie używana
double fRadius; // promień, dla zwrotnicy kopiowany z tabeli double fRadius = 0.0; // promień, dla zwrotnicy kopiowany z tabeli
bool ScannedFlag; // McZapkie: do zaznaczania kolorem torów skanowanych przez AI bool ScannedFlag = false; // McZapkie: do zaznaczania kolorem torów skanowanych przez AI
TTraction *hvOverhead; // drut zasilający do szybkiego znalezienia (nie używany) TTraction *hvOverhead = nullptr; // drut zasilający do szybkiego znalezienia (nie używany)
TGroundNode *nFouling[2]; // współrzędne ukresu albo oporu kozła TGroundNode *nFouling[ 2 ]; // współrzędne ukresu albo oporu kozła
TTrack *trColides; // tor kolizyjny, na którym trzeba sprawdzać pojazdy pod kątem zderzenia TTrack *trColides = nullptr; // tor kolizyjny, na którym trzeba sprawdzać pojazdy pod kątem zderzenia
TTrack(TGroundNode *g); TTrack(TGroundNode *g);
~TTrack(); ~TTrack();

View File

@@ -42,7 +42,8 @@ inline scalar_t SQRT_FUNCTION(scalar_t x)
class vector2 class vector2
{ {
public: public:
vector2(void) vector2(void) :
x(0.0), y(0.0)
{ {
} }
vector2(scalar_t a, scalar_t b) vector2(scalar_t a, scalar_t b)
@@ -61,7 +62,8 @@ class vector2
class vector3 class vector3
{ {
public: public:
vector3(void) vector3(void) :
x(0.0), y(0.0), z(0.0)
{ {
} }
vector3(scalar_t a, scalar_t b, scalar_t c) vector3(scalar_t a, scalar_t b, scalar_t c)
@@ -129,6 +131,7 @@ class matrix4x4
public: public:
matrix4x4(void) matrix4x4(void)
{ {
::SecureZeroMemory( e, sizeof( e ) );
} }
// When defining matrices in C arrays, it is easiest to define them with // When defining matrices in C arrays, it is easiest to define them with