16
0
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:
tmj-fstate
2017-01-23 12:40:14 +01:00
75 changed files with 9745 additions and 9755 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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)

View File

@@ -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,"Ť¶‚‚Ü?ćhj")) //IK lewej stopy // if (!strcmp(pSubModel->pName,"Ť¶‚‚Ü?ćhj")) //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
} }
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -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);

View File

@@ -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);

View File

@@ -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

View File

@@ -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);
}; };

View File

@@ -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

View File

@@ -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

View File

@@ -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)
{ {

View File

@@ -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
View File

@@ -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

3811
Driver.cpp

File diff suppressed because it is too large Load Diff

320
Driver.h
View File

@@ -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
View File

@@ -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);

View File

@@ -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
View File

@@ -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
View File

@@ -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();

View File

@@ -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];

View File

@@ -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.
*/ */

View File

@@ -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

View File

@@ -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
View File

@@ -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;

View File

@@ -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();

126
Globals.h
View File

@@ -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,20 +143,20 @@ 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];
@@ -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

File diff suppressed because it is too large Load Diff

150
Ground.h
View File

@@ -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);

View File

@@ -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)
{ {

View File

@@ -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

View File

@@ -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)
{ {

View File

@@ -184,7 +184,7 @@ 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

View File

@@ -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))

View File

@@ -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;
@@ -89,10 +89,10 @@ 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
@@ -111,9 +111,9 @@ 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;
@@ -247,7 +247,7 @@ 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:
@@ -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*/;
@@ -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,10 +531,10 @@ 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;
@@ -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)
@@ -584,8 +584,8 @@ 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;
@@ -599,8 +599,8 @@ class TMHZ_EN57 : public TDriverHandle {
/* 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;
@@ -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:

View File

@@ -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

View File

@@ -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+[' '];
*/ */

View File

@@ -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
}; };
/* /*

View File

@@ -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¹¿ne return false; // początki o długości (i) sążne
} }
} }
} }
else if( std::string( szTestText ) != std::string( szText ) ) { else if( std::string( szTestText ) != std::string( szText ) ) {
return false; //³¹ñcuchy s¹¿ne return false; //łąńcuchy sąż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;
}; };

View File

@@ -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

File diff suppressed because it is too large Load Diff

172
Model3d.h
View File

@@ -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
View File

@@ -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
View File

@@ -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)

View File

@@ -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 );

View File

@@ -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?
}; };

View File

@@ -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++;
} }
} }

View File

@@ -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
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -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;

View File

@@ -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);

View File

@@ -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 ) {

View File

@@ -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;
}; };

View File

@@ -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

1392
Track.cpp

File diff suppressed because it is too large Load Diff

126
Track.h
View File

@@ -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();

View File

@@ -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?
}; };

View File

@@ -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;

View File

@@ -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");
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -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);

613
Train.cpp

File diff suppressed because it is too large Load Diff

42
Train.h
View File

@@ -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 (gak) 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 uciu 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 uciu 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 zewnrz 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 zewnrz nie przestawia private: //żeby go nic z zewnątrz nie przestawiało
TMoverParameters *mvControlled; // czn, w ktym sterujemy silnikiem TMoverParameters *mvControlled; // człon, w którym sterujemy silnikiem
TMoverParameters *mvOccupied; // czn, w ktym sterujemy hamulcem TMoverParameters *mvOccupied; // człon, w którym sterujemy hamulcem
TMoverParameters *mvSecond; // drugi czn (ET40, ET41, ET42, ukrotnienia) TMoverParameters *mvSecond; // drugi człon (ET40, ET41, ET42, ukrotnienia)
TMoverParameters *mvThird; // trzeci czn (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: czciowo 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 czn 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 uwane 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 spiych 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

View File

@@ -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();
} }

View File

@@ -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
View File

@@ -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
View File

@@ -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();

748
World.cpp

File diff suppressed because it is too large Load Diff

12
World.h
View File

@@ -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:

View File

@@ -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;

View File

@@ -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)

View File

@@ -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*/

View File

@@ -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;

Binary file not shown.

View File

@@ -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
View File

@@ -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/.
*/

View File

@@ -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) \