16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-09-03 13:29:19 +02:00

Merge pull request #11 from firleju/master

Change clang format
This commit is contained in:
Zbigniew Mandziejewicz
2015-05-03 18:53:58 +08:00
71 changed files with 1580 additions and 1106 deletions

View File

@@ -4,9 +4,11 @@ IndentWidth: 4
--- ---
Language: Cpp Language: Cpp
AlignEscapedNewlinesLeft: true AlignEscapedNewlinesLeft: true
AlignTrailingComments: false
BreakBeforeBraces: Allman BreakBeforeBraces: Allman
BreakBeforeTernaryOperators: false BreakBeforeTernaryOperators: false
AllowShortBlocksOnASingleLine: false AllowShortBlocksOnASingleLine: false
AllowShortIfStatementsOnASingleLine: false AllowShortIfStatementsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
ColumnLimit: 100 ColumnLimit: 100
--- ---

View File

@@ -32,10 +32,12 @@ TAdvancedSound::~TAdvancedSound()
// SoundShut.Stop(); // SoundShut.Stop();
} }
void TAdvancedSound::Free() {} void TAdvancedSound::Free()
{
}
void TAdvancedSound::Init(char *NameOn, char *Name, char *NameOff, void TAdvancedSound::Init(char *NameOn, char *Name, char *NameOff, double DistanceAttenuation,
double DistanceAttenuation, vector3 pPosition) vector3 pPosition)
{ {
SoundStart.Init(NameOn, DistanceAttenuation, pPosition.x, pPosition.y, pPosition.z, true); SoundStart.Init(NameOn, DistanceAttenuation, pPosition.x, pPosition.y, pPosition.z, true);
SoundCommencing.Init(Name, DistanceAttenuation, pPosition.x, pPosition.y, pPosition.z, true); SoundCommencing.Init(Name, DistanceAttenuation, pPosition.x, pPosition.y, pPosition.z, true);
@@ -131,8 +133,7 @@ void TAdvancedSound::Update(bool ListenerInside, vector3 NewPosition)
} }
} }
void TAdvancedSound::UpdateAF(double A, double F, bool ListenerInside, void TAdvancedSound::UpdateAF(double A, double F, bool ListenerInside, vector3 NewPosition)
vector3 NewPosition)
{ // update, ale z amplituda i czestotliwoscia { // update, ale z amplituda i czestotliwoscia
if ((State == ss_Commencing) && (SoundCommencing.AM > 0)) if ((State == ss_Commencing) && (SoundCommencing.AM > 0))
{ {

View File

@@ -38,7 +38,7 @@ class TAdvancedSound
TAdvancedSound(); TAdvancedSound();
~TAdvancedSound(); ~TAdvancedSound();
void Init(char *NameOn, char *Name, char *NameOff, double DistanceAttenuation, void Init(char *NameOn, char *Name, char *NameOff, double DistanceAttenuation,
vector3 pPosition); vector3 pPosition);
void Load(TQueryParserComp *Parser, vector3 pPosition); void Load(TQueryParserComp *Parser, vector3 pPosition);
void TurnOn(bool ListenerInside, vector3 NewPosition); void TurnOn(bool ListenerInside, vector3 NewPosition);
void TurnOff(bool ListenerInside, vector3 NewPosition); void TurnOff(bool ListenerInside, vector3 NewPosition);

View File

@@ -14,9 +14,14 @@ http://mozilla.org/MPL/2.0/.
#include "AirCoupler.h" #include "AirCoupler.h"
#include "Timer.h" #include "Timer.h"
TAirCoupler::TAirCoupler() { Clear(); } TAirCoupler::TAirCoupler()
{
Clear();
}
TAirCoupler::~TAirCoupler() {} TAirCoupler::~TAirCoupler()
{
}
int TAirCoupler::GetStatus() int TAirCoupler::GetStatus()
{ // zwraca 1, jeœli istnieje model prosty, 2 gdy skoœny { // zwraca 1, jeœli istnieje model prosty, 2 gdy skoœny

View File

@@ -115,7 +115,7 @@ void TAnimContainer::SetRotateAnim(vector3 vNewRotateAngles, double fNewRotateSp
*/ */
if (evDone) if (evDone)
{ // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez { // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez
// wyświetlania // wyświetlania
if (iAnim >= 0) if (iAnim >= 0)
{ // jeśli nie jest jeszcze na liście animacyjnej { // jeśli nie jest jeszcze na liście animacyjnej
acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon
@@ -138,7 +138,7 @@ void TAnimContainer::SetTranslateAnim(vector3 vNewTranslate, double fNewSpeed)
*/ */
if (evDone) if (evDone)
{ // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez { // dołączyć model do listy aniomowania, żeby animacje były przeliczane również bez
// wyświetlania // wyświetlania
if (iAnim >= 0) if (iAnim >= 0)
{ // jeśli nie jest jeszcze na liście animacyjnej { // jeśli nie jest jeszcze na liście animacyjnej
acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon acAnimNext = TAnimModel::acAnimList; // pozostałe doklić sobie jako ogon
@@ -179,7 +179,7 @@ void TAnimContainer::AnimSetVMD(double fNewSpeed)
//-+-+ - dłoń ma w górze zamiast na pasie w pozycji początkowej //-+-+ - dłoń ma w górze zamiast na pasie w pozycji początkowej
//+--+ - głowa do tyłu (broda w górę) w pozycji początkowej //+--+ - głowa do tyłu (broda w górę) w pozycji początkowej
//--++ - pozycja początkowa dobra, trąca u góry, ale z rękami jakoś nie tak, kółko w //--++ - pozycja początkowa dobra, trąca u góry, ale z rękami jakoś nie tak, kółko w
//przeciwną stronę // przeciwną stronę
//++++ - kładzie się brzuchem do góry //++++ - kładzie się brzuchem do góry
//-+++ - ręce w górze na początku, zamiast w dół, łokieć jakby w przeciwną stronę //-+++ - ręce w górze na początku, zamiast w dół, łokieć jakby w przeciwną stronę
//+-++ - nie podnosi ręki do głowy //+-++ - nie podnosi ręki do głowy
@@ -223,7 +223,7 @@ void TAnimContainer::UpdateModel()
vTranslation += s; vTranslation += s;
else else
vTranslation = vTranslateTo; // koniec animacji, "koniec animowania" uruchomi vTranslation = vTranslateTo; // koniec animacji, "koniec animowania" uruchomi
// się w następnej klatce // się w następnej klatce
} }
else else
{ // koniec animowania { // koniec animowania
@@ -233,7 +233,7 @@ void TAnimContainer::UpdateModel()
iAnim &= ~2; // wyłączyć zmianę pozycji submodelu iAnim &= ~2; // wyłączyć zmianę pozycji submodelu
if (evDone) if (evDone)
Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o
// zakończeniu // zakończeniu
} }
} }
if (fRotateSpeed != 0) if (fRotateSpeed != 0)
@@ -300,7 +300,7 @@ void TAnimContainer::UpdateModel()
fRotateSpeed = 0.0; fRotateSpeed = 0.0;
if (evDone) if (evDone)
Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o Global::AddToQuery(evDone, NULL); // wykonanie eventu informującego o
// zakończeniu // zakończeniu
} }
} }
if (fAngleSpeed != 0.0) if (fAngleSpeed != 0.0)
@@ -364,7 +364,7 @@ void TAnimContainer::UpdateModelIK()
{ {
case at_IK11: // stopa: ustawić w kierunku czubka (pierwszy potomny) case at_IK11: // stopa: ustawić w kierunku czubka (pierwszy potomny)
d = ch->Translation1Get(); // wektor względem aktualnego układu (nie uwzględnia d = ch->Translation1Get(); // wektor względem aktualnego układu (nie uwzględnia
// obrotu) // obrotu)
k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0, k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0,
-RadToDeg(atan2(d.y, d.x))); // proste skierowanie na punkt -RadToDeg(atan2(d.y, d.x))); // proste skierowanie na punkt
pSubModel->SetRotateIK1(k); pSubModel->SetRotateIK1(k);
@@ -378,7 +378,7 @@ void TAnimContainer::UpdateModelIK()
// potem wyliczyć ewentualne odchylenie w tej i następnej // potem wyliczyć ewentualne odchylenie w tej i następnej
// w sumie to proste, jak wyznaczenie kątów w trójkącie o znanej długości boków... // w sumie to proste, jak wyznaczenie kątów w trójkącie o znanej długości boków...
d = ch->Translation2Get(); // wektor względem aktualnego układu (nie uwzględnia d = ch->Translation2Get(); // wektor względem aktualnego układu (nie uwzględnia
// obrotu) // obrotu)
// if () // if ()
{ // kość IK jest dalej niż pozycja spoczynkowa { // kość IK jest dalej niż pozycja spoczynkowa
k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0, k = float3(RadToDeg(atan2(d.z, hypot(d.x, d.y))), 0.0,
@@ -456,7 +456,7 @@ bool TAnimModel::Init(AnsiString asName, AnsiString asReplacableTexture)
0x31310031; // tekstura z kanałem alfa - nie renderować w cyklu nieprzezroczystych 0x31310031; // tekstura z kanałem alfa - nie renderować w cyklu nieprzezroczystych
else else
iTexAlpha = 0x30300030; // tekstura nieprzezroczysta - nie renderować w cyklu iTexAlpha = 0x30300030; // tekstura nieprzezroczysta - nie renderować w cyklu
// przezroczystych // przezroczystych
return (Init(TModelsManager::GetModel(asName.c_str()))); return (Init(TModelsManager::GetModel(asName.c_str())));
} }
@@ -684,10 +684,12 @@ void TAnimModel::RenderAlphaVBO(vector3 *vPosition)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool TAnimModel::TerrainLoaded() bool TAnimModel::TerrainLoaded()
{ // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy { // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy
return (this ? pModel != NULL : false); }; return (this ? pModel != NULL : false);
};
int TAnimModel::TerrainCount() int TAnimModel::TerrainCount()
{ // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy { // zliczanie kwadratów kilometrowych (główna linia po Next) do tworznia tablicy
return pModel ? pModel->TerrainCount() : 0; }; return pModel ? pModel->TerrainCount() : 0;
};
TSubModel *__fastcall TAnimModel::TerrainSquare(int n) TSubModel *__fastcall TAnimModel::TerrainSquare(int n)
{ // pobieranie wskaźników do pierwszego submodelu { // pobieranie wskaźników do pierwszego submodelu
return pModel ? pModel->TerrainSquare(n) : 0; return pModel ? pModel->TerrainSquare(n) : 0;
@@ -721,7 +723,7 @@ void TAnimModel::Advanced()
if (!strcmp(pCurrent->pMovementData->cBone, if (!strcmp(pCurrent->pMovementData->cBone,
(pCurrent->pMovementData + 1)->cBone)) (pCurrent->pMovementData + 1)->cBone))
{ // jak kolejna ramka dotyczy tego samego submodelu, ustawić animację do { // jak kolejna ramka dotyczy tego samego submodelu, ustawić animację do
// kolejnej ramki // kolejnej ramki
++pCurrent->pMovementData; // kolejna klatka ++pCurrent->pMovementData; // kolejna klatka
pCurrent->AnimSetVMD( pCurrent->AnimSetVMD(
pAdvanced->fFrequency / pAdvanced->fFrequency /
@@ -773,7 +775,7 @@ void TAnimModel::AnimationVND(void *pData, double a, double b, double c, double
{ {
pSub->pMovementData = pAdvanced->pMovementData + i; // gotów do animowania pSub->pMovementData = pAdvanced->pMovementData + i; // gotów do animowania
pSub->AnimSetVMD(0.0); // usuawienie pozycji początkowej (powinna być zerowa, pSub->AnimSetVMD(0.0); // usuawienie pozycji początkowej (powinna być zerowa,
// inaczej będzie skok) // inaczej będzie skok)
} }
name = AnsiString(pAdvanced->pMovementData[i].cBone); // nowa nazwa do pomijania name = AnsiString(pAdvanced->pMovementData[i].cBone); // nowa nazwa do pomijania
} }

View File

@@ -72,7 +72,7 @@ class TAnimContainer
public: public:
TAnimContainer *pNext; TAnimContainer *pNext;
TAnimContainer *acAnimNext; // lista animacji z eventem, które musz¹ byæ przeliczane równie¿ bez TAnimContainer *acAnimNext; // lista animacji z eventem, które musz¹ byæ przeliczane równie¿ bez
// wyœwietlania // wyœwietlania
TAnimContainer(); TAnimContainer();
~TAnimContainer(); ~TAnimContainer();
bool Init(TSubModel *pNewSubModel); bool Init(TSubModel *pNewSubModel);
@@ -80,7 +80,10 @@ class TAnimContainer
// std::string(pSubModel?pSubModel->asName.c_str():""); }; // std::string(pSubModel?pSubModel->asName.c_str():""); };
// std::string inline GetName() { return std::string(pSubModel?pSubModel->pName:""); // std::string inline GetName() { return std::string(pSubModel?pSubModel->pName:"");
// }; // };
char *__fastcall NameGet() { return (pSubModel ? pSubModel->pName : NULL); }; char *__fastcall NameGet()
{
return (pSubModel ? pSubModel->pName : NULL);
};
// void SetRotateAnim(vector3 vNewRotateAxis, double fNewDesiredAngle, double // void SetRotateAnim(vector3 vNewRotateAxis, double fNewDesiredAngle, double
// fNewRotateSpeed, bool bResetAngle=false); // fNewRotateSpeed, bool bResetAngle=false);
void SetRotateAnim(vector3 vNewRotateAngles, double fNewRotateSpeed); void SetRotateAnim(vector3 vNewRotateAngles, double fNewRotateSpeed);
@@ -90,7 +93,10 @@ class TAnimContainer
void UpdateModel(); void UpdateModel();
void UpdateModelIK(); void UpdateModelIK();
bool InMovement(); // czy w trakcie animacji? bool InMovement(); // czy w trakcie animacji?
double _fastcall AngleGet() { return vRotateAngles.z; }; // jednak ostatnia, T3D ma inny uk³ad double _fastcall AngleGet()
{
return vRotateAngles.z;
}; // jednak ostatnia, T3D ma inny uk³ad
vector3 _fastcall TransGet() vector3 _fastcall TransGet()
{ {
return vector3(-vTranslation.x, vTranslation.z, vTranslation.y); return vector3(-vTranslation.x, vTranslation.z, vTranslation.y);
@@ -101,7 +107,10 @@ class TAnimContainer
pSubModel->WillBeAnimated(); pSubModel->WillBeAnimated();
}; };
void EventAssign(TEvent *ev); void EventAssign(TEvent *ev);
TEvent *__fastcall Event() { return evDone; }; TEvent *__fastcall Event()
{
return evDone;
};
}; };
class TAnimAdvanced class TAnimAdvanced
@@ -141,7 +150,7 @@ class TAnimModel
public: public:
GLuint ReplacableSkinId[5]; // McZapkie-020802: zmienialne skory GLuint ReplacableSkinId[5]; // McZapkie-020802: zmienialne skory
static TAnimContainer *acAnimList; // lista animacji z eventem, które musz¹ byæ przeliczane static TAnimContainer *acAnimList; // lista animacji z eventem, które musz¹ byæ przeliczane
// równie¿ bez wyœwietlania // równie¿ bez wyœwietlania
TAnimModel(); TAnimModel();
~TAnimModel(); ~TAnimModel();
bool Init(TModel3d *pNewModel); bool Init(TModel3d *pNewModel);

View File

@@ -25,7 +25,10 @@ class TButton
TButton(); TButton();
~TButton(); ~TButton();
void Clear(int i = -1); void Clear(int i = -1);
inline void FeedbackBitSet(int i) { iFeedbackBit = 1 << i; }; inline void FeedbackBitSet(int i)
{
iFeedbackBit = 1 << i;
};
inline void Turn(bool to) inline void Turn(bool to)
{ {
bOn = to; bOn = to;
@@ -46,7 +49,10 @@ class TButton
bOn = !bOn; bOn = !bOn;
Update(); Update();
}; };
inline bool Active() { return (pModelOn) || (pModelOff); }; inline bool Active()
{
return (pModelOn) || (pModelOff);
};
void Init(AnsiString asName, TModel3d *pModel, bool bNewOn = false); void Init(AnsiString asName, TModel3d *pModel, bool bNewOn = false);
void Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel2 = NULL); void Load(TQueryParserComp *Parser, TModel3d *pModel1, TModel3d *pModel2 = NULL);
}; };

View File

@@ -157,7 +157,7 @@ vector3 TCamera::GetDirection()
bool TCamera::SetMatrix() bool TCamera::SetMatrix()
{ {
glRotated(-Roll * 180.0f / M_PI, 0, 0, 1); // po wy³¹czeniu tego krêci siê pojazd, a sceneria glRotated(-Roll * 180.0f / M_PI, 0, 0, 1); // po wy³¹czeniu tego krêci siê pojazd, a sceneria
// nie // nie
glRotated(-Pitch * 180.0f / M_PI, 1, 0, 0); glRotated(-Pitch * 180.0f / M_PI, 1, 0, 0);
glRotated(-Yaw * 180.0f / M_PI, 0, 1, 0); // w zewnêtrznym widoku: kierunek patrzenia glRotated(-Yaw * 180.0f / M_PI, 0, 1, 0); // w zewnêtrznym widoku: kierunek patrzenia

View File

@@ -38,7 +38,10 @@ class TCamera
vector3 CrossPos; vector3 CrossPos;
double CrossDist; double CrossDist;
void Init(vector3 NPos, vector3 NAngle); void Init(vector3 NPos, vector3 NAngle);
void Reset() { Pitch = Yaw = Roll = 0; }; void Reset()
{
Pitch = Yaw = Roll = 0;
};
void OnCursorMove(double x, double y); void OnCursorMove(double x, double y);
void Update(); void Update();
vector3 GetDirection(); vector3 GetDirection();

View File

@@ -274,7 +274,10 @@ void Console::BitsUpdate(int mask)
} }
}; };
bool Console::Pressed(int x) { return Global::bActive && (GetKeyState(x) < 0); }; // na razie tak - czyta się tylko klawiatura bool Console::Pressed(int x)
{
return Global::bActive && (GetKeyState(x) < 0);
}; // na razie tak - czyta się tylko klawiatura
void Console::ValueSet(int x, double y) void Console::ValueSet(int x, double y)
{ // ustawienie wartości (y) na kanale analogowym (x) { // ustawienie wartości (y) na kanale analogowym (x)
@@ -353,5 +356,11 @@ void Console::OnKeyUp(int k)
else else
iButton[char(k) >> 5] &= ~(1 << (k & 31)); // wyłącz monostabilny podstawowy iButton[char(k) >> 5] &= ~(1 << (k & 31)); // wyłącz monostabilny podstawowy
}; };
int Console::KeyDownConvert(int k) { return int(ktTable[k & 0x3FF].iDown); }; int Console::KeyDownConvert(int k)
int Console::KeyUpConvert(int k) { return int(ktTable[k & 0x3FF].iUp); }; {
return int(ktTable[k & 0x3FF].iDown);
};
int Console::KeyUpConvert(int k)
{
return int(ktTable[k & 0x3FF].iUp);
};

View File

@@ -48,4 +48,7 @@ bool TLPT::Connect(int port)
return bool(OutPort); return bool(OutPort);
}; };
void TLPT::Out(int x) { OutPort(address, x); }; // wys³anie bajtu do portu void TLPT::Out(int x)
{
OutPort(address, x);
}; // wys³anie bajtu do portu

View File

@@ -39,7 +39,10 @@ TPoKeys55::TPoKeys55()
bNoError = true; bNoError = true;
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
TPoKeys55::~TPoKeys55() { Close(); }; TPoKeys55::~TPoKeys55()
{
Close();
};
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool TPoKeys55::Close() bool TPoKeys55::Close()
{ // roz³¹czenie komunikacji { // roz³¹czenie komunikacji
@@ -86,7 +89,7 @@ bool TPoKeys55::Connect()
{ {
ErrorStatus = GetLastError(); ErrorStatus = GetLastError();
if (ERROR_NO_MORE_ITEMS == ErrorStatus) // Did we reach the end of the list of matching if (ERROR_NO_MORE_ITEMS == ErrorStatus) // Did we reach the end of the list of matching
// devices in the DeviceInfoTable? // devices in the DeviceInfoTable?
{ // Cound not find the device. Must not have been attached. { // Cound not find the device. Must not have been attached.
SetupDiDestroyDeviceInfoList( SetupDiDestroyDeviceInfoList(
DeviceInfoTable); // Clean up the old structure we no longer need. DeviceInfoTable); // Clean up the old structure we no longer need.
@@ -138,7 +141,7 @@ bool TPoKeys55::Connect()
// free(PropertyValueBuffer); //No longer need the PropertyValueBuffer,free the memory to // free(PropertyValueBuffer); //No longer need the PropertyValueBuffer,free the memory to
// prevent potential memory leaks // prevent potential memory leaks
delete PropertyValueBuffer; // No longer need the PropertyValueBuffer,free the memory to delete PropertyValueBuffer; // No longer need the PropertyValueBuffer,free the memory to
// prevent potential memory leaks // prevent potential memory leaks
// Convert both strings to lower case. This makes the code more robust/portable accross OS // Convert both strings to lower case. This makes the code more robust/portable accross OS
// Versions // Versions
DeviceIDFromRegistry = DeviceIDFromRegistry.LowerCase(); DeviceIDFromRegistry = DeviceIDFromRegistry.LowerCase();
@@ -202,12 +205,11 @@ bool TPoKeys55::Connect()
return false; return false;
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool TPoKeys55::Write(unsigned char c, unsigned char b3, unsigned char b4, bool TPoKeys55::Write(unsigned char c, unsigned char b3, unsigned char b4, unsigned char b5)
unsigned char b5)
{ {
DWORD BytesWritten = 0; DWORD BytesWritten = 0;
OutputBuffer[0] = 0; // The first byte is the "Report ID" and does not get transmitted over the OutputBuffer[0] = 0; // The first byte is the "Report ID" and does not get transmitted over the
// USB bus. Always set=0. // USB bus. Always set=0.
OutputBuffer[1] = 0xBB; // 0xBB - bajt rozpoznawczy dla PoKeys55 OutputBuffer[1] = 0xBB; // 0xBB - bajt rozpoznawczy dla PoKeys55
OutputBuffer[2] = iLastCommand = c; // operacja: 0x31: blokowy odczyt wejϾ OutputBuffer[2] = iLastCommand = c; // operacja: 0x31: blokowy odczyt wejϾ
OutputBuffer[3] = b3; // np. numer pinu (o 1 mniej ni¿ numer na p³ytce) OutputBuffer[3] = b3; // np. numer pinu (o 1 mniej ni¿ numer na p³ytce)
@@ -233,7 +235,7 @@ bool TPoKeys55::Read()
{ {
DWORD BytesRead = 0; DWORD BytesRead = 0;
InputBuffer[0] = 0; // The first byte is the "Report ID" and does not get transmitted over the InputBuffer[0] = 0; // The first byte is the "Report ID" and does not get transmitted over the
// USB bus. Always set=0. // USB bus. Always set=0.
// Now get the response packet from the firmware. // Now get the response packet from the firmware.
// The following call to ReadFIle() retrieves 64 bytes of data from the USB device. // The following call to ReadFIle() retrieves 64 bytes of data from the USB device.
ReadFile(ReadHandle, &InputBuffer, 65, &BytesRead, ReadFile(ReadHandle, &InputBuffer, 65, &BytesRead,
@@ -361,7 +363,7 @@ bool TPoKeys55::Update(bool pause)
if (!iRepeats) if (!iRepeats)
bNoError = true; // jest OK bNoError = true; // jest OK
else if (iRepeats >= 10) // youBy 2014-07: przy 5 powtórzeniach sieje mi pauz¹ po 2 razy na else if (iRepeats >= 10) // youBy 2014-07: przy 5 powtórzeniach sieje mi pauz¹ po 2 razy na
// sekundê, a przy 10 jest ok // sekundê, a przy 10 jest ok
{ // przekroczenie liczby prób wymusza kolejn¹ fazê { // przekroczenie liczby prób wymusza kolejn¹ fazê
++iFaza; ++iFaza;
iRepeats = 1; // w nowej fazie nowe szanse, ale nie od 0! iRepeats = 1; // w nowej fazie nowe szanse, ale nie od 0!

View File

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

3
Data.h
View File

@@ -17,7 +17,8 @@ struct TDist
{ {
int x, y; 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 {0, 0}, // 0.00
{1, 0}, // 1.00 {1, 0}, // 1.00
{0, 1}, // 1.00 {0, 1}, // 1.00

File diff suppressed because it is too large Load Diff

View File

@@ -164,7 +164,7 @@ class TController
double fLastStopExpDist; // odległość wygasania ostateniego przystanku double fLastStopExpDist; // odległość wygasania ostateniego przystanku
double ReactionTime; // czas reakcji Ra: czego i na co? świadomości AI double ReactionTime; // czas reakcji Ra: czego i na co? świadomości AI
double fBrakeTime; // wpisana wartość jest zmniejszana do 0, gdy ujemna należy zmienić nastawę double fBrakeTime; // wpisana wartość jest zmniejszana do 0, gdy ujemna należy zmienić nastawę
// hamulca // hamulca
private: private:
double fReady; // poziom odhamowania wagonów double fReady; // poziom odhamowania wagonów
bool Ready; // ABu: stan gotowosci do odjazdu - sprawdzenie odhamowania wagonow bool Ready; // ABu: stan gotowosci do odjazdu - sprawdzenie odhamowania wagonow
@@ -178,7 +178,7 @@ class TController
public: public:
bool AIControllFlag; // rzeczywisty/wirtualny maszynista bool AIControllFlag; // rzeczywisty/wirtualny maszynista
int iRouteWanted; // oczekiwany kierunek jazdy (0-stop,1-lewo,2-prawo,3-prosto) np. odpala int iRouteWanted; // oczekiwany kierunek jazdy (0-stop,1-lewo,2-prawo,3-prosto) np. odpala
// migacz lub czeka na stan zwrotnicy // migacz lub czeka na stan zwrotnicy
private: private:
TDynamicObject *pVehicle; // pojazd w którym siedzi sterujący TDynamicObject *pVehicle; // pojazd w którym siedzi sterujący
TDynamicObject * TDynamicObject *
@@ -194,17 +194,17 @@ class TController
int iGuardRadio; // numer kanału radiowego kierownika (0, gdy nie używa radia) int iGuardRadio; // numer kanału radiowego kierownika (0, gdy nie używa radia)
public: public:
double AccPreferred; // preferowane przyspieszenie (wg psychiki kierującego, zmniejszana przy double AccPreferred; // preferowane przyspieszenie (wg psychiki kierującego, zmniejszana przy
// wykryciu kolizji) // wykryciu kolizji)
double AccDesired; // przyspieszenie, jakie ma utrzymywać (<0:nie przyspieszaj,<-0.1:hamuj) double AccDesired; // przyspieszenie, jakie ma utrzymywać (<0:nie przyspieszaj,<-0.1:hamuj)
double VelDesired; // predkość, z jaką ma jechać, wynikająca z analizy tableki; <=VelSignal double VelDesired; // predkość, z jaką ma jechać, wynikająca z analizy tableki; <=VelSignal
double fAccDesiredAv; // uśrednione przyspieszenie z kolejnych przebłysków świadomości, żeby double fAccDesiredAv; // uśrednione przyspieszenie z kolejnych przebłysków świadomości, żeby
// ograniczyć migotanie // ograniczyć migotanie
private: private:
double VelforDriver; // prędkość, używana przy zmianie kierunku (ograniczenie przy nieznajmości double VelforDriver; // prędkość, używana przy zmianie kierunku (ograniczenie przy nieznajmości
// szlaku?) // szlaku?)
double VelSignal; // predkość zadawana przez semafor (funkcją SetVelocity()) double VelSignal; // predkość zadawana przez semafor (funkcją SetVelocity())
double VelLimit; // predkość zadawana przez event jednokierunkowego ograniczenia prędkości double VelLimit; // predkość zadawana przez event jednokierunkowego ograniczenia prędkości
// (PutValues albo komendą) // (PutValues albo komendą)
public: public:
double VelNext; // prędkość, jaka ma być po przejechaniu długości ProximityDist double VelNext; // prędkość, jaka ma być po przejechaniu długości ProximityDist
private: private:
@@ -215,7 +215,7 @@ class TController
ActualProximityDist; // odległość brana pod uwagę przy wyliczaniu prędkości i przyspieszenia ActualProximityDist; // odległość brana pod uwagę przy wyliczaniu prędkości i przyspieszenia
private: private:
vector3 vCommandLocation; // polozenie wskaznika, sygnalizatora lub innego obiektu do ktorego vector3 vCommandLocation; // polozenie wskaznika, sygnalizatora lub innego obiektu do ktorego
// odnosi sie komenda // odnosi sie komenda
TOrders OrderList[maxorders]; // lista rozkazów TOrders OrderList[maxorders]; // lista rozkazów
int OrderPos, OrderTop; // rozkaz aktualny oraz wolne miejsce do wstawiania nowych int OrderPos, OrderTop; // rozkaz aktualny oraz wolne miejsce do wstawiania nowych
std::ofstream LogFile; // zapis parametrow fizycznych std::ofstream LogFile; // zapis parametrow fizycznych
@@ -226,7 +226,7 @@ class TController
int iDirectionOrder; //żadany kierunek jazdy (służy do zmiany kierunku) int iDirectionOrder; //żadany kierunek jazdy (służy do zmiany kierunku)
int iVehicleCount; // ilość pojazdów do odłączenia albo zabrania ze składu (-1=wszystkie) int iVehicleCount; // ilość pojazdów do odłączenia albo zabrania ze składu (-1=wszystkie)
int iCoupler; // maska sprzęgu, jaką należy użyć przy łączeniu (po osiągnięciu trybu Connect), 0 int iCoupler; // maska sprzęgu, jaką należy użyć przy łączeniu (po osiągnięciu trybu Connect), 0
// gdy jazda bez łączenia // gdy jazda bez łączenia
int iDriverFailCount; // licznik błędów AI int iDriverFailCount; // licznik błędów AI
bool Need_TryAgain; // true, jeśli druga pozycja w elektryku nie załapała bool Need_TryAgain; // true, jeśli druga pozycja w elektryku nie załapała
bool Need_BrakeRelease; bool Need_BrakeRelease;
@@ -235,13 +235,13 @@ class TController
double fMinProximityDist; // minimalna oległość do przeszkody, jaką należy zachować double fMinProximityDist; // minimalna oległość do przeszkody, jaką należy zachować
double fOverhead1; // informacja o napięciu w sieci trakcyjnej (0=brak drutu, zatrzymaj!) double fOverhead1; // informacja o napięciu w sieci trakcyjnej (0=brak drutu, zatrzymaj!)
double fOverhead2; // informacja o sposobie jazdy (-1=normalnie, 0=bez prądu, >0=z opuszczonym i double fOverhead2; // informacja o sposobie jazdy (-1=normalnie, 0=bez prądu, >0=z opuszczonym i
// ograniczeniem prędkości) // ograniczeniem prędkości)
int iOverheadZero; // suma bitowa jezdy bezprądowej, bity ustawiane przez pojazdy z int iOverheadZero; // suma bitowa jezdy bezprądowej, bity ustawiane przez pojazdy z
// podniesionymi pantografami // podniesionymi pantografami
int iOverheadDown; // suma bitowa opuszczenia pantografów, bity ustawiane przez pojazdy z int iOverheadDown; // suma bitowa opuszczenia pantografów, bity ustawiane przez pojazdy z
// podniesionymi pantografami // podniesionymi pantografami
double fVoltage; // uśrednione napięcie sieci: przy spadku poniżej wartości minimalnej opóźnić double fVoltage; // uśrednione napięcie sieci: przy spadku poniżej wartości minimalnej opóźnić
// rozruch o losowy czas // rozruch o losowy czas
private: private:
double fMaxProximityDist; // akceptowalna odległość stanięcia przed przeszkodą double fMaxProximityDist; // akceptowalna odległość stanięcia przed przeszkodą
TStopReason eStopReason; // powód zatrzymania przy ustawieniu zerowej prędkości TStopReason eStopReason; // powód zatrzymania przy ustawieniu zerowej prędkości
@@ -268,15 +268,18 @@ class TController
void ControllingSet(); // znajduje człon do sterowania void ControllingSet(); // znajduje człon do sterowania
void AutoRewident(); // ustawia hamulce w składzie void AutoRewident(); // ustawia hamulce w składzie
public: public:
Mtable::TTrainParameters *__fastcall Timetable() { return TrainParams; }; Mtable::TTrainParameters *__fastcall Timetable()
{
return TrainParams;
};
void PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2, void PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2,
const _mover::TLocation &NewLocation, TStopReason reason = stopComm); const _mover::TLocation &NewLocation, TStopReason reason = stopComm);
bool PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2, bool PutCommand(AnsiString NewCommand, double NewValue1, double NewValue2,
const vector3 *NewLocation, TStopReason reason = stopComm); const vector3 *NewLocation, TStopReason reason = stopComm);
bool UpdateSituation(double dt); // uruchamiac przynajmniej raz na sekundę bool UpdateSituation(double dt); // uruchamiac przynajmniej raz na sekundę
// procedury dotyczace rozkazow dla maszynisty // procedury dotyczace rozkazow dla maszynisty
void SetVelocity(double NewVel, double NewVelNext, void SetVelocity(double NewVel, double NewVelNext,
TStopReason r = stopNone); // uaktualnia informacje o prędkości TStopReason r = stopNone); // uaktualnia informacje o prędkości
bool SetProximityVelocity( bool SetProximityVelocity(
double NewDist, double NewDist,
double NewVelNext); // uaktualnia informacje o prędkości przy nastepnym semaforze double NewVelNext); // uaktualnia informacje o prędkości przy nastepnym semaforze
@@ -298,8 +301,8 @@ class TController
void OrdersClear(); void OrdersClear();
void OrdersDump(); void OrdersDump();
TController(bool AI, TDynamicObject *NewControll, bool InitPsyche, TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
bool primary = true // czy ma aktywnie prowadzić? bool primary = true // czy ma aktywnie prowadzić?
); );
AnsiString OrderCurrent(); AnsiString OrderCurrent();
void WaitingSet(double Seconds); void WaitingSet(double Seconds);
@@ -319,8 +322,7 @@ class TController
TEvent *__fastcall TableCheckTrackEvent(double fDirection, TTrack *Track); TEvent *__fastcall TableCheckTrackEvent(double fDirection, TTrack *Track);
void TableTraceRoute(double fDistance, TDynamicObject *pVehicle = NULL); void TableTraceRoute(double fDistance, TDynamicObject *pVehicle = NULL);
void TableCheck(double fDistance); void TableCheck(double fDistance);
TCommandType TableUpdate(double &fVelDes, double &fDist, double &fNext, TCommandType TableUpdate(double &fVelDes, double &fDist, double &fNext, double &fAcc);
double &fAcc);
void TablePurger(); void TablePurger();
private: // Ra: stare funkcje skanujące, używane do szukania sygnalizatora z tyłu private: // Ra: stare funkcje skanujące, używane do szukania sygnalizatora z tyłu
@@ -342,8 +344,14 @@ class TController
int StationCount(); int StationCount();
int StationIndex(); int StationIndex();
bool IsStop(); bool IsStop();
bool Primary() { return this ? bool(iDrivigFlags & movePrimary) : false; }; bool Primary()
int inline DrivigFlags() { return iDrivigFlags; }; {
return this ? bool(iDrivigFlags & movePrimary) : false;
};
int inline DrivigFlags()
{
return iDrivigFlags;
};
void MoveTo(TDynamicObject *to); void MoveTo(TDynamicObject *to);
void DirectionInitial(); void DirectionInitial();
AnsiString TableText(int i); AnsiString TableText(int i);

View File

@@ -54,7 +54,7 @@ void TAnimPant::AKP_4E()
fLenL1 = 1.22; // 1.176289 w modelach fLenL1 = 1.22; // 1.176289 w modelach
fLenU1 = 1.755; // 1.724482197 w modelach fLenU1 = 1.755; // 1.724482197 w modelach
fHoriz = 0.535; // 0.54555075 przesunięcie ślizgu w długości pojazdu względem osi obrotu dolnego fHoriz = 0.535; // 0.54555075 przesunięcie ślizgu w długości pojazdu względem osi obrotu dolnego
// ramienia // ramienia
fHeight = 0.07; // wysokość ślizgu ponad oś obrotu fHeight = 0.07; // wysokość ślizgu ponad oś obrotu
fWidth = 0.635; // połowa szerokości ślizgu, 0.635 dla AKP-1 i AKP-4E fWidth = 0.635; // połowa szerokości ślizgu, 0.635 dla AKP-1 i AKP-4E
fAngleL0 = DegToRad(2.8547285515689267247882521833308); fAngleL0 = DegToRad(2.8547285515689267247882521833308);
@@ -68,7 +68,7 @@ void TAnimPant::AKP_4E()
hvPowerWire = NULL; hvPowerWire = NULL;
fWidthExtra = 0.381; //(2.032m-1.027)/2 fWidthExtra = 0.381; //(2.032m-1.027)/2
// poza obszarem roboczym jest aproksymacja łamaną o 5 odcinkach // poza obszarem roboczym jest aproksymacja łamaną o 5 odcinkach
fHeightExtra[0] = 0.0; //+0.0762 fHeightExtra[0] = 0.0; //+0.0762
fHeightExtra[1] = -0.01; //+0.1524 fHeightExtra[1] = -0.01; //+0.1524
fHeightExtra[2] = -0.03; //+0.2286 fHeightExtra[2] = -0.03; //+0.2286
fHeightExtra[3] = -0.07; //+0.3048 fHeightExtra[3] = -0.07; //+0.3048
@@ -131,7 +131,8 @@ TAnim::~TAnim()
break; break;
} }
}; };
void TAnim::Parovoz(){// animowanie tłoka i rozrządu parowozu void TAnim::Parovoz(){
// animowanie tłoka i rozrządu parowozu
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
TDynamicObject *__fastcall TDynamicObject::FirstFind(int &coupler_nr) TDynamicObject *__fastcall TDynamicObject::FirstFind(int &coupler_nr)
@@ -288,7 +289,10 @@ TDynamicObject* TDynamicObject::GetFirstCabDynamic(int cpl_type)
}; };
*/ */
void TDynamicObject::ABuSetModelShake(vector3 mShake) { modelShake = mShake; }; void TDynamicObject::ABuSetModelShake(vector3 mShake)
{
modelShake = mShake;
};
int TDynamicObject::GetPneumatic(bool front, bool red) int TDynamicObject::GetPneumatic(bool front, bool red)
{ {
@@ -413,7 +417,7 @@ void TDynamicObject::UpdateDoorRotate(TAnim *pAnim)
{ // animacja drzwi - obrót { // animacja drzwi - obrót
if (pAnim->smAnimated) if (pAnim->smAnimated)
{ // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac { // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac
// submodelami i ShiftL=90,R=180) // submodelami i ShiftL=90,R=180)
if (pAnim->iNumber & 1) if (pAnim->iNumber & 1)
pAnim->smAnimated->SetRotate(float3(1, 0, 0), dDoorMoveR); pAnim->smAnimated->SetRotate(float3(1, 0, 0), dDoorMoveR);
else else
@@ -425,7 +429,7 @@ void TDynamicObject::UpdateDoorFold(TAnim *pAnim)
{ // animacja drzwi - obrót { // animacja drzwi - obrót
if (pAnim->smAnimated) if (pAnim->smAnimated)
{ // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac { // if (MoverParameters->DoorOpenMethod==2) //obrotowe albo dwójłomne (trzeba kombinowac
// submodelami i ShiftL=90,R=180) // submodelami i ShiftL=90,R=180)
if (pAnim->iNumber & 1) if (pAnim->iNumber & 1)
{ {
pAnim->smAnimated->SetRotate(float3(0, 0, 1), dDoorMoveR); pAnim->smAnimated->SetRotate(float3(0, 0, 1), dDoorMoveR);
@@ -849,7 +853,7 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
} }
if (MoverParameters->Battery) if (MoverParameters->Battery)
{ // sygnały czoła pociagu //Ra: wyświetlamy bez ograniczeń odległości, by były widoczne z { // sygnały czoła pociagu //Ra: wyświetlamy bez ograniczeń odległości, by były widoczne z
// daleka // daleka
if (TestFlag(iLights[0], 1)) if (TestFlag(iLights[0], 1))
{ {
btHeadSignals11.TurnOn(); btHeadSignals11.TurnOn();
@@ -899,7 +903,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track,
TDynamicObject *MyPointer, TDynamicObject *MyPointer,
int &CouplNr) int &CouplNr)
{ // zwraca wskaznik do obiektu znajdujacego sie na torze (Track), którego sprzęg jest najblizszy { // zwraca wskaznik do obiektu znajdujacego sie na torze (Track), którego sprzęg jest najblizszy
// kamerze // kamerze
// służy np. do łączenia i rozpinania sprzęgów // służy np. do łączenia i rozpinania sprzęgów
// WE: Track - tor, na ktorym odbywa sie poszukiwanie // WE: Track - tor, na ktorym odbywa sie poszukiwanie
// MyPointer - wskaznik do obiektu szukajacego // MyPointer - wskaznik do obiektu szukajacego
@@ -926,7 +930,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindNearestObject(TTrack *Track,
{ // wektor [kamera-sprzeg0], potem [kamera-sprzeg1] { // wektor [kamera-sprzeg0], potem [kamera-sprzeg1]
// Powinno byc wyliczone, ale nie zaszkodzi drugi raz: // Powinno byc wyliczone, ale nie zaszkodzi drugi raz:
//(bo co, jesli nie wykonuje sie obrotow wozkow?) - Ra: ale zawsze są liczone //(bo co, jesli nie wykonuje sie obrotow wozkow?) - Ra: ale zawsze są liczone
//współrzędne sprzęgów // współrzędne sprzęgów
// Track->Dynamics[i]->modelRot.z=ABuAcos(Track->Dynamics[i]->Axle0.pPosition-Track->Dynamics[i]->Axle1.pPosition); // Track->Dynamics[i]->modelRot.z=ABuAcos(Track->Dynamics[i]->Axle0.pPosition-Track->Dynamics[i]->Axle1.pPosition);
// poz=Track->Dynamics[i]->vPosition; //pozycja środka pojazdu // poz=Track->Dynamics[i]->vPosition; //pozycja środka pojazdu
// kon=vector3( //położenie przodu względem środka // kon=vector3( //położenie przodu względem środka
@@ -1101,7 +1105,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan
0; // to, bo (ScanDir>=0) 0; // to, bo (ScanDir>=0)
if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy
{ // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej { // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej
// szynie i się mija // szynie i się mija
// Ra: mijanie samochodów wcale nie jest proste // Ra: mijanie samochodów wcale nie jest proste
// Przesuniecie wzgledne pojazdow. Wyznaczane, zeby sprawdzic, // Przesuniecie wzgledne pojazdow. Wyznaczane, zeby sprawdzic,
// czy pojazdy faktycznie sie zderzaja (moga byc przesuniete // czy pojazdy faktycznie sie zderzaja (moga byc przesuniete
@@ -1120,7 +1124,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan
if (RelOffsetH + RelOffsetH > if (RelOffsetH + RelOffsetH >
MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W) MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W)
continue; // odległość większa od połowy sumy szerokości - kolizji continue; // odległość większa od połowy sumy szerokości - kolizji
// nie będzie // nie będzie
// jeśli zahaczenie jest niewielkie, a jest miejsce na poboczu, to // jeśli zahaczenie jest niewielkie, a jest miejsce na poboczu, to
// zjechać na pobocze // zjechać na pobocze
} }
@@ -1147,7 +1151,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan
1; // odwrotnie, bo (ScanDir<0) 1; // odwrotnie, bo (ScanDir<0)
if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy
{ // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej { // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po jednej
// szynie i się mija // szynie i się mija
// Ra: mijanie samochodów wcale nie jest proste // Ra: mijanie samochodów wcale nie jest proste
// Przesunięcie względne pojazdów. Wyznaczane, żeby sprawdzić, // Przesunięcie względne pojazdów. Wyznaczane, żeby sprawdzić,
// czy pojazdy faktycznie się zderzają (mogą być przesunięte // czy pojazdy faktycznie się zderzają (mogą być przesunięte
@@ -1166,7 +1170,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan
if (RelOffsetH + RelOffsetH > if (RelOffsetH + RelOffsetH >
MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W) MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W)
continue; // odległość większa od połowy sumy szerokości - kolizji continue; // odległość większa od połowy sumy szerokości - kolizji
// nie będzie // nie będzie
} }
iMinDist = i; // potencjalna kolizja iMinDist = i; // potencjalna kolizja
MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów
@@ -1175,7 +1179,7 @@ TDynamicObject *__fastcall TDynamicObject::ABuFindObject(TTrack *Track, int Scan
} }
} }
dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka do przeskanowanej dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka do przeskanowanej
// odległości // odległości
return (iMinDist >= 0) ? Track->Dynamics[iMinDist] : NULL; return (iMinDist >= 0) ? Track->Dynamics[iMinDist] : NULL;
} }
dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej odległości dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej odległości
@@ -1227,7 +1231,7 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir)
if ((PrevConnectedNo ? PrevConnected->NextConnected : if ((PrevConnectedNo ? PrevConnected->NextConnected :
PrevConnected->PrevConnected) == this) PrevConnected->PrevConnected) == this)
{ // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w
// innym kierunku) // innym kierunku)
PrevConnected->MoverParameters->Couplers[PrevConnectedNo].Connected = NULL; PrevConnected->MoverParameters->Couplers[PrevConnectedNo].Connected = NULL;
if (PrevConnectedNo == 0) if (PrevConnectedNo == 0)
{ {
@@ -1257,7 +1261,7 @@ void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir)
if ((NextConnectedNo ? NextConnected->NextConnected : if ((NextConnectedNo ? NextConnected->NextConnected :
NextConnected->PrevConnected) == this) NextConnected->PrevConnected) == this)
{ // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w { // Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony (może jechać w
// innym kierunku) // innym kierunku)
NextConnected->MoverParameters->Couplers[NextConnectedNo].Connected = NULL; NextConnected->MoverParameters->Couplers[NextConnectedNo].Connected = NULL;
if (NextConnectedNo == 0) if (NextConnectedNo == 0)
{ {
@@ -1289,7 +1293,7 @@ void TDynamicObject::ABuScanObjects(int ScanDir, double ScanDist)
FirstAxle->GetTrack(); // tor na którym "stoi" skrajny wózek (może być inny niż tor pojazdu) FirstAxle->GetTrack(); // tor na którym "stoi" skrajny wózek (może być inny niż tor pojazdu)
if (FirstAxle->GetDirection() < 0) // czy oś jest ustawiona w stronę Point1? if (FirstAxle->GetDirection() < 0) // czy oś jest ustawiona w stronę Point1?
ScanDir = -ScanDir; // jeśli tak, to kierunek szukania będzie przeciwny (teraz względem ScanDir = -ScanDir; // jeśli tak, to kierunek szukania będzie przeciwny (teraz względem
// toru) // toru)
Byte MyCouplFound; // numer sprzęgu do podłączenia w obiekcie szukajacym Byte MyCouplFound; // numer sprzęgu do podłączenia w obiekcie szukajacym
MyCouplFound = (MyScanDir < 0) ? 1 : 0; MyCouplFound = (MyScanDir < 0) ? 1 : 0;
Byte CouplFound; // numer sprzęgu w znalezionym obiekcie (znaleziony wypełni) Byte CouplFound; // numer sprzęgu w znalezionym obiekcie (znaleziony wypełni)
@@ -1511,7 +1515,7 @@ TDynamicObject::TDynamicObject()
cp1 = cp2 = sp1 = sp2 = 0; cp1 = cp2 = sp1 = sp2 = 0;
iDirection = 1; // stoi w kierunku tradycyjnym (0, gdy jest odwrócony) iDirection = 1; // stoi w kierunku tradycyjnym (0, gdy jest odwrócony)
iAxleFirst = 0; // numer pierwszej osi w kierunku ruchu (przełączenie następuje, gdy osie sa na iAxleFirst = 0; // numer pierwszej osi w kierunku ruchu (przełączenie następuje, gdy osie sa na
// tym samym torze) // tym samym torze)
iInventory = 0; // flagi bitowe posiadanych submodeli (zaktualizuje się po wczytaniu MMD) iInventory = 0; // flagi bitowe posiadanych submodeli (zaktualizuje się po wczytaniu MMD)
RaLightsSet(0, 0); // początkowe zerowanie stanu świateł RaLightsSet(0, 0); // początkowe zerowanie stanu świateł
// Ra: domyślne ilości animacji dla zgodności wstecz (gdy brak ilości podanych w MMD) // Ra: domyślne ilości animacji dla zgodności wstecz (gdy brak ilości podanych w MMD)
@@ -1536,7 +1540,7 @@ TDynamicObject::TDynamicObject()
fScanDist = 300.0; // odległość skanowania, zwiększana w trybie łączenia fScanDist = 300.0; // odległość skanowania, zwiększana w trybie łączenia
ctOwner = NULL; // na początek niczyj ctOwner = NULL; // na początek niczyj
iOverheadMask = 0; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały iOverheadMask = 0; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały
// jazdę bezprądową // jazdę bezprądową
tmpTraction.TractionVoltage = tmpTraction.TractionVoltage =
0; // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało WS pod izolatorem 0; // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało WS pod izolatorem
fAdjustment = 0.0; // korekcja odległości pomiędzy wózkami (np. na łukach) fAdjustment = 0.0; // korekcja odległości pomiędzy wózkami (np. na łukach)
@@ -1651,7 +1655,7 @@ double TDynamicObject::Init(
int dlugosc = MoreParams.Length(); int dlugosc = MoreParams.Length();
ActPar = MoreParams.SubString(1, kropka - 1).UpperCase(); // pierwszy parametr; ActPar = MoreParams.SubString(1, kropka - 1).UpperCase(); // pierwszy parametr;
MoreParams = MoreParams.SubString(kropka + 1, dlugosc - kropka); // reszta do dalszej MoreParams = MoreParams.SubString(kropka + 1, dlugosc - kropka); // reszta do dalszej
// obrobki // obrobki
kropka = MoreParams.Pos("."); kropka = MoreParams.Pos(".");
if (ActPar.SubString(1, 1) == "B") // jesli hamulce if (ActPar.SubString(1, 1) == "B") // jesli hamulce
@@ -1780,13 +1784,13 @@ double TDynamicObject::Init(
{ // ustawianie samochodow na poboczu albo na środku drogi { // ustawianie samochodow na poboczu albo na środku drogi
if (Track->fTrackWidth < 3.5) // jeśli droga wąska if (Track->fTrackWidth < 3.5) // jeśli droga wąska
MoverParameters->OffsetTrackH = 0.0; // to stawiamy na środku, niezależnie od stanu MoverParameters->OffsetTrackH = 0.0; // to stawiamy na środku, niezależnie od stanu
// ruchu // ruchu
else if (driveractive) // od 3.5m do 8.0m jedzie po środku pasa, dla szerszych w odległości else if (driveractive) // od 3.5m do 8.0m jedzie po środku pasa, dla szerszych w odległości
// 1.5m // 1.5m
MoverParameters->OffsetTrackH = MoverParameters->OffsetTrackH =
Track->fTrackWidth <= 8.0 ? -Track->fTrackWidth * 0.25 : -1.5; Track->fTrackWidth <= 8.0 ? -Track->fTrackWidth * 0.25 : -1.5;
else // jak stoi, to kołem na poboczu i pobieramy szerokość razem z poboczem, ale nie z else // jak stoi, to kołem na poboczu i pobieramy szerokość razem z poboczem, ale nie z
// chodnikiem // chodnikiem
MoverParameters->OffsetTrackH = MoverParameters->OffsetTrackH =
-0.5 * (Track->WidthTotal() - MoverParameters->Dim.W) + 0.05; -0.5 * (Track->WidthTotal() - MoverParameters->Dim.W) + 0.05;
iHornWarning = 0; // nie będzie trąbienia po podaniu zezwolenia na jazdę iHornWarning = 0; // nie będzie trąbienia po podaniu zezwolenia na jazdę
@@ -1889,7 +1893,7 @@ double TDynamicObject::Init(
smBuforPrawy[i]->WillBeAnimated(); smBuforPrawy[i]->WillBeAnimated();
} }
for (int i = 0; i < iAxles; i++) // wyszukiwanie osi (0 jest na końcu, dlatego dodajemy for (int i = 0; i < iAxles; i++) // wyszukiwanie osi (0 jest na końcu, dlatego dodajemy
// długość?) // długość?)
dRailPosition[i] = dRailPosition[i] =
(Reversed ? -dWheelsPosition[i] : (dWheelsPosition[i] + MoverParameters->Dim.L)) + (Reversed ? -dWheelsPosition[i] : (dWheelsPosition[i] + MoverParameters->Dim.L)) +
fDist; fDist;
@@ -1943,7 +1947,7 @@ double TDynamicObject::Init(
break; break;
} }
Move(0.0001); // potrzebne do wyliczenia aktualnej pozycji; nie może być zero, bo nie przeliczy Move(0.0001); // potrzebne do wyliczenia aktualnej pozycji; nie może być zero, bo nie przeliczy
// pozycji // pozycji
// teraz jeszcze trzeba przypisać pojazdy do nowego toru, bo przesuwanie początkowe osi nie // teraz jeszcze trzeba przypisać pojazdy do nowego toru, bo przesuwanie początkowe osi nie
// zrobiło tego // zrobiło tego
ABuCheckMyTrack(); // zmiana toru na ten, co oś Axle0 (oś z przodu) ABuCheckMyTrack(); // zmiana toru na ten, co oś Axle0 (oś z przodu)
@@ -2009,11 +2013,11 @@ void TDynamicObject::Move(double fDistance)
bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oś z tyłu pojazdu prusza się pierwsza bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oś z tyłu pojazdu prusza się pierwsza
bEnabled &= Axle0.Move(fDistance /*-fAdjustment*/, !iAxleFirst); // oś z przodu pojazdu bEnabled &= Axle0.Move(fDistance /*-fAdjustment*/, !iAxleFirst); // oś z przodu pojazdu
} }
else //gf: bez wywolania Move na postoju nie ma event0 else // gf: bez wywolania Move na postoju nie ma event0
{ {
bEnabled&=Axle1.Move(fDistance,iAxleFirst); //oś z tyłu pojazdu prusza się pierwsza bEnabled &= Axle1.Move(fDistance, iAxleFirst); // oś z tyłu pojazdu prusza się pierwsza
bEnabled&=Axle0.Move(fDistance,!iAxleFirst); //oś z przodu pojazdu bEnabled &= Axle0.Move(fDistance, !iAxleFirst); // oś z przodu pojazdu
} }
if (fDistance != 0.0) // nie liczyć ponownie, jeśli stoi if (fDistance != 0.0) // nie liczyć ponownie, jeśli stoi
{ // liczenie pozycji pojazdu tutaj, bo jest używane w wielu miejscach { // liczenie pozycji pojazdu tutaj, bo jest używane w wielu miejscach
vPosition = 0.5 * (Axle1.pPosition + Axle0.pPosition); //środek między skrajnymi osiami vPosition = 0.5 * (Axle1.pPosition + Axle0.pPosition); //środek między skrajnymi osiami
@@ -2049,7 +2053,7 @@ void TDynamicObject::Move(double fDistance)
} }
mMatrix.Identity(); // to też można by od razu policzyć, ale potrzebne jest do wyświetlania mMatrix.Identity(); // to też można by od razu policzyć, ale potrzebne jest do wyświetlania
mMatrix.BasisChange(vLeft, vUp, vFront); // przesuwanie jest jednak rzadziej niż mMatrix.BasisChange(vLeft, vUp, vFront); // przesuwanie jest jednak rzadziej niż
// renderowanie // renderowanie
mMatrix = mMatrix =
Inverse(mMatrix); // wyliczenie macierzy dla pojazdu (potrzebna tylko do wyświetlania?) Inverse(mMatrix); // wyliczenie macierzy dla pojazdu (potrzebna tylko do wyświetlania?)
// if (MoverParameters->CategoryFlag&2) // if (MoverParameters->CategoryFlag&2)
@@ -2076,7 +2080,7 @@ void TDynamicObject::Move(double fDistance)
TTrack *t0 = Axle0.GetTrack(); // już po przesunięciu TTrack *t0 = Axle0.GetTrack(); // już po przesunięciu
TTrack *t1 = Axle1.GetTrack(); TTrack *t1 = Axle1.GetTrack();
if ((t0->eEnvironment == e_flat) && (t1->eEnvironment == e_flat)) // może być if ((t0->eEnvironment == e_flat) && (t1->eEnvironment == e_flat)) // może być
// e_bridge... // e_bridge...
fShade = 0.0; // standardowe oświetlenie fShade = 0.0; // standardowe oświetlenie
else else
{ // jeżeli te tory mają niestandardowy stopień zacienienia (e_canyon, e_tunnel) { // jeżeli te tory mają niestandardowy stopień zacienienia (e_canyon, e_tunnel)
@@ -2171,11 +2175,11 @@ void TDynamicObject::AttachPrev(TDynamicObject *Object, int iType)
if ((MoverParameters->Power < 1.0) && if ((MoverParameters->Power < 1.0) &&
(Object->MoverParameters->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma (Object->MoverParameters->Power > 1.0)) // my nie mamy mocy, ale ten drugi ma
iLights = Object->MoverParameters->iLights; // to w tym z mocą będą światła iLights = Object->MoverParameters->iLights; // to w tym z mocą będą światła
// załączane, a w tym bez tylko widoczne // załączane, a w tym bez tylko widoczne
else if ((MoverParameters->Power > 1.0) && else if ((MoverParameters->Power > 1.0) &&
(Object->MoverParameters->Power < 1.0)) // my mamy moc, ale ten drugi nie ma (Object->MoverParameters->Power < 1.0)) // my mamy moc, ale ten drugi nie ma
Object->iLights = MoverParameters->iLights; // to w tym z mocą będą światła Object->iLights = MoverParameters->iLights; // to w tym z mocą będą światła
// załączane, a w tym bez tylko widoczne // załączane, a w tym bez tylko widoczne
return; return;
// SetPneumatic(1,1); //Ra: to i tak się nie wykonywało po return // SetPneumatic(1,1); //Ra: to i tak się nie wykonywało po return
// SetPneumatic(1,0); // SetPneumatic(1,0);
@@ -2337,10 +2341,10 @@ bool TDynamicObject::Update(double dt, double dt1)
// if ((!MoverParameters->PantCompFlag)&&(MoverParameters->CompressedVolume>=2.8)) // if ((!MoverParameters->PantCompFlag)&&(MoverParameters->CompressedVolume>=2.8))
// MoverParameters->PantVolume=MoverParameters->CompressedVolume; // MoverParameters->PantVolume=MoverParameters->CompressedVolume;
if (MoverParameters->PantPress < (MoverParameters->TrainType == dt_EZT ? 2.4 : 3.5)) if (MoverParameters->PantPress < (MoverParameters->TrainType == dt_EZT ? 2.4 : 3.5))
{ // 3.5 wg http://www.transportszynowy.pl/eu06-07pneumat.php { // 3.5 wg http://www.transportszynowy.pl/eu06-07pneumat.php
//"Wyłączniki ciśnieniowe odbieraków prądu wyłączają sterowanie wyłącznika szybkiego //"Wyłączniki ciśnieniowe odbieraków prądu wyłączają sterowanie wyłącznika szybkiego
//oraz uniemożliwiają podniesienie odbieraków prądu, gdy w instalacji rozrządu // oraz uniemożliwiają podniesienie odbieraków prądu, gdy w instalacji rozrządu
//ciśnienie spadnie poniżej wartości 3,5 bara." // ciśnienie spadnie poniżej wartości 3,5 bara."
// Ra 2013-12: Niebugocław mówi, że w EZT podnoszą się przy 2.5 // Ra 2013-12: Niebugocław mówi, że w EZT podnoszą się przy 2.5
// if (!MoverParameters->PantCompFlag) // if (!MoverParameters->PantCompFlag)
// MoverParameters->PantVolume=MoverParameters->CompressedVolume; // MoverParameters->PantVolume=MoverParameters->CompressedVolume;
@@ -2375,7 +2379,7 @@ bool TDynamicObject::Update(double dt, double dt1)
ts.R = -0.5 * MoverParameters->BDist / sin(ts.R * 0.5); ts.R = -0.5 * MoverParameters->BDist / sin(ts.R * 0.5);
if ((ts.R > 15000.0) || (ts.R < -15000.0)) if ((ts.R > 15000.0) || (ts.R < -15000.0))
ts.R = 0.0; // szkoda czasu na zbyt duże promienie, 4km to promień nie wymagający ts.R = 0.0; // szkoda czasu na zbyt duże promienie, 4km to promień nie wymagający
// przechyłki // przechyłki
} }
else else
ts.R = 0.0; ts.R = 0.0;
@@ -2383,7 +2387,7 @@ bool TDynamicObject::Update(double dt, double dt1)
// Ra: składową pochylenia wzdłużnego mamy policzoną w jednostkowym wektorze vFront // Ra: składową pochylenia wzdłużnego mamy policzoną w jednostkowym wektorze vFront
ts.Len = 1.0; // Max0R(MoverParameters->BDist,MoverParameters->ADist); ts.Len = 1.0; // Max0R(MoverParameters->BDist,MoverParameters->ADist);
ts.dHtrack = -vFront.y; // Axle1.pPosition.y-Axle0.pPosition.y; //wektor między skrajnymi osiami ts.dHtrack = -vFront.y; // Axle1.pPosition.y-Axle0.pPosition.y; //wektor między skrajnymi osiami
// (!!!odwrotny) // (!!!odwrotny)
ts.dHrail = (Axle1.GetRoll() + Axle0.GetRoll()) * 0.5; //średnia przechyłka pudła ts.dHrail = (Axle1.GetRoll() + Axle0.GetRoll()) * 0.5; //średnia przechyłka pudła
// TTrackParam tp; // TTrackParam tp;
tp.Width = MyTrack->fTrackWidth; tp.Width = MyTrack->fTrackWidth;
@@ -2447,14 +2451,14 @@ bool TDynamicObject::Update(double dt, double dt1)
*/ */
NoVoltTime = NoVoltTime + dt; NoVoltTime = NoVoltTime + dt;
if (NoVoltTime > 0.2) // jeśli brak zasilania dłużej niż 0.2 sekundy (25km/h pod if (NoVoltTime > 0.2) // jeśli brak zasilania dłużej niż 0.2 sekundy (25km/h pod
// izolatorem daje 0.15s) // izolatorem daje 0.15s)
{ // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało WS pod { // Ra 2F1H: prowizorka, trzeba przechować napięcie, żeby nie wywalało WS pod
// izolatorem // izolatorem
if (MoverParameters->Vel > 0.5) // jeśli jedzie if (MoverParameters->Vel > 0.5) // jeśli jedzie
if (MoverParameters->PantFrontUp || if (MoverParameters->PantFrontUp ||
MoverParameters->PantRearUp) // Ra 2014-07: doraźna blokada logowania MoverParameters->PantRearUp) // Ra 2014-07: doraźna blokada logowania
// zimnych lokomotyw - zrobić to trzeba // zimnych lokomotyw - zrobić to trzeba
// inaczej // inaczej
// if (NoVoltTime>0.02) //tu można ograniczyć czas rozłączenia // if (NoVoltTime>0.02) //tu można ograniczyć czas rozłączenia
// if (DebugModeFlag) //logowanie nie zawsze // if (DebugModeFlag) //logowanie nie zawsze
if (MoverParameters->Mains) if (MoverParameters->Mains)
@@ -2744,7 +2748,7 @@ bool TDynamicObject::Update(double dt, double dt1)
if (pants[0].fParamPants->hvPowerWire && if (pants[0].fParamPants->hvPowerWire &&
pants[1].fParamPants->hvPowerWire) // i oba podłączone do drutów pants[1].fParamPants->hvPowerWire) // i oba podłączone do drutów
fPantCurrent = fCurrent * 0.5; // to dzielimy prąd równo na oba (trochę bez fPantCurrent = fCurrent * 0.5; // to dzielimy prąd równo na oba (trochę bez
// sensu, ale lepiej tak niż podwoić prąd) // sensu, ale lepiej tak niż podwoić prąd)
for (int i = 0; i < iAnimType[ANIM_PANTS]; ++i) for (int i = 0; i < iAnimType[ANIM_PANTS]; ++i)
{ // pętla po wszystkich pantografach { // pętla po wszystkich pantografach
p = pants[i].fParamPants; p = pants[i].fParamPants;
@@ -2780,7 +2784,7 @@ bool TDynamicObject::Update(double dt, double dt1)
(MoverParameters->PantRearVolt == 0.0)) (MoverParameters->PantRearVolt == 0.0))
sPantUp.Play(vol, 0, MechInside, vPosition); sPantUp.Play(vol, 0, MechInside, vPosition);
if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i
// wstawić do GetVoltage() // wstawić do GetVoltage()
{ {
MoverParameters->PantFrontVolt = MoverParameters->PantFrontVolt =
p->hvPowerWire->VoltageGet(MoverParameters->Voltage, fPantCurrent); p->hvPowerWire->VoltageGet(MoverParameters->Voltage, fPantCurrent);
@@ -2804,7 +2808,7 @@ bool TDynamicObject::Update(double dt, double dt1)
(MoverParameters->PantFrontVolt == 0.0)) (MoverParameters->PantFrontVolt == 0.0))
sPantUp.Play(vol, 0, MechInside, vPosition); sPantUp.Play(vol, 0, MechInside, vPosition);
if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i if (p->hvPowerWire) // TODO: wyliczyć trzeba prąd przypadający na pantograf i
// wstawić do GetVoltage() // wstawić do GetVoltage()
{ {
MoverParameters->PantRearVolt = MoverParameters->PantRearVolt =
p->hvPowerWire->VoltageGet(MoverParameters->Voltage, fPantCurrent); p->hvPowerWire->VoltageGet(MoverParameters->Voltage, fPantCurrent);
@@ -2833,7 +2837,7 @@ bool TDynamicObject::Update(double dt, double dt1)
{ {
if (PantDiff > 0.001) // jeśli nie dolega do drutu if (PantDiff > 0.001) // jeśli nie dolega do drutu
{ // jeśli poprzednia wysokość jest mniejsza niż pożądana, zwiększyć kąt dolnego { // jeśli poprzednia wysokość jest mniejsza niż pożądana, zwiększyć kąt dolnego
// ramienia zgodnie z ciśnieniem // ramienia zgodnie z ciśnieniem
if (pantspeedfactor > if (pantspeedfactor >
0.55 * PantDiff) // 0.55 to około pochodna kąta po wysokości 0.55 * PantDiff) // 0.55 to około pochodna kąta po wysokości
k += 0.55 * PantDiff; // ograniczenie "skoku" w danej klatce k += 0.55 * PantDiff; // ograniczenie "skoku" w danej klatce
@@ -2889,7 +2893,7 @@ bool TDynamicObject::Update(double dt, double dt1)
{ // to coś wyłączało dźwięk silnika w ST43! { // to coś wyłączało dźwięk silnika w ST43!
MoverParameters->ConverterFlag = false; MoverParameters->ConverterFlag = false;
MoverParameters->CompressorFlag = false; // Ra: to jest wątpliwe - wyłączenie MoverParameters->CompressorFlag = false; // Ra: to jest wątpliwe - wyłączenie
// sprężarki powinno być w jednym miejscu! // sprężarki powinno być w jednym miejscu!
} }
} }
} }
@@ -3013,7 +3017,7 @@ bool TDynamicObject::Update(double dt, double dt1)
else else
{ {
CouplCounter = 25; // a bezruch nie, ale trzeba zaktualizować odległość, bo zawalidroga może CouplCounter = 25; // a bezruch nie, ale trzeba zaktualizować odległość, bo zawalidroga może
// sobie pojechać // sobie pojechać
} }
if (MoverParameters->DerailReason > 0) if (MoverParameters->DerailReason > 0)
{ {
@@ -3366,7 +3370,7 @@ void TDynamicObject::RenderSounds()
if ((MoverParameters->DynamicBrakeFlag) && (MoverParameters->EnginePower > 0.1) && if ((MoverParameters->DynamicBrakeFlag) && (MoverParameters->EnginePower > 0.1) &&
(MoverParameters->EngineType == (MoverParameters->EngineType ==
ElectricSeriesMotor)) // Szociu - 29012012 - jeżeli uruchomiony jest hamulec ElectricSeriesMotor)) // Szociu - 29012012 - jeżeli uruchomiony jest hamulec
// elektrodynamiczny, odtwarzany jest dźwięk silnika // elektrodynamiczny, odtwarzany jest dźwięk silnika
vol += 0.8; vol += 0.8;
if (enginevolume > 0.0001) if (enginevolume > 0.0001)
@@ -3601,7 +3605,7 @@ void TDynamicObject::RenderSounds()
if (MoverParameters->DoorClosureWarning) if (MoverParameters->DoorClosureWarning)
{ {
if (MoverParameters->DepartureSignal) // NBMX sygnal odjazdu, MC: pod warunkiem ze jest if (MoverParameters->DepartureSignal) // NBMX sygnal odjazdu, MC: pod warunkiem ze jest
// zdefiniowane w chk // zdefiniowane w chk
sDepartureSignal.TurnOn(MechInside, GetPosition()); sDepartureSignal.TurnOn(MechInside, GetPosition());
else else
sDepartureSignal.TurnOff(MechInside, GetPosition()); sDepartureSignal.TurnOff(MechInside, GetPosition());
@@ -3755,7 +3759,7 @@ void TDynamicObject::RenderAlpha()
// McZapkie-250202 // McZapkie-250202
// wczytywanie pliku z danymi multimedialnymi (dzwieki) // wczytywanie pliku z danymi multimedialnymi (dzwieki)
void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
AnsiString ReplacableSkin) AnsiString ReplacableSkin)
{ {
double dSDist; double dSDist;
TFileStream *fs; TFileStream *fs;
@@ -3806,7 +3810,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
} }
if ((i = asModel.Pos(",")) > 0) if ((i = asModel.Pos(",")) > 0)
{ // Ra 2015-01: może szukać przecinka w nazwie modelu, a po przecinku była by liczba { // Ra 2015-01: może szukać przecinka w nazwie modelu, a po przecinku była by liczba
// tekstur? // tekstur?
if (i < asModel.Length()) if (i < asModel.Length())
iMultiTex = asModel[i + 1] - '0'; iMultiTex = asModel[i + 1] - '0';
if (iMultiTex < 0) if (iMultiTex < 0)
@@ -3866,7 +3870,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
if (!ReplacableSkin.IsEmpty()) if (!ReplacableSkin.IsEmpty())
{ // próba wycięcia trzeciej nazwy { // próba wycięcia trzeciej nazwy
iMultiTex = -4; // skoro zostało coś po kresce, to są co iMultiTex = -4; // skoro zostało coś po kresce, to są co
// najmniej cztery // najmniej cztery
ReplacableSkinID[-iMultiTex] = ReplacableSkinID[-iMultiTex] =
TTexturesManager::GetTextureID( TTexturesManager::GetTextureID(
NULL, NULL, NULL, NULL,
@@ -3902,7 +3906,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
Global::iDynamicFiltering); Global::iDynamicFiltering);
if (ReplacableSkinID[4]) if (ReplacableSkinID[4])
iMultiTex = 4; // jak są cztery, to blokujemy podmianę tekstury iMultiTex = 4; // jak są cztery, to blokujemy podmianę tekstury
// rozkładem // rozkładem
} }
} }
} }
@@ -3918,22 +3922,22 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
NULL, NULL, ReplacableSkin.c_str(), Global::iDynamicFiltering); NULL, NULL, ReplacableSkin.c_str(), Global::iDynamicFiltering);
if (TTexturesManager::GetAlpha(ReplacableSkinID[1])) if (TTexturesManager::GetAlpha(ReplacableSkinID[1]))
iAlpha = 0x31310031; // tekstura -1 z kanałem alfa - nie renderować w cyklu iAlpha = 0x31310031; // tekstura -1 z kanałem alfa - nie renderować w cyklu
// nieprzezroczystych // nieprzezroczystych
else else
iAlpha = 0x30300030; // wszystkie tekstury nieprzezroczyste - nie renderować w iAlpha = 0x30300030; // wszystkie tekstury nieprzezroczyste - nie renderować w
// cyklu przezroczystych // cyklu przezroczystych
if (ReplacableSkinID[2]) if (ReplacableSkinID[2])
if (TTexturesManager::GetAlpha(ReplacableSkinID[2])) if (TTexturesManager::GetAlpha(ReplacableSkinID[2]))
iAlpha |= 0x02020002; // tekstura -2 z kanałem alfa - nie renderować w cyklu iAlpha |= 0x02020002; // tekstura -2 z kanałem alfa - nie renderować w cyklu
// nieprzezroczystych // nieprzezroczystych
if (ReplacableSkinID[3]) if (ReplacableSkinID[3])
if (TTexturesManager::GetAlpha(ReplacableSkinID[3])) if (TTexturesManager::GetAlpha(ReplacableSkinID[3]))
iAlpha |= 0x04040004; // tekstura -3 z kanałem alfa - nie renderować w cyklu iAlpha |= 0x04040004; // tekstura -3 z kanałem alfa - nie renderować w cyklu
// nieprzezroczystych // nieprzezroczystych
if (ReplacableSkinID[4]) if (ReplacableSkinID[4])
if (TTexturesManager::GetAlpha(ReplacableSkinID[4])) if (TTexturesManager::GetAlpha(ReplacableSkinID[4]))
iAlpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować w cyklu iAlpha |= 0x08080008; // tekstura -4 z kanałem alfa - nie renderować w cyklu
// nieprzezroczystych // nieprzezroczystych
} }
// Winger 040304 - ladowanie przedsionkow dla EZT // Winger 040304 - ladowanie przedsionkow dla EZT
if (MoverParameters->TrainType == dt_EZT) if (MoverParameters->TrainType == dt_EZT)
@@ -3984,7 +3988,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
str = Parser->GetNextSymbol().LowerCase(); str = Parser->GetNextSymbol().LowerCase();
if (str == AnsiString("animations:")) if (str == AnsiString("animations:"))
{ // Ra: ustawienie ilości poszczególnych animacji - musi być jako pierwsze, inaczej { // Ra: ustawienie ilości poszczególnych animacji - musi być jako pierwsze, inaczej
// ilości będą domyślne // ilości będą domyślne
if (!pAnimations) if (!pAnimations)
{ // jeśli nie ma jeszcze tabeli animacji, można odczytać nowe ilości { // jeśli nie ma jeszcze tabeli animacji, można odczytać nowe ilości
int co = 0, ile; int co = 0, ile;
@@ -3992,7 +3996,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
do do
{ // kolejne liczby to ilość animacj, -1 to znacznik końca { // kolejne liczby to ilość animacj, -1 to znacznik końca
ile = Parser->GetNextSymbol().ToIntDef(-1); // ilość danego typu ile = Parser->GetNextSymbol().ToIntDef(-1); // ilość danego typu
// animacji // animacji
// if (co==ANIM_PANTS) // if (co==ANIM_PANTS)
// if (!Global::bLoadTraction) // if (!Global::bLoadTraction)
// if (!DebugModeFlag) //w debugmode pantografy mają "niby działać" // if (!DebugModeFlag) //w debugmode pantografy mają "niby działać"
@@ -4030,7 +4034,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
if (j == ANIM_PANTS) // zliczamy poprzednie animacje if (j == ANIM_PANTS) // zliczamy poprzednie animacje
if (!pants) if (!pants)
if (iAnimType[ANIM_PANTS]) // o ile jakieś pantografy są (a if (iAnimType[ANIM_PANTS]) // o ile jakieś pantografy są (a
// domyślnie są) // domyślnie są)
pants = pAnimations + pants = pAnimations +
k; // zapamiętanie na potrzeby wyszukania submodeli k; // zapamiętanie na potrzeby wyszukania submodeli
pAnimations[k].iShift = sm; // przesunięcie do przydzielenia wskaźnika pAnimations[k].iShift = sm; // przesunięcie do przydzielenia wskaźnika
@@ -4082,7 +4086,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
if (pAnimations[i].smAnimated) if (pAnimations[i].smAnimated)
{ //++iAnimatedAxles; { //++iAnimatedAxles;
pAnimations[i].smAnimated->WillBeAnimated(); // wyłączenie optymalizacji pAnimations[i].smAnimated->WillBeAnimated(); // wyłączenie optymalizacji
// transformu // transformu
pAnimations[i].yUpdate = UpdateAxle; // animacja osi pAnimations[i].yUpdate = UpdateAxle; // animacja osi
pAnimations[i].fMaxDist = pAnimations[i].fMaxDist =
50 * 50 *
@@ -4092,8 +4096,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
MoverParameters MoverParameters
->WheelDiameter; // 50m do kwadratu, a średnica do trzeciej ->WheelDiameter; // 50m do kwadratu, a średnica do trzeciej
pAnimations[i].fMaxDist *= Global::fDistanceFactor; // współczynnik pAnimations[i].fMaxDist *= Global::fDistanceFactor; // współczynnik
// przeliczeniowy // przeliczeniowy
// jakości ekranu // jakości ekranu
} }
} }
// Ra: ustawianie indeksów osi // Ra: ustawianie indeksów osi
@@ -4121,12 +4125,12 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
else if ((k >= '1') && (k <= '9')) else if ((k >= '1') && (k <= '9'))
{ {
pAnimations[i++].dWheelAngle = dWheelAngle + m; // obrót osi pAnimations[i++].dWheelAngle = dWheelAngle + m; // obrót osi
// tocznych // tocznych
--k; // następna będzie albo taka sama, albo bierzemy kolejny znak --k; // następna będzie albo taka sama, albo bierzemy kolejny znak
} }
else else
k = MoverParameters->AxleArangement[j++]; // pobranie kolejnego k = MoverParameters->AxleArangement[j++]; // pobranie kolejnego
// znaku // znaku
} }
} }
} }
@@ -4162,17 +4166,17 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
// m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie tak) // m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie tak)
if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z T3D if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z T3D
m.InitialRotate(); // może być potrzebny dodatkowy obrót, jeśli m.InitialRotate(); // może być potrzebny dodatkowy obrót, jeśli
// wczytano z T3D, tzn. przed wykonaniem // wczytano z T3D, tzn. przed wykonaniem
// Init() // Init()
pants[i].fParamPants->vPos.z = pants[i].fParamPants->vPos.z =
m[3][0]; // przesunięcie w bok (asymetria) m[3][0]; // przesunięcie w bok (asymetria)
pants[i].fParamPants->vPos.y = pants[i].fParamPants->vPos.y =
m[3][1]; // przesunięcie w górę odczytane z modelu m[3][1]; // przesunięcie w górę odczytane z modelu
if ((sm = pants[i].smElement[0]->ChildGet()) != NULL) if ((sm = pants[i].smElement[0]->ChildGet()) != NULL)
{ // jeśli ma potomny, można policzyć długość (odległość potomnego { // jeśli ma potomny, można policzyć długość (odległość potomnego
// od osi obrotu) // od osi obrotu)
m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, nie m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, nie
// trzeba kopiować // trzeba kopiować
// może trzeba: pobrać macierz dolnego ramienia, wyzerować // może trzeba: pobrać macierz dolnego ramienia, wyzerować
// przesunięcie, przemnożyć przez macierz górnego // przesunięcie, przemnożyć przez macierz górnego
pants[i].fParamPants->fHoriz = -fabs(m[3][1]); pants[i].fParamPants->fHoriz = -fabs(m[3][1]);
@@ -4189,18 +4193,18 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
// pants[i].fParamPants->fAngleL0=pants[i].fParamPants->fAngleL; // pants[i].fParamPants->fAngleL0=pants[i].fParamPants->fAngleL;
pants[i].fParamPants->fAngleL = pants[i].fParamPants->fAngleL =
pants[i].fParamPants->fAngleL0; // początkowy kąt dolnego pants[i].fParamPants->fAngleL0; // początkowy kąt dolnego
// ramienia // ramienia
if ((sm = sm->ChildGet()) != NULL) if ((sm = sm->ChildGet()) != NULL)
{ // jeśli dalej jest ślizg, można policzyć długość górnego { // jeśli dalej jest ślizg, można policzyć długość górnego
// ramienia // ramienia
m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik,
// nie trzeba kopiować // nie trzeba kopiować
// trzeba by uwzględnić macierz dolnego ramienia, żeby // trzeba by uwzględnić macierz dolnego ramienia, żeby
// uzyskać kąt do poziomu... // uzyskać kąt do poziomu...
pants[i].fParamPants->fHoriz += pants[i].fParamPants->fHoriz +=
fabs(m(3)[1]); // różnica długości rzutów ramion na fabs(m(3)[1]); // różnica długości rzutów ramion na
// płaszczyznę podstawy (jedna dodatnia, // płaszczyznę podstawy (jedna dodatnia,
// druga ujemna) // druga ujemna)
pants[i].fParamPants->fLenU1 = pants[i].fParamPants->fLenU1 =
hypot(m[3][1], m[3][2]); // po osi OX nie potrzeba hypot(m[3][1], m[3][2]); // po osi OX nie potrzeba
// pants[i].fParamPants->pantu=acos((1.22*cos(pants[i].fParamPants->fAngleL)+0.535)/1.755); // pants[i].fParamPants->pantu=acos((1.22*cos(pants[i].fParamPants->fAngleL)+0.535)/1.755);
@@ -4210,7 +4214,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
pants[i].fParamPants->fAngleU0 = pants[i].fParamPants->fAngleU0 =
atan2(fabs(m[3][2]), atan2(fabs(m[3][2]),
fabs(m[3][1])); // początkowy kąt górnego fabs(m[3][1])); // początkowy kąt górnego
// ramienia, odczytany z modelu // ramienia, odczytany z modelu
// if (pants[i].fParamPants->fAngleU0<M_PI_2) // if (pants[i].fParamPants->fAngleU0<M_PI_2)
// pants[i].fParamPants->fAngleU0+=M_PI; //gdyby w odwrotną // pants[i].fParamPants->fAngleU0+=M_PI; //gdyby w odwrotną
// stronę wyszło // stronę wyszło
@@ -4225,25 +4229,25 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
// Ra: ze względu na to, że niektóre modele pantografów są // Ra: ze względu na to, że niektóre modele pantografów są
// zrąbane, ich mierzenie ma obecnie ograniczony sens // zrąbane, ich mierzenie ma obecnie ograniczony sens
sm->ParentMatrix(&m); // pobranie macierzy transformacji sm->ParentMatrix(&m); // pobranie macierzy transformacji
// pivota ślizgu względem wstawienia // pivota ślizgu względem wstawienia
// pojazdu // pojazdu
if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z
// T3D // T3D
m.InitialRotate(); // może być potrzebny dodatkowy m.InitialRotate(); // może być potrzebny dodatkowy
// obrót, jeśli wczytano z T3D, tzn. // obrót, jeśli wczytano z T3D, tzn.
// przed wykonaniem Init() // przed wykonaniem Init()
float det = Det(m); float det = Det(m);
if (fabs(det - 1.0) < 0.001) // dopuszczamy 1 promil błędu if (fabs(det - 1.0) < 0.001) // dopuszczamy 1 promil błędu
// na skalowaniu ślizgu // na skalowaniu ślizgu
{ // skalowanie jest w normie, można pobrać wymiary z modelu { // skalowanie jest w normie, można pobrać wymiary z modelu
pants[i].fParamPants->fHeight = pants[i].fParamPants->fHeight =
sm->MaxY(m); // przeliczenie maksimum wysokości sm->MaxY(m); // przeliczenie maksimum wysokości
// wierzchołków względem macierzy // wierzchołków względem macierzy
pants[i].fParamPants->fHeight -= pants[i].fParamPants->fHeight -=
m[3][1]; // odjęcie wysokości pivota ślizgu m[3][1]; // odjęcie wysokości pivota ślizgu
pants[i].fParamPants->vPos.x = pants[i].fParamPants->vPos.x =
m[3][2]; // przy okazji odczytać z modelu pozycję w m[3][2]; // przy okazji odczytać z modelu pozycję w
// długości // długości
// ErrorLog("Model OK: "+asModel+", // ErrorLog("Model OK: "+asModel+",
// height="+pants[i].fParamPants->fHeight); // height="+pants[i].fParamPants->fHeight);
// ErrorLog("Model OK: "+asModel+", // ErrorLog("Model OK: "+asModel+",
@@ -4282,7 +4286,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
if (pants[i].fParamPants->vPos.y == 0.0) if (pants[i].fParamPants->vPos.y == 0.0)
{ // jeśli pierwsze ramię nie ustawiło tej wartości, próbować drugim { // jeśli pierwsze ramię nie ustawiło tej wartości, próbować drugim
//!!!! docelowo zrobić niezależną animację ramion z każdej //!!!! docelowo zrobić niezależną animację ramion z każdej
//strony // strony
m = float4x4( m = float4x4(
*sm->GetMatrix()); // skopiowanie, bo będziemy mnożyć *sm->GetMatrix()); // skopiowanie, bo będziemy mnożyć
m(3)[1] = m(3)[1] =
@@ -4345,7 +4349,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
double pant1x = Parser->GetNextSymbol().ToDouble(); double pant1x = Parser->GetNextSymbol().ToDouble();
double pant2x = Parser->GetNextSymbol().ToDouble(); double pant2x = Parser->GetNextSymbol().ToDouble();
double pant1h = Parser->GetNextSymbol().ToDouble(); // wysokość pierwszego double pant1h = Parser->GetNextSymbol().ToDouble(); // wysokość pierwszego
// ślizgu // ślizgu
double pant2h = Parser->GetNextSymbol().ToDouble(); // wysokość drugiego ślizgu double pant2h = Parser->GetNextSymbol().ToDouble(); // wysokość drugiego ślizgu
if (pant1h > 0.5) if (pant1h > 0.5)
pant1h = pant2h; // tu może być zbyt duża wartość pant1h = pant2h; // tu może być zbyt duża wartość
@@ -4484,8 +4488,8 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
if (pAnimations[i + j].smAnimated) if (pAnimations[i + j].smAnimated)
{ //++iAnimatedDoors; { //++iAnimatedDoors;
pAnimations[i + j].smAnimated->WillBeAnimated(); // wyłączenie pAnimations[i + j].smAnimated->WillBeAnimated(); // wyłączenie
// optymalizacji // optymalizacji
// transformu // transformu
switch (MoverParameters->DoorOpenMethod) switch (MoverParameters->DoorOpenMethod)
{ // od razu zapinamy potrzebny typ animacji { // od razu zapinamy potrzebny typ animacji
case 1: case 1:
@@ -4557,7 +4561,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
((MoverParameters->EngineType == ElectricSeriesMotor) || ((MoverParameters->EngineType == ElectricSeriesMotor) ||
(MoverParameters->EngineType == (MoverParameters->EngineType ==
ElectricInductionMotor)))) // plik z dzwiekiem wentylatora, mnozniki i ElectricInductionMotor)))) // plik z dzwiekiem wentylatora, mnozniki i
// ofsety amp. i czest. // ofsety amp. i czest.
{ {
str = Parser->GetNextSymbol(); str = Parser->GetNextSymbol();
rsWentylator.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), rsWentylator.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(),
@@ -4630,7 +4634,7 @@ void TDynamicObject::LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName,
rsDerailment.FA = 0.0; rsDerailment.FA = 0.0;
} }
else if (str == AnsiString("dieselinc:")) // dzwiek przy wlazeniu na obroty else if (str == AnsiString("dieselinc:")) // dzwiek przy wlazeniu na obroty
// woodwarda // woodwarda
{ {
str = Parser->GetNextSymbol(); str = Parser->GetNextSymbol();
rsDiesielInc.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(), rsDiesielInc.Init(str.c_str(), Parser->GetNextSymbol().ToDouble(),
@@ -4769,7 +4773,7 @@ void TDynamicObject::RadioStop()
{ // zatrzymanie pojazdu { // zatrzymanie pojazdu
if (Mechanik) // o ile ktoś go prowadzi if (Mechanik) // o ile ktoś go prowadzi
if (MoverParameters->SecuritySystem.RadioStop) // jeśli pojazd ma RadioStop i jest on if (MoverParameters->SecuritySystem.RadioStop) // jeśli pojazd ma RadioStop i jest on
// aktywny // aktywny
Mechanik->PutCommand("Emergency_brake", 1.0, 1.0, &vPosition, stopRadio); Mechanik->PutCommand("Emergency_brake", 1.0, 1.0, &vPosition, stopRadio);
}; };
@@ -4828,7 +4832,7 @@ int TDynamicObject::DirectionSet(int d)
ABuScanObjects(-1, 300); ABuScanObjects(-1, 300);
} }
return 1 - (iDirection ? NextConnectedNo : PrevConnectedNo); // informacja o położeniu return 1 - (iDirection ? NextConnectedNo : PrevConnectedNo); // informacja o położeniu
// następnego // następnego
}; };
TDynamicObject *__fastcall TDynamicObject::PrevAny() TDynamicObject *__fastcall TDynamicObject::PrevAny()
@@ -4865,7 +4869,7 @@ double TDynamicObject::NextDistance(double d)
TDynamicObject *__fastcall TDynamicObject::Neightbour(int &dir) TDynamicObject *__fastcall TDynamicObject::Neightbour(int &dir)
{ // ustalenie następnego (1) albo poprzedniego (0) w składzie bez względu na prawidłowość { // ustalenie następnego (1) albo poprzedniego (0) w składzie bez względu na prawidłowość
// iDirection // iDirection
int d = dir; // zapamiętanie kierunku int d = dir; // zapamiętanie kierunku
dir = 1 - (dir ? NextConnectedNo : PrevConnectedNo); // nowa wartość dir = 1 - (dir ? NextConnectedNo : PrevConnectedNo); // nowa wartość
return (d ? (MoverParameters->Couplers[1].CouplingFlag ? NextConnected : NULL) : return (d ? (MoverParameters->Couplers[1].CouplingFlag ? NextConnected : NULL) :
@@ -4891,14 +4895,14 @@ void TDynamicObject::CoupleDist()
if (MoverParameters->Couplers[0].CouplingFlag == 0) // jeśli wirtualny if (MoverParameters->Couplers[0].CouplingFlag == 0) // jeśli wirtualny
if (MoverParameters->Couplers[0].CoupleDist < 300.0) // i mniej niż 300m if (MoverParameters->Couplers[0].CoupleDist < 300.0) // i mniej niż 300m
{ // przez MoverParameters->Couplers[0].Connected nie da się dostać do DynObj, stąd { // przez MoverParameters->Couplers[0].Connected nie da się dostać do DynObj, stąd
// prowizorka // prowizorka
// WriteLog("Collision of // WriteLog("Collision of
// "+AnsiString(MoverParameters->Couplers[0].CoupleDist)+"m detected by // "+AnsiString(MoverParameters->Couplers[0].CoupleDist)+"m detected by
// "+asName+":0."); // "+asName+":0.");
w = 0.5 * (MoverParameters->Couplers[0].Connected->Dim.W + w = 0.5 * (MoverParameters->Couplers[0].Connected->Dim.W +
MoverParameters->Dim.W); // minimalna odległość minięcia MoverParameters->Dim.W); // minimalna odległość minięcia
d = -DotProduct(vLeft, vCoulpler[0]); // odległość prostej ruchu od początku d = -DotProduct(vLeft, vCoulpler[0]); // odległość prostej ruchu od początku
// układu współrzędnych // układu współrzędnych
d = fabs( d = fabs(
DotProduct(vLeft, DotProduct(vLeft,
((TMoverParameters *)(MoverParameters->Couplers[0].Connected)) ((TMoverParameters *)(MoverParameters->Couplers[0].Connected))
@@ -4919,7 +4923,7 @@ void TDynamicObject::CoupleDist()
w = 0.5 * (MoverParameters->Couplers[1].Connected->Dim.W + w = 0.5 * (MoverParameters->Couplers[1].Connected->Dim.W +
MoverParameters->Dim.W); // minimalna odległość minięcia MoverParameters->Dim.W); // minimalna odległość minięcia
d = -DotProduct(vLeft, vCoulpler[1]); // odległość prostej ruchu od początku d = -DotProduct(vLeft, vCoulpler[1]); // odległość prostej ruchu od początku
// układu współrzędnych // układu współrzędnych
d = fabs( d = fabs(
DotProduct(vLeft, DotProduct(vLeft,
((TMoverParameters *)(MoverParameters->Couplers[1].Connected)) ((TMoverParameters *)(MoverParameters->Couplers[1].Connected))
@@ -4935,7 +4939,7 @@ void TDynamicObject::CoupleDist()
TDynamicObject *__fastcall TDynamicObject::ControlledFind() TDynamicObject *__fastcall TDynamicObject::ControlledFind()
{ // taka proteza: chcę podłączyć kabinę EN57 bezpośrednio z silnikowym, aby nie robić tego przez { // taka proteza: chcę podłączyć kabinę EN57 bezpośrednio z silnikowym, aby nie robić tego przez
// ukrotnienie // ukrotnienie
// drugi silnikowy i tak musi być ukrotniony, podobnie jak kolejna jednostka // drugi silnikowy i tak musi być ukrotniony, podobnie jak kolejna jednostka
// lepiej by było przesyłać komendy sterowania, co jednak wymaga przebudowy transmisji komend // lepiej by było przesyłać komendy sterowania, co jednak wymaga przebudowy transmisji komend
// (LD) // (LD)

View File

@@ -102,13 +102,13 @@ class TAnimPant
class TAnim class TAnim
{ // klasa animowanej części pojazdu (koła, drzwi, pantografy, burty, napęd parowozu, siłowniki { // klasa animowanej części pojazdu (koła, drzwi, pantografy, burty, napęd parowozu, siłowniki
// itd.) // itd.)
public: public:
union union
{ {
TSubModel *smAnimated; // animowany submodel (jeśli tylko jeden, np. oś) TSubModel *smAnimated; // animowany submodel (jeśli tylko jeden, np. oś)
TSubModel **smElement; // jeśli animowanych elementów jest więcej (pantograf, napęd TSubModel **smElement; // jeśli animowanych elementów jest więcej (pantograf, napęd
// parowozu) // parowozu)
int iShift; // przesunięcie przed przydzieleniem wskaźnika int iShift; // przesunięcie przed przydzieleniem wskaźnika
}; };
union union
@@ -153,7 +153,7 @@ class TDynamicObject
TTrackFollower Axle0; // oś z przodu (od sprzęgu 0) TTrackFollower Axle0; // oś z przodu (od sprzęgu 0)
TTrackFollower Axle1; // oś z tyłu (od sprzęgu 1) TTrackFollower Axle1; // oś z tyłu (od sprzęgu 1)
int iAxleFirst; // numer pierwszej osi w kierunku ruchu (oś wiążąca pojazd z torem i wyzwalająca int iAxleFirst; // numer pierwszej osi w kierunku ruchu (oś wiążąca pojazd z torem i wyzwalająca
// eventy) // eventy)
float fAxleDist; // rozstaw wózków albo osi do liczenia proporcji zacienienia float fAxleDist; // rozstaw wózków albo osi do liczenia proporcji zacienienia
vector3 modelRot; // obrot pudła względem świata - do przeanalizowania, czy potrzebne!!! vector3 modelRot; // obrot pudła względem świata - do przeanalizowania, czy potrzebne!!!
// bool bCameraNear; //blisko kamer są potrzebne dodatkowe obliczenia szczegółów // bool bCameraNear; //blisko kamer są potrzebne dodatkowe obliczenia szczegółów
@@ -189,7 +189,7 @@ class TDynamicObject
TSubModel ** TSubModel **
pAnimated; // lista animowanych submodeli (może być ich więcej niż obiektów animujących) pAnimated; // lista animowanych submodeli (może być ich więcej niż obiektów animujących)
double dWheelAngle[3]; // kąty obrotu kół: 0=przednie toczne, 1=napędzające i wiązary, 2=tylne double dWheelAngle[3]; // kąty obrotu kół: 0=przednie toczne, 1=napędzające i wiązary, 2=tylne
// toczne // toczne
void void
UpdateNone(TAnim *pAnim){}; // animacja pusta (funkcje ustawiania submodeli, gdy blisko kamery) UpdateNone(TAnim *pAnim){}; // animacja pusta (funkcje ustawiania submodeli, gdy blisko kamery)
void UpdateAxle(TAnim *pAnim); // animacja osi void UpdateAxle(TAnim *pAnim); // animacja osi
@@ -332,20 +332,32 @@ class TDynamicObject
public: public:
int *iLights; // wskaźnik na bity zapalonych świateł (własne albo innego członu) int *iLights; // wskaźnik na bity zapalonych świateł (własne albo innego członu)
double fTrackBlock; // odległość do przeszkody do dalszego ruchu (wykrywanie kolizji z innym double fTrackBlock; // odległość do przeszkody do dalszego ruchu (wykrywanie kolizji z innym
// pojazdem) // pojazdem)
TDynamicObject *__fastcall PrevAny(); TDynamicObject *__fastcall PrevAny();
TDynamicObject *__fastcall Prev(); TDynamicObject *__fastcall Prev();
TDynamicObject *__fastcall Next(); TDynamicObject *__fastcall Next();
TDynamicObject *__fastcall NextC(int C); TDynamicObject *__fastcall NextC(int C);
double NextDistance(double d = -1.0); double NextDistance(double d = -1.0);
void SetdMoveLen(double dMoveLen) { MoverParameters->dMoveLen = dMoveLen; } void SetdMoveLen(double dMoveLen)
void ResetdMoveLen() { MoverParameters->dMoveLen = 0; } {
double GetdMoveLen() { return MoverParameters->dMoveLen; } MoverParameters->dMoveLen = dMoveLen;
}
void ResetdMoveLen()
{
MoverParameters->dMoveLen = 0;
}
double GetdMoveLen()
{
return MoverParameters->dMoveLen;
}
int GetPneumatic(bool front, bool red); int GetPneumatic(bool front, bool red);
void SetPneumatic(bool front, bool red); void SetPneumatic(bool front, bool red);
AnsiString asName; AnsiString asName;
AnsiString GetName() { return this ? asName : AnsiString(""); }; AnsiString GetName()
{
return this ? asName : AnsiString("");
};
TRealSound rsDiesielInc; // youBy TRealSound rsDiesielInc; // youBy
TRealSound rscurve; // youBy TRealSound rscurve; // youBy
@@ -375,10 +387,10 @@ class TDynamicObject
int iAlpha; // maska przezroczystości tekstur int iAlpha; // maska przezroczystości tekstur
int iMultiTex; //<0 tekstury wskazane wpisem, >0 tekstury z przecinkami, =0 jedna int iMultiTex; //<0 tekstury wskazane wpisem, >0 tekstury z przecinkami, =0 jedna
int iOverheadMask; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały int iOverheadMask; // maska przydzielana przez AI pojazdom posiadającym pantograf, aby wymuszały
// jazdę bezprądową // jazdę bezprądową
TTractionParam tmpTraction; TTractionParam tmpTraction;
double fAdjustment; // korekcja - docelowo przenieść do TrkFoll.cpp wraz z odległością od double fAdjustment; // korekcja - docelowo przenieść do TrkFoll.cpp wraz z odległością od
// poprzedniego // poprzedniego
TDynamicObject(); TDynamicObject();
~TDynamicObject(); ~TDynamicObject();
double TDynamicObject::Init( // zwraca długość pojazdu albo 0, jeśli błąd double TDynamicObject::Init( // zwraca długość pojazdu albo 0, jeśli błąd
@@ -395,7 +407,10 @@ class TDynamicObject
void Render(); void Render();
void RenderAlpha(); void RenderAlpha();
void RenderSounds(); void RenderSounds();
inline vector3 GetPosition() { return vPosition; }; inline vector3 GetPosition()
{
return vPosition;
};
inline vector3 HeadPosition() inline vector3 HeadPosition()
{ {
return vCoulpler[iDirection ^ 1]; return vCoulpler[iDirection ^ 1];
@@ -408,13 +423,34 @@ class TDynamicObject
{ {
return iAxleFirst ? Axle1.pPosition : Axle0.pPosition; return iAxleFirst ? Axle1.pPosition : Axle0.pPosition;
}; };
inline vector3 VectorFront() { return vFront; }; inline vector3 VectorFront()
inline vector3 VectorUp() { return vUp; }; {
inline vector3 VectorLeft() { return vLeft; }; return vFront;
inline double *__fastcall Matrix() { return mMatrix.getArray(); }; };
inline double GetVelocity() { return MoverParameters->Vel; }; inline vector3 VectorUp()
inline double GetLength() { return MoverParameters->Dim.L; }; {
inline double GetWidth() { return MoverParameters->Dim.W; }; return vUp;
};
inline vector3 VectorLeft()
{
return vLeft;
};
inline double *__fastcall Matrix()
{
return mMatrix.getArray();
};
inline double GetVelocity()
{
return MoverParameters->Vel;
};
inline double GetLength()
{
return MoverParameters->Dim.L;
};
inline double GetWidth()
{
return MoverParameters->Dim.W;
};
inline TTrack *__fastcall GetTrack() inline TTrack *__fastcall GetTrack()
{ {
return (iAxleFirst ? Axle1.GetTrack() : Axle0.GetTrack()); return (iAxleFirst ? Axle1.GetTrack() : Axle0.GetTrack());
@@ -422,8 +458,7 @@ class TDynamicObject
// void UpdatePos(); // void UpdatePos();
// McZapkie-260202 // McZapkie-260202
void LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, void LoadMMediaFile(AnsiString BaseDir, AnsiString TypeName, AnsiString ReplacableSkin);
AnsiString ReplacableSkin);
inline double ABuGetDirection() // ABu. inline double ABuGetDirection() // ABu.
{ {
@@ -463,7 +498,7 @@ class TDynamicObject
TDynamicObject *__fastcall ControlledFind(); TDynamicObject *__fastcall ControlledFind();
void ParamSet(int what, int into); void ParamSet(int what, int into);
int RouteWish(TTrack *tr); // zapytanie do AI, po którym segmencie skrzyżowania int RouteWish(TTrack *tr); // zapytanie do AI, po którym segmencie skrzyżowania
// jechać // jechać
void DestinationSet(AnsiString to); void DestinationSet(AnsiString to);
AnsiString TextureTest(AnsiString &name); AnsiString TextureTest(AnsiString &name);
void OverheadTrack(float o); void OverheadTrack(float o);

129
EU07.cpp
View File

@@ -83,7 +83,7 @@ USEUNIT("Console\LPT.cpp");
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#include "World.h" #include "World.h"
HDC hDC = NULL; // Private GDI Device Context HDC hDC = NULL; // Private GDI Device Context
HGLRC hRC = NULL; // Permanent Rendering Context HGLRC hRC = NULL; // Permanent Rendering Context
HWND hWnd = NULL; // Holds Our Window Handle HWND hWnd = NULL; // Holds Our Window Handle
@@ -122,15 +122,15 @@ GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // resize and initialize the
{ {
WindowWidth = width; WindowWidth = width;
WindowHeight = height; WindowHeight = height;
if (height == 0) // prevent a divide by zero by if (height == 0) // prevent a divide by zero by
height = 1; // making height equal one height = 1; // making height equal one
glViewport(0, 0, width, height); // Reset The Current Viewport glViewport(0, 0, width, height); // Reset The Current Viewport
glMatrixMode(GL_PROJECTION); // select the Projection Matrix glMatrixMode(GL_PROJECTION); // select the Projection Matrix
glLoadIdentity(); // reset the Projection Matrix glLoadIdentity(); // reset the Projection Matrix
// calculate the aspect ratio of the window // calculate the aspect ratio of the window
gluPerspective(45.0f, (GLdouble)width / (GLdouble)height, 0.2f, 2500.0f); gluPerspective(45.0f, (GLdouble)width / (GLdouble)height, 0.2f, 2500.0f);
glMatrixMode(GL_MODELVIEW); // select the Modelview Matrix glMatrixMode(GL_MODELVIEW); // select the Modelview Matrix
glLoadIdentity(); // reset the Modelview Matrix glLoadIdentity(); // reset the Modelview Matrix
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@@ -172,7 +172,7 @@ GLvoid KillGLWindow(GLvoid) // properly kill the window
if (fullscreen) // Are We In Fullscreen Mode? if (fullscreen) // Are We In Fullscreen Mode?
{ {
ChangeDisplaySettings(NULL, 0); // if so switch back to the desktop ChangeDisplaySettings(NULL, 0); // if so switch back to the desktop
ShowCursor(TRUE); // show mouse pointer ShowCursor(TRUE); // show mouse pointer
} }
// KillFont(); // KillFont();
} }
@@ -186,31 +186,31 @@ GLvoid KillGLWindow(GLvoid) // properly kill the window
BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscreenflag) BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscreenflag)
{ {
GLuint PixelFormat; // holds the results after searching for a match GLuint PixelFormat; // holds the results after searching for a match
HINSTANCE hInstance; // holds the instance of the application HINSTANCE hInstance; // holds the instance of the application
WNDCLASS wc; // windows class structure WNDCLASS wc; // windows class structure
DWORD dwExStyle; // window extended style DWORD dwExStyle; // window extended style
DWORD dwStyle; // window style DWORD dwStyle; // window style
RECT WindowRect; // grabs rectangle upper left / lower right values RECT WindowRect; // grabs rectangle upper left / lower right values
WindowRect.left = (long)0; // set left value to 0 WindowRect.left = (long)0; // set left value to 0
WindowRect.right = (long)width; // set right value to requested width WindowRect.right = (long)width; // set right value to requested width
WindowRect.top = (long)0; // set top value to 0 WindowRect.top = (long)0; // set top value to 0
WindowRect.bottom = (long)height; // set bottom value to requested height WindowRect.bottom = (long)height; // set bottom value to requested height
fullscreen = fullscreenflag; // set the global fullscreen flag fullscreen = fullscreenflag; // set the global fullscreen flag
hInstance = GetModuleHandle(NULL); // grab an instance for our window hInstance = GetModuleHandle(NULL); // grab an instance for our window
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // redraw on size, and own DC for window. wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // redraw on size, and own DC for window.
wc.lpfnWndProc = (WNDPROC)WndProc; // wndproc handles messages wc.lpfnWndProc = (WNDPROC)WndProc; // wndproc handles messages
wc.cbClsExtra = 0; // no extra window data wc.cbClsExtra = 0; // no extra window data
wc.cbWndExtra = 0; // no extra window data wc.cbWndExtra = 0; // no extra window data
wc.hInstance = hInstance; // set the instance wc.hInstance = hInstance; // set the instance
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // load the default icon wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // load the default icon
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // load the arrow pointer wc.hCursor = LoadCursor(NULL, IDC_ARROW); // load the arrow pointer
wc.hbrBackground = NULL; // no background required for GL wc.hbrBackground = NULL; // no background required for GL
wc.lpszMenuName = NULL; // we don't want a menu wc.lpszMenuName = NULL; // we don't want a menu
wc.lpszClassName = "EU07"; // nazwa okna do komunikacji zdalnej wc.lpszClassName = "EU07"; // nazwa okna do komunikacji zdalnej
// // Set The Class Name // // Set The Class Name
if (!arbMultisampleSupported) // tylko dla pierwszego okna if (!arbMultisampleSupported) // tylko dla pierwszego okna
if (!RegisterClass(&wc)) // Attempt To Register The Window Class if (!RegisterClass(&wc)) // Attempt To Register The Window Class
@@ -223,9 +223,9 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree
if (fullscreen) // Attempt Fullscreen Mode? if (fullscreen) // Attempt Fullscreen Mode?
{ {
DEVMODE dmScreenSettings; // device mode DEVMODE dmScreenSettings; // device mode
memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); // makes sure memory's cleared memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); // makes sure memory's cleared
dmScreenSettings.dmSize = sizeof(dmScreenSettings); // size of the devmode structure dmScreenSettings.dmSize = sizeof(dmScreenSettings); // size of the devmode structure
// tolaris-240403: poprawka na odswiezanie monitora // tolaris-240403: poprawka na odswiezanie monitora
// locate primary monitor... // locate primary monitor...
@@ -254,9 +254,9 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree
dmScreenSettings.dmDisplayFrequency = refreshrate; dmScreenSettings.dmDisplayFrequency = refreshrate;
dmScreenSettings.dmFields = DM_DISPLAYFREQUENCY; dmScreenSettings.dmFields = DM_DISPLAYFREQUENCY;
} }
dmScreenSettings.dmPelsWidth = width; // selected screen width dmScreenSettings.dmPelsWidth = width; // selected screen width
dmScreenSettings.dmPelsHeight = height; // selected screen height dmScreenSettings.dmPelsHeight = height; // selected screen height
dmScreenSettings.dmBitsPerPel = bits; // selected bits per pixel dmScreenSettings.dmBitsPerPel = bits; // selected bits per pixel
dmScreenSettings.dmFields = dmScreenSettings.dmFields =
dmScreenSettings.dmFields | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; dmScreenSettings.dmFields | DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
@@ -282,13 +282,13 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree
if (fullscreen) // Are We Still In Fullscreen Mode? if (fullscreen) // Are We Still In Fullscreen Mode?
{ {
dwExStyle = WS_EX_APPWINDOW; // Window Extended Style dwExStyle = WS_EX_APPWINDOW; // Window Extended Style
dwStyle = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // Windows Style dwStyle = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // Windows Style
ShowCursor(FALSE); // Hide Mouse Pointer ShowCursor(FALSE); // Hide Mouse Pointer
} }
else else
{ {
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style
dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // Windows Style dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // Windows Style
} }
@@ -297,19 +297,19 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree
// Create The Window // Create The Window
if (NULL == if (NULL ==
(hWnd = CreateWindowEx(dwExStyle, // Extended Style For The Window (hWnd = CreateWindowEx(dwExStyle, // Extended Style For The Window
"EU07", // Class Name "EU07", // Class Name
title, // Window Title title, // Window Title
dwStyle | // Defined Window Style dwStyle | // Defined Window Style
WS_CLIPSIBLINGS | // Required Window Style WS_CLIPSIBLINGS | // Required Window Style
WS_CLIPCHILDREN, // Required Window Style WS_CLIPCHILDREN, // Required Window Style
0, 0,
0, // Window Position 0, // Window Position
WindowRect.right - WindowRect.left, // Calculate Window Width WindowRect.right - WindowRect.left, // Calculate Window Width
WindowRect.bottom - WindowRect.top, // Calculate Window Height WindowRect.bottom - WindowRect.top, // Calculate Window Height
NULL, // No Parent Window NULL, // No Parent Window
NULL, // No Menu NULL, // No Menu
hInstance, // Instance hInstance, // Instance
NULL))) // Dont Pass Anything To WM_CREATE NULL))) // Dont Pass Anything To WM_CREATE
{ {
KillGLWindow(); // Reset The Display KillGLWindow(); // Reset The Display
@@ -321,24 +321,24 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree
static PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be static PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be
{ {
sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1, // Version Number 1, // Version Number
PFD_DRAW_TO_WINDOW | // Format Must Support Window PFD_DRAW_TO_WINDOW | // Format Must Support Window
PFD_SUPPORT_OPENGL | // Format Must Support OpenGL PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
PFD_DOUBLEBUFFER, // Must Support Double Buffering PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format PFD_TYPE_RGBA, // Request An RGBA Format
bits, // Select Our Color Depth bits, // Select Our Color Depth
0, 0,
0, 0, 0, 0, 0, // Color Bits Ignored 0, 0, 0, 0, 0, // Color Bits Ignored
0, // No Alpha Buffer 0, // No Alpha Buffer
0, // Shift Bit Ignored 0, // Shift Bit Ignored
0, // No Accumulation Buffer 0, // No Accumulation Buffer
0, 0, 0, 0, // Accumulation Bits Ignored 0, 0, 0, 0, // Accumulation Bits Ignored
24, // 32Bit Z-Buffer (Depth Buffer) 24, // 32Bit Z-Buffer (Depth Buffer)
0, // No Stencil Buffer 0, // No Stencil Buffer
0, // No Auxiliary Buffer 0, // No Auxiliary Buffer
PFD_MAIN_PLANE, // Main Drawing Layer PFD_MAIN_PLANE, // Main Drawing Layer
0, // Reserved 0, // Reserved
0, 0, 0 // Layer Masks Ignored 0, 0, 0 // Layer Masks Ignored
}; };
if (NULL == (hDC = GetDC(hWnd))) // Did We Get A Device Context? if (NULL == (hDC = GetDC(hWnd))) // Did We Get A Device Context?
@@ -413,9 +413,9 @@ BOOL CreateGLWindow(char *title, int width, int height, int bits, bool fullscree
return CreateGLWindow(title, width, height, bits, fullscreenflag); // rekurencja return CreateGLWindow(title, width, height, bits, fullscreenflag); // rekurencja
} }
ShowWindow(hWnd, SW_SHOW); // show the window ShowWindow(hWnd, SW_SHOW); // show the window
SetForegroundWindow(hWnd); // slightly higher priority SetForegroundWindow(hWnd); // slightly higher priority
SetFocus(hWnd); // sets keyboard focus to the window SetFocus(hWnd); // sets keyboard focus to the window
ReSizeGLScene(width, height); // set up our perspective GL screen ReSizeGLScene(width, height); // set up our perspective GL screen
if (!InitGL()) // initialize our newly created GL Window if (!InitGL()) // initialize our newly created GL Window
@@ -579,7 +579,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, // handle for this window
} }
case WM_MOVE: // przesuwanie okna? case WM_MOVE: // przesuwanie okna?
{ {
mx = WindowWidth / 2 + LOWORD(lParam); // horizontal position mx = WindowWidth / 2 + LOWORD(lParam); // horizontal position
my = WindowHeight / 2 + HIWORD(lParam); // vertical position my = WindowHeight / 2 + HIWORD(lParam); // vertical position
// SetCursorPos(mx,my); // SetCursorPos(mx,my);
break; break;
@@ -739,7 +739,7 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
// DrawGLScene() // DrawGLScene()
// if (!pause) // if (!pause)
// if (Global::bInactivePause?Global::bActive:true) //tak nie, bo spada z góry // if (Global::bInactivePause?Global::bActive:true) //tak nie, bo spada z góry
if (World.Update()) // Was There A Quit Received? if (World.Update()) // Was There A Quit Received?
SwapBuffers(hDC); // Swap Buffers (Double Buffering) SwapBuffers(hDC); // Swap Buffers (Double Buffering)
else else
done = true; //[F10] or DrawGLScene signalled a quit done = true; //[F10] or DrawGLScene signalled a quit
@@ -754,6 +754,3 @@ int WINAPI WinMain(HINSTANCE hInstance, // instance
KillGLWindow(); // kill the window KillGLWindow(); // kill the window
return (msg.wParam); // exit the program return (msg.wParam); // exit the program
} }

View File

@@ -43,9 +43,14 @@ TEventLauncher::TEventLauncher()
iCheckMask = 0; iCheckMask = 0;
} }
TEventLauncher::~TEventLauncher() { SafeDeleteArray(szText); } TEventLauncher::~TEventLauncher()
{
SafeDeleteArray(szText);
}
void TEventLauncher::Init() {} void TEventLauncher::Init()
{
}
bool TEventLauncher::Load(cParser *parser) bool TEventLauncher::Load(cParser *parser)
{ // wczytanie wyzwalacza zdarzeñ { // wczytanie wyzwalacza zdarzeñ

View File

@@ -31,7 +31,7 @@ TEvent::TEvent(AnsiString m)
// asName=""; //czy nazwa eventu jest niezbêdna w tym przypadku? chyba nie // asName=""; //czy nazwa eventu jest niezbêdna w tym przypadku? chyba nie
evNext = evNext2 = NULL; evNext = evNext2 = NULL;
bEnabled = false; // false dla eventów u¿ywanych do skanowania sygna³ów (nie dodawane do bEnabled = false; // false dla eventów u¿ywanych do skanowania sygna³ów (nie dodawane do
// kolejki) // kolejki)
asNodeName = m; // nazwa obiektu powi¹zanego asNodeName = m; // nazwa obiektu powi¹zanego
iQueued = 0; // nie zosta³ dodany do kolejki iQueued = 0; // nie zosta³ dodany do kolejki
// bIsHistory=false; // bIsHistory=false;
@@ -91,7 +91,7 @@ void TEvent::Conditions(cParser *parser, AnsiString s)
if (!asNodeName.IsEmpty()) if (!asNodeName.IsEmpty())
{ // podczepienie ³añcucha, jeœli nie jest pusty { // podczepienie ³añcucha, jeœli nie jest pusty
Params[9].asText = new char[asNodeName.Length() + 1]; // usuwane i zamieniane na Params[9].asText = new char[asNodeName.Length() + 1]; // usuwane i zamieniane na
// wskaŸnik // wskaŸnik
strcpy(Params[9].asText, asNodeName.c_str()); strcpy(Params[9].asText, asNodeName.c_str());
} }
parser->getTokens(); parser->getTokens();
@@ -313,7 +313,7 @@ void TEvent::Load(cParser *parser, vector3 *org)
case tp_PutValues: case tp_PutValues:
parser->getTokens(3); parser->getTokens(3);
*parser >> Params[3].asdouble >> Params[4].asdouble >> Params[5].asdouble; // po³o¿enie *parser >> Params[3].asdouble >> Params[4].asdouble >> Params[5].asdouble; // po³o¿enie
// X,Y,Z // X,Y,Z
if (org) if (org)
{ // przesuniêcie { // przesuniêcie
// tmp->pCenter.RotateY(aRotate.y/180.0*M_PI); //Ra 2014-11: uwzglêdnienie rotacji // tmp->pCenter.RotateY(aRotate.y/180.0*M_PI); //Ra 2014-11: uwzglêdnienie rotacji
@@ -330,7 +330,7 @@ void TEvent::Load(cParser *parser, vector3 *org)
if (str.Pos("#")) if (str.Pos("#"))
str = str.SubString(1, str.Pos("#") - 1); // obciêcie unikatowoœci str = str.SubString(1, str.Pos("#") - 1); // obciêcie unikatowoœci
bEnabled = false; // nie do kolejki (dla SetVelocity te¿, ale jak jest do toru bEnabled = false; // nie do kolejki (dla SetVelocity te¿, ale jak jest do toru
// dowi¹zany) // dowi¹zany)
Params[6].asCommand = cm_PassengerStopPoint; Params[6].asCommand = cm_PassengerStopPoint;
} }
else if (str == "SetVelocity") else if (str == "SetVelocity")

View File

@@ -27,9 +27,14 @@ TFadeSound::TFadeSound()
fTime = 0; fTime = 0;
} }
TFadeSound::~TFadeSound() { Free(); } TFadeSound::~TFadeSound()
{
Free();
}
void TFadeSound::Free() {} void TFadeSound::Free()
{
}
void TFadeSound::Init(char *Name, float fNewFade) void TFadeSound::Init(char *Name, float fNewFade)
{ {
@@ -47,7 +52,10 @@ void TFadeSound::TurnOn()
fTime = fFade; fTime = fFade;
} }
void TFadeSound::TurnOff() { State = ss_ShuttingDown; } void TFadeSound::TurnOff()
{
State = ss_ShuttingDown;
}
void TFadeSound::Update() void TFadeSound::Update()
{ {

View File

@@ -26,7 +26,10 @@ class TFadeSound
void Init(char *Name, float fNewFade); void Init(char *Name, float fNewFade);
void TurnOn(); void TurnOn();
void TurnOff(); void TurnOff();
bool Playing() { return (State == ss_Commencing || State == ss_Starting); }; bool Playing()
{
return (State == ss_Commencing || State == ss_Starting);
};
void Free(); void Free();
void Update(); void Update();
void Volume(long vol); void Volume(long vol);

View File

@@ -37,7 +37,10 @@ inline float3 &operator+=(float3 &v1, const float3 &v2)
v1.z += v2.z; v1.z += v2.z;
return v1; 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) 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);
@@ -46,8 +49,14 @@ 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);
}; };
double inline float3::Length() const { return sqrt(x * x + y * y + z * z); }; double inline float3::Length() const
inline float3 operator/(const float3 &v, double k) { return float3(v.x / k, v.y / k, v.z / k); }; {
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) inline float3 SafeNormalize(const float3 &v)
{ // bezpieczna normalizacja (wektor d³ugoœci 1.0) { // bezpieczna normalizacja (wektor d³ugoœci 1.0)
double l = v.Length(); double l = v.Length();
@@ -79,8 +88,14 @@ class float4
z = c; z = c;
w = d; w = d;
}; };
double inline float4::LengthSquared() const { return x * x + y * y + z * z + w * w; }; double inline float4::LengthSquared() const
double inline float4::Length() const { return sqrt(x * x + y * y + z * z + w * w); }; {
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) inline float4 operator*(const float4 &q1, const float4 &q2)
{ // mno¿enie to prawie jak mno¿enie macierzy { // mno¿enie to prawie jak mno¿enie macierzy
@@ -177,15 +192,24 @@ class float4x4
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
e[i] = f[i]; e[i] = f[i];
}; };
float *__fastcall operator()(int i) { return &e[i << 2]; } float *__fastcall operator()(int i)
const float *__fastcall readArray(void) { return e; } {
return &e[i << 2];
}
const float *__fastcall readArray(void)
{
return e;
}
void Identity() void Identity()
{ {
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
e[i] = 0; e[i] = 0;
e[0] = e[5] = e[10] = e[15] = 1.0f; e[0] = e[5] = e[10] = e[15] = 1.0f;
} }
const float *operator[](int i) const { return &e[i << 2]; }; const float *operator[](int i) const
{
return &e[i << 2];
};
void InitialRotate() void InitialRotate()
{ // taka specjalna rotacja, nie ma co ci¹gaæ trygonometrii { // taka specjalna rotacja, nie ma co ci¹gaæ trygonometrii
float f; float f;
@@ -206,7 +230,10 @@ class float4x4
return true; return true;
} }
void Quaternion(float4 *q); void 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) inline float3 operator*(const float4x4 &m, const float3 &v)

View File

@@ -46,8 +46,8 @@ void TGauge::Clear()
fDesiredValue = 0; fDesiredValue = 0;
}; };
void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, void TGauge::Init(TSubModel *NewSubModel, TGaugeType eNewType, double fNewScale, double fNewOffset,
double fNewOffset, double fNewFriction, double fNewValue) double fNewFriction, double fNewValue)
{ // ustawienie parametrów animacji submodelu { // ustawienie parametrów animacji submodelu
if (NewSubModel) if (NewSubModel)
{ // warunek na wszelki wypadek, gdyby siê submodel nie pod³¹czy³ { // warunek na wszelki wypadek, gdyby siê submodel nie pod³¹czy³
@@ -168,7 +168,7 @@ void TGauge::Update()
case gt_Digital: // Ra 2014-07: licznik cyfrowy case gt_Digital: // Ra 2014-07: licznik cyfrowy
sm = SubModel->ChildGet(); sm = SubModel->ChildGet();
AnsiString n = FormatFloat("0000000000", floor(fValue)); // na razie tak trochê bez AnsiString n = FormatFloat("0000000000", floor(fValue)); // na razie tak trochê bez
// sensu // sensu
do do
{ // pêtla po submodelach potomnych i obracanie ich o k¹t zale¿y od cyfry w (fValue) { // pêtla po submodelach potomnych i obracanie ich o k¹t zale¿y od cyfry w (fValue)
if (sm->pName) if (sm->pName)

12
Gauge.h
View File

@@ -22,7 +22,7 @@ typedef enum
gt_Rotate, // obrót gt_Rotate, // obrót
gt_Move, // przesuniêcie równoleg³e gt_Move, // przesuniêcie równoleg³e
gt_Wiper, // obrót trzech kolejnych submodeli o ten sam k¹t (np. wycieraczka, drzwi gt_Wiper, // obrót trzech kolejnych submodeli o ten sam k¹t (np. wycieraczka, drzwi
// harmonijkowe) // harmonijkowe)
gt_Digital // licznik cyfrowy, np. kilometrów gt_Digital // licznik cyfrowy, np. kilometrów
} TGaugeType; } TGaugeType;
@@ -49,15 +49,17 @@ class TGauge // zmienne "gg"
~TGauge(); ~TGauge();
void Clear(); void Clear();
void Init(TSubModel *NewSubModel, TGaugeType eNewTyp, double fNewScale = 1, void Init(TSubModel *NewSubModel, TGaugeType eNewTyp, double fNewScale = 1,
double fNewOffset = 0, double fNewFriction = 0, double fNewValue = 0); double fNewOffset = 0, double fNewFriction = 0, double fNewValue = 0);
bool Load(TQueryParserComp *Parser, TModel3d *md1, TModel3d *md2 = NULL, bool Load(TQueryParserComp *Parser, TModel3d *md1, TModel3d *md2 = NULL, double mul = 1.0);
double mul = 1.0);
void PermIncValue(double fNewDesired); void PermIncValue(double fNewDesired);
void IncValue(double fNewDesired); void IncValue(double fNewDesired);
void DecValue(double fNewDesired); void DecValue(double fNewDesired);
void UpdateValue(double fNewDesired); void UpdateValue(double fNewDesired);
void PutValue(double fNewDesired); void PutValue(double fNewDesired);
float GetValue() { return fValue; }; float GetValue()
{
return fValue;
};
void Update(); void Update();
void Render(); void Render();
void AssignFloat(float *fValue); void AssignFloat(float *fValue);

View File

@@ -19,11 +19,17 @@ http://mozilla.org/MPL/2.0/.
#include "Globals.h" #include "Globals.h"
#include "Geom.h" #include "Geom.h"
__fastcall TGeometry::TGeometry() {} __fastcall TGeometry::TGeometry()
{
}
__fastcall TGeometry::~TGeometry() {} __fastcall TGeometry::~TGeometry()
{
}
bool TGeometry::Init() {} bool TGeometry::Init()
{
}
vector3 TGeometry::Load(TQueryParserComp *Parser) vector3 TGeometry::Load(TQueryParserComp *Parser)
{ {
@@ -113,7 +119,9 @@ vector3 TGeometry::Load(TQueryParserComp *Parser)
tmp->fSquareRadius += r; tmp->fSquareRadius += r;
} }
bool TGeometry::Render() {} bool TGeometry::Render()
{
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#pragma package(smart_init) #pragma package(smart_init)

View File

@@ -263,16 +263,16 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp)
else if (str == AnsiString("wireframe")) else if (str == AnsiString("wireframe"))
bWireFrame = (GetNextSymbol().LowerCase() == AnsiString("yes")); bWireFrame = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str == AnsiString("debugmode")) // McZapkie! - DebugModeFlag uzywana w mover.pas, else if (str == AnsiString("debugmode")) // McZapkie! - DebugModeFlag uzywana w mover.pas,
// warto tez blokowac cheaty gdy false // warto tez blokowac cheaty gdy false
DebugModeFlag = (GetNextSymbol().LowerCase() == AnsiString("yes")); DebugModeFlag = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str == AnsiString("soundenabled")) // McZapkie-040302 - blokada dzwieku - przyda else if (str == AnsiString("soundenabled")) // McZapkie-040302 - blokada dzwieku - przyda
// sie do debugowania oraz na komp. bez karty // sie do debugowania oraz na komp. bez karty
// dzw. // dzw.
bSoundEnabled = (GetNextSymbol().LowerCase() == AnsiString("yes")); bSoundEnabled = (GetNextSymbol().LowerCase() == AnsiString("yes"));
// else if (str==AnsiString("renderalpha")) //McZapkie-1312302 - dwuprzebiegowe renderowanie // else if (str==AnsiString("renderalpha")) //McZapkie-1312302 - dwuprzebiegowe renderowanie
// bRenderAlpha=(GetNextSymbol().LowerCase()==AnsiString("yes")); // bRenderAlpha=(GetNextSymbol().LowerCase()==AnsiString("yes"));
else if (str == AnsiString("physicslog")) // McZapkie-030402 - logowanie parametrow else if (str == AnsiString("physicslog")) // McZapkie-030402 - logowanie parametrow
// fizycznych dla kazdego pojazdu z maszynista // fizycznych dla kazdego pojazdu z maszynista
WriteLogFlag = (GetNextSymbol().LowerCase() == AnsiString("yes")); WriteLogFlag = (GetNextSymbol().LowerCase() == AnsiString("yes"));
else if (str == AnsiString("physicsdeactivation")) // McZapkie-291103 - usypianie fizyki else if (str == AnsiString("physicsdeactivation")) // McZapkie-291103 - usypianie fizyki
PhysicActivationFlag = (GetNextSymbol().LowerCase() == AnsiString("yes")); PhysicActivationFlag = (GetNextSymbol().LowerCase() == AnsiString("yes"));
@@ -310,7 +310,7 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp)
fFriction = GetNextSymbol().ToDouble(); fFriction = GetNextSymbol().ToDouble();
else if (str == AnsiString("livetraction")) else if (str == AnsiString("livetraction"))
{ // Winger 160404 - zaleznosc napiecia loka od trakcji; Ra 2014-03: teraz pr¹d przy braku { // Winger 160404 - zaleznosc napiecia loka od trakcji; Ra 2014-03: teraz pr¹d przy braku
// sieci // sieci
bLiveTraction = (GetNextSymbol().LowerCase() == AnsiString("yes")); bLiveTraction = (GetNextSymbol().LowerCase() == AnsiString("yes"));
} }
else if (str == AnsiString("skyenabled")) else if (str == AnsiString("skyenabled"))
@@ -418,7 +418,7 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp)
else if (str == AnsiString("slowmotion")) // tworzenie plików binarnych else if (str == AnsiString("slowmotion")) // tworzenie plików binarnych
iSlowMotionMask = GetNextSymbol().ToIntDef(-1); // domyœlnie -1 iSlowMotionMask = GetNextSymbol().ToIntDef(-1); // domyœlnie -1
else if (str == AnsiString("modifytga")) // czy korygowaæ pliki TGA dla szybszego else if (str == AnsiString("modifytga")) // czy korygowaæ pliki TGA dla szybszego
// wczytywania // wczytywania
iModifyTGA = GetNextSymbol().ToIntDef(0); // domyœlnie 0 iModifyTGA = GetNextSymbol().ToIntDef(0); // domyœlnie 0
else if (str == AnsiString("hideconsole")) // hunter-271211: ukrywanie konsoli else if (str == AnsiString("hideconsole")) // hunter-271211: ukrywanie konsoli
bHideConsole = (GetNextSymbol().LowerCase() == AnsiString("yes")); bHideConsole = (GetNextSymbol().LowerCase() == AnsiString("yes"));

View File

@@ -19,11 +19,11 @@ http://mozilla.org/MPL/2.0/.
using namespace Math3D; using namespace Math3D;
// definicje klawiszy // definicje klawiszy
const int k_IncMainCtrl = 0; //[Num+] const int k_IncMainCtrl = 0; //[Num+]
const int k_IncMainCtrlFAST = 1; //[Num+] [Shift] const int k_IncMainCtrlFAST = 1; //[Num+] [Shift]
const int k_DecMainCtrl = 2; //[Num-] const int k_DecMainCtrl = 2; //[Num-]
const int k_DecMainCtrlFAST = 3; //[Num-] [Shift] const int k_DecMainCtrlFAST = 3; //[Num-] [Shift]
const int k_IncScndCtrl = 4; //[Num/] const int k_IncScndCtrl = 4; //[Num/]
const int k_IncScndCtrlFAST = 5; const int k_IncScndCtrlFAST = 5;
const int k_DecScndCtrl = 6; const int k_DecScndCtrl = 6;
const int k_DecScndCtrlFAST = 7; const int k_DecScndCtrlFAST = 7;
@@ -151,7 +151,7 @@ class TTranscripts
~TTranscripts(); ~TTranscripts();
void AddLine(char *txt, float show, float hide, bool it); void AddLine(char *txt, float show, float hide, bool it);
void Add(char *txt, float len, void Add(char *txt, float len,
bool backgorund = false); // dodanie tekstów, d³ugoœæ dŸwiêku, czy istotne bool backgorund = false); // dodanie tekstów, d³ugoœæ dŸwiêku, czy istotne
void Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekundê) void Update(); // usuwanie niepotrzebnych (ok. 10 razy na sekundê)
}; };
@@ -206,7 +206,10 @@ class Global
static AnsiString asHumanCtrlVehicle; static AnsiString asHumanCtrlVehicle;
static void LoadIniFile(AnsiString asFileName); static void LoadIniFile(AnsiString asFileName);
static void InitKeys(AnsiString asFileName); static void InitKeys(AnsiString asFileName);
inline static vector3 GetCameraPosition() { return pCameraPosition; }; inline static vector3 GetCameraPosition()
{
return pCameraPosition;
};
static void SetCameraPosition(vector3 pNewCameraPosition); static void SetCameraPosition(vector3 pNewCameraPosition);
static void SetCameraRotation(double Yaw); static void SetCameraRotation(double Yaw);
static int iWriteLogEnabled; // maska bitowa: 1-zapis do pliku, 2-okienko static int iWriteLogEnabled; // maska bitowa: 1-zapis do pliku, 2-okienko

View File

@@ -276,7 +276,7 @@ void TGroundNode::RaRenderVBO()
glColor3ub(Diffuse[0], Diffuse[1], Diffuse[2]); glColor3ub(Diffuse[0], Diffuse[1], Diffuse[2]);
if (TextureID) if (TextureID)
glBindTexture(GL_TEXTURE_2D, TextureID); // Ustaw aktywn¹ teksturê glBindTexture(GL_TEXTURE_2D, TextureID); // Ustaw aktywn¹ teksturê
glDrawArrays(iType, iVboPtr, iNumVerts); // Narysuj naraz wszystkie trójk¹ty glDrawArrays(iType, iVboPtr, iNumVerts); // Narysuj naraz wszystkie trójk¹ty
} }
void TGroundNode::RenderVBO() void TGroundNode::RenderVBO()
@@ -284,7 +284,7 @@ void TGroundNode::RenderVBO()
double mgn = SquareMagnitude(pCenter - Global::pCameraPosition); double mgn = SquareMagnitude(pCenter - Global::pCameraPosition);
if ((mgn > fSquareRadius || (mgn < fSquareMinRadius)) && if ((mgn > fSquareRadius || (mgn < fSquareMinRadius)) &&
(iType != TP_EVLAUNCH)) // McZapkie-070602: nie rysuj odleglych obiektow ale sprawdzaj (iType != TP_EVLAUNCH)) // McZapkie-070602: nie rysuj odleglych obiektow ale sprawdzaj
// wyzwalacz zdarzen // wyzwalacz zdarzen
return; return;
int i, a; int i, a;
switch (iType) switch (iType)
@@ -556,8 +556,8 @@ void TGroundNode::RenderDL()
// if (pTriGroup) if (pTriGroup!=this) return; //wyœwietla go inny obiekt // if (pTriGroup) if (pTriGroup!=this) return; //wyœwietla go inny obiekt
double mgn = SquareMagnitude(pCenter - Global::pCameraPosition); double mgn = SquareMagnitude(pCenter - Global::pCameraPosition);
if ((mgn > fSquareRadius) || (mgn < fSquareMinRadius)) // McZapkie-070602: nie rysuj odleglych if ((mgn > fSquareRadius) || (mgn < fSquareMinRadius)) // McZapkie-070602: nie rysuj odleglych
// obiektow ale sprawdzaj wyzwalacz // obiektow ale sprawdzaj wyzwalacz
// zdarzen // zdarzen
return; return;
int i, a; int i, a;
switch (iType) switch (iType)
@@ -1379,7 +1379,7 @@ TGroundNode *__fastcall TGround::DynamicFind(AnsiString asNameToFind)
void TGround::DynamicList(bool all) void TGround::DynamicList(bool all)
{ // odes³anie nazw pojazdów dostêpnych na scenerii (nazwy, szczególnie wagonów, mog¹ siê { // odes³anie nazw pojazdów dostêpnych na scenerii (nazwy, szczególnie wagonów, mog¹ siê
// powtarzaæ!) // powtarzaæ!)
for (TGroundNode *Current = nRootDynamic; Current; Current = Current->nNext) for (TGroundNode *Current = nRootDynamic; Current; Current = Current->nNext)
if (all || Current->DynamicObject->Mechanik) if (all || Current->DynamicObject->Mechanik)
WyslijString(Current->asName, 6); // same nazwy pojazdów WyslijString(Current->asName, 6); // same nazwy pojazdów
@@ -1626,9 +1626,8 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser)
*parser >> tmp->hvTraction->NominalVoltage >> tmp->hvTraction->MaxCurrent >> *parser >> tmp->hvTraction->NominalVoltage >> tmp->hvTraction->MaxCurrent >>
tmp->hvTraction->fResistivity; tmp->hvTraction->fResistivity;
if (tmp->hvTraction->fResistivity == 0.01) // tyle jest w sceneriach [om/km] if (tmp->hvTraction->fResistivity == 0.01) // tyle jest w sceneriach [om/km]
tmp->hvTraction->fResistivity = tmp->hvTraction->fResistivity = 0.075; // taka sensowniejsza wartoϾ za
0.075; // taka sensowniejsza wartoϾ za // http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf
// http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf
tmp->hvTraction->fResistivity *= 0.001; // teraz [om/m] tmp->hvTraction->fResistivity *= 0.001; // teraz [om/m]
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
@@ -1722,7 +1721,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser)
if (sTracks->Update(TP_MEMCELL, tmp->asName.c_str(), if (sTracks->Update(TP_MEMCELL, tmp->asName.c_str(),
tmp)) // najpierw sprawdziæ, czy ju¿ jest tmp)) // najpierw sprawdziæ, czy ju¿ jest
{ // przy zdublowaniu wskaŸnik zostanie podmieniony w drzewku na póŸniejszy (zgodnoœæ { // przy zdublowaniu wskaŸnik zostanie podmieniony w drzewku na póŸniejszy (zgodnoœæ
// wsteczna) // wsteczna)
ErrorLog("Duplicated memcell: " + tmp->asName); // to zg³aszaæ duplikat ErrorLog("Duplicated memcell: " + tmp->asName); // to zg³aszaæ duplikat
} }
else else
@@ -1749,7 +1748,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser)
if (sTracks->Update(TP_TRACK, tmp->asName.c_str(), if (sTracks->Update(TP_TRACK, tmp->asName.c_str(),
tmp)) // najpierw sprawdziæ, czy ju¿ jest tmp)) // najpierw sprawdziæ, czy ju¿ jest
{ // przy zdublowaniu wskaŸnik zostanie podmieniony w drzewku na póŸniejszy (zgodnoœæ { // przy zdublowaniu wskaŸnik zostanie podmieniony w drzewku na póŸniejszy (zgodnoœæ
// wsteczna) // wsteczna)
if (tmp->pTrack->iCategoryFlag & 1) // jeœli jest zdublowany tor kolejowy if (tmp->pTrack->iCategoryFlag & 1) // jeœli jest zdublowany tor kolejowy
ErrorLog("Duplicated track: " + tmp->asName); // to zg³aszaæ duplikat ErrorLog("Duplicated track: " + tmp->asName); // to zg³aszaæ duplikat
} }
@@ -1802,7 +1801,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser)
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
DriverType = AnsiString(token.c_str()); // McZapkie:010303 - w przyszlosci rozne DriverType = AnsiString(token.c_str()); // McZapkie:010303 - w przyszlosci rozne
// konfiguracje mechanik/pomocnik itp // konfiguracje mechanik/pomocnik itp
tf3 = fTrainSetVel; // prêdkoœæ tf3 = fTrainSetVel; // prêdkoœæ
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
@@ -1827,14 +1826,14 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser)
if (tf1 != -1.0) if (tf1 != -1.0)
if (fabs(tf1) > 0.5) // maksymalna odleg³oœæ miêdzy sprzêgami - do przemyœlenia if (fabs(tf1) > 0.5) // maksymalna odleg³oœæ miêdzy sprzêgami - do przemyœlenia
int1 = 0; // likwidacja sprzêgu, jeœli odleg³oœæ zbyt du¿a - to powinno byæ int1 = 0; // likwidacja sprzêgu, jeœli odleg³oœæ zbyt du¿a - to powinno byæ
// uwzglêdniane w fizyce sprzêgów... // uwzglêdniane w fizyce sprzêgów...
TempConnectionType[iTrainSetWehicleNumber] = int1; // wartoϾ dodatnia TempConnectionType[iTrainSetWehicleNumber] = int1; // wartoϾ dodatnia
} }
else else
{ // pojazd wstawiony luzem { // pojazd wstawiony luzem
fTrainSetDist = 0; // zerowanie dodatkowego przesuniêcia fTrainSetDist = 0; // zerowanie dodatkowego przesuniêcia
asTrainName = ""; // puste oznacza jazdê pojedynczego bez rozk³adu, "none" jest dla asTrainName = ""; // puste oznacza jazdê pojedynczego bez rozk³adu, "none" jest dla
// sk³adu (trainset) // sk³adu (trainset)
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
str = AnsiString(token.c_str()); // track str = AnsiString(token.c_str()); // track
@@ -1898,7 +1897,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser)
.AllowedFlag & .AllowedFlag &
ctrain_depot) // jesli zablokowany ctrain_depot) // jesli zablokowany
TempConnectionType[iTrainSetWehicleNumber] |= ctrain_depot; // bêdzie TempConnectionType[iTrainSetWehicleNumber] |= ctrain_depot; // bêdzie
// blokada // blokada
iTrainSetWehicleNumber++; iTrainSetWehicleNumber++;
} }
else else
@@ -1995,7 +1994,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser)
if (sTracks->Update(TP_MODEL, tmp->asName.c_str(), if (sTracks->Update(TP_MODEL, tmp->asName.c_str(),
tmp)) // najpierw sprawdziæ, czy ju¿ jest tmp)) // najpierw sprawdziæ, czy ju¿ jest
{ // przy zdublowaniu wskaŸnik zostanie podmieniony w drzewku na póŸniejszy (zgodnoœæ { // przy zdublowaniu wskaŸnik zostanie podmieniony w drzewku na póŸniejszy (zgodnoœæ
// wsteczna) // wsteczna)
ErrorLog("Duplicated model: " + tmp->asName); // to zg³aszaæ duplikat ErrorLog("Duplicated model: " + tmp->asName); // to zg³aszaæ duplikat
} }
else else
@@ -2057,7 +2056,7 @@ TGroundNode *__fastcall TGround::AddGroundNode(cParser *parser)
str = AnsiString(token.c_str()); str = AnsiString(token.c_str());
#ifdef _PROBLEND #ifdef _PROBLEND
// PROBLEND Q: 13122011 - Szociu: 27012012 // PROBLEND Q: 13122011 - Szociu: 27012012
PROBLEND = true; // domyslnie uruchomione nowe wyœwietlanie PROBLEND = true; // domyslnie uruchomione nowe wyœwietlanie
tmp->PROBLEND = true; // odwolanie do tgroundnode, bo rendering jest w tej klasie tmp->PROBLEND = true; // odwolanie do tgroundnode, bo rendering jest w tej klasie
if (str.Pos("@") > 0) // sprawdza, czy w nazwie tekstury jest znak "@" if (str.Pos("@") > 0) // sprawdza, czy w nazwie tekstury jest znak "@"
{ {
@@ -2336,7 +2335,7 @@ void TGround::FirstInit()
glFogi(GL_FOG_MODE, GL_LINEAR); glFogi(GL_FOG_MODE, GL_LINEAR);
glFogfv(GL_FOG_COLOR, Global::FogColor); // set fog color glFogfv(GL_FOG_COLOR, Global::FogColor); // set fog color
glFogf(GL_FOG_START, Global::fFogStart); // fog start depth glFogf(GL_FOG_START, Global::fFogStart); // fog start depth
glFogf(GL_FOG_END, Global::fFogEnd); // fog end depth glFogf(GL_FOG_END, Global::fFogEnd); // fog end depth
glEnable(GL_FOG); glEnable(GL_FOG);
} }
else else
@@ -2443,7 +2442,7 @@ bool TGround::Init(AnsiString asFile, HDC hDC)
if (LastNode->iType != TP_DYNAMIC) if (LastNode->iType != TP_DYNAMIC)
{ // jeœli nie jest pojazdem { // jeœli nie jest pojazdem
LastNode->nNext = nRootOfType[LastNode->iType]; // ostatni dodany do³¹czamy LastNode->nNext = nRootOfType[LastNode->iType]; // ostatni dodany do³¹czamy
// na koñcu nowego // na koñcu nowego
nRootOfType[LastNode->iType] = nRootOfType[LastNode->iType] =
LastNode; // ustawienie nowego na pocz¹tku listy LastNode; // ustawienie nowego na pocz¹tku listy
iNumNodes++; iNumNodes++;
@@ -2516,10 +2515,10 @@ bool TGround::Init(AnsiString asFile, HDC hDC)
if (iTrainSetWehicleNumber ? !TempConnectionType[iTrainSetWehicleNumber - 1] : if (iTrainSetWehicleNumber ? !TempConnectionType[iTrainSetWehicleNumber - 1] :
false) // jeœli ostatni pojazd ma sprzêg 0 false) // jeœli ostatni pojazd ma sprzêg 0
LastNode->DynamicObject->RaLightsSet(-1, 2 + 32 + 64); // to za³o¿ymy mu LastNode->DynamicObject->RaLightsSet(-1, 2 + 32 + 64); // to za³o¿ymy mu
// koñcówki blaszane // koñcówki blaszane
// (jak AI siê // (jak AI siê
// odpali, to sobie // odpali, to sobie
// poprawi) // poprawi)
bTrainSet = false; bTrainSet = false;
fTrainSetVel = 0; fTrainSetVel = 0;
// iTrainSetConnection=0; // iTrainSetConnection=0;
@@ -2569,7 +2568,7 @@ bool TGround::Init(AnsiString asFile, HDC hDC)
ErrorLog("Duplicated event: " + tmp->asName); ErrorLog("Duplicated event: " + tmp->asName);
found->Append(tmp); // doczepka (taki wirtualny multiple bez warunków) found->Append(tmp); // doczepka (taki wirtualny multiple bez warunków)
found->Type = tp_Ignored; // dezaktywacja pierwotnego - taka proteza na found->Type = tp_Ignored; // dezaktywacja pierwotnego - taka proteza na
// wsteczn¹ zgodnoœæ // wsteczn¹ zgodnoœæ
// SafeDelete(tmp); //bezlitoœnie usuwamy wszelkie duplikaty, ¿eby nie // SafeDelete(tmp); //bezlitoœnie usuwamy wszelkie duplikaty, ¿eby nie
// zaœmiecaæ drzewka // zaœmiecaæ drzewka
} }
@@ -2580,7 +2579,7 @@ bool TGround::Init(AnsiString asFile, HDC hDC)
RootEvent = tmp; RootEvent = tmp;
if (!found) if (!found)
{ // jeœli nazwa wyst¹pi³a, to do kolejki i wyszukiwarki dodawany jest tylko { // jeœli nazwa wyst¹pi³a, to do kolejki i wyszukiwarki dodawany jest tylko
// pierwszy // pierwszy
if (RootEvent->Type != tp_Ignored) if (RootEvent->Type != tp_Ignored)
if (RootEvent->asName.Pos( if (RootEvent->asName.Pos(
"onstart")) // event uruchamiany automatycznie po starcie "onstart")) // event uruchamiany automatycznie po starcie
@@ -2942,7 +2941,7 @@ bool TGround::InitEvents()
Current->Params[9].asMemCell = tmp->MemCell; Current->Params[9].asMemCell = tmp->MemCell;
if (Current->Type == tp_GetValues) // jeœli odczyt komórki if (Current->Type == tp_GetValues) // jeœli odczyt komórki
if (tmp->MemCell->IsVelocity()) // a komórka zawiera komendê SetVelocity albo if (tmp->MemCell->IsVelocity()) // a komórka zawiera komendê SetVelocity albo
// ShuntVelocity // ShuntVelocity
Current->bEnabled = false; // to event nie bêdzie dodawany do kolejki Current->bEnabled = false; // to event nie bêdzie dodawany do kolejki
} }
else else
@@ -3004,7 +3003,7 @@ bool TGround::InitEvents()
if (Current->Params[9].asAnimContainer) if (Current->Params[9].asAnimContainer)
{ {
Current->Params[9].asAnimContainer->WillBeAnimated(); // oflagowanie Current->Params[9].asAnimContainer->WillBeAnimated(); // oflagowanie
// animacji // animacji
if (!Current->Params[9] if (!Current->Params[9]
.asAnimContainer->Event()) // nie szukaæ, gdy znaleziony .asAnimContainer->Event()) // nie szukaæ, gdy znaleziony
Current->Params[9].asAnimContainer->EventAssign( Current->Params[9].asAnimContainer->EventAssign(
@@ -3194,24 +3193,23 @@ void TGround::InitTracks()
if (Track->asEvent0Name.IsEmpty()) if (Track->asEvent0Name.IsEmpty())
if (FindEvent(Current->asName + ":event0")) if (FindEvent(Current->asName + ":event0"))
Track->asEvent0Name = Current->asName + ":event0"; Track->asEvent0Name = Current->asName + ":event0";
if (Track->asEvent1Name.IsEmpty()) if (Track->asEvent1Name.IsEmpty())
if (FindEvent(Current->asName + ":event1")) if (FindEvent(Current->asName + ":event1"))
Track->asEvent1Name = Current->asName + ":event1"; Track->asEvent1Name = Current->asName + ":event1";
if (Track->asEvent2Name.IsEmpty()) if (Track->asEvent2Name.IsEmpty())
if (FindEvent(Current->asName + ":event2")) if (FindEvent(Current->asName + ":event2"))
Track->asEvent2Name = Current->asName + ":event2"; Track->asEvent2Name = Current->asName + ":event2";
if (Track->asEventall0Name.IsEmpty()) if (Track->asEventall0Name.IsEmpty())
if (FindEvent(Current->asName+":eventall0")) if (FindEvent(Current->asName + ":eventall0"))
Track->asEventall0Name=Current->asName+":eventall0"; Track->asEventall0Name = Current->asName + ":eventall0";
if (Track->asEventall1Name.IsEmpty()) if (Track->asEventall1Name.IsEmpty())
if (FindEvent(Current->asName+":eventall1")) if (FindEvent(Current->asName + ":eventall1"))
Track->asEventall1Name=Current->asName+":eventall1"; Track->asEventall1Name = Current->asName + ":eventall1";
if (Track->asEventall2Name.IsEmpty()) if (Track->asEventall2Name.IsEmpty())
if (FindEvent(Current->asName+":eventall2")) if (FindEvent(Current->asName + ":eventall2"))
Track->asEventall2Name=Current->asName+":eventall2"; Track->asEventall2Name = Current->asName + ":eventall2";
}
}
Track->AssignEvents( Track->AssignEvents(
Track->asEvent0Name.IsEmpty() ? NULL : FindEvent(Track->asEvent0Name), Track->asEvent0Name.IsEmpty() ? NULL : FindEvent(Track->asEvent0Name),
Track->asEvent1Name.IsEmpty() ? NULL : FindEventScan(Track->asEvent1Name), Track->asEvent1Name.IsEmpty() ? NULL : FindEventScan(Track->asEvent1Name),
@@ -3237,7 +3235,7 @@ void TGround::InitTracks()
if (!Model) // jak nie ma modelu if (!Model) // jak nie ma modelu
break; // to pewnie jest wykolejnica, a ta jest domyœlnie zamkniêta i wykoleja break; // to pewnie jest wykolejnica, a ta jest domyœlnie zamkniêta i wykoleja
case tt_Normal: // tylko proste s¹ pod³¹czane do rozjazdów, st¹d dwa rozjazdy siê nie case tt_Normal: // tylko proste s¹ pod³¹czane do rozjazdów, st¹d dwa rozjazdy siê nie
// po³¹cz¹ ze sob¹ // po³¹cz¹ ze sob¹
if (Track->CurrentPrev() == NULL) // tylko jeœli jeszcze nie pod³¹czony if (Track->CurrentPrev() == NULL) // tylko jeœli jeszcze nie pod³¹czony
{ {
tmp = FindTrack(Track->CurrentSegment()->FastGetPoint_0(), iConnection, Current); tmp = FindTrack(Track->CurrentSegment()->FastGetPoint_0(), iConnection, Current);
@@ -3379,7 +3377,7 @@ void TGround::InitTraction()
nTemp->psTractionPowerSource = new TTractionPowerSource(); nTemp->psTractionPowerSource = new TTractionPowerSource();
nTemp->psTractionPowerSource->Init(Traction->NominalVoltage, Traction->MaxCurrent); nTemp->psTractionPowerSource->Init(Traction->NominalVoltage, Traction->MaxCurrent);
nTemp->nNext = nRootOfType[nTemp->iType]; // ostatni dodany do³¹czamy na koñcu nTemp->nNext = nRootOfType[nTemp->iType]; // ostatni dodany do³¹czamy na koñcu
// nowego // nowego
nRootOfType[nTemp->iType] = nTemp; // ustawienie nowego na pocz¹tku listy nRootOfType[nTemp->iType] = nTemp; // ustawienie nowego na pocz¹tku listy
iNumNodes++; iNumNodes++;
} }
@@ -3401,12 +3399,12 @@ void TGround::InitTraction()
} }
if (Traction->hvNext[0]) // jeœli zosta³ pod³¹czony if (Traction->hvNext[0]) // jeœli zosta³ pod³¹czony
if (Traction->psSection && tmp->psSection) // tylko przês³o z izolatorem mo¿e nie if (Traction->psSection && tmp->psSection) // tylko przês³o z izolatorem mo¿e nie
// mieæ zasilania, bo ma 2, trzeba // mieæ zasilania, bo ma 2, trzeba
// sprawdzaæ s¹siednie // sprawdzaæ s¹siednie
if (Traction->psSection != if (Traction->psSection !=
tmp->psSection) // po³¹czone odcinki maj¹ ró¿ne zasilacze tmp->psSection) // po³¹czone odcinki maj¹ ró¿ne zasilacze
{ // to mo¿e byæ albo pod³¹czenie podstacji lub kabiny sekcyjnej do sekcji, albo { // to mo¿e byæ albo pod³¹czenie podstacji lub kabiny sekcyjnej do sekcji, albo
// b³¹d // b³¹d
if (Traction->psSection->bSection && !tmp->psSection->bSection) if (Traction->psSection->bSection && !tmp->psSection->bSection)
{ //(tmp->psSection) jest podstacj¹, a (Traction->psSection) nazw¹ sekcji { //(tmp->psSection) jest podstacj¹, a (Traction->psSection) nazw¹ sekcji
tmp->PowerSet(Traction->psSection); // zast¹pienie wskazaniem sekcji tmp->PowerSet(Traction->psSection); // zast¹pienie wskazaniem sekcji
@@ -3436,11 +3434,11 @@ void TGround::InitTraction()
} }
if (Traction->hvNext[1]) // jeœli zosta³ pod³¹czony if (Traction->hvNext[1]) // jeœli zosta³ pod³¹czony
if (Traction->psSection && tmp->psSection) // tylko przês³o z izolatorem mo¿e nie if (Traction->psSection && tmp->psSection) // tylko przês³o z izolatorem mo¿e nie
// mieæ zasilania, bo ma 2, trzeba // mieæ zasilania, bo ma 2, trzeba
// sprawdzaæ s¹siednie // sprawdzaæ s¹siednie
if (Traction->psSection != tmp->psSection) if (Traction->psSection != tmp->psSection)
{ // to mo¿e byæ albo pod³¹czenie podstacji lub kabiny sekcyjnej do sekcji, albo { // to mo¿e byæ albo pod³¹czenie podstacji lub kabiny sekcyjnej do sekcji, albo
// b³¹d // b³¹d
if (Traction->psSection->bSection && !tmp->psSection->bSection) if (Traction->psSection->bSection && !tmp->psSection->bSection)
{ //(tmp->psSection) jest podstacj¹, a (Traction->psSection) nazw¹ sekcji { //(tmp->psSection) jest podstacj¹, a (Traction->psSection) nazw¹ sekcji
tmp->PowerSet(Traction->psSection); // zast¹pienie wskazaniem sekcji tmp->PowerSet(Traction->psSection); // zast¹pienie wskazaniem sekcji
@@ -3462,7 +3460,7 @@ void TGround::InitTraction()
{ // operacje maj¹ce na celu wykrywanie bie¿ni wspólnych i ³¹czenie przêse³ napr¹¿ania { // operacje maj¹ce na celu wykrywanie bie¿ni wspólnych i ³¹czenie przêse³ napr¹¿ania
if (nCurrent->hvTraction->WhereIs()) // oznakowanie przedostatnich przêse³ if (nCurrent->hvTraction->WhereIs()) // oznakowanie przedostatnich przêse³
{ // poszukiwanie bie¿ni wspólnej dla przedostatnich przêse³, równie¿ w celu po³¹czenia { // poszukiwanie bie¿ni wspólnej dla przedostatnich przêse³, równie¿ w celu po³¹czenia
// zasilania // zasilania
// to siê nie sprawdza, bo po³¹czyæ siê mog¹ dwa niezasilane odcinki jako najbli¿sze // to siê nie sprawdza, bo po³¹czyæ siê mog¹ dwa niezasilane odcinki jako najbli¿sze
// sobie // sobie
// nCurrent->hvTraction->hvParallel=TractionNearestFind(nCurrent->pCenter,0,nCurrent); // nCurrent->hvTraction->hvParallel=TractionNearestFind(nCurrent->pCenter,0,nCurrent);
@@ -3484,7 +3482,7 @@ void TGround::InitTraction()
} }
int zg = 0; // zgodnoœæ kierunku przêse³, tymczasowo iterator do tabeli koñców int zg = 0; // zgodnoœæ kierunku przêse³, tymczasowo iterator do tabeli koñców
TGroundNode **nEnds = new TGroundNode *[iConnection]; // koñców jest ok. 10 razy mniej ni¿ TGroundNode **nEnds = new TGroundNode *[iConnection]; // koñców jest ok. 10 razy mniej ni¿
// wszystkich przêse³ (Quark: 216) // wszystkich przêse³ (Quark: 216)
for (nCurrent = nRootOfType[TP_TRACTION]; nCurrent; nCurrent = nCurrent->nNext) for (nCurrent = nRootOfType[TP_TRACTION]; nCurrent; nCurrent = nCurrent->nNext)
{ //³¹czenie bie¿ni wspólnych, w tym oznaczanie niepodanych jawnie { //³¹czenie bie¿ni wspólnych, w tym oznaczanie niepodanych jawnie
Traction = nCurrent->hvTraction; Traction = nCurrent->hvTraction;
@@ -3522,36 +3520,36 @@ void TGround::InitTraction()
while (zg) while (zg)
{ // ustalenie zastêpczej rezystancji dla ka¿dego przês³a { // ustalenie zastêpczej rezystancji dla ka¿dego przês³a
zg = 0; // flaga pod³¹czonych przêse³ koñcowych: -1=puste wskaŸniki, 0=coœ zosta³o, zg = 0; // flaga pod³¹czonych przêse³ koñcowych: -1=puste wskaŸniki, 0=coœ zosta³o,
// 1=wykonano ³¹czenie // 1=wykonano ³¹czenie
for (int i = 0; i < iConnection; ++i) for (int i = 0; i < iConnection; ++i)
if (nEnds[i]) // za³atwione bêdziemy zerowaæ if (nEnds[i]) // za³atwione bêdziemy zerowaæ
{ // ka¿dy przebieg to próba pod³¹czenia koñca segmentu naprê¿ania do innego zasilanego { // ka¿dy przebieg to próba pod³¹czenia koñca segmentu naprê¿ania do innego zasilanego
// przês³a // przês³a
if (nEnds[i]->hvTraction->hvNext[0]) if (nEnds[i]->hvTraction->hvNext[0])
{ // jeœli koñcowy ma ci¹g dalszy od strony 0 (Point1), szukamy odcinka najbli¿szego { // jeœli koñcowy ma ci¹g dalszy od strony 0 (Point1), szukamy odcinka najbli¿szego
// do Point2 // do Point2
if (TractionNearestFind(nEnds[i]->hvTraction->pPoint2, 0, if (TractionNearestFind(nEnds[i]->hvTraction->pPoint2, 0,
nEnds[i])) // poszukiwanie przês³a nEnds[i])) // poszukiwanie przês³a
{ {
nEnds[i] = NULL; nEnds[i] = NULL;
zg = 1; // jak coœ zosta³o pod³¹czone, to mo¿e zasilanie gdzieœ dodatkowo zg = 1; // jak coœ zosta³o pod³¹czone, to mo¿e zasilanie gdzieœ dodatkowo
// dotrze // dotrze
} }
} }
else if (nEnds[i]->hvTraction->hvNext[1]) else if (nEnds[i]->hvTraction->hvNext[1])
{ // jeœli koñcowy ma ci¹g dalszy od strony 1 (Point2), szukamy odcinka najbli¿szego { // jeœli koñcowy ma ci¹g dalszy od strony 1 (Point2), szukamy odcinka najbli¿szego
// do Point1 // do Point1
if (TractionNearestFind(nEnds[i]->hvTraction->pPoint1, 1, if (TractionNearestFind(nEnds[i]->hvTraction->pPoint1, 1,
nEnds[i])) // poszukiwanie przês³a nEnds[i])) // poszukiwanie przês³a
{ {
nEnds[i] = NULL; nEnds[i] = NULL;
zg = 1; // jak coœ zosta³o pod³¹czone, to mo¿e zasilanie gdzieœ dodatkowo zg = 1; // jak coœ zosta³o pod³¹czone, to mo¿e zasilanie gdzieœ dodatkowo
// dotrze // dotrze
} }
} }
else else
{ // gdy koniec jest samotny, to na razie nie zostanie pod³¹czony (nie powinno { // gdy koniec jest samotny, to na razie nie zostanie pod³¹czony (nie powinno
// takich byæ) // takich byæ)
nEnds[i] = NULL; nEnds[i] = NULL;
} }
} }
@@ -3711,7 +3709,7 @@ TTraction *__fastcall TGround::FindTraction(vector3 *Point, int &iConnection, TG
TTraction *__fastcall TGround::TractionNearestFind(vector3 &p, int dir, TGroundNode *n) TTraction *__fastcall TGround::TractionNearestFind(vector3 &p, int dir, TGroundNode *n)
{ // wyszukanie najbli¿szego do (p) przês³a o tej samej nazwie sekcji (ale innego ni¿ pod³¹czone) { // wyszukanie najbli¿szego do (p) przês³a o tej samej nazwie sekcji (ale innego ni¿ pod³¹czone)
// oraz zasilanego z kierunku (dir) // oraz zasilanego z kierunku (dir)
TGroundNode *nCurrent, *nBest = NULL; TGroundNode *nCurrent, *nBest = NULL;
int i, j, k, zg; int i, j, k, zg;
double d, dist = 200.0 * 200.0; //[m] odleg³oœæ graniczna double d, dist = 200.0 * 200.0; //[m] odleg³oœæ graniczna
@@ -3737,7 +3735,7 @@ TTraction *__fastcall TGround::TractionNearestFind(vector3 &p, int dir, TGroundN
nCurrent->hvTraction->vParametric) >= 0 ? nCurrent->hvTraction->vParametric) >= 0 ?
dir ^ 1 : dir ^ 1 :
dir)]) // ma zasilanie z odpowiedniej dir)]) // ma zasilanie z odpowiedniej
// strony // strony
if (nCurrent->hvTraction->fResistance[k] >= if (nCurrent->hvTraction->fResistance[k] >=
0.0) //¿eby siê nie propagowa³y jakieœ ujemne 0.0) //¿eby siê nie propagowa³y jakieœ ujemne
{ // znaleziony kandydat do po³¹czenia { // znaleziony kandydat do po³¹czenia
@@ -3750,7 +3748,7 @@ TTraction *__fastcall TGround::TractionNearestFind(vector3 &p, int dir, TGroundN
dist = d; // nowy rekord odleg³oœci dist = d; // nowy rekord odleg³oœci
nBest = nCurrent; nBest = nCurrent;
zg = k; // z którego koñca braæ wskaŸnik zg = k; // z którego koñca braæ wskaŸnik
// zasilacza // zasilacza
} }
} }
if (nBest) // jak znalezione przês³o z zasilaniem, to pod³¹czenie "równoleg³e" if (nBest) // jak znalezione przês³o z zasilaniem, to pod³¹czenie "równoleg³e"
@@ -3774,7 +3772,7 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node)
Event->Activator = Node; Event->Activator = Node;
if (Event->Type == tp_AddValues ? (Event->fDelay == 0.0) : false) if (Event->Type == tp_AddValues ? (Event->fDelay == 0.0) : false)
{ // eventy AddValues trzeba wykonywaæ natychmiastowo, inaczej kolejka mo¿e zgubiæ { // eventy AddValues trzeba wykonywaæ natychmiastowo, inaczej kolejka mo¿e zgubiæ
// jakieœ dodawanie // jakieœ dodawanie
// Ra: kopiowanie wykonania tu jest bez sensu, lepiej by by³o wydzieliæ funkcjê // Ra: kopiowanie wykonania tu jest bez sensu, lepiej by by³o wydzieliæ funkcjê
// wykonuj¹c¹ eventy i j¹ wywo³aæ // wykonuj¹c¹ eventy i j¹ wywo³aæ
if (EventConditon(Event)) if (EventConditon(Event))
@@ -3784,7 +3782,7 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node)
Event->Params[2].asdouble, Event->iFlags); Event->Params[2].asdouble, Event->iFlags);
if (Event->Params[6].asTrack) if (Event->Params[6].asTrack)
{ // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla { // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla
// wszystkich 'dynamic' na danym torze // wszystkich 'dynamic' na danym torze
for (int i = 0; i < Event->Params[6].asTrack->iNumDynamics; ++i) for (int i = 0; i < Event->Params[6].asTrack->iNumDynamics; ++i)
Event->Params[5].asMemCell->PutCommand( Event->Params[5].asMemCell->PutCommand(
Event->Params[6].asTrack->Dynamics[i]->Mechanik, Event->Params[6].asTrack->Dynamics[i]->Mechanik,
@@ -3956,7 +3954,7 @@ bool TGround::CheckQuery()
tmpEvent->Params[2].asdouble, tmpEvent->iFlags); tmpEvent->Params[2].asdouble, tmpEvent->iFlags);
if (tmpEvent->Params[6].asTrack) if (tmpEvent->Params[6].asTrack)
{ // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla { // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla
// wszystkich 'dynamic' na danym torze // wszystkich 'dynamic' na danym torze
for (int i = 0; i < tmpEvent->Params[6].asTrack->iNumDynamics; ++i) for (int i = 0; i < tmpEvent->Params[6].asTrack->iNumDynamics; ++i)
tmpEvent->Params[5].asMemCell->PutCommand( tmpEvent->Params[5].asMemCell->PutCommand(
tmpEvent->Params[6].asTrack->Dynamics[i]->Mechanik, tmpEvent->Params[6].asTrack->Dynamics[i]->Mechanik,
@@ -3980,7 +3978,7 @@ bool TGround::CheckQuery()
// loc.Y= tmpEvent->Params[8].nGroundNode->pCenter.z; // loc.Y= tmpEvent->Params[8].nGroundNode->pCenter.z;
// loc.Z= tmpEvent->Params[8].nGroundNode->pCenter.y; // loc.Z= tmpEvent->Params[8].nGroundNode->pCenter.y;
if (Global::iMultiplayer) // potwierdzenie wykonania dla serwera (odczyt if (Global::iMultiplayer) // potwierdzenie wykonania dla serwera (odczyt
// semafora ju¿ tak nie dzia³a) // semafora ju¿ tak nie dzia³a)
WyslijEvent(tmpEvent->asName, tmpEvent->Activator->GetName()); WyslijEvent(tmpEvent->asName, tmpEvent->Activator->GetName());
// tmpEvent->Params[9].asMemCell->PutCommand(tmpEvent->Activator->Mechanik,loc); // tmpEvent->Params[9].asMemCell->PutCommand(tmpEvent->Activator->Mechanik,loc);
tmpEvent->Params[9].asMemCell->PutCommand( tmpEvent->Params[9].asMemCell->PutCommand(
@@ -4075,7 +4073,7 @@ bool TGround::CheckQuery()
case tp_TrackVel: case tp_TrackVel:
if (tmpEvent->Params[9].asTrack) if (tmpEvent->Params[9].asTrack)
{ // prêdkoœæ na zwrotnicy mo¿e byæ ograniczona z góry we wpisie, wiêkszej siê nie { // prêdkoœæ na zwrotnicy mo¿e byæ ograniczona z góry we wpisie, wiêkszej siê nie
// ustawi eventem // ustawi eventem
WriteLog("type: TrackVel"); WriteLog("type: TrackVel");
// WriteLog("Vel: ",tmpEvent->Params[0].asdouble); // WriteLog("Vel: ",tmpEvent->Params[0].asdouble);
tmpEvent->Params[9].asTrack->VelocitySet(tmpEvent->Params[0].asdouble); tmpEvent->Params[9].asTrack->VelocitySet(tmpEvent->Params[0].asdouble);
@@ -4106,7 +4104,7 @@ bool TGround::CheckQuery()
5.0) // to musi mieæ sensowny okres powtarzania 5.0) // to musi mieæ sensowny okres powtarzania
if (tmpEvent->iQueued < 2) if (tmpEvent->iQueued < 2)
{ // trzeba zrobiæ wyj¹tek, aby event móg³ siê sam dodaæ do { // trzeba zrobiæ wyj¹tek, aby event móg³ siê sam dodaæ do
// kolejki, raz ju¿ jest, ale bêdzie usuniêty // kolejki, raz ju¿ jest, ale bêdzie usuniêty
// pêtla eventowa mo¿e byæ uruchomiona wiele razy, ale tylko // pêtla eventowa mo¿e byæ uruchomiona wiele razy, ale tylko
// pierwsze uruchomienie zadzia³a // pierwsze uruchomienie zadzia³a
tmpEvent->iQueued = tmpEvent->iQueued =
@@ -4154,7 +4152,7 @@ bool TGround::CheckQuery()
tmpEvent->Params[9].asMemCell->UpdateValues( tmpEvent->Params[9].asMemCell->UpdateValues(
tmpEvent->Activator->asDestination.c_str(), // adres docelowy tmpEvent->Activator->asDestination.c_str(), // adres docelowy
tmpEvent->Activator->DirectionGet(), // kierunek pojazdu wzglêdem czo³a tmpEvent->Activator->DirectionGet(), // kierunek pojazdu wzglêdem czo³a
// sk³adu (1=zgodny,-1=przeciwny) // sk³adu (1=zgodny,-1=przeciwny)
tmpEvent->Activator->MoverParameters tmpEvent->Activator->MoverParameters
->Power, // moc pojazdu silnikowego: 0 dla wagonu ->Power, // moc pojazdu silnikowego: 0 dla wagonu
tmpEvent->iFlags & (update_memstring | update_memval1 | update_memval2)); tmpEvent->iFlags & (update_memstring | update_memval1 | update_memval2));
@@ -4269,7 +4267,7 @@ bool TGround::Update(double dt, int iter)
TAnimModel::AnimUpdate(dt1); // wykonanie zakolejkowanych animacji TAnimModel::AnimUpdate(dt1); // wykonanie zakolejkowanych animacji
for (TGroundNode *Current = nRootDynamic; Current; Current = Current->nNext) for (TGroundNode *Current = nRootDynamic; Current; Current = Current->nNext)
{ // Ra: zmieniæ warunek na sprawdzanie pantografów w jednej zmiennej: czy pantografy i czy { // Ra: zmieniæ warunek na sprawdzanie pantografów w jednej zmiennej: czy pantografy i czy
// podniesione // podniesione
if (Current->DynamicObject->MoverParameters->EnginePowerSource.SourceType == if (Current->DynamicObject->MoverParameters->EnginePowerSource.SourceType ==
CurrentCollector) CurrentCollector)
GetTraction(Current->DynamicObject); // poszukiwanie drutu dla pantografów GetTraction(Current->DynamicObject); // poszukiwanie drutu dla pantografów
@@ -4277,7 +4275,7 @@ bool TGround::Update(double dt, int iter)
} }
for (TGroundNode *Current = nRootDynamic; Current; Current = Current->nNext) for (TGroundNode *Current = nRootDynamic; Current; Current = Current->nNext)
Current->DynamicObject->Update(dt, dt1); // Ra 2015-01: tylko tu przelicza sieæ Current->DynamicObject->Update(dt, dt1); // Ra 2015-01: tylko tu przelicza sieæ
// trakcyjn¹ // trakcyjn¹
} }
else else
{ // jezeli jest tylko jedna iteracja { // jezeli jest tylko jedna iteracja
@@ -4363,9 +4361,9 @@ bool TGround::GetTraction(TDynamicObject *model)
else else
{ // jeœli t jest w przedziale, wyznaczyæ odleg³oœæ wzd³u¿ wektorów vUp i vLeft { // jeœli t jest w przedziale, wyznaczyæ odleg³oœæ wzd³u¿ wektorów vUp i vLeft
vStyk = p->hvPowerWire->pPoint1 + fRaParam * vParam; // punkt styku vStyk = p->hvPowerWire->pPoint1 + fRaParam * vParam; // punkt styku
// p³aszczyzny z drutem // p³aszczyzny z drutem
// (dla generatora ³uku // (dla generatora ³uku
// el.) // el.)
vGdzie = vStyk - pant0; // wektor vGdzie = vStyk - pant0; // wektor
// odleg³oœæ w pionie musi byæ w zasiêgu ruchu "pionowego" pantografu // odleg³oœæ w pionie musi byæ w zasiêgu ruchu "pionowego" pantografu
fVertical = DotProduct( fVertical = DotProduct(
@@ -4373,11 +4371,11 @@ bool TGround::GetTraction(TDynamicObject *model)
// odleg³oœæ w bok powinna byæ mniejsza ni¿ pó³ szerokoœci pantografu // odleg³oœæ w bok powinna byæ mniejsza ni¿ pó³ szerokoœci pantografu
fHorizontal = fabs(DotProduct(vGdzie, vLeft)) - fHorizontal = fabs(DotProduct(vGdzie, vLeft)) -
p->fWidth; // to siê musi mieœciæ w przedziale zale¿nym od p->fWidth; // to siê musi mieœciæ w przedziale zale¿nym od
// szerokoœci pantografu // szerokoœci pantografu
// jeœli w pionie albo w bok jest za daleko, to dany drut jest nieu¿yteczny // jeœli w pionie albo w bok jest za daleko, to dany drut jest nieu¿yteczny
if (fHorizontal > 0) // 0.635 dla AKP-1 AKP-4E if (fHorizontal > 0) // 0.635 dla AKP-1 AKP-4E
{ // drut wyszed³ poza zakres roboczy, ale jeszcze jest nabie¿nik - { // drut wyszed³ poza zakres roboczy, ale jeszcze jest nabie¿nik -
// pantograf siê unosi bez utraty pr¹du // pantograf siê unosi bez utraty pr¹du
if (fHorizontal > p->fWidthExtra) // czy wyszed³ za nabie¿nik if (fHorizontal > p->fWidthExtra) // czy wyszed³ za nabie¿nik
{ {
p->hvPowerWire = NULL; // dotychczasowy drut nie liczy siê p->hvPowerWire = NULL; // dotychczasowy drut nie liczy siê
@@ -4385,18 +4383,18 @@ bool TGround::GetTraction(TDynamicObject *model)
} }
else else
{ // problem jest, gdy nowy drut jest wy¿ej, wtedy pantograf od³¹cza siê { // problem jest, gdy nowy drut jest wy¿ej, wtedy pantograf od³¹cza siê
// od starego, a na podniesienie do nowego potrzebuje czasu // od starego, a na podniesienie do nowego potrzebuje czasu
p->PantTraction = p->PantTraction =
fVertical + fVertical +
0.15 * fHorizontal / p->fWidthExtra; // na razie liniowo na 0.15 * fHorizontal / p->fWidthExtra; // na razie liniowo na
// nabie¿niku, dok³adnoœæ // nabie¿niku, dok³adnoœæ
// poprawi siê póŸniej // poprawi siê póŸniej
// p->fHorizontal=fHorizontal; //zapamiêtanie po³o¿enia drutu // p->fHorizontal=fHorizontal; //zapamiêtanie po³o¿enia drutu
} }
} }
else else
{ // po wyselekcjonowaniu drutu, przypisaæ go do toru, ¿eby nie trzeba by³o { // po wyselekcjonowaniu drutu, przypisaæ go do toru, ¿eby nie trzeba by³o
// szukaæ // szukaæ
// dla 3 koñcowych przêse³ sprawdziæ wszystkie dostêpne przês³a // dla 3 koñcowych przêse³ sprawdziæ wszystkie dostêpne przês³a
// bo mog¹ byæ umieszczone równolegle nad torem - po³¹czyæ w pierœcieñ // bo mog¹ byæ umieszczone równolegle nad torem - po³¹czyæ w pierœcieñ
// najlepiej, jakby odcinki równoleg³e by³y oznaczone we wpisach // najlepiej, jakby odcinki równoleg³e by³y oznaczone we wpisach
@@ -4420,7 +4418,7 @@ bool TGround::GetTraction(TDynamicObject *model)
for (int j = r - 2; j <= r; j++) for (int j = r - 2; j <= r; j++)
for (int i = c - 2; i <= c; i++) for (int i = c - 2; i <= c; i++)
{ // poszukiwanie po najbli¿szych sektorach niewiele da przy wiêkszym { // poszukiwanie po najbli¿szych sektorach niewiele da przy wiêkszym
// zagêszczeniu // zagêszczeniu
tmp = FastGetSubRect(i, j); tmp = FastGetSubRect(i, j);
if (tmp) if (tmp)
{ // dany sektor mo¿e nie mieæ nic w œrodku { // dany sektor mo¿e nie mieæ nic w œrodku
@@ -4438,34 +4436,35 @@ bool TGround::GetTraction(TDynamicObject *model)
DotProduct(vParam, vFront); DotProduct(vParam, vFront);
if ((fRaParam >= -0.001) ? (fRaParam <= 1.001) : false) if ((fRaParam >= -0.001) ? (fRaParam <= 1.001) : false)
{ // jeœli tylko jest w przedziale, wyznaczyæ odleg³oœæ wzd³u¿ { // jeœli tylko jest w przedziale, wyznaczyæ odleg³oœæ wzd³u¿
// wektorów vUp i vLeft // wektorów vUp i vLeft
vStyk = node->hvTraction->pPoint1 + vStyk = node->hvTraction->pPoint1 +
fRaParam * vParam; // punkt styku p³aszczyzny z fRaParam * vParam; // punkt styku p³aszczyzny z
// drutem (dla generatora ³uku // drutem (dla generatora ³uku
// el.) // el.)
vGdzie = vStyk - pant0; // wektor vGdzie = vStyk - pant0; // wektor
fVertical = DotProduct( fVertical = DotProduct(
vGdzie, vGdzie,
vUp); // musi siê mieœciæ w przedziale ruchu pantografu vUp); // musi siê mieœciæ w przedziale ruchu pantografu
if (fVertical >= 0.0) // jeœli ponad pantografem (bo mo¿e if (fVertical >= 0.0) // jeœli ponad pantografem (bo mo¿e
// ³apaæ druty spod wiaduktu) // ³apaæ druty spod wiaduktu)
if (Global::bEnableTraction ? if (Global::bEnableTraction ?
fVertical < p->PantWys - 0.15 : fVertical < p->PantWys - 0.15 :
false) // jeœli drut jest ni¿ej ni¿ 15cm pod false) // jeœli drut jest ni¿ej ni¿ 15cm pod
// œlizgiem // œlizgiem
{ // prze³¹czamy w tryb po³amania, o ile jedzie; { // prze³¹czamy w tryb po³amania, o ile jedzie;
// (bEnableTraction) aby da³o siê jeŸdziæ na koœlawych // (bEnableTraction) aby da³o siê jeŸdziæ na
// sceneriach // koœlawych
// sceneriach
fHorizontal = fabs(DotProduct(vGdzie, vLeft)) - fHorizontal = fabs(DotProduct(vGdzie, vLeft)) -
p->fWidth; // i do tego jeszcze p->fWidth; // i do tego jeszcze
// wejdzie pod œlizg // wejdzie pod œlizg
if (fHorizontal <= 0.0) // 0.635 dla AKP-1 AKP-4E if (fHorizontal <= 0.0) // 0.635 dla AKP-1 AKP-4E
{ {
p->PantWys = p->PantWys =
-1.0; // ujemna liczba oznacza po³amanie -1.0; // ujemna liczba oznacza po³amanie
p->hvPowerWire = NULL; // bo inaczej siê zasila p->hvPowerWire = NULL; // bo inaczej siê zasila
// w nieskoñczonoœæ z // w nieskoñczonoœæ z
// po³amanego // po³amanego
// p->fHorizontal=fHorizontal; //zapamiêtanie // p->fHorizontal=fHorizontal; //zapamiêtanie
// po³o¿enia drutu // po³o¿enia drutu
if (model->MoverParameters->EnginePowerSource if (model->MoverParameters->EnginePowerSource
@@ -4474,7 +4473,7 @@ bool TGround::GetTraction(TDynamicObject *model)
--model->MoverParameters->EnginePowerSource --model->MoverParameters->EnginePowerSource
.CollectorParameters .CollectorParameters
.CollectorsNo; // teraz bêdzie .CollectorsNo; // teraz bêdzie
// mniejsza // mniejsza
if (DebugModeFlag) if (DebugModeFlag)
ErrorLog( ErrorLog(
"Pant. break: at " + "Pant. break: at " +
@@ -4486,14 +4485,14 @@ bool TGround::GetTraction(TDynamicObject *model)
} }
} }
else if (fVertical < p->PantTraction) // ale ni¿ej, ni¿ else if (fVertical < p->PantTraction) // ale ni¿ej, ni¿
// poprzednio // poprzednio
// znaleziony // znaleziony
{ {
fHorizontal = fHorizontal =
fabs(DotProduct(vGdzie, vLeft)) - p->fWidth; fabs(DotProduct(vGdzie, vLeft)) - p->fWidth;
if (fHorizontal <= 0.0) // 0.635 dla AKP-1 AKP-4E if (fHorizontal <= 0.0) // 0.635 dla AKP-1 AKP-4E
{ // to siê musi mieœciæ w przedziale zaleznym od { // to siê musi mieœciæ w przedziale zaleznym od
// szerokoœci pantografu // szerokoœci pantografu
p->hvPowerWire = p->hvPowerWire =
node->hvTraction; // jakiœ znaleziony node->hvTraction; // jakiœ znaleziony
p->PantTraction = p->PantTraction =
@@ -4503,28 +4502,28 @@ bool TGround::GetTraction(TDynamicObject *model)
} }
else if (fHorizontal < else if (fHorizontal <
p->fWidthExtra) // czy zmieœci³ siê w p->fWidthExtra) // czy zmieœci³ siê w
// zakresie nabie¿nika? // zakresie nabie¿nika?
{ // problem jest, gdy nowy drut jest wy¿ej, wtedy { // problem jest, gdy nowy drut jest wy¿ej, wtedy
// pantograf od³¹cza siê od starego, a na // pantograf od³¹cza siê od starego, a na
// podniesienie do nowego potrzebuje czasu // podniesienie do nowego potrzebuje czasu
fVertical += fVertical +=
0.15 * fHorizontal / 0.15 * fHorizontal /
p->fWidthExtra; // korekta wysokoœci o p->fWidthExtra; // korekta wysokoœci o
// nabie¿nik - drut nad // nabie¿nik - drut nad
// nabie¿nikiem jest // nabie¿nikiem jest
// geometrycznie jakby nieco // geometrycznie jakby nieco
// wy¿ej // wy¿ej
if (fVertical < if (fVertical <
p->PantTraction) // gdy po korekcie jest p->PantTraction) // gdy po korekcie jest
// ni¿ej, ni¿ poprzednio // ni¿ej, ni¿ poprzednio
// znaleziony // znaleziony
{ // gdyby to wystarczy³o, to mo¿emy go uznaæ { // gdyby to wystarczy³o, to mo¿emy go uznaæ
p->hvPowerWire = p->hvPowerWire =
node->hvTraction; // mo¿e byæ node->hvTraction; // mo¿e byæ
p->PantTraction = p->PantTraction =
fVertical; // na razie liniowo na fVertical; // na razie liniowo na
// nabie¿niku, dok³adnoœæ // nabie¿niku, dok³adnoœæ
// poprawi siê póŸniej // poprawi siê póŸniej
// p->fHorizontal=fHorizontal; // p->fHorizontal=fHorizontal;
// //zapamiêtanie po³o¿enia drutu // //zapamiêtanie po³o¿enia drutu
} }
@@ -4584,7 +4583,7 @@ bool TGround::RenderDL(vector3 pPosition)
for (node = tmp->nRenderHidden; node; node = node->nNext3) for (node = tmp->nRenderHidden; node; node = node->nNext3)
node->RenderHidden(); node->RenderHidden();
tmp->RenderSounds(); // jeszcze dŸwiêki pojazdów by siê przyda³y, równie¿ tmp->RenderSounds(); // jeszcze dŸwiêki pojazdów by siê przyda³y, równie¿
// niewidocznych // niewidocznych
} }
// renderowanie progresywne - zale¿ne od FPS oraz kierunku patrzenia // renderowanie progresywne - zale¿ne od FPS oraz kierunku patrzenia
iRendered = 0; // iloœæ renderowanych sektorów iRendered = 0; // iloœæ renderowanych sektorów
@@ -4597,7 +4596,7 @@ bool TGround::RenderDL(vector3 pPosition)
{ {
if (j <= 0) if (j <= 0)
i = -i; // pierwszy przebieg: j<=0, i>=0; drugi: j>=0, i<=0; trzeci: j<=0, i<=0 i = -i; // pierwszy przebieg: j<=0, i>=0; drugi: j>=0, i<=0; trzeci: j<=0, i<=0
// czwarty: j>=0, i>=0; // czwarty: j>=0, i>=0;
j = -j; // i oraz j musi byæ zmienione wczeœniej, ¿eby continue dzia³a³o j = -j; // i oraz j musi byæ zmienione wczeœniej, ¿eby continue dzia³a³o
direction = vector3(i, 0, j); // wektor od kamery do danego sektora direction = vector3(i, 0, j); // wektor od kamery do danego sektora
if (LengthSquared3(direction) > 5) // te blisko s¹ zawsze wyœwietlane if (LengthSquared3(direction) > 5) // te blisko s¹ zawsze wyœwietlane
@@ -4674,7 +4673,7 @@ bool TGround::RenderVBO(vector3 pPosition)
for (node = tmp->nRenderHidden; node; node = node->nNext3) for (node = tmp->nRenderHidden; node; node = node->nNext3)
node->RenderHidden(); node->RenderHidden();
tmp->RenderSounds(); // jeszcze dŸwiêki pojazdów by siê przyda³y, równie¿ tmp->RenderSounds(); // jeszcze dŸwiêki pojazdów by siê przyda³y, równie¿
// niewidocznych // niewidocznych
} }
} }
// renderowanie progresywne - zale¿ne od FPS oraz kierunku patrzenia // renderowanie progresywne - zale¿ne od FPS oraz kierunku patrzenia
@@ -4688,7 +4687,7 @@ bool TGround::RenderVBO(vector3 pPosition)
{ {
if (j <= 0) if (j <= 0)
i = -i; // pierwszy przebieg: j<=0, i>=0; drugi: j>=0, i<=0; trzeci: j<=0, i<=0 i = -i; // pierwszy przebieg: j<=0, i>=0; drugi: j>=0, i<=0; trzeci: j<=0, i<=0
// czwarty: j>=0, i>=0; // czwarty: j>=0, i>=0;
j = -j; // i oraz j musi byæ zmienione wczeœniej, ¿eby continue dzia³a³o j = -j; // i oraz j musi byæ zmienione wczeœniej, ¿eby continue dzia³a³o
direction = vector3(i, 0, j); // wektor od kamery do danego sektora direction = vector3(i, 0, j); // wektor od kamery do danego sektora
if (LengthSquared3(direction) > 5) // te blisko s¹ zawsze wyœwietlane if (LengthSquared3(direction) > 5) // te blisko s¹ zawsze wyœwietlane
@@ -5049,7 +5048,7 @@ void TGround::TerrainWrite()
if (Current->TextureID) if (Current->TextureID)
switch (Current->iType) switch (Current->iType)
{ // pêtla po trójk¹tach - zliczanie wierzcho³ków, dodaje submodel dla { // pêtla po trójk¹tach - zliczanie wierzcho³ków, dodaje submodel dla
// ka¿dej tekstury // ka¿dej tekstury
case GL_TRIANGLES: case GL_TRIANGLES:
Current->iVboPtr = sk->TriangleAdd( Current->iVboPtr = sk->TriangleAdd(
m, Current->TextureID, m, Current->TextureID,
@@ -5058,10 +5057,10 @@ void TGround::TerrainWrite()
Current->iNumVerts; // zwiêkszenie ca³kowitej iloœci wierzcho³ków Current->iNumVerts; // zwiêkszenie ca³kowitej iloœci wierzcho³ków
break; break;
case GL_TRIANGLE_STRIP: // na razie nie, bo trzeba przerabiaæ na pojedyncze case GL_TRIANGLE_STRIP: // na razie nie, bo trzeba przerabiaæ na pojedyncze
// trójk¹ty // trójk¹ty
break; break;
case GL_TRIANGLE_FAN: // na razie nie, bo trzeba przerabiaæ na pojedyncze case GL_TRIANGLE_FAN: // na razie nie, bo trzeba przerabiaæ na pojedyncze
// trójk¹ty // trójk¹ty
break; break;
} }
for (Current = Rects[i][j].nRootNode; Current; Current = Current->nNext2) for (Current = Rects[i][j].nRootNode; Current; Current = Current->nNext2)
@@ -5092,10 +5091,10 @@ void TGround::TerrainWrite()
} }
break; break;
case GL_TRIANGLE_STRIP: // na razie nie, bo trzeba przerabiaæ na pojedyncze case GL_TRIANGLE_STRIP: // na razie nie, bo trzeba przerabiaæ na pojedyncze
// trójk¹ty // trójk¹ty
break; break;
case GL_TRIANGLE_FAN: // na razie nie, bo trzeba przerabiaæ na pojedyncze case GL_TRIANGLE_FAN: // na razie nie, bo trzeba przerabiaæ na pojedyncze
// trójk¹ty // trójk¹ty
break; break;
} }
} }

View File

@@ -160,7 +160,7 @@ class TGroundNode : public Resource
void RenderHidden(); // obsługa dźwięków i wyzwalaczy zdarzeń void RenderHidden(); // obsługa dźwięków i wyzwalaczy zdarzeń
void RenderDL(); // renderowanie nieprzezroczystych w Display Lists void RenderDL(); // renderowanie nieprzezroczystych w Display Lists
void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists
// (McZapkie-131202) // (McZapkie-131202)
void RaRenderVBO(); // renderowanie (nieprzezroczystych) ze wspólnego VBO void RaRenderVBO(); // renderowanie (nieprzezroczystych) ze wspólnego VBO
void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
@@ -193,19 +193,18 @@ class TSubRect : public Resource, public CMesh
TSubRect(); TSubRect();
virtual ~TSubRect(); virtual ~TSubRect();
virtual void Release(); // zwalnianie VBO sektora virtual void Release(); // zwalnianie VBO sektora
void NodeAdd( void NodeAdd(TGroundNode *Node); // dodanie obiektu do sektora na etapie rozdzielania na sektory
TGroundNode *Node); // dodanie obiektu do sektora na etapie rozdzielania na sektory
void RaNodeAdd(TGroundNode *Node); // dodanie obiektu do listy renderowania void RaNodeAdd(TGroundNode *Node); // dodanie obiektu do listy renderowania
void Sort(); // optymalizacja obiektów w sektorze (sortowanie wg tekstur) void Sort(); // optymalizacja obiektów w sektorze (sortowanie wg tekstur)
TTrack *__fastcall FindTrack(vector3 *Point, int &iConnection, TTrack *Exclude); TTrack *__fastcall FindTrack(vector3 *Point, int &iConnection, TTrack *Exclude);
TTraction *__fastcall FindTraction(vector3 *Point, int &iConnection, TTraction *Exclude); TTraction *__fastcall FindTraction(vector3 *Point, int &iConnection, TTraction *Exclude);
bool StartVBO(); // ustwienie VBO sektora dla (nRenderRect), (nRenderRectAlpha) i bool StartVBO(); // ustwienie VBO sektora dla (nRenderRect), (nRenderRectAlpha) i
// (nRenderWires) // (nRenderWires)
bool RaTrackAnimAdd(TTrack *t); // zgłoszenie toru do animacji bool RaTrackAnimAdd(TTrack *t); // zgłoszenie toru do animacji
void RaAnimate(); // przeliczenie animacji torów void RaAnimate(); // przeliczenie animacji torów
void RenderDL(); // renderowanie nieprzezroczystych w Display Lists void RenderDL(); // renderowanie nieprzezroczystych w Display Lists
void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists void RenderAlphaDL(); // renderowanie przezroczystych w Display Lists
// (McZapkie-131202) // (McZapkie-131202)
void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO void RenderVBO(); // renderowanie nieprzezroczystych z własnego VBO
void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO void RenderAlphaVBO(); // renderowanie przezroczystych z (własnego) VBO
void RenderSounds(); // dźwięki pojazdów z niewidocznych sektorów void RenderSounds(); // dźwięki pojazdów z niewidocznych sektorów
@@ -227,7 +226,10 @@ class TGroundRect : public TSubRect
private: private:
int iLastDisplay; // numer klatki w której był ostatnio wyświetlany int iLastDisplay; // numer klatki w której był ostatnio wyświetlany
TSubRect *pSubRects; TSubRect *pSubRects;
void Init() { pSubRects = new TSubRect[iNumSubRects * iNumSubRects]; }; void Init()
{
pSubRects = new TSubRect[iNumSubRects * iNumSubRects];
};
public: public:
static int iFrameNumber; // numer kolejny wyświetlanej klatki static int iFrameNumber; // numer kolejny wyświetlanej klatki
@@ -359,8 +361,14 @@ class TGround
}; };
TSubRect *__fastcall GetSubRect(int iCol, int iRow); TSubRect *__fastcall GetSubRect(int iCol, int iRow);
TSubRect *__fastcall FastGetSubRect(int iCol, int iRow); TSubRect *__fastcall FastGetSubRect(int iCol, int iRow);
int GetRowFromZ(double z) { return (z / fSubRectSize + fHalfTotalNumSubRects); }; int GetRowFromZ(double z)
int GetColFromX(double x) { return (x / fSubRectSize + fHalfTotalNumSubRects); }; {
return (z / fSubRectSize + fHalfTotalNumSubRects);
};
int GetColFromX(double x)
{
return (x / fSubRectSize + fHalfTotalNumSubRects);
};
TEvent *__fastcall FindEvent(const AnsiString &asEventName); TEvent *__fastcall FindEvent(const AnsiString &asEventName);
TEvent *__fastcall FindEventScan(const AnsiString &asEventName); TEvent *__fastcall FindEventScan(const AnsiString &asEventName);
void TrackJoin(TGroundNode *Current); void TrackJoin(TGroundNode *Current);

View File

@@ -15,9 +15,14 @@ http://mozilla.org/MPL/2.0/.
#include "Timer.h" #include "Timer.h"
#include "Globals.h" #include "Globals.h"
__fastcall TMachajka::TMachajka() : TTrain() { TTrain::TTrain(); } __fastcall TMachajka::TMachajka() : TTrain()
{
TTrain::TTrain();
}
__fastcall TMachajka::~TMachajka() {} __fastcall TMachajka::~TMachajka()
{
}
bool TMachajka::Init(TDynamicObject *NewDynamicObject) bool TMachajka::Init(TDynamicObject *NewDynamicObject)
{ {
@@ -63,11 +68,20 @@ void TMachajka::OnKeyPress(int cKey)
} }
} }
bool TMachajka::Update(double dt) { TTrain::Update(dt); } bool TMachajka::Update(double dt)
{
TTrain::Update(dt);
}
bool TMachajka::UpdateMechPosition() { TTrain::UpdateMechPosition(); } bool TMachajka::UpdateMechPosition()
{
TTrain::UpdateMechPosition();
}
bool TMachajka::Render() { TTrain::Render(); } bool TMachajka::Render()
{
TTrain::Render();
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#pragma package(smart_init) #pragma package(smart_init)

View File

@@ -57,7 +57,10 @@ __fastcall TModelsManager::~TModelsManager()
Free(); Free();
}; };
*/ */
void TModelsManager::Free() { SafeDeleteArray(Models); } void TModelsManager::Free()
{
SafeDeleteArray(Models);
}
TModel3d *__fastcall TModelsManager::LoadModel(char *Name, bool dynamic) TModel3d *__fastcall TModelsManager::LoadModel(char *Name, bool dynamic)
{ // wczytanie modelu do tablicy { // wczytanie modelu do tablicy
@@ -75,7 +78,7 @@ TModel3d *__fastcall TModelsManager::LoadModel(char *Name, bool dynamic)
TModel3d *__fastcall TModelsManager::GetModel(const char *Name, bool dynamic) 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 { // model mo¿e byæ we wpisie "node...model" albo "node...dynamic", a tak¿e byæ dodatkowym w dynamic
// (kabina, wnêtrze, ³adunek) // (kabina, wnêtrze, ³adunek)
// dla "node...dynamic" mamy podan¹ œcie¿kê w "\dynamic\" i musi byæ co najmniej 1 poziom, zwkle // dla "node...dynamic" mamy podan¹ œcie¿kê w "\dynamic\" i musi byæ co najmniej 1 poziom, zwkle
// s¹ 2 // s¹ 2
// dla "node...model" mo¿e byæ typowy model statyczny ze œcie¿k¹, domyœlnie w "\scenery\" albo // dla "node...model" mo¿e byæ typowy model statyczny ze œcie¿k¹, domyœlnie w "\scenery\" albo
@@ -97,7 +100,7 @@ TModel3d *__fastcall TModelsManager::GetModel(const char *Name, bool dynamic)
// - wczytanie modelu animowanego - Init() - sprawdziæ // - wczytanie modelu animowanego - Init() - sprawdziæ
char buf[255]; char buf[255];
AnsiString buftp = Global::asCurrentTexturePath; // zapamiêtanie aktualnej œcie¿ki do tekstur, AnsiString buftp = Global::asCurrentTexturePath; // zapamiêtanie aktualnej œcie¿ki do tekstur,
// bo bêdzie tyczmasowo zmieniana // bo bêdzie tyczmasowo zmieniana
/* /*
// Ra: niby tak jest lepiej, ale dzia³a gorzej, wiêc przywrócone jest oryginalne // Ra: niby tak jest lepiej, ale dzia³a gorzej, wiêc przywrócone jest oryginalne
//nawet jeœli model bêdzie pobrany z tablicy, to trzeba ustaliæ œcie¿kê dla tekstur //nawet jeœli model bêdzie pobrany z tablicy, to trzeba ustaliæ œcie¿kê dla tekstur

View File

@@ -34,19 +34,23 @@ TMemCell::TMemCell(vector3 *p)
{ {
fValue1 = fValue2 = 0; fValue1 = fValue2 = 0;
szText = new char[256]; // musi byæ dla automatycznie tworzonych komórek dla odcinków szText = new char[256]; // musi byæ dla automatycznie tworzonych komórek dla odcinków
// izolowanych // izolowanych
vPosition = vPosition =
p ? *p : vector3(0, 0, 0); // ustawienie wspó³rzêdnych, bo do TGroundNode nie ma dostêpu p ? *p : vector3(0, 0, 0); // ustawienie wspó³rzêdnych, bo do TGroundNode nie ma dostêpu
bCommand = false; // komenda wys³ana bCommand = false; // komenda wys³ana
OnSent = NULL; OnSent = NULL;
} }
TMemCell::~TMemCell() { SafeDeleteArray(szText); } TMemCell::~TMemCell()
{
SafeDeleteArray(szText);
}
void TMemCell::Init() {} void TMemCell::Init()
{
}
void TMemCell::UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, void TMemCell::UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, int CheckMask)
int CheckMask)
{ {
if (CheckMask & update_memadd) if (CheckMask & update_memadd)
{ // dodawanie wartoœci { // dodawanie wartoœci
@@ -140,8 +144,7 @@ void TMemCell::PutCommand(TController *Mech, vector3 *Loc)
Mech->PutCommand(szText, fValue1, fValue2, Loc); Mech->PutCommand(szText, fValue1, fValue2, Loc);
} }
bool TMemCell::Compare(char *szTestText, double fTestValue1, double fTestValue2, bool TMemCell::Compare(char *szTestText, double fTestValue1, double fTestValue2, int CheckMask)
int CheckMask)
{ // porównanie zawartoœci komórki pamiêci z podanymi wartoœciami { // porównanie zawartoœci komórki pamiêci z podanymi wartoœciami
if (TestFlag(CheckMask, conditional_memstring)) if (TestFlag(CheckMask, conditional_memstring))
{ // porównaæ teksty { // porównaæ teksty
@@ -161,7 +164,10 @@ bool TMemCell::Compare(char *szTestText, double fTestValue1, double fTestValue2,
(!TestFlag(CheckMask, conditional_memval2) || (fValue2 == fTestValue2))); (!TestFlag(CheckMask, conditional_memval2) || (fValue2 == fTestValue2)));
}; };
bool TMemCell::Render() { return true; } bool TMemCell::Render()
{
return true;
}
bool TMemCell::IsVelocity() bool TMemCell::IsVelocity()
{ // sprawdzenie, czy event odczytu tej komórki ma byæ do skanowania, czy do kolejkowania { // sprawdzenie, czy event odczytu tej komórki ma byæ do skanowania, czy do kolejkowania

View File

@@ -30,19 +30,35 @@ class TMemCell
TMemCell(vector3 *p); TMemCell(vector3 *p);
~TMemCell(); ~TMemCell();
void Init(); void Init();
void UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, void UpdateValues(char *szNewText, double fNewValue1, double fNewValue2, int CheckMask);
int CheckMask);
bool Load(cParser *parser); bool Load(cParser *parser);
void PutCommand(TController *Mech, vector3 *Loc); void PutCommand(TController *Mech, vector3 *Loc);
bool Compare(char *szTestText, double fTestValue1, double fTestValue2, bool Compare(char *szTestText, double fTestValue1, double fTestValue2, int CheckMask);
int CheckMask);
bool Render(); bool Render();
inline char *__fastcall Text() { return szText; }; inline char *__fastcall Text()
inline double Value1() { return fValue1; }; {
inline double Value2() { return fValue2; }; return szText;
inline vector3 Position() { return vPosition; }; };
inline TCommandType Command() { return eCommand; }; inline double Value1()
inline bool StopCommand() { return bCommand; }; {
return fValue1;
};
inline double Value2()
{
return fValue2;
};
inline vector3 Position()
{
return vPosition;
};
inline TCommandType Command()
{
return eCommand;
};
inline bool StopCommand()
{
return bCommand;
};
void StopCommandSent(); void StopCommandSent();
TCommandType CommandCheck(); TCommandType CommandCheck();
bool IsVelocity(); bool IsVelocity();

View File

@@ -178,8 +178,7 @@ void TSubModel::NameSet(const char *n)
// int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX // int TSubModel::SeekFaceNormal(DWORD *Masks, int f,DWORD dwMask,vector3 *pt,GLVERTEX
// *Vertices) // *Vertices)
int TSubModel::SeekFaceNormal(DWORD *Masks, int f, DWORD dwMask, float3 *pt, int TSubModel::SeekFaceNormal(DWORD *Masks, int f, DWORD dwMask, float3 *pt, float8 *Vertices)
float8 *Vertices)
{ // szukanie punktu stycznego do (pt), zwraca numer wierzcho³ka, a nie trójk¹ta { // szukanie punktu stycznego do (pt), zwraca numer wierzcho³ka, a nie trójk¹ta
int iNumFaces = iNumVerts / 3; // bo maska powierzchni jest jedna na trójk¹t int iNumFaces = iNumVerts / 3; // bo maska powierzchni jest jedna na trójk¹t
// GLVERTEX *p; //roboczy wskaŸnik // GLVERTEX *p; //roboczy wskaŸnik
@@ -458,7 +457,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
parser.getToken(token); parser.getToken(token);
if (token[0] == '*') if (token[0] == '*')
{ // jeœli pierwszy znak jest gwiazdk¹, poszukaæ submodelu o nazwie bez tej gwiazdki i wzi¹æ { // jeœli pierwszy znak jest gwiazdk¹, poszukaæ submodelu o nazwie bez tej gwiazdki i wzi¹æ
// z niego wierzcho³ki // z niego wierzcho³ki
Error("Verticles reference not yet supported!"); Error("Verticles reference not yet supported!");
} }
else else
@@ -476,7 +475,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
Vertices = new float8[iNumVerts]; Vertices = new float8[iNumVerts];
iNumFaces = iNumVerts / 3; iNumFaces = iNumVerts / 3;
sg = new DWORD[iNumFaces]; // maski powierzchni: 0 oznacza brak u¿redniania wektorów sg = new DWORD[iNumFaces]; // maski powierzchni: 0 oznacza brak u¿redniania wektorów
// normalnych // normalnych
int *wsp = new int[iNumVerts]; // z którego wierzcho³ka kopiowaæ wektor normalny int *wsp = new int[iNumVerts]; // z którego wierzcho³ka kopiowaæ wektor normalny
int maska = 0; int maska = 0;
for (int i = 0; i < iNumVerts; i++) for (int i = 0; i < iNumVerts; i++)
@@ -484,10 +483,10 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
wsp[i] = -1; // wektory normalne nie s¹ policzone dla tego wierzcho³ka wsp[i] = -1; // wektory normalne nie s¹ policzone dla tego wierzcho³ka
if ((i % 3) == 0) if ((i % 3) == 0)
{ // jeœli bêdzie maska -1, to dalej bêd¹ wierzcho³ki z wektorami normalnymi, { // jeœli bêdzie maska -1, to dalej bêd¹ wierzcho³ki z wektorami normalnymi,
// podanymi jawnie // podanymi jawnie
parser.getToken(maska); // maska powierzchni trójk¹ta parser.getToken(maska); // maska powierzchni trójk¹ta
sg[i / 3] = (maska == -1) ? 0 : maska; // dla maski -1 bêdzie 0, czyli nie sg[i / 3] = (maska == -1) ? 0 : maska; // dla maski -1 bêdzie 0, czyli nie
// ma wspólnych wektorów normalnych // ma wspólnych wektorów normalnych
} }
parser.getToken(Vertices[i].Point.x); parser.getToken(Vertices[i].Point.x);
parser.getToken(Vertices[i].Point.y); parser.getToken(Vertices[i].Point.y);
@@ -514,14 +513,14 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
AnsiString(pName) + "\", verticle " + AnsiString(i)); AnsiString(pName) + "\", verticle " + AnsiString(i));
} }
if (i > 0) // jeœli pierwszy trójk¹t bêdzie zdegenerowany, to zostanie if (i > 0) // jeœli pierwszy trójk¹t bêdzie zdegenerowany, to zostanie
// usuniêty i nie ma co sprawdzaæ // usuniêty i nie ma co sprawdzaæ
if (((Vertices[i].Point - Vertices[i - 1].Point).Length() > 1000.0) || if (((Vertices[i].Point - Vertices[i - 1].Point).Length() > 1000.0) ||
((Vertices[i - 1].Point - Vertices[i - 2].Point).Length() > ((Vertices[i - 1].Point - Vertices[i - 2].Point).Length() >
1000.0) || 1000.0) ||
((Vertices[i - 2].Point - Vertices[i].Point).Length() > 1000.0)) ((Vertices[i - 2].Point - Vertices[i].Point).Length() > 1000.0))
{ // je¿eli s¹ dalej ni¿ 2km od siebie //Ra 15-01: obiekt wstawiany nie { // je¿eli s¹ dalej ni¿ 2km od siebie //Ra 15-01: obiekt wstawiany nie
// powinien byæ wiêkszy ni¿ 300m (trójk¹ty terenu w E3D mog¹ mieæ // powinien byæ wiêkszy ni¿ 300m (trójk¹ty terenu w E3D mog¹ mieæ
// 1.5km) // 1.5km)
--iNumFaces; // o jeden trójk¹t mniej --iNumFaces; // o jeden trójk¹t mniej
iNumVerts -= 3; // czyli o 3 wierzcho³ki iNumVerts -= 3; // czyli o 3 wierzcho³ki
i -= 3; // wczytanie kolejnego w to miejsce i -= 3; // wczytanie kolejnego w to miejsce
@@ -533,7 +532,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
int i; // indeks dla trójk¹tów int i; // indeks dla trójk¹tów
float3 *n = new float3[iNumFaces]; // tablica wektorów normalnych dla trójk¹tów float3 *n = new float3[iNumFaces]; // tablica wektorów normalnych dla trójk¹tów
for (i = 0; i < iNumFaces; i++) // pêtla po trójk¹tach - bêdzie szybciej, jak for (i = 0; i < iNumFaces; i++) // pêtla po trójk¹tach - bêdzie szybciej, jak
// wstêpnie przeliczymy normalne trójk¹tów // wstêpnie przeliczymy normalne trójk¹tów
n[i] = SafeNormalize( n[i] = SafeNormalize(
CrossProduct(Vertices[i * 3].Point - Vertices[i * 3 + 1].Point, CrossProduct(Vertices[i * 3].Point - Vertices[i * 3 + 1].Point,
Vertices[i * 3].Point - Vertices[i * 3 + 2].Point)); Vertices[i * 3].Point - Vertices[i * 3 + 2].Point));
@@ -554,7 +553,7 @@ int TSubModel::Load(cParser &parser, TModel3d *Model, int Pos, bool dynamic)
while (f >= 0) while (f >= 0)
{ // sumowanie z wektorem normalnym s¹siada (w³¹cznie ze sob¹) { // sumowanie z wektorem normalnym s¹siada (w³¹cznie ze sob¹)
wsp[f] = v; // informacja, ¿e w tym wierzcho³ku jest ju¿ policzony wsp[f] = v; // informacja, ¿e w tym wierzcho³ku jest ju¿ policzony
// wektor normalny // wektor normalny
norm += n[f / 3]; norm += n[f / 3];
f = SeekFaceNormal(sg, f / 3 + 1, sg[i], &Vertices[v].Point, f = SeekFaceNormal(sg, f / 3 + 1, sg[i], &Vertices[v].Point,
Vertices); // i szukanie od kolejnego trójk¹ta Vertices); // i szukanie od kolejnego trójk¹ta
@@ -776,7 +775,7 @@ void TSubModel::InitialRotate(bool doit)
(*mat)(3)[0] = (*mat)(3)[1] = (*mat)(3)[2] = (*mat)(3)[0] = (*mat)(3)[1] = (*mat)(3)[2] =
0.0; // zerujemy przesuniêcie przed obracaniem normalnych 0.0; // zerujemy przesuniêcie przed obracaniem normalnych
if (eType != TP_STARS) // gwiazdki maj¹ kolory zamiast normalnych, to ich wtedy if (eType != TP_STARS) // gwiazdki maj¹ kolory zamiast normalnych, to ich wtedy
// nie ruszamy // nie ruszamy
for (int i = 0; i < iNumVerts; ++i) for (int i = 0; i < iNumVerts; ++i)
Vertices[i].Normal = SafeNormalize((*mat) * Vertices[i].Normal); Vertices[i].Normal = SafeNormalize((*mat) * Vertices[i].Normal);
} }
@@ -916,7 +915,10 @@ void TSubModel::SetRotateIK1(float3 vNewAngles)
struct ToLower struct ToLower
{ {
char operator()(char input) { return tolower(input); } char operator()(char input)
{
return tolower(input);
}
}; };
TSubModel *__fastcall TSubModel::GetFromName(AnsiString search, bool i) TSubModel *__fastcall TSubModel::GetFromName(AnsiString search, bool i)
@@ -1003,7 +1005,7 @@ void TSubModel::RaAnimation(TAnimType a)
case at_Billboard: // obrót w pionie do kamery case at_Billboard: // obrót w pionie do kamery
{ {
matrix4x4 mat; // potrzebujemy wspó³rzêdne przesuniêcia œrodka uk³adu wspó³rzêdnych matrix4x4 mat; // potrzebujemy wspó³rzêdne przesuniêcia œrodka uk³adu wspó³rzêdnych
// submodelu // submodelu
glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray()); // pobranie aktualnej matrycy glGetDoublev(GL_MODELVIEW_MATRIX, mat.getArray()); // pobranie aktualnej matrycy
float3 gdzie = float3(mat[3][0], mat[3][1], float3 gdzie = float3(mat[3][0], mat[3][1],
mat[3][2]); // pocz¹tek uk³adu wspó³rzêdnych submodelu wzglêdem kamery mat[3][2]); // pocz¹tek uk³adu wspó³rzêdnych submodelu wzglêdem kamery
@@ -1092,7 +1094,7 @@ void TSubModel::RenderDL()
{ {
double Distdimm = 1.0; double Distdimm = 1.0;
if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasnoœæ miêdzy Hotspot a if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasnoœæ miêdzy Hotspot a
// Falloff // Falloff
if (fCosFalloffAngle < fCosHotspotAngle) if (fCosFalloffAngle < fCosHotspotAngle)
Distdimm = 1.0 - Distdimm = 1.0 -
(fCosHotspotAngle - fCosViewAngle) / (fCosHotspotAngle - fCosViewAngle) /
@@ -1188,9 +1190,9 @@ void TSubModel::RenderAlphaDL()
char c; char c;
if (!smLetter) if (!smLetter)
{ // jeœli nie ma tablicy, to j¹ stworzyæ; miejsce nieodpowiednie, ale tymczasowo { // jeœli nie ma tablicy, to j¹ stworzyæ; miejsce nieodpowiednie, ale tymczasowo
// mo¿e byæ // mo¿e byæ
smLetter = new TSubModel *[256]; // tablica wskaŸników submodeli dla smLetter = new TSubModel *[256]; // tablica wskaŸników submodeli dla
// wyœwietlania tekstu // wyœwietlania tekstu
ZeroMemory(smLetter, 256 * sizeof(TSubModel *)); // wype³nianie zerami ZeroMemory(smLetter, 256 * sizeof(TSubModel *)); // wype³nianie zerami
p = Child; p = Child;
while (p) while (p)
@@ -1270,7 +1272,7 @@ void TSubModel::RenderVBO()
{ {
double Distdimm = 1.0; double Distdimm = 1.0;
if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasnoœæ miêdzy Hotspot a if (fCosViewAngle < fCosHotspotAngle) // zmniejszona jasnoœæ miêdzy Hotspot a
// Falloff // Falloff
if (fCosFalloffAngle < fCosHotspotAngle) if (fCosFalloffAngle < fCosHotspotAngle)
Distdimm = 1.0 - Distdimm = 1.0 -
(fCosHotspotAngle - fCosViewAngle) / (fCosHotspotAngle - fCosViewAngle) /
@@ -1523,8 +1525,8 @@ void TSubModel::InfoSet(TSubModelInfo *info)
pTexture = pName = NULL; pTexture = pName = NULL;
}; };
void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TStringPack *n,
TStringPack *n, bool dynamic) bool dynamic)
{ // ustawienie wskaŸników w submodelu { // ustawienie wskaŸników w submodelu
iVisible = 1; // tymczasowo u¿ywane iVisible = 1; // tymczasowo u¿ywane
Child = ((int)Child > 0) ? s + (int)Child : NULL; // zerowy nie mo¿e byæ potomnym Child = ((int)Child > 0) ? s + (int)Child : NULL; // zerowy nie mo¿e byæ potomnym
@@ -1539,7 +1541,7 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t,
{ // jeœli dany submodel jest zgaszonym œwiat³em, to domyœlnie go ukrywamy { // jeœli dany submodel jest zgaszonym œwiat³em, to domyœlnie go ukrywamy
if (s.SubString(1, 8) == "Light_On") // jeœli jest œwiat³em numerowanym if (s.SubString(1, 8) == "Light_On") // jeœli jest œwiat³em numerowanym
iVisible = 0; // to domyœlnie wy³¹czyæ, ¿eby siê nie nak³ada³o z obiektem iVisible = 0; // to domyœlnie wy³¹czyæ, ¿eby siê nie nak³ada³o z obiektem
// "Light_Off" // "Light_Off"
else if (dynamic) // inaczej wy³¹cza³o smugê w latarniach else if (dynamic) // inaczej wy³¹cza³o smugê w latarniach
if (s.SubString(s.Length() - 2, 3) == if (s.SubString(s.Length() - 2, 3) ==
"_on") // jeœli jest kontrolk¹ w stanie zapalonym "_on") // jeœli jest kontrolk¹ w stanie zapalonym
@@ -1783,12 +1785,12 @@ void TModel3d::LoadFromBinFile(char *FileName, bool dynamic)
case 'SUB0': // submodele: 'SUB0',len,(256 bajtów na submodel) case 'SUB0': // submodele: 'SUB0',len,(256 bajtów na submodel)
iSubModelsCount = (k - 2) / 64; iSubModelsCount = (k - 2) / 64;
Root = (TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy Root = (TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy
// póŸniej // póŸniej
break; break;
case 'SUB1': // submodele: 'SUB1',len,(320 bajtów na submodel) case 'SUB1': // submodele: 'SUB1',len,(320 bajtów na submodel)
iSubModelsCount = (k - 2) / 80; iSubModelsCount = (k - 2) / 80;
Root = (TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy Root = (TSubModel *)(iModel + i + 2); // numery na wskaŸniki przetworzymy
// póŸniej // póŸniej
for (ch = 1; ch < iSubModelsCount; for (ch = 1; ch < iSubModelsCount;
++ch) // trzeba przesun¹æ bli¿ej, bo 256 wystarczy ++ch) // trzeba przesun¹æ bli¿ej, bo 256 wystarczy
MoveMemory(((char *)Root) + 256 * ch, ((char *)Root) + 320 * ch, 256); MoveMemory(((char *)Root) + 256 * ch, ((char *)Root) + 320 * ch, 256);
@@ -1909,7 +1911,7 @@ void TModel3d::Init()
if (Global::fDistanceFactor != if (Global::fDistanceFactor !=
1.0) // trochê zaoszczêdzi czasu na modelach z wieloma submocelami 1.0) // trochê zaoszczêdzi czasu na modelach z wieloma submocelami
Root->AdjustDist(); // aktualizacja odleg³oœci faz LoD, zale¿nie od rozdzielczoœci Root->AdjustDist(); // aktualizacja odleg³oœci faz LoD, zale¿nie od rozdzielczoœci
// pionowej oraz multisamplingu // pionowej oraz multisamplingu
if (Global::bUseVBO) if (Global::bUseVBO)
{ {
if (!m_pVNT) // jeœli nie ma jeszcze tablicy (wczytano z pliku tekstowego) if (!m_pVNT) // jeœli nie ma jeszcze tablicy (wczytano z pliku tekstowego)
@@ -2019,7 +2021,10 @@ void TModel3d::SaveToBinFile(char *FileName)
delete[] info; delete[] info;
}; };
void TModel3d::BreakHierarhy() { Error("Not implemented yet :("); }; void TModel3d::BreakHierarhy()
{
Error("Not implemented yet :(");
};
/* /*
void TModel3d::Render(vector3 pPosition,double fAngle,GLuint ReplacableSkinId,int iAlpha) void TModel3d::Render(vector3 pPosition,double fAngle,GLuint ReplacableSkinId,int iAlpha)
@@ -2122,8 +2127,7 @@ void TModel3d::RaRender(double fSquareDistance, GLuint *ReplacableSkinId, int iA
} }
}; };
void TModel3d::RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, void TModel3d::RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId, int iAlpha)
int iAlpha)
{ // renderowanie specjalne, np. kabiny { // renderowanie specjalne, np. kabiny
if (iAlpha & iFlags & 0x2F2F002F) // czy w ogóle jest co robiæ w tym cyklu? if (iAlpha & iFlags & 0x2F2F002F) // czy w ogóle jest co robiæ w tym cyklu?
{ {
@@ -2159,8 +2163,7 @@ iAlpha)
// 2011-03-16 cztery nowe funkcje renderowania z mo¿liwoœci¹ pochylania obiektów // 2011-03-16 cztery nowe funkcje renderowania z mo¿liwoœci¹ pochylania obiektów
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void TModel3d::Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, void TModel3d::Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, int iAlpha)
int iAlpha)
{ // nieprzezroczyste, Display List { // nieprzezroczyste, Display List
glPushMatrix(); glPushMatrix();
glTranslated(vPosition->x, vPosition->y, vPosition->z); glTranslated(vPosition->x, vPosition->y, vPosition->z);
@@ -2178,7 +2181,7 @@ void TModel3d::Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSki
glPopMatrix(); glPopMatrix();
}; };
void TModel3d::RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, void TModel3d::RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId,
int iAlpha) int iAlpha)
{ // przezroczyste, Display List { // przezroczyste, Display List
glPushMatrix(); glPushMatrix();
glTranslated(vPosition->x, vPosition->y, vPosition->z); glTranslated(vPosition->x, vPosition->y, vPosition->z);
@@ -2194,8 +2197,7 @@ void TModel3d::RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *Replacab
Root->RenderAlphaDL(); Root->RenderAlphaDL();
glPopMatrix(); glPopMatrix();
}; };
void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId, int iAlpha)
int iAlpha)
{ // nieprzezroczyste, VBO { // nieprzezroczyste, VBO
glPushMatrix(); glPushMatrix();
glTranslated(vPosition->x, vPosition->y, vPosition->z); glTranslated(vPosition->x, vPosition->y, vPosition->z);
@@ -2215,8 +2217,8 @@ void TModel3d::RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableS
} }
glPopMatrix(); glPopMatrix();
}; };
void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, void TModel3d::RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId,
GLuint *ReplacableSkinId, int iAlpha) int iAlpha)
{ // przezroczyste, VBO { // przezroczyste, VBO
glPushMatrix(); glPushMatrix();
glTranslated(vPosition->x, vPosition->y, vPosition->z); glTranslated(vPosition->x, vPosition->y, vPosition->z);
@@ -2280,7 +2282,7 @@ void TModel3d::TerrainRenderVBO(int n)
while (r) while (r)
{ {
if (r->iVisible == n) // tylko jeœli ma byæ widoczny w danej ramce (problem dla if (r->iVisible == n) // tylko jeœli ma byæ widoczny w danej ramce (problem dla
// 0==false) // 0==false)
r->RenderVBO(); // sub kolejne (Next) siê nie wyrenderuj¹ r->RenderVBO(); // sub kolejne (Next) siê nie wyrenderuj¹
r = r->NextGet(); r = r->NextGet();
} }

105
Model3d.h
View File

@@ -36,21 +36,33 @@ class TStringPack
//+8 - tabela indeksów //+8 - tabela indeksów
public: public:
char *String(int n); char *String(int n);
char *StringAt(int n) { return data + 9 + n; }; char *StringAt(int n)
{
return data + 9 + n;
};
TStringPack() TStringPack()
{ {
data = NULL; data = NULL;
index = NULL; index = NULL;
}; };
void Init(char *d) { data = d; }; void Init(char *d)
void InitIndex(int *i) { index = i; }; {
data = d;
};
void InitIndex(int *i)
{
index = i;
};
}; };
class TMaterialColor class TMaterialColor
{ {
public: public:
TMaterialColor(){}; TMaterialColor(){};
TMaterialColor(char V) { r = g = b = V; }; TMaterialColor(char V)
{
r = g = b = V;
};
// TMaterialColor(double R, double G, double B) // TMaterialColor(double R, double G, double B)
TMaterialColor(char R, char G, char B) TMaterialColor(char R, char G, char B)
{ {
@@ -199,7 +211,7 @@ class TSubModel
float fFarDecayRadius; // normalizacja j.w. float fFarDecayRadius; // normalizacja j.w.
float fCosFalloffAngle; // cosinus kąta stożka pod którym widać światło float fCosFalloffAngle; // cosinus kąta stożka pod którym widać światło
float fCosHotspotAngle; // cosinus kąta stożka pod którym widać aureolę i zwiększone natężenie float fCosHotspotAngle; // cosinus kąta stożka pod którym widać aureolę i zwiększone natężenie
// światła // światła
float fCosViewAngle; // cos kata pod jakim sie teraz patrzy float fCosViewAngle; // cos kata pod jakim sie teraz patrzy
// Ra: dalej są zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy // Ra: dalej są zmienne robocze, można je przestawiać z zachowaniem rozmiaru klasy
int TextureID; // numer tekstury, -1 wymienna, 0 brak int TextureID; // numer tekstury, -1 wymienna, 0 brak
@@ -250,8 +262,14 @@ class TSubModel
int Load(cParser &Parser, TModel3d *Model, int Pos, bool dynamic); int Load(cParser &Parser, TModel3d *Model, int Pos, bool dynamic);
void ChildAdd(TSubModel *SubModel); void ChildAdd(TSubModel *SubModel);
void NextAdd(TSubModel *SubModel); void NextAdd(TSubModel *SubModel);
TSubModel *__fastcall NextGet() { return Next; }; TSubModel *__fastcall NextGet()
TSubModel *__fastcall ChildGet() { return Child; }; {
return Next;
};
TSubModel *__fastcall ChildGet()
{
return Child;
};
int TriangleAdd(TModel3d *m, int tex, int tri); int TriangleAdd(TModel3d *m, int tex, int tri);
float8 *__fastcall TrianglePtr(int tex, int pos, int *la, int *ld, int *ls); float8 *__fastcall TrianglePtr(int tex, int pos, int *la, int *ld, int *ls);
// float8* TrianglePtr(const char *tex,int tri); // float8* TrianglePtr(const char *tex,int tri);
@@ -269,9 +287,15 @@ class TSubModel
void RenderVBO(); void RenderVBO();
void RenderAlphaVBO(); void RenderAlphaVBO();
// inline matrix4x4* GetMatrix() {return dMatrix;}; // inline matrix4x4* GetMatrix() {return dMatrix;};
inline float4x4 *__fastcall GetMatrix() { return fMatrix; }; inline float4x4 *__fastcall GetMatrix()
{
return fMatrix;
};
// matrix4x4* GetTransform() {return Matrix;}; // matrix4x4* GetTransform() {return Matrix;};
inline void Hide() { iVisible = 0; }; inline void Hide()
{
iVisible = 0;
};
void RaArrayFill(CVertNormTex *Vert); void RaArrayFill(CVertNormTex *Vert);
// void Render(); // void Render();
int FlagsCheck(); int FlagsCheck();
@@ -284,8 +308,8 @@ class TSubModel
void DisplayLists(); void DisplayLists();
void Info(); void Info();
void InfoSet(TSubModelInfo *info); void InfoSet(TSubModelInfo *info);
void BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, void BinInit(TSubModel *s, float4x4 *m, float8 *v, TStringPack *t, TStringPack *n = NULL,
TStringPack *n = NULL, bool dynamic = false); bool dynamic = false);
void ReplacableSet(GLuint *r, int a) void ReplacableSet(GLuint *r, int a)
{ {
ReplacableSkinId = r; ReplacableSkinId = r;
@@ -294,8 +318,14 @@ class TSubModel
void TextureNameSet(const char *n); void TextureNameSet(const char *n);
void NameSet(const char *n); void NameSet(const char *n);
// Ra: funkcje do budowania terenu z E3D // Ra: funkcje do budowania terenu z E3D
int Flags() { return iFlags; }; int Flags()
void UnFlagNext() { iFlags &= 0x00FFFFFF; }; {
return iFlags;
};
void UnFlagNext()
{
iFlags &= 0x00FFFFFF;
};
void ColorsSet(int *a, int *d, int *s); void ColorsSet(int *a, int *d, int *s);
inline float3 Translation1Get() inline float3 Translation1Get()
{ {
@@ -356,7 +386,10 @@ class TModel3d : public CMesh
int iSubModelsCount; // Ra: używane do tworzenia binarnych int iSubModelsCount; // Ra: używane do tworzenia binarnych
AnsiString asBinary; // nazwa pod którą zapisać model binarny AnsiString asBinary; // nazwa pod którą zapisać model binarny
public: public:
inline TSubModel *__fastcall GetSMRoot() { return (Root); }; inline TSubModel *__fastcall GetSMRoot()
{
return (Root);
};
// double Radius; //Ra: nie używane // double Radius; //Ra: nie używane
TModel3d(); TModel3d();
TModel3d(char *FileName); TModel3d(char *FileName);
@@ -371,36 +404,40 @@ class TModel3d : public CMesh
void SaveToBinFile(char *FileName); void SaveToBinFile(char *FileName);
void BreakHierarhy(); void BreakHierarhy();
// renderowanie specjalne // renderowanie specjalne
void Render(double fSquareDistance, GLuint *ReplacableSkinId = NULL, void Render(double fSquareDistance, GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
int iAlpha = 0x30300030);
void RenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL, void RenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RaRender(double fSquareDistance, GLuint *ReplacableSkinId = NULL, void RaRender(double fSquareDistance, GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030);
int iAlpha = 0x30300030);
void RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL, void RaRenderAlpha(double fSquareDistance, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
// jeden kąt obrotu // jeden kąt obrotu
void Render(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL, void Render(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RenderAlpha(vector3 pPosition, double fAngle = 0, void RenderAlpha(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RaRender(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL, void RaRender(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RaRenderAlpha(vector3 pPosition, double fAngle = 0, void RaRenderAlpha(vector3 pPosition, double fAngle = 0, GLuint *ReplacableSkinId = NULL,
GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); int iAlpha = 0x30300030);
// trzy kąty obrotu // trzy kąty obrotu
void Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL, void Render(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RenderAlpha(vector3 *vPosition, vector3 *vAngle, void RenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL,
GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL, void RaRender(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL,
int iAlpha = 0x30300030); int iAlpha = 0x30300030);
void RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, void RaRenderAlpha(vector3 *vPosition, vector3 *vAngle, GLuint *ReplacableSkinId = NULL,
GLuint *ReplacableSkinId = NULL, int iAlpha = 0x30300030); int iAlpha = 0x30300030);
// inline int GetSubModelsCount() { return (SubModelsCount); }; // inline int GetSubModelsCount() { return (SubModelsCount); };
int Flags() { return iFlags; }; int Flags()
{
return iFlags;
};
void Init(); void Init();
char *__fastcall NameGet() { return Root ? Root->pName : NULL; }; char *__fastcall NameGet()
{
return Root ? Root->pName : NULL;
};
int TerrainCount(); int TerrainCount();
TSubModel *__fastcall TerrainSquare(int n); TSubModel *__fastcall TerrainSquare(int n);
void TerrainRenderVBO(int n); void TerrainRenderVBO(int n);

View File

@@ -16,9 +16,8 @@ http://mozilla.org/MPL/2.0/.
const dEpsilon = 0.01; // 1cm (zale¿y od typu sprzêgu...) const dEpsilon = 0.01; // 1cm (zale¿y od typu sprzêgu...)
TMoverParameters::TMoverParameters(double VelInitial, AnsiString TypeNameInit, TMoverParameters::TMoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit,
AnsiString NameInit, int LoadInitial, int LoadInitial, AnsiString LoadTypeInitial, int Cab)
AnsiString LoadTypeInitial, int Cab)
: T_MoverParameters(VelInitial, TypeNameInit, NameInit, LoadInitial, LoadTypeInitial, Cab) : T_MoverParameters(VelInitial, TypeNameInit, NameInit, LoadInitial, LoadTypeInitial, Cab)
{ // g³ówny konstruktor { // g³ówny konstruktor
DimHalf.x = 0.5 * Dim.W; // po³owa szerokoœci, OX jest w bok? DimHalf.x = 0.5 * Dim.W; // po³owa szerokoœci, OX jest w bok?
@@ -32,13 +31,13 @@ TMoverParameters::TMoverParameters(double VelInitial, AnsiString TypeNameInit,
}; };
double TMoverParameters::Distance(const TLocation &Loc1, const TLocation &Loc2, double TMoverParameters::Distance(const TLocation &Loc1, const TLocation &Loc2,
const TDimension &Dim1, const TDimension &Dim2) const TDimension &Dim1, const TDimension &Dim2)
{ // zwraca odleg³oœæ pomiêdzy pojazdami (Loc1) i (Loc2) z uwzglêdnieneim ich d³ugoœci (kule!) { // 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); return hypot(Loc2.X - Loc1.X, Loc1.Y - Loc2.Y) - 0.5 * (Dim2.L + Dim1.L);
}; };
double TMoverParameters::Distance(const vector3 &s1, const vector3 &s2, double TMoverParameters::Distance(const vector3 &s1, const vector3 &s2, const vector3 &d1,
const vector3 &d1, const vector3 &d2){ const vector3 &d2){
// obliczenie odleg³oœci prostopad³oœcianów o œrodkach (s1) i (s2) i wymiarach (d1) i (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... // return 0.0; //bêdzie zg³aszaæ warning - funkcja do usuniêcia, chyba ¿e siê przyda...
}; };
@@ -50,9 +49,8 @@ double TMoverParameters::CouplerDist(Byte Coupler)
Couplers[Coupler].Connected->Dim); // odleg³oœæ pomiêdzy sprzêgami (kula!) Couplers[Coupler].Connected->Dim); // odleg³oœæ pomiêdzy sprzêgami (kula!)
}; };
bool TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr, bool TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr, TMoverParameters *ConnectTo,
TMoverParameters *ConnectTo, Byte CouplingType, Byte CouplingType, bool Forced)
bool Forced)
{ //³¹czenie do swojego sprzêgu (ConnectNo) pojazdu (ConnectTo) stron¹ (ConnectToNr) { //³¹czenie do swojego sprzêgu (ConnectNo) pojazdu (ConnectTo) stron¹ (ConnectToNr)
// Ra: zwykle wykonywane dwukrotnie, dla ka¿dego pojazdu oddzielnie // 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 // Ra: trzeba by odró¿niæ wymóg dociœniêcia od uszkodzenia sprzêgu przy podczepianiu AI do
@@ -91,12 +89,11 @@ bool TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr,
} }
} }
return false; // brak pod³¹czanego pojazdu, zbyt du¿a odleg³oœæ, niezgodny typ sprzêgu, brak return false; // brak pod³¹czanego pojazdu, zbyt du¿a odleg³oœæ, niezgodny typ sprzêgu, brak
// sprzêgu, brak haka // sprzêgu, brak haka
}; };
bool TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr, bool TMoverParameters::Attach(Byte ConnectNo, Byte ConnectToNr, T_MoverParameters *ConnectTo,
T_MoverParameters *ConnectTo, Byte CouplingType, Byte CouplingType, bool Forced)
bool Forced)
{ //³¹czenie do (ConnectNo) pojazdu (ConnectTo) stron¹ (ConnectToNr) { //³¹czenie do (ConnectNo) pojazdu (ConnectTo) stron¹ (ConnectToNr)
return Attach(ConnectNo, ConnectToNr, (TMoverParameters *)ConnectTo, CouplingType, Forced); return Attach(ConnectNo, ConnectToNr, (TMoverParameters *)ConnectTo, CouplingType, Forced);
}; };
@@ -139,7 +136,7 @@ bool TMoverParameters::Dettach(Byte ConnectNo)
} }
else if (i > 0) else if (i > 0)
{ // od³¹czamy wê¿e i resztê, pozostaje sprzêg fizyczny, który wymaga dociœniêcia (z wirtualnym { // od³¹czamy wê¿e i resztê, pozostaje sprzêg fizyczny, który wymaga dociœniêcia (z wirtualnym
// nic) // nic)
Couplers[ConnectNo].CouplingFlag &= ctrain_coupler; Couplers[ConnectNo].CouplingFlag &= ctrain_coupler;
Couplers[ConnectNo].Connected->Couplers[Couplers[ConnectNo].ConnectedNr].CouplingFlag = Couplers[ConnectNo].Connected->Couplers[Couplers[ConnectNo].ConnectedNr].CouplingFlag =
Couplers[ConnectNo].CouplingFlag; Couplers[ConnectNo].CouplingFlag;
@@ -196,7 +193,7 @@ void TMoverParameters::BrakeLevelSet(double b)
else if (fBrakeCtrlPos > Handle->GetPos(bh_MAX)) else if (fBrakeCtrlPos > Handle->GetPos(bh_MAX))
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æ int x = floor(fBrakeCtrlPos); // jeœli odwo³ujemy siê do BrakeCtrlPos w poœrednich, to musi byæ
// obciête a nie zaokr¹gone // obciête a nie zaokr¹gone
while ((x > BrakeCtrlPos) && (BrakeCtrlPos < BrakeCtrlPosNo)) // jeœli zwiêkszy³o siê o 1 while ((x > BrakeCtrlPos) && (BrakeCtrlPos < BrakeCtrlPosNo)) // jeœli zwiêkszy³o siê o 1
if (!T_MoverParameters::IncBrakeLevelOld()) if (!T_MoverParameters::IncBrakeLevelOld())
break; // wyjœcie awaryjne break; // wyjœcie awaryjne
@@ -234,10 +231,13 @@ bool TMoverParameters::BrakeLevelAdd(double b)
bool TMoverParameters::IncBrakeLevel() bool TMoverParameters::IncBrakeLevel()
{ // nowa wersja na u¿ytek AI, false gdy osi¹gniêto pozycjê BrakeCtrlPosNo { // nowa wersja na u¿ytek AI, false gdy osi¹gniêto pozycjê BrakeCtrlPosNo
return BrakeLevelAdd(1.0); }; return BrakeLevelAdd(1.0);
};
bool TMoverParameters::DecBrakeLevel() bool TMoverParameters::DecBrakeLevel()
{ return BrakeLevelAdd(-1.0); }; // 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
bool TMoverParameters::ChangeCab(int direction) bool TMoverParameters::ChangeCab(int direction)
{ // zmiana kabiny i resetowanie ustawien { // zmiana kabiny i resetowanie ustawien
@@ -298,7 +298,7 @@ bool TMoverParameters::CurrentSwitch(int direction)
void TMoverParameters::UpdatePantVolume(double dt) void TMoverParameters::UpdatePantVolume(double dt)
{ // KURS90 - sprê¿arka pantografów; Ra 2014-07: teraz jest to zbiornik rozrz¹du, chocia¿ to jeszcze { // KURS90 - sprê¿arka pantografów; Ra 2014-07: teraz jest to zbiornik rozrz¹du, chocia¿ to jeszcze
// nie tak // nie tak
if (EnginePowerSource.SourceType == CurrentCollector) // tylko jeœli pantografuj¹cy if (EnginePowerSource.SourceType == CurrentCollector) // tylko jeœli pantografuj¹cy
{ {
// Ra 2014-07: zasadniczo, to istnieje zbiornik rozrz¹du i zbiornik pantografów - na razie // Ra 2014-07: zasadniczo, to istnieje zbiornik rozrz¹du i zbiornik pantografów - na razie
@@ -310,7 +310,7 @@ void TMoverParameters::UpdatePantVolume(double dt)
if ((TrainType == dt_EZT) ? (PantPress < ScndPipePress) : if ((TrainType == dt_EZT) ? (PantPress < ScndPipePress) :
bPantKurek3) // kurek zamyka po³¹czenie z ZG bPantKurek3) // kurek zamyka po³¹czenie z ZG
{ // zbiornik pantografu po³¹czony ze zbiornikiem g³ównym - ma³¹ sprê¿ark¹ siê tego nie { // zbiornik pantografu po³¹czony ze zbiornikiem g³ównym - ma³¹ sprê¿ark¹ siê tego nie
// napompuje // napompuje
// Ra 2013-12: Niebugoc³aw mówi, ¿e w EZT nie ma potrzeby odcinaæ kurkiem // Ra 2013-12: Niebugoc³aw mówi, ¿e w EZT nie ma potrzeby odcinaæ kurkiem
PantPress = EnginePowerSource.CollectorParameters PantPress = EnginePowerSource.CollectorParameters
.MaxPress; // ograniczenie ciœnienia do MaxPress (tylko w pantografach!) .MaxPress; // ograniczenie ciœnienia do MaxPress (tylko w pantografach!)
@@ -335,7 +335,7 @@ void TMoverParameters::UpdatePantVolume(double dt)
if ((TrainType & (dt_EZT | dt_ET40 | dt_ET41 | dt_ET42)) ? if ((TrainType & (dt_EZT | dt_ET40 | dt_ET41 | dt_ET42)) ?
(GetTrainsetVoltage() < EnginePowerSource.CollectorParameters.MinV) : (GetTrainsetVoltage() < EnginePowerSource.CollectorParameters.MinV) :
true) // to jest trochê proteza; zasilanie cz³onu mo¿e byæ przez sprzêg true) // to jest trochê proteza; zasilanie cz³onu mo¿e byæ przez sprzêg
// WN // WN
if (MainSwitch(false)) if (MainSwitch(false))
EventFlag = true; // wywalenie szybkiego z powodu niskiego ciœnienia EventFlag = true; // wywalenie szybkiego z powodu niskiego ciœnienia
if (TrainType != dt_EZT) // w EN57 pompuje siê tylko w silnikowym if (TrainType != dt_EZT) // w EN57 pompuje siê tylko w silnikowym
@@ -377,7 +377,7 @@ void TMoverParameters::UpdateBatteryVoltage(double dt)
else else
sn3 = 0; sn3 = 0;
if (iLights[0] & 63) // 64=blachy, nie ci¹gn¹ pr¹du //rozpisaæ na poszczególne if (iLights[0] & 63) // 64=blachy, nie ci¹gn¹ pr¹du //rozpisaæ na poszczególne
// ¿arówki... // ¿arówki...
sn4 = dt * 0.003; sn4 = dt * 0.003;
else else
sn4 = 0; sn4 = 0;
@@ -475,9 +475,8 @@ ZN //masa
*/ */
double TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShape &Shape, double TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShape &Shape,
TTrackParam &Track, TTrackParam &Track, TTractionParam &ElectricTraction,
TTractionParam &ElectricTraction, const TLocation &NewLoc, TRotation &NewRot)
const TLocation &NewLoc, TRotation &NewRot)
{ // trzeba po ma³u przenosiæ tu tê funkcjê { // trzeba po ma³u przenosiæ tu tê funkcjê
double d; double d;
T_MoverParameters::ComputeMovement(dt, dt1, Shape, Track, ElectricTraction, NewLoc, NewRot); T_MoverParameters::ComputeMovement(dt, dt1, Shape, Track, ElectricTraction, NewLoc, NewRot);
@@ -554,8 +553,8 @@ double TMoverParameters::ComputeMovement(double dt, double dt1, const TTrackShap
}; };
double TMoverParameters::FastComputeMovement(double dt, const TTrackShape &Shape, double TMoverParameters::FastComputeMovement(double dt, const TTrackShape &Shape,
TTrackParam &Track, const TLocation &NewLoc, TTrackParam &Track, const TLocation &NewLoc,
TRotation &NewRot) TRotation &NewRot)
{ // trzeba po ma³u przenosiæ tu tê funkcjê { // trzeba po ma³u przenosiæ tu tê funkcjê
double d; double d;
T_MoverParameters::FastComputeMovement(dt, Shape, Track, NewLoc, NewRot); T_MoverParameters::FastComputeMovement(dt, Shape, Track, NewLoc, NewRot);

26
Mover.h
View File

@@ -36,7 +36,7 @@ class TMoverParameters : public T_MoverParameters
unsigned char WarningSignal; // tymczasowo 8bit, ze wzglêdu na funkcje w MTools unsigned char WarningSignal; // tymczasowo 8bit, ze wzglêdu na funkcje w MTools
double fBrakeCtrlPos; // p³ynna nastawa hamulca zespolonego double fBrakeCtrlPos; // p³ynna nastawa hamulca zespolonego
bool bPantKurek3; // kurek trójdrogowy (pantografu): true=po³¹czenie z ZG, false=po³¹czenie z bool bPantKurek3; // kurek trójdrogowy (pantografu): true=po³¹czenie z ZG, false=po³¹czenie z
// ma³¹ sprê¿ark¹ // ma³¹ sprê¿ark¹
int iProblem; // flagi problemów z taborem, aby AI nie musia³o porównywaæ; 0=mo¿e jechaæ int iProblem; // flagi problemów z taborem, aby AI nie musia³o porównywaæ; 0=mo¿e jechaæ
int iLights[2]; // bity zapalonych œwiate³ tutaj, ¿eby da³o siê liczyæ pobór pr¹du int iLights[2]; // bity zapalonych œwiate³ tutaj, ¿eby da³o siê liczyæ pobór pr¹du
private: private:
@@ -44,16 +44,16 @@ class TMoverParameters : public T_MoverParameters
public: public:
TMoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit, TMoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit,
int LoadInitial, AnsiString LoadTypeInitial, int Cab); int LoadInitial, AnsiString LoadTypeInitial, int Cab);
// obs³uga sprzêgów // obs³uga sprzêgów
double Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1, double Distance(const TLocation &Loc1, const TLocation &Loc2, const TDimension &Dim1,
const TDimension &Dim2); const TDimension &Dim2);
double Distance(const vector3 &Loc1, const vector3 &Loc2, const vector3 &Dim1, double Distance(const vector3 &Loc1, const vector3 &Loc2, const vector3 &Dim1,
const vector3 &Dim2); const vector3 &Dim2);
bool Attach(Byte ConnectNo, Byte ConnectToNr, TMoverParameters *ConnectTo, bool Attach(Byte ConnectNo, Byte ConnectToNr, TMoverParameters *ConnectTo, Byte CouplingType,
Byte CouplingType, bool Forced = false); bool Forced = false);
bool Attach(Byte ConnectNo, Byte ConnectToNr, T_MoverParameters *ConnectTo, bool Attach(Byte ConnectNo, Byte ConnectToNr, T_MoverParameters *ConnectTo, Byte CouplingType,
Byte CouplingType, bool Forced = false); bool Forced = false);
int DettachStatus(Byte ConnectNo); int DettachStatus(Byte ConnectNo);
bool Dettach(Byte ConnectNo); bool Dettach(Byte ConnectNo);
void SetCoupleDist(); void SetCoupleDist();
@@ -65,11 +65,11 @@ class TMoverParameters : public T_MoverParameters
bool ChangeCab(int direction); bool ChangeCab(int direction);
bool CurrentSwitch(int direction); bool CurrentSwitch(int direction);
void UpdateBatteryVoltage(double dt); void UpdateBatteryVoltage(double dt);
double ComputeMovement(double dt, double dt1, const TTrackShape &Shape, double ComputeMovement(double dt, double dt1, const TTrackShape &Shape, TTrackParam &Track,
TTrackParam &Track, TTractionParam &ElectricTraction, TTractionParam &ElectricTraction, const TLocation &NewLoc,
const TLocation &NewLoc, TRotation &NewRot); TRotation &NewRot);
double FastComputeMovement(double dt, const TTrackShape &Shape, TTrackParam &Track, double FastComputeMovement(double dt, const TTrackShape &Shape, TTrackParam &Track,
const TLocation &NewLoc, TRotation &NewRot); const TLocation &NewLoc, TRotation &NewRot);
double ShowEngineRotation(int VehN); double ShowEngineRotation(int VehN);
// double GetTrainsetVoltage(void); // double GetTrainsetVoltage(void);
// bool Physic_ReActivation(void); // bool Physic_ReActivation(void);
@@ -170,7 +170,7 @@ class TMoverParameters : public T_MoverParameters
// TLocation &NewLoc, TRotation &NewRot); // TLocation &NewLoc, TRotation &NewRot);
// bool ChangeOffsetH(double DeltaOffset); // bool ChangeOffsetH(double DeltaOffset);
//__fastcall T_MoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit, //__fastcall T_MoverParameters(double VelInitial, AnsiString TypeNameInit, AnsiString NameInit,
//int LoadInitial // int LoadInitial
// , AnsiString LoadTypeInitial, int Cab); // , AnsiString LoadTypeInitial, int Cab);
// bool LoadChkFile(AnsiString chkpath); // bool LoadChkFile(AnsiString chkpath);
// bool CheckLocomotiveParameters(bool ReadyFlag, int Dir); // bool CheckLocomotiveParameters(bool ReadyFlag, int Dir);

13
Names.h
View File

@@ -26,8 +26,14 @@ class ItemRecord
// typedef // typedef
void ListGet(ItemRecord *r, int *&n); void ListGet(ItemRecord *r, int *&n);
void TreeAdd(ItemRecord *r, int c); void TreeAdd(ItemRecord *r, int c);
template <typename TOut> inline TOut *DataGet() { return (TOut *)pData; }; template <typename TOut> inline TOut *DataGet()
template <typename TOut> inline void DataSet(TOut *x) { pData = (void *)x; }; {
return (TOut *)pData;
};
template <typename TOut> inline void DataSet(TOut *x)
{
pData = (void *)x;
};
void *__fastcall TreeFind(const char *n); void *__fastcall TreeFind(const char *n);
ItemRecord *__fastcall TreeFindRecord(const char *n); ItemRecord *__fastcall TreeFindRecord(const char *n);
}; };
@@ -46,8 +52,7 @@ class TNames
int Add(int t, const char *n); // dodanie obiektu typu (t) int Add(int t, const char *n); // dodanie obiektu typu (t)
int Add(int t, const char *n, void *d); // dodanie obiektu z wskaŸnikiem int Add(int t, const char *n, void *d); // dodanie obiektu z wskaŸnikiem
int Add(int t, const char *n, int d); // dodanie obiektu z numerem int Add(int t, const char *n, int d); // dodanie obiektu z numerem
bool Update(int t, const char *n, bool Update(int t, const char *n, void *d); // dodanie jeœli nie ma, wymiana (d), gdy jest
void *d); // dodanie jeœli nie ma, wymiana (d), gdy jest
void TreeSet(); void TreeSet();
ItemRecord *__fastcall TreeSet(int *n, int d, int u); ItemRecord *__fastcall TreeSet(int *n, int d, int u);
void Sort(int t); // przebudowa drzewa typu (t) void Sort(int t); // przebudowa drzewa typu (t)

View File

@@ -45,10 +45,12 @@ TRealSound::~TRealSound()
// if (this) if (pSound) pSound->Stop(); // if (this) if (pSound) pSound->Stop();
} }
void TRealSound::Free() {} void TRealSound::Free()
{
}
void TRealSound::Init(char *SoundName, double DistanceAttenuation, double X, double Y, void TRealSound::Init(char *SoundName, double DistanceAttenuation, double X, double Y, double Z,
double Z, bool Dynamic, bool freqmod, double rmin) bool Dynamic, bool freqmod, double rmin)
{ {
// Nazwa=SoundName; //to tak raczej nie zadziała, (SoundName) jest tymczasowe // Nazwa=SoundName; //to tak raczej nie zadziała, (SoundName) jest tymczasowe
pSound = TSoundsManager::GetFromName(SoundName, Dynamic, &fFrequency); pSound = TSoundsManager::GetFromName(SoundName, Dynamic, &fFrequency);
@@ -57,7 +59,7 @@ void TRealSound::Init(char *SoundName, double DistanceAttenuation, double X, dou
if (freqmod) if (freqmod)
if (fFrequency != 22050.0) if (fFrequency != 22050.0)
{ // dla modulowanych nie może być zmiany mnożnika, bo częstotliwość w nagłówku byłą { // dla modulowanych nie może być zmiany mnożnika, bo częstotliwość w nagłówku byłą
// ignorowana, a mogła być inna niż 22050 // ignorowana, a mogła być inna niż 22050
fFrequency = 22050.0; fFrequency = 22050.0;
ErrorLog("Bad sound: " + AnsiString(SoundName) + ErrorLog("Bad sound: " + AnsiString(SoundName) +
", as modulated, should have 22.05kHz in header"); ", as modulated, should have 22.05kHz in header");
@@ -95,8 +97,7 @@ double TRealSound::ListenerDistance(vector3 ListenerPosition)
} }
} }
void TRealSound::Play(double Volume, int Looping, bool ListenerInside, void TRealSound::Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition)
vector3 NewPosition)
{ {
if (!pSound) if (!pSound)
return; return;
@@ -168,7 +169,8 @@ void TRealSound::Play(double Volume, int Looping, bool ListenerInside,
} }
}; };
void TRealSound::Start(){// włączenie dźwięku void TRealSound::Start(){
// włączenie dźwięku
}; };
@@ -185,8 +187,7 @@ void TRealSound::Stop()
} }
}; };
void TRealSound::AdjFreq(double Freq, void TRealSound::AdjFreq(double Freq, double dt) // McZapkie TODO: dorobic tu efekt Dopplera
double dt) // McZapkie TODO: dorobic tu efekt Dopplera
// Freq moze byc liczba dodatnia mniejsza od 1 lub wieksza od 1 // Freq moze byc liczba dodatnia mniejsza od 1 lub wieksza od 1
{ {
float df, Vlist, Vsrc; float df, Vlist, Vsrc;
@@ -223,7 +224,10 @@ double TRealSound::GetWaveTime() // McZapkie: na razie tylko dla 22KHz/8bps
fFrequency; //(pSound->); // wielkosc w bajtach przez czestotliwosc probkowania fFrequency; //(pSound->); // wielkosc w bajtach przez czestotliwosc probkowania
} }
void TRealSound::SetPan(int Pan) { pSound->SetPan(Pan); } void TRealSound::SetPan(int Pan)
{
pSound->SetPan(Pan);
}
int TRealSound::GetStatus() int TRealSound::GetStatus()
{ {
@@ -243,8 +247,8 @@ void TRealSound::ResetPosition()
pSound->SetCurrentPosition(0); pSound->SetCurrentPosition(0);
} }
void TTextSound::Init(char *SoundName, double SoundAttenuation, double X, double Y, void TTextSound::Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z,
double Z, bool Dynamic, bool freqmod, double rmin) bool Dynamic, bool freqmod, double rmin)
{ // dodatkowo doczytuje plik tekstowy { // dodatkowo doczytuje plik tekstowy
TRealSound::Init(SoundName, SoundAttenuation, X, Y, Z, Dynamic, freqmod, rmin); TRealSound::Init(SoundName, SoundAttenuation, X, Y, Z, Dynamic, freqmod, rmin);
fTime = GetWaveTime(); fTime = GetWaveTime();
@@ -264,8 +268,7 @@ void TTextSound::Init(char *SoundName, double SoundAttenuation, double X, double
delete ts; delete ts;
} }
}; };
void TTextSound::Play(double Volume, int Looping, bool ListenerInside, void TTextSound::Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition)
vector3 NewPosition)
{ {
if (!asText.IsEmpty()) if (!asText.IsEmpty())
{ // jeśli ma powiązany tekst { // jeśli ma powiązany tekst

View File

@@ -32,8 +32,8 @@ class TRealSound
TRealSound(); TRealSound();
~TRealSound(); ~TRealSound();
void Free(); void Free();
void Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z, void Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic,
bool Dynamic, bool freqmod = false, double rmin = 0.0); bool freqmod = false, double rmin = 0.0);
double ListenerDistance(vector3 ListenerPosition); double ListenerDistance(vector3 ListenerPosition);
void Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition); void Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition);
void Start(); void Start();
@@ -51,8 +51,8 @@ class TTextSound : public TRealSound
AnsiString asText; AnsiString asText;
float fTime; // czas trwania float fTime; // czas trwania
public: public:
void Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z, void Init(char *SoundName, double SoundAttenuation, double X, double Y, double Z, bool Dynamic,
bool Dynamic, bool freqmod = false, double rmin = 0.0); bool freqmod = false, double rmin = 0.0);
void Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition); void Play(double Volume, int Looping, bool ListenerInside, vector3 NewPosition);
}; };

View File

@@ -17,7 +17,10 @@ double ResourceManager::_expiry = 5.0f;
double ResourceManager::_lastUpdate = 0.0f; double ResourceManager::_lastUpdate = 0.0f;
double ResourceManager::_lastReport = 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) void ResourceManager::Unregister(Resource *resource)
{ {
@@ -33,7 +36,10 @@ class ResourceExpired
{ {
public: public:
ResourceExpired(double time) : _time(time){}; ResourceExpired(double time) : _time(time){};
bool operator()(Resource *resource) { return (resource->GetLastUsage() < _time); } bool operator()(Resource *resource)
{
return (resource->GetLastUsage() < _time);
}
private: private:
double _time; double _time;

View File

@@ -20,10 +20,16 @@ class Resource
public: public:
virtual void Release() = 0; virtual void Release() = 0;
double GetLastUsage() const { return _lastUsage; } double GetLastUsage() const
{
return _lastUsage;
}
protected: protected:
void SetLastUsage(double lastUsage) { _lastUsage = lastUsage; } void SetLastUsage(double lastUsage)
{
_lastUsage = lastUsage;
}
private: private:
double _lastUsage; double _lastUsage;
@@ -37,7 +43,10 @@ class ResourceManager
static void Unregister(Resource *resource); static void Unregister(Resource *resource);
static void Sweep(double currentTime); static void Sweep(double currentTime);
static void SetExpiry(double expiry) { _expiry = expiry; } static void SetExpiry(double expiry)
{
_expiry = expiry;
}
private: private:
typedef std::vector<Resource *> Resources; typedef std::vector<Resource *> Resources;

View File

@@ -41,10 +41,13 @@ TSegment::TSegment(TTrack *owner)
pOwner = owner; pOwner = owner;
}; };
TSegment::~TSegment() { SafeDeleteArray(fTsBuffer); }; TSegment::~TSegment()
{
SafeDeleteArray(fTsBuffer);
};
bool TSegment::Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, bool TSegment::Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, double fNewRoll1,
double fNewRoll1, double fNewRoll2) double fNewRoll2)
{ // wersja dla prostego - wyliczanie punktów kontrolnych { // wersja dla prostego - wyliczanie punktów kontrolnych
vector3 dir; vector3 dir;
if (fNewRoll1 == fNewRoll2) if (fNewRoll1 == fNewRoll2)
@@ -62,8 +65,8 @@ bool TSegment::Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep,
}; };
bool TSegment::Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointIn, bool TSegment::Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointIn,
vector3 &NewPoint2, double fNewStep, double fNewRoll1, vector3 &NewPoint2, double fNewStep, double fNewRoll1, double fNewRoll2,
double fNewRoll2, bool bIsCurve) bool bIsCurve)
{ // wersja uniwersalna (dla krzywej i prostego) { // wersja uniwersalna (dla krzywej i prostego)
Point1 = NewPoint1; Point1 = NewPoint1;
CPointOut = NewCPointOut; CPointOut = NewCPointOut;
@@ -329,9 +332,8 @@ vector3 TSegment::FastGetPoint(double t)
return (bCurve ? RaInterpolate(t) : ((1.0 - t) * Point1 + (t)*Point2)); return (bCurve ? RaInterpolate(t) : ((1.0 - t) * Point1 + (t)*Point2));
} }
void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, double fTextureLength,
double fTextureLength, int iSkip, int iQualityFactor, int iSkip, int iQualityFactor, vector3 **p, bool bRender)
vector3 **p, bool bRender)
{ // generowanie trójkątów dla odcinka trajektorii ruchu { // generowanie trójkątów dla odcinka trajektorii ruchu
// standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku // standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku
// po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli // po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli
@@ -401,7 +403,7 @@ void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints,
pt.y += jmm1 * ShapePoints[j].y + m1 * ShapePoints[j + iNumShapePoints].y; pt.y += jmm1 * ShapePoints[j].y + m1 * ShapePoints[j + iNumShapePoints].y;
if (bRender) if (bRender)
{ // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale { // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale
// potrzebować punktów // potrzebować punktów
glNormal3f(norm.x, norm.y, norm.z); glNormal3f(norm.x, norm.y, norm.z);
glTexCoord2f( glTexCoord2f(
jmm1 * ShapePoints[j].z + m1 * ShapePoints[j + iNumShapePoints].z, tv1); jmm1 * ShapePoints[j].z + m1 * ShapePoints[j + iNumShapePoints].z, tv1);
@@ -424,7 +426,7 @@ void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints,
pt.y += jmm2 * ShapePoints[j].y + m2 * ShapePoints[j + iNumShapePoints].y; pt.y += jmm2 * ShapePoints[j].y + m2 * ShapePoints[j + iNumShapePoints].y;
if (bRender) if (bRender)
{ // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale { // skrzyżowania podczas łączenia siatek mogą nie renderować poboczy, ale
// potrzebować punktów // potrzebować punktów
glNormal3f(norm.x, norm.y, norm.z); glNormal3f(norm.x, norm.y, norm.z);
glTexCoord2f( glTexCoord2f(
jmm2 * ShapePoints[j].z + m2 * ShapePoints[j + iNumShapePoints].z, tv2); jmm2 * ShapePoints[j].z + m2 * ShapePoints[j + iNumShapePoints].z, tv2);
@@ -511,8 +513,8 @@ void TSegment::RenderLoft(const vector6 *ShapePoints, int iNumShapePoints,
}; };
void TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *ShapePoints2, void TSegment::RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *ShapePoints2,
int iNumShapePoints, double fTextureLength, int iSkip, int iNumShapePoints, double fTextureLength, int iSkip,
double fOffsetX) double fOffsetX)
{ // tworzenie siatki trójkątów dla iglicy { // tworzenie siatki trójkątów dla iglicy
vector3 pos1, pos2, dir, parallel1, parallel2, pt; vector3 pos1, pos2, dir, parallel1, parallel2, pt;
double a1, a2, s, step, offset, tv1, tv2, t, t2, t2step, oldt2, sp, oldsp; double a1, a2, s, step, offset, tv1, tv2, t, t2, t2step, oldt2, sp, oldsp;
@@ -696,9 +698,8 @@ void TSegment::Render()
} }
} }
void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints,
int iNumShapePoints, double fTextureLength, int iSkip, double fTextureLength, int iSkip, int iEnd, double fOffsetX)
int iEnd, double fOffsetX)
{ // generowanie trójkątów dla odcinka trajektorii ruchu { // generowanie trójkątów dla odcinka trajektorii ruchu
// standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku // standardowo tworzy triangle_strip dla prostego albo ich zestaw dla łuku
// po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli // po modyfikacji - dla ujemnego (iNumShapePoints) w dodatkowych polach tabeli
@@ -896,9 +897,8 @@ void TSegment::RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints,
} }
}; };
void TSegment::RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, void TSegment::RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints,
int iNumShapePoints, double fTextureLength, int iSkip, int iEnd, double fTextureLength, int iSkip, int iEnd, double fOffsetX)
double fOffsetX)
{ // jak wyżej, tylko z pominięciem mapowania i braku trapezowania { // jak wyżej, tylko z pominięciem mapowania i braku trapezowania
vector3 pos1, pos2, dir, parallel1, parallel2, pt; vector3 pos1, pos2, dir, parallel1, parallel2, pt;
double s, step, fOffset, t, fEnd; double s, step, fOffset, t, fEnd;

View File

@@ -77,22 +77,36 @@ class TSegment
// (0-Bezier,1-prosty,2/3-³uk w lewo/prawo,6/7-przejœciowa w lewo/prawo) // (0-Bezier,1-prosty,2/3-³uk w lewo/prawo,6/7-przejœciowa w lewo/prawo)
TSegment(TTrack *owner); TSegment(TTrack *owner);
~TSegment(); ~TSegment();
bool Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, bool Init(vector3 NewPoint1, vector3 NewPoint2, double fNewStep, double fNewRoll1 = 0,
double fNewRoll1 = 0, double fNewRoll2 = 0); double fNewRoll2 = 0);
bool Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointIn, bool Init(vector3 &NewPoint1, vector3 NewCPointOut, vector3 NewCPointIn, vector3 &NewPoint2,
vector3 &NewPoint2, double fNewStep, double fNewRoll1 = 0, double fNewStep, double fNewRoll1 = 0, double fNewRoll2 = 0, bool bIsCurve = true);
double fNewRoll2 = 0, bool bIsCurve = true);
inline double ComputeLength(); // McZapkie-150503 inline double ComputeLength(); // McZapkie-150503
inline vector3 GetDirection1() { return bCurve ? CPointOut - Point1 : CPointOut; }; inline vector3 GetDirection1()
inline vector3 GetDirection2() { return bCurve ? CPointIn - Point2 : CPointIn; }; {
return bCurve ? CPointOut - Point1 : CPointOut;
};
inline vector3 GetDirection2()
{
return bCurve ? CPointIn - Point2 : CPointIn;
};
vector3 GetDirection(double fDistance); vector3 GetDirection(double fDistance);
vector3 GetDirection() { return CPointOut; }; vector3 GetDirection()
{
return CPointOut;
};
vector3 FastGetDirection(double fDistance, double fOffset); vector3 FastGetDirection(double fDistance, double fOffset);
vector3 GetPoint(double fDistance); vector3 GetPoint(double fDistance);
void RaPositionGet(double fDistance, vector3 &p, vector3 &a); void RaPositionGet(double fDistance, vector3 &p, vector3 &a);
vector3 FastGetPoint(double t); vector3 FastGetPoint(double t);
inline vector3 FastGetPoint_0() { return Point1; }; inline vector3 FastGetPoint_0()
inline vector3 FastGetPoint_1() { return Point2; }; {
return Point1;
};
inline vector3 FastGetPoint_1()
{
return Point2;
};
inline double GetRoll(double s) inline double GetRoll(double s)
{ {
s /= fLength; s /= fLength;
@@ -103,14 +117,16 @@ class TSegment
r1 = fRoll1; r1 = fRoll1;
r2 = fRoll2; r2 = fRoll2;
} }
void RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, void RenderLoft(const vector6 *ShapePoints, int iNumShapePoints, double fTextureLength,
double fTextureLength, int iSkip = 0, int iQualityFactor = 1, int iSkip = 0, int iQualityFactor = 1, vector3 **p = NULL, bool bRender = true);
vector3 **p = NULL, bool bRender = true);
void RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *ShapePoints2, void RenderSwitchRail(const vector6 *ShapePoints1, const vector6 *ShapePoints2,
int iNumShapePoints, double fTextureLength, int iSkip = 0, int iNumShapePoints, double fTextureLength, int iSkip = 0,
double fOffsetX = 0.0f); double fOffsetX = 0.0f);
void Render(); void Render();
inline double GetLength() { return fLength; }; inline double GetLength()
{
return fLength;
};
void MoveMe(vector3 pPosition) void MoveMe(vector3 pPosition)
{ {
Point1 += pPosition; Point1 += pPosition;
@@ -121,14 +137,18 @@ class TSegment
CPointOut += pPosition; CPointOut += pPosition;
} }
} }
int RaSegCount() { return fTsBuffer ? iSegCount : 1; }; int RaSegCount()
void RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, {
int iNumShapePoints, double fTextureLength, int iSkip = 0, return fTsBuffer ? iSegCount : 1;
int iEnd = 0, double fOffsetX = 0.0); };
void RaRenderLoft(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints,
double fTextureLength, int iSkip = 0, int iEnd = 0, double fOffsetX = 0.0);
void RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints, void RaAnimate(CVertNormTex *&Vert, const vector6 *ShapePoints, int iNumShapePoints,
double fTextureLength, int iSkip = 0, int iEnd = 0, double fTextureLength, int iSkip = 0, int iEnd = 0, double fOffsetX = 0.0);
double fOffsetX = 0.0); void AngleSet(int i, double a)
void AngleSet(int i, double a) { fAngle[i] = a; }; {
fAngle[i] = a;
};
void Rollment(double w1, double w2); // poprawianie przechy³ki void Rollment(double w1, double w2); // poprawianie przechy³ki
}; };

View File

@@ -34,7 +34,7 @@ int TSoundsManager::Count = 0;
TSoundContainer *TSoundsManager::First = NULL; TSoundContainer *TSoundsManager::First = NULL;
TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFileName, TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFileName,
int NConcurrent) int NConcurrent)
{ // wczytanie pliku dŸwiêkowego { // wczytanie pliku dŸwiêkowego
int hr = 111; int hr = 111;
DSBuffer = NULL; // na pocz¹tek, gdyby uruchomiæ dŸwiêków siê nie uda³o DSBuffer = NULL; // na pocz¹tek, gdyby uruchomiæ dŸwiêków siê nie uda³o
@@ -94,7 +94,7 @@ TSoundContainer::TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFi
//---------------------------------------------------------- //----------------------------------------------------------
BYTE *pbWavData; // Pointer to actual wav data BYTE *pbWavData; // Pointer to actual wav data
UINT cbWavSize; // Size of data UINT cbWavSize; // Size of data
VOID *pbData = NULL; VOID *pbData = NULL;
VOID *pbData2 = NULL; VOID *pbData2 = NULL;
DWORD dwLength; DWORD dwLength;
@@ -171,7 +171,10 @@ LPDIRECTSOUNDBUFFER TSoundContainer::GetUnique(LPDIRECTSOUND pDS)
return DSBuffers.top(); return DSBuffers.top();
}; };
TSoundsManager::~TSoundsManager() { Free(); }; TSoundsManager::~TSoundsManager()
{
Free();
};
void TSoundsManager::Free() void TSoundsManager::Free()
{ {
@@ -200,8 +203,7 @@ void TSoundsManager::LoadSounds(char *Directory)
FindClose(handle); FindClose(handle);
}; };
LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(char *Name, bool Dynamic, LPDIRECTSOUNDBUFFER TSoundsManager::GetFromName(char *Name, bool Dynamic, float *fSamplingRate)
float *fSamplingRate)
{ // wyszukanie dŸwiêku w pamiêci albo wczytanie z pliku { // wyszukanie dŸwiêku w pamiêci albo wczytanie z pliku
AnsiString file; AnsiString file;
if (Dynamic) if (Dynamic)

View File

@@ -39,8 +39,7 @@ class TSoundContainer
TSoundContainer *Next; TSoundContainer *Next;
std::stack<LPDIRECTSOUNDBUFFER> DSBuffers; std::stack<LPDIRECTSOUNDBUFFER> DSBuffers;
LPDIRECTSOUNDBUFFER GetUnique(LPDIRECTSOUND pDS); LPDIRECTSOUNDBUFFER GetUnique(LPDIRECTSOUND pDS);
TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFileName, TSoundContainer(LPDIRECTSOUND pDS, char *Directory, char *strFileName, int NConcurrent);
int NConcurrent);
~TSoundContainer(); ~TSoundContainer();
}; };
@@ -62,8 +61,7 @@ class TSoundsManager
static void Free(); static void Free();
static void Init(char *Name, int Concurrent); static void Init(char *Name, int Concurrent);
static void LoadSounds(char *Directory); static void LoadSounds(char *Directory);
static LPDIRECTSOUNDBUFFER GetFromName(char *Name, bool Dynamic, static LPDIRECTSOUNDBUFFER GetFromName(char *Name, bool Dynamic, float *fSamplingRate = NULL);
float *fSamplingRate = NULL);
static void RestoreAll(); static void RestoreAll();
}; };

View File

@@ -73,7 +73,9 @@ __fastcall TKnot::TKnot(int n)
} }
} }
__fastcall TKnot::~TKnot() {} __fastcall TKnot::~TKnot()
{
}
vector3 TKnot::GetDirection(float t) vector3 TKnot::GetDirection(float t)
{ {

View File

@@ -24,7 +24,9 @@ TSpring::TSpring()
restLen = 0; restLen = 0;
} }
TSpring::~TSpring() {} TSpring::~TSpring()
{
}
void TSpring::Init(double nrestLen, double nKs, double nKd) void TSpring::Init(double nrestLen, double nKs, double nKd)
{ {
@@ -43,7 +45,7 @@ bool TSpring::ComputateForces(vector3 pPosition1, vector3 pPosition2)
// VectorDifference(&p1->pos,&p2->pos,&deltaP); // Vector distance // VectorDifference(&p1->pos,&p2->pos,&deltaP); // Vector distance
deltaP = pPosition1 - pPosition2; deltaP = pPosition1 - pPosition2;
// dist = VectorLength(&deltaP); // Magnitude of // dist = VectorLength(&deltaP); // Magnitude of
//deltaP // deltaP
dist = deltaP.Length(); dist = deltaP.Length();
if (dist == 0) if (dist == 0)
{ {
@@ -72,7 +74,9 @@ bool TSpring::ComputateForces(vector3 pPosition1, vector3 pPosition2)
return true; return true;
} }
void TSpring::Render() {} void TSpring::Render()
{
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@@ -13,7 +13,7 @@ http://mozilla.org/MPL/2.0/.
#define STATIC_THRESHOLD 0.17f #define STATIC_THRESHOLD 0.17f
// efine STATIC_THRESHOLD 0.03f // efine STATIC_THRESHOLD 0.03f
const double m_Kd = 0.02f; // DAMPING FACTOR const double m_Kd = 0.02f; // DAMPING FACTOR
const double m_Kr = 0.8f; // 1.0 = SUPERBALL BOUNCE 0.0 = DEAD WEIGHT const double m_Kr = 0.8f; // 1.0 = SUPERBALL BOUNCE 0.0 = DEAD WEIGHT
const double m_Ksh = 5.0f; // HOOK'S SPRING CONSTANT const double m_Ksh = 5.0f; // HOOK'S SPRING CONSTANT
const double m_Ksd = 0.1f; // SPRING DAMPING CONSTANT const double m_Ksd = 0.1f; // SPRING DAMPING CONSTANT
@@ -35,8 +35,8 @@ class TSpring
void Render(); void Render();
vector3 vForce1, vForce2; vector3 vForce1, vForce2;
double restLen; // LENGTH OF SPRING AT REST double restLen; // LENGTH OF SPRING AT REST
double Ks; // SPRING CONSTANT double Ks; // SPRING CONSTANT
double Kd; // SPRING DAMPING double Kd; // SPRING DAMPING
private: private:
}; };

View File

@@ -89,7 +89,10 @@ TTexturesManager::Names::iterator TTexturesManager::LoadFromFile(std::string fil
struct ReplaceSlash 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) GLuint TTexturesManager::GetTextureID(char *dir, char *where, std::string fileName, int filter)
@@ -397,7 +400,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
copybytes += (1 + (chunkheader & 127)) * bytesPerPixel; // iloϾ pikseli copybytes += (1 + (chunkheader & 127)) * bytesPerPixel; // iloϾ pikseli
if (chunkheader < 128) // jeœli kopiowanie, pikseli jest wiêcej if (chunkheader < 128) // jeœli kopiowanie, pikseli jest wiêcej
copyto += (chunkheader)*bytesPerPixel; // rozmiar kopiowanego obszaru (bez copyto += (chunkheader)*bytesPerPixel; // rozmiar kopiowanego obszaru (bez
// jednego piksela) // jednego piksela)
} }
if (copybytes > imageSize) if (copybytes > imageSize)
{ // nie ma prawa byæ wiêksze { // nie ma prawa byæ wiêksze
@@ -440,7 +443,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
chunkheader = (unsigned char)*copyfrom; // jeden bajt, pozosta³e zawsze zerowe chunkheader = (unsigned char)*copyfrom; // jeden bajt, pozosta³e zawsze zerowe
if (copyto > copyfrom) if (copyto > copyfrom)
{ // jeœli piksele maj¹ byæ kopiowane, to mo¿liwe jest przesuniêcie ich o 1 bajt, na { // jeœli piksele maj¹ byæ kopiowane, to mo¿liwe jest przesuniêcie ich o 1 bajt, na
// miejsce licznika // miejsce licznika
filesize = (imageData + imageSize - copyto) / filesize = (imageData + imageSize - copyto) /
bytesPerPixel; // ile pikseli pozosta³o do koñca bytesPerPixel; // ile pikseli pozosta³o do koñca
// WriteLog("Decompression buffer overflow at pixel // WriteLog("Decompression buffer overflow at pixel
@@ -455,7 +458,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
if ((filesize > 128) || if ((filesize > 128) ||
!(Global::iModifyTGA & 4)) // gdy za du¿o pikseli albo wy³¹czone !(Global::iModifyTGA & 4)) // gdy za du¿o pikseli albo wy³¹czone
writeback = -1; // zapis mo¿liwe jeœli iloœæ problematycznych pikseli nie writeback = -1; // zapis mo¿liwe jeœli iloœæ problematycznych pikseli nie
// przekaracza 128 // przekaracza 128
break; // bufor siê zatka³, dalej w ten sposób siê nie da break; // bufor siê zatka³, dalej w ten sposób siê nie da
} }
if (chunkheader < 128) if (chunkheader < 128)
@@ -511,7 +514,7 @@ TTexturesManager::AlphaValue TTexturesManager::LoadTGA(std::string fileName, int
}; };
if (chunkheader < 128) if (chunkheader < 128)
{ // if the header is < 128, it means the that is the number of RAW color packets minus { // if the header is < 128, it means the that is the number of RAW color packets minus
// 1 // 1
chunkheader++; // add 1 to get number of following color values chunkheader++; // add 1 to get number of following color values
file.read(copyto, chunkheader * bytesPerPixel); file.read(copyto, chunkheader * bytesPerPixel);
copyto += chunkheader * bytesPerPixel; copyto += chunkheader * bytesPerPixel;

View File

@@ -274,8 +274,8 @@ void DecompressDXT5(DDS_IMAGE_DATA lImage, const GLubyte *lCompData, GLubyte *Da
alphas[3] = (3 * alphas[0] + 2 * alphas[1] + 2) / 5; // Bit code 011 alphas[3] = (3 * alphas[0] + 2 * alphas[1] + 2) / 5; // Bit code 011
alphas[4] = (2 * alphas[0] + 3 * alphas[1] + 2) / 5; // Bit code 100 alphas[4] = (2 * alphas[0] + 3 * alphas[1] + 2) / 5; // Bit code 100
alphas[5] = (1 * alphas[0] + 4 * alphas[1] + 2) / 5; // Bit code 101 alphas[5] = (1 * alphas[0] + 4 * alphas[1] + 2) / 5; // Bit code 101
alphas[6] = 0x00; // Bit code 110 alphas[6] = 0x00; // Bit code 110
alphas[7] = 0xFF; // Bit code 111 alphas[7] = 0xFF; // Bit code 111
} }
// Note: Have to separate the next two loops, // Note: Have to separate the next two loops,

View File

@@ -25,7 +25,10 @@ double fSimulationTime = 0;
double fSoundTimer = 0; double fSoundTimer = 0;
double fSinceStart = 0; double fSinceStart = 0;
double GetTime() { return fSimulationTime; } double GetTime()
{
return fSimulationTime;
}
double GetDeltaTime() double GetDeltaTime()
{ // czas symulacji (stoi gdy pauza) { // czas symulacji (stoi gdy pauza)
@@ -37,19 +40,35 @@ double GetDeltaRenderTime()
return DeltaRenderTime; return DeltaRenderTime;
} }
double GetfSinceStart() { return fSinceStart; } double GetfSinceStart()
{
return fSinceStart;
}
void SetDeltaTime(double t) { DeltaTime = t; } void SetDeltaTime(double t)
{
DeltaTime = t;
}
double GetSimulationTime() { return fSimulationTime; } double GetSimulationTime()
{
return fSimulationTime;
}
void SetSimulationTime(double t) { fSimulationTime = t; } void SetSimulationTime(double t)
{
fSimulationTime = t;
}
bool GetSoundTimer() bool GetSoundTimer()
{ // Ra: byæ mo¿e, by dŸwiêki nie modyfikowa³y siê zbyt czêsto, po 0.1s zeruje siê ten licznik { // Ra: byæ mo¿e, by dŸwiêki nie modyfikowa³y siê zbyt czêsto, po 0.1s zeruje siê ten licznik
return (fSoundTimer == 0.0f); } return (fSoundTimer == 0.0f);
}
double GetFPS() { return fFPS; } double GetFPS()
{
return fFPS;
}
void ResetTimers() void ResetTimers()
{ {

View File

@@ -68,8 +68,8 @@ TSwitchExtension::TSwitchExtension(TTrack *owner, int what)
Segments[2] = (what >= 3) ? Segments[2] = (what >= 3) ?
new TSegment(owner) : new TSegment(owner) :
NULL; // z punktu 2 do 4 skrzyżowanie od góry: wersja "-1": NULL; // z punktu 2 do 4 skrzyżowanie od góry: wersja "-1":
Segments[3] = (what >= 4) ? new TSegment(owner) : Segments[3] =
NULL; // z punktu 4 do 1 1 1=4 0 0=3 (what >= 4) ? new TSegment(owner) : NULL; // z punktu 4 do 1 1 1=4 0 0=3
Segments[4] = Segments[4] =
(what >= 5) ? new TSegment(owner) : NULL; // z punktu 1 do 3 4 x 3 3 3 x 2 2 (what >= 5) ? new TSegment(owner) : NULL; // z punktu 1 do 3 4 x 3 3 3 x 2 2
Segments[5] = (what >= 6) ? new TSegment(owner) : Segments[5] = (what >= 6) ? new TSegment(owner) :
@@ -102,16 +102,17 @@ TIsolated::TIsolated(const AnsiString &n, TIsolated *i)
pMemCell = NULL; // podpiąć istniejącą albo utworzyć pustą pMemCell = NULL; // podpiąć istniejącą albo utworzyć pustą
}; };
TIsolated::~TIsolated(){// usuwanie TIsolated::~TIsolated(){
/* // usuwanie
TIsolated *p=pRoot; /*
while (pRoot) TIsolated *p=pRoot;
{ while (pRoot)
p=pRoot; {
p->pNext=NULL; p=pRoot;
delete p; p->pNext=NULL;
} delete p;
*/ }
*/
}; };
TIsolated *__fastcall TIsolated::Find(const AnsiString &n) TIsolated *__fastcall TIsolated::Find(const AnsiString &n)
@@ -324,7 +325,7 @@ TTrack *__fastcall TTrack::NullCreate(int dir)
trk2->bVisible = false; trk2->bVisible = false;
trk2->fVelocity = 20.0; // zawracanie powoli trk2->fVelocity = 20.0; // zawracanie powoli
trk2->fRadius = 20.0; // promień, aby się dodawało do tabelki prędkości i liczyło trk2->fRadius = 20.0; // promień, aby się dodawało do tabelki prędkości i liczyło
// narastająco // narastająco
trk2->Init(); // utworzenie segmentu trk2->Init(); // utworzenie segmentu
switch (dir) switch (dir)
{ //łączenie z nowym torem { //łączenie z nowym torem
@@ -796,7 +797,7 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
if (SwitchExtension) // jeśli tor ruchomy if (SwitchExtension) // jeśli tor ruchomy
if (fabs(fVelocity) >= 1.0) //żeby zero nie ograniczało dożywotnio if (fabs(fVelocity) >= 1.0) //żeby zero nie ograniczało dożywotnio
SwitchExtension->fVelocity = fVelocity; // zapamiętanie głównego ograniczenia; a SwitchExtension->fVelocity = fVelocity; // zapamiętanie głównego ograniczenia; a
// np. -40 ogranicza tylko na bok // np. -40 ogranicza tylko na bok
} }
else if (str == "isolated") else if (str == "isolated")
{ // obwód izolowany, do którego tor należy { // obwód izolowany, do którego tor należy
@@ -830,16 +831,16 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, AnsiString name)
} }
else if (str == "overhead") else if (str == "overhead")
{ // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i ograniczeniem { // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i ograniczeniem
// prędkości // prędkości
parser->getTokens(); parser->getTokens();
*parser >> fOverhead; *parser >> fOverhead;
if (fOverhead > 0.0) if (fOverhead > 0.0)
iAction |= 0x40; // flaga opuszczenia pantografu (tor uwzględniany w skanowaniu jako iAction |= 0x40; // flaga opuszczenia pantografu (tor uwzględniany w skanowaniu jako
// ograniczenie dla pantografujących) // ograniczenie dla pantografujących)
} }
else if (str == "colides") else if (str == "colides")
{ // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i ograniczeniem { // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i ograniczeniem
// prędkości // prędkości
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
// trColides=; //tor kolizyjny, na którym trzeba sprawdzać pojazdy pod kątem zderzenia // trColides=; //tor kolizyjny, na którym trzeba sprawdzać pojazdy pod kątem zderzenia
@@ -1222,7 +1223,7 @@ void TTrack::Compile(GLuint tex)
switch (eType) // dalej zależnie od typu switch (eType) // dalej zależnie od typu
{ {
case tt_Table: // obrotnica jak zwykły tor, animacja wykonywana w RaAnimate(), tutaj tylko case tt_Table: // obrotnica jak zwykły tor, animacja wykonywana w RaAnimate(), tutaj tylko
// regeneracja siatek // regeneracja siatek
case tt_Normal: case tt_Normal:
if (TextureID2) if (TextureID2)
if (tex ? TextureID2 == tex : true) // jeśli pasuje do grupy (tex) if (tex ? TextureID2 == tex : true) // jeśli pasuje do grupy (tex)
@@ -1232,7 +1233,7 @@ void TTrack::Compile(GLuint tex)
if (fTexLength == if (fTexLength ==
4.0) // jeśli stare mapowanie na profil 0.2 0.5 1.1 (również 6-9-9/noil) 4.0) // jeśli stare mapowanie na profil 0.2 0.5 1.1 (również 6-9-9/noil)
{ // stare mapowanie z różną gęstością pikseli i oddzielnymi teksturami na każdy { // stare mapowanie z różną gęstością pikseli i oddzielnymi teksturami na każdy
// profil // profil
if (iTrapezoid) // trapez albo przechyłki if (iTrapezoid) // trapez albo przechyłki
{ // podsypka z podkladami trapezowata { // podsypka z podkladami trapezowata
// ewentualnie poprawić mapowanie, żeby środek mapował się na // ewentualnie poprawić mapowanie, żeby środek mapował się na
@@ -1272,9 +1273,9 @@ void TTrack::Compile(GLuint tex)
} }
else else
{ // mapowanie proporcjonalne do powierzchni, rozmiar w poprzek określa { // mapowanie proporcjonalne do powierzchni, rozmiar w poprzek określa
// fTexLength // fTexLength
double max = fTexRatio2 * fTexLength; // szerokość proporcjonalna do double max = fTexRatio2 * fTexLength; // szerokość proporcjonalna do
// długości // długości
double map11 = double map11 =
max > 0.0 ? (fHTW + side) / max : 0.25; // załamanie od strony 1 max > 0.0 ? (fHTW + side) / max : 0.25; // załamanie od strony 1
double map12 = double map12 =
@@ -1451,7 +1452,7 @@ void TTrack::Compile(GLuint tex)
if (TextureID2) if (TextureID2)
if (tex ? TextureID2 == tex : true) // jeśli pasuje do grupy (tex) if (tex ? TextureID2 == tex : true) // jeśli pasuje do grupy (tex)
{ // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak { // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak
// w Midtown Madness 2?) // w Midtown Madness 2?)
if (!tex) if (!tex)
glBindTexture(GL_TEXTURE_2D, TextureID2); glBindTexture(GL_TEXTURE_2D, TextureID2);
vector6 rpts1[6], vector6 rpts1[6],
@@ -1469,7 +1470,7 @@ void TTrack::Compile(GLuint tex)
rpts2[2] = vector6(-rozp, -fTexHeight1, 0.0); // prawy brzeg podstawy rpts2[2] = vector6(-rozp, -fTexHeight1, 0.0); // prawy brzeg podstawy
if (iTrapezoid) // trapez albo przechyłki if (iTrapezoid) // trapez albo przechyłki
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony
// odcinka // odcinka
rpts1[3] = rpts1[3] =
vector6(rozp2, -fTexHeight2, 0.0); // lewy brzeg lewego pobocza vector6(rozp2, -fTexHeight2, 0.0); // lewy brzeg lewego pobocza
rpts1[4] = rpts1[4] =
@@ -1509,7 +1510,7 @@ void TTrack::Compile(GLuint tex)
0.484375 - map1l); // lewy brzeg lewego chodnika 0.484375 - map1l); // lewy brzeg lewego chodnika
if (iTrapezoid) // trapez albo przechyłki if (iTrapezoid) // trapez albo przechyłki
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony
// odcinka // odcinka
slop2 = fabs((iTrapezoid & 2) ? slop2 : slop2 = fabs((iTrapezoid & 2) ? slop2 :
slop); // szerokość chodnika po prawej slop); // szerokość chodnika po prawej
double map2l = double map2l =
@@ -1534,7 +1535,7 @@ void TTrack::Compile(GLuint tex)
} }
if (iTrapezoid) // trapez albo przechyłki if (iTrapezoid) // trapez albo przechyłki
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony
// odcinka // odcinka
if ((fTexHeight1 >= 0.0) ? true : (slop != 0.0)) if ((fTexHeight1 >= 0.0) ? true : (slop != 0.0))
Segment->RenderLoft(rpts1, -3, fTexLength); // tylko jeśli jest z prawej Segment->RenderLoft(rpts1, -3, fTexLength); // tylko jeśli jest z prawej
if ((fTexHeight1 >= 0.0) ? true : (side != 0.0)) if ((fTexHeight1 >= 0.0) ? true : (side != 0.0))
@@ -1595,7 +1596,7 @@ void TTrack::Compile(GLuint tex)
SwitchExtension->Segments[5]->RaSegCount(); // mogą być tylko 3 drogi SwitchExtension->Segments[5]->RaSegCount(); // mogą być tylko 3 drogi
SwitchExtension->vPoints = SwitchExtension->vPoints =
new vector3[SwitchExtension->iPoints]; // tablica utworzona z zapasem, ale nie new vector3[SwitchExtension->iPoints]; // tablica utworzona z zapasem, ale nie
// wypełniona współrzędnymi // wypełniona współrzędnymi
} }
vector3 *b = vector3 *b =
SwitchExtension->bPoints ? SwitchExtension->bPoints ?
@@ -1630,7 +1631,7 @@ void TTrack::Compile(GLuint tex)
// if (TextureID2) // if (TextureID2)
// if (tex?TextureID2==tex:true) //jeśli pasuje do grupy (tex) // if (tex?TextureID2==tex:true) //jeśli pasuje do grupy (tex)
{ // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w { // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w
// Midtown Madness 2?) // Midtown Madness 2?)
if (TextureID2) if (TextureID2)
if (!tex) if (!tex)
glBindTexture(GL_TEXTURE_2D, TextureID2); glBindTexture(GL_TEXTURE_2D, TextureID2);
@@ -1642,7 +1643,7 @@ void TTrack::Compile(GLuint tex)
{ // standardowo: od zewnątrz pochylenie, a od wewnątrz poziomo { // standardowo: od zewnątrz pochylenie, a od wewnątrz poziomo
rpts1[0] = vector6(rozp, -fTexHeight1, 0.0); // lewy brzeg podstawy rpts1[0] = vector6(rozp, -fTexHeight1, 0.0); // lewy brzeg podstawy
rpts1[1] = vector6(bpts1[0].x + side, bpts1[0].y, 0.5); // lewa krawędź rpts1[1] = vector6(bpts1[0].x + side, bpts1[0].y, 0.5); // lewa krawędź
// załamania // załamania
rpts1[2] = vector6(bpts1[0].x, bpts1[0].y, rpts1[2] = vector6(bpts1[0].x, bpts1[0].y,
1.0); // lewy brzeg pobocza (mapowanie może być inne 1.0); // lewy brzeg pobocza (mapowanie może być inne
rpts2[0] = vector6(bpts1[1].x, bpts1[1].y, 1.0); // prawy brzeg pobocza rpts2[0] = vector6(bpts1[1].x, bpts1[1].y, 1.0); // prawy brzeg pobocza
@@ -1651,15 +1652,15 @@ void TTrack::Compile(GLuint tex)
rpts2[2] = vector6(-rozp, -fTexHeight1, 0.0); // prawy brzeg podstawy rpts2[2] = vector6(-rozp, -fTexHeight1, 0.0); // prawy brzeg podstawy
// if (iTrapezoid) //trapez albo przechyłki // if (iTrapezoid) //trapez albo przechyłki
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony
// odcinka // odcinka
rpts1[3] = vector6(rozp2, -fTexHeight2, 0.0); // lewy brzeg lewego pobocza rpts1[3] = vector6(rozp2, -fTexHeight2, 0.0); // lewy brzeg lewego pobocza
rpts1[4] = vector6(bpts1[2].x + side2, bpts1[2].y, 0.5); // krawędź rpts1[4] = vector6(bpts1[2].x + side2, bpts1[2].y, 0.5); // krawędź
// załamania // załamania
rpts1[5] = vector6(bpts1[2].x, bpts1[2].y, 1.0); // brzeg pobocza rpts1[5] = vector6(bpts1[2].x, bpts1[2].y, 1.0); // brzeg pobocza
rpts2[3] = vector6(bpts1[3].x, bpts1[3].y, 1.0); rpts2[3] = vector6(bpts1[3].x, bpts1[3].y, 1.0);
rpts2[4] = vector6(bpts1[3].x - side2, bpts1[3].y, 0.5); rpts2[4] = vector6(bpts1[3].x - side2, bpts1[3].y, 0.5);
rpts2[5] = vector6(-rozp2, -fTexHeight2, 0.0); // prawy brzeg prawego rpts2[5] = vector6(-rozp2, -fTexHeight2, 0.0); // prawy brzeg prawego
// pobocza // pobocza
} }
} }
else else
@@ -1690,7 +1691,7 @@ void TTrack::Compile(GLuint tex)
0.484375 - map1l); // lewy brzeg lewego chodnika 0.484375 - map1l); // lewy brzeg lewego chodnika
// if (iTrapezoid) //trapez albo przechyłki // if (iTrapezoid) //trapez albo przechyłki
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony
// odcinka // odcinka
slop2 = slop2 =
fabs((iTrapezoid & 2) ? slop2 : slop); // szerokość chodnika po prawej fabs((iTrapezoid & 2) ? slop2 : slop); // szerokość chodnika po prawej
double map2l = max > 0.0 ? double map2l = max > 0.0 ?
@@ -1715,7 +1716,7 @@ void TTrack::Compile(GLuint tex)
} }
bool render = TextureID2 ? (tex ? TextureID2 == tex : true) : bool render = TextureID2 ? (tex ? TextureID2 == tex : true) :
false; // renderować nie trzeba, ale trzeba wyznaczyć false; // renderować nie trzeba, ale trzeba wyznaczyć
// punkty brzegowe nawierzchni // punkty brzegowe nawierzchni
// if (iTrapezoid) //trapez albo przechyłki // if (iTrapezoid) //trapez albo przechyłki
if (SwitchExtension->iRoads == 4) if (SwitchExtension->iRoads == 4)
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony odcinka { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony odcinka
@@ -1734,7 +1735,7 @@ void TTrack::Compile(GLuint tex)
} }
else // to będzie ewentualnie dla prostego na skrzyżowaniu trzech dróg else // to będzie ewentualnie dla prostego na skrzyżowaniu trzech dróg
{ // punkt 3 pokrywa się z punktem 1, jak w zwrotnicy; połączenie 1->2 nie musi być { // punkt 3 pokrywa się z punktem 1, jak w zwrotnicy; połączenie 1->2 nie musi być
// prostoliniowe // prostoliniowe
if ((fTexHeight1 >= 0.0) ? true : (side != 0.0)) // OK if ((fTexHeight1 >= 0.0) ? true : (side != 0.0)) // OK
SwitchExtension->Segments[2]->RenderLoft(rpts2, -3, fTexLength, 0, 1, &b, SwitchExtension->Segments[2]->RenderLoft(rpts2, -3, fTexLength, 0, 1, &b,
render); // z P2 do P4 render); // z P2 do P4
@@ -1760,15 +1761,15 @@ void TTrack::Compile(GLuint tex)
{ // coś się gubi w obliczeniach na wskaźnikach { // coś się gubi w obliczeniach na wskaźnikach
i = (int((void *)(b)) - int((void *)(SwitchExtension->vPoints))) / i = (int((void *)(b)) - int((void *)(SwitchExtension->vPoints))) /
sizeof(vector3); // ustalenie liczby punktów, bo mogło wyjść inaczej niż sizeof(vector3); // ustalenie liczby punktów, bo mogło wyjść inaczej niż
// policzone z góry // policzone z góry
if (i > 0) if (i > 0)
{ // jeśli zostało to właśnie utworzone { // jeśli zostało to właśnie utworzone
if (SwitchExtension->iPoints > i) // jeśli wyszło mniej niż było miejsca if (SwitchExtension->iPoints > i) // jeśli wyszło mniej niż było miejsca
SwitchExtension->iPoints = i; // domknięcie wachlarza SwitchExtension->iPoints = i; // domknięcie wachlarza
else else
--SwitchExtension->iPoints; // jak tutaj wejdzie, to błąd jest - zrobić --SwitchExtension->iPoints; // jak tutaj wejdzie, to błąd jest - zrobić
// miejsce na powtórzenie pierwszego punktu // miejsce na powtórzenie pierwszego punktu
// na końcu // na końcu
SwitchExtension->vPoints[SwitchExtension->iPoints++] = SwitchExtension->vPoints[SwitchExtension->iPoints++] =
SwitchExtension->vPoints[0]; SwitchExtension->vPoints[0];
SwitchExtension->bPoints = true; // tablica punktów została wypełniona SwitchExtension->bPoints = true; // tablica punktów została wypełniona
@@ -2077,7 +2078,7 @@ void TTrack::RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start)
vector6 bpts1[8]; // punkty głównej płaszczyzny nie przydają się do robienia boków vector6 bpts1[8]; // punkty głównej płaszczyzny nie przydają się do robienia boków
if (fTexLength == 4.0) // jeśli stare mapowanie if (fTexLength == 4.0) // jeśli stare mapowanie
{ // stare mapowanie z różną gęstością pikseli i oddzielnymi teksturami na każdy { // stare mapowanie z różną gęstością pikseli i oddzielnymi teksturami na każdy
// profil // profil
if (iTrapezoid) // trapez albo przechyłki if (iTrapezoid) // trapez albo przechyłki
{ // podsypka z podkladami trapezowata { // podsypka z podkladami trapezowata
// ewentualnie poprawić mapowanie, żeby środek mapował się na 1.435/4.671 // ewentualnie poprawić mapowanie, żeby środek mapował się na 1.435/4.671
@@ -2259,7 +2260,7 @@ void TTrack::RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start)
} }
if (TextureID2) if (TextureID2)
{ // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w { // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w
// Midtown Madness 2?) // Midtown Madness 2?)
vector6 rpts1[6], vector6 rpts1[6],
rpts2[6]; // współrzędne przekroju i mapowania dla prawej i lewej strony rpts2[6]; // współrzędne przekroju i mapowania dla prawej i lewej strony
if (fTexHeight1 >= 0.0) if (fTexHeight1 >= 0.0)
@@ -2275,15 +2276,15 @@ void TTrack::RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start)
rpts2[2] = vector6(-rozp, -fTexHeight1, 0.0); // prawy brzeg podstawy rpts2[2] = vector6(-rozp, -fTexHeight1, 0.0); // prawy brzeg podstawy
if (iTrapezoid) // trapez albo przechyłki if (iTrapezoid) // trapez albo przechyłki
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony
// odcinka // odcinka
rpts1[3] = vector6(rozp2, -fTexHeight2, 0.0); // lewy brzeg lewego pobocza rpts1[3] = vector6(rozp2, -fTexHeight2, 0.0); // lewy brzeg lewego pobocza
rpts1[4] = vector6(bpts1[2].x + side2, bpts1[2].y, 0.5); // krawędź rpts1[4] = vector6(bpts1[2].x + side2, bpts1[2].y, 0.5); // krawędź
// załamania // załamania
rpts1[5] = vector6(bpts1[2].x, bpts1[2].y, 1.0); // brzeg pobocza rpts1[5] = vector6(bpts1[2].x, bpts1[2].y, 1.0); // brzeg pobocza
rpts2[3] = vector6(bpts1[3].x, bpts1[3].y, 1.0); rpts2[3] = vector6(bpts1[3].x, bpts1[3].y, 1.0);
rpts2[4] = vector6(bpts1[3].x - side2, bpts1[3].y, 0.5); rpts2[4] = vector6(bpts1[3].x - side2, bpts1[3].y, 0.5);
rpts2[5] = vector6(-rozp2, -fTexHeight2, 0.0); // prawy brzeg prawego rpts2[5] = vector6(-rozp2, -fTexHeight2, 0.0); // prawy brzeg prawego
// pobocza // pobocza
Segment->RaRenderLoft(Vert, rpts1, -3, fTexLength); Segment->RaRenderLoft(Vert, rpts1, -3, fTexLength);
Segment->RaRenderLoft(Vert, rpts2, -3, fTexLength); Segment->RaRenderLoft(Vert, rpts2, -3, fTexLength);
} }
@@ -2323,7 +2324,7 @@ void TTrack::RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start)
0.484375 - map1l); // lewy brzeg lewego chodnika 0.484375 - map1l); // lewy brzeg lewego chodnika
if (iTrapezoid) // trapez albo przechyłki if (iTrapezoid) // trapez albo przechyłki
{ // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony { // pobocza do trapezowatej nawierzchni - dodatkowe punkty z drugiej strony
// odcinka // odcinka
slop2 = slop2 =
fabs((iTrapezoid & 2) ? slop2 : slop); // szerokość chodnika po prawej fabs((iTrapezoid & 2) ? slop2 : slop); // szerokość chodnika po prawej
double map2l = max > 0.0 ? double map2l = max > 0.0 ?
@@ -2400,7 +2401,7 @@ void TTrack::RaArrayFill(CVertNormTex *Vert, const CVertNormTex *Start)
} }
if (TextureID2) if (TextureID2)
{ // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w { // pobocze drogi - poziome przy przechyłce (a może krawężnik i chodnik zrobić jak w
// Midtown Madness 2?) // Midtown Madness 2?)
vector6 rpts1[6], vector6 rpts1[6],
rpts2[6]; // współrzędne przekroju i mapowania dla prawej i lewej strony rpts2[6]; // współrzędne przekroju i mapowania dla prawej i lewej strony
rpts1[0] = vector6(rozp, -fTexHeight1, 0.0); // lewy brzeg podstawy rpts1[0] = vector6(rozp, -fTexHeight1, 0.0); // lewy brzeg podstawy
@@ -2681,7 +2682,7 @@ bool TTrack::Switch(int i, double t, double d)
{ // nie ma się co bawić { // nie ma się co bawić
SwitchExtension->fOffset = SwitchExtension->fDesiredOffset; SwitchExtension->fOffset = SwitchExtension->fDesiredOffset;
RaAnimate(); // przeliczenie położenia iglic; czy zadziała na niewyświetlanym RaAnimate(); // przeliczenie położenia iglic; czy zadziała na niewyświetlanym
// sektorze w VBO? // sektorze w VBO?
} }
return true; return true;
} }
@@ -2950,7 +2951,7 @@ TTrack *__fastcall TTrack::RaAnimate()
SwitchExtension->vTrans)) // czy przemieściło się od ostatniego sprawdzania SwitchExtension->vTrans)) // czy przemieściło się od ostatniego sprawdzania
{ {
double hlen = 0.5 * SwitchExtension->Segments[0]->GetLength(); // połowa double hlen = 0.5 * SwitchExtension->Segments[0]->GetLength(); // połowa
// długości // długości
SwitchExtension->fOffset = ac->AngleGet(); // pobranie kąta z submodelu SwitchExtension->fOffset = ac->AngleGet(); // pobranie kąta z submodelu
double sina = -hlen * sin(DegToRad(SwitchExtension->fOffset)), double sina = -hlen * sin(DegToRad(SwitchExtension->fOffset)),
cosa = -hlen * cos(DegToRad(SwitchExtension->fOffset)); cosa = -hlen * cos(DegToRad(SwitchExtension->fOffset));
@@ -2962,7 +2963,7 @@ TTrack *__fastcall TTrack::RaAnimate()
middle - vector3(sina, 0.0, cosa), 5.0); // nowy odcinek middle - vector3(sina, 0.0, cosa), 5.0); // nowy odcinek
for (int i = 0; i < iNumDynamics; i++) for (int i = 0; i < iNumDynamics; i++)
Dynamics[i]->Move(0.000001); // minimalny ruch, aby przeliczyć pozycję i Dynamics[i]->Move(0.000001); // minimalny ruch, aby przeliczyć pozycję i
// kąty // kąty
if (Global::bUseVBO) if (Global::bUseVBO)
{ // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment { // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment
// aktualizacja pojazdów na torze // aktualizacja pojazdów na torze
@@ -3147,7 +3148,7 @@ void TTrack::ConnectionsLog()
TTrack *__fastcall TTrack::Neightbour(int s, double &d) TTrack *__fastcall TTrack::Neightbour(int s, double &d)
{ // zwraca wskaźnik na sąsiedni tor, w kierunku określonym znakiem (s), odwraca (d) w razie { // zwraca wskaźnik na sąsiedni tor, w kierunku określonym znakiem (s), odwraca (d) w razie
// niezgodności kierunku torów // niezgodności kierunku torów
TTrack *t; // nie zmieniamy kierunku (d), jeśli nie ma toru dalej TTrack *t; // nie zmieniamy kierunku (d), jeśli nie ma toru dalej
if (eType != tt_Cross) if (eType != tt_Cross)
{ // jeszcze trzeba sprawdzić zgodność { // jeszcze trzeba sprawdzić zgodność
@@ -3155,7 +3156,7 @@ TTrack *__fastcall TTrack::Neightbour(int s, double &d)
if (t) // o ile jest na co przejść, zmieniamy znak kierunku na nowym torze if (t) // o ile jest na co przejść, zmieniamy znak kierunku na nowym torze
if (t->eType == tt_Cross) if (t->eType == tt_Cross)
{ // jeśli wjazd na skrzyżowanie, trzeba ustalić segment, bo od tego zależy zmiana { // jeśli wjazd na skrzyżowanie, trzeba ustalić segment, bo od tego zależy zmiana
// kierunku (d) // kierunku (d)
// if (r) //gdy nie podano (r), to nie zmieniać (d) // if (r) //gdy nie podano (r), to nie zmieniać (d)
// if (s*t->CrossSegment(((s>0)?iNextDirection:iPrevDirection),r)<0) // if (s*t->CrossSegment(((s>0)?iNextDirection:iPrevDirection),r)<0)
// d=-d; // d=-d;

51
Track.h
View File

@@ -51,7 +51,7 @@ class TSwitchExtension
TSwitchExtension(TTrack *owner, int what); TSwitchExtension(TTrack *owner, int what);
~TSwitchExtension(); ~TSwitchExtension();
TSegment *Segments[6]; // dwa tory od punktu 1, pozostałe dwa od 2? Ra 140101: 6 połączeń dla TSegment *Segments[6]; // dwa tory od punktu 1, pozostałe dwa od 2? Ra 140101: 6 połączeń dla
// skrzyżowań // skrzyżowań
// TTrack *trNear[4]; //tory dołączone do punktów 1, 2, 3 i 4 // TTrack *trNear[4]; //tory dołączone do punktów 1, 2, 3 i 4
// dotychczasowe [2]+[2] wskaźniki zamienić na nowe [4] // dotychczasowe [2]+[2] wskaźniki zamienić na nowe [4]
TTrack *pNexts[2]; // tory dołączone do punktów 2 i 4 TTrack *pNexts[2]; // tory dołączone do punktów 2 i 4
@@ -111,9 +111,18 @@ class TIsolated
static TIsolated *__fastcall Find( static TIsolated *__fastcall Find(
const AnsiString &n); // znalezienie obiektu albo utworzenie nowego const AnsiString &n); // znalezienie obiektu albo utworzenie nowego
void Modify(int i, TDynamicObject *o); // dodanie lub odjęcie osi void Modify(int i, TDynamicObject *o); // dodanie lub odjęcie osi
bool Busy() { return (iAxles > 0); }; bool Busy()
static TIsolated *__fastcall Root() { return (pRoot); }; {
TIsolated *__fastcall Next() { return (pNext); }; return (iAxles > 0);
};
static TIsolated *__fastcall Root()
{
return (pRoot);
};
TIsolated *__fastcall Next()
{
return (pNext);
};
}; };
class TTrack : public Resource class TTrack : public Resource
@@ -168,7 +177,7 @@ class TTrack : public Resource
bool bVisible; // czy rysowany bool bVisible; // czy rysowany
int iAction; // czy modyfikowany eventami (specjalna obsługa przy skanowaniu) int iAction; // czy modyfikowany eventami (specjalna obsługa przy skanowaniu)
float fOverhead; // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i float fOverhead; // informacja o stanie sieci: 0-jazda bezprądowa, >0-z opuszczonym i
// ograniczeniem prędkości // ograniczeniem prędkości
private: private:
double fVelocity; // prędkość dla AI (powyżej rośnie prawdopowobieństwo wykolejenia) double fVelocity; // prędkość dla AI (powyżej rośnie prawdopowobieństwo wykolejenia)
public: public:
@@ -185,15 +194,30 @@ class TTrack : public Resource
void Init(); void Init();
static TTrack *__fastcall Create400m(int what, double dx); static TTrack *__fastcall Create400m(int what, double dx);
TTrack *__fastcall NullCreate(int dir); TTrack *__fastcall NullCreate(int dir);
inline bool IsEmpty() { return (iNumDynamics <= 0); }; inline bool IsEmpty()
{
return (iNumDynamics <= 0);
};
void ConnectPrevPrev(TTrack *pNewPrev, int typ); void ConnectPrevPrev(TTrack *pNewPrev, int typ);
void ConnectPrevNext(TTrack *pNewPrev, int typ); void ConnectPrevNext(TTrack *pNewPrev, int typ);
void ConnectNextPrev(TTrack *pNewNext, int typ); void ConnectNextPrev(TTrack *pNewNext, int typ);
void ConnectNextNext(TTrack *pNewNext, int typ); void ConnectNextNext(TTrack *pNewNext, int typ);
inline double Length() { return Segment->GetLength(); }; inline double Length()
inline TSegment *__fastcall CurrentSegment() { return Segment; }; {
inline TTrack *__fastcall CurrentNext() { return (trNext); }; return Segment->GetLength();
inline TTrack *__fastcall CurrentPrev() { return (trPrev); }; };
inline TSegment *__fastcall CurrentSegment()
{
return Segment;
};
inline TTrack *__fastcall CurrentNext()
{
return (trNext);
};
inline TTrack *__fastcall CurrentPrev()
{
return (trPrev);
};
TTrack *__fastcall Neightbour(int s, double &d); TTrack *__fastcall Neightbour(int s, double &d);
bool SetConnections(int i); bool SetConnections(int i);
bool Switch(int i, double t = -1.0, double d = -1.0); bool Switch(int i, double t = -1.0, double d = -1.0);
@@ -222,7 +246,7 @@ class TTrack : public Resource
void RenderDyn(); // renderowanie nieprzezroczystych pojazdów (oba tryby) void RenderDyn(); // renderowanie nieprzezroczystych pojazdów (oba tryby)
void RenderDynAlpha(); // renderowanie przezroczystych pojazdów (oba tryby) void RenderDynAlpha(); // renderowanie przezroczystych pojazdów (oba tryby)
void RenderDynSounds(); // odtwarzanie dźwięków pojazdów jest niezależne od ich void RenderDynSounds(); // odtwarzanie dźwięków pojazdów jest niezależne od ich
// wyświetlania // wyświetlania
void RaOwnerSet(TSubRect *o) void RaOwnerSet(TSubRect *o)
{ {
@@ -244,7 +268,10 @@ class TTrack : public Resource
AnsiString IsolatedName(); AnsiString IsolatedName();
bool IsolatedEventsAssign(TEvent *busy, TEvent *free); bool IsolatedEventsAssign(TEvent *busy, TEvent *free);
double WidthTotal(); double WidthTotal();
GLuint TextureGet(int i) { return i ? TextureID1 : TextureID2; }; GLuint TextureGet(int i)
{
return i ? TextureID1 : TextureID2;
};
bool IsGroupable(); bool IsGroupable();
int TestPoint(vector3 *Point); int TestPoint(vector3 *Point);
void MovedUp1(double dh); void MovedUp1(double dh);

View File

@@ -664,7 +664,7 @@ void TTraction::PowerSet(TTractionPowerSource *ps)
{ // ustalenie punktu zasilania (nie ma jeszcze połączeń między przęsłami) { // ustalenie punktu zasilania (nie ma jeszcze połączeń między przęsłami)
psPowered = ps; // ustawienie bezpośredniego zasilania dla przęsła psPowered = ps; // ustawienie bezpośredniego zasilania dla przęsła
psPower[0] = psPower[1] = ps; // a to chyba nie jest dobry pomysł, bo nawet zasilane przęsło psPower[0] = psPower[1] = ps; // a to chyba nie jest dobry pomysł, bo nawet zasilane przęsło
// powinno mieć wskazania na inne // powinno mieć wskazania na inne
fResistance[0] = fResistance[1] = 0.0; // a liczy się tylko rezystancja zasilacza fResistance[0] = fResistance[1] = 0.0; // a liczy się tylko rezystancja zasilacza
} }
}; };

View File

@@ -56,7 +56,7 @@ class TTraction
AnsiString asParallel; // nazwa przês³a, z którym mo¿e byæ bie¿nia wspólna 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 TTraction *hvParallel; // jednokierunkowa i zapêtlona lista przêse³ ewentualnej bie¿ni wspólnej
float fResistance[2]; // rezystancja zastêpcza do punktu zasilania (0: przês³o zasilane, <0: do float fResistance[2]; // rezystancja zastêpcza do punktu zasilania (0: przês³o zasilane, <0: do
// policzenia) // policzenia)
int iTries; int iTries;
// bool bVisible; // bool bVisible;
// DWORD dwFlags; // DWORD dwFlags;

View File

@@ -79,20 +79,22 @@ bool TTractionPowerSource::Load(cParser *parser)
Recuperation = true; Recuperation = true;
else if (token.compare("section") == 0) // od³¹cznik sekcyjny else if (token.compare("section") == 0) // od³¹cznik sekcyjny
bSection = true; // nie jest Ÿród³em zasilania, a jedynie informuje o pr¹dzie od³¹czenia bSection = true; // nie jest Ÿród³em zasilania, a jedynie informuje o pr¹dzie od³¹czenia
// sekcji z obwodu // sekcji z obwodu
parser->getTokens(); parser->getTokens();
*parser >> token; *parser >> token;
if (token.compare("end") != 0) if (token.compare("end") != 0)
Error("tractionpowersource end statement missing"); Error("tractionpowersource end statement missing");
// if (!bSection) //od³¹cznik sekcji zasadniczo nie ma impedancji (0.01 jest OK) // if (!bSection) //od³¹cznik sekcji zasadniczo nie ma impedancji (0.01 jest OK)
if (InternalRes < 0.1) // coœ ma³a ta rezystancja by³a... if (InternalRes < 0.1) // coœ ma³a ta rezystancja by³a...
InternalRes = InternalRes = 0.2; // tak oko³o 0.2, wg
0.2; // tak oko³o 0.2, wg // http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf
// http://www.ikolej.pl/fileadmin/user_upload/Seminaria_IK/13_05_07_Prezentacja_Kruczek.pdf
return true; return true;
}; };
bool TTractionPowerSource::Render() { return true; }; bool TTractionPowerSource::Render()
{
return true;
};
bool TTractionPowerSource::Update(double dt) bool TTractionPowerSource::Update(double dt)
{ // powinno byæ wykonane raz na krok fizyki { // powinno byæ wykonane raz na krok fizyki
@@ -151,7 +153,7 @@ double TTractionPowerSource::CurrentGet(double res)
0.0; // napiêcie dzielone przez sumê rezystancji wewnêtrznej i obci¹¿enia 0.0; // napiêcie dzielone przez sumê rezystancji wewnêtrznej i obci¹¿enia
OutputVoltage = NominalVoltage - InternalRes * TotalCurrent; // napiêcie na obci¹¿eniu OutputVoltage = NominalVoltage - InternalRes * TotalCurrent; // napiêcie na obci¹¿eniu
return TotalCurrent / (res * TotalPreviousAdmitance); // pr¹d proporcjonalny do udzia³u (1/res) return TotalCurrent / (res * TotalPreviousAdmitance); // pr¹d proporcjonalny do udzia³u (1/res)
// w ca³kowitej admitancji // w ca³kowitej admitancji
}; };
void TTractionPowerSource::PowerSet(TTractionPowerSource *ps) void TTractionPowerSource::PowerSet(TTractionPowerSource *ps)

View File

@@ -48,7 +48,10 @@ class TTractionPowerSource
bool Render(); bool Render();
bool Update(double dt); bool Update(double dt);
double CurrentGet(double res); double CurrentGet(double res);
void VoltageSet(double v) { NominalVoltage = v; }; void VoltageSet(double v)
{
NominalVoltage = v;
};
void PowerSet(TTractionPowerSource *ps); void PowerSet(TTractionPowerSource *ps);
}; };

View File

@@ -49,8 +49,8 @@ TCab::TCab()
iButtons = 0; iButtons = 0;
} }
void TCab::Init(double Initx1, double Inity1, double Initz1, double Initx2, void TCab::Init(double Initx1, double Inity1, double Initz1, double Initx2, double Inity2,
double Inity2, double Initz2, bool InitEnabled, bool InitOccupied) double Initz2, bool InitEnabled, bool InitOccupied)
{ {
CabPos1.x = Initx1; CabPos1.x = Initx1;
CabPos1.y = Inity1; CabPos1.y = Inity1;
@@ -272,7 +272,7 @@ void TTrain::OnKeyDown(int cKey)
if (GetAsyncKeyState(VK_SHIFT) < 0) if (GetAsyncKeyState(VK_SHIFT) < 0)
{ // wciœniêty [Shift] { // wciœniêty [Shift]
if (cKey == Global::Keys[k_IncMainCtrlFAST]) // McZapkie-200702: szybkie przelaczanie na if (cKey == Global::Keys[k_IncMainCtrlFAST]) // McZapkie-200702: szybkie przelaczanie na
// poz. bezoporowa // poz. bezoporowa
{ {
if (mvControlled->IncMainCtrl(2)) if (mvControlled->IncMainCtrl(2))
{ {
@@ -511,8 +511,8 @@ void TTrain::OnKeyDown(int cKey)
!mvOccupied->ActiveCab) // tylko w maszynowym !mvOccupied->ActiveCab) // tylko w maszynowym
if (Console::Pressed(VK_CONTROL)) // z [Ctrl] if (Console::Pressed(VK_CONTROL)) // z [Ctrl]
mvControlled->bPantKurek3 = true; // zbiornik pantografu po³¹czony jest ze mvControlled->bPantKurek3 = true; // zbiornik pantografu po³¹czony jest ze
// zbiornikiem g³ównym (pompowanie nie ma // zbiornikiem g³ównym (pompowanie nie ma
// sensu) // sensu)
else if (!mvControlled->PantCompFlag) // jeœli wy³¹czona else if (!mvControlled->PantCompFlag) // jeœli wy³¹czona
if (mvControlled->Battery) // jeszcze musi byæ za³¹czona bateria if (mvControlled->Battery) // jeszcze musi byæ za³¹czona bateria
if (mvControlled->PantPress < 4.8) // pisz¹, ¿e to tak nie dzia³a if (mvControlled->PantPress < 4.8) // pisz¹, ¿e to tak nie dzia³a
@@ -563,7 +563,7 @@ void TTrain::OnKeyDown(int cKey)
} }
} }
else if (cKey == Global::Keys[k_FailedEngineCutOff]) // McZapkie-060103: E - wylaczanie else if (cKey == Global::Keys[k_FailedEngineCutOff]) // McZapkie-060103: E - wylaczanie
// sekcji silnikow // sekcji silnikow
{ {
if (mvControlled->CutOffEngine()) if (mvControlled->CutOffEngine())
{ {
@@ -700,7 +700,7 @@ void TTrain::OnKeyDown(int cKey)
} }
else if (cKey == Global::Keys[k_Active]) // yB 300407: przelacznik rozrzadu else if (cKey == Global::Keys[k_Active]) // yB 300407: przelacznik rozrzadu
{ // Ra 2014-06: uruchomi³em to, aby aktywowaæ czuwak w zajmowanym cz³onie, a wy³¹czyæ w { // Ra 2014-06: uruchomi³em to, aby aktywowaæ czuwak w zajmowanym cz³onie, a wy³¹czyæ w
// innych // innych
// Ra 2014-03: aktywacja czuwaka przepiêta na ustawienie kierunku w mvOccupied // Ra 2014-03: aktywacja czuwaka przepiêta na ustawienie kierunku w mvOccupied
// if (mvControlled->Battery) //jeœli bateria jest ju¿ za³¹czona // if (mvControlled->Battery) //jeœli bateria jest ju¿ za³¹czona
// mvOccupied->BatterySwitch(true); //to w ten oto durny sposób aktywuje siê CA/SHP // mvOccupied->BatterySwitch(true); //to w ten oto durny sposób aktywuje siê CA/SHP
@@ -1080,7 +1080,7 @@ void TTrain::OnKeyDown(int cKey)
else else
; ;
else // Ra 1014-06: AI potrafi zahamowaæ pomocniczym mimo jego braku - odhamowaæ else // Ra 1014-06: AI potrafi zahamowaæ pomocniczym mimo jego braku - odhamowaæ
// jakoœ trzeba // jakoœ trzeba
if ((mvOccupied->LocalBrake != ManualBrake) || mvOccupied->LocalBrakePos) if ((mvOccupied->LocalBrake != ManualBrake) || mvOccupied->LocalBrakePos)
mvOccupied->DecLocalBrakeLevel(1); mvOccupied->DecLocalBrakeLevel(1);
} }
@@ -1166,10 +1166,10 @@ void TTrain::OnKeyDown(int cKey)
(mvOccupied->BrakeHandle == FV4a ? 1 : 0)); (mvOccupied->BrakeHandle == FV4a ? 1 : 0));
if (GetAsyncKeyState(VK_CONTROL) < 0) if (GetAsyncKeyState(VK_CONTROL) < 0)
mvOccupied->BrakeLevelSet(mvOccupied->Handle->GetPos(bh_NP)); // yB: czy ten stos mvOccupied->BrakeLevelSet(mvOccupied->Handle->GetPos(bh_NP)); // yB: czy ten stos
// funkcji nie // funkcji nie
// powinien byæ jako // powinien byæ jako
// oddzielna funkcja // oddzielna funkcja
// movera? // movera?
} }
else if (cKey == Global::Keys[k_Brake1]) else if (cKey == Global::Keys[k_Brake1])
{ {
@@ -1460,8 +1460,8 @@ void TTrain::OnKeyDown(int cKey)
!mvOccupied->ActiveCab) // tylko w maszynowym !mvOccupied->ActiveCab) // tylko w maszynowym
if (Console::Pressed(VK_CONTROL)) // z [Ctrl] if (Console::Pressed(VK_CONTROL)) // z [Ctrl]
mvControlled->bPantKurek3 = false; // zbiornik pantografu po³¹czony jest z ma³¹ mvControlled->bPantKurek3 = false; // zbiornik pantografu po³¹czony jest z ma³¹
// sprê¿ark¹ (pompowanie ma sens, ale potem // sprê¿ark¹ (pompowanie ma sens, ale potem
// trzeba prze³¹czyæ) // trzeba prze³¹czyæ)
else if (!mvControlled->PantCompFlag) // jeœli wy³¹czona else if (!mvControlled->PantCompFlag) // jeœli wy³¹czona
if (mvControlled->Battery) // jeszcze musi byæ za³¹czona bateria if (mvControlled->Battery) // jeszcze musi byæ za³¹czona bateria
if (mvControlled->PantPress < 4.8) // pisz¹, ¿e to tak nie dzia³a if (mvControlled->PantPress < 4.8) // pisz¹, ¿e to tak nie dzia³a
@@ -1714,7 +1714,7 @@ void TTrain::OnKeyDown(int cKey)
if (iCabn > 0) if (iCabn > 0)
{ {
if (!FreeFlyModeFlag) // tryb 'kabinowy' (pozwala równie¿ roz³¹czyæ sprzêgi if (!FreeFlyModeFlag) // tryb 'kabinowy' (pozwala równie¿ roz³¹czyæ sprzêgi
// zablokowane) // zablokowane)
{ {
if (DynamicObject->DettachStatus(iCabn - 1) < 0) // jeœli jest co odczepiæ if (DynamicObject->DettachStatus(iCabn - 1) < 0) // jeœli jest co odczepiæ
if (DynamicObject->Dettach(iCabn - 1)) // iCab==1:przód,iCab==2:ty³ if (DynamicObject->Dettach(iCabn - 1)) // iCab==1:przód,iCab==2:ty³
@@ -2036,7 +2036,7 @@ void TTrain::OnKeyDown(int cKey)
} }
} }
if (cKey == Global::Keys[k_RightSign]) // Winger 070304: swiatla tylne (koncowki) - if (cKey == Global::Keys[k_RightSign]) // Winger 070304: swiatla tylne (koncowki) -
// wlaczenie // wlaczenie
{ {
if ((GetAsyncKeyState(VK_CONTROL) < 0) && if ((GetAsyncKeyState(VK_CONTROL) < 0) &&
(ggRearRightLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu (ggRearRightLightButton.SubModel)) // hunter-230112 - z controlem gasi z tylu
@@ -2182,7 +2182,7 @@ void TTrain::OnKeyDown(int cKey)
if (DynamicObject->Mechanik) if (DynamicObject->Mechanik)
if (!FreeFlyModeFlag) //¿eby nie mieszaæ obserwuj¹c z zewn¹trz if (!FreeFlyModeFlag) //¿eby nie mieszaæ obserwuj¹c z zewn¹trz
DynamicObject->Mechanik->RouteSwitch(1); // na skrzy¿owaniu skrêci w DynamicObject->Mechanik->RouteSwitch(1); // na skrzy¿owaniu skrêci w
// lewo // lewo
} }
else if (cKey == Global::Keys[k_MechRight]) else if (cKey == Global::Keys[k_MechRight])
{ {
@@ -2458,7 +2458,7 @@ bool TTrain::Update()
} }
else else
fHCurrent[0] = fHCurrent[1] = fHCurrent[2] = fHCurrent[3] = 0.0; // gdy nie ma fHCurrent[0] = fHCurrent[1] = fHCurrent[2] = fHCurrent[3] = 0.0; // gdy nie ma
// cz³ona // cz³ona
} }
else else
{ // normalne pokazywanie { // normalne pokazywanie
@@ -2472,17 +2472,17 @@ bool TTrain::Update()
Console::ValueSet(0, Console::ValueSet(0,
mvOccupied->Compressor); // Ra: sterowanie miernikiem: zbiornik g³ówny mvOccupied->Compressor); // Ra: sterowanie miernikiem: zbiornik g³ówny
Console::ValueSet(1, mvOccupied->PipePress); // Ra: sterowanie miernikiem: przewód Console::ValueSet(1, mvOccupied->PipePress); // Ra: sterowanie miernikiem: przewód
// g³ówny // g³ówny
Console::ValueSet( Console::ValueSet(
2, mvOccupied->BrakePress); // Ra: sterowanie miernikiem: cylinder hamulcowy 2, mvOccupied->BrakePress); // Ra: sterowanie miernikiem: cylinder hamulcowy
Console::ValueSet(3, fHVoltage); // woltomierz wysokiego napiêcia Console::ValueSet(3, fHVoltage); // woltomierz wysokiego napiêcia
Console::ValueSet(4, fHCurrent[2]); // Ra: sterowanie miernikiem: drugi amperomierz Console::ValueSet(4, fHCurrent[2]); // Ra: sterowanie miernikiem: drugi amperomierz
Console::ValueSet( Console::ValueSet(
5, fHCurrent[(mvControlled->TrainType & dt_EZT) ? 0 : 1]); // pierwszy amperomierz; 5, fHCurrent[(mvControlled->TrainType & dt_EZT) ? 0 : 1]); // pierwszy amperomierz;
// dla EZT pr¹d ca³kowity // dla EZT pr¹d ca³kowity
Console::ValueSet(6, fTachoVelocity); ////Ra: prêdkoœæ na pin 43 - wyjœcie analogowe (to Console::ValueSet(6, fTachoVelocity); ////Ra: prêdkoœæ na pin 43 - wyjœcie analogowe (to
///nie jest PWM); skakanie zapewnia mechanika /// nie jest PWM); skakanie zapewnia mechanika
///napêdu /// napêdu
} }
// hunter-080812: wyrzucanie szybkiego na elektrykach gdy nie ma napiecia przy dowolnym // hunter-080812: wyrzucanie szybkiego na elektrykach gdy nie ma napiecia przy dowolnym
@@ -2517,7 +2517,7 @@ bool TTrain::Update()
(mvControlled->TrainType == dt_EZT)) && (mvControlled->TrainType == dt_EZT)) &&
(DynamicObject->Controller == Humandriver)) // hunter-110212: poprawka dla EZT (DynamicObject->Controller == Humandriver)) // hunter-110212: poprawka dla EZT
{ // hunter-091012: poprawka (zmiana warunku z CompressorPower /rozne od 0/ na /rowne { // hunter-091012: poprawka (zmiana warunku z CompressorPower /rozne od 0/ na /rowne
// 1/) // 1/)
if (fConverterTimer < fConverterPrzekaznik) if (fConverterTimer < fConverterPrzekaznik)
{ {
mvControlled->ConvOvldFlag = true; mvControlled->ConvOvldFlag = true;
@@ -3056,7 +3056,7 @@ bool TTrain::Update()
if (mvControlled->SlippingWheels) if (mvControlled->SlippingWheels)
{ // Ra 2014-12: lokomotywy 181/182 dostaj¹ SlippingWheels po zahamowaniu powy¿ej 2.85 bara { // Ra 2014-12: lokomotywy 181/182 dostaj¹ SlippingWheels po zahamowaniu powy¿ej 2.85 bara
// i bucza³y // i bucza³y
double veldiff = (DynamicObject->GetVelocity() - fTachoVelocity) / mvControlled->Vmax; double veldiff = (DynamicObject->GetVelocity() - fTachoVelocity) / mvControlled->Vmax;
if (veldiff < if (veldiff <
-0.01) // 1% Vmax rezerwy, ¿eby 181/182 nie bucza³y po zahamowaniu, ale to proteza -0.01) // 1% Vmax rezerwy, ¿eby 181/182 nie bucza³y po zahamowaniu, ale to proteza
@@ -3101,7 +3101,7 @@ bool TTrain::Update()
if ((mvControlled->Itot != 0) || (mvOccupied->BrakePress > 2) || if ((mvControlled->Itot != 0) || (mvOccupied->BrakePress > 2) ||
(mvOccupied->PipePress < 3.6)) (mvOccupied->PipePress < 3.6))
btLampkaStyczn.TurnOff(); // Ra: czy to jest udawanie dzia³ania styczników btLampkaStyczn.TurnOff(); // Ra: czy to jest udawanie dzia³ania styczników
// liniowych? // liniowych?
else if (mvOccupied->BrakePress < 1) else if (mvOccupied->BrakePress < 1)
btLampkaStyczn.TurnOn(); // mozna prowadzic rozruch btLampkaStyczn.TurnOn(); // mozna prowadzic rozruch
if (((TestFlag(mvControlled->Couplers[1].CouplingFlag, ctrain_controll)) && if (((TestFlag(mvControlled->Couplers[1].CouplingFlag, ctrain_controll)) &&
@@ -3115,9 +3115,9 @@ bool TTrain::Update()
// if ((TestFlag(mvControlled->BrakeStatus,+b_Rused+b_Ractive)))//Lampka // if ((TestFlag(mvControlled->BrakeStatus,+b_Rused+b_Ractive)))//Lampka
// drugiego stopnia hamowania // drugiego stopnia hamowania
btLampkaHamPosp.Turn((TestFlag(mvOccupied->BrakeStatus, 1))); // lampka drugiego stopnia btLampkaHamPosp.Turn((TestFlag(mvOccupied->BrakeStatus, 1))); // lampka drugiego stopnia
// hamowania //TODO: // hamowania //TODO:
// youBy wyci¹gn¹æ flagê // youBy wyci¹gn¹æ flagê
// wysokiego stopnia // wysokiego stopnia
// hunter-111211: wylacznik cisnieniowy - Ra: tutaj? w kabinie? //yBARC - // hunter-111211: wylacznik cisnieniowy - Ra: tutaj? w kabinie? //yBARC -
// omujborzegrzesiuzniszczylesmicalydzien // omujborzegrzesiuzniszczylesmicalydzien
@@ -3214,7 +3214,7 @@ bool TTrain::Update()
{ // yB - wskazniki drugiego czlonu { // yB - wskazniki drugiego czlonu
TDynamicObject * TDynamicObject *
tmp; //=mvControlled->mvSecond; //Ra 2014-07: trzeba to jeszcze wyj¹æ z kabiny... tmp; //=mvControlled->mvSecond; //Ra 2014-07: trzeba to jeszcze wyj¹æ z kabiny...
// Ra 2014-07: no nie ma potrzeby szukaæ tego w ka¿dej klatce // Ra 2014-07: no nie ma potrzeby szukaæ tego w ka¿dej klatce
tmp = NULL; tmp = NULL;
if ((TestFlag(mvControlled->Couplers[1].CouplingFlag, ctrain_controll)) && if ((TestFlag(mvControlled->Couplers[1].CouplingFlag, ctrain_controll)) &&
(mvOccupied->ActiveCab > 0)) (mvOccupied->ActiveCab > 0))
@@ -4058,10 +4058,10 @@ bool TTrain::Update()
if (!FreeFlyModeFlag) if (!FreeFlyModeFlag)
{ {
if (Console::Pressed(Global::Keys[k_Releaser])) // yB: odluzniacz caly czas trzymany, if (Console::Pressed(Global::Keys[k_Releaser])) // yB: odluzniacz caly czas trzymany,
// warunki powinny byc takie same, jak // warunki powinny byc takie same, jak
// przy naciskaniu. Wlasciwie stamtad // przy naciskaniu. Wlasciwie stamtad
// mozna wyrzucic sprawdzanie // mozna wyrzucic sprawdzanie
// nacisniecia. // nacisniecia.
{ {
if ((mvControlled->EngineType == ElectricSeriesMotor) || if ((mvControlled->EngineType == ElectricSeriesMotor) ||
(mvControlled->EngineType == DieselElectric)) (mvControlled->EngineType == DieselElectric))
@@ -4123,8 +4123,8 @@ bool TTrain::Update()
if (ggUniversal3Button.SubModel) if (ggUniversal3Button.SubModel)
{ {
ggUniversal3Button.PutValue(1); // hunter-131211: z UpdateValue na PutValue ggUniversal3Button.PutValue(1); // hunter-131211: z UpdateValue na PutValue
// - by zachowywal sie jak pozostale // - by zachowywal sie jak pozostale
// przelaczniki // przelaczniki
if (btLampkaUniversal3.Active()) if (btLampkaUniversal3.Active())
LampkaUniversal3_st = true; LampkaUniversal3_st = true;
} }
@@ -4146,8 +4146,8 @@ bool TTrain::Update()
if (ggUniversal3Button.SubModel) if (ggUniversal3Button.SubModel)
{ {
ggUniversal3Button.PutValue(0); // hunter-131211: z UpdateValue na PutValue ggUniversal3Button.PutValue(0); // hunter-131211: z UpdateValue na PutValue
// - by zachowywal sie jak pozostale // - by zachowywal sie jak pozostale
// przelaczniki // przelaczniki
if (btLampkaUniversal3.Active()) if (btLampkaUniversal3.Active())
LampkaUniversal3_st = false; LampkaUniversal3_st = false;
} }
@@ -4259,8 +4259,8 @@ bool TTrain::Update()
if (ggCabLightDimButton.SubModel) if (ggCabLightDimButton.SubModel)
{ {
ggCabLightDimButton.PutValue(0); // hunter-131211: z UpdateValue na PutValue ggCabLightDimButton.PutValue(0); // hunter-131211: z UpdateValue na PutValue
// - by zachowywal sie jak pozostale // - by zachowywal sie jak pozostale
// przelaczniki // przelaczniki
} }
} }
else else
@@ -4619,7 +4619,7 @@ bool TTrain::CabChange(int iDirection)
return true; // uda³o siê zmieniæ kabinê return true; // uda³o siê zmieniæ kabinê
} }
DynamicObject->MoverParameters->CabActivisation(); // aktywizacja poprzedniej, bo jeszcze DynamicObject->MoverParameters->CabActivisation(); // aktywizacja poprzedniej, bo jeszcze
// nie wiadomo, czy jakiœ pojazd jest // nie wiadomo, czy jakiœ pojazd jest
} }
return false; // ewentualna zmiana pojazdu return false; // ewentualna zmiana pojazdu
} }
@@ -4895,7 +4895,7 @@ bool TTrain::LoadMMediaFile(AnsiString asFileName)
{ {
if (DynamicObject->Controller == Humandriver) if (DynamicObject->Controller == Humandriver)
DynamicObject->bDisplayCab = true; // McZapkie-030303: mozliwosc wyswietlania kabiny, w DynamicObject->bDisplayCab = true; // McZapkie-030303: mozliwosc wyswietlania kabiny, w
// przyszlosci dac opcje w mmd // przyszlosci dac opcje w mmd
return true; return true;
} }
} }
@@ -4998,7 +4998,7 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName)
if (k) if (k)
DynamicObject->mdKabina = k; // nowa kabina DynamicObject->mdKabina = k; // nowa kabina
//(mdKabina) mo¿e zostaæ to samo po przejœciu do innego cz³onu bez zmiany //(mdKabina) mo¿e zostaæ to samo po przejœciu do innego cz³onu bez zmiany
//kabiny, przy powrocie musi byæ wi¹zanie ponowne // kabiny, przy powrocie musi byæ wi¹zanie ponowne
// else // else
// break; //wyjœcie z pêtli, bo model zostaje bez zmian // break; //wyjœcie z pêtli, bo model zostaje bez zmian
} }
@@ -5183,7 +5183,7 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName)
else if (str == AnsiString("fuse_bt:")) // bezp. nadmiarowy else if (str == AnsiString("fuse_bt:")) // bezp. nadmiarowy
ggFuseButton.Load(Parser, DynamicObject->mdKabina); ggFuseButton.Load(Parser, DynamicObject->mdKabina);
else if (str == AnsiString("converterfuse_bt:")) // hunter-261211: odblokowanie else if (str == AnsiString("converterfuse_bt:")) // hunter-261211: odblokowanie
// przekaznika nadm. przetw. i ogrz. // przekaznika nadm. przetw. i ogrz.
ggConverterFuseButton.Load(Parser, DynamicObject->mdKabina); ggConverterFuseButton.Load(Parser, DynamicObject->mdKabina);
else if (str == AnsiString("stlinoff_bt:")) // st. liniowe else if (str == AnsiString("stlinoff_bt:")) // st. liniowe
ggStLinOffButton.Load(Parser, DynamicObject->mdKabina); ggStLinOffButton.Load(Parser, DynamicObject->mdKabina);
@@ -5386,7 +5386,7 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName)
gg->AssignDouble(&mvControlled->dizel_engage); gg->AssignDouble(&mvControlled->dizel_engage);
} // ggEngageRatio.Load(Parser,DynamicObject->mdKabina); } // ggEngageRatio.Load(Parser,DynamicObject->mdKabina);
else if (str == AnsiString("maingearstatus:")) // np. ciœnienie sterownika skrzyni else if (str == AnsiString("maingearstatus:")) // np. ciœnienie sterownika skrzyni
// biegów // biegów
ggMainGearStatus.Load(Parser, DynamicObject->mdKabina); ggMainGearStatus.Load(Parser, DynamicObject->mdKabina);
else if (str == AnsiString("ignitionkey:")) // else if (str == AnsiString("ignitionkey:")) //
ggIgnitionKey.Load(Parser, DynamicObject->mdKabina); ggIgnitionKey.Load(Parser, DynamicObject->mdKabina);
@@ -5553,7 +5553,7 @@ vector3 TTrain::MirrorPosition(bool lewe)
void TTrain::DynamicSet(TDynamicObject *d) void TTrain::DynamicSet(TDynamicObject *d)
{ // taka proteza: chcê pod³¹czyæ kabinê EN57 bezpoœrednio z silnikowym, aby nie robiæ tego przez { // taka proteza: chcê pod³¹czyæ kabinê EN57 bezpoœrednio z silnikowym, aby nie robiæ tego przez
// ukrotnienie // ukrotnienie
// drugi silnikowy i tak musi byæ ukrotniony, podobnie jak kolejna jednostka // drugi silnikowy i tak musi byæ ukrotniony, podobnie jak kolejna jednostka
// problem siê robi ze œwiat³ami, które bêd¹ zapalane w silnikowym, ale musz¹ œwieciæ siê w // problem siê robi ze œwiat³ami, które bêd¹ zapalane w silnikowym, ale musz¹ œwieciæ siê w
// rozrz¹dczych // rozrz¹dczych

29
Train.h
View File

@@ -44,7 +44,7 @@ class TCab
TCab(); TCab();
~TCab(); ~TCab();
void Init(double Initx1, double Inity1, double Initz1, double Initx2, double Inity2, void Init(double Initx1, double Inity1, double Initz1, double Initx2, double Inity2,
double Initz2, bool InitEnabled, bool InitOccupied); double Initz2, bool InitEnabled, bool InitOccupied);
void Load(TQueryParserComp *Parser); void Load(TQueryParserComp *Parser);
vector3 CabPos1; vector3 CabPos1;
vector3 CabPos2; vector3 CabPos2;
@@ -83,8 +83,14 @@ class TTrain
// bool SHP() { fShpTimer= 0; }; // bool SHP() { fShpTimer= 0; };
inline vector3 GetDirection() { return DynamicObject->VectorFront(); }; inline vector3 GetDirection()
inline vector3 GetUp() { return DynamicObject->VectorUp(); }; {
return DynamicObject->VectorFront();
};
inline vector3 GetUp()
{
return DynamicObject->VectorUp();
};
void UpdateMechPosition(double dt); void UpdateMechPosition(double dt);
bool Update(); bool Update();
void MechStop(); void MechStop();
@@ -145,7 +151,7 @@ class TTrain
TGauge ggAntiSlipButton; TGauge ggAntiSlipButton;
TGauge ggFuseButton; TGauge ggFuseButton;
TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania nadmiarowego przetwornic i TGauge ggConverterFuseButton; // hunter-261211: przycisk odblokowania nadmiarowego przetwornic i
// ogrzewania // ogrzewania
TGauge ggStLinOffButton; TGauge ggStLinOffButton;
TGauge ggRadioButton; TGauge ggRadioButton;
TGauge ggUpperLightButton; TGauge ggUpperLightButton;
@@ -373,9 +379,18 @@ class TTrain
int iSekunda; // Ra: sekunda aktualizacji pr璠ko𦣇i int iSekunda; // Ra: sekunda aktualizacji pr璠ko𦣇i
int iRadioChannel; // numer aktualnego kana逝 radiowego int iRadioChannel; // numer aktualnego kana逝 radiowego
public: public:
int RadioChannel() { return iRadioChannel; }; int RadioChannel()
inline TDynamicObject *__fastcall Dynamic() { return DynamicObject; }; {
inline TMoverParameters *__fastcall Controlled() { return mvControlled; }; return iRadioChannel;
};
inline TDynamicObject *__fastcall Dynamic()
{
return DynamicObject;
};
inline TMoverParameters *__fastcall Controlled()
{
return mvControlled;
};
void DynamicSet(TDynamicObject *d); void DynamicSet(TDynamicObject *d);
void Silence(); void Silence();
}; };

View File

@@ -37,7 +37,9 @@ TTrackFollower::TTrackFollower()
fOffsetH = 0.0; // na starcie stoi na środku fOffsetH = 0.0; // na starcie stoi na środku
} }
TTrackFollower::~TTrackFollower() {} TTrackFollower::~TTrackFollower()
{
}
bool TTrackFollower::Init(TTrack *pTrack, TDynamicObject *NewOwner, double fDir) bool TTrackFollower::Init(TTrack *pTrack, TDynamicObject *NewOwner, double fDir)
{ {
@@ -76,7 +78,7 @@ TTrack *__fastcall TTrackFollower::SetCurrentTrack(TTrack *pTrack, int end)
// bezpośrednio // bezpośrednio
if (iSegment == 0) if (iSegment == 0)
{ // to jest błędna sytuacja - generuje pętle zawracające za skrzyżowaniem - ustalić, { // to jest błędna sytuacja - generuje pętle zawracające za skrzyżowaniem - ustalić,
// kiedy powstaje! // kiedy powstaje!
iSegment = 1; // doraźna poprawka iSegment = 1; // doraźna poprawka
} }
if ((end ? iSegment : -iSegment) < 0) if ((end ? iSegment : -iSegment) < 0)
@@ -129,14 +131,14 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary)
if (fDistance < 0) if (fDistance < 0)
{ {
if (iSetFlag(iEventFlag, -1)) // zawsze zeruje flagę sprawdzenia, jak mechanik if (iSetFlag(iEventFlag, -1)) // zawsze zeruje flagę sprawdzenia, jak mechanik
// dosiądzie, to się nie wykona // dosiądzie, to się nie wykona
if (Owner->Mechanik) // tylko dla jednego członu if (Owner->Mechanik) // tylko dla jednego członu
// if (TestFlag(iEventFlag,1)) //McZapkie-280503: wyzwalanie event tylko dla // if (TestFlag(iEventFlag,1)) //McZapkie-280503: wyzwalanie event tylko dla
// pojazdow z obsada // pojazdow z obsada
if (bPrimary && pCurrentTrack->evEvent1 && if (bPrimary && pCurrentTrack->evEvent1 &&
(!pCurrentTrack->evEvent1->iQueued)) (!pCurrentTrack->evEvent1->iQueued))
Global::AddToQuery(pCurrentTrack->evEvent1, Owner); // dodanie do Global::AddToQuery(pCurrentTrack->evEvent1, Owner); // dodanie do
// kolejki // kolejki
// Owner->RaAxleEvent(pCurrentTrack->Event1); //Ra: dynamic zdecyduje, czy dodać do // Owner->RaAxleEvent(pCurrentTrack->Event1); //Ra: dynamic zdecyduje, czy dodać do
// kolejki // kolejki
// if (TestFlag(iEventallFlag,1)) // if (TestFlag(iEventallFlag,1))
@@ -151,7 +153,7 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary)
else if (fDistance > 0) else if (fDistance > 0)
{ {
if (iSetFlag(iEventFlag, -2)) // zawsze ustawia flagę sprawdzenia, jak mechanik if (iSetFlag(iEventFlag, -2)) // zawsze ustawia flagę sprawdzenia, jak mechanik
// dosiądzie, to się nie wykona // dosiądzie, to się nie wykona
if (Owner->Mechanik) // tylko dla jednego członu if (Owner->Mechanik) // tylko dla jednego członu
// if (TestFlag(iEventFlag,2)) //sprawdzanie jest od razu w pierwszym // if (TestFlag(iEventFlag,2)) //sprawdzanie jest od razu w pierwszym
// warunku // warunku

View File

@@ -26,7 +26,7 @@ class TTrackFollower
int iEventFlag; // McZapkie-020602: informacja o tym czy wyzwalac zdarzenie: 0,1,2,3 int iEventFlag; // McZapkie-020602: informacja o tym czy wyzwalac zdarzenie: 0,1,2,3
int iEventallFlag; int iEventallFlag;
int iSegment; // który segment toru jest u¿ywany (¿eby nie przeskakiwa³o po przestawieniu int iSegment; // który segment toru jest u¿ywany (¿eby nie przeskakiwa³o po przestawieniu
// zwrotnicy pod taborem) // zwrotnicy pod taborem)
public: public:
double fOffsetH; // Ra: odleg³oœæ œrodka osi od osi toru (dla samochodów) - u¿yæ do wê¿ykowania double fOffsetH; // Ra: odleg³oœæ œrodka osi od osi toru (dla samochodów) - u¿yæ do wê¿ykowania
vector3 pPosition; // wspó³rzêdne XYZ w uk³adzie scenerii vector3 pPosition; // wspó³rzêdne XYZ w uk³adzie scenerii
@@ -35,14 +35,23 @@ class TTrackFollower
~TTrackFollower(); ~TTrackFollower();
TTrack *__fastcall SetCurrentTrack(TTrack *pTrack, int end); TTrack *__fastcall SetCurrentTrack(TTrack *pTrack, int end);
bool Move(double fDistance, bool bPrimary); bool Move(double fDistance, bool bPrimary);
inline TTrack *__fastcall GetTrack() { return pCurrentTrack; }; inline TTrack *__fastcall GetTrack()
{
return pCurrentTrack;
};
inline double GetRoll() inline double GetRoll()
{ {
return vAngles.x; return vAngles.x;
}; // przechy³ka policzona przy ustalaniu pozycji }; // przechy³ka policzona przy ustalaniu pozycji
//{return pCurrentSegment->GetRoll(fCurrentDistance)*fDirection;}; //zamiast liczyæ mo¿na pobraæ //{return pCurrentSegment->GetRoll(fCurrentDistance)*fDirection;}; //zamiast liczyæ mo¿na pobraæ
inline double GetDirection() { return fDirection; }; // zwrot na torze inline double GetDirection()
inline double GetTranslation() { return fCurrentDistance; }; // ABu-030403 {
return fDirection;
}; // zwrot na torze
inline double GetTranslation()
{
return fCurrentDistance;
}; // ABu-030403
// inline double GetLength(vector3 p1, vector3 cp1, vector3 cp2, vector3 p2) // inline double GetLength(vector3 p1, vector3 cp1, vector3 cp2, vector3 p2)
//{ return pCurrentSegment->ComputeLength(p1,cp1,cp2,p2); }; //{ return pCurrentSegment->ComputeLength(p1,cp1,cp2,p2); };
// inline double GetRadius(double L, double d); //McZapkie-150503 // inline double GetRadius(double L, double d); //McZapkie-150503

View File

@@ -233,7 +233,7 @@ bool TWorld::Init(HWND NhWnd, HDC hDC)
if (Global::fOpenGL >= if (Global::fOpenGL >=
1.4) // 1.4 mia³o obs³ugê VBO, ale bez opcji modyfikacji fragmentu bufora 1.4) // 1.4 mia³o obs³ugê VBO, ale bez opcji modyfikacji fragmentu bufora
Global::bUseVBO = true; // VBO w³¹czane tylko, jeœli jest obs³uga oraz nie ustawiono Global::bUseVBO = true; // VBO w³¹czane tylko, jeœli jest obs³uga oraz nie ustawiono
// ni¿szego numeru // ni¿szego numeru
} }
if (Global::bUseVBO) if (Global::bUseVBO)
WriteLog("Ra: The VBO is found and will be used."); WriteLog("Ra: The VBO is found and will be used.");
@@ -269,7 +269,7 @@ bool TWorld::Init(HWND NhWnd, HDC hDC)
if (Global::fOpenGL >= 1.2) // poni¿sze nie dzia³a w 1.1 if (Global::fOpenGL >= 1.2) // poni¿sze nie dzia³a w 1.1
glTexEnvf(TEXTURE_FILTER_CONTROL_EXT, TEXTURE_LOD_BIAS_EXT, -1); glTexEnvf(TEXTURE_FILTER_CONTROL_EXT, TEXTURE_LOD_BIAS_EXT, -1);
GLfloat FogColor[] = {1.0f, 1.0f, 1.0f, 1.0f}; GLfloat FogColor[] = {1.0f, 1.0f, 1.0f, 1.0f};
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear screen and depth buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear screen and depth buffer
glLoadIdentity(); glLoadIdentity();
// WriteLog("glClearColor (FogColor[0], FogColor[1], FogColor[2], 0.0); "); // WriteLog("glClearColor (FogColor[0], FogColor[1], FogColor[2], 0.0); ");
@@ -404,8 +404,9 @@ bool TWorld::Init(HWND NhWnd, HDC hDC)
glFogi(GL_FOG_MODE, GL_LINEAR); // Fog Mode glFogi(GL_FOG_MODE, GL_LINEAR); // Fog Mode
WriteLog("glFogfv(GL_FOG_COLOR, FogColor);"); WriteLog("glFogfv(GL_FOG_COLOR, FogColor);");
glFogfv(GL_FOG_COLOR, FogColor); // Set Fog Color glFogfv(GL_FOG_COLOR, FogColor); // Set Fog Color
// glFogf(GL_FOG_DENSITY, 0.594f); // How Dense Will The Fog // glFogf(GL_FOG_DENSITY, 0.594f); // How Dense Will The
//Be //Fog
// Be
// glHint(GL_FOG_HINT, GL_NICEST); // Fog Hint Value // glHint(GL_FOG_HINT, GL_NICEST); // Fog Hint Value
WriteLog("glFogf(GL_FOG_START, 1000.0f);"); WriteLog("glFogf(GL_FOG_START, 1000.0f);");
glFogf(GL_FOG_START, 10.0f); // Fog Start Depth glFogf(GL_FOG_START, 10.0f); // Fog Start Depth
@@ -836,7 +837,7 @@ void TWorld::OnKeyDown(int cKey)
if ((Global::iWriteLogEnabled & 2) == 0) // nie by³o okienka if ((Global::iWriteLogEnabled & 2) == 0) // nie by³o okienka
{ // otwarcie okna { // otwarcie okna
AllocConsole(); // jeœli konsola ju¿ jest, to zwróci b³¹d; uwalniaæ nie ma po AllocConsole(); // jeœli konsola ju¿ jest, to zwróci b³¹d; uwalniaæ nie ma po
// co, bo siê od³¹czy // co, bo siê od³¹czy
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
} }
} }
@@ -898,7 +899,7 @@ void TWorld::OnKeyDown(int cKey)
if (CouplNr < 0) if (CouplNr < 0)
CouplNr = 0; // z [-1,1] zrobiæ [0,1] CouplNr = 0; // z [-1,1] zrobiæ [0,1]
int mask, set = 0; // Ra: [Shift]+[Ctrl]+[T] odpala mi jak¹œ idiotyczn¹ zmianê int mask, set = 0; // Ra: [Shift]+[Ctrl]+[T] odpala mi jak¹œ idiotyczn¹ zmianê
// tapety pulpitu :/ // tapety pulpitu :/
if (GetAsyncKeyState(VK_SHIFT) < 0) // z [Shift] zapalanie if (GetAsyncKeyState(VK_SHIFT) < 0) // z [Shift] zapalanie
set = mask = 64; // bez [Ctrl] za³o¿yæ tabliczki set = mask = 64; // bez [Ctrl] za³o¿yæ tabliczki
else if (GetAsyncKeyState(VK_CONTROL) < 0) else if (GetAsyncKeyState(VK_CONTROL) < 0)
@@ -1166,7 +1167,7 @@ bool TWorld::Update()
double a = fmod(Global::fTimeAngleDeg, 360.0) / 180.0 * M_PI - double a = fmod(Global::fTimeAngleDeg, 360.0) / 180.0 * M_PI -
M_PI; // k¹t godzinny w radianach M_PI; // k¹t godzinny w radianach
//(a) jest traktowane jako czas miejscowy, nie uwzglêdniaj¹cy stref czasowych ani czasu //(a) jest traktowane jako czas miejscowy, nie uwzglêdniaj¹cy stref czasowych ani czasu
//letniego // letniego
// aby wyznaczyæ strefê czasow¹, trzeba uwzglêdniæ po³udnik miejscowy // aby wyznaczyæ strefê czasow¹, trzeba uwzglêdniæ po³udnik miejscowy
// aby uwzglêdniæ czas letni, trzeba sprawdziæ dzieñ roku // aby uwzglêdniæ czas letni, trzeba sprawdziæ dzieñ roku
double L = Global::fLatitudeDeg / 180.0 * M_PI; // szerokoϾ geograficzna double L = Global::fLatitudeDeg / 180.0 * M_PI; // szerokoϾ geograficzna
@@ -1281,7 +1282,7 @@ bool TWorld::Update()
if (100.0 * LengthSquared3(d->GetPosition() - Camera.Pos) > if (100.0 * LengthSquared3(d->GetPosition() - Camera.Pos) >
LengthSquared3(pDynamicNearest->GetPosition() - Camera.Pos)) LengthSquared3(pDynamicNearest->GetPosition() - Camera.Pos))
d = pDynamicNearest; // jeœli najbli¿szy nie jest 10 razy bli¿ej ni¿ d = pDynamicNearest; // jeœli najbli¿szy nie jest 10 razy bli¿ej ni¿
// poprzedni najbli¿szy, zostaje poprzedni // poprzedni najbli¿szy, zostaje poprzedni
if (d) if (d)
pDynamicNearest = d; // zmiana na nowy, jeœli coœ znaleziony niepusty pDynamicNearest = d; // zmiana na nowy, jeœli coœ znaleziony niepusty
if (pDynamicNearest) if (pDynamicNearest)
@@ -1319,7 +1320,7 @@ bool TWorld::Update()
fTimeBuffer -= iter * fMaxDt; // reszta czasu na potem (do bufora) fTimeBuffer -= iter * fMaxDt; // reszta czasu na potem (do bufora)
if (n > 20) if (n > 20)
n = 20; // Ra: je¿eli FPS jest zatrwa¿aj¹co niski, to fizyka nie mo¿e zaj¹æ ca³kowicie n = 20; // Ra: je¿eli FPS jest zatrwa¿aj¹co niski, to fizyka nie mo¿e zaj¹æ ca³kowicie
// procesora // procesora
#if 0 #if 0
Ground.UpdatePhys(fMaxDt,n); //Ra: teraz czas kroku jest (wzglêdnie) sta³y Ground.UpdatePhys(fMaxDt,n); //Ra: teraz czas kroku jest (wzglêdnie) sta³y
if (DebugModeFlag) if (DebugModeFlag)
@@ -1404,7 +1405,7 @@ bool TWorld::Update()
} }
else else
{ // patrzenie w kierunku osi pojazdu, z uwzglêdnieniem kabiny - jakby z lusterka, { // patrzenie w kierunku osi pojazdu, z uwzglêdnieniem kabiny - jakby z lusterka,
// ale bez odbicia // ale bez odbicia
Camera.LookAt = Camera.Pos - Camera.LookAt = Camera.Pos -
Train->GetDirection() * Train->GetDirection() *
Train->Dynamic()->MoverParameters->ActiveCab; //-1 albo 1 Train->Dynamic()->MoverParameters->ActiveCab; //-1 albo 1
@@ -1427,7 +1428,7 @@ bool TWorld::Update()
atan(Train->pMechShake.x * Train->fMechRoll); // hustanie kamery na boki atan(Train->pMechShake.x * Train->fMechRoll); // hustanie kamery na boki
Camera.Pitch -= atan(Train->vMechVelocity.z * Camera.Pitch -= atan(Train->vMechVelocity.z *
Train->fMechPitch); // hustanie kamery przod tyl //Ra: tu Train->fMechPitch); // hustanie kamery przod tyl //Ra: tu
// jest uciekanie kamery w górê!!! // jest uciekanie kamery w górê!!!
} }
// ABu011104: rzucanie pudlem // ABu011104: rzucanie pudlem
vector3 temp; vector3 temp;
@@ -1834,7 +1835,7 @@ bool TWorld::Update()
{ {
OutText2 = Controlled->Mechanik->Relation(); OutText2 = Controlled->Mechanik->Relation();
if (!OutText2.IsEmpty()) // jeœli jest podana relacja, to dodajemy punkt nastêpnego if (!OutText2.IsEmpty()) // jeœli jest podana relacja, to dodajemy punkt nastêpnego
// zatrzymania // zatrzymania
OutText2 = OutText2 =
Global::Bezogonkow(OutText2 + ": -> " + Controlled->Mechanik->NextStop(), Global::Bezogonkow(OutText2 + ": -> " + Controlled->Mechanik->NextStop(),
true); // dopisanie punktu zatrzymania true); // dopisanie punktu zatrzymania
@@ -2430,13 +2431,12 @@ bool TWorld::Update()
glColor3f(0.0f, 1.0f, 0.0f); // zielone glColor3f(0.0f, 1.0f, 0.0f); // zielone
glRasterPos2f( glRasterPos2f(
-0.25f, -0.25f,
0.18f - 0.18f - 0.02f * (i - tmp->Mechanik->iStationStart)); // dopiero
0.02f * (i - tmp->Mechanik->iStationStart)); // dopiero // ustawienie
// ustawienie // pozycji
// pozycji // ustala
// ustala // kolor,
// kolor, // dziwne...
// dziwne...
glPrint(Global::Bezogonkow(OutText1, true).c_str()); glPrint(Global::Bezogonkow(OutText1, true).c_str());
glColor3f(1.0f, 1.0f, 1.0f); // a reszta bia³ym glColor3f(1.0f, 1.0f, 1.0f); // a reszta bia³ym
} }
@@ -2699,7 +2699,7 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz)
if ((e->Type == tp_Multiple) || (e->Type == tp_Lights) || if ((e->Type == tp_Multiple) || (e->Type == tp_Lights) ||
bool(e->evJoined)) // tylko jawne albo niejawne Multiple bool(e->evJoined)) // tylko jawne albo niejawne Multiple
Ground.AddToQuery(e, NULL); // drugi parametr to dynamic wywo³uj¹cy - tu Ground.AddToQuery(e, NULL); // drugi parametr to dynamic wywo³uj¹cy - tu
// brak // brak
} }
break; break;
case 3: // rozkaz dla AI case 3: // rozkaz dla AI
@@ -2767,7 +2767,7 @@ void TWorld::OnCommandGet(DaneRozkaz *pRozkaz)
} }
else else
{ // dla pustego wysy³amy ramki 6 z nazwami pojazdów AI (jeœli potrzebne wszystkie, { // dla pustego wysy³amy ramki 6 z nazwami pojazdów AI (jeœli potrzebne wszystkie,
// to rozpoznaæ np. "*") // to rozpoznaæ np. "*")
Ground.DynamicList(); Ground.DynamicList();
} }
} }
@@ -2853,7 +2853,7 @@ void TWorld::CreateE3D(const AnsiString &dir, bool dyn)
{ // wypada³o by sprawdziæ, czy T3D ³adunku jest { // wypada³o by sprawdziæ, czy T3D ³adunku jest
load = loads.SubString(1, i - 1); load = loads.SubString(1, i - 1);
if (FileExists(dir + load + ".t3d")) // o ile jest plik ³adunku, bo if (FileExists(dir + load + ".t3d")) // o ile jest plik ³adunku, bo
// inaczej nie ma to sensu // inaczej nie ma to sensu
if (!FileExists( if (!FileExists(
dir + load + dir + load +
".e3d")) // a nie ma jeszcze odpowiednika binarnego ".e3d")) // a nie ma jeszcze odpowiednika binarnego

View File

@@ -49,7 +49,10 @@ void inline vector3::SafeNormalize()
} }
// From code in Graphics Gems; p. 766 // 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, 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) scalar_t c1, scalar_t c2, scalar_t c3)
@@ -390,7 +393,8 @@ int main(int, char *[])
Testmatrix4x4(); Testmatrix4x4();
matrixFailures = failures; matrixFailures = failures;
cout << endl << "****************************************" << endl; cout << endl
<< "****************************************" << endl;
cout << "* *" << endl; cout << "* *" << endl;
if (vectorFailures + matrixFailures == 0) if (vectorFailures + matrixFailures == 0)
cout << "* No failures detected in Math3D *" << endl; cout << "* No failures detected in Math3D *" << endl;

102
dumb3d.h
View File

@@ -27,15 +27,26 @@ namespace Math3D
typedef double scalar_t; typedef double scalar_t;
// inline pass-throughs to various basic math functions // inline pass-throughs to various basic math functions
// written in this style to allow for easy substitution with more efficient versions // written in this style to allow for easy substitution with more efficient versions
inline scalar_t SINE_FUNCTION(scalar_t x) { return sin(x); } inline scalar_t SINE_FUNCTION(scalar_t x)
inline scalar_t COSINE_FUNCTION(scalar_t x) { return cos(x); } {
inline scalar_t SQRT_FUNCTION(scalar_t x) { return sqrt(x); } return sin(x);
}
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 // 2 element vector
class vector2 class vector2
{ {
public: public:
vector2(void) {} vector2(void)
{
}
vector2(scalar_t a, scalar_t b) vector2(scalar_t a, scalar_t b)
{ {
x = a; x = a;
@@ -52,7 +63,9 @@ class vector2
class vector3 class vector3
{ {
public: public:
vector3(void) {} vector3(void)
{
}
vector3(scalar_t a, scalar_t b, scalar_t c) vector3(scalar_t a, scalar_t b, scalar_t c)
{ {
x = a; x = a;
@@ -71,15 +84,24 @@ class vector3
void inline Normalize(); void inline Normalize();
void inline SafeNormalize(); void inline SafeNormalize();
double inline Length(); double inline Length();
void inline Zero() { x = y = z = 0.0; }; void inline Zero()
{
x = y = z = 0.0;
};
// [] is to read, () is to write (const correctness) // [] is to read, () is to write (const correctness)
// const scalar_t& operator[] (int i) const { return e[i]; } // const scalar_t& operator[] (int i) const { return e[i]; }
// scalar_t& operator() (int i) { return e[i]; } // scalar_t& operator() (int i) { return e[i]; }
// Provides access to the underlying array; useful for passing this class off to C APIs // Provides access to the underlying array; useful for passing this class off to C APIs
const scalar_t *readArray(void) { return &x; } const scalar_t *readArray(void)
scalar_t *getArray(void) { return &x; } {
return &x;
}
scalar_t *getArray(void)
{
return &x;
}
// union // union
// { // {
@@ -107,7 +129,9 @@ class vector3
class matrix4x4 class matrix4x4
{ {
public: public:
matrix4x4(void) {} matrix4x4(void)
{
}
// When defining matrices in C arrays, it is easiest to define them with // When defining matrices in C arrays, it is easiest to define them with
// the column increasing fastest. However, some APIs (OpenGL in particular) do this // the column increasing fastest. However, some APIs (OpenGL in particular) do this
@@ -130,12 +154,24 @@ class matrix4x4
// [] is to read, () is to write (const correctness) // [] is to read, () is to write (const correctness)
// m[x][y] or m(x)[y] is the correct form // m[x][y] or m(x)[y] is the correct form
const scalar_t *operator[](int i) const { return &e[i << 2]; } const scalar_t *operator[](int i) const
scalar_t *operator()(int i) { return &e[i << 2]; } {
return &e[i << 2];
}
scalar_t *operator()(int i)
{
return &e[i << 2];
}
// Low-level access to the array. // Low-level access to the array.
const scalar_t *readArray(void) { return e; } const scalar_t *readArray(void)
scalar_t *getArray(void) { return e; } {
return e;
}
scalar_t *getArray(void)
{
return e;
}
// Construct various matrices; REPLACES CURRENT CONTENTS OF THE MATRIX! // Construct various matrices; REPLACES CURRENT CONTENTS OF THE MATRIX!
// Written this way to work in-place and hence be somewhat more efficient // Written this way to work in-place and hence be somewhat more efficient
@@ -263,14 +299,20 @@ inline bool operator<(const vector3 &v1, const vector3 &v2)
return false; 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) 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) inline vector3 &operator*=(vector3 &v, scalar_t k)
{ {
@@ -293,11 +335,23 @@ inline vector3 &operator/=(vector3 &v, scalar_t k)
return v; return v;
} }
inline scalar_t LengthSquared3(const vector3 &v) { return DotProduct(v, v); } inline scalar_t LengthSquared3(const vector3 &v)
inline scalar_t LengthSquared4(const vector3 &v) { return DotProduct4(v, 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 Length3(const vector3 &v)
inline scalar_t Length4(const vector3 &v) { return SQRT_FUNCTION(LengthSquared4(v)); } {
return SQRT_FUNCTION(LengthSquared3(v));
}
inline scalar_t Length4(const vector3 &v)
{
return SQRT_FUNCTION(LengthSquared4(v));
}
inline vector3 Normalize(const vector3 &v) inline vector3 Normalize(const vector3 &v)
{ {
@@ -314,7 +368,10 @@ inline vector3 SafeNormalize(const vector3 &v)
retVal = v / l; retVal = v / l;
return retVal; 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) inline vector3 operator+(const vector3 &v1, const vector3 &v2)
{ {
@@ -372,7 +429,10 @@ void inline vector3::Normalize()
z *= il; z *= il;
} }
double inline vector3::Length() { return SQRT_FUNCTION(x * x + y * y + z * z); } double inline vector3::Length()
{
return SQRT_FUNCTION(x * x + y * y + z * z);
}
inline bool operator==(const matrix4x4 &m1, const matrix4x4 &m2) inline bool operator==(const matrix4x4 &m1, const matrix4x4 &m2)
{ {

View File

@@ -11,7 +11,10 @@ http://mozilla.org/MPL/2.0/.
#include "Geometry.h" #include "Geometry.h"
inline double sqr(double a) { return (a * a); }; inline double sqr(double a)
{
return (a * a);
};
__fastcall TLine::TLine(){}; __fastcall TLine::TLine(){};
@@ -23,7 +26,10 @@ __fastcall TLine::TLine(vector3 NPoint, vector3 NVector)
__fastcall TLine::~TLine(){}; __fastcall TLine::~TLine(){};
TPlane TLine::GetPlane() { return (TPlane(Point, Vector)); }; TPlane TLine::GetPlane()
{
return (TPlane(Point, Vector));
};
double TLine::GetDistance(vector3 Point1) double TLine::GetDistance(vector3 Point1)
{ {
@@ -80,11 +86,17 @@ double TPlane::GetSide(vector3 Point)
// D3DMath_VectorMatrixMultiply(Vector,src,Transformations); // D3DMath_VectorMatrixMultiply(Vector,src,Transformations);
//}; //};
bool TPlane::Defined() { return !(Vector == vector3(0, 0, 0)); }; bool TPlane::Defined()
{
return !(Vector == vector3(0, 0, 0));
};
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
inline double Sum(vector3 &Vector) { return (Vector.x + Vector.y + Vector.z); }; inline double Sum(vector3 &Vector)
{
return (Vector.x + Vector.y + Vector.z);
};
bool CrossPoint(vector3 &RetPoint, TLine &Line, TPlane &Plane) bool CrossPoint(vector3 &RetPoint, TLine &Line, TPlane &Plane)
{ {
@@ -96,7 +108,10 @@ bool CrossPoint(vector3 &RetPoint, TLine &Line, TPlane &Plane)
return (true); return (true);
}; };
inline double GetLength(vector3 &Vector) { return (Vector.Length()); }; inline double GetLength(vector3 &Vector)
{
return (Vector.Length());
};
inline vector3 SetLength(vector3 &Vector, double Length) inline vector3 SetLength(vector3 &Vector, double Length)
{ {

View File

@@ -42,15 +42,27 @@ class cParser : public std::stringstream
getTokens(); getTokens();
*this >> output; *this >> output;
}; };
inline void ignoreToken() { readToken(); }; inline void ignoreToken()
{
readToken();
};
inline void ignoreTokens(int count) inline void ignoreTokens(int count)
{ {
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
readToken(); readToken();
}; };
inline bool expectToken(std::string value) { return readToken() == value; }; inline bool expectToken(std::string value)
bool eof() { return mStream->eof(); }; {
bool ok() { return !mStream->fail(); }; return readToken() == value;
};
bool eof()
{
return mStream->eof();
};
bool ok()
{
return !mStream->fail();
};
bool getTokens(int Count = 1, bool ToLower = true, const char *Break = "\n\t ;"); bool getTokens(int Count = 1, bool ToLower = true, const char *Break = "\n\t ;");
int getProgress() const; // percentage of file processed. int getProgress() const; // percentage of file processed.
// load traction? // load traction?
@@ -64,11 +76,11 @@ class cParser : public std::stringstream
bool trimComments(std::string &String); bool trimComments(std::string &String);
// members: // members:
std::istream *mStream; // relevant kind of buffer is attached on creation. std::istream *mStream; // relevant kind of buffer is attached on creation.
std::string mPath; // path to open stream, for relative path lookups. std::string mPath; // path to open stream, for relative path lookups.
int mSize; // size of open stream, for progress report. int mSize; // size of open stream, for progress report.
typedef std::map<std::string, std::string> commentmap; typedef std::map<std::string, std::string> commentmap;
commentmap mComments; commentmap mComments;
cParser *mIncludeParser; // child class to handle include directives. cParser *mIncludeParser; // child class to handle include directives.
std::vector<std::string> parameters; // parameter list for included file. std::vector<std::string> parameters; // parameter list for included file.
}; };

View File

@@ -44,7 +44,7 @@ http://mozilla.org/MPL/2.0/.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
HRESULT ReadMMIO(HMMIO hmmioIn, MMCKINFO *pckInRIFF, WAVEFORMATEX **ppwfxInfo) HRESULT ReadMMIO(HMMIO hmmioIn, MMCKINFO *pckInRIFF, WAVEFORMATEX **ppwfxInfo)
{ {
MMCKINFO ckIn; // chunk info. for general use. MMCKINFO ckIn; // chunk info. for general use.
PCMWAVEFORMAT pcmWaveFormat; // Temp PCM structure to load in. PCMWAVEFORMAT pcmWaveFormat; // Temp PCM structure to load in.
*ppwfxInfo = NULL; *ppwfxInfo = NULL;
@@ -216,7 +216,10 @@ HRESULT WaveReadFile(HMMIO hmmioIn, UINT cbRead, BYTE *pbDest, MMCKINFO *pckIn,
// Name: CWaveSoundRead() // Name: CWaveSoundRead()
// Desc: Constructs the class // Desc: Constructs the class
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
CWaveSoundRead::CWaveSoundRead() { m_pwfx = NULL; } CWaveSoundRead::CWaveSoundRead()
{
m_pwfx = NULL;
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Name: ~CWaveSoundRead() // Name: ~CWaveSoundRead()
@@ -252,7 +255,10 @@ HRESULT CWaveSoundRead::Open(CHAR *strFilename)
// Desc: Resets the internal m_ckIn pointer so reading starts from the // Desc: Resets the internal m_ckIn pointer so reading starts from the
// beginning of the file again // 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() // Name: Read()

View File

@@ -34,9 +34,9 @@ class CWaveSoundRead
{ {
public: public:
WAVEFORMATEX *m_pwfx; // Pointer to WAVEFORMATEX structure WAVEFORMATEX *m_pwfx; // Pointer to WAVEFORMATEX structure
HMMIO m_hmmioIn; // MM I/O handle for the WAVE HMMIO m_hmmioIn; // MM I/O handle for the WAVE
MMCKINFO m_ckIn; // Multimedia RIFF chunk MMCKINFO m_ckIn; // Multimedia RIFF chunk
MMCKINFO m_ckInRiff; // Use in opening a WAVE file MMCKINFO m_ckInRiff; // Use in opening a WAVE file
public: public:
CWaveSoundRead(); CWaveSoundRead();