mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 11:39:19 +02:00
merged upstream changes
This commit is contained in:
150
Ground.h
150
Ground.h
@@ -18,9 +18,9 @@ http://mozilla.org/MPL/2.0/.
|
||||
|
||||
using namespace Math3D;
|
||||
|
||||
// Ra: zmniejszone liczby, aby zrobić tabelkę i zoptymalizować wyszukiwanie
|
||||
// Ra: zmniejszone liczby, aby zrobić tabelkę i zoptymalizować wyszukiwanie
|
||||
const int TP_MODEL = 10;
|
||||
const int TP_MESH = 11; // Ra: specjalny obiekt grupojący siatki dla tekstury
|
||||
const int TP_MESH = 11; // Ra: specjalny obiekt grupujący siatki dla tekstury
|
||||
const int TP_DUMMYTRACK = 12; // Ra: zdublowanie obiektu toru dla rozdzielenia tekstur
|
||||
const int TP_TERRAIN = 13; // Ra: specjalny model dla terenu
|
||||
const int TP_DYNAMIC = 14;
|
||||
@@ -67,15 +67,15 @@ struct TGroundVertex
|
||||
vector3 Normal;
|
||||
float tu, tv;
|
||||
void HalfSet(const TGroundVertex &v1, const TGroundVertex &v2)
|
||||
{ // wyliczenie współrzędnych i mapowania punktu na środku odcinka v1<->v2
|
||||
{ // wyliczenie współrzędnych i mapowania punktu na środku odcinka v1<->v2
|
||||
Point = 0.5 * (v1.Point + v2.Point);
|
||||
Normal = 0.5 * (v1.Normal + v2.Normal);
|
||||
tu = 0.5 * (v1.tu + v2.tu);
|
||||
tv = 0.5 * (v1.tv + v2.tv);
|
||||
}
|
||||
void SetByX(const TGroundVertex &v1, const TGroundVertex &v2, double x)
|
||||
{ // wyliczenie współrzędnych i mapowania punktu na odcinku v1<->v2
|
||||
double i = (x - v1.Point.x) / (v2.Point.x - v1.Point.x); // parametr równania
|
||||
{ // wyliczenie współrzędnych i mapowania punktu na odcinku v1<->v2
|
||||
double i = (x - v1.Point.x) / (v2.Point.x - v1.Point.x); // parametr równania
|
||||
double j = 1.0 - i;
|
||||
Point = j * v1.Point + i * v2.Point;
|
||||
Normal = j * v1.Normal + i * v2.Normal;
|
||||
@@ -83,8 +83,8 @@ struct TGroundVertex
|
||||
tv = j * v1.tv + i * v2.tv;
|
||||
}
|
||||
void SetByZ(const TGroundVertex &v1, const TGroundVertex &v2, double z)
|
||||
{ // wyliczenie współrzędnych i mapowania punktu na odcinku v1<->v2
|
||||
double i = (z - v1.Point.z) / (v2.Point.z - v1.Point.z); // parametr równania
|
||||
{ // wyliczenie współrzędnych i mapowania punktu na odcinku v1<->v2
|
||||
double i = (z - v1.Point.z) / (v2.Point.z - v1.Point.z); // parametr równania
|
||||
double j = 1.0 - i;
|
||||
Point = j * v1.Point + i * v2.Point;
|
||||
Normal = j * v1.Normal + i * v2.Normal;
|
||||
@@ -93,7 +93,7 @@ struct TGroundVertex
|
||||
}
|
||||
};
|
||||
|
||||
class TSubRect; // sektor (aktualnie 200m×200m, ale może być zmieniony)
|
||||
class TSubRect; // sektor (aktualnie 200m×200m, ale może być zmieniony)
|
||||
|
||||
class TGroundNode : public Resource
|
||||
{ // obiekt scenerii
|
||||
@@ -101,64 +101,64 @@ class TGroundNode : public Resource
|
||||
public:
|
||||
TGroundNodeType iType; // typ obiektu
|
||||
union
|
||||
{ // Ra: wskażniki zależne od typu - zrobić klasy dziedziczone zamiast
|
||||
{ // Ra: wskażniki zależne od typu - zrobić klasy dziedziczone zamiast
|
||||
void *Pointer; // do przypisywania NULL
|
||||
TSubModel *smTerrain; // modele terenu (kwadratow kilometrowych)
|
||||
TAnimModel *Model; // model z animacjami
|
||||
TDynamicObject *DynamicObject; // pojazd
|
||||
vector3 *Points; // punkty dla linii
|
||||
TTrack *pTrack; // trajektoria ruchu
|
||||
TGroundVertex *Vertices; // wierzchołki dla trójkątów
|
||||
TMemCell *MemCell; // komórka pamięci
|
||||
TEventLauncher *EvLaunch; // wyzwalacz zdarzeń
|
||||
TTraction *hvTraction; // drut zasilający
|
||||
TGroundVertex *Vertices; // wierzchołki dla trójkątów
|
||||
TMemCell *MemCell; // komórka pamięci
|
||||
TEventLauncher *EvLaunch; // wyzwalacz zdarzeń
|
||||
TTraction *hvTraction; // drut zasilający
|
||||
TTractionPowerSource *psTractionPowerSource; // zasilanie drutu (zaniedbane w sceneriach)
|
||||
TTextSound *tsStaticSound; // dźwięk przestrzenny
|
||||
TGroundNode *nNode; // obiekt renderujący grupowo ma tu wskaźnik na listę obiektów
|
||||
TTextSound *tsStaticSound; // dźwięk przestrzenny
|
||||
TGroundNode *nNode; // obiekt renderujący grupowo ma tu wskaźnik na listę obiektów
|
||||
};
|
||||
std::string asName; // nazwa (nie zawsze ma znaczenie)
|
||||
union
|
||||
{
|
||||
int iNumVerts; // dla trójkątów
|
||||
int iNumVerts; // dla trójkątów
|
||||
int iNumPts; // dla linii
|
||||
int iCount; // dla terenu
|
||||
// int iState; //Ra: nie używane - dźwięki zapętlone
|
||||
// int iState; //Ra: nie używane - dźwięki zapętlone
|
||||
};
|
||||
vector3 pCenter; // współrzędne środka do przydzielenia sektora
|
||||
vector3 pCenter; // współrzędne środka do przydzielenia sektora
|
||||
|
||||
union
|
||||
{
|
||||
// double fAngle; //kąt obrotu dla modelu
|
||||
// double fAngle; //kąt obrotu dla modelu
|
||||
double fLineThickness; // McZapkie-120702: grubosc linii
|
||||
// int Status; //McZapkie-170303: status dzwieku
|
||||
};
|
||||
double fSquareRadius; // kwadrat widoczności do
|
||||
double fSquareMinRadius; // kwadrat widoczności od
|
||||
// TGroundNode *nMeshGroup; //Ra: obiekt grupujący trójkąty w TSubRect dla tekstury
|
||||
double fSquareRadius; // kwadrat widoczności do
|
||||
double fSquareMinRadius; // kwadrat widoczności od
|
||||
// TGroundNode *nMeshGroup; //Ra: obiekt grupujący trójkąty w TSubRect dla tekstury
|
||||
int iVersion; // wersja siatki (do wykonania rekompilacji)
|
||||
// union ?
|
||||
GLuint DisplayListID; // numer siatki DisplayLists
|
||||
bool PROBLEND;
|
||||
int iVboPtr; // indeks w buforze VBO
|
||||
GLuint TextureID; // główna (jedna) tekstura obiektu
|
||||
int iFlags; // tryb przezroczystości: 0x10-nieprz.,0x20-przezroczysty,0x30-mieszany
|
||||
int Ambient[4], Diffuse[4], Specular[4]; // oświetlenie
|
||||
GLuint TextureID; // główna (jedna) tekstura obiektu
|
||||
int iFlags; // tryb przezroczystości: 0x10-nieprz.,0x20-przezroczysty,0x30-mieszany
|
||||
int Ambient[4], Diffuse[4], Specular[4]; // oświetlenie
|
||||
bool bVisible;
|
||||
TGroundNode *nNext; // lista wszystkich w scenerii, ostatni na początku
|
||||
TGroundNode *nNext2; // lista obiektów w sektorze
|
||||
TGroundNode *nNext3; // lista obiektów renderowanych we wspólnym cyklu
|
||||
TGroundNode *nNext; // lista wszystkich w scenerii, ostatni na początku
|
||||
TGroundNode *nNext2; // lista obiektów w sektorze
|
||||
TGroundNode *nNext3; // lista obiektów renderowanych we wspólnym cyklu
|
||||
TGroundNode();
|
||||
TGroundNode(TGroundNodeType t, int n = 0);
|
||||
~TGroundNode();
|
||||
void Init(int n);
|
||||
void InitCenter(); // obliczenie współrzędnych środka
|
||||
void InitCenter(); // obliczenie współrzędnych środka
|
||||
void InitNormals();
|
||||
|
||||
void MoveMe(vector3 pPosition); // przesuwanie (nie działa)
|
||||
void MoveMe(vector3 pPosition); // przesuwanie (nie działa)
|
||||
|
||||
// bool Disable();
|
||||
inline TGroundNode * Find(const std::string &asNameToFind, TGroundNodeType iNodeType)
|
||||
{ // wyszukiwanie czołgowe z typem
|
||||
{ // wyszukiwanie czołgowe z typem
|
||||
if ((iNodeType == iType) && (asNameToFind == asName))
|
||||
return this;
|
||||
else if (nNext)
|
||||
@@ -170,36 +170,36 @@ class TGroundNode : public Resource
|
||||
void Release();
|
||||
bool GetTraction();
|
||||
|
||||
void RenderHidden(); // obsługa dźwięków i wyzwalaczy zdarzeń
|
||||
void RenderHidden(); // obsługa dźwięków i wyzwalaczy zdarzeń
|
||||
void RenderDL(); // renderowanie nieprzezroczystych w Display Lists
|
||||
void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists
|
||||
// (McZapkie-131202)
|
||||
void RaRenderVBO(); // renderowanie (nieprzezroczystych) ze wspólnego VBO
|
||||
void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
|
||||
void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
|
||||
void RaRenderVBO(); // renderowanie (nieprzezroczystych) ze wspólnego VBO
|
||||
void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
|
||||
void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
|
||||
};
|
||||
|
||||
class TSubRect : public Resource, public CMesh
|
||||
{ // sektor składowy kwadratu kilometrowego
|
||||
{ // sektor składowy kwadratu kilometrowego
|
||||
public:
|
||||
int iTracks = 0; // ilość torów w (tTracks)
|
||||
TTrack **tTracks = nullptr; // tory do renderowania pojazdów
|
||||
int iTracks = 0; // ilość torów w (tTracks)
|
||||
TTrack **tTracks = nullptr; // tory do renderowania pojazdów
|
||||
protected:
|
||||
TTrack *tTrackAnim = nullptr; // obiekty do przeliczenia animacji
|
||||
TGroundNode *nRootMesh = nullptr; // obiekty renderujące wg tekstury (wtórne, lista po nNext2)
|
||||
TGroundNode *nMeshed = nullptr; // lista obiektów dla których istnieją obiekty renderujące grupowo
|
||||
TGroundNode *nRootMesh = nullptr; // obiekty renderujące wg tekstury (wtórne, lista po nNext2)
|
||||
TGroundNode *nMeshed = nullptr; / lista obiektów dla których istnieją obiekty renderujące grupowo
|
||||
public:
|
||||
TGroundNode *
|
||||
nRootNode = nullptr; // wszystkie obiekty w sektorze, z wyjątkiem renderujących i pojazdów (nNext2)
|
||||
nRootNode = nullptr; // wszystkie obiekty w sektorze, z wyjątkiem renderujących i pojazdów (nNext2)
|
||||
TGroundNode *
|
||||
nRenderHidden = nullptr; // lista obiektów niewidocznych, "renderowanych" również z tyłu (nNext3)
|
||||
nRenderHidden = nullptr; // lista obiektów niewidocznych, "renderowanych" również z tyłu (nNext3)
|
||||
TGroundNode *nRenderRect = nullptr; // z poziomu sektora - nieprzezroczyste (nNext3)
|
||||
TGroundNode *nRenderRectAlpha = nullptr; // z poziomu sektora - przezroczyste (nNext3)
|
||||
TGroundNode *nRenderWires = nullptr; // z poziomu sektora - druty i inne linie (nNext3)
|
||||
TGroundNode *nRender = nullptr; // indywidualnie - nieprzezroczyste (nNext3)
|
||||
TGroundNode *nRenderMixed = nullptr; // indywidualnie - nieprzezroczyste i przezroczyste (nNext3)
|
||||
TGroundNode *nRenderAlpha = nullptr; // indywidualnie - przezroczyste (nNext3)
|
||||
int iNodeCount = 0; // licznik obiektów, do pomijania pustych sektorów
|
||||
int iNodeCount = 0; // licznik obiektów, do pomijania pustych sektorów
|
||||
public:
|
||||
void LoadNodes(); // utworzenie VBO sektora
|
||||
public:
|
||||
@@ -208,25 +208,25 @@ class TSubRect : public Resource, public CMesh
|
||||
virtual void Release(); // zwalnianie VBO sektora
|
||||
void NodeAdd(TGroundNode *Node); // dodanie obiektu do sektora na etapie rozdzielania na sektory
|
||||
void RaNodeAdd(TGroundNode *Node); // dodanie obiektu do listy renderowania
|
||||
void Sort(); // optymalizacja obiektów w sektorze (sortowanie wg tekstur)
|
||||
void Sort(); // optymalizacja obiektów w sektorze (sortowanie wg tekstur)
|
||||
TTrack * FindTrack(vector3 *Point, int &iConnection, TTrack *Exclude);
|
||||
TTraction * FindTraction(vector3 *Point, int &iConnection, TTraction *Exclude);
|
||||
bool StartVBO(); // ustwienie VBO sektora dla (nRenderRect), (nRenderRectAlpha) i
|
||||
// (nRenderWires)
|
||||
bool RaTrackAnimAdd(TTrack *t); // zgłoszenie toru do animacji
|
||||
void RaAnimate(); // przeliczenie animacji torów
|
||||
bool RaTrackAnimAdd(TTrack *t); // zgłoszenie toru do animacji
|
||||
void RaAnimate(); // przeliczenie animacji torów
|
||||
void RenderDL(); // renderowanie nieprzezroczystych w Display Lists
|
||||
void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists
|
||||
// (McZapkie-131202)
|
||||
void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
|
||||
void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
|
||||
void RenderSounds(); // dźwięki pojazdów z niewidocznych sektorów
|
||||
void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
|
||||
void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
|
||||
void RenderSounds(); // dźwięki pojazdów z niewidocznych sektorów
|
||||
};
|
||||
|
||||
// Ra: trzeba sprawdzić wydajność siatki
|
||||
// Ra: trzeba sprawdzić wydajność siatki
|
||||
const int iNumSubRects = 5; // na ile dzielimy kilometr
|
||||
const int iNumRects = 500;
|
||||
// const double fHalfNumRects=iNumRects/2.0; //połowa do wyznaczenia środka
|
||||
// const double fHalfNumRects=iNumRects/2.0; //połowa do wyznaczenia środka
|
||||
const int iTotalNumSubRects = iNumRects * iNumSubRects;
|
||||
const double fHalfTotalNumSubRects = iTotalNumSubRects / 2.0;
|
||||
const double fSubRectSize = 1000.0 / iNumSubRects;
|
||||
@@ -234,10 +234,10 @@ const double fRectSize = fSubRectSize * iNumSubRects;
|
||||
|
||||
class TGroundRect : public TSubRect
|
||||
{ // kwadrat kilometrowy
|
||||
// obiekty o niewielkiej ilości wierzchołków będą renderowane stąd
|
||||
// Ra: 2012-02 doszły submodele terenu
|
||||
// obiekty o niewielkiej ilości wierzchołków będą renderowane stąd
|
||||
// Ra: 2012-02 doszły submodele terenu
|
||||
private:
|
||||
int iLastDisplay; // numer klatki w której był ostatnio wyświetlany
|
||||
int iLastDisplay; // numer klatki w której był ostatnio wyświetlany
|
||||
TSubRect *pSubRects;
|
||||
void Init()
|
||||
{
|
||||
@@ -245,26 +245,26 @@ class TGroundRect : public TSubRect
|
||||
};
|
||||
|
||||
public:
|
||||
static int iFrameNumber; // numer kolejny wyświetlanej klatki
|
||||
TGroundNode *nTerrain; // model terenu z E3D - użyć nRootMesh?
|
||||
static int iFrameNumber; // numer kolejny wyświetlanej klatki
|
||||
TGroundNode *nTerrain; // model terenu z E3D - użyć nRootMesh?
|
||||
TGroundRect();
|
||||
virtual ~TGroundRect();
|
||||
|
||||
TSubRect * SafeGetRect(int iCol, int iRow)
|
||||
{ // pobranie wskaźnika do małego kwadratu, utworzenie jeśli trzeba
|
||||
{ // pobranie wskaźnika do małego kwadratu, utworzenie jeśli trzeba
|
||||
if (!pSubRects)
|
||||
Init(); // utworzenie małych kwadratów
|
||||
return pSubRects + iRow * iNumSubRects + iCol; // zwrócenie właściwego
|
||||
Init(); // utworzenie małych kwadratów
|
||||
return pSubRects + iRow * iNumSubRects + iCol; // zwrócenie właściwego
|
||||
};
|
||||
TSubRect * FastGetRect(int iCol, int iRow)
|
||||
{ // pobranie wskaźnika do małego kwadratu, bez tworzenia jeśli nie ma
|
||||
{ // pobranie wskaźnika do małego kwadratu, bez tworzenia jeśli nie ma
|
||||
return (pSubRects ? pSubRects + iRow * iNumSubRects + iCol : NULL);
|
||||
};
|
||||
void Optimize()
|
||||
{ // optymalizacja obiektów w sektorach
|
||||
{ // optymalizacja obiektów w sektorach
|
||||
if (pSubRects)
|
||||
for (int i = iNumSubRects * iNumSubRects - 1; i >= 0; --i)
|
||||
pSubRects[i].Sort(); // optymalizacja obiektów w sektorach
|
||||
pSubRects[i].Sort(); // optymalizacja obiektów w sektorach
|
||||
};
|
||||
void RenderDL();
|
||||
void RenderVBO();
|
||||
@@ -273,28 +273,28 @@ class TGroundRect : public TSubRect
|
||||
class TGround
|
||||
{
|
||||
vector3 CameraDirection; // zmienna robocza przy renderowaniu
|
||||
int const *iRange; // tabela widoczności
|
||||
// TGroundNode *nRootNode; //lista wszystkich węzłów
|
||||
TGroundNode *nRootDynamic; // lista pojazdów
|
||||
TGroundRect Rects[iNumRects][iNumRects]; // mapa kwadratów kilometrowych
|
||||
TEvent *RootEvent; // lista zdarzeń
|
||||
int const *iRange; // tabela widoczności
|
||||
// TGroundNode *nRootNode; //lista wszystkich węzłów
|
||||
TGroundNode *nRootDynamic; // lista pojazdów
|
||||
TGroundRect Rects[iNumRects][iNumRects]; // mapa kwadratów kilometrowych
|
||||
TEvent *RootEvent; // lista zdarzeń
|
||||
TEvent *QueryRootEvent, *tmpEvent, *tmp2Event, *OldQRE;
|
||||
TSubRect *pRendered[1500]; // lista renderowanych sektorów
|
||||
TSubRect *pRendered[1500]; // lista renderowanych sektorów
|
||||
int iNumNodes;
|
||||
vector3 pOrigin;
|
||||
vector3 aRotate;
|
||||
bool bInitDone;
|
||||
TGroundNode *nRootOfType[TP_LAST]; // tablica grupująca obiekty, przyspiesza szukanie
|
||||
TGroundNode *nRootOfType[TP_LAST]; // tablica grupująca obiekty, przyspiesza szukanie
|
||||
// TGroundNode *nLastOfType[TP_LAST]; //ostatnia
|
||||
TSubRect srGlobal; // zawiera obiekty globalne (na razie wyzwalacze czasowe)
|
||||
int hh, mm, srh, srm, ssh, ssm; // ustawienia czasu
|
||||
// int tracks,tracksfar; //liczniki torów
|
||||
TNames *sTracks; // posortowane nazwy torów i eventów
|
||||
// int tracks,tracksfar; //liczniki torów
|
||||
TNames *sTracks; // posortowane nazwy torów i eventów
|
||||
private: // metody prywatne
|
||||
bool EventConditon(TEvent *e);
|
||||
|
||||
public:
|
||||
bool bDynamicRemove; // czy uruchomić procedurę usuwania pojazdów
|
||||
bool bDynamicRemove; // czy uruchomić procedurę usuwania pojazdów
|
||||
TDynamicObject *LastDyn; // ABu: paskudnie, ale na bardzo szybko moze jakos przejdzie...
|
||||
// TTrain *pTrain;
|
||||
// double fVDozwolona;
|
||||
@@ -330,8 +330,8 @@ class TGround
|
||||
TGroundNode * GetNode(std::string asName);
|
||||
bool AddDynamic(TGroundNode *Node);
|
||||
void MoveGroundNode(vector3 pPosition);
|
||||
void UpdatePhys(double dt, int iter); // aktualizacja fizyki stałym krokiem
|
||||
bool Update(double dt, int iter); // aktualizacja przesunięć zgodna z FPS
|
||||
void UpdatePhys(double dt, int iter); // aktualizacja fizyki stałym krokiem
|
||||
bool Update(double dt, int iter); // aktualizacja przesunięć zgodna z FPS
|
||||
bool AddToQuery(TEvent *Event, TDynamicObject *Node);
|
||||
bool GetTraction(TDynamicObject *model);
|
||||
bool RenderDL(vector3 pPosition);
|
||||
@@ -394,7 +394,7 @@ class TGround
|
||||
|
||||
public:
|
||||
void WyslijEvent(const std::string &e, const std::string &d);
|
||||
int iRendered; // ilość renderowanych sektorów, pobierana przy pokazywniu FPS
|
||||
int iRendered; // ilość renderowanych sektorów, pobierana przy pokazywniu FPS
|
||||
void WyslijString(const std::string &t, int n);
|
||||
void WyslijWolny(const std::string &t);
|
||||
void WyslijNamiary(TGroundNode *t);
|
||||
|
||||
Reference in New Issue
Block a user