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

Format source code using clang-format

This commit is contained in:
Zbigniew Mandziejewicz
2015-04-03 22:00:22 +08:00
parent 91470458b4
commit cb19354db4
99 changed files with 40728 additions and 36059 deletions

View File

@@ -25,11 +25,10 @@ __fastcall TAdvancedSound::~TAdvancedSound()
// SoundShut.Stop();
}
void __fastcall TAdvancedSound::Free()
{
}
void __fastcall TAdvancedSound::Free() {}
void __fastcall TAdvancedSound::Init(char *NameOn, char *Name, char *NameOff, double DistanceAttenuation, vector3 pPosition)
void __fastcall TAdvancedSound::Init(char *NameOn, char *Name, char *NameOff,
double DistanceAttenuation, vector3 pPosition)
{
SoundStart.Init(NameOn, DistanceAttenuation, pPosition.x, pPosition.y, pPosition.z, true);
SoundCommencing.Init(Name, DistanceAttenuation, pPosition.x, pPosition.y, pPosition.z, true);
@@ -97,8 +96,7 @@ void __fastcall TAdvancedSound::Update(bool ListenerInside, vector3 NewPosition)
SoundShut.Stop(); // hunter-311211
SoundCommencing.Play(1, DSBPLAY_LOOPING, ListenerInside, NewPosition);
}
else
if (State==ss_Starting)
else if (State == ss_Starting)
{
fTime += Timer::GetDeltaTime();
// SoundStart->SetVolume(-1000*(4-fTime)/4);
@@ -108,13 +106,11 @@ void __fastcall TAdvancedSound::Update(bool ListenerInside, vector3 NewPosition)
SoundCommencing.ResetPosition();
SoundCommencing.Play(1, DSBPLAY_LOOPING, ListenerInside, NewPosition);
SoundStart.Stop();
}
else
SoundStart.Play(1, 0, ListenerInside, NewPosition);
}
else
if (State==ss_ShuttingDown)
else if (State == ss_ShuttingDown)
{
fTime -= Timer::GetDeltaTime();
// SoundShut->SetVolume(-1000*(4-fTime)/4);
@@ -128,15 +124,15 @@ void __fastcall TAdvancedSound::Update(bool ListenerInside, vector3 NewPosition)
}
}
void __fastcall TAdvancedSound::UpdateAF(double A, double F, bool ListenerInside, vector3 NewPosition)
void __fastcall TAdvancedSound::UpdateAF(double A, double F, bool ListenerInside,
vector3 NewPosition)
{ // update, ale z amplituda i czestotliwoscia
if ((State == ss_Commencing) && (SoundCommencing.AM > 0))
{
SoundShut.Stop(); // hunter-311211
SoundCommencing.Play(A, DSBPLAY_LOOPING, ListenerInside, NewPosition);
}
else
if (State==ss_Starting)
else if (State == ss_Starting)
{
fTime += Timer::GetDeltaTime();
// SoundStart->SetVolume(-1000*(4-fTime)/4);
@@ -150,8 +146,7 @@ void __fastcall TAdvancedSound::UpdateAF(double A, double F, bool ListenerInside
else
SoundStart.Play(A, 0, ListenerInside, NewPosition);
}
else
if (State==ss_ShuttingDown)
else if (State == ss_ShuttingDown)
{
fTime -= Timer::GetDeltaTime();
// SoundShut->SetVolume(-1000*(4-fTime)/4);
@@ -168,7 +163,8 @@ void __fastcall TAdvancedSound::UpdateAF(double A, double F, bool ListenerInside
void __fastcall TAdvancedSound::CopyIfEmpty(TAdvancedSound &s)
{ // skopiowanie, gdyby by³ potrzebny, a nie zosta³ wczytany
if ((fStartLength>0.0)||(fShutLength>0.0)) return; //coœ jest
if ((fStartLength > 0.0) || (fShutLength > 0.0))
return; // coœ jest
SoundStart = s.SoundStart;
SoundCommencing = s.SoundCommencing;
SoundShut = s.SoundShut;
@@ -178,4 +174,3 @@ void __fastcall TAdvancedSound::CopyIfEmpty(TAdvancedSound &s)
defAM = s.defAM;
defFM = s.defFM;
};

View File

@@ -6,7 +6,13 @@
#include "RealSound.h"
#include "QueryParserComp.hpp"
typedef enum {ss_Off, ss_Starting, ss_Commencing, ss_ShuttingDown} TSoundState;
typedef enum
{
ss_Off,
ss_Starting,
ss_Commencing,
ss_ShuttingDown
} TSoundState;
class TAdvancedSound
{ // klasa dŸwiêków maj¹cych pocz¹tek, dowolnie d³ugi œrodek oraz zakoñczenie (np. Rp1)
@@ -23,7 +29,8 @@ class TAdvancedSound
public:
__fastcall TAdvancedSound();
__fastcall ~TAdvancedSound();
void __fastcall Init(char *NameOn, char *Name, char *NameOff, double DistanceAttenuation, vector3 pPosition);
void __fastcall Init(char *NameOn, char *Name, char *NameOff, double DistanceAttenuation,
vector3 pPosition);
void __fastcall Load(TQueryParserComp *Parser, vector3 pPosition);
void __fastcall TurnOn(bool ListenerInside, vector3 NewPosition);
void __fastcall TurnOff(bool ListenerInside, vector3 NewPosition);

View File

@@ -7,20 +7,17 @@
#include "AirCoupler.h"
#include "Timer.h"
__fastcall TAirCoupler::TAirCoupler()
{
Clear();
}
__fastcall TAirCoupler::TAirCoupler() { Clear(); }
__fastcall TAirCoupler::~TAirCoupler()
{
}
__fastcall TAirCoupler::~TAirCoupler() {}
int __fastcall TAirCoupler::GetStatus()
{ // zwraca 1, jeœli istnieje model prosty, 2 gdy skoœny
int x = 0;
if (pModelOn) x=1;
if (pModelxOn) x=2;
if (pModelOn)
x = 1;
if (pModelxOn)
x = 2;
return x;
}
@@ -33,10 +30,10 @@ void __fastcall TAirCoupler::Clear()
bxOn = false;
}
void __fastcall TAirCoupler::Init(AnsiString asName, TModel3d *pModel)
{ // wyszukanie submodeli
if (!pModel) return; //nie ma w czym szukaæ
if (!pModel)
return; // nie ma w czym szukaæ
pModelOn = pModel->GetFromName(AnsiString(asName + "_on").c_str()); // po³¹czony na wprost
pModelOff = pModel->GetFromName(AnsiString(asName + "_off").c_str()); // odwieszony
pModelxOn = pModel->GetFromName(AnsiString(asName + "_xon").c_str()); // po³¹czony na skos

View File

@@ -14,13 +14,29 @@ private:
bool bOn;
bool bxOn;
void __fastcall Update();
public:
__fastcall TAirCoupler();
__fastcall ~TAirCoupler();
void __fastcall Clear();
inline void TurnOn() { bOn=true; bxOn=false; Update(); };
inline void TurnOff() { bOn=false; bxOn=false; Update(); };
inline void TurnxOn() { bOn=false; bxOn=true; Update(); };
inline void TurnOn()
{
bOn = true;
bxOn = false;
Update();
};
inline void TurnOff()
{
bOn = false;
bxOn = false;
Update();
};
inline void TurnxOn()
{
bOn = false;
bxOn = true;
Update();
};
// inline bool Active() { if ((pModelOn)||(pModelOff)) return true; return false;};
int __fastcall GetStatus();
void __fastcall Init(AnsiString asName, TModel3d *pModel);

View File

@@ -20,12 +20,8 @@
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TAnimAdvanced::TAnimAdvanced()
{
};
__fastcall TAnimAdvanced::~TAnimAdvanced()
{
__fastcall TAnimAdvanced::TAnimAdvanced(){};
__fastcall TAnimAdvanced::~TAnimAdvanced(){
// delete[] pVocaloidMotionData; //plik został zmodyfikowany
};
@@ -45,7 +41,9 @@ int __fastcall TAnimAdvanced::SortByBone()
j = i; // z którym porównywać
k = i; // z którym zamienić (nie trzeba zamieniać, jeśli ==i)
while (++j < iMovements)
{e=strcmp(pMovementData[k].cBone,pMovementData[j].cBone); //numery trzeba porównywać inaczej
{
e = strcmp(pMovementData[k].cBone,
pMovementData[j].cBone); // numery trzeba porównywać inaczej
if (e > 0)
k = j; // trzeba zamienić - ten pod j jest mniejszy
else if (!e)
@@ -99,15 +97,18 @@ bool __fastcall TAnimContainer::Init(TSubModel *pNewSubModel)
void __fastcall TAnimContainer::SetRotateAnim(vector3 vNewRotateAngles, double fNewRotateSpeed)
{
if (!this) return; //wywoływane z eventu, gdy brak modelu
if (!this)
return; // wywoływane z eventu, gdy brak modelu
vDesiredAngles = vNewRotateAngles;
fRotateSpeed = fNewRotateSpeed;
iAnim |= 1;
/* //Ra 2014-07: jeśli model nie jest renderowany, to obliczyć czas animacji i dodać event wewnętrzny
/* //Ra 2014-07: jeśli model nie jest renderowany, to obliczyć czas animacji i dodać event
wewnętrzny
//można by też ustawić czas początku animacji zamiast pobierać czas ramki i liczyć różnicę
*/
if (evDone)
{//dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez wyświetlania
{ // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez
// wyświetlania
if (iAnim >= 0)
{ // jeśli nie jest jeszcze na liście animacyjnej
acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon
@@ -119,15 +120,18 @@ void __fastcall TAnimContainer::SetRotateAnim(vector3 vNewRotateAngles, double f
void __fastcall TAnimContainer::SetTranslateAnim(vector3 vNewTranslate, double fNewSpeed)
{
if (!this) return; //wywoływane z eventu, gdy brak modelu
if (!this)
return; // wywoływane z eventu, gdy brak modelu
vTranslateTo = vNewTranslate;
fTranslateSpeed = fNewSpeed;
iAnim |= 2;
/* //Ra 2014-07: jeśli model nie jest renderowany, to obliczyć czas animacji i dodać event wewnętrzny
/* //Ra 2014-07: jeśli model nie jest renderowany, to obliczyć czas animacji i dodać event
wewnętrzny
//można by też ustawić czas początku animacji zamiast pobierać czas ramki i liczyć różnicę
*/
if (evDone)
{//dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez wyświetlania
{ // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez
// wyświetlania
if (iAnim >= 0)
{ // jeśli nie jest jeszcze na liście animacyjnej
acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon
@@ -139,12 +143,14 @@ void __fastcall TAnimContainer::SetTranslateAnim(vector3 vNewTranslate, double f
void __fastcall TAnimContainer::AnimSetVMD(double fNewSpeed)
{
if (!this) return; //wywoływane z eventu, gdy brak modelu
if (!this)
return; // wywoływane z eventu, gdy brak modelu
// skala do ustalenia, "cal" japoński (sun) to nieco ponad 3cm
// X-w lewo, Y-w górę, Z-do tyłu
// minimalna wysokość to -7.66, a nadal musi być ponad podłogą
// if (pMovementData->iFrame>0) return; //tylko pierwsza ramka
vTranslateTo=vector3(0.1*pMovementData->f3Vector.x,0.1*pMovementData->f3Vector.z,0.1*pMovementData->f3Vector.y);
vTranslateTo = vector3(0.1 * pMovementData->f3Vector.x, 0.1 * pMovementData->f3Vector.z,
0.1 * pMovementData->f3Vector.y);
if (LengthSquared3(vTranslateTo) > 0.0 ? true : LengthSquared3(vTranslation) > 0.0)
{ // jeśli ma być przesunięte albo jest przesunięcie
iAnim |= 2; // wyłączy się samo
@@ -156,7 +162,8 @@ void __fastcall TAnimContainer::AnimSetVMD(double fNewSpeed)
// if ((qCurrent.w<1.0)||(pMovementData->qAngle.w<1.0))
{ // jeśli jest jakiś obrót
if (!mAnim)
{mAnim=new float4x4(); //będzie potrzebna macierz animacji
{
mAnim = new float4x4(); // będzie potrzebna macierz animacji
mAnim->Identity(); // jedynkowanie na początek
}
iAnim |= 4; // animacja kwaternionowa
@@ -164,14 +171,18 @@ void __fastcall TAnimContainer::AnimSetVMD(double fNewSpeed)
//---+ - 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
//+--+ - 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 przeciwną stronę
//--++ - pozycja początkowa dobra, trąca u góry, ale z rękami jakoś nie tak, kółko w
//przeciwną stronę
//++++ - kładzie się brzuchem do góry
//-+++ - ręce w górze na początku, zamiast w dół, łokieć jakby w przeciwną stronę
//+-++ - nie podnosi ręki do głowy
//++-+ - dłoń ma w górze zamiast na pasie
qDesired=Normalize(float4(-pMovementData->qAngle.x,-pMovementData->qAngle.z,-pMovementData->qAngle.y,pMovementData->qAngle.w)); //tu trzeba będzie osie zamienić
qDesired = Normalize(float4(-pMovementData->qAngle.x, -pMovementData->qAngle.z,
-pMovementData->qAngle.y,
pMovementData->qAngle.w)); // tu trzeba będzie osie zamienić
if (fNewSpeed > 0.0)
{fAngleSpeed=fNewSpeed; //wtedy animować za pomocą interpolacji
{
fAngleSpeed = fNewSpeed; // wtedy animować za pomocą interpolacji
fAngleCurrent = 0.0; // początek interpolacji
}
else
@@ -183,7 +194,8 @@ void __fastcall TAnimContainer::AnimSetVMD(double fNewSpeed)
}
// if (!strcmp(pSubModel->pName,"?Z?“?^?[")) //jak główna kość
// if (!strcmp(pSubModel->pName,"Ť¶‚‚Ü?ćhj")) //IK lewej stopy
// WriteLog(AnsiString(pMovementData->iFrame)+": "+AnsiString(pMovementData->f3Vector.x)+" "+AnsiString(pMovementData->f3Vector.y)+" "+AnsiString(pMovementData->f3Vector.z));
// WriteLog(AnsiString(pMovementData->iFrame)+": "+AnsiString(pMovementData->f3Vector.x)+"
// "+AnsiString(pMovementData->f3Vector.y)+" "+AnsiString(pMovementData->f3Vector.z));
}
void __fastcall TAnimContainer::UpdateModel()
@@ -197,11 +209,14 @@ void __fastcall TAnimContainer::UpdateModel()
if (l >= 0.0001)
{ // jeśli do przemieszczenia jest ponad 1cm
vector3 s = SafeNormalize(dif); // jednostkowy wektor kierunku
s=s*(fTranslateSpeed*Timer::GetDeltaTime()); //przemieszczenie w podanym czasie z daną prędkością
s = s *
(fTranslateSpeed *
Timer::GetDeltaTime()); // przemieszczenie w podanym czasie z daną prędkością
if (LengthSquared3(s) < l) //żeby nie jechało na drugą stronę
vTranslation += s;
else
vTranslation=vTranslateTo; //koniec animacji, "koniec animowania" uruchomi się w następnej klatce
vTranslation = vTranslateTo; // koniec animacji, "koniec animowania" uruchomi
// się w następnej klatce
}
else
{ // koniec animowania
@@ -209,7 +224,9 @@ void __fastcall TAnimContainer::UpdateModel()
fTranslateSpeed = 0.0; // wyłączenie przeliczania wektora
if (LengthSquared3(vTranslation) <= 0.0001) // jeśli jest w punkcie początkowym
iAnim &= ~2; // wyłączyć zmianę pozycji submodelu
if (evDone) Global::AddToQuery(evDone,NULL); //wykonanie eventu informującego o zakończeniu
if (evDone)
Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o
// zakończeniu
}
}
if (fRotateSpeed != 0)
@@ -235,23 +252,38 @@ void __fastcall TAnimContainer::UpdateModel()
if (fabs(s) >= fabs(dif.x))
vRotateAngles.x = vDesiredAngles.x;
else
{vRotateAngles.x+=s; anim=true;}
{
vRotateAngles.x += s;
anim = true;
}
s = fRotateSpeed * sign(dif.y) * Timer::GetDeltaTime();
if (fabs(s) >= fabs(dif.y))
vRotateAngles.y = vDesiredAngles.y;
else
{vRotateAngles.y+=s; anim=true;}
{
vRotateAngles.y += s;
anim = true;
}
s = fRotateSpeed * sign(dif.z) * Timer::GetDeltaTime();
if (fabs(s) >= fabs(dif.z))
vRotateAngles.z = vDesiredAngles.z;
else
{vRotateAngles.z+=s; anim=true;}
while (vRotateAngles.x>= 360) vRotateAngles.x-=360;
while (vRotateAngles.x<=-360) vRotateAngles.x+=360;
while (vRotateAngles.y>= 360) vRotateAngles.y-=360;
while (vRotateAngles.y<=-360) vRotateAngles.y+=360;
while (vRotateAngles.z>= 360) vRotateAngles.z-=360;
while (vRotateAngles.z<=-360) vRotateAngles.z+=360;
{
vRotateAngles.z += s;
anim = true;
}
while (vRotateAngles.x >= 360)
vRotateAngles.x -= 360;
while (vRotateAngles.x <= -360)
vRotateAngles.x += 360;
while (vRotateAngles.y >= 360)
vRotateAngles.y -= 360;
while (vRotateAngles.y <= -360)
vRotateAngles.y += 360;
while (vRotateAngles.z >= 360)
vRotateAngles.z -= 360;
while (vRotateAngles.z <= -360)
vRotateAngles.z += 360;
if (vRotateAngles.x == 0.0)
if (vRotateAngles.y == 0.0)
if (vRotateAngles.z == 0.0)
@@ -259,7 +291,9 @@ void __fastcall TAnimContainer::UpdateModel()
if (!anim)
{ // nie potrzeba przeliczać już
fRotateSpeed = 0.0;
if (evDone) Global::AddToQuery(evDone,NULL); //wykonanie eventu informującego o zakończeniu
if (evDone)
Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o
// zakończeniu
}
}
if (fAngleSpeed != 0.0)
@@ -280,19 +314,25 @@ void __fastcall TAnimContainer::PrepareModel()
if (iAnim & 4) // zmieniona pozycja względem początkowej
{
if (fAngleSpeed > 0.0f)
{fAngleCurrent+=fAngleSpeed*Timer::GetDeltaTime(); //aktualny parametr interpolacji
{
fAngleCurrent +=
fAngleSpeed * Timer::GetDeltaTime(); // aktualny parametr interpolacji
if (fAngleCurrent >= 1.0f)
{ // interpolacja zakończona, ustawienie na pozycję końcową
qCurrent = qDesired;
fAngleSpeed = 0.0; // wyłączenie przeliczania wektora
if (evDone) Global::AddToQuery(evDone,NULL); //wykonanie eventu informującego o zakończeniu
if (evDone)
Global::AddToQuery(evDone,
NULL); // wykonanie eventu informującego o zakończeniu
}
else
{ // obliczanie pozycji pośredniej
// normalizacja jest wymagana do interpolacji w następnej animacji
qCurrent=Normalize(Slerp(qStart,qDesired,fAngleCurrent)); //interpolacja sferyczna kąta
qCurrent = Normalize(
Slerp(qStart, qDesired, fAngleCurrent)); // interpolacja sferyczna kąta
// qCurrent=Slerp(qStart,qDesired,fAngleCurrent); //interpolacja sferyczna kąta
if (qCurrent.w==1.0) //rozpoznać brak obrotu i wyłączyć w iAnim w takim przypadku
if (qCurrent.w ==
1.0) // rozpoznać brak obrotu i wyłączyć w iAnim w takim przypadku
iAnim &= ~4; // kąty są zerowe
}
}
@@ -301,7 +341,8 @@ void __fastcall TAnimContainer::PrepareModel()
}
}
// if (!strcmp(pSubModel->pName,"?Z?“?^?[")) //jak główna kość
// WriteLog(AnsiString(pMovementData->iFrame)+": "+AnsiString(iAnim)+" "+AnsiString(vTranslation.x)+" "+AnsiString(vTranslation.y)+" "+AnsiString(vTranslation.z));
// WriteLog(AnsiString(pMovementData->iFrame)+": "+AnsiString(iAnim)+"
// "+AnsiString(vTranslation.x)+" "+AnsiString(vTranslation.y)+" "+AnsiString(vTranslation.z));
}
void __fastcall TAnimContainer::UpdateModelIK()
@@ -315,21 +356,26 @@ void __fastcall TAnimContainer::UpdateModelIK()
switch (pSubModel->b_Anim)
{
case at_IK11: // stopa: ustawić w kierunku czubka (pierwszy potomny)
d=ch->Translation1Get(); //wektor względem aktualnego układu (nie uwzględnia obrotu)
k=float3(RadToDeg(atan2(d.z,hypot(d.x,d.y))),0.0,-RadToDeg(atan2(d.y,d.x))); //proste skierowanie na punkt
d = ch->Translation1Get(); // wektor względem aktualnego układu (nie uwzględnia
// obrotu)
k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0,
-RadToDeg(atan2(d.y, d.x))); // proste skierowanie na punkt
pSubModel->SetRotateIK1(k);
// if (!strcmp(pSubModel->pName,"?Z?“?^?[")) //jak główna kość
// WriteLog("--> "+AnsiString(k.x)+" "+AnsiString(k.y)+" "+AnsiString(k.z));
// Ra: to już jest dobrze, może być inna ćwiartka i znak
break;
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ć pochylone)
// pozycję kostki należy określić względem kości centralnej (+biodro może być
// pochylone)
// 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...
d=ch->Translation2Get(); //wektor względem aktualnego układu (nie uwzględnia obrotu)
d = ch->Translation2Get(); // wektor względem aktualnego układu (nie uwzględnia
// obrotu)
// if ()
{ // kość IK jest dalej niż pozycja spoczynkowa
k=float3(RadToDeg(atan2(d.z,hypot(d.x,d.y))),0.0,-RadToDeg(atan2(d.y,d.x))); //proste skierowanie na punkt
k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0,
-RadToDeg(atan2(d.y, d.x))); // proste skierowanie na punkt
pSubModel->SetRotateIK1(k);
}
break;
@@ -344,9 +390,7 @@ bool __fastcall TAnimContainer::InMovement()
}
void __fastcall TAnimContainer::EventAssign(TEvent *ev)
{//przypisanie eventu wykonywanego po zakończeniu animacji
evDone=ev;
};
{ // przypisanie eventu wykonywanego po zakończeniu animacji evDone = ev; };
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
@@ -383,21 +427,27 @@ __fastcall TAnimModel::~TAnimModel()
bool __fastcall TAnimModel::Init(TModel3d *pNewModel)
{
fBlinkTimer=double(random(1000*fOffTime))/(1000*fOffTime);;
fBlinkTimer = double(random(1000 * fOffTime)) / (1000 * fOffTime);
;
pModel = pNewModel;
return (pModel != NULL);
}
bool __fastcall TAnimModel::Init(AnsiString asName, AnsiString asReplacableTexture)
{
if (asReplacableTexture.SubString(1,1)=="*") //od gwiazdki zaczynają się teksty na wyświetlaczach
asText=asReplacableTexture.SubString(2,asReplacableTexture.Length()-1); //zapamiętanie tekstu
if (asReplacableTexture.SubString(1, 1) ==
"*") // od gwiazdki zaczynają się teksty na wyświetlaczach
asText = asReplacableTexture.SubString(2, asReplacableTexture.Length() -
1); // zapamiętanie tekstu
else if (asReplacableTexture != "none")
ReplacableSkinId[1]=TTexturesManager::GetTextureID(NULL,NULL,asReplacableTexture.c_str());
ReplacableSkinId[1] =
TTexturesManager::GetTextureID(NULL, NULL, asReplacableTexture.c_str());
if (TTexturesManager::GetAlpha(ReplacableSkinId[1]))
iTexAlpha=0x31310031; //tekstura z kanałem alfa - nie renderować w cyklu nieprzezroczystych
iTexAlpha =
0x31310031; // tekstura z kanałem alfa - nie renderować w cyklu nieprzezroczystych
else
iTexAlpha=0x30300030; //tekstura nieprzezroczysta - nie renderować w cyklu przezroczystych
iTexAlpha = 0x30300030; // tekstura nieprzezroczysta - nie renderować w cyklu
// przezroczystych
return (Init(TModelsManager::GetModel(asName.c_str())));
}
@@ -411,10 +461,12 @@ bool __fastcall TAnimModel::Load(cParser *parser, bool ter)
parser->getTokens(1, false); // tekstura (zmienia na małe)
*parser >> token;
if (!Init(str, AnsiString(token.c_str())))
{if (str!="notload")
{
if (str != "notload")
{ // gdy brak modelu
if (ter) // jeśli teren
{if (str.SubString(str.Length()-3,4)==".t3d")
{
if (str.SubString(str.Length() - 3, 4) == ".t3d")
str[str.Length() - 2] = 'e';
Global::asTerrainModel = str;
WriteLog(AnsiString("Terrain model \"" + str + "\" will be created."));
@@ -471,7 +523,8 @@ bool __fastcall TAnimModel::Load(cParser *parser, bool ter)
TAnimContainer *__fastcall TAnimModel::AddContainer(char *pName)
{ // dodanie sterowania submodelem dla egzemplarza
if (!pModel) return NULL;
if (!pModel)
return NULL;
TSubModel *tsb = pModel->GetFromName(pName);
if (tsb)
{
@@ -486,7 +539,8 @@ TAnimContainer* __fastcall TAnimModel::AddContainer(char *pName)
TAnimContainer *__fastcall TAnimModel::GetContainer(char *pName)
{ // szukanie/dodanie sterowania submodelem dla egzemplarza
if (!pName) return pRoot; //pobranie pierwszego (dla obrotnicy)
if (!pName)
return pRoot; // pobranie pierwszego (dla obrotnicy)
TAnimContainer *pCurrent;
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
// if (pCurrent->GetName()==pName)
@@ -510,19 +564,26 @@ void __fastcall TAnimModel::RaAnimate()
void __fastcall TAnimModel::RaPrepare()
{ // ustawia światła i animacje we wzorcu modelu przed renderowaniem egzemplarza
fBlinkTimer -= Timer::GetDeltaTime();
if (fBlinkTimer<=0) fBlinkTimer=fOffTime;
if (fBlinkTimer <= 0)
fBlinkTimer = fOffTime;
bool state; // stan światła
for (int i = 0; i < iNumLights; i++)
{switch (lsLights[i])
{case ls_Blink: //migotanie
state=fBlinkTimer<fOnTime; break;
{
switch (lsLights[i])
{
case ls_Blink: // migotanie
state = fBlinkTimer < fOnTime;
break;
case ls_Dark: // zapalone, gdy ciemno
state=Global::fLuminance<=fDark; break;
state = Global::fLuminance <= fDark;
break;
default: // zapalony albo zgaszony
state = (lsLights[i] == ls_On);
}
if (LightsOn[i]) LightsOn[i]->iVisible=state;
if (LightsOff[i]) LightsOff[i]->iVisible=!state;
if (LightsOn[i])
LightsOn[i]->iVisible = state;
if (LightsOff[i])
LightsOff[i]->iVisible = !state;
}
TSubModel::iInstance = (int)this; //żeby nie robić cudzych animacji
TSubModel::pasText = &asText; // przekazanie tekstu do wyświetlacza (!!!! do przemyślenia)
@@ -614,25 +675,25 @@ void __fastcall TAnimModel::RenderAlphaVBO(vector3* vPosition)
//---------------------------------------------------------------------------
bool __fastcall TAnimModel::TerrainLoaded()
{ // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy
return (this?pModel!=NULL:false);
};
return (this ? pModel != NULL : false); };
int __fastcall TAnimModel::TerrainCount()
{ // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy
return pModel?pModel->TerrainCount():0;
};
return pModel ? pModel->TerrainCount() : 0; };
TSubModel *__fastcall TAnimModel::TerrainSquare(int n)
{ // pobieranie wskaźników do pierwszego submodelu
return pModel ? pModel->TerrainSquare(n) : 0;
};
void __fastcall TAnimModel::TerrainRenderVBO(int n)
{ // renderowanie terenu z VBO
if (pModel) pModel->TerrainRenderVBO(n);
if (pModel)
pModel->TerrainRenderVBO(n);
};
//---------------------------------------------------------------------------
void __fastcall TAnimModel::Advanced()
{ // wykonanie zaawansowanych animacji na submodelach
pAdvanced->fCurrent+=pAdvanced->fFrequency*Timer::GetDeltaTime(); //aktualna ramka zmiennoprzecinkowo
pAdvanced->fCurrent +=
pAdvanced->fFrequency * Timer::GetDeltaTime(); // aktualna ramka zmiennoprzecinkowo
int frame = floor(pAdvanced->fCurrent); // numer klatki jako int
TAnimContainer *pCurrent;
if (pAdvanced->fCurrent >= pAdvanced->fLast)
@@ -648,13 +709,18 @@ void __fastcall TAnimModel::Advanced()
for (pCurrent = pRoot; pCurrent != NULL; pCurrent = pCurrent->pNext)
if (pCurrent->pMovementData) // jeśli obsługiwany tabelką animacji
if (frame >= pCurrent->pMovementData->iFrame) // koniec czekania
if (!strcmp(pCurrent->pMovementData->cBone,(pCurrent->pMovementData+1)->cBone))
{//jak kolejna ramka dotyczy tego samego submodelu, ustawić animację do kolejnej ramki
if (!strcmp(pCurrent->pMovementData->cBone,
(pCurrent->pMovementData + 1)->cBone))
{ // jak kolejna ramka dotyczy tego samego submodelu, ustawić animację do
// kolejnej ramki
++pCurrent->pMovementData; // kolejna klatka
pCurrent->AnimSetVMD(pAdvanced->fFrequency/(double(pCurrent->pMovementData->iFrame)-pAdvanced->fCurrent));
pCurrent->AnimSetVMD(
pAdvanced->fFrequency /
(double(pCurrent->pMovementData->iFrame) - pAdvanced->fCurrent));
}
else
pCurrent->pMovementData=NULL; //inna nazwa, animowanie zakończone w aktualnym położeniu
pCurrent->pMovementData =
NULL; // inna nazwa, animowanie zakończone w aktualnym położeniu
}
};
@@ -690,12 +756,15 @@ void __fastcall TAnimModel::AnimationVND(void* pData, double a, double b, double
AnsiString name;
TAnimContainer *pSub;
for (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
pSub = GetContainer(pAdvanced->pMovementData[i].cBone); // szukanie
if (pSub) // znaleziony
{pSub->pMovementData=pAdvanced->pMovementData+i; //gotów do animowania
pSub->AnimSetVMD(0.0); //usuawienie pozycji początkowej (powinna być zerowa, inaczej będzie skok)
{
pSub->pMovementData = pAdvanced->pMovementData + i; // gotów do animowania
pSub->AnimSetVMD(0.0); // usuawienie pozycji początkowej (powinna być zerowa,
// inaczej będzie skok)
}
name = AnsiString(pAdvanced->pMovementData[i].cBone); // nowa nazwa do pomijania
}
@@ -704,7 +773,8 @@ void __fastcall TAnimModel::AnimationVND(void* pData, double a, double b, double
}
/*
for (i=0;i<pAdvanced->iMovements;++i)
if (AnsiString(pAdvanced->pMovementData[i+1].cBone)!=AnsiString(pAdvanced->pMovementData[i].cBone))
if
(AnsiString(pAdvanced->pMovementData[i+1].cBone)!=AnsiString(pAdvanced->pMovementData[i].cBone))
{//generowane dla ostatniej klatki danej kości
name="";
for (j=0;j<15;j++)
@@ -750,7 +820,8 @@ void __fastcall TAnimModel::AnimationVND(void* pData, double a, double b, double
//---------------------------------------------------------------------------
void __fastcall TAnimModel::LightSet(int n, float v)
{ // ustawienie światła (n) na wartość (v)
if (n>=iMaxNumLights) return; //przekroczony zakres
if (n >= iMaxNumLights)
return; // przekroczony zakres
lsLights[n] = TLightState(int(v));
switch (lsLights[n])
{ // interpretacja ułamka zależnie od typu
@@ -784,4 +855,3 @@ void __fastcall TAnimModel::AnimUpdate(double dt)
}
};
//---------------------------------------------------------------------------

View File

@@ -8,7 +8,8 @@
const int iMaxNumLights = 8;
// typy stanu œwiate³
typedef enum {
typedef enum
{
ls_Off = 0, // zgaszone
ls_On = 1, // zapalone
ls_Blink = 2, // migaj¹ce
@@ -30,6 +31,7 @@ class TEvent;
class TAnimContainer
{ // opakowanie submodelu, okreœlaj¹ce animacjê egzemplarza - obs³ugiwane jako lista
friend class TAnimModel;
private:
vector3 vRotateAngles; // dla obrotów Eulera
vector3 vDesiredAngles;
@@ -57,14 +59,18 @@ private:
TEvent *evDone; // ewent wykonywany po zakoñczeniu animacji, np. zapór, obrotnicy
public:
TAnimContainer *pNext;
TAnimContainer *acAnimNext; //lista animacji z eventem, które musz¹ byæ przeliczane równie¿ bez wyœwietlania
TAnimContainer *acAnimNext; // lista animacji z eventem, które musz¹ byæ przeliczane równie¿ bez
// wyœwietlania
__fastcall TAnimContainer();
__fastcall ~TAnimContainer();
bool __fastcall Init(TSubModel *pNewSubModel);
//std::string inline __fastcall GetName() { return std::string(pSubModel?pSubModel->asName.c_str():""); };
//std::string inline __fastcall GetName() { return std::string(pSubModel?pSubModel->pName:""); };
// std::string inline __fastcall GetName() { return
// std::string(pSubModel?pSubModel->asName.c_str():""); };
// std::string inline __fastcall GetName() { return std::string(pSubModel?pSubModel->pName:"");
// };
char *__fastcall NameGet() { return (pSubModel ? pSubModel->pName : NULL); };
//void __fastcall SetRotateAnim(vector3 vNewRotateAxis, double fNewDesiredAngle, double fNewRotateSpeed, bool bResetAngle=false);
// void __fastcall SetRotateAnim(vector3 vNewRotateAxis, double fNewDesiredAngle, double
// fNewRotateSpeed, bool bResetAngle=false);
void __fastcall SetRotateAnim(vector3 vNewRotateAngles, double fNewRotateSpeed);
void __fastcall SetTranslateAnim(vector3 vNewTranslate, double fNewSpeed);
void __fastcall AnimSetVMD(double fNewSpeed);
@@ -73,8 +79,15 @@ public:
void __fastcall UpdateModelIK();
bool __fastcall InMovement(); // czy w trakcie animacji?
double _fastcall AngleGet() { return vRotateAngles.z; }; // jednak ostatnia, T3D ma inny uk³ad
vector3 _fastcall TransGet() {return vector3(-vTranslation.x,vTranslation.z,vTranslation.y);}; //zmiana, bo T3D ma inny uk³ad
void __fastcall WillBeAnimated() {if (pSubModel) pSubModel->WillBeAnimated();};
vector3 _fastcall TransGet()
{
return vector3(-vTranslation.x, vTranslation.z, vTranslation.y);
}; // zmiana, bo T3D ma inny uk³ad
void __fastcall WillBeAnimated()
{
if (pSubModel)
pSubModel->WillBeAnimated();
};
void __fastcall EventAssign(TEvent *ev);
TEvent *__fastcall Event() { return evDone; };
};
@@ -115,7 +128,8 @@ private:
void __fastcall RaPrepare(); // ustawienie animacji egzemplarza na wzorcu
public:
GLuint ReplacableSkinId[5]; // McZapkie-020802: zmienialne skory
static TAnimContainer *acAnimList; //lista animacji z eventem, które musz¹ byæ przeliczane równie¿ bez wyœwietlania
static TAnimContainer *acAnimList; // lista animacji z eventem, które musz¹ byæ przeliczane
// równie¿ bez wyœwietlania
__fastcall TAnimModel();
__fastcall ~TAnimModel();
bool __fastcall Init(TModel3d *pNewModel);
@@ -133,7 +147,11 @@ public:
void __fastcall RenderAlphaVBO(vector3 *vPosition);
int __fastcall Flags();
void __fastcall RaAnglesSet(double a, double b, double c)
{vAngle.x=a; vAngle.y=b; vAngle.z=c;};
{
vAngle.x = a;
vAngle.y = b;
vAngle.z = c;
};
bool __fastcall TerrainLoaded();
int __fastcall TerrainCount();
TSubModel *__fastcall TerrainSquare(int n);

View File

@@ -17,22 +17,22 @@ __fastcall TButton::TButton()
Clear();
};
__fastcall TButton::~TButton()
{
};
__fastcall TButton::~TButton(){};
void __fastcall TButton::Clear(int i)
{
pModelOn = NULL;
pModelOff = NULL;
bOn = false;
if (i>=0) FeedbackBitSet(i);
if (i >= 0)
FeedbackBitSet(i);
Update(); // kasowanie bitu Feedback, o ile jakiœ ustawiony
};
void __fastcall TButton::Init(AnsiString asName, TModel3d *pModel, bool bNewOn)
{
if (!pModel) return; //nie ma w czym szukaæ
if (!pModel)
return; // nie ma w czym szukaæ
pModelOn = pModel->GetFromName(AnsiString(asName + "_on").c_str());
pModelOff = pModel->GetFromName(AnsiString(asName + "_off").c_str());
bOn = bNewOn;
@@ -47,7 +47,8 @@ void __fastcall TButton::Load(TQueryParserComp *Parser,TModel3d *pModel1,TModel3
Init(str, pModel1, false);
if (pModel2)
if (!pModelOn && !pModelOff)
Init(str,pModel2,false); //mo¿e w drugim bêdzie (jak nie w kabinie, to w zewnêtrznym)
Init(str, pModel2,
false); // mo¿e w drugim bêdzie (jak nie w kabinie, to w zewnêtrznym)
}
else
{
@@ -58,13 +59,15 @@ void __fastcall TButton::Load(TQueryParserComp *Parser,TModel3d *pModel1,TModel3
void __fastcall TButton::Update()
{
if (pModelOn) pModelOn->iVisible=bOn;
if (pModelOff) pModelOff->iVisible=!bOn;
if (pModelOn)
pModelOn->iVisible = bOn;
if (pModelOff)
pModelOff->iVisible = !bOn;
if (iFeedbackBit) // je¿eli generuje informacjê zwrotn¹
{if (bOn) //zapalenie
{
if (bOn) // zapalenie
Console::BitsSet(iFeedbackBit);
else
Console::BitsClear(iFeedbackBit);
}
};

View File

@@ -13,15 +13,32 @@ private:
bool bOn;
int iFeedbackBit; // Ra: bit informacji zwrotnej, do wyprowadzenia na pulpit
void __fastcall Update();
public:
__fastcall TButton();
__fastcall ~TButton();
void __fastcall Clear(int i = -1);
inline void FeedbackBitSet(int i) { iFeedbackBit = 1 << i; };
inline void Turn(bool to) { bOn=to; Update(); };
inline void TurnOn() { bOn=true; Update(); };
inline void TurnOff() { bOn=false; Update(); };
inline void Switch() { bOn=!bOn; Update(); };
inline void Turn(bool to)
{
bOn = to;
Update();
};
inline void TurnOn()
{
bOn = true;
Update();
};
inline void TurnOff()
{
bOn = false;
Update();
};
inline void Switch()
{
bOn = !bOn;
Update();
};
inline bool Active() { return (pModelOn) || (pModelOff); };
void __fastcall Init(AnsiString asName, TModel3d *pModel, bool bNewOn = false);
void __fastcall Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel2 = NULL);

View File

@@ -70,8 +70,10 @@ void __fastcall TCamera::Update()
Type = tp_Follow;
if (Type == tp_Free)
{
if (Console::Pressed(Global::Keys[k_MechUp])) Velocity.y+=a;
if (Console::Pressed(Global::Keys[k_MechDown])) Velocity.y-=a;
if (Console::Pressed(Global::Keys[k_MechUp]))
Velocity.y += a;
if (Console::Pressed(Global::Keys[k_MechDown]))
Velocity.y -= a;
// McZapkie-170402: zeby nie bylo konfliktow
/*
if (Console::Pressed(VkKeyScan('d')))
@@ -83,16 +85,20 @@ void __fastcall TCamera::Update()
if (Console::Pressed(VkKeyScan('s')))
Velocity.z+= a*Timer::GetDeltaTime();
if (Console::Pressed(VK_NUMPAD4) || Console::Pressed(VK_NUMPAD7) || Console::Pressed(VK_NUMPAD1))
if (Console::Pressed(VK_NUMPAD4) || Console::Pressed(VK_NUMPAD7) ||
Console::Pressed(VK_NUMPAD1))
Yaw+= +1*M_PI*Timer::GetDeltaTime();
if (Console::Pressed(VK_NUMPAD6) || Console::Pressed(VK_NUMPAD9) || Console::Pressed(VK_NUMPAD3))
if (Console::Pressed(VK_NUMPAD6) || Console::Pressed(VK_NUMPAD9) ||
Console::Pressed(VK_NUMPAD3))
Yaw+= -1*M_PI*Timer::GetDeltaTime();
if (Pressed(VK_NUMPAD2) || Console::Pressed(VK_NUMPAD1) || Console::Pressed(VK_NUMPAD3))
if (Pressed(VK_NUMPAD2) || Console::Pressed(VK_NUMPAD1) ||
Console::Pressed(VK_NUMPAD3))
Pitch+= -1*M_PI*Timer::GetDeltaTime();
if (Console::Pressed(VK_NUMPAD8) || Console::Pressed(VK_NUMPAD7) || Console::Pressed(VK_NUMPAD9))
if (Console::Pressed(VK_NUMPAD8) || Console::Pressed(VK_NUMPAD7) ||
Console::Pressed(VK_NUMPAD9))
Pitch+= +1*M_PI*Timer::GetDeltaTime();
if (Console::Pressed(VkKeyScan('.')))
Roll+= -1*M_PI*Timer::GetDeltaTime();
@@ -104,10 +110,14 @@ void __fastcall TCamera::Update()
*/
// McZapkie-170402: poruszanie i rozgladanie we free takie samo jak w follow
if (Console::Pressed(Global::Keys[k_MechRight])) Velocity.x+=a;
if (Console::Pressed(Global::Keys[k_MechLeft])) Velocity.x-=a;
if (Console::Pressed(Global::Keys[k_MechForward])) Velocity.z-=a;
if (Console::Pressed(Global::Keys[k_MechBackward])) Velocity.z+=a;
if (Console::Pressed(Global::Keys[k_MechRight]))
Velocity.x += a;
if (Console::Pressed(Global::Keys[k_MechLeft]))
Velocity.x -= a;
if (Console::Pressed(Global::Keys[k_MechForward]))
Velocity.z -= a;
if (Console::Pressed(Global::Keys[k_MechBackward]))
Velocity.z += a;
// gora-dol
// if (Console::Pressed(VK_NUMPAD9)) Pos.y+=0.1;
// if (Console::Pressed(VK_NUMPAD3)) Pos.y-=0.1;
@@ -123,7 +133,6 @@ void __fastcall TCamera::Update()
// Velocity+= -Velocity*10 * Timer::GetDeltaTime();//( tmp<1 ? tmp : 1 );
// Type= tp_Free;
}
}
vector3 __fastcall TCamera::GetDirection()
@@ -139,7 +148,8 @@ vector3 __fastcall TCamera::GetDirection()
// bool __fastcall TCamera::GetMatrix(matrix4x4 &Matrix)
bool __fastcall TCamera::SetMatrix()
{
glRotated(-Roll*180.0f/M_PI,0,0,1); //po wy³¹czeniu tego krêci siê pojazd, a sceneria nie
glRotated(-Roll * 180.0f / M_PI, 0, 0, 1); // po wy³¹czeniu tego krêci siê pojazd, a sceneria
// nie
glRotated(-Pitch * 180.0f / M_PI, 1, 0, 0);
glRotated(-Yaw * 180.0f / M_PI, 0, 1, 0); // w zewnêtrznym widoku: kierunek patrzenia
@@ -149,7 +159,8 @@ bool __fastcall TCamera::SetMatrix()
// LookAt.x+pOffset.x,LookAt.y+pOffset.y,LookAt.z+pOffset.z,vUp.x,vUp.y,vUp.z);
// gluLookAt(Pos.x+pOffset.x,Pos.y+pOffset.y,Pos.z+pOffset.z,
// LookAt.x+pOffset.x,LookAt.y+pOffset.y,LookAt.z+pOffset.z,vUp.x,vUp.y,vUp.z);
gluLookAt(Pos.x,Pos.y,Pos.z,LookAt.x,LookAt.y,LookAt.z,vUp.x,vUp.y,vUp.z); //Ra: pOffset is zero
gluLookAt(Pos.x, Pos.y, Pos.z, LookAt.x, LookAt.y, LookAt.z, vUp.x, vUp.y,
vUp.z); // Ra: pOffset is zero
// gluLookAt(Pos.x,Pos.y,Pos.z,Pos.x+Velocity.x,Pos.y+Velocity.y,Pos.z+Velocity.z,0,1,0);
// return true;
}
@@ -172,7 +183,8 @@ void __fastcall TCamera::SetCabMatrix(vector3 &p)
glRotated(-Pitch * 180.0f / M_PI, 1, 0, 0);
glRotated(-Yaw * 180.0f / M_PI, 0, 1, 0); // w zewnêtrznym widoku: kierunek patrzenia
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,LookAt.z-p.z,vUp.x,vUp.y,vUp.z); //Ra: pOffset is zero
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
}
void __fastcall TCamera::RaLook()
@@ -190,7 +202,3 @@ void __fastcall TCamera::Stop()
Type = tp_Follow;
Velocity = vector3(0, 0, 0);
};

View File

@@ -2,7 +2,6 @@
#ifndef CameraH
#define CameraH
#include "dumb3d.h"
using namespace Math3D;

View File

@@ -131,7 +131,8 @@ int __fastcall Console::On()
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]
switch (iMode)
{case 1: //kontrolki klawiatury
{
case 1: // kontrolki klawiatury
case 2: // kontrolki klawiatury
iConfig = 0; // licznik użycia Scroll Lock
break;
@@ -151,7 +152,8 @@ int __fastcall Console::On()
case 4: // PoKeys
PoKeys55[0] = new TPoKeys55();
if (PoKeys55[0] ? PoKeys55[0]->Connect() : false)
{WriteLog("Found "+PoKeys55[0]->Version());
{
WriteLog("Found " + PoKeys55[0]->Version());
BitsUpdate(-1); // aktualizacjia stanów, bo przy wczytywaniu mogło być nieaktywne
}
else
@@ -173,15 +175,19 @@ void __fastcall Console::Off()
SetLedState(VK_SCROLL, true); // przyciśnięty
SetLedState(VK_SCROLL, false); // zwolniony
}
delete PoKeys55[0]; PoKeys55[0]=NULL;
delete PoKeys55[1]; PoKeys55[1]=NULL;
delete LPT; LPT=NULL;
delete PoKeys55[0];
PoKeys55[0] = NULL;
delete PoKeys55[1];
PoKeys55[1] = NULL;
delete LPT;
LPT = NULL;
};
void __fastcall Console::BitsSet(int mask, int entry)
{ // ustawienie bitów o podanej masce (mask) na wejściu (entry)
if ((iBits & mask) != mask) // jeżeli zmiana
{int old=iBits; //poprzednie stany
{
int old = iBits; // poprzednie stany
iBits |= mask;
BitsUpdate(old ^ iBits); // 1 dla bitów zmienionych
}
@@ -190,7 +196,8 @@ void __fastcall Console::BitsSet(int mask,int entry)
void __fastcall Console::BitsClear(int mask, int entry)
{ // zerowanie bitów o podanej masce (mask) na wejściu (entry)
if (iBits & mask) // jeżeli zmiana
{int old=iBits; //poprzednie stany
{
int old = iBits; // poprzednie stany
iBits &= ~mask;
BitsUpdate(old ^ iBits); // 1 dla bitów zmienionych
}
@@ -199,7 +206,8 @@ void __fastcall Console::BitsClear(int mask,int entry)
void __fastcall Console::BitsUpdate(int mask)
{ // aktualizacja stanu interfejsu informacji zwrotnej; (mask) - zakres zmienianych bitów
switch (iMode)
{case 1: //sterowanie światełkami klawiatury: CA/SHP+opory
{
case 1: // sterowanie światełkami klawiatury: CA/SHP+opory
if (mask & 3) // gdy SHP albo CA
SetLedState(VK_CAPITAL, iBits & 3);
if (mask & 4) // gdy jazda na oporach
@@ -259,17 +267,18 @@ void __fastcall Console::BitsUpdate(int mask)
}
};
bool __fastcall Console::Pressed(int x)
{//na razie tak - czyta się tylko klawiatura
return Global::bActive&&(GetKeyState(x)<0);
};
bool __fastcall Console::Pressed(int x) { // na razie tak - czyta się tylko klawiatura return Global::bActive && (GetKeyState(x) < 0); };
void __fastcall Console::ValueSet(int x, double y)
{ // ustawienie wartości (y) na kanale analogowym (x)
if (iMode == 4)
if (PoKeys55[0])
{
PoKeys55[0]->PWM(x,(((Global::fCalibrateOut[x][3]*y)+Global::fCalibrateOut[x][2])*y+Global::fCalibrateOut[x][1])*y+Global::fCalibrateOut[x][0]); //zakres <0;1>
PoKeys55[0]->PWM(
x, (((Global::fCalibrateOut[x][3] * y) + Global::fCalibrateOut[x][2]) * y +
Global::fCalibrateOut[x][1]) *
y +
Global::fCalibrateOut[x][0]); // zakres <0;1>
}
};
@@ -323,7 +332,8 @@ void __fastcall Console::OnKeyDown(int k)
if (k & 0x20000) // jeśli [Ctrl], to zestaw dodatkowy
iSwitch[4 + (char(k) >> 5)] &= ~(1 << (k & 31)); // wyłącz bistabilny dodatkowy
else
{iSwitch[char(k)>>5]&=~(1<<(k&31)); //wyłącz bistabilny podstawowy
{
iSwitch[char(k) >> 5] &= ~(1 << (k & 31)); // wyłącz bistabilny podstawowy
iButton[char(k) >> 5] |= 1 << (k & 31); // załącz monostabilny podstawowy
}
}
@@ -336,12 +346,5 @@ void __fastcall Console::OnKeyUp(int k)
else
iButton[char(k) >> 5] &= ~(1 << (k & 31)); // wyłącz monostabilny podstawowy
};
int __fastcall Console::KeyDownConvert(int k)
{
return int(ktTable[k&0x3FF].iDown);
};
int __fastcall Console::KeyUpConvert(int k)
{
return int(ktTable[k&0x3FF].iUp);
};
int __fastcall Console::KeyDownConvert(int k) { return int(ktTable[k & 0x3FF].iDown); };
int __fastcall Console::KeyUpConvert(int k) { return int(ktTable[k & 0x3FF].iUp); };

View File

@@ -52,4 +52,3 @@ public:
};
#endif

View File

@@ -26,9 +26,11 @@ bool __fastcall TLPT::Connect(int port)
}
else
return false; // MessageBox(NULL,"ERROR","B³¹d przy ³adowaniu pliku",MB_OK);
address=port; //&0xFFFFFC; //ostatnie 2 bity maj¹ byæ zerowe -> a niech sobie OUT-uj¹, gdzie chc¹
address =
port; //&0xFFFFFC; //ostatnie 2 bity maj¹ byæ zerowe -> a niech sobie OUT-uj¹, gdzie chc¹
switch (address) // nie dotyczy 0x3BC
{case 0x0378:
{
case 0x0378:
case 0x0278:
OutPort(address + 0x402, 0); // SPP, czyli jednokierunkowe wyjœcie
break;
@@ -39,8 +41,4 @@ bool __fastcall TLPT::Connect(int port)
return bool(OutPort);
};
void __fastcall TLPT::Out(int x)
{//wys³anie bajtu do portu
OutPort(address,x);
};
void __fastcall TLPT::Out(int x) { // wys³anie bajtu do portu OutPort(address, x); };

View File

@@ -8,6 +8,7 @@ class TLPT
{
private:
int address;
public:
bool __fastcall Connect(int port);
void __fastcall Out(int x);

View File

@@ -9,7 +9,8 @@
// HIDscaner: http://forum.simflight.com/topic/68257-latest-lua-package-for-fsuipc-and-wideclient/
//#define MY_DEVICE_ID "Vid_04d8&Pid_003F"
//#define MY_DEVICE_ID "Vid_1dc3&Pid_1001&Rev_1000&MI_01"
//HID\Vid_1dc3&Pid_1001&Rev_1000&MI_01 - MI_01 to jest interfejs komunikacyjny (00-joystick, 02-klawiatura)
// HID\Vid_1dc3&Pid_1001&Rev_1000&MI_01 - MI_01 to jest interfejs komunikacyjny (00-joystick,
// 02-klawiatura)
HANDLE WriteHandle = INVALID_HANDLE_VALUE;
HANDLE ReadHandle = INVALID_HANDLE_VALUE;
@@ -30,10 +31,7 @@ __fastcall TPoKeys55::TPoKeys55()
bNoError = true;
};
//---------------------------------------------------------------------------
__fastcall TPoKeys55::~TPoKeys55()
{
Close();
};
__fastcall TPoKeys55::~TPoKeys55() { Close(); };
//---------------------------------------------------------------------------
bool __fastcall TPoKeys55::Close()
{ // roz³¹czenie komunikacji
@@ -48,10 +46,12 @@ bool __fastcall TPoKeys55::Close()
bool __fastcall TPoKeys55::Connect()
{ // Ra: to jest do wyczyszcznia z niepotrzebnych zmiennych i komunikatów
Close();
GUID InterfaceClassGuid={0x4d1e55b2,0xf16f,0x11cf,0x88,0xcb,0x00,0x11,0x11,0x00,0x00,0x30}; //wszystkie HID tak maj¹
GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, 0x88, 0xcb, 0x00,
0x11, 0x11, 0x00, 0x00, 0x30}; // wszystkie HID tak maj¹
HDEVINFO DeviceInfoTable;
PSP_DEVICE_INTERFACE_DATA InterfaceDataStructure = new SP_DEVICE_INTERFACE_DATA;
PSP_DEVICE_INTERFACE_DETAIL_DATA DetailedInterfaceDataStructure=new SP_DEVICE_INTERFACE_DETAIL_DATA;
PSP_DEVICE_INTERFACE_DETAIL_DATA DetailedInterfaceDataStructure =
new SP_DEVICE_INTERFACE_DETAIL_DATA;
SP_DEVINFO_DATA DevInfoData;
DWORD InterfaceIndex = 0;
// DWORD StatusLastError=0;
@@ -64,18 +64,24 @@ bool __fastcall TPoKeys55::Connect()
HDEVINFO hDevInfo;
String DeviceIDFromRegistry;
String DeviceIDToFind = "Vid_1dc3&Pid_1001&Rev_1000&MI_01";
//First populate a list of plugged in devices (by specifying "DIGCF_PRESENT"), which are of the specified class GUID.
DeviceInfoTable=SetupDiGetClassDevs(&InterfaceClassGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
//Now look through the list we just populated. We are trying to see if any of them match our device.
// First populate a list of plugged in devices (by specifying "DIGCF_PRESENT"), which are of the
// specified class GUID.
DeviceInfoTable =
SetupDiGetClassDevs(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
// Now look through the list we just populated. We are trying to see if any of them match our
// device.
while (true)
{
InterfaceDataStructure->cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
if (SetupDiEnumDeviceInterfaces(DeviceInfoTable, NULL, &InterfaceClassGuid, InterfaceIndex, InterfaceDataStructure))
if (SetupDiEnumDeviceInterfaces(DeviceInfoTable, NULL, &InterfaceClassGuid, InterfaceIndex,
InterfaceDataStructure))
{
ErrorStatus = GetLastError();
if (ERROR_NO_MORE_ITEMS==ErrorStatus) //Did we reach the end of the list of matching devices in the DeviceInfoTable?
if (ERROR_NO_MORE_ITEMS == ErrorStatus) // Did we reach the end of the list of matching
// devices in the DeviceInfoTable?
{ // Cound not find the device. Must not have been attached.
SetupDiDestroyDeviceInfoList(DeviceInfoTable); //Clean up the old structure we no longer need.
SetupDiDestroyDeviceInfoList(
DeviceInfoTable); // Clean up the old structure we no longer need.
// ShowMessage("Erreur: Sortie1");
return false;
}
@@ -83,87 +89,117 @@ bool __fastcall TPoKeys55::Connect()
else // Else some other kind of unknown error ocurred...
{
ErrorStatus = GetLastError();
SetupDiDestroyDeviceInfoList(DeviceInfoTable); //Clean up the old structure we no longer need.
SetupDiDestroyDeviceInfoList(
DeviceInfoTable); // Clean up the old structure we no longer need.
// ShowMessage("Erreur: Sortie2");
return false;
}
//Now retrieve the hardware ID from the registry. The hardware ID contains the VID and PID, which we will then
// Now retrieve the hardware ID from the registry. The hardware ID contains the VID and PID,
// which we will then
// check to see if it is the correct device or not.
//Initialize an appropriate SP_DEVINFO_DATA structure. We need this structure for SetupDiGetDeviceRegistryProperty().
// Initialize an appropriate SP_DEVINFO_DATA structure. We need this structure for
// SetupDiGetDeviceRegistryProperty().
DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
SetupDiEnumDeviceInfo(DeviceInfoTable, InterfaceIndex, &DevInfoData);
//First query for the size of the hardware ID, so we can know how big a buffer to allocate for the data.
SetupDiGetDeviceRegistryProperty(DeviceInfoTable,&DevInfoData,SPDRP_HARDWAREID,&dwRegType,NULL,0,&dwRegSize);
// First query for the size of the hardware ID, so we can know how big a buffer to allocate
// for the data.
SetupDiGetDeviceRegistryProperty(DeviceInfoTable, &DevInfoData, SPDRP_HARDWAREID,
&dwRegType, NULL, 0, &dwRegSize);
// Allocate a buffer for the hardware ID.
// PropertyValueBuffer=(BYTE*)malloc(dwRegSize);
PropertyValueBuffer = new char[dwRegSize];
if (PropertyValueBuffer == NULL) // if null,error,couldn't allocate enough memory
{ // Can't really recover from this situation,just exit instead.
// ShowMessage("Allocation PropertyValueBuffer impossible");
SetupDiDestroyDeviceInfoList(DeviceInfoTable); //Clean up the old structure we no longer need.
SetupDiDestroyDeviceInfoList(
DeviceInfoTable); // Clean up the old structure we no longer need.
return false;
}
//Retrieve the hardware IDs for the current device we are looking at. PropertyValueBuffer gets filled with a
//REG_MULTI_SZ (array of null terminated strings). To find a device,we only care about the very first string in the
//buffer,which will be the "device ID". The device ID is a string which contains the VID and PID,in the example
// Retrieve the hardware IDs for the current device we are looking at. PropertyValueBuffer
// gets filled with a
// REG_MULTI_SZ (array of null terminated strings). To find a device,we only care about the
// very first string in the
// buffer,which will be the "device ID". The device ID is a string which contains the VID
// and PID,in the example
// format "Vid_04d8&Pid_003f".
SetupDiGetDeviceRegistryProperty(DeviceInfoTable,&DevInfoData,SPDRP_HARDWAREID,&dwRegType,PropertyValueBuffer,dwRegSize,NULL);
SetupDiGetDeviceRegistryProperty(DeviceInfoTable, &DevInfoData, SPDRP_HARDWAREID,
&dwRegType, PropertyValueBuffer, dwRegSize, NULL);
// Now check if the first string in the hardware ID matches the device ID of my USB device.
// ListBox1->Items->Add((char*)PropertyValueBuffer);
DeviceIDFromRegistry = StrPas((char *)PropertyValueBuffer);
//free(PropertyValueBuffer); //No longer need the PropertyValueBuffer,free the memory to prevent potential memory leaks
delete PropertyValueBuffer; //No longer need the PropertyValueBuffer,free the memory to prevent potential memory leaks
//Convert both strings to lower case. This makes the code more robust/portable accross OS Versions
// free(PropertyValueBuffer); //No longer need the PropertyValueBuffer,free the memory to
// prevent potential memory leaks
delete PropertyValueBuffer; // No longer need the PropertyValueBuffer,free the memory to
// prevent potential memory leaks
// Convert both strings to lower case. This makes the code more robust/portable accross OS
// Versions
DeviceIDFromRegistry = DeviceIDFromRegistry.LowerCase();
DeviceIDToFind = DeviceIDToFind.LowerCase();
// Now check if the hardware ID we are looking at contains the correct VID/PID
MatchFound = (DeviceIDFromRegistry.AnsiPos(DeviceIDToFind) > 0);
if (MatchFound == true)
{
//Device must have been found. Open read and write handles. In order to do this,we will need the actual device path first.
//We can get the path by calling SetupDiGetDeviceInterfaceDetail(),however,we have to call this function twice: The first
//time to get the size of the required structure/buffer to hold the detailed interface data,then a second time to actually
// Device must have been found. Open read and write handles. In order to do this,we
// will need the actual device path first.
// We can get the path by calling SetupDiGetDeviceInterfaceDetail(),however,we have to
// call this function twice: The first
// time to get the size of the required structure/buffer to hold the detailed interface
// data,then a second time to actually
// get the structure (after we have allocated enough memory for the structure.)
DetailedInterfaceDataStructure->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
// First call populates "StructureSize" with the correct value
SetupDiGetDeviceInterfaceDetail(DeviceInfoTable,InterfaceDataStructure,NULL,NULL,&StructureSize,NULL);
DetailedInterfaceDataStructure=(PSP_DEVICE_INTERFACE_DETAIL_DATA)(malloc(StructureSize)); //Allocate enough memory
if (DetailedInterfaceDataStructure==NULL) //if null,error,couldn't allocate enough memory
SetupDiGetDeviceInterfaceDetail(DeviceInfoTable, InterfaceDataStructure, NULL, NULL,
&StructureSize, NULL);
DetailedInterfaceDataStructure =
(PSP_DEVICE_INTERFACE_DETAIL_DATA)(malloc(StructureSize)); // Allocate enough memory
if (DetailedInterfaceDataStructure ==
NULL) // if null,error,couldn't allocate enough memory
{ // Can't really recover from this situation,just exit instead.
SetupDiDestroyDeviceInfoList(DeviceInfoTable); //Clean up the old structure we no longer need.
SetupDiDestroyDeviceInfoList(
DeviceInfoTable); // Clean up the old structure we no longer need.
return false;
}
DetailedInterfaceDataStructure->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
// Now call SetupDiGetDeviceInterfaceDetail() a second time to receive the goods.
SetupDiGetDeviceInterfaceDetail(DeviceInfoTable,InterfaceDataStructure,DetailedInterfaceDataStructure,StructureSize,NULL,NULL);
//We now have the proper device path,and we can finally open read and write handles to the device.
//We store the handles in the global variables "WriteHandle" and "ReadHandle",which we will use later to actually communicate.
WriteHandle=CreateFile((DetailedInterfaceDataStructure->DevicePath),GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,0);
SetupDiGetDeviceInterfaceDetail(DeviceInfoTable, InterfaceDataStructure,
DetailedInterfaceDataStructure, StructureSize, NULL,
NULL);
// We now have the proper device path,and we can finally open read and write handles to
// the device.
// We store the handles in the global variables "WriteHandle" and "ReadHandle",which we
// will use later to actually communicate.
WriteHandle = CreateFile((DetailedInterfaceDataStructure->DevicePath), GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
ErrorStatus = GetLastError();
// if (ErrorStatus==ERROR_SUCCESS)
// ToggleLedBtn->Enabled=true;//Make button no longer greyed out
ReadHandle=CreateFile((DetailedInterfaceDataStructure->DevicePath),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,0);
ReadHandle = CreateFile((DetailedInterfaceDataStructure->DevicePath), GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
ErrorStatus = GetLastError();
if (ErrorStatus == ERROR_SUCCESS)
{
// GetPushbuttonState->Enabled=true;//Make button no longer greyed out
// StateLabel->Enabled=true;//Make label no longer greyed out
}
SetupDiDestroyDeviceInfoList(DeviceInfoTable); //Clean up the old structure we no longer need.
SetupDiDestroyDeviceInfoList(
DeviceInfoTable); // Clean up the old structure we no longer need.
iRepeats = 0; // nowe szanse na pod³¹czenie
return true;
}
InterfaceIndex++;
//Keep looping until we either find a device with matching VID and PID,or until we run out of items.
// Keep looping until we either find a device with matching VID and PID,or until we run out
// of items.
} // end of while(true)
// ShowMessage("Sortie");
return false;
}
//---------------------------------------------------------------------------
bool __fastcall TPoKeys55::Write(unsigned char c,unsigned char b3,unsigned char b4,unsigned char b5)
bool __fastcall TPoKeys55::Write(unsigned char c, unsigned char b3, unsigned char b4,
unsigned char b5)
{
DWORD BytesWritten = 0;
OutputBuffer[0]=0; //The first byte is the "Report ID" and does not get transmitted over the USB bus. Always set=0.
OutputBuffer[0] = 0; // The first byte is the "Report ID" and does not get transmitted over the
// USB bus. Always set=0.
OutputBuffer[1] = 0xBB; // 0xBB - bajt rozpoznawczy dla PoKeys55
OutputBuffer[2] = iLastCommand = c; // operacja: 0x31: blokowy odczyt wejϾ
OutputBuffer[3] = b3; // np. numer pinu (o 1 mniej ni¿ numer na p³ytce)
@@ -174,10 +210,12 @@ bool __fastcall TPoKeys55::Write(unsigned char c,unsigned char b3,unsigned char
OutputBuffer[8] = 0;
for (int i = 0; i < 8; ++i)
OutputBuffer[8] += OutputBuffer[i]; // czy sumowaæ te¿ od 9 do 64?
//The basic Windows I/O functions WriteFile() and ReadFile() can be used to read and write to HID class USB devices
// The basic Windows I/O functions WriteFile() and ReadFile() can be used to read and write to
// HID class USB devices
//(once we have the read and write handles to the device, which are obtained with CreateFile()).
// The following call to WriteFile() sends 64 bytes of data to the USB device.
WriteFile(WriteHandle,&OutputBuffer,65,&BytesWritten,0); //Blocking function, unless an "overlapped" structure is used
WriteFile(WriteHandle, &OutputBuffer, 65, &BytesWritten,
0); // Blocking function, unless an "overlapped" structure is used
return (BytesWritten == 65);
// Read(); //odczyt trzeba zrobiæ inaczej - w tym miejscu bêdzie za szybko i nic siê nie odczyta
}
@@ -186,10 +224,12 @@ bool __fastcall TPoKeys55::Write(unsigned char c,unsigned char b3,unsigned char
bool __fastcall TPoKeys55::Read()
{
DWORD BytesRead = 0;
InputBuffer[0]=0; //The first byte is the "Report ID" and does not get transmitted over the USB bus. Always set=0.
InputBuffer[0] = 0; // The first byte is the "Report ID" and does not get transmitted over the
// USB bus. Always set=0.
// Now get the response packet from the firmware.
// The following call to ReadFIle() retrieves 64 bytes of data from the USB device.
ReadFile(ReadHandle,&InputBuffer,65,&BytesRead,0); //Blocking function,unless an "overlapped" structure is used
ReadFile(ReadHandle, &InputBuffer, 65, &BytesRead,
0); // Blocking function,unless an "overlapped" structure is used
// InputPacketBuffer[0] is the report ID, which we don't care about.
// InputPacketBuffer[1] is an echo back of the command.
// InputPacketBuffer[2] contains the I/O port pin value for the pushbutton.
@@ -199,30 +239,36 @@ bool __fastcall TPoKeys55::Read()
bool __fastcall TPoKeys55::ReadLoop(int i)
{ // próbuje odczytaæ (i) razy
do
{if (Read()) return true;
{
if (Read())
return true;
Sleep(1); // trochê poczekaæ, a¿ odpowie
}
while (--i);
} while (--i);
return false;
}
//---------------------------------------------------------------------------
AnsiString __fastcall TPoKeys55::Version()
{ // zwraca numer wersji, funkcja nieoptymalna czasowo (czeka na odpowiedŸ)
if (!WriteHandle) return "";
if (!WriteHandle)
return "";
Write(0x00, 0); // 0x00 - Read serial number, version
if (ReadLoop(10))
{ // 3: serial MSB; 4: serial LSB; 5: software version (v(1+[4-7]).([0-3])); 6: revision number
AnsiString s = "PoKeys55 #" + AnsiString((InputBuffer[3] << 8) + InputBuffer[4]);
s+=" v"+AnsiString(1+(InputBuffer[5]>>4))+"."+AnsiString(InputBuffer[5]&15)+"."+AnsiString(InputBuffer[6]);
s += " v" + AnsiString(1 + (InputBuffer[5] >> 4)) + "." + AnsiString(InputBuffer[5] & 15) +
"." + AnsiString(InputBuffer[6]);
/* //Ra: pozyskiwanie daty mo¿na sobie darowaæ, jest poniek¹d bez sensu
Write(0x04,0); //0x04 - Read build date: drugi argument zmieniaæ od 0 do 2, uzyskuj¹c kolejno po 4 znaki
Write(0x04,0); //0x04 - Read build date: drugi argument zmieniaæ od 0 do 2, uzyskuj¹c
kolejno po 4 znaki
if (ReadLoop(5))
{//2: 0x04; 3-6: char 1-4, 5-8, 9-11; (83-65-112-32-32-49-32-50-48-49-49-0=="Sep 1 2011")
s+=" ("+AnsiString((char*)InputBuffer+3,4);
Write(0x04,1); //0x04 - Read build date: drugi argument zmieniaæ od 0 do 2, uzyskuj¹c kolejno po 4 znaki
Write(0x04,1); //0x04 - Read build date: drugi argument zmieniaæ od 0 do 2, uzyskuj¹c
kolejno po 4 znaki
if (ReadLoop(5))
{s+=AnsiString((char*)InputBuffer+3,4);
Write(0x04,2); //0x04 - Read build date: drugi argument zmieniaæ od 0 do 2, uzyskuj¹c kolejno po 4 znaki
Write(0x04,2); //0x04 - Read build date: drugi argument zmieniaæ od 0 do 2, uzyskuj¹c
kolejno po 4 znaki
if (ReadLoop(5))
s+=AnsiString((char*)InputBuffer+3,3);
}
@@ -249,7 +295,8 @@ bool __fastcall TPoKeys55::Update(bool pause)
// iFaza=0; //jeden b³¹d i podtrzymanie pauzy jest kontynuowane
}
switch (iFaza)
{case 0: //uaktualnienie PWM raz na jakiœ czas
{
case 0: // uaktualnienie PWM raz na jakiœ czas
OutputBuffer[9] = 0x3F; // maska u¿ytych PWM
*((int *)(OutputBuffer + 10)) = iPWM[0]; // PWM1 (pin 22)
*((int *)(OutputBuffer + 14)) = iPWM[1]; // PWM2 (pin 21)
@@ -278,7 +325,8 @@ bool __fastcall TPoKeys55::Update(bool pause)
++iFaza; // skoro odczytano, mo¿na przejœæ do kolejnej fazy
iRepeats = 0; // zerowanie licznika prób
}
else ++iRepeats; //licznik nieudanych prób
else
++iRepeats; // licznik nieudanych prób
break;
case 2: // odczyt wejϾ cyfrowych - komenda i przetwarzanie
if (iLastCommand != 0x31) // asynchroniczne ustawienie kontrolki mo¿e namieszaæ
@@ -289,7 +337,8 @@ bool __fastcall TPoKeys55::Update(bool pause)
iFaza = 3; // skoro odczytano, mo¿na kolejny cykl
iRepeats = 0; // zerowanie licznika prób
}
else ++iRepeats; //licznik nieudanych prób
else
++iRepeats; // licznik nieudanych prób
break;
case 3: // ustawienie wyjœæ analogowych, 0..4095 mapowaæ na 0..65520 (<<4)
if (Write(0x41, 43 - 1, (iPWM[6] >> 4), (iPWM[6] << 4))) // wys³anie ustawieñ
@@ -303,7 +352,8 @@ bool __fastcall TPoKeys55::Update(bool pause)
}
if (!iRepeats)
bNoError = true; // jest OK
else if (iRepeats>=10) //youBy 2014-07: przy 5 powtórzeniach sieje mi pauz¹ po 2 razy na sekundê, a przy 10 jest ok
else if (iRepeats >= 10) // youBy 2014-07: przy 5 powtórzeniach sieje mi pauz¹ po 2 razy na
// sekundê, a przy 10 jest ok
{ // przekroczenie liczby prób wymusza kolejn¹ fazê
++iFaza;
iRepeats = 1; // w nowej fazie nowe szanse, ale nie od 0!
@@ -313,4 +363,3 @@ bool __fastcall TPoKeys55::Update(bool pause)
// czy w przypadku b³êdu komunikacji z PoKeys w³¹czaæ pauzê?
// dopiero poprawne pod³¹czenie zeruje licznik prób
};

View File

@@ -20,7 +20,8 @@ public:
__fastcall ~TPoKeys55();
bool __fastcall Connect();
bool __fastcall Close();
bool __fastcall Write(unsigned char c,unsigned char b3,unsigned char b4=0,unsigned char b5=0);
bool __fastcall Write(unsigned char c, unsigned char b3, unsigned char b4 = 0,
unsigned char b5 = 0);
bool __fastcall Read();
bool __fastcall ReadLoop(int i);
AnsiString __fastcall Version();

View File

@@ -6,7 +6,6 @@
#include "Curve.h"
__fastcall TCurve::TCurve()
{
Values = NULL;
@@ -133,7 +132,6 @@ bool __fastcall TCurve::SaveToFile(AnsiString asName)
fclose(stream);
DecimalSeparator = ',';
}
//---------------------------------------------------------------------------

View File

@@ -26,4 +26,3 @@ private:
};
//---------------------------------------------------------------------------
#endif

4
Data.h
View File

@@ -10,8 +10,7 @@ struct TDist
{
int x, y;
};
const TDist SectorOrder[]=
{//tabela wspó³rzêdnych sektorów, posortowana wg odleg³oœci
const TDist SectorOrder[] = { // tabela wspó³rzêdnych sektorów, posortowana wg odleg³oœci
{0, 0}, // 0.00
{1, 0}, // 1.00
{0, 1}, // 1.00
@@ -414,5 +413,4 @@ const TDist SectorOrder[]=
{19, 19} // 26.87 - 400 (5374m)
};
#endif

2572
Driver.cpp

File diff suppressed because it is too large Load Diff

View File

@@ -92,7 +92,8 @@ public:
double fVelNext; // prędkość obowiązująca od tego miejsca
// double fAcc;
int iFlags;
//1=istotny,2=tor,4=odwrotnie,8-zwrotnica (może się zmienić),16-stan zwrotnicy,32-minięty,64=koniec,128=łuk
// 1=istotny,2=tor,4=odwrotnie,8-zwrotnica (może się zmienić),16-stan
// zwrotnicy,32-minięty,64=koniec,128=łuk
// 0x100=event,0x200=manewrowa,0x400=przystanek,0x800=SBL,0x1000=wysłana komenda,0x2000=W5
// 0x10000=zatkanie
vector3 vPos; // współrzędne XYZ do liczenia odległości
@@ -102,6 +103,7 @@ public:
TEvent *evEvent; // połączenie z eventem albo komórką pamięci
};
void __fastcall CommandCheck();
public:
void __fastcall Clear();
bool __fastcall Update(vector3 *p, vector3 *dir, double &len);
@@ -154,7 +156,8 @@ private: //parametry sterowania pojazdem (stan, hamowanie)
public:
double fLastStopExpDist; // odległość wygasania ostateniego przystanku
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ę hamulca
double fBrakeTime; // wpisana wartość jest zmniejszana do 0, gdy ujemna należy zmienić nastawę
// hamulca
private:
double fReady; // poziom odhamowania wagonów
bool Ready; // ABu: stan gotowosci do odjazdu - sprawdzenie odhamowania wagonow
@@ -167,10 +170,12 @@ private:
bool HelpMeFlag; // wystawiane True jesli cos niedobrego sie dzieje
public:
bool AIControllFlag; // rzeczywisty/wirtualny maszynista
int iRouteWanted; //oczekiwany kierunek jazdy (0-stop,1-lewo,2-prawo,3-prosto) np. odpala migacz lub czeka na stan zwrotnicy
int iRouteWanted; // oczekiwany kierunek jazdy (0-stop,1-lewo,2-prawo,3-prosto) np. odpala
// migacz lub czeka na stan zwrotnicy
private:
TDynamicObject *pVehicle; // pojazd w którym siedzi sterujący
TDynamicObject *pVehicles[2]; //skrajne pojazdy w składzie (niekoniecznie bezpośrednio sterowane)
TDynamicObject *
pVehicles[2]; // skrajne pojazdy w składzie (niekoniecznie bezpośrednio sterowane)
TMoverParameters *mvControlling; // jakim pojazdem steruje (może silnikowym w EZT)
TMoverParameters *mvOccupied; // jakim pojazdem hamuje
Mtable::TTrainParameters *TrainParams; // rozkład jazdy zawsze jest, nawet jeśli pusty
@@ -181,22 +186,29 @@ private:
TTextSound *tsGuardSignal; // komunikat od kierownika
int iGuardRadio; // numer kanału radiowego kierownika (0, gdy nie używa radia)
public:
double AccPreferred; //preferowane przyspieszenie (wg psychiki kierującego, zmniejszana przy wykryciu kolizji)
double AccPreferred; // preferowane przyspieszenie (wg psychiki kierującego, zmniejszana przy
// wykryciu kolizji)
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 fAccDesiredAv; //uśrednione przyspieszenie z kolejnych przebłysków świadomości, żeby ograniczyć migotanie
double fAccDesiredAv; // uśrednione przyspieszenie z kolejnych przebłysków świadomości, żeby
// ograniczyć migotanie
private:
double VelforDriver; //prędkość, używana przy zmianie kierunku (ograniczenie przy nieznajmości szlaku?)
double VelforDriver; // prędkość, używana przy zmianie kierunku (ograniczenie przy nieznajmości
// szlaku?)
double VelSignal; // predkość zadawana przez semafor (funkcją SetVelocity())
double VelLimit; //predkość zadawana przez event jednokierunkowego ograniczenia prędkości (PutValues albo komendą)
double VelLimit; // predkość zadawana przez event jednokierunkowego ograniczenia prędkości
// (PutValues albo komendą)
public:
double VelNext; // prędkość, jaka ma być po przejechaniu długości ProximityDist
private:
//double fProximityDist; //odleglosc podawana w SetProximityVelocity(); >0:przeliczać do punktu, <0:podana wartość
// double fProximityDist; //odleglosc podawana w SetProximityVelocity(); >0:przeliczać do
// punktu, <0:podana wartość
public:
double ActualProximityDist; //odległość brana pod uwagę przy wyliczaniu prędkości i przyspieszenia
double
ActualProximityDist; // odległość brana pod uwagę przy wyliczaniu prędkości i przyspieszenia
private:
vector3 vCommandLocation; //polozenie wskaznika, sygnalizatora lub innego obiektu do ktorego odnosi sie komenda
vector3 vCommandLocation; // polozenie wskaznika, sygnalizatora lub innego obiektu do ktorego
// odnosi sie komenda
TOrders OrderList[maxorders]; // lista rozkazów
int OrderPos, OrderTop; // rozkaz aktualny oraz wolne miejsce do wstawiania nowych
std::ofstream LogFile; // zapis parametrow fizycznych
@@ -206,17 +218,23 @@ private:
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 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 gdy jazda bez łączenia
int iCoupler; // maska sprzęgu, jaką należy użyć przy łączeniu (po osiągnięciu trybu Connect), 0
// gdy jazda bez łączenia
int iDriverFailCount; // licznik błędów AI
bool Need_TryAgain; // true, jeśli druga pozycja w elektryku nie załapała
bool Need_BrakeRelease;
public:
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 fOverhead2; //informacja o sposobie jazdy (-1=normalnie, 0=bez prądu, >0=z opuszczonym i ograniczeniem prędkości)
int iOverheadZero; //suma bitowa jezdy bezprądowej, bity ustawiane przez pojazdy z podniesionymi pantografami
int iOverheadDown; //suma bitowa opuszczenia pantografów, bity ustawiane przez pojazdy z podniesionymi pantografami
double fVoltage; //uśrednione napięcie sieci: przy spadku poniżej wartości minimalnej opóźnić rozruch o losowy czas
double fOverhead2; // informacja o sposobie jazdy (-1=normalnie, 0=bez prądu, >0=z opuszczonym i
// ograniczeniem prędkości)
int iOverheadZero; // suma bitowa jezdy bezprądowej, bity ustawiane przez pojazdy z
// podniesionymi pantografami
int iOverheadDown; // suma bitowa opuszczenia pantografów, bity ustawiane przez pojazdy z
// podniesionymi pantografami
double fVoltage; // uśrednione napięcie sieci: przy spadku poniżej wartości minimalnej opóźnić
// rozruch o losowy czas
private:
double fMaxProximityDist; // akceptowalna odległość stanięcia przed przeszkodą
TStopReason eStopReason; // powód zatrzymania przy ustawieniu zerowej prędkości
@@ -244,12 +262,17 @@ private: //---//---//---//---// koniec zmiennych, poni
void __fastcall AutoRewident(); // ustawia hamulce w składzie
public:
Mtable::TTrainParameters *__fastcall Timetable() { return TrainParams; };
void __fastcall PutCommand(AnsiString NewCommand,double NewValue1,double NewValue2,const _mover::TLocation &NewLocation,TStopReason reason=stopComm);
bool __fastcall PutCommand(AnsiString NewCommand,double NewValue1,double NewValue2,const vector3 *NewLocation,TStopReason reason=stopComm);
void __fastcall PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2,
const _mover::TLocation &NewLocation, TStopReason reason = stopComm);
bool __fastcall PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2,
const vector3 *NewLocation, TStopReason reason = stopComm);
bool __fastcall UpdateSituation(double dt); // uruchamiac przynajmniej raz na sekundę
// procedury dotyczace rozkazow dla maszynisty
void __fastcall SetVelocity(double NewVel,double NewVelNext,TStopReason r=stopNone); //uaktualnia informacje o prędkości
bool __fastcall SetProximityVelocity(double NewDist,double NewVelNext); //uaktualnia informacje o prędkości przy nastepnym semaforze
void __fastcall SetVelocity(double NewVel, double NewVelNext,
TStopReason r = stopNone); // uaktualnia informacje o prędkości
bool __fastcall SetProximityVelocity(
double NewDist,
double NewVelNext); // uaktualnia informacje o prędkości przy nastepnym semaforze
public:
void __fastcall JumpToNextOrder();
void __fastcall JumpToFirstOrder();
@@ -258,27 +281,28 @@ public:
TOrders __fastcall OrderCurrentGet();
TOrders __fastcall OrderNextGet();
bool __fastcall CheckVehicles(TOrders user = Wait_for_orders);
private:
void __fastcall CloseLog();
void __fastcall OrderCheck();
public:
void __fastcall OrdersInit(double fVel);
void __fastcall OrdersClear();
void __fastcall OrdersDump();
__fastcall TController
(bool AI,
TDynamicObject *NewControll,
bool InitPsyche,
__fastcall TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
bool primary = true // czy ma aktywnie prowadzić?
);
AnsiString __fastcall OrderCurrent();
void __fastcall WaitingSet(double Seconds);
private:
AnsiString __fastcall Order2Str(TOrders Order);
void __fastcall DirectionForward(bool forward);
int __fastcall OrderDirectionChange(int newdir, TMoverParameters *Vehicle);
void __fastcall Lights(int head, int rear);
double __fastcall Distance(vector3 &p1, vector3 &n, vector3 &p2);
private: // Ra: metody obsługujące skanowanie toru
TEvent *__fastcall CheckTrackEvent(double fDirection, TTrack *Track);
bool __fastcall TableCheckEvent(TEvent *e);
@@ -288,14 +312,18 @@ private: //Ra: metody obs
TEvent *__fastcall TableCheckTrackEvent(double fDirection, TTrack *Track);
void __fastcall TableTraceRoute(double fDistance, TDynamicObject *pVehicle = NULL);
void __fastcall TableCheck(double fDistance);
TCommandType __fastcall TableUpdate(double &fVelDes,double &fDist,double &fNext,double &fAcc);
TCommandType __fastcall TableUpdate(double &fVelDes, double &fDist, double &fNext,
double &fAcc);
void __fastcall TablePurger();
private: // Ra: stare funkcje skanujące, używane do szukania sygnalizatora z tyłu
bool __fastcall BackwardTrackBusy(TTrack *Track);
TEvent *__fastcall CheckTrackEventBackward(double fDirection, TTrack *Track);
TTrack* __fastcall BackwardTraceRoute(double &fDistance,double &fDirection,TTrack *Track,TEvent*&Event);
TTrack *__fastcall BackwardTraceRoute(double &fDistance, double &fDirection, TTrack *Track,
TEvent *&Event);
void __fastcall SetProximityVelocity(double dist, double vel, const vector3 *pos);
TCommandType __fastcall BackwardScan();
public:
void __fastcall PhysicsLog();
AnsiString __fastcall StopReasonText();

1916
DynObj.cpp

File diff suppressed because it is too large Load Diff

View File

@@ -63,7 +63,8 @@ class TAnimValveGear
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
// dołożyć parametry drążka nastawnicy
//albo nawet zrobić dynamiczną tablicę float[] i w nią pakować wszelkie współczynniki, potem używać indeksów
// albo nawet zrobić dynamiczną tablicę float[] i w nią pakować wszelkie współczynniki, potem
// 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
};
@@ -93,12 +94,14 @@ public:
};
class TAnim
{//klasa animowanej części pojazdu (koła, drzwi, pantografy, burty, napęd parowozu, siłowniki itd.)
{ // klasa animowanej części pojazdu (koła, drzwi, pantografy, burty, napęd parowozu, siłowniki
// itd.)
public:
union
{
TSubModel *smAnimated; // animowany submodel (jeśli tylko jeden, np. oś)
TSubModel **smElement; //jeśli animowanych elementów jest więcej (pantograf, napęd parowozu)
TSubModel **smElement; // jeśli animowanych elementów jest więcej (pantograf, napęd
// parowozu)
int iShift; // przesunięcie przed przydzieleniem wskaźnika
};
union
@@ -142,11 +145,14 @@ private: //po
TTrackParam tp; // parametry toru przekazywane do fizyki
TTrackFollower Axle0; // oś z przodu (od sprzęgu 0)
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 eventy)
int iAxleFirst; // numer pierwszej osi w kierunku ruchu (oś wiążąca pojazd z torem i wyzwalająca
// eventy)
float fAxleDist; // rozstaw wózków albo osi do liczenia proporcji zacienienia
vector3 modelRot; // obrot pudła względem świata - do przeanalizowania, czy potrzebne!!!
// bool bCameraNear; //blisko kamer są potrzebne dodatkowe obliczenia szczegółów
TDynamicObject* __fastcall ABuFindNearestObject(TTrack *Track,TDynamicObject *MyPointer,int &CouplNr);
TDynamicObject *__fastcall ABuFindNearestObject(TTrack *Track, TDynamicObject *MyPointer,
int &CouplNr);
public: // parametry położenia pojazdu dostępne publicznie
AnsiString asTrack; // nazwa toru początkowego; wywalić?
AnsiString asDestination; // dokąd pojazd ma być kierowany "(stacja):(tor)"
@@ -173,9 +179,12 @@ public: //tymczasowo udost
private:
int iAnimations; // liczba obiektów animujących
TAnim *pAnimations; // obiekty animujące (zawierają wskaźnik do funkcji wykonującej animację)
TSubModel **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 toczne
void UpdateNone(TAnim *pAnim) {}; //animacja pusta (funkcje ustawiania submodeli, gdy blisko kamery)
TSubModel **
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
// toczne
void
UpdateNone(TAnim *pAnim){}; // animacja pusta (funkcje ustawiania submodeli, gdy blisko kamery)
void UpdateAxle(TAnim *pAnim); // animacja osi
void UpdateBoogie(TAnim *pAnim); // animacja wózka
void UpdateDoorTranslate(TAnim *pAnim); // animacja drzwi - przesuw
@@ -219,7 +228,8 @@ private:
TButton btCoupler1; // sprzegi
TButton btCoupler2;
TAirCoupler btCPneumatic1; //sprzegi powietrzne //yB - zmienione z Button na AirCoupler - krzyzyki
TAirCoupler
btCPneumatic1; // sprzegi powietrzne //yB - zmienione z Button na AirCoupler - krzyzyki
TAirCoupler btCPneumatic2;
TAirCoupler btCPneumatic1r; // ABu: to zeby nie bylo problemow przy laczeniu wagonow,
TAirCoupler btCPneumatic2r; // jesli beda polaczone sprzegami 1<->1 lub 0<->0
@@ -293,25 +303,29 @@ private:
float ModCamRot;
int iInventory; // flagi bitowe posiadanych submodeli (np. świateł)
void __fastcall TurnOff();
public:
int iHornWarning; // numer syreny do użycia po otrzymaniu sygnału do jazdy
bool bEnabled; // Ra: wyjechał na portal i ma być usunięty
protected:
// TTrackFollower Axle2; //dwie osie z czterech (te są protected)
// TTrackFollower Axle3; //Ra: wyłączyłem, bo kąty są liczone w Segment.cpp
int iNumAxles; // ilość osi
int CouplCounter;
AnsiString asModel;
public:
void ABuScanObjects(int ScanDir, double ScanDist);
protected:
TDynamicObject* __fastcall ABuFindObject(TTrack *Track,int ScanDir,Byte &CouplFound,double &dist);
TDynamicObject *__fastcall ABuFindObject(TTrack *Track, int ScanDir, Byte &CouplFound,
double &dist);
void __fastcall ABuCheckMyTrack();
public:
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 pojazdem)
double fTrackBlock; // odległość do przeszkody do dalszego ruchu (wykrywanie kolizji z innym
// pojazdem)
TDynamicObject *__fastcall PrevAny();
TDynamicObject *__fastcall Prev();
TDynamicObject *__fastcall Next();
@@ -324,10 +338,7 @@ public:
int __fastcall GetPneumatic(bool front, bool red);
void __fastcall SetPneumatic(bool front, bool red);
AnsiString asName;
AnsiString __fastcall GetName()
{
return this?asName:AnsiString("");
};
AnsiString __fastcall GetName() { return this ? asName : AnsiString(""); };
TRealSound rsDiesielInc; // youBy
TRealSound rscurve; // youBy
@@ -337,12 +348,12 @@ public:
// float EmR;
// vector3 smokeoffset;
TDynamicObject* __fastcall ABuScanNearestObject(TTrack *Track, double ScanDir, double ScanDist, int &CouplNr);
TDynamicObject *__fastcall ABuScanNearestObject(TTrack *Track, double ScanDir, double ScanDist,
int &CouplNr);
TDynamicObject *__fastcall GetFirstDynamic(int cpl_type);
// TDynamicObject* __fastcall GetFirstCabDynamic(int cpl_type);
void ABuSetModelShake(vector3 mShake);
// McZapkie-010302
TController *Mechanik;
TController *ctOwner; // wskażnik na obiekt zarządzający składem
@@ -356,17 +367,17 @@ public:
GLuint ReplacableSkinID[5]; // McZapkie:zmienialne nadwozie
int iAlpha; // maska przezroczystości tekstur
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 jazdę bezprądową
int iOverheadMask; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały
// jazdę bezprądową
TTractionParam tmpTraction;
double fAdjustment; //korekcja - docelowo przenieść do TrkFoll.cpp wraz z odległością od poprzedniego
double fAdjustment; // korekcja - docelowo przenieść do TrkFoll.cpp wraz z odległością od
// poprzedniego
__fastcall TDynamicObject();
__fastcall ~TDynamicObject();
double __fastcall TDynamicObject::Init
(//zwraca długość pojazdu albo 0, jeśli błąd
double __fastcall TDynamicObject::Init( // zwraca długość pojazdu albo 0, jeśli błąd
AnsiString Name, AnsiString BaseDir, AnsiString asReplacableSkin, AnsiString Type_Name,
TTrack *Track, double fDist, AnsiString DriverType, double fVel, AnsiString TrainName,
float Load, AnsiString LoadType,bool Reversed, AnsiString
);
float Load, AnsiString LoadType, bool Reversed, AnsiString);
void __fastcall AttachPrev(TDynamicObject *Object, int iType = 1);
bool __fastcall UpdateForce(double dt, double dt1, bool FullVer);
void __fastcall LoadUpdate();
@@ -378,9 +389,18 @@ public:
void __fastcall RenderAlpha();
void __fastcall RenderSounds();
inline vector3 __fastcall GetPosition() { return vPosition; };
inline vector3 __fastcall HeadPosition() {return vCoulpler[iDirection^1];}; //pobranie współrzędnych czoła
inline vector3 __fastcall RearPosition() {return vCoulpler[iDirection];}; //pobranie współrzędnych tyłu
inline vector3 __fastcall AxlePositionGet() {return iAxleFirst?Axle1.pPosition:Axle0.pPosition;};
inline vector3 __fastcall HeadPosition()
{
return vCoulpler[iDirection ^ 1];
}; // pobranie współrzędnych czoła
inline vector3 __fastcall RearPosition()
{
return vCoulpler[iDirection];
}; // pobranie współrzędnych tyłu
inline vector3 __fastcall AxlePositionGet()
{
return iAxleFirst ? Axle1.pPosition : Axle0.pPosition;
};
inline vector3 __fastcall VectorFront() { return vFront; };
inline vector3 __fastcall VectorUp() { return vUp; };
inline vector3 __fastcall VectorLeft() { return vLeft; };
@@ -388,12 +408,15 @@ public:
inline double __fastcall GetVelocity() { return MoverParameters->Vel; };
inline double __fastcall GetLength() { return MoverParameters->Dim.L; };
inline double __fastcall GetWidth() { return MoverParameters->Dim.W; };
inline TTrack* __fastcall GetTrack() { return (iAxleFirst?Axle1.GetTrack():Axle0.GetTrack()); };
inline TTrack *__fastcall GetTrack()
{
return (iAxleFirst ? Axle1.GetTrack() : Axle0.GetTrack());
};
// void __fastcall UpdatePos();
// McZapkie-260202
void __fastcall LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, AnsiString ReplacableSkin);
void __fastcall LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
AnsiString ReplacableSkin);
inline double __fastcall ABuGetDirection() // ABu.
{
@@ -422,19 +445,22 @@ public:
TDynamicObject *__fastcall FirstFind(int &coupler_nr);
float __fastcall GetEPP(); // wyliczanie sredniego cisnienia w PG
int __fastcall DirectionSet(int d); // ustawienie kierunku w składzie
int __fastcall DirectionGet() {return iDirection+iDirection-1;}; //odczyt kierunku w składzie
int __fastcall DirectionGet()
{
return iDirection + iDirection - 1;
}; // odczyt kierunku w składzie
int DettachStatus(int dir);
int Dettach(int dir);
TDynamicObject *__fastcall Neightbour(int &dir);
void __fastcall CoupleDist();
TDynamicObject *__fastcall ControlledFind();
void __fastcall ParamSet(int what, int into);
int __fastcall RouteWish(TTrack *tr); //zapytanie do AI, po którym segmencie skrzyżowania jechać
int __fastcall RouteWish(TTrack *tr); // zapytanie do AI, po którym segmencie skrzyżowania
// jechać
void __fastcall DestinationSet(AnsiString to);
AnsiString __fastcall TextureTest(AnsiString &name);
void __fastcall OverheadTrack(float o);
};
//---------------------------------------------------------------------------
#endif

View File

@@ -82,7 +82,6 @@ HWND hWnd=NULL; // Holds Our Window Handle
TWorld World;
// bool active=TRUE; //window active flag set to TRUE by default
bool fullscreen = TRUE; // fullscreen flag set to fullscreen mode by default
int WindowWidth = 800;
@@ -135,13 +134,15 @@ GLvoid KillGLWindow(GLvoid) // properly kill the window
if (!wglMakeCurrent(NULL, NULL)) // are we able to release the DC and RC contexts?
{
ErrorLog("Fail: window releasing");
MessageBox(NULL,"Release of DC and RC failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
MessageBox(NULL, "Release of DC and RC failed.", "SHUTDOWN ERROR",
MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC)) // are we able to delete the RC?
{
ErrorLog("Fail: rendering context releasing");
MessageBox(NULL,"Release rendering context failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
MessageBox(NULL, "Release rendering context failed.", "SHUTDOWN ERROR",
MB_OK | MB_ICONINFORMATION);
}
hRC = NULL; // set RC to NULL
}
@@ -149,7 +150,8 @@ GLvoid KillGLWindow(GLvoid) // properly kill the window
if (hDC && !ReleaseDC(hWnd, hDC)) // are we able to release the DC?
{
ErrorLog("Fail: device context releasing");
MessageBox(NULL,"Release device context failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
MessageBox(NULL, "Release device context failed.", "SHUTDOWN ERROR",
MB_OK | MB_ICONINFORMATION);
hDC = NULL; // set DC to NULL
}
@@ -200,13 +202,15 @@ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscree
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // load the arrow pointer
wc.hbrBackground = NULL; // no background required for GL
wc.lpszMenuName = NULL; // we don't want a menu
wc.lpszClassName="EU07"; //nazwa okna do komunikacji zdalnej // Set The Class Name
wc.lpszClassName = "EU07"; // nazwa okna do komunikacji zdalnej
// // Set The Class Name
if (!arbMultisampleSupported) // tylko dla pierwszego okna
if (!RegisterClass(&wc)) // Attempt To Register The Window Class
{
ErrorLog("Fail: window class registeration");
MessageBox(NULL,"Failed to register the window class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
MessageBox(NULL, "Failed to register the window class.", "ERROR",
MB_OK | MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
@@ -220,8 +224,11 @@ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscree
// locate primary monitor...
if (Global::bAdjustScreenFreq)
{
POINT point; point.x=0; point.y=0;
MONITORINFOEX monitorinfo; monitorinfo.cbSize=sizeof(MONITORINFOEX);
POINT point;
point.x = 0;
point.y = 0;
MONITORINFOEX monitorinfo;
monitorinfo.cbSize = sizeof(MONITORINFOEX);
::GetMonitorInfo(::MonitorFromPoint(point, MONITOR_DEFAULTTOPRIMARY), &monitorinfo);
// ..and query for highest supported refresh rate
unsigned int refreshrate = 0;
@@ -243,14 +250,17 @@ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscree
dmScreenSettings.dmPelsWidth = width; // selected screen width
dmScreenSettings.dmPelsHeight = height; // selected screen height
dmScreenSettings.dmBitsPerPel = bits; // selected bits per pixel
dmScreenSettings.dmFields=dmScreenSettings.dmFields|DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
dmScreenSettings.dmFields =
dmScreenSettings.dmFields | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
// Try to set selected mode and get results. NOTE: CDS_FULLSCREEN gets rid of start bar.
if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
// If the mode fails, offer two options. Quit or use windowed mode.
ErrorLog("Fail: full screen");
if (MessageBox(NULL,"The requested fullscreen mode is not supported by\nyour video card. Use windowed mode instead?","EU07",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
if (MessageBox(NULL, "The requested fullscreen mode is not supported by\nyour video "
"card. Use windowed mode instead?",
"EU07", MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
{
fullscreen = FALSE; // Windowed Mode Selected. Fullscreen = FALSE
}
@@ -275,16 +285,19 @@ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscree
dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // Windows Style
}
AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle); // Adjust Window To True Requested Size
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE,
dwExStyle); // Adjust Window To True Requested Size
// Create The Window
if (NULL==(hWnd=CreateWindowEx(dwExStyle, // Extended Style For The Window
if (NULL ==
(hWnd = CreateWindowEx(dwExStyle, // Extended Style For The Window
"EU07", // Class Name
title, // Window Title
dwStyle | // Defined Window Style
WS_CLIPSIBLINGS | // Required Window Style
WS_CLIPCHILDREN, // Required Window Style
0, 0, // Window Position
0,
0, // Window Position
WindowRect.right - WindowRect.left, // Calculate Window Width
WindowRect.bottom - WindowRect.top, // Calculate Window Height
NULL, // No Parent Window
@@ -307,7 +320,8 @@ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscree
PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format
bits, // Select Our Color Depth
0, 0, 0, 0, 0, 0, // Color Bits Ignored
0,
0, 0, 0, 0, 0, // Color Bits Ignored
0, // No Alpha Buffer
0, // Shift Bit Ignored
0, // No Accumulation Buffer
@@ -336,11 +350,13 @@ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscree
*/
if (!arbMultisampleSupported)
{
if (NULL==(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
if (NULL == (PixelFormat =
ChoosePixelFormat(hDC, &pfd))) // Did Windows Find A Matching Pixel Format?
{
KillGLWindow(); // Reset The Display
ErrorLog("Fail: pixelformat");
MessageBox(NULL,"Can't find a suitable pixelformat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
MessageBox(NULL, "Can't find a suitable pixelformat.", "ERROR",
MB_OK | MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
}
@@ -359,7 +375,8 @@ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscree
{
KillGLWindow(); // Reset The Display
ErrorLog("Fail: OpenGL rendering context creation");
MessageBox(NULL,"Can't create a GL rendering context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
MessageBox(NULL, "Can't create a GL rendering context.", "ERROR",
MB_OK | MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
@@ -367,7 +384,8 @@ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscree
{
KillGLWindow(); // Reset The Display
ErrorLog("Fail: OpenGL rendering context activation");
MessageBox(NULL,"Can't activate the GL rendering context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
MessageBox(NULL, "Can't activate the GL rendering context.", "ERROR",
MB_OK | MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
@@ -379,9 +397,11 @@ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscree
*/
if (Global::iMultisampling)
if (!arbMultisampleSupported)
if ((Global::iMultisampling=InitMultisample(hInstance,hWnd,pfd,1<<Global::iMultisampling))!=0)
if ((Global::iMultisampling =
InitMultisample(hInstance, hWnd, pfd, 1 << Global::iMultisampling)) != 0)
{
//WriteConsoleOnly("Opening second window for multisampling of "+AnsiString(Global::iMultisampling)+" samples.");
// WriteConsoleOnly("Opening second window for multisampling of
// "+AnsiString(Global::iMultisampling)+" samples.");
KillGLWindow(); // reset the display
return CreateGLWindow(title, width, height, bits, fullscreenflag); // rekurencja
}
@@ -410,7 +430,6 @@ static int test= 0;
//
#define MYDISPLAY 1
PCOPYDATASTRUCT pDane;
LRESULT CALLBACK WndProc(HWND hWnd, // handle for this window
@@ -496,15 +515,19 @@ LRESULT CALLBACK WndProc(HWND hWnd, //handle for this window
switch (wParam)
{
case VK_ESCAPE: //[Esc] pauzuje tylko bez Debugmode
if (DebugModeFlag) break;
if (DebugModeFlag)
break;
case 19: //[Pause]
if (Global::iPause & 1) // jeœli pauza startowa
Global::iPause &= ~1; // odpauzowanie, gdy po wczytaniu mia³o nie startowaæ
else if (!(Global::iMultiplayer & 2)) // w multiplayerze pauza nie ma sensu
if (!Console::Pressed(VK_CONTROL)) // z [Ctrl] to radiostop jest
//Ra: poni¿sze nie ma sensu, bo brak komunikacji natychmiast zapauzuje ponownie
//if (Global::iPause&8) //jeœli pauza zwi¹zana z brakiem komunikacji z PoKeys
// Global::iPause&=~10; //odpauzowanie pauzy PoKeys (chyba nic nie da) i ewentualnie klawiszowej równie¿
// Ra: poni¿sze nie ma sensu, bo brak komunikacji natychmiast zapauzuje
// ponownie
// if (Global::iPause&8) //jeœli pauza zwi¹zana z brakiem komunikacji z
// PoKeys
// Global::iPause&=~10; //odpauzowanie pauzy PoKeys (chyba nic nie da) i
// ewentualnie klawiszowej równie¿
// else
Global::iPause ^= 2; // zmiana stanu zapauzowania
if (Global::iPause) // jak pauza
@@ -580,9 +603,6 @@ LRESULT CALLBACK WndProc(HWND hWnd, //handle for this window
return DefWindowProc(hWnd, uMsg, wParam, lParam);
};
int WINAPI WinMain(HINSTANCE hInstance, // instance
HINSTANCE hPrevInstance, // previous instance
LPSTR lpCmdLine, // command line parameters
@@ -642,7 +662,9 @@ int WINAPI WinMain( HINSTANCE hInstance, //instance
Global::iConvertModels = -7; // z optymalizacj¹, bananami i prawid³owym Opacity
}
else
Error("Program usage: EU07 [-s sceneryfilepath] [-v vehiclename] [-modifytga] [-e3d]",!Global::iWriteLogEnabled);
Error(
"Program usage: EU07 [-s sceneryfilepath] [-v vehiclename] [-modifytga] [-e3d]",
!Global::iWriteLogEnabled);
}
delete Parser; // ABu 050205: tego wczesniej nie bylo
}
@@ -656,9 +678,11 @@ int WINAPI WinMain( HINSTANCE hInstance, //instance
WindowWidth = Global::iWindowWidth;
WindowHeight = Global::iWindowHeight;
Bpp = Global::iBpp;
if (Bpp!=32) Bpp=16;
if (Bpp != 32)
Bpp = 16;
// create our OpenGL window
if (!CreateGLWindow(Global::asHumanCtrlVehicle.c_str(),WindowWidth,WindowHeight,Bpp,fullscreen))
if (!CreateGLWindow(Global::asHumanCtrlVehicle.c_str(), WindowWidth, WindowHeight, Bpp,
fullscreen))
return 0; // quit if window was not created
SetForegroundWindow(hWnd);
// McZapkie: proba przeplukania klawiatury
@@ -678,8 +702,10 @@ int WINAPI WinMain( HINSTANCE hInstance, //instance
World.ModifyTGA(); // rekurencyjne przegl¹danie katalogów
}
else
{if (Global::iConvertModels<0)
{Global::iConvertModels=-Global::iConvertModels;
{
if (Global::iConvertModels < 0)
{
Global::iConvertModels = -Global::iConvertModels;
World.CreateE3D("models\\"); // rekurencyjne przegl¹danie katalogów
World.CreateE3D("dynamic\\", true);
} // po zrobieniu E3D odpalamy normalnie sceneriê, by j¹ zobaczyæ
@@ -721,5 +747,3 @@ int WINAPI WinMain( HINSTANCE hInstance, //instance
KillGLWindow(); // kill the window
return (msg.wParam); // exit the program
}

View File

@@ -20,8 +20,6 @@
#include "parser.h"
#include "Console.h"
//---------------------------------------------------------------------------
__fastcall TEventLauncher::TEventLauncher()
@@ -38,14 +36,9 @@ __fastcall TEventLauncher::TEventLauncher()
iCheckMask = 0;
}
__fastcall TEventLauncher::~TEventLauncher()
{
SafeDeleteArray(szText);
}
__fastcall TEventLauncher::~TEventLauncher() { SafeDeleteArray(szText); }
void __fastcall TEventLauncher::Init()
{
}
void __fastcall TEventLauncher::Init() {}
bool __fastcall TEventLauncher::Load(cParser *parser)
{ // wczytanie wyzwalacza zdarzeñ
@@ -74,7 +67,8 @@ bool __fastcall TEventLauncher::Load(cParser *parser)
iMinute = int(DeltaTime) % 100; // minuty s¹ najm³odszymi cyframi dziesietnymi
iHour = int(DeltaTime - iMinute) / 100; // godzina to setki
DeltaTime = 0; // bez powtórzeñ
WriteLog("EventLauncher at "+IntToStr(iHour)+":"+IntToStr(iMinute)); //wyœwietlenie czasu
WriteLog("EventLauncher at " + IntToStr(iHour) + ":" +
IntToStr(iMinute)); // wyœwietlenie czasu
}
parser->getTokens();
*parser >> token;
@@ -113,7 +107,8 @@ bool __fastcall TEventLauncher::Load(cParser *parser)
str = AnsiString(token.c_str());
fVal1 = str.ToDouble();
}
else fVal1=0;
else
fVal1 = 0;
parser->getTokens();
*parser >> token;
if (token.compare("*") != 0) //*=nie braæ wartoœci 2. pod uwagê
@@ -122,7 +117,8 @@ bool __fastcall TEventLauncher::Load(cParser *parser)
str = AnsiString(token.c_str());
fVal2 = str.ToDouble();
}
else fVal2=0;
else
fVal2 = 0;
parser->getTokens(); // s³owo zamykaj¹ce
*parser >> token;
}
@@ -150,7 +146,8 @@ bool __fastcall TEventLauncher::Render()
else
{ // jeœli nie cykliczny, to sprawdziæ czas
if (GlobalTime->hh == iHour)
{if (GlobalTime->mm==iMinute)
{
if (GlobalTime->mm == iMinute)
{ // zgodnoϾ czasu uruchomienia
if (UpdatedTime < 10)
{

154
Event.cpp
View File

@@ -23,19 +23,22 @@ __fastcall TEvent::TEvent(AnsiString m)
{
// asName=""; //czy nazwa eventu jest niezbêdna w tym przypadku? chyba nie
evNext = evNext2 = NULL;
bEnabled=false; //false dla eventów u¿ywanych do skanowania sygna³ów (nie dodawane do kolejki)
bEnabled = false; // false dla eventów u¿ywanych do skanowania sygna³ów (nie dodawane do
// kolejki)
asNodeName = m; // nazwa obiektu powi¹zanego
iQueued = 0; // nie zosta³ dodany do kolejki
// bIsHistory=false;
fDelay = 0;
fStartTime = 0; // 0 nie ma sensu
Type=m.IsEmpty()?tp_Unknown:tp_GetValues; //utworzenie niejawnego odczytu komórki pamiêci w torze
Type = m.IsEmpty() ? tp_Unknown :
tp_GetValues; // utworzenie niejawnego odczytu komórki pamiêci w torze
for (int i = 0; i < 13; i++)
Params[i].asPointer = NULL;
evJoined = NULL; // nie ma kolejnego z t¹ sam¹ nazw¹, usuwane s¹ wg listy Next2
Activator = NULL;
iFlags = 0;
//event niejawny jest tworzony przed faz¹ InitEvents, która podmienia nazwê komórki pamiêci na wskaŸnik
// event niejawny jest tworzony przed faz¹ InitEvents, która podmienia nazwê komórki pamiêci na
// wskaŸnik
// Current->Params[8].asGroundNode=m; //to siê ustawi w InitEvents
// Current->Params[9].asMemCell=m->MemCell;
fRandomDelay = 0.0; // standardowo nie bêdzie dodatkowego losowego opóŸnienia
@@ -46,7 +49,8 @@ __fastcall TEvent::~TEvent()
switch (Type)
{ // sprz¹tanie
case tp_Multiple:
//SafeDeleteArray(Params[9].asText); //nie usuwaæ - nazwa obiektu powi¹zanego zamieniana na wskaŸnik
// SafeDeleteArray(Params[9].asText); //nie usuwaæ - nazwa obiektu powi¹zanego zamieniana na
// wskaŸnik
if (iFlags & conditional_memstring) // o ile jest ³añcuch do porównania w memcompare
SafeDeleteArray(Params[10].asText);
break;
@@ -57,7 +61,8 @@ __fastcall TEvent::~TEvent()
SafeDeleteArray(Params[10].asText);
break;
case tp_Animation: // nic
//SafeDeleteArray(Params[9].asText); //nie usuwaæ - nazwa jest zamieniana na wskaŸnik do submodelu
// SafeDeleteArray(Params[9].asText); //nie usuwaæ - nazwa jest zamieniana na wskaŸnik do
// submodelu
if (Params[0].asInt == 4) // jeœli z pliku VMD
delete[] Params[8].asPointer; // zwolniæ obszar
case tp_GetValues: // nic
@@ -66,8 +71,7 @@ __fastcall TEvent::~TEvent()
evJoined = NULL; // nie usuwaæ podczepionych tutaj
};
void __fastcall TEvent::Init()
{
void __fastcall TEvent::Init(){
};
@@ -79,7 +83,8 @@ void __fastcall TEvent::Conditions(cParser* parser,AnsiString s)
AnsiString str;
if (!asNodeName.IsEmpty())
{ // podczepienie ³añcucha, jeœli nie jest pusty
Params[9].asText=new char[asNodeName.Length()+1]; //usuwane i zamieniane na wskaŸnik
Params[9].asText = new char[asNodeName.Length() + 1]; // usuwane i zamieniane na
// wskaŸnik
strcpy(Params[9].asText, asNodeName.c_str());
}
parser->getTokens();
@@ -124,7 +129,8 @@ void __fastcall TEvent::Conditions(cParser* parser,AnsiString s)
iFlags |= conditional_memval2;
}
}
parser->getTokens(); *parser >> token;
parser->getTokens();
*parser >> token;
s = AnsiString(token.c_str()); // ewentualnie dalej losowe opóŸnienie
}
if (s == "randomdelay")
@@ -132,7 +138,8 @@ void __fastcall TEvent::Conditions(cParser* parser,AnsiString s)
std::string token;
parser->getTokens();
*parser >> fRandomDelay; // Ra 2014-03-11
parser->getTokens(); *parser >> token; //endevent
parser->getTokens();
*parser >> token; // endevent
}
};
@@ -207,7 +214,8 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
*parser >> token;
str = AnsiString(token.c_str());
if (str!="none") asNodeName=str; //nazwa obiektu powi¹zanego
if (str != "none")
asNodeName = str; // nazwa obiektu powi¹zanego
if (asName.SubString(1, 5) == "none_")
Type = tp_Ignored; // Ra: takie s¹ ignorowane
@@ -264,7 +272,8 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
strcpy(Params[9].asText, token.c_str());
break;
case 2: // maska wartoœci
iFlags=AnsiString(token.c_str()).ToIntDef(update_memstring|update_memval1|update_memval2);
iFlags = AnsiString(token.c_str())
.ToIntDef(update_memstring | update_memval1 | update_memval2);
break;
}
parser->getTokens();
@@ -281,7 +290,8 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
switch (++i)
{ // znaczenie kolejnych parametrów
case 1: // maska wartoœci
iFlags=AnsiString(token.c_str()).ToIntDef(update_memstring|update_memval1|update_memval2);
iFlags = AnsiString(token.c_str())
.ToIntDef(update_memstring | update_memval1 | update_memval2);
break;
}
parser->getTokens();
@@ -295,7 +305,8 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
break;
case tp_PutValues:
parser->getTokens(3);
*parser >> Params[3].asdouble >> Params[4].asdouble >> Params[5].asdouble; //po³o¿enie X,Y,Z
*parser >> Params[3].asdouble >> Params[4].asdouble >> Params[5].asdouble; // po³o¿enie
// X,Y,Z
if (org)
{ // przesuniêcie
// tmp->pCenter.RotateY(aRotate.y/180.0*M_PI); //Ra 2014-11: uwzglêdnienie rotacji
@@ -308,24 +319,31 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
*parser >> token;
str = AnsiString(token.c_str());
if (str.SubString(1, 19) == "PassengerStopPoint:")
{if (str.Pos("#")) str=str.SubString(1,str.Pos("#")-1); //obciêcie unikatowoœci
bEnabled=false; //nie do kolejki (dla SetVelocity te¿, ale jak jest do toru dowi¹zany)
{
if (str.Pos("#"))
str = str.SubString(1, str.Pos("#") - 1); // obciêcie unikatowoœci
bEnabled = false; // nie do kolejki (dla SetVelocity te¿, ale jak jest do toru
// dowi¹zany)
Params[6].asCommand = cm_PassengerStopPoint;
}
else if (str == "SetVelocity")
{bEnabled=false;
{
bEnabled = false;
Params[6].asCommand = cm_SetVelocity;
}
else if (str == "ShuntVelocity")
{bEnabled=false;
{
bEnabled = false;
Params[6].asCommand = cm_ShuntVelocity;
}
else if (str == "SetProximityVelocity")
{bEnabled=false;
{
bEnabled = false;
Params[6].asCommand = cm_SetProximityVelocity;
}
else if (str == "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;
}
else
@@ -339,9 +357,12 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
Params[1].asdouble = 0.0;
else
try
{Params[1].asdouble=str.ToDouble();}
{
Params[1].asdouble = str.ToDouble();
}
catch (...)
{Params[1].asdouble=0.0;
{
Params[1].asdouble = 0.0;
WriteLog("Error: number expected in PutValues event, found: " + str);
}
parser->getTokens();
@@ -351,9 +372,12 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
Params[2].asdouble = 0.0;
else
try
{Params[2].asdouble=str.ToDouble();}
{
Params[2].asdouble = str.ToDouble();
}
catch (...)
{Params[2].asdouble=0.0;
{
Params[2].asdouble = 0.0;
WriteLog("Error: number expected in PutValues event, found: " + str);
}
parser->getTokens();
@@ -372,22 +396,23 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
Params[i].asdouble = str.ToDouble(); // teraz mo¿e mieæ u³amek
i++;
}
}
while (token.compare("endevent")!=0);
} while (token.compare("endevent") != 0);
break;
case tp_Visible: // zmiana wyœwietlania obiektu
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str());
Params[0].asInt = str.ToInt();
parser->getTokens(); *parser >> token;
parser->getTokens();
*parser >> token;
break;
case tp_Velocity:
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str());
Params[0].asdouble = str.ToDouble() * 0.28;
parser->getTokens(); *parser >> token;
parser->getTokens();
*parser >> token;
break;
case tp_Sound:
// Params[0].asRealSound->Init(asNodeName.c_str(),Parser->GetNextSymbol().ToDouble(),Parser->GetNextSymbol().ToDouble(),Parser->GetNextSymbol().ToDouble(),Parser->GetNextSymbol().ToDouble());
@@ -397,15 +422,18 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
// Params[3].asdouble=Parser->GetNextSymbol().ToDouble(); //polozenie X,Y,Z - do poprawy!
parser->getTokens();
*parser >> Params[0].asInt; // 0: wylaczyc, 1: wlaczyc; -1: wlaczyc zapetlone
parser->getTokens(); *parser >> token;
parser->getTokens();
*parser >> token;
break;
case tp_Exit:
while ((ptr = strchr(asNodeName.c_str(), '_')) != NULL)
*ptr = ' ';
parser->getTokens(); *parser >> token;
parser->getTokens();
*parser >> token;
break;
case tp_Disable:
parser->getTokens(); *parser >> token;
parser->getTokens();
*parser >> token;
break;
case tp_Animation:
parser->getTokens();
@@ -419,7 +447,8 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
strcpy(Params[9].asText, token.c_str());
Params[0].asInt = 1;
parser->getTokens(4);
*parser >> Params[1].asdouble >> Params[2].asdouble >> Params[3].asdouble >> Params[4].asdouble;
*parser >> Params[1].asdouble >> Params[2].asdouble >> Params[3].asdouble >>
Params[4].asdouble;
}
else if (token.compare("translate") == 0)
{ // przesuw o wektor
@@ -429,7 +458,8 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
strcpy(Params[9].asText, token.c_str());
Params[0].asInt = 2;
parser->getTokens(4);
*parser >> Params[1].asdouble >> Params[2].asdouble >> Params[3].asdouble >> Params[4].asdouble;
*parser >> Params[1].asdouble >> Params[2].asdouble >> Params[3].asdouble >>
Params[4].asdouble;
}
else if (token.compare("digital") == 0)
{ // licznik cyfrowy
@@ -439,7 +469,8 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
strcpy(Params[9].asText, token.c_str());
Params[0].asInt = 8;
parser->getTokens(4); // jaki ma byæ sens tych parametrów?
*parser >> Params[1].asdouble >> Params[2].asdouble >> Params[3].asdouble >> Params[4].asdouble;
*parser >> Params[1].asdouble >> Params[2].asdouble >> Params[3].asdouble >>
Params[4].asdouble;
}
else if (token.substr(token.length() - 4, 4) == ".vmd") // na razie tu, mo¿e bêdzie inaczej
{ // animacja z pliku VMD
@@ -454,24 +485,33 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
strcpy(Params[9].asText, token.c_str());
Params[0].asInt = 4; // rodzaj animacji
parser->getTokens(4);
*parser >> Params[1].asdouble >> Params[2].asdouble >> Params[3].asdouble >> Params[4].asdouble;
*parser >> Params[1].asdouble >> Params[2].asdouble >> Params[3].asdouble >>
Params[4].asdouble;
}
parser->getTokens(); *parser >> token;
parser->getTokens();
*parser >> token;
break;
case tp_Switch:
parser->getTokens(); *parser >> Params[0].asInt;
parser->getTokens(); *parser >> token;
parser->getTokens();
*parser >> Params[0].asInt;
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str());
if (str != "endevent")
{Params[1].asdouble=str.ToDouble(); //prêdkoœæ liniowa ruchu iglic
parser->getTokens(); *parser >> token;
{
Params[1].asdouble = str.ToDouble(); // prêdkoœæ liniowa ruchu iglic
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str());
}
else
Params[1].asdouble = -1.0; // u¿yæ domyœlnej
if (str != "endevent")
{Params[2].asdouble=str.ToDouble(); //dodatkowy ruch drugiej iglicy (zamkniêcie nastawnicze)
parser->getTokens(); *parser >> token;
{
Params[2].asdouble =
str.ToDouble(); // dodatkowy ruch drugiej iglicy (zamkniêcie nastawnicze)
parser->getTokens();
*parser >> token;
}
else
Params[2].asdouble = -1.0; // u¿yæ domyœlnej
@@ -479,12 +519,14 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
case tp_DynVel:
parser->getTokens();
*parser >> Params[0].asdouble; // McZapkie-090302 *0.28;
parser->getTokens(); *parser >> token;
parser->getTokens();
*parser >> token;
break;
case tp_TrackVel:
parser->getTokens();
*parser >> Params[0].asdouble; // McZapkie-090302 *0.28;
parser->getTokens(); *parser >> token;
parser->getTokens();
*parser >> token;
break;
case tp_Multiple:
i = 0;
@@ -492,14 +534,17 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str());
while (str!=AnsiString("endevent") && str!=AnsiString("condition") && str!=AnsiString("randomdelay"))
while (str != AnsiString("endevent") && str != AnsiString("condition") &&
str != AnsiString("randomdelay"))
{
if ((str.SubString(1, 5) != "none_") ? (i < 8) : false)
{ // eventy rozpoczynaj¹ce siê od "none_" s¹ ignorowane
if (str != "else")
{Params[i].asText=new char[255];
{
Params[i].asText = new char[255];
strcpy(Params[i].asText, str.c_str());
if (ti) iFlags|=conditional_else<<i; //oflagowanie dla eventów "else"
if (ti)
iFlags |= conditional_else << i; // oflagowanie dla eventów "else"
i++;
}
else
@@ -519,11 +564,13 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
case tp_Friction: // zmiana przyczepnosci na scenerii
parser->getTokens();
*parser >> Params[0].asdouble; // Ra 2014-01-27
parser->getTokens(); *parser >> token;
parser->getTokens();
*parser >> token;
break;
case tp_Message: // wyœwietlenie komunikatu
do
{parser->getTokens();
{
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str());
} while (str != "endevent");
@@ -531,11 +578,13 @@ void __fastcall TEvent::Load(cParser* parser,vector3 *org)
case tp_Ignored: // ignorowany
case tp_Unknown: // nieznany
do
{parser->getTokens();
{
parser->getTokens();
*parser >> token;
str = AnsiString(token.c_str());
} while (str != "endevent");
WriteLog("Bad event: \""+asName+(Type==tp_Unknown?"\" has unknown type.":"\" is ignored."));
WriteLog("Bad event: \"" + asName +
(Type == tp_Unknown ? "\" has unknown type." : "\" is ignored."));
break;
}
};
@@ -620,7 +669,8 @@ void __fastcall TEvent::Append(TEvent *e)
if (evJoined)
evJoined->Append(e); // rekurencja! - góra kilkanaœcie eventów bêdzie potrzebne
else
{evJoined=e;
{
evJoined = e;
e->bEnabled = true; // ten doczepiony mo¿e byæ tylko kolejkowany
}
};

34
Event.h
View File

@@ -7,13 +7,32 @@
#include "dumb3d.h"
using namespace Math3D;
typedef enum { tp_Unknown, tp_Sound, tp_SoundPos, tp_Exit,
tp_Disable, tp_Velocity, tp_Animation, tp_Lights,
tp_UpdateValues, tp_GetValues, tp_PutValues,
tp_Switch, tp_DynVel, tp_TrackVel, tp_Multiple,
tp_AddValues, tp_Ignored, tp_CopyValues, tp_WhoIs,
tp_LogValues, tp_Visible,
tp_Voltage, tp_Message, tp_Friction
typedef enum
{
tp_Unknown,
tp_Sound,
tp_SoundPos,
tp_Exit,
tp_Disable,
tp_Velocity,
tp_Animation,
tp_Lights,
tp_UpdateValues,
tp_GetValues,
tp_PutValues,
tp_Switch,
tp_DynVel,
tp_TrackVel,
tp_Multiple,
tp_AddValues,
tp_Ignored,
tp_CopyValues,
tp_WhoIs,
tp_LogValues,
tp_Visible,
tp_Voltage,
tp_Message,
tp_Friction
} TEventType;
const int update_memstring = 0x0000001; // zmodyfikowaæ tekst (UpdateValues)
@@ -56,6 +75,7 @@ class TEvent //zmienne: ev*
{ // zdarzenie
private:
void __fastcall Conditions(cParser *parser, AnsiString s);
public:
AnsiString asName;
bool bEnabled; // false gdy ma nie byæ dodawany do kolejki (skanowanie sygna³ów)

View File

@@ -12,7 +12,6 @@
#include "Timer.h"
#include "FadeSound.h"
__fastcall TFadeSound::TFadeSound()
{
Sound = NULL;
@@ -21,15 +20,9 @@ __fastcall TFadeSound::TFadeSound()
fTime = 0;
}
__fastcall TFadeSound::~TFadeSound() { Free(); }
__fastcall TFadeSound::~TFadeSound()
{
Free();
}
void __fastcall TFadeSound::Free()
{
}
void __fastcall TFadeSound::Free() {}
void __fastcall TFadeSound::Init(char *Name, float fNewFade)
{
@@ -45,13 +38,9 @@ void __fastcall TFadeSound::TurnOn()
State = ss_Starting;
Sound->Play(0, 0, DSBPLAY_LOOPING);
fTime = fFade;
}
void __fastcall TFadeSound::TurnOff()
{
State= ss_ShuttingDown;
}
void __fastcall TFadeSound::TurnOff() { State = ss_ShuttingDown; }
void __fastcall TFadeSound::Update()
{
@@ -67,15 +56,13 @@ void __fastcall TFadeSound::Update()
Sound->SetVolume(-2000 * (fFade - fTime) / fFade);
Sound->SetFrequency(44100 - 500 + 500 * (fTime) / fFade);
}
else
if (Timer::GetSoundTimer())
else if (Timer::GetSoundTimer())
{
Sound->SetVolume(-2000 * (fFade - fTime) / fFade);
Sound->SetFrequency(44100 - 500 + 500 * (fTime) / fFade);
}
}
else
if (State==ss_ShuttingDown)
else if (State == ss_ShuttingDown)
{
fTime -= Timer::GetDeltaTime();
@@ -101,5 +88,3 @@ void __fastcall TFadeSound::Volume(long vol)
//---------------------------------------------------------------------------
#pragma package(smart_init)

View File

@@ -12,6 +12,7 @@ class TFadeSound
float fFade;
float dt, fTime;
TSoundState State;
public:
__fastcall TFadeSound();
__fastcall ~TFadeSound();
@@ -22,7 +23,6 @@ public:
void __fastcall Free();
void __fastcall Update();
void __fastcall Volume(long vol);
};
//---------------------------------------------------------------------------

142
Float3d.h
View File

@@ -10,32 +10,37 @@ class float3
public:
float x, y, z;
float3(void){};
__fastcall float3(float a,float b,float c) {x=a;y=b;z=c;};
__fastcall float3(float a, float b, float c)
{
x = a;
y = b;
z = c;
};
double inline __fastcall Length() const;
};
inline bool operator==(const float3 &v1, const float3 &v2)
{return (v1.x==v2.x&&v1.y==v2.y&&v1.z==v2.z);
{
return (v1.x == v2.x && v1.y == v2.y && v1.z == v2.z);
};
inline float3 &operator+=(float3 &v1, const float3 &v2)
{v1.x+=v2.x; v1.y+=v2.y; v1.z+=v2.z;
{
v1.x += v2.x;
v1.y += v2.y;
v1.z += v2.z;
return v1;
};
inline float3 operator-(const float3& v)
{return float3(-v.x,-v.y,-v.z);
};
inline float3 operator-(const float3 &v) { return float3(-v.x, -v.y, -v.z); };
inline float3 operator-(const float3 &v1, const float3 &v2)
{return float3(v1.x-v2.x,v1.y-v2.y,v1.z-v2.z);
{
return float3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
};
inline float3 operator+(const float3 &v1, const float3 &v2)
{return float3(v1.x+v2.x,v1.y+v2.y,v1.z+v2.z);
};
double inline __fastcall float3::Length() const
{return sqrt(x*x+y*y+z*z);
};
inline float3 operator/(const float3& v, double k)
{return float3(v.x/k,v.y/k,v.z/k);
{
return float3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
};
double inline __fastcall float3::Length() const { return sqrt(x * x + y * y + z * z); };
inline float3 operator/(const float3 &v, double k) { return float3(v.x / k, v.y / k, v.z / k); };
inline float3 SafeNormalize(const float3 &v)
{ // bezpieczna normalizacja (wektor d³ugoœci 1.0)
double l = v.Length();
@@ -47,41 +52,49 @@ inline float3 SafeNormalize(const float3 &v)
return retVal;
};
inline float3 CrossProduct(const float3 &v1, const float3 &v2)
{return float3(v1.y*v2.z-v1.z*v2.y,v2.x*v1.z-v2.z*v1.x,v1.x*v2.y-v1.y*v2.x);
{
return float3(v1.y * v2.z - v1.z * v2.y, v2.x * v1.z - v2.z * v1.x, v1.x * v2.y - v1.y * v2.x);
}
class float4
{ // kwaternion obrotu
public:
float x, y, z, w;
__fastcall float4() {x=y=z=0.f;w=1.f;};
__fastcall float4(float a,float b,float c,float d) {x=a;y=b;z=c;w=d;};
double inline float4::LengthSquared() const
{return x*x+y*y+z*z+w*w;};
double inline float4::Length() const
{return sqrt(x*x+y*y+z*z+w*w);};
__fastcall float4()
{
x = y = z = 0.f;
w = 1.f;
};
__fastcall float4(float a, float b, float c, float d)
{
x = a;
y = b;
z = c;
w = d;
};
double inline float4::LengthSquared() const { return x * x + y * y + z * z + w * w; };
double inline float4::Length() const { return sqrt(x * x + y * y + z * z + w * w); };
};
inline float4 operator*(const float4 &q1, const float4 &q2)
{ // 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.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)
{//sprzê¿ony; odwrotny tylko dla znormalizowanych!
return float4(-q.x,-q.y,-q.z,q.w);
};
inline float4 operator-(const float4 &q) { // sprzê¿ony; odwrotny tylko dla znormalizowanych! return float4(-q.x, -q.y, -q.z, q.w); };
inline float4 operator-(const float4 &q1, const float4 &q2)
{ // z odejmowaniem nie ma lekko
return (-q1) * q2; // inwersja tylko dla znormalizowanych!
};
inline float4 operator+(const float4 &v1, const float4 &v2)
{return float4(v1.x+v2.x,v1.y+v2.y,v1.z+v2.z,v1.w+v2.w);};
{
return float4(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z, v1.w + v2.w);
};
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)
{ // bezpieczna normalizacja (wektor d³ugoœci 1.0)
double l = v.LengthSquared();
@@ -98,7 +111,10 @@ float Dot(const float4 &q1,const float4 &q2)
}
inline float4 &operator*=(float4 &v1, double d)
{ // mno¿enie przez skalar, jaki ma sens?
v1.x*=d; v1.y*=d; v1.z*=d; v1.w*=d;
v1.x *= d;
v1.y *= d;
v1.z *= d;
v1.w *= d;
return v1;
};
inline float4 Slerp(const float4 &q0, const float4 &q1, float t)
@@ -128,15 +144,10 @@ inline float4 Slerp(const float4 &q0,const float4 &q1,float t)
k0 = sin((1.0f - t) * omega) * oneOverSinOmega;
k1 = sin(t * omega) * oneOverSinOmega;
}
return float4
(q0.x*k0+new_q1.x*k1,
q0.y*k0+new_q1.y*k1,
q0.z*k0+new_q1.z*k1,
q0.w*k0+new_q1.w*k1
);
return float4(q0.x * k0 + new_q1.x * k1, q0.y * k0 + new_q1.y * k1, q0.z * k0 + new_q1.z * k1,
q0.w * k0 + new_q1.w * k1);
}
struct float8
{ // wiercho³ek 3D z wektorem normalnym i mapowaniem, pojedyncza precyzja
public:
@@ -148,13 +159,19 @@ public:
class float4x4
{ // macierz transformacji pojedynczej precyzji
float e[16];
public:
float4x4(void){};
float4x4(float f[16]) {for (int i=0;i<16;++i) e[i]=f[i];};
float4x4(float f[16])
{
for (int i = 0; i < 16; ++i)
e[i] = f[i];
};
float *__fastcall operator()(int i) { return &e[i << 2]; }
const float *__fastcall readArray(void) { return e; }
void __fastcall Identity()
{for (int i=0;i<16;++i)
{
for (int i = 0; i < 16; ++i)
e[i] = 0;
e[0] = e[5] = e[10] = e[15] = 1.0f;
}
@@ -163,8 +180,11 @@ public:
{ // taka specjalna rotacja, nie ma co ci¹gaæ trygonometrii
float f;
for (int i = 0; i < 16; i += 4)
{e[i]=-e[i]; //zmiana znaku X
f=e[i+1]; e[i+1]=e[i+2]; e[i+2]=f; //zamiana Y i Z
{
e[i] = -e[i]; // zmiana znaku X
f = e[i + 1];
e[i + 1] = e[i + 2];
e[i + 2] = f; // zamiana Y i Z
}
};
inline float4x4 &Rotation(double angle, float3 axis);
@@ -176,17 +196,14 @@ public:
return true;
}
void __fastcall Quaternion(float4 *q);
inline float3* TranslationGet()
{return (float3*)(e+12);}
inline float3 *TranslationGet() { return (float3 *)(e + 12); }
};
inline float3 operator*(const float4x4 &m, const float3 &v)
{ // 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][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]);
}
inline float4x4 &float4x4::Rotation(double angle, float3 axis)
@@ -195,7 +212,8 @@ inline float4x4& float4x4::Rotation(double angle,float3 axis)
double s = sin(angle);
// One minus c (short name for legibility of formulai)
double omc = (1 - c);
if (axis.Length()!=1.0f) axis=SafeNormalize(axis);
if (axis.Length() != 1.0f)
axis = SafeNormalize(axis);
double x = axis.x;
double y = axis.y;
double z = axis.z;
@@ -238,19 +256,12 @@ inline float4x4 operator*(const float4x4& m1, const float4x4& m2)
};
// From code in Graphics Gems; p. 766
inline float Det2x2(float a,float b,float c,float d)
{//obliczenie wyznacznika macierzy 2×2
return a*d-b*c;
};
inline float Det2x2(float a, float b, float c, float d) { // obliczenie wyznacznika macierzy 2×2 return a * d - b * c; };
inline float Det3x3(float a1,float a2,float a3,
float b1,float b2,float b3,
float c1,float c2,float c3)
inline float Det3x3(float a1, float a2, float a3, float b1, float b2, float b3, float c1, float c2,
float c3)
{ // 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);
};
float Det(const float4x4 &m)
@@ -259,11 +270,10 @@ float Det(const float4x4 &m)
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 d1 = m[0][3], d2 = m[1][3], d3 = m[2][3], d4 = m[3][3];
return
+a1*Det3x3(b2,b3,b4,c2,c3,c4,d2,d3,d4)
-b1*Det3x3(a2,a3,a4,c2,c3,c4,d2,d3,d4)
+c1*Det3x3(a2,a3,a4,b2,b3,b4,d2,d3,d4)
-d1*Det3x3(a2,a3,a4,b2,b3,b4,c2,c3,c4);
return +a1 * Det3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4) -
b1 * Det3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4) +
c1 * Det3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4) -
d1 * Det3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
};
#endif

View File

@@ -29,9 +29,7 @@ __fastcall TGauge::TGauge()
SubModel = NULL;
};
__fastcall TGauge::~TGauge()
{
};
__fastcall TGauge::~TGauge(){};
void __fastcall TGauge::Clear()
{
@@ -41,7 +39,8 @@ void __fastcall TGauge::Clear()
fDesiredValue = 0;
};
void __fastcall TGauge::Init(TSubModel *NewSubModel,TGaugeType eNewType,double fNewScale,double fNewOffset,double fNewFriction,double fNewValue)
void __fastcall TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale,
double fNewOffset, double fNewFriction, double fNewValue)
{ // ustawienie parametrów animacji submodelu
if (NewSubModel)
{ // warunek na wszelki wypadek, gdyby siê submodel nie pod³¹czy³
@@ -80,8 +79,7 @@ bool __fastcall TGauge::Load(TQueryParserComp *Parser,TModel3d *md1,TModel3d *md
TSubModel *sm = md1->GetFromName(str1.c_str());
if (sm) // jeœli nie 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
if (str2 == "mov")
Init(sm, gt_Move, val3, val4, val5);
@@ -94,7 +92,6 @@ bool __fastcall TGauge::Load(TQueryParserComp *Parser,TModel3d *md1,TModel3d *md
return (md2); // true, gdy podany model zewnêtrzny, a w kabinie nie by³o
};
void __fastcall TGauge::PermIncValue(double fNewDesired)
{
fDesiredValue = fDesiredValue + fNewDesired * fScale + fOffset;
@@ -115,7 +112,8 @@ void __fastcall TGauge::IncValue(double fNewDesired)
void __fastcall TGauge::DecValue(double fNewDesired)
{ // u¿ywane tylko dla uniwersali
fDesiredValue = fDesiredValue - fNewDesired * fScale + fOffset;
if (fDesiredValue<0) fDesiredValue=0;
if (fDesiredValue < 0)
fDesiredValue = 0;
};
void __fastcall TGauge::UpdateValue(double fNewDesired)
@@ -132,7 +130,9 @@ void __fastcall TGauge::PutValue(double fNewDesired)
void __fastcall TGauge::Update()
{
float dt = Timer::GetDeltaTime();
if ((fFriction>0)&&(dt<0.5*fFriction)) //McZapkie-281102: zabezpieczenie przed oscylacjami dla dlugich czasow
if ((fFriction > 0) &&
(dt <
0.5 * fFriction)) // McZapkie-281102: zabezpieczenie przed oscylacjami dla dlugich czasow
fValue += dt * (fDesiredValue - fValue) / fFriction;
else
fValue = fDesiredValue;
@@ -151,7 +151,8 @@ void __fastcall TGauge::Update()
SubModel->SetRotate(float3(0, 1, 0), fValue * 360.0);
sm = SubModel->ChildGet();
if (sm)
{sm->SetRotate(float3(0,1,0),fValue*360.0);
{
sm->SetRotate(float3(0, 1, 0), fValue * 360.0);
sm = sm->ChildGet();
if (sm)
sm->SetRotate(float3(0, 1, 0), fValue * 360.0);
@@ -159,14 +160,16 @@ void __fastcall TGauge::Update()
break;
case gt_Digital: // Ra 2014-07: licznik cyfrowy
sm = SubModel->ChildGet();
AnsiString n=FormatFloat("0000000000",floor(fValue)); //na razie tak trochê bez sensu
AnsiString n = FormatFloat("0000000000", floor(fValue)); // na razie tak trochê bez
// sensu
do
{ // pêtla po submodelach potomnych i obracanie ich o k¹t zale¿y od cyfry w (fValue)
if (sm->pName)
{ // musi mieæ niepust¹ nazwê
if ((*sm->pName) >= '0')
if ((*sm->pName) <= '9')
sm->SetRotate(float3(0,1,0),-36.0*(n['0'+10-(*sm->pName)]-'0'));
sm->SetRotate(float3(0, 1, 0),
-36.0 * (n['0' + 10 - (*sm->pName)] - '0'));
}
sm = sm->NextGet();
} while (sm);
@@ -175,9 +178,7 @@ void __fastcall TGauge::Update()
}
};
void __fastcall TGauge::Render()
{
};
void __fastcall TGauge::Render(){};
void __fastcall TGauge::AssignFloat(float *fValue)
{
@@ -210,8 +211,6 @@ void __fastcall TGauge::UpdateValue()
}
};
//---------------------------------------------------------------------------
#pragma package(smart_init)

11
Gauge.h
View File

@@ -14,7 +14,8 @@ typedef enum
gt_Unknown, // na razie nie znany
gt_Rotate, // obrót
gt_Move, // przesuniêcie równoleg³e
gt_Wiper, //obrót trzech kolejnych submodeli o ten sam k¹t (np. wycieraczka, drzwi harmonijkowe)
gt_Wiper, // obrót trzech kolejnych submodeli o ten sam k¹t (np. wycieraczka, drzwi
// harmonijkowe)
gt_Digital // licznik cyfrowy, np. kilometrów
} TGaugeType;
@@ -35,12 +36,15 @@ private:
double *dData;
int *iData;
};
public:
__fastcall TGauge();
__fastcall ~TGauge();
void __fastcall Clear();
void __fastcall Init(TSubModel *NewSubModel,TGaugeType eNewTyp,double fNewScale=1,double fNewOffset=0,double fNewFriction=0,double fNewValue=0);
bool __fastcall Load(TQueryParserComp *Parser,TModel3d *md1,TModel3d *md2=NULL,double mul=1.0);
void __fastcall Init(TSubModel *NewSubModel, TGaugeType eNewTyp, double fNewScale = 1,
double fNewOffset = 0, double fNewFriction = 0, double fNewValue = 0);
bool __fastcall Load(TQueryParserComp *Parser, TModel3d *md1, TModel3d *md2 = NULL,
double mul = 1.0);
void __fastcall PermIncValue(double fNewDesired);
void __fastcall IncValue(double fNewDesired);
void __fastcall DecValue(double fNewDesired);
@@ -58,4 +62,3 @@ public:
//---------------------------------------------------------------------------
#endif

View File

@@ -12,19 +12,11 @@
#include "Globals.h"
#include "Geom.h"
__fastcall TGeometry::TGeometry() {}
__fastcall TGeometry::TGeometry()
{
}
__fastcall TGeometry::~TGeometry()
{
}
bool __fastcall TGeometry::Init()
{
}
__fastcall TGeometry::~TGeometry() {}
bool __fastcall TGeometry::Init() {}
vector3 __fastcall TGeometry::Load(TQueryParserComp *Parser)
{
@@ -49,27 +41,31 @@ vector3 __fastcall TGeometry::Load(TQueryParserComp *Parser)
str = Parser->GetNextSymbol().LowerCase();
if (str == "x")
TempVerts[i].tu= (TempVerts[i].Point.x+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
TempVerts[i].tu = (TempVerts[i].Point.x + Parser->GetNextSymbol().ToDouble()) /
Parser->GetNextSymbol().ToDouble();
else if (str == "y")
TempVerts[i].tu = (TempVerts[i].Point.y + Parser->GetNextSymbol().ToDouble()) /
Parser->GetNextSymbol().ToDouble();
else if (str == "z")
TempVerts[i].tu = (TempVerts[i].Point.z + Parser->GetNextSymbol().ToDouble()) /
Parser->GetNextSymbol().ToDouble();
else
if (str=="y")
TempVerts[i].tu= (TempVerts[i].Point.y+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
else
if (str=="z")
TempVerts[i].tu= (TempVerts[i].Point.z+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
else
TempVerts[i].tu= str.ToDouble();;
TempVerts[i].tu = str.ToDouble();
;
str = Parser->GetNextSymbol().LowerCase();
if (str == "x")
TempVerts[i].tv= (TempVerts[i].Point.x+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
TempVerts[i].tv = (TempVerts[i].Point.x + Parser->GetNextSymbol().ToDouble()) /
Parser->GetNextSymbol().ToDouble();
else if (str == "y")
TempVerts[i].tv = (TempVerts[i].Point.y + Parser->GetNextSymbol().ToDouble()) /
Parser->GetNextSymbol().ToDouble();
else if (str == "z")
TempVerts[i].tv = (TempVerts[i].Point.z + Parser->GetNextSymbol().ToDouble()) /
Parser->GetNextSymbol().ToDouble();
else
if (str=="y")
TempVerts[i].tv= (TempVerts[i].Point.y+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
else
if (str=="z")
TempVerts[i].tv= (TempVerts[i].Point.z+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble();
else
TempVerts[i].tv= str.ToDouble();;
TempVerts[i].tv = str.ToDouble();
;
// tf= Parser->GetNextSymbol().ToDouble();
// TempVerts[i].tu= tf;
@@ -108,12 +104,9 @@ vector3 __fastcall TGeometry::Load(TQueryParserComp *Parser)
// tmp->fSquareRadius= 2000*2000+r;
tmp->fSquareRadius += r;
}
bool __fastcall TGeometry::Render()
{
}
bool __fastcall TGeometry::Render() {}
//---------------------------------------------------------------------------
#pragma package(smart_init)

1
Geom.h
View File

@@ -26,6 +26,7 @@ private:
TMaterialColor Ambient;
TMaterialColor Diffuse;
TMaterialColor Specular;
public:
__fastcall TGeometry();
__fastcall ~TGeometry();

View File

@@ -8,7 +8,6 @@
#include "system.hpp"
#pragma hdrstop
#include "Globals.h"
#include "QueryParserComp.hpp"
#include "usefull.h"
@@ -18,8 +17,6 @@
#include <Controls.hpp> //do odczytu daty
#include "World.h"
// namespace Global {
// parametry do u¿ytku wewnêtrznego
@@ -33,7 +30,8 @@ TGround *Global::pGround=NULL;
AnsiString Global::asCurrentSceneryPath = "scenery/";
AnsiString Global::asCurrentTexturePath = AnsiString(szTexturePath);
AnsiString Global::asCurrentDynamicPath = "";
int Global::iSlowMotion=0; //info o malym FPS: 0-OK, 1-wyłączyć multisampling, 3-promień 1.5km, 7-1km
int Global::iSlowMotion =
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
bool Global::detonatoryOK; // info o nowych detonatorach
double Global::ABuDebug = 0;
@@ -45,10 +43,12 @@ int Global::iReCompile=0; //zwi
HWND Global::hWnd = NULL; // uchwyt okna
int Global::iCameraLast = -1;
AnsiString Global::asRelease = "15.3.1166.469";
AnsiString Global::asVersion="Compilation 2015-03-25, release "+Global::asRelease+"."; //tutaj, bo wysyłany
AnsiString Global::asVersion =
"Compilation 2015-03-25, release " + Global::asRelease + "."; // tutaj, bo wysy³any
int Global::iViewMode = 0; // co aktualnie widaæ: 0-kabina, 1-latanie, 2-sprzêgi, 3-dokumenty
int Global::iTextMode = 0; // tryb pracy wyœwietlacza tekstowego
int Global::iScreenMode[12]={0,0,0,0,0,0,0,0,0,0,0,0}; //numer ekranu wyświetlacza tekstowego
int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0}; // numer ekranu wyœwietlacza tekstowego
double Global::fSunDeclination = 0.0; // deklinacja S³oñca
double Global::fTimeAngleDeg = 0.0; // godzina w postaci k¹ta
float Global::fClockAngleDeg[6]; // k¹ty obrotu cylindrów dla zegara cyfrowego
@@ -115,7 +115,6 @@ float Global::fFriction=1.0; //mno
double Global::fBrakeStep = 1.0; // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
AnsiString Global::asLang = "pl"; // domyœlny jêzyk - http://tools.ietf.org/html/bcp47
// parametry wydajnoœciowe (np. regulacja FPS, szybkoœæ wczytywania)
bool Global::bAdjustScreenFreq = true;
bool Global::bEnableTraction = true;
@@ -154,8 +153,15 @@ bool Global::bDecompressDDS=false; //czy programowa dekompresja DDS
// parametry do kalibracji
// kolejno wspó³czynniki dla potêg 0, 1, 2, 3 wartoœci odczytanej z urz¹dzenia
double Global::fCalibrateIn[6][4]={{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}};
double Global::fCalibrateOut[7][4]={{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}};
double Global::fCalibrateIn[6][4] = {
{0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}};
double Global::fCalibrateOut[7][4] = {{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 0, 0}};
// parametry przejœciowe (do usuniêcia)
// bool Global::bTimeChange=false; //Ra: ZiomalCl wy³¹czy³ star¹ wersjê nocy
@@ -172,9 +178,11 @@ int Global::iBpp=32; //chyba ju
AnsiString __fastcall Global::GetNextSymbol()
{ // pobranie tokenu z aktualnego parsera
if (qParser) return qParser->EndOfFile?AnsiString("endconfig"):qParser->GetNextSymbol();
if (qParser)
return qParser->EndOfFile ? AnsiString("endconfig") : qParser->GetNextSymbol();
if (pParser)
{std::string token;
{
std::string token;
pParser->getTokens();
*pParser >> token;
return AnsiString(token.c_str());
@@ -192,7 +200,8 @@ void __fastcall Global::LoadIniFile(AnsiString asFileName)
}
TFileStream *fs;
fs = new TFileStream(asFileName, fmOpenRead | fmShareCompat);
if (!fs) return;
if (!fs)
return;
AnsiString str = "";
int size = fs->Size;
str.SetLength(size);
@@ -222,8 +231,7 @@ void __fastcall Global::ConfigParse(TQueryParserComp *qp,cParser *cp)
str = GetNextSymbol().LowerCase();
strcpy(szSceneryFile, str.c_str());
}
else
if (str==AnsiString("humanctrlvehicle"))
else if (str == AnsiString("humanctrlvehicle"))
{
str = GetNextSymbol().LowerCase();
asHumanCtrlVehicle = str;
@@ -247,22 +255,29 @@ void __fastcall Global::ConfigParse(TQueryParserComp *qp,cParser *cp)
}
else if (str == AnsiString("wireframe"))
bWireFrame = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str==AnsiString("debugmode")) //McZapkie! - DebugModeFlag uzywana w mover.pas, warto tez blokowac cheaty gdy false
else if (str == AnsiString("debugmode")) // McZapkie! - DebugModeFlag uzywana w mover.pas,
// warto tez blokowac cheaty gdy false
DebugModeFlag = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str==AnsiString("soundenabled")) //McZapkie-040302 - blokada dzwieku - przyda sie do debugowania oraz na komp. bez karty dzw.
else if (str == AnsiString("soundenabled")) // McZapkie-040302 - blokada dzwieku - przyda
// sie do debugowania oraz na komp. bez karty
// dzw.
bSoundEnabled = (GetNextSymbol().LowerCase() == AnsiString("yes"));
// else if (str==AnsiString("renderalpha")) //McZapkie-1312302 - dwuprzebiegowe renderowanie
// bRenderAlpha=(GetNextSymbol().LowerCase()==AnsiString("yes"));
else if (str==AnsiString("physicslog")) //McZapkie-030402 - logowanie parametrow fizycznych dla kazdego pojazdu z maszynista
else if (str == AnsiString("physicslog")) // McZapkie-030402 - logowanie parametrow
// fizycznych dla kazdego pojazdu z maszynista
WriteLogFlag = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str == AnsiString("physicsdeactivation")) // McZapkie-291103 - usypianie fizyki
PhysicActivationFlag = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str == AnsiString("debuglog"))
{ // McZapkie-300402 - wylaczanie log.txt
str = GetNextSymbol().LowerCase();
if (str=="yes") iWriteLogEnabled=3;
else if (str=="no") iWriteLogEnabled=0;
else iWriteLogEnabled=str.ToIntDef(3);
if (str == "yes")
iWriteLogEnabled = 3;
else if (str == "no")
iWriteLogEnabled = 0;
else
iWriteLogEnabled = str.ToIntDef(3);
}
else if (str == AnsiString("adjustscreenfreq"))
{ // McZapkie-240403 - czestotliwosc odswiezania ekranu
@@ -287,13 +302,16 @@ void __fastcall Global::ConfigParse(TQueryParserComp *qp,cParser *cp)
else if (str == AnsiString("friction")) // mno¿nik tarcia - KURS90
fFriction = GetNextSymbol().ToDouble();
else if (str == AnsiString("livetraction"))
{//Winger 160404 - zaleznosc napiecia loka od trakcji; Ra 2014-03: teraz prąd przy braku sieci
{ // Winger 160404 - zaleznosc napiecia loka od trakcji; Ra 2014-03: teraz pr¹d przy braku
// sieci
bLiveTraction = (GetNextSymbol().LowerCase() == AnsiString("yes"));
}
else if (str == AnsiString("skyenabled"))
{ // youBy - niebo
if (GetNextSymbol().LowerCase() == AnsiString("yes"))
asSky="1"; else asSky="0";
asSky = "1";
else
asSky = "0";
}
else if (str == AnsiString("managenodes"))
{
@@ -305,7 +323,8 @@ void __fastcall Global::ConfigParse(TQueryParserComp *qp,cParser *cp)
}
// ShaXbee - domyslne rozszerzenie tekstur
else if (str == AnsiString("defaultext"))
{str=GetNextSymbol().LowerCase(); //rozszerzenie
{
str = GetNextSymbol().LowerCase(); // rozszerzenie
if (str == "tga")
szDefaultExt = szTexturesTGA; // domyœlnie od TGA
// szDefaultExt=std::string(Parser->GetNextSymbol().LowerCase().c_str());
@@ -331,35 +350,48 @@ void __fastcall Global::ConfigParse(TQueryParserComp *qp,cParser *cp)
else if (str == AnsiString("maxtexturesize"))
{ // wymuszenie przeskalowania tekstur
i = GetNextSymbol().ToIntDef(16384); // domyœlnie du¿e
if (i<= 64) iMaxTextureSize= 64; else
if (i<= 128) iMaxTextureSize= 128; else
if (i<= 256) iMaxTextureSize= 256; else
if (i<= 512) iMaxTextureSize= 512; else
if (i<=1024) iMaxTextureSize=1024; else
if (i<=2048) iMaxTextureSize=2048; else
if (i<=4096) iMaxTextureSize=4096; else
if (i<=8192) iMaxTextureSize=8192; else
if (i <= 64)
iMaxTextureSize = 64;
else if (i <= 128)
iMaxTextureSize = 128;
else if (i <= 256)
iMaxTextureSize = 256;
else if (i <= 512)
iMaxTextureSize = 512;
else if (i <= 1024)
iMaxTextureSize = 1024;
else if (i <= 2048)
iMaxTextureSize = 2048;
else if (i <= 4096)
iMaxTextureSize = 4096;
else if (i <= 8192)
iMaxTextureSize = 8192;
else
iMaxTextureSize = 16384;
}
else if (str == AnsiString("doubleambient")) // podwójna jasnoœæ ambient
bDoubleAmbient = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str == AnsiString("movelight")) // numer dnia w roku albo -1
{fMoveLight=GetNextSymbol().ToIntDef(-1); //numer dnia 1..365
{
fMoveLight = GetNextSymbol().ToIntDef(-1); // numer dnia 1..365
if (fMoveLight == 0.0)
{ // pobranie daty z systemu
unsigned short y, m, d;
TDate date = Now();
date.DecodeDate(&y, &m, &d);
fMoveLight=(double)date-(double)TDate(y,1,1)+1; //numer bieżącego dnia w roku
fMoveLight =
(double)date - (double)TDate(y, 1, 1) + 1; // numer bie¿¹cego dnia w roku
}
if (fMoveLight > 0.0) // tu jest nadal zwiêkszone o 1
{ // obliczenie deklinacji wg:
// 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) 172 (1971)
// Spencer J W Fourier series representation of the position of the sun Search 2 (5)
// 172 (1971)
fMoveLight = M_PI / 182.5 * (Global::fMoveLight - 1.0); // numer dnia w postaci k¹ta
fSunDeclination=0.006918-0.3999120*cos( fMoveLight)+0.0702570*sin( fMoveLight)
-0.0067580*cos(2*fMoveLight)+0.0009070*sin(2*fMoveLight)
-0.0026970*cos(3*fMoveLight)+0.0014800*sin(3*fMoveLight);
fSunDeclination = 0.006918 - 0.3999120 * cos(fMoveLight) +
0.0702570 * sin(fMoveLight) - 0.0067580 * cos(2 * fMoveLight) +
0.0009070 * sin(2 * fMoveLight) -
0.0026970 * cos(3 * fMoveLight) + 0.0014800 * sin(3 * fMoveLight);
}
}
else if (str == AnsiString("smoothtraction")) // podwójna jasnoœæ ambient
@@ -378,11 +410,14 @@ void __fastcall Global::ConfigParse(TQueryParserComp *qp,cParser *cp)
bInactivePause = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str == AnsiString("slowmotion")) // tworzenie plików binarnych
iSlowMotionMask = GetNextSymbol().ToIntDef(-1); // domyœlnie -1
else if (str==AnsiString("modifytga")) //czy korygować pliki TGA dla szybszego wczytywania
else if (str == AnsiString("modifytga")) // czy korygowaæ pliki TGA dla szybszego
// wczytywania
iModifyTGA = GetNextSymbol().ToIntDef(0); // domyœlnie 0
else if (str == AnsiString("hideconsole")) // hunter-271211: ukrywanie konsoli
bHideConsole = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str==AnsiString("rollfix")) //Ra: poprawianie przechyłki, aby wewnętrzna szyna była "pozioma"
else if (str ==
AnsiString(
"rollfix")) // Ra: poprawianie przechy³ki, aby wewnêtrzna szyna by³a "pozioma"
bRollFix = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str == AnsiString("fpsaverage")) // oczekiwana wartosæ FPS
fFpsAverage = GetNextSymbol().ToDouble();
@@ -393,7 +428,8 @@ void __fastcall Global::ConfigParse(TQueryParserComp *qp,cParser *cp)
else if (str == AnsiString("calibratein")) // parametry kalibracji wejϾ
{ //
i = GetNextSymbol().ToIntDef(-1); // numer wejœcia
if ((i<0)||(i>5)) i=5; //na ostatni, bo i tak trzeba pominąć wartości
if ((i < 0) || (i > 5))
i = 5; // na ostatni, bo i tak trzeba pomin¹æ wartoœci
fCalibrateIn[i][0] = GetNextSymbol().ToDouble(); // wyraz wolny
fCalibrateIn[i][1] = GetNextSymbol().ToDouble(); // mno¿nik
fCalibrateIn[i][2] = GetNextSymbol().ToDouble(); // mno¿nik dla kwadratu
@@ -402,7 +438,8 @@ void __fastcall Global::ConfigParse(TQueryParserComp *qp,cParser *cp)
else if (str == AnsiString("calibrateout")) // parametry kalibracji wyjϾ
{ //
i = GetNextSymbol().ToIntDef(-1); // numer wejœcia
if ((i<0)||(i>6)) i=6; //na ostatni, bo i tak trzeba pominąć wartości
if ((i < 0) || (i > 6))
i = 6; // na ostatni, bo i tak trzeba pomin¹æ wartoœci
fCalibrateOut[i][0] = GetNextSymbol().ToDouble(); // wyraz wolny
fCalibrateOut[i][1] = GetNextSymbol().ToDouble(); // mno¿nik liniowy
fCalibrateOut[i][2] = GetNextSymbol().ToDouble(); // mno¿nik dla kwadratu
@@ -410,7 +447,8 @@ void __fastcall Global::ConfigParse(TQueryParserComp *qp,cParser *cp)
}
else if (str == AnsiString("brakestep")) // krok zmiany hamulca dla klawiszy [Num3] i [Num9]
fBrakeStep = GetNextSymbol().ToDouble();
else if (str==AnsiString("joinduplicatedevents")) //czy grupować eventy o tych samych nazwach
else if (str ==
AnsiString("joinduplicatedevents")) // czy grupowaæ eventy o tych samych nazwach
bJoinEvents = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str == AnsiString("hiddenevents")) // czy ³¹czyæ eventy z torami poprzez nazwê toru
iHiddenEvents = GetNextSymbol().ToIntDef(0);
@@ -420,8 +458,7 @@ void __fastcall Global::ConfigParse(TQueryParserComp *qp,cParser *cp)
asLang = GetNextSymbol(); // domyœlny jêzyk - http://tools.ietf.org/html/bcp47
else if (str == AnsiString("opengl")) // deklarowana wersja OpenGL, ¿eby powstrzymaæ b³êdy
fOpenGL = GetNextSymbol().ToDouble(); // wymuszenie wersji OpenGL
}
while (str!="endconfig"); //(!Parser->EndOfFile)
} while (str != "endconfig"); //(!Parser->EndOfFile)
// na koniec trochê zale¿noœci
if (!bLoadTraction) // wczytywanie drutów i s³upów
{ // tutaj wy³¹czenie, bo mog¹ nie byæ zdefiniowane w INI
@@ -435,21 +472,32 @@ void __fastcall Global::ConfigParse(TQueryParserComp *qp,cParser *cp)
bSmoothTraction = false;
}
if (iMultiplayer > 0)
{bInactivePause=false; //okno "w tle" nie może pauzować, jeśli włączona komunikacja
//pauzowanie jest zablokowane dla (iMultiplayer&2)>0, więc iMultiplayer=1 da się zapauzować (tryb instruktora)
{
bInactivePause = false; // okno "w tle" nie mo¿e pauzowaæ, jeœli w³¹czona komunikacja
// pauzowanie jest zablokowane dla (iMultiplayer&2)>0, wiêc iMultiplayer=1 da siê zapauzowaæ
// (tryb instruktora)
}
fFpsMin=fFpsAverage-fFpsDeviation; //dolna granica FPS, przy której promień scenerii będzie zmniejszany
fFpsMax=fFpsAverage+fFpsDeviation; //górna granica FPS, przy której promień scenerii będzie zwiększany
if (iPause) iTextMode=VK_F1; //jak pauza, to pokazać zegar
fFpsMin = fFpsAverage -
fFpsDeviation; // dolna granica FPS, przy której promieñ scenerii bêdzie zmniejszany
fFpsMax = fFpsAverage +
fFpsDeviation; // górna granica FPS, przy której promieñ scenerii bêdzie zwiêkszany
if (iPause)
iTextMode = VK_F1; // jak pauza, to pokazaæ zegar
if (qp)
{ // to poni¿ej wykonywane tylko raz, jedynie po wczytaniu eu07.ini
Console::ModeSet(iFeedbackMode, iFeedbackPort); // tryb pracy konsoli sterowniczej
iFpsRadiusMax=0.000025*fFpsRadiusMax*fFpsRadiusMax; //maksymalny promień renderowania 3000.0 -> 225
if (iFpsRadiusMax>400) iFpsRadiusMax=400;
iFpsRadiusMax = 0.000025 * fFpsRadiusMax *
fFpsRadiusMax; // maksymalny promieñ renderowania 3000.0 -> 225
if (iFpsRadiusMax > 400)
iFpsRadiusMax = 400;
if (fDistanceFactor > 1.0)
{ // dla 1.0 specjalny tryb bez przeliczania
fDistanceFactor=iWindowHeight/fDistanceFactor; //fDistanceFactor>1.0 dla rozdzielczości większych niż bazowa
fDistanceFactor*=(iMultisampling+1.0)*fDistanceFactor; //do kwadratu, bo większość odległości to ich kwadraty
fDistanceFactor =
iWindowHeight /
fDistanceFactor; // fDistanceFactor>1.0 dla rozdzielczoœci wiêkszych ni¿ bazowa
fDistanceFactor *=
(iMultisampling + 1.0) *
fDistanceFactor; // do kwadratu, bo wiêkszoœæ odleg³oœci to ich kwadraty
}
}
}
@@ -458,7 +506,8 @@ void __fastcall Global::InitKeys(AnsiString asFileName)
{
// if (FileExists(asFileName))
// {
// Error("Chwilowo plik keys.ini nie jest obsługiwany. Ładuję standardowe ustawienia.\nKeys.ini file is temporarily not functional, loading default keymap...");
// Error("Chwilowo plik keys.ini nie jest obs³ugiwany. £adujê standardowe
// ustawienia.\nKeys.ini file is temporarily not functional, loading default keymap...");
/* TQueryParserComp *Parser;
Parser=new TQueryParserComp(NULL);
Parser->LoadStringToParse(asFileName);
@@ -592,21 +641,25 @@ void __fastcall Global::SetCameraPosition(vector3 pNewCameraPosition)
void __fastcall Global::SetCameraRotation(double Yaw)
{ // ustawienie bezwzglêdnego kierunku kamery z korekcj¹ do przedzia³u <-M_PI,M_PI>
pCameraRotation = Yaw;
while (pCameraRotation<-M_PI) pCameraRotation+=2*M_PI;
while (pCameraRotation> M_PI) pCameraRotation-=2*M_PI;
while (pCameraRotation < -M_PI)
pCameraRotation += 2 * M_PI;
while (pCameraRotation > M_PI)
pCameraRotation -= 2 * M_PI;
pCameraRotationDeg = pCameraRotation * 180.0 / M_PI;
}
void __fastcall Global::BindTexture(GLuint t)
{ // ustawienie aktualnej tekstury, tylko gdy siê zmienia
if (t != iTextureId)
{iTextureId=t;
{
iTextureId = t;
}
};
void __fastcall Global::TrainDelete(TDynamicObject *d)
{ // usuniêcie pojazdu prowadzonego przez u¿ytkownika
if (pWorld) pWorld->TrainDelete(d);
if (pWorld)
pWorld->TrainDelete(d);
};
TDynamicObject *__fastcall Global::DynamicNearest()
@@ -650,16 +703,16 @@ __fastcall TTranscripts::TTranscripts()
}
fRefreshTime = 360.0; // wartoœc zaporowa
};
__fastcall TTranscripts::~TTranscripts()
{
};
__fastcall TTranscripts::~TTranscripts(){};
void __fastcall TTranscripts::AddLine(char *txt, float show, float hide, bool it)
{ // dodanie linii do tabeli, (show) i (hide) w [s] od aktualnego czasu
if (show==hide) return; //komentarz jest ignorowany
if (show == hide)
return; // komentarz jest ignorowany
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;
int i = iStart, j, k; // od czegoœ trzeba zacz¹æ
while ((aLines[i].iNext>=0)?(aLines[aLines[i].iNext].fShow<=show):false) //póki nie koniec i wcześniej puszczane
while ((aLines[i].iNext >= 0) ? (aLines[aLines[i].iNext].fShow <= show) :
false) // póki nie koniec i wczeœniej puszczane
i = aLines[i].iNext; // przejœcie do kolejnej linijki
//(i) wskazuje na liniê, po której nale¿y wstawiæ dany tekst, chyba ¿e
while (txt ? *txt : false)
@@ -690,7 +743,8 @@ void __fastcall TTranscripts::AddLine(char *txt,float show,float hide,bool it)
};
void __fastcall TTranscripts::Add(char *txt, float len, bool backgorund)
{ // dodanie tekstów, d³ugoœæ dŸwiêku, czy istotne
if (!txt) return; //pusty tekst
if (!txt)
return; // pusty tekst
int i = 0, j = int(0.5 + 10.0 * len); //[0.1s]
if (*txt == '[')
{ // powinny byæ dwa nawiasy
@@ -698,11 +752,13 @@ void __fastcall TTranscripts::Add(char *txt,float len,bool backgorund)
if ((*txt >= '0') && (*txt <= '9'))
i = 10 * i + int(*txt - '0'); // pierwsza liczba a¿ do ]
if (*txt ? *++txt == '[' : false)
{j=0; //drugi nawias określa czas zakończenia wyświetlania
{
j = 0; // drugi nawias okreœla czas zakoñczenia wyœwietlania
while (*++txt ? *txt != ']' : false)
if ((*txt >= '0') && (*txt <= '9'))
j = 10 * j + int(*txt - '0'); // druga liczba a¿ do ]
if (*txt) ++txt; //pominięcie drugiego ]
if (*txt)
++txt; // pominiêcie drugiego ]
}
}
AddLine(txt, 0.1 * i, 0.1 * j, false);
@@ -742,7 +798,8 @@ void __fastcall TTranscripts::Update()
change = true; // bo na razie nie ma warunku, ¿e coœ siê doda³o
if (change)
{ // aktualizacja linijek ekranowych
i=iStart; j=-1;
i = iStart;
j = -1;
do
{
if (aLines[i].fHide > 0.0) // jeœli nie ukryte
@@ -757,8 +814,7 @@ void __fastcall TTranscripts::Update()
};
// Ra: tymczasowe rozwi¹zanie kwestii zagranicznych (czeskich) napisów
char bezogonkowo[128]=
"E?,?\"_++?%S<STZZ?`'\"\".--??s>stzz"
char bezogonkowo[128] = "E?,?\"_++?%S<STZZ?`'\"\".--??s>stzz"
" ^^L$A|S^CS<--RZo±,l'uP.,as>L\"lz"
"RAAAALCCCEEEEIIDDNNOOOOxRUUUUYTB"
"raaaalccceeeeiiddnnoooo-ruuuuyt?";
@@ -770,7 +826,8 @@ AnsiString __fastcall Global::Bezogonkow(AnsiString str, bool _)
str[i] = bezogonkowo[str[i] & 0x7F];
else if (str[i] < ' ') // znaki steruj¹ce nie s¹ obs³ugiwane
str[i] = ' ';
else if (_) if (str[i]=='_') //nazwy stacji nie mogą zawierać spacji
else if (_)
if (str[i] == '_') // nazwy stacji nie mog¹ zawieraæ spacji
str[i] = ' '; // wiêc trzeba wyœwietlaæ inaczej
return str;
}

View File

@@ -138,11 +138,13 @@ class TTranscripts
int iCount; // liczba zajêtych pozycji
int iStart; // pierwsza istotna pozycja w tabeli, ¿eby sortowaæ przestawiaj¹c numerki
float fRefreshTime;
public:
__fastcall TTranscripts();
__fastcall ~TTranscripts();
void __fastcall AddLine(char *txt, float show, float hide, bool it);
void __fastcall Add(char *txt,float len,bool backgorund=false); //dodanie tekstów, d³ugoœæ dŸwiêku, czy istotne
void __fastcall Add(char *txt, float len,
bool backgorund = false); // dodanie tekstów, d³ugoœæ dŸwiêku, czy istotne
void __fastcall Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekundê)
};
@@ -154,7 +156,8 @@ public:
// double Global::tSinceStart;
static int Keys[MaxKeys];
static vector3 pCameraPosition; // pozycja kamery w œwiecie
static double pCameraRotation; //kierunek bezwzglêdny kamery w œwiecie: 0=pó³noc, 90°=zachód (-azymut)
static double
pCameraRotation; // kierunek bezwzglêdny kamery w œwiecie: 0=pó³noc, 90°=zachód (-azymut)
static double pCameraRotationDeg; // w stopniach, dla animacji billboard
static vector3 pFreeCameraInit[10]; // pozycje kamery
static vector3 pFreeCameraInitAngle[10];
@@ -196,8 +199,7 @@ public:
static AnsiString asHumanCtrlVehicle;
static void __fastcall LoadIniFile(AnsiString asFileName);
static void __fastcall InitKeys(AnsiString asFileName);
inline static vector3 __fastcall GetCameraPosition()
{return pCameraPosition;};
inline static vector3 __fastcall GetCameraPosition() { return pCameraPosition; };
static void __fastcall SetCameraPosition(vector3 pNewCameraPosition);
static void __fastcall SetCameraRotation(double Yaw);
static int iWriteLogEnabled; // maska bitowa: 1-zapis do pliku, 2-okienko
@@ -238,7 +240,8 @@ public:
static int iCameraLast;
static AnsiString asRelease; // numer
static AnsiString asVersion; // z opisem
static int iViewMode; //co aktualnie widaæ: 0-kabina, 1-latanie, 2-sprzêgi, 3-dokumenty, 4-obwody
static int
iViewMode; // co aktualnie widaæ: 0-kabina, 1-latanie, 2-sprzêgi, 3-dokumenty, 4-obwody
static GLint iMaxTextureSize; // maksymalny rozmiar tekstury
static int iTextMode; // tryb pracy wyœwietlacza tekstowego
static int iScreenMode[12]; // numer ekranu wyœwietlacza tekstowego

1716
Ground.cpp

File diff suppressed because it is too large Load Diff

View File

@@ -32,14 +32,13 @@ struct DaneRozkaz
int iSygn; // sygnatura 'EU07'
int iComm; // rozkaz/status (kod ramki)
union
{float fPar[62];
{
float fPar[62];
int iPar[62];
char cString[248]; // upakowane stringi
};
};
typedef int TGroundNodeType;
struct TGroundVertex
@@ -142,8 +141,8 @@ public:
{ // wyszukiwanie czołgowe z typem
if ((iNodeType == iType) && (asNameToFind == asName))
return this;
else
if (nNext) return nNext->Find(asNameToFind,iNodeType);
else if (nNext)
return nNext->Find(asNameToFind, iNodeType);
return NULL;
};
@@ -153,7 +152,8 @@ public:
void __fastcall RenderHidden(); // obsługa dźwięków i wyzwalaczy zdarzeń
void __fastcall RenderDL(); // renderowanie nieprzezroczystych w Display Lists
void __fastcall RenderAlphaDL(); //renderowanie przezroczystych w Display Lists (McZapkie-131202)
void __fastcall RenderAlphaDL(); // renderowanie przezroczystych w Display Lists
// (McZapkie-131202)
void __fastcall RaRenderVBO(); // renderowanie (nieprzezroczystych) ze wspólnego VBO
void __fastcall RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
void __fastcall RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
@@ -169,8 +169,10 @@ protected:
TGroundNode *nRootMesh; // obiekty renderujące wg tekstury (wtórne, lista po nNext2)
TGroundNode *nMeshed; // lista obiektów dla których istnieją obiekty renderujące grupowo
public:
TGroundNode *nRootNode; //wszystkie obiekty w sektorze, z wyjątkiem renderujących i pojazdów (nNext2)
TGroundNode *nRenderHidden; //lista obiektów niewidocznych, "renderowanych" również z tyłu (nNext3)
TGroundNode *
nRootNode; // wszystkie obiekty w sektorze, z wyjątkiem renderujących i pojazdów (nNext2)
TGroundNode *
nRenderHidden; // lista obiektów niewidocznych, "renderowanych" również z tyłu (nNext3)
TGroundNode *nRenderRect; // z poziomu sektora - nieprzezroczyste (nNext3)
TGroundNode *nRenderRectAlpha; // z poziomu sektora - przezroczyste (nNext3)
TGroundNode *nRenderWires; // z poziomu sektora - druty i inne linie (nNext3)
@@ -184,16 +186,19 @@ public:
__fastcall TSubRect();
virtual __fastcall ~TSubRect();
virtual void Release(); // zwalnianie VBO sektora
void __fastcall NodeAdd(TGroundNode *Node); //dodanie obiektu do sektora na etapie rozdzielania na sektory
void __fastcall NodeAdd(
TGroundNode *Node); // dodanie obiektu do sektora na etapie rozdzielania na sektory
void __fastcall RaNodeAdd(TGroundNode *Node); // dodanie obiektu do listy renderowania
void __fastcall Sort(); // optymalizacja obiektów w sektorze (sortowanie wg tekstur)
TTrack *__fastcall FindTrack(vector3 *Point, int &iConnection, TTrack *Exclude);
TTraction *__fastcall FindTraction(vector3 *Point, int &iConnection, TTraction *Exclude);
bool __fastcall StartVBO(); //ustwienie VBO sektora dla (nRenderRect), (nRenderRectAlpha) i (nRenderWires)
bool __fastcall StartVBO(); // ustwienie VBO sektora dla (nRenderRect), (nRenderRectAlpha) i
// (nRenderWires)
bool __fastcall RaTrackAnimAdd(TTrack *t); // zgłoszenie toru do animacji
void __fastcall RaAnimate(); // przeliczenie animacji torów
void __fastcall RenderDL(); // renderowanie nieprzezroczystych w Display Lists
void __fastcall RenderAlphaDL(); //renderowanie przezroczystych w Display Lists (McZapkie-131202)
void __fastcall RenderAlphaDL(); // renderowanie przezroczystych w Display Lists
// (McZapkie-131202)
void __fastcall RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
void __fastcall RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
void __fastcall RenderSounds(); // dźwięki pojazdów z niewidocznych sektorów
@@ -216,6 +221,7 @@ private:
int iLastDisplay; // numer klatki w której był ostatnio wyświetlany
TSubRect *pSubRects;
void __fastcall Init() { pSubRects = new TSubRect[iNumSubRects * iNumSubRects]; };
public:
static int iFrameNumber; // numer kolejny wyświetlanej klatki
TGroundNode *nTerrain; // model terenu z E3D - użyć nRootMesh?
@@ -224,7 +230,8 @@ public:
TSubRect *__fastcall SafeGetRect(int iCol, int iRow)
{ // pobranie wskaźnika do małego kwadratu, utworzenie jeśli trzeba
if (!pSubRects) Init(); //utworzenie małych kwadratów
if (!pSubRects)
Init(); // utworzenie małych kwadratów
return pSubRects + iRow * iNumSubRects + iCol; // zwrócenie właściwego
};
TSubRect *__fastcall FastGetRect(int iCol, int iRow)
@@ -241,7 +248,6 @@ public:
void __fastcall RenderVBO();
};
class TGround
{
vector3 CameraDirection; // zmienna robocza przy renderowaniu
@@ -264,6 +270,7 @@ class TGround
TNames *sTracks; // posortowane nazwy torów i eventów
private: // metody prywatne
bool __fastcall EventConditon(TEvent *e);
public:
bool bDynamicRemove; // czy uruchomić procedurę usuwania pojazdów
TDynamicObject *LastDyn; // ABu: paskudnie, ale na bardzo szybko moze jakos przejdzie...
@@ -310,7 +317,8 @@ public:
bool __fastcall RenderVBO(vector3 pPosition);
bool __fastcall RenderAlphaVBO(vector3 pPosition);
bool __fastcall CheckQuery();
// __fastcall GetRect(double x, double z) { return &(Rects[int(x/fSubRectSize+fHalfNumRects)][int(z/fSubRectSize+fHalfNumRects)]); };
// __fastcall GetRect(double x, double z) { return
// &(Rects[int(x/fSubRectSize+fHalfNumRects)][int(z/fSubRectSize+fHalfNumRects)]); };
/*
int __fastcall GetRowFromZ(double z) { return (z/fRectSize+fHalfNumRects); };
int __fastcall GetColFromX(double x) { return (x/fRectSize+fHalfNumRects); };
@@ -330,9 +338,18 @@ public:
TGroundNode *__fastcall DynamicFind(AnsiString asNameToFind);
void __fastcall DynamicList(bool all = false);
TGroundNode *__fastcall FindGroundNode(AnsiString asNameToFind, TGroundNodeType iNodeType);
TGroundRect* __fastcall GetRect(double x, double z) { return &Rects[GetColFromX(x)/iNumSubRects][GetRowFromZ(z)/iNumSubRects]; };
TSubRect* __fastcall GetSubRect(double x, double z) { return GetSubRect(GetColFromX(x),GetRowFromZ(z)); };
TSubRect* __fastcall FastGetSubRect(double x, double z) { return FastGetSubRect(GetColFromX(x),GetRowFromZ(z)); };
TGroundRect *__fastcall GetRect(double x, double z)
{
return &Rects[GetColFromX(x) / iNumSubRects][GetRowFromZ(z) / iNumSubRects];
};
TSubRect *__fastcall GetSubRect(double x, double z)
{
return GetSubRect(GetColFromX(x), GetRowFromZ(z));
};
TSubRect *__fastcall FastGetSubRect(double x, double z)
{
return FastGetSubRect(GetColFromX(x), GetRowFromZ(z));
};
TSubRect *__fastcall GetSubRect(int iCol, int iRow);
TSubRect *__fastcall FastGetSubRect(int iCol, int iRow);
int __fastcall GetRowFromZ(double z) { return (z / fSubRectSize + fHalfTotalNumSubRects); };
@@ -340,11 +357,13 @@ public:
TEvent *__fastcall FindEvent(const AnsiString &asEventName);
TEvent *__fastcall FindEventScan(const AnsiString &asEventName);
void __fastcall TrackJoin(TGroundNode *Current);
private:
void __fastcall OpenGLUpdate(HDC hDC);
void __fastcall RaTriangleDivider(TGroundNode *node);
void __fastcall Navigate(String ClassName, UINT Msg, WPARAM wParam, LPARAM lParam);
bool PROBLEND;
public:
void __fastcall WyslijEvent(const AnsiString &e, const AnsiString &d);
int iRendered; // ilość renderowanych sektorów, pobierana przy pokazywniu FPS
@@ -353,8 +372,10 @@ public:
void __fastcall WyslijNamiary(TGroundNode *t);
void __fastcall WyslijParam(int nr, int fl);
void __fastcall RadioStop(vector3 pPosition);
TDynamicObject* __fastcall DynamicNearest(vector3 pPosition,double distance=20.0,bool mech=false);
TDynamicObject* __fastcall CouplerNearest(vector3 pPosition,double distance=20.0,bool mech=false);
TDynamicObject *__fastcall DynamicNearest(vector3 pPosition, double distance = 20.0,
bool mech = false);
TDynamicObject *__fastcall CouplerNearest(vector3 pPosition, double distance = 20.0,
bool mech = false);
void __fastcall DynamicRemove(TDynamicObject *dyn);
void __fastcall TerrainRead(const AnsiString &f);
void __fastcall TerrainWrite();

View File

@@ -29,7 +29,8 @@ void __fastcall WriteConsoleOnly(const char* str, double value)
void __fastcall WriteConsoleOnly(const char *str)
{
// printf("%n ffafaf /n",str);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN | FOREGROUND_INTENSITY);
DWORD wr = 0;
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), str, strlen(str), &wr, NULL);
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), endstring, strlen(endstring), &wr, NULL);
@@ -52,7 +53,8 @@ void __fastcall WriteLog(const char* str)
if (str)
{
if (Global::iWriteLogEnabled & 1)
{if (!output.is_open())
{
if (!output.is_open())
output.open("log.txt", std::ios::trunc);
output << str << "\n";
output.flush();
@@ -65,10 +67,12 @@ void __fastcall WriteLog(const char* str)
void __fastcall ErrorLog(const char *str)
{ // Ra: bezwarunkowa rejestracja powa¿nych b³êdów
if (!errors.is_open())
{errors.open("errors.txt",std::ios::trunc);
{
errors.open("errors.txt", std::ios::trunc);
errors << AnsiString("EU07.EXE " + Global::asRelease).c_str() << "\n";
}
if (str) errors << str;
if (str)
errors << str;
errors << "\n";
errors.flush();
};
@@ -85,10 +89,7 @@ void __fastcall ErrorLog(const AnsiString &asMessage)
WriteLog(asMessage.c_str()); // do "log.txt" ewentualnie te¿
}
void __fastcall WriteLog(const AnsiString &str)
{//Ra: wersja z AnsiString jest zamienna z Error()
WriteLog(str.c_str());
};
void __fastcall WriteLog(const AnsiString &str) { // Ra: wersja z AnsiString jest zamienna z Error() WriteLog(str.c_str()); };
//---------------------------------------------------------------------------
#pragma package(smart_init)

View File

@@ -4,20 +4,13 @@
#include "classes.hpp"
#pragma hdrstop
#include "Machajka.h"
#include "Timer.h"
#include "Globals.h"
__fastcall TMachajka::TMachajka():TTrain()
{
TTrain::TTrain();
}
__fastcall TMachajka::TMachajka() : TTrain() { TTrain::TTrain(); }
__fastcall TMachajka::~TMachajka()
{
}
__fastcall TMachajka::~TMachajka() {}
bool __fastcall TMachajka::Init(TDynamicObject *NewDynamicObject)
{
@@ -31,64 +24,43 @@ void __fastcall TMachajka::OnKeyPress(int cKey)
{
if (cKey == Global::Keys[k_IncMainCtrl])
(DynamicObject->MoverParameters->AddPulseForce(1));
else
if (cKey==Global::Keys[k_DecMainCtrl])
else if (cKey == Global::Keys[k_DecMainCtrl])
(DynamicObject->MoverParameters->AddPulseForce(-1));
else
if (cKey==Global::Keys[k_IncLocalBrakeLevel])
else if (cKey == Global::Keys[k_IncLocalBrakeLevel])
(DynamicObject->MoverParameters->IncLocalBrakeLevel(1));
else
if (cKey==Global::Keys[k_DecLocalBrakeLevel])
else if (cKey == Global::Keys[k_DecLocalBrakeLevel])
(DynamicObject->MoverParameters->DecLocalBrakeLevel(1));
else
if (cKey==Global::Keys[k_MechLeft])
else if (cKey == Global::Keys[k_MechLeft])
vMechMovement.x += fMechCroach;
else
if (cKey==Global::Keys[k_MechRight])
else if (cKey == Global::Keys[k_MechRight])
vMechMovement.x -= fMechCroach;
else
if (cKey==Global::Keys[k_MechBackward])
else if (cKey == Global::Keys[k_MechBackward])
vMechMovement.z -= fMechCroach;
else
if (cKey==Global::Keys[k_MechForward])
else if (cKey == Global::Keys[k_MechForward])
vMechMovement.z += fMechCroach;
else
if (cKey==Global::Keys[k_MechUp])
else if (cKey == Global::Keys[k_MechUp])
pMechOffset.y += 0.3; // McZapkie-120302 - wstawanie
else
if (cKey==Global::Keys[k_MechDown])
else if (cKey == Global::Keys[k_MechDown])
pMechOffset.y -= 0.3; // McZapkie-120302 - siadanie, kucanie itp
}
else // z shiftem
{
if (cKey == Global::Keys[k_IncMainCtrlFAST])
(DynamicObject->MoverParameters->AddPulseForce(2));
else
if (cKey==Global::Keys[k_DecMainCtrlFAST])
else if (cKey == Global::Keys[k_DecMainCtrlFAST])
(DynamicObject->MoverParameters->AddPulseForce(-2));
else
if (cKey==Global::Keys[k_IncLocalBrakeLevelFAST])
else if (cKey == Global::Keys[k_IncLocalBrakeLevelFAST])
(DynamicObject->MoverParameters->IncLocalBrakeLevel(2));
else
if (cKey==Global::Keys[k_DecLocalBrakeLevelFAST])
else if (cKey == Global::Keys[k_DecLocalBrakeLevelFAST])
(DynamicObject->MoverParameters->DecLocalBrakeLevel(2));
}
}
bool __fastcall TMachajka::Update(double dt)
{
TTrain::Update(dt);
}
bool __fastcall TMachajka::Update(double dt) { TTrain::Update(dt); }
bool __fastcall TMachajka::UpdateMechPosition()
{
TTrain::UpdateMechPosition();
}
bool __fastcall TMachajka::UpdateMechPosition() { TTrain::UpdateMechPosition(); }
bool __fastcall TMachajka::Render()
{
TTrain::Render();
}
bool __fastcall TMachajka::Render() { TTrain::Render(); }
//---------------------------------------------------------------------------
#pragma package(smart_init)

View File

@@ -25,6 +25,5 @@ public:
virtual bool __fastcall Render();
};
//---------------------------------------------------------------------------
#endif

View File

@@ -50,11 +50,7 @@ __fastcall TModelsManager::~TModelsManager()
Free();
};
*/
void __fastcall TModelsManager::Free()
{
SafeDeleteArray(Models);
}
void __fastcall TModelsManager::Free() { SafeDeleteArray(Models); }
TModel3d *__fastcall TModelsManager::LoadModel(char *Name, bool dynamic)
{ // wczytanie modelu do tablicy
@@ -64,18 +60,24 @@ TModel3d* __fastcall TModelsManager::LoadModel(char *Name,bool dynamic)
else
{
mdl = Models[Count].LoadModel(Name, dynamic);
if (mdl) Count++; //jeśli błąd wczytania modelu, to go nie wliczamy
if (mdl)
Count++; // jeśli błąd wczytania modelu, to go nie wliczamy
}
return mdl;
}
TModel3d *__fastcall TModelsManager::GetModel(const char *Name, bool dynamic)
{//model może być we wpisie "node...model" albo "node...dynamic", a także być dodatkowym w dynamic (kabina, wnętrze, ładunek)
//dla "node...dynamic" mamy podaną ścieżkę w "\dynamic\" i musi być co najmniej 1 poziom, zwkle są 2
//dla "node...model" może być typowy model statyczny ze ścieżką, domyślnie w "\scenery\" albo "\models"
{ // model może być we wpisie "node...model" albo "node...dynamic", a także być dodatkowym w dynamic
// (kabina, wnętrze, ładunek)
// dla "node...dynamic" mamy podaną ścieżkę w "\dynamic\" i musi być co najmniej 1 poziom, zwkle
// są 2
// dla "node...model" może być typowy model statyczny ze ścieżką, domyślnie w "\scenery\" albo
// "\models"
// 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\" plus name="model.t3d"
// - z domyślnej ścieżki dla modeli, np. "scenery\" albo "models\" plus name="bud\dombale.t3d" (dir="")
// - ze ścieżki z której jest wywołany, np. dir="scenery\bud\" albo dir="dynamic\pkp\st44_v1\"
// plus name="model.t3d"
// - z domyślnej ścieżki dla modeli, np. "scenery\" albo "models\" plus name="bud\dombale.t3d"
// (dir="")
// - konkretnie podanej ścieżki np. name="\scenery\bud\dombale.t3d" (dir="")
// wywołania:
// - konwersja wszystkiego do E3D, podawana dokładna ścieżka, tekstury tam, gdzie plik
@@ -87,7 +89,8 @@ TModel3d* __fastcall TModelsManager::GetModel(const char *Name,bool dynamic)
// - niebo animowane, ścieżka brana ze wpisu, tekstury nieokreślone
// - wczytanie modelu animowanego - Init() - sprawdzić
char buf[255];
AnsiString buftp=Global::asCurrentTexturePath; //zapamiętanie aktualnej ścieżki do tekstur, bo będzie tyczmasowo zmieniana
AnsiString buftp = Global::asCurrentTexturePath; // zapamiętanie aktualnej ścieżki do tekstur,
// bo będzie tyczmasowo zmieniana
/*
// 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
@@ -103,7 +106,8 @@ TModel3d* __fastcall TModelsManager::GetModel(const char *Name,bool dynamic)
else
{//dla modeli scenerii trzeba ustalić ścieżkę
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ę z modelem
{//jeśli nie ma lewego ukośnika w ścieżce, a jest prawy, to zmienić ścieżkę dla tekstur na tę
z modelem
strcpy(buf,"models\\"); //Ra: było by lepiej katalog dodać w parserze
//strcpy(buf,"scenery\\"); //Ra: było by lepiej katalog dodać w parserze
strcat(buf,Name);
@@ -135,16 +139,19 @@ TModel3d* __fastcall TModelsManager::GetModel(const char *Name,bool dynamic)
if (strchr(Name, '/') != NULL)
{
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
{strcpy(buf,Name);
{
strcpy(buf, Name);
if (dynamic) // na razie tak, bo nie wiadomo, jaki może mieć wpływ na pozostałe modele
if (strchr(Name, '/') != NULL)
{ // pobieranie tekstur z katalogu, w którym jest model
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());
}
}
StrLower(buf);

View File

@@ -2,15 +2,22 @@
#ifndef MdlMngrH
#define MdlMngrH
#include "Model3d.h"
#include "usefull.h"
class TMdlContainer
{
friend class TModelsManager;
__fastcall TMdlContainer() { Name= NULL; Model= NULL; };
__fastcall ~TMdlContainer() { SafeDeleteArray(Name); SafeDelete(Model); };
__fastcall TMdlContainer()
{
Name = NULL;
Model = NULL;
};
__fastcall ~TMdlContainer()
{
SafeDeleteArray(Name);
SafeDelete(Model);
};
TModel3d *__fastcall LoadModel(char *newName, bool dynamic);
TModel3d *Model;
char *Name;
@@ -22,6 +29,7 @@ private:
static TMdlContainer *Models;
static int Count;
static TModel3d *__fastcall LoadModel(char *Name, bool dynamic);
public:
// __fastcall TModelsManager();
// __fastcall ~TModelsManager();

View File

@@ -6,7 +6,6 @@
*/
#include "system.hpp"
#include "classes.hpp"
#pragma hdrstop
@@ -27,22 +26,20 @@
__fastcall TMemCell::TMemCell(vector3 *p)
{
fValue1 = fValue2 = 0;
szText=new char[256]; //musi byæ dla automatycznie tworzonych komórek dla odcinków izolowanych
vPosition=p?*p:vector3(0,0,0); //ustawienie wspó³rzêdnych, bo do TGroundNode nie ma dostêpu
szText = new char[256]; // musi byæ dla automatycznie tworzonych komórek dla odcinków
// izolowanych
vPosition =
p ? *p : vector3(0, 0, 0); // ustawienie wspó³rzêdnych, bo do TGroundNode nie ma dostêpu
bCommand = false; // komenda wys³ana
OnSent = NULL;
}
__fastcall TMemCell::~TMemCell()
{
SafeDeleteArray(szText);
}
__fastcall TMemCell::~TMemCell() { SafeDeleteArray(szText); }
void __fastcall TMemCell::Init()
{
}
void __fastcall TMemCell::Init() {}
void __fastcall TMemCell::UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, int CheckMask)
void __fastcall TMemCell::UpdateValues(char *szNewText, double fNewValue1, double fNewValue2,
int CheckMask)
{
if (CheckMask & update_memadd)
{ // dodawanie wartoœci
@@ -69,31 +66,38 @@ void __fastcall TMemCell::UpdateValues(char *szNewText, double fNewValue1, doubl
TCommandType __fastcall TMemCell::CommandCheck()
{ // rozpoznanie komendy
if (strcmp(szText, "SetVelocity") == 0) // najpopularniejsze
{eCommand=cm_SetVelocity;
{
eCommand = cm_SetVelocity;
bCommand = false; // ta komenda nie jest wysy³ana
}
else if (strcmp(szText, "ShuntVelocity") == 0) // w tarczach manewrowych
{eCommand=cm_ShuntVelocity;
{
eCommand = cm_ShuntVelocity;
bCommand = false; // ta komenda nie jest wysy³ana
}
else if (strcmp(szText, "Change_direction") == 0) // zdarza siê
{eCommand=cm_ChangeDirection;
{
eCommand = cm_ChangeDirection;
bCommand = true; // do wys³ania
}
else if (strcmp(szText, "OutsideStation") == 0) // zdarza siê
{eCommand=cm_OutsideStation;
{
eCommand = cm_OutsideStation;
bCommand = false; // tego nie powinno byæ w komórce
}
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
}
else if (strcmp(szText, "SetProximityVelocity") == 0) // nie powinno tego byæ
{eCommand=cm_SetProximityVelocity;
{
eCommand = cm_SetProximityVelocity;
bCommand = false; // ta komenda nie jest wysy³ana
}
else
{eCommand=cm_Unknown; //ci¹g nierozpoznany (nie jest komend¹)
{
eCommand = cm_Unknown; // ci¹g nierozpoznany (nie jest komend¹)
bCommand = true; // do wys³ania
}
return eCommand;
@@ -129,7 +133,8 @@ void __fastcall TMemCell::PutCommand(TController *Mech, vector3 *Loc)
Mech->PutCommand(szText, fValue1, fValue2, Loc);
}
bool __fastcall TMemCell::Compare(char *szTestText,double fTestValue1,double fTestValue2,int CheckMask)
bool __fastcall TMemCell::Compare(char *szTestText, double fTestValue1, double fTestValue2,
int CheckMask)
{ // porównanie zawartoœci komórki pamiêci z podanymi wartoœciami
if (TestFlag(CheckMask, conditional_memstring))
{ // porównaæ teksty
@@ -141,8 +146,7 @@ bool __fastcall TMemCell::Compare(char *szTestText,double fTestValue1,double fTe
if (AnsiString(szTestText, i) != AnsiString(szText, i))
return false; // pocz¹tki o d³ugoœci (i) s¹ ró¿ne
}
else
if (AnsiString(szTestText)!=AnsiString(szText))
else if (AnsiString(szTestText) != AnsiString(szText))
return false; //³¹ñcuchy s¹ ró¿ne
}
// tekst zgodny, porównaæ resztê
@@ -150,27 +154,24 @@ bool __fastcall TMemCell::Compare(char *szTestText,double fTestValue1,double fTe
(!TestFlag(CheckMask, conditional_memval2) || (fValue2 == fTestValue2)));
};
bool __fastcall TMemCell::Render()
{
return true;
}
bool __fastcall TMemCell::Render() { return true; }
bool __fastcall TMemCell::IsVelocity()
{ // sprawdzenie, czy event odczytu tej komórki ma byæ do skanowania, czy do kolejkowania
if (eCommand==cm_SetVelocity) return true;
if (eCommand==cm_ShuntVelocity) return true;
if (eCommand == cm_SetVelocity)
return true;
if (eCommand == cm_ShuntVelocity)
return true;
return (eCommand == cm_SetProximityVelocity);
};
void __fastcall TMemCell::StopCommandSent()
{ //
if (!bCommand) return;
if (!bCommand)
return;
bCommand = false;
if (OnSent) // jeœli jest event
Global::AddToQuery(OnSent, NULL);
};
void __fastcall TMemCell::AssignEvents(TEvent *e)
{//powi¹zanie eventu
OnSent=e;
};
void __fastcall TMemCell::AssignEvents(TEvent *e) { // powi¹zanie eventu OnSent = e; };

View File

@@ -18,14 +18,17 @@ private:
bool bCommand; // czy zawiera komendê dla zatrzymanego AI
TEvent *OnSent; // event dodawany do kolejki po wys³aniu komendy zatrzymuj¹cej sk³ad
public:
AnsiString asTrackName; //McZapkie-100302 - zeby nazwe toru na ktory jest Putcommand wysylane pamietac
AnsiString
asTrackName; // McZapkie-100302 - zeby nazwe toru na ktory jest Putcommand wysylane pamietac
__fastcall TMemCell(vector3 *p);
__fastcall ~TMemCell();
void __fastcall Init();
void __fastcall UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, int CheckMask);
void __fastcall UpdateValues(char *szNewText, double fNewValue1, double fNewValue2,
int CheckMask);
bool __fastcall Load(cParser *parser);
void __fastcall PutCommand(TController *Mech, vector3 *Loc);
bool __fastcall Compare(char *szTestText, double fTestValue1, double fTestValue2, int CheckMask);
bool __fastcall Compare(char *szTestText, double fTestValue1, double fTestValue2,
int CheckMask);
bool __fastcall Render();
inline char *__fastcall Text() { return szText; };
inline double __fastcall Value1() { return fValue1; };

File diff suppressed because it is too large Load Diff

View File

@@ -29,7 +29,11 @@ class TStringPack
public:
char *String(int n);
char *StringAt(int n) { return data + 9 + n; };
__fastcall TStringPack() {data=NULL; index=NULL;};
__fastcall TStringPack()
{
data = NULL;
index = NULL;
};
void __fastcall Init(char *d) { data = d; };
void __fastcall InitIndex(int *i) { index = i; };
};
@@ -38,14 +42,13 @@ class TMaterialColor
{
public:
__fastcall TMaterialColor(){};
__fastcall TMaterialColor(char V)
{
r=g=b=V;
};
__fastcall TMaterialColor(char V) { r = g = b = V; };
// __fastcall TMaterialColor(double R, double G, double B)
__fastcall TMaterialColor(char R, char G, char B)
{
r=R; g=G; b=B;
r = R;
g = G;
b = B;
};
char r, g, b;
@@ -56,7 +59,8 @@ struct TMaterial
{
int ID;
AnsiString Name;
//McZapkie-240702: lepiej uzywac wartosci float do opisu koloru bo funkcje opengl chyba tego na ogol uzywaja
//McZapkie-240702: lepiej uzywac wartosci float do opisu koloru bo funkcje opengl chyba tego na ogol
uzywaja
float Ambient[4];
float Diffuse[4];
float Specular[4];
@@ -107,7 +111,8 @@ const int TP_STARS=258;
const int TP_TEXT = 259;
enum TAnimType // rodzaj animacji
{at_None, //brak
{
at_None, // brak
at_Rotate, // obrót względem wektora o kąt
at_RotateXYZ, // obrót względem osi o kąty
at_Translate, // przesunięcie
@@ -145,6 +150,7 @@ private:
int iName; // numer łańcucha z nazwą submodelu, albo -1 gdy anonimowy
public: // chwilowo
TAnimType b_Anim;
private:
int iFlags; // flagi informacyjne:
// bit 0: =1 faza rysowania zależy od wymiennej tekstury 0
@@ -184,7 +190,8 @@ private:
int iFarAttenDecay; // ta zmienna okresla typ zaniku natezenia swiatla (0:brak, 1,2: potega 1/R)
float fFarDecayRadius; // normalizacja j.w.
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 światła
float fCosHotspotAngle; // cosinus kąta stożka pod którym widać aureolę i zwiększone natężenie
// światła
float fCosViewAngle; // cos kata pod jakim sie teraz patrzy
// Ra: dalej są zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy
int TextureID; // numer tekstury, -1 wymienna, 0 brak
@@ -198,6 +205,7 @@ private:
float f_Angle;
float3 v_RotateAxis;
float3 v_Angles;
public: // chwilowo
float3 v_TransVector;
float8 *Vertices; // roboczy wskaźnik - wczytanie T3D do VBO
@@ -207,7 +215,8 @@ public:
float4x4 *mAnimMatrix; // macierz do animacji kwaternionowych (należy do AnimContainer)
char space[8]; // wolne miejsce na przyszłe zmienne (zmniejszyć w miarę potrzeby)
public:
TSubModel **smLetter; //wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D)
TSubModel **
smLetter; // wskaźnik na tablicę submdeli do generoania tekstu (docelowo zapisać do E3D)
TSubModel *Parent; // nadrzędny, np. do wymnażania macierzy
int iVisible; // roboczy stan widoczności
// AnsiString asTexture; //robocza nazwa tekstury do zapisania w pliku binarnym
@@ -215,9 +224,11 @@ public:
char *pTexture; // robocza nazwa tekstury do zapisania w pliku binarnym
char *pName; // robocza nazwa
private:
//int __fastcall SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX *Vertices);
// int __fastcall SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX
// *Vertices);
int __fastcall SeekFaceNormal(DWORD *Masks, int f, DWORD dwMask, float3 *pt, float8 *Vertices);
void __fastcall RaAnimation(TAnimType a);
public:
static int iInstance; // identyfikator egzemplarza, który aktualnie renderuje model
static GLuint *ReplacableSkinId;
@@ -256,14 +267,22 @@ public:
void __fastcall RaArrayFill(CVertNormTex *Vert);
// void __fastcall Render();
int __fastcall FlagsCheck();
void __fastcall WillBeAnimated() {if (this) iFlags|=0x4000;};
void __fastcall WillBeAnimated()
{
if (this)
iFlags |= 0x4000;
};
void __fastcall InitialRotate(bool doit);
void __fastcall DisplayLists();
void __fastcall Info();
void __fastcall InfoSet(TSubModelInfo *info);
void __fastcall BinInit(TSubModel *s,float4x4 *m,float8 *v,TStringPack *t,TStringPack *n=NULL,bool dynamic=false);
void __fastcall BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t,
TStringPack *n = NULL, bool dynamic = false);
void __fastcall ReplacableSet(GLuint *r, int a)
{ReplacableSkinId=r; iAlpha=a;};
{
ReplacableSkinId = r;
iAlpha = a;
};
void __fastcall TextureNameSet(const char *n);
void __fastcall NameSet(const char *n);
// Ra: funkcje do budowania terenu z E3D
@@ -271,9 +290,13 @@ public:
void __fastcall UnFlagNext() { iFlags &= 0x00FFFFFF; };
void __fastcall ColorsSet(int *a, int *d, int *s);
inline float3 Translation1Get()
{return fMatrix?*(fMatrix->TranslationGet())+v_TransVector:v_TransVector;}
{
return fMatrix ? *(fMatrix->TranslationGet()) + v_TransVector : v_TransVector;
}
inline float3 Translation2Get()
{return *(fMatrix->TranslationGet())+Child->Translation1Get();}
{
return *(fMatrix->TranslationGet()) + Child->Translation1Get();
}
void __fastcall ParentMatrix(float4x4 *m);
float __fastcall MaxY(const float4x4 &m);
void __fastcall AdjustDist();
@@ -295,12 +318,14 @@ public:
static int iCurrent; // aktualny obiekt
static TSubModelInfo *pTable; // tabele obiektów pomocniczych
__fastcall TSubModelInfo()
{pSubModel=NULL;
{
pSubModel = NULL;
iTransform = iName = iTexture = iNext = iChild = -1; // nie ma
iNameLen = iTextureLen = 0;
}
void __fastcall 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
}
__fastcall ~TSubModelInfo(){};
@@ -338,20 +363,32 @@ public:
void __fastcall SaveToBinFile(char *FileName);
void __fastcall BreakHierarhy();
// renderowanie specjalne
void __fastcall Render(double fSquareDistance,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall RenderAlpha(double fSquareDistance,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall RaRender(double fSquareDistance,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall RaRenderAlpha(double fSquareDistance,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall Render(double fSquareDistance, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030);
void __fastcall RenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030);
void __fastcall RaRender(double fSquareDistance, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030);
void __fastcall RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030);
// jeden kąt obrotu
void __fastcall Render(vector3 pPosition,double fAngle=0,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall RenderAlpha(vector3 pPosition,double fAngle=0,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall RaRender(vector3 pPosition,double fAngle=0,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall RaRenderAlpha(vector3 pPosition,double fAngle=0,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall Render(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030);
void __fastcall RenderAlpha(vector3 pPosition, double fAngle = 0,
GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
void __fastcall RaRender(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030);
void __fastcall RaRenderAlpha(vector3 pPosition, double fAngle = 0,
GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
// trzy kąty obrotu
void __fastcall Render(vector3* vPosition,vector3* vAngle,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall RenderAlpha(vector3* vPosition,vector3* vAngle,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall RaRender(vector3* vPosition,vector3* vAngle,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall RaRenderAlpha(vector3* vPosition,vector3* vAngle,GLuint *ReplacableSkinId=NULL,int iAlpha=0x30300030);
void __fastcall Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030);
void __fastcall RenderAlpha(vector3 *vPosition, vector3 *vAngle,
GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
void __fastcall RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030);
void __fastcall RaRenderAlpha(vector3 *vPosition, vector3 *vAngle,
GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
// inline int __fastcall GetSubModelsCount() { return (SubModelsCount); };
int __fastcall Flags() { return iFlags; };
void __fastcall Init();

225
Mover.cpp
View File

@@ -9,49 +9,64 @@
const dEpsilon = 0.01; // 1cm (zale¿y od typu sprzêgu...)
__fastcall TMoverParameters::TMoverParameters(double VelInitial,AnsiString TypeNameInit,AnsiString NameInit,
int LoadInitial,AnsiString LoadTypeInitial,int Cab)
__fastcall TMoverParameters::TMoverParameters(double VelInitial, AnsiString TypeNameInit,
AnsiString NameInit, int LoadInitial,
AnsiString LoadTypeInitial, int Cab)
: T_MoverParameters(VelInitial, TypeNameInit, NameInit, LoadInitial, LoadTypeInitial, Cab)
{ // g³ówny konstruktor
DimHalf.x = 0.5 * Dim.W; // po³owa szerokoœci, OX jest w bok?
DimHalf.y = 0.5 * Dim.L; // po³owa d³ugoœci, OY jest do przodu?
DimHalf.z = 0.5 * Dim.H; // po³owa wysokoœci, OZ jest w górê?
//BrakeLevelSet(-2); //Pascal ustawia na 0, przestawimy na odciêcie (CHK jest jeszcze nie wczytane!)
// BrakeLevelSet(-2); //Pascal ustawia na 0, przestawimy na odciêcie (CHK jest jeszcze nie
// wczytane!)
bPantKurek3 = true; // domyœlnie zbiornik pantografu po³¹czony jest ze zbiornikiem g³ównym
iProblem = 0; // pojazd w pe³ni gotowy do ruchu
iLights[0] = iLights[1] = 0; //œwiat³a zgaszone
};
double __fastcall TMoverParameters::Distance(const TLocation &Loc1,const TLocation &Loc2,const TDimension &Dim1,const TDimension &Dim2)
double __fastcall TMoverParameters::Distance(const TLocation &Loc1, const TLocation &Loc2,
const TDimension &Dim1, const TDimension &Dim2)
{ // zwraca odleg³oœæ pomiêdzy pojazdami (Loc1) i (Loc2) z uwzglêdnieneim ich d³ugoœci (kule!)
return hypot(Loc2.X - Loc1.X, Loc1.Y - Loc2.Y) - 0.5 * (Dim2.L + Dim1.L);
};
double __fastcall TMoverParameters::Distance(const vector3 &s1, const vector3 &s2, const vector3 &d1, const vector3 &d2)
{//obliczenie odleg³oœci prostopad³oœcianów o œrodkach (s1) i (s2) i wymiarach (d1) i (d2)
double __fastcall TMoverParameters::Distance(const vector3 &s1, const vector3 &s2,
const vector3 &d1, const vector3 &d2){
// obliczenie odleg³oœci prostopad³oœcianów o œrodkach (s1) i (s2) i wymiarach (d1) i (d2)
// return 0.0; //bêdzie zg³aszaæ warning - funkcja do usuniêcia, chyba ¿e siê przyda...
};
double __fastcall TMoverParameters::CouplerDist(Byte Coupler)
{ // obliczenie odleg³oœci pomiêdzy sprzêgami (kula!)
return Couplers[Coupler].CoupleDist=Distance(Loc,Couplers[Coupler].Connected->Loc,Dim,Couplers[Coupler].Connected->Dim); //odleg³oœæ pomiêdzy sprzêgami (kula!)
return Couplers[Coupler].CoupleDist =
Distance(Loc, Couplers[Coupler].Connected->Loc, Dim,
Couplers[Coupler].Connected->Dim); // odleg³oœæ pomiêdzy sprzêgami (kula!)
};
bool __fastcall TMoverParameters::Attach(Byte ConnectNo,Byte ConnectToNr,TMoverParameters *ConnectTo,Byte CouplingType,bool Forced)
bool __fastcall TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr,
TMoverParameters *ConnectTo, Byte CouplingType,
bool Forced)
{ //³¹czenie do swojego sprzêgu (ConnectNo) pojazdu (ConnectTo) stron¹ (ConnectToNr)
// Ra: zwykle wykonywane dwukrotnie, dla ka¿dego pojazdu oddzielnie
//Ra: trzeba by odró¿niæ wymóg dociœniêcia od uszkodzenia sprzêgu przy podczepianiu AI do sk³adu
// Ra: trzeba by odró¿niæ wymóg dociœniêcia od uszkodzenia sprzêgu przy podczepianiu AI do
// sk³adu
if (ConnectTo) // jeœli nie pusty
{
if (ConnectToNr!=2) Couplers[ConnectNo].ConnectedNr=ConnectToNr; //2=nic nie pod³¹czone
TCouplerType ct=ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr].CouplerType; //typ sprzêgu pod³¹czanego pojazdu
Couplers[ConnectNo].Connected=ConnectTo; //tak podpi¹æ (do siebie) zawsze mo¿na, najwy¿ej bêdzie wirtualny
if (ConnectToNr != 2)
Couplers[ConnectNo].ConnectedNr = ConnectToNr; // 2=nic nie pod³¹czone
TCouplerType ct = ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr]
.CouplerType; // typ sprzêgu pod³¹czanego pojazdu
Couplers[ConnectNo].Connected =
ConnectTo; // tak podpi¹æ (do siebie) zawsze mo¿na, najwy¿ej bêdzie wirtualny
CouplerDist(ConnectNo); // przeliczenie odleg³oœci pomiêdzy sprzêgami
if (CouplingType==ctrain_virtual) return false; //wirtualny wiêcej nic nie robi
if (Forced?true:((Couplers[ConnectNo].CoupleDist<=dEpsilon)&&(Couplers[ConnectNo].CouplerType!=NoCoupler)&&(Couplers[ConnectNo].CouplerType==ct)))
if (CouplingType == ctrain_virtual)
return false; // wirtualny wiêcej nic nie robi
if (Forced ? true : ((Couplers[ConnectNo].CoupleDist <= dEpsilon) &&
(Couplers[ConnectNo].CouplerType != NoCoupler) &&
(Couplers[ConnectNo].CouplerType == ct)))
{ // stykaja sie zderzaki i kompatybilne typy sprzegow, chyba ¿e ³¹czenie na starcie
if (Couplers[ConnectNo].CouplingFlag==ctrain_virtual) //jeœli wczeœniej nie by³o po³¹czone
if (Couplers[ConnectNo].CouplingFlag ==
ctrain_virtual) // jeœli wczeœniej nie by³o po³¹czone
{ // ustalenie z której strony rysowaæ sprzêg
Couplers[ConnectNo].Render = true; // tego rysowaæ
ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr].Render = false; // a tego nie
@@ -61,54 +76,66 @@ bool __fastcall TMoverParameters::Attach(Byte ConnectNo,Byte ConnectToNr,TMoverP
//{//jeœli ³¹czenie sprzêgiem niewirtualnym, ustawiamy po³¹czenie zwrotne
ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr].CouplingFlag = CouplingType;
ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr].Connected = this;
ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr].CoupleDist=Couplers[ConnectNo].CoupleDist;
ConnectTo->Couplers[Couplers[ConnectNo].ConnectedNr].CoupleDist =
Couplers[ConnectNo].CoupleDist;
return true;
//}
// pod³¹czenie nie uda³o siê - jest wirtualne
}
}
return false; //brak pod³¹czanego pojazdu, zbyt du¿a odleg³oœæ, niezgodny typ sprzêgu, brak sprzêgu, brak haka
return false; // brak pod³¹czanego pojazdu, zbyt du¿a odleg³oœæ, niezgodny typ sprzêgu, brak
// sprzêgu, brak haka
};
bool __fastcall TMoverParameters::Attach(Byte ConnectNo,Byte ConnectToNr,T_MoverParameters *ConnectTo,Byte CouplingType,bool Forced)
bool __fastcall TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr,
T_MoverParameters *ConnectTo, Byte CouplingType,
bool Forced)
{ //³¹czenie do (ConnectNo) pojazdu (ConnectTo) stron¹ (ConnectToNr)
return Attach(ConnectNo, ConnectToNr, (TMoverParameters *)ConnectTo, CouplingType, Forced);
};
int __fastcall TMoverParameters::DettachStatus(Byte ConnectNo)
{ // Ra: sprawdzenie, czy odleg³oœæ jest dobra do roz³¹czania
//powinny byæ 3 informacje: =0 sprzêg ju¿ roz³¹czony, <0 da siê roz³¹czyæ. >0 nie da siê roz³¹czyæ
// powinny byæ 3 informacje: =0 sprzêg ju¿ roz³¹czony, <0 da siê roz³¹czyæ. >0 nie da siê
// roz³¹czyæ
if (!Couplers[ConnectNo].Connected)
return 0; // nie ma nic, to roz³¹czanie jest OK
if ((Couplers[ConnectNo].CouplingFlag & ctrain_coupler) == 0)
return -Couplers[ConnectNo].CouplingFlag; // hak nie po³¹czony - roz³¹czanie jest OK
if (TestFlag(DamageFlag, dtrain_coupling))
return -Couplers[ConnectNo].CouplingFlag; // hak urwany - roz³¹czanie jest OK
//ABu021104: zakomentowane 'and (CouplerType<>Articulated)' w warunku, nie wiem co to bylo, ale za to teraz dziala odczepianie... :) }
// ABu021104: zakomentowane 'and (CouplerType<>Articulated)' w warunku, nie wiem co to bylo, ale
// za to teraz dziala odczepianie... :) }
// if (CouplerType==Articulated) return false; //sprzêg nie do rozpiêcia - mo¿e byæ tylko urwany
// Couplers[ConnectNo].CoupleDist=Distance(Loc,Couplers[ConnectNo].Connected->Loc,Dim,Couplers[ConnectNo].Connected->Dim);
CouplerDist(ConnectNo);
if (Couplers[ConnectNo].CouplerType == Screw ? Couplers[ConnectNo].CoupleDist < 0.0 : true)
return -Couplers[ConnectNo].CouplingFlag; // mo¿na roz³¹czaæ, jeœli dociœniêty
return (Couplers[ConnectNo].CoupleDist>0.2)?-Couplers[ConnectNo].CouplingFlag:Couplers[ConnectNo].CouplingFlag;
return (Couplers[ConnectNo].CoupleDist > 0.2) ? -Couplers[ConnectNo].CouplingFlag :
Couplers[ConnectNo].CouplingFlag;
};
bool __fastcall TMoverParameters::Dettach(Byte ConnectNo)
{ // rozlaczanie
if (!Couplers[ConnectNo].Connected) return true; //nie ma nic, to odczepiono
if (!Couplers[ConnectNo].Connected)
return true; // nie ma nic, to odczepiono
// with Couplers[ConnectNo] do
int i = DettachStatus(ConnectNo); // stan sprzêgu
if (i < 0)
{ // gdy scisniete zderzaki, chyba ze zerwany sprzeg (wirtualnego nie odpinamy z drugiej strony)
//Couplers[ConnectNo].Connected=NULL; //lepiej zostawic bo przeciez trzeba kontrolowac zderzenia odczepionych
Couplers[ConnectNo].Connected->Couplers[Couplers[ConnectNo].ConnectedNr].CouplingFlag=0; //pozostaje sprzêg wirtualny
// Couplers[ConnectNo].Connected=NULL; //lepiej zostawic bo przeciez trzeba kontrolowac
// zderzenia odczepionych
Couplers[ConnectNo].Connected->Couplers[Couplers[ConnectNo].ConnectedNr].CouplingFlag =
0; // pozostaje sprzêg wirtualny
Couplers[ConnectNo].CouplingFlag = 0; // pozostaje sprzêg wirtualny
return true;
}
else if (i > 0)
{//od³¹czamy wê¿e i resztê, pozostaje sprzêg fizyczny, który wymaga dociœniêcia (z wirtualnym nic)
{ // od³¹czamy wê¿e i resztê, pozostaje sprzêg fizyczny, który wymaga dociœniêcia (z wirtualnym
// nic)
Couplers[ConnectNo].CouplingFlag &= ctrain_coupler;
Couplers[ConnectNo].Connected->Couplers[Couplers[ConnectNo].ConnectedNr].CouplingFlag=Couplers[ConnectNo].CouplingFlag;
Couplers[ConnectNo].Connected->Couplers[Couplers[ConnectNo].ConnectedNr].CouplingFlag =
Couplers[ConnectNo].CouplingFlag;
}
return false; // jeszcze nie roz³¹czony
};
@@ -153,23 +180,27 @@ bool __fastcall TMoverParameters::DirectionForward()
void __fastcall TMoverParameters::BrakeLevelSet(double b)
{ // ustawienie pozycji hamulca na wartoϾ (b) w zakresie od -2 do BrakeCtrlPosNo
// jedyny dopuszczalny sposób przestawienia hamulca zasadniczego
if (fBrakeCtrlPos==b) return; //nie przeliczaæ, jak nie ma zmiany
if (fBrakeCtrlPos == b)
return; // nie przeliczaæ, jak nie ma zmiany
fBrakeCtrlPos = b;
BrakeCtrlPosR = b;
if (fBrakeCtrlPos < Handle->GetPos(bh_MIN))
fBrakeCtrlPos = Handle->GetPos(bh_MIN); // odciêcie
else
if (fBrakeCtrlPos>Handle->GetPos(bh_MAX))
else if (fBrakeCtrlPos > Handle->GetPos(bh_MAX))
fBrakeCtrlPos = Handle->GetPos(bh_MAX);
int x=floor(fBrakeCtrlPos); //jeœli odwo³ujemy siê do BrakeCtrlPos w poœrednich, to musi byæ obciête a nie zaokr¹gone
int x = floor(fBrakeCtrlPos); // jeœli odwo³ujemy siê do BrakeCtrlPos w poœrednich, to musi byæ
// obciête a nie zaokr¹gone
while ((x > BrakeCtrlPos) && (BrakeCtrlPos < BrakeCtrlPosNo)) // jeœli zwiêkszy³o siê o 1
if (!T_MoverParameters::IncBrakeLevelOld()) break; //wyjœcie awaryjne
if (!T_MoverParameters::IncBrakeLevelOld())
break; // wyjœcie awaryjne
while ((x < BrakeCtrlPos) && (BrakeCtrlPos >= -1)) // jeœli zmniejszy³o siê o 1
if (!T_MoverParameters::DecBrakeLevelOld()) break;
if (!T_MoverParameters::DecBrakeLevelOld())
break;
BrakePressureActual = BrakePressureTable[BrakeCtrlPos + 2]; // skopiowanie pozycji
/*
//youBy: obawiam sie, ze tutaj to nie dziala :P
//Ra 2014-03: by³o tak zrobione, ¿e dzia³a³o - po ka¿dej zmianie pozycji by³a wywo³ywana ta funkcja
//Ra 2014-03: by³o tak zrobione, ¿e dzia³a³o - po ka¿dej zmianie pozycji by³a wywo³ywana ta
funkcja
// if (BrakeSystem==Pneumatic?BrakeSubsystem==Oerlikon:false) //tylko Oerlikon akceptuje u³amki
if(false)
if (fBrakeCtrlPos>0.0)
@@ -178,7 +209,8 @@ void __fastcall TMoverParameters::BrakeLevelSet(double b)
if (u>0.0)
{//wyliczamy wartoœci wa¿one
BrakePressureActual.PipePressureVal+=-u*BrakePressureActual.PipePressureVal+u*BrakePressureTable[BrakeCtrlPos+1+2].PipePressureVal;
//BrakePressureActual.BrakePressureVal+=-u*BrakePressureActual.BrakePressureVal+u*BrakePressureTable[BrakeCtrlPos+1].BrakePressureVal; //to chyba nie bêdzie tak dzia³aæ, zw³aszcza w EN57
//BrakePressureActual.BrakePressureVal+=-u*BrakePressureActual.BrakePressureVal+u*BrakePressureTable[BrakeCtrlPos+1].BrakePressureVal;
//to chyba nie bêdzie tak dzia³aæ, zw³aszcza w EN57
BrakePressureActual.FlowSpeedVal+=-u*BrakePressureActual.FlowSpeedVal+u*BrakePressureTable[BrakeCtrlPos+1+2].FlowSpeedVal;
}
}
@@ -189,18 +221,16 @@ bool __fastcall TMoverParameters::BrakeLevelAdd(double b)
{ // dodanie wartoœci (b) do pozycji hamulca (w tym ujemnej)
// zwraca false, gdy po dodaniu by³o by poza zakresem
BrakeLevelSet(fBrakeCtrlPos + b);
return b>0.0?(fBrakeCtrlPos<BrakeCtrlPosNo):(BrakeCtrlPos>-1.0); //true, jeœli mo¿na kontynuowaæ
return b > 0.0 ? (fBrakeCtrlPos < BrakeCtrlPosNo) :
(BrakeCtrlPos > -1.0); // true, jeœli mo¿na kontynuowaæ
};
bool __fastcall TMoverParameters::IncBrakeLevel()
{ // nowa wersja na u¿ytek AI, false gdy osi¹gniêto pozycjê BrakeCtrlPosNo
return BrakeLevelAdd(1.0);
};
return BrakeLevelAdd(1.0); };
bool __fastcall TMoverParameters::DecBrakeLevel()
{//nowa wersja na u¿ytek AI, false gdy osi¹gniêto pozycjê -1
return BrakeLevelAdd(-1.0);
};
{ // nowa wersja na u¿ytek AI, false gdy osi¹gniêto pozycjê -1 return BrakeLevelAdd(-1.0); };
bool __fastcall TMoverParameters::ChangeCab(int direction)
{ // zmiana kabiny i resetowanie ustawien
@@ -248,7 +278,8 @@ bool __fastcall TMoverParameters::CurrentSwitch(int direction)
{ // rozruch wysoki (true) albo niski (false)
// Ra: przenios³em z Train.cpp, nie wiem czy ma to sens
if (MaxCurrentSwitch(direction))
{if (TrainType!=dt_EZT)
{
if (TrainType != dt_EZT)
return (MinCurrentSwitch(direction));
}
if (EngineType == DieselEngine) // dla 2Ls150
@@ -259,23 +290,33 @@ bool __fastcall TMoverParameters::CurrentSwitch(int direction)
};
void __fastcall TMoverParameters::UpdatePantVolume(double dt)
{//KURS90 - sprê¿arka pantografów; Ra 2014-07: teraz jest to zbiornik rozrz¹du, chocia¿ to jeszcze nie tak
{ // KURS90 - sprê¿arka pantografów; Ra 2014-07: teraz jest to zbiornik rozrz¹du, chocia¿ to jeszcze
// nie tak
if (EnginePowerSource.SourceType == CurrentCollector) // tylko jeœli pantografuj¹cy
{
//Ra 2014-07: zasadniczo, to istnieje zbiornik rozrz¹du i zbiornik pantografów - na razie mamy razem
//Ra 2014-07: kurek trójdrogowy ³¹czy spr.pom. z pantografami i wy³¹cznikiem ciœnieniowym WS
//Ra 2014-07: zbiornika rozrz¹du nie pompuje siê tu, tylko pantografy; potem mo¿na zamkn¹æ WS i odpaliæ resztê
if ((TrainType==dt_EZT)?(PantPress<ScndPipePress):bPantKurek3) //kurek zamyka po³¹czenie z ZG
{//zbiornik pantografu po³¹czony ze zbiornikiem g³ównym - ma³¹ sprê¿ark¹ siê tego nie napompuje
// Ra 2014-07: zasadniczo, to istnieje zbiornik rozrz¹du i zbiornik pantografów - na razie
// mamy razem
// Ra 2014-07: kurek trójdrogowy ³¹czy spr.pom. z pantografami i wy³¹cznikiem ciœnieniowym
// WS
// Ra 2014-07: zbiornika rozrz¹du nie pompuje siê tu, tylko pantografy; potem mo¿na zamkn¹æ
// WS i odpaliæ resztê
if ((TrainType == dt_EZT) ? (PantPress < ScndPipePress) :
bPantKurek3) // kurek zamyka po³¹czenie z ZG
{ // zbiornik pantografu po³¹czony ze zbiornikiem g³ównym - ma³¹ sprê¿ark¹ siê tego nie
// napompuje
// Ra 2013-12: Niebugoc³aw mówi, ¿e w EZT nie ma potrzeby odcinaæ kurkiem
PantPress=EnginePowerSource.CollectorParameters.MaxPress; //ograniczenie ciœnienia do MaxPress (tylko w pantografach!)
if (PantPress>ScndPipePress) PantPress=ScndPipePress; //oraz do ScndPipePress
PantPress = EnginePowerSource.CollectorParameters
.MaxPress; // ograniczenie ciœnienia do MaxPress (tylko w pantografach!)
if (PantPress > ScndPipePress)
PantPress = ScndPipePress; // oraz do ScndPipePress
PantVolume = (PantPress + 1) * 0.1; // objêtoœæ, na wypadek odciêcia kurkiem
}
else
{ // zbiornik g³ówny odciêty, mo¿na pompowaæ pantografy
if (PantCompFlag && Battery) // w³¹czona bateria i ma³a sprê¿arka
PantVolume+=dt*(TrainType==dt_EZT?0.003:0.005)*(2*0.45-((0.1/PantVolume/10)-0.1))/0.45; //nape³nianie zbiornika pantografów
PantVolume += dt * (TrainType == dt_EZT ? 0.003 : 0.005) *
(2 * 0.45 - ((0.1 / PantVolume / 10) - 0.1)) /
0.45; // nape³nianie zbiornika pantografów
// Ra 2013-12: Niebugoc³aw mówi, ¿e w EZT nabija 1.5 raz wolniej ni¿ jak by³o 0.005
PantPress = (10.0 * PantVolume) - 1.0; // tu by siê przyda³a objêtoœæ zbiornika
}
@@ -284,17 +325,23 @@ void __fastcall TMoverParameters::UpdatePantVolume(double dt)
if (Mains) // nie wchodziæ w funkcjê bez potrzeby
if (EngineType == ElectricSeriesMotor) // nie dotyczy... czego w³aœciwie?
if (PantPress < EnginePowerSource.CollectorParameters.MinPress)
if ((TrainType&(dt_EZT|dt_ET40|dt_ET41|dt_ET42))?(GetTrainsetVoltage()<EnginePowerSource.CollectorParameters.MinV):true) //to jest trochê proteza; zasilanie cz³onu mo¿e byæ przez sprzêg WN
if ((TrainType & (dt_EZT | dt_ET40 | dt_ET41 | dt_ET42)) ?
(GetTrainsetVoltage() < EnginePowerSource.CollectorParameters.MinV) :
true) // to jest trochê proteza; zasilanie cz³onu mo¿e byæ przez sprzêg
// WN
if (MainSwitch(false))
EventFlag = true; // wywalenie szybkiego z powodu niskiego ciœnienia
if (TrainType != dt_EZT) // w EN57 pompuje siê tylko w silnikowym
// pierwotnie w CHK pantografy mia³y równie¿ rozrz¹dcze EZT
for (int b = 0; b <= 1; ++b)
if (TestFlag(Couplers[b].CouplingFlag, ctrain_controll))
if (Couplers[b].Connected->PantVolume<PantVolume) //bo inaczej trzeba w obydwu cz³onach przestawiaæ
Couplers[b].Connected->PantVolume=PantVolume; //przekazanie ciœnienia do s¹siedniego cz³onu
if (Couplers[b].Connected->PantVolume <
PantVolume) // bo inaczej trzeba w obydwu cz³onach przestawiaæ
Couplers[b].Connected->PantVolume =
PantVolume; // przekazanie ciœnienia do s¹siedniego cz³onu
// czy np. w ET40, ET41, ET42 pantografy cz³onów maj¹ po³¹czenie pneumatyczne?
//Ra 2014-07: raczej nie - najpierw siê za³¹cza jeden cz³on, a potem mo¿na podnieœæ w drugim
// Ra 2014-07: raczej nie - najpierw siê za³¹cza jeden cz³on, a potem mo¿na podnieœæ w
// drugim
}
else
{ // a tu coœ dla SM42 i SM31, aby pokazywaæ na manometrze
@@ -305,43 +352,55 @@ void __fastcall TMoverParameters::UpdatePantVolume(double dt)
void __fastcall TMoverParameters::UpdateBatteryVoltage(double dt)
{ // przeliczenie obci¹¿enia baterii
double sn1, sn2, sn3, sn4, sn5; // Ra: zrobiæ z tego amperomierz NN
if ((BatteryVoltage>0)&&(EngineType!=DieselEngine)&&(EngineType!=WheelsDriven)&&(NominalBatteryVoltage>0))
if ((BatteryVoltage > 0) && (EngineType != DieselEngine) && (EngineType != WheelsDriven) &&
(NominalBatteryVoltage > 0))
{
if ((NominalBatteryVoltage / BatteryVoltage < 1.22) && Battery)
{ // 110V
if (!ConverterFlag)
sn1 = (dt * 2.0); // szybki spadek do ok 90V
else sn1=0;
else
sn1 = 0;
if (ConverterFlag)
sn2 = -(dt * 2.0); // szybki wzrost do 110V
else sn2=0;
else
sn2 = 0;
if (Mains)
sn3 = (dt * 0.05);
else sn3=0;
if (iLights[0]&63) //64=blachy, nie ci¹gn¹ pr¹du //rozpisaæ na poszczególne ¿arówki...
else
sn3 = 0;
if (iLights[0] & 63) // 64=blachy, nie ci¹gn¹ pr¹du //rozpisaæ na poszczególne
// ¿arówki...
sn4 = dt * 0.003;
else sn4=0;
else
sn4 = 0;
if (iLights[1] & 63) // 64=blachy, nie ci¹gn¹ pr¹du
sn5 = dt * 0.001;
else sn5=0;
else
sn5 = 0;
};
if ((NominalBatteryVoltage / BatteryVoltage >= 1.22) && Battery)
{ // 90V
if (PantCompFlag)
sn1 = (dt * 0.0046);
else sn1=0;
else
sn1 = 0;
if (ConverterFlag)
sn2 = -(dt * 50); // szybki wzrost do 110V
else sn2=0;
else
sn2 = 0;
if (Mains)
sn3 = (dt * 0.001);
else sn3=0;
else
sn3 = 0;
if (iLights[0] & 63) // 64=blachy, nie ci¹gn¹ pr¹du
sn4 = (dt * 0.0030);
else sn4=0;
else
sn4 = 0;
if (iLights[1] & 63) // 64=blachy, nie ci¹gn¹ pr¹du
sn5 = (dt * 0.0010);
else sn5=0;
else
sn5 = 0;
};
if (!Battery)
{
@@ -363,8 +422,7 @@ void __fastcall TMoverParameters::UpdateBatteryVoltage(double dt)
if (BatteryVoltage < 0.01)
BatteryVoltage = 0.01;
}
else
if (NominalBatteryVoltage==0)
else if (NominalBatteryVoltage == 0)
BatteryVoltage = 0;
else
BatteryVoltage = 90;
@@ -409,11 +467,10 @@ void __fastcall TMoverParameters::UpdateBatteryVoltage(double dt)
ZN //masa
*/
double __fastcall TMoverParameters::ComputeMovement
(double dt,double dt1,
const TTrackShape &Shape,TTrackParam &Track,TTractionParam &ElectricTraction,
const TLocation &NewLoc,TRotation &NewRot
)
double __fastcall TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShape &Shape,
TTrackParam &Track,
TTractionParam &ElectricTraction,
const TLocation &NewLoc, TRotation &NewRot)
{ // trzeba po ma³u przenosiæ tu tê funkcjê
double d;
T_MoverParameters::ComputeMovement(dt, dt1, Shape, Track, ElectricTraction, NewLoc, NewRot);
@@ -489,11 +546,9 @@ double __fastcall TMoverParameters::ComputeMovement
return d;
};
double __fastcall TMoverParameters::FastComputeMovement
(double dt,
const TTrackShape &Shape,TTrackParam &Track,
const TLocation &NewLoc,TRotation &NewRot
)
double __fastcall TMoverParameters::FastComputeMovement(double dt, const TTrackShape &Shape,
TTrackParam &Track, const TLocation &NewLoc,
TRotation &NewRot)
{ // trzeba po ma³u przenosiæ tu tê funkcjê
double d;
T_MoverParameters::FastComputeMovement(dt, Shape, Track, NewLoc, NewRot);
@@ -573,12 +628,16 @@ void __fastcall TMoverParameters::ConverterCheck()
int __fastcall TMoverParameters::ShowCurrent(Byte AmpN)
{ // odczyt ampera¿u
switch (EngineType)
{case ElectricInductionMotor:
{
case ElectricInductionMotor:
switch (AmpN)
{ // do asynchronicznych
case 1: return WindingRes*Mm/Vadd;
case 2: return dizel_fill*WindingRes;
default: return T_MoverParameters::ShowCurrent(AmpN);
case 1:
return WindingRes * Mm / Vadd;
case 2:
return dizel_fill * WindingRes;
default:
return T_MoverParameters::ShowCurrent(AmpN);
}
break;
case DieselElectric:

46
Mover.h
View File

@@ -28,19 +28,25 @@ public:
// int WarningSignal; //0: nie trabi, 1,2: trabi syren¹ o podanym numerze
unsigned char WarningSignal; // tymczasowo 8bit, ze wzglêdu na funkcje w MTools
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 iLights[2]; // bity zapalonych œwiate³ tutaj, ¿eby da³o siê liczyæ pobór pr¹du
private:
double __fastcall CouplerDist(Byte Coupler);
public:
__fastcall TMoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit,
int LoadInitial, AnsiString LoadTypeInitial, int Cab);
// obs³uga sprzêgów
double __fastcall Distance(const TLocation &Loc1,const TLocation &Loc2,const TDimension &Dim1,const TDimension &Dim2);
double __fastcall Distance(const vector3 &Loc1,const vector3 &Loc2,const vector3 &Dim1,const vector3 &Dim2);
bool __fastcall Attach(Byte ConnectNo,Byte ConnectToNr,TMoverParameters *ConnectTo,Byte CouplingType,bool Forced=false);
bool __fastcall Attach(Byte ConnectNo,Byte ConnectToNr,T_MoverParameters *ConnectTo,Byte CouplingType,bool Forced=false);
double __fastcall Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1,
const TDimension &Dim2);
double __fastcall Distance(const vector3 &Loc1, const vector3 &Loc2, const vector3 &Dim1,
const vector3 &Dim2);
bool __fastcall Attach(Byte ConnectNo, Byte ConnectToNr, TMoverParameters *ConnectTo,
Byte CouplingType, bool Forced = false);
bool __fastcall Attach(Byte ConnectNo, Byte ConnectToNr, T_MoverParameters *ConnectTo,
Byte CouplingType, bool Forced = false);
int __fastcall DettachStatus(Byte ConnectNo);
bool __fastcall Dettach(Byte ConnectNo);
void __fastcall SetCoupleDist();
@@ -52,16 +58,11 @@ public:
bool __fastcall ChangeCab(int direction);
bool __fastcall CurrentSwitch(int direction);
void __fastcall UpdateBatteryVoltage(double dt);
double __fastcall ComputeMovement
(double dt,double dt1,
const TTrackShape &Shape,TTrackParam &Track,TTractionParam &ElectricTraction,
const TLocation &NewLoc,TRotation &NewRot
);
double __fastcall FastComputeMovement
(double dt,
const TTrackShape &Shape,TTrackParam &Track,
const TLocation &NewLoc,TRotation &NewRot
);
double __fastcall ComputeMovement(double dt, double dt1, const TTrackShape &Shape,
TTrackParam &Track, TTractionParam &ElectricTraction,
const TLocation &NewLoc, TRotation &NewRot);
double __fastcall FastComputeMovement(double dt, const TTrackShape &Shape, TTrackParam &Track,
const TLocation &NewLoc, TRotation &NewRot);
double __fastcall ShowEngineRotation(int VehN);
// double __fastcall GetTrainsetVoltage(void);
// bool __fastcall Physic_ReActivation(void);
@@ -119,11 +120,13 @@ public:
// double __fastcall CouplerForce(Byte CouplerN, double dt);
// void __fastcall CollisionDetect(Byte CouplerN, double dt);
// double __fastcall ComputeRotatingWheel(double WForce, double dt, double n);
//bool __fastcall SetInternalCommand(AnsiString NewCommand, double NewValue1, double NewValue2);
// bool __fastcall SetInternalCommand(AnsiString NewCommand, double NewValue1, double
// NewValue2);
// double __fastcall GetExternalCommand(AnsiString &Command);
// bool __fastcall RunCommand(AnsiString command, double CValue1, double CValue2);
// bool __fastcall RunInternalCommand(void);
//void __fastcall PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2, const TLocation
// void __fastcall PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2, const
// TLocation
// &NewLocation);
// bool __fastcall DirectionBackward(void);
// bool __fastcall MainSwitch(bool State);
@@ -152,12 +155,15 @@ public:
// bool __fastcall dizel_Update(double dt);
// bool __fastcall LoadingDone(double LSpeed, AnsiString LoadInit);
// void __fastcall ComputeTotalForce(double dt, double dt1, bool FullVer);
//double __fastcall ComputeMovement(double dt, double dt1, const TTrackShape &Shape, TTrackParam &Track
// double __fastcall ComputeMovement(double dt, double dt1, const TTrackShape &Shape,
// TTrackParam &Track
// , TTractionParam &ElectricTraction, const TLocation &NewLoc, TRotation &NewRot);
//double __fastcall FastComputeMovement(double dt, const TTrackShape &Shape, TTrackParam &Track, const
// double __fastcall FastComputeMovement(double dt, const TTrackShape &Shape, TTrackParam
// &Track, const
// TLocation &NewLoc, TRotation &NewRot);
// bool __fastcall ChangeOffsetH(double DeltaOffset);
//__fastcall T_MoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit, int LoadInitial
//__fastcall T_MoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit,
//int LoadInitial
// , AnsiString LoadTypeInitial, int Cab);
// bool __fastcall LoadChkFile(AnsiString chkpath);
// bool __fastcall CheckLocomotiveParameters(bool ReadyFlag, int Dir);

View File

@@ -33,27 +33,33 @@ Obiekty sortowane wg nazw, mo
void __fastcall ItemRecord::TreeAdd(ItemRecord *r, int c)
{ // 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 zera
// zapisać w (iFlags) ile znaków jest zgodnych z nadrzędnym, żeby nie sprawdzać wszystkich od
// zera
if ((cName[c] && r->cName[c]) ? cName[c] == r->cName[c] : false)
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)
if (!rNext) rNext=r;
else rNext->TreeAdd(r,0); //doczepić do tej gałęzi
if (!rNext)
rNext = r;
else
rNext->TreeAdd(r, 0); // doczepić do tej gałęzi
}
else
{
if (!rPrev) rPrev=r;
else rPrev->TreeAdd(r,0); //doczepić do tej gałęzi
if (!rPrev)
rPrev = r;
else
rPrev->TreeAdd(r, 0); // doczepić do tej gałęzi
}
};
void __fastcall ItemRecord::ListGet(ItemRecord *r, int *&n)
{ // rekurencyjne wypełnianie posortowanej listy na podstawie drzewa
if (rPrev) rPrev->ListGet(r,n); //dodanie wszystkich wcześniejszych
if (rPrev)
rPrev->ListGet(r, n); // dodanie wszystkich wcześniejszych
*n++ = this - r; // dodanie swojego indeksu do tabeli
if (rNext) rNext->ListGet(r,n); //dodanie wszystkich późniejszych
if (rNext)
rNext->ListGet(r, n); // dodanie wszystkich późniejszych
};
void *__fastcall ItemRecord::TreeFind(const char *n)
@@ -68,11 +74,12 @@ ItemRecord* __fastcall ItemRecord::TreeFindRecord(const char *n)
int i = 0;
do
{
if (!n[i]) if (!r->cName[i]) return r; //znaleziony
if (!n[i])
if (!r->cName[i])
return r; // znaleziony
if (n[i] == r->cName[i])
++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
r = r->rPrev; // wcześniejsza gałąź drzewa
@@ -140,7 +147,8 @@ ItemRecord* __fastcall TNames::TreeSet(int *n,int d,int u)
rRecords[n[d]].rPrev = rRecords[n[d]].rNext = NULL;
return rRecords + n[d]; // tej gałęzi nie ma
}
else if (d>u) return NULL;
else if (d > u)
return NULL;
int p = (u + d) >> 1; // połowa
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
@@ -149,9 +157,11 @@ ItemRecord* __fastcall TNames::TreeSet(int *n,int d,int u)
void __fastcall TNames::Sort(int t)
{ // przebudowa drzewa typu (t), zwraca wierzchołek drzewa
if (iLast<3) return; //jak jest mało, to nie ma sensu sortować
if (iLast < 3)
return; // jak jest mało, to nie ma sensu sortować
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ę
rTypes[t]->ListGet(rRecords, q); // drzewo jest już posortowane - zamienić je na listę
rTypes[t] = TreeSet(r, 0, (q - r) - 1);
@@ -164,4 +174,3 @@ ItemRecord* __fastcall TNames::FindRecord(const int t,const char *n)
{ // poszukiwanie rekordu w celu np. zmiany wskaźnika
return rTypes[t] ? rTypes[t]->TreeFindRecord(n) : NULL;
};

11
Names.h
View File

@@ -11,7 +11,8 @@ public:
int iFlags; // flagi bitowe
ItemRecord *rPrev, *rNext; // posortowane drzewo (przebudowywane w razie potrzeby)
union
{void *pData; //wskaŸnik do obiektu
{
void *pData; // wskaŸnik do obiektu
int iData; // albo numer obiektu (tekstury)
unsigned int uData;
};
@@ -38,16 +39,18 @@ public:
int __fastcall Add(int t, const char *n); // dodanie obiektu typu (t)
int __fastcall Add(int t, const char *n, void *d); // dodanie obiektu z wskaŸnikiem
int __fastcall Add(int t, const char *n, int d); // dodanie obiektu z numerem
bool __fastcall Update(int t,const char *n,void *d); //dodanie jeœli nie ma, wymiana (d), gdy jest
bool __fastcall Update(int t, const char *n,
void *d); // dodanie jeœli nie ma, wymiana (d), gdy jest
void __fastcall TreeSet();
ItemRecord *__fastcall TreeSet(int *n, int d, int u);
void __fastcall Sort(int t); // przebudowa drzewa typu (t)
ItemRecord *__fastcall Item(int n); // rekord o numerze (n)
inline void *Find(const int t, const char *n)
{return rTypes[t]?rTypes[t]->TreeFind(n):NULL;};
{
return rTypes[t] ? rTypes[t]->TreeFind(n) : NULL;
};
ItemRecord *__fastcall FindRecord(const int t, const char *n);
// template <typename TOut> inline TOut* Find(const int t,const char *n)
//{return (TOut*)(rTypes[t]->TreeFind(n));};
};
#endif

View File

@@ -38,11 +38,10 @@ __fastcall TRealSound::~TRealSound()
// if (this) if (pSound) pSound->Stop();
}
void __fastcall TRealSound::Free()
{
}
void __fastcall TRealSound::Free() {}
void __fastcall TRealSound::Init(char *SoundName, double DistanceAttenuation, double X, double Y, double Z,bool Dynamic,bool freqmod,double rmin)
void __fastcall TRealSound::Init(char *SoundName, double DistanceAttenuation, double X, double Y,
double Z, bool Dynamic, bool freqmod, double rmin)
{
// Nazwa=SoundName; //to tak raczej nie zadziała, (SoundName) jest tymczasowe
pSound = TSoundsManager::GetFromName(SoundName, Dynamic, &fFrequency);
@@ -50,9 +49,11 @@ void __fastcall TRealSound::Init(char *SoundName, double DistanceAttenuation, do
{
if (freqmod)
if (fFrequency != 22050.0)
{//dla modulowanych nie może być zmiany mnożnika, bo częstotliwość w nagłówku byłą ignorowana, a mogła być inna niż 22050
{ // dla modulowanych nie może być zmiany mnożnika, bo częstotliwość w nagłówku byłą
// ignorowana, a mogła być inna niż 22050
fFrequency = 22050.0;
ErrorLog("Bad sound: "+AnsiString(SoundName)+", as modulated, should have 22.05kHz in header");
ErrorLog("Bad sound: " + AnsiString(SoundName) +
", as modulated, should have 22.05kHz in header");
}
AM = 1.0;
pSound->SetVolume(DSBVOLUME_MIN);
@@ -68,24 +69,30 @@ void __fastcall TRealSound::Init(char *SoundName, double DistanceAttenuation, do
vSoundPosition.x = X;
vSoundPosition.y = Y;
vSoundPosition.z = Z;
if (rmin<0) iDoppler=1; //wyłączenie efektu Dopplera, np. dla dźwięku ptaków
if (rmin < 0)
iDoppler = 1; // wyłączenie efektu Dopplera, np. dla dźwięku ptaków
}
else
dSoundAtt = -1;
};
double __fastcall TRealSound::ListenerDistance(vector3 ListenerPosition)
{
if (dSoundAtt == -1)
{ return 0.0; }
{
return 0.0;
}
else
{ return SquareMagnitude(ListenerPosition-vSoundPosition); }
{
return SquareMagnitude(ListenerPosition - vSoundPosition);
}
}
void __fastcall TRealSound::Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition)
void __fastcall TRealSound::Play(double Volume, int Looping, bool ListenerInside,
vector3 NewPosition)
{
if (!pSound) return;
if (!pSound)
return;
long int vol;
double dS;
// double Distance;
@@ -122,7 +129,8 @@ void __fastcall TRealSound::Play(double Volume, int Looping, bool ListenerInside
// vol=10000*(vol-1);
// int glos=1;
// Volume=Volume*glos; //Ra: whatta hella is this
if (Volume<0.0) Volume=0.0;
if (Volume < 0.0)
Volume = 0.0;
vol = -5000.0 + 5000.0 * Volume;
if (vol >= 0)
vol = -1;
@@ -137,7 +145,8 @@ void __fastcall TRealSound::Play(double Volume, int Looping, bool ListenerInside
/*
// Ra: stara wersja, ale podobno lepsza
pSound->GetStatus(&stat);
if (bLoopPlay) //jeśli zapętlony, to zostanie ponownie włączony, o ile znajdzie się bliżej
if (bLoopPlay) //jeśli zapętlony, to zostanie ponownie włączony, o ile znajdzie się
bliżej
if (stat&DSBSTATUS_PLAYING)
pSound->Stop();
// Ra: wyłączyłem, bo podobno jest gorzej niż wcześniej
@@ -145,14 +154,14 @@ void __fastcall TRealSound::Play(double Volume, int Looping, bool ListenerInside
pSound->SetVolume(DSBVOLUME_MIN); //dlatego lepiej go wyciszyć na czas oddalenia się
pSound->GetStatus(&stat);
if (!(stat&DSBSTATUS_PLAYING))
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
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
*/
}
}
};
void __fastcall TRealSound::Start()
{//włączenie dźwięku
void __fastcall TRealSound::Start(){// włączenie dźwięku
};
@@ -169,7 +178,8 @@ void __fastcall TRealSound::Stop()
}
};
void __fastcall TRealSound::AdjFreq(double Freq, double dt) //McZapkie TODO: dorobic tu efekt Dopplera
void __fastcall TRealSound::AdjFreq(double Freq,
double dt) // McZapkie TODO: dorobic tu efekt Dopplera
// Freq moze byc liczba dodatnia mniejsza od 1 lub wieksza od 1
{
float df, Vlist, Vsrc;
@@ -186,26 +196,27 @@ void __fastcall TRealSound::AdjFreq(double Freq, double dt) //McZapkie TODO: dor
if (Timer::GetSoundTimer())
{
df = fFrequency * df; // TODO - brac czestotliwosc probkowania z wav
pSound->SetFrequency(( df<DSBFREQUENCY_MIN ? DSBFREQUENCY_MIN : (df>DSBFREQUENCY_MAX ? DSBFREQUENCY_MAX : df) ) );
pSound->SetFrequency((df < DSBFREQUENCY_MIN ?
DSBFREQUENCY_MIN :
(df > DSBFREQUENCY_MAX ? DSBFREQUENCY_MAX : df)));
}
}
}
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
if (!pSound) return 0.0;
if (!pSound)
return 0.0;
double WaveTime;
DSBCAPS caps;
caps.dwSize = sizeof(caps);
pSound->GetCaps(&caps);
WaveTime = caps.dwBufferBytes;
return WaveTime/fFrequency; //(pSound->); // wielkosc w bajtach przez czestotliwosc probkowania
return WaveTime /
fFrequency; //(pSound->); // wielkosc w bajtach przez czestotliwosc probkowania
}
void __fastcall TRealSound::SetPan(int Pan)
{
pSound->SetPan(Pan);
}
void __fastcall TRealSound::SetPan(int Pan) { pSound->SetPan(Pan); }
int TRealSound::GetStatus()
{
@@ -225,14 +236,16 @@ void __fastcall TRealSound::ResetPosition()
pSound->SetCurrentPosition(0);
}
void __fastcall TTextSound::Init(char *SoundName,double SoundAttenuation,double X,double Y,double Z,bool Dynamic,bool freqmod,double rmin)
void __fastcall TTextSound::Init(char *SoundName, double SoundAttenuation, double X, double Y,
double Z, bool Dynamic, bool freqmod, double rmin)
{ // dodatkowo doczytuje plik tekstowy
TRealSound::Init(SoundName, SoundAttenuation, X, Y, Z, Dynamic, freqmod, rmin);
fTime = GetWaveTime();
AnsiString txt = AnsiString(SoundName);
txt.Delete(txt.Length() - 3, 4); // obcięcie rozszerzenia
for (int i = txt.Length(); i > 0; --i)
if (txt[i]=='/') txt[i]='\\'; //bo nie rozumi
if (txt[i] == '/')
txt[i] = '\\'; // bo nie rozumi
txt += "-" + Global::asLang + ".txt"; // już może być w różnych językach
if (!FileExists(txt))
txt = "sounds\\" + txt; //ścieżka może nie być podana
@@ -244,7 +257,8 @@ void __fastcall TTextSound::Init(char *SoundName,double SoundAttenuation,double
delete ts;
}
};
void __fastcall TTextSound::Play(double Volume,int Looping,bool ListenerInside,vector3 NewPosition)
void __fastcall TTextSound::Play(double Volume, int Looping, bool ListenerInside,
vector3 NewPosition)
{
if (!asText.IsEmpty())
{ // jeśli ma powiązany tekst
@@ -274,4 +288,3 @@ void __fastcall TTextSound::Play(double Volume,int Looping,bool ListenerInside,v
//---------------------------------------------------------------------------
#pragma package(smart_init)

View File

@@ -24,7 +24,8 @@ public:
__fastcall TRealSound();
__fastcall ~TRealSound();
void __fastcall Free();
void __fastcall Init(char *SoundName,double SoundAttenuation,double X,double Y,double Z,bool Dynamic,bool freqmod=false,double rmin=0.0);
void __fastcall Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z,
bool Dynamic, bool freqmod = false, double rmin = 0.0);
double __fastcall ListenerDistance(vector3 ListenerPosition);
void __fastcall Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition);
void __fastcall Start();
@@ -42,7 +43,8 @@ class TTextSound : public TRealSound
AnsiString asText;
float fTime; // czas trwania
public:
void __fastcall Init(char *SoundName,double SoundAttenuation,double X,double Y,double Z,bool Dynamic,bool freqmod=false,double rmin=0.0);
void __fastcall Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z,
bool Dynamic, bool freqmod = false, double rmin = 0.0);
void __fastcall Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition);
};
@@ -58,9 +60,9 @@ class TSynthSound
// 42 - indeksy początkowe dla "odjazd"
// 43 - indeksy początkowe dla "gotó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 od..do?
// a może zamiast wielu plików/dźwięków zrobić jeden połączony plik i posługiwać się czasem
// od..do?
};
//---------------------------------------------------------------------------
#endif

View File

@@ -8,10 +8,7 @@ double ResourceManager::_expiry = 5.0f;
double ResourceManager::_lastUpdate = 0.0f;
double ResourceManager::_lastReport = 0.0f;
void ResourceManager::Register(Resource* resource)
{
_resources.push_back(resource);
};
void ResourceManager::Register(Resource *resource) { _resources.push_back(resource); };
void ResourceManager::Unregister(Resource *resource)
{
@@ -27,10 +24,7 @@ class ResourceExpired
{
public:
ResourceExpired(double time) : _time(time){};
bool operator()(Resource* resource)
{
return (resource->GetLastUsage() < _time);
}
bool operator()(Resource *resource) { return (resource->GetLastUsage() < _time); }
private:
double _time;
@@ -42,7 +36,8 @@ void ResourceManager::Sweep(double currentTime)
if (currentTime - _lastUpdate < _expiry)
return;
Resources::iterator begin = std::remove_if(_resources.begin(), _resources.end(), ResourceExpired(currentTime - _expiry));
Resources::iterator begin = std::remove_if(_resources.begin(), _resources.end(),
ResourceExpired(currentTime - _expiry));
#ifdef RESOURCE_REPORTING
if (begin != _resources.end())
@@ -74,5 +69,4 @@ void ResourceManager::Sweep(double currentTime)
#endif
_lastUpdate = currentTime;
};

View File

@@ -18,7 +18,6 @@ protected:
private:
double _lastUsage;
};
class ResourceManager
@@ -39,7 +38,6 @@ private:
static double _lastReport;
static Resources _resources;
};
#endif

View File

@@ -34,37 +34,29 @@ __fastcall TSegment::TSegment(TTrack *owner)
pOwner = owner;
};
__fastcall TSegment::~TSegment()
{
SafeDeleteArray(fTsBuffer);
};
__fastcall TSegment::~TSegment() { SafeDeleteArray(fTsBuffer); };
bool __fastcall TSegment::Init(
vector3 NewPoint1,vector3 NewPoint2,double fNewStep,
bool __fastcall TSegment::Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep,
double fNewRoll1, double fNewRoll2)
{ // wersja dla prostego - wyliczanie punktów kontrolnych
vector3 dir;
if (fNewRoll1 == fNewRoll2)
{ // faktyczny prosty
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);
}
else
{ // 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
return TSegment::Init(
NewPoint1,NewPoint1+dir,NewPoint2-dir,NewPoint2,
fNewStep,fNewRoll1,fNewRoll2,
true);
return TSegment::Init(NewPoint1, NewPoint1 + dir, NewPoint2 - dir, NewPoint2, fNewStep,
fNewRoll1, fNewRoll2, true);
}
};
bool __fastcall TSegment::Init(
vector3 &NewPoint1,vector3 NewCPointOut,vector3 NewCPointIn,vector3 &NewPoint2,
double fNewStep,double fNewRoll1, double fNewRoll2, bool bIsCurve)
bool __fastcall TSegment::Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointIn,
vector3 &NewPoint2, double fNewStep, double fNewRoll1,
double fNewRoll2, bool bIsCurve)
{ // wersja uniwersalna (dla krzywej i prostego)
Point1 = NewPoint1;
CPointOut = NewCPointOut;
@@ -86,19 +78,22 @@ bool __fastcall TSegment::Init(
{ // tylko jeśli jest przechyłka
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
if (bCurve) CPointOut.y+=w1; //prosty ma wektory jednostkowe
if (bCurve)
CPointOut.y += w1; // prosty ma wektory jednostkowe
pOwner->MovedUp1(w1); // zwrócić trzeba informację o podwyższeniu podsypki
}
if (fRoll2 != 0.0)
{
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
if (bCurve) CPointIn.y+=w2; //prosty ma wektory jednostkowe
if (bCurve)
CPointIn.y += w2; // prosty ma wektory jednostkowe
// zwrócić trzeba informację o podwyższeniu podsypki
}
}
// Ra: ten kąt jeszcze do przemyślenia jest
fDirection=-atan2(Point2.x-Point1.x,Point2.z-Point1.z); //kąt w planie, żeby nie liczyć wielokrotnie
fDirection = -atan2(Point2.x - Point1.x,
Point2.z - Point1.z); // kąt w planie, żeby nie liczyć wielokrotnie
bCurve = bIsCurve;
if (bCurve)
{ // przeliczenie współczynników wielomianu, będzie mniej mnożeń i można policzyć pochodne
@@ -116,7 +111,8 @@ bool __fastcall TSegment::Init(
// MessageBox(0,"Length<=0","TSegment::Init",MB_OK);
return false; // zerowe nie mogą być
}
fStoop=atan2((Point2.y-Point1.y),fLength); //pochylenie toru prostego, żeby nie liczyć wielokrotnie
fStoop = atan2((Point2.y - Point1.y),
fLength); // pochylenie toru prostego, żeby nie liczyć wielokrotnie
SafeDeleteArray(fTsBuffer);
if ((bCurve) && (fStep > 0))
{ // Ra: prosty dostanie podział, jak ma różną przechyłkę na końcach
@@ -130,7 +126,8 @@ bool __fastcall TSegment::Init(
{
i++;
s += fStep;
if (s>fLength) s=fLength;
if (s > fLength)
s = fLength;
fTsBuffer[i] = GetTFromS(s);
}
}
@@ -143,7 +140,6 @@ bool __fastcall TSegment::Init(
return true;
}
vector3 __fastcall TSegment::GetFirstDerivative(double fTime)
{
@@ -171,7 +167,8 @@ double __fastcall TSegment::RombergIntegral(double fA, double fB)
double ms_apfRom[2][ms_iOrder];
ms_apfRom[0][0] = 0.5*fH*((GetFirstDerivative(fA).Length())+(GetFirstDerivative(fB).Length()));
ms_apfRom[0][0] =
0.5 * fH * ((GetFirstDerivative(fA).Length()) + (GetFirstDerivative(fB).Length()));
for (int i0 = 2, iP0 = 1; i0 <= ms_iOrder; i0++, iP0 *= 2, fH *= 0.5)
{
// approximations via the trapezoid rule
@@ -184,8 +181,7 @@ double __fastcall TSegment::RombergIntegral(double fA, double fB)
ms_apfRom[1][0] = 0.5 * (ms_apfRom[0][0] + fH * fSum);
for (int i2 = 1, iP2 = 4; i2 < i0; i2++, iP2 *= 4)
{
ms_apfRom[1][i2] =
(iP2*ms_apfRom[1][i2-1] - ms_apfRom[0][i2-1])/(iP2-1);
ms_apfRom[1][i2] = (iP2 * ms_apfRom[1][i2 - 1] - ms_apfRom[0][i2 - 1]) / (iP2 - 1);
}
for (i1 = 0; i1 < i0; i1++)
@@ -225,7 +221,6 @@ double __fastcall TSegment::GetTFromS(double s)
// Newton's method failed. If this happens, increase iterations or
// tolerance or integration accuracy.
// return -1; //Ra: tu nigdy nie dojdzie
};
vector3 __fastcall TSegment::RaInterpolate(double t)
@@ -241,7 +236,8 @@ vector3 __fastcall TSegment::RaInterpolate0(double t)
double __fastcall TSegment::ComputeLength() // McZapkie-150503: dlugosc miedzy punktami krzywej
{ // obliczenie długości krzywej Beziera za pomocą interpolacji odcinkami
// 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 poprzedniej
// Ra: koniec rekurencji jeśli po podziale suma długości nie różni się więcej niż 0.5mm od
// poprzedniej
// Ra: ewentualnie rozpoznać łuk okręgu płaskiego i liczyć ze wzoru na długość łuku
double t, l = 0;
vector3 last = vector3(0, 0, 0); // długość liczona po przesunięciu odcinka do początku układu
@@ -307,7 +303,8 @@ void __fastcall TSegment::RaPositionGet(double fDistance,vector3 &p,vector3 &a)
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
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,t*(t*3.0*vA.z+vB.z+vB.z)+vC.z); //kierunek krzywej w planie
a.z = -atan2(t * (t * 3.0 * vA.x + vB.x + vB.x) + vC.x,
t * (t * 3.0 * vA.z + vB.z + vB.z) + vC.z); // kierunek krzywej w planie
}
else
{ // wyliczenie dla odcinka prostego jest prostsze
@@ -319,7 +316,6 @@ void __fastcall TSegment::RaPositionGet(double fDistance,vector3 &p,vector3 &a)
}
};
vector3 __fastcall TSegment::FastGetPoint(double t)
{
// return (bCurve?Interpolate(t,Point1,CPointOut,CPointIn,Point2):((1.0-t)*Point1+(t)*Point2));
@@ -327,13 +323,15 @@ vector3 __fastcall TSegment::FastGetPoint(double t)
}
void __fastcall TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints,
double fTextureLength, int iSkip, int iQualityFactor,vector3 **p,bool bRender)
double fTextureLength, int iSkip, int iQualityFactor,
vector3 **p, bool bRender)
{ // generowanie trójkątów dla odcinka trajektorii ruchu
// standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku
// po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli
// podany jest przekrój końcowy
// podsypka toru jest robiona za pomocą 6 punktów, szyna 12, drogi i rzeki na 3+2+3
if (iQualityFactor<1) iQualityFactor= 1; //co który segment ma być uwzględniony
if (iQualityFactor < 1)
iQualityFactor = 1; // co który segment ma być uwzględniony
vector3 pos1, pos2, dir, parallel1, parallel2, pt, norm;
double s, step, fOffset, tv1, tv2, t;
int i, j;
@@ -356,22 +354,27 @@ void __fastcall TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePo
dir = FastGetDirection(t, fOffset); // wektor kierunku
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //wektor poprzeczny
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
m2=s/fLength; jmm2=1.0-m2;
m2 = s / fLength;
jmm2 = 1.0 - m2;
while (s < fLength)
{
// step=SquareMagnitude(Global::GetCameraPosition()+pos);
i += iQualityFactor; // kolejny punkt łamanej
s += step; // końcowa pozycja segmentu [m]
m1=m2; jmm1=jmm2; //stara pozycja
m2=s/fLength; jmm2=1.0-m2; //nowa pozycja
m1 = m2;
jmm1 = jmm2; // stara pozycja
m2 = s / fLength;
jmm2 = 1.0 - m2; // nowa pozycja
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...
step -= (s - fLength); // jeszcze do wyliczenia mapowania potrzebny
s = fLength;
i = iSegCount; // 20/5 ma dawać 4
m2=1.0; jmm2=0.0;
m2 = 1.0;
jmm2 = 0.0;
}
while (tv1<0.0) tv1+=1.0; //przestawienie mapowania
while (tv1 < 0.0)
tv1 += 1.0; // przestawienie mapowania
tv2 = tv1 - step / fTextureLength; // mapowanie na końcu segmentu
t = fTsBuffer[i]; // szybsze od GetTFromS(s);
pos2 = FastGetPoint(t);
@@ -382,36 +385,52 @@ void __fastcall TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePo
if (trapez)
for (j = 0; j < iNumShapePoints; j++)
{
norm=(jmm1*ShapePoints[j].n.x+m1*ShapePoints[j+iNumShapePoints].n.x)*parallel1;
norm = (jmm1 * ShapePoints[j].n.x + m1 * ShapePoints[j + iNumShapePoints].n.x) *
parallel1;
norm.y += jmm1 * ShapePoints[j].n.y + m1 * ShapePoints[j + iNumShapePoints].n.y;
pt=parallel1*(jmm1*ShapePoints[j].x+m1*ShapePoints[j+iNumShapePoints].x)+pos1;
pt = parallel1 *
(jmm1 * ShapePoints[j].x + m1 * ShapePoints[j + iNumShapePoints].x) +
pos1;
pt.y += jmm1 * ShapePoints[j].y + m1 * ShapePoints[j + iNumShapePoints].y;
if (bRender)
{//skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale potrzebować punktów
{ // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale
// potrzebować punktów
glNormal3f(norm.x, norm.y, norm.z);
glTexCoord2f(jmm1*ShapePoints[j].z+m1*ShapePoints[j+iNumShapePoints].z,tv1);
glTexCoord2f(
jmm1 * ShapePoints[j].z + m1 * ShapePoints[j + iNumShapePoints].z, tv1);
glVertex3f(pt.x, pt.y, pt.z); // pt nie mamy gdzie zapamiętać?
}
if (p) // jeśli jest wskaźnik do tablicy
if (*p)
if (!j) // to dla pierwszego punktu
{*(*p)=pt; (*p)++;} //zapamiętanie brzegu jezdni
{
*(*p) = pt;
(*p)++;
} // zapamiętanie brzegu jezdni
// dla trapezu drugi koniec ma inne współrzędne
norm=(jmm1*ShapePoints[j].n.x+m1*ShapePoints[j+iNumShapePoints].n.x)*parallel2;
norm = (jmm1 * ShapePoints[j].n.x + m1 * ShapePoints[j + iNumShapePoints].n.x) *
parallel2;
norm.y += jmm1 * ShapePoints[j].n.y + m1 * ShapePoints[j + iNumShapePoints].n.y;
pt=parallel2*(jmm2*ShapePoints[j].x+m2*ShapePoints[j+iNumShapePoints].x)+pos2;
pt = parallel2 *
(jmm2 * ShapePoints[j].x + m2 * ShapePoints[j + iNumShapePoints].x) +
pos2;
pt.y += jmm2 * ShapePoints[j].y + m2 * ShapePoints[j + iNumShapePoints].y;
if (bRender)
{//skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale potrzebować punktów
{ // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale
// potrzebować punktów
glNormal3f(norm.x, norm.y, norm.z);
glTexCoord2f(jmm2*ShapePoints[j].z+m2*ShapePoints[j+iNumShapePoints].z,tv2);
glTexCoord2f(
jmm2 * ShapePoints[j].z + m2 * ShapePoints[j + iNumShapePoints].z, tv2);
glVertex3f(pt.x, pt.y, pt.z);
}
if (p) // jeśli jest wskaźnik do tablicy
if (*p)
if (!j) // to dla pierwszego punktu
if (i == iSegCount)
{*(*p)=pt; (*p)++;} //zapamiętanie brzegu jezdni
{
*(*p) = pt;
(*p)++;
} // zapamiętanie brzegu jezdni
}
else
for (j = 0; j < iNumShapePoints; j++)
@@ -485,7 +504,8 @@ void __fastcall TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePo
};
void __fastcall TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *ShapePoints2,
int iNumShapePoints,double fTextureLength, int iSkip, double fOffsetX)
int iNumShapePoints, double fTextureLength, int iSkip,
double fOffsetX)
{ // tworzenie siatki trójkątów dla iglicy
vector3 pos1, pos2, dir, parallel1, parallel2, pt;
double a1, a2, s, step, offset, tv1, tv2, t, t2, t2step, oldt2, sp, oldsp;
@@ -509,7 +529,6 @@ void __fastcall TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const ve
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //poprzeczny?
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
while (s < fLength && i < iSkip)
{
// step= SquareMagnitude(Global::GetCameraPosition()+pos);
@@ -523,7 +542,8 @@ void __fastcall TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const ve
s = fLength;
}
while (tv1<0.0) tv1+=1.0;
while (tv1 < 0.0)
tv1 += 1.0;
tv2 = tv1 - step / fTextureLength;
t = fTsBuffer[i];
@@ -536,13 +556,17 @@ void __fastcall TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const ve
glBegin(GL_TRIANGLE_STRIP);
for (j = 0; j < iNumShapePoints; j++)
{ // po dwa punkty trapezu
pt= parallel1*(ShapePoints1[j].x*a1+(ShapePoints2[j].x-fOffsetX)*(1.0-a1))+pos1;
pt = parallel1 *
(ShapePoints1[j].x * a1 + (ShapePoints2[j].x - fOffsetX) * (1.0 - a1)) +
pos1;
pt.y += ShapePoints1[j].y * a1 + ShapePoints2[j].y * (1.0 - a1);
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(ShapePoints1[j].z * a1 + ShapePoints2[j].z * (1.0 - a1), tv1);
glVertex3f(pt.x, pt.y, pt.z);
pt= parallel2*(ShapePoints1[j].x*a2+(ShapePoints2[j].x-fOffsetX)*(1.0-a2))+pos2;
pt = parallel2 *
(ShapePoints1[j].x * a2 + (ShapePoints2[j].x - fOffsetX) * (1.0 - a2)) +
pos2;
pt.y += ShapePoints1[j].y * a2 + ShapePoints2[j].y * (1.0 - a2);
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(ShapePoints1[j].z * a2 + ShapePoints2[j].z * (1.0 - a2), tv2);
@@ -581,7 +605,8 @@ void __fastcall TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const ve
s = fLength;
}
while (tv1<0.0) tv1+=1.0;
while (tv1 < 0.0)
tv1 += 1.0;
tv2 = tv1 - step / fTextureLength;
@@ -592,13 +617,17 @@ void __fastcall TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const ve
glBegin(GL_TRIANGLE_STRIP);
for (j = 0; j < iNumShapePoints; j++)
{
pt= parallel1*(ShapePoints1[j].x*a1+(ShapePoints2[j].x-fOffsetX)*(1.0-a1))+pos1;
pt = parallel1 *
(ShapePoints1[j].x * a1 + (ShapePoints2[j].x - fOffsetX) * (1.0 - a1)) +
pos1;
pt.y += ShapePoints1[j].y * a1 + ShapePoints2[j].y * (1.0 - a1);
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f((ShapePoints1[j].z), tv1);
glVertex3f(pt.x, pt.y, pt.z);
pt= parallel1*(ShapePoints1[j].x*a2+(ShapePoints2[j].x-fOffsetX)*(1.0-a2))+pos2;
pt = parallel1 *
(ShapePoints1[j].x * a2 + (ShapePoints2[j].x - fOffsetX) * (1.0 - a2)) +
pos2;
pt.y += ShapePoints1[j].y * a2 + ShapePoints2[j].y * (1.0 - a2);
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(ShapePoints2[j].z, tv2);
@@ -658,13 +687,11 @@ void __fastcall TSegment::Render()
glVertex3f(Point2.x + CPointIn.x, Point2.y + CPointIn.y, Point2.z + CPointIn.z);
glEnd();
}
}
void __fastcall TSegment::RaRenderLoft(
CVertNormTex* &Vert,const vector6 *ShapePoints,
int iNumShapePoints,double fTextureLength,int iSkip,int iEnd,double fOffsetX)
void __fastcall TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints,
int iNumShapePoints, double fTextureLength, int iSkip,
int iEnd, double fOffsetX)
{ // generowanie trójkątów dla odcinka trajektorii ruchu
// standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku
// po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli
@@ -691,23 +718,29 @@ void __fastcall TSegment::RaRenderLoft(
dir = FastGetDirection(t, fOffset); // wektor kierunku
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //wektor prostopadły
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
if (iEnd==0) iEnd=iSegCount;
if (iEnd == 0)
iEnd = iSegCount;
fEnd = fLength * double(iEnd) / double(iSegCount);
m2=s/fEnd; jmm2=1.0-m2;
m2 = s / fEnd;
jmm2 = 1.0 - m2;
while (i < iEnd)
{
++i; // kolejny punkt łamanej
s += step; // końcowa pozycja segmentu [m]
m1=m2; jmm1=jmm2; //stara pozycja
m2=s/fEnd; jmm2=1.0-m2; //nowa pozycja
m1 = m2;
jmm1 = jmm2; // stara pozycja
m2 = s / fEnd;
jmm2 = 1.0 - m2; // nowa pozycja
if (i == iEnd)
{ // gdy przekroczyliśmy koniec - stąd dziury w torach...
step -= (s - fEnd); // jeszcze do wyliczenia mapowania potrzebny
s = fEnd;
// i=iEnd; //20/5 ma dawać 4
m2=1.0; jmm2=0.0;
m2 = 1.0;
jmm2 = 0.0;
}
while (tv1<0.0) tv1+=1.0;
while (tv1 < 0.0)
tv1 += 1.0;
tv2 = tv1 - step / fTextureLength; // mapowanie na końcu segmentu
t = fTsBuffer[i]; // szybsze od GetTFromS(s);
pos2 = FastGetPoint(t);
@@ -717,28 +750,38 @@ void __fastcall TSegment::RaRenderLoft(
if (trapez)
for (j = 0; j < iNumShapePoints; j++)
{ // współrzędne początku
norm=(jmm1*ShapePoints[j].n.x+m1*ShapePoints[j+iNumShapePoints].n.x)*parallel1;
norm = (jmm1 * ShapePoints[j].n.x + m1 * ShapePoints[j + iNumShapePoints].n.x) *
parallel1;
norm.y += jmm1 * ShapePoints[j].n.y + m1 * ShapePoints[j + iNumShapePoints].n.y;
pt=parallel1*(jmm1*(ShapePoints[j].x-fOffsetX)+m1*ShapePoints[j+iNumShapePoints].x)+pos1;
pt = parallel1 * (jmm1 * (ShapePoints[j].x - fOffsetX) +
m1 * ShapePoints[j + iNumShapePoints].x) +
pos1;
pt.y += jmm1 * ShapePoints[j].y + m1 * ShapePoints[j + iNumShapePoints].y;
Vert->nx = norm.x; // niekoniecznie tak
Vert->ny = norm.y;
Vert->nz = norm.z;
Vert->u = jmm1 * ShapePoints[j].z + m1 * ShapePoints[j + iNumShapePoints].z;
Vert->v = tv1;
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na początku odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na początku odcinka
Vert++;
// dla trapezu drugi koniec ma inne współrzędne względne
norm=(jmm1*ShapePoints[j].n.x+m1*ShapePoints[j+iNumShapePoints].n.x)*parallel2;
norm = (jmm1 * ShapePoints[j].n.x + m1 * ShapePoints[j + iNumShapePoints].n.x) *
parallel2;
norm.y += jmm1 * ShapePoints[j].n.y + m1 * ShapePoints[j + iNumShapePoints].n.y;
pt=parallel2*(jmm2*(ShapePoints[j].x-fOffsetX)+m2*ShapePoints[j+iNumShapePoints].x)+pos2;
pt = parallel2 * (jmm2 * (ShapePoints[j].x - fOffsetX) +
m2 * ShapePoints[j + iNumShapePoints].x) +
pos2;
pt.y += jmm2 * ShapePoints[j].y + m2 * ShapePoints[j + iNumShapePoints].y;
Vert->nx = norm.x; // niekoniecznie tak
Vert->ny = norm.y;
Vert->nz = norm.z;
Vert->u = jmm2 * ShapePoints[j].z + m2 * ShapePoints[j + iNumShapePoints].z;
Vert->v = tv2;
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na końcu odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na końcu odcinka
Vert++;
}
else
@@ -753,7 +796,9 @@ void __fastcall TSegment::RaRenderLoft(
Vert->nz = norm.z;
Vert->u = ShapePoints[j].z;
Vert->v = tv1;
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na początku odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na początku odcinka
Vert++;
norm = ShapePoints[j].n.x * parallel2;
norm.y += ShapePoints[j].n.y;
@@ -764,7 +809,9 @@ void __fastcall TSegment::RaRenderLoft(
Vert->nz = norm.z;
Vert->u = ShapePoints[j].z;
Vert->v = tv2;
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na końcu odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na końcu odcinka
Vert++;
}
pos1 = pos2;
@@ -791,19 +838,24 @@ void __fastcall TSegment::RaRenderLoft(
Vert->nz = norm.z;
Vert->u = ShapePoints[j].z;
Vert->v = 0;
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na początku odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na początku odcinka
Vert++;
// dla trapezu drugi koniec ma inne współrzędne
norm = ShapePoints[j + iNumShapePoints].n.x * parallel1;
norm.y += ShapePoints[j + iNumShapePoints].n.y;
pt=parallel1*(ShapePoints[j+iNumShapePoints].x-fOffsetX)+pos2; //odsunięcie
pt = parallel1 * (ShapePoints[j + iNumShapePoints].x - fOffsetX) +
pos2; // odsunięcie
pt.y += ShapePoints[j + iNumShapePoints].y; // wysokość
Vert->nx = norm.x; // niekoniecznie tak
Vert->ny = norm.y;
Vert->nz = norm.z;
Vert->u = ShapePoints[j + iNumShapePoints].z;
Vert->v = fLength / fTextureLength;
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na końcu odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na końcu odcinka
Vert++;
}
else
@@ -818,7 +870,9 @@ void __fastcall TSegment::RaRenderLoft(
Vert->nz = norm.z;
Vert->u = ShapePoints[j].z;
Vert->v = 0;
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na początku odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na początku odcinka
Vert++;
pt = parallel1 * (ShapePoints[j].x - fOffsetX) + pos2;
pt.y += ShapePoints[j].y;
@@ -827,15 +881,17 @@ void __fastcall TSegment::RaRenderLoft(
Vert->nz = norm.z;
Vert->u = ShapePoints[j].z;
Vert->v = fLength / fTextureLength;
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na końcu odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na końcu odcinka
Vert++;
}
}
};
void __fastcall TSegment::RaAnimate(
CVertNormTex* &Vert,const vector6 *ShapePoints,
int iNumShapePoints,double fTextureLength,int iSkip,int iEnd,double fOffsetX)
void __fastcall TSegment::RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints,
int iNumShapePoints, double fTextureLength, int iSkip, int iEnd,
double fOffsetX)
{ // jak wyżej, tylko z pominięciem mapowania i braku trapezowania
vector3 pos1, pos2, dir, parallel1, parallel2, pt;
double s, step, fOffset, t, fEnd;
@@ -854,21 +910,26 @@ void __fastcall TSegment::RaAnimate(
dir = FastGetDirection(t, fOffset); // wektor kierunku
// parallel1=Normalize(CrossProduct(dir,vector3(0,1,0))); //wektor prostopadły
parallel1 = Normalize(vector3(-dir.z, 0.0, dir.x)); // wektor poprzeczny
if (iEnd==0) iEnd=iSegCount;
if (iEnd == 0)
iEnd = iSegCount;
fEnd = fLength * double(iEnd) / double(iSegCount);
m2=s/fEnd; jmm2=1.0-m2;
m2 = s / fEnd;
jmm2 = 1.0 - m2;
while (i < iEnd)
{
++i; // kolejny punkt łamanej
s += step; // końcowa pozycja segmentu [m]
m1=m2; jmm1=jmm2; //stara pozycja
m2=s/fEnd; jmm2=1.0-m2; //nowa pozycja
m1 = m2;
jmm1 = jmm2; // stara pozycja
m2 = s / fEnd;
jmm2 = 1.0 - m2; // nowa pozycja
if (i == iEnd)
{ // gdy przekroczyliśmy koniec - stąd dziury w torach...
step -= (s - fEnd); // jeszcze do wyliczenia mapowania potrzebny
s = fEnd;
// i=iEnd; //20/5 ma dawać 4
m2=1.0; jmm2=0.0;
m2 = 1.0;
jmm2 = 0.0;
}
t = fTsBuffer[i]; // szybsze od GetTFromS(s);
pos2 = FastGetPoint(t);
@@ -878,14 +939,22 @@ void __fastcall TSegment::RaAnimate(
if (trapez)
for (j = 0; j < iNumShapePoints; j++)
{ // współrzędne początku
pt=parallel1*(jmm1*(ShapePoints[j].x-fOffsetX)+m1*ShapePoints[j+iNumShapePoints].x)+pos1;
pt = parallel1 * (jmm1 * (ShapePoints[j].x - fOffsetX) +
m1 * ShapePoints[j + iNumShapePoints].x) +
pos1;
pt.y += jmm1 * ShapePoints[j].y + m1 * ShapePoints[j + iNumShapePoints].y;
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na początku odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na początku odcinka
Vert++;
// dla trapezu drugi koniec ma inne współrzędne
pt=parallel2*(jmm2*(ShapePoints[j].x-fOffsetX)+m2*ShapePoints[j+iNumShapePoints].x)+pos2;
pt = parallel2 * (jmm2 * (ShapePoints[j].x - fOffsetX) +
m2 * ShapePoints[j + iNumShapePoints].x) +
pos2;
pt.y += jmm2 * ShapePoints[j].y + m2 * ShapePoints[j + iNumShapePoints].y;
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na końcu odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na końcu odcinka
Vert++;
}
pos1 = pos2;
@@ -904,15 +973,18 @@ void __fastcall TSegment::RaAnimate(
{
pt = parallel1 * (ShapePoints[j].x - fOffsetX) + pos1;
pt.y += ShapePoints[j].y;
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na początku odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na początku odcinka
Vert++;
pt=parallel1*(ShapePoints[j+iNumShapePoints].x-fOffsetX)+pos2; //odsunięcie
pt = parallel1 * (ShapePoints[j + iNumShapePoints].x - fOffsetX) +
pos2; // odsunięcie
pt.y += ShapePoints[j + iNumShapePoints].y; // wysokość
Vert->x=pt.x; Vert->y=pt.y; Vert->z=pt.z; //punkt na końcu odcinka
Vert->x = pt.x;
Vert->y = pt.y;
Vert->z = pt.z; // punkt na końcu odcinka
Vert++;
}
}
};
//---------------------------------------------------------------------------

View File

@@ -16,12 +16,29 @@ class vector6 : public vector3
public:
vector3 n;
__fastcall vector6()
{x=y=z=n.x=n.z=0.0; n.y=1.0;};
{
x = y = z = n.x = n.z = 0.0;
n.y = 1.0;
};
__fastcall vector6(double a, double b, double c, double d, double e, double f)
//{x=a; y=b; z=c; n.x=d; n.y=e; n.z=f;};
{x=a; y=b; z=c; n.x=0.0; n.y=1.0; n.z=0.0;}; //Ra: bo na razie s¹ z tym problemy
{
x = a;
y = b;
z = c;
n.x = 0.0;
n.y = 1.0;
n.z = 0.0;
}; // Ra: bo na razie s¹ z tym problemy
__fastcall vector6(double a, double b, double c)
{x=a; y=b; z=c; n.x=0.0; n.y=1.0; n.z=0.0;};
{
x = a;
y = b;
z = c;
n.x = 0.0;
n.y = 1.0;
n.z = 0.0;
};
};
class TSegment
@@ -49,14 +66,15 @@ private:
// int iNeightbour[2]; //do którego koñca doczepiony
public:
bool bCurve;
//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)
// 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)
__fastcall TSegment(TTrack *owner);
__fastcall ~TSegment();
bool __fastcall Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep,
double fNewRoll1 = 0, double fNewRoll2 = 0);
bool __fastcall Init(vector3 &NewPoint1,vector3 NewCPointOut,
vector3 NewCPointIn,vector3 &NewPoint2,double fNewStep,
double fNewRoll1=0,double fNewRoll2=0,bool bIsCurve=true);
bool __fastcall Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointIn,
vector3 &NewPoint2, double fNewStep, double fNewRoll1 = 0,
double fNewRoll2 = 0, bool bIsCurve = true);
inline double __fastcall ComputeLength(); // McZapkie-150503
inline vector3 __fastcall GetDirection1() { return bCurve ? CPointOut - Point1 : CPointOut; };
inline vector3 __fastcall GetDirection2() { return bCurve ? CPointIn - Point2 : CPointIn; };
@@ -75,27 +93,34 @@ public:
}
void __fastcall GetRolls(double &r1, double &r2)
{ // pobranie przechy³ek (do generowania trójk¹tów)
r1=fRoll1; r2=fRoll2;
r1 = fRoll1;
r2 = fRoll2;
}
void __fastcall RenderLoft(const vector6 *ShapePoints, int iNumShapePoints,
double fTextureLength,int iSkip=0,int iQualityFactor=1,vector3 **p=NULL,bool bRender=true);
double fTextureLength, int iSkip = 0, int iQualityFactor = 1,
vector3 **p = NULL, bool bRender = true);
void __fastcall RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *ShapePoints2,
int iNumShapePoints,double fTextureLength,int iSkip=0,double fOffsetX=0.0f);
int iNumShapePoints, double fTextureLength, int iSkip = 0,
double fOffsetX = 0.0f);
void __fastcall Render();
inline double __fastcall GetLength() { return fLength; };
void __fastcall MoveMe(vector3 pPosition)
{Point1+=pPosition;
{
Point1 += pPosition;
Point2 += pPosition;
if (bCurve)
{CPointIn+=pPosition;
{
CPointIn += pPosition;
CPointOut += pPosition;
}
}
int __fastcall RaSegCount() { return fTsBuffer ? iSegCount : 1; };
void __fastcall RaRenderLoft(CVertNormTex* &Vert,const vector6 *ShapePoints,int iNumShapePoints,
double fTextureLength,int iSkip=0,int iEnd=0,double fOffsetX=0.0);
void __fastcall RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints,
int iNumShapePoints, double fTextureLength, int iSkip = 0,
int iEnd = 0, double fOffsetX = 0.0);
void __fastcall RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints,
double fTextureLength,int iSkip=0,int iEnd=0,double fOffsetX=0.0);
double fTextureLength, int iSkip = 0, int iEnd = 0,
double fOffsetX = 0.0);
void __fastcall AngleSet(int i, double a) { fAngle[i] = a; };
void __fastcall Rollment(double w1, double w2); // poprawianie przechy³ki
};

View File

@@ -9,7 +9,14 @@
#include "Usefull.h"
#include "Globals.h"
//#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
#define SAFE_RELEASE(p) \
{ \
if (p) \
{ \
(p)->Release(); \
(p) = NULL; \
} \
}
char Directory[] = "sounds\\";
@@ -19,8 +26,8 @@ LPDIRECTSOUNDNOTIFY TSoundsManager::pDSNotify;
int TSoundsManager::Count = 0;
TSoundContainer *TSoundsManager::First = NULL;
__fastcall TSoundContainer::TSoundContainer( LPDIRECTSOUND pDS, char *Directory, char *strFileName, int NConcurrent)
__fastcall TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFileName,
int NConcurrent)
{ // wczytanie pliku dŸwiêkowego
int hr = 111;
DSBuffer = NULL; // na pocz¹tek, gdyby uruchomiæ dŸwiêków siê nie uda³o
@@ -35,7 +42,6 @@ __fastcall TSoundContainer::TSoundContainer( LPDIRECTSOUND pDS, char *Directory,
CWaveSoundRead *pWaveSoundRead;
// Create a new wave file class
pWaveSoundRead = new CWaveSoundRead();
@@ -78,10 +84,8 @@ __fastcall TSoundContainer::TSoundContainer( LPDIRECTSOUND pDS, char *Directory,
dwBufferBytes = dsbd.dwBufferBytes;
//----------------------------------------------------------
BYTE *pbWavData; // Pointer to actual wav data
UINT cbWavSize; // Size of data
VOID *pbData = NULL;
@@ -98,9 +102,7 @@ __fastcall TSoundContainer::TSoundContainer( LPDIRECTSOUND pDS, char *Directory,
return; // E_OUTOFMEMORY;
// if (FAILED(hr=pWaveSoundRead->Read( nWaveFileSize,pbWavData,&cbWavSize)))
if( FAILED( hr = pWaveSoundRead->Read( nWaveFileSize,
pbWavData,
&cbWavSize ) ) )
if (FAILED(hr = pWaveSoundRead->Read(nWaveFileSize, pbWavData, &cbWavSize)))
return;
// Reset the file to the beginning
@@ -108,8 +110,7 @@ __fastcall TSoundContainer::TSoundContainer( LPDIRECTSOUND pDS, char *Directory,
// Lock the buffer down
// if (FAILED(hr=DSBuffer->Lock(0,dwBufferBytes,&pbData,&dwLength,&pbData2,&dwLength2,0)))
if( FAILED( hr = DSBuffer->Lock( 0, dwBufferBytes, &pbData, &dwLength,
&pbData2, &dwLength2, 0L ) ) )
if (FAILED(hr = DSBuffer->Lock(0, dwBufferBytes, &pbData, &dwLength, &pbData2, &dwLength2, 0L)))
return;
// Copy the memory to it.
@@ -137,7 +138,6 @@ __fastcall TSoundContainer::TSoundContainer( LPDIRECTSOUND pDS, char *Directory,
};*/
};
__fastcall TSoundContainer::~TSoundContainer()
{
@@ -154,21 +154,17 @@ __fastcall TSoundContainer::~TSoundContainer()
LPDIRECTSOUNDBUFFER __fastcall TSoundContainer::GetUnique(LPDIRECTSOUND pDS)
{
if (!DSBuffer) return NULL;
if (!DSBuffer)
return NULL;
// jeœli siê dobrze zainicjowa³o
LPDIRECTSOUNDBUFFER buff;
pDS->DuplicateSoundBuffer(DSBuffer, &buff);
if (buff) DSBuffers.push(buff);
if (buff)
DSBuffers.push(buff);
return DSBuffers.top();
};
__fastcall TSoundsManager::~TSoundsManager()
{
Free();
};
__fastcall TSoundsManager::~TSoundsManager() { Free(); };
void __fastcall TSoundsManager::Free()
{
@@ -176,7 +172,6 @@ void __fastcall TSoundsManager::Free()
SAFE_RELEASE(pDS);
};
TSoundContainer *__fastcall TSoundsManager::LoadFromFile(char *Dir, char *Name, int Concurrent)
{
TSoundContainer *Tmp = First;
@@ -198,7 +193,8 @@ void __fastcall TSoundsManager::LoadSounds(char *Directory)
FindClose(handle);
};
LPDIRECTSOUNDBUFFER __fastcall TSoundsManager::GetFromName(char *Name,bool Dynamic,float *fSamplingRate)
LPDIRECTSOUNDBUFFER __fastcall TSoundsManager::GetFromName(char *Name, bool Dynamic,
float *fSamplingRate)
{ // wyszukanie dŸwiêku w pamiêci albo wczytanie z pliku
AnsiString file;
if (Dynamic)
@@ -269,8 +265,8 @@ void __fastcall TSoundsManager::RestoreAll()
for (int i = 0; i < Count; i++)
{
if( FAILED( hr = Next->DSBuffer->GetStatus( &dwStatus ) ) );
if (FAILED(hr = Next->DSBuffer->GetStatus(&dwStatus)))
;
// return hr;
if (dwStatus & DSBSTATUS_BUFFERLOST)
@@ -284,8 +280,7 @@ void __fastcall TSoundsManager::RestoreAll()
hr = Next->DSBuffer->Restore();
if (hr == DSERR_BUFFERLOST)
Sleep(10);
}
while ((hr=Next->DSBuffer->Restore())!=NULL);
} while ((hr = Next->DSBuffer->Restore()) != NULL);
// char *Name= Next->Name;
// int cc= Next->Concurrent;
@@ -296,10 +291,8 @@ void __fastcall TSoundsManager::RestoreAll()
};
Next = Next->Next;
};
};
// void __fastcall TSoundsManager::Init(char *Name, int Concurrent)
//__fastcall TSoundsManager::TSoundsManager(HWND hWnd)
// void __fastcall TSoundsManager::Init(HWND hWnd, char *NDirectory)
@@ -369,9 +362,7 @@ if (hr==DSERR_OUTOFMEMORY)
return;
SAFE_RELEASE(pDSBPrimary);
};
//---------------------------------------------------------------------------
#pragma package(smart_init)

View File

@@ -31,11 +31,11 @@ public:
TSoundContainer *Next;
std::stack<LPDIRECTSOUNDBUFFER> DSBuffers;
LPDIRECTSOUNDBUFFER __fastcall GetUnique(LPDIRECTSOUND pDS);
__fastcall TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFileName, int NConcurrent);
__fastcall TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFileName,
int NConcurrent);
__fastcall ~TSoundContainer();
};
class TSoundsManager
{
private:
@@ -45,6 +45,7 @@ private:
static int Count;
static TSoundContainer *First;
static TSoundContainer *__fastcall LoadFromFile(char *Dir, char *Name, int Concurrent);
public:
// __fastcall TSoundsManager(HWND hWnd);
// static void __fastcall Init(HWND hWnd, char *NDirectory);
@@ -53,7 +54,8 @@ public:
static void __fastcall Free();
static void __fastcall Init(char *Name, int Concurrent);
static void __fastcall LoadSounds(char *Directory);
static LPDIRECTSOUNDBUFFER __fastcall GetFromName(char *Name,bool Dynamic,float *fSamplingRate=NULL);
static LPDIRECTSOUNDBUFFER __fastcall GetFromName(char *Name, bool Dynamic,
float *fSamplingRate = NULL);
static void __fastcall RestoreAll();
};

View File

@@ -11,7 +11,6 @@
//#define asSplinesPatch AnsiString("Scenery\\")
bool __fastcall Connect(TKnot *k1, TKnot *k2)
{
if (k1 && k2)
@@ -39,7 +38,6 @@ float __fastcall CurveLength(vector3 p1, vector3 cp1, vector3 cp2, vector3 p2)
last = tmp;
}
return (l);
}
__fastcall TKnot::TKnot()
@@ -68,9 +66,7 @@ __fastcall TKnot::TKnot(int n)
}
}
__fastcall TKnot::~TKnot()
{
}
__fastcall TKnot::~TKnot() {}
vector3 __fastcall TKnot::GetDirection(float t)
{
@@ -81,7 +77,8 @@ vector3 __fastcall TKnot::GetDirection(float t)
return v1 * (1 - t) + v2 * (t);
}
else
return (Next->Point-Point);//Spline->Knots[KnotIndex].Point-Spline->Knots[KnotIndex].Point);
return (Next->Point -
Point); // Spline->Knots[KnotIndex].Point-Spline->Knots[KnotIndex].Point);
}
float __fastcall TKnot::GetTFromS(float s)
@@ -110,7 +107,6 @@ float __fastcall TKnot::GetTFromS(float s)
// Newton's method failed. If this happens, increase iterations or
// tolerance or integration accuracy.
return -1;
}
bool __fastcall TKnot::Init(TKnot *NNext, TKnot *NPrev)
@@ -138,7 +134,9 @@ bool __fastcall TKnot::InitCPoints()
CPointIn = Point - fLengthIn * Normalize(Next->Point - Point);
}
else
CPointIn= Point-fLengthIn*(Normalize(Normalize(Next->Point-Point)+Normalize(Point-Prev->Point)));
CPointIn = Point -
fLengthIn * (Normalize(Normalize(Next->Point - Point) +
Normalize(Point - Prev->Point)));
}
else
CPointIn = Point - fLengthIn * Normalize(Point - Prev->Point);
@@ -154,9 +152,12 @@ bool __fastcall TKnot::InitCPoints()
CPointOut = Point - fLengthOut * Normalize(Prev->Point - Point);
}
else
CPointOut= Point-fLengthOut*(Normalize(Normalize(Prev->Point-Point)+Normalize(Point-Next->Point)));
CPointOut = Point -
fLengthOut * (Normalize(Normalize(Prev->Point - Point) +
Normalize(Point - Next->Point)));
}
else;
else
;
// CPointOut= -fLengthOut*Normalize(Next->Point-Point);
else
CPointOut = Next->Point;
@@ -170,14 +171,12 @@ bool __fastcall TKnot::InitLength()
if (IsCurve)
if (Next)
Length = RombergIntegral(0, 1);
else;
else
if (Next)
;
else if (Next)
Length = (Point - Next->Point).Length();
return true;
}
vector3 TKnot::GetFirstDerivative(float fTime)
@@ -207,7 +206,8 @@ float TKnot::RombergIntegral(float fA, float fB)
float ms_apfRom[2][ms_iOrder];
ms_apfRom[0][0] = 0.5*fH*((GetFirstDerivative(fA).Length())+(GetFirstDerivative(fB).Length()));
ms_apfRom[0][0] =
0.5 * fH * ((GetFirstDerivative(fA).Length()) + (GetFirstDerivative(fB).Length()));
for (int i0 = 2, iP0 = 1; i0 <= ms_iOrder; i0++, iP0 *= 2, fH *= 0.5)
{
// approximations via the trapezoid rule
@@ -220,8 +220,7 @@ float TKnot::RombergIntegral(float fA, float fB)
ms_apfRom[1][0] = 0.5 * (ms_apfRom[0][0] + fH * fSum);
for (int i2 = 1, iP2 = 4; i2 < i0; i2++, iP2 *= 4)
{
ms_apfRom[1][i2] =
(iP2*ms_apfRom[1][i2-1] - ms_apfRom[0][i2-1])/(iP2-1);
ms_apfRom[1][i2] = (iP2 * ms_apfRom[1][i2 - 1] - ms_apfRom[0][i2 - 1]) / (iP2 - 1);
}
for (i1 = 0; i1 < i0; i1++)
@@ -231,10 +230,8 @@ float TKnot::RombergIntegral(float fA, float fB)
return ms_apfRom[0][ms_iOrder - 1];
}
//----------------------------------------------------------------------------//
__fastcall TSpline::TSpline()
{
// Closed= true;
@@ -273,7 +270,6 @@ __fastcall TSpline::~TSpline()
ck = ck->Next;
SafeDelete(tk);
}
}
bool __fastcall TSpline::Create(int n, AnsiString asNName)
@@ -295,7 +291,6 @@ bool __fastcall TSpline::AssignKnots( TKnot *FirstKnot, int n )
// iNumKnots= n;
// Knots= FirstKnot;
// KnotsAllocated= false;
}
int __fastcall TSpline::LoadFromFile(AnsiString FileName, TKnot *FirstKnot)
@@ -357,7 +352,8 @@ int __fastcall TSpline::LoadFromFile( AnsiString FileName, TKnot *FirstKnot )
if (CurrentKnot->IsCurve)
{
CurrentKnot->Length= CurveLength(CurrentKnot->Point,CurrentKnot->CPointOut,CurrentKnot->Next->CPointIn,CurrentKnot->Next->Point);
CurrentKnot->Length=
CurveLength(CurrentKnot->Point,CurrentKnot->CPointOut,CurrentKnot->Next->CPointIn,CurrentKnot->Next->Point);
}
else
{
@@ -382,9 +378,11 @@ int __fastcall TSpline::LoadFromFile( AnsiString FileName, TKnot *FirstKnot )
int __fastcall TSpline::Load(TQueryParserComp *Parser, AnsiString asEndString)
{
TKnot *LastKnot= NULL;;
TKnot *LastKnot = NULL;
;
if (RootKnot != NULL)
for (LastKnot= RootKnot; LastKnot->Next!=NULL; LastKnot= LastKnot->Next);
for (LastKnot = RootKnot; LastKnot->Next != NULL; LastKnot = LastKnot->Next)
;
TKnot *tmp;
@@ -426,7 +424,6 @@ int __fastcall TSpline::Load( TQueryParserComp *Parser, AnsiString asEndString )
iNumKnots++;
} while (Parser->GetNextSymbol().LowerCase() != asEndString && !Parser->EOF);
LastKnot->Prev->Next = NULL;
@@ -450,7 +447,6 @@ float __fastcall TSpline::GetLength()
}
return l;
}
vector3 __fastcall TSpline::GetCenter()
@@ -466,7 +462,6 @@ vector3 __fastcall TSpline::GetCenter()
}
if (iNumKnots > 0)
pt /= iNumKnots;
}
TKnot *__fastcall TSpline::GetLastKnot()
@@ -481,10 +476,10 @@ TKnot* __fastcall TSpline::GetLastKnot()
return ck;
}
bool __fastcall TSpline::Render()
{
TKnot *LastKnot= NULL;;
TKnot *LastKnot = NULL;
;
// if (RootKnot==NULL)
// RootKnot= Knots;
@@ -507,12 +502,9 @@ bool __fastcall TSpline::Render()
glVertex3f(RootKnot->Prev->Point.x,RootKnot->Prev->Point.y,RootKnot->Prev->Point.z);
glEnd();
}*/
}
}
//---------------------------------------------------------------------------
#pragma package(smart_init)

View File

@@ -32,7 +32,10 @@ public:
// (Length-s) (s-Length)
}
vector3 __fastcall GetDirection(float t = 0);
inline vector3 __fastcall InterpolateSegm(float t) { return (Interpolate(t,Point,CPointOut,Next->CPointIn,Next->Point) ); };
inline vector3 __fastcall InterpolateSegm(float t)
{
return (Interpolate(t, Point, CPointOut, Next->CPointIn, Next->Point));
};
float __fastcall GetTFromS(float s);
bool __fastcall Init(TKnot *NNext, TKnot *NPrev);
bool __fastcall InitCPoints();
@@ -68,8 +71,12 @@ public:
// inline int NextIndex(int n) { return (n<KnotsCount-1 ? n+1 : 0); };
// inline vector3 InterpolateSegm(int i, float t) { return (Interpolate(t,Knots[i].Point,Knots[i].CPointOut,Knots[NextIndex(i)].CPointIn,Knots[NextIndex(i)].Point) ); };
// inline vector3 InterpolateSegm(TKnot *Knot, float t) { return (Interpolate(t,Knots[i].Point,Knots[i].CPointOut,Knots[NextIndex(i)].CPointIn,Knots[NextIndex(i)].Point) ); };
// inline vector3 InterpolateSegm(int i, float t) { return
// (Interpolate(t,Knots[i].Point,Knots[i].CPointOut,Knots[NextIndex(i)].CPointIn,Knots[NextIndex(i)].Point)
// ); };
// inline vector3 InterpolateSegm(TKnot *Knot, float t) { return
// (Interpolate(t,Knots[i].Point,Knots[i].CPointOut,Knots[NextIndex(i)].CPointIn,Knots[NextIndex(i)].Point)
// ); };
// bool Closed;
// AnsiString asName;
// TKnot *Knots;
@@ -80,7 +87,6 @@ public:
// TKnot Next,Prev;
private:
};
bool __fastcall Connect(TKnot *k1, TKnot *k2);

View File

@@ -9,7 +9,6 @@
#include "Spring.h"
#include "Usefull.h"
__fastcall TSpring::TSpring()
{
vForce1 = vForce2 = vector3(0, 0, 0);
@@ -18,10 +17,7 @@ __fastcall TSpring::TSpring()
restLen = 0;
}
__fastcall TSpring::~TSpring()
{
}
__fastcall TSpring::~TSpring() {}
void __fastcall TSpring::Init(double nrestLen, double nKs, double nKd)
{
@@ -39,7 +35,8 @@ bool __fastcall TSpring::ComputateForces(vector3 pPosition1, vector3 pPosition2)
// p2 = &system[spring->p2];
// VectorDifference(&p1->pos,&p2->pos,&deltaP); // Vector distance
deltaP = pPosition1 - pPosition2;
// dist = VectorLength(&deltaP); // Magnitude of deltaP
// dist = VectorLength(&deltaP); // Magnitude of
//deltaP
dist = deltaP.Length();
if (dist == 0)
{
@@ -68,11 +65,7 @@ bool __fastcall TSpring::ComputateForces(vector3 pPosition1, vector3 pPosition2)
return true;
}
void __fastcall TSpring::Render()
{
}
void __fastcall TSpring::Render() {}
//---------------------------------------------------------------------------

View File

@@ -3,7 +3,6 @@
#ifndef ParticlesH
#define ParticlesH
#define STATIC_THRESHOLD 0.17f
// efine STATIC_THRESHOLD 0.03f
const double m_Kd = 0.02f; // DAMPING FACTOR
@@ -22,7 +21,8 @@ class TSpring
public:
__fastcall TSpring();
__fastcall ~TSpring();
// void __fastcall Init(TParticnp1, TParticle *np2, double nKs= 0.5f, double nKd= 0.002f, double nrestLen= -1.0f);
// void __fastcall Init(TParticnp1, TParticle *np2, double nKs= 0.5f, double nKd= 0.002f,
// double nrestLen= -1.0f);
void __fastcall Init(double nrestLen, double nKs = 0.5f, double nKd = 0.002f);
bool __fastcall ComputateForces(vector3 pPosition1, vector3 pPosition2);
void __fastcall Render();
@@ -33,6 +33,5 @@ public:
private:
};
//---------------------------------------------------------------------------
#endif

View File

@@ -27,9 +27,7 @@
TTexturesManager::Alphas TTexturesManager::_alphas;
TTexturesManager::Names TTexturesManager::_names;
void TTexturesManager::Init()
{
};
void TTexturesManager::Init(){};
TTexturesManager::Names::iterator TTexturesManager::LoadFromFile(std::string fileName, int filter)
{
@@ -63,7 +61,8 @@ TTexturesManager::Names::iterator TTexturesManager::LoadFromFile(std::string fil
else if (ext == "dds")
texinfo = LoadDDS(realFileName, filter);
_alphas.insert(texinfo); //zapamiêtanie stanu przezroczystoœci tekstury - mo¿na by tylko przezroczyste
_alphas.insert(
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));
if (!texinfo.first)
@@ -74,19 +73,16 @@ TTexturesManager::Names::iterator TTexturesManager::LoadFromFile(std::string fil
};
_alphas.insert(texinfo);
ret=_names.insert(std::make_pair(fileName,texinfo.first)); //dodanie tekstury do magazynu (spisu nazw)
ret = _names.insert(
std::make_pair(fileName, texinfo.first)); // dodanie tekstury do magazynu (spisu nazw)
// WriteLog("OK"); //Ra: "OK" nie potrzeba, samo "Failed" wystarczy
return ret.first;
};
struct ReplaceSlash
{
const char operator()(const char input)
{
return input == '/' ? '\\' : input;
}
const char operator()(const char input) { return input == '/' ? '\\' : input; }
};
GLuint TTexturesManager::GetTextureID(char *dir, char *where, std::string fileName, int filter)
@@ -94,20 +90,24 @@ GLuint TTexturesManager::GetTextureID(char* dir,char* where,std::string fileName
/*
// 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
//Ra: przerobiæ na wyszukiwanie w drzewie nazw, do którego zapisywaæ np. rozmiary, przezroczystoœæ
//Ra: przerobić na wyszukiwanie w drzewie nazw, do którego zapisywać np. rozmiary,
przezroczystość
//Ra: ustalać, które tekstury można wczytać już w trakcie symulacji
size_t pos=fileName.find(':'); //szukamy dwukropka
if (pos!=std::string::npos) //po dwukropku mogą być podane dodatkowe informacje
fileName=fileName.substr(0,pos); //niebędące nazwą tekstury
std::transform(fileName.begin(),fileName.end(),fileName.begin(),ReplaceSlash()); //zamiana "/" na "\"
std::transform(fileName.begin(),fileName.end(),fileName.begin(),ReplaceSlash()); //zamiana "/"
na "\"
//jeśli bieżaca ścieżka do tekstur nie została dodana to dodajemy domyślną
//if (fileName.find('\\')==std::string::npos) //bz sensu
// fileName.insert(0,szDefaultTexturePath);
//najpierw szukamy w podanym katalogu, potem w domyślnym
Names::iterator iter;
std::ifstream file;
if ((fileName.find('.')==fileName.npos)?true:(fileName.rfind('.')<fileName.rfind('\\'))) //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 domyœlnego
if ((fileName.find('.')==fileName.npos)?true:(fileName.rfind('.')<fileName.rfind('\\')))
//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
domyślnego
fileName.append("."); //kropkę trzeba dodać na pewno, resztę trzeba próbować
std::string test; //zmienna robocza
for (int i=0;i<4;++i)
@@ -213,7 +213,8 @@ GLuint TTexturesManager::GetTextureID(char* dir,char* where,std::string fileName
test.append(Global::szDefaultExt[i]);
std::ifstream file(test.c_str());
if (!file.is_open())
{test.insert(0,szTexturePath);
{
test.insert(0, szTexturePath);
file.open(test.c_str());
}
if (file.is_open())
@@ -303,12 +304,10 @@ TTexturesManager::AlphaValue TTexturesManager::LoadBMP(std::string fileName)
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0,
GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
delete[] data;
return std::make_pair(id, false);
};
TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int filter)
@@ -333,20 +332,28 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName,int
// check if width, height and bpp is correct
if (!width || !height || (header[4] != 24 && header[4] != 32))
{
WriteLog("Bad texture: "+AnsiString(fileName.c_str())+" has wrong header or bits per pixel");
WriteLog("Bad texture: " + AnsiString(fileName.c_str()) +
" has wrong header or bits per pixel");
file.close();
return fail;
};
{ // sprawdzenie prawidłowości rozmiarów
int i, j;
for (i=width,j=0;i;i>>=1) if (i&1) ++j;
for (i = width, j = 0; i; i >>= 1)
if (i & 1)
++j;
if (j == 1)
for (i=height,j=0;i;i>>=1) if (i&1) ++j;
if (j!=1) WriteLog("Bad texture: "+AnsiString(fileName.c_str())+" is "+AnsiString(width)+"×"+AnsiString(height));
for (i = height, j = 0; i; i >>= 1)
if (i & 1)
++j;
if (j != 1)
WriteLog("Bad texture: " + AnsiString(fileName.c_str()) + " is " + AnsiString(width) +
"×" + AnsiString(height));
}
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 imageSize=width*height*bytesPerPixel; //calculate the memory required for the TGA data
GLuint imageSize =
width * height * bytesPerPixel; // calculate the memory required for the TGA data
GLubyte *imageData = new GLubyte[imageSize]; // reserve memory to hold the TGA data
if (!compressed)
{ // WriteLog("Not compressed.");
@@ -382,7 +389,8 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName,int
copyto += 1 + bytesPerPixel; // bajt licznika oraz jeden piksel jest zawsze
copybytes += (1 + (chunkheader & 127)) * bytesPerPixel; // ilość pikseli
if (chunkheader < 128) // jeśli kopiowanie, pikseli jest więcej
copyto+=(chunkheader)*bytesPerPixel; //rozmiar kopiowanego obszaru (bez jednego piksela)
copyto += (chunkheader)*bytesPerPixel; // rozmiar kopiowanego obszaru (bez
// jednego piksela)
}
if (copybytes > imageSize)
{ // nie ma prawa być większe
@@ -415,7 +423,8 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName,int
file.open(fileName.c_str(), std::ios::binary | std::ios::in);
}
if (chunkheader < 128) // jeśli ostatnie piksele są kopiowane
copyend-=(1+chunkheader)*bytesPerPixel; //bajty kopiowane na koñcu nie podlegaj¹ce dekompresji
copyend -= (1 + chunkheader) *
bytesPerPixel; // bajty kopiowane na końcu nie podlegające dekompresji
else
copyend -= bytesPerPixel; // ostatni piksel i tak się nie zmieni
copyto = imageData; // teraz będzie wypełnianie od początku obszaru
@@ -423,16 +432,23 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName,int
{
chunkheader = (unsigned char)*copyfrom; // jeden bajt, pozostałe zawsze zerowe
if (copyto > copyfrom)
{//jeœli piksele maj¹ byæ kopiowane, to mo¿liwe jest przesuniêcie ich o 1 bajt, na miejsce licznika
filesize=(imageData+imageSize-copyto)/bytesPerPixel; //ile pikseli pozosta³o do koñca
//WriteLog("Decompression buffer overflow at pixel "+AnsiString((copyto-imageData)/bytesPerPixel)+"+"+AnsiString(filesize));
//pozycjê w pliku trzeba by zapamietaæ i po wczytaniu reszty pikseli star¹ metod¹
{ // jeśli piksele mają być kopiowane, to możliwe jest przesunięcie ich o 1 bajt, na
// miejsce licznika
filesize = (imageData + imageSize - copyto) /
bytesPerPixel; // ile pikseli pozostało do końca
// WriteLog("Decompression buffer overflow at pixel
// "+AnsiString((copyto-imageData)/bytesPerPixel)+"+"+AnsiString(filesize));
// pozycję w pliku trzeba by zapamietać i po wczytaniu reszty pikseli starą
// metodą
// zapisać od niej dane od (copyto), poprzedzone bajtem o wartości (filesize-1)
writeback=imageData+imageSize+extraend-copyfrom; //ile bajtów skompresowanych zosta³o do koñca
writeback = imageData + imageSize + extraend -
copyfrom; // ile bajtów skompresowanych zostało do końca
copyfrom = copyto; // adres piksela do zapisania
file.seekg(-writeback, ios::end); // odległość od końca (ujemna)
if ((filesize>128)||!(Global::iModifyTGA&4)) //gdy za du¿o pikseli albo wy³¹czone
writeback=-1; //zapis mo¿liwe jeœli iloœæ problematycznych pikseli nie przekaracza 128
if ((filesize > 128) ||
!(Global::iModifyTGA & 4)) // gdy za dużo pikseli albo wyłączone
writeback = -1; // zapis możliwe jeśli ilość problematycznych pikseli nie
// przekaracza 128
break; // bufor się zatkał, dalej w ten sposób się nie da
}
if (chunkheader < 128)
@@ -456,7 +472,8 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName,int
copyfrom += 4;
}
else
{colorbuffer[0]=*((int*)(++copyfrom)); //pobranie koloru (3 bajty)
{
colorbuffer[0] = *((int *)(++copyfrom)); // pobranie koloru (3 bajty)
for (int counter = 0; counter < chunkheader; counter++)
{ // by the header
memcpy(copyto, colorbuffer, 3);
@@ -468,7 +485,8 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName,int
} // while (copyto<copyend)
}
else
{WriteLog("Compressed file is larger than uncompressed!");
{
WriteLog("Compressed file is larger than uncompressed!");
if (Global::iModifyTGA & 1)
writeback = 0; // no zapisać ten krótszy zaczynajac od początku...
}
@@ -485,7 +503,8 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName,int
return fail;
};
if (chunkheader < 128)
{//if the header is < 128, it means the that is the number of RAW color packets minus 1
{ // if the header is < 128, it means the that is the number of RAW color packets minus
// 1
chunkheader++; // add 1 to get number of following color values
file.read(copyto, chunkheader * bytesPerPixel);
copyto += chunkheader * bytesPerPixel;
@@ -540,23 +559,29 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName,int
size_t pos = fileName.rfind('%'); // ostatni % w nazwie
if (pos != std::string::npos)
if (pos < fileName.size())
{filter=(int)fileName[pos+1]-'0'; //zamiana cyfry za % na liczbê
if ((filter<0)||(filter>10)) filter=-1; //jeœli nie jest cyfr¹
{
filter = (int)fileName[pos + 1] - '0'; // zamiana cyfry za % na liczbę
if ((filter < 0) || (filter > 10))
filter = -1; // jeśli nie jest cyfrą
}
if (!alpha && !hash && dollar && (filter < 0))
filter = Global::iDefaultFiltering; // dotyczy tekstur TGA bez kanału alfa
// ewentualne przeskalowanie tekstury do dopuszczalnego rozumiaru
GLint w = width, h = height;
if (width>Global::iMaxTextureSize) width=Global::iMaxTextureSize; //ogranizczenie wielkoœci
if (height>Global::iMaxTextureSize) height=Global::iMaxTextureSize;
if (width > Global::iMaxTextureSize)
width = Global::iMaxTextureSize; // ogranizczenie wielkości
if (height > Global::iMaxTextureSize)
height = Global::iMaxTextureSize;
if ((w != width) || (h != height))
{ // przeskalowanie tekstury, żeby się nie wyświetlała jako biała
GLubyte *imgData = new GLubyte[width * height * bytesPerPixel]; // nowy rozmiar
gluScaleImage(bytesPerPixel==3?GL_RGB:GL_RGBA,w,h,GL_UNSIGNED_BYTE,imageData,width,height,GL_UNSIGNED_BYTE,imgData);
gluScaleImage(bytesPerPixel == 3 ? GL_RGB : GL_RGBA, w, h, GL_UNSIGNED_BYTE, imageData,
width, height, GL_UNSIGNED_BYTE, imgData);
delete imageData; // usunięcie starego
imageData = imgData;
}
GLuint id=CreateTexture(imageData,(alpha?GL_BGRA:GL_BGR),width,height,alpha,hash,dollar,filter);
GLuint id = CreateTexture(imageData, (alpha ? GL_BGRA : GL_BGR), width, height, alpha, hash,
dollar, filter);
delete[] imageData;
++Global::iTextures;
return std::make_pair(id, alpha);
@@ -609,7 +634,6 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTEX(std::string fileName)
delete[] data;
return std::make_pair(id, alpha);
};
TTexturesManager::AlphaValue TTexturesManager::LoadDDS(std::string fileName, int filter)
@@ -678,10 +702,16 @@ TTexturesManager::AlphaValue TTexturesManager::LoadDDS(std::string fileName,int
data.numMipMaps = ddsd.dwMipMapCount;
{ // sprawdzenie prawidłowości rozmiarów
int i, j;
for (i=data.width,j=0;i;i>>=1) if (i&1) ++j;
for (i = data.width, j = 0; i; i >>= 1)
if (i & 1)
++j;
if (j == 1)
for (i=data.height,j=0;i;i>>=1) if (i&1) ++j;
if (j!=1) WriteLog("Bad texture: "+AnsiString(fileName.c_str())+" is "+AnsiString(data.width)+"×"+AnsiString(data.height));
for (i = data.height, j = 0; i; i >>= 1)
if (i & 1)
++j;
if (j != 1)
WriteLog("Bad texture: " + AnsiString(fileName.c_str()) + " is " +
AnsiString(data.width) + "×" + AnsiString(data.height));
}
if (ddsd.ddpfPixelFormat.dwFourCC == FOURCC_DXT1)
@@ -713,21 +743,26 @@ TTexturesManager::AlphaValue TTexturesManager::LoadDDS(std::string fileName,int
for (int i = 0; i < data.numMipMaps - firstMipMap; i++)
{ // wczytanie kolejnych poziomów mipmap
if (!data.width) data.width=1;
if (!data.height) data.height=1;
if (!data.width)
data.width = 1;
if (!data.height)
data.height = 1;
GLuint size = ((data.width + 3) / 4) * ((data.height + 3) / 4) * data.blockSize;
if (Global::bDecompressDDS)
{ // programowa dekompresja DDS
// if (i==1) //should be i==0 but then problem with "glBindTexture()"
{GLuint decomp_size=data.width*data.height*4;
{
GLuint decomp_size = data.width * data.height * 4;
GLubyte *output = new GLubyte[decomp_size];
DecompressDXT(data, data.pixels + offset, output);
glTexImage2D(GL_TEXTURE_2D,i,GL_RGBA,data.width,data.height,0,GL_RGBA,GL_UNSIGNED_BYTE,output);
glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA, data.width, data.height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, output);
delete[] output;
}
}
else // przetwarzanie DDS przez OpenGL (istnieje odpowiednie rozszerzenie)
glCompressedTexImage2D(GL_TEXTURE_2D,i,data.format,data.width,data.height,0,size,data.pixels+offset);
glCompressedTexImage2D(GL_TEXTURE_2D, i, data.format, data.width, data.height, 0, size,
data.pixels + offset);
offset += size;
// Half the image size for the next mip-map level...
data.width /= 2;
@@ -747,18 +782,25 @@ void TTexturesManager::SetFiltering(int filter)
else
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
switch (filter) // rozmycie przy oddaleniu
{case 4: //najbli¿szy z tekstury
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); break;
{
case 4: // najbliższy z tekstury
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
break;
case 5: //średnia z tekstury
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); break;
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
break;
case 6: // najbliższy z mipmapy
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST); break;
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
break;
case 7: //średnia z mipmapy
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); break;
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
break;
case 8: // najbliższy z dwóch mipmap
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR); break;
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
break;
case 9: //średnia z dwóch mipmap
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); break;
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
break;
}
};
@@ -791,11 +833,11 @@ void TTexturesManager::SetFiltering(bool alpha, bool hash)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
}
};
///////////////////////////////////////////////////////////////////////////////
GLuint TTexturesManager::CreateTexture(char* buff,GLint bpp,int width,int height,bool bHasAlpha,bool bHash,bool bDollar,int filter)
GLuint TTexturesManager::CreateTexture(char *buff, GLint bpp, int width, int height, bool bHasAlpha,
bool bHash, bool bDollar, int filter)
{ // Ra: używane tylko dla TGA i TEX
// Ra: dodana obsługa GL_BGR oraz GL_BGRA dla TGA - szybciej się wczytuje
GLuint ID;
@@ -812,7 +854,8 @@ GLuint TTexturesManager::CreateTexture(char* buff,GLint bpp,int width,int height
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
if (bHasAlpha || bHash || (filter == 0))
glTexImage2D(GL_TEXTURE_2D,0,(bHasAlpha?GL_RGBA:GL_RGB),width,height,0,bpp,GL_UNSIGNED_BYTE,buff);
glTexImage2D(GL_TEXTURE_2D, 0, (bHasAlpha ? GL_RGBA : GL_RGB), width, height, 0, bpp,
GL_UNSIGNED_BYTE, buff);
else
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height, bpp, GL_UNSIGNED_BYTE, buff);
return ID;
@@ -832,4 +875,3 @@ std::string TTexturesManager::GetName(GLuint id)
return "";
};
#pragma package(smart_init)

View File

@@ -47,12 +47,12 @@ private:
static void SetFiltering(int filter);
static void SetFiltering(bool alpha, bool hash);
static GLuint CreateTexture(char *buff,GLint bpp,int width,int height,bool bHasAlpha,bool bHash,bool bDollar=true,int filter=-1);
static GLuint CreateTexture(char *buff, GLint bpp, int width, int height, bool bHasAlpha,
bool bHash, bool bDollar = true, int filter = -1);
static Names _names;
static Alphas _alphas;
// std::list<TTexture> Textures;
};
//---------------------------------------------------------------------------
#endif

View File

@@ -48,8 +48,10 @@ void DecompressDXT1(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
colours[1].a = 0xFF;
colours[2].a = 0xFF;
for (y = 0; y < lImage.height; y += 4) {
for (x = 0; x < lImage.width; x += 4) {
for (y = 0; y < lImage.height; y += 4)
{
for (x = 0; x < lImage.width; x += 4)
{
color_0 = *((const GLushort *)Temp);
color_1 = *((const GLushort *)(Temp + 2));
@@ -59,7 +61,8 @@ void DecompressDXT1(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
Temp += 8;
if (color_0 > color_1) {
if (color_0 > color_1)
{
// Four-color block: derive the other two colors.
// 00 = color_0, 01 = color_1, 10 = color_2, 11 = color_3
// These 2-bit codes correspond to the 2-bit fields
@@ -90,13 +93,17 @@ void DecompressDXT1(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
colours[3].a = 0x00;
}
for (j = 0, k = 0; j < 4; j++) {
for (i = 0; i < 4; i++, k++) {
for (j = 0, k = 0; j < 4; j++)
{
for (i = 0; i < 4; i++, k++)
{
Select = (bitmask & (0x03 << k * 2)) >> k * 2;
col = &colours[Select];
if (((x + i) < lImage.width) && ((y + j) < lImage.height)) {
Offset = (y + j) * lImage.width * lImage.components + (x + i) * lImage.components;
if (((x + i) < lImage.width) && ((y + j) < lImage.height))
{
Offset = (y + j) * lImage.width * lImage.components +
(x + i) * lImage.components;
Data[Offset + 0] = col->r;
Data[Offset + 1] = col->g;
Data[Offset + 2] = col->b;
@@ -116,8 +123,10 @@ void DecompressDXT3(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
GLuint bitmask, Offset;
const GLubyte *alpha;
for (GLint y = 0; y < lImage.height; y += 4) {
for (GLint x = 0; x < lImage.width; x += 4) {
for (GLint y = 0; y < lImage.height; y += 4)
{
for (GLint x = 0; x < lImage.width; x += 4)
{
alpha = Temp;
Temp += 8;
DxtcReadColors(Temp, colours);
@@ -138,13 +147,17 @@ void DecompressDXT3(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
colours[3].r = (colours[0].r + 2 * colours[1].r + 1) / 3;
GLuint k = 0;
for (GLint j = 0; j < 4; j++) {
for (GLint i = 0; i < 4; i++, k++) {
for (GLint j = 0; j < 4; j++)
{
for (GLint i = 0; i < 4; i++, k++)
{
GLuint Select = (bitmask & (0x03 << k * 2)) >> k * 2;
col = &colours[Select];
if (((x + i) < lImage.width) && ((y + j) < lImage.height)) {
Offset = (y + j) * lImage.width * lImage.components + (x + i) * lImage.components;
if (((x + i) < lImage.width) && ((y + j) < lImage.height))
{
Offset = (y + j) * lImage.width * lImage.components +
(x + i) * lImage.components;
Data[Offset + 0] = col->r;
Data[Offset + 1] = col->g;
Data[Offset + 2] = col->b;
@@ -152,11 +165,15 @@ void DecompressDXT3(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
}
}
for (GLint j = 0; j < 4; j++) {
for (GLint j = 0; j < 4; j++)
{
GLushort word = alpha[2 * j] + 256 * alpha[2 * j + 1];
for (GLint i = 0; i < 4; i++) {
if (((x + i) < lImage.width) && ((y + j) < lImage.height)) {
Offset = (y + j) * lImage.width * lImage.components + (x + i) * lImage.components + 3;
for (GLint i = 0; i < 4; i++)
{
if (((x + i) < lImage.width) && ((y + j) < lImage.height))
{
Offset = (y + j) * lImage.width * lImage.components +
(x + i) * lImage.components + 3;
Data[Offset] = word & 0x0F;
Data[Offset] = Data[Offset] | (Data[Offset] << 4);
}
@@ -179,8 +196,10 @@ void DecompressDXT5(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
Temp = lCompData;
for (y = 0; y < lImage.height; y += 4) {
for (x = 0; x < lImage.width; x += 4) {
for (y = 0; y < lImage.height; y += 4)
{
for (x = 0; x < lImage.width; x += 4)
{
if (y >= lImage.height || x >= lImage.width)
break;
alphas[0] = Temp[0];
@@ -206,15 +225,19 @@ void DecompressDXT5(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
colours[3].r = (colours[0].r + 2 * colours[1].r + 1) / 3;
k = 0;
for (j = 0; j < 4; j++) {
for (i = 0; i < 4; i++, k++) {
for (j = 0; j < 4; j++)
{
for (i = 0; i < 4; i++, k++)
{
Select = (bitmask & (0x03 << k * 2)) >> k * 2;
col = &colours[Select];
// only put pixels out < width or height
if (((x + i) < lImage.width) && ((y + j) < lImage.height)) {
Offset = (y + j) * lImage.width * lImage.components + (x + i) * lImage.components;
if (((x + i) < lImage.width) && ((y + j) < lImage.height))
{
Offset = (y + j) * lImage.width * lImage.components +
(x + i) * lImage.components;
Data[Offset + 0] = col->r;
Data[Offset + 1] = col->g;
Data[Offset + 2] = col->b;
@@ -223,7 +246,8 @@ void DecompressDXT5(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
}
// 8-alpha or 6-alpha block?
if (alphas[0] > alphas[1]) {
if (alphas[0] > alphas[1])
{
// 8-alpha block: derive the other six alphas.
// Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
alphas[2] = (6 * alphas[0] + 1 * alphas[1] + 3) / 7; // bit code 010
@@ -233,7 +257,8 @@ void DecompressDXT5(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
alphas[6] = (2 * alphas[0] + 5 * alphas[1] + 3) / 7; // bit code 110
alphas[7] = (1 * alphas[0] + 6 * alphas[1] + 3) / 7; // bit code 111
}
else {
else
{
// 6-alpha block.
// Bit code 000 = alpha_0, 001 = alpha_1, others are interpolated.
alphas[2] = (4 * alphas[0] + 1 * alphas[1] + 2) / 5; // Bit code 010
@@ -250,11 +275,15 @@ void DecompressDXT5(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
// First three bytes
// bits = *((ILint*)alphamask);
bits = (alphamask[0]) | (alphamask[1] << 8) | (alphamask[2] << 16);
for (j = 0; j < 2; j++) {
for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++)
{
for (i = 0; i < 4; i++)
{
// only put pixels out < width or height
if (((x + i) < lImage.width) && ((y + j) < lImage.height)) {
Offset = (y + j) * lImage.width * lImage.components + (x + i) * lImage.components + 3;
if (((x + i) < lImage.width) && ((y + j) < lImage.height))
{
Offset = (y + j) * lImage.width * lImage.components +
(x + i) * lImage.components + 3;
Data[Offset] = alphas[bits & 0x07];
}
bits >>= 3;
@@ -264,11 +293,15 @@ void DecompressDXT5(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
// Last three bytes
// bits = *((ILint*)&alphamask[3]);
bits = (alphamask[3]) | (alphamask[4] << 8) | (alphamask[5] << 16);
for (j = 2; j < 4; j++) {
for (i = 0; i < 4; i++) {
for (j = 2; j < 4; j++)
{
for (i = 0; i < 4; i++)
{
// only put pixels out < width or height
if (((x + i) < lImage.width) && ((y + j) < lImage.height)) {
Offset = (y + j) * lImage.width * lImage.components + (x + i) * lImage.components + 3;
if (((x + i) < lImage.width) && ((y + j) < lImage.height))
{
Offset = (y + j) * lImage.width * lImage.components +
(x + i) * lImage.components + 3;
Data[Offset] = alphas[bits & 0x07];
}
bits >>= 3;
@@ -293,7 +326,5 @@ void DecompressDXT(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Dat
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
DecompressDXT5(lImage, lCompData, Data);
break;
};
}

View File

@@ -27,4 +27,3 @@ struct DDS_IMAGE_DATA
void DecompressDXT(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Data);
#endif

View File

@@ -7,7 +7,8 @@
#include "Timer.h"
#include "Globals.h"
namespace Timer {
namespace Timer
{
double DeltaTime, DeltaRenderTime;
double fFPS = 0.0f;
@@ -17,53 +18,25 @@ double fSimulationTime=0;
double fSoundTimer = 0;
double fSinceStart = 0;
double __fastcall GetTime() { return fSimulationTime; }
double __fastcall GetDeltaTime() { // czas symulacji (stoi gdy pauza) return DeltaTime; }
double __fastcall GetTime()
{
return fSimulationTime;
}
double __fastcall GetDeltaRenderTime() { // czas renderowania (do poruszania siê) return DeltaRenderTime; }
double __fastcall GetDeltaTime()
{//czas symulacji (stoi gdy pauza)
return DeltaTime;
}
double __fastcall GetfSinceStart() { return fSinceStart; }
double __fastcall GetDeltaRenderTime()
{//czas renderowania (do poruszania siê)
return DeltaRenderTime;
}
void __fastcall SetDeltaTime(double t) { DeltaTime = t; }
double __fastcall GetfSinceStart()
{
return fSinceStart;
}
double __fastcall GetSimulationTime() { return fSimulationTime; }
void __fastcall SetDeltaTime(double t)
{
DeltaTime= t;
}
double __fastcall GetSimulationTime()
{
return fSimulationTime;
}
void __fastcall SetSimulationTime(double t)
{
fSimulationTime=t;
}
void __fastcall SetSimulationTime(double t) { fSimulationTime = t; }
bool __fastcall GetSoundTimer()
{ // 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); }
double __fastcall GetFPS()
{
return fFPS;
}
double __fastcall GetFPS() { return fFPS; }
void __fastcall ResetTimers()
{
@@ -82,15 +55,18 @@ void __fastcall UpdateTimers(bool pause)
QueryPerformanceCounter((LARGE_INTEGER *)&count);
DeltaRenderTime = double(count - oldCount) / double(fr);
if (!pause)
{DeltaTime=Global::fTimeSpeed*DeltaRenderTime;
{
DeltaTime = Global::fTimeSpeed * DeltaRenderTime;
fSoundTimer += DeltaTime;
if (fSoundTimer>0.1) fSoundTimer=0;
if (fSoundTimer > 0.1)
fSoundTimer = 0;
/*
double CurrentTime= double(count)/double(fr);//GetTickCount();
DeltaTime= (CurrentTime-OldTime);
OldTime= CurrentTime;
*/
if (DeltaTime>1) DeltaTime=1;
if (DeltaTime > 1)
DeltaTime = 1;
}
else
DeltaTime = 0; // wszystko stoi, bo czas nie p³ynie
@@ -108,12 +84,8 @@ void __fastcall UpdateTimers(bool pause)
}
fSimulationTime += DeltaTime;
};
};
//---------------------------------------------------------------------------
#pragma package(smart_init)

View File

@@ -3,8 +3,8 @@
#ifndef TimerH
#define TimerH
namespace Timer {
namespace Timer
{
double __fastcall GetTime();
@@ -26,7 +26,6 @@ double __fastcall GetFPS();
void __fastcall ResetTimers();
void __fastcall UpdateTimers(bool pause);
};
//---------------------------------------------------------------------------

1492
Track.cpp

File diff suppressed because it is too large Load Diff

53
Track.h
View File

@@ -9,12 +9,28 @@
#include <system.hpp>
#include "Classes.h"
class TEvent;
typedef enum { tt_Unknown, tt_Normal, tt_Switch, tt_Table, tt_Cross, tt_Tributary } TTrackType;
typedef enum
{
tt_Unknown,
tt_Normal,
tt_Switch,
tt_Table,
tt_Cross,
tt_Tributary
} TTrackType;
// McZapkie-100502
typedef enum {e_unknown=-1, e_flat=0, e_mountains, e_canyon, e_tunnel, e_bridge, e_bank} TEnvironmentType;
typedef enum
{
e_unknown = -1,
e_flat = 0,
e_mountains,
e_canyon,
e_tunnel,
e_bridge,
e_bank
} TEnvironmentType;
// Ra: opracować alternatywny system cieni/świateł z definiowaniem koloru oświetlenia w halach
class TTrack;
@@ -27,7 +43,8 @@ class TSwitchExtension
public:
__fastcall TSwitchExtension(TTrack *owner, int what);
__fastcall ~TSwitchExtension();
TSegment *Segments[6]; //dwa tory od punktu 1, pozostałe dwa od 2? Ra 140101: 6 połączeń dla skrzyżowań
TSegment *Segments[6]; // dwa tory od punktu 1, pozostałe dwa od 2? Ra 140101: 6 połączeń dla
// skrzyżowań
// TTrack *trNear[4]; //tory dołączone do punktów 1, 2, 3 i 4
// dotychczasowe [2]+[2] wskaźniki zamienić na nowe [4]
TTrack *pNexts[2]; // tory dołączone do punktów 2 i 4
@@ -84,7 +101,8 @@ public:
__fastcall TIsolated();
__fastcall TIsolated(const AnsiString &n, TIsolated *i);
__fastcall ~TIsolated();
static TIsolated* __fastcall Find(const AnsiString &n); //znalezienie obiektu albo utworzenie nowego
static TIsolated *__fastcall Find(
const AnsiString &n); // znalezienie obiektu albo utworzenie nowego
void __fastcall Modify(int i, TDynamicObject *o); // dodanie lub odjęcie osi
bool __fastcall Busy() { return (iAxles > 0); };
static TIsolated *__fastcall Root() { return (pRoot); };
@@ -111,7 +129,8 @@ private:
int iTrapezoid; // 0-standard, 1-przechyłka, 2-trapez, 3-oba
GLuint DisplayListID;
TIsolated *pIsolated; // obwód izolowany obsługujący zajęcia/zwolnienia grupy torów
TGroundNode *pMyNode; //Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode
TGroundNode *
pMyNode; // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode
public:
int iNumDynamics;
TDynamicObject *Dynamics[iMaxNumDynamics];
@@ -141,7 +160,8 @@ public:
TEnvironmentType eEnvironment; // dźwięk i oświetlenie
bool bVisible; // czy rysowany
int iAction; // czy modyfikowany eventami (specjalna obsługa przy skanowaniu)
float fOverhead; //informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i ograniczeniem prędkości
float fOverhead; // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i
// ograniczeniem prędkości
private:
double fVelocity; // prędkość dla AI (powyżej rośnie prawdopowobieństwo wykolejenia)
public:
@@ -172,7 +192,10 @@ public:
bool __fastcall Switch(int i, double t = -1.0, double d = -1.0);
bool __fastcall SwitchForced(int i, TDynamicObject *o);
int __fastcall CrossSegment(int from, int into);
inline int __fastcall GetSwitchState() { return (SwitchExtension?SwitchExtension->CurrentIndex:-1); };
inline int __fastcall GetSwitchState()
{
return (SwitchExtension ? SwitchExtension->CurrentIndex : -1);
};
void __fastcall Load(cParser *parser, vector3 pOrigin, AnsiString name);
bool __fastcall AssignEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent2);
bool __fastcall AssignallEvents(TEvent *NewEvent0, TEvent *NewEvent1, TEvent *NewEvent2);
@@ -191,10 +214,14 @@ public:
void __fastcall RaRenderVBO(int iPtr); // renderowanie z VBO sektora
void __fastcall RenderDyn(); // renderowanie nieprzezroczystych pojazdów (oba tryby)
void __fastcall RenderDynAlpha(); // renderowanie przezroczystych pojazdów (oba tryby)
void __fastcall RenderDynSounds(); //odtwarzanie dźwięków pojazdów jest niezależne od ich wyświetlania
void __fastcall RenderDynSounds(); // odtwarzanie dźwięków pojazdów jest niezależne od ich
// wyświetlania
void __fastcall RaOwnerSet(TSubRect *o)
{if (SwitchExtension) SwitchExtension->pOwner=o;};
{
if (SwitchExtension)
SwitchExtension->pOwner = o;
};
bool __fastcall InMovement(); // czy w trakcie animacji?
void __fastcall RaAssign(TGroundNode *gn, TAnimContainer *ac);
void __fastcall RaAssign(TGroundNode *gn, TAnimModel *am, TEvent *done, TEvent *joined);
@@ -203,7 +230,10 @@ public:
void __fastcall RadioStop();
void __fastcall AxleCounter(int i, TDynamicObject *o)
{if (pIsolated) pIsolated->Modify(i,o);}; //dodanie lub odjęcie osi
{
if (pIsolated)
pIsolated->Modify(i, o);
}; // dodanie lub odjęcie osi
AnsiString __fastcall IsolatedName();
bool __fastcall IsolatedEventsAssign(TEvent *busy, TEvent *free);
double __fastcall WidthTotal();
@@ -215,6 +245,7 @@ public:
void __fastcall VelocitySet(float v);
float __fastcall VelocityGet();
void __fastcall ConnectionsLog();
private:
void __fastcall EnvironmentSet();
void __fastcall EnvironmentReset();

View File

@@ -88,7 +88,6 @@ jawnie nazw
sekcji z sąsiedniego przęsła).
*/
TTraction::TTraction()
{
pPoint1 = pPoint2 = pPoint3 = pPoint4 = vector3(0, 0, 0);
@@ -122,7 +121,8 @@ TTraction::~TTraction()
void __fastcall TTraction::Optimize()
{
if (Global::bUseVBO) return;
if (Global::bUseVBO)
return;
uiDisplayList = glGenLists(1);
glNewList(uiDisplayList, GL_COMPILE);
@@ -137,11 +137,14 @@ void __fastcall TTraction::Optimize()
// Dlugosc odcinka trakcji 'Winger
double ddp = hypot(pPoint2.x - pPoint1.x, pPoint2.z - pPoint1.z);
if (Wires==2) WireOffset=0;
if (Wires == 2)
WireOffset = 0;
// Przewoz jezdny 1 'Marcin
glBegin(GL_LINE_STRIP);
glVertex3f(pPoint1.x-(pPoint2.z/ddp-pPoint1.z/ddp)*WireOffset,pPoint1.y,pPoint1.z-(-pPoint2.x/ddp+pPoint1.x/ddp)*WireOffset);
glVertex3f(pPoint2.x-(pPoint2.z/ddp-pPoint1.z/ddp)*WireOffset,pPoint2.y,pPoint2.z-(-pPoint2.x/ddp+pPoint1.x/ddp)*WireOffset);
glVertex3f(pPoint1.x - (pPoint2.z / ddp - pPoint1.z / ddp) * WireOffset, pPoint1.y,
pPoint1.z - (-pPoint2.x / ddp + pPoint1.x / ddp) * WireOffset);
glVertex3f(pPoint2.x - (pPoint2.z / ddp - pPoint1.z / ddp) * WireOffset, pPoint2.y,
pPoint2.z - (-pPoint2.x / ddp + pPoint1.x / ddp) * WireOffset);
glEnd();
// Nie wiem co 'Marcin
vector3 pt1, pt2, pt3, pt4, v1, v2;
@@ -175,8 +178,10 @@ void __fastcall TTraction::Optimize()
if (Wires > 2)
{
glBegin(GL_LINE_STRIP);
glVertex3f(pPoint1.x+(pPoint2.z/ddp-pPoint1.z/ddp)*WireOffset,pPoint1.y,pPoint1.z+(-pPoint2.x/ddp+pPoint1.x/ddp)*WireOffset);
glVertex3f(pPoint2.x+(pPoint2.z/ddp-pPoint1.z/ddp)*WireOffset,pPoint2.y,pPoint2.z+(-pPoint2.x/ddp+pPoint1.x/ddp)*WireOffset);
glVertex3f(pPoint1.x + (pPoint2.z / ddp - pPoint1.z / ddp) * WireOffset, pPoint1.y,
pPoint1.z + (-pPoint2.x / ddp + pPoint1.x / ddp) * WireOffset);
glVertex3f(pPoint2.x + (pPoint2.z / ddp - pPoint1.z / ddp) * WireOffset, pPoint2.y,
pPoint2.z + (-pPoint2.x / ddp + pPoint1.x / ddp) * WireOffset);
glEnd();
}
@@ -190,14 +195,17 @@ void __fastcall TTraction::Optimize()
{
pt3 = pPoint3 + v1 * f;
t = (1 - fabs(f - mid) * 2);
glVertex3f(pt3.x,pt3.y-sqrt(t)*fHeightDifference-((i==0)||(i==iNumSections-2)?0.25f*fHeightDifference:+0.05),pt3.z);
glVertex3f(
pt3.x,
pt3.y - sqrt(t) * fHeightDifference -
((i == 0) || (i == iNumSections - 2) ? 0.25f * fHeightDifference : +0.05),
pt3.z);
f += step;
}
glVertex3f(pPoint4.x, pPoint4.y - 0.65f * fHeightDifference, pPoint4.z);
glEnd();
}
f = step;
// Przewody pionowe (wieszaki) 'Marcin, poprawki na 2 przewody jezdne 'Winger
@@ -214,13 +222,19 @@ void __fastcall TTraction::Optimize()
t = (1 - fabs(f - mid) * 2);
if ((i % 2) == 0)
{
glVertex3f(pt3.x,pt3.y-sqrt(t)*fHeightDifference-((i==0)||(i==iNumSections-2)?flo:flo1),pt3.z);
glVertex3f(pt4.x-(pPoint2.z/ddp-pPoint1.z/ddp)*WireOffset,pt4.y,pt4.z-(-pPoint2.x/ddp+pPoint1.x/ddp)*WireOffset);
glVertex3f(pt3.x, pt3.y - sqrt(t) * fHeightDifference -
((i == 0) || (i == iNumSections - 2) ? flo : flo1),
pt3.z);
glVertex3f(pt4.x - (pPoint2.z / ddp - pPoint1.z / ddp) * WireOffset, pt4.y,
pt4.z - (-pPoint2.x / ddp + pPoint1.x / ddp) * WireOffset);
}
else
{
glVertex3f(pt3.x,pt3.y-sqrt(t)*fHeightDifference-((i==0)||(i==iNumSections-2)?flo:flo1),pt3.z);
glVertex3f(pt4.x+(pPoint2.z/ddp-pPoint1.z/ddp)*WireOffset,pt4.y,pt4.z+(-pPoint2.x/ddp+pPoint1.x/ddp)*WireOffset);
glVertex3f(pt3.x, pt3.y - sqrt(t) * fHeightDifference -
((i == 0) || (i == iNumSections - 2) ? flo : flo1),
pt3.z);
glVertex3f(pt4.x + (pPoint2.z / ddp - pPoint1.z / ddp) * WireOffset, pt4.y,
pt4.z + (-pPoint2.x / ddp + pPoint1.x / ddp) * WireOffset);
}
if ((Wires == 4) && ((i == 1) || (i == iNumSections - 3)))
{
@@ -229,7 +243,6 @@ void __fastcall TTraction::Optimize()
}
// endif;
f += step;
}
glEnd();
}
@@ -253,9 +266,11 @@ void __fastcall TTraction::RenderDL(float mgn) //McZapkie: mgn to odleglosc od
if (!Global::bSmoothTraction)
glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient
float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness
if (linealpha>1.2) linealpha=1.2; //zbyt grube nie są dobre
if (linealpha > 1.2)
linealpha = 1.2; // zbyt grube nie są dobre
glLineWidth(linealpha);
if (linealpha>1.0) linealpha = 1.0;
if (linealpha > 1.0)
linealpha = 1.0;
// McZapkie-261102: kolor zalezy od materialu i zasniedzenia
float r, g, b;
switch (Material)
@@ -264,38 +279,65 @@ void __fastcall TTraction::RenderDL(float mgn) //McZapkie: mgn to odleglosc od
case 1:
if (TestFlag(DamageFlag, 1))
{
r=0.00000; g=0.32549; b=0.2882353; //zielona miedź
r = 0.00000;
g = 0.32549;
b = 0.2882353; // zielona miedź
}
else
{
r=0.35098; g=0.22549; b=0.1; //czerwona miedź
r = 0.35098;
g = 0.22549;
b = 0.1; // czerwona miedź
}
break;
case 2:
if (TestFlag(DamageFlag, 1))
{
r=0.10; g=0.10; b=0.10; //czarne Al
r = 0.10;
g = 0.10;
b = 0.10; // czarne Al
}
else
{
r=0.25; g=0.25; b=0.25; //srebrne Al
r = 0.25;
g = 0.25;
b = 0.25; // srebrne Al
}
break;
// tymczasowo pokazanie zasilanych odcinków
case 4: r=0.5; g=0.5; b=1.0; break; //niebieskie z podłączonym zasilaniem
case 5: r=1.0; g=0.0; b=0.0; break; //czerwone z podłączonym zasilaniem 1
case 6: r=0.0; g=1.0; b=0.0; break; //zielone z podłączonym zasilaniem 2
case 7: r=1.0; g=1.0; b=0.0; break; //żółte z podłączonym zasilaniem z obu stron
case 4:
r = 0.5;
g = 0.5;
b = 1.0;
break; // niebieskie z podłączonym zasilaniem
case 5:
r = 1.0;
g = 0.0;
b = 0.0;
break; // czerwone z podłączonym zasilaniem 1
case 6:
r = 0.0;
g = 1.0;
b = 0.0;
break; // zielone z podłączonym zasilaniem 2
case 7:
r = 1.0;
g = 1.0;
b = 0.0;
break; //żółte z podłączonym zasilaniem z obu stron
}
if (DebugModeFlag)
if (hvParallel)
{ // jeśli z bieżnią wspólną, to dodatkowo przyciemniamy
r*=0.6; g*=0.6; b*=0.6;
r *= 0.6;
g *= 0.6;
b *= 0.6;
}
r *= Global::ambientDayLight[0]; // w zaleźności od koloru swiatła
g *= Global::ambientDayLight[1];
b *= Global::ambientDayLight[2];
if (linealpha>1.0) linealpha=1.0; //trzeba ograniczyć do <=1
if (linealpha > 1.0)
linealpha = 1.0; // trzeba ograniczyć do <=1
glColor4f(r, g, b, linealpha);
if (!uiDisplayList)
Optimize(); // generowanie DL w miarę potrzeby
@@ -311,11 +353,20 @@ int __fastcall TTraction::RaArrayPrepare()
// if (bVisible) //o ile w ogóle widać
switch (Wires)
{
case 1: iLines=2; break;
case 2: iLines=iNumSections?4*(iNumSections)-2+2:4; break;
case 3: iLines=iNumSections?4*(iNumSections)-2+4:6; break;
case 4: iLines=iNumSections?4*(iNumSections)-2+6:8; break;
default: iLines=0;
case 1:
iLines = 2;
break;
case 2:
iLines = iNumSections ? 4 * (iNumSections)-2 + 2 : 4;
break;
case 3:
iLines = iNumSections ? 4 * (iNumSections)-2 + 4 : 6;
break;
case 4:
iLines = iNumSections ? 4 * (iNumSections)-2 + 6 : 8;
break;
default:
iLines = 0;
}
// else iLines=0;
return iLines;
@@ -325,7 +376,8 @@ void __fastcall TTraction::RaArrayFill(CVertNormTex *Vert)
{ // wypełnianie tablic VBO
CVertNormTex *old = Vert;
double ddp = hypot(pPoint2.x - pPoint1.x, pPoint2.z - pPoint1.z);
if (Wires==2) WireOffset=0;
if (Wires == 2)
WireOffset = 0;
// jezdny
Vert->x = pPoint1.x - (pPoint2.z / ddp - pPoint1.z / ddp) * WireOffset;
Vert->y = pPoint1.y;
@@ -413,7 +465,8 @@ void __fastcall TTraction::RaArrayFill(CVertNormTex *Vert)
}
}
if ((Vert - old) != iLines)
WriteLog("!!! Wygenerowano punktów "+AnsiString(Vert-old)+", powinno być "+AnsiString(iLines));
WriteLog("!!! Wygenerowano punktów " + AnsiString(Vert - old) + ", powinno być " +
AnsiString(iLines));
};
void __fastcall TTraction::RenderVBO(float mgn, int iPtr)
@@ -426,7 +479,8 @@ void __fastcall TTraction::RenderVBO(float mgn,int iPtr)
if (!Global::bSmoothTraction)
glDisable(GL_LINE_SMOOTH); // na liniach kiepsko wygląda - robi gradient
float linealpha = 5000 * WireThickness / (mgn + 1.0); //*WireThickness
if (linealpha>1.2) linealpha=1.2; //zbyt grube nie są dobre
if (linealpha > 1.2)
linealpha = 1.2; // zbyt grube nie są dobre
glLineWidth(linealpha);
// McZapkie-261102: kolor zalezy od materialu i zasniedzenia
float r, g, b;
@@ -436,33 +490,58 @@ void __fastcall TTraction::RenderVBO(float mgn,int iPtr)
case 1:
if (TestFlag(DamageFlag, 1))
{
r=0.00000; g=0.32549; b=0.2882353; //zielona miedź
r = 0.00000;
g = 0.32549;
b = 0.2882353; // zielona miedź
}
else
{
r=0.35098; g=0.22549; b=0.1; //czerwona miedź
r = 0.35098;
g = 0.22549;
b = 0.1; // czerwona miedź
}
break;
case 2:
if (TestFlag(DamageFlag, 1))
{
r=0.10; g=0.10; b=0.10; //czarne Al
r = 0.10;
g = 0.10;
b = 0.10; // czarne Al
}
else
{
r=0.25; g=0.25; b=0.25; //srebrne Al
r = 0.25;
g = 0.25;
b = 0.25; // srebrne Al
}
break;
// tymczasowo pokazanie zasilanych odcinków
case 4: r=0.5; g=0.5; b=1.0; break; //niebieskie z podłączonym zasilaniem
case 5: r=1.0; g=0.0; b=0.0; break; //czerwone z podłączonym zasilaniem 1
case 6: r=0.0; g=1.0; b=0.0; break; //zielone z podłączonym zasilaniem 2
case 7: r=1.0; g=1.0; b=0.0; break; //żółte z podłączonym zasilaniem z obu stron
case 4:
r = 0.5;
g = 0.5;
b = 1.0;
break; // niebieskie z podłączonym zasilaniem
case 5:
r = 1.0;
g = 0.0;
b = 0.0;
break; // czerwone z podłączonym zasilaniem 1
case 6:
r = 0.0;
g = 1.0;
b = 0.0;
break; // zielone z podłączonym zasilaniem 2
case 7:
r = 1.0;
g = 1.0;
b = 0.0;
break; //żółte z podłączonym zasilaniem z obu stron
}
r = r * Global::ambientDayLight[0]; // w zaleznosci od koloru swiatla
g = g * Global::ambientDayLight[1];
b = b * Global::ambientDayLight[2];
if (linealpha>1.0) linealpha=1.0; //trzeba ograniczyć do <=1
if (linealpha > 1.0)
linealpha = 1.0; // trzeba ograniczyć do <=1
glColor4f(r, g, b, linealpha);
glDrawArrays(GL_LINES, iPtr, iLines);
glLineWidth(1.0);
@@ -514,11 +593,11 @@ void __fastcall TTraction::Connect(int my,TTraction *with,int to)
bool __fastcall TTraction::WhereIs()
{ // ustalenie przedostatnich przęseł
if (iLast) return (iLast==1); //ma już ustaloną informację o położeniu
if (iLast)
return (iLast == 1); // ma już ustaloną informację o położeniu
if (hvNext[0] ? hvNext[0]->iLast == 1 : false) // jeśli poprzedni jest ostatnim
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
return (iLast == 1); // ostatnie będą dostawać zasilanie
};
@@ -545,7 +624,9 @@ void __fastcall TTraction::ResistanceCalc(int d,double r,TTractionPowerSource *p
{ // ustawienie zasilacza i policzenie rezystancji zastępczej
if (DebugModeFlag) // tylko podczas testów
if (t->Material != 4) // przęsła zasilającego nie modyfikować
{if (t->Material<4) t->Material=4; //tymczasowo, aby zmieniła kolor
{
if (t->Material < 4)
t->Material = 4; // tymczasowo, aby zmieniła kolor
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
@@ -559,9 +640,12 @@ void __fastcall TTraction::ResistanceCalc(int d,double r,TTractionPowerSource *p
}
else
{ // podążanie w obu kierunkach, można by rekurencją, ale szkoda zasobów
r=0.5*fResistivity*Length3(vParametric); //powiedzmy, że w zasilanym przęśle jest połowa
if (fResistance[0]==0.0) ResistanceCalc(0,r); //do tyłu (w stronę Point1)
if (fResistance[1]==0.0) ResistanceCalc(1,r); //do przodu (w stronę Point2)
r = 0.5 * fResistivity *
Length3(vParametric); // powiedzmy, że w zasilanym przęśle jest połowa
if (fResistance[0] == 0.0)
ResistanceCalc(0, r); // do tyłu (w stronę Point1)
if (fResistance[1] == 0.0)
ResistanceCalc(1, r); // do przodu (w stronę Point2)
}
};
@@ -572,7 +656,8 @@ void __fastcall TTraction::PowerSet(TTractionPowerSource *ps)
else
{ // ustalenie punktu zasilania (nie ma jeszcze połączeń między przęsłami)
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 powinno mieć wskazania na inne
psPower[0] = psPower[1] = ps; // a to chyba nie jest dobry pomysł, bo nawet zasilane przęsło
// powinno mieć wskazania na inne
fResistance[0] = fResistance[1] = 0.0; // a liczy się tylko rezystancja zasilacza
}
};
@@ -582,27 +667,34 @@ double __fastcall TTraction::VoltageGet(double u,double i)
if (!psSection)
if (!psPowered)
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 pomiędzy nimi
// 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
// dla danego przęsła mamy 3 źródła zasilania
// 1. zasilacz psPower[0] z rezystancją fResistance[0] 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
double res = (i != 0.0) ? fabs(u / i) : 10000.0;
if (psPowered) return psPowered->CurrentGet(res)*res; //yB: dla zasilanego nie baw się w gwiazdy, tylko bierz bezpośrednio
if (psPowered)
return psPowered->CurrentGet(res) *
res; // yB: dla zasilanego nie baw się w gwiazdy, tylko bierz bezpośrednio
double r0t, r1t, r0g, r1g;
double u0, u1, i0, i1;
r0t = fResistance[0]; //średni pomysł, ale lepsze niż nic
r1t = fResistance[1]; // bo nie uwzględnia spadków z innych pojazdów
if (psPower[0] && psPower[1])
{ // 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 końcu jest równe zasilaniu,
//yB: a na drugim końcu jest równe 0. Kolejna sprawa to rozróżnienie uszynienia sieci na podstacji/odłączniku (czyli
//yB: potencjał masy na sieci) od braku zasilania (czyli odłączenie źródła od sieci i brak jego wpływu na napięcie).
// yB: Gdy wywali podstacja, to zaczyna się robić nieciekawie - napięcie w sekcji na jednym
// końcu jest równe zasilaniu,
// yB: a na drugim końcu jest równe 0. Kolejna sprawa to rozróżnienie uszynienia sieci na
// podstacji/odłączniku (czyli
// yB: potencjał masy na sieci) od braku zasilania (czyli odłączenie źródła od sieci i brak
// jego wpływu na napięcie).
if ((r0t > 0.0) && (r1t > 0.0))
{ // rezystancje w mianowniku nie mogą być zerowe
r0g = res + r0t + (res * r0t) / r1t; // przeliczenie z trójkąta na gwiazdę
r1g = res + r1t + (res * r1t) / r0t;
//pobierane są prądy dla każdej rezystancji, a suma jest mnożona przez rezystancję pojazdu w celu uzyskania napięcia
// pobierane są prądy dla każdej rezystancji, a suma jest mnożona przez rezystancję
// pojazdu w celu uzyskania napięcia
i0 = psPower[0]->CurrentGet(r0g); // oddzielnie dla sprawdzenia
i1 = psPower[1]->CurrentGet(r1g);
return (i0 + i1) * res;

View File

@@ -44,10 +44,12 @@ public:
int Wires;
float WireOffset;
AnsiString asPowerSupplyName; // McZapkie: nazwa podstacji trakcyjnej
TTractionPowerSource *psSection; //zasilacz (opcjonalnie mo¿e to byæ pulpit steruj¹cy EL2 w hali!)
TTractionPowerSource *
psSection; // zasilacz (opcjonalnie mo¿e to byæ pulpit steruj¹cy EL2 w hali!)
AnsiString 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
float fResistance[2]; //rezystancja zastêpcza do punktu zasilania (0: przês³o zasilane, <0: do policzenia)
float fResistance[2]; // rezystancja zastêpcza do punktu zasilania (0: przês³o zasilane, <0: do
// policzenia)
int iTries;
// bool bVisible;
// DWORD dwFlags;
@@ -58,7 +60,8 @@ public:
~TTraction();
// virtual void __fastcall InitCenter(vector3 Angles, vector3 pOrigin);
// virtual bool __fastcall Hit(double x, double z, vector3 &hitPoint, vector3 &hitDirection) { return TNode::Hit(x,z,hitPoint,hitDirection); };
// virtual bool __fastcall Hit(double x, double z, vector3 &hitPoint, vector3 &hitDirection)
// { return TNode::Hit(x,z,hitPoint,hitDirection); };
// virtual bool __fastcall Move(double dx, double dy, double dz) { return false; };
// virtual void __fastcall SelectedRender();
void __fastcall RenderDL(float mgn);

View File

@@ -6,7 +6,6 @@
*/
#include "system.hpp"
#include "classes.hpp"
#pragma hdrstop
@@ -45,9 +44,7 @@ __fastcall TTractionPowerSource::TTractionPowerSource()
bSection = false; // sekcja nie jest Ÿród³em zasilania, tylko grupuje przês³a
};
__fastcall TTractionPowerSource::~TTractionPowerSource()
{
};
__fastcall TTractionPowerSource::~TTractionPowerSource(){};
void __fastcall TTractionPowerSource::Init(double u, double i)
{ // ustawianie zasilacza przy braku w scenerii
@@ -63,7 +60,8 @@ bool __fastcall TTractionPowerSource::Load(cParser *parser)
// str= Parser->GetNextSymbol()LowerCase();
// asName= str;
parser->getTokens(5);
*parser >> NominalVoltage >> VoltageFrequency >> InternalRes >> MaxOutputCurrent >> FastFuseTimeOut;
*parser >> NominalVoltage >> VoltageFrequency >> InternalRes >> MaxOutputCurrent >>
FastFuseTimeOut;
parser->getTokens();
*parser >> FastFuseRepetition;
parser->getTokens();
@@ -73,35 +71,38 @@ bool __fastcall TTractionPowerSource::Load(cParser *parser)
if (token.compare("recuperation") == 0)
Recuperation = true;
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 sekcji z obwodu
bSection = true; // nie jest Ÿród³em zasilania, a jedynie informuje o pr¹dzie od³¹czenia
// sekcji z obwodu
parser->getTokens();
*parser >> token;
if (token.compare("end") != 0)
Error("tractionpowersource end statement missing");
// if (!bSection) //od³¹cznik sekcji zasadniczo nie ma impedancji (0.01 jest OK)
if (InternalRes < 0.1) // coœ ma³a ta rezystancja by³a...
InternalRes=0.2; //tak oko³o 0.2, wg http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf
InternalRes =
0.2; // tak oko³o 0.2, wg
// http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf
return true;
};
bool __fastcall TTractionPowerSource::Render()
{
return true;
};
bool __fastcall TTractionPowerSource::Render() { return true; };
bool __fastcall TTractionPowerSource::Update(double dt)
{ // powinno byæ wykonane raz na krok fizyki
if (NominalVoltage*TotalPreviousAdmitance>MaxOutputCurrent) //iloczyn napiêcia i admitancji daje pr¹d
if (NominalVoltage * TotalPreviousAdmitance >
MaxOutputCurrent) // iloczyn napiêcia i admitancji daje pr¹d
{
FastFuse = true;
FuseCounter += 1;
if (FuseCounter > FastFuseRepetition)
{SlowFuse=true;
ErrorLog("Power overload: \""+gMyNode->asName+"\" disabled for "+AnsiString(SlowFuseTimeOut)+"s");
{
SlowFuse = true;
ErrorLog("Power overload: \"" + gMyNode->asName + "\" disabled for " +
AnsiString(SlowFuseTimeOut) + "s");
}
else
ErrorLog("Power overload: \""+gMyNode->asName+"\" disabled for "+AnsiString(FastFuseTimeOut)+"s");
ErrorLog("Power overload: \"" + gMyNode->asName + "\" disabled for " +
AnsiString(FastFuseTimeOut) + "s");
FuseTimer = 0;
}
if (FastFuse || SlowFuse)
@@ -113,9 +114,9 @@ bool __fastcall TTractionPowerSource::Update(double dt)
if (FuseTimer > FastFuseTimeOut)
FastFuse = false;
}
else
if (FuseTimer>SlowFuseTimeOut)
{SlowFuse=false;
else if (FuseTimer > SlowFuseTimeOut)
{
SlowFuse = false;
FuseCounter = 0; // dajemy znów szansê
}
}
@@ -136,10 +137,14 @@ double __fastcall TTractionPowerSource::CurrentGet(double res)
return 0;
}
if ((res > 0) || ((res < 0) && (Recuperation)))
TotalAdmitance+=1.0/res; //po³¹czenie równoleg³e rezystancji jest równowa¿ne sumie admitancji
TotalCurrent=(TotalPreviousAdmitance!=0.0)?NominalVoltage/(InternalRes+1.0/TotalPreviousAdmitance):0.0; //napiêcie dzielone przez sumê rezystancji wewnêtrznej i obci¹¿enia
TotalAdmitance +=
1.0 / res; // po³¹czenie równoleg³e rezystancji jest równowa¿ne sumie admitancji
TotalCurrent = (TotalPreviousAdmitance != 0.0) ?
NominalVoltage / (InternalRes + 1.0 / TotalPreviousAdmitance) :
0.0; // napiêcie dzielone przez sumê rezystancji wewnêtrznej i obci¹¿enia
OutputVoltage = NominalVoltage - InternalRes * TotalCurrent; // napiêcie na obci¹¿eniu
return TotalCurrent/(res*TotalPreviousAdmitance); //pr¹d proporcjonalny do udzia³u (1/res) w ca³kowitej admitancji
return TotalCurrent / (res * TotalPreviousAdmitance); // pr¹d proporcjonalny do udzia³u (1/res)
// w ca³kowitej admitancji
};
void __fastcall TTractionPowerSource::PowerSet(TTractionPowerSource *ps)

View File

@@ -26,8 +26,8 @@ private:
bool SlowFuse;
double FuseTimer;
int FuseCounter;
protected:
protected:
public: // zmienne publiczne
TTractionPowerSource *psNode[2]; // zasilanie na koñcach dla sekcji
bool bSection; // czy jest sekcj¹

1476
Train.cpp

File diff suppressed because it is too large Load Diff

14
Train.h
View File

@@ -17,7 +17,6 @@
#include "RealSound.h"
#include "FadeSound.h"
// typedef enum {st_Off, st_Starting, st_On, st_ShuttingDown} T4State;
const int maxcab = 2;
@@ -37,7 +36,8 @@ class TCab
public:
__fastcall TCab();
__fastcall ~TCab();
void __fastcall Init(double Initx1,double Inity1,double Initz1,double Initx2,double Inity2,double Initz2,bool InitEnabled,bool InitOccupied);
void __fastcall Init(double Initx1, double Inity1, double Initz1, double Initx2, double Inity2,
double Initz2, bool InitEnabled, bool InitOccupied);
void __fastcall Load(TQueryParserComp *Parser);
vector3 CabPos1;
vector3 CabPos2;
@@ -45,7 +45,8 @@ public:
bool bOccupied;
double dimm_r, dimm_g, dimm_b; // McZapkie-120503: tlumienie swiatla
double intlit_r, intlit_g, intlit_b; // McZapkie-120503: oswietlenie kabiny
double intlitlow_r, intlitlow_g, intlitlow_b; //McZapkie-120503: przyciemnione oswietlenie kabiny
double intlitlow_r, intlitlow_g,
intlitlow_b; // McZapkie-120503: przyciemnione oswietlenie kabiny
private:
// bool bChangePossible;
TGauge *ggList; // Ra 2014-08: lista animacji macierzowych (ga³ek) w kabinie
@@ -58,7 +59,6 @@ public:
void __fastcall Update();
};
class TTrain
{
public:
@@ -93,7 +93,6 @@ private: //
TMoverParameters *mvSecond; // drugi cz³on (ET40, ET41, ET42, ukrotnienia)
TMoverParameters *mvThird; // trzeci cz³on (SN61)
public: // reszta mo¿e byæ publiczna
// AnsiString asMessage;
// McZapkie: definicje wskaŸników
@@ -138,7 +137,8 @@ public: //reszta mo
TGauge ggReleaserButton;
TGauge ggAntiSlipButton;
TGauge ggFuseButton;
TGauge ggConverterFuseButton; //hunter-261211: przycisk odblokowania nadmiarowego przetwornic i ogrzewania
TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania nadmiarowego przetwornic i
// ogrzewania
TGauge ggStLinOffButton;
TGauge ggRadioButton;
TGauge ggUpperLightButton;
@@ -297,7 +297,6 @@ public: //reszta mo
PSound dsbWejscie_na_bezoporow;
PSound dsbWejscie_na_drugi_uklad; // hunter-081211: poprawka literowki
// PSound dsbHiss1;
// PSound dsbHiss2;
@@ -326,6 +325,7 @@ public: //reszta mo
vector3 pMechSittingPosition; // ABu 180404
vector3 __fastcall MirrorPosition(bool lewe);
private:
// PSound dsbBuzzer;
PSound dsbCouplerStretch;

View File

@@ -30,9 +30,7 @@ __fastcall TTrackFollower::TTrackFollower()
fOffsetH = 0.0; // na starcie stoi na środku
}
__fastcall TTrackFollower::~TTrackFollower()
{
}
__fastcall TTrackFollower::~TTrackFollower() {}
bool __fastcall TTrackFollower::Init(TTrack *pTrack, TDynamicObject *NewOwner, double fDir)
{
@@ -50,21 +48,28 @@ TTrack* __fastcall TTrackFollower::SetCurrentTrack(TTrack *pTrack,int end)
{ // przejechanie na inny odcinkek toru, z ewentualnym rozpruciem
if (pTrack)
switch (pTrack->eType)
{case tt_Switch: //jeśli zwrotnica, to przekładamy ją, aby uzyskać dobry segment
{int i=(end?pCurrentTrack->iNextDirection:pCurrentTrack->iPrevDirection);
{
case tt_Switch: // jeśli zwrotnica, to przekładamy ją, aby uzyskać dobry segment
{
int i = (end ? pCurrentTrack->iNextDirection : pCurrentTrack->iPrevDirection);
if (i > 0) // jeżeli wjazd z ostrza
pTrack->SwitchForced(i >> 1, Owner); // to przełożenie zwrotnicy - rozprucie!
}
break;
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
//Ra 2014-08: aby ustalić dalszą trasę, należy zapytać AI - trasa jest ustalana 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
// skanowania
// Ra 15-01: zapytanie AI nie wybiera segmentu - kolejny skanujący może przestawić
//pTrack->CrossSegment(end?pCurrentTrack->iNextDirection:pCurrentTrack->iPrevDirection,i); //ustawienie właściwego wskaźnika
// pTrack->CrossSegment(end?pCurrentTrack->iNextDirection:pCurrentTrack->iPrevDirection,i);
// //ustawienie właściwego wskaźnika
// 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 bezpośrednio
// if fDirection=(iSegment>0)?1.0:-1.0; //kierunek na tym segmencie jest ustalany
// bezpośrednio
if (iSegment == 0)
{//to jest błędna sytuacja - generuje pętle zawracające za skrzyżowaniem - ustalić, kiedy powstaje!
{ // to jest błędna sytuacja - generuje pętle zawracające za skrzyżowaniem - ustalić,
// kiedy powstaje!
iSegment = 1; // doraźna poprawka
}
if ((end ? iSegment : -iSegment) < 0)
@@ -75,7 +80,8 @@ TTrack* __fastcall TTrackFollower::SetCurrentTrack(TTrack *pTrack,int end)
}
if (!pTrack)
{ // gdy nie ma toru w kierunku jazdy
pTrack=pCurrentTrack->NullCreate(end); //tworzenie toru wykolejącego na przedłużeniu pCurrentTrack
pTrack = pCurrentTrack->NullCreate(
end); // tworzenie toru wykolejącego na przedłużeniu pCurrentTrack
if (!end) // jeśli dodana od strony zero, to zmiana kierunku
fDirection = -fDirection; // wtórna zmiana
// if (pTrack->iCategoryFlag&2)
@@ -89,7 +95,8 @@ TTrack* __fastcall TTrackFollower::SetCurrentTrack(TTrack *pTrack,int end)
else
{ // 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
if (pCurrentTrack) pCurrentTrack->AxleCounter(-1,Owner); //opuszczenie tamtego toru
if (pCurrentTrack)
pCurrentTrack->AxleCounter(-1, Owner); // opuszczenie tamtego toru
}
pCurrentTrack = pTrack;
pCurrentSegment = (pCurrentTrack ? pCurrentTrack->CurrentSegment() : NULL);
@@ -108,36 +115,52 @@ bool __fastcall TTrackFollower::Move(double fDistance,bool bPrimary)
bool bCanSkip; // czy przemieścić pojazd na inny tor
while (true) // pętla wychodzi, gdy przesunięcie wyjdzie zerowe
{ // pętla przesuwająca wózek przez kolejne tory, aż do trafienia w jakiś
if (!pCurrentTrack) return false; //nie ma toru, to nie ma przesuwania
if (!pCurrentTrack)
return false; // nie ma toru, to nie ma przesuwania
if (pCurrentTrack->iEvents) // sumaryczna informacja o eventach
{ // omijamy cały ten blok, gdy tor nie ma on żadnych eventów (większość nie ma)
if (fDistance < 0)
{
if (iSetFlag(iEventFlag,-1)) //zawsze zeruje flagę sprawdzenia, jak mechanik dosiądzie, to się nie wykona
if (iSetFlag(iEventFlag, -1)) // zawsze zeruje flagę sprawdzenia, jak mechanik
// dosiądzie, to się nie wykona
if (Owner->Mechanik) // tylko dla jednego członu
//if (TestFlag(iEventFlag,1)) //McZapkie-280503: wyzwalanie event tylko dla pojazdow z obsada
if (bPrimary && pCurrentTrack->evEvent1 && (!pCurrentTrack->evEvent1->iQueued))
Global::AddToQuery(pCurrentTrack->evEvent1,Owner); //dodanie do kolejki
//Owner->RaAxleEvent(pCurrentTrack->Event1); //Ra: dynamic zdecyduje, czy dodać do kolejki
// if (TestFlag(iEventFlag,1)) //McZapkie-280503: wyzwalanie event tylko dla
// pojazdow z obsada
if (bPrimary && pCurrentTrack->evEvent1 &&
(!pCurrentTrack->evEvent1->iQueued))
Global::AddToQuery(pCurrentTrack->evEvent1, Owner); // dodanie do
// kolejki
// Owner->RaAxleEvent(pCurrentTrack->Event1); //Ra: dynamic zdecyduje, czy dodać do
// kolejki
// if (TestFlag(iEventallFlag,1))
if (iSetFlag(iEventallFlag,-1)) //McZapkie-280503: wyzwalanie eventall dla wszystkich pojazdow
if (bPrimary && pCurrentTrack->evEventall1 && (!pCurrentTrack->evEventall1->iQueued))
if (iSetFlag(iEventallFlag,
-1)) // McZapkie-280503: wyzwalanie eventall dla wszystkich pojazdow
if (bPrimary && pCurrentTrack->evEventall1 &&
(!pCurrentTrack->evEventall1->iQueued))
Global::AddToQuery(pCurrentTrack->evEventall1, Owner); // dodanie do kolejki
//Owner->RaAxleEvent(pCurrentTrack->Eventall1); //Ra: dynamic zdecyduje, czy dodać do kolejki
// Owner->RaAxleEvent(pCurrentTrack->Eventall1); //Ra: dynamic zdecyduje, czy dodać
// do kolejki
}
else if (fDistance > 0)
{
if (iSetFlag(iEventFlag,-2)) //zawsze ustawia flagę sprawdzenia, jak mechanik dosiądzie, to się nie wykona
if (iSetFlag(iEventFlag, -2)) // zawsze ustawia flagę sprawdzenia, jak mechanik
// dosiądzie, to się nie wykona
if (Owner->Mechanik) // tylko dla jednego członu
//if (TestFlag(iEventFlag,2)) //sprawdzanie jest od razu w pierwszym warunku
if (bPrimary && pCurrentTrack->evEvent2 && (!pCurrentTrack->evEvent2->iQueued))
// if (TestFlag(iEventFlag,2)) //sprawdzanie jest od razu w pierwszym
// warunku
if (bPrimary && pCurrentTrack->evEvent2 &&
(!pCurrentTrack->evEvent2->iQueued))
Global::AddToQuery(pCurrentTrack->evEvent2, Owner);
//Owner->RaAxleEvent(pCurrentTrack->Event2); //Ra: dynamic zdecyduje, czy dodać do kolejki
// Owner->RaAxleEvent(pCurrentTrack->Event2); //Ra: dynamic zdecyduje, czy dodać do
// kolejki
// if (TestFlag(iEventallFlag,2))
if (iSetFlag(iEventallFlag,-2)) //sprawdza i zeruje na przyszłość, true jeśli zmieni z 2 na 0
if (bPrimary && pCurrentTrack->evEventall2 && (!pCurrentTrack->evEventall2->iQueued))
if (iSetFlag(iEventallFlag,
-2)) // sprawdza i zeruje na przyszłość, true jeśli zmieni z 2 na 0
if (bPrimary && pCurrentTrack->evEventall2 &&
(!pCurrentTrack->evEventall2->iQueued))
Global::AddToQuery(pCurrentTrack->evEventall2, Owner);
//Owner->RaAxleEvent(pCurrentTrack->Eventall2); //Ra: dynamic zdecyduje, czy dodać do kolejki
// Owner->RaAxleEvent(pCurrentTrack->Eventall2); //Ra: dynamic zdecyduje, czy dodać
// do kolejki
}
else // if (fDistance==0) //McZapkie-140602: wyzwalanie zdarzenia gdy pojazd stoi
{
@@ -145,11 +168,13 @@ bool __fastcall TTrackFollower::Move(double fDistance,bool bPrimary)
if (pCurrentTrack->evEvent0)
if (!pCurrentTrack->evEvent0->iQueued)
Global::AddToQuery(pCurrentTrack->evEvent0, Owner);
//Owner->RaAxleEvent(pCurrentTrack->Event0); //Ra: dynamic zdecyduje, czy dodać do kolejki
// Owner->RaAxleEvent(pCurrentTrack->Event0); //Ra: dynamic zdecyduje, czy dodać do
// kolejki
if (pCurrentTrack->evEventall0)
if (!pCurrentTrack->evEventall0->iQueued)
Global::AddToQuery(pCurrentTrack->evEventall0, Owner);
//Owner->RaAxleEvent(pCurrentTrack->Eventall0); //Ra: dynamic zdecyduje, czy dodać do kolejki
// Owner->RaAxleEvent(pCurrentTrack->Eventall0); //Ra: dynamic zdecyduje, czy dodać
// do kolejki
}
}
if (!pCurrentSegment) // jeżeli nie ma powiązanego segmentu toru?
@@ -167,20 +192,24 @@ bool __fastcall TTrackFollower::Move(double fDistance,bool bPrimary)
{//zjazdu ze skrzyżowania nie da się określić przez (iPrevDirection) i (iNextDirection)
//int segment=Owner->RouteWish(pCurrentTrack); //numer segmentu dla skrzyżowań
//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)
{ // jeśli przekroczenie toru od strony Point1
bCanSkip = bPrimary ? pCurrentTrack->CheckDynamicObject(Owner) : false;
if (bCanSkip) // tylko główna oś przenosi pojazd do innego toru
Owner->MyTrack->RemoveDynamicObject(Owner); //zdejmujemy pojazd z dotychczasowego toru
Owner->MyTrack->RemoveDynamicObject(
Owner); // zdejmujemy pojazd z dotychczasowego toru
dir = fDirection;
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
}
else if (!SetCurrentTrack(pCurrentTrack->Neightbour(-1,fDirection),0)) //ustawia fDirection
else if (!SetCurrentTrack(pCurrentTrack->Neightbour(-1, fDirection),
0)) // ustawia fDirection
return false; // wyjście z błędem
if (dir == fDirection) //(pCurrentTrack->iPrevDirection)
{ // gdy kierunek bez zmiany (Point1->Point2)
@@ -195,9 +224,11 @@ bool __fastcall TTrackFollower::Move(double fDistance,bool bPrimary)
if (bCanSkip)
{ // jak główna oś, to dodanie pojazdu do nowego toru
pCurrentTrack->AddDynamicObject(Owner);
iEventFlag=3; //McZapkie-020602: umozliwienie uruchamiania event1,2 po zmianie toru
iEventFlag =
3; // McZapkie-020602: umozliwienie uruchamiania event1,2 po zmianie toru
iEventallFlag = 3; // McZapkie-280503: jw, dla eventall1,2
if (!Owner->MyTrack) return false;
if (!Owner->MyTrack)
return false;
}
continue;
}
@@ -205,14 +236,17 @@ bool __fastcall TTrackFollower::Move(double fDistance,bool bPrimary)
{ // jeśli przekroczenie toru od strony Point2
bCanSkip = bPrimary ? pCurrentTrack->CheckDynamicObject(Owner) : false;
if (bCanSkip) // tylko główna oś przenosi pojazd do innego toru
Owner->MyTrack->RemoveDynamicObject(Owner); //zdejmujemy pojazd z dotychczasowego toru
Owner->MyTrack->RemoveDynamicObject(
Owner); // zdejmujemy pojazd z dotychczasowego toru
fDistance = s - pCurrentSegment->GetLength();
dir = fDirection;
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
}
else if (!SetCurrentTrack(pCurrentTrack->Neightbour(1,fDirection),1)) //ustawia fDirection
else if (!SetCurrentTrack(pCurrentTrack->Neightbour(1, fDirection),
1)) // ustawia fDirection
return false; // wyjście z błędem
if (dir != fDirection) //(pCurrentTrack->iNextDirection)
{ // gdy zmiana kierunku toru (Point2->Point2)
@@ -224,9 +258,11 @@ bool __fastcall TTrackFollower::Move(double fDistance,bool bPrimary)
if (bCanSkip)
{ // jak główna oś, to dodanie pojazdu do nowego toru
pCurrentTrack->AddDynamicObject(Owner);
iEventFlag=3; //McZapkie-020602: umozliwienie uruchamiania event1,2 po zmianie toru
iEventFlag =
3; // McZapkie-020602: umozliwienie uruchamiania event1,2 po zmianie toru
iEventallFlag = 3;
if (!Owner->MyTrack) return false;
if (!Owner->MyTrack)
return false;
}
continue;
}
@@ -263,11 +299,11 @@ bool __fastcall TTrackFollower::ComputatePosition()
{ // kąty są w przedziale <-M_PI;M_PI>
vAngles.x = -vAngles.x; // przechyłka jest w przecinwą stronę
vAngles.y = -vAngles.y; // pochylenie jest w przecinwą stronę
vAngles.z+=(vAngles.z>=M_PI)?-M_PI:M_PI; //ale kierunek w planie jest obrócony o 180°
vAngles.z +=
(vAngles.z >= M_PI) ? -M_PI : M_PI; // ale kierunek w planie jest obrócony o 180°
}
if (fOffsetH != 0.0)
{ // jeśli przesunięcie względem osi toru, to je doliczyć
}
return true;
}

View File

@@ -18,7 +18,8 @@ private:
TDynamicObject *Owner; // pojazd posiadający
int iEventFlag; // McZapkie-020602: informacja o tym czy wyzwalac zdarzenie: 0,1,2,3
int iEventallFlag;
int iSegment; //który segment toru jest używany (żeby nie przeskakiwało po przestawieniu zwrotnicy pod taborem)
int iSegment; // który segment toru jest używany (żeby nie przeskakiwało po przestawieniu
// zwrotnicy pod taborem)
public:
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
@@ -28,7 +29,10 @@ public:
TTrack *__fastcall SetCurrentTrack(TTrack *pTrack, int end);
bool __fastcall Move(double fDistance, bool bPrimary);
inline TTrack *__fastcall GetTrack() { return pCurrentTrack; };
inline double __fastcall GetRoll() {return vAngles.x;}; //przechyłka policzona przy ustalaniu pozycji
inline double __fastcall GetRoll()
{
return vAngles.x;
}; // przechyłka policzona przy ustalaniu pozycji
//{return pCurrentSegment->GetRoll(fCurrentDistance)*fDirection;}; //zamiast liczyć można pobrać
inline double __fastcall GetDirection() { return fDirection; }; // zwrot na torze
inline double __fastcall GetTranslation() { return fCurrentDistance; }; // ABu-030403

16
VBO.cpp
View File

@@ -33,9 +33,12 @@ void __fastcall CMesh::BuildVBOs(bool del)
// pobierz numer VBO oraz ustaw go jako aktywny
glGenBuffersARB(1, &m_nVBOVertices); // pobierz numer
glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices); // ustaw bufor jako aktualny
glBufferDataARB(GL_ARRAY_BUFFER_ARB,m_nVertexCount*sizeof(CVertNormTex),m_pVNT,GL_STATIC_DRAW_ARB);
//WriteLog("Assigned VBO number "+AnsiString(m_nVBOVertices)+", vertices: "+AnsiString(m_nVertexCount));
if (del) SafeDeleteArray(m_pVNT); //wierzchołki już się nie przydadzą
glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_nVertexCount * sizeof(CVertNormTex), m_pVNT,
GL_STATIC_DRAW_ARB);
// WriteLog("Assigned VBO number "+AnsiString(m_nVBOVertices)+", vertices:
// "+AnsiString(m_nVertexCount));
if (del)
SafeDeleteArray(m_pVNT); // wierzchołki już się nie przydadzą
};
void __fastcall CMesh::Clear()
@@ -53,7 +56,8 @@ void __fastcall CMesh::Clear()
bool __fastcall CMesh::StartVBO()
{ // początek rysowania elementów z VBO
if (m_nVertexCount<=0) return false; //nie ma nic do rysowania w ten sposób
if (m_nVertexCount <= 0)
return false; // nie ma nic do rysowania w ten sposób
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -69,7 +73,8 @@ bool __fastcall CMesh::StartVBO()
bool __fastcall CMesh::StartColorVBO()
{ // początek rysowania punktów świecących z VBO
if (m_nVertexCount<=0) return false; //nie ma nic do rysowania w ten sposób
if (m_nVertexCount <= 0)
return false; // nie ma nic do rysowania w ten sposób
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
if (m_nVBOVertices)
@@ -92,4 +97,3 @@ void __fastcall CMesh::EndVBO()
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); // Ra: to na przyszłość
};

1
VBO.h
View File

@@ -33,4 +33,3 @@ public:
};
#endif

1036
World.cpp

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,6 @@
#ifndef WorldH
#define WorldH
#include "Usefull.h"
#include "Classes.h"
#include "Texture.h"
@@ -19,6 +18,7 @@ class TWorld
void __fastcall InOutKey();
void __fastcall FollowView(bool wycisz = true);
void __fastcall DistantView();
public:
bool __fastcall Init(HWND NhWnd, HDC hDC);
HWND hWnd;

View File

@@ -2,7 +2,8 @@
#include "fastmath.h"
#include <cassert>
namespace Math3D {
namespace Math3D
{
void __fastcall vector3::RotateX(double angle)
{
@@ -39,35 +40,57 @@ void inline __fastcall vector3::SafeNormalize()
}
// From code in Graphics Gems; p. 766
inline scalar_t det2x2 (scalar_t a, scalar_t b, scalar_t c, scalar_t d) {
return a*d - b*c;
inline scalar_t det2x2(scalar_t a, scalar_t b, scalar_t c, scalar_t d) { return a * d - b * c; }
inline scalar_t det3x3(scalar_t a1, scalar_t a2, scalar_t a3, scalar_t b1, scalar_t b2, scalar_t b3,
scalar_t c1, scalar_t c2, scalar_t c3)
{
return a1 * det2x2(b2, b3, c2, c3) - b1 * det2x2(a2, a3, c2, c3) + c1 * det2x2(a2, a3, b2, b3);
}
inline scalar_t det3x3 ( scalar_t a1, scalar_t a2, scalar_t a3,
scalar_t b1, scalar_t b2, scalar_t b3,
scalar_t c1, scalar_t c2, scalar_t c3) {
return a1 * det2x2(b2, b3, c2, c3)
- b1 * det2x2(a2, a3, c2, c3)
+ c1 * det2x2(a2, a3, b2, b3);
scalar_t Determinant(const matrix4x4 &m)
{
scalar_t a1 = m[0][0];
scalar_t a2 = m[1][0];
scalar_t a3 = m[2][0];
scalar_t a4 = m[3][0];
scalar_t b1 = m[0][1];
scalar_t b2 = m[1][1];
scalar_t b3 = m[2][1];
scalar_t b4 = m[3][1];
scalar_t c1 = m[0][2];
scalar_t c2 = m[1][2];
scalar_t c3 = m[2][2];
scalar_t c4 = m[3][2];
scalar_t d1 = m[0][3];
scalar_t d2 = m[1][3];
scalar_t d3 = m[2][3];
scalar_t d4 = m[3][3];
return a1 * det3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4) -
b1 * det3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4) +
c1 * det3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4) -
d1 * det3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
}
scalar_t Determinant (const matrix4x4& m) {
scalar_t a1 = m[0][0]; scalar_t a2 = m[1][0]; scalar_t a3 = m[2][0]; scalar_t a4 = m[3][0];
scalar_t b1 = m[0][1]; scalar_t b2 = m[1][1]; scalar_t b3 = m[2][1]; scalar_t b4 = m[3][1];
scalar_t c1 = m[0][2]; scalar_t c2 = m[1][2]; scalar_t c3 = m[2][2]; scalar_t c4 = m[3][2];
scalar_t d1 = m[0][3]; scalar_t d2 = m[1][3]; scalar_t d3 = m[2][3]; scalar_t d4 = m[3][3];
return a1 * det3x3(b2, b3, b4, c2, c3, c4, d2, d3, d4)
- b1 * det3x3(a2, a3, a4, c2, c3, c4, d2, d3, d4)
+ c1 * det3x3(a2, a3, a4, b2, b3, b4, d2, d3, d4)
- d1 * det3x3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
}
matrix4x4 Adjoint (const matrix4x4& m) {
scalar_t a1 = m[0][0]; scalar_t a2 = m[0][1]; scalar_t a3 = m[0][2]; scalar_t a4 = m[0][3];
scalar_t b1 = m[1][0]; scalar_t b2 = m[1][1]; scalar_t b3 = m[1][2]; scalar_t b4 = m[1][3];
scalar_t c1 = m[2][0]; scalar_t c2 = m[2][1]; scalar_t c3 = m[2][2]; scalar_t c4 = m[2][3];
scalar_t d1 = m[3][0]; scalar_t d2 = m[3][1]; scalar_t d3 = m[3][2]; scalar_t d4 = m[3][3];
matrix4x4 Adjoint(const matrix4x4 &m)
{
scalar_t a1 = m[0][0];
scalar_t a2 = m[0][1];
scalar_t a3 = m[0][2];
scalar_t a4 = m[0][3];
scalar_t b1 = m[1][0];
scalar_t b2 = m[1][1];
scalar_t b3 = m[1][2];
scalar_t b4 = m[1][3];
scalar_t c1 = m[2][0];
scalar_t c2 = m[2][1];
scalar_t c3 = m[2][2];
scalar_t c4 = m[2][3];
scalar_t d1 = m[3][0];
scalar_t d2 = m[3][1];
scalar_t d3 = m[3][2];
scalar_t d4 = m[3][3];
// Adjoint(x,y) = -1^(x+y) * a(y,x)
// Where a(i,j) is the 3x3 determinant of m with row i and col j removed
@@ -95,13 +118,16 @@ matrix4x4 Adjoint (const matrix4x4& m) {
return retVal;
}
matrix4x4 Inverse (const matrix4x4& m) {
matrix4x4 Inverse(const matrix4x4 &m)
{
matrix4x4 retVal = Adjoint(m);
scalar_t det = Determinant(m);
assert(det);
for (int i=0;i<4;++i) {
for (int j=0;j<4;++j) {
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 4; ++j)
{
retVal(i)[j] /= det;
}
}
@@ -110,8 +136,6 @@ matrix4x4 Inverse (const matrix4x4& m) {
}
}
//**************************************
// Testing from here on.
//**************************************
@@ -123,11 +147,13 @@ using namespace std;
static int failures = 0;
void ReportFailure (const char* className, const char* testName, bool passed) {
void ReportFailure(const char *className, const char *testName, bool passed)
{
cout << className;
if (passed)
cout << " passed test ";
else {
else
{
cout << " FAILED test ";
++failures;
}
@@ -137,31 +163,42 @@ void ReportFailure (const char* className, const char* testName, bool passed) {
const char *vector3Name = "vector3";
const char *matrix4x4Name = "matrix4x4";
void Testvector3Constructors(void) {
void Testvector3Constructors(void)
{
// Default ctor... just make sure it compiles
vector3 defaultCtorTest;
// Initializer ctor test (3 param)
vector3 initCtorTest(1, 2, 3);
ReportFailure (vector3Name, "initialized ctor (3 parameter version)", (initCtorTest[0] == 1 && initCtorTest[1] == 2 && initCtorTest[2] == 3 && initCtorTest[3] == 1));
ReportFailure(vector3Name, "initialized ctor (3 parameter version)",
(initCtorTest[0] == 1 && initCtorTest[1] == 2 && initCtorTest[2] == 3 &&
initCtorTest[3] == 1));
// Initializer ctor test (4 param)
vector3 initCtorTest2(1, 2, 3, 4);
ReportFailure (vector3Name, "initialized ctor (4 parameter version)", (initCtorTest2[0] == 1 && initCtorTest2[1] == 2 && initCtorTest2[2] == 3 && initCtorTest2[3] == 4));
ReportFailure(vector3Name, "initialized ctor (4 parameter version)",
(initCtorTest2[0] == 1 && initCtorTest2[1] == 2 && initCtorTest2[2] == 3 &&
initCtorTest2[3] == 4));
scalar_t initArray[] = {1, 2, 3, 4};
vector3 initCtorArrayTest3(initArray);
ReportFailure (vector3Name, "array initialized ctor (3 parameter version)", (initCtorArrayTest3[0] == 1 && initCtorArrayTest3[1] == 2 && initCtorArrayTest3[2] == 3 && initCtorArrayTest3[3] == 1));
ReportFailure(vector3Name, "array initialized ctor (3 parameter version)",
(initCtorArrayTest3[0] == 1 && initCtorArrayTest3[1] == 2 &&
initCtorArrayTest3[2] == 3 && initCtorArrayTest3[3] == 1));
vector3 initCtorArrayTest4(initArray, 4);
ReportFailure (vector3Name, "array initialized ctor (4 parameter version)", (initCtorArrayTest4[0] == 1 && initCtorArrayTest4[1] == 2 && initCtorArrayTest4[2] == 3 && initCtorArrayTest4[3] == 4));
ReportFailure(vector3Name, "array initialized ctor (4 parameter version)",
(initCtorArrayTest4[0] == 1 && initCtorArrayTest4[1] == 2 &&
initCtorArrayTest4[2] == 3 && initCtorArrayTest4[3] == 4));
// Copy ctor test
vector3 copyCtorTest(initCtorTest2);
ReportFailure (vector3Name, "copy ctor", (copyCtorTest[0] == 1 && copyCtorTest[1] == 2 && copyCtorTest[2] == 3 && copyCtorTest[3] == 4));
ReportFailure(vector3Name, "copy ctor", (copyCtorTest[0] == 1 && copyCtorTest[1] == 2 &&
copyCtorTest[2] == 3 && copyCtorTest[3] == 4));
}
void Testvector3Comparison(void) {
void Testvector3Comparison(void)
{
vector3 alpha(1, 1, 1);
vector3 beta(alpha);
vector3 gamma(2, 3, 4);
@@ -173,14 +210,16 @@ void Testvector3Comparison(void) {
ReportFailure(vector3Name, "comparison operator test 3", !(gamma < beta));
}
void Testvector3Assignment (void) {
void Testvector3Assignment(void)
{
vector3 alpha(1, 1, 1, 1);
vector3 beta(10, 10, 10, 10);
alpha = beta;
ReportFailure(vector3Name, "assignment operator", (alpha == beta));
}
void Testvector3UnaryOps (void) {
void Testvector3UnaryOps(void)
{
vector3 alpha(10, 10, 10, 10);
vector3 beta(-10, -10, -10, -10);
alpha = -alpha;
@@ -195,16 +234,19 @@ void Testvector3UnaryOps (void) {
// Done without /= on vector3, as we want to be independant of failure of /=
// Earlier failures should be resolved before later ones (just like C++)
beta = alpha;
for (int i=0;i<3;++i) beta(i) /= SQRT_FUNCTION(300);
for (int i = 0; i < 3; ++i)
beta(i) /= SQRT_FUNCTION(300);
beta(3) = 1;
ReportFailure(vector3Name, "normalize 3 element version", Normalize3(alpha) == beta);
beta = alpha;
for (int i=0;i<4;++i) beta(i) /= SQRT_FUNCTION(400);
for (int i = 0; i < 4; ++i)
beta(i) /= SQRT_FUNCTION(400);
ReportFailure(vector3Name, "normalize 4 element version", Normalize4(alpha) == beta);
}
void Testvector3BinaryOps (void) {
void Testvector3BinaryOps(void)
{
// Vector * Matrix is tested in Testmatrix4x4BinaryOps
vector3 testVec(1, 1, 1, 1);
vector3 deltaVec(1, 2, 3, 4);
@@ -238,7 +280,8 @@ void Testvector3BinaryOps (void) {
ReportFailure(vector3Name, "cross product", crossVec == CrossProduct(testVec, deltaVec));
}
void Testvector3 (void) {
void Testvector3(void)
{
// Accessors cannot be tested effectively...
// They are really trivial, and so don't really need testing,
// but more importantly, how do you test the ctors without assuming
@@ -252,37 +295,34 @@ void Testvector3 (void) {
Testvector3BinaryOps();
}
void Testmatrix4x4Constructors (void) {
void Testmatrix4x4Constructors(void)
{
// Check if default ctor compiles
matrix4x4 defaultTest;
scalar_t initArray[] = { 0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15 };
scalar_t initArray[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
matrix4x4 arrayTest;
arrayTest.C_Matrix(initArray);
bool passedTest = true;
for (int x=0;x<4;++x) for (int y=0;y<4;++y)
if (arrayTest[x][y] != initArray[(y<<2) + x]) passedTest = false;
for (int x = 0; x < 4; ++x)
for (int y = 0; y < 4; ++y)
if (arrayTest[x][y] != initArray[(y << 2) + x])
passedTest = false;
ReportFailure(matrix4x4Name, "array constructor", passedTest);
matrix4x4 copyTest(arrayTest);
passedTest = true;
for (int x=0;x<4;++x) for (int y=0;y<4;++y)
if (arrayTest[x][y] != copyTest[x][y]) passedTest = false;
for (int x = 0; x < 4; ++x)
for (int y = 0; y < 4; ++y)
if (arrayTest[x][y] != copyTest[x][y])
passedTest = false;
ReportFailure(matrix4x4Name, "copy constructor", passedTest);
}
void Testmatrix4x4Comparison (void) {
scalar_t initArray[] = { 0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15 };
scalar_t initArray2[] = { 1, 1, 1, 1,
1, 1, 1, 1,
1, 1, 1, 1,
1, 1, 1, 1 };
void Testmatrix4x4Comparison(void)
{
scalar_t initArray[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
scalar_t initArray2[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
matrix4x4 alpha, beta, gamma;
alpha.C_Matrix(initArray);
beta.C_Matrix(initArray);
@@ -295,16 +335,12 @@ void Testmatrix4x4Comparison (void) {
ReportFailure(matrix4x4Name, "comparison test 3", !(alpha < beta));
}
void Testmatrix4x4BinaryOps (void) {
void Testmatrix4x4BinaryOps(void)
{
scalar_t initVector[] = {0, 1, 2, 3};
scalar_t initMatrix[] = { 0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15 };
scalar_t resultVector[] = { 0 * 0 + 1 * 1 + 2 * 2 + 3 * 3,
0 * 4 + 1 * 5 + 2 * 6 + 3 * 7,
0 * 8 + 1 * 9 + 2 * 10 + 3 * 11,
0 * 12 + 1 * 13 + 2 * 14 + 3 * 15 };
scalar_t initMatrix[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
scalar_t resultVector[] = {0 * 0 + 1 * 1 + 2 * 2 + 3 * 3, 0 * 4 + 1 * 5 + 2 * 6 + 3 * 7,
0 * 8 + 1 * 9 + 2 * 10 + 3 * 11, 0 * 12 + 1 * 13 + 2 * 14 + 3 * 15};
vector3 vector1(initVector, 4);
matrix4x4 matrix1;
@@ -312,28 +348,30 @@ void Testmatrix4x4BinaryOps (void) {
vector3 vectorTest(resultVector, 4);
ReportFailure(matrix4x4Name, "matrix * vector", vectorTest == matrix1 * vector1);
scalar_t initMatrix2[] = { 15, 14, 13, 12,
11, 10, 9, 8,
7, 6, 5, 4,
3, 2, 1, 0 };
scalar_t initMatrix2[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
matrix4x4 matrix2;
matrix2.C_Matrix(initMatrix2);
matrix4x4 resultMatrix;
for (int x=0;x<4;++x) for (int y=0;y<4;++y) {
for (int x = 0; x < 4; ++x)
for (int y = 0; y < 4; ++y)
{
resultMatrix(x)[y] = 0;
for (int i=0;i<4;++i) resultMatrix(x)[y] += matrix1[i][y] * matrix2[x][i];
for (int i = 0; i < 4; ++i)
resultMatrix(x)[y] += matrix1[i][y] * matrix2[x][i];
}
ReportFailure(matrix4x4Name, "matrix * matrix", resultMatrix == matrix1 * matrix2);
}
void Testmatrix4x4 (void) {
void Testmatrix4x4(void)
{
Testmatrix4x4Constructors();
Testmatrix4x4Comparison();
Testmatrix4x4BinaryOps();
}
int main (int, char*[]) {
int main(int, char *[])
{
int vectorFailures = 0;
int matrixFailures = 0;
Testvector3();
@@ -347,12 +385,13 @@ int main (int, char*[]) {
cout << "* *" << endl;
if (vectorFailures + matrixFailures == 0)
cout << "* No failures detected in Math3D *" << endl;
else {
else
{
cout << "* FAILURES DETECTED IN MATH3D! *" << endl;
cout << "* Total vector3 failures: " << vectorFailures << " *" << endl;
cout << "* Total matrix4x4 failures: " << matrixFailures << " *" << endl;
cout << "* Total Failures in Math3D: " << vectorFailures + matrixFailures << " *" << endl;
cout << "* Total Failures in Math3D: " << vectorFailures + matrixFailures << " *"
<< endl;
}
cout << "* *" << endl;
cout << "****************************************" << endl;

283
dumb3d.h
View File

@@ -4,7 +4,8 @@
//#include <cmath>
#include <fastmath.h>
namespace Math3D {
namespace Math3D
{
// Define this to have Math3D.cp generate a main which tests these classes
//#define TEST_MATH3D
@@ -22,11 +23,15 @@ inline scalar_t COSINE_FUNCTION (scalar_t x) { return cos(x); }
inline scalar_t SQRT_FUNCTION(scalar_t x) { return sqrt(x); }
// 2 element vector
class vector2 {
class vector2
{
public:
vector2(void) {}
__fastcall vector2(scalar_t a, scalar_t b)
{ x=a; y=b; }
{
x = a;
y = b;
}
double x;
union
{
@@ -35,11 +40,16 @@ public:
};
};
// 3 element vector
class vector3 {
class vector3
{
public:
vector3(void) {}
__fastcall vector3(scalar_t a, scalar_t b, scalar_t c)
{ x=a; y=b; z=c; }
{
x = a;
y = b;
z = c;
}
// The int parameter is the number of elements to copy from initArray (3 or 4)
// explicit vector3(scalar_t* initArray, int arraySize = 3)
@@ -72,9 +82,12 @@ public:
// };
bool inline __fastcall Equal(vector3 *v)
{ // sprawdzenie odleg³oœci punktów
if (fabs(x-v->x)>0.02) return false; //szeœcian zamiast kuli
if (fabs(z-v->z)>0.02) return false;
if (fabs(y-v->y)>0.02) return false;
if (fabs(x - v->x) > 0.02)
return false; // szeœcian zamiast kuli
if (fabs(z - v->z) > 0.02)
return false;
if (fabs(y - v->y) > 0.02)
return false;
return true;
};
@@ -82,7 +95,8 @@ private:
};
// 4 element matrix
class matrix4x4 {
class matrix4x4
{
public:
matrix4x4(void) {}
@@ -91,9 +105,19 @@ public:
// backwards, hence the "constructor" from C matrices, or from OpenGL matrices.
// Note that matrices are stored internally in OpenGL format.
void C_Matrix(scalar_t *initArray)
{ int i = 0; for (int y=0;y<4;++y) for (int x=0;x<4;++x) (*this)(x)[y] = initArray[i++]; }
{
int i = 0;
for (int y = 0; y < 4; ++y)
for (int x = 0; x < 4; ++x)
(*this)(x)[y] = initArray[i++];
}
void OpenGL_Matrix(scalar_t *initArray)
{ int i = 0; for (int x = 0; x < 4; ++x) for (int y=0;y<4;++y) (*this)(x)[y] = initArray[i++]; }
{
int i = 0;
for (int x = 0; x < 4; ++x)
for (int y = 0; y < 4; ++y)
(*this)(x)[y] = initArray[i++];
}
// [] is to read, () is to write (const correctness)
// m[x][y] or m(x)[y] is the correct form
@@ -106,19 +130,31 @@ public:
// Construct various matrices; REPLACES CURRENT CONTENTS OF THE MATRIX!
// Written this way to work in-place and hence be somewhat more efficient
void Identity (void) { for (int i=0;i<16;++i) e[i] = 0; e[0] = 1; e[5] = 1; e[10] = 1; e[15] = 1; }
void Identity(void)
{
for (int i = 0; i < 16; ++i)
e[i] = 0;
e[0] = 1;
e[5] = 1;
e[10] = 1;
e[15] = 1;
}
inline matrix4x4 &Rotation(scalar_t angle, vector3 axis);
inline matrix4x4 &Translation(const vector3 &translation);
inline matrix4x4 &Scale(scalar_t x, scalar_t y, scalar_t z);
inline matrix4x4 &BasisChange(const vector3 &v, const vector3 &n);
inline matrix4x4 &BasisChange(const vector3 &u, const vector3 &v, const vector3 &n);
inline matrix4x4& ProjectionMatrix (bool perspective, scalar_t l, scalar_t r, scalar_t t, scalar_t b, scalar_t n, scalar_t f);
inline matrix4x4 &ProjectionMatrix(bool perspective, scalar_t l, scalar_t r, scalar_t t,
scalar_t b, scalar_t n, scalar_t f);
void InitialRotate()
{ // taka specjalna rotacja, nie ma co ci¹gaæ trygonometrii
double f;
for (int i = 0; i < 16; i += 4)
{e[i]=-e[i]; //zmiana znaku X
f=e[i+1]; e[i+1]=e[i+2]; e[i+2]=f; //zamiana Y i Z
{
e[i] = -e[i]; // zmiana znaku X
f = e[i + 1];
e[i + 1] = e[i + 2];
e[i + 2] = f; // zamiana Y i Z
}
};
inline bool IdentityIs()
@@ -180,16 +216,22 @@ matrix4x4 Adjoint (const matrix4x4&);
matrix4x4 Inverse(const matrix4x4 &);
// Inline implementations follow
inline bool SolveQuadratic (scalar_t a, scalar_t b, scalar_t c, scalar_t* x1, scalar_t* x2) {
inline bool SolveQuadratic(scalar_t a, scalar_t b, scalar_t c, scalar_t *x1, scalar_t *x2)
{
// If a == 0, solve a linear equation
if (a == 0) {
if (b == 0) return false;
if (a == 0)
{
if (b == 0)
return false;
*x1 = c / b;
*x2 = *x1;
return true;
} else {
}
else
{
scalar_t det = b * b - 4 * a * c;
if (det < 0) return false;
if (det < 0)
return false;
det = SQRT_FUNCTION(det) / (2 * a);
scalar_t prefix = -b / (2 * a);
*x1 = prefix + det;
@@ -199,9 +241,12 @@ inline bool SolveQuadratic (scalar_t a, scalar_t b, scalar_t c, scalar_t* x1, sc
}
inline bool operator==(const vector3 &v1, const vector3 &v2)
{ return (v1.x==v2.x&&v1.y==v2.y&&v1.z==v2.z); }
{
return (v1.x == v2.x && v1.y == v2.y && v1.z == v2.z);
}
inline bool operator< (const vector3& v1, const vector3& v2) {
inline bool operator<(const vector3 &v1, const vector3 &v2)
{
// for (int i=0;i<4;++i)
// if (v1[i] < v2[i]) return true;
// else if (v1[i] > v2[i]) return false;
@@ -209,36 +254,47 @@ inline bool operator< (const vector3& v1, const vector3& v2) {
return false;
}
inline vector3 operator- (const vector3& v)
{ return vector3(-v.x, -v.y, -v.z); }
inline vector3 operator-(const vector3 &v) { return vector3(-v.x, -v.y, -v.z); }
inline vector3 operator*(const vector3 &v, scalar_t k)
{ return vector3(k*v.x, k*v.y, k*v.z); }
{
return vector3(k * v.x, k * v.y, k * v.z);
}
inline vector3 operator* (scalar_t k, const vector3& v)
{ return v * k; }
inline vector3 operator*(scalar_t k, const vector3 &v) { return v * k; }
inline vector3 &operator*=(vector3 &v, scalar_t k)
{ v.x*= k; v.y*= k; v.z*= k; return v; };
{
v.x *= k;
v.y *= k;
v.z *= k;
return v;
};
inline vector3 operator/(const vector3 &v, scalar_t k)
{ return vector3(v.x/k, v.y/k, v.z/k); }
{
return vector3(v.x / k, v.y / k, v.z / k);
}
inline vector3 &operator/=(vector3 &v, scalar_t k)
{ v.x/= k; v.y/= k; v.z/= k; return v; }
{
v.x /= k;
v.y /= k;
v.z /= k;
return v;
}
inline scalar_t LengthSquared3 (const vector3& v)
{ return DotProduct(v,v); }
inline scalar_t LengthSquared4 (const vector3& v)
{ return DotProduct4(v,v); }
inline scalar_t LengthSquared3(const vector3 &v) { return DotProduct(v, v); }
inline scalar_t LengthSquared4(const vector3 &v) { return DotProduct4(v, v); }
inline scalar_t Length3 (const vector3& v)
{ return SQRT_FUNCTION(LengthSquared3(v)); }
inline scalar_t Length4 (const vector3& v)
{ return SQRT_FUNCTION(LengthSquared4(v)); }
inline scalar_t Length3(const vector3 &v) { return SQRT_FUNCTION(LengthSquared3(v)); }
inline scalar_t Length4(const vector3 &v) { return SQRT_FUNCTION(LengthSquared4(v)); }
inline vector3 Normalize(const vector3 &v)
{ vector3 retVal = v / Length3(v); return retVal; }
{
vector3 retVal = v / Length3(v);
return retVal;
}
inline vector3 SafeNormalize(const vector3 &v)
{
double l = Length3(v);
@@ -249,38 +305,54 @@ inline vector3 SafeNormalize(const vector3& v)
retVal = v / l;
return retVal;
}
inline vector3 Normalize4 (const vector3& v)
{ return v / Length4(v); }
inline vector3 Normalize4(const vector3 &v) { return v / Length4(v); }
inline vector3 operator+(const vector3 &v1, const vector3 &v2)
{ return vector3(v1.x+v2.x, v1.y+v2.y, v1.z+v2.z); }
inline vector3& operator+= (vector3& v1, const vector3& v2)
{ v1.x+= v2.x; v1.y+= v2.y; v1.z+= v2.z; return v1;}
inline vector3 operator- (const vector3& v1, const vector3& v2)
{ return vector3(v1.x-v2.x, v1.y-v2.y, v1.z-v2.z); }
inline vector3& operator-= (vector3& v1, const vector3& v2)
{ v1.x-= v2.x; v1.y-= v2.y; v1.z-= v2.z; return v1;}
inline scalar_t DotProduct (const vector3& v1, const vector3& v2)
{ return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z; }
inline scalar_t DotProduct4 (const vector3& v1, const vector3& v2)
{ return v1.x*v2.x + v1.y*v2.y + v1.z*v2.z; }
inline vector3 CrossProduct (const vector3& v1, const vector3& v2) {
return vector3( v1.y * v2.z - v1.z * v2.y
,v2.x * v1.z - v2.z * v1.x
,v1.x * v2.y - v1.y * v2.x);
{
return vector3(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
}
inline vector3 operator* (const matrix4x4& m, const vector3& v) {
inline vector3 &operator+=(vector3 &v1, const vector3 &v2)
{
v1.x += v2.x;
v1.y += v2.y;
v1.z += v2.z;
return v1;
}
inline vector3 operator-(const vector3 &v1, const vector3 &v2)
{
return vector3(v1.x - v2.x, v1.y - v2.y, v1.z - v2.z);
}
inline vector3 &operator-=(vector3 &v1, const vector3 &v2)
{
v1.x -= v2.x;
v1.y -= v2.y;
v1.z -= v2.z;
return v1;
}
inline scalar_t DotProduct(const vector3 &v1, const vector3 &v2)
{
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}
inline scalar_t DotProduct4(const vector3 &v1, const vector3 &v2)
{
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}
inline vector3 CrossProduct(const vector3 &v1, const vector3 &v2)
{
return vector3(v1.y * v2.z - v1.z * v2.y, v2.x * v1.z - v2.z * v1.x, v1.x * v2.y - v1.y * v2.x);
}
inline vector3 operator*(const matrix4x4 &m, const vector3 &v)
{
return vector3(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][2] + v.y * m[1][2] + v.z * m[2][2] + m[3][2]);
}
void inline __fastcall vector3::Normalize()
@@ -291,47 +363,59 @@ void inline __fastcall vector3::Normalize()
z *= il;
}
double inline __fastcall vector3::Length()
{
return SQRT_FUNCTION(x*x+y*y+z*z);
}
double inline __fastcall vector3::Length() { return SQRT_FUNCTION(x * x + y * y + z * z); }
inline bool operator== (const matrix4x4& m1, const matrix4x4& m2) {
for (int x=0;x<4;++x) for (int y=0;y<4;++y)
if (m1[x][y] != m2[x][y]) return false;
inline bool operator==(const matrix4x4 &m1, const matrix4x4 &m2)
{
for (int x = 0; x < 4; ++x)
for (int y = 0; y < 4; ++y)
if (m1[x][y] != m2[x][y])
return false;
return true;
}
inline bool operator< (const matrix4x4& m1, const matrix4x4& m2) {
for (int x=0;x<4;++x) for (int y=0;y<4;++y)
if (m1[x][y] < m2[x][y]) return true;
else if (m1[x][y] > m2[x][y]) return false;
inline bool operator<(const matrix4x4 &m1, const matrix4x4 &m2)
{
for (int x = 0; x < 4; ++x)
for (int y = 0; y < 4; ++y)
if (m1[x][y] < m2[x][y])
return true;
else if (m1[x][y] > m2[x][y])
return false;
return false;
}
inline matrix4x4 operator* (const matrix4x4& m1, const matrix4x4& m2) {
inline matrix4x4 operator*(const matrix4x4 &m1, const matrix4x4 &m2)
{
matrix4x4 retVal;
for (int x=0;x<4;++x) for (int y=0;y<4;++y) {
for (int x = 0; x < 4; ++x)
for (int y = 0; y < 4; ++y)
{
retVal(x)[y] = 0;
for (int i=0;i<4;++i) retVal(x)[y] += m1[i][y] * m2[x][i];
for (int i = 0; i < 4; ++i)
retVal(x)[y] += m1[i][y] * m2[x][i];
}
return retVal;
}
inline matrix4x4 Transpose (const matrix4x4& m) {
inline matrix4x4 Transpose(const matrix4x4 &m)
{
matrix4x4 retVal;
for (int x=0;x<4;++x) for (int y=0;y<4;++y)
for (int x = 0; x < 4; ++x)
for (int y = 0; y < 4; ++y)
retVal(x)[y] = m[y][x];
return retVal;
}
inline matrix4x4& matrix4x4::Rotation (scalar_t angle, vector3 axis) {
inline matrix4x4 &matrix4x4::Rotation(scalar_t angle, vector3 axis)
{
scalar_t c = COSINE_FUNCTION(angle);
scalar_t s = SINE_FUNCTION(angle);
// One minus c (short name for legibility of formulai)
scalar_t omc = (1 - c);
if (LengthSquared3(axis) != 1) axis = Normalize(axis);
if (LengthSquared3(axis) != 1)
axis = Normalize(axis);
scalar_t x = axis.x;
scalar_t y = axis.y;
@@ -366,7 +450,8 @@ inline matrix4x4& matrix4x4::Rotation (scalar_t angle, vector3 axis) {
return *this;
}
inline matrix4x4& matrix4x4::Translation(const vector3& translation) {
inline matrix4x4 &matrix4x4::Translation(const vector3 &translation)
{
Identity();
e[12] = translation.x;
e[13] = translation.y;
@@ -374,7 +459,8 @@ inline matrix4x4& matrix4x4::Translation(const vector3& translation) {
return *this;
}
inline matrix4x4& matrix4x4::Scale (scalar_t x, scalar_t y, scalar_t z) {
inline matrix4x4 &matrix4x4::Scale(scalar_t x, scalar_t y, scalar_t z)
{
Identity();
e[0] = x;
e[5] = y;
@@ -382,7 +468,8 @@ inline matrix4x4& matrix4x4::Scale (scalar_t x, scalar_t y, scalar_t z) {
return *this;
}
inline matrix4x4& matrix4x4::BasisChange (const vector3& u, const vector3& v, const vector3& n) {
inline matrix4x4 &matrix4x4::BasisChange(const vector3 &u, const vector3 &v, const vector3 &n)
{
e[0] = u.x;
e[1] = v.x;
e[2] = n.x;
@@ -406,21 +493,24 @@ inline matrix4x4& matrix4x4::BasisChange (const vector3& u, const vector3& v, co
return *this;
}
inline matrix4x4& matrix4x4::BasisChange (const vector3& v, const vector3& n) {
inline matrix4x4 &matrix4x4::BasisChange(const vector3 &v, const vector3 &n)
{
vector3 u = CrossProduct(v, n);
return BasisChange(u, v, n);
}
inline matrix4x4& matrix4x4::ProjectionMatrix (bool perspective, scalar_t left_plane, scalar_t right_plane,
scalar_t top_plane, scalar_t bottom_plane,
scalar_t near_plane, scalar_t far_plane)
inline matrix4x4 &matrix4x4::ProjectionMatrix(bool perspective, scalar_t left_plane,
scalar_t right_plane, scalar_t top_plane,
scalar_t bottom_plane, scalar_t near_plane,
scalar_t far_plane)
{
scalar_t A = (right_plane + left_plane) / (right_plane - left_plane);
scalar_t B = (top_plane + bottom_plane) / (top_plane - bottom_plane);
scalar_t C = (far_plane + near_plane) / (far_plane - near_plane);
Identity();
if (perspective) {
if (perspective)
{
e[0] = 2 * near_plane / (right_plane - left_plane);
e[5] = 2 * near_plane / (top_plane - bottom_plane);
e[8] = A;
@@ -428,7 +518,9 @@ inline matrix4x4& matrix4x4::ProjectionMatrix (bool perspective, scalar_t left_
e[10] = C;
e[11] = -1;
e[14] = 2 * far_plane * near_plane / (far_plane - near_plane);
} else {
}
else
{
e[0] = 2 / (right_plane - left_plane);
e[5] = 2 / (top_plane - bottom_plane);
e[10] = -2 / (far_plane - near_plane);
@@ -454,15 +546,18 @@ double inline __fastcall SquareMagnitude(const vector3& v)
#ifdef OSTREAM_MATH3D
#include <ostream>
// Streaming support
std::ostream& operator<< (std::ostream& os, const Math3D::vector3& v) {
std::ostream &operator<<(std::ostream &os, const Math3D::vector3 &v)
{
os << '[';
for (int i = 0; i < 4; ++i)
os << ' ' << v[i];
return os << ']';
}
std::ostream& operator<< (std::ostream& os, const Math3D::matrix4x4& m) {
for (int y=0; y<4; ++y) {
std::ostream &operator<<(std::ostream &os, const Math3D::matrix4x4 &m)
{
for (int y = 0; y < 4; ++y)
{
os << '[';
for (int x = 0; x < 4; ++x)
os << ' ' << m[x][y];

View File

@@ -6,23 +6,17 @@
inline double __fastcall sqr(double a) { return (a * a); };
__fastcall TLine::TLine()
{
};
__fastcall TLine::TLine(){};
__fastcall TLine::TLine(vector3 NPoint, vector3 NVector)
{
Vector= NVector; Point= NPoint;
Vector = NVector;
Point = NPoint;
};
__fastcall TLine::~TLine()
{
};
__fastcall TLine::~TLine(){};
TPlane __fastcall TLine::GetPlane()
{
return(TPlane(Point,Vector));
};
TPlane __fastcall TLine::GetPlane() { return (TPlane(Point, Vector)); };
double __fastcall TLine::GetDistance(vector3 Point1)
{
@@ -31,8 +25,6 @@ double __fastcall TLine::GetDistance(vector3 Point1)
sqr((Point1.z - Point.z) * Vector.z - (Point1.x - Point.x) * Vector.x)) /
(sqr(Vector.x) + sqr(Vector.y) + sqr(Vector.z)));
;
};
//---------------------------------------------------------------------------
@@ -45,27 +37,29 @@ __fastcall TPlane::TPlane()
__fastcall TPlane::TPlane(vector3 NVector, double nd)
{
Vector= NVector; d= nd;
Vector = NVector;
d = nd;
}
__fastcall TPlane::TPlane(vector3 Point, vector3 NVector)
{
Vector= NVector; d= -NVector.x*Point.x-NVector.y*Point.y-NVector.z*Point.z;
Vector = NVector;
d = -NVector.x * Point.x - NVector.y * Point.y - NVector.z * Point.z;
};
__fastcall TPlane::TPlane(vector3 Point1, vector3 Vector1, vector3 Vector2)
{
Vector= CrossProduct(Vector1,Vector2); d= -Vector.x*Point1.x-Vector.y*Point1.y-Vector.z*Point1.z;
Vector = CrossProduct(Vector1, Vector2);
d = -Vector.x * Point1.x - Vector.y * Point1.y - Vector.z * Point1.z;
};
__fastcall TPlane::~TPlane()
{
};
__fastcall TPlane::~TPlane(){};
void __fastcall TPlane::Normalize()
{
double mgn = Vector.Length();
Vector= Vector/mgn; d/= mgn;
Vector = Vector / mgn;
d /= mgn;
};
double __fastcall TPlane::GetSide(vector3 Point)
@@ -79,18 +73,11 @@ double __fastcall TPlane::GetSide(vector3 Point)
// D3DMath_VectorMatrixMultiply(Vector,src,Transformations);
//};
bool __fastcall TPlane::Defined()
{
return !(Vector==vector3(0,0,0));
};
bool __fastcall TPlane::Defined() { return !(Vector == vector3(0, 0, 0)); };
//---------------------------------------------------------------------------
inline double __fastcall Sum(vector3 &Vector)
{
return( Vector.x+Vector.y+Vector.z );
};
inline double __fastcall Sum(vector3 &Vector) { return (Vector.x + Vector.y + Vector.z); };
bool __fastcall CrossPoint(vector3 &RetPoint, TLine &Line, TPlane &Plane)
{
@@ -102,10 +89,7 @@ bool __fastcall CrossPoint(vector3 &RetPoint, TLine &Line, TPlane &Plane)
return (true);
};
inline double __fastcall GetLength(vector3& Vector)
{
return ( Vector.Length() );
};
inline double __fastcall GetLength(vector3 &Vector) { return (Vector.Length()); };
inline vector3 __fastcall SetLength(vector3 &Vector, double Length)
{

View File

@@ -10,7 +10,6 @@
*/
/////////////////////////////////////////////////////////////////////////////////////////////////////
// cParser -- generic class for parsing text data.
@@ -51,8 +50,10 @@ cParser::cParser(std::string Stream,buffertype Type,std::string Path,bool tr)
// destructor
cParser::~cParser()
{
if (mIncludeParser) delete mIncludeParser;
if (mStream) delete mStream;
if (mIncludeParser)
delete mIncludeParser;
if (mStream)
delete mStream;
mComments.clear();
}
@@ -97,15 +98,18 @@ std::string cParser::readToken(bool ToLower,const char* Break)
{
token = (*mIncludeParser).readToken(ToLower, Break);
if (!token.empty())
{pos=token.find("(p");
{
pos = token.find("(p");
// check if the token is a parameter which should be replaced with stored true value
if (pos != std::string::npos) //!=npos to znalezione
{
std::string parameter=token.substr(pos+2,token.find(")",pos)-pos+2); //numer parametru
std::string parameter =
token.substr(pos + 2, token.find(")", pos) - pos + 2); // numer parametru
token.erase(pos, token.find(")", pos) - pos + 1); // najpierw usuniêcie "(pN)"
size_t nr = atoi(parameter.c_str()) - 1;
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)
for (; pos < token.length(); ++pos)
token[pos] = tolower(token[pos]);
@@ -116,7 +120,8 @@ std::string cParser::readToken(bool ToLower,const char* Break)
return token;
}
else
{delete mIncludeParser;
{
delete mIncludeParser;
mIncludeParser = NULL;
parameters.clear();
}
@@ -124,9 +129,11 @@ std::string cParser::readToken(bool ToLower,const char* Break)
// get the token yourself if there's no child to delegate it to.
char c;
do
{while (mStream->peek()!=EOF&& strchr( Break, c = mStream->get() ) == NULL)
{
if (ToLower) c=tolower(c);
while (mStream->peek() != EOF && strchr(Break, c = mStream->get()) == NULL)
{
if (ToLower)
c = tolower(c);
token += c;
if (trimComments(token)) // don't glue together words separated with comment
break;
@@ -137,7 +144,8 @@ std::string cParser::readToken(bool ToLower,const char* Break)
if (token.compare("include") == 0)
{ // obs³uga include
std::string includefile = readToken(ToLower); // nazwa pliku
if (LoadTraction?true:((includefile.find("tr/")==std::string::npos)&&(includefile.find("tra/")==std::string::npos)))
if (LoadTraction ? true : ((includefile.find("tr/") == std::string::npos) &&
(includefile.find("tra/") == std::string::npos)))
{
// std::string trtest2="niemaproblema"; //nazwa odporna na znalezienie "tr/"
// if (trtest=="x") //jeœli nie wczytywaæ drutów
@@ -191,4 +199,3 @@ int cParser::getProgress() const
{
return mStream->rdbuf()->pubseekoff(0, std::ios_base::cur) * 100 / mSize;
}

View File

@@ -18,16 +18,28 @@ class cParser : public std::stringstream
{
public:
// parameters:
enum buffertype {buffer_FILE,buffer_TEXT};
enum buffertype
{
buffer_FILE,
buffer_TEXT
};
// constructors:
cParser(std::string Stream,buffertype Type=buffer_TEXT,std::string Path="",bool tr=true);
cParser(std::string Stream, buffertype Type = buffer_TEXT, std::string Path = "",
bool tr = true);
// destructor:
virtual ~cParser();
// methods:
template <typename OutputT>
inline void getToken(OutputT& output) {getTokens(); *this >> output;};
template <typename OutputT> inline void getToken(OutputT &output)
{
getTokens();
*this >> output;
};
inline void ignoreToken() { readToken(); };
inline void ignoreTokens(int count) {for (int i=0;i<count;i++) readToken();};
inline void ignoreTokens(int count)
{
for (int i = 0; i < count; i++)
readToken();
};
inline bool expectToken(std::string value) { return readToken() == value; };
bool eof() { return mStream->eof(); };
bool ok() { return !mStream->fail(); };
@@ -35,6 +47,7 @@ public:
int getProgress() const; // percentage of file processed.
// load traction?
bool LoadTraction;
protected:
// methods:
std::string readToken(bool ToLower = true, const char *Break = "\n\t ;");
@@ -52,4 +65,3 @@ protected:
};
#endif // ..!defined(rainKERNELTEXTPARSER_H_INCLUDED)

15
sky.cpp
View File

@@ -10,14 +10,9 @@
//---------------------------------------------------------------------------
GLfloat lightPos[4] = {0.0f, 0.0f, 0.0f, 1.0f};
__fastcall TSky::~TSky()
{
};
__fastcall TSky::TSky()
{
};
__fastcall TSky::~TSky(){};
__fastcall TSky::TSky(){};
void __fastcall TSky::Init()
{
@@ -31,14 +26,14 @@ void __fastcall TSky::Init()
// }
};
void __fastcall TSky::Render()
{
if (mdCloud)
{ // jeœli jest model nieba
glPushMatrix();
// glDisable(GL_DEPTH_TEST);
glTranslatef(Global::pCameraPosition.x, Global::pCameraPosition.y, Global::pCameraPosition.z);
glTranslatef(Global::pCameraPosition.x, Global::pCameraPosition.y,
Global::pCameraPosition.z);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
if (Global::bUseVBO)
{ // renderowanie z VBO
@@ -58,8 +53,6 @@ void __fastcall TSky::Render()
}
};
//---------------------------------------------------------------------------
#pragma package(smart_init)

1
sky.h
View File

@@ -9,6 +9,7 @@ class TSky
{
private:
TModel3d *mdCloud;
public:
__fastcall TSky();
__fastcall ~TSky();

View File

@@ -15,15 +15,29 @@
// Ra: "delete NULL" nic nie zrobi, wiêc "if (a!=NULL)" jest zbêdne
//#define SafeFree(a) if (a!=NULL) free(a)
#define SafeDelete(a) { delete (a); a=NULL; }
#define SafeDeleteArray(a) { delete[] (a); a=NULL; }
#define SafeDelete(a) \
{ \
delete (a); \
a = NULL; \
}
#define SafeDeleteArray(a) \
{ \
delete[](a); \
a = NULL; \
}
#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 RadToDeg(r) ((180.0 / M_PI) * (r))
#define Fix(a,b,c) {if (a<b) a=b; if (a>c) a=c;}
#define Fix(a, b, c) \
{ \
if (a < b) \
a = b; \
if (a > c) \
a = c; \
}
#define asModelsPath AnsiString("models\\")
#define asSceneryPath AnsiString("scenery\\")
@@ -33,12 +47,8 @@
#define szTexturePath "textures\\"
//#define szDefaultTextureExt ".dds"
//#define DevelopTime //FIXME
//#define EditorMode
//---------------------------------------------------------------------------
#endif

View File

@@ -9,17 +9,25 @@
#include <windows.h>
#include "WavRead.h"
//-----------------------------------------------------------------------------
// Defines, constants, and global variables
//-----------------------------------------------------------------------------
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
#define SAFE_DELETE(p) \
{ \
if (p) \
{ \
delete (p); \
(p) = NULL; \
} \
}
#define SAFE_RELEASE(p) \
{ \
if (p) \
{ \
(p)->Release(); \
(p) = NULL; \
} \
}
//-----------------------------------------------------------------------------
// Name: ReadMMIO()
@@ -35,8 +43,7 @@ HRESULT ReadMMIO( HMMIO hmmioIn, MMCKINFO* pckInRIFF, WAVEFORMATEX** ppwfxInfo )
if ((0 != mmioDescend(hmmioIn, pckInRIFF, NULL, 0)))
return E_FAIL;
if( (pckInRIFF->ckid != FOURCC_RIFF) ||
(pckInRIFF->fccType != mmioFOURCC('W', 'A', 'V', 'E') ) )
if ((pckInRIFF->ckid != FOURCC_RIFF) || (pckInRIFF->fccType != mmioFOURCC('W', 'A', 'V', 'E')))
return E_FAIL;
// Search the input file for for the 'fmt ' chunk.
@@ -50,8 +57,7 @@ HRESULT ReadMMIO( HMMIO hmmioIn, MMCKINFO* pckInRIFF, WAVEFORMATEX** ppwfxInfo )
return E_FAIL;
// Read the 'fmt ' chunk into <pcmWaveFormat>.
if( mmioRead( hmmioIn, (HPSTR) &pcmWaveFormat,
sizeof(pcmWaveFormat)) != sizeof(pcmWaveFormat) )
if (mmioRead(hmmioIn, (HPSTR)&pcmWaveFormat, sizeof(pcmWaveFormat)) != sizeof(pcmWaveFormat))
return E_FAIL;
// Allocate the waveformatex, but if its not pcm format, read the next
@@ -101,9 +107,6 @@ HRESULT ReadMMIO( HMMIO hmmioIn, MMCKINFO* pckInRIFF, WAVEFORMATEX** ppwfxInfo )
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: WaveOpenFile()
// Desc: This function will open a wave input file and prepare it for reading,
@@ -130,9 +133,6 @@ HRESULT WaveOpenFile( CHAR* strFileName, HMMIO* phmmioIn, WAVEFORMATEX** ppwfxIn
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: WaveStartDataRead()
// Desc: Routine has to be called before WaveReadFile as it searches for the
@@ -141,12 +141,10 @@ HRESULT WaveOpenFile( CHAR* strFileName, HMMIO* phmmioIn, WAVEFORMATEX** ppwfxIn
// moved to a separate routine so there was more control on the chunks
// that are before the data chunk, such as 'fact', etc...
//-----------------------------------------------------------------------------
HRESULT WaveStartDataRead( HMMIO* phmmioIn, MMCKINFO* pckIn,
MMCKINFO* pckInRIFF )
HRESULT WaveStartDataRead(HMMIO *phmmioIn, MMCKINFO *pckIn, MMCKINFO *pckInRIFF)
{
// Seek to the data
if( -1 == mmioSeek( *phmmioIn, pckInRIFF->dwDataOffset + sizeof(FOURCC),
SEEK_SET ) )
if (-1 == mmioSeek(*phmmioIn, pckInRIFF->dwDataOffset + sizeof(FOURCC), SEEK_SET))
return E_FAIL;
// Search the input file for for the 'data' chunk.
@@ -157,9 +155,6 @@ HRESULT WaveStartDataRead( HMMIO* phmmioIn, MMCKINFO* pckIn,
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: WaveReadFile()
// Desc: Reads wave data from the wave file. Make sure we're descended into
@@ -169,8 +164,7 @@ HRESULT WaveStartDataRead( HMMIO* phmmioIn, MMCKINFO* pckIn,
// pbDest - Destination buffer to put bytes.
// cbActualRead - # of bytes actually read.
//-----------------------------------------------------------------------------
HRESULT WaveReadFile( HMMIO hmmioIn, UINT cbRead, BYTE* pbDest,
MMCKINFO* pckIn, UINT* cbActualRead )
HRESULT WaveReadFile(HMMIO hmmioIn, UINT cbRead, BYTE *pbDest, MMCKINFO *pckIn, UINT *cbActualRead)
{
MMIOINFO mmioinfoIn; // current status of <hmmioIn>
@@ -209,20 +203,11 @@ HRESULT WaveReadFile( HMMIO hmmioIn, UINT cbRead, BYTE* pbDest,
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: CWaveSoundRead()
// Desc: Constructs the class
//-----------------------------------------------------------------------------
CWaveSoundRead::CWaveSoundRead()
{
m_pwfx = NULL;
}
CWaveSoundRead::CWaveSoundRead() { m_pwfx = NULL; }
//-----------------------------------------------------------------------------
// Name: ~CWaveSoundRead()
@@ -234,9 +219,6 @@ CWaveSoundRead::~CWaveSoundRead()
SAFE_DELETE(m_pwfx);
}
//-----------------------------------------------------------------------------
// Name: Open()
// Desc: Opens a wave file for reading
@@ -256,21 +238,12 @@ HRESULT CWaveSoundRead::Open( CHAR* strFilename )
return hr;
}
//-----------------------------------------------------------------------------
// Name: Reset()
// Desc: Resets the internal m_ckIn pointer so reading starts from the
// beginning of the file again
//-----------------------------------------------------------------------------
HRESULT CWaveSoundRead::Reset()
{
return WaveStartDataRead( &m_hmmioIn, &m_ckIn, &m_ckInRiff );
}
HRESULT CWaveSoundRead::Reset() { return WaveStartDataRead(&m_hmmioIn, &m_ckIn, &m_ckInRiff); }
//-----------------------------------------------------------------------------
// Name: Read()
@@ -282,9 +255,6 @@ HRESULT CWaveSoundRead::Read( UINT nSizeToRead, BYTE* pbData, UINT* pnSizeRead )
return WaveReadFile(m_hmmioIn, nSizeToRead, pbData, &m_ckIn, pnSizeRead);
}
//-----------------------------------------------------------------------------
// Name: Close()
// Desc: Closes an open wave file
@@ -294,6 +264,3 @@ HRESULT CWaveSoundRead::Close()
mmioClose(m_hmmioIn, 0);
return S_OK;
}

View File

@@ -9,17 +9,13 @@
#ifndef WAVE_READ_H
#define WAVE_READ_H
#include <mmreg.h>
#include <mmsystem.h>
HRESULT WaveOpenFile(CHAR *strFileName, HMMIO *phmmioIn, WAVEFORMATEX **ppwfxInfo,
MMCKINFO *pckInRIFF);
HRESULT WaveStartDataRead( HMMIO* phmmioIn, MMCKINFO* pckIn,
MMCKINFO* pckInRIFF );
HRESULT WaveReadFile( HMMIO hmmioIn, UINT cbRead, BYTE* pbDest,
MMCKINFO* pckIn, UINT* cbActualRead );
HRESULT WaveStartDataRead(HMMIO *phmmioIn, MMCKINFO *pckIn, MMCKINFO *pckInRIFF);
HRESULT WaveReadFile(HMMIO hmmioIn, UINT cbRead, BYTE *pbDest, MMCKINFO *pckIn, UINT *cbActualRead);
//-----------------------------------------------------------------------------
// Name: class CWaveSoundRead
@@ -41,11 +37,6 @@ public:
HRESULT Reset();
HRESULT Read(UINT nSizeToRead, BYTE *pbData, UINT *pnSizeRead);
HRESULT Close();
};
#endif WAVE_READ_H