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:
27
AdvSound.cpp
27
AdvSound.cpp
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
11
AdvSound.h
11
AdvSound.h
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
22
AirCoupler.h
22
AirCoupler.h
@@ -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);
|
||||
|
||||
228
AnimModel.cpp
228
AnimModel.cpp
@@ -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,"Ť¶‚‚Ü?ć‚h‚j")) //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)
|
||||
}
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
36
AnimModel.h
36
AnimModel.h
@@ -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);
|
||||
|
||||
23
Button.cpp
23
Button.cpp
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
25
Button.h
25
Button.h
@@ -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);
|
||||
|
||||
44
Camera.cpp
44
Camera.cpp
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1
Camera.h
1
Camera.h
@@ -2,7 +2,6 @@
|
||||
#ifndef CameraH
|
||||
#define CameraH
|
||||
|
||||
|
||||
#include "dumb3d.h"
|
||||
using namespace Math3D;
|
||||
|
||||
|
||||
49
Console.cpp
49
Console.cpp
@@ -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); };
|
||||
|
||||
@@ -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); };
|
||||
|
||||
@@ -8,6 +8,7 @@ class TLPT
|
||||
{
|
||||
private:
|
||||
int address;
|
||||
|
||||
public:
|
||||
bool __fastcall Connect(int port);
|
||||
void __fastcall Out(int x);
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 = ',';
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
1
Curve.h
1
Curve.h
@@ -26,4 +26,3 @@ private:
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
#endif
|
||||
|
||||
4
Data.h
4
Data.h
@@ -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
2572
Driver.cpp
File diff suppressed because it is too large
Load Diff
80
Driver.h
80
Driver.h
@@ -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
1916
DynObj.cpp
File diff suppressed because it is too large
Load Diff
92
DynObj.h
92
DynObj.h
@@ -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
|
||||
|
||||
94
EU07.cpp
94
EU07.cpp
@@ -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
|
||||
}
|
||||
|
||||
|
||||
|
||||
23
EvLaunch.cpp
23
EvLaunch.cpp
@@ -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
154
Event.cpp
@@ -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
34
Event.h
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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
142
Float3d.h
@@ -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
|
||||
|
||||
33
Gauge.cpp
33
Gauge.cpp
@@ -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
11
Gauge.h
@@ -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
|
||||
|
||||
|
||||
55
Geom.cpp
55
Geom.cpp
@@ -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
1
Geom.h
@@ -26,6 +26,7 @@ private:
|
||||
TMaterialColor Ambient;
|
||||
TMaterialColor Diffuse;
|
||||
TMaterialColor Specular;
|
||||
|
||||
public:
|
||||
__fastcall TGeometry();
|
||||
__fastcall ~TGeometry();
|
||||
|
||||
197
Globals.cpp
197
Globals.cpp
@@ -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;
|
||||
}
|
||||
|
||||
13
Globals.h
13
Globals.h
@@ -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
1716
Ground.cpp
File diff suppressed because it is too large
Load Diff
59
Ground.h
59
Ground.h
@@ -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();
|
||||
|
||||
17
Logs.cpp
17
Logs.cpp
@@ -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)
|
||||
|
||||
62
Machajka.cpp
62
Machajka.cpp
@@ -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)
|
||||
|
||||
@@ -25,6 +25,5 @@ public:
|
||||
virtual bool __fastcall Render();
|
||||
};
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
#endif
|
||||
|
||||
39
MdlMngr.cpp
39
MdlMngr.cpp
@@ -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);
|
||||
|
||||
14
MdlMngr.h
14
MdlMngr.h
@@ -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();
|
||||
|
||||
65
MemCell.cpp
65
MemCell.cpp
@@ -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; };
|
||||
|
||||
@@ -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; };
|
||||
|
||||
644
Model3d.cpp
644
Model3d.cpp
File diff suppressed because it is too large
Load Diff
97
Model3d.h
97
Model3d.h
@@ -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
225
Mover.cpp
@@ -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
46
Mover.h
@@ -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);
|
||||
|
||||
41
Names.cpp
41
Names.cpp
@@ -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
11
Names.h
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
10
RealSound.h
10
RealSound.h
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
};
|
||||
|
||||
@@ -18,7 +18,6 @@ protected:
|
||||
|
||||
private:
|
||||
double _lastUsage;
|
||||
|
||||
};
|
||||
|
||||
class ResourceManager
|
||||
@@ -39,7 +38,6 @@ private:
|
||||
static double _lastReport;
|
||||
|
||||
static Resources _resources;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
262
Segment.cpp
262
Segment.cpp
@@ -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++;
|
||||
}
|
||||
}
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
55
Segment.h
55
Segment.h
@@ -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
|
||||
};
|
||||
|
||||
53
Sound.cpp
53
Sound.cpp
@@ -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)
|
||||
|
||||
8
Sound.h
8
Sound.h
@@ -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();
|
||||
};
|
||||
|
||||
|
||||
56
Spline.cpp
56
Spline.cpp
@@ -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)
|
||||
|
||||
14
Spline.h
14
Spline.h
@@ -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);
|
||||
|
||||
15
Spring.cpp
15
Spring.cpp
@@ -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() {}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
5
Spring.h
5
Spring.h
@@ -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
|
||||
|
||||
164
Texture.cpp
164
Texture.cpp
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
101
TextureDDS.cpp
101
TextureDDS.cpp
@@ -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;
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -27,4 +27,3 @@ struct DDS_IMAGE_DATA
|
||||
void DecompressDXT(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Data);
|
||||
|
||||
#endif
|
||||
|
||||
62
Timer.cpp
62
Timer.cpp
@@ -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)
|
||||
|
||||
5
Timer.h
5
Timer.h
@@ -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);
|
||||
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
53
Track.h
53
Track.h
@@ -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();
|
||||
|
||||
206
Traction.cpp
206
Traction.cpp
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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¹
|
||||
|
||||
14
Train.h
14
Train.h
@@ -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;
|
||||
|
||||
122
TrkFoll.cpp
122
TrkFoll.cpp
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
16
VBO.cpp
@@ -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ść
|
||||
};
|
||||
|
||||
|
||||
2
World.h
2
World.h
@@ -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;
|
||||
|
||||
207
dumb3d.cpp
207
dumb3d.cpp
@@ -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
283
dumb3d.h
@@ -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];
|
||||
|
||||
50
geometry.cpp
50
geometry.cpp
@@ -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)
|
||||
{
|
||||
|
||||
29
parser.cpp
29
parser.cpp
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
24
parser.h
24
parser.h
@@ -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
15
sky.cpp
@@ -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
1
sky.h
@@ -9,6 +9,7 @@ class TSky
|
||||
{
|
||||
private:
|
||||
TModel3d *mdCloud;
|
||||
|
||||
public:
|
||||
__fastcall TSky();
|
||||
__fastcall ~TSky();
|
||||
|
||||
24
usefull.h
24
usefull.h
@@ -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
|
||||
|
||||
|
||||
|
||||
79
wavread.cpp
79
wavread.cpp
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
13
wavread.h
13
wavread.h
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user