mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-23 17:59:19 +02:00
merged upstream changes
This commit is contained in:
@@ -22,7 +22,7 @@ TAdvancedSound::TAdvancedSound()
|
|||||||
}
|
}
|
||||||
|
|
||||||
TAdvancedSound::~TAdvancedSound()
|
TAdvancedSound::~TAdvancedSound()
|
||||||
{ // Ra: stopowanie siê sypie
|
{ // Ra: stopowanie się sypie
|
||||||
// SoundStart.Stop();
|
// SoundStart.Stop();
|
||||||
// SoundCommencing.Stop();
|
// SoundCommencing.Stop();
|
||||||
// SoundShut.Stop();
|
// SoundShut.Stop();
|
||||||
@@ -172,9 +172,9 @@ void TAdvancedSound::UpdateAF(double A, double F, bool ListenerInside, vector3 N
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TAdvancedSound::CopyIfEmpty(TAdvancedSound &s)
|
void TAdvancedSound::CopyIfEmpty(TAdvancedSound &s)
|
||||||
{ // skopiowanie, gdyby by³ potrzebny, a nie zosta³ wczytany
|
{ // skopiowanie, gdyby był potrzebny, a nie został wczytany
|
||||||
if ((fStartLength > 0.0) || (fShutLength > 0.0))
|
if ((fStartLength > 0.0) || (fShutLength > 0.0))
|
||||||
return; // coœ jest
|
return; // coś jest
|
||||||
SoundStart = s.SoundStart;
|
SoundStart = s.SoundStart;
|
||||||
SoundCommencing = s.SoundCommencing;
|
SoundCommencing = s.SoundCommencing;
|
||||||
SoundShut = s.SoundShut;
|
SoundShut = s.SoundShut;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ typedef enum
|
|||||||
} TSoundState;
|
} TSoundState;
|
||||||
|
|
||||||
class TAdvancedSound
|
class TAdvancedSound
|
||||||
{ // klasa dŸwiêków maj¹cych pocz¹tek, dowolnie d³ugi œrodek oraz zakoñczenie (np. Rp1)
|
{ // klasa dźwięków mających początek, dowolnie długi środek oraz zakończenie (np. Rp1)
|
||||||
TRealSound SoundStart;
|
TRealSound SoundStart;
|
||||||
TRealSound SoundCommencing;
|
TRealSound SoundCommencing;
|
||||||
TRealSound SoundShut;
|
TRealSound SoundShut;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ TAirCoupler::~TAirCoupler()
|
|||||||
}
|
}
|
||||||
|
|
||||||
int TAirCoupler::GetStatus()
|
int TAirCoupler::GetStatus()
|
||||||
{ // zwraca 1, jeœli istnieje model prosty, 2 gdy skoœny
|
{ // zwraca 1, jeśli istnieje model prosty, 2 gdy skośny
|
||||||
int x = 0;
|
int x = 0;
|
||||||
if (pModelOn)
|
if (pModelOn)
|
||||||
x = 1;
|
x = 1;
|
||||||
@@ -30,7 +30,7 @@ int TAirCoupler::GetStatus()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TAirCoupler::Clear()
|
void TAirCoupler::Clear()
|
||||||
{ // zerowanie wskaŸników
|
{ // zerowanie wskaźników
|
||||||
pModelOn = NULL;
|
pModelOn = NULL;
|
||||||
pModelOff = NULL;
|
pModelOff = NULL;
|
||||||
pModelxOn = NULL;
|
pModelxOn = NULL;
|
||||||
@@ -41,10 +41,10 @@ void TAirCoupler::Clear()
|
|||||||
void TAirCoupler::Init(std::string const &asName, TModel3d *pModel)
|
void TAirCoupler::Init(std::string const &asName, TModel3d *pModel)
|
||||||
{ // wyszukanie submodeli
|
{ // wyszukanie submodeli
|
||||||
if (!pModel)
|
if (!pModel)
|
||||||
return; // nie ma w czym szukaæ
|
return; // nie ma w czym szukać
|
||||||
pModelOn = pModel->GetFromName( (asName + "_on").c_str() ); // po³¹czony na wprost
|
pModelOn = pModel->GetFromName( (asName + "_on").c_str() ); // połączony na wprost
|
||||||
pModelOff = pModel->GetFromName( (asName + "_off").c_str() ); // odwieszony
|
pModelOff = pModel->GetFromName( (asName + "_off").c_str() ); // odwieszony
|
||||||
pModelxOn = pModel->GetFromName( (asName + "_xon").c_str() ); // po³¹czony na skos
|
pModelxOn = pModel->GetFromName( (asName + "_xon").c_str() ); // połączony na skos
|
||||||
}
|
}
|
||||||
|
|
||||||
void TAirCoupler::Load(cParser *Parser, TModel3d *pModel)
|
void TAirCoupler::Load(cParser *Parser, TModel3d *pModel)
|
||||||
|
|||||||
366
AnimModel.cpp
366
AnimModel.cpp
@@ -29,36 +29,36 @@ TAnimContainer *TAnimModel::acAnimList = NULL;
|
|||||||
TAnimAdvanced::TAnimAdvanced(){};
|
TAnimAdvanced::TAnimAdvanced(){};
|
||||||
|
|
||||||
TAnimAdvanced::~TAnimAdvanced(){
|
TAnimAdvanced::~TAnimAdvanced(){
|
||||||
// delete[] pVocaloidMotionData; //plik został zmodyfikowany
|
// delete[] pVocaloidMotionData; //plik został zmodyfikowany
|
||||||
};
|
};
|
||||||
|
|
||||||
int TAnimAdvanced::SortByBone()
|
int TAnimAdvanced::SortByBone()
|
||||||
{ // sortowanie pliku animacji w celu optymalniejszego wykonania
|
{ // sortowanie pliku animacji w celu optymalniejszego wykonania
|
||||||
// rekordy zostają ułożone wg kolejnych ramek dla każdej kości
|
// rekordy zostają ułożone wg kolejnych ramek dla każdej kości
|
||||||
// ułożenie kości alfabetycznie nie jest niezbędne, ale upraszcza sortowanie bąbelkowe
|
// ułożenie kości alfabetycznie nie jest niezbędne, ale upraszcza sortowanie bąbelkowe
|
||||||
TAnimVocaloidFrame buf; // bufor roboczy (przydało by się pascalowe Swap()
|
TAnimVocaloidFrame buf; // bufor roboczy (przydało by się pascalowe Swap()
|
||||||
int i, j, k, swaps = 0, last = iMovements - 1, e;
|
int i, j, k, swaps = 0, last = iMovements - 1, e;
|
||||||
for (i = 0; i < iMovements; ++i)
|
for (i = 0; i < iMovements; ++i)
|
||||||
for (j = 0; j < 15; ++j)
|
for (j = 0; j < 15; ++j)
|
||||||
if (pMovementData[i].cBone[j] == '\0') // jeśli znacznik końca
|
if (pMovementData[i].cBone[j] == '\0') // jeśli znacznik końca
|
||||||
for (++j; j < 15; ++j)
|
for (++j; j < 15; ++j)
|
||||||
pMovementData[i].cBone[j] = '\0'; // zerowanie bajtów za znacznikiem końca
|
pMovementData[i].cBone[j] = '\0'; // zerowanie bajtów za znacznikiem końca
|
||||||
for (i = 0; i < last; ++i) // do przedostatniego
|
for (i = 0; i < last; ++i) // do przedostatniego
|
||||||
{ // dopóki nie posortowane
|
{ // dopóki nie posortowane
|
||||||
j = i; // z którym porównywać
|
j = i; // z którym porównywać
|
||||||
k = i; // z którym zamienić (nie trzeba zamieniać, jeśli ==i)
|
k = i; // z którym zamienić (nie trzeba zamieniać, jeśli ==i)
|
||||||
while (++j < iMovements)
|
while (++j < iMovements)
|
||||||
{
|
{
|
||||||
e = strcmp(pMovementData[k].cBone,
|
e = strcmp(pMovementData[k].cBone,
|
||||||
pMovementData[j].cBone); // numery trzeba porównywać inaczej
|
pMovementData[j].cBone); // numery trzeba porównywać inaczej
|
||||||
if (e > 0)
|
if (e > 0)
|
||||||
k = j; // trzeba zamienić - ten pod j jest mniejszy
|
k = j; // trzeba zamienić - ten pod j jest mniejszy
|
||||||
else if (!e)
|
else if (!e)
|
||||||
if (pMovementData[k].iFrame > pMovementData[j].iFrame)
|
if (pMovementData[k].iFrame > pMovementData[j].iFrame)
|
||||||
k = j; // numer klatki pod j jest mniejszy
|
k = j; // numer klatki pod j jest mniejszy
|
||||||
}
|
}
|
||||||
if (k > i)
|
if (k > i)
|
||||||
{ // jeśli trzeba przestawić
|
{ // jeśli trzeba przestawić
|
||||||
// buf=pMovementData[i];
|
// buf=pMovementData[i];
|
||||||
// pMovementData[i]=pMovementData[k];
|
// pMovementData[i]=pMovementData[k];
|
||||||
// pMovementData[k]=buf;
|
// pMovementData[k]=buf;
|
||||||
@@ -74,25 +74,25 @@ int TAnimAdvanced::SortByBone()
|
|||||||
TAnimContainer::TAnimContainer()
|
TAnimContainer::TAnimContainer()
|
||||||
{
|
{
|
||||||
pNext = NULL;
|
pNext = NULL;
|
||||||
vRotateAngles = vector3(0.0f, 0.0f, 0.0f); // aktualne kąty obrotu
|
vRotateAngles = vector3(0.0f, 0.0f, 0.0f); // aktualne kąty obrotu
|
||||||
vDesiredAngles = vector3(0.0f, 0.0f, 0.0f); // docelowe kąty obrotu
|
vDesiredAngles = vector3(0.0f, 0.0f, 0.0f); // docelowe kąty obrotu
|
||||||
fRotateSpeed = 0.0;
|
fRotateSpeed = 0.0;
|
||||||
vTranslation = vector3(0.0f, 0.0f, 0.0f); // aktualne przesunięcie
|
vTranslation = vector3(0.0f, 0.0f, 0.0f); // aktualne przesunięcie
|
||||||
vTranslateTo = vector3(0.0f, 0.0f, 0.0f); // docelowe przesunięcie
|
vTranslateTo = vector3(0.0f, 0.0f, 0.0f); // docelowe przesunięcie
|
||||||
fTranslateSpeed = 0.0;
|
fTranslateSpeed = 0.0;
|
||||||
fAngleSpeed = 0.0;
|
fAngleSpeed = 0.0;
|
||||||
pSubModel = NULL;
|
pSubModel = NULL;
|
||||||
iAnim = 0; // położenie początkowe
|
iAnim = 0; // położenie początkowe
|
||||||
pMovementData = NULL; // nie ma zaawansowanej animacji
|
pMovementData = NULL; // nie ma zaawansowanej animacji
|
||||||
mAnim = NULL; // nie ma macierzy obrotu dla submodelu
|
mAnim = NULL; // nie ma macierzy obrotu dla submodelu
|
||||||
evDone = NULL; // powiadamianie o zakończeniu animacji
|
evDone = NULL; // powiadamianie o zakończeniu animacji
|
||||||
acAnimNext = NULL; // na razie jest poza listą
|
acAnimNext = NULL; // na razie jest poza listą
|
||||||
}
|
}
|
||||||
|
|
||||||
TAnimContainer::~TAnimContainer()
|
TAnimContainer::~TAnimContainer()
|
||||||
{
|
{
|
||||||
SafeDelete(pNext);
|
SafeDelete(pNext);
|
||||||
delete mAnim; // AnimContainer jest właścicielem takich macierzy
|
delete mAnim; // AnimContainer jest właścicielem takich macierzy
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TAnimContainer::Init(TSubModel *pNewSubModel)
|
bool TAnimContainer::Init(TSubModel *pNewSubModel)
|
||||||
@@ -105,21 +105,21 @@ bool TAnimContainer::Init(TSubModel *pNewSubModel)
|
|||||||
void TAnimContainer::SetRotateAnim(vector3 vNewRotateAngles, double fNewRotateSpeed)
|
void TAnimContainer::SetRotateAnim(vector3 vNewRotateAngles, double fNewRotateSpeed)
|
||||||
{
|
{
|
||||||
if (!this)
|
if (!this)
|
||||||
return; // wywoływane z eventu, gdy brak modelu
|
return; // wywoływane z eventu, gdy brak modelu
|
||||||
vDesiredAngles = vNewRotateAngles;
|
vDesiredAngles = vNewRotateAngles;
|
||||||
fRotateSpeed = fNewRotateSpeed;
|
fRotateSpeed = fNewRotateSpeed;
|
||||||
iAnim |= 1;
|
iAnim |= 1;
|
||||||
/* //Ra 2014-07: jeśli model nie jest renderowany, to obliczyć czas animacji i dodać event
|
/* //Ra 2014-07: jeśli model nie jest renderowany, to obliczyć czas animacji i dodać event
|
||||||
wewnętrzny
|
wewnętrzny
|
||||||
//można by też ustawić czas początku animacji zamiast pobierać czas ramki i liczyć różnicę
|
//można by też ustawić czas początku animacji zamiast pobierać czas ramki i liczyć różnicę
|
||||||
*/
|
*/
|
||||||
if (evDone)
|
if (evDone)
|
||||||
{ // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez
|
{ // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez
|
||||||
// wyświetlania
|
// wyświetlania
|
||||||
if (iAnim >= 0)
|
if (iAnim >= 0)
|
||||||
{ // jeśli nie jest jeszcze na liście animacyjnej
|
{ // jeśli nie jest jeszcze na liście animacyjnej
|
||||||
acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon
|
acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon
|
||||||
TAnimModel::acAnimList = this; // a wstawić się na początek
|
TAnimModel::acAnimList = this; // a wstawić się na początek
|
||||||
iAnim |= 0x80000000; // dodany do listy
|
iAnim |= 0x80000000; // dodany do listy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -128,21 +128,21 @@ void TAnimContainer::SetRotateAnim(vector3 vNewRotateAngles, double fNewRotateSp
|
|||||||
void TAnimContainer::SetTranslateAnim(vector3 vNewTranslate, double fNewSpeed)
|
void TAnimContainer::SetTranslateAnim(vector3 vNewTranslate, double fNewSpeed)
|
||||||
{
|
{
|
||||||
if (!this)
|
if (!this)
|
||||||
return; // wywoływane z eventu, gdy brak modelu
|
return; // wywoływane z eventu, gdy brak modelu
|
||||||
vTranslateTo = vNewTranslate;
|
vTranslateTo = vNewTranslate;
|
||||||
fTranslateSpeed = fNewSpeed;
|
fTranslateSpeed = fNewSpeed;
|
||||||
iAnim |= 2;
|
iAnim |= 2;
|
||||||
/* //Ra 2014-07: jeśli model nie jest renderowany, to obliczyć czas animacji i dodać event
|
/* //Ra 2014-07: jeśli model nie jest renderowany, to obliczyć czas animacji i dodać event
|
||||||
wewnętrzny
|
wewnętrzny
|
||||||
//można by też ustawić czas początku animacji zamiast pobierać czas ramki i liczyć różnicę
|
//można by też ustawić czas początku animacji zamiast pobierać czas ramki i liczyć różnicę
|
||||||
*/
|
*/
|
||||||
if (evDone)
|
if (evDone)
|
||||||
{ // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez
|
{ // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez
|
||||||
// wyświetlania
|
// wyświetlania
|
||||||
if (iAnim >= 0)
|
if (iAnim >= 0)
|
||||||
{ // jeśli nie jest jeszcze na liście animacyjnej
|
{ // jeśli nie jest jeszcze na liście animacyjnej
|
||||||
acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon
|
acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon
|
||||||
TAnimModel::acAnimList = this; // a wstawić się na początek
|
TAnimModel::acAnimList = this; // a wstawić się na początek
|
||||||
iAnim |= 0x80000000; // dodany do listy
|
iAnim |= 0x80000000; // dodany do listy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,89 +151,89 @@ void TAnimContainer::SetTranslateAnim(vector3 vNewTranslate, double fNewSpeed)
|
|||||||
void TAnimContainer::AnimSetVMD(double fNewSpeed)
|
void TAnimContainer::AnimSetVMD(double fNewSpeed)
|
||||||
{
|
{
|
||||||
if (!this)
|
if (!this)
|
||||||
return; // wywoływane z eventu, gdy brak modelu
|
return; // wywoływane z eventu, gdy brak modelu
|
||||||
// skala do ustalenia, "cal" japoński (sun) to nieco ponad 3cm
|
// skala do ustalenia, "cal" japoński (sun) to nieco ponad 3cm
|
||||||
// X-w lewo, Y-w górę, Z-do tyłu
|
// X-w lewo, Y-w górę, Z-do tyłu
|
||||||
// minimalna wysokość to -7.66, a nadal musi być ponad podłogą
|
// minimalna wysokość to -7.66, a nadal musi być ponad podłogą
|
||||||
// if (pMovementData->iFrame>0) return; //tylko pierwsza ramka
|
// if (pMovementData->iFrame>0) return; //tylko pierwsza ramka
|
||||||
vTranslateTo = vector3(0.1 * pMovementData->f3Vector.x, 0.1 * pMovementData->f3Vector.z,
|
vTranslateTo = vector3(0.1 * pMovementData->f3Vector.x, 0.1 * pMovementData->f3Vector.z,
|
||||||
0.1 * pMovementData->f3Vector.y);
|
0.1 * pMovementData->f3Vector.y);
|
||||||
if (LengthSquared3(vTranslateTo) > 0.0 ? true : LengthSquared3(vTranslation) > 0.0)
|
if (LengthSquared3(vTranslateTo) > 0.0 ? true : LengthSquared3(vTranslation) > 0.0)
|
||||||
{ // jeśli ma być przesunięte albo jest przesunięcie
|
{ // jeśli ma być przesunięte albo jest przesunięcie
|
||||||
iAnim |= 2; // wyłączy się samo
|
iAnim |= 2; // wyłączy się samo
|
||||||
if (fNewSpeed > 0.0)
|
if (fNewSpeed > 0.0)
|
||||||
fTranslateSpeed = fNewSpeed; // prędkość jest mnożnikiem, nie podlega skalowaniu
|
fTranslateSpeed = fNewSpeed; // prędkość jest mnożnikiem, nie podlega skalowaniu
|
||||||
else // za późno na animacje, trzeba przestawić
|
else // za późno na animacje, trzeba przestawić
|
||||||
vTranslation = vTranslateTo;
|
vTranslation = vTranslateTo;
|
||||||
}
|
}
|
||||||
// if ((qCurrent.w<1.0)||(pMovementData->qAngle.w<1.0))
|
// if ((qCurrent.w<1.0)||(pMovementData->qAngle.w<1.0))
|
||||||
{ // jeśli jest jakiś obrót
|
{ // jeśli jest jakiś obrót
|
||||||
if (!mAnim)
|
if (!mAnim)
|
||||||
{
|
{
|
||||||
mAnim = new float4x4(); // będzie potrzebna macierz animacji
|
mAnim = new float4x4(); // będzie potrzebna macierz animacji
|
||||||
mAnim->Identity(); // jedynkowanie na początek
|
mAnim->Identity(); // jedynkowanie na początek
|
||||||
}
|
}
|
||||||
iAnim |= 4; // animacja kwaternionowa
|
iAnim |= 4; // animacja kwaternionowa
|
||||||
qStart = qCurrent; // potrzebna początkowa do interpolacji
|
qStart = qCurrent; // potrzebna początkowa do interpolacji
|
||||||
//---+ - też niby dobrze, ale nie tak trąca włosy na początku (macha w dół)
|
//---+ - też niby dobrze, ale nie tak trąca włosy na początku (macha w dół)
|
||||||
//-+-+ - dłoń ma w górze zamiast na pasie w pozycji początkowej
|
//-+-+ - dłoń ma w górze zamiast na pasie w pozycji początkowej
|
||||||
//+--+ - głowa do tyłu (broda w górę) w pozycji początkowej
|
//+--+ - głowa do tyłu (broda w górę) w pozycji początkowej
|
||||||
//--++ - pozycja początkowa dobra, trąca u góry, ale z rękami jakoś nie tak, kółko w
|
//--++ - pozycja początkowa dobra, trąca u góry, ale z rękami jakoś nie tak, kółko w
|
||||||
// przeciwną stronę
|
// przeciwną stronę
|
||||||
//++++ - kładzie się brzuchem do góry
|
//++++ - kładzie się brzuchem do góry
|
||||||
//-+++ - ręce w górze na początku, zamiast w dół, łokieć jakby w przeciwną stronę
|
//-+++ - ręce w górze na początku, zamiast w dół, łokieć jakby w przeciwną stronę
|
||||||
//+-++ - nie podnosi ręki do głowy
|
//+-++ - nie podnosi ręki do głowy
|
||||||
//++-+ - dłoń ma w górze zamiast na pasie
|
//++-+ - dłoń ma w górze zamiast na pasie
|
||||||
qDesired = Normalize(float4(-pMovementData->qAngle.x, -pMovementData->qAngle.z,
|
qDesired = Normalize(float4(-pMovementData->qAngle.x, -pMovementData->qAngle.z,
|
||||||
-pMovementData->qAngle.y,
|
-pMovementData->qAngle.y,
|
||||||
pMovementData->qAngle.w)); // tu trzeba będzie osie zamienić
|
pMovementData->qAngle.w)); // tu trzeba będzie osie zamienić
|
||||||
if (fNewSpeed > 0.0)
|
if (fNewSpeed > 0.0)
|
||||||
{
|
{
|
||||||
fAngleSpeed = fNewSpeed; // wtedy animować za pomocą interpolacji
|
fAngleSpeed = fNewSpeed; // wtedy animować za pomocą interpolacji
|
||||||
fAngleCurrent = 0.0; // początek interpolacji
|
fAngleCurrent = 0.0; // początek interpolacji
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // za późno na animację, można tylko przestawić w docelowe miejsce
|
{ // za późno na animację, można tylko przestawić w docelowe miejsce
|
||||||
fAngleSpeed = 0.0;
|
fAngleSpeed = 0.0;
|
||||||
fAngleCurrent = 1.0; // interpolacja zakończona
|
fAngleCurrent = 1.0; // interpolacja zakończona
|
||||||
qCurrent = qDesired;
|
qCurrent = qDesired;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if (!strcmp(pSubModel->pName,"?Z?“?^?[")) //jak główna kość
|
// if (!strcmp(pSubModel->pName,"?Z?“?^?[")) //jak główna kość
|
||||||
// if (!strcmp(pSubModel->pName,"Ť¶‚‚Ü?ć‚h‚j")) //IK lewej stopy
|
// if (!strcmp(pSubModel->pName,"Ť¶‚‚Ü?ć‚h‚j")) //IK lewej stopy
|
||||||
// WriteLog(AnsiString(pMovementData->iFrame)+": "+AnsiString(pMovementData->f3Vector.x)+"
|
// WriteLog(AnsiString(pMovementData->iFrame)+": "+AnsiString(pMovementData->f3Vector.x)+"
|
||||||
// "+AnsiString(pMovementData->f3Vector.y)+" "+AnsiString(pMovementData->f3Vector.z));
|
// "+AnsiString(pMovementData->f3Vector.y)+" "+AnsiString(pMovementData->f3Vector.z));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TAnimContainer::UpdateModel()
|
void TAnimContainer::UpdateModel()
|
||||||
{ // przeliczanie animacji wykonać tylko raz na model
|
{ // przeliczanie animacji wykonać tylko raz na model
|
||||||
if (pSubModel) // pozbyć się tego - sprawdzać wcześniej
|
if (pSubModel) // pozbyć się tego - sprawdzać wcześniej
|
||||||
{
|
{
|
||||||
if (fTranslateSpeed != 0.0)
|
if (fTranslateSpeed != 0.0)
|
||||||
{
|
{
|
||||||
vector3 dif = vTranslateTo - vTranslation; // wektor w kierunku docelowym
|
vector3 dif = vTranslateTo - vTranslation; // wektor w kierunku docelowym
|
||||||
double l = LengthSquared3(dif); // długość wektora potrzebnego przemieszczenia
|
double l = LengthSquared3(dif); // długość wektora potrzebnego przemieszczenia
|
||||||
if (l >= 0.0001)
|
if (l >= 0.0001)
|
||||||
{ // jeśli do przemieszczenia jest ponad 1cm
|
{ // jeśli do przemieszczenia jest ponad 1cm
|
||||||
vector3 s = SafeNormalize(dif); // jednostkowy wektor kierunku
|
vector3 s = SafeNormalize(dif); // jednostkowy wektor kierunku
|
||||||
s = s *
|
s = s *
|
||||||
(fTranslateSpeed *
|
(fTranslateSpeed *
|
||||||
Timer::GetDeltaTime()); // przemieszczenie w podanym czasie z daną prędkością
|
Timer::GetDeltaTime()); // przemieszczenie w podanym czasie z daną prędkością
|
||||||
if (LengthSquared3(s) < l) //żeby nie jechało na drugą stronę
|
if (LengthSquared3(s) < l) //żeby nie jechało na drugą stronę
|
||||||
vTranslation += s;
|
vTranslation += s;
|
||||||
else
|
else
|
||||||
vTranslation = vTranslateTo; // koniec animacji, "koniec animowania" uruchomi
|
vTranslation = vTranslateTo; // koniec animacji, "koniec animowania" uruchomi
|
||||||
// się w następnej klatce
|
// się w następnej klatce
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // koniec animowania
|
{ // koniec animowania
|
||||||
vTranslation = vTranslateTo;
|
vTranslation = vTranslateTo;
|
||||||
fTranslateSpeed = 0.0; // wyłączenie przeliczania wektora
|
fTranslateSpeed = 0.0; // wyłączenie przeliczania wektora
|
||||||
if (LengthSquared3(vTranslation) <= 0.0001) // jeśli jest w punkcie początkowym
|
if (LengthSquared3(vTranslation) <= 0.0001) // jeśli jest w punkcie początkowym
|
||||||
iAnim &= ~2; // wyłączyć zmianę pozycji submodelu
|
iAnim &= ~2; // wyłączyć zmianę pozycji submodelu
|
||||||
if (evDone)
|
if (evDone)
|
||||||
Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o
|
Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o
|
||||||
// zakończeniu
|
// zakończeniu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fRotateSpeed != 0)
|
if (fRotateSpeed != 0)
|
||||||
@@ -294,67 +294,67 @@ void TAnimContainer::UpdateModel()
|
|||||||
if (vRotateAngles.x == 0.0)
|
if (vRotateAngles.x == 0.0)
|
||||||
if (vRotateAngles.y == 0.0)
|
if (vRotateAngles.y == 0.0)
|
||||||
if (vRotateAngles.z == 0.0)
|
if (vRotateAngles.z == 0.0)
|
||||||
iAnim &= ~1; // kąty są zerowe
|
iAnim &= ~1; // kąty są zerowe
|
||||||
if (!anim)
|
if (!anim)
|
||||||
{ // nie potrzeba przeliczać już
|
{ // nie potrzeba przeliczać już
|
||||||
fRotateSpeed = 0.0;
|
fRotateSpeed = 0.0;
|
||||||
if (evDone)
|
if (evDone)
|
||||||
Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o
|
Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o
|
||||||
// zakończeniu
|
// zakończeniu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fAngleSpeed != 0.0)
|
if (fAngleSpeed != 0.0)
|
||||||
{ // obrót kwaternionu (interpolacja)
|
{ // obrót kwaternionu (interpolacja)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void TAnimContainer::PrepareModel()
|
void TAnimContainer::PrepareModel()
|
||||||
{ // tutaj zostawić tylko ustawienie submodelu, przeliczanie ma być w UpdateModel()
|
{ // tutaj zostawić tylko ustawienie submodelu, przeliczanie ma być w UpdateModel()
|
||||||
if (pSubModel) // pozbyć się tego - sprawdzać wcześniej
|
if (pSubModel) // pozbyć się tego - sprawdzać wcześniej
|
||||||
{
|
{
|
||||||
// nanoszenie animacji na wzorzec
|
// nanoszenie animacji na wzorzec
|
||||||
if (iAnim & 1) // zmieniona pozycja względem początkowej
|
if (iAnim & 1) // zmieniona pozycja względem początkowej
|
||||||
pSubModel->SetRotateXYZ(vRotateAngles); // ustawia typ animacji
|
pSubModel->SetRotateXYZ(vRotateAngles); // ustawia typ animacji
|
||||||
if (iAnim & 2) // zmieniona pozycja względem początkowej
|
if (iAnim & 2) // zmieniona pozycja względem początkowej
|
||||||
pSubModel->SetTranslate(vTranslation);
|
pSubModel->SetTranslate(vTranslation);
|
||||||
if (iAnim & 4) // zmieniona pozycja względem początkowej
|
if (iAnim & 4) // zmieniona pozycja względem początkowej
|
||||||
{
|
{
|
||||||
if (fAngleSpeed > 0.0f)
|
if (fAngleSpeed > 0.0f)
|
||||||
{
|
{
|
||||||
fAngleCurrent +=
|
fAngleCurrent +=
|
||||||
fAngleSpeed * Timer::GetDeltaTime(); // aktualny parametr interpolacji
|
fAngleSpeed * Timer::GetDeltaTime(); // aktualny parametr interpolacji
|
||||||
if (fAngleCurrent >= 1.0f)
|
if (fAngleCurrent >= 1.0f)
|
||||||
{ // interpolacja zakończona, ustawienie na pozycję końcową
|
{ // interpolacja zakończona, ustawienie na pozycję końcową
|
||||||
qCurrent = qDesired;
|
qCurrent = qDesired;
|
||||||
fAngleSpeed = 0.0; // wyłączenie przeliczania wektora
|
fAngleSpeed = 0.0; // wyłączenie przeliczania wektora
|
||||||
if (evDone)
|
if (evDone)
|
||||||
Global::AddToQuery(evDone,
|
Global::AddToQuery(evDone,
|
||||||
NULL); // wykonanie eventu informującego o zakończeniu
|
NULL); // wykonanie eventu informującego o zakończeniu
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // obliczanie pozycji pośredniej
|
{ // obliczanie pozycji pośredniej
|
||||||
// normalizacja jest wymagana do interpolacji w następnej animacji
|
// normalizacja jest wymagana do interpolacji w następnej animacji
|
||||||
qCurrent = Normalize(
|
qCurrent = Normalize(
|
||||||
Slerp(qStart, qDesired, fAngleCurrent)); // interpolacja sferyczna kąta
|
Slerp(qStart, qDesired, fAngleCurrent)); // interpolacja sferyczna kąta
|
||||||
// qCurrent=Slerp(qStart,qDesired,fAngleCurrent); //interpolacja sferyczna kąta
|
// qCurrent=Slerp(qStart,qDesired,fAngleCurrent); //interpolacja sferyczna kąta
|
||||||
if (qCurrent.w ==
|
if (qCurrent.w ==
|
||||||
1.0) // rozpoznać brak obrotu i wyłączyć w iAnim w takim przypadku
|
1.0) // rozpoznać brak obrotu i wyłączyć w iAnim w takim przypadku
|
||||||
iAnim &= ~4; // kąty są zerowe
|
iAnim &= ~4; // kąty są zerowe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mAnim->Quaternion(&qCurrent); // wypełnienie macierzy (wymaga normalizacji?)
|
mAnim->Quaternion(&qCurrent); // wypełnienie macierzy (wymaga normalizacji?)
|
||||||
pSubModel->mAnimMatrix = mAnim; // użyczenie do submodelu (na czas renderowania!)
|
pSubModel->mAnimMatrix = mAnim; // użyczenie do submodelu (na czas renderowania!)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if (!strcmp(pSubModel->pName,"?Z?“?^?[")) //jak główna kość
|
// if (!strcmp(pSubModel->pName,"?Z?“?^?[")) //jak główna kość
|
||||||
// WriteLog(AnsiString(pMovementData->iFrame)+": "+AnsiString(iAnim)+"
|
// WriteLog(AnsiString(pMovementData->iFrame)+": "+AnsiString(iAnim)+"
|
||||||
// "+AnsiString(vTranslation.x)+" "+AnsiString(vTranslation.y)+" "+AnsiString(vTranslation.z));
|
// "+AnsiString(vTranslation.x)+" "+AnsiString(vTranslation.y)+" "+AnsiString(vTranslation.z));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TAnimContainer::UpdateModelIK()
|
void TAnimContainer::UpdateModelIK()
|
||||||
{ // odwrotna kinematyka wyliczana dopiero po ustawieniu macierzy w submodelach
|
{ // odwrotna kinematyka wyliczana dopiero po ustawieniu macierzy w submodelach
|
||||||
if (pSubModel) // pozbyć się tego - sprawdzać wcześniej
|
if (pSubModel) // pozbyć się tego - sprawdzać wcześniej
|
||||||
{
|
{
|
||||||
if (pSubModel->b_Anim & at_IK)
|
if (pSubModel->b_Anim & at_IK)
|
||||||
{ // odwrotna kinematyka
|
{ // odwrotna kinematyka
|
||||||
@@ -362,25 +362,25 @@ void TAnimContainer::UpdateModelIK()
|
|||||||
TSubModel *ch = pSubModel->ChildGet();
|
TSubModel *ch = pSubModel->ChildGet();
|
||||||
switch (pSubModel->b_Anim)
|
switch (pSubModel->b_Anim)
|
||||||
{
|
{
|
||||||
case at_IK11: // stopa: ustawić w kierunku czubka (pierwszy potomny)
|
case at_IK11: // stopa: ustawić w kierunku czubka (pierwszy potomny)
|
||||||
d = ch->Translation1Get(); // wektor względem aktualnego układu (nie uwzględnia
|
d = ch->Translation1Get(); // wektor względem aktualnego układu (nie uwzględnia
|
||||||
// obrotu)
|
// obrotu)
|
||||||
k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0,
|
k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0,
|
||||||
-RadToDeg(atan2(d.y, d.x))); // proste skierowanie na punkt
|
-RadToDeg(atan2(d.y, d.x))); // proste skierowanie na punkt
|
||||||
pSubModel->SetRotateIK1(k);
|
pSubModel->SetRotateIK1(k);
|
||||||
// if (!strcmp(pSubModel->pName,"?Z?“?^?[")) //jak główna kość
|
// if (!strcmp(pSubModel->pName,"?Z?“?^?[")) //jak główna kość
|
||||||
// WriteLog("--> "+AnsiString(k.x)+" "+AnsiString(k.y)+" "+AnsiString(k.z));
|
// WriteLog("--> "+AnsiString(k.x)+" "+AnsiString(k.y)+" "+AnsiString(k.z));
|
||||||
// Ra: to już jest dobrze, może być inna ćwiartka i znak
|
// Ra: to już jest dobrze, może być inna ćwiartka i znak
|
||||||
break;
|
break;
|
||||||
case at_IK22: // udo: ustawić w kierunku pierwszej potomnej pierwszej potomnej (kostki)
|
case at_IK22: // udo: ustawić w kierunku pierwszej potomnej pierwszej potomnej (kostki)
|
||||||
// pozycję kostki należy określić względem kości centralnej (+biodro może być
|
// pozycję kostki należy określić względem kości centralnej (+biodro może być
|
||||||
// pochylone)
|
// pochylone)
|
||||||
// potem wyliczyć ewentualne odchylenie w tej i następnej
|
// potem wyliczyć ewentualne odchylenie w tej i następnej
|
||||||
// w sumie to proste, jak wyznaczenie kątów w trójkącie o znanej długości boków...
|
// w sumie to proste, jak wyznaczenie kątów w trójkącie o znanej długości boków...
|
||||||
d = ch->Translation2Get(); // wektor względem aktualnego układu (nie uwzględnia
|
d = ch->Translation2Get(); // wektor względem aktualnego układu (nie uwzględnia
|
||||||
// obrotu)
|
// obrotu)
|
||||||
// if ()
|
// if ()
|
||||||
{ // kość IK jest dalej niż pozycja spoczynkowa
|
{ // kość IK jest dalej niż pozycja spoczynkowa
|
||||||
k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0,
|
k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0,
|
||||||
-RadToDeg(atan2(d.y, d.x))); // proste skierowanie na punkt
|
-RadToDeg(atan2(d.y, d.x))); // proste skierowanie na punkt
|
||||||
pSubModel->SetRotateIK1(k);
|
pSubModel->SetRotateIK1(k);
|
||||||
@@ -397,7 +397,7 @@ bool TAnimContainer::InMovement()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TAnimContainer::EventAssign(TEvent *ev)
|
void TAnimContainer::EventAssign(TEvent *ev)
|
||||||
{ // przypisanie eventu wykonywanego po zakończeniu animacji
|
{ // przypisanie eventu wykonywanego po zakończeniu animacji
|
||||||
evDone = ev;
|
evDone = ev;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -419,11 +419,11 @@ TAnimModel::TAnimModel()
|
|||||||
for (int i = 0; i < iMaxNumLights; i++)
|
for (int i = 0; i < iMaxNumLights; i++)
|
||||||
{
|
{
|
||||||
LightsOn[i] = LightsOff[i] = NULL; // normalnie nie ma
|
LightsOn[i] = LightsOff[i] = NULL; // normalnie nie ma
|
||||||
lsLights[i] = ls_Off; // a jeśli są, to wyłączone
|
lsLights[i] = ls_Off; // a jeśli są, to wyłączone
|
||||||
}
|
}
|
||||||
vAngle.x = vAngle.y = vAngle.z = 0.0; // zerowanie obrotów egzemplarza
|
vAngle.x = vAngle.y = vAngle.z = 0.0; // zerowanie obrotów egzemplarza
|
||||||
pAdvanced = NULL; // nie ma zaawansowanej animacji
|
pAdvanced = NULL; // nie ma zaawansowanej animacji
|
||||||
fDark = 0.25; // standardowy próg zaplania
|
fDark = 0.25; // standardowy próg zaplania
|
||||||
fOnTime = 0.66;
|
fOnTime = 0.66;
|
||||||
fOffTime = fOnTime + 0.66;
|
fOffTime = fOnTime + 0.66;
|
||||||
}
|
}
|
||||||
@@ -445,29 +445,29 @@ bool TAnimModel::Init(TModel3d *pNewModel)
|
|||||||
bool TAnimModel::Init(std::string const &asName, std::string const &asReplacableTexture)
|
bool TAnimModel::Init(std::string const &asName, std::string const &asReplacableTexture)
|
||||||
{
|
{
|
||||||
if (asReplacableTexture.substr(0, 1) ==
|
if (asReplacableTexture.substr(0, 1) ==
|
||||||
"*") // od gwiazdki zaczynają się teksty na wyświetlaczach
|
"*") // od gwiazdki zaczynają się teksty na wyświetlaczach
|
||||||
asText = asReplacableTexture.substr(1, asReplacableTexture.length() - 1); // zapamiętanie tekstu
|
asText = asReplacableTexture.substr(1, asReplacableTexture.length() - 1); // zapamiętanie tekstu
|
||||||
else if (asReplacableTexture != "none")
|
else if (asReplacableTexture != "none")
|
||||||
ReplacableSkinId[1] =
|
ReplacableSkinId[1] =
|
||||||
TTexturesManager::GetTextureID(NULL, NULL, asReplacableTexture.c_str());
|
TTexturesManager::GetTextureID(NULL, NULL, asReplacableTexture.c_str());
|
||||||
if (TTexturesManager::GetAlpha(ReplacableSkinId[1]))
|
if (TTexturesManager::GetAlpha(ReplacableSkinId[1]))
|
||||||
iTexAlpha =
|
iTexAlpha =
|
||||||
0x31310031; // tekstura z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
0x31310031; // tekstura z kanałem alfa - nie renderować w cyklu nieprzezroczystych
|
||||||
else
|
else
|
||||||
iTexAlpha = 0x30300030; // tekstura nieprzezroczysta - nie renderować w cyklu
|
iTexAlpha = 0x30300030; // tekstura nieprzezroczysta - nie renderować w cyklu
|
||||||
// przezroczystych
|
// przezroczystych
|
||||||
return (Init(TModelsManager::GetModel(asName.c_str())));
|
return (Init(TModelsManager::GetModel(asName.c_str())));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TAnimModel::Load(cParser *parser, bool ter)
|
bool TAnimModel::Load(cParser *parser, bool ter)
|
||||||
{ // rozpoznanie wpisu modelu i ustawienie świateł
|
{ // rozpoznanie wpisu modelu i ustawienie świateł
|
||||||
std::string name = parser->getToken<std::string>();
|
std::string name = parser->getToken<std::string>();
|
||||||
std::string texture = parser->getToken<std::string>(false); // tekstura (zmienia na małe)
|
std::string texture = parser->getToken<std::string>(false); // tekstura (zmienia na małe)
|
||||||
if (!Init( name, texture ))
|
if (!Init( name, texture ))
|
||||||
{
|
{
|
||||||
if (name != "notload")
|
if (name != "notload")
|
||||||
{ // gdy brak modelu
|
{ // gdy brak modelu
|
||||||
if (ter) // jeśli teren
|
if (ter) // jeśli teren
|
||||||
{
|
{
|
||||||
if( name.substr( name.rfind( '.' ) ) == ".t3d" ) {
|
if( name.substr( name.rfind( '.' ) ) == ".t3d" ) {
|
||||||
name[ name.length() - 2 ] = 'e';
|
name[ name.length() - 2 ] = 'e';
|
||||||
@@ -480,7 +480,7 @@ bool TAnimModel::Load(cParser *parser, bool ter)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // wiązanie świateł, o ile model wczytany
|
{ // wiązanie świateł, o ile model wczytany
|
||||||
LightsOn[0] = pModel->GetFromName("Light_On00");
|
LightsOn[0] = pModel->GetFromName("Light_On00");
|
||||||
LightsOn[1] = pModel->GetFromName("Light_On01");
|
LightsOn[1] = pModel->GetFromName("Light_On01");
|
||||||
LightsOn[2] = pModel->GetFromName("Light_On02");
|
LightsOn[2] = pModel->GetFromName("Light_On02");
|
||||||
@@ -499,7 +499,7 @@ bool TAnimModel::Load(cParser *parser, bool ter)
|
|||||||
LightsOff[7] = pModel->GetFromName("Light_Off07");
|
LightsOff[7] = pModel->GetFromName("Light_Off07");
|
||||||
}
|
}
|
||||||
for (int i = 0; i < iMaxNumLights; ++i)
|
for (int i = 0; i < iMaxNumLights; ++i)
|
||||||
if (LightsOn[i] || LightsOff[i]) // Ra: zlikwidowałem wymóg istnienia obu
|
if (LightsOn[i] || LightsOff[i]) // Ra: zlikwidowałem wymóg istnienia obu
|
||||||
iNumLights = i + 1;
|
iNumLights = i + 1;
|
||||||
|
|
||||||
if ( parser->getToken<std::string>() == "lights" )
|
if ( parser->getToken<std::string>() == "lights" )
|
||||||
@@ -509,7 +509,7 @@ bool TAnimModel::Load(cParser *parser, bool ter)
|
|||||||
while( ( token != "" )
|
while( ( token != "" )
|
||||||
&& ( token != "endmodel" ) ) {
|
&& ( token != "endmodel" ) ) {
|
||||||
|
|
||||||
LightSet( i, std::stod( token ) ); // stan światła jest liczbą z ułamkiem
|
LightSet( i, std::stod( token ) ); // stan światła jest liczbą z ułamkiem
|
||||||
++i;
|
++i;
|
||||||
|
|
||||||
token = "";
|
token = "";
|
||||||
@@ -548,23 +548,23 @@ TAnimContainer * TAnimModel::GetContainer(char *pName)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TAnimModel::RaAnimate()
|
void TAnimModel::RaAnimate()
|
||||||
{ // przeliczenie animacji - jednorazowo na klatkę
|
{ // przeliczenie animacji - jednorazowo na klatkę
|
||||||
// Ra 2F1I: to by można pomijać dla modeli bez animacji, których jest większość
|
// Ra 2F1I: to by można pomijać dla modeli bez animacji, których jest większość
|
||||||
TAnimContainer *pCurrent;
|
TAnimContainer *pCurrent;
|
||||||
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
|
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
|
||||||
if (!pCurrent->evDone) // jeśli jest bez eventu
|
if (!pCurrent->evDone) // jeśli jest bez eventu
|
||||||
pCurrent->UpdateModel(); // przeliczenie animacji każdego submodelu
|
pCurrent->UpdateModel(); // przeliczenie animacji każdego submodelu
|
||||||
// if () //tylko dla modeli z IK !!!!
|
// if () //tylko dla modeli z IK !!!!
|
||||||
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext) // albo osobny łańcuch
|
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext) // albo osobny łańcuch
|
||||||
pCurrent->UpdateModelIK(); // przeliczenie odwrotnej kinematyki
|
pCurrent->UpdateModelIK(); // przeliczenie odwrotnej kinematyki
|
||||||
};
|
};
|
||||||
|
|
||||||
void TAnimModel::RaPrepare()
|
void TAnimModel::RaPrepare()
|
||||||
{ // ustawia światła i animacje we wzorcu modelu przed renderowaniem egzemplarza
|
{ // ustawia światła i animacje we wzorcu modelu przed renderowaniem egzemplarza
|
||||||
fBlinkTimer -= Timer::GetDeltaTime();
|
fBlinkTimer -= Timer::GetDeltaTime();
|
||||||
if (fBlinkTimer <= 0)
|
if (fBlinkTimer <= 0)
|
||||||
fBlinkTimer = fOffTime;
|
fBlinkTimer = fOffTime;
|
||||||
bool state; // stan światła
|
bool state; // stan światła
|
||||||
for (int i = 0; i < iNumLights; i++)
|
for (int i = 0; i < iNumLights; i++)
|
||||||
{
|
{
|
||||||
switch (lsLights[i])
|
switch (lsLights[i])
|
||||||
@@ -583,20 +583,20 @@ void TAnimModel::RaPrepare()
|
|||||||
if (LightsOff[i])
|
if (LightsOff[i])
|
||||||
LightsOff[i]->iVisible = !state;
|
LightsOff[i]->iVisible = !state;
|
||||||
}
|
}
|
||||||
TSubModel::iInstance = (int)this; //żeby nie robić cudzych animacji
|
TSubModel::iInstance = (int)this; //żeby nie robić cudzych animacji
|
||||||
TSubModel::pasText = &asText; // przekazanie tekstu do wyświetlacza (!!!! do przemyślenia)
|
TSubModel::pasText = &asText; // przekazanie tekstu do wyświetlacza (!!!! do przemyślenia)
|
||||||
if (pAdvanced) // jeśli jest zaawansowana animacja
|
if (pAdvanced) // jeśli jest zaawansowana animacja
|
||||||
Advanced(); // wykonać co tam trzeba
|
Advanced(); // wykonać co tam trzeba
|
||||||
TAnimContainer *pCurrent;
|
TAnimContainer *pCurrent;
|
||||||
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
|
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
|
||||||
pCurrent->PrepareModel(); // ustawienie animacji egzemplarza dla każdego submodelu
|
pCurrent->PrepareModel(); // ustawienie animacji egzemplarza dla każdego submodelu
|
||||||
// if () //tylko dla modeli z IK !!!!
|
// if () //tylko dla modeli z IK !!!!
|
||||||
// for (pCurrent=pRoot;pCurrent!=NULL;pCurrent=pCurrent->pNext) //albo osobny łańcuch
|
// for (pCurrent=pRoot;pCurrent!=NULL;pCurrent=pCurrent->pNext) //albo osobny łańcuch
|
||||||
// pCurrent->UpdateModelIK(); //przeliczenie odwrotnej kinematyki
|
// pCurrent->UpdateModelIK(); //przeliczenie odwrotnej kinematyki
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
void TAnimModel::RenderVBO(vector3 pPosition, double fAngle)
|
void TAnimModel::RenderVBO(vector3 pPosition, double fAngle)
|
||||||
{ // sprawdza światła i rekurencyjnie renderuje TModel3d
|
{ // sprawdza światła i rekurencyjnie renderuje TModel3d
|
||||||
RaAnimate(); // jednorazowe przeliczenie animacji
|
RaAnimate(); // jednorazowe przeliczenie animacji
|
||||||
RaPrepare();
|
RaPrepare();
|
||||||
if (pModel) // renderowanie rekurencyjne submodeli
|
if (pModel) // renderowanie rekurencyjne submodeli
|
||||||
@@ -626,21 +626,21 @@ void TAnimModel::RenderAlphaDL(vector3 pPosition, double fAngle)
|
|||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
int TAnimModel::Flags()
|
int TAnimModel::Flags()
|
||||||
{ // informacja dla TGround, czy ma być w Render, RenderAlpha, czy RenderMixed
|
{ // informacja dla TGround, czy ma być w Render, RenderAlpha, czy RenderMixed
|
||||||
int i = pModel ? pModel->Flags() : 0; // pobranie flag całego modelu
|
int i = pModel ? pModel->Flags() : 0; // pobranie flag całego modelu
|
||||||
if (ReplacableSkinId[1] > 0) // jeśli ma wymienną teksturę 0
|
if (ReplacableSkinId[1] > 0) // jeśli ma wymienną teksturę 0
|
||||||
i |= (i & 0x01010001) * ((iTexAlpha & 1) ? 0x20 : 0x10);
|
i |= (i & 0x01010001) * ((iTexAlpha & 1) ? 0x20 : 0x10);
|
||||||
// if (ReplacableSkinId[2]>0) //jeśli ma wymienną teksturę 1
|
// if (ReplacableSkinId[2]>0) //jeśli ma wymienną teksturę 1
|
||||||
// i|=(i&0x02020002)*((iTexAlpha&1)?0x10:0x08);
|
// i|=(i&0x02020002)*((iTexAlpha&1)?0x10:0x08);
|
||||||
// if (ReplacableSkinId[3]>0) //jeśli ma wymienną teksturę 2
|
// if (ReplacableSkinId[3]>0) //jeśli ma wymienną teksturę 2
|
||||||
// i|=(i&0x04040004)*((iTexAlpha&1)?0x08:0x04);
|
// i|=(i&0x04040004)*((iTexAlpha&1)?0x08:0x04);
|
||||||
// if (ReplacableSkinId[4]>0) //jeśli ma wymienną teksturę 3
|
// if (ReplacableSkinId[4]>0) //jeśli ma wymienną teksturę 3
|
||||||
// i|=(i&0x08080008)*((iTexAlpha&1)?0x04:0x02);
|
// i|=(i&0x08080008)*((iTexAlpha&1)?0x04:0x02);
|
||||||
return i;
|
return i;
|
||||||
};
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// 2011-03-16 cztery nowe funkcje renderowania z możliwością pochylania obiektów
|
// 2011-03-16 cztery nowe funkcje renderowania z możliwością pochylania obiektów
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
void TAnimModel::RenderDL(vector3 *vPosition)
|
void TAnimModel::RenderDL(vector3 *vPosition)
|
||||||
@@ -672,15 +672,15 @@ void TAnimModel::RenderAlphaVBO(vector3 *vPosition)
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
bool TAnimModel::TerrainLoaded()
|
bool TAnimModel::TerrainLoaded()
|
||||||
{ // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy
|
{ // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy
|
||||||
return (this ? pModel != NULL : false);
|
return (this ? pModel != NULL : false);
|
||||||
};
|
};
|
||||||
int TAnimModel::TerrainCount()
|
int TAnimModel::TerrainCount()
|
||||||
{ // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy
|
{ // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy
|
||||||
return pModel ? pModel->TerrainCount() : 0;
|
return pModel ? pModel->TerrainCount() : 0;
|
||||||
};
|
};
|
||||||
TSubModel * TAnimModel::TerrainSquare(int n)
|
TSubModel * TAnimModel::TerrainSquare(int n)
|
||||||
{ // pobieranie wskaźników do pierwszego submodelu
|
{ // pobieranie wskaźników do pierwszego submodelu
|
||||||
return pModel ? pModel->TerrainSquare(n) : 0;
|
return pModel ? pModel->TerrainSquare(n) : 0;
|
||||||
};
|
};
|
||||||
void TAnimModel::TerrainRenderVBO(int n)
|
void TAnimModel::TerrainRenderVBO(int n)
|
||||||
@@ -697,21 +697,21 @@ void TAnimModel::Advanced()
|
|||||||
int frame = floor(pAdvanced->fCurrent); // numer klatki jako int
|
int frame = floor(pAdvanced->fCurrent); // numer klatki jako int
|
||||||
TAnimContainer *pCurrent;
|
TAnimContainer *pCurrent;
|
||||||
if (pAdvanced->fCurrent >= pAdvanced->fLast)
|
if (pAdvanced->fCurrent >= pAdvanced->fLast)
|
||||||
{ // animacja została zakończona
|
{ // animacja została zakończona
|
||||||
delete pAdvanced;
|
delete pAdvanced;
|
||||||
pAdvanced = NULL; // dalej już nic
|
pAdvanced = NULL; // dalej już nic
|
||||||
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
|
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
|
||||||
if (pCurrent->pMovementData) // jeśli obsługiwany tabelką animacji
|
if (pCurrent->pMovementData) // jeśli obsługiwany tabelką animacji
|
||||||
pCurrent->pMovementData = NULL; // usuwanie wskaźników
|
pCurrent->pMovementData = NULL; // usuwanie wskaźników
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // coś trzeba poanimować - wszystkie animowane submodele są w tym łańcuchu
|
{ // coś trzeba poanimować - wszystkie animowane submodele są w tym łańcuchu
|
||||||
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
|
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
|
||||||
if (pCurrent->pMovementData) // jeśli obsługiwany tabelką animacji
|
if (pCurrent->pMovementData) // jeśli obsługiwany tabelką animacji
|
||||||
if (frame >= pCurrent->pMovementData->iFrame) // koniec czekania
|
if (frame >= pCurrent->pMovementData->iFrame) // koniec czekania
|
||||||
if (!strcmp(pCurrent->pMovementData->cBone,
|
if (!strcmp(pCurrent->pMovementData->cBone,
|
||||||
(pCurrent->pMovementData + 1)->cBone))
|
(pCurrent->pMovementData + 1)->cBone))
|
||||||
{ // jak kolejna ramka dotyczy tego samego submodelu, ustawić animację do
|
{ // jak kolejna ramka dotyczy tego samego submodelu, ustawić animację do
|
||||||
// kolejnej ramki
|
// kolejnej ramki
|
||||||
++pCurrent->pMovementData; // kolejna klatka
|
++pCurrent->pMovementData; // kolejna klatka
|
||||||
pCurrent->AnimSetVMD(
|
pCurrent->AnimSetVMD(
|
||||||
@@ -720,18 +720,18 @@ void TAnimModel::Advanced()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
pCurrent->pMovementData =
|
pCurrent->pMovementData =
|
||||||
NULL; // inna nazwa, animowanie zakończone w aktualnym położeniu
|
NULL; // inna nazwa, animowanie zakończone w aktualnym położeniu
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double d)
|
void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double d)
|
||||||
{ // rozpoczęcie wykonywania animacji z podanego pliku
|
{ // rozpoczęcie wykonywania animacji z podanego pliku
|
||||||
// tabela w pliku musi być posortowana wg klatek dla kolejnych kości!
|
// tabela w pliku musi być posortowana wg klatek dla kolejnych kości!
|
||||||
// skrócone nagranie ma 3:42 = 222 sekundy, animacja kończy się na klatce 6518
|
// skrócone nagranie ma 3:42 = 222 sekundy, animacja kończy się na klatce 6518
|
||||||
// daje to 29.36 (~=30) klatek na sekundę
|
// daje to 29.36 (~=30) klatek na sekundę
|
||||||
// w opisach jest podawane 24 albo 36 jako standard => powiedzmy, parametr (d) to FPS animacji
|
// w opisach jest podawane 24 albo 36 jako standard => powiedzmy, parametr (d) to FPS animacji
|
||||||
delete pAdvanced; // usunięcie ewentualnego poprzedniego
|
delete pAdvanced; // usunięcie ewentualnego poprzedniego
|
||||||
pAdvanced = NULL; // gdyby się nie udało rozpoznać pliku
|
pAdvanced = NULL; // gdyby się nie udało rozpoznać pliku
|
||||||
if (std::string(static_cast<char *>(pData)) == "Vocaloid Motion Data 0002")
|
if (std::string(static_cast<char *>(pData)) == "Vocaloid Motion Data 0002")
|
||||||
{
|
{
|
||||||
pAdvanced = new TAnimAdvanced();
|
pAdvanced = new TAnimAdvanced();
|
||||||
@@ -743,9 +743,9 @@ void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double
|
|||||||
pAdvanced->fCurrent = 0.0; // aktualna ramka
|
pAdvanced->fCurrent = 0.0; // aktualna ramka
|
||||||
pAdvanced->fLast = 0.0; // ostatnia ramka
|
pAdvanced->fLast = 0.0; // ostatnia ramka
|
||||||
/*
|
/*
|
||||||
if (0) //jeśli włączone sortowanie plików VMD (trochę się przeciąga)
|
if (0) //jeśli włączone sortowanie plików VMD (trochę się przeciąga)
|
||||||
if (pAdvanced->SortByBone()) //próba posortowania
|
if (pAdvanced->SortByBone()) //próba posortowania
|
||||||
{//zapisać posortowany plik, jeśli dokonano zmian
|
{//zapisać posortowany plik, jeśli dokonano zmian
|
||||||
TFileStream *fs=new TFileStream("models\\1.vmd",fmCreate);
|
TFileStream *fs=new TFileStream("models\\1.vmd",fmCreate);
|
||||||
fs->Write(pData,2198342); //2948728);
|
fs->Write(pData,2198342); //2948728);
|
||||||
delete fs;
|
delete fs;
|
||||||
@@ -758,13 +758,13 @@ void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double
|
|||||||
for (int i = 0; i < pAdvanced->iMovements; ++i)
|
for (int i = 0; i < pAdvanced->iMovements; ++i)
|
||||||
{
|
{
|
||||||
if (strcmp(pAdvanced->pMovementData[i].cBone, name.c_str()))
|
if (strcmp(pAdvanced->pMovementData[i].cBone, name.c_str()))
|
||||||
{ // jeśli pozycja w tabelce nie była wyszukiwana w submodelach
|
{ // jeśli pozycja w tabelce nie była wyszukiwana w submodelach
|
||||||
pSub = GetContainer(pAdvanced->pMovementData[i].cBone); // szukanie
|
pSub = GetContainer(pAdvanced->pMovementData[i].cBone); // szukanie
|
||||||
if (pSub) // znaleziony
|
if (pSub) // znaleziony
|
||||||
{
|
{
|
||||||
pSub->pMovementData = pAdvanced->pMovementData + i; // gotów do animowania
|
pSub->pMovementData = pAdvanced->pMovementData + i; // gotów do animowania
|
||||||
pSub->AnimSetVMD(0.0); // usuawienie pozycji początkowej (powinna być zerowa,
|
pSub->AnimSetVMD(0.0); // usuawienie pozycji początkowej (powinna być zerowa,
|
||||||
// inaczej będzie skok)
|
// inaczej będzie skok)
|
||||||
}
|
}
|
||||||
name = std::string(pAdvanced->pMovementData[i].cBone); // nowa nazwa do pomijania
|
name = std::string(pAdvanced->pMovementData[i].cBone); // nowa nazwa do pomijania
|
||||||
}
|
}
|
||||||
@@ -775,7 +775,7 @@ void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double
|
|||||||
for (i=0;i<pAdvanced->iMovements;++i)
|
for (i=0;i<pAdvanced->iMovements;++i)
|
||||||
if
|
if
|
||||||
(AnsiString(pAdvanced->pMovementData[i+1].cBone)!=AnsiString(pAdvanced->pMovementData[i].cBone))
|
(AnsiString(pAdvanced->pMovementData[i+1].cBone)!=AnsiString(pAdvanced->pMovementData[i].cBone))
|
||||||
{//generowane dla ostatniej klatki danej kości
|
{//generowane dla ostatniej klatki danej kości
|
||||||
name="";
|
name="";
|
||||||
for (j=0;j<15;j++)
|
for (j=0;j<15;j++)
|
||||||
name+=IntToHex((unsigned char)pAdvanced->pMovementData[i].cBone[j],2);
|
name+=IntToHex((unsigned char)pAdvanced->pMovementData[i].cBone[j],2);
|
||||||
@@ -795,7 +795,7 @@ void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double
|
|||||||
|
|
||||||
);
|
);
|
||||||
idx=i+1;
|
idx=i+1;
|
||||||
k=pAdvanced->pMovementData[i+1].iFrame; //pierwsza klatka następnego
|
k=pAdvanced->pMovementData[i+1].iFrame; //pierwsza klatka następnego
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (pAdvanced->pMovementData[i].iFrame>0)
|
if (pAdvanced->pMovementData[i].iFrame>0)
|
||||||
@@ -819,39 +819,39 @@ void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void TAnimModel::LightSet(int n, float v)
|
void TAnimModel::LightSet(int n, float v)
|
||||||
{ // ustawienie światła (n) na wartość (v)
|
{ // ustawienie światła (n) na wartość (v)
|
||||||
if (n >= iMaxNumLights)
|
if (n >= iMaxNumLights)
|
||||||
return; // przekroczony zakres
|
return; // przekroczony zakres
|
||||||
lsLights[n] = TLightState(int(v));
|
lsLights[n] = TLightState(int(v));
|
||||||
switch (lsLights[n])
|
switch (lsLights[n])
|
||||||
{ // interpretacja ułamka zależnie od typu
|
{ // interpretacja ułamka zależnie od typu
|
||||||
case 0: // ustalenie czasu migotania, t<1s (f>1Hz), np. 0.1 => t=0.1 (f=10Hz)
|
case 0: // ustalenie czasu migotania, t<1s (f>1Hz), np. 0.1 => t=0.1 (f=10Hz)
|
||||||
break;
|
break;
|
||||||
case 1: // ustalenie wypełnienia ułamkiem, np. 1.25 => zapalony przez 1/4 okresu
|
case 1: // ustalenie wypełnienia ułamkiem, np. 1.25 => zapalony przez 1/4 okresu
|
||||||
break;
|
break;
|
||||||
case 2: // ustalenie częstotliwości migotania, f<1Hz (t>1s), np. 2.2 => f=0.2Hz (t=5s)
|
case 2: // ustalenie częstotliwości migotania, f<1Hz (t>1s), np. 2.2 => f=0.2Hz (t=5s)
|
||||||
break;
|
break;
|
||||||
case 3: // zapalenie świateł zależne od oświetlenia scenerii
|
case 3: // zapalenie świateł zależne od oświetlenia scenerii
|
||||||
if (v > 3.0)
|
if (v > 3.0)
|
||||||
fDark = v - 3.0; // ustawienie indywidualnego progu zapalania
|
fDark = v - 3.0; // ustawienie indywidualnego progu zapalania
|
||||||
else
|
else
|
||||||
fDark = 0.25; // standardowy próg zaplania
|
fDark = 0.25; // standardowy próg zaplania
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void TAnimModel::AnimUpdate(double dt)
|
void TAnimModel::AnimUpdate(double dt)
|
||||||
{ // wykonanie zakolejkowanych animacji, nawet gdy modele nie są aktualnie wyświetlane
|
{ // wykonanie zakolejkowanych animacji, nawet gdy modele nie są aktualnie wyświetlane
|
||||||
TAnimContainer *p = TAnimModel::acAnimList;
|
TAnimContainer *p = TAnimModel::acAnimList;
|
||||||
while (p)
|
while (p)
|
||||||
{ // jeśli w ogóle jest co animować
|
{ // jeśli w ogóle jest co animować
|
||||||
// if ((*p)->fTranslateSpeed==0.0)
|
// if ((*p)->fTranslateSpeed==0.0)
|
||||||
// if ((*p)->fRotateSpeed==0.0)
|
// if ((*p)->fRotateSpeed==0.0)
|
||||||
// {//jak się naanimował, to usunąć z listy
|
// {//jak się naanimował, to usunąć z listy
|
||||||
// *p=(*p)->ListRemove(); //zwraca wskaźnik do kolejnego z listy
|
// *p=(*p)->ListRemove(); //zwraca wskaźnik do kolejnego z listy
|
||||||
// }
|
// }
|
||||||
p->UpdateModel();
|
p->UpdateModel();
|
||||||
p = p->acAnimNext; // na razie bez usuwania z listy, bo głównie obrotnica na nią wchodzi
|
p = p->acAnimNext; // na razie bez usuwania z listy, bo głównie obrotnica na nią wchodzi
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|||||||
70
AnimModel.h
70
AnimModel.h
@@ -19,60 +19,60 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
|
|
||||||
const int iMaxNumLights = 8;
|
const int iMaxNumLights = 8;
|
||||||
|
|
||||||
// typy stanu œwiate³
|
// typy stanu świateł
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
ls_Off = 0, // zgaszone
|
ls_Off = 0, // zgaszone
|
||||||
ls_On = 1, // zapalone
|
ls_On = 1, // zapalone
|
||||||
ls_Blink = 2, // migaj¹ce
|
ls_Blink = 2, // migające
|
||||||
ls_Dark = 3 // Ra: zapalajce siê automatycznie, gdy zrobi siê ciemno
|
ls_Dark = 3 // Ra: zapalajce się automatycznie, gdy zrobi się ciemno
|
||||||
} TLightState;
|
} TLightState;
|
||||||
|
|
||||||
class TAnimVocaloidFrame
|
class TAnimVocaloidFrame
|
||||||
{ // ramka animacji typu Vocaloid Motion Data z programu MikuMikuDance
|
{ // ramka animacji typu Vocaloid Motion Data z programu MikuMikuDance
|
||||||
public:
|
public:
|
||||||
char cBone[15]; // nazwa koœci, mo¿e byæ po japoñsku
|
char cBone[15]; // nazwa kości, może być po japońsku
|
||||||
int iFrame; // numer ramki
|
int iFrame; // numer ramki
|
||||||
float3 f3Vector; // przemieszczenie
|
float3 f3Vector; // przemieszczenie
|
||||||
float4 qAngle; // kwaternion obrotu
|
float4 qAngle; // kwaternion obrotu
|
||||||
char cBezier[64]; // krzywe Béziera do interpolacji dla x,y,z i obrotu
|
char cBezier[64]; // krzywe Béziera do interpolacji dla x,y,z i obrotu
|
||||||
};
|
};
|
||||||
|
|
||||||
class TEvent;
|
class TEvent;
|
||||||
|
|
||||||
class TAnimContainer
|
class TAnimContainer
|
||||||
{ // opakowanie submodelu, okreœlaj¹ce animacjê egzemplarza - obs³ugiwane jako lista
|
{ // opakowanie submodelu, określające animację egzemplarza - obsługiwane jako lista
|
||||||
friend class TAnimModel;
|
friend class TAnimModel;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
vector3 vRotateAngles; // dla obrotów Eulera
|
vector3 vRotateAngles; // dla obrotów Eulera
|
||||||
vector3 vDesiredAngles;
|
vector3 vDesiredAngles;
|
||||||
double fRotateSpeed;
|
double fRotateSpeed;
|
||||||
vector3 vTranslation;
|
vector3 vTranslation;
|
||||||
vector3 vTranslateTo;
|
vector3 vTranslateTo;
|
||||||
double fTranslateSpeed; // mo¿e tu daæ wektor?
|
double fTranslateSpeed; // może tu dać wektor?
|
||||||
float4 qCurrent; // aktualny interpolowany
|
float4 qCurrent; // aktualny interpolowany
|
||||||
float4 qStart; // pozycja pocz¹tkowa (0 dla interpolacji)
|
float4 qStart; // pozycja początkowa (0 dla interpolacji)
|
||||||
float4 qDesired; // pozycja koñcowa (1 dla interpolacji)
|
float4 qDesired; // pozycja końcowa (1 dla interpolacji)
|
||||||
float fAngleCurrent; // parametr interpolacyjny: 0=start, 1=docelowy
|
float fAngleCurrent; // parametr interpolacyjny: 0=start, 1=docelowy
|
||||||
float fAngleSpeed; // zmiana parametru interpolacji w sekundach
|
float fAngleSpeed; // zmiana parametru interpolacji w sekundach
|
||||||
TSubModel *pSubModel;
|
TSubModel *pSubModel;
|
||||||
float4x4 *mAnim; // macierz do animacji kwaternionowych
|
float4x4 *mAnim; // macierz do animacji kwaternionowych
|
||||||
// dla kinematyki odwróconej u¿ywane s¹ kwaterniony
|
// dla kinematyki odwróconej używane są kwaterniony
|
||||||
float fLength; // d³ugoœæ koœci dla IK
|
float fLength; // długość kości dla IK
|
||||||
int iAnim; // animacja: +1-obrót Eulera, +2-przesuw, +4-obrót kwaternionem, +8-IK
|
int iAnim; // animacja: +1-obrót Eulera, +2-przesuw, +4-obrót kwaternionem, +8-IK
|
||||||
//+0x80000000: animacja z eventem, wykonywana poza wyœwietlaniem
|
//+0x80000000: animacja z eventem, wykonywana poza wyświetlaniem
|
||||||
//+0x100: pierwszy stopieñ IK - obróciæ w stronê pierwszego potomnego (dziecka)
|
//+0x100: pierwszy stopień IK - obrócić w stronę pierwszego potomnego (dziecka)
|
||||||
//+0x200: drugi stopieñ IK - dostosowaæ do pozycji potomnego potomnego (wnuka)
|
//+0x200: drugi stopień IK - dostosować do pozycji potomnego potomnego (wnuka)
|
||||||
union
|
union
|
||||||
{ // mog¹ byæ animacje klatkowe ró¿nego typu, wskaŸniki u¿ywa AnimModel
|
{ // mogą być animacje klatkowe różnego typu, wskaźniki używa AnimModel
|
||||||
TAnimVocaloidFrame *pMovementData; // wskaŸnik do klatki
|
TAnimVocaloidFrame *pMovementData; // wskaźnik do klatki
|
||||||
};
|
};
|
||||||
TEvent *evDone; // ewent wykonywany po zakoñczeniu animacji, np. zapór, obrotnicy
|
TEvent *evDone; // ewent wykonywany po zakończeniu animacji, np. zapór, obrotnicy
|
||||||
public:
|
public:
|
||||||
TAnimContainer *pNext;
|
TAnimContainer *pNext;
|
||||||
TAnimContainer *acAnimNext; // lista animacji z eventem, które musz¹ byæ przeliczane równie¿ bez
|
TAnimContainer *acAnimNext; // lista animacji z eventem, które muszą być przeliczane również bez
|
||||||
// wyœwietlania
|
// wyświetlania
|
||||||
TAnimContainer();
|
TAnimContainer();
|
||||||
~TAnimContainer();
|
~TAnimContainer();
|
||||||
bool Init(TSubModel *pNewSubModel);
|
bool Init(TSubModel *pNewSubModel);
|
||||||
@@ -96,11 +96,11 @@ class TAnimContainer
|
|||||||
double _fastcall AngleGet()
|
double _fastcall AngleGet()
|
||||||
{
|
{
|
||||||
return vRotateAngles.z;
|
return vRotateAngles.z;
|
||||||
}; // jednak ostatnia, T3D ma inny uk³ad
|
}; // jednak ostatnia, T3D ma inny układ
|
||||||
vector3 _fastcall TransGet()
|
vector3 _fastcall TransGet()
|
||||||
{
|
{
|
||||||
return vector3(-vTranslation.x, vTranslation.z, vTranslation.y);
|
return vector3(-vTranslation.x, vTranslation.z, vTranslation.y);
|
||||||
}; // zmiana, bo T3D ma inny uk³ad
|
}; // zmiana, bo T3D ma inny układ
|
||||||
void WillBeAnimated()
|
void WillBeAnimated()
|
||||||
{
|
{
|
||||||
if (pSubModel)
|
if (pSubModel)
|
||||||
@@ -119,8 +119,8 @@ class TAnimAdvanced
|
|||||||
TAnimVocaloidFrame *pMovementData;
|
TAnimVocaloidFrame *pMovementData;
|
||||||
unsigned char *pVocaloidMotionData; // plik animacyjny dla egzemplarza (z eventu)
|
unsigned char *pVocaloidMotionData; // plik animacyjny dla egzemplarza (z eventu)
|
||||||
double fFrequency; // przeliczenie czasu rzeczywistego na klatki animacji
|
double fFrequency; // przeliczenie czasu rzeczywistego na klatki animacji
|
||||||
double fCurrent; // klatka animacji wyœwietlona w poprzedniej klatce renderingu
|
double fCurrent; // klatka animacji wyświetlona w poprzedniej klatce renderingu
|
||||||
double fLast; // klatka koñcz¹ca animacjê
|
double fLast; // klatka kończąca animację
|
||||||
int iMovements;
|
int iMovements;
|
||||||
TAnimAdvanced();
|
TAnimAdvanced();
|
||||||
~TAnimAdvanced();
|
~TAnimAdvanced();
|
||||||
@@ -128,29 +128,29 @@ class TAnimAdvanced
|
|||||||
};
|
};
|
||||||
|
|
||||||
class TAnimModel
|
class TAnimModel
|
||||||
{ // opakowanie modelu, okreœlaj¹ce stan egzemplarza
|
{ // opakowanie modelu, określające stan egzemplarza
|
||||||
private:
|
private:
|
||||||
TAnimContainer *pRoot; // pojemniki steruj¹ce, tylko dla aniomowanych submodeli
|
TAnimContainer *pRoot; // pojemniki sterujące, tylko dla aniomowanych submodeli
|
||||||
TModel3d *pModel;
|
TModel3d *pModel;
|
||||||
double fBlinkTimer;
|
double fBlinkTimer;
|
||||||
int iNumLights;
|
int iNumLights;
|
||||||
TSubModel *LightsOn[iMaxNumLights]; // Ra: te wskaŸniki powinny byæ w ramach TModel3d
|
TSubModel *LightsOn[iMaxNumLights]; // Ra: te wskaźniki powinny być w ramach TModel3d
|
||||||
TSubModel *LightsOff[iMaxNumLights];
|
TSubModel *LightsOff[iMaxNumLights];
|
||||||
vector3 vAngle; // bazowe obroty egzemplarza wzglêdem osi
|
vector3 vAngle; // bazowe obroty egzemplarza względem osi
|
||||||
int iTexAlpha; //¿eby nie sprawdzaæ za ka¿dym razem, dla 4 wymiennych tekstur
|
int iTexAlpha; //żeby nie sprawdzać za każdym razem, dla 4 wymiennych tekstur
|
||||||
std::string asText; // tekst dla wyœwietlacza znakowego
|
std::string asText; // tekst dla wyświetlacza znakowego
|
||||||
TAnimAdvanced *pAdvanced;
|
TAnimAdvanced *pAdvanced;
|
||||||
void Advanced();
|
void Advanced();
|
||||||
TLightState lsLights[iMaxNumLights];
|
TLightState lsLights[iMaxNumLights];
|
||||||
float fDark; // poziom zapalanie œwiat³a (powinno byæ chyba powi¹zane z danym œwiat³em?)
|
float fDark; // poziom zapalanie światła (powinno być chyba powiązane z danym światłem?)
|
||||||
float fOnTime, fOffTime; // by³y sta³ymi, teraz mog¹ byæ zmienne dla ka¿dego egzemplarza
|
float fOnTime, fOffTime; // były stałymi, teraz mogą być zmienne dla każdego egzemplarza
|
||||||
private:
|
private:
|
||||||
void RaAnimate(); // przeliczenie animacji egzemplarza
|
void RaAnimate(); // przeliczenie animacji egzemplarza
|
||||||
void RaPrepare(); // ustawienie animacji egzemplarza na wzorcu
|
void RaPrepare(); // ustawienie animacji egzemplarza na wzorcu
|
||||||
public:
|
public:
|
||||||
GLuint ReplacableSkinId[5]; // McZapkie-020802: zmienialne skory
|
GLuint ReplacableSkinId[5]; // McZapkie-020802: zmienialne skory
|
||||||
static TAnimContainer *acAnimList; // lista animacji z eventem, które musz¹ byæ przeliczane
|
static TAnimContainer *acAnimList; // lista animacji z eventem, które muszą być przeliczane
|
||||||
// równie¿ bez wyœwietlania
|
// również bez wyświetlania
|
||||||
TAnimModel();
|
TAnimModel();
|
||||||
~TAnimModel();
|
~TAnimModel();
|
||||||
bool Init(TModel3d *pNewModel);
|
bool Init(TModel3d *pNewModel);
|
||||||
|
|||||||
10
Button.cpp
10
Button.cpp
@@ -29,13 +29,13 @@ void TButton::Clear(int i)
|
|||||||
bOn = false;
|
bOn = false;
|
||||||
if (i >= 0)
|
if (i >= 0)
|
||||||
FeedbackBitSet(i);
|
FeedbackBitSet(i);
|
||||||
Update(); // kasowanie bitu Feedback, o ile jakiœ ustawiony
|
Update(); // kasowanie bitu Feedback, o ile jakiś ustawiony
|
||||||
};
|
};
|
||||||
|
|
||||||
void TButton::Init(std::string const &asName, TModel3d *pModel, bool bNewOn)
|
void TButton::Init(std::string const &asName, TModel3d *pModel, bool bNewOn)
|
||||||
{
|
{
|
||||||
if (!pModel)
|
if (!pModel)
|
||||||
return; // nie ma w czym szukaæ
|
return; // nie ma w czym szukać
|
||||||
pModelOn = pModel->GetFromName( (asName + "_on").c_str() );
|
pModelOn = pModel->GetFromName( (asName + "_on").c_str() );
|
||||||
pModelOff = pModel->GetFromName( (asName + "_off").c_str() );
|
pModelOff = pModel->GetFromName( (asName + "_off").c_str() );
|
||||||
bOn = bNewOn;
|
bOn = bNewOn;
|
||||||
@@ -50,8 +50,8 @@ void TButton::Load(cParser &Parser, TModel3d *pModel1, TModel3d *pModel2)
|
|||||||
Init(token, pModel1, false);
|
Init(token, pModel1, false);
|
||||||
if (pModel2)
|
if (pModel2)
|
||||||
if (!pModelOn && !pModelOff)
|
if (!pModelOn && !pModelOff)
|
||||||
Init(token, pModel2, false); // mo¿e w drugim bêdzie (jak nie w kabinie,
|
Init(token, pModel2, false); // może w drugim będzie (jak nie w kabinie,
|
||||||
// to w zewnêtrznym)
|
// to w zewnętrznym)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -68,7 +68,7 @@ void TButton::Update()
|
|||||||
pModelOn->iVisible = bOn;
|
pModelOn->iVisible = bOn;
|
||||||
if (pModelOff)
|
if (pModelOff)
|
||||||
pModelOff->iVisible = !bOn;
|
pModelOff->iVisible = !bOn;
|
||||||
if (iFeedbackBit) // je¿eli generuje informacjê zwrotn¹
|
if (iFeedbackBit) // jeżeli generuje informację zwrotną
|
||||||
{
|
{
|
||||||
if (bOn) // zapalenie
|
if (bOn) // zapalenie
|
||||||
Console::BitsSet(iFeedbackBit);
|
Console::BitsSet(iFeedbackBit);
|
||||||
|
|||||||
6
Button.h
6
Button.h
@@ -15,10 +15,10 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
|
||||||
class TButton
|
class TButton
|
||||||
{ // animacja dwustanowa, w³¹cza jeden z dwóch submodeli (jednego
|
{ // animacja dwustanowa, włącza jeden z dwóch submodeli (jednego
|
||||||
// z nich mo¿e nie byæ)
|
// z nich może nie być)
|
||||||
private:
|
private:
|
||||||
TSubModel *pModelOn, *pModelOff; // submodel dla stanu za³¹czonego i wy³¹czonego
|
TSubModel *pModelOn, *pModelOff; // submodel dla stanu załączonego i wyłączonego
|
||||||
bool bOn;
|
bool bOn;
|
||||||
bool *bData;
|
bool *bData;
|
||||||
int iFeedbackBit; // Ra: bit informacji zwrotnej, do wyprowadzenia na pulpit
|
int iFeedbackBit; // Ra: bit informacji zwrotnej, do wyprowadzenia na pulpit
|
||||||
|
|||||||
24
Camera.cpp
24
Camera.cpp
@@ -51,9 +51,9 @@ void TCamera::OnCursorMove(double x, double y)
|
|||||||
Yaw -= 2 * M_PI;
|
Yaw -= 2 * M_PI;
|
||||||
else if (Yaw < -M_PI)
|
else if (Yaw < -M_PI)
|
||||||
Yaw += 2 * M_PI;
|
Yaw += 2 * M_PI;
|
||||||
if (Type == tp_Follow) // je¿eli jazda z pojazdem
|
if (Type == tp_Follow) // jeżeli jazda z pojazdem
|
||||||
{
|
{
|
||||||
Fix(Pitch, -M_PI_4, M_PI_4); // ograniczenie k¹ta spogl¹dania w dó³ i w górê
|
Fix(Pitch, -M_PI_4, M_PI_4); // ograniczenie kąta spoglądania w dół i w górę
|
||||||
// Fix(Yaw,-M_PI,M_PI);
|
// Fix(Yaw,-M_PI,M_PI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -129,7 +129,7 @@ void TCamera::Update()
|
|||||||
vector3 Vec = Velocity;
|
vector3 Vec = Velocity;
|
||||||
Vec.RotateY(Yaw);
|
Vec.RotateY(Yaw);
|
||||||
Pos = Pos + Vec * Timer::GetDeltaRenderTime(); // czas bez pauzy
|
Pos = Pos + Vec * Timer::GetDeltaRenderTime(); // czas bez pauzy
|
||||||
Velocity = Velocity / 2; // p³ynne hamowanie ruchu
|
Velocity = Velocity / 2; // płynne hamowanie ruchu
|
||||||
// double tmp= 10*DeltaTime;
|
// double tmp= 10*DeltaTime;
|
||||||
// Velocity+= -Velocity*10 * Timer::GetDeltaTime();//( tmp<1 ? tmp : 1 );
|
// Velocity+= -Velocity*10 * Timer::GetDeltaTime();//( tmp<1 ? tmp : 1 );
|
||||||
// Type= tp_Free;
|
// Type= tp_Free;
|
||||||
@@ -149,10 +149,10 @@ vector3 TCamera::GetDirection()
|
|||||||
// bool TCamera::GetMatrix(matrix4x4 &Matrix)
|
// bool TCamera::GetMatrix(matrix4x4 &Matrix)
|
||||||
bool TCamera::SetMatrix()
|
bool TCamera::SetMatrix()
|
||||||
{
|
{
|
||||||
glRotated(-Roll * 180.0f / M_PI, 0, 0, 1); // po wy³¹czeniu tego krêci siê pojazd, a sceneria
|
glRotated(-Roll * 180.0f / M_PI, 0, 0, 1); // po wyłączeniu tego kręci się pojazd, a sceneria
|
||||||
// nie
|
// nie
|
||||||
glRotated(-Pitch * 180.0f / M_PI, 1, 0, 0);
|
glRotated(-Pitch * 180.0f / M_PI, 1, 0, 0);
|
||||||
glRotated(-Yaw * 180.0f / M_PI, 0, 1, 0); // w zewnêtrznym widoku: kierunek patrzenia
|
glRotated(-Yaw * 180.0f / M_PI, 0, 1, 0); // w zewnętrznym widoku: kierunek patrzenia
|
||||||
|
|
||||||
if (Type == tp_Follow)
|
if (Type == tp_Follow)
|
||||||
{
|
{
|
||||||
@@ -174,15 +174,15 @@ bool TCamera::SetMatrix()
|
|||||||
glTranslated(-Pos.x, -Pos.y, -Pos.z); // nie zmienia kierunku patrzenia
|
glTranslated(-Pos.x, -Pos.y, -Pos.z); // nie zmienia kierunku patrzenia
|
||||||
}
|
}
|
||||||
|
|
||||||
Global::SetCameraPosition(Pos); // by³o +pOffset
|
Global::SetCameraPosition(Pos); // było +pOffset
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCamera::SetCabMatrix(vector3 &p)
|
void TCamera::SetCabMatrix(vector3 &p)
|
||||||
{ // ustawienie widoku z kamery bez przesuniêcia robionego przez OpenGL - nie powinno tak trz¹œæ
|
{ // ustawienie widoku z kamery bez przesunięcia robionego przez OpenGL - nie powinno tak trząść
|
||||||
glRotated(-Roll * 180.0f / M_PI, 0, 0, 1);
|
glRotated(-Roll * 180.0f / M_PI, 0, 0, 1);
|
||||||
glRotated(-Pitch * 180.0f / M_PI, 1, 0, 0);
|
glRotated(-Pitch * 180.0f / M_PI, 1, 0, 0);
|
||||||
glRotated(-Yaw * 180.0f / M_PI, 0, 1, 0); // w zewnêtrznym widoku: kierunek patrzenia
|
glRotated(-Yaw * 180.0f / M_PI, 0, 1, 0); // w zewnętrznym widoku: kierunek patrzenia
|
||||||
if (Type == tp_Follow)
|
if (Type == tp_Follow)
|
||||||
gluLookAt(Pos.x - p.x, Pos.y - p.y, Pos.z - p.z, LookAt.x - p.x, LookAt.y - p.y,
|
gluLookAt(Pos.x - p.x, Pos.y - p.y, Pos.z - p.z, LookAt.x - p.x, LookAt.y - p.y,
|
||||||
LookAt.z - p.z, vUp.x, vUp.y, vUp.z); // Ra: pOffset is zero
|
LookAt.z - p.z, vUp.x, vUp.y, vUp.z); // Ra: pOffset is zero
|
||||||
@@ -190,16 +190,16 @@ void TCamera::SetCabMatrix(vector3 &p)
|
|||||||
|
|
||||||
void TCamera::RaLook()
|
void TCamera::RaLook()
|
||||||
{ // zmiana kierunku patrzenia - przelicza Yaw
|
{ // zmiana kierunku patrzenia - przelicza Yaw
|
||||||
vector3 where = LookAt - Pos + vector3(0, 3, 0); // trochê w górê od szyn
|
vector3 where = LookAt - Pos + vector3(0, 3, 0); // trochę w górę od szyn
|
||||||
if ((where.x != 0.0) || (where.z != 0.0))
|
if ((where.x != 0.0) || (where.z != 0.0))
|
||||||
Yaw = atan2(-where.x, -where.z); // k¹t horyzontalny
|
Yaw = atan2(-where.x, -where.z); // kąt horyzontalny
|
||||||
double l = Length3(where);
|
double l = Length3(where);
|
||||||
if (l > 0.0)
|
if (l > 0.0)
|
||||||
Pitch = asin(where.y / l); // k¹t w pionie
|
Pitch = asin(where.y / l); // kąt w pionie
|
||||||
};
|
};
|
||||||
|
|
||||||
void TCamera::Stop()
|
void TCamera::Stop()
|
||||||
{ // wy³¹cznie bezw³adnego ruchu po powrocie do kabiny
|
{ // wyłącznie bezwładnego ruchu po powrocie do kabiny
|
||||||
Type = tp_Follow;
|
Type = tp_Follow;
|
||||||
Velocity = vector3(0, 0, 0);
|
Velocity = vector3(0, 0, 0);
|
||||||
};
|
};
|
||||||
|
|||||||
10
Camera.h
10
Camera.h
@@ -18,20 +18,20 @@ enum TCameraType
|
|||||||
{ // tryby pracy kamery
|
{ // tryby pracy kamery
|
||||||
tp_Follow, // jazda z pojazdem
|
tp_Follow, // jazda z pojazdem
|
||||||
tp_Free, // stoi na scenerii
|
tp_Free, // stoi na scenerii
|
||||||
tp_Satelite // widok z góry (nie u¿ywany)
|
tp_Satelite // widok z góry (nie używany)
|
||||||
};
|
};
|
||||||
|
|
||||||
class TCamera
|
class TCamera
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
vector3 pOffset; // nie u¿ywane (zerowe)
|
vector3 pOffset; // nie używane (zerowe)
|
||||||
public: // McZapkie: potrzebuje do kiwania na boki
|
public: // McZapkie: potrzebuje do kiwania na boki
|
||||||
double Pitch;
|
double Pitch;
|
||||||
double Yaw; // w œrodku: 0=do przodu; na zewn¹trz: 0=na po³udnie
|
double Yaw; // w środku: 0=do przodu; na zewnątrz: 0=na południe
|
||||||
double Roll;
|
double Roll;
|
||||||
TCameraType Type;
|
TCameraType Type;
|
||||||
vector3 Pos; // wspó³rzêdne obserwatora
|
vector3 Pos; // współrzędne obserwatora
|
||||||
vector3 LookAt; // wspó³rzêdne punktu, na który ma patrzeæ
|
vector3 LookAt; // współrzędne punktu, na który ma patrzeć
|
||||||
vector3 vUp;
|
vector3 vUp;
|
||||||
vector3 Velocity;
|
vector3 Velocity;
|
||||||
vector3 OldVelocity; // lepiej usredniac zeby nie bylo rozbiezne przy malym FPS
|
vector3 OldVelocity; // lepiej usredniac zeby nie bylo rozbiezne przy malym FPS
|
||||||
|
|||||||
38
Classes.h
38
Classes.h
@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#ifndef ClassesH
|
#ifndef ClassesH
|
||||||
#define ClassesH
|
#define ClassesH
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Ra: zestaw klas do robienia wskaźników, aby uporządkować nagłówki
|
// Ra: zestaw klas do robienia wskaźników, aby uporządkować nagłówki
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
class TTrack; // odcinek trajektorii
|
class TTrack; // odcinek trajektorii
|
||||||
class TEvent;
|
class TEvent;
|
||||||
@@ -19,39 +19,39 @@ class TDynamicObject; // pojazd w scenerii
|
|||||||
class TGroundNode; // statyczny obiekt scenerii
|
class TGroundNode; // statyczny obiekt scenerii
|
||||||
class TAnimModel; // opakowanie egzemplarz modelu
|
class TAnimModel; // opakowanie egzemplarz modelu
|
||||||
class TAnimContainer; // fragment opakowania egzemplarza modelu
|
class TAnimContainer; // fragment opakowania egzemplarza modelu
|
||||||
class TModel3d; //siatka modelu wspólna dla egzemplarzy
|
class TModel3d; //siatka modelu wspólna dla egzemplarzy
|
||||||
class TSubModel; // fragment modelu (tu do wyświetlania terenu)
|
class TSubModel; // fragment modelu (tu do wyświetlania terenu)
|
||||||
class TMemCell; // komórka pamięci
|
class TMemCell; // komórka pamięci
|
||||||
class cParser;
|
class cParser;
|
||||||
class TRealSound; // dźwięk ze współrzędnymi XYZ
|
class TRealSound; // dźwięk ze współrzędnymi XYZ
|
||||||
class TTextSound; // dźwięk ze stenogramem
|
class TTextSound; // dźwięk ze stenogramem
|
||||||
class TEventLauncher;
|
class TEventLauncher;
|
||||||
class TTraction; // drut
|
class TTraction; // drut
|
||||||
class TTractionPowerSource; // zasilanie drutów
|
class TTractionPowerSource; // zasilanie drutów
|
||||||
|
|
||||||
namespace Mtable
|
namespace Mtable
|
||||||
{
|
{
|
||||||
class TTrainParameters; // rozkład jazdy
|
class TTrainParameters; // rozkład jazdy
|
||||||
class TMtableTime; // czas dla danego posterunku
|
class TMtableTime; // czas dla danego posterunku
|
||||||
};
|
};
|
||||||
|
|
||||||
class TController; // obiekt sterujący pociągiem (AI)
|
class TController; // obiekt sterujący pociągiem (AI)
|
||||||
class TNames; // obiekt sortujący nazwy
|
class TNames; // obiekt sortujący nazwy
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{ // binarne odpowiedniki komend w komórce pamięci
|
{ // binarne odpowiedniki komend w komórce pamięci
|
||||||
cm_Unknown, // ciąg nierozpoznany (nie jest komendą)
|
cm_Unknown, // ciąg nierozpoznany (nie jest komendą)
|
||||||
cm_Ready, // W4 zezwala na odjazd, ale semafor może zatrzymać
|
cm_Ready, // W4 zezwala na odjazd, ale semafor może zatrzymać
|
||||||
cm_SetVelocity, // prędkość pociągowa zadawana na semaforze
|
cm_SetVelocity, // prędkość pociągowa zadawana na semaforze
|
||||||
cm_RoadVelocity, // prędkość drogowa
|
cm_RoadVelocity, // prędkość drogowa
|
||||||
cm_SectionVelocity, //ograniczenie prędkości na odcinku
|
cm_SectionVelocity, //ograniczenie prędkości na odcinku
|
||||||
cm_ShuntVelocity, // prędkość manewrowa na semaforze
|
cm_ShuntVelocity, // prędkość manewrowa na semaforze
|
||||||
cm_SetProximityVelocity, // informacja wstępna o ograniczeniu
|
cm_SetProximityVelocity, // informacja wstępna o ograniczeniu
|
||||||
cm_ChangeDirection,
|
cm_ChangeDirection,
|
||||||
cm_PassengerStopPoint,
|
cm_PassengerStopPoint,
|
||||||
cm_OutsideStation,
|
cm_OutsideStation,
|
||||||
cm_Shunt,
|
cm_Shunt,
|
||||||
cm_Command // komenda pobierana z komórki
|
cm_Command // komenda pobierana z komórki
|
||||||
} TCommandType;
|
} TCommandType;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
229
Console.cpp
229
Console.cpp
@@ -16,47 +16,46 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "PoKeys55.h"
|
#include "PoKeys55.h"
|
||||||
#include "mczapkie/mctools.h"
|
#include "mczapkie/mctools.h"
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Ra: klasa statyczna gromadz<EFBFBD>ca sygna<EFBFBD>y steruj<EFBFBD>ce oraz informacje zwrotne
|
// Ra: klasa statyczna gromadząca sygnały sterujące oraz informacje zwrotne
|
||||||
// Ra: stan wej<EFBFBD>cia zmieniany klawiatur<EFBFBD> albo dedykowanym urz<EFBFBD>dzeniem
|
// Ra: stan wejścia zmieniany klawiaturą albo dedykowanym urządzeniem
|
||||||
// Ra: stan wyj<EFBFBD>cia zmieniany przez symulacj<EFBFBD> (mierniki, kontrolki)
|
// Ra: stan wyjścia zmieniany przez symulację (mierniki, kontrolki)
|
||||||
|
|
||||||
/*******************************
|
/*******************************
|
||||||
Do klawisza klawiatury przypisana jest maska bitowa oraz numer wej<EFBFBD>cia.
|
Do klawisza klawiatury przypisana jest maska bitowa oraz numer wejścia.
|
||||||
Naci<EFBFBD>ni<EFBFBD>cie klawisza powoduje wywo<EFBFBD>anie procedury ustawienia bitu o podanej
|
Naciśnięcie klawisza powoduje wywołanie procedury ustawienia bitu o podanej
|
||||||
masce na podanym wej<EFBFBD>ciu. Zwonienie klawisza analogicznie wywo<EFBFBD>uje zerowanie
|
masce na podanym wejściu. Zwonienie klawisza analogicznie wywołuje zerowanie
|
||||||
bitu wg maski. Zasadniczo w masce ustawiony jest jeden bit, ale w razie
|
bitu wg maski. Zasadniczo w masce ustawiony jest jeden bit, ale w razie
|
||||||
potrzeby mo<EFBFBD>e by<EFBFBD> ich wi<EFBFBD>cej.
|
potrzeby może być ich więcej.
|
||||||
|
|
||||||
Oddzielne wej<EFBFBD>cia s<EFBFBD> wprowadzone po to, by mo<EFBFBD>na by<EFBFBD>o u<EFBFBD>ywa<EFBFBD> wi<EFBFBD>cej ni<EFBFBD> 32
|
Oddzielne wejścia są wprowadzone po to, by można było używać więcej niż 32
|
||||||
bity do sterowania. Podzia<EFBFBD> na wej<EFBFBD>cia jest r<EFBFBD>wnie<EFBFBD> ze wzgl<EFBFBD>d<EFBFBD>w organizacyjnych,
|
bity do sterowania. Podział na wejścia jest również ze względów organizacyjnych,
|
||||||
np. sterowanie <EFBFBD>wiat<EFBFBD>ami mo<EFBFBD>e mie<EFBFBD> oddzielny numer wej<EFBFBD>cia ni<EFBFBD> prze<EFBFBD><EFBFBD>czanie
|
np. sterowanie światłami może mieć oddzielny numer wejścia niż przełączanie
|
||||||
radia, poniewa<EFBFBD> nie ma potrzeby ich uzale<EFBFBD>nia<EFBFBD> (tzn. bada<EFBFBD> wsp<EFBFBD>ln<EFBFBD> mask<EFBFBD> bitow<EFBFBD>).
|
radia, ponieważ nie ma potrzeby ich uzależniać (tzn. badać wspólną maskę bitową).
|
||||||
|
|
||||||
Do ka<EFBFBD>dego wej<EFBFBD>cia podpi<EFBFBD>ty jest skrypt binarny, charakterystyczny dla danej
|
Do każdego wejścia podpięty jest skrypt binarny, charakterystyczny dla danej
|
||||||
konstrukcji pojazdu. Sprawdza on zale<EFBFBD>no<EFBFBD>ci (w tym uszkodzenia) za pomoc<EFBFBD>
|
konstrukcji pojazdu. Sprawdza on zależności (w tym uszkodzenia) za pomocą
|
||||||
operacji logicznych na maskach bitowych. Do ka<EFBFBD>dego wej<EFBFBD>cia jest przypisana
|
operacji logicznych na maskach bitowych. Do każdego wejścia jest przypisana
|
||||||
jedna, oddzielna maska 32 bit, ale w razie potrzeby istnieje te<EFBFBD> mo<EFBFBD>liwo<EFBFBD><EFBFBD>
|
jedna, oddzielna maska 32 bit, ale w razie potrzeby istnieje też możliwość
|
||||||
korzystania z masek innych wej<EFBFBD><EFBFBD>. Skrypt mo<EFBFBD>e te<EFBFBD> wysy<EFBFBD>a<EFBFBD> maski na inne wej<EFBFBD>cia,
|
korzystania z masek innych wejść. Skrypt może też wysyłać maski na inne wejścia,
|
||||||
ale nale<EFBFBD>y unika<EFBFBD> rekurencji.
|
ale należy unikać rekurencji.
|
||||||
|
|
||||||
Definiowanie wej<EFBFBD><EFBFBD> oraz przeznaczenia ich masek jest w gestii konstruktora
|
Definiowanie wejść oraz przeznaczenia ich masek jest w gestii konstruktora
|
||||||
skryptu. Ka<EFBFBD>dy pojazd mo<EFBFBD>e mie<EFBFBD> inny schemat wej<EFBFBD><EFBFBD> i masek, ale w miar<EFBFBD> mo<EFBFBD>liwo<EFBFBD>ci
|
skryptu. Każdy pojazd może mieć inny schemat wejść i masek, ale w miarę możliwości
|
||||||
nale<EFBFBD>y d<EFBFBD><EFBFBD>y<EFBFBD> do unifikacji. Skrypty mog<EFBFBD> r<EFBFBD>wnie<EFBFBD> u<EFBFBD>ywa<EFBFBD> dodatkowych masek bitowych.
|
należy dążyć do unifikacji. Skrypty mogą również używać dodatkowych masek bitowych.
|
||||||
Maski bitowe odpowiadaj<EFBFBD> stanom prze<EFBFBD><EFBFBD>cznik<EFBFBD>w, czujnik<EFBFBD>w, stycznik<EFBFBD>w itd.
|
Maski bitowe odpowiadają stanom przełączników, czujników, styczników itd.
|
||||||
|
|
||||||
Dzia<EFBFBD>anie jest nast<EFBFBD>puj<EFBFBD>ce:
|
Działanie jest następujące:
|
||||||
- na klawiaturze konsoli naciskany jest przycisk
|
- na klawiaturze konsoli naciskany jest przycisk
|
||||||
- naci<EFBFBD>ni<EFBFBD>cie przycisku zamieniane jest na mask<EFBFBD> bitow<EFBFBD> oraz numer wej<EFBFBD>cia
|
- naciśnięcie przycisku zamieniane jest na maskę bitową oraz numer wejścia
|
||||||
- wywo<EFBFBD>ywany jest skrypt danego wej<EFBFBD>cia z ow<EFBFBD> mask<EFBFBD>
|
- wywoływany jest skrypt danego wejścia z ową maską
|
||||||
- skrypt sprawdza zale<EFBFBD>no<EFBFBD>ci i np. modyfikuje w<EFBFBD>asno<EFBFBD>ci fizyki albo inne maski
|
- skrypt sprawdza zależności i np. modyfikuje własności fizyki albo inne maski
|
||||||
- ewentualnie do wyzwalacza czasowego dodana jest maska i numer wej<EFBFBD>cia
|
- ewentualnie do wyzwalacza czasowego dodana jest maska i numer wejścia
|
||||||
|
|
||||||
/*******************************/
|
/*******************************/
|
||||||
|
|
||||||
/* //kod do przetrawienia:
|
/* //kod do przetrawienia:
|
||||||
//aby si<EFBFBD> nie w<EFBFBD><EFBFBD>czacz wygaszacz ekranu, co jaki<EFBFBD> czas naciska si<EFBFBD> wirtualnie ScrollLock
|
//aby się nie włączacz wygaszacz ekranu, co jakiś czas naciska się wirtualnie ScrollLock
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
|
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
|
||||||
@@ -110,20 +109,20 @@ void SetLedState(char Code, bool bOn){
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
int Console::iBits = 0; // zmienna statyczna - obiekt Console jest jednen wsp<EFBFBD>lny
|
int Console::iBits = 0; // zmienna statyczna - obiekt Console jest jednen wspólny
|
||||||
int Console::iMode = 0;
|
int Console::iMode = 0;
|
||||||
int Console::iConfig = 0;
|
int Console::iConfig = 0;
|
||||||
TPoKeys55 *Console::PoKeys55[2] = {NULL, NULL};
|
TPoKeys55 *Console::PoKeys55[2] = {NULL, NULL};
|
||||||
TLPT *Console::LPT = NULL;
|
TLPT *Console::LPT = NULL;
|
||||||
MWDComm *Console::MWD = NULL; // maciek001: obiekt dla MWD
|
MWDComm *Console::MWD = NULL; // maciek001: obiekt dla MWD
|
||||||
int Console::iSwitch[8]; // bistabilne w kabinie, za<EFBFBD><EFBFBD>czane z [Shift], wy<EFBFBD><EFBFBD>czane bez
|
int Console::iSwitch[8]; // bistabilne w kabinie, załączane z [Shift], wyłączane bez
|
||||||
int Console::iButton[8]; // monostabilne w kabinie, za<EFBFBD><EFBFBD>czane podczas trzymania klawisza
|
int Console::iButton[8]; // monostabilne w kabinie, załączane podczas trzymania klawisza
|
||||||
|
|
||||||
Console::Console()
|
Console::Console()
|
||||||
{
|
{
|
||||||
PoKeys55[0] = PoKeys55[1] = NULL;
|
PoKeys55[0] = PoKeys55[1] = NULL;
|
||||||
for (int i = 0; i < 8; ++i)
|
for (int i = 0; i < 8; ++i)
|
||||||
{ // zerowanie prze<EFBFBD><EFBFBD>cznik<EFBFBD>w
|
{ // zerowanie przełączników
|
||||||
iSwitch[i] = 0; // bity 0..127 - bez [Ctrl], 128..255 - z [Ctrl]
|
iSwitch[i] = 0; // bity 0..127 - bez [Ctrl], 128..255 - z [Ctrl]
|
||||||
iButton[i] = 0; // bity 0..127 - bez [Shift], 128..255 - z [Shift]
|
iButton[i] = 0; // bity 0..127 - bez [Shift], 128..255 - z [Shift]
|
||||||
}
|
}
|
||||||
@@ -143,24 +142,24 @@ void Console::ModeSet(int m, int h)
|
|||||||
};
|
};
|
||||||
|
|
||||||
int Console::On()
|
int Console::On()
|
||||||
{ // za<EFBFBD><EFBFBD>czenie konsoli (np. nawi<EFBFBD>zanie komunikacji)
|
{ // załączenie konsoli (np. nawiązanie komunikacji)
|
||||||
iSwitch[0] = iSwitch[1] = iSwitch[2] = iSwitch[3] = 0; // bity 0..127 - bez [Ctrl]
|
iSwitch[0] = iSwitch[1] = iSwitch[2] = iSwitch[3] = 0; // bity 0..127 - bez [Ctrl]
|
||||||
iSwitch[4] = iSwitch[5] = iSwitch[6] = iSwitch[7] = 0; // bity 128..255 - z [Ctrl]
|
iSwitch[4] = iSwitch[5] = iSwitch[6] = iSwitch[7] = 0; // bity 128..255 - z [Ctrl]
|
||||||
switch (iMode)
|
switch (iMode)
|
||||||
{
|
{
|
||||||
case 1: // kontrolki klawiatury
|
case 1: // kontrolki klawiatury
|
||||||
case 2: // kontrolki klawiatury
|
case 2: // kontrolki klawiatury
|
||||||
iConfig = 0; // licznik u<EFBFBD>ycia Scroll Lock
|
iConfig = 0; // licznik użycia Scroll Lock
|
||||||
break;
|
break;
|
||||||
case 3: // LPT
|
case 3: // LPT
|
||||||
LPT = new TLPT(); // otwarcie inpout32.dll
|
LPT = new TLPT(); // otwarcie inpout32.dll
|
||||||
if (LPT ? LPT->Connect(iConfig) : false)
|
if (LPT ? LPT->Connect(iConfig) : false)
|
||||||
{ // wys<EFBFBD>a<EFBFBD> 0?
|
{ // wysłać 0?
|
||||||
BitsUpdate(-1); // aktualizacjia stan<EFBFBD>w, bo przy wczytywaniu mog<EFBFBD>o by<EFBFBD> nieaktywne
|
BitsUpdate(-1); // aktualizacjia stanów, bo przy wczytywaniu mogło być nieaktywne
|
||||||
WriteLog("Feedback Mode 3: InpOut32.dll OK");
|
WriteLog("Feedback Mode 3: InpOut32.dll OK");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // po<EFBFBD><EFBFBD>czenie nie wysz<EFBFBD>o, ma by<EFBFBD> NULL
|
{ // połączenie nie wyszło, ma być NULL
|
||||||
delete LPT;
|
delete LPT;
|
||||||
LPT = NULL;
|
LPT = NULL;
|
||||||
}
|
}
|
||||||
@@ -170,10 +169,10 @@ int Console::On()
|
|||||||
if (PoKeys55[0] ? PoKeys55[0]->Connect() : false)
|
if (PoKeys55[0] ? PoKeys55[0]->Connect() : false)
|
||||||
{
|
{
|
||||||
WriteLog("Found " + PoKeys55[0]->Version());
|
WriteLog("Found " + PoKeys55[0]->Version());
|
||||||
BitsUpdate(-1); // aktualizacjia stan<EFBFBD>w, bo przy wczytywaniu mog<EFBFBD>o by<EFBFBD> nieaktywne
|
BitsUpdate(-1); // aktualizacjia stanów, bo przy wczytywaniu mogło być nieaktywne
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // po<EFBFBD><EFBFBD>czenie nie wysz<EFBFBD>o, ma by<EFBFBD> NULL
|
{ // połączenie nie wyszło, ma być NULL
|
||||||
delete PoKeys55[0];
|
delete PoKeys55[0];
|
||||||
PoKeys55[0] = NULL;
|
PoKeys55[0] = NULL;
|
||||||
}
|
}
|
||||||
@@ -193,12 +192,12 @@ int Console::On()
|
|||||||
};
|
};
|
||||||
|
|
||||||
void Console::Off()
|
void Console::Off()
|
||||||
{ // wy<EFBFBD><EFBFBD>czenie informacji zwrotnych (reset pulpitu)
|
{ // wyłączenie informacji zwrotnych (reset pulpitu)
|
||||||
BitsClear(-1);
|
BitsClear(-1);
|
||||||
if ((iMode == 1) || (iMode == 2))
|
if ((iMode == 1) || (iMode == 2))
|
||||||
if (iConfig & 1) // licznik u<EFBFBD>ycia Scroll Lock
|
if (iConfig & 1) // licznik użycia Scroll Lock
|
||||||
{ // bez sensu to jest, ale mi si<EFBFBD> samo w<EFBFBD><EFBFBD>cza
|
{ // bez sensu to jest, ale mi się samo włącza
|
||||||
SetLedState(VK_SCROLL, true); // przyci<EFBFBD>ni<EFBFBD>ty
|
SetLedState(VK_SCROLL, true); // przyciśnięty
|
||||||
SetLedState(VK_SCROLL, false); // zwolniony
|
SetLedState(VK_SCROLL, false); // zwolniony
|
||||||
}
|
}
|
||||||
delete PoKeys55[0];
|
delete PoKeys55[0];
|
||||||
@@ -212,12 +211,12 @@ void Console::Off()
|
|||||||
};
|
};
|
||||||
|
|
||||||
void Console::BitsSet(int mask, int entry)
|
void Console::BitsSet(int mask, int entry)
|
||||||
{ // ustawienie bit<EFBFBD>w o podanej masce (mask) na wej<EFBFBD>ciu (entry)
|
{ // ustawienie bitów o podanej masce (mask) na wejściu (entry)
|
||||||
if ((iBits & mask) != mask) // je<EFBFBD>eli zmiana
|
if ((iBits & mask) != mask) // jeżeli zmiana
|
||||||
{
|
{
|
||||||
int old = iBits; // poprzednie stany
|
int old = iBits; // poprzednie stany
|
||||||
iBits |= mask;
|
iBits |= mask;
|
||||||
BitsUpdate(old ^ iBits); // 1 dla bit<EFBFBD>w zmienionych
|
BitsUpdate(old ^ iBits); // 1 dla bitów zmienionych
|
||||||
if (iMode == 4)
|
if (iMode == 4)
|
||||||
WriteLog("PoKeys::BitsSet: mask: " + std::to_string(mask) +
|
WriteLog("PoKeys::BitsSet: mask: " + std::to_string(mask) +
|
||||||
" iBits: " + std::to_string(iBits));
|
" iBits: " + std::to_string(iBits));
|
||||||
@@ -225,87 +224,87 @@ void Console::BitsSet(int mask, int entry)
|
|||||||
};
|
};
|
||||||
|
|
||||||
void Console::BitsClear(int mask, int entry)
|
void Console::BitsClear(int mask, int entry)
|
||||||
{ // zerowanie bit<EFBFBD>w o podanej masce (mask) na wej<EFBFBD>ciu (entry)
|
{ // zerowanie bitów o podanej masce (mask) na wejściu (entry)
|
||||||
if (iBits & mask) // je<EFBFBD>eli zmiana
|
if (iBits & mask) // jeżeli zmiana
|
||||||
{
|
{
|
||||||
int old = iBits; // poprzednie stany
|
int old = iBits; // poprzednie stany
|
||||||
iBits &= ~mask;
|
iBits &= ~mask;
|
||||||
BitsUpdate(old ^ iBits); // 1 dla bit<EFBFBD>w zmienionych
|
BitsUpdate(old ^ iBits); // 1 dla bitów zmienionych
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void Console::BitsUpdate(int mask)
|
void Console::BitsUpdate(int mask)
|
||||||
{ // aktualizacja stanu interfejsu informacji zwrotnej; (mask) - zakres zmienianych bit<EFBFBD>w
|
{ // aktualizacja stanu interfejsu informacji zwrotnej; (mask) - zakres zmienianych bitów
|
||||||
switch (iMode)
|
switch (iMode)
|
||||||
{
|
{
|
||||||
case 1: // sterowanie <EFBFBD>wiate<EFBFBD>kami klawiatury: CA/SHP+opory
|
case 1: // sterowanie światełkami klawiatury: CA/SHP+opory
|
||||||
if (mask & 3) // gdy SHP albo CA
|
if (mask & 3) // gdy SHP albo CA
|
||||||
SetLedState(VK_CAPITAL, iBits & 3);
|
SetLedState(VK_CAPITAL, iBits & 3);
|
||||||
if (mask & 4) // gdy jazda na oporach
|
if (mask & 4) // gdy jazda na oporach
|
||||||
{ // Scroll Lock ma jako<EFBFBD> dziwnie... zmiana stanu na przeciwny
|
{ // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny
|
||||||
SetLedState(VK_SCROLL, true); // przyci<EFBFBD>ni<EFBFBD>ty
|
SetLedState(VK_SCROLL, true); // przyciśnięty
|
||||||
SetLedState(VK_SCROLL, false); // zwolniony
|
SetLedState(VK_SCROLL, false); // zwolniony
|
||||||
++iConfig; // licznik u<EFBFBD>ycia Scroll Lock
|
++iConfig; // licznik użycia Scroll Lock
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: // sterowanie <EFBFBD>wiate<EFBFBD>kami klawiatury: CA+SHP
|
case 2: // sterowanie światełkami klawiatury: CA+SHP
|
||||||
if (mask & 2) // gdy CA
|
if (mask & 2) // gdy CA
|
||||||
SetLedState(VK_CAPITAL, iBits & 2);
|
SetLedState(VK_CAPITAL, iBits & 2);
|
||||||
if (mask & 1) // gdy SHP
|
if (mask & 1) // gdy SHP
|
||||||
{ // Scroll Lock ma jako<EFBFBD> dziwnie... zmiana stanu na przeciwny
|
{ // Scroll Lock ma jakoś dziwnie... zmiana stanu na przeciwny
|
||||||
SetLedState(VK_SCROLL, true); // przyci<EFBFBD>ni<EFBFBD>ty
|
SetLedState(VK_SCROLL, true); // przyciśnięty
|
||||||
SetLedState(VK_SCROLL, false); // zwolniony
|
SetLedState(VK_SCROLL, false); // zwolniony
|
||||||
++iConfig; // licznik u<EFBFBD>ycia Scroll Lock
|
++iConfig; // licznik użycia Scroll Lock
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3: // LPT Marcela z modyfikacj<EFBFBD> (jazda na oporach zamiast brz<EFBFBD>czyka)
|
case 3: // LPT Marcela z modyfikacją (jazda na oporach zamiast brzęczyka)
|
||||||
if (LPT)
|
if (LPT)
|
||||||
LPT->Out(iBits);
|
LPT->Out(iBits);
|
||||||
break;
|
break;
|
||||||
case 4: // PoKeys55 wg Marcela - wersja druga z ko<EFBFBD>ca 2012
|
case 4: // PoKeys55 wg Marcela - wersja druga z końca 2012
|
||||||
if (PoKeys55[0])
|
if (PoKeys55[0])
|
||||||
{ // pewnie trzeba b<EFBFBD>dzie to dodatkowo buforowa<EFBFBD> i oczekiwa<EFBFBD> na potwierdzenie
|
{ // pewnie trzeba będzie to dodatkowo buforować i oczekiwać na potwierdzenie
|
||||||
if (mask & 0x0001) // b0 gdy SHP
|
if (mask & 0x0001) // b0 gdy SHP
|
||||||
PoKeys55[0]->Write(0x40, 23 - 1, (iBits & 0x0001) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 23 - 1, (iBits & 0x0001) ? 1 : 0);
|
||||||
if (mask & 0x0002) // b1 gdy zmieniony CA
|
if (mask & 0x0002) // b1 gdy zmieniony CA
|
||||||
PoKeys55[0]->Write(0x40, 24 - 1, (iBits & 0x0002) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 24 - 1, (iBits & 0x0002) ? 1 : 0);
|
||||||
if (mask & 0x0004) // b2 gdy jazda na oporach
|
if (mask & 0x0004) // b2 gdy jazda na oporach
|
||||||
PoKeys55[0]->Write(0x40, 32 - 1, (iBits & 0x0004) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 32 - 1, (iBits & 0x0004) ? 1 : 0);
|
||||||
if (mask & 0x0008) // b3 Lampka WS (wy<EFBFBD><EFBFBD>cznika szybkiego)
|
if (mask & 0x0008) // b3 Lampka WS (wyłącznika szybkiego)
|
||||||
PoKeys55[0]->Write(0x40, 25 - 1, (iBits & 0x0008) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 25 - 1, (iBits & 0x0008) ? 1 : 0);
|
||||||
if (mask & 0x0010) // b4 Lampka przeka<EFBFBD>nika nadmiarowego silnik<EFBFBD>w trakcyjnych
|
if (mask & 0x0010) // b4 Lampka przekaźnika nadmiarowego silników trakcyjnych
|
||||||
PoKeys55[0]->Write(0x40, 27 - 1, (iBits & 0x0010) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 27 - 1, (iBits & 0x0010) ? 1 : 0);
|
||||||
if (mask & 0x0020) // b5 Lampka stycznik<EFBFBD>w liniowych
|
if (mask & 0x0020) // b5 Lampka styczników liniowych
|
||||||
PoKeys55[0]->Write(0x40, 29 - 1, (iBits & 0x0020) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 29 - 1, (iBits & 0x0020) ? 1 : 0);
|
||||||
if (mask & 0x0040) // b6 Lampka po<EFBFBD>lizgu
|
if (mask & 0x0040) // b6 Lampka poślizgu
|
||||||
PoKeys55[0]->Write(0x40, 30 - 1, (iBits & 0x0040) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 30 - 1, (iBits & 0x0040) ? 1 : 0);
|
||||||
if (mask & 0x0080) // b7 Lampka "przetwornicy"
|
if (mask & 0x0080) // b7 Lampka "przetwornicy"
|
||||||
PoKeys55[0]->Write(0x40, 28 - 1, (iBits & 0x0080) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 28 - 1, (iBits & 0x0080) ? 1 : 0);
|
||||||
if (mask & 0x0100) // b8 Kontrolka przeka<EFBFBD>nika nadmiarowego spr<EFBFBD><EFBFBD>arki
|
if (mask & 0x0100) // b8 Kontrolka przekaźnika nadmiarowego sprężarki
|
||||||
PoKeys55[0]->Write(0x40, 33 - 1, (iBits & 0x0100) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 33 - 1, (iBits & 0x0100) ? 1 : 0);
|
||||||
if (mask & 0x0200) // b9 Kontrolka sygnalizacji wentylator<EFBFBD>w i opor<EFBFBD>w
|
if (mask & 0x0200) // b9 Kontrolka sygnalizacji wentylatorów i oporów
|
||||||
PoKeys55[0]->Write(0x40, 26 - 1, (iBits & 0x0200) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 26 - 1, (iBits & 0x0200) ? 1 : 0);
|
||||||
if (mask & 0x0400) // b10 Kontrolka wysokiego rozruchu
|
if (mask & 0x0400) // b10 Kontrolka wysokiego rozruchu
|
||||||
PoKeys55[0]->Write(0x40, 31 - 1, (iBits & 0x0400) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 31 - 1, (iBits & 0x0400) ? 1 : 0);
|
||||||
if (mask & 0x0800) // b11 Kontrolka ogrzewania poci<EFBFBD>gu
|
if (mask & 0x0800) // b11 Kontrolka ogrzewania pociągu
|
||||||
PoKeys55[0]->Write(0x40, 34 - 1, (iBits & 0x0800) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 34 - 1, (iBits & 0x0800) ? 1 : 0);
|
||||||
if (mask & 0x1000) // b12 Ci<EFBFBD>nienie w cylindrach do odbijania w haslerze
|
if (mask & 0x1000) // b12 Ciśnienie w cylindrach do odbijania w haslerze
|
||||||
PoKeys55[0]->Write(0x40, 52 - 1, (iBits & 0x1000) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 52 - 1, (iBits & 0x1000) ? 1 : 0);
|
||||||
if (mask & 0x2000) // b13 Pr<EFBFBD>d na silnikach do odbijania w haslerze
|
if (mask & 0x2000) // b13 Prąd na silnikach do odbijania w haslerze
|
||||||
PoKeys55[0]->Write(0x40, 53 - 1, (iBits & 0x2000) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 53 - 1, (iBits & 0x2000) ? 1 : 0);
|
||||||
if (mask & 0x4000) // b14 Brz<EFBFBD>czyk SHP lub CA
|
if (mask & 0x4000) // b14 Brzęczyk SHP lub CA
|
||||||
PoKeys55[0]->Write(0x40, 16 - 1, (iBits & 0x4000) ? 1 : 0);
|
PoKeys55[0]->Write(0x40, 16 - 1, (iBits & 0x4000) ? 1 : 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 5: // maciek001: MWD lampki i kontrolki
|
case 5: // maciek001: MWD lampki i kontrolki
|
||||||
/* out3: ogrzewanie sk?adu, opory rozruchowe, poslizg, zaluzjewent, -, -, czuwak, shp
|
/* out3: ogrzewanie sk?adu, opory rozruchowe, poslizg, zaluzjewent, -, -, czuwak, shp
|
||||||
out4: stycz.liniowe, pezekaznikr??nicobwpomoc, nadmiarprzetw, roznicowy obw. g?,
|
out4: stycz.liniowe, pezekaznikróżnicobwpomoc, nadmiarprzetw, roznicowy obw. gł,
|
||||||
nadmiarsilniki, wylszybki, zanikpr?duprzyje?dzienaoporach, nadmiarsprezarki
|
nadmiarsilniki, wylszybki, zanikprąduprzyjeździenaoporach, nadmiarsprezarki
|
||||||
out5: HASLER */
|
out5: HASLER */
|
||||||
if (mask & 0x0001)
|
if (mask & 0x0001)
|
||||||
if (iBits & 1)
|
if (iBits & 1)
|
||||||
{
|
{
|
||||||
MWD->WriteDataBuff[4] |= 1 << 7; // SHP HASLER te<EFBFBD>
|
MWD->WriteDataBuff[4] |= 1 << 7; // SHP HASLER też
|
||||||
if (!MWD->bSHPstate)
|
if (!MWD->bSHPstate)
|
||||||
{
|
{
|
||||||
MWD->bSHPstate = true;
|
MWD->bSHPstate = true;
|
||||||
@@ -332,12 +331,12 @@ void Console::BitsUpdate(int mask)
|
|||||||
MWD->WriteDataBuff[4] &= ~(1 << 1);
|
MWD->WriteDataBuff[4] &= ~(1 << 1);
|
||||||
if (mask & 0x0008)
|
if (mask & 0x0008)
|
||||||
if (iBits & 8)
|
if (iBits & 8)
|
||||||
MWD->WriteDataBuff[5] |= 1 << 5; // wy??cznik szybki
|
MWD->WriteDataBuff[5] |= 1 << 5; // wyłącznik szybki
|
||||||
else
|
else
|
||||||
MWD->WriteDataBuff[5] &= ~(1 << 5);
|
MWD->WriteDataBuff[5] &= ~(1 << 5);
|
||||||
if (mask & 0x0010)
|
if (mask & 0x0010)
|
||||||
if (iBits & 0x10)
|
if (iBits & 0x10)
|
||||||
MWD->WriteDataBuff[5] |= 1 << 4; // nadmiarowy silnik?w trakcyjnych
|
MWD->WriteDataBuff[5] |= 1 << 4; // nadmiarowy silników trakcyjnych
|
||||||
else
|
else
|
||||||
MWD->WriteDataBuff[5] &= ~(1 << 4);
|
MWD->WriteDataBuff[5] &= ~(1 << 4);
|
||||||
if (mask & 0x0020)
|
if (mask & 0x0020)
|
||||||
@@ -347,7 +346,7 @@ void Console::BitsUpdate(int mask)
|
|||||||
MWD->WriteDataBuff[5] &= ~(1 << 0);
|
MWD->WriteDataBuff[5] &= ~(1 << 0);
|
||||||
if (mask & 0x0040)
|
if (mask & 0x0040)
|
||||||
if (iBits & 0x40)
|
if (iBits & 0x40)
|
||||||
MWD->WriteDataBuff[4] |= 1 << 2; // po?lizg
|
MWD->WriteDataBuff[4] |= 1 << 2; // poślizg
|
||||||
else
|
else
|
||||||
MWD->WriteDataBuff[4] &= ~(1 << 2);
|
MWD->WriteDataBuff[4] &= ~(1 << 2);
|
||||||
if (mask & 0x0080)
|
if (mask & 0x0080)
|
||||||
@@ -357,7 +356,7 @@ void Console::BitsUpdate(int mask)
|
|||||||
MWD->WriteDataBuff[5] &= ~(1 << 2);
|
MWD->WriteDataBuff[5] &= ~(1 << 2);
|
||||||
if (mask & 0x0100)
|
if (mask & 0x0100)
|
||||||
if (iBits & 0x100)
|
if (iBits & 0x100)
|
||||||
MWD->WriteDataBuff[5] |= 1 << 7; // nadmiarowy spr??arki
|
MWD->WriteDataBuff[5] |= 1 << 7; // nadmiarowy sprężarki
|
||||||
else
|
else
|
||||||
MWD->WriteDataBuff[5] &= ~(1 << 7);
|
MWD->WriteDataBuff[5] &= ~(1 << 7);
|
||||||
if (mask & 0x0200)
|
if (mask & 0x0200)
|
||||||
@@ -372,23 +371,23 @@ void Console::BitsUpdate(int mask)
|
|||||||
MWD->WriteDataBuff[2] &= ~(1 << 2);
|
MWD->WriteDataBuff[2] &= ~(1 << 2);
|
||||||
if (mask & 0x0800)
|
if (mask & 0x0800)
|
||||||
if (iBits & 0x800)
|
if (iBits & 0x800)
|
||||||
MWD->WriteDataBuff[4] |= 1 << 0; // ogrzewanie poci?gu
|
MWD->WriteDataBuff[4] |= 1 << 0; // ogrzewanie pociągu
|
||||||
else
|
else
|
||||||
MWD->WriteDataBuff[4] &= ~(1 << 0);
|
MWD->WriteDataBuff[4] &= ~(1 << 0);
|
||||||
if (mask & 0x1000)
|
if (mask & 0x1000)
|
||||||
if (iBits & 0x1000)
|
if (iBits & 0x1000)
|
||||||
MWD->bHamowanie = true; // hasler: ci?nienie w hamulcach HASLER rysik 2
|
MWD->bHamowanie = true; // hasler: ciśnienie w hamulcach HASLER rysik 2
|
||||||
else
|
else
|
||||||
MWD->bHamowanie = false;
|
MWD->bHamowanie = false;
|
||||||
if (mask & 0x2000)
|
if (mask & 0x2000)
|
||||||
if (iBits & 0x2000)
|
if (iBits & 0x2000)
|
||||||
MWD->WriteDataBuff[6] |=
|
MWD->WriteDataBuff[6] |=
|
||||||
1 << 4; // hasler: pr?d "na" silnikach HASLER rysik 3
|
1 << 4; // hasler: prąd "na" silnikach HASLER rysik 3
|
||||||
else
|
else
|
||||||
MWD->WriteDataBuff[6] &= ~(1 << 4);
|
MWD->WriteDataBuff[6] &= ~(1 << 4);
|
||||||
if (mask & 0x4000)
|
if (mask & 0x4000)
|
||||||
if (iBits & 0x4000)
|
if (iBits & 0x4000)
|
||||||
MWD->WriteDataBuff[6] |= 1 << 7; // brz?czyk SHP/CA
|
MWD->WriteDataBuff[6] |= 1 << 7; // brzęczyk SHP/CA
|
||||||
else
|
else
|
||||||
MWD->WriteDataBuff[6] &= ~(1 << 7);
|
MWD->WriteDataBuff[6] &= ~(1 << 7);
|
||||||
// if(mask & 0x8000) if(iBits & 0x8000) MWD->WriteDataBuff[1] |= 1<<7; (puste)
|
// if(mask & 0x8000) if(iBits & 0x8000) MWD->WriteDataBuff[1] |= 1<<7; (puste)
|
||||||
@@ -398,12 +397,12 @@ void Console::BitsUpdate(int mask)
|
|||||||
};
|
};
|
||||||
|
|
||||||
bool Console::Pressed(int x)
|
bool Console::Pressed(int x)
|
||||||
{ // na razie tak - czyta si<EFBFBD> tylko klawiatura
|
{ // na razie tak - czyta się tylko klawiatura
|
||||||
return Global::bActive && (GetKeyState(x) < 0);
|
return Global::bActive && (GetKeyState(x) < 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
void Console::ValueSet(int x, double y)
|
void Console::ValueSet(int x, double y)
|
||||||
{ // ustawienie warto<EFBFBD>ci (y) na kanale analogowym (x)
|
{ // ustawienie wartości (y) na kanale analogowym (x)
|
||||||
if (iMode == 4)
|
if (iMode == 4)
|
||||||
if (PoKeys55[0])
|
if (PoKeys55[0])
|
||||||
{
|
{
|
||||||
@@ -415,8 +414,8 @@ void Console::ValueSet(int x, double y)
|
|||||||
y = Global::CutValueToRange(0, y, Global::fCalibrateOutMax[x]);
|
y = Global::CutValueToRange(0, y, Global::fCalibrateOutMax[x]);
|
||||||
if (Global::iCalibrateOutDebugInfo == x)
|
if (Global::iCalibrateOutDebugInfo == x)
|
||||||
WriteLog(" cutted=" + std::to_string(y), false);
|
WriteLog(" cutted=" + std::to_string(y), false);
|
||||||
y = y / Global::fCalibrateOutMax[x]; // sprowadzenie do <0,1> je<EFBFBD>li podana
|
y = y / Global::fCalibrateOutMax[x]; // sprowadzenie do <0,1> jeśli podana
|
||||||
// maksymalna warto<EFBFBD><EFBFBD>
|
// maksymalna wartość
|
||||||
if (Global::iCalibrateOutDebugInfo == x)
|
if (Global::iCalibrateOutDebugInfo == x)
|
||||||
WriteLog(" fraction=" + std::to_string(y), false);
|
WriteLog(" fraction=" + std::to_string(y), false);
|
||||||
}
|
}
|
||||||
@@ -432,20 +431,20 @@ void Console::ValueSet(int x, double y)
|
|||||||
WriteLog(" calibrated=" + std::to_string(temp));
|
WriteLog(" calibrated=" + std::to_string(temp));
|
||||||
PoKeys55[0]->PWM(x, temp);
|
PoKeys55[0]->PWM(x, temp);
|
||||||
}
|
}
|
||||||
if (iMode == 5 && MWD) // pwm-y i pr<EFBFBD>dko<EFBFBD><EFBFBD>
|
if (iMode == 5 && MWD) // pwm-y i prędkość
|
||||||
{
|
{
|
||||||
unsigned int iliczba;
|
unsigned int iliczba;
|
||||||
if (x == 0)
|
if (x == 0)
|
||||||
{
|
{
|
||||||
iliczba = (unsigned int)floor((y / (Global::fMWDzg[0] * 10) * Global::fMWDzg[1]) +
|
iliczba = (unsigned int)floor((y / (Global::fMWDzg[0] * 10) * Global::fMWDzg[1]) +
|
||||||
0.5); // zbiornik g??wny
|
0.5); // zbiornik główny
|
||||||
MWD->WriteDataBuff[12] = (unsigned char)(iliczba >> 8);
|
MWD->WriteDataBuff[12] = (unsigned char)(iliczba >> 8);
|
||||||
MWD->WriteDataBuff[11] = (unsigned char)iliczba;
|
MWD->WriteDataBuff[11] = (unsigned char)iliczba;
|
||||||
}
|
}
|
||||||
else if (x == 1)
|
else if (x == 1)
|
||||||
{
|
{
|
||||||
iliczba = (unsigned int)floor((y / (Global::fMWDpg[0] * 10) * Global::fMWDpg[1]) +
|
iliczba = (unsigned int)floor((y / (Global::fMWDpg[0] * 10) * Global::fMWDpg[1]) +
|
||||||
0.5); // przew?d g??wny
|
0.5); // przewód główny
|
||||||
MWD->WriteDataBuff[10] = (unsigned char)(iliczba >> 8);
|
MWD->WriteDataBuff[10] = (unsigned char)(iliczba >> 8);
|
||||||
MWD->WriteDataBuff[9] = (unsigned char)iliczba;
|
MWD->WriteDataBuff[9] = (unsigned char)iliczba;
|
||||||
}
|
}
|
||||||
@@ -485,24 +484,24 @@ void Console::ValueSet(int x, double y)
|
|||||||
MWD->WriteDataBuff[19] = (unsigned char)iliczba;
|
MWD->WriteDataBuff[19] = (unsigned char)iliczba;
|
||||||
}
|
}
|
||||||
else if (x == 7)
|
else if (x == 7)
|
||||||
MWD->WriteDataBuff[0] = (unsigned char)floor(y); // pr<EFBFBD>dko<EFBFBD><EFBFBD>
|
MWD->WriteDataBuff[0] = (unsigned char)floor(y); // prędkość
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void Console::Update()
|
void Console::Update()
|
||||||
{ // funkcja powinna by<EFBFBD> wywo<EFBFBD>ywana regularnie, np. raz w ka<EFBFBD>dej ramce ekranowej
|
{ // funkcja powinna być wywoływana regularnie, np. raz w każdej ramce ekranowej
|
||||||
if (iMode == 4)
|
if (iMode == 4)
|
||||||
if (PoKeys55[0])
|
if (PoKeys55[0])
|
||||||
if (PoKeys55[0]->Update((Global::iPause & 8) > 0))
|
if (PoKeys55[0]->Update((Global::iPause & 8) > 0))
|
||||||
{ // wykrycie przestawionych prze<EFBFBD><EFBFBD>cznik<EFBFBD>w?
|
{ // wykrycie przestawionych przełączników?
|
||||||
Global::iPause &= ~8;
|
Global::iPause &= ~8;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // b<EFBFBD><EFBFBD>d komunikacji - zapauzowa<EFBFBD> symulacj<EFBFBD>?
|
{ // błąd komunikacji - zapauzować symulację?
|
||||||
if (!(Global::iPause & 8)) // je<EFBFBD>li jeszcze nie oflagowana
|
if (!(Global::iPause & 8)) // jeśli jeszcze nie oflagowana
|
||||||
Global::iTextMode = VK_F1; // pokazanie czasu/pauzy
|
Global::iTextMode = VK_F1; // pokazanie czasu/pauzy
|
||||||
Global::iPause |= 8; // tak???
|
Global::iPause |= 8; // tak???
|
||||||
PoKeys55[0]->Connect(); // pr<EFBFBD>ba ponownego pod<EFBFBD><EFBFBD>czenia
|
PoKeys55[0]->Connect(); // próba ponownego podłączenia
|
||||||
}
|
}
|
||||||
if (iMode == 5) // Obs?uga MWD OK
|
if (iMode == 5) // Obs?uga MWD OK
|
||||||
{
|
{
|
||||||
@@ -511,7 +510,7 @@ void Console::Update()
|
|||||||
};
|
};
|
||||||
|
|
||||||
float Console::AnalogGet(int x)
|
float Console::AnalogGet(int x)
|
||||||
{ // pobranie warto<EFBFBD>ci analogowej
|
{ // pobranie wartości analogowej
|
||||||
if (iMode == 4)
|
if (iMode == 4)
|
||||||
if (PoKeys55[0])
|
if (PoKeys55[0])
|
||||||
return PoKeys55[0]->fAnalog[x];
|
return PoKeys55[0]->fAnalog[x];
|
||||||
@@ -519,7 +518,7 @@ float Console::AnalogGet(int x)
|
|||||||
};
|
};
|
||||||
|
|
||||||
float Console::AnalogCalibrateGet(int x)
|
float Console::AnalogCalibrateGet(int x)
|
||||||
{ // pobranie i kalibracja warto<EFBFBD>ci analogowej, je<EFBFBD>li nie ma PoKeys zwraca NULL
|
{ // pobranie i kalibracja wartości analogowej, jeśli nie ma PoKeys zwraca NULL
|
||||||
if (iMode == 4 && PoKeys55[0])
|
if (iMode == 4 && PoKeys55[0])
|
||||||
{
|
{
|
||||||
float b = PoKeys55[0]->fAnalog[x];
|
float b = PoKeys55[0]->fAnalog[x];
|
||||||
@@ -551,11 +550,11 @@ float Console::AnalogCalibrateGet(int x)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1.0; // odci<EFBFBD>cie
|
return -1.0; // odcięcie
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned char Console::DigitalGet(int x)
|
unsigned char Console::DigitalGet(int x)
|
||||||
{ // pobranie warto<EFBFBD>ci cyfrowej
|
{ // pobranie wartości cyfrowej
|
||||||
if (iMode == 4)
|
if (iMode == 4)
|
||||||
if (PoKeys55[0])
|
if (PoKeys55[0])
|
||||||
return PoKeys55[0]->iInputs[x];
|
return PoKeys55[0]->iInputs[x];
|
||||||
@@ -563,35 +562,35 @@ unsigned char Console::DigitalGet(int x)
|
|||||||
};
|
};
|
||||||
|
|
||||||
void Console::OnKeyDown(int k)
|
void Console::OnKeyDown(int k)
|
||||||
{ // naci<EFBFBD>ni<EFBFBD>cie klawisza z powoduje wy<EFBFBD><EFBFBD>czenie, a
|
{ // naciśnięcie klawisza z powoduje wyłączenie, a
|
||||||
if (k & 0x10000) // je<EFBFBD>li [Shift]
|
if (k & 0x10000) // jeśli [Shift]
|
||||||
{ // ustawienie bitu w tabeli prze<EFBFBD><EFBFBD>cznik<EFBFBD>w bistabilnych
|
{ // ustawienie bitu w tabeli przełączników bistabilnych
|
||||||
if (k & 0x20000) // je<EFBFBD>li [Ctrl], to zestaw dodatkowy
|
if (k & 0x20000) // jeśli [Ctrl], to zestaw dodatkowy
|
||||||
iSwitch[4 + (char(k) >> 5)] |= 1 << (k & 31); // za<EFBFBD><EFBFBD>cz bistabliny dodatkowy
|
iSwitch[4 + (char(k) >> 5)] |= 1 << (k & 31); // załącz bistabliny dodatkowy
|
||||||
else
|
else
|
||||||
{ // z [Shift] w<EFBFBD><EFBFBD>czenie bitu bistabilnego i dodatkowego monostabilnego
|
{ // z [Shift] włączenie bitu bistabilnego i dodatkowego monostabilnego
|
||||||
iSwitch[char(k) >> 5] |= 1 << (k & 31); // za<EFBFBD><EFBFBD>cz bistabliny podstawowy
|
iSwitch[char(k) >> 5] |= 1 << (k & 31); // załącz bistabliny podstawowy
|
||||||
iButton[4 + (char(k) >> 5)] |= (1 << (k & 31)); // za<EFBFBD><EFBFBD>cz monostabilny dodatkowy
|
iButton[4 + (char(k) >> 5)] |= (1 << (k & 31)); // załącz monostabilny dodatkowy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // zerowanie bitu w tabeli prze<EFBFBD><EFBFBD>cznik<EFBFBD>w bistabilnych
|
{ // zerowanie bitu w tabeli przełączników bistabilnych
|
||||||
if (k & 0x20000) // je<EFBFBD>li [Ctrl], to zestaw dodatkowy
|
if (k & 0x20000) // jeśli [Ctrl], to zestaw dodatkowy
|
||||||
iSwitch[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wy<EFBFBD><EFBFBD>cz bistabilny dodatkowy
|
iSwitch[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wyłącz bistabilny dodatkowy
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
iSwitch[char(k) >> 5] &= ~(1 << (k & 31)); // wy<EFBFBD><EFBFBD>cz bistabilny podstawowy
|
iSwitch[char(k) >> 5] &= ~(1 << (k & 31)); // wyłącz bistabilny podstawowy
|
||||||
iButton[char(k) >> 5] |= 1 << (k & 31); // za<EFBFBD><EFBFBD>cz monostabilny podstawowy
|
iButton[char(k) >> 5] |= 1 << (k & 31); // załącz monostabilny podstawowy
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
void Console::OnKeyUp(int k)
|
void Console::OnKeyUp(int k)
|
||||||
{ // puszczenie klawisza w zasadzie nie ma znaczenia dla iSwitch, ale zeruje iButton
|
{ // puszczenie klawisza w zasadzie nie ma znaczenia dla iSwitch, ale zeruje iButton
|
||||||
if ((k & 0x20000) == 0) // monostabilne tylko bez [Ctrl]
|
if ((k & 0x20000) == 0) // monostabilne tylko bez [Ctrl]
|
||||||
if (k & 0x10000) // je<EFBFBD>li [Shift]
|
if (k & 0x10000) // jeśli [Shift]
|
||||||
iButton[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wy<EFBFBD><EFBFBD>cz monostabilny dodatkowy
|
iButton[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wyłącz monostabilny dodatkowy
|
||||||
else
|
else
|
||||||
iButton[char(k) >> 5] &= ~(1 << (k & 31)); // wy<EFBFBD><EFBFBD>cz monostabilny podstawowy
|
iButton[char(k) >> 5] &= ~(1 << (k & 31)); // wyłącz monostabilny podstawowy
|
||||||
};
|
};
|
||||||
int Console::KeyDownConvert(int k)
|
int Console::KeyDownConvert(int k)
|
||||||
{
|
{
|
||||||
|
|||||||
28
Console.h
28
Console.h
@@ -10,36 +10,36 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#ifndef ConsoleH
|
#ifndef ConsoleH
|
||||||
#define ConsoleH
|
#define ConsoleH
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
class TConsoleDevice; // urz¹dzenie pod³¹czalne za pomoc¹ DLL
|
class TConsoleDevice; // urządzenie podłączalne za pomocą DLL
|
||||||
class TPoKeys55;
|
class TPoKeys55;
|
||||||
class TLPT;
|
class TLPT;
|
||||||
class MWDComm; // maciek001: dodana obsluga portu COM
|
class MWDComm; // maciek001: dodana obsluga portu COM
|
||||||
|
|
||||||
// klasy konwersji znaków wprowadzanych z klawiatury
|
// klasy konwersji znaków wprowadzanych z klawiatury
|
||||||
class TKeyTrans
|
class TKeyTrans
|
||||||
{ // przekodowanie kodu naciœniêcia i zwolnienia klawisza
|
{ // przekodowanie kodu naciśnięcia i zwolnienia klawisza
|
||||||
public:
|
public:
|
||||||
short int iDown, iUp;
|
short int iDown, iUp;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Console
|
class Console
|
||||||
{ // Ra: klasa statyczna gromadz¹ca sygna³y steruj¹ce oraz informacje zwrotne
|
{ // Ra: klasa statyczna gromadząca sygnały sterujące oraz informacje zwrotne
|
||||||
// Ra: stan wejœcia zmieniany klawiatur¹ albo dedykowanym urz¹dzeniem
|
// Ra: stan wejścia zmieniany klawiaturą albo dedykowanym urządzeniem
|
||||||
// Ra: stan wyjœcia zmieniany przez symulacjê (mierniki, kontrolki)
|
// Ra: stan wyjścia zmieniany przez symulację (mierniki, kontrolki)
|
||||||
private:
|
private:
|
||||||
static int iMode; // tryb pracy
|
static int iMode; // tryb pracy
|
||||||
static int iConfig; // dodatkowa informacja o sprzêcie (np. numer LPT)
|
static int iConfig; // dodatkowa informacja o sprzęcie (np. numer LPT)
|
||||||
static int iBits; // podstawowy zestaw lampek
|
static int iBits; // podstawowy zestaw lampek
|
||||||
static TPoKeys55 *PoKeys55[2]; // mo¿e ich byæ kilka
|
static TPoKeys55 *PoKeys55[2]; // może ich być kilka
|
||||||
static TLPT *LPT;
|
static TLPT *LPT;
|
||||||
static MWDComm *MWD; // maciek001: na potrzeby MWD
|
static MWDComm *MWD; // maciek001: na potrzeby MWD
|
||||||
static void BitsUpdate(int mask);
|
static void BitsUpdate(int mask);
|
||||||
// zmienne dla trybu "jednokabinowego", potrzebne do wspó³pracy z pulpitem (PoKeys)
|
// zmienne dla trybu "jednokabinowego", potrzebne do współpracy z pulpitem (PoKeys)
|
||||||
// u¿ywaj¹c klawiatury, ka¿dy pojazd powinien mieæ w³asny stan prze³¹czników
|
// używając klawiatury, każdy pojazd powinien mieć własny stan przełączników
|
||||||
// bazowym sterowaniem jest wirtualny strumieñ klawiatury
|
// bazowym sterowaniem jest wirtualny strumień klawiatury
|
||||||
// przy zmianie kabiny z PoKeys, do kabiny s¹ wysy³ane stany tych przycisków
|
// przy zmianie kabiny z PoKeys, do kabiny są wysyłane stany tych przycisków
|
||||||
static int iSwitch[8]; // bistabilne w kabinie, za³¹czane z [Shift], wy³¹czane bez
|
static int iSwitch[8]; // bistabilne w kabinie, załączane z [Shift], wyłączane bez
|
||||||
static int iButton[8]; // monostabilne w kabinie, za³¹czane podczas trzymania klawisza
|
static int iButton[8]; // monostabilne w kabinie, załączane podczas trzymania klawisza
|
||||||
static TKeyTrans ktTable[4 * 256]; // tabela wczesnej konwersji klawiatury
|
static TKeyTrans ktTable[4 * 256]; // tabela wczesnej konwersji klawiatury
|
||||||
public:
|
public:
|
||||||
Console();
|
Console();
|
||||||
|
|||||||
4
Data.h
4
Data.h
@@ -10,7 +10,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#ifndef DataH
|
#ifndef DataH
|
||||||
#define DataH
|
#define DataH
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Modu³ z danymi
|
// Moduł z danymi
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
struct TDist
|
struct TDist
|
||||||
@@ -18,7 +18,7 @@ struct TDist
|
|||||||
int x, y;
|
int x, y;
|
||||||
};
|
};
|
||||||
const TDist SectorOrder[] = {
|
const TDist SectorOrder[] = {
|
||||||
// tabela wspó³rzêdnych sektorów, posortowana wg odleg³oœci
|
// tabela współrzędnych sektorów, posortowana wg odległości
|
||||||
{0, 0}, // 0.00
|
{0, 0}, // 0.00
|
||||||
{1, 0}, // 1.00
|
{1, 0}, // 1.00
|
||||||
{0, 1}, // 1.00
|
{0, 1}, // 1.00
|
||||||
|
|||||||
3815
Driver.cpp
3815
Driver.cpp
File diff suppressed because it is too large
Load Diff
320
Driver.h
320
Driver.h
@@ -19,127 +19,127 @@ using namespace Mtable;
|
|||||||
|
|
||||||
enum TOrders
|
enum TOrders
|
||||||
{ // rozkazy dla AI
|
{ // rozkazy dla AI
|
||||||
Wait_for_orders = 0, // czekanie na dostarczenie następnych rozkazów
|
Wait_for_orders = 0, // czekanie na dostarczenie następnych rozkazów
|
||||||
// operacje tymczasowe
|
// operacje tymczasowe
|
||||||
Prepare_engine = 1, // włączenie silnika
|
Prepare_engine = 1, // włączenie silnika
|
||||||
Release_engine = 2, // wyłączenie silnika
|
Release_engine = 2, // wyłączenie silnika
|
||||||
Change_direction = 4, // zmiana kierunku (bez skanowania sygnalizacji)
|
Change_direction = 4, // zmiana kierunku (bez skanowania sygnalizacji)
|
||||||
Connect = 8, // podłączanie wagonów (z częściowym skanowaniem sygnalizacji)
|
Connect = 8, // podłączanie wagonów (z częściowym skanowaniem sygnalizacji)
|
||||||
Disconnect = 0x10, // odłączanie wagonów (bez skanowania sygnalizacji)
|
Disconnect = 0x10, // odłączanie wagonów (bez skanowania sygnalizacji)
|
||||||
// jazda
|
// jazda
|
||||||
Shunt = 0x20, // tryb manewrowy
|
Shunt = 0x20, // tryb manewrowy
|
||||||
Obey_train = 0x40, // tryb pociągowy
|
Obey_train = 0x40, // tryb pociągowy
|
||||||
Jump_to_first_order = 0x60 // zapęlenie do pierwszej pozycji (po co?)
|
Jump_to_first_order = 0x60 // zapęlenie do pierwszej pozycji (po co?)
|
||||||
};
|
};
|
||||||
|
|
||||||
enum TMovementStatus
|
enum TMovementStatus
|
||||||
{ // flagi bitowe ruchu (iDrivigFlags)
|
{ // flagi bitowe ruchu (iDrivigFlags)
|
||||||
moveStopCloser = 1, // podjechać blisko W4 (nie podjeżdżać na początku ani po zmianie czoła)
|
moveStopCloser = 1, // podjechać blisko W4 (nie podjeżdżać na początku ani po zmianie czoła)
|
||||||
moveStopPoint = 2, // stawać na W4 (wyłączone podczas zmiany czoła)
|
moveStopPoint = 2, // stawać na W4 (wyłączone podczas zmiany czoła)
|
||||||
moveActive = 4, // pojazd jest załączony i skanuje
|
moveActive = 4, // pojazd jest załączony i skanuje
|
||||||
movePress = 8, // dociskanie przy odłączeniu (zamiast zmiennej Prepare2press)
|
movePress = 8, // dociskanie przy odłączeniu (zamiast zmiennej Prepare2press)
|
||||||
moveConnect = 0x10, // jest blisko innego pojazdu i można próbować podłączyć
|
moveConnect = 0x10, // jest blisko innego pojazdu i można próbować podłączyć
|
||||||
movePrimary = 0x20, // ma priorytet w składzie (master)
|
movePrimary = 0x20, // ma priorytet w składzie (master)
|
||||||
moveLate = 0x40, // flaga spóźnienia, włączy bardziej
|
moveLate = 0x40, // flaga spóźnienia, włączy bardziej
|
||||||
moveStopHere = 0x80, // nie podjeżdżać do semafora, jeśli droga nie jest wolna
|
moveStopHere = 0x80, // nie podjeżdżać do semafora, jeśli droga nie jest wolna
|
||||||
moveStartHorn = 0x100, // podawaj sygnał po podaniu wolnej drogi
|
moveStartHorn = 0x100, // podawaj sygnał po podaniu wolnej drogi
|
||||||
moveStartHornNow = 0x200, // podaj sygnał po odhamowaniu
|
moveStartHornNow = 0x200, // podaj sygnał po odhamowaniu
|
||||||
moveStartHornDone = 0x400, // podano sygnał po podaniu wolnej drogi
|
moveStartHornDone = 0x400, // podano sygnał po podaniu wolnej drogi
|
||||||
moveOerlikons = 0x800, // skład wyłącznie z zaworami? Oerlikona
|
moveOerlikons = 0x800, // skład wyłącznie z zaworami? Oerlikona
|
||||||
moveIncSpeed = 0x1000, // załączenie jazdy (np. dla EZT)
|
moveIncSpeed = 0x1000, // załączenie jazdy (np. dla EZT)
|
||||||
moveTrackEnd = 0x2000, // dalsza jazda do przodu trwale ograniczona (W5, koniec toru)
|
moveTrackEnd = 0x2000, // dalsza jazda do przodu trwale ograniczona (W5, koniec toru)
|
||||||
moveSwitchFound = 0x4000, // na drodze skanowania do przodu jest rozjazd
|
moveSwitchFound = 0x4000, // na drodze skanowania do przodu jest rozjazd
|
||||||
moveGuardSignal = 0x8000, // sygnał od kierownika (minął czas postoju)
|
moveGuardSignal = 0x8000, // sygnał od kierownika (minął czas postoju)
|
||||||
moveVisibility = 0x10000, // jazda na widoczność po przejechaniu S1 na SBL
|
moveVisibility = 0x10000, // jazda na widoczność po przejechaniu S1 na SBL
|
||||||
moveDoorOpened = 0x20000, // drzwi zostały otwarte - doliczyć czas na zamknięcie
|
moveDoorOpened = 0x20000, // drzwi zostały otwarte - doliczyć czas na zamknięcie
|
||||||
movePushPull =
|
movePushPull =
|
||||||
0x40000, // zmiana czoła przez zmianę kabiny - nie odczepiać przy zmianie kierunku
|
0x40000, // zmiana czoła przez zmianę kabiny - nie odczepiać przy zmianie kierunku
|
||||||
moveSemaphorFound = 0x80000, // na drodze skanowania został znaleziony semafor
|
moveSemaphorFound = 0x80000, // na drodze skanowania został znaleziony semafor
|
||||||
moveSemaphorWasElapsed = 0x100000, // minięty został semafor
|
moveSemaphorWasElapsed = 0x100000, // minięty został semafor
|
||||||
moveTrainInsideStation =
|
moveTrainInsideStation =
|
||||||
0x200000, // pociąg między semaforem a rozjazdami lub następnym semaforem
|
0x200000, // pociąg między semaforem a rozjazdami lub następnym semaforem
|
||||||
moveSpeedLimitFound = 0x400000 // pociąg w ograniczeniu z podaną jego długością
|
moveSpeedLimitFound = 0x400000 // pociąg w ograniczeniu z podaną jego długością
|
||||||
};
|
};
|
||||||
|
|
||||||
enum TStopReason
|
enum TStopReason
|
||||||
{ // powód zatrzymania, dodawany do SetVelocity 0 - w zasadzie do usunięcia
|
{ // powód zatrzymania, dodawany do SetVelocity 0 - w zasadzie do usunięcia
|
||||||
stopNone, // nie ma powodu - powinien jechać
|
stopNone, // nie ma powodu - powinien jechać
|
||||||
stopSleep, // nie został odpalony, to nie pojedzie
|
stopSleep, // nie został odpalony, to nie pojedzie
|
||||||
stopSem, // semafor zamknięty
|
stopSem, // semafor zamknięty
|
||||||
stopTime, // czekanie na godzinę odjazdu
|
stopTime, // czekanie na godzinę odjazdu
|
||||||
stopEnd, // brak dalszej części toru
|
stopEnd, // brak dalszej części toru
|
||||||
stopDir, // trzeba stanąć, by zmienić kierunek jazdy
|
stopDir, // trzeba stanąć, by zmienić kierunek jazdy
|
||||||
stopJoin, // stoi w celu połączenia wagonów
|
stopJoin, // stoi w celu połączenia wagonów
|
||||||
stopBlock, // przeszkoda na drodze ruchu
|
stopBlock, // przeszkoda na drodze ruchu
|
||||||
stopComm, // otrzymano taką komendę (niewiadomego pochodzenia)
|
stopComm, // otrzymano taką komendę (niewiadomego pochodzenia)
|
||||||
stopOut, // komenda wyjazdu poza stację (raczej nie powinna zatrzymywać!)
|
stopOut, // komenda wyjazdu poza stację (raczej nie powinna zatrzymywać!)
|
||||||
stopRadio, // komunikat przekazany radiem (Radiostop)
|
stopRadio, // komunikat przekazany radiem (Radiostop)
|
||||||
stopExt, // komenda z zewnątrz
|
stopExt, // komenda z zewnątrz
|
||||||
stopError // z powodu błędu w obliczeniu drogi hamowania
|
stopError // z powodu błędu w obliczeniu drogi hamowania
|
||||||
};
|
};
|
||||||
|
|
||||||
enum TAction
|
enum TAction
|
||||||
{ // przechowanie aktualnego stanu AI od poprzedniego przebłysku świadomości
|
{ // przechowanie aktualnego stanu AI od poprzedniego przebłysku świadomości
|
||||||
actUnknown, // stan nieznany (domyślny na początku)
|
actUnknown, // stan nieznany (domyślny na początku)
|
||||||
actPantUp, // podnieś pantograf (info dla użytkownika)
|
actPantUp, // podnieś pantograf (info dla użytkownika)
|
||||||
actConv, // załącz przetwornicę (info dla użytkownika)
|
actConv, // załącz przetwornicę (info dla użytkownika)
|
||||||
actCompr, // załącz sprężarkę (info dla użytkownika)
|
actCompr, // załącz sprężarkę (info dla użytkownika)
|
||||||
actSleep, //śpi (wygaszony)
|
actSleep, //śpi (wygaszony)
|
||||||
actDrive, // jazda
|
actDrive, // jazda
|
||||||
actGo, // ruszanie z miejsca
|
actGo, // ruszanie z miejsca
|
||||||
actSlow, // przyhamowanie przed ograniczeniem
|
actSlow, // przyhamowanie przed ograniczeniem
|
||||||
sctStop, // hamowanie w celu precyzyjnego zatrzymania
|
sctStop, // hamowanie w celu precyzyjnego zatrzymania
|
||||||
actIdle, // luzowanie składu przed odjazdem
|
actIdle, // luzowanie składu przed odjazdem
|
||||||
actRelease, // luzowanie składu po zmniejszeniu prędkości
|
actRelease, // luzowanie składu po zmniejszeniu prędkości
|
||||||
actConnect, // dojazd w celu podczepienia
|
actConnect, // dojazd w celu podczepienia
|
||||||
actWait, // czekanie na przystanku
|
actWait, // czekanie na przystanku
|
||||||
actReady, // zgłoszona gotowość do odjazdu od kierownika
|
actReady, // zgłoszona gotowość do odjazdu od kierownika
|
||||||
actEmergency, // hamowanie awaryjne
|
actEmergency, // hamowanie awaryjne
|
||||||
actGoUphill, // ruszanie pod górę
|
actGoUphill, // ruszanie pod górę
|
||||||
actTest, // hamowanie kontrolne (podczas jazdy)
|
actTest, // hamowanie kontrolne (podczas jazdy)
|
||||||
actTrial // próba hamulca (na postoju)
|
actTrial // próba hamulca (na postoju)
|
||||||
};
|
};
|
||||||
|
|
||||||
enum TSpeedPosFlag
|
enum TSpeedPosFlag
|
||||||
{ // wartości dla iFlag w TSpeedPos
|
{ // wartości dla iFlag w TSpeedPos
|
||||||
spEnabled = 0x1, // pozycja brana pod uwagę
|
spEnabled = 0x1, // pozycja brana pod uwagę
|
||||||
spTrack = 0x2, // to jest tor
|
spTrack = 0x2, // to jest tor
|
||||||
spReverse = 0x4, // odwrotnie
|
spReverse = 0x4, // odwrotnie
|
||||||
spSwitch = 0x8, // to zwrotnica
|
spSwitch = 0x8, // to zwrotnica
|
||||||
spSwitchStatus = 0x10, // stan zwrotnicy
|
spSwitchStatus = 0x10, // stan zwrotnicy
|
||||||
spElapsed = 0x20, // pozycja minięta przez pojazd
|
spElapsed = 0x20, // pozycja minięta przez pojazd
|
||||||
spEnd = 0x40, // koniec
|
spEnd = 0x40, // koniec
|
||||||
spCurve = 0x80, // łuk
|
spCurve = 0x80, // łuk
|
||||||
spEvent = 0x100, // event
|
spEvent = 0x100, // event
|
||||||
spShuntSemaphor = 0x200, // tarcza manewrowa
|
spShuntSemaphor = 0x200, // tarcza manewrowa
|
||||||
spPassengerStopPoint = 0x400, // przystanek osobowy (wskaźnik W4)
|
spPassengerStopPoint = 0x400, // przystanek osobowy (wskaźnik W4)
|
||||||
spStopOnSBL = 0x800, // zatrzymanie na SBL
|
spStopOnSBL = 0x800, // zatrzymanie na SBL
|
||||||
spCommandSent = 0x1000, // komenda wysłana
|
spCommandSent = 0x1000, // komenda wysłana
|
||||||
spOutsideStation = 0x2000, // wskaźnik końca manewrów
|
spOutsideStation = 0x2000, // wskaźnik końca manewrów
|
||||||
spSemaphor = 0x4000, // semafor pociągowy
|
spSemaphor = 0x4000, // semafor pociągowy
|
||||||
spRoadVel = 0x8000, // zadanie prędkości drogowej
|
spRoadVel = 0x8000, // zadanie prędkości drogowej
|
||||||
spSectionVel = 0x20000, // odcinek z ograniczeniem
|
spSectionVel = 0x20000, // odcinek z ograniczeniem
|
||||||
spProximityVelocity = 0x40000, // odcinek z ograniczeniem i podaną jego długościa
|
spProximityVelocity = 0x40000, // odcinek z ograniczeniem i podaną jego długościa
|
||||||
spEndOfTable = 0x10000 // zatkanie tabelki
|
spEndOfTable = 0x10000 // zatkanie tabelki
|
||||||
};
|
};
|
||||||
|
|
||||||
class TSpeedPos
|
class TSpeedPos
|
||||||
{ // pozycja tabeli prędkości dla AI
|
{ // pozycja tabeli prędkości dla AI
|
||||||
public:
|
public:
|
||||||
double fDist; // aktualna odległość (ujemna gdy minięte)
|
double fDist; // aktualna odległość (ujemna gdy minięte)
|
||||||
double fVelNext; // prędkość obowiązująca od tego miejsca
|
double fVelNext; // prędkość obowiązująca od tego miejsca
|
||||||
double fSectionVelocityDist; // długość ograniczenia prędkości
|
double fSectionVelocityDist; // długość ograniczenia prędkości
|
||||||
// double fAcc;
|
// double fAcc;
|
||||||
int iFlags; // flagi typu wpisu do tabelki
|
int iFlags; // flagi typu wpisu do tabelki
|
||||||
// 1=istotny,2=tor,4=odwrotnie,8-zwrotnica (może się zmienić),16-stan
|
// 1=istotny,2=tor,4=odwrotnie,8-zwrotnica (może się zmienić),16-stan
|
||||||
// zwrotnicy,32-minięty,64=koniec,128=łuk
|
// zwrotnicy,32-minięty,64=koniec,128=łuk
|
||||||
// 0x100=event,0x200=manewrowa,0x400=przystanek,0x800=SBL,0x1000=wysłana komenda,0x2000=W5
|
// 0x100=event,0x200=manewrowa,0x400=przystanek,0x800=SBL,0x1000=wysłana komenda,0x2000=W5
|
||||||
// 0x4000=semafor,0x10000=zatkanie
|
// 0x4000=semafor,0x10000=zatkanie
|
||||||
vector3 vPos; // współrzędne XYZ do liczenia odległości
|
vector3 vPos; // współrzędne XYZ do liczenia odległości
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
TTrack *trTrack; // wskaźnik na tor o zmiennej prędkości (zwrotnica, obrotnica)
|
TTrack *trTrack; // wskaźnik na tor o zmiennej prędkości (zwrotnica, obrotnica)
|
||||||
TEvent *evEvent; // połączenie z eventem albo komórką pamięci
|
TEvent *evEvent; // połączenie z eventem albo komórką pamięci
|
||||||
};
|
};
|
||||||
void CommandCheck();
|
void CommandCheck();
|
||||||
|
|
||||||
@@ -158,57 +158,57 @@ static const bool Aggressive = true;
|
|||||||
static const bool Easyman = false;
|
static const bool Easyman = false;
|
||||||
static const bool AIdriver = true;
|
static const bool AIdriver = true;
|
||||||
static const bool Humandriver = false;
|
static const bool Humandriver = false;
|
||||||
static const int maxorders = 32; // ilość rozkazów w tabelce
|
static const int maxorders = 32; // ilość rozkazów w tabelce
|
||||||
static const int maxdriverfails = 4; // ile błędów może zrobić AI zanim zmieni nastawienie
|
static const int maxdriverfails = 4; // ile błędów może zrobić AI zanim zmieni nastawienie
|
||||||
extern bool WriteLogFlag; // logowanie parametrów fizycznych
|
extern bool WriteLogFlag; // logowanie parametrów fizycznych
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
class TController
|
class TController
|
||||||
{
|
{
|
||||||
private: // obsługa tabelki prędkości (musi mieć możliwość odhaczania stacji w rozkładzie)
|
private: // obsługa tabelki prędkości (musi mieć możliwość odhaczania stacji w rozkładzie)
|
||||||
TSpeedPos *sSpeedTable; // najbliższe zmiany prędkości
|
TSpeedPos *sSpeedTable; // najbliższe zmiany prędkości
|
||||||
int iSpeedTableSize; // wielkość tabelki
|
int iSpeedTableSize; // wielkość tabelki
|
||||||
int iFirst; // aktualna pozycja w tabeli (modulo iSpeedTableSize)
|
int iFirst; // aktualna pozycja w tabeli (modulo iSpeedTableSize)
|
||||||
int iLast; // ostatnia wypełniona pozycja w tabeli <iFirst (modulo iSpeedTableSize)
|
int iLast; // ostatnia wypełniona pozycja w tabeli <iFirst (modulo iSpeedTableSize)
|
||||||
int iTableDirection; // kierunek zapełnienia tabelki względem pojazdu z AI
|
int iTableDirection; // kierunek zapełnienia tabelki względem pojazdu z AI
|
||||||
double fLastVel; // prędkość na poprzednio sprawdzonym torze
|
double fLastVel; // prędkość na poprzednio sprawdzonym torze
|
||||||
TTrack *tLast; // ostatni analizowany tor
|
TTrack *tLast; // ostatni analizowany tor
|
||||||
TEvent *eSignSkip; // można pominąć ten SBL po zatrzymaniu
|
TEvent *eSignSkip; // można pominąć ten SBL po zatrzymaniu
|
||||||
TSpeedPos *sSemNext; // następny semafor na drodze zależny od trybu jazdy
|
TSpeedPos *sSemNext; // następny semafor na drodze zależny od trybu jazdy
|
||||||
TSpeedPos *sSemNextStop; // następny semafor na drodze zależny od trybu jazdy i na stój
|
TSpeedPos *sSemNextStop; // następny semafor na drodze zależny od trybu jazdy i na stój
|
||||||
private: // parametry aktualnego składu
|
private: // parametry aktualnego składu
|
||||||
double fLength; // długość składu (do wyciągania z ograniczeń)
|
double fLength; // długość składu (do wyciągania z ograniczeń)
|
||||||
double fMass; // całkowita masa do liczenia stycznej składowej grawitacji
|
double fMass; // całkowita masa do liczenia stycznej składowej grawitacji
|
||||||
double fAccGravity; // przyspieszenie składowej stycznej grawitacji
|
double fAccGravity; // przyspieszenie składowej stycznej grawitacji
|
||||||
public:
|
public:
|
||||||
TEvent *eSignNext; // sygnał zmieniający prędkość, do pokazania na [F2]
|
TEvent *eSignNext; // sygnał zmieniający prędkość, do pokazania na [F2]
|
||||||
std::string asNextStop; // nazwa następnego punktu zatrzymania wg rozkładu
|
std::string asNextStop; // nazwa następnego punktu zatrzymania wg rozkładu
|
||||||
int iStationStart; // numer pierwszej stacji pokazywanej na podglądzie rozkładu
|
int iStationStart; // numer pierwszej stacji pokazywanej na podglądzie rozkładu
|
||||||
private: // parametry sterowania pojazdem (stan, hamowanie)
|
private: // parametry sterowania pojazdem (stan, hamowanie)
|
||||||
double fShuntVelocity; // maksymalna prędkość manewrowania, zależy m.in. od składu
|
double fShuntVelocity; // maksymalna prędkość manewrowania, zależy m.in. od składu
|
||||||
int iVehicles; // ilość pojazdów w składzie
|
int iVehicles; // ilość pojazdów w składzie
|
||||||
int iEngineActive; // ABu: Czy silnik byl juz zalaczony; Ra: postęp w załączaniu
|
int iEngineActive; // ABu: Czy silnik byl juz zalaczony; Ra: postęp w załączaniu
|
||||||
// vector3 vMechLoc; //pozycja pojazdu do liczenia odległości od semafora (?)
|
// vector3 vMechLoc; //pozycja pojazdu do liczenia odległości od semafora (?)
|
||||||
bool Psyche;
|
bool Psyche;
|
||||||
int iDrivigFlags; // flagi bitowe ruchu
|
int iDrivigFlags; // flagi bitowe ruchu
|
||||||
double fDriverBraking; // po pomnożeniu przez v^2 [km/h] daje ~drogę hamowania [m]
|
double fDriverBraking; // po pomnożeniu przez v^2 [km/h] daje ~drogę hamowania [m]
|
||||||
double fDriverDist; // dopuszczalna odległość podjechania do przeszkody
|
double fDriverDist; // dopuszczalna odległość podjechania do przeszkody
|
||||||
double fVelMax; // maksymalna prędkość składu (sprawdzany każdy pojazd)
|
double fVelMax; // maksymalna prędkość składu (sprawdzany każdy pojazd)
|
||||||
double fBrakeDist; // przybliżona droga hamowania
|
double fBrakeDist; // przybliżona droga hamowania
|
||||||
double fAccThreshold; // próg opóźnienia dla zadziałania hamulca
|
double fAccThreshold; // próg opóźnienia dla zadziałania hamulca
|
||||||
public:
|
public:
|
||||||
double fLastStopExpDist; // odległość wygasania ostateniego przystanku
|
double fLastStopExpDist; // odległość wygasania ostateniego przystanku
|
||||||
double ReactionTime; // czas reakcji Ra: czego i na co? świadomości AI
|
double ReactionTime; // czas reakcji Ra: czego i na co? świadomości AI
|
||||||
double fBrakeTime; // wpisana wartość jest zmniejszana do 0, gdy ujemna należy zmienić nastawę
|
double fBrakeTime; // wpisana wartość jest zmniejszana do 0, gdy ujemna należy zmienić nastawę
|
||||||
// hamulca
|
// hamulca
|
||||||
private:
|
private:
|
||||||
double fReady; // poziom odhamowania wagonów
|
double fReady; // poziom odhamowania wagonów
|
||||||
bool Ready; // ABu: stan gotowosci do odjazdu - sprawdzenie odhamowania wagonow
|
bool Ready; // ABu: stan gotowosci do odjazdu - sprawdzenie odhamowania wagonow
|
||||||
double LastUpdatedTime; // czas od ostatniego logu
|
double LastUpdatedTime; // czas od ostatniego logu
|
||||||
double ElapsedTime; // czas od poczatku logu
|
double ElapsedTime; // czas od poczatku logu
|
||||||
double deltalog; // przyrost czasu
|
double deltalog; // przyrost czasu
|
||||||
double LastReactionTime;
|
double LastReactionTime;
|
||||||
double fActionTime; // czas używany przy regulacji prędkości i zamykaniu drzwi
|
double fActionTime; // czas używany przy regulacji prędkości i zamykaniu drzwi
|
||||||
TAction eAction; // aktualny stan
|
TAction eAction; // aktualny stan
|
||||||
bool HelpMeFlag; // wystawiane True jesli cos niedobrego sie dzieje
|
bool HelpMeFlag; // wystawiane True jesli cos niedobrego sie dzieje
|
||||||
public:
|
public:
|
||||||
@@ -220,86 +220,86 @@ class TController
|
|||||||
int iRouteWanted; // oczekiwany kierunek jazdy (0-stop,1-lewo,2-prawo,3-prosto) np. odpala
|
int iRouteWanted; // oczekiwany kierunek jazdy (0-stop,1-lewo,2-prawo,3-prosto) np. odpala
|
||||||
// migacz lub czeka na stan zwrotnicy
|
// migacz lub czeka na stan zwrotnicy
|
||||||
private:
|
private:
|
||||||
TDynamicObject *pVehicle; // pojazd w którym siedzi sterujący
|
TDynamicObject *pVehicle; // pojazd w którym siedzi sterujący
|
||||||
TDynamicObject
|
TDynamicObject
|
||||||
*pVehicles[2]; // skrajne pojazdy w składzie (niekoniecznie bezpośrednio sterowane)
|
*pVehicles[2]; // skrajne pojazdy w składzie (niekoniecznie bezpośrednio sterowane)
|
||||||
TMoverParameters *mvControlling; // jakim pojazdem steruje (może silnikowym w EZT)
|
TMoverParameters *mvControlling; // jakim pojazdem steruje (może silnikowym w EZT)
|
||||||
TMoverParameters *mvOccupied; // jakim pojazdem hamuje
|
TMoverParameters *mvOccupied; // jakim pojazdem hamuje
|
||||||
TTrainParameters *TrainParams; // rozkład jazdy zawsze jest, nawet jeśli pusty
|
TTrainParameters *TrainParams; // rozkład jazdy zawsze jest, nawet jeśli pusty
|
||||||
// int TrainNumber; //numer rozkladowy tego pociagu
|
// int TrainNumber; //numer rozkladowy tego pociagu
|
||||||
// AnsiString OrderCommand; //komenda pobierana z pojazdu
|
// AnsiString OrderCommand; //komenda pobierana z pojazdu
|
||||||
// double OrderValue; //argument komendy
|
// double OrderValue; //argument komendy
|
||||||
int iRadioChannel; // numer aktualnego kanału radiowego
|
int iRadioChannel; // numer aktualnego kanału radiowego
|
||||||
TTextSound *tsGuardSignal; // komunikat od kierownika
|
TTextSound *tsGuardSignal; // komunikat od kierownika
|
||||||
int iGuardRadio; // numer kanału radiowego kierownika (0, gdy nie używa radia)
|
int iGuardRadio; // numer kanału radiowego kierownika (0, gdy nie używa radia)
|
||||||
public:
|
public:
|
||||||
double AccPreferred; // preferowane przyspieszenie (wg psychiki kierującego, zmniejszana przy
|
double AccPreferred; // preferowane przyspieszenie (wg psychiki kierującego, zmniejszana przy
|
||||||
// wykryciu kolizji)
|
// wykryciu kolizji)
|
||||||
double AccDesired; // przyspieszenie, jakie ma utrzymywać (<0:nie przyspieszaj,<-0.1:hamuj)
|
double AccDesired; // przyspieszenie, jakie ma utrzymywać (<0:nie przyspieszaj,<-0.1:hamuj)
|
||||||
double VelDesired; // predkość, z jaką ma jechać, wynikająca z analizy tableki; <=VelSignal
|
double VelDesired; // predkość, z jaką ma jechać, wynikająca z analizy tableki; <=VelSignal
|
||||||
double fAccDesiredAv; // uśrednione przyspieszenie z kolejnych przebłysków świadomości, żeby
|
double fAccDesiredAv; // uśrednione przyspieszenie z kolejnych przebłysków świadomości, żeby
|
||||||
// ograniczyć migotanie
|
// ograniczyć migotanie
|
||||||
public:
|
public:
|
||||||
double VelforDriver; // prędkość, używana przy zmianie kierunku (ograniczenie przy nieznajmości
|
double VelforDriver; // prędkość, używana przy zmianie kierunku (ograniczenie przy nieznajmości
|
||||||
// szlaku?)
|
// szlaku?)
|
||||||
double VelSignal; // ograniczenie prędkości z kompilacji znaków i sygnałów
|
double VelSignal; // ograniczenie prędkości z kompilacji znaków i sygnałów
|
||||||
double VelLimit; // predkość zadawana przez event jednokierunkowego ograniczenia prędkości
|
double VelLimit; // predkość zadawana przez event jednokierunkowego ograniczenia prędkości
|
||||||
public:
|
public:
|
||||||
double VelSignalLast; // prędkość zadana na ostatnim semaforze
|
double VelSignalLast; // prędkość zadana na ostatnim semaforze
|
||||||
double VelSignalNext; // prędkość zadana na następnym semaforze
|
double VelSignalNext; // prędkość zadana na następnym semaforze
|
||||||
double VelLimitLast; // prędkość zadana przez ograniczenie
|
double VelLimitLast; // prędkość zadana przez ograniczenie
|
||||||
double VelRoad; // aktualna prędkość drogowa (ze znaku W27)
|
double VelRoad; // aktualna prędkość drogowa (ze znaku W27)
|
||||||
// (PutValues albo komendą)
|
// (PutValues albo komendą)
|
||||||
public:
|
public:
|
||||||
double VelNext; // prędkość, jaka ma być po przejechaniu długości ProximityDist
|
double VelNext; // prędkość, jaka ma być po przejechaniu długości ProximityDist
|
||||||
private:
|
private:
|
||||||
double fProximityDist; // odleglosc podawana w SetProximityVelocity(); >0:przeliczać do
|
double fProximityDist; // odleglosc podawana w SetProximityVelocity(); >0:przeliczać do
|
||||||
// punktu, <0:podana wartość
|
// punktu, <0:podana wartość
|
||||||
double FirstSemaphorDist; // odległość do pierwszego znalezionego semafora
|
double FirstSemaphorDist; // odległość do pierwszego znalezionego semafora
|
||||||
public:
|
public:
|
||||||
double
|
double
|
||||||
ActualProximityDist; // odległość brana pod uwagę przy wyliczaniu prędkości i przyspieszenia
|
ActualProximityDist; // odległość brana pod uwagę przy wyliczaniu prędkości i przyspieszenia
|
||||||
private:
|
private:
|
||||||
vector3 vCommandLocation; // polozenie wskaznika, sygnalizatora lub innego obiektu do ktorego
|
vector3 vCommandLocation; // polozenie wskaznika, sygnalizatora lub innego obiektu do ktorego
|
||||||
// odnosi sie komenda
|
// odnosi sie komenda
|
||||||
TOrders OrderList[maxorders]; // lista rozkazów
|
TOrders OrderList[maxorders]; // lista rozkazów
|
||||||
int OrderPos, OrderTop; // rozkaz aktualny oraz wolne miejsce do wstawiania nowych
|
int OrderPos, OrderTop; // rozkaz aktualny oraz wolne miejsce do wstawiania nowych
|
||||||
std::ofstream LogFile; // zapis parametrow fizycznych
|
std::ofstream LogFile; // zapis parametrow fizycznych
|
||||||
std::ofstream AILogFile; // log AI
|
std::ofstream AILogFile; // log AI
|
||||||
bool MaxVelFlag;
|
bool MaxVelFlag;
|
||||||
bool MinVelFlag;
|
bool MinVelFlag;
|
||||||
int iDirection; // kierunek jazdy względem sprzęgów pojazdu, w którym siedzi AI (1=przód,-1=tył)
|
int iDirection; // kierunek jazdy względem sprzęgów pojazdu, w którym siedzi AI (1=przód,-1=tył)
|
||||||
int iDirectionOrder; //żadany kierunek jazdy (służy do zmiany kierunku)
|
int iDirectionOrder; //żadany kierunek jazdy (służy do zmiany kierunku)
|
||||||
int iVehicleCount; // ilość pojazdów do odłączenia albo zabrania ze składu (-1=wszystkie)
|
int iVehicleCount; // ilość pojazdów do odłączenia albo zabrania ze składu (-1=wszystkie)
|
||||||
int iCoupler; // maska sprzęgu, jaką należy użyć przy łączeniu (po osiągnięciu trybu Connect), 0
|
int iCoupler; // maska sprzęgu, jaką należy użyć przy łączeniu (po osiągnięciu trybu Connect), 0
|
||||||
// gdy jazda bez łączenia
|
// gdy jazda bez łączenia
|
||||||
int iDriverFailCount; // licznik błędów AI
|
int iDriverFailCount; // licznik błędów AI
|
||||||
bool Need_TryAgain; // true, jeśli druga pozycja w elektryku nie załapała
|
bool Need_TryAgain; // true, jeśli druga pozycja w elektryku nie załapała
|
||||||
bool Need_BrakeRelease;
|
bool Need_BrakeRelease;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
double fMinProximityDist; // minimalna oległość do przeszkody, jaką należy zachować
|
double fMinProximityDist; // minimalna oległość do przeszkody, jaką należy zachować
|
||||||
double fOverhead1; // informacja o napięciu w sieci trakcyjnej (0=brak drutu, zatrzymaj!)
|
double fOverhead1; // informacja o napięciu w sieci trakcyjnej (0=brak drutu, zatrzymaj!)
|
||||||
double fOverhead2; // informacja o sposobie jazdy (-1=normalnie, 0=bez prądu, >0=z opuszczonym i
|
double fOverhead2; // informacja o sposobie jazdy (-1=normalnie, 0=bez prądu, >0=z opuszczonym i
|
||||||
// ograniczeniem prędkości)
|
// ograniczeniem prędkości)
|
||||||
int iOverheadZero; // suma bitowa jezdy bezprądowej, bity ustawiane przez pojazdy z
|
int iOverheadZero; // suma bitowa jezdy bezprądowej, bity ustawiane przez pojazdy z
|
||||||
// podniesionymi pantografami
|
// podniesionymi pantografami
|
||||||
int iOverheadDown; // suma bitowa opuszczenia pantografów, bity ustawiane przez pojazdy z
|
int iOverheadDown; // suma bitowa opuszczenia pantografów, bity ustawiane przez pojazdy z
|
||||||
// podniesionymi pantografami
|
// podniesionymi pantografami
|
||||||
double fVoltage; // uśrednione napięcie sieci: przy spadku poniżej wartości minimalnej opóźnić
|
double fVoltage; // uśrednione napięcie sieci: przy spadku poniżej wartości minimalnej opóźnić
|
||||||
// rozruch o losowy czas
|
// rozruch o losowy czas
|
||||||
private:
|
private:
|
||||||
double fMaxProximityDist; // akceptowalna odległość stanięcia przed przeszkodą
|
double fMaxProximityDist; // akceptowalna odległość stanięcia przed przeszkodą
|
||||||
TStopReason eStopReason; // powód zatrzymania przy ustawieniu zerowej prędkości
|
TStopReason eStopReason; // powód zatrzymania przy ustawieniu zerowej prędkości
|
||||||
std::string VehicleName;
|
std::string VehicleName;
|
||||||
double fVelPlus; // dopuszczalne przekroczenie prędkości na ograniczeniu bez hamowania
|
double fVelPlus; // dopuszczalne przekroczenie prędkości na ograniczeniu bez hamowania
|
||||||
double fVelMinus; // margines obniżenia prędkości, powodujący załączenie napędu
|
double fVelMinus; // margines obniżenia prędkości, powodujący załączenie napędu
|
||||||
double fWarningDuration; // ile czasu jeszcze trąbić
|
double fWarningDuration; // ile czasu jeszcze trąbić
|
||||||
double fStopTime; // czas postoju przed dalszą jazdą (np. na przystanku)
|
double fStopTime; // czas postoju przed dalszą jazdą (np. na przystanku)
|
||||||
double WaitingTime; // zliczany czas oczekiwania do samoistnego ruszenia
|
double WaitingTime; // zliczany czas oczekiwania do samoistnego ruszenia
|
||||||
double WaitingExpireTime; // maksymlany czas oczekiwania do samoistnego ruszenia
|
double WaitingExpireTime; // maksymlany czas oczekiwania do samoistnego ruszenia
|
||||||
// TEvent* eSignLast; //ostatnio znaleziony sygnał, o ile nie minięty
|
// TEvent* eSignLast; //ostatnio znaleziony sygnał, o ile nie minięty
|
||||||
private: //---//---//---//---// koniec zmiennych, poniżej metody //---//---//---//---//
|
private: //---//---//---//---// koniec zmiennych, poniżej metody //---//---//---//---//
|
||||||
void SetDriverPsyche();
|
void SetDriverPsyche();
|
||||||
bool PrepareEngine();
|
bool PrepareEngine();
|
||||||
bool ReleaseEngine();
|
bool ReleaseEngine();
|
||||||
@@ -310,9 +310,9 @@ class TController
|
|||||||
void SpeedSet();
|
void SpeedSet();
|
||||||
void Doors(bool what);
|
void Doors(bool what);
|
||||||
void RecognizeCommand(); // odczytuje komende przekazana lokomotywie
|
void RecognizeCommand(); // odczytuje komende przekazana lokomotywie
|
||||||
void Activation(); // umieszczenie obsady w odpowiednim członie
|
void Activation(); // umieszczenie obsady w odpowiednim członie
|
||||||
void ControllingSet(); // znajduje człon do sterowania
|
void ControllingSet(); // znajduje człon do sterowania
|
||||||
void AutoRewident(); // ustawia hamulce w składzie
|
void AutoRewident(); // ustawia hamulce w składzie
|
||||||
public:
|
public:
|
||||||
Mtable::TTrainParameters *Timetable()
|
Mtable::TTrainParameters *Timetable()
|
||||||
{
|
{
|
||||||
@@ -322,13 +322,13 @@ class TController
|
|||||||
const TLocation &NewLocation, TStopReason reason = stopComm);
|
const TLocation &NewLocation, TStopReason reason = stopComm);
|
||||||
bool PutCommand(std::string NewCommand, double NewValue1, double NewValue2,
|
bool PutCommand(std::string NewCommand, double NewValue1, double NewValue2,
|
||||||
const vector3 *NewLocation, TStopReason reason = stopComm);
|
const vector3 *NewLocation, TStopReason reason = stopComm);
|
||||||
bool UpdateSituation(double dt); // uruchamiac przynajmniej raz na sekundę
|
bool UpdateSituation(double dt); // uruchamiac przynajmniej raz na sekundę
|
||||||
// procedury dotyczace rozkazow dla maszynisty
|
// procedury dotyczace rozkazow dla maszynisty
|
||||||
void SetVelocity(double NewVel, double NewVelNext,
|
void SetVelocity(double NewVel, double NewVelNext,
|
||||||
TStopReason r = stopNone); // uaktualnia informacje o prędkości
|
TStopReason r = stopNone); // uaktualnia informacje o prędkości
|
||||||
bool SetProximityVelocity(
|
bool SetProximityVelocity(
|
||||||
double NewDist,
|
double NewDist,
|
||||||
double NewVelNext); // uaktualnia informacje o prędkości przy nastepnym semaforze
|
double NewVelNext); // uaktualnia informacje o prędkości przy nastepnym semaforze
|
||||||
public:
|
public:
|
||||||
void JumpToNextOrder();
|
void JumpToNextOrder();
|
||||||
void JumpToFirstOrder();
|
void JumpToFirstOrder();
|
||||||
@@ -347,7 +347,7 @@ class TController
|
|||||||
void OrdersClear();
|
void OrdersClear();
|
||||||
void OrdersDump();
|
void OrdersDump();
|
||||||
TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
|
TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
|
||||||
bool primary = true // czy ma aktywnie prowadzić?
|
bool primary = true // czy ma aktywnie prowadzić?
|
||||||
);
|
);
|
||||||
std::string OrderCurrent();
|
std::string OrderCurrent();
|
||||||
void WaitingSet(double Seconds);
|
void WaitingSet(double Seconds);
|
||||||
@@ -359,7 +359,7 @@ class TController
|
|||||||
void Lights(int head, int rear);
|
void Lights(int head, int rear);
|
||||||
double Distance(vector3 &p1, vector3 &n, vector3 &p2);
|
double Distance(vector3 &p1, vector3 &n, vector3 &p2);
|
||||||
|
|
||||||
private: // Ra: metody obsługujące skanowanie toru
|
private: // Ra: metody obsługujące skanowanie toru
|
||||||
TEvent *CheckTrackEvent(double fDirection, TTrack *Track);
|
TEvent *CheckTrackEvent(double fDirection, TTrack *Track);
|
||||||
bool TableCheckEvent(TEvent *e);
|
bool TableCheckEvent(TEvent *e);
|
||||||
bool TableAddNew();
|
bool TableAddNew();
|
||||||
@@ -371,7 +371,7 @@ class TController
|
|||||||
TCommandType TableUpdate(double &fVelDes, double &fDist, double &fNext, double &fAcc);
|
TCommandType TableUpdate(double &fVelDes, double &fDist, double &fNext, double &fAcc);
|
||||||
void TablePurger();
|
void TablePurger();
|
||||||
|
|
||||||
private: // Ra: stare funkcje skanujące, używane do szukania sygnalizatora z tyłu
|
private: // Ra: stare funkcje skanujące, używane do szukania sygnalizatora z tyłu
|
||||||
bool BackwardTrackBusy(TTrack *Track);
|
bool BackwardTrackBusy(TTrack *Track);
|
||||||
TEvent *CheckTrackEventBackward(double fDirection, TTrack *Track);
|
TEvent *CheckTrackEventBackward(double fDirection, TTrack *Track);
|
||||||
TTrack *BackwardTraceRoute(double &fDistance, double &fDirection, TTrack *Track,
|
TTrack *BackwardTraceRoute(double &fDistance, double &fDirection, TTrack *Track,
|
||||||
|
|||||||
294
DynObj.h
294
DynObj.h
@@ -22,17 +22,17 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
int const ANIM_TYPES = 7; // Ra: ilość typów animacji
|
int const ANIM_TYPES = 7; // Ra: ilość typów animacji
|
||||||
int const ANIM_WHEELS = 0; // koła
|
int const ANIM_WHEELS = 0; // koła
|
||||||
int const ANIM_DOORS = 1; // drzwi
|
int const ANIM_DOORS = 1; // drzwi
|
||||||
int const ANIM_LEVERS = 2; // elementy obracane (wycieraczki, koła skrętne, przestawiacze, klocki ham.)
|
int const ANIM_LEVERS = 2; // elementy obracane (wycieraczki, koła skrętne, przestawiacze, klocki ham.)
|
||||||
int const ANIM_BUFFERS = 3; // elementy przesuwane (zderzaki)
|
int const ANIM_BUFFERS = 3; // elementy przesuwane (zderzaki)
|
||||||
int const ANIM_BOOGIES = 4; // wózki (są skręcane w dwóch osiach)
|
int const ANIM_BOOGIES = 4; // wózki (są skręcane w dwóch osiach)
|
||||||
int const ANIM_PANTS = 5; // pantografy
|
int const ANIM_PANTS = 5; // pantografy
|
||||||
int const ANIM_STEAMS = 6; // napęd parowozu
|
int const ANIM_STEAMS = 6; // napęd parowozu
|
||||||
|
|
||||||
class TAnim;
|
class TAnim;
|
||||||
//typedef void(__closure *TUpdate)(TAnim *pAnim); // typ funkcji aktualizującej położenie submodeli
|
//typedef void(__closure *TUpdate)(TAnim *pAnim); // typ funkcji aktualizującej położenie submodeli
|
||||||
typedef std::function<void(TAnim *)> TUpdate; // __closure is Borland-specific extension
|
typedef std::function<void(TAnim *)> TUpdate; // __closure is Borland-specific extension
|
||||||
|
|
||||||
// McZapkie-250202
|
// McZapkie-250202
|
||||||
@@ -40,100 +40,100 @@ int const MaxAxles = 16; // ABu 280105: zmienione z 8 na 16
|
|||||||
// const MaxAnimatedAxles=16; //i to tez.
|
// const MaxAnimatedAxles=16; //i to tez.
|
||||||
// const MaxAnimatedDoors=16; //NBMX wrzesien 2003
|
// const MaxAnimatedDoors=16; //NBMX wrzesien 2003
|
||||||
/*
|
/*
|
||||||
Ra: Utworzyć klasę wyposażenia opcjonalnego, z której będą dziedziczyć klasy drzwi,
|
Ra: Utworzyć klasę wyposażenia opcjonalnego, z której będą dziedziczyć klasy drzwi,
|
||||||
pantografów, napędu parowozu i innych ruchomych części pojazdów. Klasy powinny być
|
pantografów, napędu parowozu i innych ruchomych części pojazdów. Klasy powinny być
|
||||||
pseudo-wirtualne, bo wirtualne mogą obniżać wydajnosść.
|
pseudo-wirtualne, bo wirtualne mogą obniżać wydajnosść.
|
||||||
Przy wczytywaniu MMD utworzyć tabelę wskaźnikow na te dodatki. Przy wyświetlaniu
|
Przy wczytywaniu MMD utworzyć tabelę wskaźnikow na te dodatki. Przy wyświetlaniu
|
||||||
pojazdu wykonywać Update() na kolejnych obiektach wyposażenia.
|
pojazdu wykonywać Update() na kolejnych obiektach wyposażenia.
|
||||||
Rozważyć użycie oddzielnych modeli dla niektórych pojazdów (np. lokomotywy), co
|
Rozważyć użycie oddzielnych modeli dla niektórych pojazdów (np. lokomotywy), co
|
||||||
zaoszczędziło by czas ustawiania animacji na modelu wspólnym dla kilku pojazdów,
|
zaoszczędziło by czas ustawiania animacji na modelu wspólnym dla kilku pojazdów,
|
||||||
szczególnie dla pojazdów w danej chwili nieruchomych (przy dużym zagęszczeniu
|
szczególnie dla pojazdów w danej chwili nieruchomych (przy dużym zagęszczeniu
|
||||||
modeli na stacjach na ogół przewaga jest tych nieruchomych).
|
modeli na stacjach na ogół przewaga jest tych nieruchomych).
|
||||||
*/
|
*/
|
||||||
class TAnimValveGear
|
class TAnimValveGear
|
||||||
{ // współczynniki do animacji parowozu (wartości przykładowe dla Pt47)
|
{ // współczynniki do animacji parowozu (wartości przykładowe dla Pt47)
|
||||||
int iValues; // ilość liczb (wersja):
|
int iValues; // ilość liczb (wersja):
|
||||||
float fKorbowodR; // długość korby (pół skoku tłoka) [m]: 0.35
|
float fKorbowodR; // długość korby (pół skoku tłoka) [m]: 0.35
|
||||||
float fKorbowodL; // długość korbowodu [m]: 3.8
|
float fKorbowodL; // długość korbowodu [m]: 3.8
|
||||||
float fDrazekR; // promień mimośrodu (drążka) [m]: 0.18
|
float fDrazekR; // promień mimośrodu (drążka) [m]: 0.18
|
||||||
float fDrazekL; // dł. drążka mimośrodowego [m]: 2.55889
|
float fDrazekL; // dł. drążka mimośrodowego [m]: 2.55889
|
||||||
float fJarzmoV; // wysokość w pionie osi jarzma od osi koła [m]: 0.751
|
float fJarzmoV; // wysokość w pionie osi jarzma od osi koła [m]: 0.751
|
||||||
float fJarzmoH; // odległość w poziomie osi jarzma od osi koła [m]: 2.550
|
float fJarzmoH; // odległość w poziomie osi jarzma od osi koła [m]: 2.550
|
||||||
float fJarzmoR; // promień jarzma do styku z drążkiem [m]: 0.450
|
float fJarzmoR; // promień jarzma do styku z drążkiem [m]: 0.450
|
||||||
float fJarzmoA; // kąt mimośrodu względem kąta koła [°]: -96.77416667
|
float fJarzmoA; // kąt mimośrodu względem kąta koła [°]: -96.77416667
|
||||||
float fWdzidloL; // długość wodzidła [m]: 2.0
|
float fWdzidloL; // długość wodzidła [m]: 2.0
|
||||||
float fWahaczH; // długość wahacza (góra) [m]: 0.14
|
float fWahaczH; // długość wahacza (góra) [m]: 0.14
|
||||||
float fSuwakH; // wysokość osi suwaka ponad osią koła [m]: 0.62
|
float fSuwakH; // wysokość osi suwaka ponad osią koła [m]: 0.62
|
||||||
float fWahaczL; // długość wahacza (dół) [m]: 0.84
|
float fWahaczL; // długość wahacza (dół) [m]: 0.84
|
||||||
float fLacznikL; // długość łącznika wahacza [m]: 0.75072
|
float fLacznikL; // długość łącznika wahacza [m]: 0.75072
|
||||||
float fRamieL; // odległość ramienia krzyżulca od osi koła [m]: 0.192
|
float fRamieL; // odległość ramienia krzyżulca od osi koła [m]: 0.192
|
||||||
float fSuwakL; // odległość środka tłoka/suwaka od osi koła [m]: 5.650
|
float fSuwakL; // odległość środka tłoka/suwaka od osi koła [m]: 5.650
|
||||||
// dołożyć parametry drążka nastawnicy
|
// dołożyć parametry drążka nastawnicy
|
||||||
// albo nawet zrobić dynamiczną tablicę float[] i w nią pakować wszelkie współczynniki, potem
|
// albo nawet zrobić dynamiczną tablicę float[] i w nią pakować wszelkie współczynniki, potem
|
||||||
// używać indeksów
|
// używać indeksów
|
||||||
// współczynniki mogą być wspólne dla 2-4 tłoków, albo każdy tłok może mieć odrębne
|
// współczynniki mogą być wspólne dla 2-4 tłoków, albo każdy tłok może mieć odrębne
|
||||||
};
|
};
|
||||||
|
|
||||||
class TAnimPant
|
class TAnimPant
|
||||||
{ // współczynniki do animacji pantografu
|
{ // współczynniki do animacji pantografu
|
||||||
public:
|
public:
|
||||||
vector3 vPos; // Ra: współrzędne punktu zerowego pantografu (X dodatnie dla przedniego)
|
vector3 vPos; // Ra: współrzędne punktu zerowego pantografu (X dodatnie dla przedniego)
|
||||||
double fLenL1; // długość dolnego ramienia 1, odczytana z modelu
|
double fLenL1; // długość dolnego ramienia 1, odczytana z modelu
|
||||||
double fLenU1; // długość górnego ramienia 1, odczytana z modelu
|
double fLenU1; // długość górnego ramienia 1, odczytana z modelu
|
||||||
double fLenL2; // długość dolnego ramienia 2, odczytana z modelu
|
double fLenL2; // długość dolnego ramienia 2, odczytana z modelu
|
||||||
double fLenU2; // długość górnego ramienia 2, odczytana z modelu
|
double fLenU2; // długość górnego ramienia 2, odczytana z modelu
|
||||||
double fHoriz; // przesunięcie ślizgu w długości pojazdu względem osi obrotu dolnego ramienia
|
double fHoriz; // przesunięcie ślizgu w długości pojazdu względem osi obrotu dolnego ramienia
|
||||||
double fHeight; // wysokość ślizgu ponad oś obrotu, odejmowana od wysokości drutu
|
double fHeight; // wysokość ślizgu ponad oś obrotu, odejmowana od wysokości drutu
|
||||||
double fWidth; // połowa szerokości roboczej ślizgu, do wykrycia ześlizgnięcia się drutu
|
double fWidth; // połowa szerokości roboczej ślizgu, do wykrycia ześlizgnięcia się drutu
|
||||||
double fAngleL0; // Ra: początkowy kąt dolnego ramienia (odejmowany przy animacji)
|
double fAngleL0; // Ra: początkowy kąt dolnego ramienia (odejmowany przy animacji)
|
||||||
double fAngleU0; // Ra: początkowy kąt górnego ramienia (odejmowany przy animacji)
|
double fAngleU0; // Ra: początkowy kąt górnego ramienia (odejmowany przy animacji)
|
||||||
double PantTraction; // Winger 170204: wysokość drutu ponad punktem na wysokości vPos.y p.g.s.
|
double PantTraction; // Winger 170204: wysokość drutu ponad punktem na wysokości vPos.y p.g.s.
|
||||||
double PantWys; // Ra: aktualna wysokość uniesienia ślizgu do porównania z wysokością drutu
|
double PantWys; // Ra: aktualna wysokość uniesienia ślizgu do porównania z wysokością drutu
|
||||||
double fAngleL; // Winger 160204: aktualny kąt ramienia dolnego
|
double fAngleL; // Winger 160204: aktualny kąt ramienia dolnego
|
||||||
double fAngleU; // Ra: aktualny kąt ramienia górnego
|
double fAngleU; // Ra: aktualny kąt ramienia górnego
|
||||||
double NoVoltTime; // czas od utraty kontaktu z drutem
|
double NoVoltTime; // czas od utraty kontaktu z drutem
|
||||||
TTraction *hvPowerWire; // aktualnie podczepione druty, na razie tu
|
TTraction *hvPowerWire; // aktualnie podczepione druty, na razie tu
|
||||||
float fWidthExtra; // dodatkowy rozmiar poziomy poza część roboczą (fWidth)
|
float fWidthExtra; // dodatkowy rozmiar poziomy poza część roboczą (fWidth)
|
||||||
float fHeightExtra[5]; //łamana symulująca kształt nabieżnika
|
float fHeightExtra[5]; //łamana symulująca kształt nabieżnika
|
||||||
// double fHorizontal; //Ra 2015-01: położenie drutu względem osi pantografu
|
// double fHorizontal; //Ra 2015-01: położenie drutu względem osi pantografu
|
||||||
void AKP_4E();
|
void AKP_4E();
|
||||||
};
|
};
|
||||||
|
|
||||||
class TAnim
|
class TAnim
|
||||||
{ // klasa animowanej części pojazdu (koła, drzwi, pantografy, burty, napęd parowozu, siłowniki
|
{ // klasa animowanej części pojazdu (koła, drzwi, pantografy, burty, napęd parowozu, siłowniki
|
||||||
// itd.)
|
// itd.)
|
||||||
public:
|
public:
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
TSubModel *smAnimated; // animowany submodel (jeśli tylko jeden, np. oś)
|
TSubModel *smAnimated; // animowany submodel (jeśli tylko jeden, np. oś)
|
||||||
TSubModel **smElement; // jeśli animowanych elementów jest więcej (pantograf, napęd
|
TSubModel **smElement; // jeśli animowanych elementów jest więcej (pantograf, napęd
|
||||||
// parowozu)
|
// parowozu)
|
||||||
int iShift; // przesunięcie przed przydzieleniem wskaźnika
|
int iShift; // przesunięcie przed przydzieleniem wskaźnika
|
||||||
};
|
};
|
||||||
union
|
union
|
||||||
{ // parametry animacji
|
{ // parametry animacji
|
||||||
TAnimValveGear *pValveGear; // współczynniki do animacji parowozu
|
TAnimValveGear *pValveGear; // współczynniki do animacji parowozu
|
||||||
double *dWheelAngle; // wskaźnik na kąt obrotu osi
|
double *dWheelAngle; // wskaźnik na kąt obrotu osi
|
||||||
float *fParam; // różne parametry dla animacji
|
float *fParam; // różne parametry dla animacji
|
||||||
TAnimPant *fParamPants; // różne parametry dla animacji
|
TAnimPant *fParamPants; // różne parametry dla animacji
|
||||||
};
|
};
|
||||||
union
|
union
|
||||||
{ // wskaźnik na obiekt odniesienia
|
{ // wskaźnik na obiekt odniesienia
|
||||||
double *fDoubleBase; // jakiś double w fizyce
|
double *fDoubleBase; // jakiś double w fizyce
|
||||||
float *fFloatBase; // jakiś float w fizyce
|
float *fFloatBase; // jakiś float w fizyce
|
||||||
int *iIntBase; // jakiś int w fizyce
|
int *iIntBase; // jakiś int w fizyce
|
||||||
};
|
};
|
||||||
// void _fastcall Update(); //wskaźnik do funkcji aktualizacji animacji
|
// void _fastcall Update(); //wskaźnik do funkcji aktualizacji animacji
|
||||||
int iFlags; // flagi animacji
|
int iFlags; // flagi animacji
|
||||||
float fMaxDist; // do jakiej odległości wykonywana jest animacja
|
float fMaxDist; // do jakiej odległości wykonywana jest animacja
|
||||||
float fSpeed; // parametr szybkości animacji
|
float fSpeed; // parametr szybkości animacji
|
||||||
int iNumber; // numer kolejny obiektu
|
int iNumber; // numer kolejny obiektu
|
||||||
public:
|
public:
|
||||||
TAnim();
|
TAnim();
|
||||||
~TAnim();
|
~TAnim();
|
||||||
TUpdate yUpdate; // metoda TDynamicObject aktualizująca animację
|
TUpdate yUpdate; // metoda TDynamicObject aktualizująca animację
|
||||||
int TypeSet(int i, int fl = 0); // ustawienie typu
|
int TypeSet(int i, int fl = 0); // ustawienie typu
|
||||||
void Parovoz(); // wykonanie obliczeń animacji
|
void Parovoz(); // wykonanie obliczeń animacji
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
@@ -142,73 +142,73 @@ class TAnim
|
|||||||
|
|
||||||
class TDynamicObject
|
class TDynamicObject
|
||||||
{ // klasa pojazdu
|
{ // klasa pojazdu
|
||||||
private: // położenie pojazdu w świecie oraz parametry ruchu
|
private: // położenie pojazdu w świecie oraz parametry ruchu
|
||||||
vector3 vPosition; // Ra: pozycja pojazdu liczona zaraz po przesunięciu
|
vector3 vPosition; // Ra: pozycja pojazdu liczona zaraz po przesunięciu
|
||||||
vector3 vCoulpler[2]; // współrzędne sprzęgów do liczenia zderzeń czołowych
|
vector3 vCoulpler[2]; // współrzędne sprzęgów do liczenia zderzeń czołowych
|
||||||
vector3 vUp, vFront, vLeft; // wektory jednostkowe ustawienia pojazdu
|
vector3 vUp, vFront, vLeft; // wektory jednostkowe ustawienia pojazdu
|
||||||
int iDirection; // kierunek pojazdu względem czoła składu (1=zgodny,0=przeciwny)
|
int iDirection; // kierunek pojazdu względem czoła składu (1=zgodny,0=przeciwny)
|
||||||
TTrackShape ts; // parametry toru przekazywane do fizyki
|
TTrackShape ts; // parametry toru przekazywane do fizyki
|
||||||
TTrackParam tp; // parametry toru przekazywane do fizyki
|
TTrackParam tp; // parametry toru przekazywane do fizyki
|
||||||
TTrackFollower Axle0; // oś z przodu (od sprzęgu 0)
|
TTrackFollower Axle0; // oś z przodu (od sprzęgu 0)
|
||||||
TTrackFollower Axle1; // oś z tyłu (od sprzęgu 1)
|
TTrackFollower Axle1; // oś z tyłu (od sprzęgu 1)
|
||||||
int iAxleFirst; // numer pierwszej osi w kierunku ruchu (oś wiążąca pojazd z torem i wyzwalająca
|
int iAxleFirst; // numer pierwszej osi w kierunku ruchu (oś wiążąca pojazd z torem i wyzwalająca
|
||||||
// eventy)
|
// eventy)
|
||||||
float fAxleDist; // rozstaw wózków albo osi do liczenia proporcji zacienienia
|
float fAxleDist; // rozstaw wózków albo osi do liczenia proporcji zacienienia
|
||||||
vector3 modelRot; // obrot pudła względem świata - do przeanalizowania, czy potrzebne!!!
|
vector3 modelRot; // obrot pudła względem świata - do przeanalizowania, czy potrzebne!!!
|
||||||
// bool bCameraNear; //blisko kamer są potrzebne dodatkowe obliczenia szczegółów
|
// bool bCameraNear; //blisko kamer są potrzebne dodatkowe obliczenia szczegółów
|
||||||
TDynamicObject * ABuFindNearestObject(TTrack *Track, TDynamicObject *MyPointer,
|
TDynamicObject * ABuFindNearestObject(TTrack *Track, TDynamicObject *MyPointer,
|
||||||
int &CouplNr);
|
int &CouplNr);
|
||||||
|
|
||||||
public: // parametry położenia pojazdu dostępne publicznie
|
public: // parametry położenia pojazdu dostępne publicznie
|
||||||
std::string asTrack; // nazwa toru początkowego; wywalić?
|
std::string asTrack; // nazwa toru początkowego; wywalić?
|
||||||
std::string asDestination; // dokąd pojazd ma być kierowany "(stacja):(tor)"
|
std::string asDestination; // dokąd pojazd ma być kierowany "(stacja):(tor)"
|
||||||
matrix4x4 mMatrix; // macierz przekształcenia do renderowania modeli
|
matrix4x4 mMatrix; // macierz przekształcenia do renderowania modeli
|
||||||
TMoverParameters *MoverParameters; // parametry fizyki ruchu oraz przeliczanie
|
TMoverParameters *MoverParameters; // parametry fizyki ruchu oraz przeliczanie
|
||||||
// TMoverParameters *pControlled; //wskaźnik do sterowanego członu silnikowego
|
// TMoverParameters *pControlled; //wskaźnik do sterowanego członu silnikowego
|
||||||
TDynamicObject *NextConnected; // pojazd podłączony od strony sprzęgu 1 (kabina -1)
|
TDynamicObject *NextConnected; // pojazd podłączony od strony sprzęgu 1 (kabina -1)
|
||||||
TDynamicObject *PrevConnected; // pojazd podłączony od strony sprzęgu 0 (kabina 1)
|
TDynamicObject *PrevConnected; // pojazd podłączony od strony sprzęgu 0 (kabina 1)
|
||||||
int NextConnectedNo; // numer sprzęgu podłączonego z tyłu
|
int NextConnectedNo; // numer sprzęgu podłączonego z tyłu
|
||||||
int PrevConnectedNo; // numer sprzęgu podłączonego z przodu
|
int PrevConnectedNo; // numer sprzęgu podłączonego z przodu
|
||||||
double fScanDist; // odległość skanowania torów na obecność innych pojazdów
|
double fScanDist; // odległość skanowania torów na obecność innych pojazdów
|
||||||
|
|
||||||
public: // modele składowe pojazdu
|
public: // modele składowe pojazdu
|
||||||
TModel3d *mdModel; // model pudła
|
TModel3d *mdModel; // model pudła
|
||||||
TModel3d *mdLoad; // model zmiennego ładunku
|
TModel3d *mdLoad; // model zmiennego ładunku
|
||||||
TModel3d *mdPrzedsionek; // model przedsionków dla EZT - może użyć mdLoad zamiast?
|
TModel3d *mdPrzedsionek; // model przedsionków dla EZT - może użyć mdLoad zamiast?
|
||||||
TModel3d *mdKabina; // model kabiny dla użytkownika; McZapkie-030303: to z train.h
|
TModel3d *mdKabina; // model kabiny dla użytkownika; McZapkie-030303: to z train.h
|
||||||
TModel3d *mdLowPolyInt; // ABu 010305: wnetrze lowpoly
|
TModel3d *mdLowPolyInt; // ABu 010305: wnetrze lowpoly
|
||||||
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?)
|
||||||
|
|
||||||
private: // zmienne i metody do animacji submodeli; Ra: sprzatam animacje w pojeździe
|
private: // zmienne i metody do animacji submodeli; Ra: sprzatam animacje w pojeździe
|
||||||
public: // tymczasowo udostępnione do wyszukiwania drutu
|
public: // tymczasowo udostępnione do wyszukiwania drutu
|
||||||
int iAnimType[ANIM_TYPES]; // 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki
|
int iAnimType[ANIM_TYPES]; // 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki
|
||||||
private:
|
private:
|
||||||
int iAnimations; // liczba obiektów animujących
|
int iAnimations; // liczba obiektów animujących
|
||||||
TAnim *pAnimations; // obiekty animujące (zawierają wskaźnik do funkcji wykonującej animację)
|
TAnim *pAnimations; // obiekty animujące (zawierają wskaźnik do funkcji wykonującej animację)
|
||||||
TSubModel **
|
TSubModel **
|
||||||
pAnimated; // lista animowanych submodeli (może być ich więcej niż obiektów animujących)
|
pAnimated; // lista animowanych submodeli (może być ich więcej niż obiektów animujących)
|
||||||
double dWheelAngle[3]; // kąty obrotu kół: 0=przednie toczne, 1=napędzające i wiązary, 2=tylne
|
double dWheelAngle[3]; // kąty obrotu kół: 0=przednie toczne, 1=napędzające i wiązary, 2=tylne
|
||||||
// toczne
|
// toczne
|
||||||
void
|
void
|
||||||
UpdateNone(TAnim *pAnim){}; // animacja pusta (funkcje ustawiania submodeli, gdy blisko kamery)
|
UpdateNone(TAnim *pAnim){}; // animacja pusta (funkcje ustawiania submodeli, gdy blisko kamery)
|
||||||
void UpdateAxle(TAnim *pAnim); // animacja osi
|
void UpdateAxle(TAnim *pAnim); // animacja osi
|
||||||
void UpdateBoogie(TAnim *pAnim); // animacja wózka
|
void UpdateBoogie(TAnim *pAnim); // animacja wózka
|
||||||
void UpdateDoorTranslate(TAnim *pAnim); // animacja drzwi - przesuw
|
void UpdateDoorTranslate(TAnim *pAnim); // animacja drzwi - przesuw
|
||||||
void UpdateDoorRotate(TAnim *pAnim); // animacja drzwi - obrót
|
void UpdateDoorRotate(TAnim *pAnim); // animacja drzwi - obrót
|
||||||
void UpdateDoorFold(TAnim *pAnim); // animacja drzwi - składanie
|
void UpdateDoorFold(TAnim *pAnim); // animacja drzwi - składanie
|
||||||
void UpdateDoorPlug(TAnim *pAnim); // animacja drzwi - odskokowo-przesuwne
|
void UpdateDoorPlug(TAnim *pAnim); // animacja drzwi - odskokowo-przesuwne
|
||||||
void UpdatePant(TAnim *pAnim); // animacja pantografu
|
void UpdatePant(TAnim *pAnim); // animacja pantografu
|
||||||
void UpdateLeverDouble(TAnim *pAnim); // animacja gałki zależna od double
|
void UpdateLeverDouble(TAnim *pAnim); // animacja gałki zależna od double
|
||||||
void UpdateLeverFloat(TAnim *pAnim); // animacja gałki zależna od float
|
void UpdateLeverFloat(TAnim *pAnim); // animacja gałki zależna od float
|
||||||
void UpdateLeverInt(TAnim *pAnim); // animacja gałki zależna od int (wartość)
|
void UpdateLeverInt(TAnim *pAnim); // animacja gałki zależna od int (wartość)
|
||||||
void UpdateLeverEnum(TAnim *pAnim); // animacja gałki zależna od int (lista kątów)
|
void UpdateLeverEnum(TAnim *pAnim); // animacja gałki zależna od int (lista kątów)
|
||||||
private: // Ra: ciąg dalszy animacji, dopiero do ogarnięcia
|
private: // Ra: ciąg dalszy animacji, dopiero do ogarnięcia
|
||||||
// ABuWozki 060504
|
// ABuWozki 060504
|
||||||
vector3 bogieRot[2]; // Obroty wozkow w/m korpusu
|
vector3 bogieRot[2]; // Obroty wozkow w/m korpusu
|
||||||
TSubModel *smBogie[2]; // Wyszukiwanie max 2 wozkow
|
TSubModel *smBogie[2]; // Wyszukiwanie max 2 wozkow
|
||||||
TSubModel *smWahacze[4]; // wahacze (np. nogi, dźwignia w drezynie)
|
TSubModel *smWahacze[4]; // wahacze (np. nogi, dźwignia w drezynie)
|
||||||
TSubModel *smBrakeMode; // Ra 15-01: nastawa hamulca też
|
TSubModel *smBrakeMode; // Ra 15-01: nastawa hamulca też
|
||||||
TSubModel *smLoadMode; // Ra 15-01: nastawa próżny/ładowny
|
TSubModel *smLoadMode; // Ra 15-01: nastawa próżny/ładowny
|
||||||
double fWahaczeAmp;
|
double fWahaczeAmp;
|
||||||
// Winger 160204 - pantografy
|
// Winger 160204 - pantografy
|
||||||
double pantspeedfactor;
|
double pantspeedfactor;
|
||||||
@@ -216,16 +216,16 @@ class TDynamicObject
|
|||||||
TSubModel *smBuforLewy[2];
|
TSubModel *smBuforLewy[2];
|
||||||
TSubModel *smBuforPrawy[2];
|
TSubModel *smBuforPrawy[2];
|
||||||
TAnimValveGear *pValveGear;
|
TAnimValveGear *pValveGear;
|
||||||
vector3 vFloor; // podłoga dla ładunku
|
vector3 vFloor; // podłoga dla ładunku
|
||||||
public:
|
public:
|
||||||
TAnim *pants; // indeks obiektu animującego dla pantografu 0
|
TAnim *pants; // indeks obiektu animującego dla pantografu 0
|
||||||
double NoVoltTime; // czas od utraty zasilania
|
double NoVoltTime; // czas od utraty zasilania
|
||||||
double dDoorMoveL; // NBMX
|
double dDoorMoveL; // NBMX
|
||||||
double dDoorMoveR; // NBMX
|
double dDoorMoveR; // NBMX
|
||||||
TSubModel *smBrakeSet; // nastawa hamulca (wajcha)
|
TSubModel *smBrakeSet; // nastawa hamulca (wajcha)
|
||||||
TSubModel *smLoadSet; // nastawa ładunku (wajcha)
|
TSubModel *smLoadSet; // nastawa ładunku (wajcha)
|
||||||
TSubModel *smWiper; // wycieraczka (poniekąd też wajcha)
|
TSubModel *smWiper; // wycieraczka (poniekąd też wajcha)
|
||||||
// Ra: koneic animacji do ogarnięcia
|
// Ra: koneic animacji do ogarnięcia
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void ABuLittleUpdate(double ObjSqrDist);
|
void ABuLittleUpdate(double ObjSqrDist);
|
||||||
@@ -249,7 +249,7 @@ class TDynamicObject
|
|||||||
TButton btCCtrl2;
|
TButton btCCtrl2;
|
||||||
TButton btCPass1; // mostki przejsciowe
|
TButton btCPass1; // mostki przejsciowe
|
||||||
TButton btCPass2;
|
TButton btCPass2;
|
||||||
char cp1, sp1, cp2, sp2; // ustawienia węży
|
char cp1, sp1, cp2, sp2; // ustawienia węży
|
||||||
|
|
||||||
TButton btEndSignals11; // sygnalu konca pociagu
|
TButton btEndSignals11; // sygnalu konca pociagu
|
||||||
TButton btEndSignals13;
|
TButton btEndSignals13;
|
||||||
@@ -268,7 +268,7 @@ class TDynamicObject
|
|||||||
TButton btMechanik1;
|
TButton btMechanik1;
|
||||||
TButton btMechanik2;
|
TButton btMechanik2;
|
||||||
//TSubModel *smMechanik0; // Ra: mechanik wbudowany w model jako submodel?
|
//TSubModel *smMechanik0; // Ra: mechanik wbudowany w model jako submodel?
|
||||||
//TSubModel *smMechanik1; // mechanik od strony sprzęgu 1
|
//TSubModel *smMechanik1; // mechanik od strony sprzęgu 1
|
||||||
double enginevolume; // MC: pomocnicze zeby gladziej silnik buczal
|
double enginevolume; // MC: pomocnicze zeby gladziej silnik buczal
|
||||||
|
|
||||||
int iAxles; // McZapkie: to potem mozna skasowac i zastapic iNumAxles
|
int iAxles; // McZapkie: to potem mozna skasowac i zastapic iNumAxles
|
||||||
@@ -307,21 +307,21 @@ class TDynamicObject
|
|||||||
vector3 modelShake;
|
vector3 modelShake;
|
||||||
|
|
||||||
bool renderme; // yB - czy renderowac
|
bool renderme; // yB - czy renderowac
|
||||||
// TRealSound sBrakeAcc; //dźwięk przyspieszacza
|
// TRealSound sBrakeAcc; //dźwięk przyspieszacza
|
||||||
PSound sBrakeAcc;
|
PSound sBrakeAcc;
|
||||||
bool bBrakeAcc;
|
bool bBrakeAcc;
|
||||||
TRealSound rsUnbrake; // yB - odglos luzowania
|
TRealSound rsUnbrake; // yB - odglos luzowania
|
||||||
float ModCamRot;
|
float ModCamRot;
|
||||||
int iInventory; // flagi bitowe posiadanych submodeli (np. świateł)
|
int iInventory; // flagi bitowe posiadanych submodeli (np. świateł)
|
||||||
void TurnOff();
|
void TurnOff();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int iHornWarning; // numer syreny do użycia po otrzymaniu sygnału do jazdy
|
int iHornWarning; // numer syreny do użycia po otrzymaniu sygnału do jazdy
|
||||||
bool bEnabled; // Ra: wyjechał na portal i ma być usunięty
|
bool bEnabled; // Ra: wyjechał na portal i ma być usunięty
|
||||||
protected:
|
protected:
|
||||||
// TTrackFollower Axle2; //dwie osie z czterech (te są protected)
|
// TTrackFollower Axle2; //dwie osie z czterech (te są protected)
|
||||||
// TTrackFollower Axle3; //Ra: wyłączyłem, bo kąty są liczone w Segment.cpp
|
// TTrackFollower Axle3; //Ra: wyłączyłem, bo kąty są liczone w Segment.cpp
|
||||||
int iNumAxles; // ilość osi
|
int iNumAxles; // ilość osi
|
||||||
int CouplCounter;
|
int CouplCounter;
|
||||||
std::string asModel;
|
std::string asModel;
|
||||||
|
|
||||||
@@ -334,8 +334,8 @@ class TDynamicObject
|
|||||||
void ABuCheckMyTrack();
|
void ABuCheckMyTrack();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int *iLights; // wskaźnik na bity zapalonych świateł (własne albo innego członu)
|
int *iLights; // wskaźnik na bity zapalonych świateł (własne albo innego członu)
|
||||||
double fTrackBlock; // odległość do przeszkody do dalszego ruchu (wykrywanie kolizji z innym
|
double fTrackBlock; // odległość do przeszkody do dalszego ruchu (wykrywanie kolizji z innym
|
||||||
// pojazdem)
|
// pojazdem)
|
||||||
TDynamicObject * PrevAny();
|
TDynamicObject * PrevAny();
|
||||||
TDynamicObject * Prev();
|
TDynamicObject * Prev();
|
||||||
@@ -380,7 +380,7 @@ class TDynamicObject
|
|||||||
|
|
||||||
// McZapkie-010302
|
// McZapkie-010302
|
||||||
TController *Mechanik;
|
TController *Mechanik;
|
||||||
TController *ctOwner; // wskażnik na obiekt zarządzający składem
|
TController *ctOwner; // wskażnik na obiekt zarządzający składem
|
||||||
bool MechInside;
|
bool MechInside;
|
||||||
// McZapkie-270202
|
// McZapkie-270202
|
||||||
bool Controller;
|
bool Controller;
|
||||||
@@ -389,16 +389,16 @@ class TDynamicObject
|
|||||||
TTrack *MyTrack; // McZapkie-030303: tor na ktorym stoi, ABu
|
TTrack *MyTrack; // McZapkie-030303: tor na ktorym stoi, ABu
|
||||||
std::string asBaseDir;
|
std::string asBaseDir;
|
||||||
GLuint ReplacableSkinID[5]; // McZapkie:zmienialne nadwozie
|
GLuint ReplacableSkinID[5]; // McZapkie:zmienialne nadwozie
|
||||||
int iAlpha; // maska przezroczystości tekstur
|
int iAlpha; // maska przezroczystości tekstur
|
||||||
int iMultiTex; //<0 tekstury wskazane wpisem, >0 tekstury z przecinkami, =0 jedna
|
int iMultiTex; //<0 tekstury wskazane wpisem, >0 tekstury z przecinkami, =0 jedna
|
||||||
int iOverheadMask; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały
|
int iOverheadMask; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały
|
||||||
// jazdę bezprądową
|
// jazdę bezprądową
|
||||||
TTractionParam tmpTraction;
|
TTractionParam tmpTraction;
|
||||||
double fAdjustment; // korekcja - docelowo przenieść do TrkFoll.cpp wraz z odległością od
|
double fAdjustment; // korekcja - docelowo przenieść do TrkFoll.cpp wraz z odległością od
|
||||||
// poprzedniego
|
// poprzedniego
|
||||||
TDynamicObject();
|
TDynamicObject();
|
||||||
~TDynamicObject();
|
~TDynamicObject();
|
||||||
double TDynamicObject::Init( // zwraca długość pojazdu albo 0, jeśli błąd
|
double TDynamicObject::Init( // zwraca długość pojazdu albo 0, jeśli błąd
|
||||||
std::string Name, std::string BaseDir, std::string asReplacableSkin, std::string Type_Name,
|
std::string Name, std::string BaseDir, std::string asReplacableSkin, std::string Type_Name,
|
||||||
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);
|
||||||
@@ -419,11 +419,11 @@ class TDynamicObject
|
|||||||
inline vector3 HeadPosition()
|
inline vector3 HeadPosition()
|
||||||
{
|
{
|
||||||
return vCoulpler[iDirection ^ 1];
|
return vCoulpler[iDirection ^ 1];
|
||||||
}; // pobranie współrzędnych czoła
|
}; // pobranie współrzędnych czoła
|
||||||
inline vector3 RearPosition()
|
inline vector3 RearPosition()
|
||||||
{
|
{
|
||||||
return vCoulpler[iDirection];
|
return vCoulpler[iDirection];
|
||||||
}; // pobranie współrzędnych tyłu
|
}; // pobranie współrzędnych tyłu
|
||||||
inline vector3 AxlePositionGet()
|
inline vector3 AxlePositionGet()
|
||||||
{
|
{
|
||||||
return iAxleFirst ? Axle1.pPosition : Axle0.pPosition;
|
return iAxleFirst ? Axle1.pPosition : Axle0.pPosition;
|
||||||
@@ -470,19 +470,19 @@ class TDynamicObject
|
|||||||
return (Axle1.GetTrack() == MyTrack ? Axle1.GetDirection() : Axle0.GetDirection());
|
return (Axle1.GetTrack() == MyTrack ? Axle1.GetDirection() : Axle0.GetDirection());
|
||||||
};
|
};
|
||||||
// inline double ABuGetTranslation() //ABu.
|
// inline double ABuGetTranslation() //ABu.
|
||||||
// {//zwraca przesunięcie wózka względem Point1 toru
|
// {//zwraca przesunięcie wózka względem Point1 toru
|
||||||
// return (Axle1.GetTrack()==MyTrack?Axle1.GetTranslation():Axle0.GetTranslation());
|
// return (Axle1.GetTrack()==MyTrack?Axle1.GetTranslation():Axle0.GetTranslation());
|
||||||
// };
|
// };
|
||||||
inline double RaDirectionGet()
|
inline double RaDirectionGet()
|
||||||
{ // zwraca kierunek pojazdu na torze z aktywną osą
|
{ // zwraca kierunek pojazdu na torze z aktywną osą
|
||||||
return iAxleFirst ? Axle1.GetDirection() : Axle0.GetDirection();
|
return iAxleFirst ? Axle1.GetDirection() : Axle0.GetDirection();
|
||||||
};
|
};
|
||||||
inline double RaTranslationGet()
|
inline double RaTranslationGet()
|
||||||
{ // zwraca przesunięcie wózka względem Point1 toru z aktywną osią
|
{ // zwraca przesunięcie wózka względem Point1 toru z aktywną osią
|
||||||
return iAxleFirst ? Axle1.GetTranslation() : Axle0.GetTranslation();
|
return iAxleFirst ? Axle1.GetTranslation() : Axle0.GetTranslation();
|
||||||
};
|
};
|
||||||
inline TTrack * RaTrackGet()
|
inline TTrack * RaTrackGet()
|
||||||
{ // zwraca tor z aktywną osią
|
{ // zwraca tor z aktywną osią
|
||||||
return iAxleFirst ? Axle1.GetTrack() : Axle0.GetTrack();
|
return iAxleFirst ? Axle1.GetTrack() : Axle0.GetTrack();
|
||||||
};
|
};
|
||||||
void CouplersDettach(double MinDist, int MyScanDir);
|
void CouplersDettach(double MinDist, int MyScanDir);
|
||||||
@@ -492,19 +492,19 @@ class TDynamicObject
|
|||||||
// void RaAxleEvent(TEvent *e);
|
// void RaAxleEvent(TEvent *e);
|
||||||
TDynamicObject * FirstFind(int &coupler_nr, int cf = 1);
|
TDynamicObject * FirstFind(int &coupler_nr, int cf = 1);
|
||||||
float GetEPP(); // wyliczanie sredniego cisnienia w PG
|
float GetEPP(); // wyliczanie sredniego cisnienia w PG
|
||||||
int DirectionSet(int d); // ustawienie kierunku w składzie
|
int DirectionSet(int d); // ustawienie kierunku w składzie
|
||||||
int DirectionGet()
|
int DirectionGet()
|
||||||
{
|
{
|
||||||
return iDirection + iDirection - 1;
|
return iDirection + iDirection - 1;
|
||||||
}; // odczyt kierunku w składzie
|
}; // odczyt kierunku w składzie
|
||||||
int DettachStatus(int dir);
|
int DettachStatus(int dir);
|
||||||
int Dettach(int dir);
|
int Dettach(int dir);
|
||||||
TDynamicObject * Neightbour(int &dir);
|
TDynamicObject * Neightbour(int &dir);
|
||||||
void CoupleDist();
|
void CoupleDist();
|
||||||
TDynamicObject * ControlledFind();
|
TDynamicObject * ControlledFind();
|
||||||
void ParamSet(int what, int into);
|
void ParamSet(int what, int into);
|
||||||
int RouteWish(TTrack *tr); // zapytanie do AI, po którym segmencie skrzyżowania
|
int RouteWish(TTrack *tr); // zapytanie do AI, po którym segmencie skrzyżowania
|
||||||
// jechać
|
// jechać
|
||||||
void DestinationSet(std::string to, std::string numer);
|
void DestinationSet(std::string to, std::string numer);
|
||||||
std::string TextureTest(std::string const &name);
|
std::string TextureTest(std::string const &name);
|
||||||
void OverheadTrack(float o);
|
void OverheadTrack(float o);
|
||||||
|
|||||||
52
EvLaunch.cpp
52
EvLaunch.cpp
@@ -31,13 +31,13 @@ using namespace Mtable;
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
TEventLauncher::TEventLauncher()
|
TEventLauncher::TEventLauncher()
|
||||||
{ // ustawienie pocz¹tkowych wartoœci dla wszystkich zmiennych
|
{ // ustawienie początkowych wartości dla wszystkich zmiennych
|
||||||
iKey = 0;
|
iKey = 0;
|
||||||
DeltaTime = -1;
|
DeltaTime = -1;
|
||||||
UpdatedTime = 0;
|
UpdatedTime = 0;
|
||||||
fVal1 = fVal2 = 0;
|
fVal1 = fVal2 = 0;
|
||||||
szText = NULL;
|
szText = NULL;
|
||||||
iHour = iMinute = -1; // takiego czasu nigdy nie bêdzie
|
iHour = iMinute = -1; // takiego czasu nigdy nie będzie
|
||||||
dRadius = 0;
|
dRadius = 0;
|
||||||
Event1 = Event2 = NULL;
|
Event1 = Event2 = NULL;
|
||||||
MemCell = NULL;
|
MemCell = NULL;
|
||||||
@@ -54,32 +54,32 @@ void TEventLauncher::Init()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool TEventLauncher::Load(cParser *parser)
|
bool TEventLauncher::Load(cParser *parser)
|
||||||
{ // wczytanie wyzwalacza zdarzeñ
|
{ // wczytanie wyzwalacza zdarzeń
|
||||||
std::string token;
|
std::string token;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> dRadius; // promieñ dzia³ania
|
*parser >> dRadius; // promień działania
|
||||||
if (dRadius > 0.0)
|
if (dRadius > 0.0)
|
||||||
dRadius *= dRadius; // do kwadratu, pod warunkiem, ¿e nie jest ujemne
|
dRadius *= dRadius; // do kwadratu, pod warunkiem, że nie jest ujemne
|
||||||
parser->getTokens(); // klawisz steruj¹cy
|
parser->getTokens(); // klawisz sterujący
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
if (token != "none")
|
if (token != "none")
|
||||||
{
|
{
|
||||||
if (token.length() == 1)
|
if (token.length() == 1)
|
||||||
iKey = VkKeyScan(token[1]); // jeden znak jest konwertowany na kod klawisza
|
iKey = VkKeyScan(token[1]); // jeden znak jest konwertowany na kod klawisza
|
||||||
else
|
else
|
||||||
iKey = stol_def(token,0); // a jak wiêcej, to jakby numer klawisza jest
|
iKey = stol_def(token,0); // a jak więcej, to jakby numer klawisza jest
|
||||||
}
|
}
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> DeltaTime;
|
*parser >> DeltaTime;
|
||||||
if (DeltaTime < 0)
|
if (DeltaTime < 0)
|
||||||
DeltaTime = -DeltaTime; // dla ujemnego zmieniamy na dodatni
|
DeltaTime = -DeltaTime; // dla ujemnego zmieniamy na dodatni
|
||||||
else if (DeltaTime > 0)
|
else if (DeltaTime > 0)
|
||||||
{ // wartoœæ dodatnia oznacza wyzwalanie o okreœlonej godzinie
|
{ // wartość dodatnia oznacza wyzwalanie o określonej godzinie
|
||||||
iMinute = int(DeltaTime) % 100; // minuty s¹ najm³odszymi cyframi dziesietnymi
|
iMinute = int(DeltaTime) % 100; // minuty są najmłodszymi cyframi dziesietnymi
|
||||||
iHour = int(DeltaTime - iMinute) / 100; // godzina to setki
|
iHour = int(DeltaTime - iMinute) / 100; // godzina to setki
|
||||||
DeltaTime = 0; // bez powtórzeñ
|
DeltaTime = 0; // bez powtórzeń
|
||||||
WriteLog("EventLauncher at " + std::to_string(iHour) + ":" +
|
WriteLog("EventLauncher at " + std::to_string(iHour) + ":" +
|
||||||
std::to_string(iMinute)); // wyœwietlenie czasu
|
std::to_string(iMinute)); // wyświetlenie czasu
|
||||||
}
|
}
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
@@ -88,18 +88,18 @@ bool TEventLauncher::Load(cParser *parser)
|
|||||||
*parser >> token;
|
*parser >> token;
|
||||||
asEvent2Name = token; // drugi event
|
asEvent2Name = token; // drugi event
|
||||||
if ((asEvent2Name == "end") || (asEvent2Name == "condition"))
|
if ((asEvent2Name == "end") || (asEvent2Name == "condition"))
|
||||||
{ // drugiego eventu mo¿e nie byæ, bo s¹ z tym problemy, ale ciii...
|
{ // drugiego eventu może nie być, bo są z tym problemy, ale ciii...
|
||||||
token = asEvent2Name; // rozpoznane s³owo idzie do dalszego przetwarzania
|
token = asEvent2Name; // rozpoznane słowo idzie do dalszego przetwarzania
|
||||||
asEvent2Name = "none"; // a drugiego eventu nie ma
|
asEvent2Name = "none"; // a drugiego eventu nie ma
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // gdy s¹ dwa eventy
|
{ // gdy są dwa eventy
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
//str = AnsiString(token.c_str());
|
//str = AnsiString(token.c_str());
|
||||||
}
|
}
|
||||||
if (token == "condition")
|
if (token == "condition")
|
||||||
{ // obs³uga wyzwalania warunkowego
|
{ // obsługa wyzwalania warunkowego
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
asMemCellName = token;
|
asMemCellName = token;
|
||||||
@@ -108,11 +108,11 @@ bool TEventLauncher::Load(cParser *parser)
|
|||||||
SafeDeleteArray(szText);
|
SafeDeleteArray(szText);
|
||||||
szText = new char[256];
|
szText = new char[256];
|
||||||
strcpy(szText, token.c_str());
|
strcpy(szText, token.c_str());
|
||||||
if (token.compare("*") != 0) //*=nie braæ command pod uwagê
|
if (token.compare("*") != 0) //*=nie brać command pod uwagę
|
||||||
iCheckMask |= conditional_memstring;
|
iCheckMask |= conditional_memstring;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
if (token.compare("*") != 0) //*=nie braæ wartoœci 1. pod uwagê
|
if (token.compare("*") != 0) //*=nie brać wartości 1. pod uwagę
|
||||||
{
|
{
|
||||||
iCheckMask |= conditional_memval1;
|
iCheckMask |= conditional_memval1;
|
||||||
//str = AnsiString(token.c_str());
|
//str = AnsiString(token.c_str());
|
||||||
@@ -122,7 +122,7 @@ bool TEventLauncher::Load(cParser *parser)
|
|||||||
fVal1 = 0;
|
fVal1 = 0;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
if (token.compare("*") != 0) //*=nie braæ wartoœci 2. pod uwagê
|
if (token.compare("*") != 0) //*=nie brać wartości 2. pod uwagę
|
||||||
{
|
{
|
||||||
iCheckMask |= conditional_memval2;
|
iCheckMask |= conditional_memval2;
|
||||||
//str = AnsiString(token.c_str());
|
//str = AnsiString(token.c_str());
|
||||||
@@ -130,7 +130,7 @@ bool TEventLauncher::Load(cParser *parser)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
fVal2 = 0;
|
fVal2 = 0;
|
||||||
parser->getTokens(); // s³owo zamykaj¹ce
|
parser->getTokens(); // słowo zamykające
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -141,8 +141,8 @@ bool TEventLauncher::Render()
|
|||||||
bool bCond = false;
|
bool bCond = false;
|
||||||
if (iKey != 0)
|
if (iKey != 0)
|
||||||
{
|
{
|
||||||
if (Global::bActive) // tylko jeœli okno jest aktywne
|
if (Global::bActive) // tylko jeśli okno jest aktywne
|
||||||
bCond = (Console::Pressed(iKey)); // czy klawisz wciœniêty
|
bCond = (Console::Pressed(iKey)); // czy klawisz wciśnięty
|
||||||
}
|
}
|
||||||
if (DeltaTime > 0)
|
if (DeltaTime > 0)
|
||||||
{
|
{
|
||||||
@@ -155,11 +155,11 @@ bool TEventLauncher::Render()
|
|||||||
UpdatedTime += Timer::GetDeltaTime(); // aktualizacja naliczania czasu
|
UpdatedTime += Timer::GetDeltaTime(); // aktualizacja naliczania czasu
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // jeœli nie cykliczny, to sprawdziæ czas
|
{ // jeśli nie cykliczny, to sprawdzić czas
|
||||||
if (GlobalTime->hh == iHour)
|
if (GlobalTime->hh == iHour)
|
||||||
{
|
{
|
||||||
if (GlobalTime->mm == iMinute)
|
if (GlobalTime->mm == iMinute)
|
||||||
{ // zgodnoϾ czasu uruchomienia
|
{ // zgodność czasu uruchomienia
|
||||||
if (UpdatedTime < 10)
|
if (UpdatedTime < 10)
|
||||||
{
|
{
|
||||||
UpdatedTime = 20; // czas do kolejnego wyzwolenia?
|
UpdatedTime = 20; // czas do kolejnego wyzwolenia?
|
||||||
@@ -170,9 +170,9 @@ bool TEventLauncher::Render()
|
|||||||
else
|
else
|
||||||
UpdatedTime = 1;
|
UpdatedTime = 1;
|
||||||
}
|
}
|
||||||
if (bCond) // jeœli spe³niony zosta³ warunek
|
if (bCond) // jeśli spełniony został warunek
|
||||||
{
|
{
|
||||||
if ((iCheckMask != 0) && MemCell) // sprawdzanie warunku na komórce pamiêci
|
if ((iCheckMask != 0) && MemCell) // sprawdzanie warunku na komórce pamięci
|
||||||
bCond = MemCell->Compare(szText, fVal1, fVal2, iCheckMask);
|
bCond = MemCell->Compare(szText, fVal1, fVal2, iCheckMask);
|
||||||
}
|
}
|
||||||
return bCond; // sprawdzanie dRadius w Ground.cpp
|
return bCond; // sprawdzanie dRadius w Ground.cpp
|
||||||
@@ -183,7 +183,7 @@ bool TEventLauncher::IsGlobal()
|
|||||||
if (DeltaTime == 0)
|
if (DeltaTime == 0)
|
||||||
if (iHour >= 0)
|
if (iHour >= 0)
|
||||||
if (iMinute >= 0)
|
if (iMinute >= 0)
|
||||||
if (dRadius < 0.0) // bez ograniczenia zasiêgu
|
if (dRadius < 0.0) // bez ograniczenia zasięgu
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|||||||
166
Event.cpp
166
Event.cpp
@@ -26,57 +26,57 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
|
|
||||||
TEvent::TEvent(string m)
|
TEvent::TEvent(string m)
|
||||||
{
|
{
|
||||||
// asName=""; //czy nazwa eventu jest niezbêdna w tym przypadku? chyba nie
|
// asName=""; //czy nazwa eventu jest niezbędna w tym przypadku? chyba nie
|
||||||
evNext = evNext2 = NULL;
|
evNext = evNext2 = NULL;
|
||||||
bEnabled = false; // false dla eventów u¿ywanych do skanowania sygna³ów (nie dodawane do
|
bEnabled = false; // false dla eventów używanych do skanowania sygnałów (nie dodawane do
|
||||||
// kolejki)
|
// kolejki)
|
||||||
asNodeName = m; // nazwa obiektu powi¹zanego
|
asNodeName = m; // nazwa obiektu powiązanego
|
||||||
iQueued = 0; // nie zosta³ dodany do kolejki
|
iQueued = 0; // nie został dodany do kolejki
|
||||||
// bIsHistory=false;
|
// bIsHistory=false;
|
||||||
fDelay = 0;
|
fDelay = 0;
|
||||||
fStartTime = 0; // 0 nie ma sensu
|
fStartTime = 0; // 0 nie ma sensu
|
||||||
Type = m.empty() ? tp_Unknown :
|
Type = m.empty() ? tp_Unknown :
|
||||||
tp_GetValues; // utworzenie niejawnego odczytu komórki pamiêci w torze
|
tp_GetValues; // utworzenie niejawnego odczytu komórki pamięci w torze
|
||||||
for (int i = 0; i < 13; i++)
|
for (int i = 0; i < 13; i++)
|
||||||
Params[i].asPointer = NULL;
|
Params[i].asPointer = NULL;
|
||||||
evJoined = NULL; // nie ma kolejnego z t¹ sam¹ nazw¹, usuwane s¹ wg listy Next2
|
evJoined = NULL; // nie ma kolejnego z tą samą nazwą, usuwane są wg listy Next2
|
||||||
Activator = NULL;
|
Activator = NULL;
|
||||||
iFlags = 0;
|
iFlags = 0;
|
||||||
// event niejawny jest tworzony przed faz¹ InitEvents, która podmienia nazwê komórki pamiêci na
|
// event niejawny jest tworzony przed fazą InitEvents, która podmienia nazwę komórki pamięci na
|
||||||
// wskaŸnik
|
// wskaźnik
|
||||||
// Current->Params[8].asGroundNode=m; //to siê ustawi w InitEvents
|
// Current->Params[8].asGroundNode=m; //to się ustawi w InitEvents
|
||||||
// Current->Params[9].asMemCell=m->MemCell;
|
// Current->Params[9].asMemCell=m->MemCell;
|
||||||
fRandomDelay = 0.0; // standardowo nie bêdzie dodatkowego losowego opóŸnienia
|
fRandomDelay = 0.0; // standardowo nie będzie dodatkowego losowego opóźnienia
|
||||||
};
|
};
|
||||||
|
|
||||||
TEvent::~TEvent()
|
TEvent::~TEvent()
|
||||||
{
|
{
|
||||||
switch (Type)
|
switch (Type)
|
||||||
{ // sprz¹tanie
|
{ // sprzątanie
|
||||||
case tp_Multiple:
|
case tp_Multiple:
|
||||||
// SafeDeleteArray(Params[9].asText); //nie usuwaæ - nazwa obiektu powi¹zanego zamieniana na
|
// SafeDeleteArray(Params[9].asText); //nie usuwać - nazwa obiektu powiązanego zamieniana na
|
||||||
// wskaŸnik
|
// wskaźnik
|
||||||
if (iFlags & conditional_memstring) // o ile jest ³añcuch do porównania w memcompare
|
if (iFlags & conditional_memstring) // o ile jest łańcuch do porównania w memcompare
|
||||||
SafeDeleteArray(Params[10].asText);
|
SafeDeleteArray(Params[10].asText);
|
||||||
break;
|
break;
|
||||||
case tp_UpdateValues:
|
case tp_UpdateValues:
|
||||||
case tp_AddValues:
|
case tp_AddValues:
|
||||||
SafeDeleteArray(Params[0].asText);
|
SafeDeleteArray(Params[0].asText);
|
||||||
if (iFlags & conditional_memstring) // o ile jest ³añcuch do porównania w memcompare
|
if (iFlags & conditional_memstring) // o ile jest łańcuch do porównania w memcompare
|
||||||
SafeDeleteArray(Params[10].asText);
|
SafeDeleteArray(Params[10].asText);
|
||||||
break;
|
break;
|
||||||
case tp_Animation: // nic
|
case tp_Animation: // nic
|
||||||
// SafeDeleteArray(Params[9].asText); //nie usuwaæ - nazwa jest zamieniana na wskaŸnik do
|
// SafeDeleteArray(Params[9].asText); //nie usuwać - nazwa jest zamieniana na wskaźnik do
|
||||||
// submodelu
|
// submodelu
|
||||||
if (Params[0].asInt == 4) // jeœli z pliku VMD
|
if (Params[0].asInt == 4) // jeśli z pliku VMD
|
||||||
delete[] Params[8].asPointer; // zwolniæ obszar
|
delete[] Params[8].asPointer; // zwolnić obszar
|
||||||
case tp_GetValues: // nic
|
case tp_GetValues: // nic
|
||||||
break;
|
break;
|
||||||
case tp_PutValues: // params[0].astext stores the token
|
case tp_PutValues: // params[0].astext stores the token
|
||||||
SafeDeleteArray( Params[ 0 ].asText );
|
SafeDeleteArray( Params[ 0 ].asText );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
evJoined = NULL; // nie usuwaæ podczepionych tutaj
|
evJoined = NULL; // nie usuwać podczepionych tutaj
|
||||||
};
|
};
|
||||||
|
|
||||||
void TEvent::Init(){
|
void TEvent::Init(){
|
||||||
@@ -84,15 +84,15 @@ void TEvent::Init(){
|
|||||||
};
|
};
|
||||||
|
|
||||||
void TEvent::Conditions(cParser *parser, string s)
|
void TEvent::Conditions(cParser *parser, string s)
|
||||||
{ // przetwarzanie warunków, wspólne dla Multiple i UpdateValues
|
{ // przetwarzanie warunków, wspólne dla Multiple i UpdateValues
|
||||||
if (s == "condition")
|
if (s == "condition")
|
||||||
{ // jesli nie "endevent"
|
{ // jesli nie "endevent"
|
||||||
std::string token, str;
|
std::string token, str;
|
||||||
if (!asNodeName.empty())
|
if (!asNodeName.empty())
|
||||||
{ // podczepienie ³añcucha, jeœli nie jest pusty
|
{ // podczepienie łańcucha, jeśli nie jest pusty
|
||||||
// BUG: source of a memory leak -- the array never gets deleted. fix the destructor
|
// BUG: source of a memory leak -- the array never gets deleted. fix the destructor
|
||||||
Params[9].asText = new char[asNodeName.length() + 1]; // usuwane i zamieniane na
|
Params[9].asText = new char[asNodeName.length() + 1]; // usuwane i zamieniane na
|
||||||
// wskaŸnik
|
// wskaźnik
|
||||||
strcpy(Params[9].asText, asNodeName.c_str());
|
strcpy(Params[9].asText, asNodeName.c_str());
|
||||||
}
|
}
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
@@ -115,7 +115,7 @@ void TEvent::Conditions(cParser *parser, string s)
|
|||||||
*parser >> token;
|
*parser >> token;
|
||||||
str = token;
|
str = token;
|
||||||
if (str != "*") //"*" - nie brac command pod uwage
|
if (str != "*") //"*" - nie brac command pod uwage
|
||||||
{ // zapamiêtanie ³añcucha do porównania
|
{ // zapamiętanie łańcucha do porównania
|
||||||
Params[10].asText = new char[255];
|
Params[10].asText = new char[255];
|
||||||
strcpy(Params[10].asText, str.c_str());
|
strcpy(Params[10].asText, str.c_str());
|
||||||
iFlags |= conditional_memstring;
|
iFlags |= conditional_memstring;
|
||||||
@@ -139,10 +139,10 @@ void TEvent::Conditions(cParser *parser, string s)
|
|||||||
}
|
}
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
s = token; // ewentualnie dalej losowe opóŸnienie
|
s = token; // ewentualnie dalej losowe opóźnienie
|
||||||
}
|
}
|
||||||
if (s == "randomdelay")
|
if (s == "randomdelay")
|
||||||
{ // losowe opóŸnienie
|
{ // losowe opóźnienie
|
||||||
std::string token;
|
std::string token;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> fRandomDelay; // Ra 2014-03-11
|
*parser >> fRandomDelay; // Ra 2014-03-11
|
||||||
@@ -160,11 +160,11 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
//string str;
|
//string str;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
bEnabled = true; // zmieniane na false dla eventów u¿ywanych do skanowania sygna³ów
|
bEnabled = true; // zmieniane na false dla eventów używanych do skanowania sygnałów
|
||||||
|
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
asName = ToLower(token); // u¿ycie parametrów mo¿e dawaæ wielkie
|
asName = ToLower(token); // użycie parametrów może dawać wielkie
|
||||||
|
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
@@ -189,7 +189,7 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
else if (token == "lights")
|
else if (token == "lights")
|
||||||
Type = tp_Lights;
|
Type = tp_Lights;
|
||||||
else if (token == "visible")
|
else if (token == "visible")
|
||||||
Type = tp_Visible; // zmiana wyœwietlania obiektu
|
Type = tp_Visible; // zmiana wyświetlania obiektu
|
||||||
else if (token == "switch")
|
else if (token == "switch")
|
||||||
Type = tp_Switch;
|
Type = tp_Switch;
|
||||||
else if (token == "dynvel")
|
else if (token == "dynvel")
|
||||||
@@ -207,9 +207,9 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
else if (token == "logvalues")
|
else if (token == "logvalues")
|
||||||
Type = tp_LogValues;
|
Type = tp_LogValues;
|
||||||
else if (token == "voltage")
|
else if (token == "voltage")
|
||||||
Type = tp_Voltage; // zmiana napiêcia w zasilaczu (TractionPowerSource)
|
Type = tp_Voltage; // zmiana napięcia w zasilaczu (TractionPowerSource)
|
||||||
else if (token == "message")
|
else if (token == "message")
|
||||||
Type = tp_Message; // wyœwietlenie komunikatu
|
Type = tp_Message; // wyświetlenie komunikatu
|
||||||
else if (token == "friction")
|
else if (token == "friction")
|
||||||
Type = tp_Friction; // zmiana tarcia na scenerii
|
Type = tp_Friction; // zmiana tarcia na scenerii
|
||||||
else
|
else
|
||||||
@@ -223,28 +223,28 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
// str = AnsiString(token.c_str());
|
// str = AnsiString(token.c_str());
|
||||||
|
|
||||||
if (token != "none")
|
if (token != "none")
|
||||||
asNodeName = token; // nazwa obiektu powi¹zanego
|
asNodeName = token; // nazwa obiektu powiązanego
|
||||||
|
|
||||||
if (asName.substr(0, 5) == "none_")
|
if (asName.substr(0, 5) == "none_")
|
||||||
Type = tp_Ignored; // Ra: takie s¹ ignorowane
|
Type = tp_Ignored; // Ra: takie są ignorowane
|
||||||
|
|
||||||
switch (Type)
|
switch (Type)
|
||||||
{
|
{
|
||||||
case tp_AddValues:
|
case tp_AddValues:
|
||||||
iFlags = update_memadd; // dodawanko
|
iFlags = update_memadd; // dodawanko
|
||||||
case tp_UpdateValues:
|
case tp_UpdateValues:
|
||||||
// if (Type==tp_UpdateValues) iFlags=0; //co modyfikowaæ
|
// if (Type==tp_UpdateValues) iFlags=0; //co modyfikować
|
||||||
parser->getTokens(1, false); // case sensitive
|
parser->getTokens(1, false); // case sensitive
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
// str = AnsiString(token.c_str());
|
// str = AnsiString(token.c_str());
|
||||||
Params[0].asText = new char[token.length() + 1];
|
Params[0].asText = new char[token.length() + 1];
|
||||||
strcpy(Params[0].asText, token.c_str());
|
strcpy(Params[0].asText, token.c_str());
|
||||||
if (token != "*") // czy ma zostaæ bez zmian?
|
if (token != "*") // czy ma zostać bez zmian?
|
||||||
iFlags |= update_memstring;
|
iFlags |= update_memstring;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
// str = AnsiString(token.c_str());
|
// str = AnsiString(token.c_str());
|
||||||
if (token != "*") // czy ma zostaæ bez zmian?
|
if (token != "*") // czy ma zostać bez zmian?
|
||||||
{
|
{
|
||||||
Params[1].asdouble = atof(token.c_str());
|
Params[1].asdouble = atof(token.c_str());
|
||||||
iFlags |= update_memval1;
|
iFlags |= update_memval1;
|
||||||
@@ -254,7 +254,7 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
// str = AnsiString(token.c_str());
|
// str = AnsiString(token.c_str());
|
||||||
if (token != "*") // czy ma zostaæ bez zmian?
|
if (token != "*") // czy ma zostać bez zmian?
|
||||||
{
|
{
|
||||||
Params[2].asdouble = atof(token.c_str());
|
Params[2].asdouble = atof(token.c_str());
|
||||||
iFlags |= update_memval2;
|
iFlags |= update_memval2;
|
||||||
@@ -263,23 +263,23 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
Params[2].asdouble = 0;
|
Params[2].asdouble = 0;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
Conditions(parser, token); // sprawdzanie warunków
|
Conditions(parser, token); // sprawdzanie warunków
|
||||||
break;
|
break;
|
||||||
case tp_CopyValues:
|
case tp_CopyValues:
|
||||||
Params[9].asText = NULL;
|
Params[9].asText = NULL;
|
||||||
iFlags = update_memstring | update_memval1 | update_memval2; // normalanie trzy
|
iFlags = update_memstring | update_memval1 | update_memval2; // normalanie trzy
|
||||||
i = 0;
|
i = 0;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token; // nazwa drugiej komórki (Ÿród³owej)
|
*parser >> token; // nazwa drugiej komórki (źródłowej)
|
||||||
while (token.compare("endevent") != 0)
|
while (token.compare("endevent") != 0)
|
||||||
{
|
{
|
||||||
switch (++i)
|
switch (++i)
|
||||||
{ // znaczenie kolejnych parametrów
|
{ // znaczenie kolejnych parametrów
|
||||||
case 1: // nazwa drugiej komórki (Ÿród³owej)
|
case 1: // nazwa drugiej komórki (źródłowej)
|
||||||
Params[9].asText = new char[token.length() + 1]; // usuwane i zamieniane na wskaŸnik
|
Params[9].asText = new char[token.length() + 1]; // usuwane i zamieniane na wskaźnik
|
||||||
strcpy(Params[9].asText, token.c_str());
|
strcpy(Params[9].asText, token.c_str());
|
||||||
break;
|
break;
|
||||||
case 2: // maska wartoœci
|
case 2: // maska wartości
|
||||||
iFlags = stol_def(token,
|
iFlags = stol_def(token,
|
||||||
(update_memstring | update_memval1 | update_memval2));
|
(update_memstring | update_memval1 | update_memval2));
|
||||||
break;
|
break;
|
||||||
@@ -292,12 +292,12 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
iFlags = update_memstring | update_memval1 | update_memval2; // normalanie trzy
|
iFlags = update_memstring | update_memval1 | update_memval2; // normalanie trzy
|
||||||
i = 0;
|
i = 0;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token; // nazwa drugiej komórki (Ÿród³owej)
|
*parser >> token; // nazwa drugiej komórki (źródłowej)
|
||||||
while (token.compare("endevent") != 0)
|
while (token.compare("endevent") != 0)
|
||||||
{
|
{
|
||||||
switch (++i)
|
switch (++i)
|
||||||
{ // znaczenie kolejnych parametrów
|
{ // znaczenie kolejnych parametrów
|
||||||
case 1: // maska wartoœci
|
case 1: // maska wartości
|
||||||
iFlags = stol_def(token,
|
iFlags = stol_def(token,
|
||||||
(update_memstring | update_memval1 | update_memval2));
|
(update_memstring | update_memval1 | update_memval2));
|
||||||
break;
|
break;
|
||||||
@@ -313,12 +313,12 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
break;
|
break;
|
||||||
case tp_PutValues:
|
case tp_PutValues:
|
||||||
parser->getTokens(3);
|
parser->getTokens(3);
|
||||||
*parser >> Params[3].asdouble >> Params[4].asdouble >> Params[5].asdouble; // po³o¿enie
|
*parser >> Params[3].asdouble >> Params[4].asdouble >> Params[5].asdouble; // położenie
|
||||||
// X,Y,Z
|
// X,Y,Z
|
||||||
if (org)
|
if (org)
|
||||||
{ // przesuniêcie
|
{ // przesunięcie
|
||||||
// tmp->pCenter.RotateY(aRotate.y/180.0*M_PI); //Ra 2014-11: uwzglêdnienie rotacji
|
// tmp->pCenter.RotateY(aRotate.y/180.0*M_PI); //Ra 2014-11: uwzględnienie rotacji
|
||||||
Params[3].asdouble += org->x; // wspó³rzêdne w scenerii
|
Params[3].asdouble += org->x; // współrzędne w scenerii
|
||||||
Params[4].asdouble += org->y;
|
Params[4].asdouble += org->y;
|
||||||
Params[5].asdouble += org->z;
|
Params[5].asdouble += org->z;
|
||||||
}
|
}
|
||||||
@@ -329,9 +329,9 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
if (token.substr(0, 19) == "PassengerStopPoint:")
|
if (token.substr(0, 19) == "PassengerStopPoint:")
|
||||||
{
|
{
|
||||||
if (token.find("#"))
|
if (token.find("#"))
|
||||||
token = token.substr(0, token.find("#") - 1); // obciêcie unikatowoœci
|
token = token.substr(0, token.find("#") - 1); // obcięcie unikatowości
|
||||||
bEnabled = false; // nie do kolejki (dla SetVelocity te¿, ale jak jest do toru
|
bEnabled = false; // nie do kolejki (dla SetVelocity też, ale jak jest do toru
|
||||||
// dowi¹zany)
|
// dowiązany)
|
||||||
Params[6].asCommand = cm_PassengerStopPoint;
|
Params[6].asCommand = cm_PassengerStopPoint;
|
||||||
}
|
}
|
||||||
else if (token == "SetVelocity")
|
else if (token == "SetVelocity")
|
||||||
@@ -361,7 +361,7 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
//}
|
//}
|
||||||
else if (token == "OutsideStation")
|
else if (token == "OutsideStation")
|
||||||
{
|
{
|
||||||
bEnabled = false; // ma byæ skanowny, aby AI nie przekracza³o W5
|
bEnabled = false; // ma być skanowny, aby AI nie przekraczało W5
|
||||||
Params[6].asCommand = cm_OutsideStation;
|
Params[6].asCommand = cm_OutsideStation;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -411,12 +411,12 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
{
|
{
|
||||||
// str = AnsiString(token.c_str());
|
// str = AnsiString(token.c_str());
|
||||||
if (i < 8)
|
if (i < 8)
|
||||||
Params[i].asdouble = atof(token.c_str()); // teraz mo¿e mieæ u³amek
|
Params[i].asdouble = atof(token.c_str()); // teraz może mieć ułamek
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
} while (token.compare("endevent") != 0);
|
} while (token.compare("endevent") != 0);
|
||||||
break;
|
break;
|
||||||
case tp_Visible: // zmiana wyœwietlania obiektu
|
case tp_Visible: // zmiana wyświetlania obiektu
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
// str = AnsiString(token.c_str());
|
// str = AnsiString(token.c_str());
|
||||||
@@ -458,7 +458,7 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
*parser >> token;
|
*parser >> token;
|
||||||
Params[0].asInt = 0; // na razie nieznany typ
|
Params[0].asInt = 0; // na razie nieznany typ
|
||||||
if (token.compare("rotate") == 0)
|
if (token.compare("rotate") == 0)
|
||||||
{ // obrót wzglêdem osi
|
{ // obrót względem osi
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
Params[9].asText = new char[token.size() + 1]; // nazwa submodelu
|
Params[9].asText = new char[token.size() + 1]; // nazwa submodelu
|
||||||
@@ -492,14 +492,14 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
Params[9].asText = new char[token.size() + 1]; // nazwa submodelu
|
Params[9].asText = new char[token.size() + 1]; // nazwa submodelu
|
||||||
std::strcpy(Params[9].asText, token.c_str());
|
std::strcpy(Params[9].asText, token.c_str());
|
||||||
Params[0].asInt = 8;
|
Params[0].asInt = 8;
|
||||||
parser->getTokens(4); // jaki ma byæ sens tych parametrów?
|
parser->getTokens(4); // jaki ma być sens tych parametrów?
|
||||||
*parser
|
*parser
|
||||||
>> Params[1].asdouble
|
>> Params[1].asdouble
|
||||||
>> Params[2].asdouble
|
>> Params[2].asdouble
|
||||||
>> Params[3].asdouble
|
>> Params[3].asdouble
|
||||||
>> Params[4].asdouble;
|
>> Params[4].asdouble;
|
||||||
}
|
}
|
||||||
else if (token.substr(token.length() - 4, 4) == ".vmd") // na razie tu, mo¿e bêdzie inaczej
|
else if (token.substr(token.length() - 4, 4) == ".vmd") // na razie tu, może będzie inaczej
|
||||||
{ // animacja z pliku VMD
|
{ // animacja z pliku VMD
|
||||||
// TFileStream *fs = new TFileStream( "models\\" + AnsiString( token.c_str() ), fmOpenRead );
|
// TFileStream *fs = new TFileStream( "models\\" + AnsiString( token.c_str() ), fmOpenRead );
|
||||||
{
|
{
|
||||||
@@ -533,22 +533,22 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
// str = AnsiString(token.c_str());
|
// str = AnsiString(token.c_str());
|
||||||
if (token != "endevent")
|
if (token != "endevent")
|
||||||
{
|
{
|
||||||
Params[1].asdouble = atof(token.c_str()); // prêdkoœæ liniowa ruchu iglic
|
Params[1].asdouble = atof(token.c_str()); // prędkość liniowa ruchu iglic
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
// str = AnsiString(token.c_str());
|
// str = AnsiString(token.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Params[1].asdouble = -1.0; // u¿yæ domyœlnej
|
Params[1].asdouble = -1.0; // użyć domyślnej
|
||||||
if (token != "endevent")
|
if (token != "endevent")
|
||||||
{
|
{
|
||||||
Params[2].asdouble =
|
Params[2].asdouble =
|
||||||
atof(token.c_str()); // dodatkowy ruch drugiej iglicy (zamkniêcie nastawnicze)
|
atof(token.c_str()); // dodatkowy ruch drugiej iglicy (zamknięcie nastawnicze)
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Params[2].asdouble = -1.0; // u¿yæ domyœlnej
|
Params[2].asdouble = -1.0; // użyć domyślnej
|
||||||
break;
|
break;
|
||||||
case tp_DynVel:
|
case tp_DynVel:
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
@@ -572,17 +572,17 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
token != "randomdelay")
|
token != "randomdelay")
|
||||||
{
|
{
|
||||||
if ((token.substr(0, 5) != "none_") ? (i < 8) : false)
|
if ((token.substr(0, 5) != "none_") ? (i < 8) : false)
|
||||||
{ // eventy rozpoczynaj¹ce siê od "none_" s¹ ignorowane
|
{ // eventy rozpoczynające się od "none_" są ignorowane
|
||||||
if (token != "else")
|
if (token != "else")
|
||||||
{
|
{
|
||||||
Params[i].asText = new char[255];
|
Params[i].asText = new char[255];
|
||||||
strcpy(Params[i].asText, token.c_str());
|
strcpy(Params[i].asText, token.c_str());
|
||||||
if (ti)
|
if (ti)
|
||||||
iFlags |= conditional_else << i; // oflagowanie dla eventów "else"
|
iFlags |= conditional_else << i; // oflagowanie dla eventów "else"
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ti = !ti; // zmiana flagi dla s³owa "else"
|
ti = !ti; // zmiana flagi dla słowa "else"
|
||||||
}
|
}
|
||||||
else if (i >= 8)
|
else if (i >= 8)
|
||||||
ErrorLog("Bad event: \"" + token + "\" ignored in multiple \"" + asName + "\"!");
|
ErrorLog("Bad event: \"" + token + "\" ignored in multiple \"" + asName + "\"!");
|
||||||
@@ -592,16 +592,16 @@ void TEvent::Load(cParser *parser, vector3 *org)
|
|||||||
*parser >> token;
|
*parser >> token;
|
||||||
// str = AnsiString(token.c_str());
|
// str = AnsiString(token.c_str());
|
||||||
}
|
}
|
||||||
Conditions(parser, token); // sprawdzanie warunków
|
Conditions(parser, token); // sprawdzanie warunków
|
||||||
break;
|
break;
|
||||||
case tp_Voltage: // zmiana napiêcia w zasilaczu (TractionPowerSource)
|
case tp_Voltage: // zmiana napięcia w zasilaczu (TractionPowerSource)
|
||||||
case tp_Friction: // zmiana przyczepnosci na scenerii
|
case tp_Friction: // zmiana przyczepnosci na scenerii
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> Params[0].asdouble; // Ra 2014-01-27
|
*parser >> Params[0].asdouble; // Ra 2014-01-27
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
break;
|
break;
|
||||||
case tp_Message: // wyœwietlenie komunikatu
|
case tp_Message: // wyświetlenie komunikatu
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
@@ -639,72 +639,72 @@ void TEvent::AddToQuery(TEvent *e)
|
|||||||
string TEvent::CommandGet()
|
string TEvent::CommandGet()
|
||||||
{ // odczytanie komendy z eventu
|
{ // odczytanie komendy z eventu
|
||||||
switch (Type)
|
switch (Type)
|
||||||
{ // to siê wykonuje równie¿ sk³adu jad¹cego bez obs³ugi
|
{ // to się wykonuje również składu jadącego bez obsługi
|
||||||
case tp_GetValues:
|
case tp_GetValues:
|
||||||
return string(Params[9].asMemCell->Text());
|
return string(Params[9].asMemCell->Text());
|
||||||
case tp_PutValues:
|
case tp_PutValues:
|
||||||
return string(Params[0].asText);
|
return string(Params[0].asText);
|
||||||
}
|
}
|
||||||
return ""; // inne eventy siê nie licz¹
|
return ""; // inne eventy się nie liczą
|
||||||
};
|
};
|
||||||
|
|
||||||
TCommandType TEvent::Command()
|
TCommandType TEvent::Command()
|
||||||
{ // odczytanie komendy z eventu
|
{ // odczytanie komendy z eventu
|
||||||
switch (Type)
|
switch (Type)
|
||||||
{ // to siê wykonuje równie¿ dla sk³adu jad¹cego bez obs³ugi
|
{ // to się wykonuje również dla składu jadącego bez obsługi
|
||||||
case tp_GetValues:
|
case tp_GetValues:
|
||||||
return Params[9].asMemCell->Command();
|
return Params[9].asMemCell->Command();
|
||||||
case tp_PutValues:
|
case tp_PutValues:
|
||||||
return Params[6].asCommand; // komenda zakodowana binarnie
|
return Params[6].asCommand; // komenda zakodowana binarnie
|
||||||
}
|
}
|
||||||
return cm_Unknown; // inne eventy siê nie licz¹
|
return cm_Unknown; // inne eventy się nie liczą
|
||||||
};
|
};
|
||||||
|
|
||||||
double TEvent::ValueGet(int n)
|
double TEvent::ValueGet(int n)
|
||||||
{ // odczytanie komendy z eventu
|
{ // odczytanie komendy z eventu
|
||||||
n &= 1; // tylko 1 albo 2 jest prawid³owy
|
n &= 1; // tylko 1 albo 2 jest prawidłowy
|
||||||
switch (Type)
|
switch (Type)
|
||||||
{ // to siê wykonuje równie¿ sk³adu jad¹cego bez obs³ugi
|
{ // to się wykonuje również składu jadącego bez obsługi
|
||||||
case tp_GetValues:
|
case tp_GetValues:
|
||||||
return n ? Params[9].asMemCell->Value1() : Params[9].asMemCell->Value2();
|
return n ? Params[9].asMemCell->Value1() : Params[9].asMemCell->Value2();
|
||||||
case tp_PutValues:
|
case tp_PutValues:
|
||||||
return Params[2 - n].asdouble;
|
return Params[2 - n].asdouble;
|
||||||
}
|
}
|
||||||
return 0.0; // inne eventy siê nie licz¹
|
return 0.0; // inne eventy się nie liczą
|
||||||
};
|
};
|
||||||
|
|
||||||
vector3 TEvent::PositionGet()
|
vector3 TEvent::PositionGet()
|
||||||
{ // pobranie wspó³rzêdnych eventu
|
{ // pobranie współrzędnych eventu
|
||||||
switch (Type)
|
switch (Type)
|
||||||
{ //
|
{ //
|
||||||
case tp_GetValues:
|
case tp_GetValues:
|
||||||
return Params[9].asMemCell->Position(); // wspó³rzêdne pod³¹czonej komórki pamiêci
|
return Params[9].asMemCell->Position(); // współrzędne podłączonej komórki pamięci
|
||||||
case tp_PutValues:
|
case tp_PutValues:
|
||||||
return vector3(Params[3].asdouble, Params[4].asdouble, Params[5].asdouble);
|
return vector3(Params[3].asdouble, Params[4].asdouble, Params[5].asdouble);
|
||||||
}
|
}
|
||||||
return vector3(0, 0, 0); // inne eventy siê nie licz¹
|
return vector3(0, 0, 0); // inne eventy się nie liczą
|
||||||
};
|
};
|
||||||
|
|
||||||
bool TEvent::StopCommand()
|
bool TEvent::StopCommand()
|
||||||
{ //
|
{ //
|
||||||
if (Type == tp_GetValues)
|
if (Type == tp_GetValues)
|
||||||
return Params[9].asMemCell->StopCommand(); // info o komendzie z komórki
|
return Params[9].asMemCell->StopCommand(); // info o komendzie z komórki
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
void TEvent::StopCommandSent()
|
void TEvent::StopCommandSent()
|
||||||
{
|
{
|
||||||
if (Type == tp_GetValues)
|
if (Type == tp_GetValues)
|
||||||
Params[9].asMemCell->StopCommandSent(); // komenda z komórki zosta³a wys³ana
|
Params[9].asMemCell->StopCommandSent(); // komenda z komórki została wysłana
|
||||||
};
|
};
|
||||||
|
|
||||||
void TEvent::Append(TEvent *e)
|
void TEvent::Append(TEvent *e)
|
||||||
{ // doczepienie kolejnych z t¹ sam¹ nazw¹
|
{ // doczepienie kolejnych z tą samą nazwą
|
||||||
if (evJoined)
|
if (evJoined)
|
||||||
evJoined->Append(e); // rekurencja! - góra kilkanaœcie eventów bêdzie potrzebne
|
evJoined->Append(e); // rekurencja! - góra kilkanaście eventów będzie potrzebne
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
evJoined = e;
|
evJoined = e;
|
||||||
e->bEnabled = true; // ten doczepiony mo¿e byæ tylko kolejkowany
|
e->bEnabled = true; // ten doczepiony może być tylko kolejkowany
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
40
Event.h
40
Event.h
@@ -43,21 +43,21 @@ typedef enum
|
|||||||
tp_Friction
|
tp_Friction
|
||||||
} TEventType;
|
} TEventType;
|
||||||
|
|
||||||
const int update_memstring = 0x0000001; // zmodyfikowaæ tekst (UpdateValues)
|
const int update_memstring = 0x0000001; // zmodyfikować tekst (UpdateValues)
|
||||||
const int update_memval1 = 0x0000002; // zmodyfikowaæ pierwsz¹ wartosæ
|
const int update_memval1 = 0x0000002; // zmodyfikować pierwszą wartosć
|
||||||
const int update_memval2 = 0x0000004; // zmodyfikowaæ drug¹ wartosæ
|
const int update_memval2 = 0x0000004; // zmodyfikować drugą wartosć
|
||||||
const int update_memadd = 0x0000008; // dodaæ do poprzedniej zawartoœci
|
const int update_memadd = 0x0000008; // dodać do poprzedniej zawartości
|
||||||
const int update_load = 0x0000010; // odczytaæ ³adunek
|
const int update_load = 0x0000010; // odczytać ładunek
|
||||||
const int update_only = 0x00000FF; // wartoϾ graniczna
|
const int update_only = 0x00000FF; // wartość graniczna
|
||||||
const int conditional_memstring = 0x0000100; // porównanie tekstu
|
const int conditional_memstring = 0x0000100; // porównanie tekstu
|
||||||
const int conditional_memval1 = 0x0000200; // porównanie pierwszej wartoœci liczbowej
|
const int conditional_memval1 = 0x0000200; // porównanie pierwszej wartości liczbowej
|
||||||
const int conditional_memval2 = 0x0000400; // porównanie drugiej wartoœci
|
const int conditional_memval2 = 0x0000400; // porównanie drugiej wartości
|
||||||
const int conditional_else = 0x0010000; // flaga odwrócenia warunku (przesuwana bitowo)
|
const int conditional_else = 0x0010000; // flaga odwrócenia warunku (przesuwana bitowo)
|
||||||
const int conditional_anyelse = 0x0FF0000; // do sprawdzania, czy s¹ odwrócone warunki
|
const int conditional_anyelse = 0x0FF0000; // do sprawdzania, czy są odwrócone warunki
|
||||||
const int conditional_trackoccupied = 0x1000000; // jeœli tor zajêty
|
const int conditional_trackoccupied = 0x1000000; // jeśli tor zajęty
|
||||||
const int conditional_trackfree = 0x2000000; // jeœli tor wolny
|
const int conditional_trackfree = 0x2000000; // jeśli tor wolny
|
||||||
const int conditional_propability = 0x4000000; // zale¿nie od generatora lizcb losowych
|
const int conditional_propability = 0x4000000; // zależnie od generatora lizcb losowych
|
||||||
const int conditional_memcompare = 0x8000000; // porównanie zawartoœci
|
const int conditional_memcompare = 0x8000000; // porównanie zawartości
|
||||||
|
|
||||||
union TParam
|
union TParam
|
||||||
{
|
{
|
||||||
@@ -86,20 +86,20 @@ class TEvent // zmienne: ev*
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
std::string asName;
|
std::string asName;
|
||||||
bool bEnabled; // false gdy ma nie byæ dodawany do kolejki (skanowanie sygna³ów)
|
bool bEnabled; // false gdy ma nie być dodawany do kolejki (skanowanie sygnałów)
|
||||||
int iQueued; // ile razy dodany do kolejki
|
int iQueued; // ile razy dodany do kolejki
|
||||||
// bool bIsHistory;
|
// bool bIsHistory;
|
||||||
TEvent *evNext; // nastêpny w kolejce
|
TEvent *evNext; // następny w kolejce
|
||||||
TEvent *evNext2;
|
TEvent *evNext2;
|
||||||
TEventType Type;
|
TEventType Type;
|
||||||
double fStartTime;
|
double fStartTime;
|
||||||
double fDelay;
|
double fDelay;
|
||||||
TDynamicObject *Activator;
|
TDynamicObject *Activator;
|
||||||
TParam Params[13]; // McZapkie-070502 //Ra: zamieniæ to na union/struct
|
TParam Params[13]; // McZapkie-070502 //Ra: zamienić to na union/struct
|
||||||
unsigned int iFlags; // zamiast Params[8] z flagami warunku
|
unsigned int iFlags; // zamiast Params[8] z flagami warunku
|
||||||
std::string asNodeName; // McZapkie-100302 - dodalem zeby zapamietac nazwe toru
|
std::string asNodeName; // McZapkie-100302 - dodalem zeby zapamietac nazwe toru
|
||||||
TEvent *evJoined; // kolejny event z t¹ sam¹ nazw¹ - od wersji 378
|
TEvent *evJoined; // kolejny event z tą samą nazwą - od wersji 378
|
||||||
double fRandomDelay; // zakres dodatkowego opóŸnienia
|
double fRandomDelay; // zakres dodatkowego opóźnienia
|
||||||
public: // metody
|
public: // metody
|
||||||
TEvent(std::string m = "");
|
TEvent(std::string m = "");
|
||||||
~TEvent();
|
~TEvent();
|
||||||
|
|||||||
38
Float3d.h
38
Float3d.h
@@ -13,7 +13,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
class float3
|
class float3
|
||||||
{ // wapó³rzêdne wiercho³ka 3D o pojedynczej precyzji
|
{ // wapółrzędne wierchołka 3D o pojedynczej precyzji
|
||||||
public:
|
public:
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
float3(void){};
|
float3(void){};
|
||||||
@@ -58,7 +58,7 @@ inline float3 operator/(const float3 &v, double k)
|
|||||||
return float3(v.x / k, v.y / k, v.z / k);
|
return float3(v.x / k, v.y / k, v.z / k);
|
||||||
};
|
};
|
||||||
inline float3 SafeNormalize(const float3 &v)
|
inline float3 SafeNormalize(const float3 &v)
|
||||||
{ // bezpieczna normalizacja (wektor d³ugoœci 1.0)
|
{ // bezpieczna normalizacja (wektor długości 1.0)
|
||||||
double l = v.Length();
|
double l = v.Length();
|
||||||
float3 retVal;
|
float3 retVal;
|
||||||
if (l == 0)
|
if (l == 0)
|
||||||
@@ -98,14 +98,14 @@ class float4
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
inline float4 operator*(const float4 &q1, const float4 &q2)
|
inline float4 operator*(const float4 &q1, const float4 &q2)
|
||||||
{ // mno¿enie to prawie jak mno¿enie macierzy
|
{ // mnożenie to prawie jak mnożenie macierzy
|
||||||
return float4(q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,
|
return float4(q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,
|
||||||
q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z,
|
q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z,
|
||||||
q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x,
|
q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x,
|
||||||
q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z);
|
q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z);
|
||||||
}
|
}
|
||||||
inline float4 operator-(const float4 &q)
|
inline float4 operator-(const float4 &q)
|
||||||
{ // sprzê¿ony; odwrotny tylko dla znormalizowanych!
|
{ // sprzężony; odwrotny tylko dla znormalizowanych!
|
||||||
return float4(-q.x, -q.y, -q.z, q.w);
|
return float4(-q.x, -q.y, -q.z, q.w);
|
||||||
};
|
};
|
||||||
inline float4 operator-(const float4 &q1, const float4 &q2)
|
inline float4 operator-(const float4 &q1, const float4 &q2)
|
||||||
@@ -121,14 +121,14 @@ inline float4 operator/(const float4 &v, double k)
|
|||||||
return float4(v.x / k, v.y / k, v.z / k, v.w / k);
|
return float4(v.x / k, v.y / k, v.z / k, v.w / k);
|
||||||
};
|
};
|
||||||
inline float4 Normalize(const float4 &v)
|
inline float4 Normalize(const float4 &v)
|
||||||
{ // bezpieczna normalizacja (wektor d³ugoœci 1.0)
|
{ // bezpieczna normalizacja (wektor długości 1.0)
|
||||||
double l = v.LengthSquared();
|
double l = v.LengthSquared();
|
||||||
if (l == 1.0)
|
if (l == 1.0)
|
||||||
return v;
|
return v;
|
||||||
if (l == 0.0)
|
if (l == 0.0)
|
||||||
return float4(); // wektor zerowy, w=1
|
return float4(); // wektor zerowy, w=1
|
||||||
else
|
else
|
||||||
return v / sqrt(l); // pierwiastek liczony tylko jeœli trzeba wykonaæ dzielenia
|
return v / sqrt(l); // pierwiastek liczony tylko jeśli trzeba wykonać dzielenia
|
||||||
};
|
};
|
||||||
inline
|
inline
|
||||||
float Dot(const float4 &q1, const float4 &q2)
|
float Dot(const float4 &q1, const float4 &q2)
|
||||||
@@ -136,7 +136,7 @@ float Dot(const float4 &q1, const float4 &q2)
|
|||||||
return q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w;
|
return q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w;
|
||||||
}
|
}
|
||||||
inline float4 &operator*=(float4 &v1, double d)
|
inline float4 &operator*=(float4 &v1, double d)
|
||||||
{ // mno¿enie przez skalar, jaki ma sens?
|
{ // mnożenie przez skalar, jaki ma sens?
|
||||||
v1.x *= d;
|
v1.x *= d;
|
||||||
v1.y *= d;
|
v1.y *= d;
|
||||||
v1.z *= d;
|
v1.z *= d;
|
||||||
@@ -149,7 +149,7 @@ inline float4 Slerp(const float4 &q0, const float4 &q1, float t)
|
|||||||
float cosOmega = Dot(q0, q1);
|
float cosOmega = Dot(q0, q1);
|
||||||
float4 new_q1(q1);
|
float4 new_q1(q1);
|
||||||
if (cosOmega < 0.0f)
|
if (cosOmega < 0.0f)
|
||||||
{ // je¿eli s¹ niezgodne kierunki, jeden z nich trzeba zanegowaæ
|
{ // jeżeli są niezgodne kierunki, jeden z nich trzeba zanegować
|
||||||
new_q1.x = -new_q1.x;
|
new_q1.x = -new_q1.x;
|
||||||
new_q1.y = -new_q1.y;
|
new_q1.y = -new_q1.y;
|
||||||
new_q1.z = -new_q1.z;
|
new_q1.z = -new_q1.z;
|
||||||
@@ -158,15 +158,15 @@ inline float4 Slerp(const float4 &q0, const float4 &q1, float t)
|
|||||||
}
|
}
|
||||||
double k0, k1;
|
double k0, k1;
|
||||||
if (cosOmega > 0.9999f)
|
if (cosOmega > 0.9999f)
|
||||||
{ // jeœli jesteœmy z (t) na maksimum kosinusa, to tam prawie liniowo jest
|
{ // jeśli jesteśmy z (t) na maksimum kosinusa, to tam prawie liniowo jest
|
||||||
k0 = 1.0f - t;
|
k0 = 1.0f - t;
|
||||||
k1 = t;
|
k1 = t;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // a w ogólnym przypadku trzeba liczyæ na trygonometriê
|
{ // a w ogólnym przypadku trzeba liczyć na trygonometrię
|
||||||
double sinOmega = sqrt(1.0f - cosOmega * cosOmega); // sinus z jedynki tryg.
|
double sinOmega = sqrt(1.0f - cosOmega * cosOmega); // sinus z jedynki tryg.
|
||||||
double omega = atan2(sinOmega, cosOmega); // wyznaczenie k¹ta
|
double omega = atan2(sinOmega, cosOmega); // wyznaczenie kąta
|
||||||
double oneOverSinOmega = 1.0f / sinOmega; // odwrotnoϾ sinusa, bo sinus w mianowniku
|
double oneOverSinOmega = 1.0f / sinOmega; // odwrotność sinusa, bo sinus w mianowniku
|
||||||
k0 = sin((1.0f - t) * omega) * oneOverSinOmega;
|
k0 = sin((1.0f - t) * omega) * oneOverSinOmega;
|
||||||
k1 = sin(t * omega) * oneOverSinOmega;
|
k1 = sin(t * omega) * oneOverSinOmega;
|
||||||
}
|
}
|
||||||
@@ -175,7 +175,7 @@ inline float4 Slerp(const float4 &q0, const float4 &q1, float t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct float8
|
struct float8
|
||||||
{ // wiercho³ek 3D z wektorem normalnym i mapowaniem, pojedyncza precyzja
|
{ // wierchołek 3D z wektorem normalnym i mapowaniem, pojedyncza precyzja
|
||||||
public:
|
public:
|
||||||
float3 Point;
|
float3 Point;
|
||||||
float3 Normal;
|
float3 Normal;
|
||||||
@@ -212,7 +212,7 @@ class float4x4
|
|||||||
return &e[i << 2];
|
return &e[i << 2];
|
||||||
};
|
};
|
||||||
void InitialRotate()
|
void InitialRotate()
|
||||||
{ // taka specjalna rotacja, nie ma co ci¹gaæ trygonometrii
|
{ // taka specjalna rotacja, nie ma co ciągać trygonometrii
|
||||||
float f;
|
float f;
|
||||||
for (int i = 0; i < 16; i += 4)
|
for (int i = 0; i < 16; i += 4)
|
||||||
{
|
{
|
||||||
@@ -224,7 +224,7 @@ class float4x4
|
|||||||
};
|
};
|
||||||
inline float4x4 &Rotation(double angle, float3 axis);
|
inline float4x4 &Rotation(double angle, float3 axis);
|
||||||
inline bool IdentityIs()
|
inline bool IdentityIs()
|
||||||
{ // sprawdzenie jednostkowoœci
|
{ // sprawdzenie jednostkowości
|
||||||
for (int i = 0; i < 16; ++i)
|
for (int i = 0; i < 16; ++i)
|
||||||
if (e[i] != ((i % 5) ? 0.0 : 1.0)) // jedynki tylko na 0, 5, 10 i 15
|
if (e[i] != ((i % 5) ? 0.0 : 1.0)) // jedynki tylko na 0, 5, 10 i 15
|
||||||
return false;
|
return false;
|
||||||
@@ -238,7 +238,7 @@ class float4x4
|
|||||||
};
|
};
|
||||||
|
|
||||||
inline float3 operator*(const float4x4 &m, const float3 &v)
|
inline float3 operator*(const float4x4 &m, const float3 &v)
|
||||||
{ // mno¿enie wektora przez macierz
|
{ // mnożenie wektora przez macierz
|
||||||
return float3(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + m[3][0],
|
return float3(v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + m[3][0],
|
||||||
v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + m[3][1],
|
v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + m[3][1],
|
||||||
v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + m[3][2]);
|
v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + m[3][2]);
|
||||||
@@ -295,19 +295,19 @@ inline float4x4 operator*(const float4x4 &m1, const float4x4 &m2)
|
|||||||
|
|
||||||
// From code in Graphics Gems; p. 766
|
// From code in Graphics Gems; p. 766
|
||||||
inline float Det2x2(float a, float b, float c, float d)
|
inline float Det2x2(float a, float b, float c, float d)
|
||||||
{ // obliczenie wyznacznika macierzy 2×2
|
{ // obliczenie wyznacznika macierzy 2×2
|
||||||
return a * d - b * c;
|
return a * d - b * c;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline float Det3x3(float a1, float a2, float a3, float b1, float b2, float b3, float c1, float c2,
|
inline float Det3x3(float a1, float a2, float a3, float b1, float b2, float b3, float c1, float c2,
|
||||||
float c3)
|
float c3)
|
||||||
{ // obliczenie wyznacznika macierzy 3×3
|
{ // obliczenie wyznacznika macierzy 3×3
|
||||||
return +a1 * Det2x2(b2, b3, c2, c3) - b1 * Det2x2(a2, a3, c2, c3) + c1 * Det2x2(a2, a3, b2, b3);
|
return +a1 * Det2x2(b2, b3, c2, c3) - b1 * Det2x2(a2, a3, c2, c3) + c1 * Det2x2(a2, a3, b2, b3);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline
|
inline
|
||||||
float Det(const float4x4 &m)
|
float Det(const float4x4 &m)
|
||||||
{ // obliczenie wyznacznika macierzy 4×4
|
{ // obliczenie wyznacznika macierzy 4×4
|
||||||
float a1 = m[0][0], a2 = m[1][0], a3 = m[2][0], a4 = m[3][0];
|
float a1 = m[0][0], a2 = m[1][0], a3 = m[2][0], a4 = m[3][0];
|
||||||
float b1 = m[0][1], b2 = m[1][1], b3 = m[2][1], b4 = m[3][1];
|
float b1 = m[0][1], b2 = m[1][1], b3 = m[2][1], b4 = m[3][1];
|
||||||
float c1 = m[0][2], c2 = m[1][2], c3 = m[2][2], c4 = m[3][2];
|
float c1 = m[0][2], c2 = m[1][2], c3 = m[2][2], c4 = m[3][2];
|
||||||
|
|||||||
56
Forth.cpp
56
Forth.cpp
@@ -16,37 +16,37 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
|
|
||||||
#pragma package(smart_init)
|
#pragma package(smart_init)
|
||||||
|
|
||||||
/* Ra: Forth jest prostym językiem programowania, funkcjonującym na dosyć
|
/* Ra: Forth jest prostym językiem programowania, funkcjonującym na dosyć
|
||||||
niskim poziomie. Może być zarówno interpretowany jak i kompilowany, co
|
niskim poziomie. Może być zarówno interpretowany jak i kompilowany, co
|
||||||
pozwala szybko działać skompilowanym programom, jak również wykonywać
|
pozwala szybko działać skompilowanym programom, jak również wykonywać
|
||||||
polecenia wprowadzane z klawiatury. Za pomocą zdefiniowanych kompilatorów
|
polecenia wprowadzane z klawiatury. Za pomocą zdefiniowanych kompilatorów
|
||||||
można definiować nowe funkcje, można również tworzyć nowe struktury jezyka,
|
można definiować nowe funkcje, można również tworzyć nowe struktury jezyka,
|
||||||
np. wykraczające poza dotychczasową składnię. Prostota i wydajność są okupione
|
np. wykraczające poza dotychczasową składnię. Prostota i wydajność są okupione
|
||||||
nieco specyficzną składnią, wynikającą z użycia stosu do obliczeń (tzw. odwrotna
|
nieco specyficzną składnią, wynikającą z użycia stosu do obliczeń (tzw. odwrotna
|
||||||
notacja polska).
|
notacja polska).
|
||||||
|
|
||||||
Forth ma być używany jako:
|
Forth ma być używany jako:
|
||||||
1. Alternatywna postać eventów. Dotychczasowe eventy w sceneriach mogą być
|
1. Alternatywna postać eventów. Dotychczasowe eventy w sceneriach mogą być
|
||||||
traktowane jako funkcje języka Forth. Jednocześnie można uzyskać uelastycznienie
|
traktowane jako funkcje języka Forth. Jednocześnie można uzyskać uelastycznienie
|
||||||
składni, poprzez np. połączenie w jednym wpisie różnych typów eventów wraz z
|
składni, poprzez np. połączenie w jednym wpisie różnych typów eventów wraz z
|
||||||
dodaniem warunków dostępnych tylko dla Multiple. Również można będzie używać
|
dodaniem warunków dostępnych tylko dla Multiple. Również można będzie używać
|
||||||
wyrażeń języka Forth, czyli dokonywać obliczeń.
|
wyrażeń języka Forth, czyli dokonywać obliczeń.
|
||||||
2. Jako docelowa postać schematów obwodów Ladder Diagram. Można zrobić tak, by
|
2. Jako docelowa postać schematów obwodów Ladder Diagram. Można zrobić tak, by
|
||||||
program źródłowy w Forth (przy pewnych ograniczeniach) był wyświetlany graficznie
|
program źródłowy w Forth (przy pewnych ograniczeniach) był wyświetlany graficznie
|
||||||
jako Ladder Diagram. Jednocześnie graficzne modyfikacje schematu można by
|
jako Ladder Diagram. Jednocześnie graficzne modyfikacje schematu można by
|
||||||
przełożyć na postać tekstową Forth i skompilować na kod niskiego poziomu.
|
przełożyć na postać tekstową Forth i skompilować na kod niskiego poziomu.
|
||||||
3. Jako algorytm funkcjonowania AI, możliwy do zaprogramowania na zewnątzr EXE.
|
3. Jako algorytm funkcjonowania AI, możliwy do zaprogramowania na zewnątzr EXE.
|
||||||
Każdy użytkownik będzie mógł swój własny styl jazdy.
|
Każdy użytkownik będzie mógł swój własny styl jazdy.
|
||||||
4. Jako algorytm sterowania ruchem (zależności na stacji).
|
4. Jako algorytm sterowania ruchem (zależności na stacji).
|
||||||
5. Jako AI stacji, zarządzające ruchem na stacji zależnie w czasie rzeczywistym.
|
5. Jako AI stacji, zarządzające ruchem na stacji zależnie w czasie rzeczywistym.
|
||||||
|
|
||||||
Względem pierwotnego języka Forth, użyty tutaj będzie miał pewne odstępstwa:
|
Względem pierwotnego języka Forth, użyty tutaj będzie miał pewne odstępstwa:
|
||||||
1. Operacje na liczbach czterobajtowych float. Należy we własnym zakresie dbać
|
1. Operacje na liczbach czterobajtowych float. Należy we własnym zakresie dbać
|
||||||
o zgodność użytych funkcji z typem argumentu na stosie.
|
o zgodność użytych funkcji z typem argumentu na stosie.
|
||||||
2. Jedynym typem całkowitym jest czterobajtowy int.
|
2. Jedynym typem całkowitym jest czterobajtowy int.
|
||||||
3. Do wyszukiwania obiektów w scenerii po nazwie (torów, eventów), używane jest
|
3. Do wyszukiwania obiektów w scenerii po nazwie (torów, eventów), używane jest
|
||||||
drzewo zamiast listy.
|
drzewo zamiast listy.
|
||||||
|
|
||||||
Wpisy w scenerii, przetwarzane jako komendy Forth, nie mogą używać średnika jako
|
Wpisy w scenerii, przetwarzane jako komendy Forth, nie mogą używać średnika jako
|
||||||
separatora słów. Uniemożliwia to używanie średnika jako słowa.
|
separatora słów. Uniemożliwia to używanie średnika jako słowa.
|
||||||
*/
|
*/
|
||||||
|
|||||||
2
Forth.h
2
Forth.h
@@ -12,6 +12,6 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
class Forth
|
class Forth
|
||||||
{ // klasa obs³ugi jêzyka
|
{ // klasa obsługi języka
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
48
Gauge.cpp
48
Gauge.cpp
@@ -28,7 +28,7 @@ TGauge::TGauge()
|
|||||||
fOffset = 0.0;
|
fOffset = 0.0;
|
||||||
fScale = 1.0;
|
fScale = 1.0;
|
||||||
fStepSize = 5;
|
fStepSize = 5;
|
||||||
// iChannel=-1; //kana³ analogowej komunikacji zwrotnej
|
// iChannel=-1; //kanał analogowej komunikacji zwrotnej
|
||||||
SubModel = NULL;
|
SubModel = NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -44,10 +44,10 @@ void TGauge::Clear()
|
|||||||
|
|
||||||
void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, double fNewOffset,
|
void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, double fNewOffset,
|
||||||
double fNewFriction, double fNewValue)
|
double fNewFriction, double fNewValue)
|
||||||
{ // ustawienie parametrów animacji submodelu
|
{ // ustawienie parametrów animacji submodelu
|
||||||
if (NewSubModel)
|
if (NewSubModel)
|
||||||
{ // warunek na wszelki wypadek, gdyby siê submodel nie
|
{ // warunek na wszelki wypadek, gdyby się submodel nie
|
||||||
// pod³¹czy³
|
// podłączył
|
||||||
fFriction = fNewFriction;
|
fFriction = fNewFriction;
|
||||||
fValue = fNewValue;
|
fValue = fNewValue;
|
||||||
fOffset = fNewOffset;
|
fOffset = fNewOffset;
|
||||||
@@ -58,19 +58,19 @@ void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale,
|
|||||||
{
|
{
|
||||||
TSubModel *sm = SubModel->ChildGet();
|
TSubModel *sm = SubModel->ChildGet();
|
||||||
do
|
do
|
||||||
{ // pêtla po submodelach potomnych i obracanie ich o k¹t zale¿y od
|
{ // pętla po submodelach potomnych i obracanie ich o kąt zależy od
|
||||||
// cyfry w (fValue)
|
// cyfry w (fValue)
|
||||||
if (sm->pName)
|
if (sm->pName)
|
||||||
{ // musi mieæ niepust¹ nazwê
|
{ // musi mieć niepustą nazwę
|
||||||
if (sm->pName[0] >= '0')
|
if (sm->pName[0] >= '0')
|
||||||
if (sm->pName[0] <= '9')
|
if (sm->pName[0] <= '9')
|
||||||
sm->WillBeAnimated(); // wy³¹czenie optymalizacji
|
sm->WillBeAnimated(); // wyłączenie optymalizacji
|
||||||
}
|
}
|
||||||
sm = sm->NextGet();
|
sm = sm->NextGet();
|
||||||
} while (sm);
|
} while (sm);
|
||||||
}
|
}
|
||||||
else // a banan mo¿e byæ z optymalizacj¹?
|
else // a banan może być z optymalizacją?
|
||||||
NewSubModel->WillBeAnimated(); // wy³¹czenie ignowania jedynkowego transformu
|
NewSubModel->WillBeAnimated(); // wyłączenie ignowania jedynkowego transformu
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -86,10 +86,10 @@ bool TGauge::Load(cParser &Parser, TModel3d *md1, TModel3d *md2, double mul)
|
|||||||
>> val5;
|
>> val5;
|
||||||
val3 *= mul;
|
val3 *= mul;
|
||||||
TSubModel *sm = md1->GetFromName( str1.c_str() );
|
TSubModel *sm = md1->GetFromName( str1.c_str() );
|
||||||
if (sm) // jeœli nie znaleziony
|
if (sm) // jeśli nie znaleziony
|
||||||
md2 = NULL; // informacja, ¿e znaleziony
|
md2 = NULL; // informacja, że znaleziony
|
||||||
else if (md2) // a jest podany drugi model (np. zewnêtrzny)
|
else if (md2) // a jest podany drugi model (np. zewnętrzny)
|
||||||
sm = md2->GetFromName(str1.c_str()); // to mo¿e tam bêdzie, co za ró¿nica gdzie
|
sm = md2->GetFromName(str1.c_str()); // to może tam będzie, co za różnica gdzie
|
||||||
if (str2 == "mov")
|
if (str2 == "mov")
|
||||||
Init(sm, gt_Move, val3, val4, val5);
|
Init(sm, gt_Move, val3, val4, val5);
|
||||||
else if (str2 == "wip")
|
else if (str2 == "wip")
|
||||||
@@ -98,7 +98,7 @@ bool TGauge::Load(cParser &Parser, TModel3d *md1, TModel3d *md2, double mul)
|
|||||||
Init(sm, gt_Digital, val3, val4, val5);
|
Init(sm, gt_Digital, val3, val4, val5);
|
||||||
else
|
else
|
||||||
Init(sm, gt_Rotate, val3, val4, val5);
|
Init(sm, gt_Rotate, val3, val4, val5);
|
||||||
return (md2); // true, gdy podany model zewnêtrzny, a w kabinie nie by³o
|
return (md2); // true, gdy podany model zewnętrzny, a w kabinie nie było
|
||||||
};
|
};
|
||||||
|
|
||||||
void TGauge::PermIncValue(double fNewDesired)
|
void TGauge::PermIncValue(double fNewDesired)
|
||||||
@@ -112,21 +112,21 @@ void TGauge::PermIncValue(double fNewDesired)
|
|||||||
};
|
};
|
||||||
|
|
||||||
void TGauge::IncValue(double fNewDesired)
|
void TGauge::IncValue(double fNewDesired)
|
||||||
{ // u¿ywane tylko dla uniwersali
|
{ // używane tylko dla uniwersali
|
||||||
fDesiredValue = fDesiredValue + fNewDesired * fScale + fOffset;
|
fDesiredValue = fDesiredValue + fNewDesired * fScale + fOffset;
|
||||||
if (fDesiredValue > fScale + fOffset)
|
if (fDesiredValue > fScale + fOffset)
|
||||||
fDesiredValue = fScale + fOffset;
|
fDesiredValue = fScale + fOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
void TGauge::DecValue(double fNewDesired)
|
void TGauge::DecValue(double fNewDesired)
|
||||||
{ // u¿ywane tylko dla uniwersali
|
{ // używane tylko dla uniwersali
|
||||||
fDesiredValue = fDesiredValue - fNewDesired * fScale + fOffset;
|
fDesiredValue = fDesiredValue - fNewDesired * fScale + fOffset;
|
||||||
if (fDesiredValue < 0)
|
if (fDesiredValue < 0)
|
||||||
fDesiredValue = 0;
|
fDesiredValue = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
void TGauge::UpdateValue(double fNewDesired)
|
void TGauge::UpdateValue(double fNewDesired)
|
||||||
{ // ustawienie wartoœci docelowej
|
{ // ustawienie wartości docelowej
|
||||||
fDesiredValue = fNewDesired * fScale + fOffset;
|
fDesiredValue = fNewDesired * fScale + fOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -147,8 +147,8 @@ void TGauge::Update()
|
|||||||
else
|
else
|
||||||
fValue = fDesiredValue;
|
fValue = fDesiredValue;
|
||||||
if (SubModel)
|
if (SubModel)
|
||||||
{ // warunek na wszelki wypadek, gdyby siê submodel nie
|
{ // warunek na wszelki wypadek, gdyby się submodel nie
|
||||||
// pod³¹czy³
|
// podłączył
|
||||||
TSubModel *sm;
|
TSubModel *sm;
|
||||||
switch (eType)
|
switch (eType)
|
||||||
{
|
{
|
||||||
@@ -171,14 +171,14 @@ void TGauge::Update()
|
|||||||
break;
|
break;
|
||||||
case gt_Digital: // Ra 2014-07: licznik cyfrowy
|
case gt_Digital: // Ra 2014-07: licznik cyfrowy
|
||||||
sm = SubModel->ChildGet();
|
sm = SubModel->ChildGet();
|
||||||
/* std::string n = FormatFloat( "0000000000", floor( fValue ) ); // na razie tak trochê bez sensu
|
/* std::string n = FormatFloat( "0000000000", floor( fValue ) ); // na razie tak trochę bez sensu
|
||||||
*/ std::string n( "000000000" + std::to_string( static_cast<int>( std::floor( fValue ) ) ) );
|
*/ std::string n( "000000000" + std::to_string( static_cast<int>( std::floor( fValue ) ) ) );
|
||||||
if( n.length() > 10 ) { n.erase( 0, n.length() - 10 ); } // also dumb but should work for now
|
if( n.length() > 10 ) { n.erase( 0, n.length() - 10 ); } // also dumb but should work for now
|
||||||
do
|
do
|
||||||
{ // pêtla po submodelach potomnych i obracanie ich o k¹t zale¿y od
|
{ // pętla po submodelach potomnych i obracanie ich o kąt zależy od
|
||||||
// cyfry w (fValue)
|
// cyfry w (fValue)
|
||||||
if (sm->pName)
|
if (sm->pName)
|
||||||
{ // musi mieæ niepust¹ nazwê
|
{ // musi mieć niepustą nazwę
|
||||||
if (sm->pName[0] >= '0')
|
if (sm->pName[0] >= '0')
|
||||||
if (sm->pName[0] <= '9')
|
if (sm->pName[0] <= '9')
|
||||||
sm->SetRotate(float3(0, 1, 0),
|
sm->SetRotate(float3(0, 1, 0),
|
||||||
@@ -209,9 +209,9 @@ void TGauge::AssignInt(int *iValue)
|
|||||||
iData = iValue;
|
iData = iValue;
|
||||||
};
|
};
|
||||||
void TGauge::UpdateValue()
|
void TGauge::UpdateValue()
|
||||||
{ // ustawienie wartoœci docelowej z parametru
|
{ // ustawienie wartości docelowej z parametru
|
||||||
switch (cDataType)
|
switch (cDataType)
|
||||||
{ // to nie jest zbyt optymalne, mo¿na by zrobiæ osobne funkcje
|
{ // to nie jest zbyt optymalne, można by zrobić osobne funkcje
|
||||||
case 'f':
|
case 'f':
|
||||||
fDesiredValue = (*fData) * fScale + fOffset;
|
fDesiredValue = (*fData) * fScale + fOffset;
|
||||||
break;
|
break;
|
||||||
|
|||||||
24
Gauge.h
24
Gauge.h
@@ -14,26 +14,26 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
typedef enum
|
typedef enum
|
||||||
{ // typ ruchu
|
{ // typ ruchu
|
||||||
gt_Unknown, // na razie nie znany
|
gt_Unknown, // na razie nie znany
|
||||||
gt_Rotate, // obrót
|
gt_Rotate, // obrót
|
||||||
gt_Move, // przesuniêcie równoleg³e
|
gt_Move, // przesunięcie równoległe
|
||||||
gt_Wiper, // obrót trzech kolejnych submodeli o ten sam k¹t (np. wycieraczka, drzwi
|
gt_Wiper, // obrót trzech kolejnych submodeli o ten sam kąt (np. wycieraczka, drzwi
|
||||||
// harmonijkowe)
|
// harmonijkowe)
|
||||||
gt_Digital // licznik cyfrowy, np. kilometrów
|
gt_Digital // licznik cyfrowy, np. kilometrów
|
||||||
} TGaugeType;
|
} TGaugeType;
|
||||||
|
|
||||||
class TGauge // zmienne "gg"
|
class TGauge // zmienne "gg"
|
||||||
{ // animowany wskaŸnik, mog¹cy przyjmowaæ wiele stanów poœrednich
|
{ // animowany wskaźnik, mogący przyjmować wiele stanów pośrednich
|
||||||
private:
|
private:
|
||||||
TGaugeType eType; // typ ruchu
|
TGaugeType eType; // typ ruchu
|
||||||
double fFriction; // hamowanie przy zli¿aniu siê do zadanej wartoœci
|
double fFriction; // hamowanie przy zliżaniu się do zadanej wartości
|
||||||
double fDesiredValue; // wartoϾ docelowa
|
double fDesiredValue; // wartość docelowa
|
||||||
double fValue; // wartoϾ obecna
|
double fValue; // wartość obecna
|
||||||
double fOffset; // wartoœæ pocz¹tkowa ("0")
|
double fOffset; // wartość początkowa ("0")
|
||||||
double fScale; // wartoœæ koñcowa ("1")
|
double fScale; // wartość końcowa ("1")
|
||||||
double fStepSize; // nie u¿ywane
|
double fStepSize; // nie używane
|
||||||
char cDataType; // typ zmiennej parametru: f-float, d-double, i-int
|
char cDataType; // typ zmiennej parametru: f-float, d-double, i-int
|
||||||
union
|
union
|
||||||
{ // wskaŸnik na parametr pokazywany przez animacjê
|
{ // wskaźnik na parametr pokazywany przez animację
|
||||||
float *fData;
|
float *fData;
|
||||||
double *dData;
|
double *dData;
|
||||||
int *iData;
|
int *iData;
|
||||||
|
|||||||
441
Globals.cpp
441
Globals.cpp
@@ -25,55 +25,55 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
|
|
||||||
// namespace Global {
|
// namespace Global {
|
||||||
|
|
||||||
// parametry do u<EFBFBD>ytku wewn<EFBFBD>trznego
|
// parametry do użytku wewnętrznego
|
||||||
// double Global::tSinceStart=0;
|
// double Global::tSinceStart=0;
|
||||||
TGround *Global::pGround = NULL;
|
TGround *Global::pGround = NULL;
|
||||||
// char Global::CreatorName1[30]="2001-2004 Maciej Czapkiewicz <McZapkie>";
|
// char Global::CreatorName1[30]="2001-2004 Maciej Czapkiewicz <McZapkie>";
|
||||||
// char Global::CreatorName2[30]="2001-2003 Marcin Wo<EFBFBD>niak <Marcin_EU>";
|
// char Global::CreatorName2[30]="2001-2003 Marcin Woźniak <Marcin_EU>";
|
||||||
// char Global::CreatorName3[20]="2004-2005 Adam Bugiel <ABu>";
|
// char Global::CreatorName3[20]="2004-2005 Adam Bugiel <ABu>";
|
||||||
// char Global::CreatorName4[30]="2004 Arkadiusz <EFBFBD>lusarczyk <Winger>";
|
// char Global::CreatorName4[30]="2004 Arkadiusz Ślusarczyk <Winger>";
|
||||||
// char Global::CreatorName5[30]="2003-2009 <EFBFBD>ukasz Kirchner <Nbmx>";
|
// char Global::CreatorName5[30]="2003-2009 Łukasz Kirchner <Nbmx>";
|
||||||
std::string Global::asCurrentSceneryPath = "scenery/";
|
std::string Global::asCurrentSceneryPath = "scenery/";
|
||||||
std::string Global::asCurrentTexturePath = std::string(szTexturePath);
|
std::string Global::asCurrentTexturePath = std::string(szTexturePath);
|
||||||
std::string Global::asCurrentDynamicPath = "";
|
std::string Global::asCurrentDynamicPath = "";
|
||||||
int Global::iSlowMotion =
|
int Global::iSlowMotion =
|
||||||
0; // info o malym FPS: 0-OK, 1-wy<EFBFBD><EFBFBD>czy<EFBFBD> multisampling, 3-promie<EFBFBD> 1.5km, 7-1km
|
0; // info o malym FPS: 0-OK, 1-wyłączyć multisampling, 3-promień 1.5km, 7-1km
|
||||||
TDynamicObject *Global::changeDynObj = NULL; // info o zmianie pojazdu
|
TDynamicObject *Global::changeDynObj = NULL; // info o zmianie pojazdu
|
||||||
bool Global::detonatoryOK; // info o nowych detonatorach
|
bool Global::detonatoryOK; // info o nowych detonatorach
|
||||||
double Global::ABuDebug = 0;
|
double Global::ABuDebug = 0;
|
||||||
std::string Global::asSky = "1";
|
std::string Global::asSky = "1";
|
||||||
double Global::fOpenGL = 0.0; // wersja OpenGL - do sprawdzania obecno<EFBFBD>ci rozszerze<EFBFBD>
|
double Global::fOpenGL = 0.0; // wersja OpenGL - do sprawdzania obecności rozszerzeń
|
||||||
bool Global::bOpenGL_1_5 = false; // czy s<EFBFBD> dost<EFBFBD>pne funkcje OpenGL 1.5
|
bool Global::bOpenGL_1_5 = false; // czy są dostępne funkcje OpenGL 1.5
|
||||||
double Global::fLuminance = 1.0; // jasno<EFBFBD><EFBFBD> <20>wiat<EFBFBD>a do automatycznego zapalania
|
double Global::fLuminance = 1.0; // jasność światła do automatycznego zapalania
|
||||||
int Global::iReCompile = 0; // zwi<EFBFBD>kszany, gdy trzeba od<EFBFBD>wie<EFBFBD>y<EFBFBD> siatki
|
int Global::iReCompile = 0; // zwiększany, gdy trzeba odświeżyć siatki
|
||||||
HWND Global::hWnd = NULL; // uchwyt okna
|
HWND Global::hWnd = NULL; // uchwyt okna
|
||||||
int Global::iCameraLast = -1;
|
int Global::iCameraLast = -1;
|
||||||
std::string Global::asRelease = "16.1.1174.483";
|
std::string Global::asRelease = "16.0.1172.482";
|
||||||
std::string Global::asVersion =
|
std::string Global::asVersion =
|
||||||
"Compilation 2017-01-13, release " + Global::asRelease + "."; // tutaj, bo wysy<EFBFBD>any
|
"Compilation 2017-01-10, release " + Global::asRelease + "."; // tutaj, bo wysyłany
|
||||||
int Global::iViewMode = 0; // co aktualnie wida<EFBFBD>: 0-kabina, 1-latanie, 2-sprz<EFBFBD>gi, 3-dokumenty
|
int Global::iViewMode = 0; // co aktualnie widać: 0-kabina, 1-latanie, 2-sprzęgi, 3-dokumenty
|
||||||
int Global::iTextMode = 0; // tryb pracy wy<EFBFBD>wietlacza tekstowego
|
int Global::iTextMode = 0; // tryb pracy wyświetlacza tekstowego
|
||||||
int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0,
|
int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0}; // numer ekranu wy<EFBFBD>wietlacza tekstowego
|
0, 0, 0, 0, 0, 0}; // numer ekranu wyświetlacza tekstowego
|
||||||
double Global::fSunDeclination = 0.0; // deklinacja S<EFBFBD>o<EFBFBD>ca
|
double Global::fSunDeclination = 0.0; // deklinacja Słońca
|
||||||
double Global::fTimeAngleDeg = 0.0; // godzina w postaci k<EFBFBD>ta
|
double Global::fTimeAngleDeg = 0.0; // godzina w postaci kąta
|
||||||
float Global::fClockAngleDeg[6]; // k<EFBFBD>ty obrotu cylindr<EFBFBD>w dla zegara cyfrowego
|
float Global::fClockAngleDeg[6]; // kąty obrotu cylindrów dla zegara cyfrowego
|
||||||
char *Global::szTexturesTGA[4] = {"tga", "dds", "tex", "bmp"}; // lista tekstur od TGA
|
char *Global::szTexturesTGA[4] = {"tga", "dds", "tex", "bmp"}; // lista tekstur od TGA
|
||||||
char *Global::szTexturesDDS[4] = {"dds", "tga", "tex", "bmp"}; // lista tekstur od DDS
|
char *Global::szTexturesDDS[4] = {"dds", "tga", "tex", "bmp"}; // lista tekstur od DDS
|
||||||
int Global::iKeyLast = 0; // ostatnio naci<EFBFBD>ni<EFBFBD>ty klawisz w celu logowania
|
int Global::iKeyLast = 0; // ostatnio naciśnięty klawisz w celu logowania
|
||||||
GLuint Global::iTextureId = 0; // ostatnio u<EFBFBD>yta tekstura 2D
|
GLuint Global::iTextureId = 0; // ostatnio użyta tekstura 2D
|
||||||
int Global::iPause = 0x10; // globalna pauza ruchu
|
int Global::iPause = 0x10; // globalna pauza ruchu
|
||||||
bool Global::bActive = true; // czy jest aktywnym oknem
|
bool Global::bActive = true; // czy jest aktywnym oknem
|
||||||
int Global::iErorrCounter = 0; // licznik sprawdza<EFBFBD> do <EFBFBD>ledzenia b<EFBFBD><EFBFBD>d<EFBFBD>w OpenGL
|
int Global::iErorrCounter = 0; // licznik sprawdzań do śledzenia błędów OpenGL
|
||||||
int Global::iTextures = 0; // licznik u<EFBFBD>ytych tekstur
|
int Global::iTextures = 0; // licznik użytych tekstur
|
||||||
TWorld *Global::pWorld = NULL;
|
TWorld *Global::pWorld = NULL;
|
||||||
cParser *Global::pParser = NULL;
|
cParser *Global::pParser = NULL;
|
||||||
int Global::iSegmentsRendered = 90; // ilo<EFBFBD><EFBFBD> segment<EFBFBD>w do regulacji wydajno<EFBFBD>ci
|
int Global::iSegmentsRendered = 90; // ilość segmentów do regulacji wydajności
|
||||||
TCamera *Global::pCamera = NULL; // parametry kamery
|
TCamera *Global::pCamera = NULL; // parametry kamery
|
||||||
TDynamicObject *Global::pUserDynamic = NULL; // pojazd u<EFBFBD>ytkownika, renderowany bez trz<EFBFBD>sienia
|
TDynamicObject *Global::pUserDynamic = NULL; // pojazd użytkownika, renderowany bez trzęsienia
|
||||||
bool Global::bSmudge = false; // czy wy<EFBFBD>wietla<EFBFBD> smug<EFBFBD>, a pojazd u<EFBFBD>ytkownika na ko<EFBFBD>cu
|
bool Global::bSmudge = false; // czy wyświetlać smugę, a pojazd użytkownika na końcu
|
||||||
std::string Global::asTranscript[5]; // napisy na ekranie (widoczne)
|
std::string Global::asTranscript[5]; // napisy na ekranie (widoczne)
|
||||||
TTranscripts Global::tranTexts; // obiekt obs<EFBFBD>uguj<EFBFBD>cy stenogramy d<EFBFBD>wi<EFBFBD>k<EFBFBD>w na ekranie
|
TTranscripts Global::tranTexts; // obiekt obsługujący stenogramy dźwięków na ekranie
|
||||||
|
|
||||||
// parametry scenerii
|
// parametry scenerii
|
||||||
vector3 Global::pCameraPosition;
|
vector3 Global::pCameraPosition;
|
||||||
@@ -89,22 +89,22 @@ GLfloat Global::FogColor[] = {0.6f, 0.7f, 0.8f};
|
|||||||
GLfloat Global::ambientDayLight[] = {0.40f, 0.40f, 0.45f, 1.0f}; // robocze
|
GLfloat Global::ambientDayLight[] = {0.40f, 0.40f, 0.45f, 1.0f}; // robocze
|
||||||
GLfloat Global::diffuseDayLight[] = {0.55f, 0.54f, 0.50f, 1.0f};
|
GLfloat Global::diffuseDayLight[] = {0.55f, 0.54f, 0.50f, 1.0f};
|
||||||
GLfloat Global::specularDayLight[] = {0.95f, 0.94f, 0.90f, 1.0f};
|
GLfloat Global::specularDayLight[] = {0.95f, 0.94f, 0.90f, 1.0f};
|
||||||
GLfloat Global::ambientLight[] = {0.80f, 0.80f, 0.85f, 1.0f}; // sta<EFBFBD>e
|
GLfloat Global::ambientLight[] = {0.80f, 0.80f, 0.85f, 1.0f}; // stałe
|
||||||
GLfloat Global::diffuseLight[] = {0.85f, 0.85f, 0.80f, 1.0f};
|
GLfloat Global::diffuseLight[] = {0.85f, 0.85f, 0.80f, 1.0f};
|
||||||
GLfloat Global::specularLight[] = {0.95f, 0.94f, 0.90f, 1.0f};
|
GLfloat Global::specularLight[] = {0.95f, 0.94f, 0.90f, 1.0f};
|
||||||
GLfloat Global::whiteLight[] = {1.00f, 1.00f, 1.00f, 1.0f};
|
GLfloat Global::whiteLight[] = {1.00f, 1.00f, 1.00f, 1.0f};
|
||||||
GLfloat Global::noLight[] = {0.00f, 0.00f, 0.00f, 1.0f};
|
GLfloat Global::noLight[] = {0.00f, 0.00f, 0.00f, 1.0f};
|
||||||
GLfloat Global::darkLight[] = {0.03f, 0.03f, 0.03f, 1.0f}; //<EFBFBD>ladowe
|
GLfloat Global::darkLight[] = {0.03f, 0.03f, 0.03f, 1.0f}; //śladowe
|
||||||
GLfloat Global::lightPos[4];
|
GLfloat Global::lightPos[4];
|
||||||
bool Global::bRollFix = true; // czy wykona<EFBFBD> przeliczanie przechy<EFBFBD>ki
|
bool Global::bRollFix = true; // czy wykonać przeliczanie przechyłki
|
||||||
bool Global::bJoinEvents = false; // czy grupowa<EFBFBD> eventy o tych samych nazwach
|
bool Global::bJoinEvents = false; // czy grupować eventy o tych samych nazwach
|
||||||
int Global::iHiddenEvents = 1; // czy <EFBFBD><EFBFBD>czy<EFBFBD> eventy z torami poprzez nazw<EFBFBD> toru
|
int Global::iHiddenEvents = 1; // czy łączyć eventy z torami poprzez nazwę toru
|
||||||
|
|
||||||
// parametry u<EFBFBD>ytkowe (jak komu pasuje)
|
// parametry użytkowe (jak komu pasuje)
|
||||||
int Global::Keys[MaxKeys];
|
int Global::Keys[MaxKeys];
|
||||||
int Global::iWindowWidth = 800;
|
int Global::iWindowWidth = 800;
|
||||||
int Global::iWindowHeight = 600;
|
int Global::iWindowHeight = 600;
|
||||||
float Global::fDistanceFactor = 768.0; // baza do przeliczania odleg<EFBFBD>o<EFBFBD>ci dla LoD
|
float Global::fDistanceFactor = 768.0; // baza do przeliczania odległości dla LoD
|
||||||
int Global::iFeedbackMode = 1; // tryb pracy informacji zwrotnej
|
int Global::iFeedbackMode = 1; // tryb pracy informacji zwrotnej
|
||||||
int Global::iFeedbackPort = 0; // dodatkowy adres dla informacji zwrotnych
|
int Global::iFeedbackPort = 0; // dodatkowy adres dla informacji zwrotnych
|
||||||
bool Global::bFreeFly = false;
|
bool Global::bFreeFly = false;
|
||||||
@@ -114,82 +114,83 @@ float Global::fMouseXScale = 1.5;
|
|||||||
float Global::fMouseYScale = 0.2;
|
float Global::fMouseYScale = 0.2;
|
||||||
std::string Global::SceneryFile = "td.scn";
|
std::string Global::SceneryFile = "td.scn";
|
||||||
std::string Global::asHumanCtrlVehicle = "EU07-424";
|
std::string Global::asHumanCtrlVehicle = "EU07-424";
|
||||||
int Global::iMultiplayer = 0; // blokada dzia<EFBFBD>ania niekt<EFBFBD>rych funkcji na rzecz komunikacji
|
int Global::iMultiplayer = 0; // blokada działania niektórych funkcji na rzecz komunikacji
|
||||||
double Global::fMoveLight = -1; // ruchome <EFBFBD>wiat<EFBFBD>o
|
double Global::fMoveLight = -1; // ruchome światło
|
||||||
double Global::fLatitudeDeg = 52.0; // szeroko<EFBFBD><EFBFBD> geograficzna
|
double Global::fLatitudeDeg = 52.0; // szerokość geograficzna
|
||||||
float Global::fFriction = 1.0; // mno<EFBFBD>nik tarcia - KURS90
|
float Global::fFriction = 1.0; // mnożnik tarcia - KURS90
|
||||||
double Global::fBrakeStep = 1.0; // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
|
double Global::fBrakeStep = 1.0; // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
|
||||||
std::string Global::asLang = "pl"; // domy<EFBFBD>lny j<EFBFBD>zyk - http://tools.ietf.org/html/bcp47
|
std::string Global::asLang = "pl"; // domyślny język - http://tools.ietf.org/html/bcp47
|
||||||
|
|
||||||
// parametry wydajno<EFBFBD>ciowe (np. regulacja FPS, szybko<EFBFBD><EFBFBD> wczytywania)
|
// parametry wydajnościowe (np. regulacja FPS, szybkość wczytywania)
|
||||||
bool Global::bAdjustScreenFreq = true;
|
bool Global::bAdjustScreenFreq = true;
|
||||||
bool Global::bEnableTraction = true;
|
bool Global::bEnableTraction = true;
|
||||||
bool Global::bLoadTraction = true;
|
bool Global::bLoadTraction = true;
|
||||||
bool Global::bLiveTraction = true;
|
bool Global::bLiveTraction = true;
|
||||||
int Global::iDefaultFiltering = 9; // domy<EFBFBD>lne rozmywanie tekstur TGA bez alfa
|
int Global::iDefaultFiltering = 9; // domyślne rozmywanie tekstur TGA bez alfa
|
||||||
int Global::iBallastFiltering = 9; // domy<EFBFBD>lne rozmywanie tekstur podsypki
|
int Global::iBallastFiltering = 9; // domyślne rozmywanie tekstur podsypki
|
||||||
int Global::iRailProFiltering = 5; // domy<EFBFBD>lne rozmywanie tekstur szyn
|
int Global::iRailProFiltering = 5; // domyślne rozmywanie tekstur szyn
|
||||||
int Global::iDynamicFiltering = 5; // domy<EFBFBD>lne rozmywanie tekstur pojazd<EFBFBD>w
|
int Global::iDynamicFiltering = 5; // domyślne rozmywanie tekstur pojazdów
|
||||||
bool Global::bUseVBO = false; // czy jest VBO w karcie graficznej (czy u<EFBFBD>y<EFBFBD>)
|
bool Global::bUseVBO = false; // czy jest VBO w karcie graficznej (czy użyć)
|
||||||
GLint Global::iMaxTextureSize = 16384; // maksymalny rozmiar tekstury
|
GLint Global::iMaxTextureSize = 16384; // maksymalny rozmiar tekstury
|
||||||
bool Global::bSmoothTraction = false; // wyg<EFBFBD>adzanie drut<EFBFBD>w starym sposobem
|
bool Global::bSmoothTraction = false; // wygładzanie drutów starym sposobem
|
||||||
char **Global::szDefaultExt = Global::szTexturesDDS; // domy<EFBFBD>lnie od DDS
|
char **Global::szDefaultExt = Global::szTexturesDDS; // domyślnie od DDS
|
||||||
int Global::iMultisampling = 2; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px
|
int Global::iMultisampling = 2; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px
|
||||||
bool Global::bGlutFont = false; // czy tekst generowany przez GLUT32.DLL
|
bool Global::bGlutFont = false; // czy tekst generowany przez GLUT32.DLL
|
||||||
int Global::iConvertModels = 7; // tworzenie plik<EFBFBD>w binarnych, +2-optymalizacja transform<EFBFBD>w
|
int Global::iConvertModels = 7; // tworzenie plików binarnych, +2-optymalizacja transformów
|
||||||
int Global::iSlowMotionMask = -1; // maska wy<EFBFBD><EFBFBD>czanych w<EFBFBD>a<EFBFBD>ciwo<EFBFBD>ci dla zwi<EFBFBD>kszenia FPS
|
int Global::iSlowMotionMask = -1; // maska wyłączanych właściwości dla zwiększenia FPS
|
||||||
int Global::iModifyTGA = 7; // czy korygowa<EFBFBD> pliki TGA dla szybszego wczytywania
|
int Global::iModifyTGA = 7; // czy korygować pliki TGA dla szybszego wczytywania
|
||||||
// bool Global::bTerrainCompact=true; //czy zapisa<EFBFBD> teren w pliku
|
// bool Global::bTerrainCompact=true; //czy zapisać teren w pliku
|
||||||
TAnimModel *Global::pTerrainCompact = NULL; // do zapisania terenu w pliku
|
TAnimModel *Global::pTerrainCompact = NULL; // do zapisania terenu w pliku
|
||||||
std::string Global::asTerrainModel = ""; // nazwa obiektu terenu do zapisania w pliku
|
std::string Global::asTerrainModel = ""; // nazwa obiektu terenu do zapisania w pliku
|
||||||
double Global::fFpsAverage = 20.0; // oczekiwana wartos<EFBFBD> FPS
|
double Global::fFpsAverage = 20.0; // oczekiwana wartosć FPS
|
||||||
double Global::fFpsDeviation = 5.0; // odchylenie standardowe FPS
|
double Global::fFpsDeviation = 5.0; // odchylenie standardowe FPS
|
||||||
double Global::fFpsMin = 0.0; // dolna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zmniejszany
|
double Global::fFpsMin = 0.0; // dolna granica FPS, przy której promień scenerii będzie zmniejszany
|
||||||
double Global::fFpsMax = 0.0; // g<EFBFBD>rna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zwi<EFBFBD>kszany
|
double Global::fFpsMax = 0.0; // górna granica FPS, przy której promień scenerii będzie zwiększany
|
||||||
double Global::fFpsRadiusMax = 3000.0; // maksymalny promie<EFBFBD> renderowania
|
double Global::fFpsRadiusMax = 3000.0; // maksymalny promień renderowania
|
||||||
int Global::iFpsRadiusMax = 225; // maksymalny promie<EFBFBD> renderowania
|
int Global::iFpsRadiusMax = 225; // maksymalny promień renderowania
|
||||||
double Global::fRadiusFactor = 1.1; // wsp<EFBFBD><EFBFBD>czynnik jednorazowej zmiany promienia scenerii
|
double Global::fRadiusFactor = 1.1; // współczynnik jednorazowej zmiany promienia scenerii
|
||||||
bool Global::bOldSmudge = false; // U<EFBFBD>ywanie starej smugi
|
bool Global::bOldSmudge = false; // Używanie starej smugi
|
||||||
|
|
||||||
// parametry testowe (do testowania scenerii i obiekt<EFBFBD>w)
|
// parametry testowe (do testowania scenerii i obiektów)
|
||||||
bool Global::bWireFrame = false;
|
bool Global::bWireFrame = false;
|
||||||
bool Global::bSoundEnabled = true;
|
bool Global::bSoundEnabled = true;
|
||||||
int Global::iWriteLogEnabled = 3; // maska bitowa: 1-zapis do pliku, 2-okienko, 4-nazwy tor<EFBFBD>w
|
int Global::iWriteLogEnabled = 3; // maska bitowa: 1-zapis do pliku, 2-okienko, 4-nazwy torów
|
||||||
bool Global::bManageNodes = true;
|
bool Global::bManageNodes = true;
|
||||||
bool Global::bDecompressDDS = false; // czy programowa dekompresja DDS
|
bool Global::bDecompressDDS = false; // czy programowa dekompresja DDS
|
||||||
|
|
||||||
// parametry do kalibracji
|
// parametry do kalibracji
|
||||||
// kolejno wsp<EFBFBD><EFBFBD>czynniki dla pot<EFBFBD>g 0, 1, 2, 3 warto<EFBFBD>ci odczytanej z urz<EFBFBD>dzenia
|
// kolejno współczynniki dla potęg 0, 1, 2, 3 wartości odczytanej z urządzenia
|
||||||
double Global::fCalibrateIn[6][6] = {{0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0},
|
double Global::fCalibrateIn[6][6] = {{0, 1, 0, 0, 0, 0},
|
||||||
{0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}};
|
{0, 1, 0, 0, 0, 0},
|
||||||
double Global::fCalibrateOut[7][6] = {{0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0},
|
{0, 1, 0, 0, 0, 0},
|
||||||
{0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0},
|
{0, 1, 0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0, 0, 0}};
|
||||||
|
double Global::fCalibrateOut[7][6] = {{0, 1, 0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0, 0, 0},
|
||||||
|
{0, 1, 0, 0, 0, 0},
|
||||||
{0, 1, 0, 0, 0, 0}};
|
{0, 1, 0, 0, 0, 0}};
|
||||||
double Global::fCalibrateOutMax[7] = {0, 0, 0, 0, 0, 0, 0};
|
double Global::fCalibrateOutMax[7] = {0, 0, 0, 0, 0, 0, 0};
|
||||||
int Global::iCalibrateOutDebugInfo = -1;
|
int Global::iCalibrateOutDebugInfo = -1;
|
||||||
int Global::iPoKeysPWM[7] = {0, 1, 2, 3, 4, 5, 6};
|
int Global::iPoKeysPWM[7] = {0, 1, 2, 3, 4, 5, 6};
|
||||||
// parametry przej<EFBFBD>ciowe (do usuni<EFBFBD>cia)
|
// parametry przejściowe (do usunięcia)
|
||||||
// bool Global::bTimeChange=false; //Ra: ZiomalCl wy<EFBFBD><EFBFBD>czy<EFBFBD> star<EFBFBD> wersj<EFBFBD> nocy
|
// bool Global::bTimeChange=false; //Ra: ZiomalCl wyłączył starą wersję nocy
|
||||||
// bool Global::bRenderAlpha=true; //Ra: wywali<EFBFBD>am t<EFBFBD> flag<EFBFBD>
|
// bool Global::bRenderAlpha=true; //Ra: wywaliłam tę flagę
|
||||||
bool Global::bnewAirCouplers = true;
|
bool Global::bnewAirCouplers = true;
|
||||||
bool Global::bDoubleAmbient = false; // podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
|
bool Global::bDoubleAmbient = false; // podwójna jasność ambient
|
||||||
double Global::fTimeSpeed = 1.0; // przyspieszenie czasu, zmienna do test<EFBFBD>w
|
double Global::fTimeSpeed = 1.0; // przyspieszenie czasu, zmienna do testów
|
||||||
bool Global::bHideConsole = false; // hunter-271211: ukrywanie konsoli
|
bool Global::bHideConsole = false; // hunter-271211: ukrywanie konsoli
|
||||||
int Global::iBpp = 32; // chyba ju<EFBFBD> nie u<EFBFBD>ywa si<EFBFBD> kart, na kt<EFBFBD>rych 16bpp co<EFBFBD> poprawi
|
int Global::iBpp = 32; // chyba już nie używa się kart, na których 16bpp coś poprawi
|
||||||
// maciek001: konfiguracja wst<EFBFBD>pna portu COM
|
// maciek001: konfiguracja wstępna portu COM
|
||||||
bool Global::bMWDdebugEnable = false;
|
bool Global::bMWDdebugEnable = false;
|
||||||
bool Global::bMWDInputDataEnable = false;
|
bool Global::bMWDInputDataEnable = false;
|
||||||
unsigned int Global::iMWDBaudrate = 500000;
|
unsigned long int Global::iMWDBaudrate = 500000;
|
||||||
std::string Global::sMWDPortId = "COM1"; // nazwa portu z kt<EFBFBD>rego korzystamy - na razie nie dzia<EFBFBD>a
|
std::string Global::sMWDPortId = "COM1"; // nazwa portu z którego korzystamy - na razie nie działa
|
||||||
bool Global::bMWDBreakEnable =
|
bool Global::bMWDBreakEnable = false; // zmienić na FALSE!!! jak już będzie działać wczytywanie z *.ini
|
||||||
false; // zmieni<6E> na FALSE!!! jak ju<6A> b<>dzie dzia<69>a<EFBFBD> wczytywanie z *.ini
|
double Global::fMWDAnalogCalib[4][3] = {{1023, 0, 1023},{1023, 0, 1023},{1023, 0, 1023},{1023, 0, 1023}}; // wartość max potencjometru, wartość min potencjometru, rozdzielczość (max. wartość jaka może być -1)
|
||||||
double Global::fMWDAnalogCalib[4][3] = {
|
|
||||||
{1023, 0, 1023}, {1023, 0, 1023}, {1023, 0, 1023}, {1023, 0, 1023}}; // warto<74><6F> max
|
|
||||||
// potencjometru, warto<74><6F>
|
|
||||||
// min potencjometru,
|
|
||||||
// rozdzielczo<7A><6F> (max.
|
|
||||||
// warto<74><6F> jaka mo<6D>e by<62>
|
|
||||||
// -1)
|
|
||||||
double Global::fMWDzg[2] = {0.9, 1023};
|
double Global::fMWDzg[2] = {0.9, 1023};
|
||||||
double Global::fMWDpg[2] = {0.8, 1023};
|
double Global::fMWDpg[2] = {0.8, 1023};
|
||||||
double Global::fMWDph[2] = {0.6, 1023};
|
double Global::fMWDph[2] = {0.6, 1023};
|
||||||
@@ -217,8 +218,8 @@ void Global::LoadIniFile(std::string asFileName)
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < 10; ++i)
|
for (int i = 0; i < 10; ++i)
|
||||||
{ // zerowanie pozycji kamer
|
{ // zerowanie pozycji kamer
|
||||||
pFreeCameraInit[i] = vector3(0, 0, 0); // wsp<EFBFBD><EFBFBD>rz<EFBFBD>dne w scenerii
|
pFreeCameraInit[i] = vector3(0, 0, 0); // współrzędne w scenerii
|
||||||
pFreeCameraInitAngle[i] = vector3(0, 0, 0); // k<EFBFBD>ty obrotu w radianach
|
pFreeCameraInitAngle[i] = vector3(0, 0, 0); // kąty obrotu w radianach
|
||||||
}
|
}
|
||||||
cParser parser(asFileName, cParser::buffer_FILE);
|
cParser parser(asFileName, cParser::buffer_FILE);
|
||||||
ConfigParse(parser);
|
ConfigParse(parser);
|
||||||
@@ -342,7 +343,7 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Global::iWriteLogEnabled = std::atoi(token.c_str());
|
Global::iWriteLogEnabled = stol_def(token,3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (token == "adjustscreenfreq")
|
else if (token == "adjustscreenfreq")
|
||||||
@@ -360,7 +361,7 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
}
|
}
|
||||||
else if (token == "enabletraction")
|
else if (token == "enabletraction")
|
||||||
{
|
{
|
||||||
// Winger 040204 - 'zywe' patyki dostosowujace sie do trakcji; Ra 2014-03: teraz <EFBFBD>amanie
|
// Winger 040204 - 'zywe' patyki dostosowujace sie do trakcji; Ra 2014-03: teraz łamanie
|
||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
Parser >> token;
|
Parser >> token;
|
||||||
Global::bEnableTraction = (token == "yes");
|
Global::bEnableTraction = (token == "yes");
|
||||||
@@ -373,7 +374,7 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
Global::bLoadTraction = (token == "yes");
|
Global::bLoadTraction = (token == "yes");
|
||||||
}
|
}
|
||||||
else if (token == "friction")
|
else if (token == "friction")
|
||||||
{ // mno<EFBFBD>nik tarcia - KURS90
|
{ // mnożnik tarcia - KURS90
|
||||||
|
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::fFriction;
|
Parser >> Global::fFriction;
|
||||||
@@ -381,7 +382,7 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
else if (token == "livetraction")
|
else if (token == "livetraction")
|
||||||
{
|
{
|
||||||
// Winger 160404 - zaleznosc napiecia loka od trakcji;
|
// Winger 160404 - zaleznosc napiecia loka od trakcji;
|
||||||
// Ra 2014-03: teraz pr<EFBFBD>d przy braku sieci
|
// Ra 2014-03: teraz prąd przy braku sieci
|
||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
Parser >> token;
|
Parser >> token;
|
||||||
Global::bLiveTraction = (token == "yes");
|
Global::bLiveTraction = (token == "yes");
|
||||||
@@ -414,7 +415,7 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
Parser >> token;
|
Parser >> token;
|
||||||
if (token == "tga")
|
if (token == "tga")
|
||||||
{
|
{
|
||||||
// domy<EFBFBD>lnie od TGA
|
// domyślnie od TGA
|
||||||
Global::szDefaultExt = Global::szTexturesTGA;
|
Global::szDefaultExt = Global::szTexturesTGA;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -519,7 +520,7 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
}
|
}
|
||||||
else if (token == "doubleambient")
|
else if (token == "doubleambient")
|
||||||
{
|
{
|
||||||
// podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
|
// podwójna jasność ambient
|
||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
Parser >> token;
|
Parser >> token;
|
||||||
Global::bDoubleAmbient = (token == "yes");
|
Global::bDoubleAmbient = (token == "yes");
|
||||||
@@ -533,15 +534,15 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
{ // pobranie daty z systemu
|
{ // pobranie daty z systemu
|
||||||
std::time_t timenow = std::time(0);
|
std::time_t timenow = std::time(0);
|
||||||
std::tm *localtime = std::localtime(&timenow);
|
std::tm *localtime = std::localtime(&timenow);
|
||||||
Global::fMoveLight = localtime->tm_yday + 1; // numer bie<EFBFBD><EFBFBD>cego dnia w roku
|
Global::fMoveLight = localtime->tm_yday + 1; // numer bieżącego dnia w roku
|
||||||
}
|
}
|
||||||
if (Global::fMoveLight > 0.f) // tu jest nadal zwi<EFBFBD>kszone o 1
|
if (fMoveLight > 0.f) // tu jest nadal zwiększone o 1
|
||||||
{ // obliczenie deklinacji wg:
|
{ // obliczenie deklinacji wg:
|
||||||
// http://naturalfrequency.com/Tregenza_Sharples/Daylight_Algorithms/algorithm_1_11.htm
|
// http://naturalfrequency.com/Tregenza_Sharples/Daylight_Algorithms/algorithm_1_11.htm
|
||||||
// Spencer J W Fourier series representation of the position of the sun Search 2 (5)
|
// Spencer J W Fourier series representation of the position of the sun Search 2 (5)
|
||||||
// 172 (1971)
|
// 172 (1971)
|
||||||
Global::fMoveLight =
|
Global::fMoveLight =
|
||||||
M_PI / 182.5 * (Global::fMoveLight - 1.0); // numer dnia w postaci k<EFBFBD>ta
|
M_PI / 182.5 * (Global::fMoveLight - 1.0); // numer dnia w postaci kąta
|
||||||
fSunDeclination =
|
fSunDeclination =
|
||||||
0.006918 - 0.3999120 * std::cos(fMoveLight) + 0.0702570 * std::sin(fMoveLight) -
|
0.006918 - 0.3999120 * std::cos(fMoveLight) + 0.0702570 * std::sin(fMoveLight) -
|
||||||
0.0067580 * std::cos(2 * fMoveLight) + 0.0009070 * std::sin(2 * fMoveLight) -
|
0.0067580 * std::cos(2 * fMoveLight) + 0.0009070 * std::sin(2 * fMoveLight) -
|
||||||
@@ -550,14 +551,14 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
}
|
}
|
||||||
else if (token == "smoothtraction")
|
else if (token == "smoothtraction")
|
||||||
{
|
{
|
||||||
// podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
|
// podwójna jasność ambient
|
||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
Parser >> token;
|
Parser >> token;
|
||||||
Global::bSmoothTraction = (token == "yes");
|
Global::bSmoothTraction = (token == "yes");
|
||||||
}
|
}
|
||||||
else if (token == "timespeed")
|
else if (token == "timespeed")
|
||||||
{
|
{
|
||||||
// przyspieszenie czasu, zmienna do test<EFBFBD>w
|
// przyspieszenie czasu, zmienna do testów
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::fTimeSpeed;
|
Parser >> Global::fTimeSpeed;
|
||||||
}
|
}
|
||||||
@@ -576,13 +577,13 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
}
|
}
|
||||||
else if (token == "latitude")
|
else if (token == "latitude")
|
||||||
{
|
{
|
||||||
// szeroko<EFBFBD><EFBFBD> geograficzna
|
// szerokość geograficzna
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::fLatitudeDeg;
|
Parser >> Global::fLatitudeDeg;
|
||||||
}
|
}
|
||||||
else if (token == "convertmodels")
|
else if (token == "convertmodels")
|
||||||
{
|
{
|
||||||
// tworzenie plik<EFBFBD>w binarnych
|
// tworzenie plików binarnych
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::iConvertModels;
|
Parser >> Global::iConvertModels;
|
||||||
}
|
}
|
||||||
@@ -595,13 +596,13 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
}
|
}
|
||||||
else if (token == "slowmotion")
|
else if (token == "slowmotion")
|
||||||
{
|
{
|
||||||
// tworzenie plik<EFBFBD>w binarnych
|
// tworzenie plików binarnych
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::iSlowMotionMask;
|
Parser >> Global::iSlowMotionMask;
|
||||||
}
|
}
|
||||||
else if (token == "modifytga")
|
else if (token == "modifytga")
|
||||||
{
|
{
|
||||||
// czy korygowa<EFBFBD> pliki TGA dla szybszego wczytywania
|
// czy korygować pliki TGA dla szybszego wczytywania
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::iModifyTGA;
|
Parser >> Global::iModifyTGA;
|
||||||
}
|
}
|
||||||
@@ -621,14 +622,14 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
}
|
}
|
||||||
else if (token == "rollfix")
|
else if (token == "rollfix")
|
||||||
{
|
{
|
||||||
// Ra: poprawianie przechy<EFBFBD>ki, aby wewn<EFBFBD>trzna szyna by<EFBFBD>a "pozioma"
|
// Ra: poprawianie przechyłki, aby wewnętrzna szyna była "pozioma"
|
||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
Parser >> token;
|
Parser >> token;
|
||||||
Global::bRollFix = (token == "yes");
|
Global::bRollFix = (token == "yes");
|
||||||
}
|
}
|
||||||
else if (token == "fpsaverage")
|
else if (token == "fpsaverage")
|
||||||
{
|
{
|
||||||
// oczekiwana wartos<EFBFBD> FPS
|
// oczekiwana wartość FPS
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::fFpsAverage;
|
Parser >> Global::fFpsAverage;
|
||||||
}
|
}
|
||||||
@@ -640,85 +641,85 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
}
|
}
|
||||||
else if (token == "fpsradiusmax")
|
else if (token == "fpsradiusmax")
|
||||||
{
|
{
|
||||||
// maksymalny promie<EFBFBD> renderowania
|
// maksymalny promień renderowania
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::fFpsRadiusMax;
|
Parser >> Global::fFpsRadiusMax;
|
||||||
}
|
}
|
||||||
else if (token == "calibratein")
|
else if (token == "calibratein")
|
||||||
{
|
{
|
||||||
// parametry kalibracji wej<EFBFBD><EFBFBD>
|
// parametry kalibracji wejść
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
int in;
|
int in;
|
||||||
Parser >> in;
|
Parser >> in;
|
||||||
if ((in < 0) || (in > 5))
|
if ((in < 0) || (in > 5))
|
||||||
{
|
{
|
||||||
in = 5; // na ostatni, bo i tak trzeba pomin<EFBFBD><EFBFBD> warto<EFBFBD>ci
|
in = 5; // na ostatni, bo i tak trzeba pominąć wartości
|
||||||
}
|
}
|
||||||
Parser.getTokens(4, false);
|
Parser.getTokens(4, false);
|
||||||
Parser >> Global::fCalibrateIn[in][0] // wyraz wolny
|
Parser >> Global::fCalibrateIn[in][0] // wyraz wolny
|
||||||
>> Global::fCalibrateIn[in][1] // mno<EFBFBD>nik
|
>> Global::fCalibrateIn[in][1] // mnożnik
|
||||||
>> Global::fCalibrateIn[in][2] // mno<EFBFBD>nik dla kwadratu
|
>> Global::fCalibrateIn[in][2] // mnożnik dla kwadratu
|
||||||
>> Global::fCalibrateIn[in][3]; // mno<EFBFBD>nik dla sze<EFBFBD>cianu
|
>> Global::fCalibrateIn[in][3]; // mnożnik dla sześcianu
|
||||||
Global::fCalibrateIn[in][4] = 0.0; // mno<EFBFBD>nik 4 pot<EFBFBD>gi
|
Global::fCalibrateIn[in][4] = 0.0; // mnożnik 4 potęgi
|
||||||
Global::fCalibrateIn[in][5] = 0.0; // mno<EFBFBD>nik 5 pot<EFBFBD>gi
|
Global::fCalibrateIn[in][5] = 0.0; // mnożnik 5 potęgi
|
||||||
}
|
}
|
||||||
else if (token == "calibrate5din")
|
else if (token == "calibrate5din")
|
||||||
{
|
{
|
||||||
// parametry kalibracji wej<EFBFBD><EFBFBD>
|
// parametry kalibracji wejść
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
int in;
|
int in;
|
||||||
Parser >> in;
|
Parser >> in;
|
||||||
if ((in < 0) || (in > 5))
|
if ((in < 0) || (in > 5))
|
||||||
{
|
{
|
||||||
in = 5; // na ostatni, bo i tak trzeba pomin<EFBFBD><EFBFBD> warto<EFBFBD>ci
|
in = 5; // na ostatni, bo i tak trzeba pominąć wartości
|
||||||
}
|
}
|
||||||
Parser.getTokens(6, false);
|
Parser.getTokens(6, false);
|
||||||
Parser >> Global::fCalibrateIn[in][0] // wyraz wolny
|
Parser >> Global::fCalibrateIn[in][0] // wyraz wolny
|
||||||
>> Global::fCalibrateIn[in][1] // mno<EFBFBD>nik
|
>> Global::fCalibrateIn[in][1] // mnożnik
|
||||||
>> Global::fCalibrateIn[in][2] // mno<EFBFBD>nik dla kwadratu
|
>> Global::fCalibrateIn[in][2] // mnożnik dla kwadratu
|
||||||
>> Global::fCalibrateIn[in][3] // mno<EFBFBD>nik dla sze<EFBFBD>cianu
|
>> Global::fCalibrateIn[in][3] // mnożnik dla sześcianu
|
||||||
>> Global::fCalibrateIn[in][4] // mno<EFBFBD>nik 4 pot<EFBFBD>gi
|
>> Global::fCalibrateIn[in][4] // mnożnik 4 potęgi
|
||||||
>> Global::fCalibrateIn[in][5]; // mno<EFBFBD>nik 5 pot<EFBFBD>gi
|
>> Global::fCalibrateIn[in][5]; // mnożnik 5 potęgi
|
||||||
}
|
}
|
||||||
else if (token == "calibrateout")
|
else if (token == "calibrateout")
|
||||||
{
|
{
|
||||||
// parametry kalibracji wyj<EFBFBD><EFBFBD>
|
// parametry kalibracji wyjść
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
int out;
|
int out;
|
||||||
Parser >> out;
|
Parser >> out;
|
||||||
if ((out < 0) || (out > 6))
|
if ((out < 0) || (out > 6))
|
||||||
{
|
{
|
||||||
out = 6; // na ostatni, bo i tak trzeba pomin<EFBFBD><EFBFBD> warto<EFBFBD>ci
|
out = 6; // na ostatni, bo i tak trzeba pominąć wartości
|
||||||
}
|
}
|
||||||
Parser.getTokens(4, false);
|
Parser.getTokens(4, false);
|
||||||
Parser >> Global::fCalibrateOut[out][0] // wyraz wolny
|
Parser >> Global::fCalibrateOut[out][0] // wyraz wolny
|
||||||
>> Global::fCalibrateOut[out][1] // mno<EFBFBD>nik liniowy
|
>> Global::fCalibrateOut[out][1] // mnożnik liniowy
|
||||||
>> Global::fCalibrateOut[out][2] // mno<EFBFBD>nik dla kwadratu
|
>> Global::fCalibrateOut[out][2] // mnożnik dla kwadratu
|
||||||
>> Global::fCalibrateOut[out][3]; // mno<EFBFBD>nik dla sze<EFBFBD>cianu
|
>> Global::fCalibrateOut[out][3]; // mnożnik dla sześcianu
|
||||||
Global::fCalibrateOut[out][4] = 0.0; // mno<EFBFBD>nik dla 4 pot<EFBFBD>gi
|
Global::fCalibrateOut[out][4] = 0.0; // mnożnik dla 4 potęgi
|
||||||
Global::fCalibrateOut[out][5] = 0.0; // mno<EFBFBD>nik dla 5 pot<EFBFBD>gi
|
Global::fCalibrateOut[out][5] = 0.0; // mnożnik dla 5 potęgi
|
||||||
}
|
}
|
||||||
else if (token == "calibrate5dout")
|
else if (token == "calibrate5dout")
|
||||||
{
|
{
|
||||||
// parametry kalibracji wyj<EFBFBD><EFBFBD>
|
// parametry kalibracji wyjść
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
int out;
|
int out;
|
||||||
Parser >> out;
|
Parser >> out;
|
||||||
if ((out < 0) || (out > 6))
|
if ((out < 0) || (out > 6))
|
||||||
{
|
{
|
||||||
out = 6; // na ostatni, bo i tak trzeba pomin<EFBFBD><EFBFBD> warto<EFBFBD>ci
|
out = 6; // na ostatni, bo i tak trzeba pominąć wartości
|
||||||
}
|
}
|
||||||
Parser.getTokens(6, false);
|
Parser.getTokens(6, false);
|
||||||
Parser >> Global::fCalibrateOut[out][0] // wyraz wolny
|
Parser >> Global::fCalibrateOut[out][0] // wyraz wolny
|
||||||
>> Global::fCalibrateOut[out][1] // mno<EFBFBD>nik liniowy
|
>> Global::fCalibrateOut[out][1] // mnożnik liniowy
|
||||||
>> Global::fCalibrateOut[out][2] // mno<EFBFBD>nik dla kwadratu
|
>> Global::fCalibrateOut[out][2] // mnożnik dla kwadratu
|
||||||
>> Global::fCalibrateOut[out][3] // mno<EFBFBD>nik dla sze<EFBFBD>cianu
|
>> Global::fCalibrateOut[out][3] // mnożnik dla sześcianu
|
||||||
>> Global::fCalibrateOut[out][4] // mno<EFBFBD>nik dla 4 pot<EFBFBD>gi
|
>> Global::fCalibrateOut[out][4] // mnożnik dla 4 potęgi
|
||||||
>> Global::fCalibrateOut[out][5]; // mno<EFBFBD>nik dla 5 pot<EFBFBD>gi
|
>> Global::fCalibrateOut[out][5]; // mnożnik dla 5 potęgi
|
||||||
}
|
}
|
||||||
else if (token == "calibrateoutmaxvalues")
|
else if (token == "calibrateoutmaxvalues")
|
||||||
{
|
{
|
||||||
// maksymalne warto<EFBFBD>ci jakie mo<EFBFBD>na wy<EFBFBD>wietli<EFBFBD> na mierniku
|
// maksymalne wartości jakie można wyświetlić na mierniku
|
||||||
Parser.getTokens(7, false);
|
Parser.getTokens(7, false);
|
||||||
Parser >> Global::fCalibrateOutMax[0] >> Global::fCalibrateOutMax[1] >>
|
Parser >> Global::fCalibrateOutMax[0] >> Global::fCalibrateOutMax[1] >>
|
||||||
Global::fCalibrateOutMax[2] >> Global::fCalibrateOutMax[3] >>
|
Global::fCalibrateOutMax[2] >> Global::fCalibrateOutMax[3] >>
|
||||||
@@ -727,13 +728,13 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
}
|
}
|
||||||
else if (token == "calibrateoutdebuginfo")
|
else if (token == "calibrateoutdebuginfo")
|
||||||
{
|
{
|
||||||
// wyj<EFBFBD>cie z info o przebiegu kalibracji
|
// wyjście z info o przebiegu kalibracji
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::iCalibrateOutDebugInfo;
|
Parser >> Global::iCalibrateOutDebugInfo;
|
||||||
}
|
}
|
||||||
else if (token == "pwm")
|
else if (token == "pwm")
|
||||||
{
|
{
|
||||||
// zmiana numer<EFBFBD>w wyj<EFBFBD><EFBFBD> PWM
|
// zmiana numerów wyjść PWM
|
||||||
Parser.getTokens(2, false);
|
Parser.getTokens(2, false);
|
||||||
int pwm_out, pwm_no;
|
int pwm_out, pwm_no;
|
||||||
Parser >> pwm_out >> pwm_no;
|
Parser >> pwm_out >> pwm_no;
|
||||||
@@ -747,33 +748,33 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
}
|
}
|
||||||
else if (token == "joinduplicatedevents")
|
else if (token == "joinduplicatedevents")
|
||||||
{
|
{
|
||||||
// czy grupowa<EFBFBD> eventy o tych samych nazwach
|
// czy grupować eventy o tych samych nazwach
|
||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
Parser >> token;
|
Parser >> token;
|
||||||
Global::bJoinEvents = (token == "yes");
|
Global::bJoinEvents = (token == "yes");
|
||||||
}
|
}
|
||||||
else if (token == "hiddenevents")
|
else if (token == "hiddenevents")
|
||||||
{
|
{
|
||||||
// czy <EFBFBD><EFBFBD>czy<EFBFBD> eventy z torami poprzez nazw<EFBFBD> toru
|
// czy łączyć eventy z torami poprzez nazwę toru
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::iHiddenEvents;
|
Parser >> Global::iHiddenEvents;
|
||||||
}
|
}
|
||||||
else if (token == "pause")
|
else if (token == "pause")
|
||||||
{
|
{
|
||||||
// czy po wczytaniu ma by<EFBFBD> pauza?
|
// czy po wczytaniu ma być pauza?
|
||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
Parser >> token;
|
Parser >> token;
|
||||||
iPause |= (token == "yes" ? 1 : 0);
|
iPause |= (token == "yes" ? 1 : 0);
|
||||||
}
|
}
|
||||||
else if (token == "lang")
|
else if (token == "lang")
|
||||||
{
|
{
|
||||||
// domy<EFBFBD>lny j<EFBFBD>zyk - http://tools.ietf.org/html/bcp47
|
// domyślny język - http://tools.ietf.org/html/bcp47
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::asLang;
|
Parser >> Global::asLang;
|
||||||
}
|
}
|
||||||
else if (token == "opengl")
|
else if (token == "opengl")
|
||||||
{
|
{
|
||||||
// deklarowana wersja OpenGL, <EFBFBD>eby powstrzyma<EFBFBD> b<EFBFBD><EFBFBD>dy
|
// deklarowana wersja OpenGL, żeby powstrzymać błędy
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> Global::fOpenGL;
|
Parser >> Global::fOpenGL;
|
||||||
}
|
}
|
||||||
@@ -794,7 +795,7 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
}
|
}
|
||||||
// maciek001: ustawienia MWD
|
// maciek001: ustawienia MWD
|
||||||
else if (token == "mwddebug")
|
else if (token == "mwddebug")
|
||||||
{ // czy w<EFBFBD><EFBFBD>czy<EFBFBD> obs<EFBFBD>ug<EFBFBD> hamulc<EFBFBD>w
|
{ // czy włączyć obslugę hamulców
|
||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
Parser >> token;
|
Parser >> token;
|
||||||
bMWDdebugEnable = (token == "yes");
|
bMWDdebugEnable = (token == "yes");
|
||||||
@@ -807,14 +808,14 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
WriteLog("PortName " + sMWDPortId);
|
WriteLog("PortName " + sMWDPortId);
|
||||||
}
|
}
|
||||||
else if (token == "mwdbaudrate")
|
else if (token == "mwdbaudrate")
|
||||||
{ // pobierz pr<EFBFBD>dko<EFBFBD><EFBFBD> transmisji danych
|
{ // pobierz prędkość transmisji danych
|
||||||
Parser.getTokens(1, false);
|
Parser.getTokens(1, false);
|
||||||
Parser >> iMWDBaudrate;
|
Parser >> iMWDBaudrate;
|
||||||
if (bMWDdebugEnable)
|
if (bMWDdebugEnable)
|
||||||
WriteLog("PortName " + to_string(iMWDBaudrate));
|
WriteLog("PortName " + to_string(iMWDBaudrate));
|
||||||
}
|
}
|
||||||
else if (token == "mwdbreakenable")
|
else if (token == "mwdbreakenable")
|
||||||
{ // czy w<EFBFBD><EFBFBD>czy<EFBFBD> obs<EFBFBD>ug<EFBFBD> hamulc<EFBFBD>w
|
{ // czy włączyć obsługę hamulców
|
||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
Parser >> token;
|
Parser >> token;
|
||||||
bMWDBreakEnable = (token == "yes");
|
bMWDBreakEnable = (token == "yes");
|
||||||
@@ -825,18 +826,18 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
Parser >> token;
|
Parser >> token;
|
||||||
bMWDInputDataEnable = (token == "yes");
|
bMWDInputDataEnable = (token == "yes");
|
||||||
}
|
}
|
||||||
else if (token == "mwdbreak") // warto<EFBFBD><EFBFBD> max dla potencjometru hamulca zasadniczego
|
else if (token == "mwdbreak") // wartość max dla potencjometru hamulca zasadniczego
|
||||||
{
|
{
|
||||||
Parser.getTokens();
|
Parser.getTokens();
|
||||||
Parser >> token;
|
Parser >> token;
|
||||||
int i = stol_def(token, -1); // numer wej<EFBFBD>cia
|
int i = stol_def(token, -1); // numer wej�cia
|
||||||
if ((i >= 0) || (i <= 1))
|
if ((i >= 0) || (i <= 1))
|
||||||
{
|
{
|
||||||
Parser.getTokens(3, false);
|
Parser.getTokens(3, false);
|
||||||
Parser >> fMWDAnalogCalib[i][0] // max -> 2^16 -1
|
Parser >> fMWDAnalogCalib[i][0] // max -> 2^16 -1
|
||||||
>> fMWDAnalogCalib[i][1] // min -> 0
|
>> fMWDAnalogCalib[i][1] // min -> 0
|
||||||
>>
|
>>
|
||||||
fMWDAnalogCalib[i][2]; // rozdzielczo<EFBFBD><EFBFBD> -> 255 maksymalna mo<EFBFBD>liwa warto<EFBFBD><EFBFBD> z ADC
|
fMWDAnalogCalib[i][2]; // rozdzielczość -> 255 maksymalna możliwa wartość z ADC
|
||||||
if (bMWDdebugEnable)
|
if (bMWDdebugEnable)
|
||||||
WriteLog("Break settings " + to_string(i) + ": " +
|
WriteLog("Break settings " + to_string(i) + ": " +
|
||||||
to_string(fMWDAnalogCalib[i][0]) + " " +
|
to_string(fMWDAnalogCalib[i][0]) + " " +
|
||||||
@@ -881,47 +882,47 @@ void Global::ConfigParse(cParser &Parser)
|
|||||||
WriteLog("Amp settings: " + to_string(fMWDamp[0]) + " " + to_string(fMWDamp[1]));
|
WriteLog("Amp settings: " + to_string(fMWDamp[0]) + " " + to_string(fMWDamp[1]));
|
||||||
}
|
}
|
||||||
} while ((token != "") && (token != "endconfig")); //(!Parser->EndOfFile)
|
} while ((token != "") && (token != "endconfig")); //(!Parser->EndOfFile)
|
||||||
// na koniec troch<EFBFBD> zale<EFBFBD>no<EFBFBD>ci
|
// na koniec trochę zależności
|
||||||
if (!bLoadTraction) // wczytywanie drut<EFBFBD>w i s<EFBFBD>up<EFBFBD>w
|
if (!bLoadTraction) // wczytywanie drutów i słupów
|
||||||
{ // tutaj wy<EFBFBD><EFBFBD>czenie, bo mog<EFBFBD> nie by<EFBFBD> zdefiniowane w INI
|
{ // tutaj wyłączenie, bo mogą nie być zdefiniowane w INI
|
||||||
bEnableTraction = false; // false = pantograf si<EFBFBD> nie po<EFBFBD>amie
|
bEnableTraction = false; // false = pantograf się nie połamie
|
||||||
bLiveTraction = false; // false = pantografy zawsze zbieraj<EFBFBD> 95% MaxVoltage
|
bLiveTraction = false; // false = pantografy zawsze zbierają 95% MaxVoltage
|
||||||
}
|
}
|
||||||
// if (fMoveLight>0) bDoubleAmbient=false; //wtedy tylko jedno <EFBFBD>wiat<EFBFBD>o ruchome
|
// if (fMoveLight>0) bDoubleAmbient=false; //wtedy tylko jedno światło ruchome
|
||||||
// if (fOpenGL<1.3) iMultisampling=0; //mo<EFBFBD>na by z g<EFBFBD>ry wy<EFBFBD><EFBFBD>czy<EFBFBD>, ale nie mamy jeszcze fOpenGL
|
// if (fOpenGL<1.3) iMultisampling=0; //można by z góry wyłączyć, ale nie mamy jeszcze fOpenGL
|
||||||
if (iMultisampling)
|
if (iMultisampling)
|
||||||
{ // antyaliasing ca<EFBFBD>oekranowy wy<EFBFBD><EFBFBD>cza rozmywanie drut<EFBFBD>w
|
{ // antyaliasing całoekranowy wyłącza rozmywanie drutów
|
||||||
bSmoothTraction = false;
|
bSmoothTraction = false;
|
||||||
}
|
}
|
||||||
if (iMultiplayer > 0)
|
if (iMultiplayer > 0)
|
||||||
{
|
{
|
||||||
bInactivePause = false; // okno "w tle" nie mo<EFBFBD>e pauzowa<EFBFBD>, je<EFBFBD>li w<EFBFBD><EFBFBD>czona komunikacja
|
bInactivePause = false; // okno "w tle" nie może pauzować, jeśli włączona komunikacja
|
||||||
// pauzowanie jest zablokowane dla (iMultiplayer&2)>0, wi<EFBFBD>c iMultiplayer=1 da si<EFBFBD> zapauzowa<EFBFBD>
|
// pauzowanie jest zablokowane dla (iMultiplayer&2)>0, więc iMultiplayer=1 da się zapauzować
|
||||||
// (tryb instruktora)
|
// (tryb instruktora)
|
||||||
}
|
}
|
||||||
fFpsMin = fFpsAverage -
|
fFpsMin = fFpsAverage -
|
||||||
fFpsDeviation; // dolna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zmniejszany
|
fFpsDeviation; // dolna granica FPS, przy której promień scenerii będzie zmniejszany
|
||||||
fFpsMax = fFpsAverage +
|
fFpsMax = fFpsAverage +
|
||||||
fFpsDeviation; // g<EFBFBD>rna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zwi<EFBFBD>kszany
|
fFpsDeviation; // górna granica FPS, przy której promień scenerii będzie zwiększany
|
||||||
if (iPause)
|
if (iPause)
|
||||||
iTextMode = VK_F1; // jak pauza, to pokaza<EFBFBD> zegar
|
iTextMode = VK_F1; // jak pauza, to pokazać zegar
|
||||||
/* this won't execute anymore with the old parser removed
|
/* this won't execute anymore with the old parser removed
|
||||||
// TBD: remove, or launch depending on passed flag?
|
// TBD: remove, or launch depending on passed flag?
|
||||||
if (qp)
|
if (qp)
|
||||||
{ // to poni<EFBFBD>ej wykonywane tylko raz, jedynie po wczytaniu eu07.ini
|
{ // to poniżej wykonywane tylko raz, jedynie po wczytaniu eu07.ini
|
||||||
Console::ModeSet(iFeedbackMode, iFeedbackPort); // tryb pracy konsoli sterowniczej
|
Console::ModeSet(iFeedbackMode, iFeedbackPort); // tryb pracy konsoli sterowniczej
|
||||||
iFpsRadiusMax = 0.000025 * fFpsRadiusMax *
|
iFpsRadiusMax = 0.000025 * fFpsRadiusMax *
|
||||||
fFpsRadiusMax; // maksymalny promie<EFBFBD> renderowania 3000.0 -> 225
|
fFpsRadiusMax; // maksymalny promień renderowania 3000.0 -> 225
|
||||||
if (iFpsRadiusMax > 400)
|
if (iFpsRadiusMax > 400)
|
||||||
iFpsRadiusMax = 400;
|
iFpsRadiusMax = 400;
|
||||||
if (fDistanceFactor > 1.0)
|
if (fDistanceFactor > 1.0)
|
||||||
{ // dla 1.0 specjalny tryb bez przeliczania
|
{ // dla 1.0 specjalny tryb bez przeliczania
|
||||||
fDistanceFactor =
|
fDistanceFactor =
|
||||||
iWindowHeight /
|
iWindowHeight /
|
||||||
fDistanceFactor; // fDistanceFactor>1.0 dla rozdzielczo<EFBFBD>ci wi<EFBFBD>kszych ni<EFBFBD> bazowa
|
fDistanceFactor; // fDistanceFactor>1.0 dla rozdzielczości większych niż bazowa
|
||||||
fDistanceFactor *=
|
fDistanceFactor *=
|
||||||
(iMultisampling + 1.0) *
|
(iMultisampling + 1.0) *
|
||||||
fDistanceFactor; // do kwadratu, bo wi<EFBFBD>kszo<EFBFBD><EFBFBD> odleg<EFBFBD>o<EFBFBD>ci to ich kwadraty
|
fDistanceFactor; // do kwadratu, bo większość odległości to ich kwadraty
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
@@ -931,7 +932,7 @@ void Global::InitKeys(std::string asFileName)
|
|||||||
{
|
{
|
||||||
// if (FileExists(asFileName))
|
// if (FileExists(asFileName))
|
||||||
// {
|
// {
|
||||||
// Error("Chwilowo plik keys.ini nie jest obs<EFBFBD>ugiwany. <EFBFBD>aduj<EFBFBD> standardowe
|
// Error("Chwilowo plik keys.ini nie jest obsługiwany. Ładuję standardowe
|
||||||
// ustawienia.\nKeys.ini file is temporarily not functional, loading default keymap...");
|
// ustawienia.\nKeys.ini file is temporarily not functional, loading default keymap...");
|
||||||
/* TQueryParserComp *Parser;
|
/* TQueryParserComp *Parser;
|
||||||
Parser=new TQueryParserComp(NULL);
|
Parser=new TQueryParserComp(NULL);
|
||||||
@@ -1064,7 +1065,7 @@ void Global::SetCameraPosition(vector3 pNewCameraPosition)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Global::SetCameraRotation(double Yaw)
|
void Global::SetCameraRotation(double Yaw)
|
||||||
{ // ustawienie bezwzgl<EFBFBD>dnego kierunku kamery z korekcj<EFBFBD> do przedzia<EFBFBD>u <-M_PI,M_PI>
|
{ // ustawienie bezwzględnego kierunku kamery z korekcją do przedziału <-M_PI,M_PI>
|
||||||
pCameraRotation = Yaw;
|
pCameraRotation = Yaw;
|
||||||
while (pCameraRotation < -M_PI)
|
while (pCameraRotation < -M_PI)
|
||||||
pCameraRotation += 2 * M_PI;
|
pCameraRotation += 2 * M_PI;
|
||||||
@@ -1074,7 +1075,7 @@ void Global::SetCameraRotation(double Yaw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Global::BindTexture(GLuint t)
|
void Global::BindTexture(GLuint t)
|
||||||
{ // ustawienie aktualnej tekstury, tylko gdy si<EFBFBD> zmienia
|
{ // ustawienie aktualnej tekstury, tylko gdy się zmienia
|
||||||
if (t != iTextureId)
|
if (t != iTextureId)
|
||||||
{
|
{
|
||||||
iTextureId = t;
|
iTextureId = t;
|
||||||
@@ -1082,18 +1083,18 @@ void Global::BindTexture(GLuint t)
|
|||||||
};
|
};
|
||||||
|
|
||||||
void Global::TrainDelete(TDynamicObject *d)
|
void Global::TrainDelete(TDynamicObject *d)
|
||||||
{ // usuni<EFBFBD>cie pojazdu prowadzonego przez u<EFBFBD>ytkownika
|
{ // usunięcie pojazdu prowadzonego przez użytkownika
|
||||||
if (pWorld)
|
if (pWorld)
|
||||||
pWorld->TrainDelete(d);
|
pWorld->TrainDelete(d);
|
||||||
};
|
};
|
||||||
|
|
||||||
TDynamicObject *Global::DynamicNearest()
|
TDynamicObject *Global::DynamicNearest()
|
||||||
{ // ustalenie pojazdu najbli<EFBFBD>szego kamerze
|
{ // ustalenie pojazdu najbliższego kamerze
|
||||||
return pGround->DynamicNearest(pCamera->Pos);
|
return pGround->DynamicNearest(pCamera->Pos);
|
||||||
};
|
};
|
||||||
|
|
||||||
TDynamicObject *Global::CouplerNearest()
|
TDynamicObject *Global::CouplerNearest()
|
||||||
{ // ustalenie pojazdu najbli<EFBFBD>szego kamerze
|
{ // ustalenie pojazdu najbliższego kamerze
|
||||||
return pGround->CouplerNearest(pCamera->Pos);
|
return pGround->CouplerNearest(pCamera->Pos);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1104,7 +1105,7 @@ bool Global::AddToQuery(TEvent *event, TDynamicObject *who)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
bool Global::DoEvents()
|
bool Global::DoEvents()
|
||||||
{ // wywo<EFBFBD>ywa<EFBFBD> czasem, <EFBFBD>eby nie robi<EFBFBD> wra<EFBFBD>enia zawieszonego
|
{ // wywoływać czasem, żeby nie robił wrażenia zawieszonego
|
||||||
MSG msg;
|
MSG msg;
|
||||||
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
|
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
|
||||||
{
|
{
|
||||||
@@ -1119,146 +1120,146 @@ bool Global::DoEvents()
|
|||||||
|
|
||||||
TTranscripts::TTranscripts()
|
TTranscripts::TTranscripts()
|
||||||
{
|
{
|
||||||
iCount = 0; // brak linijek do wy<EFBFBD>wietlenia
|
iCount = 0; // brak linijek do wyświetlenia
|
||||||
iStart = 0; // wype<EFBFBD>nia<EFBFBD> od linijki 0
|
iStart = 0; // wypełniać od linijki 0
|
||||||
for (int i = 0; i < MAX_TRANSCRIPTS; ++i)
|
for (int i = 0; i < MAX_TRANSCRIPTS; ++i)
|
||||||
{ // to do konstruktora mo<EFBFBD>na by da<EFBFBD>
|
{ // to do konstruktora można by dać
|
||||||
aLines[i].fHide = -1.0; // wolna pozycja (czas symulacji, 360.0 to doba)
|
aLines[i].fHide = -1.0; // wolna pozycja (czas symulacji, 360.0 to doba)
|
||||||
aLines[i].iNext = -1; // nie ma kolejnej
|
aLines[i].iNext = -1; // nie ma kolejnej
|
||||||
}
|
}
|
||||||
fRefreshTime = 360.0; // warto<EFBFBD>c zaporowa
|
fRefreshTime = 360.0; // wartośc zaporowa
|
||||||
};
|
};
|
||||||
TTranscripts::~TTranscripts(){};
|
TTranscripts::~TTranscripts(){};
|
||||||
void TTranscripts::AddLine(char const *txt, float show, float hide, bool it)
|
void TTranscripts::AddLine(char const *txt, float show, float hide, bool it)
|
||||||
{ // dodanie linii do tabeli, (show) i (hide) w [s] od aktualnego czasu
|
{ // dodanie linii do tabeli, (show) i (hide) w [s] od aktualnego czasu
|
||||||
if (show == hide)
|
if (show == hide)
|
||||||
return; // komentarz jest ignorowany
|
return; // komentarz jest ignorowany
|
||||||
show = Global::fTimeAngleDeg + show / 240.0; // je<EFBFBD>li doba to 360, to 1s b<EFBFBD>dzie r<EFBFBD>wne 1/240
|
show = Global::fTimeAngleDeg + show / 240.0; // jeśli doba to 360, to 1s będzie równe 1/240
|
||||||
hide = Global::fTimeAngleDeg + hide / 240.0;
|
hide = Global::fTimeAngleDeg + hide / 240.0;
|
||||||
int i = iStart, j, k; // od czego<EFBFBD> trzeba zacz<EFBFBD><EFBFBD>
|
int i = iStart, j, k; // od czegoś trzeba zacząć
|
||||||
while ((aLines[i].iNext >= 0) ? (aLines[aLines[i].iNext].fShow <= show) :
|
while ((aLines[i].iNext >= 0) ? (aLines[aLines[i].iNext].fShow <= show) :
|
||||||
false) // p<EFBFBD>ki nie koniec i wcze<EFBFBD>niej puszczane
|
false) // póki nie koniec i wcześniej puszczane
|
||||||
i = aLines[i].iNext; // przej<EFBFBD>cie do kolejnej linijki
|
i = aLines[i].iNext; // przejście do kolejnej linijki
|
||||||
//(i) wskazuje na lini<EFBFBD>, po kt<EFBFBD>rej nale<EFBFBD>y wstawi<EFBFBD> dany tekst, chyba <EFBFBD>e
|
//(i) wskazuje na linię, po której należy wstawić dany tekst, chyba że
|
||||||
while (txt ? *txt : false)
|
while (txt ? *txt : false)
|
||||||
for (j = 0; j < MAX_TRANSCRIPTS; ++j)
|
for (j = 0; j < MAX_TRANSCRIPTS; ++j)
|
||||||
if (aLines[j].fHide < 0.0)
|
if (aLines[j].fHide < 0.0)
|
||||||
{ // znaleziony pierwszy wolny
|
{ // znaleziony pierwszy wolny
|
||||||
aLines[j].iNext = aLines[i].iNext; // dotychczasowy nast<EFBFBD>pny b<EFBFBD>dzie za nowym
|
aLines[j].iNext = aLines[i].iNext; // dotychczasowy następny będzie za nowym
|
||||||
if (aLines[iStart].fHide < 0.0) // je<EFBFBD>li tablica jest pusta
|
if (aLines[iStart].fHide < 0.0) // jeśli tablica jest pusta
|
||||||
iStart = j; // fHide trzeba sprawdzi<EFBFBD> przed ewentualnym nadpisaniem, gdy i=j=0
|
iStart = j; // fHide trzeba sprawdzić przed ewentualnym nadpisaniem, gdy i=j=0
|
||||||
else
|
else
|
||||||
aLines[i].iNext = j; // a nowy b<EFBFBD>dzie za tamtym wcze<EFBFBD>niejszym
|
aLines[i].iNext = j; // a nowy będzie za tamtym wcześniejszym
|
||||||
aLines[j].fShow = show; // wy<EFBFBD>wietla<EFBFBD> od
|
aLines[j].fShow = show; // wyświetlać od
|
||||||
aLines[j].fHide = hide; // wy<EFBFBD>wietla<EFBFBD> do
|
aLines[j].fHide = hide; // wyświetlać do
|
||||||
aLines[j].bItalic = it;
|
aLines[j].bItalic = it;
|
||||||
aLines[j].asText = std::string(txt); // bez sensu, wystarczy<EFBFBD>by wska<EFBFBD>nik
|
aLines[j].asText = std::string(txt); // bez sensu, wystarczyłby wskaźnik
|
||||||
if ((k = aLines[j].asText.find("|")) != std::string::npos)
|
if ((k = aLines[j].asText.find("|")) != std::string::npos)
|
||||||
{ // jak jest podzia<EFBFBD> linijki na wiersze
|
{ // jak jest podział linijki na wiersze
|
||||||
aLines[j].asText = aLines[j].asText.substr(0, k - 1);
|
aLines[j].asText = aLines[j].asText.substr(0, k - 1);
|
||||||
txt += k;
|
txt += k;
|
||||||
i = j; // kolejna linijka dopisywana b<EFBFBD>dzie na koniec w<EFBFBD>a<EFBFBD>nie dodanej
|
i = j; // kolejna linijka dopisywana będzie na koniec właśnie dodanej
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
txt = NULL; // koniec dodawania
|
txt = NULL; // koniec dodawania
|
||||||
if (fRefreshTime > show) // je<EFBFBD>li od<EFBFBD>wie<EFBFBD>acz ustawiony jest na p<EFBFBD><EFBFBD>niej
|
if (fRefreshTime > show) // jeśli odświeżacz ustawiony jest na później
|
||||||
fRefreshTime = show; // to od<EFBFBD>wie<EFBFBD>y<EFBFBD> wcze<EFBFBD>niej
|
fRefreshTime = show; // to odświeżyć wcześniej
|
||||||
break; // wi<EFBFBD>cej ju<EFBFBD> nic
|
break; // więcej już nic
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
void TTranscripts::Add(char const *txt, float len, bool backgorund)
|
void TTranscripts::Add(char const *txt, float len, bool backgorund)
|
||||||
{ // dodanie tekst<EFBFBD>w, d<EFBFBD>ugo<EFBFBD><EFBFBD> d<EFBFBD>wi<EFBFBD>ku, czy istotne
|
{ // dodanie tekstów, długość dźwięku, czy istotne
|
||||||
if (!txt)
|
if (!txt)
|
||||||
return; // pusty tekst
|
return; // pusty tekst
|
||||||
int i = 0, j = int(0.5 + 10.0 * len); //[0.1s]
|
int i = 0, j = int(0.5 + 10.0 * len); //[0.1s]
|
||||||
if (*txt == '[')
|
if (*txt == '[')
|
||||||
{ // powinny by<EFBFBD> dwa nawiasy
|
{ // powinny być dwa nawiasy
|
||||||
while (*++txt ? *txt != ']' : false)
|
while (*++txt ? *txt != ']' : false)
|
||||||
if ((*txt >= '0') && (*txt <= '9'))
|
if ((*txt >= '0') && (*txt <= '9'))
|
||||||
i = 10 * i + int(*txt - '0'); // pierwsza liczba a<EFBFBD> do ]
|
i = 10 * i + int(*txt - '0'); // pierwsza liczba aż do ]
|
||||||
if (*txt ? *++txt == '[' : false)
|
if (*txt ? *++txt == '[' : false)
|
||||||
{
|
{
|
||||||
j = 0; // drugi nawias okre<EFBFBD>la czas zako<EFBFBD>czenia wy<EFBFBD>wietlania
|
j = 0; // drugi nawias określa czas zakończenia wyświetlania
|
||||||
while (*++txt ? *txt != ']' : false)
|
while (*++txt ? *txt != ']' : false)
|
||||||
if ((*txt >= '0') && (*txt <= '9'))
|
if ((*txt >= '0') && (*txt <= '9'))
|
||||||
j = 10 * j + int(*txt - '0'); // druga liczba a<EFBFBD> do ]
|
j = 10 * j + int(*txt - '0'); // druga liczba aż do ]
|
||||||
if (*txt)
|
if (*txt)
|
||||||
++txt; // pomini<EFBFBD>cie drugiego ]
|
++txt; // pominięcie drugiego ]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AddLine(txt, 0.1 * i, 0.1 * j, false);
|
AddLine(txt, 0.1 * i, 0.1 * j, false);
|
||||||
};
|
};
|
||||||
void TTranscripts::Update()
|
void TTranscripts::Update()
|
||||||
{ // usuwanie niepotrzebnych (nie cz<EFBFBD><EFBFBD>ciej ni<EFBFBD> 10 razy na sekund<EFBFBD>)
|
{ // usuwanie niepotrzebnych (nie częściej niż 10 razy na sekundę)
|
||||||
if (fRefreshTime > Global::fTimeAngleDeg)
|
if (fRefreshTime > Global::fTimeAngleDeg)
|
||||||
return; // nie czas jeszcze na zmiany
|
return; // nie czas jeszcze na zmiany
|
||||||
// czas od<EFBFBD>wie<EFBFBD>enia mo<EFBFBD>na ustali<EFBFBD> wg tabelki, kiedy co<EFBFBD> si<EFBFBD> w niej zmienia
|
// czas odświeżenia można ustalić wg tabelki, kiedy coś się w niej zmienia
|
||||||
fRefreshTime = Global::fTimeAngleDeg + 360.0; // warto<EFBFBD><EFBFBD> zaporowa
|
fRefreshTime = Global::fTimeAngleDeg + 360.0; // wartość zaporowa
|
||||||
int i = iStart, j = -1; // od czego<EFBFBD> trzeba zacz<EFBFBD><EFBFBD>
|
int i = iStart, j = -1; // od czegoś trzeba zacząć
|
||||||
bool change = false; // czy zmienia<EFBFBD> napisy?
|
bool change = false; // czy zmieniać napisy?
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (aLines[i].fHide >= 0.0) // o ile aktywne
|
if (aLines[i].fHide >= 0.0) // o ile aktywne
|
||||||
if (aLines[i].fHide < Global::fTimeAngleDeg)
|
if (aLines[i].fHide < Global::fTimeAngleDeg)
|
||||||
{ // gdy czas wy<EFBFBD>wietlania up<EFBFBD>yn<EFBFBD><EFBFBD>
|
{ // gdy czas wyświetlania upłynął
|
||||||
aLines[i].fHide = -1.0; // teraz b<EFBFBD>dzie woln<EFBFBD> pozycj<EFBFBD>
|
aLines[i].fHide = -1.0; // teraz będzie wolną pozycją
|
||||||
if (i == iStart)
|
if (i == iStart)
|
||||||
iStart = aLines[i].iNext >= 0 ? aLines[i].iNext : 0; // przestawienie pierwszego
|
iStart = aLines[i].iNext >= 0 ? aLines[i].iNext : 0; // przestawienie pierwszego
|
||||||
else if (j >= 0)
|
else if (j >= 0)
|
||||||
aLines[j].iNext = aLines[i].iNext; // usuni<EFBFBD>cie ze <EFBFBD>rodka
|
aLines[j].iNext = aLines[i].iNext; // usunięcie ze środka
|
||||||
change = true;
|
change = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // gdy ma by<EFBFBD> pokazane
|
{ // gdy ma być pokazane
|
||||||
if (aLines[i].fShow > Global::fTimeAngleDeg) // b<EFBFBD>dzie pokazane w przysz<EFBFBD>o<EFBFBD>ci
|
if (aLines[i].fShow > Global::fTimeAngleDeg) // będzie pokazane w przyszłości
|
||||||
if (fRefreshTime > aLines[i].fShow) // a nie ma nic wcze<EFBFBD>niej
|
if (fRefreshTime > aLines[i].fShow) // a nie ma nic wcześniej
|
||||||
fRefreshTime = aLines[i].fShow;
|
fRefreshTime = aLines[i].fShow;
|
||||||
if (fRefreshTime > aLines[i].fHide)
|
if (fRefreshTime > aLines[i].fHide)
|
||||||
fRefreshTime = aLines[i].fHide;
|
fRefreshTime = aLines[i].fHide;
|
||||||
}
|
}
|
||||||
// mo<EFBFBD>na by jeszcze wykrywa<EFBFBD>, kt<EFBFBD>re nowe maj<EFBFBD> by<EFBFBD> pokazane
|
// można by jeszcze wykrywać, które nowe mają być pokazane
|
||||||
j = i;
|
j = i;
|
||||||
i = aLines[i].iNext; // kolejna linijka
|
i = aLines[i].iNext; // kolejna linijka
|
||||||
} while (i >= 0); // p<EFBFBD>ki po tablicy
|
} while (i >= 0); // póki po tablicy
|
||||||
change = true; // bo na razie nie ma warunku, <EFBFBD>e co<EFBFBD> si<EFBFBD> doda<EFBFBD>o
|
change = true; // bo na razie nie ma warunku, że coś się dodało
|
||||||
if (change)
|
if (change)
|
||||||
{ // aktualizacja linijek ekranowych
|
{ // aktualizacja linijek ekranowych
|
||||||
i = iStart;
|
i = iStart;
|
||||||
j = -1;
|
j = -1;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (aLines[i].fHide > 0.0) // je<EFBFBD>li nie ukryte
|
if (aLines[i].fHide > 0.0) // jeśli nie ukryte
|
||||||
if (aLines[i].fShow < Global::fTimeAngleDeg) // to dodanie linijki do wy<EFBFBD>wietlania
|
if (aLines[i].fShow < Global::fTimeAngleDeg) // to dodanie linijki do wyświetlania
|
||||||
if (j < 5 - 1) // ograniczona liczba linijek
|
if (j < 5 - 1) // ograniczona liczba linijek
|
||||||
Global::asTranscript[++j] = aLines[i].asText; // skopiowanie tekstu
|
Global::asTranscript[++j] = aLines[i].asText; // skopiowanie tekstu
|
||||||
i = aLines[i].iNext; // kolejna linijka
|
i = aLines[i].iNext; // kolejna linijka
|
||||||
} while (i >= 0); // p<EFBFBD>ki po tablicy
|
} while (i >= 0); // póki po tablicy
|
||||||
for (++j; j < 5; ++j)
|
for (++j; j < 5; ++j)
|
||||||
Global::asTranscript[j] = ""; // i czyszczenie nieu<EFBFBD>ywanych linijek
|
Global::asTranscript[j] = ""; // i czyszczenie nieużywanych linijek
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Ra: tymczasowe rozwi<EFBFBD>zanie kwestii zagranicznych (czeskich) napis<EFBFBD>w
|
// Ra: tymczasowe rozwiązanie kwestii zagranicznych (czeskich) napisów
|
||||||
char bezogonkowo[] = "E?,?\"_++?%S<STZZ?`'\"\".--??s>stzz"
|
char bezogonkowo[] = "E?,?\"_++?%S<STZZ?`'\"\".--??s>stzz"
|
||||||
"<EFBFBD>^^L$A|S^CS<--RZo<EFBFBD>,l'uP.,as>L\"lz"
|
" ^^L$A|S^CS<--RZo±,l'uP.,as>L\"lz"
|
||||||
"RAAAALCCCEEEEIIDDNNOOOOxRUUUUYTB"
|
"RAAAALCCCEEEEIIDDNNOOOOxRUUUUYTB"
|
||||||
"raaaalccceeeeiiddnnoooo-ruuuuyt?";
|
"raaaalccceeeeiiddnnoooo-ruuuuyt?";
|
||||||
|
|
||||||
std::string Global::Bezogonkow(std::string str, bool _)
|
std::string Global::Bezogonkow(std::string str, bool _)
|
||||||
{ // wyci<EFBFBD>cie liter z ogonkami, bo OpenGL nie umie wy<EFBFBD>wietli<EFBFBD>
|
{ // wycięcie liter z ogonkami, bo OpenGL nie umie wyświetlić
|
||||||
for (unsigned int i = 1; i < str.length(); ++i)
|
for (unsigned int i = 1; i <= str.length(); ++i)
|
||||||
if (str[i] & 0x80)
|
if (str[i] & 0x80)
|
||||||
str[i] = bezogonkowo[str[i] & 0x7F];
|
str[i] = bezogonkowo[str[i] & 0x7F];
|
||||||
else if (str[i] < ' ') // znaki steruj<EFBFBD>ce nie s<EFBFBD> obs<EFBFBD>ugiwane
|
else if (str[i] < ' ') // znaki sterujące nie są obsługiwane
|
||||||
str[i] = ' ';
|
str[i] = ' ';
|
||||||
else if (_)
|
else if (_)
|
||||||
if (str[i] == '_') // nazwy stacji nie mog<EFBFBD> zawiera<EFBFBD> spacji
|
if (str[i] == '_') // nazwy stacji nie mogą zawierać spacji
|
||||||
str[i] = ' '; // wi<EFBFBD>c trzeba wy<EFBFBD>wietla<EFBFBD> inaczej
|
str[i] = ' '; // więc trzeba wyświetlać inaczej
|
||||||
return str;
|
return str;
|
||||||
};
|
};
|
||||||
|
|
||||||
double Global::Min0RSpeed(double vel1, double vel2)
|
double Global::Min0RSpeed(double vel1, double vel2)
|
||||||
{ // rozszerzenie funkcji Min0R o warto<EFBFBD>ci -1.0
|
{ // rozszerzenie funkcji Min0R o wartości -1.0
|
||||||
if (vel1 == -1.0)
|
if (vel1 == -1.0)
|
||||||
{
|
{
|
||||||
vel1 = std::numeric_limits<double>::max();
|
vel1 = std::numeric_limits<double>::max();
|
||||||
|
|||||||
130
Globals.h
130
Globals.h
@@ -110,7 +110,7 @@ const int k_Battery = 72;
|
|||||||
const int k_WalkMode = 73;
|
const int k_WalkMode = 73;
|
||||||
const int MaxKeys = 74;
|
const int MaxKeys = 74;
|
||||||
|
|
||||||
// klasy dla wska<EFBFBD>nik<EFBFBD>w globalnych
|
// klasy dla wskaźników globalnych
|
||||||
class TGround;
|
class TGround;
|
||||||
class TWorld;
|
class TWorld;
|
||||||
class TCamera;
|
class TCamera;
|
||||||
@@ -121,21 +121,21 @@ class TEvent;
|
|||||||
class TTextSound;
|
class TTextSound;
|
||||||
|
|
||||||
class TTranscript
|
class TTranscript
|
||||||
{ // klasa obs<EFBFBD>uguj<EFBFBD>ca linijk<EFBFBD> napisu do d<EFBFBD>wi<EFBFBD>ku
|
{ // klasa obsługująca linijkę napisu do dźwięku
|
||||||
public:
|
public:
|
||||||
float fShow; // czas pokazania
|
float fShow; // czas pokazania
|
||||||
float fHide; // czas ukrycia/usuni<EFBFBD>cia
|
float fHide; // czas ukrycia/usunięcia
|
||||||
std::string asText; // tekst gotowy do wy<EFBFBD>wietlenia (usuni<EFBFBD>te znaczniki czasu)
|
std::string asText; // tekst gotowy do wyświetlenia (usunięte znaczniki czasu)
|
||||||
bool bItalic; // czy kursywa (d<EFBFBD>wi<EFBFBD>k nieistotny dla prowadz<EFBFBD>cego)
|
bool bItalic; // czy kursywa (dźwięk nieistotny dla prowadzącego)
|
||||||
int iNext; // nast<EFBFBD>pna u<EFBFBD>ywana linijka, <EFBFBD>eby nie przestawia<EFBFBD> fizycznie tabeli
|
int iNext; // następna używana linijka, żeby nie przestawiać fizycznie tabeli
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_TRANSCRIPTS 30
|
#define MAX_TRANSCRIPTS 30
|
||||||
class TTranscripts
|
class TTranscripts
|
||||||
{ // klasa obs<EFBFBD>uguj<EFBFBD>ca napisy do d<EFBFBD>wi<EFBFBD>k<EFBFBD>w
|
{ // klasa obsługująca napisy do dźwięków
|
||||||
TTranscript aLines[MAX_TRANSCRIPTS]; // pozycje na napisy do wy<EFBFBD>wietlenia
|
TTranscript aLines[MAX_TRANSCRIPTS]; // pozycje na napisy do wyświetlenia
|
||||||
int iCount; // liczba zaj<EFBFBD>tych pozycji
|
int iCount; // liczba zajętych pozycji
|
||||||
int iStart; // pierwsza istotna pozycja w tabeli, <EFBFBD>eby sortowa<EFBFBD> przestawiaj<EFBFBD>c numerki
|
int iStart; // pierwsza istotna pozycja w tabeli, żeby sortować przestawiając numerki
|
||||||
float fRefreshTime;
|
float fRefreshTime;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -143,23 +143,23 @@ class TTranscripts
|
|||||||
~TTranscripts();
|
~TTranscripts();
|
||||||
void AddLine(char const *txt, float show, float hide, bool it);
|
void AddLine(char const *txt, float show, float hide, bool it);
|
||||||
void Add(char const *txt, float len,
|
void Add(char const *txt, float len,
|
||||||
bool backgorund = false); // dodanie tekst<EFBFBD>w, d<EFBFBD>ugo<EFBFBD><EFBFBD> d<EFBFBD>wi<EFBFBD>ku, czy istotne
|
bool backgorund = false); // dodanie tekstów, długość dźwięku, czy istotne
|
||||||
void Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekund<EFBFBD>)
|
void Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekundę)
|
||||||
};
|
};
|
||||||
|
|
||||||
class Global
|
class Global
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
static GLuint iTextureId; // ostatnio u<EFBFBD>yta tekstura 2D
|
static GLuint iTextureId; // ostatnio użyta tekstura 2D
|
||||||
public:
|
public:
|
||||||
// double Global::tSinceStart;
|
// double Global::tSinceStart;
|
||||||
static int Keys[MaxKeys];
|
static int Keys[MaxKeys];
|
||||||
static Math3D::vector3 pCameraPosition; // pozycja kamery w <EFBFBD>wiecie
|
static Math3D::vector3 pCameraPosition; // pozycja kamery w świecie
|
||||||
static double
|
static double
|
||||||
pCameraRotation; // kierunek bezwzgl<EFBFBD>dny kamery w <EFBFBD>wiecie: 0=p<EFBFBD><EFBFBD>noc, 90<EFBFBD>=zach<EFBFBD>d (-azymut)
|
pCameraRotation; // kierunek bezwzględny kamery w świecie: 0=północ, 90°=zachód (-azymut)
|
||||||
static double pCameraRotationDeg; // w stopniach, dla animacji billboard
|
static double pCameraRotationDeg; // w stopniach, dla animacji billboard
|
||||||
static Math3D::vector3 pFreeCameraInit[ 10 ]; // pozycje kamery
|
static Math3D::vector3 pFreeCameraInit[10]; // pozycje kamery
|
||||||
static Math3D::vector3 pFreeCameraInitAngle[ 10 ];
|
static Math3D::vector3 pFreeCameraInitAngle[10];
|
||||||
static int iWindowWidth;
|
static int iWindowWidth;
|
||||||
static int iWindowHeight;
|
static int iWindowHeight;
|
||||||
static float fDistanceFactor;
|
static float fDistanceFactor;
|
||||||
@@ -227,81 +227,81 @@ class Global
|
|||||||
static std::string asSky;
|
static std::string asSky;
|
||||||
static bool bnewAirCouplers;
|
static bool bnewAirCouplers;
|
||||||
// Ra: nowe zmienne globalne
|
// Ra: nowe zmienne globalne
|
||||||
static int iDefaultFiltering; // domy<EFBFBD>lne rozmywanie tekstur TGA
|
static int iDefaultFiltering; // domyślne rozmywanie tekstur TGA
|
||||||
static int iBallastFiltering; // domy<EFBFBD>lne rozmywanie tekstury podsypki
|
static int iBallastFiltering; // domyślne rozmywanie tekstury podsypki
|
||||||
static int iRailProFiltering; // domy<EFBFBD>lne rozmywanie tekstury szyn
|
static int iRailProFiltering; // domyślne rozmywanie tekstury szyn
|
||||||
static int iDynamicFiltering; // domy<EFBFBD>lne rozmywanie tekstur pojazd<EFBFBD>w
|
static int iDynamicFiltering; // domyślne rozmywanie tekstur pojazdów
|
||||||
static int iReCompile; // zwi<EFBFBD>kszany, gdy trzeba od<EFBFBD>wie<EFBFBD>y<EFBFBD> siatki
|
static int iReCompile; // zwiększany, gdy trzeba odświeżyć siatki
|
||||||
static bool bUseVBO; // czy jest VBO w karcie graficznej
|
static bool bUseVBO; // czy jest VBO w karcie graficznej
|
||||||
static int iFeedbackMode; // tryb pracy informacji zwrotnej
|
static int iFeedbackMode; // tryb pracy informacji zwrotnej
|
||||||
static int iFeedbackPort; // dodatkowy adres dla informacji zwrotnych
|
static int iFeedbackPort; // dodatkowy adres dla informacji zwrotnych
|
||||||
static double fOpenGL; // wersja OpenGL - przyda si<EFBFBD>
|
static double fOpenGL; // wersja OpenGL - przyda się
|
||||||
static bool bOpenGL_1_5; // czy s<EFBFBD> dost<EFBFBD>pne funkcje OpenGL 1.5
|
static bool bOpenGL_1_5; // czy są dostępne funkcje OpenGL 1.5
|
||||||
static double fLuminance; // jasno<EFBFBD><EFBFBD> <20>wiat<EFBFBD>a do automatycznego zapalania
|
static double fLuminance; // jasność światła do automatycznego zapalania
|
||||||
static int iMultiplayer; // blokada dzia<EFBFBD>ania niekt<EFBFBD>rych event<EFBFBD>w na rzecz kominikacji
|
static int iMultiplayer; // blokada działania niektórych eventów na rzecz kominikacji
|
||||||
static HWND hWnd; // uchwyt okna
|
static HWND hWnd; // uchwyt okna
|
||||||
static int iCameraLast;
|
static int iCameraLast;
|
||||||
static std::string asRelease; // numer
|
static std::string asRelease; // numer
|
||||||
static std::string asVersion; // z opisem
|
static std::string asVersion; // z opisem
|
||||||
static int
|
static int
|
||||||
iViewMode; // co aktualnie wida<EFBFBD>: 0-kabina, 1-latanie, 2-sprz<EFBFBD>gi, 3-dokumenty, 4-obwody
|
iViewMode; // co aktualnie widać: 0-kabina, 1-latanie, 2-sprzęgi, 3-dokumenty, 4-obwody
|
||||||
static GLint iMaxTextureSize; // maksymalny rozmiar tekstury
|
static GLint iMaxTextureSize; // maksymalny rozmiar tekstury
|
||||||
static int iTextMode; // tryb pracy wy<EFBFBD>wietlacza tekstowego
|
static int iTextMode; // tryb pracy wyświetlacza tekstowego
|
||||||
static int iScreenMode[12]; // numer ekranu wy<EFBFBD>wietlacza tekstowego
|
static int iScreenMode[12]; // numer ekranu wyświetlacza tekstowego
|
||||||
static bool bDoubleAmbient; // podw<EFBFBD>jna jasno<EFBFBD><EFBFBD> ambient
|
static bool bDoubleAmbient; // podwójna jasność ambient
|
||||||
static double fMoveLight; // numer dnia w roku albo -1
|
static double fMoveLight; // numer dnia w roku albo -1
|
||||||
static bool bSmoothTraction; // wyg<EFBFBD>adzanie drut<EFBFBD>w
|
static bool bSmoothTraction; // wygładzanie drutów
|
||||||
static double fSunDeclination; // deklinacja S<EFBFBD>o<EFBFBD>ca
|
static double fSunDeclination; // deklinacja Słońca
|
||||||
static double fTimeSpeed; // przyspieszenie czasu, zmienna do test<EFBFBD>w
|
static double fTimeSpeed; // przyspieszenie czasu, zmienna do testów
|
||||||
static double fTimeAngleDeg; // godzina w postaci k<EFBFBD>ta
|
static double fTimeAngleDeg; // godzina w postaci kąta
|
||||||
static float fClockAngleDeg[6]; // k<EFBFBD>ty obrotu cylindr<EFBFBD>w dla zegara cyfrowego
|
static float fClockAngleDeg[6]; // kąty obrotu cylindrów dla zegara cyfrowego
|
||||||
static double fLatitudeDeg; // szeroko<EFBFBD><EFBFBD> geograficzna
|
static double fLatitudeDeg; // szerokość geograficzna
|
||||||
static char *szTexturesTGA[4]; // lista tekstur od TGA
|
static char *szTexturesTGA[4]; // lista tekstur od TGA
|
||||||
static char *szTexturesDDS[4]; // lista tekstur od DDS
|
static char *szTexturesDDS[4]; // lista tekstur od DDS
|
||||||
static int iMultisampling; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px
|
static int iMultisampling; // tryb antyaliasingu: 0=brak,1=2px,2=4px,3=8px,4=16px
|
||||||
static bool bGlutFont; // tekst generowany przez GLUT
|
static bool bGlutFont; // tekst generowany przez GLUT
|
||||||
static int iKeyLast; // ostatnio naci<EFBFBD>ni<EFBFBD>ty klawisz w celu logowania
|
static int iKeyLast; // ostatnio naciśnięty klawisz w celu logowania
|
||||||
static int iPause; // globalna pauza ruchu: b0=start,b1=klawisz,b2=t<EFBFBD>o,b3=lagi,b4=wczytywanie
|
static int iPause; // globalna pauza ruchu: b0=start,b1=klawisz,b2=tło,b3=lagi,b4=wczytywanie
|
||||||
static bool bActive; // czy jest aktywnym oknem
|
static bool bActive; // czy jest aktywnym oknem
|
||||||
static void BindTexture(GLuint t);
|
static void BindTexture(GLuint t);
|
||||||
static int iConvertModels; // tworzenie plik<EFBFBD>w binarnych
|
static int iConvertModels; // tworzenie plików binarnych
|
||||||
static int iErorrCounter; // licznik sprawdza<EFBFBD> do <EFBFBD>ledzenia b<EFBFBD><EFBFBD>d<EFBFBD>w OpenGL
|
static int iErorrCounter; // licznik sprawdzań do śledzenia błędów OpenGL
|
||||||
static bool bInactivePause; // automatyczna pauza, gdy okno nieaktywne
|
static bool bInactivePause; // automatyczna pauza, gdy okno nieaktywne
|
||||||
static int iTextures; // licznik u<EFBFBD>ytych tekstur
|
static int iTextures; // licznik użytych tekstur
|
||||||
static int iSlowMotionMask; // maska wy<EFBFBD><EFBFBD>czanych w<EFBFBD>a<EFBFBD>ciwo<EFBFBD>ci
|
static int iSlowMotionMask; // maska wyłączanych właściwości
|
||||||
static int iModifyTGA; // czy korygowa<EFBFBD> pliki TGA dla szybszego wczytywania
|
static int iModifyTGA; // czy korygować pliki TGA dla szybszego wczytywania
|
||||||
static bool bHideConsole; // hunter-271211: ukrywanie konsoli
|
static bool bHideConsole; // hunter-271211: ukrywanie konsoli
|
||||||
static bool bOldSmudge; // U<EFBFBD>ywanie starej smugi
|
static bool bOldSmudge; // Używanie starej smugi
|
||||||
|
|
||||||
static TWorld *pWorld; // wska<EFBFBD>nik na <EFBFBD>wiat do usuwania pojazd<EFBFBD>w
|
static TWorld *pWorld; // wskaźnik na świat do usuwania pojazdów
|
||||||
static TAnimModel *pTerrainCompact; // obiekt terenu do ewentualnego zapisania w pliku
|
static TAnimModel *pTerrainCompact; // obiekt terenu do ewentualnego zapisania w pliku
|
||||||
static std::string asTerrainModel; // nazwa obiektu terenu do zapisania w pliku
|
static std::string asTerrainModel; // nazwa obiektu terenu do zapisania w pliku
|
||||||
static bool bRollFix; // czy wykona<EFBFBD> przeliczanie przechy<EFBFBD>ki
|
static bool bRollFix; // czy wykonać przeliczanie przechyłki
|
||||||
static cParser *pParser;
|
static cParser *pParser;
|
||||||
static int iSegmentsRendered; // ilo<EFBFBD><EFBFBD> segment<EFBFBD>w do regulacji wydajno<EFBFBD>ci
|
static int iSegmentsRendered; // ilość segmentów do regulacji wydajności
|
||||||
static double fFpsAverage; // oczekiwana wartos<EFBFBD> FPS
|
static double fFpsAverage; // oczekiwana wartosć FPS
|
||||||
static double fFpsDeviation; // odchylenie standardowe FPS
|
static double fFpsDeviation; // odchylenie standardowe FPS
|
||||||
static double fFpsMin; // dolna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zmniejszany
|
static double fFpsMin; // dolna granica FPS, przy której promień scenerii będzie zmniejszany
|
||||||
static double fFpsMax; // g<EFBFBD>rna granica FPS, przy kt<EFBFBD>rej promie<EFBFBD> scenerii b<EFBFBD>dzie zwi<EFBFBD>kszany
|
static double fFpsMax; // górna granica FPS, przy której promień scenerii będzie zwiększany
|
||||||
static double fFpsRadiusMax; // maksymalny promie<EFBFBD> renderowania
|
static double fFpsRadiusMax; // maksymalny promień renderowania
|
||||||
static int iFpsRadiusMax; // maksymalny promie<EFBFBD> renderowania w rozmiarze tabeli sektor<EFBFBD>w
|
static int iFpsRadiusMax; // maksymalny promień renderowania w rozmiarze tabeli sektorów
|
||||||
static double fRadiusFactor; // wsp<EFBFBD><EFBFBD>czynnik zmiany promienia
|
static double fRadiusFactor; // współczynnik zmiany promienia
|
||||||
static TCamera *pCamera; // parametry kamery
|
static TCamera *pCamera; // parametry kamery
|
||||||
static TDynamicObject *pUserDynamic; // pojazd u<EFBFBD>ytkownika, renderowany bez trz<EFBFBD>sienia
|
static TDynamicObject *pUserDynamic; // pojazd użytkownika, renderowany bez trzęsienia
|
||||||
static double fCalibrateIn[6][6]; // parametry kalibracyjne wej<EFBFBD><EFBFBD> z pulpitu
|
static double fCalibrateIn[6][6]; // parametry kalibracyjne wejść z pulpitu
|
||||||
static double fCalibrateOut[7][6]; // parametry kalibracyjne wyj<EFBFBD><EFBFBD> dla pulpitu
|
static double fCalibrateOut[7][6]; // parametry kalibracyjne wyjść dla pulpitu
|
||||||
static double fCalibrateOutMax[7]; // warto<EFBFBD>ci maksymalne wyj<EFBFBD><EFBFBD> dla pulpitu
|
static double fCalibrateOutMax[7]; // wartości maksymalne wyjść dla pulpitu
|
||||||
static int iCalibrateOutDebugInfo; // numer wyj<EFBFBD>cia kalibrowanego dla kt<EFBFBD>rego wy<EFBFBD>wietla<EFBFBD>
|
static int iCalibrateOutDebugInfo; // numer wyjścia kalibrowanego dla którego wyświetlać
|
||||||
// informacje podczas kalibracji
|
// informacje podczas kalibracji
|
||||||
static double fBrakeStep; // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
|
static double fBrakeStep; // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
|
||||||
static bool bJoinEvents; // czy grupowa<EFBFBD> eventy o tych samych nazwach
|
static bool bJoinEvents; // czy grupować eventy o tych samych nazwach
|
||||||
static bool bSmudge; // czy wy<EFBFBD>wietla<EFBFBD> smug<EFBFBD>, a pojazd u<EFBFBD>ytkownika na ko<EFBFBD>cu
|
static bool bSmudge; // czy wyświetlać smugę, a pojazd użytkownika na końcu
|
||||||
static std::string asTranscript[5]; // napisy na ekranie (widoczne)
|
static std::string asTranscript[5]; // napisy na ekranie (widoczne)
|
||||||
static TTranscripts tranTexts; // obiekt obs<EFBFBD>uguj<EFBFBD>cy stenogramy d<EFBFBD>wi<EFBFBD>k<EFBFBD>w na ekranie
|
static TTranscripts tranTexts; // obiekt obsługujący stenogramy dźwięków na ekranie
|
||||||
static std::string asLang; // domy<EFBFBD>lny j<EFBFBD>zyk - http://tools.ietf.org/html/bcp47
|
static std::string asLang; // domyślny język - http://tools.ietf.org/html/bcp47
|
||||||
static int iHiddenEvents; // czy <EFBFBD><EFBFBD>czy<EFBFBD> eventy z torami poprzez nazw<EFBFBD> toru
|
static int iHiddenEvents; // czy łączyć eventy z torami poprzez nazwę toru
|
||||||
static TTextSound *tsRadioBusy[10]; // zaj<EFBFBD>to<EFBFBD><EFBFBD> kana<EFBFBD><EFBFBD>w radiowych (wska<EFBFBD>nik na odgrywany d<EFBFBD>wi<EFBFBD>k)
|
static TTextSound *tsRadioBusy[10]; // zajętość kanałów radiowych (wskaźnik na odgrywany dźwięk)
|
||||||
static int iPoKeysPWM[7]; // numery wej<EFBFBD><EFBFBD> dla PWM
|
static int iPoKeysPWM[7]; // numery wejść dla PWM
|
||||||
|
|
||||||
// metody
|
// metody
|
||||||
static void TrainDelete(TDynamicObject *d);
|
static void TrainDelete(TDynamicObject *d);
|
||||||
|
|||||||
2062
Ground.cpp
2062
Ground.cpp
File diff suppressed because it is too large
Load Diff
150
Ground.h
150
Ground.h
@@ -18,9 +18,9 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
|
|
||||||
using namespace Math3D;
|
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_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_DUMMYTRACK = 12; // Ra: zdublowanie obiektu toru dla rozdzielenia tekstur
|
||||||
const int TP_TERRAIN = 13; // Ra: specjalny model dla terenu
|
const int TP_TERRAIN = 13; // Ra: specjalny model dla terenu
|
||||||
const int TP_DYNAMIC = 14;
|
const int TP_DYNAMIC = 14;
|
||||||
@@ -67,15 +67,15 @@ struct TGroundVertex
|
|||||||
vector3 Normal;
|
vector3 Normal;
|
||||||
float tu, tv;
|
float tu, tv;
|
||||||
void HalfSet(const TGroundVertex &v1, const TGroundVertex &v2)
|
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);
|
Point = 0.5 * (v1.Point + v2.Point);
|
||||||
Normal = 0.5 * (v1.Normal + v2.Normal);
|
Normal = 0.5 * (v1.Normal + v2.Normal);
|
||||||
tu = 0.5 * (v1.tu + v2.tu);
|
tu = 0.5 * (v1.tu + v2.tu);
|
||||||
tv = 0.5 * (v1.tv + v2.tv);
|
tv = 0.5 * (v1.tv + v2.tv);
|
||||||
}
|
}
|
||||||
void SetByX(const TGroundVertex &v1, const TGroundVertex &v2, double x)
|
void SetByX(const TGroundVertex &v1, const TGroundVertex &v2, double x)
|
||||||
{ // wyliczenie współrzędnych i mapowania punktu na odcinku v1<->v2
|
{ // 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 i = (x - v1.Point.x) / (v2.Point.x - v1.Point.x); // parametr równania
|
||||||
double j = 1.0 - i;
|
double j = 1.0 - i;
|
||||||
Point = j * v1.Point + i * v2.Point;
|
Point = j * v1.Point + i * v2.Point;
|
||||||
Normal = j * v1.Normal + i * v2.Normal;
|
Normal = j * v1.Normal + i * v2.Normal;
|
||||||
@@ -83,8 +83,8 @@ struct TGroundVertex
|
|||||||
tv = j * v1.tv + i * v2.tv;
|
tv = j * v1.tv + i * v2.tv;
|
||||||
}
|
}
|
||||||
void SetByZ(const TGroundVertex &v1, const TGroundVertex &v2, double z)
|
void SetByZ(const TGroundVertex &v1, const TGroundVertex &v2, double z)
|
||||||
{ // wyliczenie współrzędnych i mapowania punktu na odcinku v1<->v2
|
{ // 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 i = (z - v1.Point.z) / (v2.Point.z - v1.Point.z); // parametr równania
|
||||||
double j = 1.0 - i;
|
double j = 1.0 - i;
|
||||||
Point = j * v1.Point + i * v2.Point;
|
Point = j * v1.Point + i * v2.Point;
|
||||||
Normal = j * v1.Normal + i * v2.Normal;
|
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
|
class TGroundNode : public Resource
|
||||||
{ // obiekt scenerii
|
{ // obiekt scenerii
|
||||||
@@ -101,64 +101,64 @@ class TGroundNode : public Resource
|
|||||||
public:
|
public:
|
||||||
TGroundNodeType iType; // typ obiektu
|
TGroundNodeType iType; // typ obiektu
|
||||||
union
|
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
|
void *Pointer; // do przypisywania NULL
|
||||||
TSubModel *smTerrain; // modele terenu (kwadratow kilometrowych)
|
TSubModel *smTerrain; // modele terenu (kwadratow kilometrowych)
|
||||||
TAnimModel *Model; // model z animacjami
|
TAnimModel *Model; // model z animacjami
|
||||||
TDynamicObject *DynamicObject; // pojazd
|
TDynamicObject *DynamicObject; // pojazd
|
||||||
vector3 *Points; // punkty dla linii
|
vector3 *Points; // punkty dla linii
|
||||||
TTrack *pTrack; // trajektoria ruchu
|
TTrack *pTrack; // trajektoria ruchu
|
||||||
TGroundVertex *Vertices; // wierzchołki dla trójkątów
|
TGroundVertex *Vertices; // wierzchołki dla trójkątów
|
||||||
TMemCell *MemCell; // komórka pamięci
|
TMemCell *MemCell; // komórka pamięci
|
||||||
TEventLauncher *EvLaunch; // wyzwalacz zdarzeń
|
TEventLauncher *EvLaunch; // wyzwalacz zdarzeń
|
||||||
TTraction *hvTraction; // drut zasilający
|
TTraction *hvTraction; // drut zasilający
|
||||||
TTractionPowerSource *psTractionPowerSource; // zasilanie drutu (zaniedbane w sceneriach)
|
TTractionPowerSource *psTractionPowerSource; // zasilanie drutu (zaniedbane w sceneriach)
|
||||||
TTextSound *tsStaticSound; // dźwięk przestrzenny
|
TTextSound *tsStaticSound; // dźwięk przestrzenny
|
||||||
TGroundNode *nNode; // obiekt renderujący grupowo ma tu wskaźnik na listę obiektów
|
TGroundNode *nNode; // obiekt renderujący grupowo ma tu wskaźnik na listę obiektów
|
||||||
};
|
};
|
||||||
std::string asName; // nazwa (nie zawsze ma znaczenie)
|
std::string asName; // nazwa (nie zawsze ma znaczenie)
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
int iNumVerts; // dla trójkątów
|
int iNumVerts; // dla trójkątów
|
||||||
int iNumPts; // dla linii
|
int iNumPts; // dla linii
|
||||||
int iCount; // dla terenu
|
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
|
union
|
||||||
{
|
{
|
||||||
// double fAngle; //kąt obrotu dla modelu
|
// double fAngle; //kąt obrotu dla modelu
|
||||||
double fLineThickness; // McZapkie-120702: grubosc linii
|
double fLineThickness; // McZapkie-120702: grubosc linii
|
||||||
// int Status; //McZapkie-170303: status dzwieku
|
// int Status; //McZapkie-170303: status dzwieku
|
||||||
};
|
};
|
||||||
double fSquareRadius; // kwadrat widoczności do
|
double fSquareRadius; // kwadrat widoczności do
|
||||||
double fSquareMinRadius; // kwadrat widoczności od
|
double fSquareMinRadius; // kwadrat widoczności od
|
||||||
// TGroundNode *nMeshGroup; //Ra: obiekt grupujący trójkąty w TSubRect dla tekstury
|
// TGroundNode *nMeshGroup; //Ra: obiekt grupujący trójkąty w TSubRect dla tekstury
|
||||||
int iVersion; // wersja siatki (do wykonania rekompilacji)
|
int iVersion; // wersja siatki (do wykonania rekompilacji)
|
||||||
// union ?
|
// union ?
|
||||||
GLuint DisplayListID; // numer siatki DisplayLists
|
GLuint DisplayListID; // numer siatki DisplayLists
|
||||||
bool PROBLEND;
|
bool PROBLEND;
|
||||||
int iVboPtr; // indeks w buforze VBO
|
int iVboPtr; // indeks w buforze VBO
|
||||||
GLuint TextureID; // główna (jedna) tekstura obiektu
|
GLuint TextureID; // główna (jedna) tekstura obiektu
|
||||||
int iFlags; // tryb przezroczystości: 0x10-nieprz.,0x20-przezroczysty,0x30-mieszany
|
int iFlags; // tryb przezroczystości: 0x10-nieprz.,0x20-przezroczysty,0x30-mieszany
|
||||||
int Ambient[4], Diffuse[4], Specular[4]; // oświetlenie
|
int Ambient[4], Diffuse[4], Specular[4]; // oświetlenie
|
||||||
bool bVisible;
|
bool bVisible;
|
||||||
TGroundNode *nNext; // lista wszystkich w scenerii, ostatni na początku
|
TGroundNode *nNext; // lista wszystkich w scenerii, ostatni na początku
|
||||||
TGroundNode *nNext2; // lista obiektów w sektorze
|
TGroundNode *nNext2; // lista obiektów w sektorze
|
||||||
TGroundNode *nNext3; // lista obiektów renderowanych we wspólnym cyklu
|
TGroundNode *nNext3; // lista obiektów renderowanych we wspólnym cyklu
|
||||||
TGroundNode();
|
TGroundNode();
|
||||||
TGroundNode(TGroundNodeType t, int n = 0);
|
TGroundNode(TGroundNodeType t, int n = 0);
|
||||||
~TGroundNode();
|
~TGroundNode();
|
||||||
void Init(int n);
|
void Init(int n);
|
||||||
void InitCenter(); // obliczenie współrzędnych środka
|
void InitCenter(); // obliczenie współrzędnych środka
|
||||||
void InitNormals();
|
void InitNormals();
|
||||||
|
|
||||||
void MoveMe(vector3 pPosition); // przesuwanie (nie działa)
|
void MoveMe(vector3 pPosition); // przesuwanie (nie działa)
|
||||||
|
|
||||||
// bool Disable();
|
// bool Disable();
|
||||||
inline TGroundNode * Find(const std::string &asNameToFind, TGroundNodeType iNodeType)
|
inline TGroundNode * Find(const std::string &asNameToFind, TGroundNodeType iNodeType)
|
||||||
{ // wyszukiwanie czołgowe z typem
|
{ // wyszukiwanie czołgowe z typem
|
||||||
if ((iNodeType == iType) && (asNameToFind == asName))
|
if ((iNodeType == iType) && (asNameToFind == asName))
|
||||||
return this;
|
return this;
|
||||||
else if (nNext)
|
else if (nNext)
|
||||||
@@ -170,36 +170,36 @@ class TGroundNode : public Resource
|
|||||||
void Release();
|
void Release();
|
||||||
bool GetTraction();
|
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 RenderDL(); // renderowanie nieprzezroczystych w Display Lists
|
||||||
void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists
|
void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists
|
||||||
// (McZapkie-131202)
|
// (McZapkie-131202)
|
||||||
void RaRenderVBO(); // renderowanie (nieprzezroczystych) ze wspólnego VBO
|
void RaRenderVBO(); // renderowanie (nieprzezroczystych) ze wspólnego VBO
|
||||||
void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
|
void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
|
||||||
void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
|
void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
|
||||||
};
|
};
|
||||||
|
|
||||||
class TSubRect : public Resource, public CMesh
|
class TSubRect : public Resource, public CMesh
|
||||||
{ // sektor składowy kwadratu kilometrowego
|
{ // sektor składowy kwadratu kilometrowego
|
||||||
public:
|
public:
|
||||||
int iTracks = 0; // ilość torów w (tTracks)
|
int iTracks = 0; // ilość torów w (tTracks)
|
||||||
TTrack **tTracks = nullptr; // tory do renderowania pojazdów
|
TTrack **tTracks = nullptr; // tory do renderowania pojazdów
|
||||||
protected:
|
protected:
|
||||||
TTrack *tTrackAnim = nullptr; // obiekty do przeliczenia animacji
|
TTrack *tTrackAnim = nullptr; // obiekty do przeliczenia animacji
|
||||||
TGroundNode *nRootMesh = nullptr; // obiekty renderujące wg tekstury (wtórne, lista po nNext2)
|
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 *nMeshed = nullptr; / lista obiektów dla których istnieją obiekty renderujące grupowo
|
||||||
public:
|
public:
|
||||||
TGroundNode *
|
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 *
|
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 *nRenderRect = nullptr; // z poziomu sektora - nieprzezroczyste (nNext3)
|
||||||
TGroundNode *nRenderRectAlpha = nullptr; // z poziomu sektora - przezroczyste (nNext3)
|
TGroundNode *nRenderRectAlpha = nullptr; // z poziomu sektora - przezroczyste (nNext3)
|
||||||
TGroundNode *nRenderWires = nullptr; // z poziomu sektora - druty i inne linie (nNext3)
|
TGroundNode *nRenderWires = nullptr; // z poziomu sektora - druty i inne linie (nNext3)
|
||||||
TGroundNode *nRender = nullptr; // indywidualnie - nieprzezroczyste (nNext3)
|
TGroundNode *nRender = nullptr; // indywidualnie - nieprzezroczyste (nNext3)
|
||||||
TGroundNode *nRenderMixed = nullptr; // indywidualnie - nieprzezroczyste i przezroczyste (nNext3)
|
TGroundNode *nRenderMixed = nullptr; // indywidualnie - nieprzezroczyste i przezroczyste (nNext3)
|
||||||
TGroundNode *nRenderAlpha = nullptr; // indywidualnie - 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:
|
public:
|
||||||
void LoadNodes(); // utworzenie VBO sektora
|
void LoadNodes(); // utworzenie VBO sektora
|
||||||
public:
|
public:
|
||||||
@@ -208,25 +208,25 @@ class TSubRect : public Resource, public CMesh
|
|||||||
virtual void Release(); // zwalnianie VBO sektora
|
virtual void Release(); // zwalnianie VBO sektora
|
||||||
void NodeAdd(TGroundNode *Node); // dodanie obiektu do sektora na etapie rozdzielania na sektory
|
void NodeAdd(TGroundNode *Node); // dodanie obiektu do sektora na etapie rozdzielania na sektory
|
||||||
void RaNodeAdd(TGroundNode *Node); // dodanie obiektu do listy renderowania
|
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);
|
TTrack * FindTrack(vector3 *Point, int &iConnection, TTrack *Exclude);
|
||||||
TTraction * FindTraction(vector3 *Point, int &iConnection, TTraction *Exclude);
|
TTraction * FindTraction(vector3 *Point, int &iConnection, TTraction *Exclude);
|
||||||
bool StartVBO(); // ustwienie VBO sektora dla (nRenderRect), (nRenderRectAlpha) i
|
bool StartVBO(); // ustwienie VBO sektora dla (nRenderRect), (nRenderRectAlpha) i
|
||||||
// (nRenderWires)
|
// (nRenderWires)
|
||||||
bool RaTrackAnimAdd(TTrack *t); // zgłoszenie toru do animacji
|
bool RaTrackAnimAdd(TTrack *t); // zgłoszenie toru do animacji
|
||||||
void RaAnimate(); // przeliczenie animacji torów
|
void RaAnimate(); // przeliczenie animacji torów
|
||||||
void RenderDL(); // renderowanie nieprzezroczystych w Display Lists
|
void RenderDL(); // renderowanie nieprzezroczystych w Display Lists
|
||||||
void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists
|
void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists
|
||||||
// (McZapkie-131202)
|
// (McZapkie-131202)
|
||||||
void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
|
void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
|
||||||
void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
|
void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
|
||||||
void RenderSounds(); // dźwięki pojazdów z niewidocznych sektorów
|
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 iNumSubRects = 5; // na ile dzielimy kilometr
|
||||||
const int iNumRects = 500;
|
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 int iTotalNumSubRects = iNumRects * iNumSubRects;
|
||||||
const double fHalfTotalNumSubRects = iTotalNumSubRects / 2.0;
|
const double fHalfTotalNumSubRects = iTotalNumSubRects / 2.0;
|
||||||
const double fSubRectSize = 1000.0 / iNumSubRects;
|
const double fSubRectSize = 1000.0 / iNumSubRects;
|
||||||
@@ -234,10 +234,10 @@ const double fRectSize = fSubRectSize * iNumSubRects;
|
|||||||
|
|
||||||
class TGroundRect : public TSubRect
|
class TGroundRect : public TSubRect
|
||||||
{ // kwadrat kilometrowy
|
{ // kwadrat kilometrowy
|
||||||
// obiekty o niewielkiej ilości wierzchołków będą renderowane stąd
|
// obiekty o niewielkiej ilości wierzchołków będą renderowane stąd
|
||||||
// Ra: 2012-02 doszły submodele terenu
|
// Ra: 2012-02 doszły submodele terenu
|
||||||
private:
|
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;
|
TSubRect *pSubRects;
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
@@ -245,26 +245,26 @@ class TGroundRect : public TSubRect
|
|||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static int iFrameNumber; // numer kolejny wyświetlanej klatki
|
static int iFrameNumber; // numer kolejny wyświetlanej klatki
|
||||||
TGroundNode *nTerrain; // model terenu z E3D - użyć nRootMesh?
|
TGroundNode *nTerrain; // model terenu z E3D - użyć nRootMesh?
|
||||||
TGroundRect();
|
TGroundRect();
|
||||||
virtual ~TGroundRect();
|
virtual ~TGroundRect();
|
||||||
|
|
||||||
TSubRect * SafeGetRect(int iCol, int iRow)
|
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)
|
if (!pSubRects)
|
||||||
Init(); // utworzenie małych kwadratów
|
Init(); // utworzenie małych kwadratów
|
||||||
return pSubRects + iRow * iNumSubRects + iCol; // zwrócenie właściwego
|
return pSubRects + iRow * iNumSubRects + iCol; // zwrócenie właściwego
|
||||||
};
|
};
|
||||||
TSubRect * FastGetRect(int iCol, int iRow)
|
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);
|
return (pSubRects ? pSubRects + iRow * iNumSubRects + iCol : NULL);
|
||||||
};
|
};
|
||||||
void Optimize()
|
void Optimize()
|
||||||
{ // optymalizacja obiektów w sektorach
|
{ // optymalizacja obiektów w sektorach
|
||||||
if (pSubRects)
|
if (pSubRects)
|
||||||
for (int i = iNumSubRects * iNumSubRects - 1; i >= 0; --i)
|
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 RenderDL();
|
||||||
void RenderVBO();
|
void RenderVBO();
|
||||||
@@ -273,28 +273,28 @@ class TGroundRect : public TSubRect
|
|||||||
class TGround
|
class TGround
|
||||||
{
|
{
|
||||||
vector3 CameraDirection; // zmienna robocza przy renderowaniu
|
vector3 CameraDirection; // zmienna robocza przy renderowaniu
|
||||||
int const *iRange; // tabela widoczności
|
int const *iRange; // tabela widoczności
|
||||||
// TGroundNode *nRootNode; //lista wszystkich węzłów
|
// TGroundNode *nRootNode; //lista wszystkich węzłów
|
||||||
TGroundNode *nRootDynamic; // lista pojazdów
|
TGroundNode *nRootDynamic; // lista pojazdów
|
||||||
TGroundRect Rects[iNumRects][iNumRects]; // mapa kwadratów kilometrowych
|
TGroundRect Rects[iNumRects][iNumRects]; // mapa kwadratów kilometrowych
|
||||||
TEvent *RootEvent; // lista zdarzeń
|
TEvent *RootEvent; // lista zdarzeń
|
||||||
TEvent *QueryRootEvent, *tmpEvent, *tmp2Event, *OldQRE;
|
TEvent *QueryRootEvent, *tmpEvent, *tmp2Event, *OldQRE;
|
||||||
TSubRect *pRendered[1500]; // lista renderowanych sektorów
|
TSubRect *pRendered[1500]; // lista renderowanych sektorów
|
||||||
int iNumNodes;
|
int iNumNodes;
|
||||||
vector3 pOrigin;
|
vector3 pOrigin;
|
||||||
vector3 aRotate;
|
vector3 aRotate;
|
||||||
bool bInitDone;
|
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
|
// TGroundNode *nLastOfType[TP_LAST]; //ostatnia
|
||||||
TSubRect srGlobal; // zawiera obiekty globalne (na razie wyzwalacze czasowe)
|
TSubRect srGlobal; // zawiera obiekty globalne (na razie wyzwalacze czasowe)
|
||||||
int hh, mm, srh, srm, ssh, ssm; // ustawienia czasu
|
int hh, mm, srh, srm, ssh, ssm; // ustawienia czasu
|
||||||
// int tracks,tracksfar; //liczniki torów
|
// int tracks,tracksfar; //liczniki torów
|
||||||
TNames *sTracks; // posortowane nazwy torów i eventów
|
TNames *sTracks; // posortowane nazwy torów i eventów
|
||||||
private: // metody prywatne
|
private: // metody prywatne
|
||||||
bool EventConditon(TEvent *e);
|
bool EventConditon(TEvent *e);
|
||||||
|
|
||||||
public:
|
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...
|
TDynamicObject *LastDyn; // ABu: paskudnie, ale na bardzo szybko moze jakos przejdzie...
|
||||||
// TTrain *pTrain;
|
// TTrain *pTrain;
|
||||||
// double fVDozwolona;
|
// double fVDozwolona;
|
||||||
@@ -330,8 +330,8 @@ class TGround
|
|||||||
TGroundNode * GetNode(std::string asName);
|
TGroundNode * GetNode(std::string asName);
|
||||||
bool AddDynamic(TGroundNode *Node);
|
bool AddDynamic(TGroundNode *Node);
|
||||||
void MoveGroundNode(vector3 pPosition);
|
void MoveGroundNode(vector3 pPosition);
|
||||||
void UpdatePhys(double dt, int iter); // aktualizacja fizyki stałym krokiem
|
void UpdatePhys(double dt, int iter); // aktualizacja fizyki stałym krokiem
|
||||||
bool Update(double dt, int iter); // aktualizacja przesunięć zgodna z FPS
|
bool Update(double dt, int iter); // aktualizacja przesunięć zgodna z FPS
|
||||||
bool AddToQuery(TEvent *Event, TDynamicObject *Node);
|
bool AddToQuery(TEvent *Event, TDynamicObject *Node);
|
||||||
bool GetTraction(TDynamicObject *model);
|
bool GetTraction(TDynamicObject *model);
|
||||||
bool RenderDL(vector3 pPosition);
|
bool RenderDL(vector3 pPosition);
|
||||||
@@ -394,7 +394,7 @@ class TGround
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
void WyslijEvent(const std::string &e, const std::string &d);
|
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 WyslijString(const std::string &t, int n);
|
||||||
void WyslijWolny(const std::string &t);
|
void WyslijWolny(const std::string &t);
|
||||||
void WyslijNamiary(TGroundNode *t);
|
void WyslijNamiary(TGroundNode *t);
|
||||||
|
|||||||
10
Logs.cpp
10
Logs.cpp
@@ -12,9 +12,9 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
|
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
|
|
||||||
std::ofstream output; // standardowy "log.txt", mo¿na go wy³¹czyæ
|
std::ofstream output; // standardowy "log.txt", można go wyłączyć
|
||||||
std::ofstream errors; // lista b³êdów "errors.txt", zawsze dzia³a
|
std::ofstream errors; // lista błędów "errors.txt", zawsze działa
|
||||||
std::ofstream comms; // lista komunikatow "comms.txt", mo¿na go wy³¹czyæ
|
std::ofstream comms; // lista komunikatow "comms.txt", można go wyłączyć
|
||||||
|
|
||||||
char endstring[10] = "\n";
|
char endstring[10] = "\n";
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@ void WriteLog(const char *str, bool newline)
|
|||||||
};
|
};
|
||||||
|
|
||||||
void ErrorLog(const char *str)
|
void ErrorLog(const char *str)
|
||||||
{ // Ra: bezwarunkowa rejestracja powa¿nych b³êdów
|
{ // Ra: bezwarunkowa rejestracja poważnych błędów
|
||||||
if (!errors.is_open())
|
if (!errors.is_open())
|
||||||
{
|
{
|
||||||
errors.open("errors.txt", std::ios::trunc);
|
errors.open("errors.txt", std::ios::trunc);
|
||||||
@@ -110,7 +110,7 @@ void WriteLog(const std::string &str, bool newline)
|
|||||||
};
|
};
|
||||||
|
|
||||||
void CommLog(const char *str)
|
void CommLog(const char *str)
|
||||||
{ // Ra: warunkowa rejestracja komunikatów
|
{ // Ra: warunkowa rejestracja komunikatów
|
||||||
WriteLog(str);
|
WriteLog(str);
|
||||||
/* if (Global::iWriteLogEnabled & 4)
|
/* if (Global::iWriteLogEnabled & 4)
|
||||||
{
|
{
|
||||||
|
|||||||
136
McZapkie/MOVER.h
136
McZapkie/MOVER.h
@@ -130,15 +130,15 @@ static int const dtrain_out = 128; /*wykolejenie*/
|
|||||||
#define p_slippdmg (1.000000E-03)
|
#define p_slippdmg (1.000000E-03)
|
||||||
|
|
||||||
/*typ sprzegu*/
|
/*typ sprzegu*/
|
||||||
static int const ctrain_virtual = 0; //gdy pojazdy na tym samym torze się widzą wzajemnie
|
static int const ctrain_virtual = 0; //gdy pojazdy na tym samym torze się widzą wzajemnie
|
||||||
static int const ctrain_coupler = 1; //sprzeg fizyczny
|
static int const ctrain_coupler = 1; //sprzeg fizyczny
|
||||||
static int const ctrain_pneumatic = 2; //przewody hamulcowe
|
static int const ctrain_pneumatic = 2; //przewody hamulcowe
|
||||||
static int const ctrain_controll = 4; //przewody sterujące (ukrotnienie)
|
static int const ctrain_controll = 4; //przewody sterujące (ukrotnienie)
|
||||||
static int const ctrain_power = 8; //przewody zasilające (WN)
|
static int const ctrain_power = 8; //przewody zasilające (WN)
|
||||||
static int const ctrain_passenger = 16; //mostek przejściowy
|
static int const ctrain_passenger = 16; //mostek przejściowy
|
||||||
static int const ctrain_scndpneumatic = 32; //przewody 8 atm (żółte; zasilanie powietrzem)
|
static int const ctrain_scndpneumatic = 32; //przewody 8 atm (żółte; zasilanie powietrzem)
|
||||||
static int const ctrain_heating = 64; //przewody ogrzewania WN
|
static int const ctrain_heating = 64; //przewody ogrzewania WN
|
||||||
static int const ctrain_depot = 128; //nie rozłączalny podczas zwykłych manewrów (międzyczłonowy), we wpisie wartość ujemna
|
static int const ctrain_depot = 128; //nie rozłączalny podczas zwykłych manewrów (międzyczłonowy), we wpisie wartość ujemna
|
||||||
|
|
||||||
/*typ hamulca elektrodynamicznego*/
|
/*typ hamulca elektrodynamicznego*/
|
||||||
static int const dbrake_none = 0;
|
static int const dbrake_none = 0;
|
||||||
@@ -149,9 +149,9 @@ static int const dbrake_automatic = 8;
|
|||||||
|
|
||||||
/*status czuwaka/SHP*/
|
/*status czuwaka/SHP*/
|
||||||
//hunter-091012: rozdzielenie alarmow, dodanie testu czuwaka
|
//hunter-091012: rozdzielenie alarmow, dodanie testu czuwaka
|
||||||
static int const s_waiting = 1; //działa
|
static int const s_waiting = 1; //działa
|
||||||
static int const s_aware = 2; //czuwak miga
|
static int const s_aware = 2; //czuwak miga
|
||||||
static int const s_active = 4; //SHP świeci
|
static int const s_active = 4; //SHP świeci
|
||||||
static int const s_CAalarm = 8; //buczy
|
static int const s_CAalarm = 8; //buczy
|
||||||
static int const s_SHPalarm = 16; //buczy
|
static int const s_SHPalarm = 16; //buczy
|
||||||
static int const s_CAebrake = 32; //hamuje
|
static int const s_CAebrake = 32; //hamuje
|
||||||
@@ -170,20 +170,20 @@ static int const sound_brakeacc = 64;
|
|||||||
|
|
||||||
static bool PhysicActivationFlag = false;
|
static bool PhysicActivationFlag = false;
|
||||||
|
|
||||||
//szczególne typy pojazdów (inna obsługa) dla zmiennej TrainType
|
//szczególne typy pojazdów (inna obsługa) dla zmiennej TrainType
|
||||||
//zamienione na flagi bitowe, aby szybko wybierać grupę (np. EZT+SZT)
|
//zamienione na flagi bitowe, aby szybko wybierać grupę (np. EZT+SZT)
|
||||||
static int const dt_Default = 0;
|
static int const dt_Default = 0;
|
||||||
static int const dt_EZT = 1;
|
static int const dt_EZT = 1;
|
||||||
static int const dt_ET41 = 2;
|
static int const dt_ET41 = 2;
|
||||||
static int const dt_ET42 = 4;
|
static int const dt_ET42 = 4;
|
||||||
static int const dt_PseudoDiesel = 8;
|
static int const dt_PseudoDiesel = 8;
|
||||||
static int const dt_ET22 = 0x10; //używane od Megapacka
|
static int const dt_ET22 = 0x10; //używane od Megapacka
|
||||||
static int const dt_SN61 = 0x20; //nie używane w warunkach, ale ustawiane z CHK
|
static int const dt_SN61 = 0x20; //nie używane w warunkach, ale ustawiane z CHK
|
||||||
static int const dt_EP05 = 0x40;
|
static int const dt_EP05 = 0x40;
|
||||||
static int const dt_ET40 = 0x80;
|
static int const dt_ET40 = 0x80;
|
||||||
static int const dt_181 = 0x100;
|
static int const dt_181 = 0x100;
|
||||||
|
|
||||||
//stałe dla asynchronów
|
//stałe dla asynchronów
|
||||||
static int const eimc_s_dfic = 0;
|
static int const eimc_s_dfic = 0;
|
||||||
static int const eimc_s_dfmax = 1;
|
static int const eimc_s_dfmax = 1;
|
||||||
static int const eimc_s_p = 2;
|
static int const eimc_s_p = 2;
|
||||||
@@ -206,7 +206,7 @@ static int const eimc_p_Imax = 20;
|
|||||||
static int const eimc_p_abed = 21;
|
static int const eimc_p_abed = 21;
|
||||||
static int const eimc_p_eped = 22;
|
static int const eimc_p_eped = 22;
|
||||||
|
|
||||||
//zmienne dla asynchronów
|
//zmienne dla asynchronów
|
||||||
static int const eimv_FMAXMAX = 0;
|
static int const eimv_FMAXMAX = 0;
|
||||||
static int const eimv_Fmax = 1;
|
static int const eimv_Fmax = 1;
|
||||||
static int const eimv_ks = 2;
|
static int const eimv_ks = 2;
|
||||||
@@ -234,10 +234,10 @@ static int const bom_PN = 2;
|
|||||||
static int const bom_EP = 4;
|
static int const bom_EP = 4;
|
||||||
static int const bom_MED = 8;
|
static int const bom_MED = 8;
|
||||||
|
|
||||||
enum TProblem // lista problemów taboru, które uniemożliwiają jazdę
|
enum TProblem // lista problemów taboru, które uniemożliwiają jazdę
|
||||||
{ // flagi bitowe
|
{ // flagi bitowe
|
||||||
pr_Hamuje = 1, // pojazd ma załączony hamulec lub zatarte osie
|
pr_Hamuje = 1, // pojazd ma załączony hamulec lub zatarte osie
|
||||||
pr_Pantografy = 2, // pojazd wymaga napompowania pantografów
|
pr_Pantografy = 2, // pojazd wymaga napompowania pantografów
|
||||||
pr_Ostatni = 0x80000000 // ostatnia flaga bitowa
|
pr_Ostatni = 0x80000000 // ostatnia flaga bitowa
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -373,21 +373,21 @@ struct TBoilerType {
|
|||||||
};
|
};
|
||||||
/*rodzaj odbieraka pradu*/
|
/*rodzaj odbieraka pradu*/
|
||||||
struct TCurrentCollector {
|
struct TCurrentCollector {
|
||||||
long CollectorsNo; //musi być tu, bo inaczej się kopie
|
long CollectorsNo; //musi być tu, bo inaczej się kopie
|
||||||
double MinH; double MaxH; //zakres ruchu pantografu, nigdzie nie używany
|
double MinH; double MaxH; //zakres ruchu pantografu, nigdzie nie używany
|
||||||
double CSW; //szerokość części roboczej (styku) ślizgacza
|
double CSW; //szerokość części roboczej (styku) ślizgacza
|
||||||
double MinV; double MaxV; //minimalne i maksymalne akceptowane napięcie
|
double MinV; double MaxV; //minimalne i maksymalne akceptowane napięcie
|
||||||
double OVP; //czy jest przekaznik nadnapieciowy
|
double OVP; //czy jest przekaznik nadnapieciowy
|
||||||
double InsetV; //minimalne napięcie wymagane do załączenia
|
double InsetV; //minimalne napięcie wymagane do załączenia
|
||||||
double MinPress; //minimalne ciśnienie do załączenia WS
|
double MinPress; //minimalne ciśnienie do załączenia WS
|
||||||
double MaxPress; //maksymalne ciśnienie za reduktorem
|
double MaxPress; //maksymalne ciśnienie za reduktorem
|
||||||
//inline TCurrentCollector() {
|
//inline TCurrentCollector() {
|
||||||
// CollectorsNo = 0;
|
// CollectorsNo = 0;
|
||||||
// MinH, MaxH, CSW, MinV, MaxV = 0.0;
|
// MinH, MaxH, CSW, MinV, MaxV = 0.0;
|
||||||
// OVP, InsetV, MinPress, MaxPress = 0.0;
|
// OVP, InsetV, MinPress, MaxPress = 0.0;
|
||||||
//}
|
//}
|
||||||
};
|
};
|
||||||
/*typy źródeł mocy*/
|
/*typy źródeł mocy*/
|
||||||
enum TPowerSource { NotDefined, InternalSource, Transducer, Generator, Accumulator, CurrentCollector, PowerCable, Heater };
|
enum TPowerSource { NotDefined, InternalSource, Transducer, Generator, Accumulator, CurrentCollector, PowerCable, Heater };
|
||||||
|
|
||||||
|
|
||||||
@@ -417,7 +417,7 @@ struct _mover__3
|
|||||||
TBoilerType Boiler;
|
TBoilerType Boiler;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*parametry źródeł mocy*/
|
/*parametry źródeł mocy*/
|
||||||
struct TPowerParameters
|
struct TPowerParameters
|
||||||
{
|
{
|
||||||
double MaxVoltage;
|
double MaxVoltage;
|
||||||
@@ -541,7 +541,7 @@ struct TSecuritySystem
|
|||||||
{
|
{
|
||||||
int SystemType; /*0: brak, 1: czuwak aktywny, 2: SHP/sygnalizacja kabinowa*/
|
int SystemType; /*0: brak, 1: czuwak aktywny, 2: SHP/sygnalizacja kabinowa*/
|
||||||
double AwareDelay; // czas powtarzania czuwaka
|
double AwareDelay; // czas powtarzania czuwaka
|
||||||
double AwareMinSpeed; // minimalna prędkość załączenia czuwaka, normalnie 10% Vmax
|
double AwareMinSpeed; // minimalna prędkość załączenia czuwaka, normalnie 10% Vmax
|
||||||
double SoundSignalDelay;
|
double SoundSignalDelay;
|
||||||
double EmergencyBrakeDelay;
|
double EmergencyBrakeDelay;
|
||||||
int Status; /*0: wylaczony, 1: wlaczony, 2: czuwak, 4: shp, 8: alarm, 16: hamowanie awaryjne*/
|
int Status; /*0: wylaczony, 1: wlaczony, 2: czuwak, 4: shp, 8: alarm, 16: hamowanie awaryjne*/
|
||||||
@@ -583,18 +583,18 @@ struct TCoupling {
|
|||||||
TCouplerType CouplerType = NoCoupler; /*typ sprzegu*/
|
TCouplerType CouplerType = NoCoupler; /*typ sprzegu*/
|
||||||
/*zmienne*/
|
/*zmienne*/
|
||||||
int CouplingFlag = 0; /*0 - wirtualnie, 1 - sprzegi, 2 - pneumatycznie, 4 - sterowanie, 8 - kabel mocy*/
|
int CouplingFlag = 0; /*0 - wirtualnie, 1 - sprzegi, 2 - pneumatycznie, 4 - sterowanie, 8 - kabel mocy*/
|
||||||
int AllowedFlag = 3; //Ra: znaczenie jak wyżej, maska dostępnych // domyślnie hak i hamulec, inne trzeba włączyć jawnie w FIZ
|
int AllowedFlag = 3; //Ra: znaczenie jak wyżej, maska dostępnych
|
||||||
bool Render = false; /*ABu: czy rysowac jak zaczepiony sprzeg*/
|
bool Render = false; /*ABu: czy rysowac jak zaczepiony sprzeg*/
|
||||||
double CoupleDist = 0.0; /*ABu: optymalizacja - liczenie odleglosci raz na klatkę, bez iteracji*/
|
double CoupleDist = 0.0; /*ABu: optymalizacja - liczenie odleglosci raz na klatkę, bez iteracji*/
|
||||||
class TMoverParameters *Connected = nullptr; /*co jest podlaczone*/
|
class TMoverParameters *Connected = nullptr; /*co jest podlaczone*/
|
||||||
int ConnectedNr = 0; //Ra: od której strony podłączony do (Connected): 0=przód, 1=tył
|
int ConnectedNr = 0; //Ra: od której strony podłączony do (Connected): 0=przód, 1=tył
|
||||||
double CForce = 0.0; /*sila z jaka dzialal*/
|
double CForce = 0.0; /*sila z jaka dzialal*/
|
||||||
double Dist = 0.0; /*strzalka ugiecia zderzaków*/
|
double Dist = 0.0; /*strzalka ugiecia zderzaków*/
|
||||||
bool CheckCollision = false; /*czy sprawdzac sile czy pedy*/
|
bool CheckCollision = false; /*czy sprawdzac sile czy pedy*/
|
||||||
};
|
};
|
||||||
|
|
||||||
class TMoverParameters
|
class TMoverParameters
|
||||||
{ // Ra: wrapper na kod pascalowy, przejmujący jego funkcje Q: 20160824 - juz nie wrapper a klasa bazowa :)
|
{ // Ra: wrapper na kod pascalowy, przejmujący jego funkcje Q: 20160824 - juz nie wrapper a klasa bazowa :)
|
||||||
public:
|
public:
|
||||||
|
|
||||||
double dMoveLen;
|
double dMoveLen;
|
||||||
@@ -605,7 +605,7 @@ public:
|
|||||||
/*--sekcja stalych typowych parametrow*/
|
/*--sekcja stalych typowych parametrow*/
|
||||||
std::string TypeName; /*nazwa serii/typu*/
|
std::string TypeName; /*nazwa serii/typu*/
|
||||||
//TrainType: string; {typ: EZT/elektrowoz - Winger 040304}
|
//TrainType: string; {typ: EZT/elektrowoz - Winger 040304}
|
||||||
int TrainType; /*Ra: powinno być szybciej niż string*/
|
int TrainType; /*Ra: powinno być szybciej niż string*/
|
||||||
TEngineTypes EngineType; /*typ napedu*/
|
TEngineTypes EngineType; /*typ napedu*/
|
||||||
TPowerParameters EnginePowerSource; /*zrodlo mocy dla silnikow*/
|
TPowerParameters EnginePowerSource; /*zrodlo mocy dla silnikow*/
|
||||||
TPowerParameters SystemPowerSource; /*zrodlo mocy dla systemow sterowania/przetwornic/sprezarek*/
|
TPowerParameters SystemPowerSource; /*zrodlo mocy dla systemow sterowania/przetwornic/sprezarek*/
|
||||||
@@ -614,7 +614,7 @@ public:
|
|||||||
TPowerParameters LightPowerSource; /*zrodlo mocy dla oswietlenia*/
|
TPowerParameters LightPowerSource; /*zrodlo mocy dla oswietlenia*/
|
||||||
TPowerParameters AlterLightPowerSource;/*alternatywne mocy dla oswietlenia*/
|
TPowerParameters AlterLightPowerSource;/*alternatywne mocy dla oswietlenia*/
|
||||||
double Vmax; double Mass; double Power; /*max. predkosc kontrukcyjna, masa wlasna, moc*/
|
double Vmax; double Mass; double Power; /*max. predkosc kontrukcyjna, masa wlasna, moc*/
|
||||||
double Mred; /*Ra: zredukowane masy wirujące; potrzebne do obliczeń hamowania*/
|
double Mred; /*Ra: zredukowane masy wirujące; potrzebne do obliczeń hamowania*/
|
||||||
double TotalMass; /*wyliczane przez ComputeMass*/
|
double TotalMass; /*wyliczane przez ComputeMass*/
|
||||||
double HeatingPower; double LightPower; /*moc pobierana na ogrzewanie/oswietlenie*/
|
double HeatingPower; double LightPower; /*moc pobierana na ogrzewanie/oswietlenie*/
|
||||||
double BatteryVoltage; /*Winger - baterie w elektrykach*/
|
double BatteryVoltage; /*Winger - baterie w elektrykach*/
|
||||||
@@ -626,7 +626,7 @@ public:
|
|||||||
double NominalBatteryVoltage; /*Winger - baterie w elektrykach*/
|
double NominalBatteryVoltage; /*Winger - baterie w elektrykach*/
|
||||||
TDimension Dim; /*wymiary*/
|
TDimension Dim; /*wymiary*/
|
||||||
double Cx; /*wsp. op. aerodyn.*/
|
double Cx; /*wsp. op. aerodyn.*/
|
||||||
double Floor; //poziom podłogi dla ładunków
|
double Floor; //poziom podłogi dla ładunków
|
||||||
double WheelDiameter; /*srednica kol napednych*/
|
double WheelDiameter; /*srednica kol napednych*/
|
||||||
double WheelDiameterL; //Ra: srednica kol tocznych przednich
|
double WheelDiameterL; //Ra: srednica kol tocznych przednich
|
||||||
double WheelDiameterT; //Ra: srednica kol tocznych tylnych
|
double WheelDiameterT; //Ra: srednica kol tocznych tylnych
|
||||||
@@ -655,7 +655,7 @@ public:
|
|||||||
|
|
||||||
TLocalBrake LocalBrake; /*rodzaj hamulca indywidualnego*/
|
TLocalBrake LocalBrake; /*rodzaj hamulca indywidualnego*/
|
||||||
TBrakePressureTable BrakePressureTable; /*wyszczegolnienie cisnien w rurze*/
|
TBrakePressureTable BrakePressureTable; /*wyszczegolnienie cisnien w rurze*/
|
||||||
TBrakePressure BrakePressureActual; //wartości ważone dla aktualnej pozycji kranu
|
TBrakePressure BrakePressureActual; //wartości ważone dla aktualnej pozycji kranu
|
||||||
int ASBType; /*0: brak hamulca przeciwposlizgowego, 1: reczny, 2: automat*/
|
int ASBType; /*0: brak hamulca przeciwposlizgowego, 1: reczny, 2: automat*/
|
||||||
int TurboTest;
|
int TurboTest;
|
||||||
double MaxBrakeForce; /*maksymalna sila nacisku hamulca*/
|
double MaxBrakeForce; /*maksymalna sila nacisku hamulca*/
|
||||||
@@ -666,7 +666,7 @@ public:
|
|||||||
/*max. cisnienie w cyl. ham., stala proporcjonalnosci p-K*/
|
/*max. cisnienie w cyl. ham., stala proporcjonalnosci p-K*/
|
||||||
double HighPipePress; double LowPipePress; double DeltaPipePress;
|
double HighPipePress; double LowPipePress; double DeltaPipePress;
|
||||||
/*max. i min. robocze cisnienie w przewodzie glownym oraz roznica miedzy nimi*/
|
/*max. i min. robocze cisnienie w przewodzie glownym oraz roznica miedzy nimi*/
|
||||||
double CntrlPipePress; //ciśnienie z zbiorniku sterującym
|
double CntrlPipePress; //ciśnienie z zbiorniku sterującym
|
||||||
double BrakeVolume; double BrakeVVolume; double VeselVolume;
|
double BrakeVolume; double BrakeVVolume; double VeselVolume;
|
||||||
/*pojemnosc powietrza w ukladzie hamulcowym, w ukladzie glownej sprezarki [m^3] */
|
/*pojemnosc powietrza w ukladzie hamulcowym, w ukladzie glownej sprezarki [m^3] */
|
||||||
int BrakeCylNo; /*ilosc cylindrow ham.*/
|
int BrakeCylNo; /*ilosc cylindrow ham.*/
|
||||||
@@ -690,7 +690,7 @@ public:
|
|||||||
int ScndCtrlPosNo;
|
int ScndCtrlPosNo;
|
||||||
int LightsPosNo; int LightsDefPos;
|
int LightsPosNo; int LightsDefPos;
|
||||||
bool LightsWrap;
|
bool LightsWrap;
|
||||||
int Lights[2][17]; // pozycje świateł, przód - tył, 1 .. 16
|
int Lights[2][17]; // pozycje świateł, przód - tył, 1 .. 16
|
||||||
bool ScndInMain; /*zaleznosc bocznika od nastawnika*/
|
bool ScndInMain; /*zaleznosc bocznika od nastawnika*/
|
||||||
bool MBrake; /*Czy jest hamulec reczny*/
|
bool MBrake; /*Czy jest hamulec reczny*/
|
||||||
double StopBrakeDecc;
|
double StopBrakeDecc;
|
||||||
@@ -727,7 +727,7 @@ public:
|
|||||||
double RVentCutOff; /*rezystancja wylaczania wentylatorow dla RVentType=2*/
|
double RVentCutOff; /*rezystancja wylaczania wentylatorow dla RVentType=2*/
|
||||||
int CompressorPower; /*0: bezp. z obwodow silnika, 1: z przetwornicy, reczne, 2: w przetwornicy, stale, 5: z silnikowego*/
|
int CompressorPower; /*0: bezp. z obwodow silnika, 1: z przetwornicy, reczne, 2: w przetwornicy, stale, 5: z silnikowego*/
|
||||||
int SmallCompressorPower; /*Winger ZROBIC*/
|
int SmallCompressorPower; /*Winger ZROBIC*/
|
||||||
bool Trafo; /*pojazd wyposażony w transformator*/
|
bool Trafo; /*pojazd wyposażony w transformator*/
|
||||||
|
|
||||||
/*-sekcja parametrow dla lokomotywy spalinowej z przekladnia mechaniczna*/
|
/*-sekcja parametrow dla lokomotywy spalinowej z przekladnia mechaniczna*/
|
||||||
double dizel_Mmax; double dizel_nMmax; double dizel_Mnmax; double dizel_nmax; double dizel_nominalfill;
|
double dizel_Mmax; double dizel_nMmax; double dizel_Mnmax; double dizel_nmax; double dizel_nominalfill;
|
||||||
@@ -773,7 +773,7 @@ public:
|
|||||||
bool DoorClosureWarning; /*czy jest ostrzeganie przed zamknieciem*/
|
bool DoorClosureWarning; /*czy jest ostrzeganie przed zamknieciem*/
|
||||||
double DoorOpenSpeed; double DoorCloseSpeed; /*predkosc otwierania i zamykania w j.u. */
|
double DoorOpenSpeed; double DoorCloseSpeed; /*predkosc otwierania i zamykania w j.u. */
|
||||||
double DoorMaxShiftL; double DoorMaxShiftR; double DoorMaxPlugShift;/*szerokosc otwarcia lub kat*/
|
double DoorMaxShiftL; double DoorMaxShiftR; double DoorMaxPlugShift;/*szerokosc otwarcia lub kat*/
|
||||||
int DoorOpenMethod; /*sposob otwarcia - 1: przesuwne, 2: obrotowe, 3: trójelementowe*/
|
int DoorOpenMethod; /*sposob otwarcia - 1: przesuwne, 2: obrotowe, 3: trójelementowe*/
|
||||||
double PlatformSpeed; /*szybkosc stopnia*/
|
double PlatformSpeed; /*szybkosc stopnia*/
|
||||||
double PlatformMaxShift; /*wysuniecie stopnia*/
|
double PlatformMaxShift; /*wysuniecie stopnia*/
|
||||||
int PlatformOpenMethod; /*sposob animacji stopnia*/
|
int PlatformOpenMethod; /*sposob animacji stopnia*/
|
||||||
@@ -781,7 +781,7 @@ public:
|
|||||||
|
|
||||||
/*--sekcja zmiennych*/
|
/*--sekcja zmiennych*/
|
||||||
/*--opis konkretnego egzemplarza taboru*/
|
/*--opis konkretnego egzemplarza taboru*/
|
||||||
TLocation Loc; //pozycja pojazdów do wyznaczenia odległości pomiędzy sprzęgami
|
TLocation Loc; //pozycja pojazdów do wyznaczenia odległości pomiędzy sprzęgami
|
||||||
TRotation Rot;
|
TRotation Rot;
|
||||||
std::string Name; /*nazwa wlasna*/
|
std::string Name; /*nazwa wlasna*/
|
||||||
TCoupling Couplers[2]; //urzadzenia zderzno-sprzegowe, polaczenia miedzy wagonami
|
TCoupling Couplers[2]; //urzadzenia zderzno-sprzegowe, polaczenia miedzy wagonami
|
||||||
@@ -790,9 +790,9 @@ public:
|
|||||||
bool EventFlag; /*!o true jesli cos nietypowego sie wydarzy*/
|
bool EventFlag; /*!o true jesli cos nietypowego sie wydarzy*/
|
||||||
int SoundFlag; /*!o patrz stale sound_ */
|
int SoundFlag; /*!o patrz stale sound_ */
|
||||||
double DistCounter; /*! licznik kilometrow */
|
double DistCounter; /*! licznik kilometrow */
|
||||||
double V; //predkosc w [m/s] względem sprzęgów (dodania gdy jedzie w stronę 0)
|
double V; //predkosc w [m/s] względem sprzęgów (dodania gdy jedzie w stronę 0)
|
||||||
double Vel; //moduł prędkości w [km/h], używany przez AI
|
double Vel; //moduł prędkości w [km/h], używany przez AI
|
||||||
double AccS; //efektywne przyspieszenie styczne w [m/s^2] (wszystkie siły)
|
double AccS; //efektywne przyspieszenie styczne w [m/s^2] (wszystkie siły)
|
||||||
double AccN; //przyspieszenie normalne w [m/s^2]
|
double AccN; //przyspieszenie normalne w [m/s^2]
|
||||||
double AccV;
|
double AccV;
|
||||||
double nrot;
|
double nrot;
|
||||||
@@ -801,8 +801,8 @@ public:
|
|||||||
double dL; double Fb; double Ff; /*przesuniecie, sila hamowania i tarcia*/
|
double dL; double Fb; double Ff; /*przesuniecie, sila hamowania i tarcia*/
|
||||||
double FTrain; double FStand; /*! sila pociagowa i oporow ruchu*/
|
double FTrain; double FStand; /*! sila pociagowa i oporow ruchu*/
|
||||||
double FTotal; /*! calkowita sila dzialajaca na pojazd*/
|
double FTotal; /*! calkowita sila dzialajaca na pojazd*/
|
||||||
double UnitBrakeForce; /*!s siła hamowania przypadająca na jeden element*/
|
double UnitBrakeForce; /*!s siła hamowania przypadająca na jeden element*/
|
||||||
double Ntotal; /*!s siła nacisku klockow*/
|
double Ntotal; /*!s siła nacisku klockow*/
|
||||||
bool SlippingWheels; bool SandDose; /*! poslizg kol, sypanie piasku*/
|
bool SlippingWheels; bool SandDose; /*! poslizg kol, sypanie piasku*/
|
||||||
double Sand; /*ilosc piasku*/
|
double Sand; /*ilosc piasku*/
|
||||||
double BrakeSlippingTimer; /*pomocnicza zmienna do wylaczania przeciwposlizgu*/
|
double BrakeSlippingTimer; /*pomocnicza zmienna do wylaczania przeciwposlizgu*/
|
||||||
@@ -851,8 +851,8 @@ public:
|
|||||||
/*komenda przekazywana przez PutCommand*/
|
/*komenda przekazywana przez PutCommand*/
|
||||||
/*i wykonywana przez RunInternalCommand*/
|
/*i wykonywana przez RunInternalCommand*/
|
||||||
std::string CommandOut; /*komenda przekazywana przez ExternalCommand*/
|
std::string CommandOut; /*komenda przekazywana przez ExternalCommand*/
|
||||||
std::string CommandLast; //Ra: ostatnio wykonana komenda do podglądu
|
std::string CommandLast; //Ra: ostatnio wykonana komenda do podglądu
|
||||||
double ValueOut; /*argument komendy która ma byc przekazana na zewnatrz*/
|
double ValueOut; /*argument komendy która ma byc przekazana na zewnatrz*/
|
||||||
|
|
||||||
TTrackShape RunningShape;/*geometria toru po ktorym jedzie pojazd*/
|
TTrackShape RunningShape;/*geometria toru po ktorym jedzie pojazd*/
|
||||||
TTrackParam RunningTrack;/*parametry toru po ktorym jedzie pojazd*/
|
TTrackParam RunningTrack;/*parametry toru po ktorym jedzie pojazd*/
|
||||||
@@ -864,10 +864,10 @@ public:
|
|||||||
int ScndCtrlPos; /*polozenie dodatkowego nastawnika*/
|
int ScndCtrlPos; /*polozenie dodatkowego nastawnika*/
|
||||||
int LightsPos;
|
int LightsPos;
|
||||||
int ActiveDir; //czy lok. jest wlaczona i w ktorym kierunku:
|
int ActiveDir; //czy lok. jest wlaczona i w ktorym kierunku:
|
||||||
//względem wybranej kabiny: -1 - do tylu, +1 - do przodu, 0 - wylaczona
|
//względem wybranej kabiny: -1 - do tylu, +1 - do przodu, 0 - wylaczona
|
||||||
int CabNo; //numer kabiny, z której jest sterowanie: 1 lub -1; w przeciwnym razie brak sterowania - rozrzad
|
int CabNo; //numer kabiny, z której jest sterowanie: 1 lub -1; w przeciwnym razie brak sterowania - rozrzad
|
||||||
int DirAbsolute; //zadany kierunek jazdy względem sprzęgów (1=w strone 0,-1=w stronę 1)
|
int DirAbsolute; //zadany kierunek jazdy względem sprzęgów (1=w strone 0,-1=w stronę 1)
|
||||||
int ActiveCab; //numer kabiny, w ktorej jest obsada (zwykle jedna na skład)
|
int ActiveCab; //numer kabiny, w ktorej jest obsada (zwykle jedna na skład)
|
||||||
double LastSwitchingTime; /*czas ostatniego przelaczania czegos*/
|
double LastSwitchingTime; /*czas ostatniego przelaczania czegos*/
|
||||||
//WarningSignal: byte; {0: nie trabi, 1,2: trabi}
|
//WarningSignal: byte; {0: nie trabi, 1,2: trabi}
|
||||||
bool DepartureSignal; /*sygnal odjazdu*/
|
bool DepartureSignal; /*sygnal odjazdu*/
|
||||||
@@ -876,14 +876,14 @@ public:
|
|||||||
TTractionParam RunningTraction;/*parametry sieci trakcyjnej najblizej lokomotywy*/
|
TTractionParam RunningTraction;/*parametry sieci trakcyjnej najblizej lokomotywy*/
|
||||||
double enrot; double Im; double Itot; double IHeating; double ITraction; double TotalCurrent; double Mm; double Mw; double Fw; double Ft;
|
double enrot; double Im; double Itot; double IHeating; double ITraction; double TotalCurrent; double Mm; double Mw; double Fw; double Ft;
|
||||||
/*ilosc obrotow, prad silnika i calkowity, momenty, sily napedne*/
|
/*ilosc obrotow, prad silnika i calkowity, momenty, sily napedne*/
|
||||||
//Ra: Im jest ujemny, jeśli lok jedzie w stronę sprzęgu 1
|
//Ra: Im jest ujemny, jeśli lok jedzie w stronę sprzęgu 1
|
||||||
//a ujemne powinien być przy odwróconej polaryzacji sieci...
|
//a ujemne powinien być przy odwróconej polaryzacji sieci...
|
||||||
//w wielu miejscach jest używane abs(Im)
|
//w wielu miejscach jest używane abs(Im)
|
||||||
int Imin; int Imax; /*prad przelaczania automatycznego rozruchu, prad bezpiecznika*/
|
int Imin; int Imax; /*prad przelaczania automatycznego rozruchu, prad bezpiecznika*/
|
||||||
double Voltage; /*aktualne napiecie sieci zasilajacej*/
|
double Voltage; /*aktualne napiecie sieci zasilajacej*/
|
||||||
int MainCtrlActualPos; /*wskaznik RList*/
|
int MainCtrlActualPos; /*wskaznik RList*/
|
||||||
int ScndCtrlActualPos; /*wskaznik MotorParam*/
|
int ScndCtrlActualPos; /*wskaznik MotorParam*/
|
||||||
bool DelayCtrlFlag; //czy czekanie na 1. pozycji na załączenie?
|
bool DelayCtrlFlag; //czy czekanie na 1. pozycji na załączenie?
|
||||||
double LastRelayTime; /*czas ostatniego przelaczania stycznikow*/
|
double LastRelayTime; /*czas ostatniego przelaczania stycznikow*/
|
||||||
bool AutoRelayFlag; /*mozna zmieniac jesli AutoRelayType=2*/
|
bool AutoRelayFlag; /*mozna zmieniac jesli AutoRelayType=2*/
|
||||||
bool FuseFlag; /*!o bezpiecznik nadmiarowy*/
|
bool FuseFlag; /*!o bezpiecznik nadmiarowy*/
|
||||||
@@ -918,8 +918,8 @@ public:
|
|||||||
/*-dla wagonow*/
|
/*-dla wagonow*/
|
||||||
long Load; /*masa w T lub ilosc w sztukach - zaladowane*/
|
long Load; /*masa w T lub ilosc w sztukach - zaladowane*/
|
||||||
std::string LoadType; /*co jest zaladowane*/
|
std::string LoadType; /*co jest zaladowane*/
|
||||||
int LoadStatus; //+1=trwa rozladunek,+2=trwa zaladunek,+4=zakończono,0=zaktualizowany model
|
int LoadStatus; //+1=trwa rozladunek,+2=trwa zaladunek,+4=zakończono,0=zaktualizowany model
|
||||||
double LastLoadChangeTime; //raz (roz)ładowania
|
double LastLoadChangeTime; //raz (roz)ładowania
|
||||||
|
|
||||||
bool DoorBlocked; //Czy jest blokada drzwi
|
bool DoorBlocked; //Czy jest blokada drzwi
|
||||||
bool DoorLeftOpened; //stan drzwi
|
bool DoorLeftOpened; //stan drzwi
|
||||||
@@ -946,20 +946,20 @@ public:
|
|||||||
double FrictConst2d;
|
double FrictConst2d;
|
||||||
double TotalMassxg; /*TotalMass*g*/
|
double TotalMassxg; /*TotalMass*g*/
|
||||||
|
|
||||||
vector3 vCoulpler[2]; // powtórzenie współrzędnych sprzęgów z DynObj :/
|
vector3 vCoulpler[2]; // powtórzenie współrzędnych sprzęgów z DynObj :/
|
||||||
vector3 DimHalf; // połowy rozmiarów do obliczeń geometrycznych
|
vector3 DimHalf; // połowy rozmiarów do obliczeń geometrycznych
|
||||||
// int WarningSignal; //0: nie trabi, 1,2: trabi syreną o podanym numerze
|
// int WarningSignal; //0: nie trabi, 1,2: trabi syreną o podanym numerze
|
||||||
int WarningSignal; // tymczasowo 8bit, ze względu na funkcje w MTools
|
int WarningSignal; // tymczasowo 8bit, ze względu na funkcje w MTools
|
||||||
double fBrakeCtrlPos; // płynna nastawa hamulca zespolonego
|
double fBrakeCtrlPos; // płynna nastawa hamulca zespolonego
|
||||||
bool bPantKurek3; // kurek trójdrogowy (pantografu): true=połączenie z ZG, false=połączenie z małą sprężarką
|
bool bPantKurek3; // kurek trójdrogowy (pantografu): true=połączenie z ZG, false=połączenie z małą sprężarką
|
||||||
int iProblem; // flagi problemów z taborem, aby AI nie musiało porównywać; 0=może jechać
|
int iProblem; // flagi problemów z taborem, aby AI nie musiało porównywać; 0=może jechać
|
||||||
int iLights[2]; // bity zapalonych świateł tutaj, żeby dało się liczyć pobór prądu
|
int iLights[2]; // bity zapalonych świateł tutaj, żeby dało się liczyć pobór prądu
|
||||||
private:
|
private:
|
||||||
double CouplerDist(int Coupler);
|
double CouplerDist(int Coupler);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TMoverParameters(double VelInitial, std::string TypeNameInit, std::string NameInit, int LoadInitial, std::string LoadTypeInitial, int Cab);
|
TMoverParameters(double VelInitial, std::string TypeNameInit, std::string NameInit, int LoadInitial, std::string LoadTypeInitial, int Cab);
|
||||||
// obsługa sprzęgów
|
// obsługa sprzęgów
|
||||||
double Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1, const TDimension &Dim2);
|
double Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1, const TDimension &Dim2);
|
||||||
/* double Distance(const vector3 &Loc1, const vector3 &Loc2, const vector3 &Dim1, const vector3 &Dim2);
|
/* double Distance(const vector3 &Loc1, const vector3 &Loc2, const vector3 &Dim1, const vector3 &Dim2);
|
||||||
*/ //bool AttachA(int ConnectNo, int ConnectToNr, TMoverParameters *ConnectTo, int CouplingType, bool Forced = false);
|
*/ //bool AttachA(int ConnectNo, int ConnectToNr, TMoverParameters *ConnectTo, int CouplingType, bool Forced = false);
|
||||||
@@ -970,7 +970,7 @@ public:
|
|||||||
bool DirectionForward();
|
bool DirectionForward();
|
||||||
void BrakeLevelSet(double b);
|
void BrakeLevelSet(double b);
|
||||||
bool BrakeLevelAdd(double b);
|
bool BrakeLevelAdd(double b);
|
||||||
bool IncBrakeLevel(); // wersja na użytek AI
|
bool IncBrakeLevel(); // wersja na użytek AI
|
||||||
bool DecBrakeLevel();
|
bool DecBrakeLevel();
|
||||||
bool ChangeCab(int direction);
|
bool ChangeCab(int direction);
|
||||||
bool CurrentSwitch(int direction);
|
bool CurrentSwitch(int direction);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -129,7 +129,7 @@ void TRapid::Update(double dt)
|
|||||||
BrakeRes->Flow(-dV);
|
BrakeRes->Flow(-dV);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------ PRZEK£ADNIK CI¥G£Y ------
|
// ------ PRZEKŁADNIK CIĄGŁY ------
|
||||||
|
|
||||||
void TPrzekCiagly::SetMult(double m)
|
void TPrzekCiagly::SetMult(double m)
|
||||||
{
|
{
|
||||||
@@ -157,7 +157,7 @@ void TPrzekCiagly::Update(double dt)
|
|||||||
BrakeRes->Flow(-dV);
|
BrakeRes->Flow(-dV);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------ PRZEK£ADNIK CI¥G£Y ------
|
// ------ PRZEKŁADNIK CIĄGŁY ------
|
||||||
|
|
||||||
void TPrzek_PZZ::SetLBP(double P)
|
void TPrzek_PZZ::SetLBP(double P)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -113,14 +113,14 @@ class TPrzeciwposlizg : public TRura // przy napelnianiu - rura, przy poslizgu -
|
|||||||
// przekladnik dwustopniowy
|
// przekladnik dwustopniowy
|
||||||
class TRapid : public TPrzekladnik {
|
class TRapid : public TPrzekladnik {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool RapidStatus = false; // status rapidu
|
bool RapidStatus = false; // status rapidu
|
||||||
double RapidMult = 0.0; // przelozenie (w dol)
|
double RapidMult = 0.0; // przelozenie (w dol)
|
||||||
// Komora2: real;
|
// Komora2: real;
|
||||||
double DN = 0.0;
|
double DN = 0.0;
|
||||||
double DL = 0.0; // srednice dysz napelniania i luzowania
|
double DL = 0.0; // srednice dysz napelniania i luzowania
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void SetRapidParams(double mult, double size);
|
void SetRapidParams(double mult, double size);
|
||||||
void SetRapidStatus(bool rs);
|
void SetRapidStatus(bool rs);
|
||||||
void Update(double dt) /*override*/;
|
void Update(double dt) /*override*/;
|
||||||
@@ -132,7 +132,7 @@ public:
|
|||||||
// AL2
|
// AL2
|
||||||
class TPrzekCiagly : public TPrzekladnik {
|
class TPrzekCiagly : public TPrzekladnik {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double mult = 0.0;
|
double mult = 0.0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -146,10 +146,10 @@ private:
|
|||||||
// podwojny zawor zwrotny
|
// podwojny zawor zwrotny
|
||||||
class TPrzek_PZZ : public TPrzekladnik {
|
class TPrzek_PZZ : public TPrzekladnik {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double LBP = 0.0;
|
double LBP = 0.0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void SetLBP(double P);
|
void SetLBP(double P);
|
||||||
void Update(double dt) /*override*/;
|
void Update(double dt) /*override*/;
|
||||||
inline TPrzek_PZZ() :
|
inline TPrzek_PZZ() :
|
||||||
@@ -170,10 +170,10 @@ class TPrzekZalamany : public TPrzekladnik // Knicksventil
|
|||||||
// przy napelnianiu - rura, przy hamowaniu - upust
|
// przy napelnianiu - rura, przy hamowaniu - upust
|
||||||
class TPrzekED : public TRura {
|
class TPrzekED : public TRura {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double MaxP = 0.0;
|
double MaxP = 0.0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void SetP(double P);
|
void SetP(double P);
|
||||||
void Update(double dt) /*override*/;
|
void Update(double dt) /*override*/;
|
||||||
inline TPrzekED() :
|
inline TPrzekED() :
|
||||||
@@ -183,8 +183,8 @@ public:
|
|||||||
|
|
||||||
class TNESt3 : public TBrake {
|
class TNESt3 : public TBrake {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<TReservoir> CntrlRes; // zbiornik sterujšcy
|
std::shared_ptr<TReservoir> CntrlRes; // zbiornik sterujacy
|
||||||
std::shared_ptr<TReservoir> Miedzypoj; // pojemnosc posrednia (urojona) do napelniania ZP i ZS
|
std::shared_ptr<TReservoir> Miedzypoj; // pojemnosc posrednia (urojona) do napelniania ZP i ZS
|
||||||
std::shared_ptr<TPrzekladnik> Przekladniki[ 4 ];
|
std::shared_ptr<TPrzekladnik> Przekladniki[ 4 ];
|
||||||
double Nozzles[ dMAX ]; // dysze
|
double Nozzles[ dMAX ]; // dysze
|
||||||
@@ -205,7 +205,7 @@ private:
|
|||||||
bool autom = false; // odluzniacz samoczynny
|
bool autom = false; // odluzniacz samoczynny
|
||||||
double LBP = 0.0; // cisnienie hamulca pomocniczego
|
double LBP = 0.0; // cisnienie hamulca pomocniczego
|
||||||
|
|
||||||
public:
|
public:
|
||||||
inline TNESt3(double i_mbp, double i_bcr, double i_bcd, double i_brc, int i_bcn, int i_BD, int i_mat, int i_ba, int i_nbpa) :
|
inline TNESt3(double i_mbp, double i_bcr, double i_bcd, double i_brc, int i_bcn, int i_BD, int i_mat, int i_ba, int i_nbpa) :
|
||||||
TBrake( i_mbp, i_bcr, i_bcd, i_brc, i_bcn, i_BD, i_mat, i_ba, i_nbpa)
|
TBrake( i_mbp, i_bcr, i_bcd, i_brc, i_bcn, i_BD, i_mat, i_ba, i_nbpa)
|
||||||
{}
|
{}
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ double TBrakeCyl::pa()
|
|||||||
return P() * 0.1;
|
return P() * 0.1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOWSZA WERSJA - maksymalne ciśnienie to ok. 4,75 bar, co powoduje
|
/* NOWSZA WERSJA - maksymalne ciśnienie to ok. 4,75 bar, co powoduje
|
||||||
// problemy przy rapidzie w lokomotywach, gdyz jest3
|
// problemy przy rapidzie w lokomotywach, gdyz jest3
|
||||||
// osiagany wierzcholek paraboli
|
// osiagany wierzcholek paraboli
|
||||||
function TBrakeCyl.P:real;
|
function TBrakeCyl.P:real;
|
||||||
@@ -321,7 +321,7 @@ double TBrake::GetBCP()
|
|||||||
return BrakeCyl->P();
|
return BrakeCyl->P();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ciśnienie sterujące hamowaniem elektro-dynamicznym
|
// ciśnienie sterujące hamowaniem elektro-dynamicznym
|
||||||
double TBrake::GetEDBCP()
|
double TBrake::GetEDBCP()
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1273,7 +1273,7 @@ double TLSt::GetPF(double PP, double dt, double Vel)
|
|||||||
if (EDFlag > 0.2)
|
if (EDFlag > 0.2)
|
||||||
temp = 10000;
|
temp = 10000;
|
||||||
|
|
||||||
// powtarzacz — podwojny zawor zwrotny
|
// powtarzacz — podwojny zawor zwrotny
|
||||||
temp = Max0R(((CVP - BCP) * BVM + ASBP * int((BrakeStatus & b_asb) == b_asb)) / temp, LBP);
|
temp = Max0R(((CVP - BCP) * BVM + ASBP * int((BrakeStatus & b_asb) == b_asb)) / temp, LBP);
|
||||||
// luzowanie CH
|
// luzowanie CH
|
||||||
if ((BrakeCyl->P() > temp + 0.005) || (temp < 0.28))
|
if ((BrakeCyl->P() > temp + 0.005) || (temp < 0.28))
|
||||||
@@ -1454,7 +1454,7 @@ double TEStED::GetPF(double PP, double dt, double Vel)
|
|||||||
// if EDFlag then temp:=1000;
|
// if EDFlag then temp:=1000;
|
||||||
// temp:=temp/(1-);
|
// temp:=temp/(1-);
|
||||||
|
|
||||||
// powtarzacz — podwojny zawor zwrotny
|
// powtarzacz — podwojny zawor zwrotny
|
||||||
temp = Max0R(LoadC * BCP / temp * Min0R(Max0R(1 - EDFlag, 0), 1), LBP);
|
temp = Max0R(LoadC * BCP / temp * Min0R(Max0R(1 - EDFlag, 0), 1), LBP);
|
||||||
|
|
||||||
if ((BrakeCyl->P() > temp))
|
if ((BrakeCyl->P() > temp))
|
||||||
|
|||||||
@@ -23,13 +23,13 @@ moze jeszcze jakis SW
|
|||||||
/*
|
/*
|
||||||
Zrobione:
|
Zrobione:
|
||||||
ESt3, ESt3AL2, ESt4R, LSt, FV4a, FD1, EP2, prosty westinghouse
|
ESt3, ESt3AL2, ESt4R, LSt, FV4a, FD1, EP2, prosty westinghouse
|
||||||
duzo wersji ¿eliwa
|
duzo wersji żeliwa
|
||||||
KE
|
KE
|
||||||
Tarcze od 152A
|
Tarcze od 152A
|
||||||
Magnetyki (implementacja w mover.pas)
|
Magnetyki (implementacja w mover.pas)
|
||||||
Matrosow 394
|
Matrosow 394
|
||||||
H14K1 (zasadniczy), H1405 (pomocniczy), St113 (ep)
|
H14K1 (zasadniczy), H1405 (pomocniczy), St113 (ep)
|
||||||
Knorr/West EP - ¿eby by³
|
Knorr/West EP - żeby był
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -77,7 +77,7 @@ static int const s_fv4a_t = 4; //wyplyw z czasowego
|
|||||||
|
|
||||||
/*pary cierne*/
|
/*pary cierne*/
|
||||||
static int const bp_P10 = 0;
|
static int const bp_P10 = 0;
|
||||||
static int const bp_P10Bg = 2; //¿eliwo fosforowe P10
|
static int const bp_P10Bg = 2; //żeliwo fosforowe P10
|
||||||
static int const bp_P10Bgu = 1;
|
static int const bp_P10Bgu = 1;
|
||||||
static int const bp_LLBg = 4; //komp. b.n.t.
|
static int const bp_LLBg = 4; //komp. b.n.t.
|
||||||
static int const bp_LLBgu = 3;
|
static int const bp_LLBgu = 3;
|
||||||
@@ -87,12 +87,12 @@ static int const bp_KBg = 8; //komp. w.t.
|
|||||||
static int const bp_KBgu = 7;
|
static int const bp_KBgu = 7;
|
||||||
static int const bp_D1 = 9; //tarcze
|
static int const bp_D1 = 9; //tarcze
|
||||||
static int const bp_D2 = 10;
|
static int const bp_D2 = 10;
|
||||||
static int const bp_FR513 = 11; //Frenoplast FR513
|
static int const bp_FR513 = 11; // Frenoplast FR513
|
||||||
static int const bp_Cosid = 12; //jakistam kompozyt :D
|
static int const bp_Cosid = 12; // jakistam kompozyt :D
|
||||||
static int const bp_PKPBg = 13; //¿eliwo PKP
|
static int const bp_PKPBg = 13; //żeliwo PKP
|
||||||
static int const bp_PKPBgu = 14;
|
static int const bp_PKPBgu = 14;
|
||||||
static int const bp_MHS = 128; //magnetyczny hamulec szynowy
|
static int const bp_MHS = 128; // magnetyczny hamulec szynowy
|
||||||
static int const bp_P10yBg = 15; //¿eliwo fosforowe P10
|
static int const bp_P10yBg = 15; //żeliwo fosforowe P10
|
||||||
static int const bp_P10yBgu = 16;
|
static int const bp_P10yBgu = 16;
|
||||||
static int const bp_FR510 = 17; //Frenoplast FR510
|
static int const bp_FR510 = 17; //Frenoplast FR510
|
||||||
|
|
||||||
@@ -103,17 +103,17 @@ static int const sf_CylU = 8; //cylinder - oproznianie
|
|||||||
static int const sf_rel = 16; //odluzniacz
|
static int const sf_rel = 16; //odluzniacz
|
||||||
static int const sf_ep = 32; //zawory ep
|
static int const sf_ep = 32; //zawory ep
|
||||||
|
|
||||||
static int const bh_MIN = 0; //minimalna pozycja
|
static int const bh_MIN = 0; // minimalna pozycja
|
||||||
static int const bh_MAX = 1; //maksymalna pozycja
|
static int const bh_MAX = 1; // maksymalna pozycja
|
||||||
static int const bh_FS = 2; //napelnianie uderzeniowe //jesli nie ma, to jazda
|
static int const bh_FS = 2; // napelnianie uderzeniowe //jesli nie ma, to jazda
|
||||||
static int const bh_RP = 3; //jazda
|
static int const bh_RP = 3; // jazda
|
||||||
static int const bh_NP = 4; //odciecie - podwojna trakcja
|
static int const bh_NP = 4; // odciecie - podwojna trakcja
|
||||||
static int const bh_MB = 5; //odciecie - utrzymanie stopnia hamowania/pierwszy 1 stopien hamowania
|
static int const bh_MB = 5; // odciecie - utrzymanie stopnia hamowania/pierwszy 1 stopien hamowania
|
||||||
static int const bh_FB = 6; //pelne
|
static int const bh_FB = 6; // pelne
|
||||||
static int const bh_EB = 7; //nagle
|
static int const bh_EB = 7; // nagle
|
||||||
static int const bh_EPR = 8; //ep - luzowanie //pelny luz dla ep k¹towego
|
static int const bh_EPR = 8; // ep - luzowanie //pelny luz dla ep kątowego
|
||||||
static int const bh_EPN = 9; //ep - utrzymanie //jesli rowne luzowaniu, wtedy sterowanie przyciskiem
|
static int const bh_EPN = 9; // ep - utrzymanie //jesli rowne luzowaniu, wtedy sterowanie przyciskiem
|
||||||
static int const bh_EPB = 10; //ep - hamowanie //pelne hamowanie dla ep k¹towego
|
static int const bh_EPB = 10; // ep - hamowanie //pelne hamowanie dla ep kątowego
|
||||||
|
|
||||||
|
|
||||||
static double const SpgD = 0.7917;
|
static double const SpgD = 0.7917;
|
||||||
@@ -153,7 +153,7 @@ class TReservoir {
|
|||||||
TReservoir() = default;
|
TReservoir() = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef TReservoir *PReservoir;
|
typedef TReservoir *PReservoir;
|
||||||
|
|
||||||
|
|
||||||
class TBrakeCyl : public TReservoir {
|
class TBrakeCyl : public TReservoir {
|
||||||
@@ -247,8 +247,8 @@ class TESt : public TBrake {
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::shared_ptr<TReservoir> CntrlRes; //zbiornik steruj¹cy
|
std::shared_ptr<TReservoir> CntrlRes; // zbiornik sterujący
|
||||||
double BVM = 0.0; //przelozenie PG-CH
|
double BVM = 0.0; // przelozenie PG-CH
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void Init(double PP, double HPP, double LPP, double BP, int BDF)/*override*/;
|
void Init(double PP, double HPP, double LPP, double BP, int BDF)/*override*/;
|
||||||
@@ -325,7 +325,7 @@ class TESt4R : public TESt {
|
|||||||
class TLSt : public TESt4R {
|
class TLSt : public TESt4R {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// double CylFlowSpeed[2][2]; // zmienna nie u¿ywana
|
// double CylFlowSpeed[2][2]; // zmienna nie używana
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
double LBP = 0.0; //cisnienie hamulca pomocniczego
|
double LBP = 0.0; //cisnienie hamulca pomocniczego
|
||||||
@@ -401,7 +401,7 @@ class TCV1 : public TBrake {
|
|||||||
double BVM = 0.0; //przelozenie PG-CH
|
double BVM = 0.0; //przelozenie PG-CH
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::shared_ptr<TReservoir> CntrlRes; //zbiornik steruj¹cy
|
std::shared_ptr<TReservoir> CntrlRes; // zbiornik sterujący
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void Init(double PP, double HPP, double LPP, double BP, int BDF)/*override*/;
|
void Init(double PP, double HPP, double LPP, double BP, int BDF)/*override*/;
|
||||||
@@ -420,20 +420,20 @@ class TCV1 : public TBrake {
|
|||||||
|
|
||||||
//class TCV1R : public TCV1
|
//class TCV1R : public TCV1
|
||||||
|
|
||||||
//{
|
//{
|
||||||
//private:
|
//private:
|
||||||
// TReservoir *ImplsRes; //komora impulsowa
|
// TReservoir *ImplsRes; //komora impulsowa
|
||||||
// bool RapidStatus;
|
// bool RapidStatus;
|
||||||
|
|
||||||
//public:
|
//public:
|
||||||
// // function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
|
// // function GetPF(PP, dt, Vel: real): real; override; //przeplyw miedzy komora wstepna i PG
|
||||||
// // procedure Init(PP, HPP, LPP, BP: real; BDF: int); override;
|
// // procedure Init(PP, HPP, LPP, BP: real; BDF: int); override;
|
||||||
|
|
||||||
// inline TCV1R(double i_mbp, double i_bcr, double i_bcd, double i_brc,
|
// inline TCV1R(double i_mbp, double i_bcr, double i_bcd, double i_brc,
|
||||||
// int i_bcn, int i_BD, int i_mat, int i_ba, int i_nbpa,
|
// int i_bcn, int i_BD, int i_mat, int i_ba, int i_nbpa,
|
||||||
// double PP, double HPP, double LPP, double BP, int BDF) : TCV1(i_mbp, i_bcr, i_bcd, i_brc, i_bcn
|
// double PP, double HPP, double LPP, double BP, int BDF) : TCV1(i_mbp, i_bcr, i_bcd, i_brc, i_bcn
|
||||||
// , i_BD, i_mat, i_ba, i_nbpa, PP, HPP, LPP, BP, BDF) { }
|
// , i_BD, i_mat, i_ba, i_nbpa, PP, HPP, LPP, BP, BDF) { }
|
||||||
//};
|
//};
|
||||||
|
|
||||||
class TCV1L_TR : public TCV1 {
|
class TCV1L_TR : public TCV1 {
|
||||||
|
|
||||||
@@ -454,11 +454,11 @@ class TCV1L_TR : public TCV1 {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class TKE : public TBrake { //Knorr Einheitsbauart — jeden do wszystkiego
|
class TKE : public TBrake { //Knorr Einheitsbauart — jeden do wszystkiego
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<TReservoir> ImplsRes; //komora impulsowa
|
std::shared_ptr<TReservoir> ImplsRes; //komora impulsowa
|
||||||
std::shared_ptr<TReservoir> CntrlRes; //zbiornik steruj¹cy
|
std::shared_ptr<TReservoir> CntrlRes; // zbiornik sterujący
|
||||||
std::shared_ptr<TReservoir> Brak2Res; //zbiornik pomocniczy 2
|
std::shared_ptr<TReservoir> Brak2Res; //zbiornik pomocniczy 2
|
||||||
bool RapidStatus = false;
|
bool RapidStatus = false;
|
||||||
double BVM = 0.0; //przelozenie PG-CH
|
double BVM = 0.0; //przelozenie PG-CH
|
||||||
@@ -515,7 +515,7 @@ class TDriverHandle {
|
|||||||
class TFV4a : public TDriverHandle {
|
class TFV4a : public TDriverHandle {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double CP = 0.0; //zbiornik steruj¹cy
|
double CP = 0.0; //zbiornik sterujący
|
||||||
double TP = 0.0; //zbiornik czasowy
|
double TP = 0.0; //zbiornik czasowy
|
||||||
double RP = 0.0; //zbiornik redukcyjny
|
double RP = 0.0; //zbiornik redukcyjny
|
||||||
|
|
||||||
@@ -531,12 +531,12 @@ class TFV4a : public TDriverHandle {
|
|||||||
class TFV4aM : public TDriverHandle {
|
class TFV4aM : public TDriverHandle {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double CP = 0.0; //zbiornik steruj¹cy
|
double CP = 0.0; //zbiornik sterujący
|
||||||
double TP = 0.0; //zbiornik czasowy
|
double TP = 0.0; //zbiornik czasowy
|
||||||
double RP = 0.0; //zbiornik redukcyjny
|
double RP = 0.0; //zbiornik redukcyjny
|
||||||
double XP = 0.0; //komora powietrzna w reduktorze — jest potrzebna do odwzorowania fali
|
double XP = 0.0; //komora powietrzna w reduktorze — jest potrzebna do odwzorowania fali
|
||||||
double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
||||||
// Sounds: array[0..4] of real; //wielkosci przeplywow dla dzwiekow
|
// Sounds: array[0..4] of real; //wielkosci przeplywow dla dzwiekow
|
||||||
bool Fala = false;
|
bool Fala = false;
|
||||||
static double const pos_table[11]; // = { -2, 6, -1, 0, -2, 1, 4, 6, 0, 0, 0 };
|
static double const pos_table[11]; // = { -2, 6, -1, 0, -2, 1, 4, 6, 0, 0, 0 };
|
||||||
|
|
||||||
@@ -558,7 +558,7 @@ class TFV4aM : public TDriverHandle {
|
|||||||
class TMHZ_EN57 : public TDriverHandle {
|
class TMHZ_EN57 : public TDriverHandle {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double CP = 0.0; //zbiornik steruj¹cy
|
double CP = 0.0; //zbiornik sterujący
|
||||||
double TP = 0.0; //zbiornik czasowy
|
double TP = 0.0; //zbiornik czasowy
|
||||||
double RP = 0.0; //zbiornik redukcyjny
|
double RP = 0.0; //zbiornik redukcyjny
|
||||||
double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
||||||
@@ -582,12 +582,12 @@ class TMHZ_EN57 : public TDriverHandle {
|
|||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* FBS2= class(TTDriverHandle)
|
/* FBS2= class(TTDriverHandle)
|
||||||
private
|
private
|
||||||
CP, TP, RP: real; //zbiornik steruj¹cy, czasowy, redukcyjny
|
CP, TP, RP: real; //zbiornik sterujący, czasowy, redukcyjny
|
||||||
XP: real; //komora powietrzna w reduktorze — jest potrzebna do odwzorowania fali
|
XP: real; //komora powietrzna w reduktorze — jest potrzebna do odwzorowania fali
|
||||||
RedAdj: real; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
RedAdj: real; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
||||||
// Sounds: array[0..4] of real; //wielkosci przeplywow dla dzwiekow
|
// Sounds: array[0..4] of real; //wielkosci przeplywow dla dzwiekow
|
||||||
Fala: boolean;
|
Fala: boolean;
|
||||||
public
|
public
|
||||||
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
|
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
|
||||||
@@ -597,12 +597,12 @@ class TMHZ_EN57 : public TDriverHandle {
|
|||||||
function GetPos(i: int): real; override;
|
function GetPos(i: int): real; override;
|
||||||
end; */
|
end; */
|
||||||
|
|
||||||
/* TD2= class(TTDriverHandle)
|
/* TD2= class(TTDriverHandle)
|
||||||
private
|
private
|
||||||
CP, TP, RP: real; //zbiornik steruj¹cy, czasowy, redukcyjny
|
CP, TP, RP: real; //zbiornik sterujący, czasowy, redukcyjny
|
||||||
XP: real; //komora powietrzna w reduktorze — jest potrzebna do odwzorowania fali
|
XP: real; //komora powietrzna w reduktorze — jest potrzebna do odwzorowania fali
|
||||||
RedAdj: real; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
RedAdj: real; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
||||||
// Sounds: array[0..4] of real; //wielkosci przeplywow dla dzwiekow
|
// Sounds: array[0..4] of real; //wielkosci przeplywow dla dzwiekow
|
||||||
Fala: boolean;
|
Fala: boolean;
|
||||||
public
|
public
|
||||||
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
|
function GetPF(i_bcp:real; pp, hp, dt, ep: real): real; override;
|
||||||
@@ -615,7 +615,7 @@ class TMHZ_EN57 : public TDriverHandle {
|
|||||||
class TM394 : public TDriverHandle {
|
class TM394 : public TDriverHandle {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double CP = 0.0; //zbiornik steruj¹cy, czasowy, redukcyjny
|
double CP = 0.0; //zbiornik sterujący, czasowy, redukcyjny
|
||||||
double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
||||||
static double const pos_table[11]; // = { -1, 5, -1, 0, 1, 2, 4, 5, 0, 0, 0 };
|
static double const pos_table[11]; // = { -1, 5, -1, 0, 1, 2, 4, 5, 0, 0, 0 };
|
||||||
|
|
||||||
@@ -638,7 +638,7 @@ class TH14K1 : public TDriverHandle {
|
|||||||
static double const pos_table[11]; // = {-1, 4, -1, 0, 1, 2, 3, 4, 0, 0, 0};
|
static double const pos_table[11]; // = {-1, 4, -1, 0, 1, 2, 3, 4, 0, 0, 0};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
double CP = 0.0; //zbiornik steruj¹cy, czasowy, redukcyjny
|
double CP = 0.0; //zbiornik sterujący, czasowy, redukcyjny
|
||||||
double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
double RedAdj = 0.0; //dostosowanie reduktora cisnienia (krecenie kapturkiem)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ bool iSetFlag(int &Flag, int Value)
|
|||||||
if ((Flag & Value) == 0)
|
if ((Flag & Value) == 0)
|
||||||
{
|
{
|
||||||
Flag |= Value;
|
Flag |= Value;
|
||||||
return true; // true, gdy by³o wczeœniej 0 i zosta³o ustawione
|
return true; // true, gdy było wcześniej 0 i zostało ustawione
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (Value < 0)
|
else if (Value < 0)
|
||||||
@@ -121,7 +121,7 @@ bool iSetFlag(int &Flag, int Value)
|
|||||||
if ((Flag & Value) == Value)
|
if ((Flag & Value) == Value)
|
||||||
{
|
{
|
||||||
Flag &= ~Value; // Value jest ujemne, czyli zerowanie flagi
|
Flag &= ~Value; // Value jest ujemne, czyli zerowanie flagi
|
||||||
return true; // true, gdy by³o wczeœniej 1 i zosta³o wyzerowane
|
return true; // true, gdy było wcześniej 1 i zostało wyzerowane
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -342,7 +342,7 @@ std::vector<std::string> Split(const std::string &s, char delim)
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> Split(const std::string &s)
|
std::vector<std::string> Split(const std::string &s)
|
||||||
{ // dzieli tekst na wektor tekstow po bia³ych znakach
|
{ // dzieli tekst na wektor tekstow po białych znakach
|
||||||
std::vector<std::string> elems;
|
std::vector<std::string> elems;
|
||||||
std::stringstream ss(s);
|
std::stringstream ss(s);
|
||||||
std::string item;
|
std::string item;
|
||||||
@@ -556,7 +556,7 @@ long Vert(double Y)
|
|||||||
|
|
||||||
// NOTE: this now does nothing.
|
// NOTE: this now does nothing.
|
||||||
void ClearPendingExceptions()
|
void ClearPendingExceptions()
|
||||||
// resetuje b³êdy FPU, wymagane dla Trunc()
|
// resetuje błędy FPU, wymagane dla Trunc()
|
||||||
{
|
{
|
||||||
; /*?*/ /* ASM
|
; /*?*/ /* ASM
|
||||||
FNCLEX
|
FNCLEX
|
||||||
|
|||||||
@@ -19,12 +19,12 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
/*Ra: te sta³e nie s¹ u¿ywane...
|
/*Ra: te stałe nie są używane...
|
||||||
_FileName = ['a'..'z','A'..'Z',':','\','.','*','?','0'..'9','_','-'];
|
_FileName = ['a'..'z','A'..'Z',':','\','.','*','?','0'..'9','_','-'];
|
||||||
_RealNum = ['0'..'9','-','+','.','E','e'];
|
_RealNum = ['0'..'9','-','+','.','E','e'];
|
||||||
_Integer = ['0'..'9','-']; //Ra: to siê gryzie z STLport w Builder 6
|
_Integer = ['0'..'9','-']; //Ra: to się gryzie z STLport w Builder 6
|
||||||
_Plus_Int = ['0'..'9'];
|
_Plus_Int = ['0'..'9'];
|
||||||
_All = [' '..'þ'];
|
_All = [' '..'ţ'];
|
||||||
_Delimiter= [',',';']+_EOL;
|
_Delimiter= [',',';']+_EOL;
|
||||||
_Delimiter_Space=_Delimiter+[' '];
|
_Delimiter_Space=_Delimiter+[' '];
|
||||||
*/
|
*/
|
||||||
|
|||||||
80
MdlMngr.cpp
80
MdlMngr.cpp
@@ -68,80 +68,80 @@ TModel3d * TModelsManager::LoadModel(std::string const &Name, bool dynamic)
|
|||||||
{
|
{
|
||||||
mdl = Models[Count].LoadModel(Name, dynamic);
|
mdl = Models[Count].LoadModel(Name, dynamic);
|
||||||
if (mdl)
|
if (mdl)
|
||||||
Count++; // jeśli błąd wczytania modelu, to go nie wliczamy
|
Count++; // jeśli błąd wczytania modelu, to go nie wliczamy
|
||||||
}
|
}
|
||||||
return mdl;
|
return mdl;
|
||||||
}
|
}
|
||||||
|
|
||||||
TModel3d * TModelsManager::GetModel(std::string const &Name, bool dynamic)
|
TModel3d * TModelsManager::GetModel(std::string const &Name, bool dynamic)
|
||||||
{ // model może być we wpisie "node...model" albo "node...dynamic", a także być dodatkowym w dynamic
|
{ // model może być we wpisie "node...model" albo "node...dynamic", a także być dodatkowym w dynamic
|
||||||
// (kabina, wnętrze, ładunek)
|
// (kabina, wnętrze, ładunek)
|
||||||
// dla "node...dynamic" mamy podaną ścieżkę w "\dynamic\" i musi być co najmniej 1 poziom, zwkle
|
// dla "node...dynamic" mamy podaną ścieżkę w "\dynamic\" i musi być co najmniej 1 poziom, zwkle
|
||||||
// są 2
|
// są 2
|
||||||
// dla "node...model" może być typowy model statyczny ze ścieżką, domyślnie w "\scenery\" albo
|
// dla "node...model" może być typowy model statyczny ze ścieżką, domyślnie w "\scenery\" albo
|
||||||
// "\models"
|
// "\models"
|
||||||
// albo może być model z "\dynamic\", jeśli potrzebujemy wstawić auto czy wagon nieruchomo
|
// albo może być model z "\dynamic\", jeśli potrzebujemy wstawić auto czy wagon nieruchomo
|
||||||
// - ze ścieżki z której jest wywołany, np. dir="scenery\bud\" albo dir="dynamic\pkp\st44_v1\"
|
// - ze ścieżki z której jest wywołany, np. dir="scenery\bud\" albo dir="dynamic\pkp\st44_v1\"
|
||||||
// plus name="model.t3d"
|
// plus name="model.t3d"
|
||||||
// - z domyślnej ścieżki dla modeli, np. "scenery\" albo "models\" plus name="bud\dombale.t3d"
|
// - z domyślnej ścieżki dla modeli, np. "scenery\" albo "models\" plus name="bud\dombale.t3d"
|
||||||
// (dir="")
|
// (dir="")
|
||||||
// - konkretnie podanej ścieżki np. name="\scenery\bud\dombale.t3d" (dir="")
|
// - konkretnie podanej ścieżki np. name="\scenery\bud\dombale.t3d" (dir="")
|
||||||
// wywołania:
|
// wywołania:
|
||||||
// - konwersja wszystkiego do E3D, podawana dokładna ścieżka, tekstury tam, gdzie plik
|
// - konwersja wszystkiego do E3D, podawana dokładna ścieżka, tekstury tam, gdzie plik
|
||||||
// - wczytanie kabiny, dokładna ścieżka, tekstury z katalogu modelu
|
// - wczytanie kabiny, dokładna ścieżka, tekstury z katalogu modelu
|
||||||
// - wczytanie ładunku, ścieżka dokładna, tekstury z katalogu modelu
|
// - wczytanie ładunku, ścieżka dokładna, tekstury z katalogu modelu
|
||||||
// - wczytanie modelu, ścieżka dokładna, tekstury z katalogu modelu
|
// - wczytanie modelu, ścieżka dokładna, tekstury z katalogu modelu
|
||||||
// - wczytanie przedsionków, ścieżka dokładna, tekstury z katalogu modelu
|
// - wczytanie przedsionków, ścieżka dokładna, tekstury z katalogu modelu
|
||||||
// - wczytanie uproszczonego wnętrza, ścieżka dokładna, tekstury z katalogu modelu
|
// - wczytanie uproszczonego wnętrza, ścieżka dokładna, tekstury z katalogu modelu
|
||||||
// - niebo animowane, ścieżka brana ze wpisu, tekstury nieokreślone
|
// - niebo animowane, ścieżka brana ze wpisu, tekstury nieokreślone
|
||||||
// - wczytanie modelu animowanego - Init() - sprawdzić
|
// - wczytanie modelu animowanego - Init() - sprawdzić
|
||||||
std::string buf;
|
std::string buf;
|
||||||
std::string buftp = Global::asCurrentTexturePath; // zapamiętanie aktualnej ścieżki do tekstur,
|
std::string buftp = Global::asCurrentTexturePath; // zapamiętanie aktualnej ścieżki do tekstur,
|
||||||
// bo będzie tyczmasowo zmieniana
|
// bo będzie tyczmasowo zmieniana
|
||||||
/*
|
/*
|
||||||
// Ra: niby tak jest lepiej, ale działa gorzej, więc przywrócone jest oryginalne
|
// Ra: niby tak jest lepiej, ale działa gorzej, więc przywrócone jest oryginalne
|
||||||
//nawet jeśli model będzie pobrany z tablicy, to trzeba ustalić ścieżkę dla tekstur
|
//nawet jeśli model będzie pobrany z tablicy, to trzeba ustalić ścieżkę dla tekstur
|
||||||
if (dynamic) //na razie tak, bo nie wiadomo, jaki może mieć wpływ na pozostałe modele
|
if (dynamic) //na razie tak, bo nie wiadomo, jaki może mieć wpływ na pozostałe modele
|
||||||
{//dla pojazdów podana jest zawsze pełna ścieżka do modelu
|
{//dla pojazdów podana jest zawsze pełna ścieżka do modelu
|
||||||
strcpy(buf,Name);
|
strcpy(buf,Name);
|
||||||
if (strchr(Name,'/')!=NULL)
|
if (strchr(Name,'/')!=NULL)
|
||||||
{//pobieranie tekstur z katalogu, w którym jest model
|
{//pobieranie tekstur z katalogu, w którym jest model
|
||||||
Global::asCurrentTexturePath=Global::asCurrentTexturePath+AnsiString(Name);
|
Global::asCurrentTexturePath=Global::asCurrentTexturePath+AnsiString(Name);
|
||||||
Global::asCurrentTexturePath.Delete(Global::asCurrentTexturePath.Pos("/")+1,Global::asCurrentTexturePath.Length());
|
Global::asCurrentTexturePath.Delete(Global::asCurrentTexturePath.Pos("/")+1,Global::asCurrentTexturePath.Length());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{//dla modeli scenerii trzeba ustalić ścieżkę
|
{//dla modeli scenerii trzeba ustalić ścieżkę
|
||||||
if (strchr(Name,'\\')==NULL)
|
if (strchr(Name,'\\')==NULL)
|
||||||
{//jeśli nie ma lewego ukośnika w ścieżce, a jest prawy, to zmienić ścieżkę dla tekstur na tę
|
{//jeśli nie ma lewego ukośnika w ścieżce, a jest prawy, to zmienić ścieżkę dla tekstur na tę
|
||||||
z modelem
|
z modelem
|
||||||
strcpy(buf,"models\\"); //Ra: było by lepiej katalog dodać w parserze
|
strcpy(buf,"models\\"); //Ra: było by lepiej katalog dodać w parserze
|
||||||
//strcpy(buf,"scenery\\"); //Ra: było by lepiej katalog dodać w parserze
|
//strcpy(buf,"scenery\\"); //Ra: było by lepiej katalog dodać w parserze
|
||||||
strcat(buf,Name);
|
strcat(buf,Name);
|
||||||
if (strchr(Name,'/')!=NULL)
|
if (strchr(Name,'/')!=NULL)
|
||||||
{//jeszcze musi być prawy ukośnik
|
{//jeszcze musi być prawy ukośnik
|
||||||
Global::asCurrentTexturePath=Global::asCurrentTexturePath+AnsiString(Name);
|
Global::asCurrentTexturePath=Global::asCurrentTexturePath+AnsiString(Name);
|
||||||
Global::asCurrentTexturePath.Delete(Global::asCurrentTexturePath.Pos("/")+1,Global::asCurrentTexturePath.Length());
|
Global::asCurrentTexturePath.Delete(Global::asCurrentTexturePath.Pos("/")+1,Global::asCurrentTexturePath.Length());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{//jeśli jest lewy ukośnik, to ścieżkę do tekstur zmienić tylko dla pojazdów
|
{//jeśli jest lewy ukośnik, to ścieżkę do tekstur zmienić tylko dla pojazdów
|
||||||
strcpy(buf,Name);
|
strcpy(buf,Name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
StrLower(buf);
|
StrLower(buf);
|
||||||
for (int i=0;i<Count;i++)
|
for (int i=0;i<Count;i++)
|
||||||
{//bezsensowne przeszukanie tabeli na okoliczność wystąpienia modelu
|
{//bezsensowne przeszukanie tabeli na okoliczność wystąpienia modelu
|
||||||
if (strcmp(buf,Models[i].Name)==0)
|
if (strcmp(buf,Models[i].Name)==0)
|
||||||
{
|
{
|
||||||
Global::asCurrentTexturePath=buftp; //odtworzenie ścieżki do tekstur
|
Global::asCurrentTexturePath=buftp; //odtworzenie ścieżki do tekstur
|
||||||
return (Models[i].Model); //model znaleziony
|
return (Models[i].Model); //model znaleziony
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
if( Name.find('\\') == std::string::npos )
|
if( Name.find('\\') == std::string::npos )
|
||||||
{
|
{
|
||||||
buf = "models\\"; // Ra: było by lepiej katalog dodać w parserze
|
buf = "models\\"; // Ra: było by lepiej katalog dodać w parserze
|
||||||
buf.append( Name );
|
buf.append( Name );
|
||||||
if( Name.find( '/') != std::string::npos)
|
if( Name.find( '/') != std::string::npos)
|
||||||
{
|
{
|
||||||
@@ -153,9 +153,9 @@ TModel3d * TModelsManager::GetModel(std::string const &Name, bool dynamic)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
buf = Name;
|
buf = Name;
|
||||||
if (dynamic) // na razie tak, bo nie wiadomo, jaki może mieć wpływ na pozostałe modele
|
if (dynamic) // na razie tak, bo nie wiadomo, jaki może mieć wpływ na pozostałe modele
|
||||||
if (Name.find( '/') != std::string::npos)
|
if (Name.find( '/') != std::string::npos)
|
||||||
{ // pobieranie tekstur z katalogu, w którym jest model
|
{ // pobieranie tekstur z katalogu, w którym jest model
|
||||||
Global::asCurrentTexturePath = Global::asCurrentTexturePath + Name;
|
Global::asCurrentTexturePath = Global::asCurrentTexturePath + Name;
|
||||||
Global::asCurrentTexturePath.erase(Global::asCurrentTexturePath.find("/") + 1,
|
Global::asCurrentTexturePath.erase(Global::asCurrentTexturePath.find("/") + 1,
|
||||||
Global::asCurrentTexturePath.length() - 1);
|
Global::asCurrentTexturePath.length() - 1);
|
||||||
@@ -170,9 +170,9 @@ TModel3d * TModelsManager::GetModel(std::string const &Name, bool dynamic)
|
|||||||
return (Models[i].Model);
|
return (Models[i].Model);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
TModel3d *tmpModel = LoadModel(buf, dynamic); // model nie znaleziony, to wczytać
|
TModel3d *tmpModel = LoadModel(buf, dynamic); // model nie znaleziony, to wczytać
|
||||||
Global::asCurrentTexturePath = buftp; // odtworzenie ścieżki do tekstur
|
Global::asCurrentTexturePath = buftp; // odtworzenie ścieżki do tekstur
|
||||||
return (tmpModel); // NULL jeśli błąd
|
return (tmpModel); // NULL jeśli błąd
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
64
MemCell.cpp
64
MemCell.cpp
@@ -28,11 +28,11 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
TMemCell::TMemCell(vector3 *p)
|
TMemCell::TMemCell(vector3 *p)
|
||||||
{
|
{
|
||||||
fValue1 = fValue2 = 0;
|
fValue1 = fValue2 = 0;
|
||||||
szText = new char[256]; // musi byæ dla automatycznie tworzonych komórek dla odcinków
|
szText = new char[256]; // musi być dla automatycznie tworzonych komórek dla odcinków
|
||||||
// izolowanych
|
// izolowanych
|
||||||
vPosition =
|
vPosition =
|
||||||
p ? *p : vector3(0, 0, 0); // ustawienie wspó³rzêdnych, bo do TGroundNode nie ma dostêpu
|
p ? *p : vector3(0, 0, 0); // ustawienie współrzędnych, bo do TGroundNode nie ma dostępu
|
||||||
bCommand = false; // komenda wys³ana
|
bCommand = false; // komenda wysłana
|
||||||
OnSent = NULL;
|
OnSent = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ void TMemCell::Init()
|
|||||||
void TMemCell::UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, int CheckMask)
|
void TMemCell::UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, int CheckMask)
|
||||||
{
|
{
|
||||||
if (CheckMask & update_memadd)
|
if (CheckMask & update_memadd)
|
||||||
{ // dodawanie wartoœci
|
{ // dodawanie wartości
|
||||||
if (TestFlag(CheckMask, update_memstring))
|
if (TestFlag(CheckMask, update_memstring))
|
||||||
strcat(szText, szNewText);
|
strcat(szText, szNewText);
|
||||||
if (TestFlag(CheckMask, update_memval1))
|
if (TestFlag(CheckMask, update_memval1))
|
||||||
@@ -66,7 +66,7 @@ void TMemCell::UpdateValues(char *szNewText, double fNewValue1, double fNewValue
|
|||||||
fValue2 = fNewValue2;
|
fValue2 = fNewValue2;
|
||||||
}
|
}
|
||||||
if (TestFlag(CheckMask, update_memstring))
|
if (TestFlag(CheckMask, update_memstring))
|
||||||
CommandCheck(); // jeœli zmieniony tekst, próbujemy rozpoznaæ komendê
|
CommandCheck(); // jeśli zmieniony tekst, próbujemy rozpoznać komendę
|
||||||
}
|
}
|
||||||
|
|
||||||
TCommandType TMemCell::CommandCheck()
|
TCommandType TMemCell::CommandCheck()
|
||||||
@@ -74,37 +74,37 @@ TCommandType TMemCell::CommandCheck()
|
|||||||
if (strcmp(szText, "SetVelocity") == 0) // najpopularniejsze
|
if (strcmp(szText, "SetVelocity") == 0) // najpopularniejsze
|
||||||
{
|
{
|
||||||
eCommand = cm_SetVelocity;
|
eCommand = cm_SetVelocity;
|
||||||
bCommand = false; // ta komenda nie jest wysy³ana
|
bCommand = false; // ta komenda nie jest wysyłana
|
||||||
}
|
}
|
||||||
else if (strcmp(szText, "ShuntVelocity") == 0) // w tarczach manewrowych
|
else if (strcmp(szText, "ShuntVelocity") == 0) // w tarczach manewrowych
|
||||||
{
|
{
|
||||||
eCommand = cm_ShuntVelocity;
|
eCommand = cm_ShuntVelocity;
|
||||||
bCommand = false; // ta komenda nie jest wysy³ana
|
bCommand = false; // ta komenda nie jest wysyłana
|
||||||
}
|
}
|
||||||
else if (strcmp(szText, "Change_direction") == 0) // zdarza siê
|
else if (strcmp(szText, "Change_direction") == 0) // zdarza się
|
||||||
{
|
{
|
||||||
eCommand = cm_ChangeDirection;
|
eCommand = cm_ChangeDirection;
|
||||||
bCommand = true; // do wys³ania
|
bCommand = true; // do wysłania
|
||||||
}
|
}
|
||||||
else if (strcmp(szText, "OutsideStation") == 0) // zdarza siê
|
else if (strcmp(szText, "OutsideStation") == 0) // zdarza się
|
||||||
{
|
{
|
||||||
eCommand = cm_OutsideStation;
|
eCommand = cm_OutsideStation;
|
||||||
bCommand = false; // tego nie powinno byæ w komórce
|
bCommand = false; // tego nie powinno być w komórce
|
||||||
}
|
}
|
||||||
else if (strncmp(szText, "PassengerStopPoint:", 19) == 0) // porównanie pocz¹tków
|
else if (strncmp(szText, "PassengerStopPoint:", 19) == 0) // porównanie początków
|
||||||
{
|
{
|
||||||
eCommand = cm_PassengerStopPoint;
|
eCommand = cm_PassengerStopPoint;
|
||||||
bCommand = false; // tego nie powinno byæ w komórce
|
bCommand = false; // tego nie powinno być w komórce
|
||||||
}
|
}
|
||||||
else if (strcmp(szText, "SetProximityVelocity") == 0) // nie powinno tego byæ
|
else if (strcmp(szText, "SetProximityVelocity") == 0) // nie powinno tego być
|
||||||
{
|
{
|
||||||
eCommand = cm_SetProximityVelocity;
|
eCommand = cm_SetProximityVelocity;
|
||||||
bCommand = false; // ta komenda nie jest wysy³ana
|
bCommand = false; // ta komenda nie jest wysyłana
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
eCommand = cm_Unknown; // ci¹g nierozpoznany (nie jest komend¹)
|
eCommand = cm_Unknown; // ciąg nierozpoznany (nie jest komendą)
|
||||||
bCommand = true; // do wys³ania
|
bCommand = true; // do wysłania
|
||||||
}
|
}
|
||||||
return eCommand;
|
return eCommand;
|
||||||
}
|
}
|
||||||
@@ -115,7 +115,7 @@ bool TMemCell::Load(cParser *parser)
|
|||||||
parser->getTokens(1, false); // case sensitive
|
parser->getTokens(1, false); // case sensitive
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
SafeDeleteArray(szText);
|
SafeDeleteArray(szText);
|
||||||
szText = new char[256]; // musi byæ bufor do ³¹czenia tekstów
|
szText = new char[256]; // musi być bufor do łączenia tekstów
|
||||||
strcpy(szText, token.c_str());
|
strcpy(szText, token.c_str());
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> fValue1;
|
*parser >> fValue1;
|
||||||
@@ -123,7 +123,7 @@ bool TMemCell::Load(cParser *parser)
|
|||||||
*parser >> fValue2;
|
*parser >> fValue2;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
if (token.compare("none") != 0) // gdy ró¿ne od "none"
|
if (token.compare("none") != 0) // gdy różne od "none"
|
||||||
asTrackName = token; // sprawdzane przez IsEmpty()
|
asTrackName = token; // sprawdzane przez IsEmpty()
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
@@ -134,26 +134,26 @@ bool TMemCell::Load(cParser *parser)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TMemCell::PutCommand(TController *Mech, vector3 *Loc)
|
void TMemCell::PutCommand(TController *Mech, vector3 *Loc)
|
||||||
{ // wys³anie zawartoœci komórki do AI
|
{ // wysłanie zawartości komórki do AI
|
||||||
if (Mech)
|
if (Mech)
|
||||||
Mech->PutCommand(szText, fValue1, fValue2, Loc);
|
Mech->PutCommand(szText, fValue1, fValue2, Loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TMemCell::Compare(char *szTestText, double fTestValue1, double fTestValue2, int CheckMask)
|
bool TMemCell::Compare(char *szTestText, double fTestValue1, double fTestValue2, int CheckMask)
|
||||||
{ // porównanie zawartoœci komórki pamiêci z podanymi wartoœciami
|
{ // porównanie zawartości komórki pamięci z podanymi wartościami
|
||||||
if (TestFlag(CheckMask, conditional_memstring))
|
if (TestFlag(CheckMask, conditional_memstring))
|
||||||
{ // porównaæ teksty
|
{ // porównać teksty
|
||||||
/* char *pos = std::strstr(szTestText, "*"); // zwraca wskaŸnik na pozycjê albo NULL
|
/* char *pos = std::strstr(szTestText, "*"); // zwraca wskaźnik na pozycję albo NULL
|
||||||
if( nullptr != pos ) { // porównanie fragmentu ³añcucha
|
if( nullptr != pos ) { // porównanie fragmentu łańcucha
|
||||||
int i = pos - szTestText; // iloœæ porównywanych znaków
|
int i = pos - szTestText; // ilość porównywanych znaków
|
||||||
if( i ) { // jeœli nie jest pierwszym znakiem
|
if( i ) { // jeśli nie jest pierwszym znakiem
|
||||||
if( std::string( szTestText ).substr( 0, i ) != std::string( szText ).substr( 0, i ) ) {
|
if( std::string( szTestText ).substr( 0, i ) != std::string( szText ).substr( 0, i ) ) {
|
||||||
return false; // pocz¹tki o d³ugoœci (i) s¹ ró¿ne
|
return false; // początki o długości (i) są różne
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( std::string( szTestText ) != std::string( szText ) ) {
|
else if( std::string( szTestText ) != std::string( szText ) ) {
|
||||||
return false; //³¹ñcuchy s¹ ró¿ne
|
return false; //łąńcuchy są różne
|
||||||
}
|
}
|
||||||
*/ std::string
|
*/ std::string
|
||||||
source( szText ),
|
source( szText ),
|
||||||
@@ -172,7 +172,7 @@ bool TMemCell::Compare(char *szTestText, double fTestValue1, double fTestValue2,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// tekst zgodny, porównaæ resztê
|
// tekst zgodny, porównać resztę
|
||||||
return ((!TestFlag(CheckMask, conditional_memval1) || (fValue1 == fTestValue1)) &&
|
return ((!TestFlag(CheckMask, conditional_memval1) || (fValue1 == fTestValue1)) &&
|
||||||
(!TestFlag(CheckMask, conditional_memval2) || (fValue2 == fTestValue2)));
|
(!TestFlag(CheckMask, conditional_memval2) || (fValue2 == fTestValue2)));
|
||||||
};
|
};
|
||||||
@@ -183,7 +183,7 @@ bool TMemCell::Render()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool TMemCell::IsVelocity()
|
bool TMemCell::IsVelocity()
|
||||||
{ // sprawdzenie, czy event odczytu tej komórki ma byæ do skanowania, czy do kolejkowania
|
{ // sprawdzenie, czy event odczytu tej komórki ma być do skanowania, czy do kolejkowania
|
||||||
if (eCommand == cm_SetVelocity)
|
if (eCommand == cm_SetVelocity)
|
||||||
return true;
|
return true;
|
||||||
if (eCommand == cm_ShuntVelocity)
|
if (eCommand == cm_ShuntVelocity)
|
||||||
@@ -196,11 +196,11 @@ void TMemCell::StopCommandSent()
|
|||||||
if (!bCommand)
|
if (!bCommand)
|
||||||
return;
|
return;
|
||||||
bCommand = false;
|
bCommand = false;
|
||||||
if (OnSent) // jeœli jest event
|
if (OnSent) // jeśli jest event
|
||||||
Global::AddToQuery(OnSent, NULL);
|
Global::AddToQuery(OnSent, NULL);
|
||||||
};
|
};
|
||||||
|
|
||||||
void TMemCell::AssignEvents(TEvent *e)
|
void TMemCell::AssignEvents(TEvent *e)
|
||||||
{ // powi¹zanie eventu
|
{ // powiązanie eventu
|
||||||
OnSent = e;
|
OnSent = e;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ class TMemCell
|
|||||||
double fValue1;
|
double fValue1;
|
||||||
double fValue2;
|
double fValue2;
|
||||||
TCommandType eCommand;
|
TCommandType eCommand;
|
||||||
bool bCommand; // czy zawiera komendê dla zatrzymanego AI
|
bool bCommand; // czy zawiera komendę dla zatrzymanego AI
|
||||||
TEvent *OnSent; // event dodawany do kolejki po wys³aniu komendy zatrzymuj¹cej sk³ad
|
TEvent *OnSent; // event dodawany do kolejki po wysłaniu komendy zatrzymującej skład
|
||||||
public:
|
public:
|
||||||
string
|
string
|
||||||
asTrackName; // McZapkie-100302 - zeby nazwe toru na ktory jest Putcommand wysylane pamietac
|
asTrackName; // McZapkie-100302 - zeby nazwe toru na ktory jest Putcommand wysylane pamietac
|
||||||
|
|||||||
948
Model3d.cpp
948
Model3d.cpp
File diff suppressed because it is too large
Load Diff
172
Model3d.h
172
Model3d.h
@@ -29,12 +29,12 @@ class TStringPack
|
|||||||
{
|
{
|
||||||
char *data;
|
char *data;
|
||||||
//+0 - 4 bajty: typ kromki
|
//+0 - 4 bajty: typ kromki
|
||||||
//+4 - 4 bajty: długość łącznie z nagłówkiem
|
//+4 - 4 bajty: długość łącznie z nagłówkiem
|
||||||
//+8 - obszar łańcuchów znakowych, każdy zakończony zerem
|
//+8 - obszar łańcuchów znakowych, każdy zakończony zerem
|
||||||
int *index;
|
int *index;
|
||||||
//+0 - 4 bajty: typ kromki
|
//+0 - 4 bajty: typ kromki
|
||||||
//+4 - 4 bajty: długość łącznie z nagłówkiem
|
//+4 - 4 bajty: długość łącznie z nagłówkiem
|
||||||
//+8 - tabela indeksów
|
//+8 - tabela indeksów
|
||||||
public:
|
public:
|
||||||
char *String(int n);
|
char *String(int n);
|
||||||
char *StringAt(int n)
|
char *StringAt(int n)
|
||||||
@@ -115,14 +115,14 @@ struct THitBoxContainer
|
|||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Ra: tego nie będziemy już używać, bo można wycisnąć więcej
|
/* Ra: tego nie będziemy już używać, bo można wycisnąć więcej
|
||||||
typedef enum
|
typedef enum
|
||||||
{smt_Unknown, //nieznany
|
{smt_Unknown, //nieznany
|
||||||
smt_Mesh, //siatka
|
smt_Mesh, //siatka
|
||||||
smt_Point,
|
smt_Point,
|
||||||
smt_FreeSpotLight, //punkt świetlny
|
smt_FreeSpotLight, //punkt świetlny
|
||||||
smt_Text, //generator tekstu
|
smt_Text, //generator tekstu
|
||||||
smt_Stars //wiele punktów świetlnych
|
smt_Stars //wiele punktów świetlnych
|
||||||
} TSubModelType;
|
} TSubModelType;
|
||||||
*/
|
*/
|
||||||
// Ra: specjalne typy submodeli, poza tym GL_TRIANGLES itp.
|
// Ra: specjalne typy submodeli, poza tym GL_TRIANGLES itp.
|
||||||
@@ -134,74 +134,74 @@ const int TP_TEXT = 259;
|
|||||||
enum TAnimType // rodzaj animacji
|
enum TAnimType // rodzaj animacji
|
||||||
{
|
{
|
||||||
at_None, // brak
|
at_None, // brak
|
||||||
at_Rotate, // obrót względem wektora o kąt
|
at_Rotate, // obrót względem wektora o kąt
|
||||||
at_RotateXYZ, // obrót względem osi o kąty
|
at_RotateXYZ, // obrót względem osi o kąty
|
||||||
at_Translate, // przesunięcie
|
at_Translate, // przesunięcie
|
||||||
at_SecondsJump, // sekundy z przeskokiem
|
at_SecondsJump, // sekundy z przeskokiem
|
||||||
at_MinutesJump, // minuty z przeskokiem
|
at_MinutesJump, // minuty z przeskokiem
|
||||||
at_HoursJump, // godziny z przeskokiem 12h/360°
|
at_HoursJump, // godziny z przeskokiem 12h/360°
|
||||||
at_Hours24Jump, // godziny z przeskokiem 24h/360°
|
at_Hours24Jump, // godziny z przeskokiem 24h/360°
|
||||||
at_Seconds, // sekundy płynnie
|
at_Seconds, // sekundy płynnie
|
||||||
at_Minutes, // minuty płynnie
|
at_Minutes, // minuty płynnie
|
||||||
at_Hours, // godziny płynnie 12h/360°
|
at_Hours, // godziny płynnie 12h/360°
|
||||||
at_Hours24, // godziny płynnie 24h/360°
|
at_Hours24, // godziny płynnie 24h/360°
|
||||||
at_Billboard, // obrót w pionie do kamery
|
at_Billboard, // obrót w pionie do kamery
|
||||||
at_Wind, // ruch pod wpływem wiatru
|
at_Wind, // ruch pod wpływem wiatru
|
||||||
at_Sky, // animacja nieba
|
at_Sky, // animacja nieba
|
||||||
at_IK = 0x100, // odwrotna kinematyka - submodel sterujący (np. staw skokowy)
|
at_IK = 0x100, // odwrotna kinematyka - submodel sterujący (np. staw skokowy)
|
||||||
at_IK11 = 0x101, // odwrotna kinematyka - submodel nadrzędny do sterowango (np. stopa)
|
at_IK11 = 0x101, // odwrotna kinematyka - submodel nadrzędny do sterowango (np. stopa)
|
||||||
at_IK21 = 0x102, // odwrotna kinematyka - submodel nadrzędny do sterowango (np. podudzie)
|
at_IK21 = 0x102, // odwrotna kinematyka - submodel nadrzędny do sterowango (np. podudzie)
|
||||||
at_IK22 = 0x103, // odwrotna kinematyka - submodel nadrzędny do nadrzędnego sterowango (np. udo)
|
at_IK22 = 0x103, // odwrotna kinematyka - submodel nadrzędny do nadrzędnego sterowango (np. udo)
|
||||||
at_Digital = 0x200, // dziesięciocyfrowy licznik mechaniczny (z cylindrami)
|
at_Digital = 0x200, // dziesięciocyfrowy licznik mechaniczny (z cylindrami)
|
||||||
at_DigiClk = 0x201, // zegar cyfrowy jako licznik na dziesięciościanach
|
at_DigiClk = 0x201, // zegar cyfrowy jako licznik na dziesięciościanach
|
||||||
at_Undefined = 0x800000FF // animacja chwilowo nieokreślona
|
at_Undefined = 0x800000FF // animacja chwilowo nieokreślona
|
||||||
};
|
};
|
||||||
|
|
||||||
class TModel3d;
|
class TModel3d;
|
||||||
class TSubModelInfo;
|
class TSubModelInfo;
|
||||||
|
|
||||||
class TSubModel
|
class TSubModel
|
||||||
{ // klasa submodelu - pojedyncza siatka, punkt świetlny albo grupa punktów
|
{ // klasa submodelu - pojedyncza siatka, punkt świetlny albo grupa punktów
|
||||||
// Ra: ta klasa ma mieć wielkość 256 bajtów, aby pokryła się z formatem binarnym
|
// Ra: ta klasa ma mieć wielkość 256 bajtów, aby pokryła się z formatem binarnym
|
||||||
// Ra: nie przestawiać zmiennych, bo wczytują się z pliku binarnego!
|
// Ra: nie przestawiać zmiennych, bo wczytują się z pliku binarnego!
|
||||||
private:
|
private:
|
||||||
TSubModel *Next;
|
TSubModel *Next;
|
||||||
TSubModel *Child;
|
TSubModel *Child;
|
||||||
int eType; // Ra: modele binarne dają więcej możliwości niż mesh złożony z trójkątów
|
int eType; // Ra: modele binarne dają więcej możliwości niż mesh złożony z trójkątów
|
||||||
int iName; // numer łańcucha z nazwą submodelu, albo -1 gdy anonimowy
|
int iName; // numer łańcucha z nazwą submodelu, albo -1 gdy anonimowy
|
||||||
public: // chwilowo
|
public: // chwilowo
|
||||||
TAnimType b_Anim;
|
TAnimType b_Anim;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int iFlags; // flagi informacyjne:
|
int iFlags; // flagi informacyjne:
|
||||||
// bit 0: =1 faza rysowania zależy od wymiennej tekstury 0
|
// bit 0: =1 faza rysowania zależy od wymiennej tekstury 0
|
||||||
// bit 1: =1 faza rysowania zależy od wymiennej tekstury 1
|
// bit 1: =1 faza rysowania zależy od wymiennej tekstury 1
|
||||||
// bit 2: =1 faza rysowania zależy od wymiennej tekstury 2
|
// bit 2: =1 faza rysowania zależy od wymiennej tekstury 2
|
||||||
// bit 3: =1 faza rysowania zależy od wymiennej tekstury 3
|
// bit 3: =1 faza rysowania zależy od wymiennej tekstury 3
|
||||||
// bit 4: =1 rysowany w fazie nieprzezroczystych (stała tekstura albo brak)
|
// bit 4: =1 rysowany w fazie nieprzezroczystych (stała tekstura albo brak)
|
||||||
// bit 5: =1 rysowany w fazie przezroczystych (stała tekstura)
|
// bit 5: =1 rysowany w fazie przezroczystych (stała tekstura)
|
||||||
// bit 7: =1 ta sama tekstura, co poprzedni albo nadrzędny
|
// bit 7: =1 ta sama tekstura, co poprzedni albo nadrzędny
|
||||||
// bit 8: =1 wierzchołki wyświetlane z indeksów
|
// bit 8: =1 wierzchołki wyświetlane z indeksów
|
||||||
// bit 9: =1 wczytano z pliku tekstowego (jest właścicielem tablic)
|
// bit 9: =1 wczytano z pliku tekstowego (jest właścicielem tablic)
|
||||||
// bit 13: =1 wystarczy przesunięcie zamiast mnożenia macierzy (trzy jedynki)
|
// bit 13: =1 wystarczy przesunięcie zamiast mnożenia macierzy (trzy jedynki)
|
||||||
// bit 14: =1 wymagane przechowanie macierzy (animacje)
|
// bit 14: =1 wymagane przechowanie macierzy (animacje)
|
||||||
// bit 15: =1 wymagane przechowanie macierzy (transform niejedynkowy)
|
// bit 15: =1 wymagane przechowanie macierzy (transform niejedynkowy)
|
||||||
union
|
union
|
||||||
{ // transform, nie każdy submodel musi mieć
|
{ // transform, nie każdy submodel musi mieć
|
||||||
float4x4 *fMatrix; // pojedyncza precyzja wystarcza
|
float4x4 *fMatrix; // pojedyncza precyzja wystarcza
|
||||||
// matrix4x4 *dMatrix; //do testu macierz podwójnej precyzji
|
// matrix4x4 *dMatrix; //do testu macierz podwójnej precyzji
|
||||||
int iMatrix; // w pliku binarnym jest numer matrycy
|
int iMatrix; // w pliku binarnym jest numer matrycy
|
||||||
};
|
};
|
||||||
int iNumVerts; // ilość wierzchołków (1 dla FreeSpotLight)
|
int iNumVerts; // ilość wierzchołków (1 dla FreeSpotLight)
|
||||||
int iVboPtr; // początek na liście wierzchołków albo indeksów
|
int iVboPtr; // początek na liście wierzchołków albo indeksów
|
||||||
int iTexture; // numer nazwy tekstury, -1 wymienna, 0 brak
|
int iTexture; // numer nazwy tekstury, -1 wymienna, 0 brak
|
||||||
float fVisible; // próg jasności światła do załączenia submodelu
|
float fVisible; // próg jasności światła do załączenia submodelu
|
||||||
float fLight; // próg jasności światła do zadziałania selfillum
|
float fLight; // próg jasności światła do zadziałania selfillum
|
||||||
float f4Ambient[4];
|
float f4Ambient[4];
|
||||||
float f4Diffuse[4]; // float ze względu na glMaterialfv()
|
float f4Diffuse[4]; // float ze względu na glMaterialfv()
|
||||||
float f4Specular[4];
|
float f4Specular[4];
|
||||||
float f4Emision[4];
|
float f4Emision[4];
|
||||||
float fWireSize; // nie używane, ale wczytywane
|
float fWireSize; // nie używane, ale wczytywane
|
||||||
float fSquareMaxDist;
|
float fSquareMaxDist;
|
||||||
float fSquareMinDist;
|
float fSquareMinDist;
|
||||||
// McZapkie-050702: parametry dla swiatla:
|
// McZapkie-050702: parametry dla swiatla:
|
||||||
@@ -210,36 +210,36 @@ class TSubModel
|
|||||||
bool bUseNearAtten; // te 3 zmienne okreslaja rysowanie aureoli wokol zrodla swiatla
|
bool bUseNearAtten; // te 3 zmienne okreslaja rysowanie aureoli wokol zrodla swiatla
|
||||||
int iFarAttenDecay; // ta zmienna okresla typ zaniku natezenia swiatla (0:brak, 1,2: potega 1/R)
|
int iFarAttenDecay; // ta zmienna okresla typ zaniku natezenia swiatla (0:brak, 1,2: potega 1/R)
|
||||||
float fFarDecayRadius; // normalizacja j.w.
|
float fFarDecayRadius; // normalizacja j.w.
|
||||||
float fCosFalloffAngle; // cosinus kąta stożka pod którym widać światło
|
float fCosFalloffAngle; // cosinus kąta stożka pod którym widać światło
|
||||||
float fCosHotspotAngle; // cosinus kąta stożka pod którym widać aureolę i zwiększone natężenie
|
float fCosHotspotAngle; // cosinus kąta stożka pod którym widać aureolę i zwiększone natężenie
|
||||||
// światła
|
// światła
|
||||||
float fCosViewAngle; // cos kata pod jakim sie teraz patrzy
|
float fCosViewAngle; // cos kata pod jakim sie teraz patrzy
|
||||||
// Ra: dalej są zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy
|
// Ra: dalej są zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy
|
||||||
int TextureID; // numer tekstury, -1 wymienna, 0 brak
|
int TextureID; // numer tekstury, -1 wymienna, 0 brak
|
||||||
bool bWire; // nie używane, ale wczytywane
|
bool bWire; // nie używane, ale wczytywane
|
||||||
// short TexAlpha; //Ra: nie używane już
|
// short TexAlpha; //Ra: nie używane już
|
||||||
GLuint uiDisplayList; // roboczy numer listy wyświetlania
|
GLuint uiDisplayList; // roboczy numer listy wyświetlania
|
||||||
float Opacity; // nie używane, ale wczytywane
|
float Opacity; // nie używane, ale wczytywane
|
||||||
// ABu: te same zmienne, ale zdublowane dla Render i RenderAlpha,
|
// ABu: te same zmienne, ale zdublowane dla Render i RenderAlpha,
|
||||||
// bo sie chrzanilo przemieszczanie obiektow.
|
// bo sie chrzanilo przemieszczanie obiektow.
|
||||||
// Ra: już się nie chrzani
|
// Ra: już się nie chrzani
|
||||||
float f_Angle;
|
float f_Angle;
|
||||||
float3 v_RotateAxis;
|
float3 v_RotateAxis;
|
||||||
float3 v_Angles;
|
float3 v_Angles;
|
||||||
|
|
||||||
public: // chwilowo
|
public: // chwilowo
|
||||||
float3 v_TransVector;
|
float3 v_TransVector;
|
||||||
float8 *Vertices; // roboczy wskaźnik - wczytanie T3D do VBO
|
float8 *Vertices; // roboczy wskaźnik - wczytanie T3D do VBO
|
||||||
int iAnimOwner; // roboczy numer egzemplarza, który ustawił animację
|
int iAnimOwner; // roboczy numer egzemplarza, który ustawił animację
|
||||||
TAnimType b_aAnim; // kody animacji oddzielnie, bo zerowane
|
TAnimType b_aAnim; // kody animacji oddzielnie, bo zerowane
|
||||||
public:
|
public:
|
||||||
float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer)
|
float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer)
|
||||||
char space[8]; // wolne miejsce na przyszłe zmienne (zmniejszyć w miarę potrzeby)
|
char space[8]; // wolne miejsce na przyszłe zmienne (zmniejszyć w miarę potrzeby)
|
||||||
public:
|
public:
|
||||||
TSubModel **
|
TSubModel **
|
||||||
smLetter; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D)
|
smLetter; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D)
|
||||||
TSubModel *Parent; // nadrzędny, np. do wymnażania macierzy
|
TSubModel *Parent; // nadrzędny, np. do wymnażania macierzy
|
||||||
int iVisible; // roboczy stan widoczności
|
int iVisible; // roboczy stan widoczności
|
||||||
// AnsiString asTexture; //robocza nazwa tekstury do zapisania w pliku binarnym
|
// AnsiString asTexture; //robocza nazwa tekstury do zapisania w pliku binarnym
|
||||||
// AnsiString asName; //robocza nazwa
|
// AnsiString asName; //robocza nazwa
|
||||||
char *pTexture; // robocza nazwa tekstury do zapisania w pliku binarnym
|
char *pTexture; // robocza nazwa tekstury do zapisania w pliku binarnym
|
||||||
@@ -251,12 +251,12 @@ class TSubModel
|
|||||||
void RaAnimation(TAnimType a);
|
void RaAnimation(TAnimType a);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static int iInstance; // identyfikator egzemplarza, który aktualnie renderuje model
|
static int iInstance; // identyfikator egzemplarza, który aktualnie renderuje model
|
||||||
static GLuint *ReplacableSkinId;
|
static GLuint *ReplacableSkinId;
|
||||||
static int iAlpha; // maska bitowa dla danego przebiegu
|
static int iAlpha; // maska bitowa dla danego przebiegu
|
||||||
static double fSquareDist;
|
static double fSquareDist;
|
||||||
static TModel3d *pRoot;
|
static TModel3d *pRoot;
|
||||||
static std::string *pasText; // tekst dla wyświetlacza (!!!! do przemyślenia)
|
static std::string *pasText; // tekst dla wyświetlacza (!!!! do przemyślenia)
|
||||||
TSubModel();
|
TSubModel();
|
||||||
~TSubModel();
|
~TSubModel();
|
||||||
void FirstInit();
|
void FirstInit();
|
||||||
@@ -348,18 +348,18 @@ class TSubModel
|
|||||||
class TSubModelInfo
|
class TSubModelInfo
|
||||||
{ // klasa z informacjami o submodelach, do tworzenia pliku binarnego
|
{ // klasa z informacjami o submodelach, do tworzenia pliku binarnego
|
||||||
public:
|
public:
|
||||||
TSubModel *pSubModel; // wskaźnik na submodel
|
TSubModel *pSubModel; // wskaźnik na submodel
|
||||||
int iTransform; // numer transformu (-1 gdy brak)
|
int iTransform; // numer transformu (-1 gdy brak)
|
||||||
int iName; // numer nazwy
|
int iName; // numer nazwy
|
||||||
int iTexture; // numer tekstury
|
int iTexture; // numer tekstury
|
||||||
int iNameLen; // długość nazwy
|
int iNameLen; // długość nazwy
|
||||||
int iTextureLen; // długość tekstury
|
int iTextureLen; // długość tekstury
|
||||||
int iNext, iChild; // numer następnego i potomnego
|
int iNext, iChild; // numer następnego i potomnego
|
||||||
static int iTotalTransforms; // ilość transformów
|
static int iTotalTransforms; // ilość transformów
|
||||||
static int iTotalNames; // ilość nazw
|
static int iTotalNames; // ilość nazw
|
||||||
static int iTotalTextures; // ilość tekstur
|
static int iTotalTextures; // ilość tekstur
|
||||||
static int iCurrent; // aktualny obiekt
|
static int iCurrent; // aktualny obiekt
|
||||||
static TSubModelInfo *pTable; // tabele obiektów pomocniczych
|
static TSubModelInfo *pTable; // tabele obiektów pomocniczych
|
||||||
TSubModelInfo()
|
TSubModelInfo()
|
||||||
{
|
{
|
||||||
pSubModel = NULL;
|
pSubModel = NULL;
|
||||||
@@ -368,8 +368,8 @@ class TSubModelInfo
|
|||||||
}
|
}
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
pTable = this; // ustawienie wskaźnika tabeli obiektów
|
pTable = this; // ustawienie wskaźnika tabeli obiektów
|
||||||
iTotalTransforms = iTotalNames = iTotalTextures = iCurrent = 0; // zerowanie liczników
|
iTotalTransforms = iTotalNames = iTotalTextures = iCurrent = 0; // zerowanie liczników
|
||||||
}
|
}
|
||||||
~TSubModelInfo(){};
|
~TSubModelInfo(){};
|
||||||
};
|
};
|
||||||
@@ -378,24 +378,24 @@ class TModel3d : public CMesh
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
// TMaterial *Materials;
|
// TMaterial *Materials;
|
||||||
// int MaterialsCount; //Ra: nie używane
|
// int MaterialsCount; //Ra: nie używane
|
||||||
// bool TractionPart; //Ra: nie używane
|
// bool TractionPart; //Ra: nie używane
|
||||||
TSubModel *Root; // drzewo submodeli
|
TSubModel *Root; // drzewo submodeli
|
||||||
int iFlags; // Ra: czy submodele mają przezroczyste tekstury
|
int iFlags; // Ra: czy submodele mają przezroczyste tekstury
|
||||||
public: // Ra: tymczasowo
|
public: // Ra: tymczasowo
|
||||||
int iNumVerts; // ilość wierzchołków (gdy nie ma VBO, to m_nVertexCount=0)
|
int iNumVerts; // ilość wierzchołków (gdy nie ma VBO, to m_nVertexCount=0)
|
||||||
private:
|
private:
|
||||||
TStringPack Textures; // nazwy tekstur
|
TStringPack Textures; // nazwy tekstur
|
||||||
TStringPack Names; // nazwy submodeli
|
TStringPack Names; // nazwy submodeli
|
||||||
int *iModel; // zawartość pliku binarnego
|
int *iModel; // zawartość pliku binarnego
|
||||||
int iSubModelsCount; // Ra: używane do tworzenia binarnych
|
int iSubModelsCount; // Ra: używane do tworzenia binarnych
|
||||||
std::string asBinary; // nazwa pod którą zapisać model binarny
|
std::string asBinary; // nazwa pod którą zapisać model binarny
|
||||||
public:
|
public:
|
||||||
inline TSubModel * GetSMRoot()
|
inline TSubModel * GetSMRoot()
|
||||||
{
|
{
|
||||||
return (Root);
|
return (Root);
|
||||||
};
|
};
|
||||||
// double Radius; //Ra: nie używane
|
// double Radius; //Ra: nie używane
|
||||||
TModel3d();
|
TModel3d();
|
||||||
TModel3d(char *FileName);
|
TModel3d(char *FileName);
|
||||||
~TModel3d();
|
~TModel3d();
|
||||||
@@ -415,7 +415,7 @@ class TModel3d : public CMesh
|
|||||||
void RaRender(double fSquareDistance, GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
|
void RaRender(double fSquareDistance, GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
|
||||||
void RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL,
|
void RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL,
|
||||||
int iAlpha = 0x30300030);
|
int iAlpha = 0x30300030);
|
||||||
// jeden kąt obrotu
|
// jeden kąt obrotu
|
||||||
void Render(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
|
void Render(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
|
||||||
int iAlpha = 0x30300030);
|
int iAlpha = 0x30300030);
|
||||||
void RenderAlpha(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
|
void RenderAlpha(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
|
||||||
@@ -424,7 +424,7 @@ class TModel3d : public CMesh
|
|||||||
int iAlpha = 0x30300030);
|
int iAlpha = 0x30300030);
|
||||||
void RaRenderAlpha(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
|
void RaRenderAlpha(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
|
||||||
int iAlpha = 0x30300030);
|
int iAlpha = 0x30300030);
|
||||||
// trzy kąty obrotu
|
// trzy kąty obrotu
|
||||||
void Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL,
|
void Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL,
|
||||||
int iAlpha = 0x30300030);
|
int iAlpha = 0x30300030);
|
||||||
void RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL,
|
void RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL,
|
||||||
|
|||||||
114
Names.cpp
114
Names.cpp
@@ -13,68 +13,68 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Moduł zarządzający plikami oraz wyszukiwaniem obiektów wg nazw.
|
Moduł zarządzający plikami oraz wyszukiwaniem obiektów wg nazw.
|
||||||
1. Ma przydzielony z góry (EU07.INI) obszar pamięci (rzędu 16MB).
|
1. Ma przydzielony z góry (EU07.INI) obszar pamięci (rzędu 16MB).
|
||||||
2. W przypadku przepełnienia dostępnej pamięci wystąpi błąd wczytywania.
|
2. W przypadku przepełnienia dostępnej pamięci wystąpi błąd wczytywania.
|
||||||
3. Obszar ten będzie zużywany na rekordy obiektów oraz ciągi tekstowe z nazwami.
|
3. Obszar ten będzie zużywany na rekordy obiektów oraz ciągi tekstowe z nazwami.
|
||||||
4. Rekordy będą sortowane w ramach typu (tekstury, dźwięki, modele, node, eventy).
|
4. Rekordy będą sortowane w ramach typu (tekstury, dźwięki, modele, node, eventy).
|
||||||
5. Pierwszy etap wyszukiwania to 5 bitów z pierwszego bajtu i 3 z drugiego (256).
|
5. Pierwszy etap wyszukiwania to 5 bitów z pierwszego bajtu i 3 z drugiego (256).
|
||||||
6. Dla plików istnieje możliwość wczytania ich w innym terminie.
|
6. Dla plików istnieje możliwość wczytania ich w innym terminie.
|
||||||
7. Możliwość wczytania plików w oddzielnym watku (np. tekstur).
|
7. Możliwość wczytania plików w oddzielnym watku (np. tekstur).
|
||||||
|
|
||||||
Obsługiwane pliki:
|
Obsługiwane pliki:
|
||||||
1. Tekstury, można wczytywać później, rekord przechowuje numer podany przez kartę graficzną.
|
1. Tekstury, można wczytywać później, rekord przechowuje numer podany przez kartę graficzną.
|
||||||
2. Dźwięki, można wczytać później.
|
2. Dźwięki, można wczytać później.
|
||||||
3. Modele, można wczytać później o ile nie mają animacji eventami i nie dotyczą pojazdów.
|
3. Modele, można wczytać później o ile nie mają animacji eventami i nie dotyczą pojazdów.
|
||||||
|
|
||||||
Obiekty sortowane wg nazw, można dodawać i usuwać komórki scenerii:
|
Obiekty sortowane wg nazw, można dodawać i usuwać komórki scenerii:
|
||||||
4. Tory, drogi, rzeki - wyszukiwanie w celu sprawdzenia zajetości.
|
4. Tory, drogi, rzeki - wyszukiwanie w celu sprawdzenia zajetości.
|
||||||
5. Eventy - wyszukiwane przy zewnętrznym wywołaniu oraz podczas wczytywania.
|
5. Eventy - wyszukiwane przy zewnętrznym wywołaniu oraz podczas wczytywania.
|
||||||
6. Pojazdy - wyszukiwane w celu wysyłania komend.
|
6. Pojazdy - wyszukiwane w celu wysyłania komend.
|
||||||
7. Egzemplarze modeli animowanych - wyszukiwanie w celu połączenia z animacjami.
|
7. Egzemplarze modeli animowanych - wyszukiwanie w celu połączenia z animacjami.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ItemRecord::TreeAdd(ItemRecord *r, int c)
|
void ItemRecord::TreeAdd(ItemRecord *r, int c)
|
||||||
{ // dodanie rekordu do drzewa - ustalenie w której gałęzi
|
{ // dodanie rekordu do drzewa - ustalenie w której gałęzi
|
||||||
// zapisać w (iFlags) ile znaków jest zgodnych z nadrzędnym, żeby nie sprawdzać wszystkich od
|
// zapisać w (iFlags) ile znaków jest zgodnych z nadrzędnym, żeby nie sprawdzać wszystkich od
|
||||||
// zera
|
// zera
|
||||||
if ((cName[c] && r->cName[c]) ? cName[c] == r->cName[c] : false)
|
if ((cName[c] && r->cName[c]) ? cName[c] == r->cName[c] : false)
|
||||||
TreeAdd(r, c + 1); // ustawić wg kolejnego znaku, chyba że zero
|
TreeAdd(r, c + 1); // ustawić wg kolejnego znaku, chyba że zero
|
||||||
else if ((unsigned char)(cName[c]) < (unsigned char)(r->cName[c]))
|
else if ((unsigned char)(cName[c]) < (unsigned char)(r->cName[c]))
|
||||||
{ // zero jest najmniejsze - doczepiamy jako (rNext)
|
{ // zero jest najmniejsze - doczepiamy jako (rNext)
|
||||||
if (!rNext)
|
if (!rNext)
|
||||||
rNext = r;
|
rNext = r;
|
||||||
else
|
else
|
||||||
rNext->TreeAdd(r, 0); // doczepić do tej gałęzi
|
rNext->TreeAdd(r, 0); // doczepić do tej gałęzi
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!rPrev)
|
if (!rPrev)
|
||||||
rPrev = r;
|
rPrev = r;
|
||||||
else
|
else
|
||||||
rPrev->TreeAdd(r, 0); // doczepić do tej gałęzi
|
rPrev->TreeAdd(r, 0); // doczepić do tej gałęzi
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void ItemRecord::ListGet(ItemRecord *r, int *&n)
|
void ItemRecord::ListGet(ItemRecord *r, int *&n)
|
||||||
{ // rekurencyjne wypełnianie posortowanej listy na podstawie drzewa
|
{ // rekurencyjne wypełnianie posortowanej listy na podstawie drzewa
|
||||||
if (rPrev)
|
if (rPrev)
|
||||||
rPrev->ListGet(r, n); // dodanie wszystkich wcześniejszych
|
rPrev->ListGet(r, n); // dodanie wszystkich wcześniejszych
|
||||||
*n++ = this - r; // dodanie swojego indeksu do tabeli
|
*n++ = this - r; // dodanie swojego indeksu do tabeli
|
||||||
if (rNext)
|
if (rNext)
|
||||||
rNext->ListGet(r, n); // dodanie wszystkich późniejszych
|
rNext->ListGet(r, n); // dodanie wszystkich późniejszych
|
||||||
};
|
};
|
||||||
|
|
||||||
void * ItemRecord::TreeFind(const char *n)
|
void * ItemRecord::TreeFind(const char *n)
|
||||||
{ // wyszukanie ciągu (n)
|
{ // wyszukanie ciągu (n)
|
||||||
ItemRecord *r = TreeFindRecord(n);
|
ItemRecord *r = TreeFindRecord(n);
|
||||||
return r ? r->pData : NULL;
|
return r ? r->pData : NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
ItemRecord * ItemRecord::TreeFindRecord(const char *n)
|
ItemRecord * ItemRecord::TreeFindRecord(const char *n)
|
||||||
{ // wyszukanie ciągu (n)
|
{ // wyszukanie ciągu (n)
|
||||||
ItemRecord *r = this; //żeby nie robić rekurencji
|
ItemRecord *r = this; //żeby nie robić rekurencji
|
||||||
int i = 0;
|
int i = 0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -82,16 +82,16 @@ ItemRecord * ItemRecord::TreeFindRecord(const char *n)
|
|||||||
if (!r->cName[i])
|
if (!r->cName[i])
|
||||||
return r; // znaleziony
|
return r; // znaleziony
|
||||||
if (n[i] == r->cName[i])
|
if (n[i] == r->cName[i])
|
||||||
++i; // porównać kolejny znak
|
++i; // porównać kolejny znak
|
||||||
else if ((unsigned char)(n[i]) < (unsigned char)(r->cName[i]))
|
else if ((unsigned char)(n[i]) < (unsigned char)(r->cName[i]))
|
||||||
{
|
{
|
||||||
i = 0; // porównywać od nowa
|
i = 0; // porównywać od nowa
|
||||||
r = r->rPrev; // wcześniejsza gałąź drzewa
|
r = r->rPrev; // wcześniejsza gałąź drzewa
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
i = 0; // porównywać od nowa
|
i = 0; // porównywać od nowa
|
||||||
r = r->rNext; // późniejsza gałąź drzewa
|
r = r->rNext; // późniejsza gałąź drzewa
|
||||||
}
|
}
|
||||||
} while (r);
|
} while (r);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -101,7 +101,7 @@ TNames::TNames()
|
|||||||
{ // tworzenie bufora
|
{ // tworzenie bufora
|
||||||
iSize = 16 * 1024 * 1024; // rozmiar bufora w bajtach
|
iSize = 16 * 1024 * 1024; // rozmiar bufora w bajtach
|
||||||
cBuffer = new char[iSize];
|
cBuffer = new char[iSize];
|
||||||
ZeroMemory(cBuffer, iSize); // nie trzymać jakiś starych śmieci
|
ZeroMemory(cBuffer, iSize); // nie trzymać jakiś starych śmieci
|
||||||
rRecords = (ItemRecord *)cBuffer;
|
rRecords = (ItemRecord *)cBuffer;
|
||||||
cLast = cBuffer + iSize; // bajt za buforem
|
cLast = cBuffer + iSize; // bajt za buforem
|
||||||
iLast = -1;
|
iLast = -1;
|
||||||
@@ -115,19 +115,19 @@ TNames::~TNames() {
|
|||||||
|
|
||||||
int TNames::Add(int t, const char *n)
|
int TNames::Add(int t, const char *n)
|
||||||
{ // dodanie obiektu typu (t) o nazwie (n)
|
{ // dodanie obiektu typu (t) o nazwie (n)
|
||||||
int len = strlen(n) + 1; // ze znacznikiem końca
|
int len = strlen(n) + 1; // ze znacznikiem końca
|
||||||
cLast -= len; // rezerwacja miejsca
|
cLast -= len; // rezerwacja miejsca
|
||||||
memcpy(cLast, n, len); // przekopiowanie tekstu do bufora
|
memcpy(cLast, n, len); // przekopiowanie tekstu do bufora
|
||||||
// cLast[len-1]='\0';
|
// cLast[len-1]='\0';
|
||||||
rRecords[++iLast].cName = cLast; // połączenie nazwy z rekordem
|
rRecords[++iLast].cName = cLast; // połączenie nazwy z rekordem
|
||||||
rRecords[iLast].iFlags = t;
|
rRecords[iLast].iFlags = t;
|
||||||
if (!rTypes[t])
|
if (!rTypes[t])
|
||||||
rTypes[t] = rRecords + iLast; // korzeń drzewa, bo nie było wcześniej
|
rTypes[t] = rRecords + iLast; // korzeń drzewa, bo nie było wcześniej
|
||||||
else
|
else
|
||||||
rTypes[t]->TreeAdd(rRecords + iLast, 0); // doczepienie jako gałąź
|
rTypes[t]->TreeAdd(rRecords + iLast, 0); // doczepienie jako gałąź
|
||||||
// rTypes[t]=Sort(t); //sortowanie uruchamiać ręcznie
|
// rTypes[t]=Sort(t); //sortowanie uruchamiać ręcznie
|
||||||
if ((iLast & 0x3F) == 0) // nie za często, bo sortowania zajmą więcej czasu niż wyszukiwania
|
if ((iLast & 0x3F) == 0) // nie za często, bo sortowania zajmą więcej czasu niż wyszukiwania
|
||||||
Sort(t); // optymalizacja drzewa co jakiś czas
|
Sort(t); // optymalizacja drzewa co jakiś czas
|
||||||
return iLast;
|
return iLast;
|
||||||
}
|
}
|
||||||
int TNames::Add(int t, const char *n, void *d)
|
int TNames::Add(int t, const char *n, void *d)
|
||||||
@@ -138,41 +138,41 @@ int TNames::Add(int t, const char *n, void *d)
|
|||||||
};
|
};
|
||||||
|
|
||||||
bool TNames::Update(int t, const char *n, void *d)
|
bool TNames::Update(int t, const char *n, void *d)
|
||||||
{ // dodanie jeśli nie ma, wymiana (d), gdy jest
|
{ // dodanie jeśli nie ma, wymiana (d), gdy jest
|
||||||
ItemRecord *r = FindRecord(t, n); // najpierw sprawdzić, czy już jest
|
ItemRecord *r = FindRecord(t, n); // najpierw sprawdzić, czy już jest
|
||||||
if (r)
|
if (r)
|
||||||
{ // przy zdublowaniu nazwy podmieniać w drzewku na późniejszy
|
{ // przy zdublowaniu nazwy podmieniać w drzewku na późniejszy
|
||||||
r->pData = d;
|
r->pData = d;
|
||||||
return true; // duplikat
|
return true; // duplikat
|
||||||
}
|
}
|
||||||
// Add(t,n,d); //nazwa unikalna
|
// Add(t,n,d); //nazwa unikalna
|
||||||
return false; // został dodany nowy
|
return false; // został dodany nowy
|
||||||
};
|
};
|
||||||
|
|
||||||
ItemRecord * TNames::TreeSet(int *n, int d, int u)
|
ItemRecord * TNames::TreeSet(int *n, int d, int u)
|
||||||
{ // rekurencyjne wypełnianie drzewa pozycjami od (d) do (u)
|
{ // rekurencyjne wypełnianie drzewa pozycjami od (d) do (u)
|
||||||
if (d == u)
|
if (d == u)
|
||||||
{
|
{
|
||||||
rRecords[n[d]].rPrev = rRecords[n[d]].rNext = NULL;
|
rRecords[n[d]].rPrev = rRecords[n[d]].rNext = NULL;
|
||||||
return rRecords + n[d]; // tej gałęzi nie ma
|
return rRecords + n[d]; // tej gałęzi nie ma
|
||||||
}
|
}
|
||||||
else if (d > u)
|
else if (d > u)
|
||||||
return NULL;
|
return NULL;
|
||||||
int p = (u + d) >> 1; // połowa
|
int p = (u + d) >> 1; // połowa
|
||||||
rRecords[n[p]].rPrev = TreeSet(n, d, p - 1); // zapisanie wcześniejszych gałęzi
|
rRecords[n[p]].rPrev = TreeSet(n, d, p - 1); // zapisanie wcześniejszych gałęzi
|
||||||
rRecords[n[p]].rNext = TreeSet(n, p + 1, u); // zapisanie późniejszych gałęzi
|
rRecords[n[p]].rNext = TreeSet(n, p + 1, u); // zapisanie późniejszych gałęzi
|
||||||
return rRecords + n[p];
|
return rRecords + n[p];
|
||||||
};
|
};
|
||||||
|
|
||||||
void TNames::Sort(int t)
|
void TNames::Sort(int t)
|
||||||
{ // przebudowa drzewa typu (t), zwraca wierzchołek drzewa
|
{ // przebudowa drzewa typu (t), zwraca wierzchołek drzewa
|
||||||
if (iLast < 3)
|
if (iLast < 3)
|
||||||
return; // jak jest mało, to nie ma sensu sortować
|
return; // jak jest mało, to nie ma sensu sortować
|
||||||
if (rTypes[t]) // jeśli jest jakiś rekord danego typu
|
if (rTypes[t]) // jeśli jest jakiś rekord danego typu
|
||||||
{
|
{
|
||||||
int *r = new int[iLast + 1]; // robocza tablica indeksów - numery posortowanych rekordów
|
int *r = new int[iLast + 1]; // robocza tablica indeksów - numery posortowanych rekordów
|
||||||
int *q = r; // wskaźnik roboczy, przekazywany przez referencję
|
int *q = r; // wskaźnik roboczy, przekazywany przez referencję
|
||||||
rTypes[t]->ListGet(rRecords, q); // drzewo jest już posortowane - zamienić je na listę
|
rTypes[t]->ListGet(rRecords, q); // drzewo jest już posortowane - zamienić je na listę
|
||||||
rTypes[t] = TreeSet(r, 0, (q - r) - 1);
|
rTypes[t] = TreeSet(r, 0, (q - r) - 1);
|
||||||
delete[] r;
|
delete[] r;
|
||||||
}
|
}
|
||||||
@@ -180,6 +180,6 @@ void TNames::Sort(int t)
|
|||||||
};
|
};
|
||||||
|
|
||||||
ItemRecord * TNames::FindRecord(const int t, const char *n)
|
ItemRecord * TNames::FindRecord(const int t, const char *n)
|
||||||
{ // poszukiwanie rekordu w celu np. zmiany wskaźnika
|
{ // poszukiwanie rekordu w celu np. zmiany wskaźnika
|
||||||
return rTypes[t] ? rTypes[t]->TreeFindRecord(n) : NULL;
|
return rTypes[t] ? rTypes[t]->TreeFindRecord(n) : NULL;
|
||||||
};
|
};
|
||||||
|
|||||||
22
Names.h
22
Names.h
@@ -11,15 +11,15 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#define NamesH
|
#define NamesH
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
class ItemRecord
|
class ItemRecord
|
||||||
{ // rekord opisuj¹cy obiekt; raz utworzony nie przemieszcza siê
|
{ // rekord opisujący obiekt; raz utworzony nie przemieszcza się
|
||||||
// rozmiar rekordu mo¿na zmieniæ w razie potrzeby
|
// rozmiar rekordu można zmienić w razie potrzeby
|
||||||
public:
|
public:
|
||||||
char *cName; // wskaŸnik do nazwy umieszczonej w buforze
|
char *cName; // wskaźnik do nazwy umieszczonej w buforze
|
||||||
int iFlags; // flagi bitowe
|
int iFlags; // flagi bitowe
|
||||||
ItemRecord *rPrev, *rNext; // posortowane drzewo (przebudowywane w razie potrzeby)
|
ItemRecord *rPrev, *rNext; // posortowane drzewo (przebudowywane w razie potrzeby)
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
void *pData; // wskaŸnik do obiektu
|
void *pData; // wskaźnik do obiektu
|
||||||
int iData; // albo numer obiektu (tekstury)
|
int iData; // albo numer obiektu (tekstury)
|
||||||
unsigned int uData;
|
unsigned int uData;
|
||||||
};
|
};
|
||||||
@@ -42,18 +42,18 @@ class TNames
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int iSize; // rozmiar bufora
|
int iSize; // rozmiar bufora
|
||||||
char *cBuffer; // bufor dla rekordów (na pocz¹tku) i nazw (na koñcu)
|
char *cBuffer; // bufor dla rekordów (na początku) i nazw (na końcu)
|
||||||
ItemRecord *rRecords; // rekordy na pocz¹tku bufora
|
ItemRecord *rRecords; // rekordy na początku bufora
|
||||||
char *cLast; // ostatni u¿yty bajt na nazwy
|
char *cLast; // ostatni użyty bajt na nazwy
|
||||||
ItemRecord *rTypes[20]; // ro¿ne typy obiektów (pocz¹tek drzewa)
|
ItemRecord *rTypes[20]; // rożne typy obiektów (początek drzewa)
|
||||||
int iLast; // ostatnio u¿yty rekord
|
int iLast; // ostatnio użyty rekord
|
||||||
public:
|
public:
|
||||||
TNames();
|
TNames();
|
||||||
~TNames();
|
~TNames();
|
||||||
int Add(int t, const char *n); // dodanie obiektu typu (t)
|
int Add(int t, const char *n); // dodanie obiektu typu (t)
|
||||||
int Add(int t, const char *n, void *d); // dodanie obiektu z wskaŸnikiem
|
int Add(int t, const char *n, void *d); // dodanie obiektu z wskaźnikiem
|
||||||
int Add(int t, const char *n, int d); // dodanie obiektu z numerem
|
int Add(int t, const char *n, int d); // dodanie obiektu z numerem
|
||||||
bool Update(int t, const char *n, void *d); // dodanie jeœli nie ma, wymiana (d), gdy jest
|
bool Update(int t, const char *n, void *d); // dodanie jeśli nie ma, wymiana (d), gdy jest
|
||||||
void TreeSet();
|
void TreeSet();
|
||||||
ItemRecord * TreeSet(int *n, int d, int u);
|
ItemRecord * TreeSet(int *n, int d, int u);
|
||||||
void Sort(int t); // przebudowa drzewa typu (t)
|
void Sort(int t); // przebudowa drzewa typu (t)
|
||||||
|
|||||||
@@ -32,9 +32,9 @@ TRealSound::TRealSound()
|
|||||||
vSoundPosition.y = 0;
|
vSoundPosition.y = 0;
|
||||||
vSoundPosition.z = 0;
|
vSoundPosition.z = 0;
|
||||||
fDistance = fPreviousDistance = 0.0;
|
fDistance = fPreviousDistance = 0.0;
|
||||||
fFrequency = 22050.0; // częstotliwość samplowania pliku
|
fFrequency = 22050.0; // częstotliwość samplowania pliku
|
||||||
iDoppler = 0; // normlanie jest załączony; !=0 - modyfikacje
|
iDoppler = 0; // normlanie jest załączony; !=0 - modyfikacje
|
||||||
bLoopPlay = false; // dźwięk wyłączony
|
bLoopPlay = false; // dźwięk wyłączony
|
||||||
}
|
}
|
||||||
|
|
||||||
TRealSound::TRealSound(std::string const &SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic,
|
TRealSound::TRealSound(std::string const &SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic,
|
||||||
@@ -55,14 +55,14 @@ void TRealSound::Free()
|
|||||||
void TRealSound::Init(std::string const &SoundName, double DistanceAttenuation, double X, double Y, double Z,
|
void TRealSound::Init(std::string const &SoundName, double DistanceAttenuation, double X, double Y, double Z,
|
||||||
bool Dynamic, bool freqmod, double rmin)
|
bool Dynamic, bool freqmod, double rmin)
|
||||||
{
|
{
|
||||||
// Nazwa=SoundName; //to tak raczej nie zadziała, (SoundName) jest tymczasowe
|
// Nazwa=SoundName; //to tak raczej nie zadziała, (SoundName) jest tymczasowe
|
||||||
pSound = TSoundsManager::GetFromName(SoundName.c_str(), Dynamic, &fFrequency);
|
pSound = TSoundsManager::GetFromName(SoundName.c_str(), Dynamic, &fFrequency);
|
||||||
if (pSound)
|
if (pSound)
|
||||||
{
|
{
|
||||||
if (freqmod)
|
if (freqmod)
|
||||||
if (fFrequency != 22050.0)
|
if (fFrequency != 22050.0)
|
||||||
{ // dla modulowanych nie może być zmiany mnożnika, bo częstotliwość w nagłówku byłą
|
{ // dla modulowanych nie może być zmiany mnożnika, bo częstotliwość w nagłówku byłą
|
||||||
// ignorowana, a mogła być inna niż 22050
|
// ignorowana, a mogła być inna niż 22050
|
||||||
fFrequency = 22050.0;
|
fFrequency = 22050.0;
|
||||||
ErrorLog("Bad sound: " + std::string(SoundName) +
|
ErrorLog("Bad sound: " + std::string(SoundName) +
|
||||||
", as modulated, should have 22.05kHz in header");
|
", as modulated, should have 22.05kHz in header");
|
||||||
@@ -71,7 +71,7 @@ void TRealSound::Init(std::string const &SoundName, double DistanceAttenuation,
|
|||||||
pSound->SetVolume(DSBVOLUME_MIN);
|
pSound->SetVolume(DSBVOLUME_MIN);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // nie ma dźwięku, to jest wysyp
|
{ // nie ma dźwięku, to jest wysyp
|
||||||
AM = 0;
|
AM = 0;
|
||||||
ErrorLog("Missed sound: " + std::string(SoundName));
|
ErrorLog("Missed sound: " + std::string(SoundName));
|
||||||
}
|
}
|
||||||
@@ -82,7 +82,7 @@ void TRealSound::Init(std::string const &SoundName, double DistanceAttenuation,
|
|||||||
vSoundPosition.y = Y;
|
vSoundPosition.y = Y;
|
||||||
vSoundPosition.z = Z;
|
vSoundPosition.z = Z;
|
||||||
if (rmin < 0)
|
if (rmin < 0)
|
||||||
iDoppler = 1; // wyłączenie efektu Dopplera, np. dla dźwięku ptaków
|
iDoppler = 1; // wyłączenie efektu Dopplera, np. dla dźwięku ptaków
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
dSoundAtt = -1;
|
dSoundAtt = -1;
|
||||||
@@ -119,19 +119,19 @@ void TRealSound::Play(double Volume, int Looping, bool ListenerInside, vector3 N
|
|||||||
vSoundPosition = NewPosition;
|
vSoundPosition = NewPosition;
|
||||||
dS = dSoundAtt; //*dSoundAtt; //bo odleglosc podawana w kwadracie
|
dS = dSoundAtt; //*dSoundAtt; //bo odleglosc podawana w kwadracie
|
||||||
fDistance = ListenerDistance(Global::pCameraPosition);
|
fDistance = ListenerDistance(Global::pCameraPosition);
|
||||||
if (ListenerInside) // osłabianie dźwięków z odległością
|
if (ListenerInside) // osłabianie dźwięków z odległością
|
||||||
Volume = Volume * dS / (dS + fDistance);
|
Volume = Volume * dS / (dS + fDistance);
|
||||||
else
|
else
|
||||||
Volume = Volume * dS / (dS + 2 * fDistance); // podwójne dla ListenerInside=false
|
Volume = Volume * dS / (dS + 2 * fDistance); // podwójne dla ListenerInside=false
|
||||||
}
|
}
|
||||||
if (iDoppler) //
|
if (iDoppler) //
|
||||||
{ // Ra 2014-07: efekt Dopplera nie zawsze jest wskazany
|
{ // Ra 2014-07: efekt Dopplera nie zawsze jest wskazany
|
||||||
// if (FreeFlyModeFlag) //gdy swobodne latanie - nie sprawdza się to
|
// if (FreeFlyModeFlag) //gdy swobodne latanie - nie sprawdza się to
|
||||||
fPreviousDistance = fDistance; // to efektu Dopplera nie będzie
|
fPreviousDistance = fDistance; // to efektu Dopplera nie będzie
|
||||||
}
|
}
|
||||||
if (Looping) // dźwięk zapętlony można wyłączyć i zostanie włączony w miarę potrzeby
|
if (Looping) // dźwięk zapętlony można wyłączyć i zostanie włączony w miarę potrzeby
|
||||||
bLoopPlay = true; // dźwięk wyłączony
|
bLoopPlay = true; // dźwięk wyłączony
|
||||||
// McZapkie-010302 - babranie tylko z niezbyt odleglymi dźwiękami
|
// McZapkie-010302 - babranie tylko z niezbyt odleglymi dźwiękami
|
||||||
if ((dSoundAtt == -1) || (fDistance < 20.0 * dS))
|
if ((dSoundAtt == -1) || (fDistance < 20.0 * dS))
|
||||||
{
|
{
|
||||||
// vol=2*Volume+1;
|
// vol=2*Volume+1;
|
||||||
@@ -152,28 +152,28 @@ void TRealSound::Play(double Volume, int Looping, bool ListenerInside, vector3 N
|
|||||||
pSound->Play(0, 0, Looping);
|
pSound->Play(0, 0, Looping);
|
||||||
}
|
}
|
||||||
else // wylacz dzwiek bo daleko
|
else // wylacz dzwiek bo daleko
|
||||||
{ // Ra 2014-09: oddalanie się nie może być powodem do wyłączenie dźwięku
|
{ // Ra 2014-09: oddalanie się nie może być powodem do wyłączenie dźwięku
|
||||||
/*
|
/*
|
||||||
// Ra: stara wersja, ale podobno lepsza
|
// Ra: stara wersja, ale podobno lepsza
|
||||||
pSound->GetStatus(&stat);
|
pSound->GetStatus(&stat);
|
||||||
if (bLoopPlay) //jeśli zapętlony, to zostanie ponownie włączony, o ile znajdzie się
|
if (bLoopPlay) //jeśli zapętlony, to zostanie ponownie włączony, o ile znajdzie się
|
||||||
bliżej
|
bliżej
|
||||||
if (stat&DSBSTATUS_PLAYING)
|
if (stat&DSBSTATUS_PLAYING)
|
||||||
pSound->Stop();
|
pSound->Stop();
|
||||||
// Ra: wyłączyłem, bo podobno jest gorzej niż wcześniej
|
// Ra: wyłączyłem, bo podobno jest gorzej niż wcześniej
|
||||||
//ZiomalCl: dźwięk po wyłączeniu sam się nie włączy, gdy wrócimy w rejon odtwarzania
|
//ZiomalCl: dźwięk po wyłączeniu sam się nie włączy, gdy wrócimy w rejon odtwarzania
|
||||||
pSound->SetVolume(DSBVOLUME_MIN); //dlatego lepiej go wyciszyć na czas oddalenia się
|
pSound->SetVolume(DSBVOLUME_MIN); //dlatego lepiej go wyciszyć na czas oddalenia się
|
||||||
pSound->GetStatus(&stat);
|
pSound->GetStatus(&stat);
|
||||||
if (!(stat&DSBSTATUS_PLAYING))
|
if (!(stat&DSBSTATUS_PLAYING))
|
||||||
pSound->Play(0,0,Looping); //ZiomalCl: włączenie odtwarzania rownież i tu, gdyż
|
pSound->Play(0,0,Looping); //ZiomalCl: włączenie odtwarzania rownież i tu, gdyż
|
||||||
jesli uruchamiamy dźwięk poza promieniem, nie uruchomi się on w ogóle
|
jesli uruchamiamy dźwięk poza promieniem, nie uruchomi się on w ogóle
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void TRealSound::Start(){
|
void TRealSound::Start(){
|
||||||
// włączenie dźwięku
|
// włączenie dźwięku
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -183,7 +183,7 @@ void TRealSound::Stop()
|
|||||||
if (pSound)
|
if (pSound)
|
||||||
if ((Global::bSoundEnabled) && (AM != 0))
|
if ((Global::bSoundEnabled) && (AM != 0))
|
||||||
{
|
{
|
||||||
bLoopPlay = false; // dźwięk wyłączony
|
bLoopPlay = false; // dźwięk wyłączony
|
||||||
pSound->GetStatus(&stat);
|
pSound->GetStatus(&stat);
|
||||||
if (stat & DSBSTATUS_PLAYING)
|
if (stat & DSBSTATUS_PLAYING)
|
||||||
pSound->Stop();
|
pSound->Stop();
|
||||||
@@ -215,7 +215,7 @@ void TRealSound::AdjFreq(double Freq, double dt) // McZapkie TODO: dorobic tu ef
|
|||||||
}
|
}
|
||||||
|
|
||||||
double TRealSound::GetWaveTime() // McZapkie: na razie tylko dla 22KHz/8bps
|
double TRealSound::GetWaveTime() // McZapkie: na razie tylko dla 22KHz/8bps
|
||||||
{ // używana do pomiaru czasu dla dźwięków z początkiem i końcem
|
{ // używana do pomiaru czasu dla dźwięków z początkiem i końcem
|
||||||
if (!pSound)
|
if (!pSound)
|
||||||
return 0.0;
|
return 0.0;
|
||||||
double WaveTime;
|
double WaveTime;
|
||||||
@@ -246,7 +246,7 @@ int TRealSound::GetStatus()
|
|||||||
|
|
||||||
void TRealSound::ResetPosition()
|
void TRealSound::ResetPosition()
|
||||||
{
|
{
|
||||||
if (pSound) // Ra: znowu jakiś badziew!
|
if (pSound) // Ra: znowu jakiś badziew!
|
||||||
pSound->SetCurrentPosition(0);
|
pSound->SetCurrentPosition(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -263,13 +263,13 @@ void TTextSound::Init(std::string const &SoundName, double SoundAttenuation, dou
|
|||||||
//TRealSound::Init(SoundName, SoundAttenuation, X, Y, Z, Dynamic, freqmod, rmin);
|
//TRealSound::Init(SoundName, SoundAttenuation, X, Y, Z, Dynamic, freqmod, rmin);
|
||||||
fTime = GetWaveTime();
|
fTime = GetWaveTime();
|
||||||
std::string txt(SoundName);
|
std::string txt(SoundName);
|
||||||
txt.erase( txt.rfind( '.' ) ); // obcięcie rozszerzenia
|
txt.erase( txt.rfind( '.' ) ); // obcięcie rozszerzenia
|
||||||
for (int i = txt.length(); i > 0; --i)
|
for (int i = txt.length(); i > 0; --i)
|
||||||
if (txt[i] == '/')
|
if (txt[i] == '/')
|
||||||
txt[i] = '\\'; // bo nie rozumi
|
txt[i] = '\\'; // bo nie rozumi
|
||||||
txt += "-" + Global::asLang + ".txt"; // już może być w różnych językach
|
txt += "-" + Global::asLang + ".txt"; // już może być w różnych językach
|
||||||
if (!FileExists(txt))
|
if (!FileExists(txt))
|
||||||
txt = "sounds\\" + txt; //ścieżka może nie być podana
|
txt = "sounds\\" + txt; //ścieżka może nie być podana
|
||||||
if (FileExists(txt))
|
if (FileExists(txt))
|
||||||
{ // wczytanie
|
{ // wczytanie
|
||||||
/* TFileStream *ts = new TFileStream(txt, fmOpenRead);
|
/* TFileStream *ts = new TFileStream(txt, fmOpenRead);
|
||||||
@@ -283,15 +283,15 @@ void TTextSound::Init(std::string const &SoundName, double SoundAttenuation, dou
|
|||||||
void TTextSound::Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition)
|
void TTextSound::Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition)
|
||||||
{
|
{
|
||||||
if (false == asText.empty())
|
if (false == asText.empty())
|
||||||
{ // jeśli ma powiązany tekst
|
{ // jeśli ma powiązany tekst
|
||||||
DWORD stat;
|
DWORD stat;
|
||||||
pSound->GetStatus(&stat);
|
pSound->GetStatus(&stat);
|
||||||
if (!(stat & DSBSTATUS_PLAYING)) // jeśli nie jest aktualnie odgrywany
|
if (!(stat & DSBSTATUS_PLAYING)) // jeśli nie jest aktualnie odgrywany
|
||||||
{
|
{
|
||||||
std::string t( asText );
|
std::string t( asText );
|
||||||
size_t i;
|
size_t i;
|
||||||
do
|
do
|
||||||
{ // na razie zrobione jakkolwiek, docelowo przenieść teksty do tablicy nazw
|
{ // na razie zrobione jakkolwiek, docelowo przenieść teksty do tablicy nazw
|
||||||
i = t.find('\r'); // znak nowej linii
|
i = t.find('\r'); // znak nowej linii
|
||||||
if( i == std::string::npos ) {
|
if( i == std::string::npos ) {
|
||||||
Global::tranTexts.Add( t.c_str(), fTime, true );
|
Global::tranTexts.Add( t.c_str(), fTime, true );
|
||||||
|
|||||||
26
RealSound.h
26
RealSound.h
@@ -20,8 +20,8 @@ class TRealSound
|
|||||||
PSound pSound;
|
PSound pSound;
|
||||||
// char *Nazwa; // dla celow odwszawiania NOTE: currently not used anywhere
|
// char *Nazwa; // dla celow odwszawiania NOTE: currently not used anywhere
|
||||||
double fDistance, fPreviousDistance; // dla liczenia Dopplera
|
double fDistance, fPreviousDistance; // dla liczenia Dopplera
|
||||||
float fFrequency; // częstotliwość samplowania pliku
|
float fFrequency; // częstotliwość samplowania pliku
|
||||||
int iDoppler; // Ra 2014-07: możliwość wyłączenia efektu Dopplera np. dla śpiewu ptaków
|
int iDoppler; // Ra 2014-07: możliwość wyłączenia efektu Dopplera np. dla śpiewu ptaków
|
||||||
public:
|
public:
|
||||||
vector3 vSoundPosition; // polozenie zrodla dzwieku
|
vector3 vSoundPosition; // polozenie zrodla dzwieku
|
||||||
double dSoundAtt; // odleglosc polowicznego zaniku dzwieku
|
double dSoundAtt; // odleglosc polowicznego zaniku dzwieku
|
||||||
@@ -29,7 +29,7 @@ class TRealSound
|
|||||||
double AA; // offset amplitudy
|
double AA; // offset amplitudy
|
||||||
double FM; // mnoznik czestotliwosci
|
double FM; // mnoznik czestotliwosci
|
||||||
double FA; // offset czestotliwosci
|
double FA; // offset czestotliwosci
|
||||||
bool bLoopPlay; // czy zapętlony dźwięk jest odtwarzany
|
bool bLoopPlay; // czy zapętlony dźwięk jest odtwarzany
|
||||||
TRealSound();
|
TRealSound();
|
||||||
TRealSound( std::string const &SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic,
|
TRealSound( std::string const &SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic,
|
||||||
bool freqmod = false, double rmin = 0.0);
|
bool freqmod = false, double rmin = 0.0);
|
||||||
@@ -50,7 +50,7 @@ class TRealSound
|
|||||||
};
|
};
|
||||||
|
|
||||||
class TTextSound : public TRealSound
|
class TTextSound : public TRealSound
|
||||||
{ // dźwięk ze stenogramem
|
{ // dźwięk ze stenogramem
|
||||||
std::string asText;
|
std::string asText;
|
||||||
float fTime; // czas trwania
|
float fTime; // czas trwania
|
||||||
public:
|
public:
|
||||||
@@ -62,18 +62,18 @@ class TTextSound : public TRealSound
|
|||||||
};
|
};
|
||||||
|
|
||||||
class TSynthSound
|
class TSynthSound
|
||||||
{ // klasa generująca sygnał odjazdu (Rp12, Rp13), potem rozbudować o pracę manewrowego...
|
{ // klasa generująca sygnał odjazdu (Rp12, Rp13), potem rozbudować o pracę manewrowego...
|
||||||
int iIndex[44]; // indeksy początkowe, gdy mamy kilka wariantów dźwięków składowych
|
int iIndex[44]; // indeksy początkowe, gdy mamy kilka wariantów dźwięków składowych
|
||||||
// 0..9 - cyfry 0..9
|
// 0..9 - cyfry 0..9
|
||||||
// 10..19 - liczby 10..19
|
// 10..19 - liczby 10..19
|
||||||
// 21..29 - dziesiątki (*21==*10?)
|
// 21..29 - dziesiątki (*21==*10?)
|
||||||
// 31..39 - setki 100,200,...,800,900
|
// 31..39 - setki 100,200,...,800,900
|
||||||
// 40 - "tysiąc"
|
// 40 - "tysiąc"
|
||||||
// 41 - "tysiące"
|
// 41 - "tysiące"
|
||||||
// 42 - indeksy początkowe dla "odjazd"
|
// 42 - indeksy początkowe dla "odjazd"
|
||||||
// 43 - indeksy początkowe dla "gotów"
|
// 43 - indeksy początkowe dla "gotów"
|
||||||
PSound *sSound; // posortowana tablica dźwięków, rozmiar zależny od liczby znalezionych plików
|
PSound *sSound; // posortowana tablica dźwięków, rozmiar zależny od liczby znalezionych plików
|
||||||
// a może zamiast wielu plików/dźwięków zrobić jeden połączony plik i posługiwać się czasem
|
// a może zamiast wielu plików/dźwięków zrobić jeden połączony plik i posługiwać się czasem
|
||||||
// od..do?
|
// od..do?
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
306
Segment.cpp
306
Segment.cpp
@@ -19,10 +19,10 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
// 101206 Ra: trapezoidalne drogi
|
// 101206 Ra: trapezoidalne drogi
|
||||||
// 110806 Ra: odwrócone mapowanie wzdłuż - Point1 == 1.0
|
// 110806 Ra: odwrócone mapowanie wzdłuż - Point1 == 1.0
|
||||||
|
|
||||||
std::string Where(vector3 p)
|
std::string Where(vector3 p)
|
||||||
{ // zamiana współrzędnych na tekst, używana w błędach
|
{ // zamiana współrzędnych na tekst, używana w błędach
|
||||||
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -44,17 +44,17 @@ TSegment::~TSegment()
|
|||||||
|
|
||||||
bool TSegment::Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, double fNewRoll1,
|
bool TSegment::Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, double fNewRoll1,
|
||||||
double fNewRoll2)
|
double fNewRoll2)
|
||||||
{ // wersja dla prostego - wyliczanie punktów kontrolnych
|
{ // wersja dla prostego - wyliczanie punktów kontrolnych
|
||||||
vector3 dir;
|
vector3 dir;
|
||||||
if (fNewRoll1 == fNewRoll2)
|
if (fNewRoll1 == fNewRoll2)
|
||||||
{ // faktyczny prosty
|
{ // faktyczny prosty
|
||||||
dir = Normalize(NewPoint2 - NewPoint1); // wektor kierunku o długości 1
|
dir = Normalize(NewPoint2 - NewPoint1); // wektor kierunku o długości 1
|
||||||
return TSegment::Init(NewPoint1, dir, -dir, NewPoint2, fNewStep, fNewRoll1, fNewRoll2,
|
return TSegment::Init(NewPoint1, dir, -dir, NewPoint2, fNewStep, fNewRoll1, fNewRoll2,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // prosty ze zmienną przechyłką musi być segmentowany jak krzywe
|
{ // prosty ze zmienną przechyłką musi być segmentowany jak krzywe
|
||||||
dir = (NewPoint2 - NewPoint1) / 3.0; // punkty kontrolne prostego są w 1/3 długości
|
dir = (NewPoint2 - NewPoint1) / 3.0; // punkty kontrolne prostego są w 1/3 długości
|
||||||
return TSegment::Init(NewPoint1, NewPoint1 + dir, NewPoint2 - dir, NewPoint2, fNewStep,
|
return TSegment::Init(NewPoint1, NewPoint1 + dir, NewPoint2 - dir, NewPoint2, fNewStep,
|
||||||
fNewRoll1, fNewRoll2, true);
|
fNewRoll1, fNewRoll2, true);
|
||||||
}
|
}
|
||||||
@@ -68,41 +68,41 @@ bool TSegment::Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointI
|
|||||||
CPointOut = NewCPointOut;
|
CPointOut = NewCPointOut;
|
||||||
CPointIn = NewCPointIn;
|
CPointIn = NewCPointIn;
|
||||||
Point2 = NewPoint2;
|
Point2 = NewPoint2;
|
||||||
// poprawienie przechyłki
|
// poprawienie przechyłki
|
||||||
fRoll1 = DegToRad(fNewRoll1); // Ra: przeliczone jest bardziej przydatne do obliczeń
|
fRoll1 = DegToRad(fNewRoll1); // Ra: przeliczone jest bardziej przydatne do obliczeń
|
||||||
fRoll2 = DegToRad(fNewRoll2);
|
fRoll2 = DegToRad(fNewRoll2);
|
||||||
if (Global::bRollFix)
|
if (Global::bRollFix)
|
||||||
{ // Ra: poprawianie przechyłki
|
{ // Ra: poprawianie przechyłki
|
||||||
// Przechyłka powinna być na środku wewnętrznej szyny, a standardowo jest w osi
|
// Przechyłka powinna być na środku wewnętrznej szyny, a standardowo jest w osi
|
||||||
// toru. Dlatego trzeba podnieść tor oraz odpowiednio podwyższyć podsypkę.
|
// toru. Dlatego trzeba podnieść tor oraz odpowiednio podwyższyć podsypkę.
|
||||||
// Nie wykonywać tej funkcji, jeśli podwyższenie zostało uwzględnione w edytorze.
|
// Nie wykonywać tej funkcji, jeśli podwyższenie zostało uwzględnione w edytorze.
|
||||||
// Problematyczne mogą byc rozjazdy na przechyłce - lepiej je modelować w edytorze.
|
// Problematyczne mogą byc rozjazdy na przechyłce - lepiej je modelować w edytorze.
|
||||||
// Na razie wszystkie scenerie powinny być poprawiane.
|
// Na razie wszystkie scenerie powinny być poprawiane.
|
||||||
// Jedynie problem będzie z podwójną rampą przechyłkową, która w środku będzie
|
// Jedynie problem będzie z podwójną rampą przechyłkową, która w środku będzie
|
||||||
// mieć moment wypoziomowania, ale musi on być również podniesiony.
|
// mieć moment wypoziomowania, ale musi on być również podniesiony.
|
||||||
if (fRoll1 != 0.0)
|
if (fRoll1 != 0.0)
|
||||||
{ // tylko jeśli jest przechyłka
|
{ // tylko jeśli jest przechyłka
|
||||||
double w1 = fabs(sin(fRoll1) * 0.75); // 0.5*w2+0.0325; //0.75m dla 1.435
|
double w1 = fabs(sin(fRoll1) * 0.75); // 0.5*w2+0.0325; //0.75m dla 1.435
|
||||||
Point1.y += w1; // modyfikacja musi być przed policzeniem dalszych parametrów
|
Point1.y += w1; // modyfikacja musi być przed policzeniem dalszych parametrów
|
||||||
if (bCurve)
|
if (bCurve)
|
||||||
CPointOut.y += w1; // prosty ma wektory jednostkowe
|
CPointOut.y += w1; // prosty ma wektory jednostkowe
|
||||||
pOwner->MovedUp1(w1); // zwrócić trzeba informację o podwyższeniu podsypki
|
pOwner->MovedUp1(w1); // zwrócić trzeba informację o podwyższeniu podsypki
|
||||||
}
|
}
|
||||||
if (fRoll2 != 0.0)
|
if (fRoll2 != 0.0)
|
||||||
{
|
{
|
||||||
double w2 = fabs(sin(fRoll2) * 0.75); // 0.5*w2+0.0325; //0.75m dla 1.435
|
double w2 = fabs(sin(fRoll2) * 0.75); // 0.5*w2+0.0325; //0.75m dla 1.435
|
||||||
Point2.y += w2; // modyfikacja musi być przed policzeniem dalszych parametrów
|
Point2.y += w2; // modyfikacja musi być przed policzeniem dalszych parametrów
|
||||||
if (bCurve)
|
if (bCurve)
|
||||||
CPointIn.y += w2; // prosty ma wektory jednostkowe
|
CPointIn.y += w2; // prosty ma wektory jednostkowe
|
||||||
// zwrócić trzeba informację o podwyższeniu podsypki
|
// zwrócić trzeba informację o podwyższeniu podsypki
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Ra: ten kąt jeszcze do przemyślenia jest
|
// Ra: ten kąt jeszcze do przemyślenia jest
|
||||||
fDirection = -atan2(Point2.x - Point1.x,
|
fDirection = -atan2(Point2.x - Point1.x,
|
||||||
Point2.z - Point1.z); // kąt w planie, żeby nie liczyć wielokrotnie
|
Point2.z - Point1.z); // kąt w planie, żeby nie liczyć wielokrotnie
|
||||||
bCurve = bIsCurve;
|
bCurve = bIsCurve;
|
||||||
if (bCurve)
|
if (bCurve)
|
||||||
{ // przeliczenie współczynników wielomianu, będzie mniej mnożeń i można policzyć pochodne
|
{ // przeliczenie współczynników wielomianu, będzie mniej mnożeń i można policzyć pochodne
|
||||||
vC = 3.0 * (CPointOut - Point1); // t^1
|
vC = 3.0 * (CPointOut - Point1); // t^1
|
||||||
vB = 3.0 * (CPointIn - CPointOut) - vC; // t^2
|
vB = 3.0 * (CPointIn - CPointOut) - vC; // t^2
|
||||||
vA = Point2 - Point1 - vC - vB; // t^3
|
vA = Point2 - Point1 - vC - vB; // t^3
|
||||||
@@ -115,17 +115,17 @@ bool TSegment::Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointI
|
|||||||
{
|
{
|
||||||
ErrorLog("Bad geometry: Length <= 0 in TSegment::Init at " + Where(Point1));
|
ErrorLog("Bad geometry: Length <= 0 in TSegment::Init at " + Where(Point1));
|
||||||
// MessageBox(0,"Length<=0","TSegment::Init",MB_OK);
|
// MessageBox(0,"Length<=0","TSegment::Init",MB_OK);
|
||||||
return false; // zerowe nie mogą być
|
return false; // zerowe nie mogą być
|
||||||
}
|
}
|
||||||
fStoop = atan2((Point2.y - Point1.y),
|
fStoop = atan2((Point2.y - Point1.y),
|
||||||
fLength); // pochylenie toru prostego, żeby nie liczyć wielokrotnie
|
fLength); // pochylenie toru prostego, żeby nie liczyć wielokrotnie
|
||||||
SafeDeleteArray(fTsBuffer);
|
SafeDeleteArray(fTsBuffer);
|
||||||
if ((bCurve) && (fStep > 0))
|
if ((bCurve) && (fStep > 0))
|
||||||
{ // Ra: prosty dostanie podział, jak ma różną przechyłkę na końcach
|
{ // Ra: prosty dostanie podział, jak ma różną przechyłkę na końcach
|
||||||
double s = 0;
|
double s = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
iSegCount = ceil(fLength / fStep); // potrzebne do VBO
|
iSegCount = ceil(fLength / fStep); // potrzebne do VBO
|
||||||
// fStep=fLength/(double)(iSegCount-1); //wyrównanie podziału
|
// fStep=fLength/(double)(iSegCount-1); //wyrównanie podziału
|
||||||
fTsBuffer = new double[iSegCount + 1];
|
fTsBuffer = new double[iSegCount + 1];
|
||||||
fTsBuffer[0] = 0; /* TODO : fix fTsBuffer */
|
fTsBuffer[0] = 0; /* TODO : fix fTsBuffer */
|
||||||
while (s < fLength)
|
while (s < fLength)
|
||||||
@@ -138,7 +138,7 @@ bool TSegment::Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fLength > 500)
|
if (fLength > 500)
|
||||||
{ // tor ma pojemność 40 pojazdów, więc nie może być za długi
|
{ // tor ma pojemność 40 pojazdów, więc nie może być za długi
|
||||||
ErrorLog("Bad geometry: Length > 500m at " + Where(Point1));
|
ErrorLog("Bad geometry: Length > 500m at " + Where(Point1));
|
||||||
// MessageBox(0,"Length>500","TSegment::Init",MB_OK);
|
// MessageBox(0,"Length>500","TSegment::Init",MB_OK);
|
||||||
return false;
|
return false;
|
||||||
@@ -226,83 +226,83 @@ double TSegment::GetTFromS(double s)
|
|||||||
};
|
};
|
||||||
|
|
||||||
vector3 TSegment::RaInterpolate(double t)
|
vector3 TSegment::RaInterpolate(double t)
|
||||||
{ // wyliczenie XYZ na krzywej Beziera z użyciem współczynników
|
{ // wyliczenie XYZ na krzywej Beziera z użyciem współczynników
|
||||||
return t * (t * (t * vA + vB) + vC) + Point1; // 9 mnożeń, 9 dodawań
|
return t * (t * (t * vA + vB) + vC) + Point1; // 9 mnożeń, 9 dodawań
|
||||||
};
|
};
|
||||||
|
|
||||||
vector3 TSegment::RaInterpolate0(double t)
|
vector3 TSegment::RaInterpolate0(double t)
|
||||||
{ // wyliczenie XYZ na krzywej Beziera, na użytek liczenia długości nie jest dodawane Point1
|
{ // wyliczenie XYZ na krzywej Beziera, na użytek liczenia długości nie jest dodawane Point1
|
||||||
return t * (t * (t * vA + vB) + vC); // 9 mnożeń, 6 dodawań
|
return t * (t * (t * vA + vB) + vC); // 9 mnożeń, 6 dodawań
|
||||||
};
|
};
|
||||||
|
|
||||||
double TSegment::ComputeLength() // McZapkie-150503: dlugosc miedzy punktami krzywej
|
double TSegment::ComputeLength() // McZapkie-150503: dlugosc miedzy punktami krzywej
|
||||||
{ // obliczenie długości krzywej Beziera za pomocą interpolacji odcinkami
|
{ // obliczenie długości krzywej Beziera za pomocą interpolacji odcinkami
|
||||||
// Ra: zamienić na liczenie rekurencyjne średniej z cięciwy i łamanej po kontrolnych
|
// Ra: zamienić na liczenie rekurencyjne średniej z cięciwy i łamanej po kontrolnych
|
||||||
// Ra: koniec rekurencji jeśli po podziale suma długości nie różni się więcej niż 0.5mm od
|
// Ra: koniec rekurencji jeśli po podziale suma długości nie różni się więcej niż 0.5mm od
|
||||||
// poprzedniej
|
// poprzedniej
|
||||||
// Ra: ewentualnie rozpoznać łuk okręgu płaskiego i liczyć ze wzoru na długość łuku
|
// Ra: ewentualnie rozpoznać łuk okręgu płaskiego i liczyć ze wzoru na długość łuku
|
||||||
double t, l = 0;
|
double t, l = 0;
|
||||||
vector3 last = vector3(0, 0, 0); // długość liczona po przesunięciu odcinka do początku układu
|
vector3 last = vector3(0, 0, 0); // długość liczona po przesunięciu odcinka do początku układu
|
||||||
vector3 tmp = Point2 - Point1;
|
vector3 tmp = Point2 - Point1;
|
||||||
int m = 20.0 * tmp.Length(); // było zawsze do 10000, teraz jest liczone odcinkami po około 5cm
|
int m = 20.0 * tmp.Length(); // było zawsze do 10000, teraz jest liczone odcinkami po około 5cm
|
||||||
for (int i = 1; i <= m; i++)
|
for (int i = 1; i <= m; i++)
|
||||||
{
|
{
|
||||||
t = double(i) / double(m); // wyznaczenie parametru na krzywej z przedziału (0,1>
|
t = double(i) / double(m); // wyznaczenie parametru na krzywej z przedziału (0,1>
|
||||||
// tmp=Interpolate(t,p1,cp1,cp2,p2);
|
// tmp=Interpolate(t,p1,cp1,cp2,p2);
|
||||||
tmp = RaInterpolate0(t); // obliczenie punktu dla tego parametru
|
tmp = RaInterpolate0(t); // obliczenie punktu dla tego parametru
|
||||||
t = vector3(tmp - last).Length(); // obliczenie długości wektora
|
t = vector3(tmp - last).Length(); // obliczenie długości wektora
|
||||||
l += t; // zwiększenie wyliczanej długości
|
l += t; // zwiększenie wyliczanej długości
|
||||||
last = tmp;
|
last = tmp;
|
||||||
}
|
}
|
||||||
return (l);
|
return (l);
|
||||||
}
|
}
|
||||||
|
|
||||||
const double fDirectionOffset = 0.1; // długość wektora do wyliczenia kierunku
|
const double fDirectionOffset = 0.1; // długość wektora do wyliczenia kierunku
|
||||||
|
|
||||||
vector3 TSegment::GetDirection(double fDistance)
|
vector3 TSegment::GetDirection(double fDistance)
|
||||||
{ // takie toporne liczenie pochodnej dla podanego dystansu od Point1
|
{ // takie toporne liczenie pochodnej dla podanego dystansu od Point1
|
||||||
double t1 = GetTFromS(fDistance - fDirectionOffset);
|
double t1 = GetTFromS(fDistance - fDirectionOffset);
|
||||||
if (t1 <= 0.0)
|
if (t1 <= 0.0)
|
||||||
return (CPointOut - Point1); // na zewnątrz jako prosta
|
return (CPointOut - Point1); // na zewnątrz jako prosta
|
||||||
double t2 = GetTFromS(fDistance + fDirectionOffset);
|
double t2 = GetTFromS(fDistance + fDirectionOffset);
|
||||||
if (t2 >= 1.0)
|
if (t2 >= 1.0)
|
||||||
return (Point1 - CPointIn); // na zewnątrz jako prosta
|
return (Point1 - CPointIn); // na zewnątrz jako prosta
|
||||||
return (FastGetPoint(t2) - FastGetPoint(t1));
|
return (FastGetPoint(t2) - FastGetPoint(t1));
|
||||||
}
|
}
|
||||||
|
|
||||||
vector3 TSegment::FastGetDirection(double fDistance, double fOffset)
|
vector3 TSegment::FastGetDirection(double fDistance, double fOffset)
|
||||||
{ // takie toporne liczenie pochodnej dla parametru 0.0÷1.0
|
{ // takie toporne liczenie pochodnej dla parametru 0.0÷1.0
|
||||||
double t1 = fDistance - fOffset;
|
double t1 = fDistance - fOffset;
|
||||||
if (t1 <= 0.0)
|
if (t1 <= 0.0)
|
||||||
return (CPointOut - Point1); // wektor na początku jest stały
|
return (CPointOut - Point1); // wektor na początku jest stały
|
||||||
double t2 = fDistance + fOffset;
|
double t2 = fDistance + fOffset;
|
||||||
if (t2 >= 1.0)
|
if (t2 >= 1.0)
|
||||||
return (Point2 - CPointIn); // wektor na końcu jest stały
|
return (Point2 - CPointIn); // wektor na końcu jest stały
|
||||||
return (FastGetPoint(t2) - FastGetPoint(t1));
|
return (FastGetPoint(t2) - FastGetPoint(t1));
|
||||||
}
|
}
|
||||||
|
|
||||||
vector3 TSegment::GetPoint(double fDistance)
|
vector3 TSegment::GetPoint(double fDistance)
|
||||||
{ // wyliczenie współrzędnych XYZ na torze w odległości (fDistance) od Point1
|
{ // wyliczenie współrzędnych XYZ na torze w odległości (fDistance) od Point1
|
||||||
if (bCurve)
|
if (bCurve)
|
||||||
{ // można by wprowadzić uproszczony wzór dla okręgów płaskich
|
{ // można by wprowadzić uproszczony wzór dla okręgów płaskich
|
||||||
double t = GetTFromS(fDistance); // aproksymacja dystansu na krzywej Beziera
|
double t = GetTFromS(fDistance); // aproksymacja dystansu na krzywej Beziera
|
||||||
// return Interpolate(t,Point1,CPointOut,CPointIn,Point2);
|
// return Interpolate(t,Point1,CPointOut,CPointIn,Point2);
|
||||||
return RaInterpolate(t);
|
return RaInterpolate(t);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // wyliczenie dla odcinka prostego jest prostsze
|
{ // wyliczenie dla odcinka prostego jest prostsze
|
||||||
double t = fDistance / fLength; // zerowych torów nie ma
|
double t = fDistance / fLength; // zerowych torów nie ma
|
||||||
return ((1.0 - t) * Point1 + (t)*Point2);
|
return ((1.0 - t) * Point1 + (t)*Point2);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void TSegment::RaPositionGet(double fDistance, vector3 &p, vector3 &a)
|
void TSegment::RaPositionGet(double fDistance, vector3 &p, vector3 &a)
|
||||||
{ // ustalenie pozycji osi na torze, przechyłki, pochylenia i kierunku jazdy
|
{ // ustalenie pozycji osi na torze, przechyłki, pochylenia i kierunku jazdy
|
||||||
if (bCurve)
|
if (bCurve)
|
||||||
{ // można by wprowadzić uproszczony wzór dla okręgów płaskich
|
{ // można by wprowadzić uproszczony wzór dla okręgów płaskich
|
||||||
double t = GetTFromS(fDistance); // aproksymacja dystansu na krzywej Beziera na parametr (t)
|
double t = GetTFromS(fDistance); // aproksymacja dystansu na krzywej Beziera na parametr (t)
|
||||||
p = RaInterpolate(t);
|
p = RaInterpolate(t);
|
||||||
a.x = (1.0 - t) * fRoll1 + (t)*fRoll2; // przechyłka w danym miejscu (zmienia się liniowo)
|
a.x = (1.0 - t) * fRoll1 + (t)*fRoll2; // przechyłka w danym miejscu (zmienia się liniowo)
|
||||||
// pochodna jest 3*A*t^2+2*B*t+C
|
// pochodna jest 3*A*t^2+2*B*t+C
|
||||||
a.y = atan(t * (t * 3.0 * vA.y + vB.y + vB.y) + vC.y); // pochylenie krzywej (w pionie)
|
a.y = atan(t * (t * 3.0 * vA.y + vB.y + vB.y) + vC.y); // pochylenie krzywej (w pionie)
|
||||||
a.z = -atan2(t * (t * 3.0 * vA.x + vB.x + vB.x) + vC.x,
|
a.z = -atan2(t * (t * 3.0 * vA.x + vB.x + vB.x) + vC.x,
|
||||||
@@ -310,9 +310,9 @@ void TSegment::RaPositionGet(double fDistance, vector3 &p, vector3 &a)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // wyliczenie dla odcinka prostego jest prostsze
|
{ // wyliczenie dla odcinka prostego jest prostsze
|
||||||
double t = fDistance / fLength; // zerowych torów nie ma
|
double t = fDistance / fLength; // zerowych torów nie ma
|
||||||
p = ((1.0 - t) * Point1 + (t)*Point2);
|
p = ((1.0 - t) * Point1 + (t)*Point2);
|
||||||
a.x = (1.0 - t) * fRoll1 + (t)*fRoll2; // przechyłka w danym miejscu (zmienia się liniowo)
|
a.x = (1.0 - t) * fRoll1 + (t)*fRoll2; // przechyłka w danym miejscu (zmienia się liniowo)
|
||||||
a.y = fStoop; // pochylenie toru prostego
|
a.y = fStoop; // pochylenie toru prostego
|
||||||
a.z = fDirection; // kierunek toru w planie
|
a.z = fDirection; // kierunek toru w planie
|
||||||
}
|
}
|
||||||
@@ -326,32 +326,32 @@ vector3 TSegment::FastGetPoint(double t)
|
|||||||
|
|
||||||
void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, double fTextureLength,
|
void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, double fTextureLength,
|
||||||
int iSkip, int iQualityFactor, vector3 **p, bool bRender)
|
int iSkip, int iQualityFactor, vector3 **p, bool bRender)
|
||||||
{ // generowanie trójkątów dla odcinka trajektorii ruchu
|
{ // generowanie trójkątów dla odcinka trajektorii ruchu
|
||||||
// standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku
|
// standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku
|
||||||
// po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli
|
// po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli
|
||||||
// podany jest przekrój końcowy
|
// podany jest przekrój końcowy
|
||||||
// podsypka toru jest robiona za pomocą 6 punktów, szyna 12, drogi i rzeki na 3+2+3
|
// podsypka toru jest robiona za pomocą 6 punktów, szyna 12, drogi i rzeki na 3+2+3
|
||||||
if (iQualityFactor < 1)
|
if (iQualityFactor < 1)
|
||||||
iQualityFactor = 1; // co który segment ma być uwzględniony
|
iQualityFactor = 1; // co który segment ma być uwzględniony
|
||||||
vector3 pos1, pos2, dir, parallel1, parallel2, pt, norm;
|
vector3 pos1, pos2, dir, parallel1, parallel2, pt, norm;
|
||||||
double s, step, fOffset, tv1, tv2, t;
|
double s, step, fOffset, tv1, tv2, t;
|
||||||
int i, j;
|
int i, j;
|
||||||
bool trapez = iNumShapePoints < 0; // sygnalizacja trapezowatości
|
bool trapez = iNumShapePoints < 0; // sygnalizacja trapezowatości
|
||||||
iNumShapePoints = abs(iNumShapePoints);
|
iNumShapePoints = abs(iNumShapePoints);
|
||||||
if (bCurve)
|
if (bCurve)
|
||||||
{
|
{
|
||||||
double m1, jmm1, m2, jmm2; // pozycje względne na odcinku 0...1 (ale nie parametr Beziera)
|
double m1, jmm1, m2, jmm2; // pozycje względne na odcinku 0...1 (ale nie parametr Beziera)
|
||||||
tv1 = 1.0; // Ra: to by można było wyliczać dla odcinka, wyglądało by lepiej
|
tv1 = 1.0; // Ra: to by można było wyliczać dla odcinka, wyglądało by lepiej
|
||||||
step = fStep * iQualityFactor;
|
step = fStep * iQualityFactor;
|
||||||
s = fStep * iSkip; // iSkip - ile odcinków z początku pominąć
|
s = fStep * iSkip; // iSkip - ile odcinków z początku pominąć
|
||||||
i = iSkip; // domyślnie 0
|
i = iSkip; // domyślnie 0
|
||||||
if (!fTsBuffer)
|
if (!fTsBuffer)
|
||||||
return; // prowizoryczne zabezpieczenie przed wysypem - ustalić faktyczną przyczynę
|
return; // prowizoryczne zabezpieczenie przed wysypem - ustalić faktyczną przyczynę
|
||||||
if (i > iSegCount)
|
if (i > iSegCount)
|
||||||
return; // prowizoryczne zabezpieczenie przed wysypem - ustalić faktyczną przyczynę
|
return; // prowizoryczne zabezpieczenie przed wysypem - ustalić faktyczną przyczynę
|
||||||
t = fTsBuffer[i]; // tabela watości t dla segmentów
|
t = fTsBuffer[i]; // tabela watości t dla segmentów
|
||||||
fOffset = 0.1 / fLength; // pierwsze 10cm
|
fOffset = 0.1 / fLength; // pierwsze 10cm
|
||||||
pos1 = FastGetPoint(t); // wektor początku segmentu
|
pos1 = FastGetPoint(t); // wektor początku segmentu
|
||||||
dir = FastGetDirection(t, fOffset); // wektor kierunku
|
dir = FastGetDirection(t, fOffset); // wektor kierunku
|
||||||
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //wektor poprzeczny
|
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //wektor poprzeczny
|
||||||
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
||||||
@@ -360,23 +360,23 @@ void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, doubl
|
|||||||
while (s < fLength)
|
while (s < fLength)
|
||||||
{
|
{
|
||||||
// step=SquareMagnitude(Global::GetCameraPosition()+pos);
|
// step=SquareMagnitude(Global::GetCameraPosition()+pos);
|
||||||
i += iQualityFactor; // kolejny punkt łamanej
|
i += iQualityFactor; // kolejny punkt łamanej
|
||||||
s += step; // końcowa pozycja segmentu [m]
|
s += step; // końcowa pozycja segmentu [m]
|
||||||
m1 = m2;
|
m1 = m2;
|
||||||
jmm1 = jmm2; // stara pozycja
|
jmm1 = jmm2; // stara pozycja
|
||||||
m2 = s / fLength;
|
m2 = s / fLength;
|
||||||
jmm2 = 1.0 - m2; // nowa pozycja
|
jmm2 = 1.0 - m2; // nowa pozycja
|
||||||
if (s > fLength - 0.5) // Ra: -0.5 żeby nie robiło cieniasa na końcu
|
if (s > fLength - 0.5) // Ra: -0.5 żeby nie robiło cieniasa na końcu
|
||||||
{ // gdy przekroczyliśmy koniec - stąd dziury w torach...
|
{ // gdy przekroczyliśmy koniec - stąd dziury w torach...
|
||||||
step -= (s - fLength); // jeszcze do wyliczenia mapowania potrzebny
|
step -= (s - fLength); // jeszcze do wyliczenia mapowania potrzebny
|
||||||
s = fLength;
|
s = fLength;
|
||||||
i = iSegCount; // 20/5 ma dawać 4
|
i = iSegCount; // 20/5 ma dawać 4
|
||||||
m2 = 1.0;
|
m2 = 1.0;
|
||||||
jmm2 = 0.0;
|
jmm2 = 0.0;
|
||||||
}
|
}
|
||||||
while (tv1 < 0.0)
|
while (tv1 < 0.0)
|
||||||
tv1 += 1.0; // przestawienie mapowania
|
tv1 += 1.0; // przestawienie mapowania
|
||||||
tv2 = tv1 - step / fTextureLength; // mapowanie na końcu segmentu
|
tv2 = tv1 - step / fTextureLength; // mapowanie na końcu segmentu
|
||||||
t = fTsBuffer[i]; // szybsze od GetTFromS(s);
|
t = fTsBuffer[i]; // szybsze od GetTFromS(s);
|
||||||
pos2 = FastGetPoint(t);
|
pos2 = FastGetPoint(t);
|
||||||
dir = FastGetDirection(t, fOffset); // nowy wektor kierunku
|
dir = FastGetDirection(t, fOffset); // nowy wektor kierunku
|
||||||
@@ -394,21 +394,21 @@ void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, doubl
|
|||||||
pos1;
|
pos1;
|
||||||
pt.y += jmm1 * ShapePoints[j].y + m1 * ShapePoints[j + iNumShapePoints].y;
|
pt.y += jmm1 * ShapePoints[j].y + m1 * ShapePoints[j + iNumShapePoints].y;
|
||||||
if (bRender)
|
if (bRender)
|
||||||
{ // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale
|
{ // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale
|
||||||
// potrzebować punktów
|
// potrzebować punktów
|
||||||
glNormal3f(norm.x, norm.y, norm.z);
|
glNormal3f(norm.x, norm.y, norm.z);
|
||||||
glTexCoord2f(
|
glTexCoord2f(
|
||||||
jmm1 * ShapePoints[j].z + m1 * ShapePoints[j + iNumShapePoints].z, tv1);
|
jmm1 * ShapePoints[j].z + m1 * ShapePoints[j + iNumShapePoints].z, tv1);
|
||||||
glVertex3f(pt.x, pt.y, pt.z); // pt nie mamy gdzie zapamiętać?
|
glVertex3f(pt.x, pt.y, pt.z); // pt nie mamy gdzie zapamiętać?
|
||||||
}
|
}
|
||||||
if (p) // jeśli jest wskaźnik do tablicy
|
if (p) // jeśli jest wskaźnik do tablicy
|
||||||
if (*p)
|
if (*p)
|
||||||
if (!j) // to dla pierwszego punktu
|
if (!j) // to dla pierwszego punktu
|
||||||
{
|
{
|
||||||
*(*p) = pt;
|
*(*p) = pt;
|
||||||
(*p)++;
|
(*p)++;
|
||||||
} // zapamiętanie brzegu jezdni
|
} // zapamiętanie brzegu jezdni
|
||||||
// dla trapezu drugi koniec ma inne współrzędne
|
// dla trapezu drugi koniec ma inne współrzędne
|
||||||
norm = (jmm1 * ShapePoints[j].n.x + m1 * ShapePoints[j + iNumShapePoints].n.x) *
|
norm = (jmm1 * ShapePoints[j].n.x + m1 * ShapePoints[j + iNumShapePoints].n.x) *
|
||||||
parallel2;
|
parallel2;
|
||||||
norm.y += jmm1 * ShapePoints[j].n.y + m1 * ShapePoints[j + iNumShapePoints].n.y;
|
norm.y += jmm1 * ShapePoints[j].n.y + m1 * ShapePoints[j + iNumShapePoints].n.y;
|
||||||
@@ -417,39 +417,39 @@ void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, doubl
|
|||||||
pos2;
|
pos2;
|
||||||
pt.y += jmm2 * ShapePoints[j].y + m2 * ShapePoints[j + iNumShapePoints].y;
|
pt.y += jmm2 * ShapePoints[j].y + m2 * ShapePoints[j + iNumShapePoints].y;
|
||||||
if (bRender)
|
if (bRender)
|
||||||
{ // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale
|
{ // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale
|
||||||
// potrzebować punktów
|
// potrzebować punktów
|
||||||
glNormal3f(norm.x, norm.y, norm.z);
|
glNormal3f(norm.x, norm.y, norm.z);
|
||||||
glTexCoord2f(
|
glTexCoord2f(
|
||||||
jmm2 * ShapePoints[j].z + m2 * ShapePoints[j + iNumShapePoints].z, tv2);
|
jmm2 * ShapePoints[j].z + m2 * ShapePoints[j + iNumShapePoints].z, tv2);
|
||||||
glVertex3f(pt.x, pt.y, pt.z);
|
glVertex3f(pt.x, pt.y, pt.z);
|
||||||
}
|
}
|
||||||
if (p) // jeśli jest wskaźnik do tablicy
|
if (p) // jeśli jest wskaźnik do tablicy
|
||||||
if (*p)
|
if (*p)
|
||||||
if (!j) // to dla pierwszego punktu
|
if (!j) // to dla pierwszego punktu
|
||||||
if (i == iSegCount)
|
if (i == iSegCount)
|
||||||
{
|
{
|
||||||
*(*p) = pt;
|
*(*p) = pt;
|
||||||
(*p)++;
|
(*p)++;
|
||||||
} // zapamiętanie brzegu jezdni
|
} // zapamiętanie brzegu jezdni
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
for (j = 0; j < iNumShapePoints; j++)
|
for (j = 0; j < iNumShapePoints; j++)
|
||||||
{ //łuk z jednym profilem
|
{ //łuk z jednym profilem
|
||||||
norm = ShapePoints[j].n.x * parallel1;
|
norm = ShapePoints[j].n.x * parallel1;
|
||||||
norm.y += ShapePoints[j].n.y;
|
norm.y += ShapePoints[j].n.y;
|
||||||
pt = parallel1 * ShapePoints[j].x + pos1;
|
pt = parallel1 * ShapePoints[j].x + pos1;
|
||||||
pt.y += ShapePoints[j].y;
|
pt.y += ShapePoints[j].y;
|
||||||
glNormal3f(norm.x, norm.y, norm.z);
|
glNormal3f(norm.x, norm.y, norm.z);
|
||||||
glTexCoord2f(ShapePoints[j].z, tv1);
|
glTexCoord2f(ShapePoints[j].z, tv1);
|
||||||
glVertex3f(pt.x, pt.y, pt.z); // punkt na początku odcinka
|
glVertex3f(pt.x, pt.y, pt.z); // punkt na początku odcinka
|
||||||
norm = ShapePoints[j].n.x * parallel2;
|
norm = ShapePoints[j].n.x * parallel2;
|
||||||
norm.y += ShapePoints[j].n.y;
|
norm.y += ShapePoints[j].n.y;
|
||||||
pt = parallel2 * ShapePoints[j].x + pos2;
|
pt = parallel2 * ShapePoints[j].x + pos2;
|
||||||
pt.y += ShapePoints[j].y;
|
pt.y += ShapePoints[j].y;
|
||||||
glNormal3f(norm.x, norm.y, norm.z);
|
glNormal3f(norm.x, norm.y, norm.z);
|
||||||
glTexCoord2f(ShapePoints[j].z, tv2);
|
glTexCoord2f(ShapePoints[j].z, tv2);
|
||||||
glVertex3f(pt.x, pt.y, pt.z); // punkt na końcu odcinka
|
glVertex3f(pt.x, pt.y, pt.z); // punkt na końcu odcinka
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
pos1 = pos2;
|
pos1 = pos2;
|
||||||
@@ -475,11 +475,11 @@ void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, doubl
|
|||||||
glNormal3f(norm.x, norm.y, norm.z);
|
glNormal3f(norm.x, norm.y, norm.z);
|
||||||
glTexCoord2f(ShapePoints[j].z, 0);
|
glTexCoord2f(ShapePoints[j].z, 0);
|
||||||
glVertex3f(pt.x, pt.y, pt.z);
|
glVertex3f(pt.x, pt.y, pt.z);
|
||||||
// dla trapezu drugi koniec ma inne współrzędne względne
|
// dla trapezu drugi koniec ma inne współrzędne względne
|
||||||
norm = ShapePoints[j + iNumShapePoints].n.x * parallel1;
|
norm = ShapePoints[j + iNumShapePoints].n.x * parallel1;
|
||||||
norm.y += ShapePoints[j + iNumShapePoints].n.y;
|
norm.y += ShapePoints[j + iNumShapePoints].n.y;
|
||||||
pt = parallel1 * ShapePoints[j + iNumShapePoints].x + pos2; // odsunięcie
|
pt = parallel1 * ShapePoints[j + iNumShapePoints].x + pos2; // odsunięcie
|
||||||
pt.y += ShapePoints[j + iNumShapePoints].y; // wysokość
|
pt.y += ShapePoints[j + iNumShapePoints].y; // wysokość
|
||||||
glNormal3f(norm.x, norm.y, norm.z);
|
glNormal3f(norm.x, norm.y, norm.z);
|
||||||
glTexCoord2f(ShapePoints[j + iNumShapePoints].z, fLength / fTextureLength);
|
glTexCoord2f(ShapePoints[j + iNumShapePoints].z, fLength / fTextureLength);
|
||||||
glVertex3f(pt.x, pt.y, pt.z);
|
glVertex3f(pt.x, pt.y, pt.z);
|
||||||
@@ -507,26 +507,26 @@ void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, doubl
|
|||||||
void TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *ShapePoints2,
|
void TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *ShapePoints2,
|
||||||
int iNumShapePoints, double fTextureLength, int iSkip,
|
int iNumShapePoints, double fTextureLength, int iSkip,
|
||||||
double fOffsetX)
|
double fOffsetX)
|
||||||
{ // tworzenie siatki trójkątów dla iglicy
|
{ // tworzenie siatki trójkątów dla iglicy
|
||||||
vector3 pos1, pos2, dir, parallel1, parallel2, pt;
|
vector3 pos1, pos2, dir, parallel1, parallel2, pt;
|
||||||
double a1, a2, s, step, offset, tv1, tv2, t, t2, t2step, oldt2, sp, oldsp;
|
double a1, a2, s, step, offset, tv1, tv2, t, t2, t2step, oldt2, sp, oldsp;
|
||||||
int i, j;
|
int i, j;
|
||||||
if (bCurve)
|
if (bCurve)
|
||||||
{ // dla toru odchylonego
|
{ // dla toru odchylonego
|
||||||
// t2= 0;
|
// t2= 0;
|
||||||
t2step = 1 / double(iSkip); // przesunięcie tekstury?
|
t2step = 1 / double(iSkip); // przesunięcie tekstury?
|
||||||
oldt2 = 1;
|
oldt2 = 1;
|
||||||
tv1 = 1.0;
|
tv1 = 1.0;
|
||||||
step = fStep; // długść segmentu
|
step = fStep; // długść segmentu
|
||||||
s = 0;
|
s = 0;
|
||||||
i = 0;
|
i = 0;
|
||||||
t = fTsBuffer[i]; // wartość t krzywej Beziera dla początku
|
t = fTsBuffer[i]; // wartość t krzywej Beziera dla początku
|
||||||
a1 = 0;
|
a1 = 0;
|
||||||
// step= fStep/fLength;
|
// step= fStep/fLength;
|
||||||
offset = 0.1 / fLength; // około 10cm w sensie parametru t
|
offset = 0.1 / fLength; // około 10cm w sensie parametru t
|
||||||
pos1 = FastGetPoint(t); // współrzędne dla parmatru t
|
pos1 = FastGetPoint(t); // współrzędne dla parmatru t
|
||||||
// dir= GetDirection1();
|
// dir= GetDirection1();
|
||||||
dir = FastGetDirection(t, offset); // wektor wzdłużny
|
dir = FastGetDirection(t, offset); // wektor wzdłużny
|
||||||
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //poprzeczny?
|
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //poprzeczny?
|
||||||
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
||||||
|
|
||||||
@@ -692,31 +692,31 @@ void TSegment::Render()
|
|||||||
|
|
||||||
void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints,
|
void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints,
|
||||||
double fTextureLength, int iSkip, int iEnd, double fOffsetX)
|
double fTextureLength, int iSkip, int iEnd, double fOffsetX)
|
||||||
{ // generowanie trójkątów dla odcinka trajektorii ruchu
|
{ // generowanie trójkątów dla odcinka trajektorii ruchu
|
||||||
// standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku
|
// standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku
|
||||||
// po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli
|
// po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli
|
||||||
// podany jest przekrój końcowy
|
// podany jest przekrój końcowy
|
||||||
// podsypka toru jest robiona za pomocą 6 punktów, szyna 12, drogi i rzeki na 3+2+3
|
// podsypka toru jest robiona za pomocą 6 punktów, szyna 12, drogi i rzeki na 3+2+3
|
||||||
// na użytek VBO strip dla łuków jest tworzony wzdłuż
|
// na użytek VBO strip dla łuków jest tworzony wzdłuż
|
||||||
// dla skróconego odcinka (iEnd<iSegCount), ShapePoints dotyczy
|
// dla skróconego odcinka (iEnd<iSegCount), ShapePoints dotyczy
|
||||||
// końców skróconych, a nie całości (to pod kątem iglic jest)
|
// końców skróconych, a nie całości (to pod kątem iglic jest)
|
||||||
vector3 pos1, pos2, dir, parallel1, parallel2, pt, norm;
|
vector3 pos1, pos2, dir, parallel1, parallel2, pt, norm;
|
||||||
double s, step, fOffset, tv1, tv2, t, fEnd;
|
double s, step, fOffset, tv1, tv2, t, fEnd;
|
||||||
int i, j;
|
int i, j;
|
||||||
bool trapez = iNumShapePoints < 0; // sygnalizacja trapezowatości
|
bool trapez = iNumShapePoints < 0; // sygnalizacja trapezowatości
|
||||||
iNumShapePoints = abs(iNumShapePoints);
|
iNumShapePoints = abs(iNumShapePoints);
|
||||||
if (bCurve)
|
if (bCurve)
|
||||||
{
|
{
|
||||||
double m1, jmm1, m2, jmm2; // pozycje względne na odcinku 0...1 (ale nie parametr Beziera)
|
double m1, jmm1, m2, jmm2; // pozycje względne na odcinku 0...1 (ale nie parametr Beziera)
|
||||||
step = fStep;
|
step = fStep;
|
||||||
tv1 = 1.0; // Ra: to by można było wyliczać dla odcinka, wyglądało by lepiej
|
tv1 = 1.0; // Ra: to by można było wyliczać dla odcinka, wyglądało by lepiej
|
||||||
s = fStep * iSkip; // iSkip - ile odcinków z początku pominąć
|
s = fStep * iSkip; // iSkip - ile odcinków z początku pominąć
|
||||||
i = iSkip; // domyślnie 0
|
i = iSkip; // domyślnie 0
|
||||||
t = fTsBuffer[i]; // tabela wattości t dla segmentów
|
t = fTsBuffer[i]; // tabela wattości t dla segmentów
|
||||||
fOffset = 0.1 / fLength; // pierwsze 10cm
|
fOffset = 0.1 / fLength; // pierwsze 10cm
|
||||||
pos1 = FastGetPoint(t); // wektor początku segmentu
|
pos1 = FastGetPoint(t); // wektor początku segmentu
|
||||||
dir = FastGetDirection(t, fOffset); // wektor kierunku
|
dir = FastGetDirection(t, fOffset); // wektor kierunku
|
||||||
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //wektor prostopadły
|
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //wektor prostopadły
|
||||||
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
||||||
if (iEnd == 0)
|
if (iEnd == 0)
|
||||||
iEnd = iSegCount;
|
iEnd = iSegCount;
|
||||||
@@ -725,23 +725,23 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int
|
|||||||
jmm2 = 1.0 - m2;
|
jmm2 = 1.0 - m2;
|
||||||
while (i < iEnd)
|
while (i < iEnd)
|
||||||
{
|
{
|
||||||
++i; // kolejny punkt łamanej
|
++i; // kolejny punkt łamanej
|
||||||
s += step; // końcowa pozycja segmentu [m]
|
s += step; // końcowa pozycja segmentu [m]
|
||||||
m1 = m2;
|
m1 = m2;
|
||||||
jmm1 = jmm2; // stara pozycja
|
jmm1 = jmm2; // stara pozycja
|
||||||
m2 = s / fEnd;
|
m2 = s / fEnd;
|
||||||
jmm2 = 1.0 - m2; // nowa pozycja
|
jmm2 = 1.0 - m2; // nowa pozycja
|
||||||
if (i == iEnd)
|
if (i == iEnd)
|
||||||
{ // gdy przekroczyliśmy koniec - stąd dziury w torach...
|
{ // gdy przekroczyliśmy koniec - stąd dziury w torach...
|
||||||
step -= (s - fEnd); // jeszcze do wyliczenia mapowania potrzebny
|
step -= (s - fEnd); // jeszcze do wyliczenia mapowania potrzebny
|
||||||
s = fEnd;
|
s = fEnd;
|
||||||
// i=iEnd; //20/5 ma dawać 4
|
// i=iEnd; //20/5 ma dawać 4
|
||||||
m2 = 1.0;
|
m2 = 1.0;
|
||||||
jmm2 = 0.0;
|
jmm2 = 0.0;
|
||||||
}
|
}
|
||||||
while (tv1 < 0.0)
|
while (tv1 < 0.0)
|
||||||
tv1 += 1.0;
|
tv1 += 1.0;
|
||||||
tv2 = tv1 - step / fTextureLength; // mapowanie na końcu segmentu
|
tv2 = tv1 - step / fTextureLength; // mapowanie na końcu segmentu
|
||||||
t = fTsBuffer[i]; // szybsze od GetTFromS(s);
|
t = fTsBuffer[i]; // szybsze od GetTFromS(s);
|
||||||
pos2 = FastGetPoint(t);
|
pos2 = FastGetPoint(t);
|
||||||
dir = FastGetDirection(t, fOffset); // nowy wektor kierunku
|
dir = FastGetDirection(t, fOffset); // nowy wektor kierunku
|
||||||
@@ -749,7 +749,7 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int
|
|||||||
parallel2 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
parallel2 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
||||||
if (trapez)
|
if (trapez)
|
||||||
for (j = 0; j < iNumShapePoints; j++)
|
for (j = 0; j < iNumShapePoints; j++)
|
||||||
{ // współrzędne początku
|
{ // współrzędne początku
|
||||||
norm = (jmm1 * ShapePoints[j].n.x + m1 * ShapePoints[j + iNumShapePoints].n.x) *
|
norm = (jmm1 * ShapePoints[j].n.x + m1 * ShapePoints[j + iNumShapePoints].n.x) *
|
||||||
parallel1;
|
parallel1;
|
||||||
norm.y += jmm1 * ShapePoints[j].n.y + m1 * ShapePoints[j + iNumShapePoints].n.y;
|
norm.y += jmm1 * ShapePoints[j].n.y + m1 * ShapePoints[j + iNumShapePoints].n.y;
|
||||||
@@ -764,9 +764,9 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int
|
|||||||
Vert->v = tv1;
|
Vert->v = tv1;
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na początku odcinka
|
Vert->z = pt.z; // punkt na początku odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
// dla trapezu drugi koniec ma inne współrzędne względne
|
// dla trapezu drugi koniec ma inne współrzędne względne
|
||||||
norm = (jmm1 * ShapePoints[j].n.x + m1 * ShapePoints[j + iNumShapePoints].n.x) *
|
norm = (jmm1 * ShapePoints[j].n.x + m1 * ShapePoints[j + iNumShapePoints].n.x) *
|
||||||
parallel2;
|
parallel2;
|
||||||
norm.y += jmm1 * ShapePoints[j].n.y + m1 * ShapePoints[j + iNumShapePoints].n.y;
|
norm.y += jmm1 * ShapePoints[j].n.y + m1 * ShapePoints[j + iNumShapePoints].n.y;
|
||||||
@@ -781,12 +781,12 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int
|
|||||||
Vert->v = tv2;
|
Vert->v = tv2;
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na końcu odcinka
|
Vert->z = pt.z; // punkt na końcu odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
for (j = 0; j < iNumShapePoints; j++)
|
for (j = 0; j < iNumShapePoints; j++)
|
||||||
{ // współrzędne początku
|
{ // współrzędne początku
|
||||||
norm = ShapePoints[j].n.x * parallel1;
|
norm = ShapePoints[j].n.x * parallel1;
|
||||||
norm.y += ShapePoints[j].n.y;
|
norm.y += ShapePoints[j].n.y;
|
||||||
pt = parallel1 * (ShapePoints[j].x - fOffsetX) + pos1;
|
pt = parallel1 * (ShapePoints[j].x - fOffsetX) + pos1;
|
||||||
@@ -798,7 +798,7 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int
|
|||||||
Vert->v = tv1;
|
Vert->v = tv1;
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na początku odcinka
|
Vert->z = pt.z; // punkt na początku odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
norm = ShapePoints[j].n.x * parallel2;
|
norm = ShapePoints[j].n.x * parallel2;
|
||||||
norm.y += ShapePoints[j].n.y;
|
norm.y += ShapePoints[j].n.y;
|
||||||
@@ -811,7 +811,7 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int
|
|||||||
Vert->v = tv2;
|
Vert->v = tv2;
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na końcu odcinka
|
Vert->z = pt.z; // punkt na końcu odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
}
|
}
|
||||||
pos1 = pos2;
|
pos1 = pos2;
|
||||||
@@ -840,14 +840,14 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int
|
|||||||
Vert->v = 0;
|
Vert->v = 0;
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na początku odcinka
|
Vert->z = pt.z; // punkt na początku odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
// dla trapezu drugi koniec ma inne współrzędne
|
// dla trapezu drugi koniec ma inne współrzędne
|
||||||
norm = ShapePoints[j + iNumShapePoints].n.x * parallel1;
|
norm = ShapePoints[j + iNumShapePoints].n.x * parallel1;
|
||||||
norm.y += ShapePoints[j + iNumShapePoints].n.y;
|
norm.y += ShapePoints[j + iNumShapePoints].n.y;
|
||||||
pt = parallel1 * (ShapePoints[j + iNumShapePoints].x - fOffsetX) +
|
pt = parallel1 * (ShapePoints[j + iNumShapePoints].x - fOffsetX) +
|
||||||
pos2; // odsunięcie
|
pos2; // odsunięcie
|
||||||
pt.y += ShapePoints[j + iNumShapePoints].y; // wysokość
|
pt.y += ShapePoints[j + iNumShapePoints].y; // wysokość
|
||||||
Vert->nx = norm.x; // niekoniecznie tak
|
Vert->nx = norm.x; // niekoniecznie tak
|
||||||
Vert->ny = norm.y;
|
Vert->ny = norm.y;
|
||||||
Vert->nz = norm.z;
|
Vert->nz = norm.z;
|
||||||
@@ -855,7 +855,7 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int
|
|||||||
Vert->v = fLength / fTextureLength;
|
Vert->v = fLength / fTextureLength;
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na końcu odcinka
|
Vert->z = pt.z; // punkt na końcu odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -872,7 +872,7 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int
|
|||||||
Vert->v = 0;
|
Vert->v = 0;
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na początku odcinka
|
Vert->z = pt.z; // punkt na początku odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
pt = parallel1 * (ShapePoints[j].x - fOffsetX) + pos2;
|
pt = parallel1 * (ShapePoints[j].x - fOffsetX) + pos2;
|
||||||
pt.y += ShapePoints[j].y;
|
pt.y += ShapePoints[j].y;
|
||||||
@@ -883,7 +883,7 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int
|
|||||||
Vert->v = fLength / fTextureLength;
|
Vert->v = fLength / fTextureLength;
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na końcu odcinka
|
Vert->z = pt.z; // punkt na końcu odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -891,23 +891,23 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int
|
|||||||
|
|
||||||
void TSegment::RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints,
|
void TSegment::RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints,
|
||||||
double fTextureLength, int iSkip, int iEnd, double fOffsetX)
|
double fTextureLength, int iSkip, int iEnd, double fOffsetX)
|
||||||
{ // jak wyżej, tylko z pominięciem mapowania i braku trapezowania
|
{ // jak wyżej, tylko z pominięciem mapowania i braku trapezowania
|
||||||
vector3 pos1, pos2, dir, parallel1, parallel2, pt;
|
vector3 pos1, pos2, dir, parallel1, parallel2, pt;
|
||||||
double s, step, fOffset, t, fEnd;
|
double s, step, fOffset, t, fEnd;
|
||||||
int i, j;
|
int i, j;
|
||||||
bool trapez = iNumShapePoints < 0; // sygnalizacja trapezowatości
|
bool trapez = iNumShapePoints < 0; // sygnalizacja trapezowatości
|
||||||
iNumShapePoints = abs(iNumShapePoints);
|
iNumShapePoints = abs(iNumShapePoints);
|
||||||
if (bCurve)
|
if (bCurve)
|
||||||
{
|
{
|
||||||
double m1, jmm1, m2, jmm2; // pozycje względne na odcinku 0...1 (ale nie parametr Beziera)
|
double m1, jmm1, m2, jmm2; // pozycje względne na odcinku 0...1 (ale nie parametr Beziera)
|
||||||
step = fStep;
|
step = fStep;
|
||||||
s = fStep * iSkip; // iSkip - ile odcinków z początku pominąć
|
s = fStep * iSkip; // iSkip - ile odcinków z początku pominąć
|
||||||
i = iSkip; // domyślnie 0
|
i = iSkip; // domyślnie 0
|
||||||
t = fTsBuffer[i]; // tabela wattości t dla segmentów
|
t = fTsBuffer[i]; // tabela wattości t dla segmentów
|
||||||
fOffset = 0.1 / fLength; // pierwsze 10cm
|
fOffset = 0.1 / fLength; // pierwsze 10cm
|
||||||
pos1 = FastGetPoint(t); // wektor początku segmentu
|
pos1 = FastGetPoint(t); // wektor początku segmentu
|
||||||
dir = FastGetDirection(t, fOffset); // wektor kierunku
|
dir = FastGetDirection(t, fOffset); // wektor kierunku
|
||||||
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //wektor prostopadły
|
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //wektor prostopadły
|
||||||
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
||||||
if (iEnd == 0)
|
if (iEnd == 0)
|
||||||
iEnd = iSegCount;
|
iEnd = iSegCount;
|
||||||
@@ -916,17 +916,17 @@ void TSegment::RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, int iN
|
|||||||
jmm2 = 1.0 - m2;
|
jmm2 = 1.0 - m2;
|
||||||
while (i < iEnd)
|
while (i < iEnd)
|
||||||
{
|
{
|
||||||
++i; // kolejny punkt łamanej
|
++i; // kolejny punkt łamanej
|
||||||
s += step; // końcowa pozycja segmentu [m]
|
s += step; // końcowa pozycja segmentu [m]
|
||||||
m1 = m2;
|
m1 = m2;
|
||||||
jmm1 = jmm2; // stara pozycja
|
jmm1 = jmm2; // stara pozycja
|
||||||
m2 = s / fEnd;
|
m2 = s / fEnd;
|
||||||
jmm2 = 1.0 - m2; // nowa pozycja
|
jmm2 = 1.0 - m2; // nowa pozycja
|
||||||
if (i == iEnd)
|
if (i == iEnd)
|
||||||
{ // gdy przekroczyliśmy koniec - stąd dziury w torach...
|
{ // gdy przekroczyliśmy koniec - stąd dziury w torach...
|
||||||
step -= (s - fEnd); // jeszcze do wyliczenia mapowania potrzebny
|
step -= (s - fEnd); // jeszcze do wyliczenia mapowania potrzebny
|
||||||
s = fEnd;
|
s = fEnd;
|
||||||
// i=iEnd; //20/5 ma dawać 4
|
// i=iEnd; //20/5 ma dawać 4
|
||||||
m2 = 1.0;
|
m2 = 1.0;
|
||||||
jmm2 = 0.0;
|
jmm2 = 0.0;
|
||||||
}
|
}
|
||||||
@@ -937,23 +937,23 @@ void TSegment::RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, int iN
|
|||||||
parallel2 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
parallel2 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
|
||||||
if (trapez)
|
if (trapez)
|
||||||
for (j = 0; j < iNumShapePoints; j++)
|
for (j = 0; j < iNumShapePoints; j++)
|
||||||
{ // współrzędne początku
|
{ // współrzędne początku
|
||||||
pt = parallel1 * (jmm1 * (ShapePoints[j].x - fOffsetX) +
|
pt = parallel1 * (jmm1 * (ShapePoints[j].x - fOffsetX) +
|
||||||
m1 * ShapePoints[j + iNumShapePoints].x) +
|
m1 * ShapePoints[j + iNumShapePoints].x) +
|
||||||
pos1;
|
pos1;
|
||||||
pt.y += jmm1 * ShapePoints[j].y + m1 * ShapePoints[j + iNumShapePoints].y;
|
pt.y += jmm1 * ShapePoints[j].y + m1 * ShapePoints[j + iNumShapePoints].y;
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na początku odcinka
|
Vert->z = pt.z; // punkt na początku odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
// dla trapezu drugi koniec ma inne współrzędne
|
// dla trapezu drugi koniec ma inne współrzędne
|
||||||
pt = parallel2 * (jmm2 * (ShapePoints[j].x - fOffsetX) +
|
pt = parallel2 * (jmm2 * (ShapePoints[j].x - fOffsetX) +
|
||||||
m2 * ShapePoints[j + iNumShapePoints].x) +
|
m2 * ShapePoints[j + iNumShapePoints].x) +
|
||||||
pos2;
|
pos2;
|
||||||
pt.y += jmm2 * ShapePoints[j].y + m2 * ShapePoints[j + iNumShapePoints].y;
|
pt.y += jmm2 * ShapePoints[j].y + m2 * ShapePoints[j + iNumShapePoints].y;
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na końcu odcinka
|
Vert->z = pt.z; // punkt na końcu odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
}
|
}
|
||||||
pos1 = pos2;
|
pos1 = pos2;
|
||||||
@@ -974,14 +974,14 @@ void TSegment::RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, int iN
|
|||||||
pt.y += ShapePoints[j].y;
|
pt.y += ShapePoints[j].y;
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na początku odcinka
|
Vert->z = pt.z; // punkt na początku odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
pt = parallel1 * (ShapePoints[j + iNumShapePoints].x - fOffsetX) +
|
pt = parallel1 * (ShapePoints[j + iNumShapePoints].x - fOffsetX) +
|
||||||
pos2; // odsunięcie
|
pos2; // odsunięcie
|
||||||
pt.y += ShapePoints[j + iNumShapePoints].y; // wysokość
|
pt.y += ShapePoints[j + iNumShapePoints].y; // wysokość
|
||||||
Vert->x = pt.x;
|
Vert->x = pt.x;
|
||||||
Vert->y = pt.y;
|
Vert->y = pt.y;
|
||||||
Vert->z = pt.z; // punkt na końcu odcinka
|
Vert->z = pt.z; // punkt na końcu odcinka
|
||||||
Vert++;
|
Vert++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
36
Segment.h
36
Segment.h
@@ -16,7 +16,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
|
|
||||||
using namespace Math3D;
|
using namespace Math3D;
|
||||||
|
|
||||||
// 110405 Ra: klasa punktów przekroju z normalnymi
|
// 110405 Ra: klasa punktów przekroju z normalnymi
|
||||||
|
|
||||||
class vector6 : public vector3
|
class vector6 : public vector3
|
||||||
{ // punkt przekroju wraz z wektorem normalnym
|
{ // punkt przekroju wraz z wektorem normalnym
|
||||||
@@ -36,7 +36,7 @@ class vector6 : public vector3
|
|||||||
n.x = 0.0;
|
n.x = 0.0;
|
||||||
n.y = 1.0;
|
n.y = 1.0;
|
||||||
n.z = 0.0;
|
n.z = 0.0;
|
||||||
}; // Ra: bo na razie s¹ z tym problemy
|
}; // Ra: bo na razie są z tym problemy
|
||||||
vector6(double a, double b, double c)
|
vector6(double a, double b, double c)
|
||||||
{
|
{
|
||||||
x = a;
|
x = a;
|
||||||
@@ -52,29 +52,29 @@ 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, fRoll2; // przechyłka na końcach
|
||||||
double fLength; // d³ugoœæ policzona
|
double fLength; // długość policzona
|
||||||
double *fTsBuffer; // wartoœci parametru krzywej dla równych odcinków
|
double *fTsBuffer; // wartości parametru krzywej dla równych odcinków
|
||||||
double fStep;
|
double fStep;
|
||||||
int iSegCount; // iloœæ odcinków do rysowania krzywej
|
int iSegCount; // ilość odcinków do rysowania krzywej
|
||||||
double fDirection; // Ra: k¹t prostego w planie; dla ³uku k¹t od Point1
|
double fDirection; // Ra: kąt prostego w planie; dla łuku kąt od Point1
|
||||||
double fStoop; // Ra: k¹t wzniesienia; dla ³uku od Point1
|
double fStoop; // 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; // 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);
|
||||||
vector3 RaInterpolate(double t);
|
vector3 RaInterpolate(double t);
|
||||||
vector3 RaInterpolate0(double t);
|
vector3 RaInterpolate0(double t);
|
||||||
// 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;
|
||||||
// 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);
|
||||||
~TSegment();
|
~TSegment();
|
||||||
bool Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, double fNewRoll1 = 0,
|
bool Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, double fNewRoll1 = 0,
|
||||||
@@ -113,7 +113,7 @@ class TSegment
|
|||||||
return ((1.0 - s) * fRoll1 + s * fRoll2);
|
return ((1.0 - s) * fRoll1 + s * fRoll2);
|
||||||
}
|
}
|
||||||
void GetRolls(double &r1, double &r2)
|
void GetRolls(double &r1, double &r2)
|
||||||
{ // pobranie przechy³ek (do generowania trójk¹tów)
|
{ // pobranie przechyłek (do generowania trójkątów)
|
||||||
r1 = fRoll1;
|
r1 = fRoll1;
|
||||||
r2 = fRoll2;
|
r2 = fRoll2;
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ class TSegment
|
|||||||
{
|
{
|
||||||
fAngle[i] = a;
|
fAngle[i] = a;
|
||||||
};
|
};
|
||||||
void Rollment(double w1, double w2); // poprawianie przechy³ki
|
void Rollment(double w1, double w2); // poprawianie przechyłki
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|||||||
24
Sound.cpp
24
Sound.cpp
@@ -35,9 +35,9 @@ TSoundContainer *TSoundsManager::First = NULL;
|
|||||||
|
|
||||||
TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, const char *Directory, const char *strFileName,
|
TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, const char *Directory, const char *strFileName,
|
||||||
int NConcurrent)
|
int NConcurrent)
|
||||||
{ // wczytanie pliku dŸwiêkowego
|
{ // wczytanie pliku dźwiękowego
|
||||||
int hr = 111;
|
int hr = 111;
|
||||||
DSBuffer = NULL; // na pocz¹tek, gdyby uruchomiæ dŸwiêków siê nie uda³o
|
DSBuffer = NULL; // na początek, gdyby uruchomić dźwięków się nie udało
|
||||||
|
|
||||||
Concurrent = NConcurrent;
|
Concurrent = NConcurrent;
|
||||||
|
|
||||||
@@ -70,8 +70,8 @@ TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, const char *Directory, const
|
|||||||
ZeroMemory(&dsbd, sizeof(DSBUFFERDESC));
|
ZeroMemory(&dsbd, sizeof(DSBUFFERDESC));
|
||||||
dsbd.dwSize = sizeof(DSBUFFERDESC);
|
dsbd.dwSize = sizeof(DSBUFFERDESC);
|
||||||
dsbd.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY;
|
dsbd.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY;
|
||||||
if (!Global::bInactivePause) // jeœli prze³¹czony w t³o ma nadal dzia³aæ
|
if (!Global::bInactivePause) // jeśli przełączony w tło ma nadal działać
|
||||||
dsbd.dwFlags |= DSBCAPS_GLOBALFOCUS; // to dŸwiêki maj¹ byæ równie¿ s³yszalne
|
dsbd.dwFlags |= DSBCAPS_GLOBALFOCUS; // to dźwięki mają być również słyszalne
|
||||||
dsbd.dwBufferBytes = pWaveSoundRead->m_ckIn.cksize;
|
dsbd.dwBufferBytes = pWaveSoundRead->m_ckIn.cksize;
|
||||||
dsbd.lpwfxFormat = pWaveSoundRead->m_pwfx;
|
dsbd.lpwfxFormat = pWaveSoundRead->m_pwfx;
|
||||||
fSamplingRate = pWaveSoundRead->m_pwfx->nSamplesPerSec;
|
fSamplingRate = pWaveSoundRead->m_pwfx->nSamplesPerSec;
|
||||||
@@ -167,7 +167,7 @@ LPDIRECTSOUNDBUFFER TSoundContainer::GetUnique(LPDIRECTSOUND pDS)
|
|||||||
{
|
{
|
||||||
if (!DSBuffer)
|
if (!DSBuffer)
|
||||||
return NULL;
|
return NULL;
|
||||||
// jeœli siê dobrze zainicjowa³o
|
// jeśli się dobrze zainicjowało
|
||||||
LPDIRECTSOUNDBUFFER buff;
|
LPDIRECTSOUNDBUFFER buff;
|
||||||
pDS->DuplicateSoundBuffer(DSBuffer, &buff);
|
pDS->DuplicateSoundBuffer(DSBuffer, &buff);
|
||||||
if (buff)
|
if (buff)
|
||||||
@@ -196,7 +196,7 @@ TSoundContainer * TSoundsManager::LoadFromFile(const char *Dir, const char *Name
|
|||||||
};
|
};
|
||||||
|
|
||||||
void TSoundsManager::LoadSounds(char *Directory)
|
void TSoundsManager::LoadSounds(char *Directory)
|
||||||
{ // wczytanie wszystkich plików z katalogu - ma³o elastyczne
|
{ // wczytanie wszystkich plików z katalogu - mało elastyczne
|
||||||
WIN32_FIND_DATA FindFileData;
|
WIN32_FIND_DATA FindFileData;
|
||||||
HANDLE handle = FindFirstFile("sounds\\*.wav", &FindFileData);
|
HANDLE handle = FindFirstFile("sounds\\*.wav", &FindFileData);
|
||||||
if (handle != INVALID_HANDLE_VALUE)
|
if (handle != INVALID_HANDLE_VALUE)
|
||||||
@@ -208,10 +208,10 @@ void TSoundsManager::LoadSounds(char *Directory)
|
|||||||
};
|
};
|
||||||
|
|
||||||
LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(const char *Name, bool Dynamic, float *fSamplingRate)
|
LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(const char *Name, bool Dynamic, float *fSamplingRate)
|
||||||
{ // wyszukanie dŸwiêku w pamiêci albo wczytanie z pliku
|
{ // wyszukanie dźwięku w pamięci albo wczytanie z pliku
|
||||||
std::string file;
|
std::string file;
|
||||||
if (Dynamic)
|
if (Dynamic)
|
||||||
{ // próba wczytania z katalogu pojazdu
|
{ // próba wczytania z katalogu pojazdu
|
||||||
file = Global::asCurrentDynamicPath + Name;
|
file = Global::asCurrentDynamicPath + Name;
|
||||||
if (FileExists(file))
|
if (FileExists(file))
|
||||||
Name = file.c_str(); // nowa nazwa
|
Name = file.c_str(); // nowa nazwa
|
||||||
@@ -225,7 +225,7 @@ LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(const char *Name, bool Dynamic,
|
|||||||
if (strcmp(Name, Next->Name) == 0)
|
if (strcmp(Name, Next->Name) == 0)
|
||||||
{
|
{
|
||||||
if (fSamplingRate)
|
if (fSamplingRate)
|
||||||
*fSamplingRate = Next->fSamplingRate; // czêstotliwoœæ
|
*fSamplingRate = Next->fSamplingRate; // częstotliwość
|
||||||
return (Next->GetUnique(pDS));
|
return (Next->GetUnique(pDS));
|
||||||
// DSBuffers.
|
// DSBuffers.
|
||||||
/*
|
/*
|
||||||
@@ -260,7 +260,7 @@ LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(const char *Name, bool Dynamic,
|
|||||||
if (Next)
|
if (Next)
|
||||||
{ //
|
{ //
|
||||||
if (fSamplingRate)
|
if (fSamplingRate)
|
||||||
*fSamplingRate = Next->fSamplingRate; // czêstotliwoœæ
|
*fSamplingRate = Next->fSamplingRate; // częstotliwość
|
||||||
return Next->GetUnique(pDS);
|
return Next->GetUnique(pDS);
|
||||||
}
|
}
|
||||||
ErrorLog("Missed sound: " + std::string(Name) );
|
ErrorLog("Missed sound: " + std::string(Name) );
|
||||||
@@ -353,8 +353,8 @@ void TSoundsManager::Init(HWND hWnd)
|
|||||||
ZeroMemory(&dsbd, sizeof(DSBUFFERDESC));
|
ZeroMemory(&dsbd, sizeof(DSBUFFERDESC));
|
||||||
dsbd.dwSize = sizeof(DSBUFFERDESC);
|
dsbd.dwSize = sizeof(DSBUFFERDESC);
|
||||||
dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER;
|
dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER;
|
||||||
if (!Global::bInactivePause) // jeœli prze³¹czony w t³o ma nadal dzia³aæ
|
if (!Global::bInactivePause) // jeśli przełączony w tło ma nadal działać
|
||||||
dsbd.dwFlags |= DSBCAPS_GLOBALFOCUS; // to dŸwiêki maj¹ byæ równie¿ s³yszalne
|
dsbd.dwFlags |= DSBCAPS_GLOBALFOCUS; // to dźwięki mają być również słyszalne
|
||||||
dsbd.dwBufferBytes = 0;
|
dsbd.dwBufferBytes = 0;
|
||||||
dsbd.lpwfxFormat = NULL;
|
dsbd.lpwfxFormat = NULL;
|
||||||
|
|
||||||
|
|||||||
4
Sound.h
4
Sound.h
@@ -27,8 +27,8 @@ class TSoundContainer
|
|||||||
int Oldest;
|
int Oldest;
|
||||||
char Name[80];
|
char Name[80];
|
||||||
LPDIRECTSOUNDBUFFER DSBuffer;
|
LPDIRECTSOUNDBUFFER DSBuffer;
|
||||||
float fSamplingRate; // czêstotliwoœæ odczytana z pliku
|
float fSamplingRate; // częstotliwość odczytana z pliku
|
||||||
int iBitsPerSample; // ile bitów na próbkê
|
int iBitsPerSample; // ile bitów na próbkę
|
||||||
TSoundContainer *Next;
|
TSoundContainer *Next;
|
||||||
std::stack<LPDIRECTSOUNDBUFFER> DSBuffers;
|
std::stack<LPDIRECTSOUNDBUFFER> DSBuffers;
|
||||||
LPDIRECTSOUNDBUFFER GetUnique(LPDIRECTSOUND pDS);
|
LPDIRECTSOUNDBUFFER GetUnique(LPDIRECTSOUND pDS);
|
||||||
|
|||||||
262
Texture.cpp
262
Texture.cpp
@@ -38,7 +38,7 @@ TTexturesManager::Names::iterator TTexturesManager::LoadFromFile(std::string fil
|
|||||||
|
|
||||||
std::string realFileName(fileName);
|
std::string realFileName(fileName);
|
||||||
std::ifstream file(fileName.c_str());
|
std::ifstream file(fileName.c_str());
|
||||||
// Ra: niby bez tego jest lepiej, ale dzia³a gorzej, wiêc przywrócone jest oryginalne
|
// Ra: niby bez tego jest lepiej, ale działa gorzej, więc przywrócone jest oryginalne
|
||||||
if (!file.is_open())
|
if (!file.is_open())
|
||||||
realFileName.insert(0, szTexturePath);
|
realFileName.insert(0, szTexturePath);
|
||||||
else
|
else
|
||||||
@@ -47,7 +47,7 @@ TTexturesManager::Names::iterator TTexturesManager::LoadFromFile(std::string fil
|
|||||||
// char* cFileName = const_cast<char*>(fileName.c_str());
|
// char* cFileName = const_cast<char*>(fileName.c_str());
|
||||||
|
|
||||||
message += realFileName;
|
message += realFileName;
|
||||||
WriteLog(message.c_str()); // Ra: chybaa mia³o byæ z komunikatem z przodu, a nie tylko nazwa
|
WriteLog(message.c_str()); // Ra: chybaa miało być z komunikatem z przodu, a nie tylko nazwa
|
||||||
|
|
||||||
size_t pos = fileName.rfind('.');
|
size_t pos = fileName.rfind('.');
|
||||||
std::string ext(fileName, pos + 1, std::string::npos);
|
std::string ext(fileName, pos + 1, std::string::npos);
|
||||||
@@ -64,7 +64,7 @@ TTexturesManager::Names::iterator TTexturesManager::LoadFromFile(std::string fil
|
|||||||
texinfo = LoadDDS(realFileName, filter);
|
texinfo = LoadDDS(realFileName, filter);
|
||||||
|
|
||||||
_alphas.insert(
|
_alphas.insert(
|
||||||
texinfo); // zapamiêtanie stanu przezroczystoœci tekstury - mo¿na by tylko przezroczyste
|
texinfo); // zapamiętanie stanu przezroczystości tekstury - można by tylko przezroczyste
|
||||||
std::pair<Names::iterator, bool> ret = _names.insert(std::make_pair(fileName, texinfo.first));
|
std::pair<Names::iterator, bool> ret = _names.insert(std::make_pair(fileName, texinfo.first));
|
||||||
|
|
||||||
if (!texinfo.first)
|
if (!texinfo.first)
|
||||||
@@ -91,44 +91,44 @@ struct ReplaceSlash
|
|||||||
};
|
};
|
||||||
|
|
||||||
GLuint TTexturesManager::GetTextureID(char *dir, char *where, std::string fileName, int filter)
|
GLuint TTexturesManager::GetTextureID(char *dir, char *where, std::string fileName, int filter)
|
||||||
{ // ustalenie numeru tekstury, wczytanie jeœli nie jeszcze takiej nie by³o
|
{ // ustalenie numeru tekstury, wczytanie jeśli nie jeszcze takiej nie było
|
||||||
/*
|
/*
|
||||||
// Ra: niby tak jest lepiej, ale dzia³a gorzej, wiêc przywrócone jest oryginalne
|
// Ra: niby tak jest lepiej, ale działa gorzej, więc przywrócone jest oryginalne
|
||||||
//najpierw szukamy w katalogu, z którego wywo³ywana jest tekstura, potem z wy¿szego
|
//najpierw szukamy w katalogu, z którego wywoływana jest tekstura, potem z wyższego
|
||||||
//Ra: przerobiæ na wyszukiwanie w drzewie nazw, do którego zapisywaæ np. rozmiary,
|
//Ra: przerobić na wyszukiwanie w drzewie nazw, do którego zapisywać np. rozmiary,
|
||||||
przezroczystoϾ
|
przezroczystość
|
||||||
//Ra: ustalaæ, które tekstury mo¿na wczytaæ ju¿ w trakcie symulacji
|
//Ra: ustalać, które tekstury można wczytać już w trakcie symulacji
|
||||||
size_t pos=fileName.find(':'); //szukamy dwukropka
|
size_t pos=fileName.find(':'); //szukamy dwukropka
|
||||||
if (pos!=std::string::npos) //po dwukropku mog¹ byæ podane dodatkowe informacje
|
if (pos!=std::string::npos) //po dwukropku mogą być podane dodatkowe informacje
|
||||||
fileName=fileName.substr(0,pos); //niebêd¹ce nazw¹ tekstury
|
fileName=fileName.substr(0,pos); //niebędące nazwą tekstury
|
||||||
std::transform(fileName.begin(),fileName.end(),fileName.begin(),ReplaceSlash()); //zamiana "/"
|
std::transform(fileName.begin(),fileName.end(),fileName.begin(),ReplaceSlash()); //zamiana "/"
|
||||||
na "\"
|
na "\"
|
||||||
//jeœli bie¿aca œcie¿ka do tekstur nie zosta³a dodana to dodajemy domyœln¹
|
//jeśli bieżaca ścieżka do tekstur nie została dodana to dodajemy domyślną
|
||||||
//if (fileName.find('\\')==std::string::npos) //bz sensu
|
//if (fileName.find('\\')==std::string::npos) //bz sensu
|
||||||
// fileName.insert(0,szDefaultTexturePath);
|
// fileName.insert(0,szDefaultTexturePath);
|
||||||
//najpierw szukamy w podanym katalogu, potem w domyœlnym
|
//najpierw szukamy w podanym katalogu, potem w domyślnym
|
||||||
Names::iterator iter;
|
Names::iterator iter;
|
||||||
std::ifstream file;
|
std::ifstream file;
|
||||||
if ((fileName.find('.')==fileName.npos)?true:(fileName.rfind('.')<fileName.rfind('\\')))
|
if ((fileName.find('.')==fileName.npos)?true:(fileName.rfind('.')<fileName.rfind('\\')))
|
||||||
//pierwsza kropka od prawej jest wczeœniej ni¿ "\"
|
//pierwsza kropka od prawej jest wcześniej niż "\"
|
||||||
{//Ra: jeœli nie ma kropki w nazwie pliku, wypróbowanie rozszerzeñ po kolei, zaczynaj¹c od
|
{//Ra: jeśli nie ma kropki w nazwie pliku, wypróbowanie rozszerzeń po kolei, zaczynając od
|
||||||
domyœlnego
|
domyślnego
|
||||||
fileName.append("."); //kropkê trzeba dodaæ na pewno, resztê trzeba próbowaæ
|
fileName.append("."); //kropkę trzeba dodać na pewno, resztę trzeba próbować
|
||||||
std::string test; //zmienna robocza
|
std::string test; //zmienna robocza
|
||||||
for (int i=0;i<4;++i)
|
for (int i=0;i<4;++i)
|
||||||
{//najpierw szukamy w magazynie
|
{//najpierw szukamy w magazynie
|
||||||
test=fileName;
|
test=fileName;
|
||||||
if (where) test.insert(0,where); //œcie¿ka obiektu wywo³uj¹cego
|
if (where) test.insert(0,where); //ścieżka obiektu wywołującego
|
||||||
test.append(Global::szDefaultExt[i]); //dodanie jednego z kilku rozszerzeñ
|
test.append(Global::szDefaultExt[i]); //dodanie jednego z kilku rozszerzeń
|
||||||
iter=_names.find(test); //czy mamy ju¿ w magazynie?
|
iter=_names.find(test); //czy mamy już w magazynie?
|
||||||
if (iter!=_names.end())
|
if (iter!=_names.end())
|
||||||
return iter->second; //znalezione!
|
return iter->second; //znalezione!
|
||||||
if (dir)
|
if (dir)
|
||||||
{//mo¿e we wskazanym katalogu?
|
{//może we wskazanym katalogu?
|
||||||
test=fileName;
|
test=fileName;
|
||||||
test.insert(0,dir); //jeszcze próba z dodatkow¹ œcie¿k¹
|
test.insert(0,dir); //jeszcze próba z dodatkową ścieżką
|
||||||
test.append(Global::szDefaultExt[i]); //dodanie jednego z kilku rozszerzeñ
|
test.append(Global::szDefaultExt[i]); //dodanie jednego z kilku rozszerzeń
|
||||||
iter=_names.find(test); //czy mamy ju¿ w magazynie?
|
iter=_names.find(test); //czy mamy już w magazynie?
|
||||||
if (iter!=_names.end())
|
if (iter!=_names.end())
|
||||||
return iter->second; //znalezione!
|
return iter->second; //znalezione!
|
||||||
}
|
}
|
||||||
@@ -136,19 +136,19 @@ GLuint TTexturesManager::GetTextureID(char *dir, char *where, std::string fileNa
|
|||||||
//for (int i=0;i<4;++i)
|
//for (int i=0;i<4;++i)
|
||||||
//{//w magazynie nie ma, to sprawdzamy na dysku
|
//{//w magazynie nie ma, to sprawdzamy na dysku
|
||||||
test=fileName;
|
test=fileName;
|
||||||
if (where) test.insert(0,where); //œcie¿ka obiektu wywo³uj¹cego
|
if (where) test.insert(0,where); //ścieżka obiektu wywołującego
|
||||||
test.append(Global::szDefaultExt[i]); //dodanie jednego z kilku rozszerzeñ
|
test.append(Global::szDefaultExt[i]); //dodanie jednego z kilku rozszerzeń
|
||||||
file.open(test.c_str());
|
file.open(test.c_str());
|
||||||
if (!file.is_open())
|
if (!file.is_open())
|
||||||
{test=fileName;
|
{test=fileName;
|
||||||
if (dir) test.insert(0,dir); //próba z dodatkow¹ œcie¿k¹
|
if (dir) test.insert(0,dir); //próba z dodatkową ścieżką
|
||||||
test.append(Global::szDefaultExt[i]); //dodanie jednego z kilku rozszerzeñ
|
test.append(Global::szDefaultExt[i]); //dodanie jednego z kilku rozszerzeń
|
||||||
file.open(test.c_str());
|
file.open(test.c_str());
|
||||||
}
|
}
|
||||||
if (file.is_open())
|
if (file.is_open())
|
||||||
{//jak znaleziony, to plik zostaje otwarty
|
{//jak znaleziony, to plik zostaje otwarty
|
||||||
fileName=test; //zapamiêtanie znalezionego rozszerzenia
|
fileName=test; //zapamiętanie znalezionego rozszerzenia
|
||||||
break; //wyjœcie z pêtli na etapie danego rozszerzenia
|
break; //wyjście z pętli na etapie danego rozszerzenia
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -157,23 +157,23 @@ GLuint TTexturesManager::GetTextureID(char *dir, char *where, std::string fileNa
|
|||||||
std::string test; //zmienna robocza
|
std::string test; //zmienna robocza
|
||||||
//najpierw szukamy w magazynie
|
//najpierw szukamy w magazynie
|
||||||
test=fileName;
|
test=fileName;
|
||||||
if (where) test.insert(0,where); //œcie¿ka obiektu wywo³uj¹cego
|
if (where) test.insert(0,where); //ścieżka obiektu wywołującego
|
||||||
iter=_names.find(test); //czy mamy ju¿ w magazynie?
|
iter=_names.find(test); //czy mamy już w magazynie?
|
||||||
if (iter!=_names.end())
|
if (iter!=_names.end())
|
||||||
return iter->second; //znalezione!
|
return iter->second; //znalezione!
|
||||||
test=fileName;
|
test=fileName;
|
||||||
if (dir) test.insert(0,dir); //jeszcze próba z dodatkow¹ œcie¿k¹
|
if (dir) test.insert(0,dir); //jeszcze próba z dodatkową ścieżką
|
||||||
iter=_names.find(test); //czy mamy ju¿ w magazynie?
|
iter=_names.find(test); //czy mamy już w magazynie?
|
||||||
if (iter!=_names.end())
|
if (iter!=_names.end())
|
||||||
return iter->second; //znalezione!
|
return iter->second; //znalezione!
|
||||||
//w magazynie nie ma, to sprawdzamy na dysku
|
//w magazynie nie ma, to sprawdzamy na dysku
|
||||||
test=fileName;
|
test=fileName;
|
||||||
if (where) test.insert(0,where); //œcie¿ka obiektu wywo³uj¹cego
|
if (where) test.insert(0,where); //ścieżka obiektu wywołującego
|
||||||
file.open(test.c_str());
|
file.open(test.c_str());
|
||||||
if (!file.is_open())
|
if (!file.is_open())
|
||||||
{//jak znaleziony, to plik zostaje otwarty
|
{//jak znaleziony, to plik zostaje otwarty
|
||||||
test=fileName;
|
test=fileName;
|
||||||
if (dir) test.insert(0,dir); //próba z dodatkow¹ œcie¿k¹
|
if (dir) test.insert(0,dir); //próba z dodatkową ścieżką
|
||||||
file.open(test.c_str());
|
file.open(test.c_str());
|
||||||
if (file.is_open())
|
if (file.is_open())
|
||||||
fileName=test; //ustalenie nowej nazwy
|
fileName=test; //ustalenie nowej nazwy
|
||||||
@@ -181,34 +181,34 @@ GLuint TTexturesManager::GetTextureID(char *dir, char *where, std::string fileNa
|
|||||||
}
|
}
|
||||||
if (file.is_open())
|
if (file.is_open())
|
||||||
{//plik pozostaje otwarty, gdy znaleziono na dysku
|
{//plik pozostaje otwarty, gdy znaleziono na dysku
|
||||||
file.close(); //mo¿na ju¿ zamkn¹æ
|
file.close(); //można już zamknąć
|
||||||
iter=LoadFromFile(fileName,filter); //doda siê do magazynu i zwróci swoj¹ pozycjê
|
iter=LoadFromFile(fileName,filter); //doda się do magazynu i zwróci swoją pozycję
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
size_t pos = fileName.find(':'); // szukamy dwukropka
|
size_t pos = fileName.find(':'); // szukamy dwukropka
|
||||||
if (pos != std::string::npos) // po dwukropku mog¹ byæ podane dodatkowe informacje
|
if (pos != std::string::npos) // po dwukropku mogą być podane dodatkowe informacje
|
||||||
fileName = fileName.substr(0, pos); // niebêd¹ce nazw¹ tekstury
|
fileName = fileName.substr(0, pos); // niebędące nazwą tekstury
|
||||||
pos = fileName.find('|'); // szukamy separatora tekstur
|
pos = fileName.find('|'); // szukamy separatora tekstur
|
||||||
if (pos != std::string::npos) // po | mo¿e byæ nazwa kolejnej tekstury
|
if (pos != std::string::npos) // po | może być nazwa kolejnej tekstury
|
||||||
fileName = fileName.substr(0, pos); // i trzeba to obci¹æ
|
fileName = fileName.substr(0, pos); // i trzeba to obciąć
|
||||||
std::transform(fileName.begin(), fileName.end(), fileName.begin(), ReplaceSlash());
|
std::transform(fileName.begin(), fileName.end(), fileName.begin(), ReplaceSlash());
|
||||||
// jeœli bie¿aca œcie¿ka do tekstur nie zosta³a dodana to dodajemy domyœln¹
|
// jeśli bieżaca ścieżka do tekstur nie została dodana to dodajemy domyślną
|
||||||
if (fileName.find('\\') == std::string::npos)
|
if (fileName.find('\\') == std::string::npos)
|
||||||
fileName.insert(0, szTexturePath);
|
fileName.insert(0, szTexturePath);
|
||||||
Names::iterator iter;
|
Names::iterator iter;
|
||||||
if (fileName.find('.') == std::string::npos)
|
if (fileName.find('.') == std::string::npos)
|
||||||
{ // Ra: wypróbowanie rozszerzeñ po kolei, zaczynaj¹c od domyœlnego
|
{ // Ra: wypróbowanie rozszerzeń po kolei, zaczynając od domyślnego
|
||||||
fileName.append("."); // kropka bêdze na pewno, resztê trzeba próbowaæ
|
fileName.append("."); // kropka będze na pewno, resztę trzeba próbować
|
||||||
std::string test; // zmienna robocza
|
std::string test; // zmienna robocza
|
||||||
for (int i = 0; i < 4; ++i)
|
for (int i = 0; i < 4; ++i)
|
||||||
{ // najpierw szukamy w magazynie
|
{ // najpierw szukamy w magazynie
|
||||||
test = fileName;
|
test = fileName;
|
||||||
test.append(Global::szDefaultExt[i]);
|
test.append(Global::szDefaultExt[i]);
|
||||||
iter = _names.find(fileName); // czy mamy ju¿ w magazynie?
|
iter = _names.find(fileName); // czy mamy już w magazynie?
|
||||||
if (iter != _names.end())
|
if (iter != _names.end())
|
||||||
return iter->second; // znalezione!
|
return iter->second; // znalezione!
|
||||||
test.insert(0, szTexturePath); // jeszcze próba z dodatkow¹ œcie¿k¹
|
test.insert(0, szTexturePath); // jeszcze próba z dodatkową ścieżką
|
||||||
iter = _names.find(fileName); // czy mamy ju¿ w magazynie?
|
iter = _names.find(fileName); // czy mamy już w magazynie?
|
||||||
if (iter != _names.end())
|
if (iter != _names.end())
|
||||||
return iter->second; // znalezione!
|
return iter->second; // znalezione!
|
||||||
}
|
}
|
||||||
@@ -226,18 +226,18 @@ GLuint TTexturesManager::GetTextureID(char *dir, char *where, std::string fileNa
|
|||||||
{
|
{
|
||||||
fileName.append(Global::szDefaultExt[i]); // dopisanie znalezionego
|
fileName.append(Global::szDefaultExt[i]); // dopisanie znalezionego
|
||||||
file.close();
|
file.close();
|
||||||
break; // wyjœcie z pêtli na etapie danego rozszerzenia
|
break; // wyjście z pętli na etapie danego rozszerzenia
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iter = _names.find(fileName); // czy mamy ju¿ w magazynie
|
iter = _names.find(fileName); // czy mamy już w magazynie
|
||||||
if (iter == _names.end())
|
if (iter == _names.end())
|
||||||
iter = LoadFromFile(fileName, filter);
|
iter = LoadFromFile(fileName, filter);
|
||||||
return (iter != _names.end() ? iter->second : 0);
|
return (iter != _names.end() ? iter->second : 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
bool TTexturesManager::GetAlpha(GLuint id)
|
bool TTexturesManager::GetAlpha(GLuint id)
|
||||||
{ // atrybut przezroczystoœci dla tekstury o podanym numerze (id)
|
{ // atrybut przezroczystości dla tekstury o podanym numerze (id)
|
||||||
Alphas::iterator iter = _alphas.find(id);
|
Alphas::iterator iter = _alphas.find(id);
|
||||||
return (iter != _alphas.end() ? iter->second : false);
|
return (iter != _alphas.end() ? iter->second : false);
|
||||||
}
|
}
|
||||||
@@ -317,7 +317,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadBMP(std::string fileName)
|
|||||||
TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int filter)
|
TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int filter)
|
||||||
{
|
{
|
||||||
AlphaValue fail(0, false);
|
AlphaValue fail(0, false);
|
||||||
int writeback = -1; //-1 plik jest OK, >=0 - od którego bajtu zapisaæ poprawiony plik
|
int writeback = -1; //-1 plik jest OK, >=0 - od którego bajtu zapisać poprawiony plik
|
||||||
GLubyte TGACompheader[] = {0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // uncompressed TGA header
|
GLubyte TGACompheader[] = {0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // uncompressed TGA header
|
||||||
GLubyte TGAcompare[12]; // used to compare TGA header
|
GLubyte TGAcompare[12]; // used to compare TGA header
|
||||||
GLubyte header[6]; // first 6 useful bytes from the header
|
GLubyte header[6]; // first 6 useful bytes from the header
|
||||||
@@ -340,7 +340,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
|
|||||||
file.close();
|
file.close();
|
||||||
return fail;
|
return fail;
|
||||||
};
|
};
|
||||||
{ // sprawdzenie prawid³owoœci rozmiarów
|
{ // sprawdzenie prawidłowości rozmiarów
|
||||||
int i, j;
|
int i, j;
|
||||||
for (i = width, j = 0; i; i >>= 1)
|
for (i = width, j = 0; i; i >>= 1)
|
||||||
if (i & 1)
|
if (i & 1)
|
||||||
@@ -350,7 +350,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
|
|||||||
if (i & 1)
|
if (i & 1)
|
||||||
++j;
|
++j;
|
||||||
if (j != 1)
|
if (j != 1)
|
||||||
WriteLog("Bad texture: " + fileName + " is " + std::to_string(width) + "×" + std::to_string(height) );
|
WriteLog("Bad texture: " + fileName + " is " + std::to_string(width) + "×" + std::to_string(height) );
|
||||||
}
|
}
|
||||||
GLuint bpp = header[4]; // grab the TGA's bits per pixel (24 or 32)
|
GLuint bpp = header[4]; // grab the TGA's bits per pixel (24 or 32)
|
||||||
GLuint bytesPerPixel = bpp / 8; // divide by 8 to get the bytes per pixel
|
GLuint bytesPerPixel = bpp / 8; // divide by 8 to get the bytes per pixel
|
||||||
@@ -372,46 +372,46 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
|
|||||||
GLuint filesize; // current byte
|
GLuint filesize; // current byte
|
||||||
GLuint colorbuffer[1]; // Storage for 1 pixel
|
GLuint colorbuffer[1]; // Storage for 1 pixel
|
||||||
file.seekg(0, std::ios::end); // na koniec
|
file.seekg(0, std::ios::end); // na koniec
|
||||||
filesize = (int)file.tellg() - 18; // rozmiar bez nag³ówka
|
filesize = (int)file.tellg() - 18; // rozmiar bez nagłówka
|
||||||
file.seekg(18, std::ios::beg); // ponownie za nag³ówkiem
|
file.seekg(18, std::ios::beg); // ponownie za nagłówkiem
|
||||||
GLubyte *copyto = imageData; // gdzie wstawiaæ w buforze
|
GLubyte *copyto = imageData; // gdzie wstawiać w buforze
|
||||||
GLubyte *copyend = imageData + imageSize; // za ostatnim bajtem bufora
|
GLubyte *copyend = imageData + imageSize; // za ostatnim bajtem bufora
|
||||||
GLubyte *copyfrom = imageData + imageSize - filesize; // gdzie jest pocz¹tek
|
GLubyte *copyfrom = imageData + imageSize - filesize; // gdzie jest początek
|
||||||
int chunkheader = 0; // Ra: bêdziemy wczytywaæ najm³odszy bajt
|
int chunkheader = 0; // Ra: będziemy wczytywać najmłodszy bajt
|
||||||
if (filesize < imageSize) // jeœli po kompresji jest mniejszy ni¿ przed
|
if (filesize < imageSize) // jeśli po kompresji jest mniejszy niż przed
|
||||||
{ // Ra: nowe wczytywanie skompresowanych: czytamy ca³e od razu, dekompresja w pamiêci
|
{ // Ra: nowe wczytywanie skompresowanych: czytamy całe od razu, dekompresja w pamięci
|
||||||
GLuint copybytes;
|
GLuint copybytes;
|
||||||
file.read(reinterpret_cast<char*>(copyfrom), filesize); // wczytanie reszty po nag³ówku
|
file.read(reinterpret_cast<char*>(copyfrom), filesize); // wczytanie reszty po nagłówku
|
||||||
// najpierw trzeba ustaliæ, ile skopiowanych pikseli jest na samym koñcu
|
// najpierw trzeba ustalić, ile skopiowanych pikseli jest na samym końcu
|
||||||
copyto = copyfrom; // roboczo przelatujemy wczytane dane
|
copyto = copyfrom; // roboczo przelatujemy wczytane dane
|
||||||
copybytes = 0; // licznik bajtów obrazka
|
copybytes = 0; // licznik bajtów obrazka
|
||||||
while (copybytes < imageSize)
|
while (copybytes < imageSize)
|
||||||
{
|
{
|
||||||
chunkheader = (unsigned char)*copyto; // jeden bajt, pozosta³e zawsze zerowe
|
chunkheader = (unsigned char)*copyto; // jeden bajt, pozostałe zawsze zerowe
|
||||||
copyto += 1 + bytesPerPixel; // bajt licznika oraz jeden piksel jest zawsze
|
copyto += 1 + bytesPerPixel; // bajt licznika oraz jeden piksel jest zawsze
|
||||||
copybytes += (1 + (chunkheader & 127)) * bytesPerPixel; // iloϾ pikseli
|
copybytes += (1 + (chunkheader & 127)) * bytesPerPixel; // ilość pikseli
|
||||||
if (chunkheader < 128) // jeœli kopiowanie, pikseli jest wiêcej
|
if (chunkheader < 128) // jeśli kopiowanie, pikseli jest więcej
|
||||||
copyto += (chunkheader)*bytesPerPixel; // rozmiar kopiowanego obszaru (bez
|
copyto += (chunkheader)*bytesPerPixel; // rozmiar kopiowanego obszaru (bez
|
||||||
// jednego piksela)
|
// jednego piksela)
|
||||||
}
|
}
|
||||||
if (copybytes > imageSize)
|
if (copybytes > imageSize)
|
||||||
{ // nie ma prawa byæ wiêksze
|
{ // nie ma prawa być większe
|
||||||
WriteLog("Compression error");
|
WriteLog("Compression error");
|
||||||
delete[] imageData;
|
delete[] imageData;
|
||||||
file.close();
|
file.close();
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
// na koñcu mog¹ byæ œmieci
|
// na końcu mogą być śmieci
|
||||||
int extraend = copyend - copyto; // d³ugoœæ œmieci na koñcu
|
int extraend = copyend - copyto; // długość śmieci na końcu
|
||||||
if (extraend > 0)
|
if (extraend > 0)
|
||||||
{ // przesuwamy bufor do koñca obszaru dekompresji
|
{ // przesuwamy bufor do końca obszaru dekompresji
|
||||||
WriteLog("Extra bytes: " + std::to_string(extraend));
|
WriteLog("Extra bytes: " + std::to_string(extraend));
|
||||||
memmove(copyfrom + extraend, copyfrom, filesize - extraend);
|
memmove(copyfrom + extraend, copyfrom, filesize - extraend);
|
||||||
copyfrom += extraend;
|
copyfrom += extraend;
|
||||||
file.close();
|
file.close();
|
||||||
filesize -= extraend; // to chyba nie ma znaczenia
|
filesize -= extraend; // to chyba nie ma znaczenia
|
||||||
if (Global::iModifyTGA & 2) // flaga obcinania œmieci
|
if (Global::iModifyTGA & 2) // flaga obcinania śmieci
|
||||||
{ // najlepiej by by³o obci¹æ plik, ale fstream tego nie potrafi
|
{ // najlepiej by było obciąć plik, ale fstream tego nie potrafi
|
||||||
int handle;
|
int handle;
|
||||||
for( unsigned int i = 0; i < fileName.length(); ++i ) {
|
for( unsigned int i = 0; i < fileName.length(); ++i ) {
|
||||||
if( fileName[ i ] == '/' ) { fileName[ i ] = '\\'; } // bo to Windows }
|
if( fileName[ i ] == '/' ) { fileName[ i ] = '\\'; } // bo to Windows }
|
||||||
@@ -420,45 +420,45 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
|
|||||||
// NOTE: this posix code is unsafe, and being deprecated in visual c
|
// NOTE: this posix code is unsafe, and being deprecated in visual c
|
||||||
// TODO: replace with something up to date
|
// TODO: replace with something up to date
|
||||||
handle = open(fileName.c_str(), O_RDWR | O_BINARY);
|
handle = open(fileName.c_str(), O_RDWR | O_BINARY);
|
||||||
chsize(handle, 18 + filesize); // obciêcie œmieci
|
chsize(handle, 18 + filesize); // obcięcie śmieci
|
||||||
close(handle);
|
close(handle);
|
||||||
extraend = 0; // skoro obciêty, to siê ju¿ nie liczy
|
extraend = 0; // skoro obcięty, to się już nie liczy
|
||||||
}
|
}
|
||||||
file.open(fileName.c_str(), std::ios::binary | std::ios::in);
|
file.open(fileName.c_str(), std::ios::binary | std::ios::in);
|
||||||
}
|
}
|
||||||
if (chunkheader < 128) // jeœli ostatnie piksele s¹ kopiowane
|
if (chunkheader < 128) // jeśli ostatnie piksele są kopiowane
|
||||||
copyend -= (1 + chunkheader) *
|
copyend -= (1 + chunkheader) *
|
||||||
bytesPerPixel; // bajty kopiowane na koñcu nie podlegaj¹ce dekompresji
|
bytesPerPixel; // bajty kopiowane na końcu nie podlegające dekompresji
|
||||||
else
|
else
|
||||||
copyend -= bytesPerPixel; // ostatni piksel i tak siê nie zmieni
|
copyend -= bytesPerPixel; // ostatni piksel i tak się nie zmieni
|
||||||
copyto = imageData; // teraz bêdzie wype³nianie od pocz¹tku obszaru
|
copyto = imageData; // teraz będzie wypełnianie od początku obszaru
|
||||||
while (copyto < copyend)
|
while (copyto < copyend)
|
||||||
{
|
{
|
||||||
chunkheader = (unsigned char)*copyfrom; // jeden bajt, pozosta³e zawsze zerowe
|
chunkheader = (unsigned char)*copyfrom; // jeden bajt, pozostałe zawsze zerowe
|
||||||
if (copyto > copyfrom)
|
if (copyto > copyfrom)
|
||||||
{ // jeœli piksele maj¹ byæ kopiowane, to mo¿liwe jest przesuniêcie ich o 1 bajt, na
|
{ // jeśli piksele mają być kopiowane, to możliwe jest przesunięcie ich o 1 bajt, na
|
||||||
// miejsce licznika
|
// miejsce licznika
|
||||||
filesize = (imageData + imageSize - copyto) /
|
filesize = (imageData + imageSize - copyto) /
|
||||||
bytesPerPixel; // ile pikseli pozosta³o do koñca
|
bytesPerPixel; // ile pikseli pozostało do końca
|
||||||
// WriteLog("Decompression buffer overflow at pixel
|
// WriteLog("Decompression buffer overflow at pixel
|
||||||
// "+AnsiString((copyto-imageData)/bytesPerPixel)+"+"+AnsiString(filesize));
|
// "+AnsiString((copyto-imageData)/bytesPerPixel)+"+"+AnsiString(filesize));
|
||||||
// pozycjê w pliku trzeba by zapamietaæ i po wczytaniu reszty pikseli star¹
|
// pozycję w pliku trzeba by zapamietać i po wczytaniu reszty pikseli starą
|
||||||
// metod¹
|
// metodą
|
||||||
// zapisaæ od niej dane od (copyto), poprzedzone bajtem o wartoœci (filesize-1)
|
// zapisać od niej dane od (copyto), poprzedzone bajtem o wartości (filesize-1)
|
||||||
writeback = imageData + imageSize + extraend -
|
writeback = imageData + imageSize + extraend -
|
||||||
copyfrom; // ile bajtów skompresowanych zosta³o do koñca
|
copyfrom; // ile bajtów skompresowanych zostało do końca
|
||||||
copyfrom = copyto; // adres piksela do zapisania
|
copyfrom = copyto; // adres piksela do zapisania
|
||||||
file.seekg(-writeback, std::ios::end); // odleg³oœæ od koñca (ujemna)
|
file.seekg(-writeback, std::ios::end); // odległość od końca (ujemna)
|
||||||
if ((filesize > 128) ||
|
if ((filesize > 128) ||
|
||||||
!(Global::iModifyTGA & 4)) // gdy za du¿o pikseli albo wy³¹czone
|
!(Global::iModifyTGA & 4)) // gdy za dużo pikseli albo wyłączone
|
||||||
writeback = -1; // zapis mo¿liwe jeœli iloœæ problematycznych pikseli nie
|
writeback = -1; // zapis możliwe jeśli ilość problematycznych pikseli nie
|
||||||
// przekaracza 128
|
// przekaracza 128
|
||||||
break; // bufor siê zatka³, dalej w ten sposób siê nie da
|
break; // bufor się zatkał, dalej w ten sposób się nie da
|
||||||
}
|
}
|
||||||
if (chunkheader < 128)
|
if (chunkheader < 128)
|
||||||
{ // dla nag³ówka < 128 mamy podane ile pikseli przekopiowaæ minus 1
|
{ // dla nagłówka < 128 mamy podane ile pikseli przekopiować minus 1
|
||||||
copybytes = (++chunkheader) * bytesPerPixel; // rozmiar kopiowanego obszaru
|
copybytes = (++chunkheader) * bytesPerPixel; // rozmiar kopiowanego obszaru
|
||||||
memcpy(copyto, ++copyfrom, copybytes); // skopiowanie tylu bajtów
|
memcpy(copyto, ++copyfrom, copybytes); // skopiowanie tylu bajtów
|
||||||
copyto += copybytes;
|
copyto += copybytes;
|
||||||
copyfrom += copybytes;
|
copyfrom += copybytes;
|
||||||
}
|
}
|
||||||
@@ -467,12 +467,12 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
|
|||||||
chunkheader -= 127;
|
chunkheader -= 127;
|
||||||
// copy the color into the image data as many times as dictated
|
// copy the color into the image data as many times as dictated
|
||||||
if (bytesPerPixel == 4)
|
if (bytesPerPixel == 4)
|
||||||
{ // przy czterech bajtach powinno byæ szybsze u¿ywanie int
|
{ // przy czterech bajtach powinno być szybsze używanie int
|
||||||
__int32 *ptr = (__int32 *)(copyto); // wskaŸnik na int
|
__int32 *ptr = (__int32 *)(copyto); // wskaźnik na int
|
||||||
__int32 bgra = *((__int32 *)++copyfrom); // kolor wype³niaj¹cy (4 bajty)
|
__int32 bgra = *((__int32 *)++copyfrom); // kolor wypełniający (4 bajty)
|
||||||
for (int counter = 0; counter < chunkheader; counter++)
|
for (int counter = 0; counter < chunkheader; counter++)
|
||||||
*ptr++ = bgra;
|
*ptr++ = bgra;
|
||||||
copyto = reinterpret_cast<GLubyte *>(ptr); // rzutowanie, ¿eby nie dodawaæ
|
copyto = reinterpret_cast<GLubyte *>(ptr); // rzutowanie, żeby nie dodawać
|
||||||
copyfrom += 4;
|
copyfrom += 4;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -492,13 +492,13 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
|
|||||||
{
|
{
|
||||||
WriteLog("Compressed file is larger than uncompressed!");
|
WriteLog("Compressed file is larger than uncompressed!");
|
||||||
if (Global::iModifyTGA & 1)
|
if (Global::iModifyTGA & 1)
|
||||||
writeback = 0; // no zapisaæ ten krótszy zaczynajac od pocz¹tku...
|
writeback = 0; // no zapisać ten krótszy zaczynajac od początku...
|
||||||
}
|
}
|
||||||
// if (copyto<copyend) WriteLog("Slow loader...");
|
// if (copyto<copyend) WriteLog("Slow loader...");
|
||||||
while (copyto < copyend)
|
while (copyto < copyend)
|
||||||
{ // Ra: stare wczytywanie skompresowanych, z nadu¿ywaniem file.read()
|
{ // Ra: stare wczytywanie skompresowanych, z nadużywaniem file.read()
|
||||||
// równie¿ wykonywane, jeœli dekompresja w buforze przekroczy jego rozmiar
|
// również wykonywane, jeśli dekompresja w buforze przekroczy jego rozmiar
|
||||||
file.read((char *)&chunkheader, 1); // jeden bajt, pozosta³e zawsze zerowe
|
file.read((char *)&chunkheader, 1); // jeden bajt, pozostałe zawsze zerowe
|
||||||
if (file.eof())
|
if (file.eof())
|
||||||
{
|
{
|
||||||
MessageBox(NULL, "Could not read RLE header", "ERROR", MB_OK); // display error
|
MessageBox(NULL, "Could not read RLE header", "ERROR", MB_OK); // display error
|
||||||
@@ -519,11 +519,11 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
|
|||||||
file.read((char *)colorbuffer, bytesPerPixel);
|
file.read((char *)colorbuffer, bytesPerPixel);
|
||||||
// copy the color into the image data as many times as dictated
|
// copy the color into the image data as many times as dictated
|
||||||
if (bytesPerPixel == 4)
|
if (bytesPerPixel == 4)
|
||||||
{ // przy czterech bajtach powinno byæ szybsze u¿ywanie int
|
{ // przy czterech bajtach powinno być szybsze używanie int
|
||||||
__int32 *ptr = (__int32 *)(copyto), bgra = *((__int32 *)colorbuffer);
|
__int32 *ptr = (__int32 *)(copyto), bgra = *((__int32 *)colorbuffer);
|
||||||
for (int counter = 0; counter < chunkheader; counter++)
|
for (int counter = 0; counter < chunkheader; counter++)
|
||||||
*ptr++ = bgra;
|
*ptr++ = bgra;
|
||||||
copyto = reinterpret_cast<GLubyte*>(ptr); // rzutowanie, ¿eby nie dodawaæ
|
copyto = reinterpret_cast<GLubyte*>(ptr); // rzutowanie, żeby nie dodawać
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
for (int counter = 0; counter < chunkheader; counter++)
|
for (int counter = 0; counter < chunkheader; counter++)
|
||||||
@@ -535,18 +535,18 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
|
|||||||
} // while (copyto<copyend)
|
} // while (copyto<copyend)
|
||||||
if (writeback >= 0)
|
if (writeback >= 0)
|
||||||
{ // zapisanie pliku
|
{ // zapisanie pliku
|
||||||
file.close(); // tamten zamykamy, bo by³ tylko do odczytu
|
file.close(); // tamten zamykamy, bo był tylko do odczytu
|
||||||
if (writeback)
|
if (writeback)
|
||||||
{ // zapisanie samej koñcówki pliku, która utrudnia dekompresjê w buforze
|
{ // zapisanie samej końcówki pliku, która utrudnia dekompresję w buforze
|
||||||
WriteLog("Rewriting end of file...");
|
WriteLog("Rewriting end of file...");
|
||||||
chunkheader = filesize - 1; // licznik jest o 1 mniejszy
|
chunkheader = filesize - 1; // licznik jest o 1 mniejszy
|
||||||
file.open(fileName.c_str(), std::ios::binary | std::ios::out | std::ios::in);
|
file.open(fileName.c_str(), std::ios::binary | std::ios::out | std::ios::in);
|
||||||
file.seekg(-writeback, std::ios::end); // odleg³oœæ od koñca (ujemna)
|
file.seekg(-writeback, std::ios::end); // odległość od końca (ujemna)
|
||||||
file.write((char *)&chunkheader, 1); // zapisanie licznika
|
file.write((char *)&chunkheader, 1); // zapisanie licznika
|
||||||
file.write(reinterpret_cast<char*>(copyfrom), filesize * bytesPerPixel); // piksele bez kompresji
|
file.write(reinterpret_cast<char*>(copyfrom), filesize * bytesPerPixel); // piksele bez kompresji
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // zapisywanie ca³oœci pliku, bêdzie krótszy, wiêc trzeba usun¹æ go w ca³oœci
|
{ // zapisywanie całości pliku, będzie krótszy, więc trzeba usunąć go w całości
|
||||||
WriteLog("Writing uncompressed file...");
|
WriteLog("Writing uncompressed file...");
|
||||||
TGAcompare[2] = 2; // bez kompresji
|
TGAcompare[2] = 2; // bez kompresji
|
||||||
file.open(fileName.c_str(), std::ios::binary | std::ios::out | std::ios::trunc);
|
file.open(fileName.c_str(), std::ios::binary | std::ios::out | std::ios::trunc);
|
||||||
@@ -556,7 +556,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
file.close(); // plik zamykamy dopiero na samym koñcu
|
file.close(); // plik zamykamy dopiero na samym końcu
|
||||||
bool alpha = (bpp == 32);
|
bool alpha = (bpp == 32);
|
||||||
bool hash = (fileName.find('#') != std::string::npos); // true gdy w nazwie jest "#"
|
bool hash = (fileName.find('#') != std::string::npos); // true gdy w nazwie jest "#"
|
||||||
bool dollar = (fileName.find('$') == std::string::npos); // true gdy w nazwie nie ma "$"
|
bool dollar = (fileName.find('$') == std::string::npos); // true gdy w nazwie nie ma "$"
|
||||||
@@ -564,24 +564,24 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
|
|||||||
if (pos != std::string::npos)
|
if (pos != std::string::npos)
|
||||||
if (pos < fileName.size())
|
if (pos < fileName.size())
|
||||||
{
|
{
|
||||||
filter = (int)fileName[pos + 1] - '0'; // zamiana cyfry za % na liczbê
|
filter = (int)fileName[pos + 1] - '0'; // zamiana cyfry za % na liczbę
|
||||||
if ((filter < 0) || (filter > 10))
|
if ((filter < 0) || (filter > 10))
|
||||||
filter = -1; // jeœli nie jest cyfr¹
|
filter = -1; // jeśli nie jest cyfrą
|
||||||
}
|
}
|
||||||
if (!alpha && !hash && dollar && (filter < 0))
|
if (!alpha && !hash && dollar && (filter < 0))
|
||||||
filter = Global::iDefaultFiltering; // dotyczy tekstur TGA bez kana³u alfa
|
filter = Global::iDefaultFiltering; // dotyczy tekstur TGA bez kanału alfa
|
||||||
// ewentualne przeskalowanie tekstury do dopuszczalnego rozumiaru
|
// ewentualne przeskalowanie tekstury do dopuszczalnego rozumiaru
|
||||||
GLint w = width, h = height;
|
GLint w = width, h = height;
|
||||||
if (width > Global::iMaxTextureSize)
|
if (width > Global::iMaxTextureSize)
|
||||||
width = Global::iMaxTextureSize; // ogranizczenie wielkoœci
|
width = Global::iMaxTextureSize; // ogranizczenie wielkości
|
||||||
if (height > Global::iMaxTextureSize)
|
if (height > Global::iMaxTextureSize)
|
||||||
height = Global::iMaxTextureSize;
|
height = Global::iMaxTextureSize;
|
||||||
if ((w != width) || (h != height))
|
if ((w != width) || (h != height))
|
||||||
{ // przeskalowanie tekstury, ¿eby siê nie wyœwietla³a jako bia³a
|
{ // przeskalowanie tekstury, żeby się nie wyświetlała jako biała
|
||||||
GLubyte *imgData = new GLubyte[width * height * bytesPerPixel]; // nowy rozmiar
|
GLubyte *imgData = new GLubyte[width * height * bytesPerPixel]; // nowy rozmiar
|
||||||
gluScaleImage(bytesPerPixel == 3 ? GL_RGB : GL_RGBA, w, h, GL_UNSIGNED_BYTE, imageData,
|
gluScaleImage(bytesPerPixel == 3 ? GL_RGB : GL_RGBA, w, h, GL_UNSIGNED_BYTE, imageData,
|
||||||
width, height, GL_UNSIGNED_BYTE, imgData);
|
width, height, GL_UNSIGNED_BYTE, imgData);
|
||||||
delete imageData; // usuniêcie starego
|
delete imageData; // usunięcie starego
|
||||||
imageData = imgData;
|
imageData = imgData;
|
||||||
}
|
}
|
||||||
GLuint id = CreateTexture(imageData, (alpha ? GL_BGRA : GL_BGR), width, height, alpha, hash,
|
GLuint id = CreateTexture(imageData, (alpha ? GL_BGRA : GL_BGR), width, height, alpha, hash,
|
||||||
@@ -704,7 +704,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadDDS(std::string fileName, int
|
|||||||
data.width = ddsd.dwWidth;
|
data.width = ddsd.dwWidth;
|
||||||
data.height = ddsd.dwHeight;
|
data.height = ddsd.dwHeight;
|
||||||
data.numMipMaps = ddsd.dwMipMapCount;
|
data.numMipMaps = ddsd.dwMipMapCount;
|
||||||
{ // sprawdzenie prawid³owoœci rozmiarów
|
{ // sprawdzenie prawidłowości rozmiarów
|
||||||
int i, j;
|
int i, j;
|
||||||
for (i = data.width, j = 0; i; i >>= 1)
|
for (i = data.width, j = 0; i; i >>= 1)
|
||||||
if (i & 1)
|
if (i & 1)
|
||||||
@@ -714,7 +714,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadDDS(std::string fileName, int
|
|||||||
if (i & 1)
|
if (i & 1)
|
||||||
++j;
|
++j;
|
||||||
if (j != 1)
|
if (j != 1)
|
||||||
WriteLog( "Bad texture: " + fileName + " is " + std::to_string(data.width) + "×" + std::to_string(data.height) );
|
WriteLog( "Bad texture: " + fileName + " is " + std::to_string(data.width) + "×" + std::to_string(data.height) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ddsd.ddpfPixelFormat.dwFourCC == FOURCC_DXT1)
|
if (ddsd.ddpfPixelFormat.dwFourCC == FOURCC_DXT1)
|
||||||
@@ -730,14 +730,14 @@ TTexturesManager::AlphaValue TTexturesManager::LoadDDS(std::string fileName, int
|
|||||||
if (filter >= 0)
|
if (filter >= 0)
|
||||||
SetFiltering(filter); // cyfra po % w nazwie
|
SetFiltering(filter); // cyfra po % w nazwie
|
||||||
else
|
else
|
||||||
// SetFiltering(bHasAlpha&&bDollar,bHash); //znaki #, $ i kana³ alfa w nazwie
|
// SetFiltering(bHasAlpha&&bDollar,bHash); //znaki #, $ i kanał alfa w nazwie
|
||||||
SetFiltering(data.components == 4, fileName.find('#') != std::string::npos);
|
SetFiltering(data.components == 4, fileName.find('#') != std::string::npos);
|
||||||
|
|
||||||
GLuint offset = 0;
|
GLuint offset = 0;
|
||||||
int firstMipMap = 0;
|
int firstMipMap = 0;
|
||||||
|
|
||||||
while ((data.width > Global::iMaxTextureSize) || (data.height > Global::iMaxTextureSize))
|
while ((data.width > Global::iMaxTextureSize) || (data.height > Global::iMaxTextureSize))
|
||||||
{ // pomijanie zbyt du¿ych mipmap, jeœli wymagane jest ograniczenie rozmiaru
|
{ // pomijanie zbyt dużych mipmap, jeśli wymagane jest ograniczenie rozmiaru
|
||||||
offset += ((data.width + 3) / 4) * ((data.height + 3) / 4) * data.blockSize;
|
offset += ((data.width + 3) / 4) * ((data.height + 3) / 4) * data.blockSize;
|
||||||
data.width /= 2;
|
data.width /= 2;
|
||||||
data.height /= 2;
|
data.height /= 2;
|
||||||
@@ -745,7 +745,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadDDS(std::string fileName, int
|
|||||||
};
|
};
|
||||||
|
|
||||||
for (int i = 0; i < data.numMipMaps - firstMipMap; i++)
|
for (int i = 0; i < data.numMipMaps - firstMipMap; i++)
|
||||||
{ // wczytanie kolejnych poziomów mipmap
|
{ // wczytanie kolejnych poziomów mipmap
|
||||||
if (!data.width)
|
if (!data.width)
|
||||||
data.width = 1;
|
data.width = 1;
|
||||||
if (!data.height)
|
if (!data.height)
|
||||||
@@ -777,8 +777,8 @@ TTexturesManager::AlphaValue TTexturesManager::LoadDDS(std::string fileName, int
|
|||||||
|
|
||||||
void TTexturesManager::SetFiltering(int filter)
|
void TTexturesManager::SetFiltering(int filter)
|
||||||
{
|
{
|
||||||
if (filter < 4) // rozmycie przy powiêkszeniu
|
if (filter < 4) // rozmycie przy powiększeniu
|
||||||
{ // brak rozmycia z bliska - tych jest 4: 0..3, aby nie by³o przeskoku
|
{ // brak rozmycia z bliska - tych jest 4: 0..3, aby nie było przeskoku
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
filter += 4;
|
filter += 4;
|
||||||
}
|
}
|
||||||
@@ -786,22 +786,22 @@ void TTexturesManager::SetFiltering(int filter)
|
|||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
switch (filter) // rozmycie przy oddaleniu
|
switch (filter) // rozmycie przy oddaleniu
|
||||||
{
|
{
|
||||||
case 4: // najbli¿szy z tekstury
|
case 4: // najbliższy z tekstury
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
break;
|
break;
|
||||||
case 5: //œrednia z tekstury
|
case 5: //średnia z tekstury
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
break;
|
break;
|
||||||
case 6: // najbli¿szy z mipmapy
|
case 6: // najbliższy z mipmapy
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
|
||||||
break;
|
break;
|
||||||
case 7: //œrednia z mipmapy
|
case 7: //średnia z mipmapy
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
|
||||||
break;
|
break;
|
||||||
case 8: // najbli¿szy z dwóch mipmap
|
case 8: // najbliższy z dwóch mipmap
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
|
||||||
break;
|
break;
|
||||||
case 9: //œrednia z dwóch mipmap
|
case 9: //średnia z dwóch mipmap
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -831,7 +831,7 @@ void TTexturesManager::SetFiltering(bool alpha, bool hash)
|
|||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // $: filtruj wszystko - brzydko siê zlewa
|
else // $: filtruj wszystko - brzydko się zlewa
|
||||||
{
|
{
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
@@ -841,8 +841,8 @@ void TTexturesManager::SetFiltering(bool alpha, bool hash)
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
GLuint TTexturesManager::CreateTexture(GLubyte *buff, GLint bpp, int width, int height, bool bHasAlpha,
|
GLuint TTexturesManager::CreateTexture(GLubyte *buff, GLint bpp, int width, int height, bool bHasAlpha,
|
||||||
bool bHash, bool bDollar, int filter)
|
bool bHash, bool bDollar, int filter)
|
||||||
{ // Ra: u¿ywane tylko dla TGA i TEX
|
{ // Ra: używane tylko dla TGA i TEX
|
||||||
// Ra: dodana obs³uga GL_BGR oraz GL_BGRA dla TGA - szybciej siê wczytuje
|
// Ra: dodana obsługa GL_BGR oraz GL_BGRA dla TGA - szybciej się wczytuje
|
||||||
GLuint ID;
|
GLuint ID;
|
||||||
glGenTextures(1, &ID);
|
glGenTextures(1, &ID);
|
||||||
glBindTexture(GL_TEXTURE_2D, ID);
|
glBindTexture(GL_TEXTURE_2D, ID);
|
||||||
@@ -851,7 +851,7 @@ GLuint TTexturesManager::CreateTexture(GLubyte *buff, GLint bpp, int width, int
|
|||||||
if (filter >= 0)
|
if (filter >= 0)
|
||||||
SetFiltering(filter); // cyfra po % w nazwie
|
SetFiltering(filter); // cyfra po % w nazwie
|
||||||
else
|
else
|
||||||
SetFiltering(bHasAlpha && bDollar, bHash); // znaki #, $ i kana³ alfa w nazwie
|
SetFiltering(bHasAlpha && bDollar, bHash); // znaki #, $ i kanał alfa w nazwie
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||||
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
|
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
|
||||||
@@ -865,7 +865,7 @@ GLuint TTexturesManager::CreateTexture(GLubyte *buff, GLint bpp, int width, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TTexturesManager::Free()
|
void TTexturesManager::Free()
|
||||||
{ // usuniêcie wszyskich tekstur (bez usuwania struktury)
|
{ // usunięcie wszyskich tekstur (bez usuwania struktury)
|
||||||
// for (Names::iterator iter = _names.begin(); iter != _names.end(); iter++)
|
// for (Names::iterator iter = _names.begin(); iter != _names.end(); iter++)
|
||||||
if( false == _names.empty() ) {
|
if( false == _names.empty() ) {
|
||||||
for( auto const &texture : _names ) {
|
for( auto const &texture : _names ) {
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
/*
|
/*
|
||||||
//Ra: miejsce umieszczenia tego jest deczko bezsensowne
|
//Ra: miejsce umieszczenia tego jest deczko bezsensowne
|
||||||
void glDebug()
|
void glDebug()
|
||||||
{//logowanie b³êdów OpenGL
|
{//logowanie błędów OpenGL
|
||||||
GLenum err;
|
GLenum err;
|
||||||
if (Global::iErorrCounter==326) //tu wpisz o 1 mniej niz wartoœæ, przy której siê wy³o¿y³o
|
if (Global::iErorrCounter==326) //tu wpisz o 1 mniej niz wartość, przy której się wyłożyło
|
||||||
Global::iErorrCounter=Global::iErorrCounter+0; //do zastawiania pu³apki przed b³êdnym kodem
|
Global::iErorrCounter=Global::iErorrCounter+0; //do zastawiania pułapki przed błędnym kodem
|
||||||
while ((err=glGetError())!=GL_NO_ERROR) //dalej jest pu³apka po wykonaniu b³êdnego kodu
|
while ((err=glGetError())!=GL_NO_ERROR) //dalej jest pułapka po wykonaniu błędnego kodu
|
||||||
WriteLog("OpenGL error found: "+AnsiString(err)+", step:"+AnsiString(Global::iErorrCounter));
|
WriteLog("OpenGL error found: "+AnsiString(err)+", step:"+AnsiString(Global::iErorrCounter));
|
||||||
++Global::iErorrCounter;
|
++Global::iErorrCounter;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ double GetDeltaTime()
|
|||||||
}
|
}
|
||||||
|
|
||||||
double GetDeltaRenderTime()
|
double GetDeltaRenderTime()
|
||||||
{ // czas renderowania (do poruszania siê)
|
{ // czas renderowania (do poruszania się)
|
||||||
return DeltaRenderTime;
|
return DeltaRenderTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ void SetSimulationTime(double t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool GetSoundTimer()
|
bool GetSoundTimer()
|
||||||
{ // Ra: byæ mo¿e, by dŸwiêki nie modyfikowa³y siê zbyt czêsto, po 0.1s zeruje siê ten licznik
|
{ // Ra: być może, by dźwięki nie modyfikowały się zbyt często, po 0.1s zeruje się ten licznik
|
||||||
return (fSoundTimer == 0.0f);
|
return (fSoundTimer == 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ void UpdateTimers(bool pause)
|
|||||||
DeltaTime = 1;
|
DeltaTime = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
DeltaTime = 0; // wszystko stoi, bo czas nie p³ynie
|
DeltaTime = 0; // wszystko stoi, bo czas nie płynie
|
||||||
oldCount = count;
|
oldCount = count;
|
||||||
|
|
||||||
// Keep track of the time lapse and frame count
|
// Keep track of the time lapse and frame count
|
||||||
|
|||||||
126
Track.h
126
Track.h
@@ -36,7 +36,7 @@ typedef enum
|
|||||||
e_bridge,
|
e_bridge,
|
||||||
e_bank
|
e_bank
|
||||||
} TEnvironmentType;
|
} TEnvironmentType;
|
||||||
// Ra: opracować alternatywny system cieni/świateł z definiowaniem koloru oświetlenia w halach
|
// Ra: opracować alternatywny system cieni/świateł z definiowaniem koloru oświetlenia w halach
|
||||||
|
|
||||||
class TTrack;
|
class TTrack;
|
||||||
class TGroundNode;
|
class TGroundNode;
|
||||||
@@ -44,49 +44,49 @@ class TSubRect;
|
|||||||
class TTraction;
|
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 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; // dla zwrotnicy
|
||||||
double fOffset, fDesiredOffset; // aktualne i docelowe położenie napędu iglic
|
double fOffset, fDesiredOffset; // aktualne i docelowe położenie napędu iglic
|
||||||
double fOffsetSpeed; // prędkość liniowa ruchu iglic
|
double fOffsetSpeed; // prędkość liniowa ruchu iglic
|
||||||
double fOffsetDelay; // opóźnienie ruchu drugiej iglicy względem pierwszej
|
double fOffsetDelay; // opóźnienie ruchu drugiej iglicy względem pierwszej
|
||||||
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
|
||||||
{ // zmienne potrzebne tylko dla obrotnicy/przesuwnicy
|
{ // zmienne potrzebne tylko dla obrotnicy/przesuwnicy
|
||||||
TGroundNode *pMyNode; // dla obrotnicy do wtórnego podłączania torów
|
TGroundNode *pMyNode; // dla obrotnicy do wtórnego podłączania torów
|
||||||
// TAnimContainer *pAnim; //animator modelu dla obrotnicy
|
// TAnimContainer *pAnim; //animator modelu dla obrotnicy
|
||||||
TAnimModel *pModel; // na razie model
|
TAnimModel *pModel; // na razie model
|
||||||
};
|
};
|
||||||
struct
|
struct
|
||||||
{ // zmienne dla skrzyżowania
|
{ // zmienne dla skrzyżowania
|
||||||
vector3 *vPoints; // tablica wierzchołków nawierzchni, generowana przez pobocze
|
vector3 *vPoints; // tablica wierzchołków nawierzchni, generowana przez pobocze
|
||||||
int iPoints; // liczba faktycznie użytych wierzchołków nawierzchni
|
int iPoints; // liczba faktycznie użytych wierzchołków nawierzchni
|
||||||
bool bPoints; // czy utworzone?
|
bool bPoints; // czy utworzone?
|
||||||
int iRoads; // ile dróg się spotyka?
|
int iRoads; // ile dróg się spotyka?
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
bool bMovement; // czy w trakcie animacji
|
bool bMovement; // czy w trakcie animacji
|
||||||
int iLeftVBO, iRightVBO; // indeksy iglic w VBO
|
int iLeftVBO, iRightVBO; // indeksy iglic w VBO
|
||||||
TSubRect *pOwner; // sektor, któremu trzeba zgłosić animację
|
TSubRect *pOwner; // sektor, któremu trzeba zgłosić animację
|
||||||
TTrack *pNextAnim; // następny tor do animowania
|
TTrack *pNextAnim; // następny tor do animowania
|
||||||
TEvent *evPlus, *evMinus; // zdarzenia sygnalizacji rozprucia
|
TEvent *evPlus, *evMinus; // zdarzenia sygnalizacji rozprucia
|
||||||
float fVelocity; // maksymalne ograniczenie prędkości (ustawianej eventem)
|
float fVelocity; // maksymalne ograniczenie prędkości (ustawianej eventem)
|
||||||
vector3 vTrans; // docelowa translacja przesuwnicy
|
vector3 vTrans; // docelowa translacja przesuwnicy
|
||||||
private:
|
private:
|
||||||
};
|
};
|
||||||
@@ -94,21 +94,21 @@ class TSwitchExtension
|
|||||||
const int iMaxNumDynamics = 40; // McZapkie-100303
|
const int iMaxNumDynamics = 40; // McZapkie-100303
|
||||||
|
|
||||||
class TIsolated
|
class TIsolated
|
||||||
{ // obiekt zbierający zajętości z kilku odcinków
|
{ // obiekt zbierający zajętości z kilku odcinków
|
||||||
int iAxles; // ilość osi na odcinkach obsługiwanych przez obiekt
|
int iAxles; // ilość osi na odcinkach obsługiwanych przez obiekt
|
||||||
TIsolated *pNext; // odcinki izolowane są trzymane w postaci listy jednikierunkowej
|
TIsolated *pNext; // odcinki izolowane są trzymane w postaci listy jednikierunkowej
|
||||||
static TIsolated *pRoot; // początek listy
|
static TIsolated *pRoot; // początek listy
|
||||||
public:
|
public:
|
||||||
std::string asName; // nazwa obiektu, baza do nazw eventów
|
std::string asName; // nazwa obiektu, baza do nazw eventów
|
||||||
TEvent *evBusy; // zdarzenie wyzwalane po zajęciu grupy
|
TEvent *evBusy; // zdarzenie wyzwalane po zajęciu grupy
|
||||||
TEvent *evFree; // zdarzenie wyzwalane po całkowitym zwolnieniu zajętości grupy
|
TEvent *evFree; // zdarzenie wyzwalane po całkowitym zwolnieniu zajętości grupy
|
||||||
TMemCell *pMemCell; // automatyczna komórka pamięci, która współpracuje z odcinkiem izolowanym
|
TMemCell *pMemCell; // automatyczna komórka pamięci, która współpracuje z odcinkiem izolowanym
|
||||||
TIsolated();
|
TIsolated();
|
||||||
TIsolated(const std::string &n, TIsolated *i);
|
TIsolated(const std::string &n, TIsolated *i);
|
||||||
~TIsolated();
|
~TIsolated();
|
||||||
static TIsolated * Find(
|
static TIsolated * Find(
|
||||||
const std::string &n); // znalezienie obiektu albo utworzenie nowego
|
const std::string &n); // znalezienie obiektu albo utworzenie nowego
|
||||||
void Modify(int i, TDynamicObject *o); // dodanie lub odjęcie osi
|
void Modify(int i, TDynamicObject *o); // dodanie lub odjęcie osi
|
||||||
bool Busy()
|
bool Busy()
|
||||||
{
|
{
|
||||||
return (iAxles > 0);
|
return (iAxles > 0);
|
||||||
@@ -126,36 +126,36 @@ class TIsolated
|
|||||||
class TTrack : public Resource
|
class TTrack : public Resource
|
||||||
{ // trajektoria ruchu - opakowanie
|
{ // trajektoria ruchu - opakowanie
|
||||||
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; // odcinek od strony punktu 2 - to powinno być w segmencie
|
||||||
TTrack *trPrev; // odcinek od strony punktu 1
|
TTrack *trPrev; // 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; // tekstura szyn albo nawierzchni
|
||||||
GLuint TextureID2; // tekstura automatycznej podsypki albo pobocza
|
GLuint TextureID2; // tekstura automatycznej podsypki albo pobocza
|
||||||
float fTexLength; // długość powtarzania tekstury w metrach
|
float fTexLength; // długość powtarzania tekstury w metrach
|
||||||
float fTexRatio1; // proporcja rozmiarów tekstury dla nawierzchni drogi
|
float fTexRatio1; // proporcja rozmiarów tekstury dla nawierzchni drogi
|
||||||
float fTexRatio2; // proporcja rozmiarów tekstury dla chodnika
|
float fTexRatio2; // proporcja rozmiarów tekstury dla chodnika
|
||||||
float fTexHeight1; // wysokość brzegu względem trajektorii
|
float fTexHeight1; // wysokość brzegu względem trajektorii
|
||||||
float fTexWidth; // szerokość boku
|
float fTexWidth; // szerokość boku
|
||||||
float fTexSlope;
|
float fTexSlope;
|
||||||
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-standard, 1-przechyłka, 2-trapez, 3-oba
|
||||||
GLuint DisplayListID;
|
GLuint DisplayListID;
|
||||||
TIsolated *pIsolated; // obwód izolowany obsługujący zajęcia/zwolnienia grupy torów
|
TIsolated *pIsolated; // 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; // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode
|
||||||
public:
|
public:
|
||||||
int iNumDynamics;
|
int iNumDynamics;
|
||||||
TDynamicObject *Dynamics[iMaxNumDynamics];
|
TDynamicObject *Dynamics[iMaxNumDynamics];
|
||||||
int iEvents; // Ra: flaga informująca o obecności eventów
|
int iEvents; // Ra: flaga informująca o obecności eventów
|
||||||
TEvent *evEventall0; // McZapkie-140302: wyzwalany gdy pojazd stoi
|
TEvent *evEventall0; // McZapkie-140302: wyzwalany gdy pojazd stoi
|
||||||
TEvent *evEventall1;
|
TEvent *evEventall1;
|
||||||
TEvent *evEventall2;
|
TEvent *evEventall2;
|
||||||
TEvent *evEvent0; // McZapkie-280503: wyzwalany tylko gdy headdriver
|
TEvent *evEvent0; // McZapkie-280503: wyzwalany tylko gdy headdriver
|
||||||
TEvent *evEvent1;
|
TEvent *evEvent1;
|
||||||
TEvent *evEvent2;
|
TEvent *evEvent2;
|
||||||
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;
|
||||||
@@ -164,28 +164,28 @@ class TTrack : public Resource
|
|||||||
int iNextDirection; // 0:Point1, 1:Point2, 3:do odchylonego na zwrotnicy
|
int iNextDirection; // 0:Point1, 1:Point2, 3:do odchylonego na zwrotnicy
|
||||||
int iPrevDirection;
|
int iPrevDirection;
|
||||||
TTrackType eType;
|
TTrackType eType;
|
||||||
int iCategoryFlag; // 0x100 - usuwanie pojazów
|
int iCategoryFlag; // 0x100 - usuwanie pojazów
|
||||||
float fTrackWidth; // szerokość w punkcie 1
|
float fTrackWidth; // szerokość w punkcie 1
|
||||||
float fTrackWidth2; // szerokość w punkcie 2 (głównie drogi i rzeki)
|
float fTrackWidth2; // szerokość w punkcie 2 (głównie drogi i rzeki)
|
||||||
float fFriction; // współczynnik tarcia
|
float fFriction; // współczynnik tarcia
|
||||||
float fSoundDistance;
|
float fSoundDistance;
|
||||||
int iQualityFlag;
|
int iQualityFlag;
|
||||||
int iDamageFlag;
|
int iDamageFlag;
|
||||||
TEnvironmentType eEnvironment; // dźwięk i oświetlenie
|
TEnvironmentType eEnvironment; // dźwięk i oświetlenie
|
||||||
bool bVisible; // czy rysowany
|
bool bVisible; // czy rysowany
|
||||||
int iAction; // czy modyfikowany eventami (specjalna obsługa przy skanowaniu)
|
int iAction; // czy modyfikowany eventami (specjalna obsługa przy skanowaniu)
|
||||||
float fOverhead; // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i
|
float fOverhead; // informacja o stanie sieci: 0-jazda bezprądowa, >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; // 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; // długość z wpisu, nigdzie nie używana
|
||||||
double fRadius; // promień, dla zwrotnicy kopiowany z tabeli
|
double fRadius; // promień, dla zwrotnicy kopiowany z tabeli
|
||||||
bool ScannedFlag; // McZapkie: do zaznaczania kolorem torów skanowanych przez AI
|
bool ScannedFlag; // McZapkie: do zaznaczania kolorem torów skanowanych przez AI
|
||||||
TTraction *hvOverhead; // drut zasilający do szybkiego znalezienia (nie używany)
|
TTraction *hvOverhead; // 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; // tor kolizyjny, na którym trzeba sprawdzać pojazdy pod kątem zderzenia
|
||||||
|
|
||||||
TTrack(TGroundNode *g);
|
TTrack(TGroundNode *g);
|
||||||
~TTrack();
|
~TTrack();
|
||||||
@@ -239,12 +239,12 @@ class TTrack : public Resource
|
|||||||
|
|
||||||
void Render(); // renderowanie z Display Lists
|
void Render(); // renderowanie z Display Lists
|
||||||
int RaArrayPrepare(); // zliczanie rozmiaru dla VBO sektroa
|
int RaArrayPrepare(); // zliczanie rozmiaru dla VBO sektroa
|
||||||
void RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start); // wypełnianie VBO
|
void RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start); // wypełnianie VBO
|
||||||
void RaRenderVBO(int iPtr); // renderowanie z VBO sektora
|
void RaRenderVBO(int iPtr); // renderowanie z VBO sektora
|
||||||
void RenderDyn(); // renderowanie nieprzezroczystych pojazdów (oba tryby)
|
void RenderDyn(); // renderowanie nieprzezroczystych pojazdów (oba tryby)
|
||||||
void RenderDynAlpha(); // renderowanie przezroczystych pojazdów (oba tryby)
|
void RenderDynAlpha(); // renderowanie przezroczystych pojazdów (oba tryby)
|
||||||
void RenderDynSounds(); // odtwarzanie dźwięków pojazdów jest niezależne od ich
|
void RenderDynSounds(); // odtwarzanie dźwięków pojazdów jest niezależne od ich
|
||||||
// wyświetlania
|
// wyświetlania
|
||||||
|
|
||||||
void RaOwnerSet(TSubRect *o)
|
void RaOwnerSet(TSubRect *o)
|
||||||
{
|
{
|
||||||
@@ -262,7 +262,7 @@ class TTrack : public Resource
|
|||||||
{
|
{
|
||||||
if (pIsolated)
|
if (pIsolated)
|
||||||
pIsolated->Modify(i, o);
|
pIsolated->Modify(i, o);
|
||||||
}; // dodanie lub odjęcie osi
|
}; // dodanie lub odjęcie osi
|
||||||
std::string IsolatedName();
|
std::string IsolatedName();
|
||||||
bool IsolatedEventsAssign(TEvent *busy, TEvent *free);
|
bool IsolatedEventsAssign(TEvent *busy, TEvent *free);
|
||||||
double WidthTotal();
|
double WidthTotal();
|
||||||
|
|||||||
322
Traction.cpp
322
Traction.cpp
@@ -23,55 +23,55 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
=== Koncepcja dwustronnego zasilania sekcji sieci trakcyjnej, Ra 2014-02 ===
|
=== Koncepcja dwustronnego zasilania sekcji sieci trakcyjnej, Ra 2014-02 ===
|
||||||
0. Każde przęsło sieci może mieć wpisaną nazwę zasilacza, a także napięcie
|
0. Każde przęsło sieci może mieć wpisaną nazwę zasilacza, a także napięcie
|
||||||
nominalne i maksymalny prąd, które stanowią redundancję do danych zasilacza.
|
nominalne i maksymalny prąd, które stanowią redundancję do danych zasilacza.
|
||||||
Rezystancja może się zmieniać, materiał i grubość drutu powinny być wspólny
|
Rezystancja może się zmieniać, materiał i grubość drutu powinny być wspólny
|
||||||
dla segmentu. Podanie punktów umożliwia łączenie przęseł w listy dwukierunkowe,
|
dla segmentu. Podanie punktów umożliwia łączenie przęseł w listy dwukierunkowe,
|
||||||
co usprawnia wyszukiwania kolejnych przeseł podczas jazdy. Dla bieżni wspólnej
|
co usprawnia wyszukiwania kolejnych przeseł podczas jazdy. Dla bieżni wspólnej
|
||||||
powinna być podana nazwa innego przęsła w parametrze "parallel". Wskaźniki
|
powinna być podana nazwa innego przęsła w parametrze "parallel". Wskaźniki
|
||||||
na przęsła bieżni wspólnej mają być układane w jednokierunkowy pierścień.
|
na przęsła bieżni wspólnej mają być układane w jednokierunkowy pierścień.
|
||||||
1. Problemem jest ustalenie topologii sekcji dla linii dwutorowych. Nad każdym
|
1. Problemem jest ustalenie topologii sekcji dla linii dwutorowych. Nad każdym
|
||||||
torem powinna znajdować się oddzielna sekcja sieci, aby mogła zostać odłączona
|
torem powinna znajdować się oddzielna sekcja sieci, aby mogła zostać odłączona
|
||||||
w przypadku zwarcia. Sekcje nad równoległymi torami są również łączone
|
w przypadku zwarcia. Sekcje nad równoległymi torami są również łączone
|
||||||
równolegle przez kabiny sekcyjne, co zmniejsza płynące prądy i spadki napięć.
|
równolegle przez kabiny sekcyjne, co zmniejsza płynące prądy i spadki napięć.
|
||||||
2. Drugim zagadnieniem jest zasilanie sekcji jednocześnie z dwóch stron, czyli
|
2. Drugim zagadnieniem jest zasilanie sekcji jednocześnie z dwóch stron, czyli
|
||||||
sekcja musi mieć swoją nazwę oraz wskazanie dwóch zasilaczy ze wskazaniem
|
sekcja musi mieć swoją nazwę oraz wskazanie dwóch zasilaczy ze wskazaniem
|
||||||
geograficznym ich położenia. Dodatkową trudnością jest brak połączenia
|
geograficznym ich położenia. Dodatkową trudnością jest brak połączenia
|
||||||
pomiędzy segmentami naprężania. Podsumowując, każdy segment naprężania powinien
|
pomiędzy segmentami naprężania. Podsumowując, każdy segment naprężania powinien
|
||||||
mieć przypisanie do sekcji zasilania, a dodatkowo skrajne segmenty powinny
|
mieć przypisanie do sekcji zasilania, a dodatkowo skrajne segmenty powinny
|
||||||
wskazywać dwa różne zasilacze.
|
wskazywać dwa różne zasilacze.
|
||||||
3. Zasilaczem sieci może być podstacja, która w wersji 3kV powinna generować
|
3. Zasilaczem sieci może być podstacja, która w wersji 3kV powinna generować
|
||||||
pod obciążeniem napięcie maksymalne rzędu 3600V, a spadek napięcia następuje
|
pod obciążeniem napięcie maksymalne rzędu 3600V, a spadek napięcia następuje
|
||||||
na jej rezystancji wewnętrznej oraz na przewodach trakcyjnych. Zasilaczem może
|
na jej rezystancji wewnętrznej oraz na przewodach trakcyjnych. Zasilaczem może
|
||||||
być również kabina sekcyjna, która jest zasilana z podstacji poprzez przewody
|
być również kabina sekcyjna, która jest zasilana z podstacji poprzez przewody
|
||||||
trakcyjne.
|
trakcyjne.
|
||||||
4. Dla uproszczenia można przyjąć, że zasilanie pojazdu odbywać się będzie z
|
4. Dla uproszczenia można przyjąć, że zasilanie pojazdu odbywać się będzie z
|
||||||
dwóch sąsiednich podstacji, pomiędzy którymi może być dowolna liczba kabin
|
dwóch sąsiednich podstacji, pomiędzy którymi może być dowolna liczba kabin
|
||||||
sekcyjnych. W przypadku wyłączenia jednej z tych podstacji, zasilanie może
|
sekcyjnych. W przypadku wyłączenia jednej z tych podstacji, zasilanie może
|
||||||
być pobierane z kolejnej. Łącznie należy rozważać 4 najbliższe podstacje,
|
być pobierane z kolejnej. Łącznie należy rozważać 4 najbliższe podstacje,
|
||||||
przy czym do obliczeń można przyjmować 2 z nich.
|
przy czym do obliczeń można przyjmować 2 z nich.
|
||||||
5. Przęsła sieci są łączone w listę dwukierunkową, więc wystarczy nazwę
|
5. Przęsła sieci są łączone w listę dwukierunkową, więc wystarczy nazwę
|
||||||
sekcji wpisać w jednym z nich, wpisanie w każdym nie przeszkadza.
|
sekcji wpisać w jednym z nich, wpisanie w każdym nie przeszkadza.
|
||||||
Alternatywnym sposobem łączenia segmentów naprężania może być wpisywanie
|
Alternatywnym sposobem łączenia segmentów naprężania może być wpisywanie
|
||||||
nazw przęseł jako "parallel", co może być uciążliwe dla autorów scenerii.
|
nazw przęseł jako "parallel", co może być uciążliwe dla autorów scenerii.
|
||||||
W skrajnych przęsłach należałoby dodatkowo wpisać nazwę zasilacza, będzie
|
W skrajnych przęsłach należałoby dodatkowo wpisać nazwę zasilacza, będzie
|
||||||
to jednocześnie wskazanie przęsła, do którego podłączone są przewody
|
to jednocześnie wskazanie przęsła, do którego podłączone są przewody
|
||||||
zasilające. Konieczne jest odróżnienie nazwy sekcji od nazwy zasilacza, co
|
zasilające. Konieczne jest odróżnienie nazwy sekcji od nazwy zasilacza, co
|
||||||
można uzyskać różnicując ich nazwy albo np. specyficznie ustawiając wartość
|
można uzyskać różnicując ich nazwy albo np. specyficznie ustawiając wartość
|
||||||
prądu albo napięcia przęsła.
|
prądu albo napięcia przęsła.
|
||||||
6. Jeśli dany segment naprężania jest wspólny dla dwóch sekcji zasilania,
|
6. Jeśli dany segment naprężania jest wspólny dla dwóch sekcji zasilania,
|
||||||
to jedno z przęseł musi mieć nazwę "*" (gwiazdka), co będzie oznaczało, że
|
to jedno z przęseł musi mieć nazwę "*" (gwiazdka), co będzie oznaczało, że
|
||||||
ma zamontowany izolator. Dla uzyskania efektów typu łuk elektryczny, należało
|
ma zamontowany izolator. Dla uzyskania efektów typu łuk elektryczny, należało
|
||||||
by wskazać położenie izolatora i jego długość (ew. typ).
|
by wskazać położenie izolatora i jego długość (ew. typ).
|
||||||
7. Również w parametrach zasilacza należało by określić, czy jest podstacją,
|
7. Również w parametrach zasilacza należało by określić, czy jest podstacją,
|
||||||
czy jedynie kabiną sekcyjną. Różnić się one będą fizyką działania.
|
czy jedynie kabiną sekcyjną. Różnić się one będą fizyką działania.
|
||||||
8. Dla zbudowanej topologii sekcji i zasilaczy należało by zbudować dynamiczny
|
8. Dla zbudowanej topologii sekcji i zasilaczy należało by zbudować dynamiczny
|
||||||
schemat zastępczy. Dynamika polega na wyłączaniu sekcji ze zwarciem oraz
|
schemat zastępczy. Dynamika polega na wyłączaniu sekcji ze zwarciem oraz
|
||||||
przeciążonych podstacji. Musi być też możliwość wyłączenia sekcji albo
|
przeciążonych podstacji. Musi być też możliwość wyłączenia sekcji albo
|
||||||
podstacji za pomocą eventu.
|
podstacji za pomocą eventu.
|
||||||
9. Dla każdej sekcji musi być tworzony obiekt, wskazujący na podstacje
|
9. Dla każdej sekcji musi być tworzony obiekt, wskazujący na podstacje
|
||||||
zasilające na końcach, stan włączenia, zwarcia, przepięcia. Do tego obiektu
|
zasilające na końcach, stan włączenia, zwarcia, przepięcia. Do tego obiektu
|
||||||
musi wskazywać każde przęsło z aktywnym zasilaniem.
|
musi wskazywać każde przęsło z aktywnym zasilaniem.
|
||||||
|
|
||||||
z.1 z.2 z.3
|
z.1 z.2 z.3
|
||||||
-=-a---1*1---c-=---c---=-c--2*2--e---=---e-3-*-3--g-=-
|
-=-a---1*1---c-=---c---=-c--2*2--e---=---e-3-*-3--g-=-
|
||||||
@@ -79,15 +79,15 @@ musi wskazywa
|
|||||||
|
|
||||||
nazwy sekcji (@): a,b,c,d,e,f,g,h
|
nazwy sekcji (@): a,b,c,d,e,f,g,h
|
||||||
nazwy zasilaczy (#): 1,2,3
|
nazwy zasilaczy (#): 1,2,3
|
||||||
przęsło z izolatorem: *
|
przęsło z izolatorem: *
|
||||||
przęsła bez wskazania nazwy sekcji/zasilacza: -
|
przęsła bez wskazania nazwy sekcji/zasilacza: -
|
||||||
segment napręzania: =-x-=
|
segment napręzania: =-x-=
|
||||||
segment naprężania z izolatorem: =---@---#*#---@---=
|
segment naprężania z izolatorem: =---@---#*#---@---=
|
||||||
segment naprężania bez izolatora: =--------@------=
|
segment naprężania bez izolatora: =--------@------=
|
||||||
|
|
||||||
Obecnie brak nazwy sekcji nie jest akceptowany i każde przęsło musi mieć wpisaną
|
Obecnie brak nazwy sekcji nie jest akceptowany i każde przęsło musi mieć wpisaną
|
||||||
jawnie nazwę sekcji, ewentualnie nazwę zasilacza (zostanie zastąpiona wskazaniem
|
jawnie nazwę sekcji, ewentualnie nazwę zasilacza (zostanie zastąpiona wskazaniem
|
||||||
sekcji z sąsiedniego przęsła).
|
sekcji z sąsiedniego przęsła).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
TTraction::TTraction()
|
TTraction::TTraction()
|
||||||
@@ -107,12 +107,12 @@ TTraction::TTraction()
|
|||||||
// mdPole= NULL;
|
// mdPole= NULL;
|
||||||
// ReplacableSkinID= 0;
|
// ReplacableSkinID= 0;
|
||||||
hvNext[0] = hvNext[1] = NULL;
|
hvNext[0] = hvNext[1] = NULL;
|
||||||
iLast = 1; //że niby ostatni drut
|
iLast = 1; //że niby ostatni drut
|
||||||
psPowered = psPower[0] = psPower[1] = NULL; // na początku zasilanie nie podłączone
|
psPowered = psPower[0] = psPower[1] = NULL; // na początku zasilanie nie podłączone
|
||||||
psSection = NULL; // na początku nie podłączone
|
psSection = NULL; // na początku nie podłączone
|
||||||
hvParallel = NULL; // normalnie brak bieżni wspólnej
|
hvParallel = NULL; // normalnie brak bieżni wspólnej
|
||||||
fResistance[0] = fResistance[1] = -1.0; // trzeba dopiero policzyć
|
fResistance[0] = fResistance[1] = -1.0; // trzeba dopiero policzyć
|
||||||
iTries = 0; // ile razy próbować podłączyć, ustawiane później
|
iTries = 0; // ile razy próbować podłączyć, ustawiane później
|
||||||
}
|
}
|
||||||
|
|
||||||
TTraction::~TTraction()
|
TTraction::~TTraction()
|
||||||
@@ -263,33 +263,33 @@ void TTraction::RenderDL(float mgn) // McZapkie: mgn to odleglosc od obserwatora
|
|||||||
// McZapkie: ustalanie przezroczystosci i koloru linii:
|
// McZapkie: ustalanie przezroczystosci i koloru linii:
|
||||||
if (Wires != 0 && !TestFlag(DamageFlag, 128)) // rysuj jesli sa druty i nie zerwana
|
if (Wires != 0 && !TestFlag(DamageFlag, 128)) // rysuj jesli sa druty i nie zerwana
|
||||||
{
|
{
|
||||||
// glDisable(GL_LIGHTING); //aby nie używało wektorów normalnych do kolorowania
|
// glDisable(GL_LIGHTING); //aby nie używało wektorów normalnych do kolorowania
|
||||||
glColor4f(0, 0, 0, 1); // jak nieznany kolor to czarne nieprzezroczyste
|
glColor4f(0, 0, 0, 1); // jak nieznany kolor to czarne nieprzezroczyste
|
||||||
if (!Global::bSmoothTraction)
|
if (!Global::bSmoothTraction)
|
||||||
glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient
|
glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient
|
||||||
float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness
|
float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness
|
||||||
if (linealpha > 1.2)
|
if (linealpha > 1.2)
|
||||||
linealpha = 1.2; // zbyt grube nie są dobre
|
linealpha = 1.2; // zbyt grube nie są dobre
|
||||||
glLineWidth(linealpha);
|
glLineWidth(linealpha);
|
||||||
if (linealpha > 1.0)
|
if (linealpha > 1.0)
|
||||||
linealpha = 1.0;
|
linealpha = 1.0;
|
||||||
// McZapkie-261102: kolor zalezy od materialu i zasniedzenia
|
// McZapkie-261102: kolor zalezy od materialu i zasniedzenia
|
||||||
float r, g, b;
|
float r, g, b;
|
||||||
switch (Material)
|
switch (Material)
|
||||||
{ // Ra: kolory podzieliłem przez 2, bo po zmianie ambient za jasne były
|
{ // Ra: kolory podzieliłem przez 2, bo po zmianie ambient za jasne były
|
||||||
// trzeba uwzględnić kierunek świecenia Słońca - tylko ze Słońcem widać kolor
|
// trzeba uwzględnić kierunek świecenia Słońca - tylko ze Słońcem widać kolor
|
||||||
case 1:
|
case 1:
|
||||||
if (TestFlag(DamageFlag, 1))
|
if (TestFlag(DamageFlag, 1))
|
||||||
{
|
{
|
||||||
r = 0.00000;
|
r = 0.00000;
|
||||||
g = 0.32549;
|
g = 0.32549;
|
||||||
b = 0.2882353; // zielona miedź
|
b = 0.2882353; // zielona miedź
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
r = 0.35098;
|
r = 0.35098;
|
||||||
g = 0.22549;
|
g = 0.22549;
|
||||||
b = 0.1; // czerwona miedź
|
b = 0.1; // czerwona miedź
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
@@ -306,53 +306,53 @@ void TTraction::RenderDL(float mgn) // McZapkie: mgn to odleglosc od obserwatora
|
|||||||
b = 0.25; // srebrne Al
|
b = 0.25; // srebrne Al
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
// tymczasowo pokazanie zasilanych odcinków
|
// tymczasowo pokazanie zasilanych odcinków
|
||||||
case 4:
|
case 4:
|
||||||
r = 0.5;
|
r = 0.5;
|
||||||
g = 0.5;
|
g = 0.5;
|
||||||
b = 1.0;
|
b = 1.0;
|
||||||
break; // niebieskie z podłączonym zasilaniem
|
break; // niebieskie z podłączonym zasilaniem
|
||||||
case 5:
|
case 5:
|
||||||
r = 1.0;
|
r = 1.0;
|
||||||
g = 0.0;
|
g = 0.0;
|
||||||
b = 0.0;
|
b = 0.0;
|
||||||
break; // czerwone z podłączonym zasilaniem 1
|
break; // czerwone z podłączonym zasilaniem 1
|
||||||
case 6:
|
case 6:
|
||||||
r = 0.0;
|
r = 0.0;
|
||||||
g = 1.0;
|
g = 1.0;
|
||||||
b = 0.0;
|
b = 0.0;
|
||||||
break; // zielone z podłączonym zasilaniem 2
|
break; // zielone z podłączonym zasilaniem 2
|
||||||
case 7:
|
case 7:
|
||||||
r = 1.0;
|
r = 1.0;
|
||||||
g = 1.0;
|
g = 1.0;
|
||||||
b = 0.0;
|
b = 0.0;
|
||||||
break; //żółte z podłączonym zasilaniem z obu stron
|
break; //żółte z podłączonym zasilaniem z obu stron
|
||||||
}
|
}
|
||||||
if (DebugModeFlag)
|
if (DebugModeFlag)
|
||||||
if (hvParallel)
|
if (hvParallel)
|
||||||
{ // jeśli z bieżnią wspólną, to dodatkowo przyciemniamy
|
{ // jeśli z bieżnią wspólną, to dodatkowo przyciemniamy
|
||||||
r *= 0.6;
|
r *= 0.6;
|
||||||
g *= 0.6;
|
g *= 0.6;
|
||||||
b *= 0.6;
|
b *= 0.6;
|
||||||
}
|
}
|
||||||
r *= Global::ambientDayLight[0]; // w zaleźności od koloru swiatła
|
r *= Global::ambientDayLight[0]; // w zaleźności od koloru swiatła
|
||||||
g *= Global::ambientDayLight[1];
|
g *= Global::ambientDayLight[1];
|
||||||
b *= Global::ambientDayLight[2];
|
b *= Global::ambientDayLight[2];
|
||||||
if (linealpha > 1.0)
|
if (linealpha > 1.0)
|
||||||
linealpha = 1.0; // trzeba ograniczyć do <=1
|
linealpha = 1.0; // trzeba ograniczyć do <=1
|
||||||
glColor4f(r, g, b, linealpha);
|
glColor4f(r, g, b, linealpha);
|
||||||
if (!uiDisplayList)
|
if (!uiDisplayList)
|
||||||
Optimize(); // generowanie DL w miarę potrzeby
|
Optimize(); // generowanie DL w miarę potrzeby
|
||||||
glCallList(uiDisplayList);
|
glCallList(uiDisplayList);
|
||||||
glLineWidth(1.0);
|
glLineWidth(1.0);
|
||||||
glEnable(GL_LINE_SMOOTH);
|
glEnable(GL_LINE_SMOOTH);
|
||||||
// glEnable(GL_LIGHTING); //bez tego się modele nie oświetlają
|
// glEnable(GL_LIGHTING); //bez tego się modele nie oświetlają
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int TTraction::RaArrayPrepare()
|
int TTraction::RaArrayPrepare()
|
||||||
{ // przygotowanie tablic do skopiowania do VBO (zliczanie wierzchołków)
|
{ // przygotowanie tablic do skopiowania do VBO (zliczanie wierzchołków)
|
||||||
// if (bVisible) //o ile w ogóle widać
|
// if (bVisible) //o ile w ogóle widać
|
||||||
switch (Wires)
|
switch (Wires)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
@@ -375,7 +375,7 @@ int TTraction::RaArrayPrepare()
|
|||||||
};
|
};
|
||||||
|
|
||||||
void TTraction::RaArrayFill(CVertNormTex *Vert)
|
void TTraction::RaArrayFill(CVertNormTex *Vert)
|
||||||
{ // wypełnianie tablic VBO
|
{ // wypełnianie tablic VBO
|
||||||
CVertNormTex *old = Vert;
|
CVertNormTex *old = Vert;
|
||||||
double ddp = hypot(pPoint2.x - pPoint1.x, pPoint2.z - pPoint1.z);
|
double ddp = hypot(pPoint2.x - pPoint1.x, pPoint2.z - pPoint1.z);
|
||||||
if (Wires == 2)
|
if (Wires == 2)
|
||||||
@@ -401,7 +401,7 @@ void TTraction::RaArrayFill(CVertNormTex *Vert)
|
|||||||
float t;
|
float t;
|
||||||
// Przewod nosny 'Marcin
|
// Przewod nosny 'Marcin
|
||||||
if (Wires > 1)
|
if (Wires > 1)
|
||||||
{ // lina nośna w kawałkach
|
{ // lina nośna w kawałkach
|
||||||
Vert->x = pPoint3.x;
|
Vert->x = pPoint3.x;
|
||||||
Vert->y = pPoint3.y;
|
Vert->y = pPoint3.y;
|
||||||
Vert->z = pPoint3.z;
|
Vert->z = pPoint3.z;
|
||||||
@@ -467,40 +467,40 @@ void TTraction::RaArrayFill(CVertNormTex *Vert)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((Vert - old) != iLines)
|
if ((Vert - old) != iLines)
|
||||||
WriteLog("!!! Wygenerowano punktów " + std::to_string(Vert - old) + ", powinno być " +
|
WriteLog("!!! Wygenerowano punktów " + std::to_string(Vert - old) + ", powinno być " +
|
||||||
std::to_string(iLines));
|
std::to_string(iLines));
|
||||||
};
|
};
|
||||||
|
|
||||||
void TTraction::RenderVBO(float mgn, int iPtr)
|
void TTraction::RenderVBO(float mgn, int iPtr)
|
||||||
{ // renderowanie z użyciem VBO
|
{ // renderowanie z użyciem VBO
|
||||||
if (Wires != 0 && !TestFlag(DamageFlag, 128)) // rysuj jesli sa druty i nie zerwana
|
if (Wires != 0 && !TestFlag(DamageFlag, 128)) // rysuj jesli sa druty i nie zerwana
|
||||||
{
|
{
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
glDisable(GL_LIGHTING); // aby nie używało wektorów normalnych do kolorowania
|
glDisable(GL_LIGHTING); // aby nie używało wektorów normalnych do kolorowania
|
||||||
glColor4f(0, 0, 0, 1); // jak nieznany kolor to czarne nieprzezroczyste
|
glColor4f(0, 0, 0, 1); // jak nieznany kolor to czarne nieprzezroczyste
|
||||||
if (!Global::bSmoothTraction)
|
if (!Global::bSmoothTraction)
|
||||||
glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient
|
glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient
|
||||||
float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness
|
float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness
|
||||||
if (linealpha > 1.2)
|
if (linealpha > 1.2)
|
||||||
linealpha = 1.2; // zbyt grube nie są dobre
|
linealpha = 1.2; // zbyt grube nie są dobre
|
||||||
glLineWidth(linealpha);
|
glLineWidth(linealpha);
|
||||||
// McZapkie-261102: kolor zalezy od materialu i zasniedzenia
|
// McZapkie-261102: kolor zalezy od materialu i zasniedzenia
|
||||||
float r, g, b;
|
float r, g, b;
|
||||||
switch (Material)
|
switch (Material)
|
||||||
{ // Ra: kolory podzieliłem przez 2, bo po zmianie ambient za jasne były
|
{ // Ra: kolory podzieliłem przez 2, bo po zmianie ambient za jasne były
|
||||||
// trzeba uwzględnić kierunek świecenia Słońca - tylko ze Słońcem widać kolor
|
// trzeba uwzględnić kierunek świecenia Słońca - tylko ze Słońcem widać kolor
|
||||||
case 1:
|
case 1:
|
||||||
if (TestFlag(DamageFlag, 1))
|
if (TestFlag(DamageFlag, 1))
|
||||||
{
|
{
|
||||||
r = 0.00000;
|
r = 0.00000;
|
||||||
g = 0.32549;
|
g = 0.32549;
|
||||||
b = 0.2882353; // zielona miedź
|
b = 0.2882353; // zielona miedź
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
r = 0.35098;
|
r = 0.35098;
|
||||||
g = 0.22549;
|
g = 0.22549;
|
||||||
b = 0.1; // czerwona miedź
|
b = 0.1; // czerwona miedź
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
@@ -517,43 +517,43 @@ void TTraction::RenderVBO(float mgn, int iPtr)
|
|||||||
b = 0.25; // srebrne Al
|
b = 0.25; // srebrne Al
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
// tymczasowo pokazanie zasilanych odcinków
|
// tymczasowo pokazanie zasilanych odcinków
|
||||||
case 4:
|
case 4:
|
||||||
r = 0.5;
|
r = 0.5;
|
||||||
g = 0.5;
|
g = 0.5;
|
||||||
b = 1.0;
|
b = 1.0;
|
||||||
break; // niebieskie z podłączonym zasilaniem
|
break; // niebieskie z podłączonym zasilaniem
|
||||||
case 5:
|
case 5:
|
||||||
r = 1.0;
|
r = 1.0;
|
||||||
g = 0.0;
|
g = 0.0;
|
||||||
b = 0.0;
|
b = 0.0;
|
||||||
break; // czerwone z podłączonym zasilaniem 1
|
break; // czerwone z podłączonym zasilaniem 1
|
||||||
case 6:
|
case 6:
|
||||||
r = 0.0;
|
r = 0.0;
|
||||||
g = 1.0;
|
g = 1.0;
|
||||||
b = 0.0;
|
b = 0.0;
|
||||||
break; // zielone z podłączonym zasilaniem 2
|
break; // zielone z podłączonym zasilaniem 2
|
||||||
case 7:
|
case 7:
|
||||||
r = 1.0;
|
r = 1.0;
|
||||||
g = 1.0;
|
g = 1.0;
|
||||||
b = 0.0;
|
b = 0.0;
|
||||||
break; //żółte z podłączonym zasilaniem z obu stron
|
break; //żółte z podłączonym zasilaniem z obu stron
|
||||||
}
|
}
|
||||||
r = r * Global::ambientDayLight[0]; // w zaleznosci od koloru swiatla
|
r = r * Global::ambientDayLight[0]; // w zaleznosci od koloru swiatla
|
||||||
g = g * Global::ambientDayLight[1];
|
g = g * Global::ambientDayLight[1];
|
||||||
b = b * Global::ambientDayLight[2];
|
b = b * Global::ambientDayLight[2];
|
||||||
if (linealpha > 1.0)
|
if (linealpha > 1.0)
|
||||||
linealpha = 1.0; // trzeba ograniczyć do <=1
|
linealpha = 1.0; // trzeba ograniczyć do <=1
|
||||||
glColor4f(r, g, b, linealpha);
|
glColor4f(r, g, b, linealpha);
|
||||||
glDrawArrays(GL_LINES, iPtr, iLines);
|
glDrawArrays(GL_LINES, iPtr, iLines);
|
||||||
glLineWidth(1.0);
|
glLineWidth(1.0);
|
||||||
glEnable(GL_LINE_SMOOTH);
|
glEnable(GL_LINE_SMOOTH);
|
||||||
glEnable(GL_LIGHTING); // bez tego się modele nie oświetlają
|
glEnable(GL_LIGHTING); // bez tego się modele nie oświetlają
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
int TTraction::TestPoint(vector3 *Point)
|
int TTraction::TestPoint(vector3 *Point)
|
||||||
{ // sprawdzanie, czy przęsła można połączyć
|
{ // sprawdzanie, czy przęsła można połączyć
|
||||||
if (!hvNext[0])
|
if (!hvNext[0])
|
||||||
if (pPoint1.Equal(Point))
|
if (pPoint1.Equal(Point))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -564,7 +564,7 @@ int TTraction::TestPoint(vector3 *Point)
|
|||||||
};
|
};
|
||||||
|
|
||||||
void TTraction::Connect(int my, TTraction *with, int to)
|
void TTraction::Connect(int my, TTraction *with, int to)
|
||||||
{ //łączenie segmentu (with) od strony (my) do jego (to)
|
{ //łączenie segmentu (with) od strony (my) do jego (to)
|
||||||
if (my)
|
if (my)
|
||||||
{ // do mojego Point2
|
{ // do mojego Point2
|
||||||
hvNext[1] = with;
|
hvNext[1] = with;
|
||||||
@@ -585,118 +585,118 @@ void TTraction::Connect(int my, TTraction *with, int to)
|
|||||||
with->hvNext[0] = this;
|
with->hvNext[0] = this;
|
||||||
with->iNext[0] = my;
|
with->iNext[0] = my;
|
||||||
}
|
}
|
||||||
if (hvNext[0]) // jeśli z obu stron podłączony
|
if (hvNext[0]) // jeśli z obu stron podłączony
|
||||||
if (hvNext[1])
|
if (hvNext[1])
|
||||||
iLast = 0; // to nie jest ostatnim
|
iLast = 0; // to nie jest ostatnim
|
||||||
if (with->hvNext[0]) // temu też, bo drugi raz łączenie się nie nie wykona
|
if (with->hvNext[0]) // temu też, bo drugi raz łączenie się nie nie wykona
|
||||||
if (with->hvNext[1])
|
if (with->hvNext[1])
|
||||||
with->iLast = 0; // to nie jest ostatnim
|
with->iLast = 0; // to nie jest ostatnim
|
||||||
};
|
};
|
||||||
|
|
||||||
bool TTraction::WhereIs()
|
bool TTraction::WhereIs()
|
||||||
{ // ustalenie przedostatnich przęseł
|
{ // ustalenie przedostatnich przęseł
|
||||||
if (iLast)
|
if (iLast)
|
||||||
return (iLast == 1); // ma już ustaloną informację o położeniu
|
return (iLast == 1); // ma już ustaloną informację o położeniu
|
||||||
if (hvNext[0] ? hvNext[0]->iLast == 1 : false) // jeśli poprzedni jest ostatnim
|
if (hvNext[0] ? hvNext[0]->iLast == 1 : false) // jeśli poprzedni jest ostatnim
|
||||||
iLast = 2; // jest przedostatnim
|
iLast = 2; // jest przedostatnim
|
||||||
else if (hvNext[1] ? hvNext[1]->iLast == 1 : false) // jeśli następny jest ostatnim
|
else if (hvNext[1] ? hvNext[1]->iLast == 1 : false) // jeśli następny jest ostatnim
|
||||||
iLast = 2; // jest przedostatnim
|
iLast = 2; // jest przedostatnim
|
||||||
return (iLast == 1); // ostatnie będą dostawać zasilanie
|
return (iLast == 1); // ostatnie będą dostawać zasilanie
|
||||||
};
|
};
|
||||||
|
|
||||||
void TTraction::Init()
|
void TTraction::Init()
|
||||||
{ // przeliczenie parametrów
|
{ // przeliczenie parametrów
|
||||||
vParametric = pPoint2 - pPoint1; // wektor mnożników parametru dla równania parametrycznego
|
vParametric = pPoint2 - pPoint1; // wektor mnożników parametru dla równania parametrycznego
|
||||||
};
|
};
|
||||||
|
|
||||||
void TTraction::ResistanceCalc(int d, double r, TTractionPowerSource *ps)
|
void TTraction::ResistanceCalc(int d, double r, TTractionPowerSource *ps)
|
||||||
{ //(this) jest przęsłem zasilanym, o rezystancji (r), policzyć rezystancję zastępczą sąsiednich
|
{ //(this) jest przęsłem zasilanym, o rezystancji (r), policzyć rezystancję zastępczą sąsiednich
|
||||||
if (d >= 0)
|
if (d >= 0)
|
||||||
{ // podążanie we wskazanym kierunku
|
{ // podążanie we wskazanym kierunku
|
||||||
TTraction *t = hvNext[d], *p;
|
TTraction *t = hvNext[d], *p;
|
||||||
if (ps)
|
if (ps)
|
||||||
psPower[d ^ 1] = ps; // podłączenie podanego
|
psPower[d ^ 1] = ps; // podłączenie podanego
|
||||||
else
|
else
|
||||||
ps = psPower[d ^ 1]; // zasilacz od przeciwnej strony niż idzie analiza
|
ps = psPower[d ^ 1]; // zasilacz od przeciwnej strony niż idzie analiza
|
||||||
d = iNext[d]; // kierunek
|
d = iNext[d]; // kierunek
|
||||||
// double r; //sumaryczna rezystancja
|
// double r; //sumaryczna rezystancja
|
||||||
if (DebugModeFlag) // tylko podczas testów
|
if (DebugModeFlag) // tylko podczas testów
|
||||||
Material = 4; // pokazanie, że to przęsło ma podłączone zasilanie
|
Material = 4; // pokazanie, że to przęsło ma podłączone zasilanie
|
||||||
while (t ? !t->psPower[d] : false) // jeśli jest jakiś kolejny i nie ma ustalonego zasilacza
|
while (t ? !t->psPower[d] : false) // jeśli jest jakiś kolejny i nie ma ustalonego zasilacza
|
||||||
{ // ustawienie zasilacza i policzenie rezystancji zastępczej
|
{ // ustawienie zasilacza i policzenie rezystancji zastępczej
|
||||||
if (DebugModeFlag) // tylko podczas testów
|
if (DebugModeFlag) // tylko podczas testów
|
||||||
if (t->Material != 4) // przęsła zasilającego nie modyfikować
|
if (t->Material != 4) // przęsła zasilającego nie modyfikować
|
||||||
{
|
{
|
||||||
if (t->Material < 4)
|
if (t->Material < 4)
|
||||||
t->Material = 4; // tymczasowo, aby zmieniła kolor
|
t->Material = 4; // tymczasowo, aby zmieniła kolor
|
||||||
t->Material |= d ? 2 : 1; // kolor zależny od strony, z której jest zasilanie
|
t->Material |= d ? 2 : 1; // kolor zależny od strony, z której jest zasilanie
|
||||||
}
|
}
|
||||||
t->psPower[d] = ps; // skopiowanie wskaźnika zasilacza od danej strony
|
t->psPower[d] = ps; // skopiowanie wskaźnika zasilacza od danej strony
|
||||||
t->fResistance[d] = r; // wpisanie rezystancji w kierunku tego zasilacza
|
t->fResistance[d] = r; // wpisanie rezystancji w kierunku tego zasilacza
|
||||||
r += t->fResistivity * Length3(t->vParametric); // doliczenie oporu kolejnego odcinka
|
r += t->fResistivity * Length3(t->vParametric); // doliczenie oporu kolejnego odcinka
|
||||||
p = t; // zapamiętanie dotychczasowego
|
p = t; // zapamiętanie dotychczasowego
|
||||||
t = p->hvNext[d ^ 1]; // podążanie w tę samą stronę
|
t = p->hvNext[d ^ 1]; // podążanie w tę samą stronę
|
||||||
d = p->iNext[d ^ 1];
|
d = p->iNext[d ^ 1];
|
||||||
// w przypadku zapętlenia sieci może się zawiesić?
|
// w przypadku zapętlenia sieci może się zawiesić?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // podążanie w obu kierunkach, można by rekurencją, ale szkoda zasobów
|
{ // podążanie w obu kierunkach, można by rekurencją, ale szkoda zasobów
|
||||||
r = 0.5 * fResistivity *
|
r = 0.5 * fResistivity *
|
||||||
Length3(vParametric); // powiedzmy, że w zasilanym przęśle jest połowa
|
Length3(vParametric); // powiedzmy, że w zasilanym przęśle jest połowa
|
||||||
if (fResistance[0] == 0.0)
|
if (fResistance[0] == 0.0)
|
||||||
ResistanceCalc(0, r); // do tyłu (w stronę Point1)
|
ResistanceCalc(0, r); // do tyłu (w stronę Point1)
|
||||||
if (fResistance[1] == 0.0)
|
if (fResistance[1] == 0.0)
|
||||||
ResistanceCalc(1, r); // do przodu (w stronę Point2)
|
ResistanceCalc(1, r); // do przodu (w stronę Point2)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void TTraction::PowerSet(TTractionPowerSource *ps)
|
void TTraction::PowerSet(TTractionPowerSource *ps)
|
||||||
{ // podłączenie przęsła do zasilacza
|
{ // podłączenie przęsła do zasilacza
|
||||||
if (ps->bSection)
|
if (ps->bSection)
|
||||||
psSection = ps; // ustalenie sekcji zasilania
|
psSection = ps; // ustalenie sekcji zasilania
|
||||||
else
|
else
|
||||||
{ // ustalenie punktu zasilania (nie ma jeszcze połączeń między przęsłami)
|
{ // ustalenie punktu zasilania (nie ma jeszcze połączeń między przęsłami)
|
||||||
psPowered = ps; // ustawienie bezpośredniego zasilania dla przęsła
|
psPowered = ps; // ustawienie bezpośredniego zasilania dla przęsła
|
||||||
psPower[0] = psPower[1] = ps; // a to chyba nie jest dobry pomysł, bo nawet zasilane przęsło
|
psPower[0] = psPower[1] = ps; // a to chyba nie jest dobry pomysł, bo nawet zasilane przęsło
|
||||||
// powinno mieć wskazania na inne
|
// powinno mieć wskazania na inne
|
||||||
fResistance[0] = fResistance[1] = 0.0; // a liczy się tylko rezystancja zasilacza
|
fResistance[0] = fResistance[1] = 0.0; // a liczy się tylko rezystancja zasilacza
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
double TTraction::VoltageGet(double u, double i)
|
double TTraction::VoltageGet(double u, double i)
|
||||||
{ // pobranie napięcia na przęśle po podłączeniu do niego rezystancji (res) - na razie jest to prąd
|
{ // pobranie napięcia na przęśle po podłączeniu do niego rezystancji (res) - na razie jest to prąd
|
||||||
if (!psSection)
|
if (!psSection)
|
||||||
if (!psPowered)
|
if (!psPowered)
|
||||||
return NominalVoltage; // jak nie ma zasilacza, to napięcie podane w przęśle
|
return NominalVoltage; // jak nie ma zasilacza, to napięcie podane w przęśle
|
||||||
// na początek można założyć, że wszystkie podstacje mają to samo napięcie i nie płynie prąd
|
// na początek można założyć, że wszystkie podstacje mają to samo napięcie i nie płynie prąd
|
||||||
// pomiędzy nimi
|
// pomiędzy nimi
|
||||||
// dla danego przęsła mamy 3 źródła zasilania
|
// dla danego przęsła mamy 3 źródła zasilania
|
||||||
// 1. zasilacz psPower[0] z rezystancją fResistance[0] oraz jego wewnętrzną
|
// 1. zasilacz psPower[0] z rezystancją fResistance[0] oraz jego wewnętrzną
|
||||||
// 2. zasilacz psPower[1] z rezystancją fResistance[1] oraz jego wewnętrzną
|
// 2. zasilacz psPower[1] z rezystancją fResistance[1] oraz jego wewnętrzną
|
||||||
// 3. zasilacz psPowered z jego wewnętrzną rezystancją dla przęseł zasilanych bezpośrednio
|
// 3. zasilacz psPowered z jego wewnętrzną rezystancją dla przęseł zasilanych bezpośrednio
|
||||||
double res = (i != 0.0) ? (u / i) : 10000.0;
|
double res = (i != 0.0) ? (u / i) : 10000.0;
|
||||||
if (psPowered)
|
if (psPowered)
|
||||||
return psPowered->CurrentGet(res) *
|
return psPowered->CurrentGet(res) *
|
||||||
res; // yB: dla zasilanego nie baw się w gwiazdy, tylko bierz bezpośrednio
|
res; // yB: dla zasilanego nie baw się w gwiazdy, tylko bierz bezpośrednio
|
||||||
double r0t, r1t, r0g, r1g;
|
double r0t, r1t, r0g, r1g;
|
||||||
double u0, u1, i0, i1;
|
double u0, u1, i0, i1;
|
||||||
r0t = fResistance[0]; //średni pomysł, ale lepsze niż nic
|
r0t = fResistance[0]; //średni pomysł, ale lepsze niż nic
|
||||||
r1t = fResistance[1]; // bo nie uwzględnia spadków z innych pojazdów
|
r1t = fResistance[1]; // bo nie uwzględnia spadków z innych pojazdów
|
||||||
if (psPower[0] && psPower[1])
|
if (psPower[0] && psPower[1])
|
||||||
{ // gdy przęsło jest zasilane z obu stron - mamy trójkąt: res, r0t, r1t
|
{ // gdy przęsło jest zasilane z obu stron - mamy trójkąt: res, r0t, r1t
|
||||||
// yB: Gdy wywali podstacja, to zaczyna się robić nieciekawie - napięcie w sekcji na jednym
|
// yB: Gdy wywali podstacja, to zaczyna się robić nieciekawie - napięcie w sekcji na jednym
|
||||||
// końcu jest równe zasilaniu,
|
// końcu jest równe zasilaniu,
|
||||||
// yB: a na drugim końcu jest równe 0. Kolejna sprawa to rozróżnienie uszynienia sieci na
|
// yB: a na drugim końcu jest równe 0. Kolejna sprawa to rozróżnienie uszynienia sieci na
|
||||||
// podstacji/odłączniku (czyli
|
// podstacji/odłączniku (czyli
|
||||||
// yB: potencjał masy na sieci) od braku zasilania (czyli odłączenie źródła od sieci i brak
|
// yB: potencjał masy na sieci) od braku zasilania (czyli odłączenie źródła od sieci i brak
|
||||||
// jego wpływu na napięcie).
|
// jego wpływu na napięcie).
|
||||||
if ((r0t > 0.0) && (r1t > 0.0))
|
if ((r0t > 0.0) && (r1t > 0.0))
|
||||||
{ // rezystancje w mianowniku nie mogą być zerowe
|
{ // rezystancje w mianowniku nie mogą być zerowe
|
||||||
r0g = res + r0t + (res * r0t) / r1t; // przeliczenie z trójkąta na gwiazdę
|
r0g = res + r0t + (res * r0t) / r1t; // przeliczenie z trójkąta na gwiazdę
|
||||||
r1g = res + r1t + (res * r1t) / r0t;
|
r1g = res + r1t + (res * r1t) / r0t;
|
||||||
// pobierane są prądy dla każdej rezystancji, a suma jest mnożona przez rezystancję
|
// pobierane są prądy dla każdej rezystancji, a suma jest mnożona przez rezystancję
|
||||||
// pojazdu w celu uzyskania napięcia
|
// pojazdu w celu uzyskania napięcia
|
||||||
i0 = psPower[0]->CurrentGet(r0g); // oddzielnie dla sprawdzenia
|
i0 = psPower[0]->CurrentGet(r0g); // oddzielnie dla sprawdzenia
|
||||||
i1 = psPower[1]->CurrentGet(r1g);
|
i1 = psPower[1]->CurrentGet(r1g);
|
||||||
return (i0 + i1) * res;
|
return (i0 + i1) * res;
|
||||||
@@ -706,13 +706,13 @@ double TTraction::VoltageGet(double u, double i)
|
|||||||
else if (r1t >= 0.0)
|
else if (r1t >= 0.0)
|
||||||
return psPower[1]->CurrentGet(res + r1t) * res;
|
return psPower[1]->CurrentGet(res + r1t) * res;
|
||||||
else
|
else
|
||||||
return 0.0; // co z tym zrobić?
|
return 0.0; // co z tym zrobić?
|
||||||
}
|
}
|
||||||
else if (psPower[0] && (r0t >= 0.0))
|
else if (psPower[0] && (r0t >= 0.0))
|
||||||
{ // jeśli odcinek podłączony jest tylko z jednej strony
|
{ // jeśli odcinek podłączony jest tylko z jednej strony
|
||||||
return psPower[0]->CurrentGet(res + r0t) * res;
|
return psPower[0]->CurrentGet(res + r0t) * res;
|
||||||
}
|
}
|
||||||
else if (psPower[1] && (r1t >= 0.0))
|
else if (psPower[1] && (r1t >= 0.0))
|
||||||
return psPower[1]->CurrentGet(res + r1t) * res;
|
return psPower[1]->CurrentGet(res + r1t) * res;
|
||||||
return 0.0; // gdy nie podłączony wcale?
|
return 0.0; // gdy nie podłączony wcale?
|
||||||
};
|
};
|
||||||
|
|||||||
30
Traction.h
30
Traction.h
@@ -19,24 +19,24 @@ using namespace Math3D;
|
|||||||
class TTractionPowerSource;
|
class TTractionPowerSource;
|
||||||
|
|
||||||
class TTraction
|
class TTraction
|
||||||
{ // drut zasilaj¹cy, dla wskaŸników u¿ywaæ przedrostka "hv"
|
{ // drut zasilający, dla wskaźników używać przedrostka "hv"
|
||||||
private:
|
private:
|
||||||
// vector3 vUp,vFront,vLeft;
|
// vector3 vUp,vFront,vLeft;
|
||||||
// matrix4x4 mMatrix;
|
// matrix4x4 mMatrix;
|
||||||
// matryca do wyliczania pozycji drutu w zale¿noœci od [X,Y,k¹t] w scenerii:
|
// matryca do wyliczania pozycji drutu w zależności od [X,Y,kąt] w scenerii:
|
||||||
// - x: odleg³oœæ w bok (czy odbierak siê nie zsun¹³)
|
// - x: odległość w bok (czy odbierak się nie zsunął)
|
||||||
// - y: przyjmuje wartoœæ <0,1>, jeœli pod drutem (wzd³u¿)
|
// - y: przyjmuje wartość <0,1>, jeśli pod drutem (wzdłuż)
|
||||||
// - z: wysokoœæ bezwzglêdna drutu w danym miejsu
|
// - z: wysokość bezwzględna drutu w danym miejsu
|
||||||
public: // na razie
|
public: // na razie
|
||||||
TTractionPowerSource *psPower[2]; // najbli¿sze zasilacze z obu kierunków
|
TTractionPowerSource *psPower[2]; // najbliższe zasilacze z obu kierunków
|
||||||
TTractionPowerSource *psPowered; // ustawione tylko dla bezpoœrednio zasilanego przês³a
|
TTractionPowerSource *psPowered; // ustawione tylko dla bezpośrednio zasilanego przęsła
|
||||||
TTraction *hvNext[2]; //³¹czenie drutów w sieæ
|
TTraction *hvNext[2]; //łączenie drutów w sieć
|
||||||
int iNext[2]; // do którego koñca siê ³¹czy
|
int iNext[2]; // do którego końca się łączy
|
||||||
int iLast; // ustawiony bit 0, jeœli jest ostatnim drutem w sekcji; bit1 - przedostatni
|
int iLast; // ustawiony bit 0, jeśli jest ostatnim drutem w sekcji; bit1 - przedostatni
|
||||||
public:
|
public:
|
||||||
GLuint uiDisplayList;
|
GLuint uiDisplayList;
|
||||||
vector3 pPoint1, pPoint2, pPoint3, pPoint4;
|
vector3 pPoint1, pPoint2, pPoint3, pPoint4;
|
||||||
vector3 vParametric; // wspó³czynniki równania parametrycznego odcinka
|
vector3 vParametric; // współczynniki równania parametrycznego odcinka
|
||||||
double fHeightDifference; //,fMiddleHeight;
|
double fHeightDifference; //,fMiddleHeight;
|
||||||
// int iCategory,iMaterial,iDamageFlag;
|
// int iCategory,iMaterial,iDamageFlag;
|
||||||
// float fU,fR,fMaxI,fWireThickness;
|
// float fU,fR,fMaxI,fWireThickness;
|
||||||
@@ -52,10 +52,10 @@ class TTraction
|
|||||||
float WireOffset;
|
float WireOffset;
|
||||||
std::string asPowerSupplyName; // McZapkie: nazwa podstacji trakcyjnej
|
std::string asPowerSupplyName; // McZapkie: nazwa podstacji trakcyjnej
|
||||||
TTractionPowerSource *
|
TTractionPowerSource *
|
||||||
psSection; // zasilacz (opcjonalnie mo¿e to byæ pulpit steruj¹cy EL2 w hali!)
|
psSection; // zasilacz (opcjonalnie może to być pulpit sterujący EL2 w hali!)
|
||||||
std::string asParallel; // nazwa przês³a, z którym mo¿e byæ bie¿nia wspólna
|
std::string asParallel; // nazwa przęsła, z którym może być bieżnia wspólna
|
||||||
TTraction *hvParallel; // jednokierunkowa i zapêtlona lista przêse³ ewentualnej bie¿ni wspólnej
|
TTraction *hvParallel; // jednokierunkowa i zapętlona lista przęseł ewentualnej bieżni wspólnej
|
||||||
float fResistance[2]; // rezystancja zastêpcza do punktu zasilania (0: przês³o zasilane, <0: do
|
float fResistance[2]; // rezystancja zastępcza do punktu zasilania (0: przęsło zasilane, <0: do
|
||||||
// policzenia)
|
// policzenia)
|
||||||
int iTries;
|
int iTries;
|
||||||
// bool bVisible;
|
// bool bVisible;
|
||||||
|
|||||||
@@ -31,16 +31,16 @@ TTractionPowerSource::TTractionPowerSource(TGroundNode *node)
|
|||||||
SlowFuseTimeOut = 60;
|
SlowFuseTimeOut = 60;
|
||||||
Recuperation = false;
|
Recuperation = false;
|
||||||
|
|
||||||
TotalAdmitance = 1e-10; // 10Mom - jakaœ tam up³ywnoœæ
|
TotalAdmitance = 1e-10; // 10Mom - jakaś tam upływność
|
||||||
TotalPreviousAdmitance = 1e-10; // zero jest szkodliwe
|
TotalPreviousAdmitance = 1e-10; // zero jest szkodliwe
|
||||||
OutputVoltage = 0;
|
OutputVoltage = 0;
|
||||||
FastFuse = false;
|
FastFuse = false;
|
||||||
SlowFuse = false;
|
SlowFuse = false;
|
||||||
FuseTimer = 0;
|
FuseTimer = 0;
|
||||||
FuseCounter = 0;
|
FuseCounter = 0;
|
||||||
psNode[0] = NULL; // sekcje zostan¹ pod³¹czone do zasilaczy
|
psNode[0] = NULL; // sekcje zostaną podłączone do zasilaczy
|
||||||
psNode[1] = NULL;
|
psNode[1] = NULL;
|
||||||
bSection = false; // sekcja nie jest Ÿród³em zasilania, tylko grupuje przês³a
|
bSection = false; // sekcja nie jest źródłem zasilania, tylko grupuje przęsła
|
||||||
gMyNode = node;
|
gMyNode = node;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -70,16 +70,16 @@ bool TTractionPowerSource::Load(cParser *parser)
|
|||||||
*parser >> token;
|
*parser >> token;
|
||||||
if (token.compare("recuperation") == 0)
|
if (token.compare("recuperation") == 0)
|
||||||
Recuperation = true;
|
Recuperation = true;
|
||||||
else if (token.compare("section") == 0) // od³¹cznik sekcyjny
|
else if (token.compare("section") == 0) // odłącznik sekcyjny
|
||||||
bSection = true; // nie jest Ÿród³em zasilania, a jedynie informuje o pr¹dzie od³¹czenia
|
bSection = true; // nie jest źródłem zasilania, a jedynie informuje o prądzie odłączenia
|
||||||
// sekcji z obwodu
|
// sekcji z obwodu
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
if (token.compare("end") != 0)
|
if (token.compare("end") != 0)
|
||||||
Error("tractionpowersource end statement missing");
|
Error("tractionpowersource end statement missing");
|
||||||
// if (!bSection) //od³¹cznik sekcji zasadniczo nie ma impedancji (0.01 jest OK)
|
// if (!bSection) //odłącznik sekcji zasadniczo nie ma impedancji (0.01 jest OK)
|
||||||
if (InternalRes < 0.1) // coœ ma³a ta rezystancja by³a...
|
if (InternalRes < 0.1) // coś mała ta rezystancja była...
|
||||||
InternalRes = 0.2; // tak oko³o 0.2, wg
|
InternalRes = 0.2; // tak około 0.2, wg
|
||||||
// http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf
|
// http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
@@ -90,12 +90,12 @@ bool TTractionPowerSource::Render()
|
|||||||
};
|
};
|
||||||
|
|
||||||
bool TTractionPowerSource::Update(double dt)
|
bool TTractionPowerSource::Update(double dt)
|
||||||
{ // powinno byæ wykonane raz na krok fizyki
|
{ // powinno być wykonane raz na krok fizyki
|
||||||
// if (NominalVoltage * TotalPreviousAdmitance >
|
// if (NominalVoltage * TotalPreviousAdmitance >
|
||||||
// MaxOutputCurrent * 0.00000005) // iloczyn napiêcia i admitancji daje pr¹d
|
// MaxOutputCurrent * 0.00000005) // iloczyn napięcia i admitancji daje prąd
|
||||||
// ErrorLog("Power overload: \"" + gMyNode->asName + "\" with current " + AnsiString(NominalVoltage * TotalPreviousAdmitance) + "A");
|
// ErrorLog("Power overload: \"" + gMyNode->asName + "\" with current " + AnsiString(NominalVoltage * TotalPreviousAdmitance) + "A");
|
||||||
if (NominalVoltage * TotalPreviousAdmitance >
|
if (NominalVoltage * TotalPreviousAdmitance >
|
||||||
MaxOutputCurrent) // iloczyn napiêcia i admitancji daje pr¹d
|
MaxOutputCurrent) // iloczyn napięcia i admitancji daje prąd
|
||||||
{
|
{
|
||||||
FastFuse = true;
|
FastFuse = true;
|
||||||
FuseCounter += 1;
|
FuseCounter += 1;
|
||||||
@@ -111,46 +111,46 @@ bool TTractionPowerSource::Update(double dt)
|
|||||||
FuseTimer = 0;
|
FuseTimer = 0;
|
||||||
}
|
}
|
||||||
if (FastFuse || SlowFuse)
|
if (FastFuse || SlowFuse)
|
||||||
{ // jeœli któryœ z bezpieczników zadzia³a³
|
{ // jeśli któryś z bezpieczników zadziałał
|
||||||
TotalAdmitance = 0;
|
TotalAdmitance = 0;
|
||||||
FuseTimer += dt;
|
FuseTimer += dt;
|
||||||
if (!SlowFuse)
|
if (!SlowFuse)
|
||||||
{ // gdy szybki, odczekaæ krótko i za³¹czyæ
|
{ // gdy szybki, odczekać krótko i załączyć
|
||||||
if (FuseTimer > FastFuseTimeOut)
|
if (FuseTimer > FastFuseTimeOut)
|
||||||
FastFuse = false;
|
FastFuse = false;
|
||||||
}
|
}
|
||||||
else if (FuseTimer > SlowFuseTimeOut)
|
else if (FuseTimer > SlowFuseTimeOut)
|
||||||
{
|
{
|
||||||
SlowFuse = false;
|
SlowFuse = false;
|
||||||
FuseCounter = 0; // dajemy znów szansê
|
FuseCounter = 0; // dajemy znów szansę
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TotalPreviousAdmitance = TotalAdmitance; // u¿ywamy admitancji z poprzedniego kroku
|
TotalPreviousAdmitance = TotalAdmitance; // używamy admitancji z poprzedniego kroku
|
||||||
if (TotalPreviousAdmitance == 0.0)
|
if (TotalPreviousAdmitance == 0.0)
|
||||||
TotalPreviousAdmitance = 1e-10; // przynajmniej minimalna up³ywnoœæ
|
TotalPreviousAdmitance = 1e-10; // przynajmniej minimalna upływność
|
||||||
TotalAdmitance = 1e-10; // a w aktualnym kroku sumujemy admitancjê
|
TotalAdmitance = 1e-10; // a w aktualnym kroku sumujemy admitancję
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
double TTractionPowerSource::CurrentGet(double res)
|
double TTractionPowerSource::CurrentGet(double res)
|
||||||
{ // pobranie wartoœci pr¹du przypadaj¹cego na rezystancjê (res)
|
{ // pobranie wartości prądu przypadającego na rezystancję (res)
|
||||||
// niech pamiêta poprzedni¹ admitancjê i wg niej przydziela pr¹d
|
// niech pamięta poprzednią admitancję i wg niej przydziela prąd
|
||||||
if (SlowFuse || FastFuse)
|
if (SlowFuse || FastFuse)
|
||||||
{ // czekanie na zanik obci¹¿enia sekcji
|
{ // czekanie na zanik obciążenia sekcji
|
||||||
if (res < 100.0) // liczenie czasu dopiero, gdy obci¹¿enie zniknie
|
if (res < 100.0) // liczenie czasu dopiero, gdy obciążenie zniknie
|
||||||
FuseTimer = 0;
|
FuseTimer = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((res > 0) || ((res < 0) && (Recuperation || true)))
|
if ((res > 0) || ((res < 0) && (Recuperation || true)))
|
||||||
TotalAdmitance +=
|
TotalAdmitance +=
|
||||||
1.0 / res; // po³¹czenie równoleg³e rezystancji jest równowa¿ne sumie admitancji
|
1.0 / res; // połączenie równoległe rezystancji jest równoważne sumie admitancji
|
||||||
float NomVolt = (TotalPreviousAdmitance < 0 ? NominalVoltage * 1.083 : NominalVoltage);
|
float NomVolt = (TotalPreviousAdmitance < 0 ? NominalVoltage * 1.083 : NominalVoltage);
|
||||||
TotalCurrent = (TotalPreviousAdmitance != 0.0) ?
|
TotalCurrent = (TotalPreviousAdmitance != 0.0) ?
|
||||||
NomVolt / (InternalRes + 1.0 / TotalPreviousAdmitance) :
|
NomVolt / (InternalRes + 1.0 / TotalPreviousAdmitance) :
|
||||||
0.0; // napiêcie dzielone przez sumê rezystancji wewnêtrznej i obci¹¿enia
|
0.0; // napięcie dzielone przez sumę rezystancji wewnętrznej i obciążenia
|
||||||
OutputVoltage = NomVolt - InternalRes * TotalCurrent; // napiêcie na obci¹¿eniu
|
OutputVoltage = NomVolt - InternalRes * TotalCurrent; // napięcie na obciążeniu
|
||||||
return TotalCurrent / (res * TotalPreviousAdmitance); // pr¹d proporcjonalny do udzia³u (1/res)
|
return TotalCurrent / (res * TotalPreviousAdmitance); // prąd proporcjonalny do udziału (1/res)
|
||||||
// w ca³kowitej admitancji
|
// w całkowitej admitancji
|
||||||
};
|
};
|
||||||
|
|
||||||
void TTractionPowerSource::PowerSet(TTractionPowerSource *ps)
|
void TTractionPowerSource::PowerSet(TTractionPowerSource *ps)
|
||||||
@@ -159,7 +159,7 @@ void TTractionPowerSource::PowerSet(TTractionPowerSource *ps)
|
|||||||
psNode[0] = ps;
|
psNode[0] = ps;
|
||||||
else if (!psNode[1])
|
else if (!psNode[1])
|
||||||
psNode[1] = ps;
|
psNode[1] = ps;
|
||||||
// else ErrorLog("nie mo¿e byæ wiêcej punktów zasilania ni¿ dwa");
|
// else ErrorLog("nie może być więcej punktów zasilania niż dwa");
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -33,12 +33,12 @@ class TTractionPowerSource
|
|||||||
bool SlowFuse;
|
bool SlowFuse;
|
||||||
double FuseTimer;
|
double FuseTimer;
|
||||||
int FuseCounter;
|
int FuseCounter;
|
||||||
TGroundNode *gMyNode; // wskaŸnik na wêze³ rodzica
|
TGroundNode *gMyNode; // wskaźnik na węzeł rodzica
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
public: // zmienne publiczne
|
public: // zmienne publiczne
|
||||||
TTractionPowerSource *psNode[2]; // zasilanie na koñcach dla sekcji
|
TTractionPowerSource *psNode[2]; // zasilanie na końcach dla sekcji
|
||||||
bool bSection; // czy jest sekcj¹
|
bool bSection; // czy jest sekcją
|
||||||
public:
|
public:
|
||||||
// AnsiString asName;
|
// AnsiString asName;
|
||||||
TTractionPowerSource(TGroundNode *node);
|
TTractionPowerSource(TGroundNode *node);
|
||||||
|
|||||||
42
Train.h
42
Train.h
@@ -58,10 +58,10 @@ class TCab
|
|||||||
intlitlow_b; // McZapkie-120503: przyciemnione oswietlenie kabiny
|
intlitlow_b; // McZapkie-120503: przyciemnione oswietlenie kabiny
|
||||||
private:
|
private:
|
||||||
// bool bChangePossible;
|
// bool bChangePossible;
|
||||||
TGauge *ggList; // Ra 2014-08: lista animacji macierzowych (ga貫k) w kabinie
|
TGauge *ggList; // Ra 2014-08: lista animacji macierzowych (gałek) w kabinie
|
||||||
int iGaugesMax, iGauges; // ile miejsca w tablicy i ile jest w u篡ciu
|
int iGaugesMax, iGauges; // ile miejsca w tablicy i ile jest w użyciu
|
||||||
TButton *btList; // Ra 2014-08: lista animacji dwustanowych (lampek) w kabinie
|
TButton *btList; // Ra 2014-08: lista animacji dwustanowych (lampek) w kabinie
|
||||||
int iButtonsMax, iButtons; // ile miejsca w tablicy i ile jest w u篡ciu
|
int iButtonsMax, iButtons; // ile miejsca w tablicy i ile jest w użyciu
|
||||||
public:
|
public:
|
||||||
TGauge *Gauge(int n = -1); // pobranie adresu obiektu
|
TGauge *Gauge(int n = -1); // pobranie adresu obiektu
|
||||||
TButton *Button(int n = -1); // pobranie adresu obiektu
|
TButton *Button(int n = -1); // pobranie adresu obiektu
|
||||||
@@ -112,18 +112,18 @@ class TTrain
|
|||||||
// otherwise
|
// otherwise
|
||||||
bool initialize_button(cParser &Parser, std::string const &Label, int const Cabindex);
|
bool initialize_button(cParser &Parser, std::string const &Label, int const Cabindex);
|
||||||
|
|
||||||
private: //瞠by go nic z zewn靖rz nie przestawia這
|
private: //żeby go nic z zewnątrz nie przestawiało
|
||||||
TDynamicObject *DynamicObject; // przestawia zmiana pojazdu [F5]
|
TDynamicObject *DynamicObject; // przestawia zmiana pojazdu [F5]
|
||||||
private: //瞠by go nic z zewn靖rz nie przestawia這
|
private: //żeby go nic z zewnątrz nie przestawiało
|
||||||
TMoverParameters *mvControlled; // cz這n, w kt鏎ym sterujemy silnikiem
|
TMoverParameters *mvControlled; // człon, w którym sterujemy silnikiem
|
||||||
TMoverParameters *mvOccupied; // cz這n, w kt鏎ym sterujemy hamulcem
|
TMoverParameters *mvOccupied; // człon, w którym sterujemy hamulcem
|
||||||
TMoverParameters *mvSecond; // drugi cz這n (ET40, ET41, ET42, ukrotnienia)
|
TMoverParameters *mvSecond; // drugi człon (ET40, ET41, ET42, ukrotnienia)
|
||||||
TMoverParameters *mvThird; // trzeci cz這n (SN61)
|
TMoverParameters *mvThird; // trzeci człon (SN61)
|
||||||
public: // reszta mo瞠 by?publiczna
|
public: // reszta może by?publiczna
|
||||||
// AnsiString asMessage;
|
// AnsiString asMessage;
|
||||||
|
|
||||||
// McZapkie: definicje wska俲ik闚
|
// McZapkie: definicje wskaźników
|
||||||
// Ra 2014-08: cz瘰ciowo przeniesione do tablicy w TCab
|
// Ra 2014-08: częsciowo przeniesione do tablicy w TCab
|
||||||
TGauge ggZbS;
|
TGauge ggZbS;
|
||||||
TGauge ggClockSInd;
|
TGauge ggClockSInd;
|
||||||
TGauge ggClockMInd;
|
TGauge ggClockMInd;
|
||||||
@@ -137,7 +137,7 @@ class TTrain
|
|||||||
TGauge ggMainGearStatus;
|
TGauge ggMainGearStatus;
|
||||||
|
|
||||||
TGauge ggEngineVoltage;
|
TGauge ggEngineVoltage;
|
||||||
TGauge ggI1B; // drugi cz這n w postaci jawnej
|
TGauge ggI1B; // drugi człon w postaci jawnej
|
||||||
TGauge ggI2B;
|
TGauge ggI2B;
|
||||||
TGauge ggI3B;
|
TGauge ggI3B;
|
||||||
TGauge ggItotalB;
|
TGauge ggItotalB;
|
||||||
@@ -218,8 +218,8 @@ class TTrain
|
|||||||
TGauge ggSignallingButton;
|
TGauge ggSignallingButton;
|
||||||
TGauge ggDoorSignallingButton;
|
TGauge ggDoorSignallingButton;
|
||||||
// TModel3d *mdKabina; McZapkie-030303: to do dynobj
|
// TModel3d *mdKabina; McZapkie-030303: to do dynobj
|
||||||
// TGauge ggDistCounter; //Ra 2014-07: licznik kilometr闚
|
// TGauge ggDistCounter; //Ra 2014-07: licznik kilometrów
|
||||||
// TGauge ggVelocityDgt; //i od razu pr璠ko𦣇iomierz
|
// TGauge ggVelocityDgt; //i od razu prędkościomierz
|
||||||
|
|
||||||
TButton btLampkaPoslizg;
|
TButton btLampkaPoslizg;
|
||||||
TButton btLampkaStyczn;
|
TButton btLampkaStyczn;
|
||||||
@@ -268,7 +268,7 @@ class TTrain
|
|||||||
TButton btLampkaRadiotelefon;
|
TButton btLampkaRadiotelefon;
|
||||||
TButton btLampkaHamienie;
|
TButton btLampkaHamienie;
|
||||||
TButton btLampkaED; // Stele 161228 hamowanie elektrodynamiczne
|
TButton btLampkaED; // Stele 161228 hamowanie elektrodynamiczne
|
||||||
TButton btLampkaJazda; // Ra: nie u篡wane
|
TButton btLampkaJazda; // Ra: nie używane
|
||||||
// KURS90
|
// KURS90
|
||||||
TButton btLampkaBoczniki;
|
TButton btLampkaBoczniki;
|
||||||
TButton btLampkaMaxSila;
|
TButton btLampkaMaxSila;
|
||||||
@@ -280,13 +280,13 @@ class TTrain
|
|||||||
TButton btLampkaDepartureSignal;
|
TButton btLampkaDepartureSignal;
|
||||||
TButton btLampkaBlokadaDrzwi;
|
TButton btLampkaBlokadaDrzwi;
|
||||||
TButton btLampkaHamulecReczny;
|
TButton btLampkaHamulecReczny;
|
||||||
TButton btLampkaForward; // Ra: lampki w prz鏚 i w ty?dla komputerowych kabin
|
TButton btLampkaForward; // Ra: lampki w przód i w ty?dla komputerowych kabin
|
||||||
TButton btLampkaBackward;
|
TButton btLampkaBackward;
|
||||||
|
|
||||||
TButton btCabLight; // hunter-171012: lampa oswietlajaca kabine
|
TButton btCabLight; // hunter-171012: lampa oswietlajaca kabine
|
||||||
// Ra 2013-12: wirtualne "lampki" do odbijania na haslerze w PoKeys
|
// Ra 2013-12: wirtualne "lampki" do odbijania na haslerze w PoKeys
|
||||||
TButton btHaslerBrakes; // ci𦨭ienie w cylindrach
|
TButton btHaslerBrakes; // ciśnienie w cylindrach
|
||||||
TButton btHaslerCurrent; // pr鉅 na silnikach
|
TButton btHaslerCurrent; // prąd na silnikach
|
||||||
|
|
||||||
vector3 pPosition;
|
vector3 pPosition;
|
||||||
vector3 pMechOffset; // driverNpos
|
vector3 pMechOffset; // driverNpos
|
||||||
@@ -395,8 +395,8 @@ class TTrain
|
|||||||
float fHVoltage; // napi?cie dla dynamicznych ga?ek
|
float fHVoltage; // napi?cie dla dynamicznych ga?ek
|
||||||
float fHCurrent[4]; // pr?dy: suma i amperomierze 1,2,3
|
float fHCurrent[4]; // pr?dy: suma i amperomierze 1,2,3
|
||||||
float fEngine[4]; // obroty te? trzeba pobra?
|
float fEngine[4]; // obroty te? trzeba pobra?
|
||||||
int iCarNo, iPowerNo, iUnitNo; // liczba pojazdow, czlonow napednych i jednostek spi皻ych ze
|
int iCarNo, iPowerNo, iUnitNo; // liczba pojazdow, czlonow napednych i jednostek spiętych ze
|
||||||
// sob<EFBFBD>
|
// sobą
|
||||||
bool bDoors[20][3]; // drzwi dla wszystkich czlonow
|
bool bDoors[20][3]; // drzwi dla wszystkich czlonow
|
||||||
int iUnits[20]; // numer jednostki
|
int iUnits[20]; // numer jednostki
|
||||||
int iDoorNo[20]; // liczba drzwi
|
int iDoorNo[20]; // liczba drzwi
|
||||||
|
|||||||
172
TrkFoll.cpp
172
TrkFoll.cpp
@@ -28,7 +28,7 @@ TTrackFollower::TTrackFollower()
|
|||||||
fCurrentDistance = 0;
|
fCurrentDistance = 0;
|
||||||
pPosition = vAngles = vector3(0, 0, 0);
|
pPosition = vAngles = vector3(0, 0, 0);
|
||||||
fDirection = 1; // jest przodem do Point2
|
fDirection = 1; // jest przodem do Point2
|
||||||
fOffsetH = 0.0; // na starcie stoi na środku
|
fOffsetH = 0.0; // na starcie stoi na środku
|
||||||
}
|
}
|
||||||
|
|
||||||
TTrackFollower::~TTrackFollower()
|
TTrackFollower::~TTrackFollower()
|
||||||
@@ -40,7 +40,7 @@ bool TTrackFollower::Init(TTrack *pTrack, TDynamicObject *NewOwner, double fDir)
|
|||||||
fDirection = fDir;
|
fDirection = fDir;
|
||||||
Owner = NewOwner;
|
Owner = NewOwner;
|
||||||
SetCurrentTrack(pTrack, 0);
|
SetCurrentTrack(pTrack, 0);
|
||||||
iEventFlag = 3; // na torze startowym również wykonać eventy 1/2
|
iEventFlag = 3; // na torze startowym również wykonać eventy 1/2
|
||||||
iEventallFlag = 3;
|
iEventallFlag = 3;
|
||||||
if ((pCurrentSegment)) // && (pCurrentSegment->GetLength()<fFirstDistance))
|
if ((pCurrentSegment)) // && (pCurrentSegment->GetLength()<fFirstDistance))
|
||||||
return false;
|
return false;
|
||||||
@@ -52,52 +52,52 @@ TTrack * TTrackFollower::SetCurrentTrack(TTrack *pTrack, int end)
|
|||||||
if (pTrack)
|
if (pTrack)
|
||||||
switch (pTrack->eType)
|
switch (pTrack->eType)
|
||||||
{
|
{
|
||||||
case tt_Switch: // jeśli zwrotnica, to przekładamy ją, aby uzyskać dobry segment
|
case tt_Switch: // jeśli zwrotnica, to przekładamy ją, aby uzyskać dobry segment
|
||||||
{
|
{
|
||||||
int i = (end ? pCurrentTrack->iNextDirection : pCurrentTrack->iPrevDirection);
|
int i = (end ? pCurrentTrack->iNextDirection : pCurrentTrack->iPrevDirection);
|
||||||
if (i > 0) // jeżeli wjazd z ostrza
|
if (i > 0) // jeżeli wjazd z ostrza
|
||||||
pTrack->SwitchForced(i >> 1, Owner); // to przełożenie zwrotnicy - rozprucie!
|
pTrack->SwitchForced(i >> 1, Owner); // to przełożenie zwrotnicy - rozprucie!
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case tt_Cross: // skrzyżowanie trzeba tymczasowo przełączyć, aby wjechać na właściwy tor
|
case tt_Cross: // skrzyżowanie trzeba tymczasowo przełączyć, aby wjechać na właściwy tor
|
||||||
{
|
{
|
||||||
iSegment = Owner->RouteWish(pTrack); // nr segmentu został ustalony podczas skanowania
|
iSegment = Owner->RouteWish(pTrack); // nr segmentu został ustalony podczas skanowania
|
||||||
// Ra 2014-08: aby ustalić dalszą trasę, należy zapytać AI - trasa jest ustalana podczas
|
// Ra 2014-08: aby ustalić dalszą trasę, należy zapytać AI - trasa jest ustalana podczas
|
||||||
// skanowania
|
// skanowania
|
||||||
// Ra 15-01: zapytanie AI nie wybiera segmentu - kolejny skanujący może przestawić
|
// Ra 15-01: zapytanie AI nie wybiera segmentu - kolejny skanujący może przestawić
|
||||||
// pTrack->CrossSegment(end?pCurrentTrack->iNextDirection:pCurrentTrack->iPrevDirection,i);
|
// pTrack->CrossSegment(end?pCurrentTrack->iNextDirection:pCurrentTrack->iPrevDirection,i);
|
||||||
// //ustawienie właściwego wskaźnika
|
// //ustawienie właściwego wskaźnika
|
||||||
// powinno zwracać kierunek do zapamiętania, bo segmenty mogą mieć różny kierunek
|
// powinno zwracać kierunek do zapamiętania, bo segmenty mogą mieć różny kierunek
|
||||||
// if fDirection=(iSegment>0)?1.0:-1.0; //kierunek na tym segmencie jest ustalany
|
// if fDirection=(iSegment>0)?1.0:-1.0; //kierunek na tym segmencie jest ustalany
|
||||||
// bezpośrednio
|
// bezpośrednio
|
||||||
if (iSegment == 0)
|
if (iSegment == 0)
|
||||||
{ // to jest błędna sytuacja - generuje pętle zawracające za skrzyżowaniem - ustalić,
|
{ // to jest błędna sytuacja - generuje pętle zawracające za skrzyżowaniem - ustalić,
|
||||||
// kiedy powstaje!
|
// kiedy powstaje!
|
||||||
iSegment = 1; // doraźna poprawka
|
iSegment = 1; // doraźna poprawka
|
||||||
}
|
}
|
||||||
if ((end ? iSegment : -iSegment) < 0)
|
if ((end ? iSegment : -iSegment) < 0)
|
||||||
fDirection = -fDirection; // wtórna zmiana
|
fDirection = -fDirection; // wtórna zmiana
|
||||||
pTrack->SwitchForced(abs(iSegment) - 1, NULL); // wybór zapamiętanego segmentu
|
pTrack->SwitchForced(abs(iSegment) - 1, NULL); // wybór zapamiętanego segmentu
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!pTrack)
|
if (!pTrack)
|
||||||
{ // gdy nie ma toru w kierunku jazdy
|
{ // gdy nie ma toru w kierunku jazdy
|
||||||
pTrack = pCurrentTrack->NullCreate(
|
pTrack = pCurrentTrack->NullCreate(
|
||||||
end); // tworzenie toru wykolejącego na przedłużeniu pCurrentTrack
|
end); // tworzenie toru wykolejącego na przedłużeniu pCurrentTrack
|
||||||
if (!end) // jeśli dodana od strony zero, to zmiana kierunku
|
if (!end) // jeśli dodana od strony zero, to zmiana kierunku
|
||||||
fDirection = -fDirection; // wtórna zmiana
|
fDirection = -fDirection; // wtórna zmiana
|
||||||
// if (pTrack->iCategoryFlag&2)
|
// if (pTrack->iCategoryFlag&2)
|
||||||
//{//jeśli samochód, zepsuć na miejscu
|
//{//jeśli samochód, zepsuć na miejscu
|
||||||
// Owner->MoverParameters->V=0; //zatrzymać
|
// Owner->MoverParameters->V=0; //zatrzymać
|
||||||
// Owner->MoverParameters->Power=0; //ukraść silnik
|
// Owner->MoverParameters->Power=0; //ukraść silnik
|
||||||
// Owner->MoverParameters->AccS=0; //wchłonąć moc
|
// Owner->MoverParameters->AccS=0; //wchłonąć moc
|
||||||
// Global::iPause|=1; //zapauzowanie symulacji
|
// Global::iPause|=1; //zapauzowanie symulacji
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // najpierw +1, później -1, aby odcinek izolowany wspólny dla tych torów nie wykrył zera
|
{ // najpierw +1, później -1, aby odcinek izolowany wspólny dla tych torów nie wykrył zera
|
||||||
pTrack->AxleCounter(+1, Owner); // zajęcie nowego toru
|
pTrack->AxleCounter(+1, Owner); // zajęcie nowego toru
|
||||||
if (pCurrentTrack)
|
if (pCurrentTrack)
|
||||||
pCurrentTrack->AxleCounter(-1, Owner); // opuszczenie tamtego toru
|
pCurrentTrack->AxleCounter(-1, Owner); // opuszczenie tamtego toru
|
||||||
}
|
}
|
||||||
@@ -109,31 +109,31 @@ TTrack * TTrackFollower::SetCurrentTrack(TTrack *pTrack, int end)
|
|||||||
};
|
};
|
||||||
|
|
||||||
bool TTrackFollower::Move(double fDistance, bool bPrimary)
|
bool TTrackFollower::Move(double fDistance, bool bPrimary)
|
||||||
{ // przesuwanie wózka po torach o odległość (fDistance), z wyzwoleniem eventów
|
{ // przesuwanie wózka po torach o odległość (fDistance), z wyzwoleniem eventów
|
||||||
// bPrimary=true - jest pierwszą osią w pojeździe, czyli generuje eventy i przepisuje pojazd
|
// bPrimary=true - jest pierwszą osią w pojeździe, czyli generuje eventy i przepisuje pojazd
|
||||||
// Ra: zwraca false, jeśli pojazd ma być usunięty
|
// Ra: zwraca false, jeśli pojazd ma być usunięty
|
||||||
fDistance *= fDirection; // dystans mnożnony przez kierunek
|
fDistance *= fDirection; // dystans mnożnony przez kierunek
|
||||||
double s; // roboczy dystans
|
double s; // roboczy dystans
|
||||||
double dir; // zapamiętany kierunek do sprawdzenia, czy się zmienił
|
double dir; // zapamiętany kierunek do sprawdzenia, czy się zmienił
|
||||||
bool bCanSkip; // czy przemieścić pojazd na inny tor
|
bool bCanSkip; // czy przemieścić pojazd na inny tor
|
||||||
while (true) // pętla wychodzi, gdy przesunięcie wyjdzie zerowe
|
while (true) // pętla wychodzi, gdy przesunięcie wyjdzie zerowe
|
||||||
{ // pętla przesuwająca wózek przez kolejne tory, aż do trafienia w jakiś
|
{ // pętla przesuwająca wózek przez kolejne tory, aż do trafienia w jakiś
|
||||||
if (!pCurrentTrack)
|
if (!pCurrentTrack)
|
||||||
return false; // nie ma toru, to nie ma przesuwania
|
return false; // nie ma toru, to nie ma przesuwania
|
||||||
if (pCurrentTrack->iEvents) // sumaryczna informacja o eventach
|
if (pCurrentTrack->iEvents) // sumaryczna informacja o eventach
|
||||||
{ // omijamy cały ten blok, gdy tor nie ma on żadnych eventów (większość nie ma)
|
{ // omijamy cały ten blok, gdy tor nie ma on żadnych eventów (większość nie ma)
|
||||||
if (fDistance < 0)
|
if (fDistance < 0)
|
||||||
{
|
{
|
||||||
if (iSetFlag(iEventFlag, -1)) // zawsze zeruje flagę sprawdzenia, jak mechanik
|
if (iSetFlag(iEventFlag, -1)) // zawsze zeruje flagę sprawdzenia, jak mechanik
|
||||||
// dosiądzie, to się nie wykona
|
// dosiądzie, to się nie wykona
|
||||||
if (Owner->Mechanik->Primary()) // tylko dla jednego członu
|
if (Owner->Mechanik->Primary()) // tylko dla jednego członu
|
||||||
// if (TestFlag(iEventFlag,1)) //McZapkie-280503: wyzwalanie event tylko dla
|
// if (TestFlag(iEventFlag,1)) //McZapkie-280503: wyzwalanie event tylko dla
|
||||||
// pojazdow z obsada
|
// pojazdow z obsada
|
||||||
if (bPrimary && pCurrentTrack->evEvent1 &&
|
if (bPrimary && pCurrentTrack->evEvent1 &&
|
||||||
(!pCurrentTrack->evEvent1->iQueued))
|
(!pCurrentTrack->evEvent1->iQueued))
|
||||||
Global::AddToQuery(pCurrentTrack->evEvent1, Owner); // dodanie do
|
Global::AddToQuery(pCurrentTrack->evEvent1, Owner); // dodanie do
|
||||||
// kolejki
|
// kolejki
|
||||||
// Owner->RaAxleEvent(pCurrentTrack->Event1); //Ra: dynamic zdecyduje, czy dodać do
|
// Owner->RaAxleEvent(pCurrentTrack->Event1); //Ra: dynamic zdecyduje, czy dodać do
|
||||||
// kolejki
|
// kolejki
|
||||||
// if (TestFlag(iEventallFlag,1))
|
// if (TestFlag(iEventallFlag,1))
|
||||||
if (iSetFlag(iEventallFlag,
|
if (iSetFlag(iEventallFlag,
|
||||||
@@ -141,79 +141,79 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary)
|
|||||||
if (bPrimary && pCurrentTrack->evEventall1 &&
|
if (bPrimary && pCurrentTrack->evEventall1 &&
|
||||||
(!pCurrentTrack->evEventall1->iQueued))
|
(!pCurrentTrack->evEventall1->iQueued))
|
||||||
Global::AddToQuery(pCurrentTrack->evEventall1, Owner); // dodanie do kolejki
|
Global::AddToQuery(pCurrentTrack->evEventall1, Owner); // dodanie do kolejki
|
||||||
// Owner->RaAxleEvent(pCurrentTrack->Eventall1); //Ra: dynamic zdecyduje, czy dodać
|
// Owner->RaAxleEvent(pCurrentTrack->Eventall1); //Ra: dynamic zdecyduje, czy dodać
|
||||||
// do kolejki
|
// do kolejki
|
||||||
}
|
}
|
||||||
else if (fDistance > 0)
|
else if (fDistance > 0)
|
||||||
{
|
{
|
||||||
if (iSetFlag(iEventFlag, -2)) // zawsze ustawia flagę sprawdzenia, jak mechanik
|
if (iSetFlag(iEventFlag, -2)) // zawsze ustawia flagę sprawdzenia, jak mechanik
|
||||||
// dosiądzie, to się nie wykona
|
// dosiądzie, to się nie wykona
|
||||||
if (Owner->Mechanik->Primary()) // tylko dla jednego członu
|
if (Owner->Mechanik->Primary()) // tylko dla jednego członu
|
||||||
// if (TestFlag(iEventFlag,2)) //sprawdzanie jest od razu w pierwszym
|
// if (TestFlag(iEventFlag,2)) //sprawdzanie jest od razu w pierwszym
|
||||||
// warunku
|
// warunku
|
||||||
if (bPrimary && pCurrentTrack->evEvent2 &&
|
if (bPrimary && pCurrentTrack->evEvent2 &&
|
||||||
(!pCurrentTrack->evEvent2->iQueued))
|
(!pCurrentTrack->evEvent2->iQueued))
|
||||||
Global::AddToQuery(pCurrentTrack->evEvent2, Owner);
|
Global::AddToQuery(pCurrentTrack->evEvent2, Owner);
|
||||||
// Owner->RaAxleEvent(pCurrentTrack->Event2); //Ra: dynamic zdecyduje, czy dodać do
|
// Owner->RaAxleEvent(pCurrentTrack->Event2); //Ra: dynamic zdecyduje, czy dodać do
|
||||||
// kolejki
|
// kolejki
|
||||||
// if (TestFlag(iEventallFlag,2))
|
// if (TestFlag(iEventallFlag,2))
|
||||||
if (iSetFlag(iEventallFlag,
|
if (iSetFlag(iEventallFlag,
|
||||||
-2)) // sprawdza i zeruje na przyszłość, true jeśli zmieni z 2 na 0
|
-2)) // sprawdza i zeruje na przyszłość, true jeśli zmieni z 2 na 0
|
||||||
if (bPrimary && pCurrentTrack->evEventall2 &&
|
if (bPrimary && pCurrentTrack->evEventall2 &&
|
||||||
(!pCurrentTrack->evEventall2->iQueued))
|
(!pCurrentTrack->evEventall2->iQueued))
|
||||||
Global::AddToQuery(pCurrentTrack->evEventall2, Owner);
|
Global::AddToQuery(pCurrentTrack->evEventall2, Owner);
|
||||||
// Owner->RaAxleEvent(pCurrentTrack->Eventall2); //Ra: dynamic zdecyduje, czy dodać
|
// Owner->RaAxleEvent(pCurrentTrack->Eventall2); //Ra: dynamic zdecyduje, czy dodać
|
||||||
// do kolejki
|
// do kolejki
|
||||||
}
|
}
|
||||||
else // if (fDistance==0) //McZapkie-140602: wyzwalanie zdarzenia gdy pojazd stoi
|
else // if (fDistance==0) //McZapkie-140602: wyzwalanie zdarzenia gdy pojazd stoi
|
||||||
{
|
{
|
||||||
if (Owner->Mechanik->Primary()) // tylko dla jednego członu
|
if (Owner->Mechanik->Primary()) // tylko dla jednego członu
|
||||||
if (pCurrentTrack->evEvent0)
|
if (pCurrentTrack->evEvent0)
|
||||||
if (!pCurrentTrack->evEvent0->iQueued)
|
if (!pCurrentTrack->evEvent0->iQueued)
|
||||||
Global::AddToQuery(pCurrentTrack->evEvent0, Owner);
|
Global::AddToQuery(pCurrentTrack->evEvent0, Owner);
|
||||||
// Owner->RaAxleEvent(pCurrentTrack->Event0); //Ra: dynamic zdecyduje, czy dodać do
|
// Owner->RaAxleEvent(pCurrentTrack->Event0); //Ra: dynamic zdecyduje, czy dodać do
|
||||||
// kolejki
|
// kolejki
|
||||||
if (pCurrentTrack->evEventall0)
|
if (pCurrentTrack->evEventall0)
|
||||||
if (!pCurrentTrack->evEventall0->iQueued)
|
if (!pCurrentTrack->evEventall0->iQueued)
|
||||||
Global::AddToQuery(pCurrentTrack->evEventall0, Owner);
|
Global::AddToQuery(pCurrentTrack->evEventall0, Owner);
|
||||||
// Owner->RaAxleEvent(pCurrentTrack->Eventall0); //Ra: dynamic zdecyduje, czy dodać
|
// Owner->RaAxleEvent(pCurrentTrack->Eventall0); //Ra: dynamic zdecyduje, czy dodać
|
||||||
// do kolejki
|
// do kolejki
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!pCurrentSegment) // jeżeli nie ma powiązanego segmentu toru?
|
if (!pCurrentSegment) // jeżeli nie ma powiązanego segmentu toru?
|
||||||
return false;
|
return false;
|
||||||
// if (fDistance==0.0) return true; //Ra: jak stoi, to chyba dalej nie ma co kombinować?
|
// if (fDistance==0.0) return true; //Ra: jak stoi, to chyba dalej nie ma co kombinować?
|
||||||
s = fCurrentDistance + fDistance; // doliczenie przesunięcia
|
s = fCurrentDistance + fDistance; // doliczenie przesunięcia
|
||||||
// Ra: W Point2 toru może znajdować się "dziura", która zamieni energię kinetyczną
|
// Ra: W Point2 toru może znajdować się "dziura", która zamieni energię kinetyczną
|
||||||
// ruchu wzdłużnego na energię potencjalną, zamieniającą się potem na energię
|
// ruchu wzdłużnego na energię potencjalną, zamieniającą się potem na energię
|
||||||
// sprężystości na amortyzatorach. Należałoby we wpisie toru umieścić współczynnik
|
// sprężystości na amortyzatorach. Należałoby we wpisie toru umieścić współczynnik
|
||||||
// podziału energii kinetycznej.
|
// podziału energii kinetycznej.
|
||||||
// Współczynnik normalnie 1, z dziurą np. 0.99, a -1 będzie oznaczało 100% odbicia (kozioł).
|
// Współczynnik normalnie 1, z dziurą np. 0.99, a -1 będzie oznaczało 100% odbicia (kozioł).
|
||||||
// Albo w postaci kąta: normalnie 0°, a 180° oznacza 100% odbicia (cosinus powyższego).
|
// Albo w postaci kąta: normalnie 0°, a 180° oznacza 100% odbicia (cosinus powyższego).
|
||||||
/*
|
/*
|
||||||
if (pCurrentTrack->eType==tt_Cross)
|
if (pCurrentTrack->eType==tt_Cross)
|
||||||
{//zjazdu ze skrzyżowania nie da się określić przez (iPrevDirection) i (iNextDirection)
|
{//zjazdu ze skrzyżowania nie da się określić przez (iPrevDirection) i (iNextDirection)
|
||||||
//int segment=Owner->RouteWish(pCurrentTrack); //numer segmentu dla skrzyżowań
|
//int segment=Owner->RouteWish(pCurrentTrack); //numer segmentu dla skrzyżowań
|
||||||
//pCurrentTrack->SwitchForced(abs(segment)-1,NULL); //tymczasowo ustawienie tego segmentu
|
//pCurrentTrack->SwitchForced(abs(segment)-1,NULL); //tymczasowo ustawienie tego segmentu
|
||||||
//pCurrentSegment=pCurrentTrack->CurrentSegment(); //odświeżyć sobie wskaźnik segmentu
|
//pCurrentSegment=pCurrentTrack->CurrentSegment(); //odświeżyć sobie wskaźnik segmentu
|
||||||
(?)
|
(?)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
if (s < 0)
|
if (s < 0)
|
||||||
{ // jeśli przekroczenie toru od strony Point1
|
{ // jeśli przekroczenie toru od strony Point1
|
||||||
bCanSkip = bPrimary ? pCurrentTrack->CheckDynamicObject(Owner) : false;
|
bCanSkip = bPrimary ? pCurrentTrack->CheckDynamicObject(Owner) : false;
|
||||||
if (bCanSkip) // tylko główna oś przenosi pojazd do innego toru
|
if (bCanSkip) // tylko główna oś przenosi pojazd do innego toru
|
||||||
Owner->MyTrack->RemoveDynamicObject(
|
Owner->MyTrack->RemoveDynamicObject(
|
||||||
Owner); // zdejmujemy pojazd z dotychczasowego toru
|
Owner); // zdejmujemy pojazd z dotychczasowego toru
|
||||||
dir = fDirection;
|
dir = fDirection;
|
||||||
if (pCurrentTrack->eType == tt_Cross)
|
if (pCurrentTrack->eType == tt_Cross)
|
||||||
{
|
{
|
||||||
if (!SetCurrentTrack(pCurrentTrack->Neightbour(iSegment, fDirection), 0))
|
if (!SetCurrentTrack(pCurrentTrack->Neightbour(iSegment, fDirection), 0))
|
||||||
return false; // wyjście z błędem
|
return false; // wyjście z błędem
|
||||||
}
|
}
|
||||||
else if (!SetCurrentTrack(pCurrentTrack->Neightbour(-1, fDirection),
|
else if (!SetCurrentTrack(pCurrentTrack->Neightbour(-1, fDirection),
|
||||||
0)) // ustawia fDirection
|
0)) // ustawia fDirection
|
||||||
return false; // wyjście z błędem
|
return false; // wyjście z błędem
|
||||||
if (dir == fDirection) //(pCurrentTrack->iPrevDirection)
|
if (dir == fDirection) //(pCurrentTrack->iPrevDirection)
|
||||||
{ // gdy kierunek bez zmiany (Point1->Point2)
|
{ // gdy kierunek bez zmiany (Point1->Point2)
|
||||||
fCurrentDistance = pCurrentSegment->GetLength();
|
fCurrentDistance = pCurrentSegment->GetLength();
|
||||||
@@ -225,7 +225,7 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary)
|
|||||||
fDistance = -s;
|
fDistance = -s;
|
||||||
}
|
}
|
||||||
if (bCanSkip)
|
if (bCanSkip)
|
||||||
{ // jak główna oś, to dodanie pojazdu do nowego toru
|
{ // jak główna oś, to dodanie pojazdu do nowego toru
|
||||||
pCurrentTrack->AddDynamicObject(Owner);
|
pCurrentTrack->AddDynamicObject(Owner);
|
||||||
iEventFlag =
|
iEventFlag =
|
||||||
3; // McZapkie-020602: umozliwienie uruchamiania event1,2 po zmianie toru
|
3; // McZapkie-020602: umozliwienie uruchamiania event1,2 po zmianie toru
|
||||||
@@ -236,9 +236,9 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (s > pCurrentSegment->GetLength())
|
else if (s > pCurrentSegment->GetLength())
|
||||||
{ // jeśli przekroczenie toru od strony Point2
|
{ // jeśli przekroczenie toru od strony Point2
|
||||||
bCanSkip = bPrimary ? pCurrentTrack->CheckDynamicObject(Owner) : false;
|
bCanSkip = bPrimary ? pCurrentTrack->CheckDynamicObject(Owner) : false;
|
||||||
if (bCanSkip) // tylko główna oś przenosi pojazd do innego toru
|
if (bCanSkip) // tylko główna oś przenosi pojazd do innego toru
|
||||||
Owner->MyTrack->RemoveDynamicObject(
|
Owner->MyTrack->RemoveDynamicObject(
|
||||||
Owner); // zdejmujemy pojazd z dotychczasowego toru
|
Owner); // zdejmujemy pojazd z dotychczasowego toru
|
||||||
fDistance = s - pCurrentSegment->GetLength();
|
fDistance = s - pCurrentSegment->GetLength();
|
||||||
@@ -246,11 +246,11 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary)
|
|||||||
if (pCurrentTrack->eType == tt_Cross)
|
if (pCurrentTrack->eType == tt_Cross)
|
||||||
{
|
{
|
||||||
if (!SetCurrentTrack(pCurrentTrack->Neightbour(iSegment, fDirection), 1))
|
if (!SetCurrentTrack(pCurrentTrack->Neightbour(iSegment, fDirection), 1))
|
||||||
return false; // wyjście z błędem
|
return false; // wyjście z błędem
|
||||||
}
|
}
|
||||||
else if (!SetCurrentTrack(pCurrentTrack->Neightbour(1, fDirection),
|
else if (!SetCurrentTrack(pCurrentTrack->Neightbour(1, fDirection),
|
||||||
1)) // ustawia fDirection
|
1)) // ustawia fDirection
|
||||||
return false; // wyjście z błędem
|
return false; // wyjście z błędem
|
||||||
if (dir != fDirection) //(pCurrentTrack->iNextDirection)
|
if (dir != fDirection) //(pCurrentTrack->iNextDirection)
|
||||||
{ // gdy zmiana kierunku toru (Point2->Point2)
|
{ // gdy zmiana kierunku toru (Point2->Point2)
|
||||||
fDistance = -fDistance; //(s-pCurrentSegment->GetLength());
|
fDistance = -fDistance; //(s-pCurrentSegment->GetLength());
|
||||||
@@ -259,7 +259,7 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary)
|
|||||||
else // gdy kierunek bez zmiany (Point2->Point1)
|
else // gdy kierunek bez zmiany (Point2->Point1)
|
||||||
fCurrentDistance = 0;
|
fCurrentDistance = 0;
|
||||||
if (bCanSkip)
|
if (bCanSkip)
|
||||||
{ // jak główna oś, to dodanie pojazdu do nowego toru
|
{ // jak główna oś, to dodanie pojazdu do nowego toru
|
||||||
pCurrentTrack->AddDynamicObject(Owner);
|
pCurrentTrack->AddDynamicObject(Owner);
|
||||||
iEventFlag =
|
iEventFlag =
|
||||||
3; // McZapkie-020602: umozliwienie uruchamiania event1,2 po zmianie toru
|
3; // McZapkie-020602: umozliwienie uruchamiania event1,2 po zmianie toru
|
||||||
@@ -270,9 +270,9 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // gdy zostaje na tym samym torze (przesuwanie już nie zmienia toru)
|
{ // gdy zostaje na tym samym torze (przesuwanie już nie zmienia toru)
|
||||||
if (bPrimary)
|
if (bPrimary)
|
||||||
{ // tylko gdy początkowe ustawienie, dodajemy eventy stania do kolejki
|
{ // tylko gdy początkowe ustawienie, dodajemy eventy stania do kolejki
|
||||||
if (Owner->MoverParameters->ActiveCab != 0)
|
if (Owner->MoverParameters->ActiveCab != 0)
|
||||||
// if (Owner->MoverParameters->CabNo!=0)
|
// if (Owner->MoverParameters->CabNo!=0)
|
||||||
{
|
{
|
||||||
@@ -288,25 +288,25 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary)
|
|||||||
}
|
}
|
||||||
fCurrentDistance = s;
|
fCurrentDistance = s;
|
||||||
// fDistance=0;
|
// fDistance=0;
|
||||||
return ComputatePosition(); // przeliczenie XYZ, true o ile nie wyjechał na NULL
|
return ComputatePosition(); // przeliczenie XYZ, true o ile nie wyjechał na NULL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
bool TTrackFollower::ComputatePosition()
|
bool TTrackFollower::ComputatePosition()
|
||||||
{ // ustalenie współrzędnych XYZ
|
{ // ustalenie współrzędnych XYZ
|
||||||
if (pCurrentSegment) // o ile jest tor
|
if (pCurrentSegment) // o ile jest tor
|
||||||
{
|
{
|
||||||
pCurrentSegment->RaPositionGet(fCurrentDistance, pPosition, vAngles);
|
pCurrentSegment->RaPositionGet(fCurrentDistance, pPosition, vAngles);
|
||||||
if (fDirection < 0) // kąty zależą jeszcze od zwrotu na torze
|
if (fDirection < 0) // kąty zależą jeszcze od zwrotu na torze
|
||||||
{ // kąty są w przedziale <-M_PI;M_PI>
|
{ // kąty są w przedziale <-M_PI;M_PI>
|
||||||
vAngles.x = -vAngles.x; // przechyłka jest w przecinwą stronę
|
vAngles.x = -vAngles.x; // przechyłka jest w przecinwą stronę
|
||||||
vAngles.y = -vAngles.y; // pochylenie jest w przecinwą stronę
|
vAngles.y = -vAngles.y; // pochylenie jest w przecinwą stronę
|
||||||
vAngles.z +=
|
vAngles.z +=
|
||||||
(vAngles.z >= M_PI) ? -M_PI : M_PI; // ale kierunek w planie jest obrócony o 180°
|
(vAngles.z >= M_PI) ? -M_PI : M_PI; // ale kierunek w planie jest obrócony o 180°
|
||||||
}
|
}
|
||||||
if (fOffsetH != 0.0)
|
if (fOffsetH != 0.0)
|
||||||
{ // jeśli przesunięcie względem osi toru, to je doliczyć
|
{ // jeśli przesunięcie względem osi toru, to je doliczyć
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -316,15 +316,15 @@ bool TTrackFollower::ComputatePosition()
|
|||||||
#include "opengl/glew.h"
|
#include "opengl/glew.h"
|
||||||
#include "opengl/glut.h"
|
#include "opengl/glut.h"
|
||||||
void TTrackFollower::Render(float fNr)
|
void TTrackFollower::Render(float fNr)
|
||||||
{ // funkcja rysująca stożek w miejscu osi
|
{ // funkcja rysująca stożek w miejscu osi
|
||||||
glPushMatrix(); // matryca kamery
|
glPushMatrix(); // matryca kamery
|
||||||
glTranslatef(pPosition.x, pPosition.y + 6, pPosition.z); // 6m ponad
|
glTranslatef(pPosition.x, pPosition.y + 6, pPosition.z); // 6m ponad
|
||||||
glRotated(RadToDeg(-vAngles.z), 0, 1, 0); // obrót względem osi OY
|
glRotated(RadToDeg(-vAngles.z), 0, 1, 0); // obrót względem osi OY
|
||||||
// glRotated(RadToDeg(vAngles.z),0,1,0); //obrót względem osi OY
|
// glRotated(RadToDeg(vAngles.z),0,1,0); //obrót względem osi OY
|
||||||
glDisable(GL_LIGHTING);
|
glDisable(GL_LIGHTING);
|
||||||
glColor3f(1.0, 1.0 - fNr, 1.0 - fNr); // biały dla 0, czerwony dla 1
|
glColor3f(1.0, 1.0 - fNr, 1.0 - fNr); // biały dla 0, czerwony dla 1
|
||||||
// glutWireCone(promień podstawy,wysokość,kątność podstawy,ilość segmentów na wysokość)
|
// glutWireCone(promień podstawy,wysokość,kątność podstawy,ilość segmentów na wysokość)
|
||||||
glutWireCone(0.5, 2, 4, 1); // rysowanie stożka (ostrosłupa o podstawie wieloboka)
|
glutWireCone(0.5, 2, 4, 1); // rysowanie stożka (ostrosłupa o podstawie wieloboka)
|
||||||
glEnable(GL_LIGHTING);
|
glEnable(GL_LIGHTING);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|||||||
24
TrkFoll.h
24
TrkFoll.h
@@ -14,22 +14,22 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "McZapkie\MOVER.h"
|
#include "McZapkie\MOVER.h"
|
||||||
|
|
||||||
class TTrackFollower
|
class TTrackFollower
|
||||||
{ // oœ poruszaj¹ca siê po torze
|
{ // oś poruszająca się po torze
|
||||||
private:
|
private:
|
||||||
TTrack *pCurrentTrack; // na którym torze siê znajduje
|
TTrack *pCurrentTrack; // na którym torze siê znajduje
|
||||||
std::shared_ptr<TSegment> pCurrentSegment; // zwrotnice mog¹ mieæ dwa segmenty
|
std::shared_ptr<TSegment> pCurrentSegment; // zwrotnice mog¹ mieæ dwa segmenty
|
||||||
double fCurrentDistance; // przesuniêcie wzglêdem Point1 w stronê Point2
|
double fCurrentDistance; // przesuniêcie wzglêdem Point1 w stronê Point2
|
||||||
double fDirection; // ustawienie wzglêdem toru: -1.0 albo 1.0, mno¿one przez dystans
|
double fDirection; // ustawienie wzglêdem toru: -1.0 albo 1.0, mno¿one przez dystans
|
||||||
bool ComputatePosition(); // przeliczenie pozycji na torze
|
bool ComputatePosition(); // przeliczenie pozycji na torze
|
||||||
TDynamicObject *Owner; // pojazd posiadaj¹cy
|
TDynamicObject *Owner; // pojazd posiadający
|
||||||
int iEventFlag; // McZapkie-020602: informacja o tym czy wyzwalac zdarzenie: 0,1,2,3
|
int iEventFlag; // McZapkie-020602: informacja o tym czy wyzwalac zdarzenie: 0,1,2,3
|
||||||
int iEventallFlag;
|
int iEventallFlag;
|
||||||
int iSegment; // który segment toru jest u¿ywany (¿eby nie przeskakiwa³o po przestawieniu
|
int iSegment; // który segment toru jest używany (żeby nie przeskakiwało po przestawieniu
|
||||||
// zwrotnicy pod taborem)
|
// zwrotnicy pod taborem)
|
||||||
public:
|
public:
|
||||||
double fOffsetH; // Ra: odleg³oœæ œrodka osi od osi toru (dla samochodów) - u¿yæ do wê¿ykowania
|
double fOffsetH; // Ra: odległość środka osi od osi toru (dla samochodów) - użyć do wężykowania
|
||||||
vector3 pPosition; // wspó³rzêdne XYZ w uk³adzie scenerii
|
vector3 pPosition; // współrzędne XYZ w układzie scenerii
|
||||||
vector3 vAngles; // x:przechy³ka, y:pochylenie, z:kierunek w planie (w radianach)
|
vector3 vAngles; // x:przechyłka, y:pochylenie, z:kierunek w planie (w radianach)
|
||||||
TTrackFollower();
|
TTrackFollower();
|
||||||
~TTrackFollower();
|
~TTrackFollower();
|
||||||
TTrack * SetCurrentTrack(TTrack *pTrack, int end);
|
TTrack * SetCurrentTrack(TTrack *pTrack, int end);
|
||||||
@@ -41,8 +41,8 @@ class TTrackFollower
|
|||||||
inline double GetRoll()
|
inline double GetRoll()
|
||||||
{
|
{
|
||||||
return vAngles.x;
|
return vAngles.x;
|
||||||
}; // przechy³ka policzona przy ustalaniu pozycji
|
}; // przechyłka policzona przy ustalaniu pozycji
|
||||||
//{return pCurrentSegment->GetRoll(fCurrentDistance)*fDirection;}; //zamiast liczyæ mo¿na pobraæ
|
//{return pCurrentSegment->GetRoll(fCurrentDistance)*fDirection;}; //zamiast liczyć można pobrać
|
||||||
inline double GetDirection()
|
inline double GetDirection()
|
||||||
{
|
{
|
||||||
return fDirection;
|
return fDirection;
|
||||||
|
|||||||
36
VBO.cpp
36
VBO.cpp
@@ -22,17 +22,17 @@ CMesh::CMesh()
|
|||||||
|
|
||||||
CMesh::~CMesh()
|
CMesh::~CMesh()
|
||||||
{ // usuwanie obiektu
|
{ // usuwanie obiektu
|
||||||
Clear(); // zwolnienie zasobów
|
Clear(); // zwolnienie zasobów
|
||||||
};
|
};
|
||||||
|
|
||||||
void CMesh::MakeArray(int n)
|
void CMesh::MakeArray(int n)
|
||||||
{ // tworzenie tablic
|
{ // tworzenie tablic
|
||||||
m_nVertexCount = n;
|
m_nVertexCount = n;
|
||||||
m_pVNT = new CVertNormTex[m_nVertexCount]; // przydzielenie pamiêci dla tablicy
|
m_pVNT = new CVertNormTex[m_nVertexCount]; // przydzielenie pamięci dla tablicy
|
||||||
};
|
};
|
||||||
|
|
||||||
void CMesh::BuildVBOs(bool del)
|
void CMesh::BuildVBOs(bool del)
|
||||||
{ // tworzenie VBO i kasowanie ju¿ niepotrzebnych tablic
|
{ // tworzenie VBO i kasowanie już niepotrzebnych tablic
|
||||||
// pobierz numer VBO oraz ustaw go jako aktywny
|
// pobierz numer VBO oraz ustaw go jako aktywny
|
||||||
glGenBuffersARB(1, &m_nVBOVertices); // pobierz numer
|
glGenBuffersARB(1, &m_nVBOVertices); // pobierz numer
|
||||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices); // ustaw bufor jako aktualny
|
glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices); // ustaw bufor jako aktualny
|
||||||
@@ -41,26 +41,26 @@ void CMesh::BuildVBOs(bool del)
|
|||||||
// WriteLog("Assigned VBO number "+AnsiString(m_nVBOVertices)+", vertices:
|
// WriteLog("Assigned VBO number "+AnsiString(m_nVBOVertices)+", vertices:
|
||||||
// "+AnsiString(m_nVertexCount));
|
// "+AnsiString(m_nVertexCount));
|
||||||
if (del)
|
if (del)
|
||||||
SafeDeleteArray(m_pVNT); // wierzcho³ki ju¿ siê nie przydadz¹
|
SafeDeleteArray(m_pVNT); // wierzchołki już się nie przydadzą
|
||||||
};
|
};
|
||||||
|
|
||||||
void CMesh::Clear()
|
void CMesh::Clear()
|
||||||
{ // niewirtualne zwolnienie zasobów przez sprz¹tacz albo destruktor
|
{ // niewirtualne zwolnienie zasobów przez sprzątacz albo destruktor
|
||||||
// inna nazwa, ¿eby nie miesza³o siê z funkcj¹ wirtualn¹ sprz¹tacza
|
// inna nazwa, żeby nie mieszało się z funkcją wirtualną sprzątacza
|
||||||
if (m_nVBOVertices) // jeœli by³o coœ rezerwowane
|
if (m_nVBOVertices) // jeśli było coś rezerwowane
|
||||||
{
|
{
|
||||||
glDeleteBuffersARB(1, &m_nVBOVertices); // Free The Memory
|
glDeleteBuffersARB(1, &m_nVBOVertices); // Free The Memory
|
||||||
// WriteLog("Released VBO number "+AnsiString(m_nVBOVertices));
|
// WriteLog("Released VBO number "+AnsiString(m_nVBOVertices));
|
||||||
}
|
}
|
||||||
m_nVBOVertices = 0;
|
m_nVBOVertices = 0;
|
||||||
m_nVertexCount = -1; // do ponownego zliczenia
|
m_nVertexCount = -1; // do ponownego zliczenia
|
||||||
SafeDeleteArray(m_pVNT); // usuwanie tablic, gdy by³y u¿yte do Vertex Array
|
SafeDeleteArray(m_pVNT); // usuwanie tablic, gdy były użyte do Vertex Array
|
||||||
};
|
};
|
||||||
|
|
||||||
bool CMesh::StartVBO()
|
bool CMesh::StartVBO()
|
||||||
{ // pocz¹tek rysowania elementów z VBO
|
{ // początek rysowania elementów z VBO
|
||||||
if (m_nVertexCount <= 0)
|
if (m_nVertexCount <= 0)
|
||||||
return false; // nie ma nic do rysowania w ten sposób
|
return false; // nie ma nic do rysowania w ten sposób
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
glEnableClientState(GL_NORMAL_ARRAY);
|
glEnableClientState(GL_NORMAL_ARRAY);
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
@@ -69,15 +69,15 @@ bool CMesh::StartVBO()
|
|||||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices);
|
glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices);
|
||||||
glVertexPointer( 3, GL_FLOAT, sizeof(CVertNormTex), static_cast<char *>(nullptr) ); // pozycje
|
glVertexPointer( 3, GL_FLOAT, sizeof(CVertNormTex), static_cast<char *>(nullptr) ); // pozycje
|
||||||
glNormalPointer( GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 12 ); // normalne
|
glNormalPointer( GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 12 ); // normalne
|
||||||
glTexCoordPointer( 2, GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 24 ); // wierzcho³ki
|
glTexCoordPointer( 2, GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 24 ); // wierzchołki
|
||||||
}
|
}
|
||||||
return true; // mo¿na rysowaæ z VBO
|
return true; // można rysować z VBO
|
||||||
};
|
};
|
||||||
|
|
||||||
bool CMesh::StartColorVBO()
|
bool CMesh::StartColorVBO()
|
||||||
{ // pocz¹tek rysowania punktów œwiec¹cych z VBO
|
{ // początek rysowania punktów świecących z VBO
|
||||||
if (m_nVertexCount <= 0)
|
if (m_nVertexCount <= 0)
|
||||||
return false; // nie ma nic do rysowania w ten sposób
|
return false; // nie ma nic do rysowania w ten sposób
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
glEnableClientState(GL_COLOR_ARRAY);
|
glEnableClientState(GL_COLOR_ARRAY);
|
||||||
if (m_nVBOVertices)
|
if (m_nVBOVertices)
|
||||||
@@ -87,16 +87,16 @@ bool CMesh::StartColorVBO()
|
|||||||
// glColorPointer(3,GL_UNSIGNED_BYTE,sizeof(CVertNormTex),((char*)NULL)+12); //kolory
|
// glColorPointer(3,GL_UNSIGNED_BYTE,sizeof(CVertNormTex),((char*)NULL)+12); //kolory
|
||||||
glColorPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 12 ); // kolory
|
glColorPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 12 ); // kolory
|
||||||
}
|
}
|
||||||
return true; // mo¿na rysowaæ z VBO
|
return true; // można rysować z VBO
|
||||||
};
|
};
|
||||||
|
|
||||||
void CMesh::EndVBO()
|
void CMesh::EndVBO()
|
||||||
{ // koniec u¿ycia VBO
|
{ // koniec użycia VBO
|
||||||
glDisableClientState(GL_VERTEX_ARRAY);
|
glDisableClientState(GL_VERTEX_ARRAY);
|
||||||
glDisableClientState(GL_NORMAL_ARRAY);
|
glDisableClientState(GL_NORMAL_ARRAY);
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
glDisableClientState(GL_COLOR_ARRAY);
|
glDisableClientState(GL_COLOR_ARRAY);
|
||||||
// glBindBuffer(GL_ARRAY_BUFFER,0); //takie coœ psuje, mimo i¿ polecali u¿yæ
|
// glBindBuffer(GL_ARRAY_BUFFER,0); //takie coś psuje, mimo iż polecali użyć
|
||||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
||||||
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); // Ra: to na przysz³oœæ
|
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); // Ra: to na przyszłość
|
||||||
};
|
};
|
||||||
|
|||||||
12
VBO.h
12
VBO.h
@@ -13,9 +13,9 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
class CVertNormTex
|
class CVertNormTex
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
float x; // X wierzcho³ka
|
float x; // X wierzchołka
|
||||||
float y; // Y wierzcho³ka
|
float y; // Y wierzchołka
|
||||||
float z; // Z wierzcho³ka
|
float z; // Z wierzchołka
|
||||||
float nx; // X wektora normalnego
|
float nx; // X wektora normalnego
|
||||||
float ny; // Y wektora normalnego
|
float ny; // Y wektora normalnego
|
||||||
float nz; // Z wektora normalnego
|
float nz; // Z wektora normalnego
|
||||||
@@ -26,14 +26,14 @@ class CVertNormTex
|
|||||||
class CMesh
|
class CMesh
|
||||||
{ // wsparcie dla VBO
|
{ // wsparcie dla VBO
|
||||||
public:
|
public:
|
||||||
int m_nVertexCount; // liczba wierzcho³ków
|
int m_nVertexCount; // liczba wierzchołków
|
||||||
CVertNormTex *m_pVNT;
|
CVertNormTex *m_pVNT;
|
||||||
unsigned int m_nVBOVertices; // numer VBO z wierzcho³kami
|
unsigned int m_nVBOVertices; // numer VBO z wierzchołkami
|
||||||
CMesh();
|
CMesh();
|
||||||
~CMesh();
|
~CMesh();
|
||||||
void MakeArray(int n); // tworzenie tablicy z elementami VNT
|
void MakeArray(int n); // tworzenie tablicy z elementami VNT
|
||||||
void BuildVBOs(bool del = true); // zamiana tablic na VBO
|
void BuildVBOs(bool del = true); // zamiana tablic na VBO
|
||||||
void Clear(); // zwolnienie zasobów
|
void Clear(); // zwolnienie zasobów
|
||||||
bool StartVBO();
|
bool StartVBO();
|
||||||
void EndVBO();
|
void EndVBO();
|
||||||
bool StartColorVBO();
|
bool StartColorVBO();
|
||||||
|
|||||||
12
World.h
12
World.h
@@ -47,17 +47,17 @@ class TWorld
|
|||||||
TTrain *Train;
|
TTrain *Train;
|
||||||
TDynamicObject *pDynamicNearest;
|
TDynamicObject *pDynamicNearest;
|
||||||
bool Paused;
|
bool Paused;
|
||||||
GLuint base; // numer DL dla znaków w napisach
|
GLuint base; // numer DL dla znaków w napisach
|
||||||
GLuint light; // numer tekstury dla smugi
|
GLuint light; // numer tekstury dla smugi
|
||||||
TSky Clouds;
|
TSky Clouds;
|
||||||
TEvent *KeyEvents[10]; // eventy wyzwalane z klawiaury
|
TEvent *KeyEvents[10]; // eventy wyzwalane z klawiaury
|
||||||
TMoverParameters *mvControlled; // wskaŸnik na cz³on silnikowy, do wyœwietlania jego parametrów
|
TMoverParameters *mvControlled; // wskaźnik na człon silnikowy, do wyświetlania jego parametrów
|
||||||
int iCheckFPS; // kiedy znów sprawdziæ FPS, ¿eby wy³¹czaæ optymalizacji od razu do zera
|
int iCheckFPS; // kiedy znów sprawdzić FPS, żeby wyłączać optymalizacji od razu do zera
|
||||||
double fTime50Hz; // bufor czasu dla komunikacji z PoKeys
|
double fTime50Hz; // bufor czasu dla komunikacji z PoKeys
|
||||||
double fTimeBuffer; // bufor czasu aktualizacji dla sta³ego kroku fizyki
|
double fTimeBuffer; // bufor czasu aktualizacji dla stałego kroku fizyki
|
||||||
double fMaxDt; //[s] krok czasowy fizyki (0.01 dla normalnych warunków)
|
double fMaxDt; //[s] krok czasowy fizyki (0.01 dla normalnych warunków)
|
||||||
int iPause; // wykrywanie zmian w zapauzowaniu
|
int iPause; // wykrywanie zmian w zapauzowaniu
|
||||||
double VelPrev; // poprzednia prêdkoœæ
|
double VelPrev; // poprzednia prędkość
|
||||||
int tprev; // poprzedni czas
|
int tprev; // poprzedni czas
|
||||||
double Acc; // przyspieszenie styczne
|
double Acc; // przyspieszenie styczne
|
||||||
public:
|
public:
|
||||||
|
|||||||
8
dumb3d.h
8
dumb3d.h
@@ -110,9 +110,9 @@ class vector3
|
|||||||
// scalar_t e[3];
|
// scalar_t e[3];
|
||||||
// };
|
// };
|
||||||
bool inline Equal(vector3 *v)
|
bool inline Equal(vector3 *v)
|
||||||
{ // sprawdzenie odleg³oœci punktów
|
{ // sprawdzenie odległości punktów
|
||||||
if (std::fabs(x - v->x) > 0.02)
|
if (std::fabs(x - v->x) > 0.02)
|
||||||
return false; // szeœcian zamiast kuli
|
return false; // sześcian zamiast kuli
|
||||||
if (std::fabs(z - v->z) > 0.02)
|
if (std::fabs(z - v->z) > 0.02)
|
||||||
return false;
|
return false;
|
||||||
if (std::fabs(y - v->y) > 0.02)
|
if (std::fabs(y - v->y) > 0.02)
|
||||||
@@ -190,7 +190,7 @@ class matrix4x4
|
|||||||
inline matrix4x4 &ProjectionMatrix(bool perspective, scalar_t l, scalar_t r, scalar_t t,
|
inline matrix4x4 &ProjectionMatrix(bool perspective, scalar_t l, scalar_t r, scalar_t t,
|
||||||
scalar_t b, scalar_t n, scalar_t f);
|
scalar_t b, scalar_t n, scalar_t f);
|
||||||
void InitialRotate()
|
void InitialRotate()
|
||||||
{ // taka specjalna rotacja, nie ma co ci¹gaæ trygonometrii
|
{ // taka specjalna rotacja, nie ma co ciągać trygonometrii
|
||||||
double f;
|
double f;
|
||||||
for (int i = 0; i < 16; i += 4)
|
for (int i = 0; i < 16; i += 4)
|
||||||
{
|
{
|
||||||
@@ -201,7 +201,7 @@ class matrix4x4
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
inline bool IdentityIs()
|
inline bool IdentityIs()
|
||||||
{ // sprawdzenie jednostkowoœci
|
{ // sprawdzenie jednostkowości
|
||||||
for (int i = 0; i < 16; ++i)
|
for (int i = 0; i < 16; ++i)
|
||||||
if (e[i] != ((i % 5) ? 0.0 : 1.0)) // jedynki tylko na 0, 5, 10 i 15
|
if (e[i] != ((i % 5) ? 0.0 : 1.0)) // jedynki tylko na 0, 5, 10 i 15
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
136
mtable.cpp
136
mtable.cpp
@@ -18,9 +18,9 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
std::shared_ptr<TMTableTime> Mtable::GlobalTime;
|
std::shared_ptr<TMTableTime> Mtable::GlobalTime;
|
||||||
|
|
||||||
double CompareTime(double t1h, double t1m, double t2h, double t2m) /*roznica czasu w minutach*/
|
double CompareTime(double t1h, double t1m, double t2h, double t2m) /*roznica czasu w minutach*/
|
||||||
// zwraca ró¿nicê czasu
|
// zwraca różnicę czasu
|
||||||
// jeœli pierwsza jest aktualna, a druga rozk³adowa, to ujemna oznacza opó¿nienie
|
// jeśli pierwsza jest aktualna, a druga rozkładowa, to ujemna oznacza opóżnienie
|
||||||
// na d³u¿sz¹ metê trzeba uwzglêdniæ datê, jakby opó¿nienia mia³y przekraczaæ 12h (towarowych)
|
// na dłuższą metę trzeba uwzględnić datę, jakby opóżnienia miały przekraczać 12h (towarowych)
|
||||||
{
|
{
|
||||||
double t;
|
double t;
|
||||||
|
|
||||||
@@ -28,11 +28,11 @@ double CompareTime(double t1h, double t1m, double t2h, double t2m) /*roznica cza
|
|||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
t = (t2h - t1h) * 60 + t2m - t1m; // jeœli t2=00:05, a t1=23:50, to ró¿nica wyjdzie ujemna
|
t = (t2h - t1h) * 60 + t2m - t1m; // jeśli t2=00:05, a t1=23:50, to różnica wyjdzie ujemna
|
||||||
if ((t < -720)) // jeœli ró¿nica przekracza 12h na minus
|
if ((t < -720)) // jeśli różnica przekracza 12h na minus
|
||||||
t = t + 1440; // to dodanie doby minut;else
|
t = t + 1440; // to dodanie doby minut;else
|
||||||
if ((t > 720)) // jeœli przekracza 12h na plus
|
if ((t > 720)) // jeśli przekracza 12h na plus
|
||||||
t = t - 1440; // to odjêcie doby minut
|
t = t - 1440; // to odjęcie doby minut
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -46,7 +46,7 @@ double TTrainParameters::CheckTrainLatency()
|
|||||||
}
|
}
|
||||||
|
|
||||||
double TTrainParameters::WatchMTable(double DistCounter)
|
double TTrainParameters::WatchMTable(double DistCounter)
|
||||||
{ // zwraca odlegloϾ do najblizszej stacji z zatrzymaniem
|
{ // zwraca odleglość do najblizszej stacji z zatrzymaniem
|
||||||
double dist;
|
double dist;
|
||||||
|
|
||||||
if (Direction == 1)
|
if (Direction == 1)
|
||||||
@@ -57,48 +57,48 @@ double TTrainParameters::WatchMTable(double DistCounter)
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string TTrainParameters::NextStop()
|
std::string TTrainParameters::NextStop()
|
||||||
{ // pobranie nazwy nastêpnego miejsca zatrzymania
|
{ // pobranie nazwy następnego miejsca zatrzymania
|
||||||
if (StationIndex <= StationCount)
|
if (StationIndex <= StationCount)
|
||||||
return "PassengerStopPoint:" + NextStationName; // nazwa nastêpnego przystanku;
|
return "PassengerStopPoint:" + NextStationName; // nazwa następnego przystanku;
|
||||||
else
|
else
|
||||||
return "[End of route]"; //¿e niby koniec
|
return "[End of route]"; //że niby koniec
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TTrainParameters::IsStop()
|
bool TTrainParameters::IsStop()
|
||||||
{ // zapytanie, czy zatrzymywaæ na nastêpnym punkcie rozk³adu
|
{ // zapytanie, czy zatrzymywać na następnym punkcie rozkładu
|
||||||
if ((StationIndex < StationCount))
|
if ((StationIndex < StationCount))
|
||||||
return TimeTable[StationIndex].Ah >= 0; //-1 to brak postoju
|
return TimeTable[StationIndex].Ah >= 0; //-1 to brak postoju
|
||||||
else
|
else
|
||||||
return true; // na ostatnim siê zatrzymaæ zawsze
|
return true; // na ostatnim się zatrzymać zawsze
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TTrainParameters::UpdateMTable(double hh, double mm, std::string NewName)
|
bool TTrainParameters::UpdateMTable(double hh, double mm, std::string NewName)
|
||||||
/*odfajkowanie dojechania do stacji (NewName) i przeliczenie opóŸnienia*/
|
/*odfajkowanie dojechania do stacji (NewName) i przeliczenie opóźnienia*/
|
||||||
{
|
{
|
||||||
bool OK;
|
bool OK;
|
||||||
OK = false;
|
OK = false;
|
||||||
if (StationIndex <= StationCount) // Ra: "<=", bo ostatni przystanek jest traktowany wyj¹tkowo
|
if (StationIndex <= StationCount) // Ra: "<=", bo ostatni przystanek jest traktowany wyjątkowo
|
||||||
{
|
{
|
||||||
if (NewName == NextStationName) // jeœli dojechane do nastêpnego
|
if (NewName == NextStationName) // jeśli dojechane do następnego
|
||||||
{ // Ra: wywo³anie mo¿e byæ powtarzane, jak stoi na W4
|
{ // Ra: wywołanie może być powtarzane, jak stoi na W4
|
||||||
if (TimeTable[StationIndex + 1].km - TimeTable[StationIndex].km <
|
if (TimeTable[StationIndex + 1].km - TimeTable[StationIndex].km <
|
||||||
0) // to jest bez sensu
|
0) // to jest bez sensu
|
||||||
Direction = -1;
|
Direction = -1;
|
||||||
else
|
else
|
||||||
Direction = 1; // prowizorka bo moze byc zmiana kilometrazu
|
Direction = 1; // prowizorka bo moze byc zmiana kilometrazu
|
||||||
// ustalenie, czy opóŸniony (porównanie z czasem odjazdu)
|
// ustalenie, czy opóźniony (porównanie z czasem odjazdu)
|
||||||
LastStationLatency =
|
LastStationLatency =
|
||||||
CompareTime(hh, mm, TimeTable[StationIndex].Dh, TimeTable[StationIndex].Dm);
|
CompareTime(hh, mm, TimeTable[StationIndex].Dh, TimeTable[StationIndex].Dm);
|
||||||
// inc(StationIndex); //przejœcie do nastêpnej pozycji StationIndex<=StationCount
|
// inc(StationIndex); //przejście do następnej pozycji StationIndex<=StationCount
|
||||||
if (StationIndex <
|
if (StationIndex <
|
||||||
StationCount) // Ra: "<", bo dodaje 1 przy przejœciu do nastêpnej stacji
|
StationCount) // Ra: "<", bo dodaje 1 przy przejściu do następnej stacji
|
||||||
{ // jeœli nie ostatnia stacja
|
{ // jeśli nie ostatnia stacja
|
||||||
NextStationName = TimeTable[StationIndex + 1].StationName; // zapamiêtanie nazwy
|
NextStationName = TimeTable[StationIndex + 1].StationName; // zapamiętanie nazwy
|
||||||
TTVmax = TimeTable[StationIndex + 1]
|
TTVmax = TimeTable[StationIndex + 1]
|
||||||
.vmax; // Ra: nowa prêdkoœæ rozk³adowa na kolejnym odcinku
|
.vmax; // Ra: nowa prędkość rozkładowa na kolejnym odcinku
|
||||||
}
|
}
|
||||||
else // gdy ostatnia stacja
|
else // gdy ostatnia stacja
|
||||||
NextStationName = ""; // nie ma nastêpnej stacji
|
NextStationName = ""; // nie ma następnej stacji
|
||||||
OK = true;
|
OK = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -106,29 +106,29 @@ bool TTrainParameters::UpdateMTable(double hh, double mm, std::string NewName)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TTrainParameters::StationIndexInc()
|
void TTrainParameters::StationIndexInc()
|
||||||
{ // przejœcie do nastêpnej pozycji StationIndex<=StationCount
|
{ // przejście do następnej pozycji StationIndex<=StationCount
|
||||||
++StationIndex;
|
++StationIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TTrainParameters::IsTimeToGo(double hh, double mm)
|
bool TTrainParameters::IsTimeToGo(double hh, double mm)
|
||||||
// sprawdzenie, czy mo¿na ju¿ odjechaæ z aktualnego zatrzymania
|
// sprawdzenie, czy można już odjechać z aktualnego zatrzymania
|
||||||
// StationIndex to numer nastêpnego po dodarciu do aktualnego
|
// StationIndex to numer następnego po dodarciu do aktualnego
|
||||||
{
|
{
|
||||||
if ((StationIndex < 1))
|
if ((StationIndex < 1))
|
||||||
return true; // przed pierwsz¹ jechaæ
|
return true; // przed pierwszą jechać
|
||||||
else if ((StationIndex < StationCount))
|
else if ((StationIndex < StationCount))
|
||||||
{ // oprócz ostatniego przystanku
|
{ // oprócz ostatniego przystanku
|
||||||
if ((TimeTable[StationIndex].Ah < 0)) // odjazd z poprzedniego
|
if ((TimeTable[StationIndex].Ah < 0)) // odjazd z poprzedniego
|
||||||
return true; // czas przyjazdu nie by³ podany - przelot
|
return true; // czas przyjazdu nie był podany - przelot
|
||||||
else
|
else
|
||||||
return CompareTime(hh, mm, TimeTable[StationIndex].Dh, TimeTable[StationIndex].Dm) <= 0;
|
return CompareTime(hh, mm, TimeTable[StationIndex].Dh, TimeTable[StationIndex].Dm) <= 0;
|
||||||
}
|
}
|
||||||
else // gdy rozk³ad siê skoñczy³
|
else // gdy rozkład się skończył
|
||||||
return false; // dalej nie jechaæ
|
return false; // dalej nie jechać
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string TTrainParameters::ShowRelation()
|
std::string TTrainParameters::ShowRelation()
|
||||||
/*zwraca informacjê o relacji*/
|
/*zwraca informację o relacji*/
|
||||||
{
|
{
|
||||||
// if (Relation1=TimeTable[1].StationName) and (Relation2=TimeTable[StationCount].StationName)
|
// if (Relation1=TimeTable[1].StationName) and (Relation2=TimeTable[StationCount].StationName)
|
||||||
if ((Relation1 != "") && (Relation2 != ""))
|
if ((Relation1 != "") && (Relation2 != ""))
|
||||||
@@ -138,13 +138,13 @@ std::string TTrainParameters::ShowRelation()
|
|||||||
}
|
}
|
||||||
|
|
||||||
TTrainParameters::TTrainParameters(std::string NewTrainName)
|
TTrainParameters::TTrainParameters(std::string NewTrainName)
|
||||||
/*wstêpne ustawienie parametrów rozk³adu jazdy*/
|
/*wstępne ustawienie parametrów rozkładu jazdy*/
|
||||||
{
|
{
|
||||||
NewName(NewTrainName);
|
NewName(NewTrainName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TTrainParameters::NewName(std::string NewTrainName)
|
void TTrainParameters::NewName(std::string NewTrainName)
|
||||||
/*wstêpne ustawienie parametrów rozk³adu jazdy*/
|
/*wstępne ustawienie parametrów rozkładu jazdy*/
|
||||||
{
|
{
|
||||||
TrainName = NewTrainName;
|
TrainName = NewTrainName;
|
||||||
StationCount = 0;
|
StationCount = 0;
|
||||||
@@ -176,15 +176,15 @@ void TTrainParameters::NewName(std::string NewTrainName)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TTrainParameters::UpdateVelocity(int StationCount, double vActual)
|
void TTrainParameters::UpdateVelocity(int StationCount, double vActual)
|
||||||
// zapisywanie prêdkoœci maksymalnej do wczeœniejszych odcinków
|
// zapisywanie prędkości maksymalnej do wcześniejszych odcinków
|
||||||
// wywo³ywane z numerem ostatniego przetworzonego przystanku
|
// wywoływane z numerem ostatniego przetworzonego przystanku
|
||||||
{
|
{
|
||||||
int i = StationCount;
|
int i = StationCount;
|
||||||
// TTVmax:=vActual; {PROWIZORKA!!!}
|
// TTVmax:=vActual; {PROWIZORKA!!!}
|
||||||
while ((i >= 0) && (TimeTable[i].vmax == -1))
|
while ((i >= 0) && (TimeTable[i].vmax == -1))
|
||||||
{
|
{
|
||||||
TimeTable[i].vmax = vActual; // prêdkoœæ dojazdu do przystanku i
|
TimeTable[i].vmax = vActual; // prędkość dojazdu do przystanku i
|
||||||
--i; // ewentualnie do poprzedniego te¿
|
--i; // ewentualnie do poprzedniego też
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,7 +194,7 @@ void TTrainParameters::UpdateVelocity(int StationCount, double vActual)
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
||||||
// wczytanie pliku-tabeli z rozk³adem przesuniêtym o (fPlus); (vMax) nie ma znaczenia
|
// wczytanie pliku-tabeli z rozkładem przesuniętym o (fPlus); (vMax) nie ma znaczenia
|
||||||
{
|
{
|
||||||
std::string lines;
|
std::string lines;
|
||||||
std::string s;
|
std::string s;
|
||||||
@@ -202,42 +202,42 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
|||||||
bool EndTable;
|
bool EndTable;
|
||||||
double vActual;
|
double vActual;
|
||||||
int i;
|
int i;
|
||||||
int time; // do zwiêkszania czasu
|
int time; // do zwiększania czasu
|
||||||
|
|
||||||
int ConversionError = 0;
|
int ConversionError = 0;
|
||||||
EndTable = false;
|
EndTable = false;
|
||||||
if ((TrainName == ""))
|
if ((TrainName == ""))
|
||||||
{ // jeœli pusty rozk³ad
|
{ // jeśli pusty rozkład
|
||||||
// UpdateVelocity(StationCount,vMax); //ograniczenie do prêdkoœci startowej
|
// UpdateVelocity(StationCount,vMax); //ograniczenie do prędkości startowej
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ConversionError = 666;
|
ConversionError = 666;
|
||||||
vActual = -1;
|
vActual = -1;
|
||||||
s = scnpath + TrainName + ".txt";
|
s = scnpath + TrainName + ".txt";
|
||||||
// Ra 2014-09: ustaliæ zasady wyznaczenia pierwotnego pliku przy przesuniêtych rozk³adach
|
// Ra 2014-09: ustalić zasady wyznaczenia pierwotnego pliku przy przesuniętych rozkładach
|
||||||
// (kolejny poci¹g dostaje numer +2)
|
// (kolejny pociąg dostaje numer +2)
|
||||||
fin.open(s.c_str()); // otwieranie pliku
|
fin.open(s.c_str()); // otwieranie pliku
|
||||||
|
|
||||||
if (!fin.is_open())
|
if (!fin.is_open())
|
||||||
{ // jeœli nie ma pliku
|
{ // jeśli nie ma pliku
|
||||||
vmax = atoi(TrainName.c_str()); // nie ma pliku ale jest liczba
|
vmax = atoi(TrainName.c_str()); // nie ma pliku ale jest liczba
|
||||||
if ((vmax > 10) && (vmax < 200))
|
if ((vmax > 10) && (vmax < 200))
|
||||||
{
|
{
|
||||||
TTVmax = vmax; // Ra 2014-07: zamiast rozk³adu mo¿na podaæ Vmax
|
TTVmax = vmax; // Ra 2014-07: zamiast rozkładu można podać Vmax
|
||||||
UpdateVelocity(StationCount, vmax); // ograniczenie do prêdkoœci startowej
|
UpdateVelocity(StationCount, vmax); // ograniczenie do prędkości startowej
|
||||||
ConversionError = 0;
|
ConversionError = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ConversionError = -8; /*Ra: ten b³¹d jest niepotrzebny*/
|
ConversionError = -8; /*Ra: ten błąd jest niepotrzebny*/
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /*analiza rozk³adu jazdy*/
|
{ /*analiza rozkładu jazdy*/
|
||||||
ConversionError = 0;
|
ConversionError = 0;
|
||||||
while (fin.good() && !((ConversionError != 0) || EndTable))
|
while (fin.good() && !((ConversionError != 0) || EndTable))
|
||||||
{
|
{
|
||||||
std::getline(fin, lines); /*wczytanie linii*/
|
std::getline(fin, lines); /*wczytanie linii*/
|
||||||
if (lines.find("___________________") != std::string::npos) /*linia pozioma górna*/
|
if (lines.find("___________________") != std::string::npos) /*linia pozioma górna*/
|
||||||
{
|
{
|
||||||
fin >> s;
|
fin >> s;
|
||||||
if (s == "[") /*lewy pion*/
|
if (s == "[") /*lewy pion*/
|
||||||
@@ -247,7 +247,7 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
fin >> s;
|
fin >> s;
|
||||||
} while (!(s == "|") || (fin.eof())); /*œrodkowy pion*/
|
} while (!(s == "|") || (fin.eof())); /*środkowy pion*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (lines == "")
|
else if (lines == "")
|
||||||
@@ -255,11 +255,11 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
|||||||
fin.close();
|
fin.close();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fin >> s; /*nazwa poci¹gu*/
|
fin >> s; /*nazwa pociągu*/
|
||||||
// if LowerCase(s)<>ExtractFileName(TrainName) then {musi byæ taka sama, jak nazwa
|
// if LowerCase(s)<>ExtractFileName(TrainName) then {musi być taka sama, jak nazwa
|
||||||
// pliku}
|
// pliku}
|
||||||
// ConversionError:=-7 {b³¹d niezgodnoœci}
|
// ConversionError:=-7 {błąd niezgodności}
|
||||||
TrainName = s; // nadanie nazwy z pliku TXT (bez œcie¿ki do pliku)
|
TrainName = s; // nadanie nazwy z pliku TXT (bez ścieżki do pliku)
|
||||||
// else
|
// else
|
||||||
{ /*czytaj naglowek*/
|
{ /*czytaj naglowek*/
|
||||||
while (fin >> s || !fin.bad())
|
while (fin >> s || !fin.bad())
|
||||||
@@ -272,7 +272,7 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
|||||||
{
|
{
|
||||||
if (s == "[")
|
if (s == "[")
|
||||||
break;
|
break;
|
||||||
} // while (!() || (fin.eof())); /*pierwsza linia z relacj¹*/
|
} // while (!() || (fin.eof())); /*pierwsza linia z relacją*/
|
||||||
while (fin >> s || !fin.bad())
|
while (fin >> s || !fin.bad())
|
||||||
{
|
{
|
||||||
if (s != "|")
|
if (s != "|")
|
||||||
@@ -287,7 +287,7 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
|||||||
if (s == "Relacja")
|
if (s == "Relacja")
|
||||||
break;
|
break;
|
||||||
} // while (
|
} // while (
|
||||||
// !( || (fin.eof()))); /*druga linia z relacj¹*/
|
// !( || (fin.eof()))); /*druga linia z relacją*/
|
||||||
while (fin >> s || !fin.bad())
|
while (fin >> s || !fin.bad())
|
||||||
{
|
{
|
||||||
if (s == "|")
|
if (s == "|")
|
||||||
@@ -427,8 +427,8 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
record->Dh = record->Ah; // odjazd o tej samej, co przyjazd (dla
|
record->Dh = record->Ah; // odjazd o tej samej, co przyjazd (dla
|
||||||
// ostatniego te¿)
|
// ostatniego też)
|
||||||
record->Dm = record->Am; // bo s¹ u¿ywane do wyliczenia opóŸnienia
|
record->Dm = record->Am; // bo są używane do wyliczenia opóźnienia
|
||||||
// po dojechaniu
|
// po dojechaniu
|
||||||
}
|
}
|
||||||
if ((record->Ah >= 0))
|
if ((record->Ah >= 0))
|
||||||
@@ -476,7 +476,7 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
|||||||
}
|
}
|
||||||
if (ConversionError == 0)
|
if (ConversionError == 0)
|
||||||
{
|
{
|
||||||
if ((TimeTable[1].StationName == Relation1)) // jeœli nazwa pierwszego zgodna z relacj¹
|
if ((TimeTable[1].StationName == Relation1)) // jeśli nazwa pierwszego zgodna z relacją
|
||||||
if ((TimeTable[1].Ah < 0)) // a nie podany czas przyjazdu
|
if ((TimeTable[1].Ah < 0)) // a nie podany czas przyjazdu
|
||||||
{ // to mamy zatrzymanie na pierwszym, a nie przelot
|
{ // to mamy zatrzymanie na pierwszym, a nie przelot
|
||||||
TimeTable[1].Ah = TimeTable[1].Dh;
|
TimeTable[1].Ah = TimeTable[1].Dh;
|
||||||
@@ -485,10 +485,10 @@ bool TTrainParameters::LoadTTfile(std::string scnpath, int iPlus, double vmax)
|
|||||||
// NextStationName:=TimeTable[1].StationName;
|
// NextStationName:=TimeTable[1].StationName;
|
||||||
/* TTVmax:=TimeTable[1].vmax; */
|
/* TTVmax:=TimeTable[1].vmax; */
|
||||||
}
|
}
|
||||||
if ((iPlus != 0)) // je¿eli jest przesuniêcie rozk³adu
|
if ((iPlus != 0)) // jeżeli jest przesunięcie rozkładu
|
||||||
{
|
{
|
||||||
long i_end = StationCount + 1;
|
long i_end = StationCount + 1;
|
||||||
for (i = 1; i < i_end; ++i) // bez with, bo ciê¿ko siê przenosi na C++
|
for (i = 1; i < i_end; ++i) // bez with, bo ciężko się przenosi na C++
|
||||||
{
|
{
|
||||||
if ((TimeTable[i].Ah >= 0))
|
if ((TimeTable[i].Ah >= 0))
|
||||||
{
|
{
|
||||||
@@ -511,26 +511,26 @@ void TMTableTime::UpdateMTableTime(double deltaT)
|
|||||||
// dodanie czasu (deltaT) w sekundach, z przeliczeniem godziny
|
// dodanie czasu (deltaT) w sekundach, z przeliczeniem godziny
|
||||||
{
|
{
|
||||||
mr = mr + deltaT; // dodawanie sekund
|
mr = mr + deltaT; // dodawanie sekund
|
||||||
while (mr > 60.0) // przeliczenie sekund do w³aœciwego przedzia³u
|
while (mr > 60.0) // przeliczenie sekund do właściwego przedziału
|
||||||
{
|
{
|
||||||
mr = mr - 60.0;
|
mr = mr - 60.0;
|
||||||
++mm;
|
++mm;
|
||||||
}
|
}
|
||||||
while (mm > 59) // przeliczenie minut do w³aœciwego przedzia³u
|
while (mm > 59) // przeliczenie minut do właściwego przedziału
|
||||||
{
|
{
|
||||||
mm = mm - 60;
|
mm = mm - 60;
|
||||||
++hh;
|
++hh;
|
||||||
}
|
}
|
||||||
while (hh > 23) // przeliczenie godzin do w³aœciwego przedzia³u
|
while (hh > 23) // przeliczenie godzin do właściwego przedziału
|
||||||
{
|
{
|
||||||
hh = hh - 24;
|
hh = hh - 24;
|
||||||
++dd; // zwiêkszenie numeru dnia
|
++dd; // zwiększenie numeru dnia
|
||||||
}
|
}
|
||||||
GameTime = GameTime + deltaT;
|
GameTime = GameTime + deltaT;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TTrainParameters::DirectionChange()
|
bool TTrainParameters::DirectionChange()
|
||||||
// sprawdzenie, czy po zatrzymaniu wykonaæ kolejne komendy
|
// sprawdzenie, czy po zatrzymaniu wykonać kolejne komendy
|
||||||
{
|
{
|
||||||
if ((StationIndex > 0) && (StationIndex < StationCount)) // dla ostatniej stacji nie
|
if ((StationIndex > 0) && (StationIndex < StationCount)) // dla ostatniej stacji nie
|
||||||
if (TimeTable[StationIndex].StationWare.find("@") != std::string::npos)
|
if (TimeTable[StationIndex].StationWare.find("@") != std::string::npos)
|
||||||
|
|||||||
10
mtable.h
10
mtable.h
@@ -14,11 +14,11 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
namespace Mtable
|
namespace Mtable
|
||||||
{
|
{
|
||||||
|
|
||||||
static int const MaxTTableSize = 100; // mo¿na by to robiæ dynamicznie
|
static int const MaxTTableSize = 100; // można by to robić dynamicznie
|
||||||
static char const *hrsd = ".";
|
static char const *hrsd = ".";
|
||||||
|
|
||||||
// Ra: pozycja zerowa rozk³adu chyba nie ma sensu
|
// Ra: pozycja zerowa rozkładu chyba nie ma sensu
|
||||||
// Ra: numeracja przystanków jest 1..StationCount
|
// Ra: numeracja przystanków jest 1..StationCount
|
||||||
|
|
||||||
struct TMTableLine
|
struct TMTableLine
|
||||||
{
|
{
|
||||||
@@ -61,8 +61,8 @@ class TTrainParameters
|
|||||||
std::string LocSeries; // seria (typ) pojazdu
|
std::string LocSeries; // seria (typ) pojazdu
|
||||||
double LocLoad;
|
double LocLoad;
|
||||||
TMTable TimeTable;
|
TMTable TimeTable;
|
||||||
int StationCount; // iloœæ przystanków (0-techniczny)
|
int StationCount; // ilość przystanków (0-techniczny)
|
||||||
int StationIndex; // numer najbli¿szego (aktualnego) przystanku
|
int StationIndex; // numer najbliższego (aktualnego) przystanku
|
||||||
std::string NextStationName;
|
std::string NextStationName;
|
||||||
double LastStationLatency;
|
double LastStationLatency;
|
||||||
int Direction; /*kierunek jazdy w/g kilometrazu*/
|
int Direction; /*kierunek jazdy w/g kilometrazu*/
|
||||||
|
|||||||
22
parser.cpp
22
parser.cpp
@@ -27,7 +27,7 @@ cParser::cParser(std::string Stream, buffertype Type, std::string Path, bool tr)
|
|||||||
// build comments map
|
// build comments map
|
||||||
mComments.insert(commentmap::value_type("/*", "*/"));
|
mComments.insert(commentmap::value_type("/*", "*/"));
|
||||||
mComments.insert(commentmap::value_type("//", "\n"));
|
mComments.insert(commentmap::value_type("//", "\n"));
|
||||||
// mComments.insert(commentmap::value_type("--","\n")); //Ra: to chyba nie u¿ywane
|
// mComments.insert(commentmap::value_type("--","\n")); //Ra: to chyba nie używane
|
||||||
// store to calculate sub-sequent includes from relative path
|
// store to calculate sub-sequent includes from relative path
|
||||||
mPath = Path;
|
mPath = Path;
|
||||||
// reset pointers and attach proper type of buffer
|
// reset pointers and attach proper type of buffer
|
||||||
@@ -69,9 +69,9 @@ bool cParser::getTokens(int Count, bool ToLower, const char *Break)
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
if (LoadTraction==true)
|
if (LoadTraction==true)
|
||||||
trtest="niemaproblema"; //wczytywaæ
|
trtest="niemaproblema"; //wczytywać
|
||||||
else
|
else
|
||||||
trtest="x"; //nie wczytywaæ
|
trtest="x"; //nie wczytywać
|
||||||
*/
|
*/
|
||||||
int i;
|
int i;
|
||||||
this->str("");
|
this->str("");
|
||||||
@@ -103,7 +103,7 @@ bool cParser::getTokens(int Count, bool ToLower, const char *Break)
|
|||||||
std::string cParser::readToken(bool ToLower, const char *Break)
|
std::string cParser::readToken(bool ToLower, const char *Break)
|
||||||
{
|
{
|
||||||
std::string token = "";
|
std::string token = "";
|
||||||
size_t pos; // pocz¹tek podmienianego ci¹gu
|
size_t pos; // początek podmienianego ciągu
|
||||||
// see if there's include parsing going on. clean up when it's done.
|
// see if there's include parsing going on. clean up when it's done.
|
||||||
if (mIncludeParser)
|
if (mIncludeParser)
|
||||||
{
|
{
|
||||||
@@ -116,11 +116,11 @@ std::string cParser::readToken(bool ToLower, const char *Break)
|
|||||||
{
|
{
|
||||||
std::string parameter =
|
std::string parameter =
|
||||||
token.substr(pos + 2, token.find(")", pos) - pos + 2); // numer parametru
|
token.substr(pos + 2, token.find(")", pos) - pos + 2); // numer parametru
|
||||||
token.erase(pos, token.find(")", pos) - pos + 1); // najpierw usuniêcie "(pN)"
|
token.erase(pos, token.find(")", pos) - pos + 1); // najpierw usunięcie "(pN)"
|
||||||
size_t nr = atoi(parameter.c_str()) - 1;
|
size_t nr = atoi(parameter.c_str()) - 1;
|
||||||
if (nr < parameters.size())
|
if (nr < parameters.size())
|
||||||
{
|
{
|
||||||
token.insert(pos, parameters.at(nr)); // wklejenie wartoœci parametru
|
token.insert(pos, parameters.at(nr)); // wklejenie wartości parametru
|
||||||
if (ToLower)
|
if (ToLower)
|
||||||
for (; pos < token.length(); ++pos)
|
for (; pos < token.length(); ++pos)
|
||||||
token[pos] = tolower(token[pos]);
|
token[pos] = tolower(token[pos]);
|
||||||
@@ -153,14 +153,14 @@ std::string cParser::readToken(bool ToLower, const char *Break)
|
|||||||
// launch child parser if include directive found.
|
// launch child parser if include directive found.
|
||||||
// NOTE: parameter collecting uses default set of token separators.
|
// NOTE: parameter collecting uses default set of token separators.
|
||||||
if (token.compare("include") == 0)
|
if (token.compare("include") == 0)
|
||||||
{ // obs³uga include
|
{ // obsługa include
|
||||||
std::string includefile = readToken(ToLower); // nazwa pliku
|
std::string includefile = readToken(ToLower); // nazwa pliku
|
||||||
if (LoadTraction ? true : ((includefile.find("tr/") == std::string::npos) &&
|
if (LoadTraction ? true : ((includefile.find("tr/") == std::string::npos) &&
|
||||||
(includefile.find("tra/") == std::string::npos)))
|
(includefile.find("tra/") == std::string::npos)))
|
||||||
{
|
{
|
||||||
// std::string trtest2="niemaproblema"; //nazwa odporna na znalezienie "tr/"
|
// std::string trtest2="niemaproblema"; //nazwa odporna na znalezienie "tr/"
|
||||||
// if (trtest=="x") //jeœli nie wczytywaæ drutów
|
// if (trtest=="x") //jeśli nie wczytywać drutów
|
||||||
// trtest2=includefile; //kopiowanie œcie¿ki do pliku
|
// trtest2=includefile; //kopiowanie ścieżki do pliku
|
||||||
std::string parameter = readToken(false); // w parametrach nie zmniejszamy
|
std::string parameter = readToken(false); // w parametrach nie zmniejszamy
|
||||||
while( (parameter.empty() == false)
|
while( (parameter.empty() == false)
|
||||||
&& (parameter.compare("end") != 0) )
|
&& (parameter.compare("end") != 0) )
|
||||||
@@ -196,12 +196,12 @@ bool cParser::trimComments(std::string &String)
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string cParser::readComment(std::string const &Break)
|
std::string cParser::readComment(std::string const &Break)
|
||||||
{ // pobieranie znaków a¿ do znalezienia znacznika koñca
|
{ // pobieranie znaków aż do znalezienia znacznika końca
|
||||||
std::string token = "";
|
std::string token = "";
|
||||||
while (mStream->peek() != EOF)
|
while (mStream->peek() != EOF)
|
||||||
{ // o ile nie koniec pliku
|
{ // o ile nie koniec pliku
|
||||||
token += mStream->get(); // pobranie znaku
|
token += mStream->get(); // pobranie znaku
|
||||||
if (token.find(Break) != std::string::npos) // szukanie znacznika koñca
|
if (token.find(Break) != std::string::npos) // szukanie znacznika końca
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return token;
|
return token;
|
||||||
|
|||||||
BIN
resource.h
BIN
resource.h
Binary file not shown.
2
sky.cpp
2
sky.cpp
@@ -33,7 +33,7 @@ void TSky::Init()
|
|||||||
void TSky::Render()
|
void TSky::Render()
|
||||||
{
|
{
|
||||||
if (mdCloud)
|
if (mdCloud)
|
||||||
{ // jeœli jest model nieba
|
{ // jeśli jest model nieba
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
// glDisable(GL_DEPTH_TEST);
|
// glDisable(GL_DEPTH_TEST);
|
||||||
glTranslatef(Global::pCameraPosition.x, Global::pCameraPosition.y,
|
glTranslatef(Global::pCameraPosition.x, Global::pCameraPosition.y,
|
||||||
|
|||||||
16
sky.h
16
sky.h
@@ -1,3 +1,11 @@
|
|||||||
|
/*
|
||||||
|
This Source Code Form is subject to the
|
||||||
|
terms of the Mozilla Public License, v.
|
||||||
|
2.0. If a copy of the MPL was not
|
||||||
|
distributed with this file, You can
|
||||||
|
obtain one at
|
||||||
|
http://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
@@ -17,11 +25,3 @@ class TSky
|
|||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
/*
|
|
||||||
This Source Code Form is subject to the
|
|
||||||
terms of the Mozilla Public License, v.
|
|
||||||
2.0. If a copy of the MPL was not
|
|
||||||
distributed with this file, You can
|
|
||||||
obtain one at
|
|
||||||
http://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
@@ -13,11 +13,11 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
//#define B2(t) (3*t*t*(1-t))
|
//#define B2(t) (3*t*t*(1-t))
|
||||||
//#define B3(t) (3*t*(1-t)*(1-t))
|
//#define B3(t) (3*t*(1-t)*(1-t))
|
||||||
//#define B4(t) ((1-t)*(1-t)*(1-t))
|
//#define B4(t) ((1-t)*(1-t)*(1-t))
|
||||||
// Ra: to jest mocno nieoptymalne: 10+3*4=22 mnożenia, 6 odejmowań, 3*3=9 dodawań
|
// Ra: to jest mocno nieoptymalne: 10+3*4=22 mnożenia, 6 odejmowań, 3*3=9 dodawań
|
||||||
// Ra: po przeliczeniu współczynników mamy: 3*3=9 mnożeń i 3*3=9 dodawań
|
// Ra: po przeliczeniu współczynników mamy: 3*3=9 mnożeń i 3*3=9 dodawań
|
||||||
//#define Interpolate(t,p1,cp1,cp2,p2) (B4(t)*p1+B3(t)*cp1+B2(t)*cp2+B1(t)*p2)
|
//#define Interpolate(t,p1,cp1,cp2,p2) (B4(t)*p1+B3(t)*cp1+B2(t)*cp2+B1(t)*p2)
|
||||||
|
|
||||||
// Ra: "delete NULL" nic nie zrobi, więc "if (a!=NULL)" jest zbędne
|
// Ra: "delete NULL" nic nie zrobi, więc "if (a!=NULL)" jest zbędne
|
||||||
//#define SafeFree(a) if (a!=NULL) free(a)
|
//#define SafeFree(a) if (a!=NULL) free(a)
|
||||||
//#define M_PI = 3.141592653589793
|
//#define M_PI = 3.141592653589793
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
|
|
||||||
#define sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0))
|
#define sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0))
|
||||||
|
|
||||||
#define DegToRad(a) ((M_PI / 180.0) * (a)) //(a) w nawiasie, bo może być dodawaniem
|
#define DegToRad(a) ((M_PI / 180.0) * (a)) //(a) w nawiasie, bo może być dodawaniem
|
||||||
#define RadToDeg(r) ((180.0 / M_PI) * (r))
|
#define RadToDeg(r) ((180.0 / M_PI) * (r))
|
||||||
|
|
||||||
#define Fix(a, b, c) \
|
#define Fix(a, b, c) \
|
||||||
|
|||||||
Reference in New Issue
Block a user