mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-24 00:49:18 +02:00
LCD Screens in python
Merge with python branch
This commit is contained in:
@@ -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
|
||||||
---
|
---
|
||||||
|
|||||||
11
AdvSound.cpp
11
AdvSound.cpp
@@ -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))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
TAnimAdvanced::TAnimAdvanced(){};
|
TAnimAdvanced::TAnimAdvanced(){};
|
||||||
|
|
||||||
TAnimAdvanced::~TAnimAdvanced(){
|
TAnimAdvanced::~TAnimAdvanced(){
|
||||||
// delete[] pVocaloidMotionData; //plik został zmodyfikowany
|
// delete[] pVocaloidMotionData; //plik został zmodyfikowany
|
||||||
};
|
};
|
||||||
@@ -115,7 +116,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 +139,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 +180,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 +224,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 +234,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 +301,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 +365,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 +379,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 +457,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 +685,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 +724,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 +776,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
|
||||||
}
|
}
|
||||||
|
|||||||
19
AnimModel.h
19
AnimModel.h
@@ -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);
|
||||||
|
|||||||
10
Button.h
10
Button.h
@@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
5
Camera.h
5
Camera.h
@@ -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();
|
||||||
|
|||||||
15
Console.cpp
15
Console.cpp
@@ -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)
|
||||||
|
{ // na razie tak - czyta się tylko klawiatura
|
||||||
|
return Global::bActive && (GetKeyState(x) < 0);
|
||||||
|
};
|
||||||
|
|
||||||
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);
|
||||||
|
};
|
||||||
|
|||||||
@@ -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)
|
||||||
|
{ // wys³anie bajtu do portu
|
||||||
|
OutPort(address, x);
|
||||||
|
};
|
||||||
|
|||||||
@@ -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!
|
||||||
|
|||||||
@@ -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
3
Data.h
@@ -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
|
||||||
|
|||||||
549
Driver.cpp
549
Driver.cpp
File diff suppressed because it is too large
Load Diff
52
Driver.h
52
Driver.h
@@ -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);
|
||||||
|
|||||||
202
DynObj.cpp
202
DynObj.cpp
@@ -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)
|
||||||
|
|||||||
79
DynObj.h
79
DynObj.h
@@ -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);
|
||||||
|
|||||||
26
EU07.bpr
26
EU07.bpr
@@ -13,13 +13,13 @@
|
|||||||
TractionPower.obj parser.obj sky.obj AirCoupler.obj opengl\glew.obj
|
TractionPower.obj parser.obj sky.obj AirCoupler.obj opengl\glew.obj
|
||||||
ResourceManager.obj VBO.obj TextureDDS.obj opengl\ARB_Multisample.obj
|
ResourceManager.obj VBO.obj TextureDDS.obj opengl\ARB_Multisample.obj
|
||||||
Float3d.obj Classes.obj Driver.obj Names.obj Console.obj Mover.obj
|
Float3d.obj Classes.obj Driver.obj Names.obj Console.obj Mover.obj
|
||||||
Console\PoKeys55.obj Forth.obj Console\LPT.obj"/>
|
Console\PoKeys55.obj Forth.obj Console\LPT.obj PyInt.obj"/>
|
||||||
<RESFILES value="EU07.res"/>
|
<RESFILES value="EU07.res"/>
|
||||||
<IDLFILES value=""/>
|
<IDLFILES value=""/>
|
||||||
<IDLGENFILES value=""/>
|
<IDLGENFILES value=""/>
|
||||||
<DEFFILE value=""/>
|
<DEFFILE value=""/>
|
||||||
<RESDEPEN value="$(RESFILES)"/>
|
<RESDEPEN value="$(RESFILES)"/>
|
||||||
<LIBFILES value="opengl\glut32.lib DirectX\Dsound.lib"/>
|
<LIBFILES value="opengl\glut32.lib omf_python27.lib DirectX\Dsound.lib"/>
|
||||||
<LIBRARIES value="dclocx50.bpi bcbsmp50.bpi VCLX50.lib bcbsmp50.lib Vcl50.lib"/>
|
<LIBRARIES value="dclocx50.bpi bcbsmp50.bpi VCLX50.lib bcbsmp50.lib Vcl50.lib"/>
|
||||||
<SPARELIBS value="Vcl50.lib bcbsmp50.lib VCLX50.lib bcbsmp50.bpi dclocx50.bpi"/>
|
<SPARELIBS value="Vcl50.lib bcbsmp50.lib VCLX50.lib bcbsmp50.bpi dclocx50.bpi"/>
|
||||||
<PACKAGES value="Vcl50.bpi Vclx50.bpi"/>
|
<PACKAGES value="Vcl50.bpi Vclx50.bpi"/>
|
||||||
@@ -33,8 +33,8 @@
|
|||||||
<USERDEFINES value="GLEW_STATIC;_DEBUG"/>
|
<USERDEFINES value="GLEW_STATIC;_DEBUG"/>
|
||||||
<SYSDEFINES value="NO_STRICT;_RTLDLL"/>
|
<SYSDEFINES value="NO_STRICT;_RTLDLL"/>
|
||||||
<MAINSOURCE value="EU07.cpp"/>
|
<MAINSOURCE value="EU07.cpp"/>
|
||||||
<INCLUDEPATH value="Console;opengl;McZapkie;$(BCB)\include;$(BCB)\include\vcl"/>
|
<INCLUDEPATH value="Console;opengl;McZapkie;$(BCB)\include;$(BCB)\include\vcl;python\include"/>
|
||||||
<LIBPATH value="Console;opengl;McZapkie;$(BCB)\lib\obj;$(BCB)\lib"/>
|
<LIBPATH value="Console;opengl;McZapkie;$(BCB)\lib\obj;$(BCB)\lib;python\libs"/>
|
||||||
<WARNINGS value="-w-par"/>
|
<WARNINGS value="-w-par"/>
|
||||||
</MACROS>
|
</MACROS>
|
||||||
<OPTIONS>
|
<OPTIONS>
|
||||||
@@ -58,8 +58,8 @@ IncludeVerInfo=1
|
|||||||
AutoIncBuild=0
|
AutoIncBuild=0
|
||||||
MajorVer=15
|
MajorVer=15
|
||||||
MinorVer=3
|
MinorVer=3
|
||||||
Release=1167
|
Release=1168
|
||||||
Build=470
|
Build=471
|
||||||
Debug=1
|
Debug=1
|
||||||
PreRelease=0
|
PreRelease=0
|
||||||
Special=0
|
Special=0
|
||||||
@@ -71,8 +71,8 @@ CodePage=1250
|
|||||||
[Version Info Keys]
|
[Version Info Keys]
|
||||||
CompanyName=EU07 Team
|
CompanyName=EU07 Team
|
||||||
FileDescription=MaSzyna EU07-424
|
FileDescription=MaSzyna EU07-424
|
||||||
FileVersion=15.3.1167.470
|
FileVersion=15.3.1168.471
|
||||||
InternalName=9th by firleju + SPKS + MP
|
InternalName=9th by firleju + SPKS + MP + python
|
||||||
LegalCopyright=
|
LegalCopyright=
|
||||||
LegalTrademarks=
|
LegalTrademarks=
|
||||||
OriginalFilename=eu07.exe
|
OriginalFilename=eu07.exe
|
||||||
@@ -81,12 +81,14 @@ ProductVersion=15.3
|
|||||||
Comments=
|
Comments=
|
||||||
|
|
||||||
[HistoryLists\hlIncludePath]
|
[HistoryLists\hlIncludePath]
|
||||||
Count=1
|
Count=2
|
||||||
Item0=Console;opengl;McZapkie;$(BCB)\include;$(BCB)\include\vcl
|
Item0=Console;opengl;McZapkie;$(BCB)\include;$(BCB)\include\vcl;python\include
|
||||||
|
Item1=Console;opengl;McZapkie;$(BCB)\include;$(BCB)\include\vcl
|
||||||
|
|
||||||
[HistoryLists\hlLibraryPath]
|
[HistoryLists\hlLibraryPath]
|
||||||
Count=1
|
Count=2
|
||||||
Item0=Console;opengl;McZapkie;$(BCB)\lib\obj;$(BCB)\lib
|
Item0=Console;opengl;McZapkie;$(BCB)\lib\obj;$(BCB)\lib;python\libs
|
||||||
|
Item1=Console;opengl;McZapkie;$(BCB)\lib\obj;$(BCB)\lib
|
||||||
|
|
||||||
[HistoryLists\hlDebugSourcePath]
|
[HistoryLists\hlDebugSourcePath]
|
||||||
Count=2
|
Count=2
|
||||||
|
|||||||
131
EU07.cpp
131
EU07.cpp
@@ -33,6 +33,7 @@ USEUNIT("Camera.cpp");
|
|||||||
USEUNIT("Texture.cpp");
|
USEUNIT("Texture.cpp");
|
||||||
USEUNIT("World.cpp");
|
USEUNIT("World.cpp");
|
||||||
USELIB("opengl\glut32.lib");
|
USELIB("opengl\glut32.lib");
|
||||||
|
USELIB("omf_python27.lib");
|
||||||
USEUNIT("Model3d.cpp");
|
USEUNIT("Model3d.cpp");
|
||||||
USEUNIT("MdlMngr.cpp");
|
USEUNIT("MdlMngr.cpp");
|
||||||
USEUNIT("Train.cpp");
|
USEUNIT("Train.cpp");
|
||||||
@@ -80,10 +81,11 @@ USEUNIT("McZapkie\hamulce.pas");
|
|||||||
USEUNIT("Console\PoKeys55.cpp");
|
USEUNIT("Console\PoKeys55.cpp");
|
||||||
USEUNIT("Forth.cpp");
|
USEUNIT("Forth.cpp");
|
||||||
USEUNIT("Console\LPT.cpp");
|
USEUNIT("Console\LPT.cpp");
|
||||||
|
USEUNIT("PyInt.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 +124,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 +174,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 +188,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 +225,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 +256,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 +284,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 +299,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 +323,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 +415,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 +581,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 +741,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 +756,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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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ñ
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
45
Float3d.h
45
Float3d.h
@@ -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)
|
||||||
|
|||||||
@@ -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
12
Gauge.h
@@ -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);
|
||||||
|
|||||||
16
Geom.cpp
16
Geom.cpp
@@ -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)
|
||||||
|
|||||||
20
Globals.cpp
20
Globals.cpp
@@ -49,9 +49,9 @@ double Global::fLuminance = 1.0; // jasno
|
|||||||
int Global::iReCompile = 0; // zwiêkszany, gdy trzeba odœwie¿yæ siatki
|
int Global::iReCompile = 0; // zwiêkszany, gdy trzeba odœwie¿yæ siatki
|
||||||
HWND Global::hWnd = NULL; // uchwyt okna
|
HWND Global::hWnd = NULL; // uchwyt okna
|
||||||
int Global::iCameraLast = -1;
|
int Global::iCameraLast = -1;
|
||||||
AnsiString Global::asRelease = "15.3.1167.470";
|
AnsiString Global::asRelease = "15.3.1168.471";
|
||||||
AnsiString Global::asVersion =
|
AnsiString Global::asVersion =
|
||||||
"Compilation 2015-04-14, release " + Global::asRelease + "."; // tutaj, bo wysy³any
|
"Compilation 2015-04-17, release " + Global::asRelease + "."; // tutaj, bo wysy³any
|
||||||
int Global::iViewMode = 0; // co aktualnie widaæ: 0-kabina, 1-latanie, 2-sprzêgi, 3-dokumenty
|
int Global::iViewMode = 0; // co aktualnie widaæ: 0-kabina, 1-latanie, 2-sprzêgi, 3-dokumenty
|
||||||
int Global::iTextMode = 0; // tryb pracy wyœwietlacza tekstowego
|
int Global::iTextMode = 0; // tryb pracy wyœwietlacza tekstowego
|
||||||
int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0,
|
int Global::iScreenMode[12] = {0, 0, 0, 0, 0, 0,
|
||||||
@@ -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"));
|
||||||
@@ -465,6 +465,10 @@ void Global::ConfigParse(TQueryParserComp *qp, cParser *cp)
|
|||||||
asLang = GetNextSymbol(); // domyœlny jêzyk - http://tools.ietf.org/html/bcp47
|
asLang = GetNextSymbol(); // domyœlny jêzyk - http://tools.ietf.org/html/bcp47
|
||||||
else if (str == AnsiString("opengl")) // deklarowana wersja OpenGL, ¿eby powstrzymaæ b³êdy
|
else if (str == AnsiString("opengl")) // deklarowana wersja OpenGL, ¿eby powstrzymaæ b³êdy
|
||||||
fOpenGL = GetNextSymbol().ToDouble(); // wymuszenie wersji OpenGL
|
fOpenGL = GetNextSymbol().ToDouble(); // wymuszenie wersji OpenGL
|
||||||
|
else if (str == AnsiString("pyscreenrendererpriority")) // priority of python screen
|
||||||
|
// renderer
|
||||||
|
TPythonInterpreter::getInstance()->setScreenRendererPriority(
|
||||||
|
GetNextSymbol().LowerCase().c_str());
|
||||||
} while (str != "endconfig"); //(!Parser->EndOfFile)
|
} while (str != "endconfig"); //(!Parser->EndOfFile)
|
||||||
// na koniec trochê zale¿noœci
|
// na koniec trochê zale¿noœci
|
||||||
if (!bLoadTraction) // wczytywanie drutów i s³upów
|
if (!bLoadTraction) // wczytywanie drutów i s³upów
|
||||||
|
|||||||
14
Globals.h
14
Globals.h
@@ -14,16 +14,17 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "system.hpp"
|
#include "system.hpp"
|
||||||
#include "opengl/glew.h"
|
#include "opengl/glew.h"
|
||||||
#include "dumb3d.h"
|
#include "dumb3d.h"
|
||||||
|
#include "PyInt.h"
|
||||||
//#include "Classes.h"
|
//#include "Classes.h"
|
||||||
|
|
||||||
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 +152,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 +207,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
|
||||||
|
|||||||
221
Ground.cpp
221
Ground.cpp
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
24
Ground.h
24
Ground.h
@@ -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);
|
||||||
|
|||||||
24
Machajka.cpp
24
Machajka.cpp
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
22
MemCell.cpp
22
MemCell.cpp
@@ -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
|
||||||
|
|||||||
36
MemCell.h
36
MemCell.h
@@ -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();
|
||||||
|
|||||||
72
Model3d.cpp
72
Model3d.cpp
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
109
Model3d.h
109
Model3d.h
@@ -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()
|
||||||
{
|
{
|
||||||
@@ -305,6 +335,10 @@ class TSubModel
|
|||||||
{
|
{
|
||||||
return *(fMatrix->TranslationGet()) + Child->Translation1Get();
|
return *(fMatrix->TranslationGet()) + Child->Translation1Get();
|
||||||
}
|
}
|
||||||
|
int GetTextureId()
|
||||||
|
{
|
||||||
|
return TextureID;
|
||||||
|
}
|
||||||
void ParentMatrix(float4x4 *m);
|
void ParentMatrix(float4x4 *m);
|
||||||
float MaxY(const float4x4 &m);
|
float MaxY(const float4x4 &m);
|
||||||
void AdjustDist();
|
void AdjustDist();
|
||||||
@@ -356,7 +390,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 +408,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);
|
||||||
|
|||||||
53
Mover.cpp
53
Mover.cpp
@@ -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
|
{ // nowa wersja na u¿ytek AI, false gdy osi¹gniêto pozycjê -1
|
||||||
|
return BrakeLevelAdd(-1.0);
|
||||||
|
};
|
||||||
|
|
||||||
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
26
Mover.h
@@ -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
13
Names.h
@@ -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)
|
||||||
|
|||||||
601
PyInt.cpp
Normal file
601
PyInt.cpp
Normal file
@@ -0,0 +1,601 @@
|
|||||||
|
#include "PyInt.h"
|
||||||
|
#include "Train.h"
|
||||||
|
#include "Logs.h"
|
||||||
|
#include <process.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
TPythonInterpreter *TPythonInterpreter::_instance = NULL;
|
||||||
|
|
||||||
|
//#define _PY_INT_MORE_LOG
|
||||||
|
|
||||||
|
TPythonInterpreter::TPythonInterpreter()
|
||||||
|
{
|
||||||
|
WriteLog("Loading Python ...");
|
||||||
|
Py_SetPythonHome("python");
|
||||||
|
Py_Initialize();
|
||||||
|
_main = PyImport_ImportModule("__main__");
|
||||||
|
if (_main == NULL)
|
||||||
|
{
|
||||||
|
WriteLog("Cannot import Python module __main__");
|
||||||
|
}
|
||||||
|
_screenRendererPriority = THREAD_PRIORITY_NORMAL; // domyslny priorytet normalny
|
||||||
|
PyObject *cStringModule = PyImport_ImportModule("cStringIO");
|
||||||
|
_stdErr = NULL;
|
||||||
|
if (cStringModule == NULL)
|
||||||
|
return;
|
||||||
|
PyObject *cStringClassName = PyObject_GetAttrString(cStringModule, "StringIO");
|
||||||
|
if (cStringClassName == NULL)
|
||||||
|
return;
|
||||||
|
PyObject *cString = PyObject_CallObject(cStringClassName, NULL);
|
||||||
|
if (cString == NULL)
|
||||||
|
return;
|
||||||
|
if (PySys_SetObject("stderr", cString) != 0)
|
||||||
|
return;
|
||||||
|
_stdErr = cString;
|
||||||
|
}
|
||||||
|
|
||||||
|
TPythonInterpreter *TPythonInterpreter::getInstance()
|
||||||
|
{
|
||||||
|
if (!_instance)
|
||||||
|
{
|
||||||
|
_instance = new TPythonInterpreter();
|
||||||
|
}
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TPythonInterpreter::loadClassFile(const char *lookupPath, const char *className)
|
||||||
|
{
|
||||||
|
std::set<const char *, ltstr>::const_iterator it = _classes.find(className);
|
||||||
|
if (it == _classes.end())
|
||||||
|
{
|
||||||
|
FILE *sourceFile = _getFile(lookupPath, className);
|
||||||
|
if (sourceFile != NULL)
|
||||||
|
{
|
||||||
|
fseek(sourceFile, 0, SEEK_END);
|
||||||
|
long fsize = ftell(sourceFile);
|
||||||
|
char *buffer = (char *)calloc(fsize + 1, sizeof(char));
|
||||||
|
fseek(sourceFile, 0, SEEK_SET);
|
||||||
|
long freaded = fread(buffer, sizeof(char), fsize, sourceFile);
|
||||||
|
buffer[freaded] = 0; // z jakiegos powodu czytamy troche mniej i trzczeba dodac konczace
|
||||||
|
// zero do bufora (mimo ze calloc teoretycznie powiniene zwrocic
|
||||||
|
// wyzerowana pamiec)
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
char buf[255];
|
||||||
|
sprintf(buf, "readed %d / %d characters for %s", freaded, fsize, className);
|
||||||
|
WriteLog(buf);
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
fclose(sourceFile);
|
||||||
|
if (PyRun_SimpleString(buffer) != 0)
|
||||||
|
{
|
||||||
|
handleError();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
char *classNameToRemember = (char *)calloc(strlen(className) + 1, sizeof(char));
|
||||||
|
strcpy(classNameToRemember, className);
|
||||||
|
_classes.insert(classNameToRemember);
|
||||||
|
free(buffer);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *TPythonInterpreter::newClass(const char *className)
|
||||||
|
{
|
||||||
|
return newClass(className, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *TPythonInterpreter::_getFile(const char *lookupPath, const char *className)
|
||||||
|
{
|
||||||
|
char *sourceFilePath;
|
||||||
|
if (lookupPath != NULL)
|
||||||
|
{
|
||||||
|
sourceFilePath = (char *)calloc(strlen(lookupPath) + strlen(className) + 4, sizeof(char));
|
||||||
|
strcat(sourceFilePath, lookupPath);
|
||||||
|
strcat(sourceFilePath, className);
|
||||||
|
strcat(sourceFilePath, ".py");
|
||||||
|
|
||||||
|
FILE *file = fopen(sourceFilePath, "r");
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog(sourceFilePath);
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
free(sourceFilePath);
|
||||||
|
if (file != NULL)
|
||||||
|
{
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
char *basePath = "python\\local\\";
|
||||||
|
sourceFilePath = (char *)calloc(strlen(basePath) + strlen(className) + 4, sizeof(char));
|
||||||
|
strcat(sourceFilePath, basePath);
|
||||||
|
strcat(sourceFilePath, className);
|
||||||
|
strcat(sourceFilePath, ".py");
|
||||||
|
|
||||||
|
FILE *file = fopen(sourceFilePath, "r");
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog(sourceFilePath);
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
free(sourceFilePath);
|
||||||
|
if (file != NULL)
|
||||||
|
{
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonInterpreter::handleError()
|
||||||
|
{
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("Python Error occured");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
if (_stdErr != NULL)
|
||||||
|
{ // std err pythona jest buforowane
|
||||||
|
PyErr_Print();
|
||||||
|
PyObject *bufferContent = PyObject_CallMethod(_stdErr, "getvalue", NULL);
|
||||||
|
PyObject_CallMethod(_stdErr, "truncate", "i", 0); // czyscimy bufor na kolejne bledy
|
||||||
|
WriteLog(PyString_AsString(bufferContent));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // nie dziala buffor pythona
|
||||||
|
if (PyErr_Occurred() != NULL)
|
||||||
|
{
|
||||||
|
PyObject *ptype, *pvalue, *ptraceback;
|
||||||
|
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
|
||||||
|
if (ptype == NULL)
|
||||||
|
{
|
||||||
|
WriteLog("Don't konw how to handle NULL exception");
|
||||||
|
}
|
||||||
|
PyErr_NormalizeException(&ptype, &pvalue, &ptraceback);
|
||||||
|
if (ptype == NULL)
|
||||||
|
{
|
||||||
|
WriteLog("Don't konw how to handle NULL exception");
|
||||||
|
}
|
||||||
|
PyObject *pStrType = PyObject_Str(ptype);
|
||||||
|
if (pStrType != NULL)
|
||||||
|
{
|
||||||
|
WriteLog(PyString_AsString(pStrType));
|
||||||
|
}
|
||||||
|
WriteLog(PyString_AsString(pvalue));
|
||||||
|
PyObject *pStrTraceback = PyObject_Str(ptraceback);
|
||||||
|
if (pStrTraceback != NULL)
|
||||||
|
{
|
||||||
|
WriteLog(PyString_AsString(pStrTraceback));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WriteLog("Python Traceback cannot be shown");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("Called python error handler when no error occured!");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PyObject *TPythonInterpreter::newClass(const char *className, PyObject *argsTuple)
|
||||||
|
{
|
||||||
|
if (_main == NULL)
|
||||||
|
{
|
||||||
|
WriteLog("main turned into null");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
PyObject *classNameObj = PyObject_GetAttrString(_main, className);
|
||||||
|
if (classNameObj == NULL)
|
||||||
|
{
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
char buf[255];
|
||||||
|
sprintf(buf, "Python class %s not defined!", className);
|
||||||
|
WriteLog(buf);
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
PyObject *object = PyObject_CallObject(classNameObj, argsTuple);
|
||||||
|
|
||||||
|
if (PyErr_Occurred() != NULL)
|
||||||
|
{
|
||||||
|
handleError();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonInterpreter::setScreenRendererPriority(const char *priority)
|
||||||
|
{
|
||||||
|
if (strncmp(priority, "normal", 6) == 0)
|
||||||
|
{
|
||||||
|
_screenRendererPriority = THREAD_PRIORITY_NORMAL;
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("Python screen renderer priority: Normal");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
}
|
||||||
|
else if (strncmp(priority, "lower", 5) == 0)
|
||||||
|
{
|
||||||
|
_screenRendererPriority = THREAD_PRIORITY_BELOW_NORMAL;
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("Python screen renderer priority: Lower");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
}
|
||||||
|
else if (strncmp(priority, "lowest", 6) == 0)
|
||||||
|
{
|
||||||
|
_screenRendererPriority = THREAD_PRIORITY_LOWEST;
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("Python screen renderer priority: Lowest");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
}
|
||||||
|
else if (strncmp(priority, "idle", 4) == 0)
|
||||||
|
{
|
||||||
|
_screenRendererPriority = THREAD_PRIORITY_IDLE;
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("Python screen renderer priority: Idle");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TPythonScreenRenderer::TPythonScreenRenderer(int textureId, PyObject *renderer)
|
||||||
|
{
|
||||||
|
_textureId = textureId;
|
||||||
|
_pyRenderer = renderer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreenRenderer::updateTexture()
|
||||||
|
{
|
||||||
|
int width, height;
|
||||||
|
if (_pyWidth == NULL || _pyHeight == NULL)
|
||||||
|
{
|
||||||
|
WriteLog("Unknown python texture size!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
width = PyInt_AsLong(_pyWidth);
|
||||||
|
height = PyInt_AsLong(_pyHeight);
|
||||||
|
if (_pyTexture != NULL)
|
||||||
|
{
|
||||||
|
char *textureData = PyString_AsString(_pyTexture);
|
||||||
|
if (textureData != NULL)
|
||||||
|
{
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
char buff[255];
|
||||||
|
sprintf(buff, "Sending texture id: %d w: %d h: %d", _textureId, width, height);
|
||||||
|
WriteLog(buff);
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, _textureId);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE,
|
||||||
|
textureData);
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
GLenum status = glGetError();
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case GL_INVALID_ENUM:
|
||||||
|
WriteLog("An unacceptable value is specified for an enumerated argument. The "
|
||||||
|
"offending function is ignored, having no side effect other than to set "
|
||||||
|
"the error flag.");
|
||||||
|
break;
|
||||||
|
case GL_INVALID_VALUE:
|
||||||
|
WriteLog("A numeric argument is out of range. The offending function is ignored, "
|
||||||
|
"having no side effect other than to set the error flag.");
|
||||||
|
break;
|
||||||
|
case GL_INVALID_OPERATION:
|
||||||
|
WriteLog("The specified operation is not allowed in the current state. The "
|
||||||
|
"offending function is ignored, having no side effect other than to set "
|
||||||
|
"the error flag.");
|
||||||
|
break;
|
||||||
|
case GL_NO_ERROR:
|
||||||
|
WriteLog("No error has been recorded. The value of this symbolic constant is "
|
||||||
|
"guaranteed to be zero.");
|
||||||
|
break;
|
||||||
|
case GL_STACK_OVERFLOW:
|
||||||
|
WriteLog("This function would cause a stack overflow. The offending function is "
|
||||||
|
"ignored, having no side effect other than to set the error flag.");
|
||||||
|
break;
|
||||||
|
case GL_STACK_UNDERFLOW:
|
||||||
|
WriteLog("This function would cause a stack underflow. The offending function is "
|
||||||
|
"ignored, having no side effect other than to set the error flag.");
|
||||||
|
break;
|
||||||
|
case GL_OUT_OF_MEMORY:
|
||||||
|
WriteLog("There is not enough memory left to execute the function. The state of "
|
||||||
|
"OpenGL is undefined, except for the state of the error flags, after this "
|
||||||
|
"error is recorded.");
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WriteLog("RAW python texture data is NULL!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WriteLog("Python texture object is NULL!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreenRenderer::render(PyObject *trainState)
|
||||||
|
{
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("Python rendering texture ...");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
_pyTexture = PyObject_CallMethod(_pyRenderer, "render", "O", trainState);
|
||||||
|
|
||||||
|
if (_pyTexture == NULL)
|
||||||
|
{
|
||||||
|
TPythonInterpreter::getInstance()->handleError();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_pyWidth = PyObject_CallMethod(_pyRenderer, "get_width", NULL);
|
||||||
|
if (_pyWidth == NULL)
|
||||||
|
{
|
||||||
|
TPythonInterpreter::getInstance()->handleError();
|
||||||
|
}
|
||||||
|
_pyHeight = PyObject_CallMethod(_pyRenderer, "get_height", NULL);
|
||||||
|
if (_pyHeight == NULL)
|
||||||
|
{
|
||||||
|
TPythonInterpreter::getInstance()->handleError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TPythonScreenRenderer::~TPythonScreenRenderer()
|
||||||
|
{
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("PythonScreenRenderer descturctor called");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
if (_pyRenderer != NULL)
|
||||||
|
{
|
||||||
|
Py_CLEAR(_pyRenderer);
|
||||||
|
}
|
||||||
|
cleanup();
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("PythonScreenRenderer desctructor finished");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreenRenderer::cleanup()
|
||||||
|
{
|
||||||
|
if (_pyTexture != NULL)
|
||||||
|
{
|
||||||
|
Py_CLEAR(_pyTexture);
|
||||||
|
_pyTexture = NULL;
|
||||||
|
}
|
||||||
|
if (_pyWidth != NULL)
|
||||||
|
{
|
||||||
|
Py_CLEAR(_pyWidth);
|
||||||
|
_pyWidth = NULL;
|
||||||
|
}
|
||||||
|
if (_pyHeight != NULL)
|
||||||
|
{
|
||||||
|
Py_CLEAR(_pyHeight);
|
||||||
|
_pyHeight = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreens::reset(void *train)
|
||||||
|
{
|
||||||
|
_terminationFlag = true;
|
||||||
|
if (_thread != NULL)
|
||||||
|
{
|
||||||
|
WriteLog("Awaiting python thread to end");
|
||||||
|
WaitForSingleObject(_thread, INFINITE);
|
||||||
|
_thread = NULL;
|
||||||
|
}
|
||||||
|
_terminationFlag = false;
|
||||||
|
_cleanupReadyFlag = false;
|
||||||
|
_renderReadyFlag = false;
|
||||||
|
for (std::vector<TPythonScreenRenderer *>::iterator i = _screens.begin(); i != _screens.end();
|
||||||
|
++i)
|
||||||
|
{
|
||||||
|
delete *i;
|
||||||
|
}
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("Clearing renderer vector");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
_screens.clear();
|
||||||
|
_train = train;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreens::init(TQueryParserComp *parser, TModel3d *model, AnsiString name, int cab)
|
||||||
|
{
|
||||||
|
char buff[255];
|
||||||
|
AnsiString asSubModelName = parser->GetNextSymbol();
|
||||||
|
AnsiString asPyClassName = parser->GetNextSymbol();
|
||||||
|
char *subModelName = (char *)calloc(asSubModelName.Length() + 1, sizeof(char));
|
||||||
|
strcpy(subModelName, asSubModelName.LowerCase().c_str());
|
||||||
|
char *pyClassName = (char *)calloc(asPyClassName.Length() + 1, sizeof(char));
|
||||||
|
strcpy(pyClassName, asPyClassName.LowerCase().c_str());
|
||||||
|
TSubModel *subModel = model->GetFromName(subModelName);
|
||||||
|
if (subModel == NULL)
|
||||||
|
{
|
||||||
|
sprintf(buff, "Python Screen: submodel %s not found - Ignoring screen", subModelName);
|
||||||
|
WriteLog(buff);
|
||||||
|
free(subModelName);
|
||||||
|
free(pyClassName);
|
||||||
|
return; // nie ma takiego sub modelu w danej kabinie pomijamy
|
||||||
|
}
|
||||||
|
int textureId = subModel->GetTextureId();
|
||||||
|
if (textureId <= 0)
|
||||||
|
{
|
||||||
|
sprintf(buff, "Python Screen: invalid texture id %d - Ignoring screen", textureId);
|
||||||
|
WriteLog(buff);
|
||||||
|
free(subModelName);
|
||||||
|
free(pyClassName);
|
||||||
|
return; // sub model nie posiada tekstury lub tekstura wymienna - nie obslugiwana
|
||||||
|
}
|
||||||
|
TPythonInterpreter *python = TPythonInterpreter::getInstance();
|
||||||
|
python->loadClassFile(_lookupPath, pyClassName);
|
||||||
|
PyObject *args = Py_BuildValue("(ssi)", _lookupPath, name.c_str(), cab);
|
||||||
|
if (args == NULL)
|
||||||
|
{
|
||||||
|
WriteLog("Python Screen: cannot create __init__ arguments");
|
||||||
|
free(subModelName);
|
||||||
|
free(pyClassName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PyObject *pyRenderer = python->newClass(pyClassName, args);
|
||||||
|
Py_CLEAR(args);
|
||||||
|
if (pyRenderer == NULL)
|
||||||
|
{
|
||||||
|
sprintf(buff, "Python Screen: null renderer for %s - Ignoring screen", pyClassName);
|
||||||
|
WriteLog(buff);
|
||||||
|
free(subModelName);
|
||||||
|
free(pyClassName);
|
||||||
|
return; // nie mozna utworzyc obiektu Pythonowego
|
||||||
|
}
|
||||||
|
TPythonScreenRenderer *renderer = new TPythonScreenRenderer(textureId, pyRenderer);
|
||||||
|
_screens.push_back(renderer);
|
||||||
|
sprintf(buff, "Created python screen %s on submodel %s (%d)", pyClassName, subModelName,
|
||||||
|
textureId);
|
||||||
|
WriteLog(buff);
|
||||||
|
free(subModelName);
|
||||||
|
free(pyClassName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreens::update()
|
||||||
|
{
|
||||||
|
if (!_renderReadyFlag)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_renderReadyFlag = false;
|
||||||
|
for (std::vector<TPythonScreenRenderer *>::iterator i = _screens.begin(); i != _screens.end();
|
||||||
|
++i)
|
||||||
|
{
|
||||||
|
(*i)->updateTexture();
|
||||||
|
}
|
||||||
|
_cleanupReadyFlag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreens::setLookupPath(AnsiString path)
|
||||||
|
{
|
||||||
|
if (_lookupPath != NULL)
|
||||||
|
{
|
||||||
|
free(_lookupPath);
|
||||||
|
}
|
||||||
|
_lookupPath = (char *)calloc(path.Length() + 1, sizeof(char));
|
||||||
|
strcpy(_lookupPath, path.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
TPythonScreens::TPythonScreens()
|
||||||
|
{
|
||||||
|
_lookupPath = NULL;
|
||||||
|
TPythonInterpreter::getInstance()->loadClassFile(NULL, "abstractscreenrenderer");
|
||||||
|
_terminationFlag = false;
|
||||||
|
_renderReadyFlag = false;
|
||||||
|
_cleanupReadyFlag = false;
|
||||||
|
_thread = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
TPythonScreens::~TPythonScreens()
|
||||||
|
{
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("Called python sceeens destructor");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
reset(NULL);
|
||||||
|
if (_lookupPath != NULL)
|
||||||
|
{
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("Freeing lookup path");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
free(_lookupPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreens::run()
|
||||||
|
{
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (_terminationFlag)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TTrain *train = (TTrain *)_train;
|
||||||
|
_trainState = train->GetTrainState();
|
||||||
|
if (_terminationFlag)
|
||||||
|
{
|
||||||
|
_freeTrainState();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (std::vector<TPythonScreenRenderer *>::iterator i = _screens.begin();
|
||||||
|
i != _screens.end(); ++i)
|
||||||
|
{
|
||||||
|
(*i)->render(_trainState);
|
||||||
|
}
|
||||||
|
_freeTrainState();
|
||||||
|
if (_terminationFlag)
|
||||||
|
{
|
||||||
|
_cleanup();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_renderReadyFlag = true;
|
||||||
|
while (!_cleanupReadyFlag && !_terminationFlag)
|
||||||
|
{
|
||||||
|
Sleep(100);
|
||||||
|
}
|
||||||
|
if (_terminationFlag)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_cleanup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreens::finish()
|
||||||
|
{
|
||||||
|
_thread == NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD WINAPI ScreenRendererThread(LPVOID lpParam)
|
||||||
|
{
|
||||||
|
TPythonScreens *renderer = (TPythonScreens *)lpParam;
|
||||||
|
renderer->run();
|
||||||
|
renderer->finish();
|
||||||
|
#ifdef _PY_INT_MORE_LOG
|
||||||
|
WriteLog("Python Screen Renderer Thread Ends");
|
||||||
|
#endif // _PY_INT_MORE_LOG
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreens::start()
|
||||||
|
{
|
||||||
|
if (_screens.size() > 0)
|
||||||
|
{
|
||||||
|
_thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ScreenRendererThread, this,
|
||||||
|
CREATE_SUSPENDED, &_threadId);
|
||||||
|
if (_thread != NULL)
|
||||||
|
{
|
||||||
|
SetThreadPriority(_thread,
|
||||||
|
TPythonInterpreter::getInstance()->getScreenRendererPriotity());
|
||||||
|
if (ResumeThread(_thread) != (DWORD)-1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WriteLog("Python Screen Renderer Thread Did Not Start");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreens::_cleanup()
|
||||||
|
{
|
||||||
|
_cleanupReadyFlag = false;
|
||||||
|
for (std::vector<TPythonScreenRenderer *>::iterator i = _screens.begin(); i != _screens.end();
|
||||||
|
++i)
|
||||||
|
{
|
||||||
|
(*i)->cleanup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPythonScreens::_freeTrainState()
|
||||||
|
{
|
||||||
|
if (_trainState != NULL)
|
||||||
|
{
|
||||||
|
PyDict_Clear(_trainState);
|
||||||
|
Py_CLEAR(_trainState);
|
||||||
|
_trainState = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
95
PyInt.h
Normal file
95
PyInt.h
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
#ifndef PyIntH
|
||||||
|
#define PyIntH
|
||||||
|
|
||||||
|
#undef _DEBUG // bez tego macra Py_DECREF powoduja problemy przy linkowaniu
|
||||||
|
|
||||||
|
#include "Python.h"
|
||||||
|
#include "QueryParserComp.hpp"
|
||||||
|
#include "Model3d.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#define PyGetFloat(param) PyFloat_FromDouble(param >= 0 ? param : -param)
|
||||||
|
#define PyGetInt(param) PyInt_FromLong(param)
|
||||||
|
#define PyGetBool(param) param ? Py_True : Py_False
|
||||||
|
|
||||||
|
struct ltstr
|
||||||
|
{
|
||||||
|
bool operator()(const char *s1, const char *s2) const
|
||||||
|
{
|
||||||
|
return strcmp(s1, s2) < 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class TPythonInterpreter
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
TPythonInterpreter();
|
||||||
|
~TPythonInterpreter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
static TPythonInterpreter *_instance;
|
||||||
|
int _screenRendererPriority;
|
||||||
|
std::set<const char *, ltstr> _classes;
|
||||||
|
PyObject *_main;
|
||||||
|
PyObject *_stdErr;
|
||||||
|
FILE *_getFile(const char *lookupPath, const char *className);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static TPythonInterpreter *getInstance();
|
||||||
|
bool loadClassFile(const char *lookupPath, const char *className);
|
||||||
|
PyObject *newClass(const char *className);
|
||||||
|
PyObject *newClass(const char *className, PyObject *argsTuple);
|
||||||
|
int getScreenRendererPriotity()
|
||||||
|
{
|
||||||
|
return _screenRendererPriority;
|
||||||
|
};
|
||||||
|
void setScreenRendererPriority(const char *priority);
|
||||||
|
void handleError();
|
||||||
|
};
|
||||||
|
|
||||||
|
class TPythonScreenRenderer
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
PyObject *_pyRenderer;
|
||||||
|
PyObject *_pyTexture;
|
||||||
|
int _textureId;
|
||||||
|
PyObject *_pyWidth;
|
||||||
|
PyObject *_pyHeight;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TPythonScreenRenderer(int textureId, PyObject *renderer);
|
||||||
|
~TPythonScreenRenderer();
|
||||||
|
void render(PyObject *trainState);
|
||||||
|
void cleanup();
|
||||||
|
void updateTexture();
|
||||||
|
};
|
||||||
|
|
||||||
|
class TPythonScreens
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
bool _cleanupReadyFlag;
|
||||||
|
bool _renderReadyFlag;
|
||||||
|
bool _terminationFlag;
|
||||||
|
HANDLE _thread;
|
||||||
|
DWORD _threadId;
|
||||||
|
std::vector<TPythonScreenRenderer *> _screens;
|
||||||
|
char *_lookupPath;
|
||||||
|
void *_train;
|
||||||
|
void _cleanup();
|
||||||
|
void _freeTrainState();
|
||||||
|
PyObject *_trainState;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void reset(void *train);
|
||||||
|
void setLookupPath(AnsiString path);
|
||||||
|
void init(TQueryParserComp *parser, TModel3d *model, AnsiString name, int cab);
|
||||||
|
void update();
|
||||||
|
TPythonScreens();
|
||||||
|
~TPythonScreens();
|
||||||
|
void run();
|
||||||
|
void start();
|
||||||
|
void finish();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PyIntH
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
36
Segment.cpp
36
Segment.cpp
@@ -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;
|
||||||
|
|||||||
66
Segment.h
66
Segment.h
@@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
12
Sound.cpp
12
Sound.cpp
@@ -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)
|
||||||
|
|||||||
6
Sound.h
6
Sound.h
@@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
10
Spring.cpp
10
Spring.cpp
@@ -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()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
6
Spring.h
6
Spring.h
@@ -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:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
13
Texture.cpp
13
Texture.cpp
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
33
Timer.cpp
33
Timer.cpp
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
99
Track.cpp
99
Track.cpp
@@ -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
51
Track.h
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
129
Train.cpp
129
Train.cpp
@@ -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;
|
||||||
@@ -260,6 +260,38 @@ bool TTrain::Init(TDynamicObject *NewDynamicObject, bool e3d)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject *TTrain::GetTrainState()
|
||||||
|
{
|
||||||
|
PyObject *dict = PyDict_New();
|
||||||
|
if (dict == NULL)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyDict_SetItemString(dict, "direction", PyGetInt(DynamicObject->MoverParameters->ActiveDir));
|
||||||
|
PyDict_SetItemString(dict, "slipping_wheels",
|
||||||
|
PyGetBool(DynamicObject->MoverParameters->SlippingWheels));
|
||||||
|
PyDict_SetItemString(dict, "converter",
|
||||||
|
PyGetBool(DynamicObject->MoverParameters->ConverterFlag));
|
||||||
|
PyDict_SetItemString(dict, "main_ctrl_actual_pos",
|
||||||
|
PyGetInt(DynamicObject->MoverParameters->MainCtrlActualPos));
|
||||||
|
PyDict_SetItemString(dict, "scnd_ctrl_actual_pos",
|
||||||
|
PyGetInt(DynamicObject->MoverParameters->ScndCtrlActualPos));
|
||||||
|
PyDict_SetItemString(dict, "fuse", PyGetBool(DynamicObject->MoverParameters->FuseFlag));
|
||||||
|
PyDict_SetItemString(dict, "converter_overload",
|
||||||
|
PyGetBool(DynamicObject->MoverParameters->ConvOvldFlag));
|
||||||
|
PyDict_SetItemString(dict, "voltage", PyGetFloat(DynamicObject->MoverParameters->Voltage));
|
||||||
|
PyDict_SetItemString(dict, "velocity", PyGetFloat(DynamicObject->MoverParameters->Vel));
|
||||||
|
PyDict_SetItemString(dict, "im", PyGetFloat(DynamicObject->MoverParameters->Im));
|
||||||
|
PyDict_SetItemString(dict, "compress",
|
||||||
|
PyGetBool(DynamicObject->MoverParameters->CompressorFlag));
|
||||||
|
PyDict_SetItemString(dict, "hours", PyGetInt(GlobalTime->hh));
|
||||||
|
PyDict_SetItemString(dict, "minutes", PyGetInt(GlobalTime->mm));
|
||||||
|
PyDict_SetItemString(dict, "seconds", PyGetInt(GlobalTime->mr));
|
||||||
|
PyDict_SetItemString(dict, "velocity_desired", PyGetFloat(DynamicObject->Mechanik->VelDesired));
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
|
||||||
void TTrain::OnKeyDown(int cKey)
|
void TTrain::OnKeyDown(int cKey)
|
||||||
{ // naciœniêcie klawisza
|
{ // naciœniêcie klawisza
|
||||||
bool isEztOer;
|
bool isEztOer;
|
||||||
@@ -272,7 +304,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 +543,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 +595,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 +732,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 +1112,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 +1198,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 +1492,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 +1746,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 +2068,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 +2214,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 +2490,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 +2504,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 +2549,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 +3088,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 +3133,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 +3147,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 +3246,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 +4090,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 +4155,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 +4178,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 +4291,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
|
||||||
@@ -4589,6 +4621,8 @@ bool TTrain::Update()
|
|||||||
ggDepartureSignalButton.UpdateValue(0);
|
ggDepartureSignalButton.UpdateValue(0);
|
||||||
ggFuseButton.UpdateValue(0);
|
ggFuseButton.UpdateValue(0);
|
||||||
ggConverterFuseButton.UpdateValue(0);
|
ggConverterFuseButton.UpdateValue(0);
|
||||||
|
|
||||||
|
pyScreens.update();
|
||||||
}
|
}
|
||||||
// wyprowadzenie sygna³ów dla haslera na PoKeys (zaznaczanie na taœmie)
|
// wyprowadzenie sygna³ów dla haslera na PoKeys (zaznaczanie na taœmie)
|
||||||
btHaslerBrakes.Turn(DynamicObject->MoverParameters->BrakePress > 0.4); // ciœnienie w cylindrach
|
btHaslerBrakes.Turn(DynamicObject->MoverParameters->BrakePress > 0.4); // ciœnienie w cylindrach
|
||||||
@@ -4619,7 +4653,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,13 +4929,15 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName)
|
bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName)
|
||||||
{
|
{
|
||||||
|
pyScreens.reset(this);
|
||||||
|
pyScreens.setLookupPath(DynamicObject->asBaseDir);
|
||||||
bool parse = false;
|
bool parse = false;
|
||||||
double dSDist;
|
double dSDist;
|
||||||
TFileStream *fs;
|
TFileStream *fs;
|
||||||
@@ -4998,7 +5034,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 +5219,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 +5422,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);
|
||||||
@@ -5508,6 +5544,8 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName)
|
|||||||
btLampkaBackward.Load(Parser, DynamicObject->mdKabina);
|
btLampkaBackward.Load(Parser, DynamicObject->mdKabina);
|
||||||
else if (str == AnsiString("i-cablight:")) // hunter-171012
|
else if (str == AnsiString("i-cablight:")) // hunter-171012
|
||||||
btCabLight.Load(Parser, DynamicObject->mdKabina);
|
btCabLight.Load(Parser, DynamicObject->mdKabina);
|
||||||
|
else if (str == AnsiString("pyscreen:"))
|
||||||
|
pyScreens.init(Parser, DynamicObject->mdKabina, DynamicObject->GetName(), NewCabNo);
|
||||||
// btLampkaUnknown.Init("unknown",mdKabina,false);
|
// btLampkaUnknown.Init("unknown",mdKabina,false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5518,6 +5556,7 @@ bool TTrain::InitializeCab(int NewCabNo, AnsiString asFileName)
|
|||||||
}
|
}
|
||||||
// ABu 050205: tego wczesniej nie bylo:
|
// ABu 050205: tego wczesniej nie bylo:
|
||||||
delete Parser;
|
delete Parser;
|
||||||
|
pyScreens.start();
|
||||||
if (DynamicObject->mdKabina)
|
if (DynamicObject->mdKabina)
|
||||||
{
|
{
|
||||||
DynamicObject->mdKabina
|
DynamicObject->mdKabina
|
||||||
@@ -5553,7 +5592,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
|
||||||
|
|||||||
33
Train.h
33
Train.h
@@ -23,6 +23,7 @@ http://mozilla.org/MPL/2.0/.
|
|||||||
#include "AdvSound.h"
|
#include "AdvSound.h"
|
||||||
#include "RealSound.h"
|
#include "RealSound.h"
|
||||||
#include "FadeSound.h"
|
#include "FadeSound.h"
|
||||||
|
#include "PyInt.h"
|
||||||
|
|
||||||
// typedef enum {st_Off, st_Starting, st_On, st_ShuttingDown} T4State;
|
// typedef enum {st_Off, st_Starting, st_On, st_ShuttingDown} T4State;
|
||||||
|
|
||||||
@@ -44,7 +45,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,14 +84,21 @@ 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();
|
||||||
// virtual bool RenderAlpha();
|
// virtual bool RenderAlpha();
|
||||||
// McZapkie-310302: ladowanie parametrow z pliku
|
// McZapkie-310302: ladowanie parametrow z pliku
|
||||||
bool LoadMMediaFile(AnsiString asFileName);
|
bool LoadMMediaFile(AnsiString asFileName);
|
||||||
|
PyObject *GetTrainState();
|
||||||
|
|
||||||
private: //瞠by go nic z zewn靖rz nie przestawia這
|
private: //瞠by go nic z zewn靖rz nie przestawia這
|
||||||
TDynamicObject *DynamicObject; // przestawia zmiana pojazdu [F5]
|
TDynamicObject *DynamicObject; // przestawia zmiana pojazdu [F5]
|
||||||
@@ -145,7 +153,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;
|
||||||
@@ -372,10 +380,21 @@ class TTrain
|
|||||||
float fSPPress, fSNPress;
|
float fSPPress, fSNPress;
|
||||||
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
|
||||||
|
TPythonScreens pyScreens;
|
||||||
|
|
||||||
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();
|
||||||
};
|
};
|
||||||
|
|||||||
12
TrkFoll.cpp
12
TrkFoll.cpp
@@ -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
|
||||||
|
|||||||
17
TrkFoll.h
17
TrkFoll.h
@@ -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
|
||||||
|
|||||||
44
World.cpp
44
World.cpp
@@ -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
|
||||||
|
|||||||
@@ -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
102
dumb3d.h
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
25
geometry.cpp
25
geometry.cpp
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
26
parser.h
26
parser.h
@@ -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.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
535
python/include/Python-ast.h
Normal file
535
python/include/Python-ast.h
Normal file
@@ -0,0 +1,535 @@
|
|||||||
|
/* File automatically generated by Parser/asdl_c.py. */
|
||||||
|
|
||||||
|
#include "asdl.h"
|
||||||
|
|
||||||
|
typedef struct _mod *mod_ty;
|
||||||
|
|
||||||
|
typedef struct _stmt *stmt_ty;
|
||||||
|
|
||||||
|
typedef struct _expr *expr_ty;
|
||||||
|
|
||||||
|
typedef enum _expr_context { Load=1, Store=2, Del=3, AugLoad=4, AugStore=5,
|
||||||
|
Param=6 } expr_context_ty;
|
||||||
|
|
||||||
|
typedef struct _slice *slice_ty;
|
||||||
|
|
||||||
|
typedef enum _boolop { And=1, Or=2 } boolop_ty;
|
||||||
|
|
||||||
|
typedef enum _operator { Add=1, Sub=2, Mult=3, Div=4, Mod=5, Pow=6, LShift=7,
|
||||||
|
RShift=8, BitOr=9, BitXor=10, BitAnd=11, FloorDiv=12 }
|
||||||
|
operator_ty;
|
||||||
|
|
||||||
|
typedef enum _unaryop { Invert=1, Not=2, UAdd=3, USub=4 } unaryop_ty;
|
||||||
|
|
||||||
|
typedef enum _cmpop { Eq=1, NotEq=2, Lt=3, LtE=4, Gt=5, GtE=6, Is=7, IsNot=8,
|
||||||
|
In=9, NotIn=10 } cmpop_ty;
|
||||||
|
|
||||||
|
typedef struct _comprehension *comprehension_ty;
|
||||||
|
|
||||||
|
typedef struct _excepthandler *excepthandler_ty;
|
||||||
|
|
||||||
|
typedef struct _arguments *arguments_ty;
|
||||||
|
|
||||||
|
typedef struct _keyword *keyword_ty;
|
||||||
|
|
||||||
|
typedef struct _alias *alias_ty;
|
||||||
|
|
||||||
|
|
||||||
|
enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3,
|
||||||
|
Suite_kind=4};
|
||||||
|
struct _mod {
|
||||||
|
enum _mod_kind kind;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
asdl_seq *body;
|
||||||
|
} Module;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *body;
|
||||||
|
} Interactive;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty body;
|
||||||
|
} Expression;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *body;
|
||||||
|
} Suite;
|
||||||
|
|
||||||
|
} v;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum _stmt_kind {FunctionDef_kind=1, ClassDef_kind=2, Return_kind=3,
|
||||||
|
Delete_kind=4, Assign_kind=5, AugAssign_kind=6, Print_kind=7,
|
||||||
|
For_kind=8, While_kind=9, If_kind=10, With_kind=11,
|
||||||
|
Raise_kind=12, TryExcept_kind=13, TryFinally_kind=14,
|
||||||
|
Assert_kind=15, Import_kind=16, ImportFrom_kind=17,
|
||||||
|
Exec_kind=18, Global_kind=19, Expr_kind=20, Pass_kind=21,
|
||||||
|
Break_kind=22, Continue_kind=23};
|
||||||
|
struct _stmt {
|
||||||
|
enum _stmt_kind kind;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
identifier name;
|
||||||
|
arguments_ty args;
|
||||||
|
asdl_seq *body;
|
||||||
|
asdl_seq *decorator_list;
|
||||||
|
} FunctionDef;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
identifier name;
|
||||||
|
asdl_seq *bases;
|
||||||
|
asdl_seq *body;
|
||||||
|
asdl_seq *decorator_list;
|
||||||
|
} ClassDef;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty value;
|
||||||
|
} Return;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *targets;
|
||||||
|
} Delete;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *targets;
|
||||||
|
expr_ty value;
|
||||||
|
} Assign;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty target;
|
||||||
|
operator_ty op;
|
||||||
|
expr_ty value;
|
||||||
|
} AugAssign;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty dest;
|
||||||
|
asdl_seq *values;
|
||||||
|
bool nl;
|
||||||
|
} Print;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty target;
|
||||||
|
expr_ty iter;
|
||||||
|
asdl_seq *body;
|
||||||
|
asdl_seq *orelse;
|
||||||
|
} For;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty test;
|
||||||
|
asdl_seq *body;
|
||||||
|
asdl_seq *orelse;
|
||||||
|
} While;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty test;
|
||||||
|
asdl_seq *body;
|
||||||
|
asdl_seq *orelse;
|
||||||
|
} If;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty context_expr;
|
||||||
|
expr_ty optional_vars;
|
||||||
|
asdl_seq *body;
|
||||||
|
} With;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty type;
|
||||||
|
expr_ty inst;
|
||||||
|
expr_ty tback;
|
||||||
|
} Raise;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *body;
|
||||||
|
asdl_seq *handlers;
|
||||||
|
asdl_seq *orelse;
|
||||||
|
} TryExcept;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *body;
|
||||||
|
asdl_seq *finalbody;
|
||||||
|
} TryFinally;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty test;
|
||||||
|
expr_ty msg;
|
||||||
|
} Assert;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *names;
|
||||||
|
} Import;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
identifier module;
|
||||||
|
asdl_seq *names;
|
||||||
|
int level;
|
||||||
|
} ImportFrom;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty body;
|
||||||
|
expr_ty globals;
|
||||||
|
expr_ty locals;
|
||||||
|
} Exec;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *names;
|
||||||
|
} Global;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty value;
|
||||||
|
} Expr;
|
||||||
|
|
||||||
|
} v;
|
||||||
|
int lineno;
|
||||||
|
int col_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum _expr_kind {BoolOp_kind=1, BinOp_kind=2, UnaryOp_kind=3, Lambda_kind=4,
|
||||||
|
IfExp_kind=5, Dict_kind=6, Set_kind=7, ListComp_kind=8,
|
||||||
|
SetComp_kind=9, DictComp_kind=10, GeneratorExp_kind=11,
|
||||||
|
Yield_kind=12, Compare_kind=13, Call_kind=14, Repr_kind=15,
|
||||||
|
Num_kind=16, Str_kind=17, Attribute_kind=18,
|
||||||
|
Subscript_kind=19, Name_kind=20, List_kind=21, Tuple_kind=22};
|
||||||
|
struct _expr {
|
||||||
|
enum _expr_kind kind;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
boolop_ty op;
|
||||||
|
asdl_seq *values;
|
||||||
|
} BoolOp;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty left;
|
||||||
|
operator_ty op;
|
||||||
|
expr_ty right;
|
||||||
|
} BinOp;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unaryop_ty op;
|
||||||
|
expr_ty operand;
|
||||||
|
} UnaryOp;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
arguments_ty args;
|
||||||
|
expr_ty body;
|
||||||
|
} Lambda;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty test;
|
||||||
|
expr_ty body;
|
||||||
|
expr_ty orelse;
|
||||||
|
} IfExp;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *keys;
|
||||||
|
asdl_seq *values;
|
||||||
|
} Dict;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *elts;
|
||||||
|
} Set;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty elt;
|
||||||
|
asdl_seq *generators;
|
||||||
|
} ListComp;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty elt;
|
||||||
|
asdl_seq *generators;
|
||||||
|
} SetComp;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty key;
|
||||||
|
expr_ty value;
|
||||||
|
asdl_seq *generators;
|
||||||
|
} DictComp;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty elt;
|
||||||
|
asdl_seq *generators;
|
||||||
|
} GeneratorExp;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty value;
|
||||||
|
} Yield;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty left;
|
||||||
|
asdl_int_seq *ops;
|
||||||
|
asdl_seq *comparators;
|
||||||
|
} Compare;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty func;
|
||||||
|
asdl_seq *args;
|
||||||
|
asdl_seq *keywords;
|
||||||
|
expr_ty starargs;
|
||||||
|
expr_ty kwargs;
|
||||||
|
} Call;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty value;
|
||||||
|
} Repr;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
object n;
|
||||||
|
} Num;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
string s;
|
||||||
|
} Str;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty value;
|
||||||
|
identifier attr;
|
||||||
|
expr_context_ty ctx;
|
||||||
|
} Attribute;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty value;
|
||||||
|
slice_ty slice;
|
||||||
|
expr_context_ty ctx;
|
||||||
|
} Subscript;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
identifier id;
|
||||||
|
expr_context_ty ctx;
|
||||||
|
} Name;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *elts;
|
||||||
|
expr_context_ty ctx;
|
||||||
|
} List;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *elts;
|
||||||
|
expr_context_ty ctx;
|
||||||
|
} Tuple;
|
||||||
|
|
||||||
|
} v;
|
||||||
|
int lineno;
|
||||||
|
int col_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum _slice_kind {Ellipsis_kind=1, Slice_kind=2, ExtSlice_kind=3, Index_kind=4};
|
||||||
|
struct _slice {
|
||||||
|
enum _slice_kind kind;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
expr_ty lower;
|
||||||
|
expr_ty upper;
|
||||||
|
expr_ty step;
|
||||||
|
} Slice;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
asdl_seq *dims;
|
||||||
|
} ExtSlice;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
expr_ty value;
|
||||||
|
} Index;
|
||||||
|
|
||||||
|
} v;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _comprehension {
|
||||||
|
expr_ty target;
|
||||||
|
expr_ty iter;
|
||||||
|
asdl_seq *ifs;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum _excepthandler_kind {ExceptHandler_kind=1};
|
||||||
|
struct _excepthandler {
|
||||||
|
enum _excepthandler_kind kind;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
expr_ty type;
|
||||||
|
expr_ty name;
|
||||||
|
asdl_seq *body;
|
||||||
|
} ExceptHandler;
|
||||||
|
|
||||||
|
} v;
|
||||||
|
int lineno;
|
||||||
|
int col_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _arguments {
|
||||||
|
asdl_seq *args;
|
||||||
|
identifier vararg;
|
||||||
|
identifier kwarg;
|
||||||
|
asdl_seq *defaults;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _keyword {
|
||||||
|
identifier arg;
|
||||||
|
expr_ty value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _alias {
|
||||||
|
identifier name;
|
||||||
|
identifier asname;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define Module(a0, a1) _Py_Module(a0, a1)
|
||||||
|
mod_ty _Py_Module(asdl_seq * body, PyArena *arena);
|
||||||
|
#define Interactive(a0, a1) _Py_Interactive(a0, a1)
|
||||||
|
mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena);
|
||||||
|
#define Expression(a0, a1) _Py_Expression(a0, a1)
|
||||||
|
mod_ty _Py_Expression(expr_ty body, PyArena *arena);
|
||||||
|
#define Suite(a0, a1) _Py_Suite(a0, a1)
|
||||||
|
mod_ty _Py_Suite(asdl_seq * body, PyArena *arena);
|
||||||
|
#define FunctionDef(a0, a1, a2, a3, a4, a5, a6) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6)
|
||||||
|
stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body,
|
||||||
|
asdl_seq * decorator_list, int lineno, int col_offset,
|
||||||
|
PyArena *arena);
|
||||||
|
#define ClassDef(a0, a1, a2, a3, a4, a5, a6) _Py_ClassDef(a0, a1, a2, a3, a4, a5, a6)
|
||||||
|
stmt_ty _Py_ClassDef(identifier name, asdl_seq * bases, asdl_seq * body,
|
||||||
|
asdl_seq * decorator_list, int lineno, int col_offset,
|
||||||
|
PyArena *arena);
|
||||||
|
#define Return(a0, a1, a2, a3) _Py_Return(a0, a1, a2, a3)
|
||||||
|
stmt_ty _Py_Return(expr_ty value, int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Delete(a0, a1, a2, a3) _Py_Delete(a0, a1, a2, a3)
|
||||||
|
stmt_ty _Py_Delete(asdl_seq * targets, int lineno, int col_offset, PyArena
|
||||||
|
*arena);
|
||||||
|
#define Assign(a0, a1, a2, a3, a4) _Py_Assign(a0, a1, a2, a3, a4)
|
||||||
|
stmt_ty _Py_Assign(asdl_seq * targets, expr_ty value, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define AugAssign(a0, a1, a2, a3, a4, a5) _Py_AugAssign(a0, a1, a2, a3, a4, a5)
|
||||||
|
stmt_ty _Py_AugAssign(expr_ty target, operator_ty op, expr_ty value, int
|
||||||
|
lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Print(a0, a1, a2, a3, a4, a5) _Py_Print(a0, a1, a2, a3, a4, a5)
|
||||||
|
stmt_ty _Py_Print(expr_ty dest, asdl_seq * values, bool nl, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define For(a0, a1, a2, a3, a4, a5, a6) _Py_For(a0, a1, a2, a3, a4, a5, a6)
|
||||||
|
stmt_ty _Py_For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq *
|
||||||
|
orelse, int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define While(a0, a1, a2, a3, a4, a5) _Py_While(a0, a1, a2, a3, a4, a5)
|
||||||
|
stmt_ty _Py_While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno,
|
||||||
|
int col_offset, PyArena *arena);
|
||||||
|
#define If(a0, a1, a2, a3, a4, a5) _Py_If(a0, a1, a2, a3, a4, a5)
|
||||||
|
stmt_ty _Py_If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno,
|
||||||
|
int col_offset, PyArena *arena);
|
||||||
|
#define With(a0, a1, a2, a3, a4, a5) _Py_With(a0, a1, a2, a3, a4, a5)
|
||||||
|
stmt_ty _Py_With(expr_ty context_expr, expr_ty optional_vars, asdl_seq * body,
|
||||||
|
int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Raise(a0, a1, a2, a3, a4, a5) _Py_Raise(a0, a1, a2, a3, a4, a5)
|
||||||
|
stmt_ty _Py_Raise(expr_ty type, expr_ty inst, expr_ty tback, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define TryExcept(a0, a1, a2, a3, a4, a5) _Py_TryExcept(a0, a1, a2, a3, a4, a5)
|
||||||
|
stmt_ty _Py_TryExcept(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse,
|
||||||
|
int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define TryFinally(a0, a1, a2, a3, a4) _Py_TryFinally(a0, a1, a2, a3, a4)
|
||||||
|
stmt_ty _Py_TryFinally(asdl_seq * body, asdl_seq * finalbody, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define Assert(a0, a1, a2, a3, a4) _Py_Assert(a0, a1, a2, a3, a4)
|
||||||
|
stmt_ty _Py_Assert(expr_ty test, expr_ty msg, int lineno, int col_offset,
|
||||||
|
PyArena *arena);
|
||||||
|
#define Import(a0, a1, a2, a3) _Py_Import(a0, a1, a2, a3)
|
||||||
|
stmt_ty _Py_Import(asdl_seq * names, int lineno, int col_offset, PyArena
|
||||||
|
*arena);
|
||||||
|
#define ImportFrom(a0, a1, a2, a3, a4, a5) _Py_ImportFrom(a0, a1, a2, a3, a4, a5)
|
||||||
|
stmt_ty _Py_ImportFrom(identifier module, asdl_seq * names, int level, int
|
||||||
|
lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Exec(a0, a1, a2, a3, a4, a5) _Py_Exec(a0, a1, a2, a3, a4, a5)
|
||||||
|
stmt_ty _Py_Exec(expr_ty body, expr_ty globals, expr_ty locals, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define Global(a0, a1, a2, a3) _Py_Global(a0, a1, a2, a3)
|
||||||
|
stmt_ty _Py_Global(asdl_seq * names, int lineno, int col_offset, PyArena
|
||||||
|
*arena);
|
||||||
|
#define Expr(a0, a1, a2, a3) _Py_Expr(a0, a1, a2, a3)
|
||||||
|
stmt_ty _Py_Expr(expr_ty value, int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Pass(a0, a1, a2) _Py_Pass(a0, a1, a2)
|
||||||
|
stmt_ty _Py_Pass(int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Break(a0, a1, a2) _Py_Break(a0, a1, a2)
|
||||||
|
stmt_ty _Py_Break(int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Continue(a0, a1, a2) _Py_Continue(a0, a1, a2)
|
||||||
|
stmt_ty _Py_Continue(int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define BoolOp(a0, a1, a2, a3, a4) _Py_BoolOp(a0, a1, a2, a3, a4)
|
||||||
|
expr_ty _Py_BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset,
|
||||||
|
PyArena *arena);
|
||||||
|
#define BinOp(a0, a1, a2, a3, a4, a5) _Py_BinOp(a0, a1, a2, a3, a4, a5)
|
||||||
|
expr_ty _Py_BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define UnaryOp(a0, a1, a2, a3, a4) _Py_UnaryOp(a0, a1, a2, a3, a4)
|
||||||
|
expr_ty _Py_UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset,
|
||||||
|
PyArena *arena);
|
||||||
|
#define Lambda(a0, a1, a2, a3, a4) _Py_Lambda(a0, a1, a2, a3, a4)
|
||||||
|
expr_ty _Py_Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset,
|
||||||
|
PyArena *arena);
|
||||||
|
#define IfExp(a0, a1, a2, a3, a4, a5) _Py_IfExp(a0, a1, a2, a3, a4, a5)
|
||||||
|
expr_ty _Py_IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define Dict(a0, a1, a2, a3, a4) _Py_Dict(a0, a1, a2, a3, a4)
|
||||||
|
expr_ty _Py_Dict(asdl_seq * keys, asdl_seq * values, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define Set(a0, a1, a2, a3) _Py_Set(a0, a1, a2, a3)
|
||||||
|
expr_ty _Py_Set(asdl_seq * elts, int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define ListComp(a0, a1, a2, a3, a4) _Py_ListComp(a0, a1, a2, a3, a4)
|
||||||
|
expr_ty _Py_ListComp(expr_ty elt, asdl_seq * generators, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define SetComp(a0, a1, a2, a3, a4) _Py_SetComp(a0, a1, a2, a3, a4)
|
||||||
|
expr_ty _Py_SetComp(expr_ty elt, asdl_seq * generators, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define DictComp(a0, a1, a2, a3, a4, a5) _Py_DictComp(a0, a1, a2, a3, a4, a5)
|
||||||
|
expr_ty _Py_DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int
|
||||||
|
lineno, int col_offset, PyArena *arena);
|
||||||
|
#define GeneratorExp(a0, a1, a2, a3, a4) _Py_GeneratorExp(a0, a1, a2, a3, a4)
|
||||||
|
expr_ty _Py_GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define Yield(a0, a1, a2, a3) _Py_Yield(a0, a1, a2, a3)
|
||||||
|
expr_ty _Py_Yield(expr_ty value, int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Compare(a0, a1, a2, a3, a4, a5) _Py_Compare(a0, a1, a2, a3, a4, a5)
|
||||||
|
expr_ty _Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators,
|
||||||
|
int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Call(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Call(a0, a1, a2, a3, a4, a5, a6, a7)
|
||||||
|
expr_ty _Py_Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, expr_ty
|
||||||
|
starargs, expr_ty kwargs, int lineno, int col_offset, PyArena
|
||||||
|
*arena);
|
||||||
|
#define Repr(a0, a1, a2, a3) _Py_Repr(a0, a1, a2, a3)
|
||||||
|
expr_ty _Py_Repr(expr_ty value, int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Num(a0, a1, a2, a3) _Py_Num(a0, a1, a2, a3)
|
||||||
|
expr_ty _Py_Num(object n, int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Str(a0, a1, a2, a3) _Py_Str(a0, a1, a2, a3)
|
||||||
|
expr_ty _Py_Str(string s, int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Attribute(a0, a1, a2, a3, a4, a5) _Py_Attribute(a0, a1, a2, a3, a4, a5)
|
||||||
|
expr_ty _Py_Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int
|
||||||
|
lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Subscript(a0, a1, a2, a3, a4, a5) _Py_Subscript(a0, a1, a2, a3, a4, a5)
|
||||||
|
expr_ty _Py_Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int
|
||||||
|
lineno, int col_offset, PyArena *arena);
|
||||||
|
#define Name(a0, a1, a2, a3, a4) _Py_Name(a0, a1, a2, a3, a4)
|
||||||
|
expr_ty _Py_Name(identifier id, expr_context_ty ctx, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define List(a0, a1, a2, a3, a4) _Py_List(a0, a1, a2, a3, a4)
|
||||||
|
expr_ty _Py_List(asdl_seq * elts, expr_context_ty ctx, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define Tuple(a0, a1, a2, a3, a4) _Py_Tuple(a0, a1, a2, a3, a4)
|
||||||
|
expr_ty _Py_Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int
|
||||||
|
col_offset, PyArena *arena);
|
||||||
|
#define Ellipsis(a0) _Py_Ellipsis(a0)
|
||||||
|
slice_ty _Py_Ellipsis(PyArena *arena);
|
||||||
|
#define Slice(a0, a1, a2, a3) _Py_Slice(a0, a1, a2, a3)
|
||||||
|
slice_ty _Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, PyArena *arena);
|
||||||
|
#define ExtSlice(a0, a1) _Py_ExtSlice(a0, a1)
|
||||||
|
slice_ty _Py_ExtSlice(asdl_seq * dims, PyArena *arena);
|
||||||
|
#define Index(a0, a1) _Py_Index(a0, a1)
|
||||||
|
slice_ty _Py_Index(expr_ty value, PyArena *arena);
|
||||||
|
#define comprehension(a0, a1, a2, a3) _Py_comprehension(a0, a1, a2, a3)
|
||||||
|
comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq *
|
||||||
|
ifs, PyArena *arena);
|
||||||
|
#define ExceptHandler(a0, a1, a2, a3, a4, a5) _Py_ExceptHandler(a0, a1, a2, a3, a4, a5)
|
||||||
|
excepthandler_ty _Py_ExceptHandler(expr_ty type, expr_ty name, asdl_seq * body,
|
||||||
|
int lineno, int col_offset, PyArena *arena);
|
||||||
|
#define arguments(a0, a1, a2, a3, a4) _Py_arguments(a0, a1, a2, a3, a4)
|
||||||
|
arguments_ty _Py_arguments(asdl_seq * args, identifier vararg, identifier
|
||||||
|
kwarg, asdl_seq * defaults, PyArena *arena);
|
||||||
|
#define keyword(a0, a1, a2) _Py_keyword(a0, a1, a2)
|
||||||
|
keyword_ty _Py_keyword(identifier arg, expr_ty value, PyArena *arena);
|
||||||
|
#define alias(a0, a1, a2) _Py_alias(a0, a1, a2)
|
||||||
|
alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena);
|
||||||
|
|
||||||
|
PyObject* PyAST_mod2obj(mod_ty t);
|
||||||
|
mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode);
|
||||||
|
int PyAST_Check(PyObject* obj);
|
||||||
178
python/include/Python.h
Normal file
178
python/include/Python.h
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
#ifndef Py_PYTHON_H
|
||||||
|
#define Py_PYTHON_H
|
||||||
|
/* Since this is a "meta-include" file, no #ifdef __cplusplus / extern "C" { */
|
||||||
|
|
||||||
|
/* Include nearly all Python header files */
|
||||||
|
|
||||||
|
#include "patchlevel.h"
|
||||||
|
#include "pyconfig.h"
|
||||||
|
#include "pymacconfig.h"
|
||||||
|
|
||||||
|
/* Cyclic gc is always enabled, starting with release 2.3a1. Supply the
|
||||||
|
* old symbol for the benefit of extension modules written before then
|
||||||
|
* that may be conditionalizing on it. The core doesn't use it anymore.
|
||||||
|
*/
|
||||||
|
#ifndef WITH_CYCLE_GC
|
||||||
|
#define WITH_CYCLE_GC 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#ifndef UCHAR_MAX
|
||||||
|
#error "Something's broken. UCHAR_MAX should be defined in limits.h."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if UCHAR_MAX != 255
|
||||||
|
#error "Python's source code assumes C's unsigned char is an 8-bit type."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__sgi) && defined(WITH_THREAD) && !defined(_SGI_MP_SOURCE)
|
||||||
|
#define _SGI_MP_SOURCE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifndef NULL
|
||||||
|
# error "Python.h requires that stdio.h define NULL."
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#ifdef HAVE_ERRNO_H
|
||||||
|
#include <errno.h>
|
||||||
|
#endif
|
||||||
|
#include <stdlib.h>
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For size_t? */
|
||||||
|
#ifdef HAVE_STDDEF_H
|
||||||
|
#include <stddef.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* CAUTION: Build setups should ensure that NDEBUG is defined on the
|
||||||
|
* compiler command line when building Python in release mode; else
|
||||||
|
* assert() calls won't be removed.
|
||||||
|
*/
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "pyport.h"
|
||||||
|
|
||||||
|
/* pyconfig.h or pyport.h may or may not define DL_IMPORT */
|
||||||
|
#ifndef DL_IMPORT /* declarations for DLL import/export */
|
||||||
|
#define DL_IMPORT(RTYPE) RTYPE
|
||||||
|
#endif
|
||||||
|
#ifndef DL_EXPORT /* declarations for DLL import/export */
|
||||||
|
#define DL_EXPORT(RTYPE) RTYPE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Debug-mode build with pymalloc implies PYMALLOC_DEBUG.
|
||||||
|
* PYMALLOC_DEBUG is in error if pymalloc is not in use.
|
||||||
|
*/
|
||||||
|
#if defined(Py_DEBUG) && defined(WITH_PYMALLOC) && !defined(PYMALLOC_DEBUG)
|
||||||
|
#define PYMALLOC_DEBUG
|
||||||
|
#endif
|
||||||
|
#if defined(PYMALLOC_DEBUG) && !defined(WITH_PYMALLOC)
|
||||||
|
#error "PYMALLOC_DEBUG requires WITH_PYMALLOC"
|
||||||
|
#endif
|
||||||
|
#include "pymath.h"
|
||||||
|
#include "pymem.h"
|
||||||
|
|
||||||
|
#include "object.h"
|
||||||
|
#include "objimpl.h"
|
||||||
|
|
||||||
|
#include "pydebug.h"
|
||||||
|
|
||||||
|
#include "unicodeobject.h"
|
||||||
|
#include "intobject.h"
|
||||||
|
#include "boolobject.h"
|
||||||
|
#include "longobject.h"
|
||||||
|
#include "floatobject.h"
|
||||||
|
#ifndef WITHOUT_COMPLEX
|
||||||
|
#include "complexobject.h"
|
||||||
|
#endif
|
||||||
|
#include "rangeobject.h"
|
||||||
|
#include "stringobject.h"
|
||||||
|
#include "memoryobject.h"
|
||||||
|
#include "bufferobject.h"
|
||||||
|
#include "bytesobject.h"
|
||||||
|
#include "bytearrayobject.h"
|
||||||
|
#include "tupleobject.h"
|
||||||
|
#include "listobject.h"
|
||||||
|
#include "dictobject.h"
|
||||||
|
#include "enumobject.h"
|
||||||
|
#include "setobject.h"
|
||||||
|
#include "methodobject.h"
|
||||||
|
#include "moduleobject.h"
|
||||||
|
#include "funcobject.h"
|
||||||
|
#include "classobject.h"
|
||||||
|
#include "fileobject.h"
|
||||||
|
#include "cobject.h"
|
||||||
|
#include "pycapsule.h"
|
||||||
|
#include "traceback.h"
|
||||||
|
#include "sliceobject.h"
|
||||||
|
#include "cellobject.h"
|
||||||
|
#include "iterobject.h"
|
||||||
|
#include "genobject.h"
|
||||||
|
#include "descrobject.h"
|
||||||
|
#include "warnings.h"
|
||||||
|
#include "weakrefobject.h"
|
||||||
|
|
||||||
|
#include "codecs.h"
|
||||||
|
#include "pyerrors.h"
|
||||||
|
|
||||||
|
#include "pystate.h"
|
||||||
|
|
||||||
|
#include "pyarena.h"
|
||||||
|
#include "modsupport.h"
|
||||||
|
#include "pythonrun.h"
|
||||||
|
#include "ceval.h"
|
||||||
|
#include "sysmodule.h"
|
||||||
|
#include "intrcheck.h"
|
||||||
|
#include "import.h"
|
||||||
|
|
||||||
|
#include "abstract.h"
|
||||||
|
|
||||||
|
#include "compile.h"
|
||||||
|
#include "eval.h"
|
||||||
|
|
||||||
|
#include "pyctype.h"
|
||||||
|
#include "pystrtod.h"
|
||||||
|
#include "pystrcmp.h"
|
||||||
|
#include "dtoa.h"
|
||||||
|
|
||||||
|
/* _Py_Mangle is defined in compile.c */
|
||||||
|
PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name);
|
||||||
|
|
||||||
|
/* PyArg_GetInt is deprecated and should not be used, use PyArg_Parse(). */
|
||||||
|
#define PyArg_GetInt(v, a) PyArg_Parse((v), "i", (a))
|
||||||
|
|
||||||
|
/* PyArg_NoArgs should not be necessary.
|
||||||
|
Set ml_flags in the PyMethodDef to METH_NOARGS. */
|
||||||
|
#define PyArg_NoArgs(v) PyArg_Parse(v, "")
|
||||||
|
|
||||||
|
/* Argument must be a char or an int in [-128, 127] or [0, 255]. */
|
||||||
|
#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff))
|
||||||
|
|
||||||
|
#include "pyfpe.h"
|
||||||
|
|
||||||
|
/* These definitions must match corresponding definitions in graminit.h.
|
||||||
|
There's code in compile.c that checks that they are the same. */
|
||||||
|
#define Py_single_input 256
|
||||||
|
#define Py_file_input 257
|
||||||
|
#define Py_eval_input 258
|
||||||
|
|
||||||
|
#ifdef HAVE_PTH
|
||||||
|
/* GNU pth user-space thread support */
|
||||||
|
#include <pth.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define macros for inline documentation. */
|
||||||
|
#define PyDoc_VAR(name) static char name[]
|
||||||
|
#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
|
||||||
|
#ifdef WITH_DOC_STRINGS
|
||||||
|
#define PyDoc_STR(str) str
|
||||||
|
#else
|
||||||
|
#define PyDoc_STR(str) ""
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !Py_PYTHON_H */
|
||||||
1396
python/include/abstract.h
Normal file
1396
python/include/abstract.h
Normal file
File diff suppressed because it is too large
Load Diff
45
python/include/asdl.h
Normal file
45
python/include/asdl.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#ifndef Py_ASDL_H
|
||||||
|
#define Py_ASDL_H
|
||||||
|
|
||||||
|
typedef PyObject * identifier;
|
||||||
|
typedef PyObject * string;
|
||||||
|
typedef PyObject * object;
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
typedef enum {false, true} bool;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* It would be nice if the code generated by asdl_c.py was completely
|
||||||
|
independent of Python, but it is a goal the requires too much work
|
||||||
|
at this stage. So, for example, I'll represent identifiers as
|
||||||
|
interned Python strings.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* XXX A sequence should be typed so that its use can be typechecked. */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int size;
|
||||||
|
void *elements[1];
|
||||||
|
} asdl_seq;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int size;
|
||||||
|
int elements[1];
|
||||||
|
} asdl_int_seq;
|
||||||
|
|
||||||
|
asdl_seq *asdl_seq_new(int size, PyArena *arena);
|
||||||
|
asdl_int_seq *asdl_int_seq_new(int size, PyArena *arena);
|
||||||
|
|
||||||
|
#define asdl_seq_GET(S, I) (S)->elements[(I)]
|
||||||
|
#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size)
|
||||||
|
#ifdef Py_DEBUG
|
||||||
|
#define asdl_seq_SET(S, I, V) { \
|
||||||
|
int _asdl_i = (I); \
|
||||||
|
assert((S) && _asdl_i < (S)->size); \
|
||||||
|
(S)->elements[_asdl_i] = (V); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define asdl_seq_SET(S, I, V) (S)->elements[I] = (V)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !Py_ASDL_H */
|
||||||
13
python/include/ast.h
Normal file
13
python/include/ast.h
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#ifndef Py_AST_H
|
||||||
|
#define Py_AST_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PyAPI_FUNC(mod_ty) PyAST_FromNode(const node *, PyCompilerFlags *flags,
|
||||||
|
const char *, PyArena *);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_AST_H */
|
||||||
32
python/include/bitset.h
Normal file
32
python/include/bitset.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
#ifndef Py_BITSET_H
|
||||||
|
#define Py_BITSET_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Bitset interface */
|
||||||
|
|
||||||
|
#define BYTE char
|
||||||
|
|
||||||
|
typedef BYTE *bitset;
|
||||||
|
|
||||||
|
bitset newbitset(int nbits);
|
||||||
|
void delbitset(bitset bs);
|
||||||
|
#define testbit(ss, ibit) (((ss)[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0)
|
||||||
|
int addbit(bitset bs, int ibit); /* Returns 0 if already set */
|
||||||
|
int samebitset(bitset bs1, bitset bs2, int nbits);
|
||||||
|
void mergebitset(bitset bs1, bitset bs2, int nbits);
|
||||||
|
|
||||||
|
#define BITSPERBYTE (8*sizeof(BYTE))
|
||||||
|
#define NBYTES(nbits) (((nbits) + BITSPERBYTE - 1) / BITSPERBYTE)
|
||||||
|
|
||||||
|
#define BIT2BYTE(ibit) ((ibit) / BITSPERBYTE)
|
||||||
|
#define BIT2SHIFT(ibit) ((ibit) % BITSPERBYTE)
|
||||||
|
#define BIT2MASK(ibit) (1 << BIT2SHIFT(ibit))
|
||||||
|
#define BYTE2BIT(ibyte) ((ibyte) * BITSPERBYTE)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_BITSET_H */
|
||||||
36
python/include/boolobject.h
Normal file
36
python/include/boolobject.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/* Boolean object interface */
|
||||||
|
|
||||||
|
#ifndef Py_BOOLOBJECT_H
|
||||||
|
#define Py_BOOLOBJECT_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
typedef PyIntObject PyBoolObject;
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyBool_Type;
|
||||||
|
|
||||||
|
#define PyBool_Check(x) (Py_TYPE(x) == &PyBool_Type)
|
||||||
|
|
||||||
|
/* Py_False and Py_True are the only two bools in existence.
|
||||||
|
Don't forget to apply Py_INCREF() when returning either!!! */
|
||||||
|
|
||||||
|
/* Don't use these directly */
|
||||||
|
PyAPI_DATA(PyIntObject) _Py_ZeroStruct, _Py_TrueStruct;
|
||||||
|
|
||||||
|
/* Use these macros */
|
||||||
|
#define Py_False ((PyObject *) &_Py_ZeroStruct)
|
||||||
|
#define Py_True ((PyObject *) &_Py_TrueStruct)
|
||||||
|
|
||||||
|
/* Macros for returning Py_True or Py_False, respectively */
|
||||||
|
#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True
|
||||||
|
#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False
|
||||||
|
|
||||||
|
/* Function to return a bool from a C long */
|
||||||
|
PyAPI_FUNC(PyObject *) PyBool_FromLong(long);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_BOOLOBJECT_H */
|
||||||
33
python/include/bufferobject.h
Normal file
33
python/include/bufferobject.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
|
||||||
|
/* Buffer object interface */
|
||||||
|
|
||||||
|
/* Note: the object's structure is private */
|
||||||
|
|
||||||
|
#ifndef Py_BUFFEROBJECT_H
|
||||||
|
#define Py_BUFFEROBJECT_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyBuffer_Type;
|
||||||
|
|
||||||
|
#define PyBuffer_Check(op) (Py_TYPE(op) == &PyBuffer_Type)
|
||||||
|
|
||||||
|
#define Py_END_OF_BUFFER (-1)
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyBuffer_FromObject(PyObject *base,
|
||||||
|
Py_ssize_t offset, Py_ssize_t size);
|
||||||
|
PyAPI_FUNC(PyObject *) PyBuffer_FromReadWriteObject(PyObject *base,
|
||||||
|
Py_ssize_t offset,
|
||||||
|
Py_ssize_t size);
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyBuffer_FromMemory(void *ptr, Py_ssize_t size);
|
||||||
|
PyAPI_FUNC(PyObject *) PyBuffer_FromReadWriteMemory(void *ptr, Py_ssize_t size);
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyBuffer_New(Py_ssize_t size);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_BUFFEROBJECT_H */
|
||||||
57
python/include/bytearrayobject.h
Normal file
57
python/include/bytearrayobject.h
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/* ByteArray object interface */
|
||||||
|
|
||||||
|
#ifndef Py_BYTEARRAYOBJECT_H
|
||||||
|
#define Py_BYTEARRAYOBJECT_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* Type PyByteArrayObject represents a mutable array of bytes.
|
||||||
|
* The Python API is that of a sequence;
|
||||||
|
* the bytes are mapped to ints in [0, 256).
|
||||||
|
* Bytes are not characters; they may be used to encode characters.
|
||||||
|
* The only way to go between bytes and str/unicode is via encoding
|
||||||
|
* and decoding.
|
||||||
|
* For the convenience of C programmers, the bytes type is considered
|
||||||
|
* to contain a char pointer, not an unsigned char pointer.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Object layout */
|
||||||
|
typedef struct {
|
||||||
|
PyObject_VAR_HEAD
|
||||||
|
/* XXX(nnorwitz): should ob_exports be Py_ssize_t? */
|
||||||
|
int ob_exports; /* how many buffer exports */
|
||||||
|
Py_ssize_t ob_alloc; /* How many bytes allocated */
|
||||||
|
char *ob_bytes;
|
||||||
|
} PyByteArrayObject;
|
||||||
|
|
||||||
|
/* Type object */
|
||||||
|
PyAPI_DATA(PyTypeObject) PyByteArray_Type;
|
||||||
|
PyAPI_DATA(PyTypeObject) PyByteArrayIter_Type;
|
||||||
|
|
||||||
|
/* Type check macros */
|
||||||
|
#define PyByteArray_Check(self) PyObject_TypeCheck(self, &PyByteArray_Type)
|
||||||
|
#define PyByteArray_CheckExact(self) (Py_TYPE(self) == &PyByteArray_Type)
|
||||||
|
|
||||||
|
/* Direct API functions */
|
||||||
|
PyAPI_FUNC(PyObject *) PyByteArray_FromObject(PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyByteArray_Concat(PyObject *, PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyByteArray_FromStringAndSize(const char *, Py_ssize_t);
|
||||||
|
PyAPI_FUNC(Py_ssize_t) PyByteArray_Size(PyObject *);
|
||||||
|
PyAPI_FUNC(char *) PyByteArray_AsString(PyObject *);
|
||||||
|
PyAPI_FUNC(int) PyByteArray_Resize(PyObject *, Py_ssize_t);
|
||||||
|
|
||||||
|
/* Macros, trading safety for speed */
|
||||||
|
#define PyByteArray_AS_STRING(self) \
|
||||||
|
(assert(PyByteArray_Check(self)), \
|
||||||
|
Py_SIZE(self) ? ((PyByteArrayObject *)(self))->ob_bytes : _PyByteArray_empty_string)
|
||||||
|
#define PyByteArray_GET_SIZE(self) (assert(PyByteArray_Check(self)),Py_SIZE(self))
|
||||||
|
|
||||||
|
PyAPI_DATA(char) _PyByteArray_empty_string[];
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_BYTEARRAYOBJECT_H */
|
||||||
75
python/include/bytes_methods.h
Normal file
75
python/include/bytes_methods.h
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
#ifndef Py_BYTES_CTYPE_H
|
||||||
|
#define Py_BYTES_CTYPE_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The internal implementation behind PyString (bytes) and PyBytes (buffer)
|
||||||
|
* methods of the given names, they operate on ASCII byte strings.
|
||||||
|
*/
|
||||||
|
extern PyObject* _Py_bytes_isspace(const char *cptr, Py_ssize_t len);
|
||||||
|
extern PyObject* _Py_bytes_isalpha(const char *cptr, Py_ssize_t len);
|
||||||
|
extern PyObject* _Py_bytes_isalnum(const char *cptr, Py_ssize_t len);
|
||||||
|
extern PyObject* _Py_bytes_isdigit(const char *cptr, Py_ssize_t len);
|
||||||
|
extern PyObject* _Py_bytes_islower(const char *cptr, Py_ssize_t len);
|
||||||
|
extern PyObject* _Py_bytes_isupper(const char *cptr, Py_ssize_t len);
|
||||||
|
extern PyObject* _Py_bytes_istitle(const char *cptr, Py_ssize_t len);
|
||||||
|
|
||||||
|
/* These store their len sized answer in the given preallocated *result arg. */
|
||||||
|
extern void _Py_bytes_lower(char *result, const char *cptr, Py_ssize_t len);
|
||||||
|
extern void _Py_bytes_upper(char *result, const char *cptr, Py_ssize_t len);
|
||||||
|
extern void _Py_bytes_title(char *result, char *s, Py_ssize_t len);
|
||||||
|
extern void _Py_bytes_capitalize(char *result, char *s, Py_ssize_t len);
|
||||||
|
extern void _Py_bytes_swapcase(char *result, char *s, Py_ssize_t len);
|
||||||
|
|
||||||
|
/* Shared __doc__ strings. */
|
||||||
|
extern const char _Py_isspace__doc__[];
|
||||||
|
extern const char _Py_isalpha__doc__[];
|
||||||
|
extern const char _Py_isalnum__doc__[];
|
||||||
|
extern const char _Py_isdigit__doc__[];
|
||||||
|
extern const char _Py_islower__doc__[];
|
||||||
|
extern const char _Py_isupper__doc__[];
|
||||||
|
extern const char _Py_istitle__doc__[];
|
||||||
|
extern const char _Py_lower__doc__[];
|
||||||
|
extern const char _Py_upper__doc__[];
|
||||||
|
extern const char _Py_title__doc__[];
|
||||||
|
extern const char _Py_capitalize__doc__[];
|
||||||
|
extern const char _Py_swapcase__doc__[];
|
||||||
|
|
||||||
|
/* These are left in for backward compatibility and will be removed
|
||||||
|
in 2.8/3.2 */
|
||||||
|
#define ISLOWER(c) Py_ISLOWER(c)
|
||||||
|
#define ISUPPER(c) Py_ISUPPER(c)
|
||||||
|
#define ISALPHA(c) Py_ISALPHA(c)
|
||||||
|
#define ISDIGIT(c) Py_ISDIGIT(c)
|
||||||
|
#define ISXDIGIT(c) Py_ISXDIGIT(c)
|
||||||
|
#define ISALNUM(c) Py_ISALNUM(c)
|
||||||
|
#define ISSPACE(c) Py_ISSPACE(c)
|
||||||
|
|
||||||
|
#undef islower
|
||||||
|
#define islower(c) undefined_islower(c)
|
||||||
|
#undef isupper
|
||||||
|
#define isupper(c) undefined_isupper(c)
|
||||||
|
#undef isalpha
|
||||||
|
#define isalpha(c) undefined_isalpha(c)
|
||||||
|
#undef isdigit
|
||||||
|
#define isdigit(c) undefined_isdigit(c)
|
||||||
|
#undef isxdigit
|
||||||
|
#define isxdigit(c) undefined_isxdigit(c)
|
||||||
|
#undef isalnum
|
||||||
|
#define isalnum(c) undefined_isalnum(c)
|
||||||
|
#undef isspace
|
||||||
|
#define isspace(c) undefined_isspace(c)
|
||||||
|
|
||||||
|
/* These are left in for backward compatibility and will be removed
|
||||||
|
in 2.8/3.2 */
|
||||||
|
#define TOLOWER(c) Py_TOLOWER(c)
|
||||||
|
#define TOUPPER(c) Py_TOUPPER(c)
|
||||||
|
|
||||||
|
#undef tolower
|
||||||
|
#define tolower(c) undefined_tolower(c)
|
||||||
|
#undef toupper
|
||||||
|
#define toupper(c) undefined_toupper(c)
|
||||||
|
|
||||||
|
/* this is needed because some docs are shared from the .o, not static */
|
||||||
|
#define PyDoc_STRVAR_shared(name,str) const char name[] = PyDoc_STR(str)
|
||||||
|
|
||||||
|
#endif /* !Py_BYTES_CTYPE_H */
|
||||||
27
python/include/bytesobject.h
Normal file
27
python/include/bytesobject.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#define PyBytesObject PyStringObject
|
||||||
|
#define PyBytes_Type PyString_Type
|
||||||
|
|
||||||
|
#define PyBytes_Check PyString_Check
|
||||||
|
#define PyBytes_CheckExact PyString_CheckExact
|
||||||
|
#define PyBytes_CHECK_INTERNED PyString_CHECK_INTERNED
|
||||||
|
#define PyBytes_AS_STRING PyString_AS_STRING
|
||||||
|
#define PyBytes_GET_SIZE PyString_GET_SIZE
|
||||||
|
#define Py_TPFLAGS_BYTES_SUBCLASS Py_TPFLAGS_STRING_SUBCLASS
|
||||||
|
|
||||||
|
#define PyBytes_FromStringAndSize PyString_FromStringAndSize
|
||||||
|
#define PyBytes_FromString PyString_FromString
|
||||||
|
#define PyBytes_FromFormatV PyString_FromFormatV
|
||||||
|
#define PyBytes_FromFormat PyString_FromFormat
|
||||||
|
#define PyBytes_Size PyString_Size
|
||||||
|
#define PyBytes_AsString PyString_AsString
|
||||||
|
#define PyBytes_Repr PyString_Repr
|
||||||
|
#define PyBytes_Concat PyString_Concat
|
||||||
|
#define PyBytes_ConcatAndDel PyString_ConcatAndDel
|
||||||
|
#define _PyBytes_Resize _PyString_Resize
|
||||||
|
#define _PyBytes_Eq _PyString_Eq
|
||||||
|
#define PyBytes_Format PyString_Format
|
||||||
|
#define _PyBytes_FormatLong _PyString_FormatLong
|
||||||
|
#define PyBytes_DecodeEscape PyString_DecodeEscape
|
||||||
|
#define _PyBytes_Join _PyString_Join
|
||||||
|
#define PyBytes_AsStringAndSize PyString_AsStringAndSize
|
||||||
|
#define _PyBytes_InsertThousandsGrouping _PyString_InsertThousandsGrouping
|
||||||
73
python/include/cStringIO.h
Normal file
73
python/include/cStringIO.h
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
#ifndef Py_CSTRINGIO_H
|
||||||
|
#define Py_CSTRINGIO_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
|
||||||
|
This header provides access to cStringIO objects from C.
|
||||||
|
Functions are provided for calling cStringIO objects and
|
||||||
|
macros are provided for testing whether you have cStringIO
|
||||||
|
objects.
|
||||||
|
|
||||||
|
Before calling any of the functions or macros, you must initialize
|
||||||
|
the routines with:
|
||||||
|
|
||||||
|
PycString_IMPORT
|
||||||
|
|
||||||
|
This would typically be done in your init function.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PycStringIO_CAPSULE_NAME "cStringIO.cStringIO_CAPI"
|
||||||
|
|
||||||
|
#define PycString_IMPORT \
|
||||||
|
PycStringIO = ((struct PycStringIO_CAPI*)PyCapsule_Import(\
|
||||||
|
PycStringIO_CAPSULE_NAME, 0))
|
||||||
|
|
||||||
|
/* Basic functions to manipulate cStringIO objects from C */
|
||||||
|
|
||||||
|
static struct PycStringIO_CAPI {
|
||||||
|
|
||||||
|
/* Read a string from an input object. If the last argument
|
||||||
|
is -1, the remainder will be read.
|
||||||
|
*/
|
||||||
|
int(*cread)(PyObject *, char **, Py_ssize_t);
|
||||||
|
|
||||||
|
/* Read a line from an input object. Returns the length of the read
|
||||||
|
line as an int and a pointer inside the object buffer as char** (so
|
||||||
|
the caller doesn't have to provide its own buffer as destination).
|
||||||
|
*/
|
||||||
|
int(*creadline)(PyObject *, char **);
|
||||||
|
|
||||||
|
/* Write a string to an output object*/
|
||||||
|
int(*cwrite)(PyObject *, const char *, Py_ssize_t);
|
||||||
|
|
||||||
|
/* Get the output object as a Python string (returns new reference). */
|
||||||
|
PyObject *(*cgetvalue)(PyObject *);
|
||||||
|
|
||||||
|
/* Create a new output object */
|
||||||
|
PyObject *(*NewOutput)(int);
|
||||||
|
|
||||||
|
/* Create an input object from a Python string
|
||||||
|
(copies the Python string reference).
|
||||||
|
*/
|
||||||
|
PyObject *(*NewInput)(PyObject *);
|
||||||
|
|
||||||
|
/* The Python types for cStringIO input and output objects.
|
||||||
|
Note that you can do input on an output object.
|
||||||
|
*/
|
||||||
|
PyTypeObject *InputType, *OutputType;
|
||||||
|
|
||||||
|
} *PycStringIO;
|
||||||
|
|
||||||
|
/* These can be used to test if you have one */
|
||||||
|
#define PycStringIO_InputCheck(O) \
|
||||||
|
(Py_TYPE(O)==PycStringIO->InputType)
|
||||||
|
#define PycStringIO_OutputCheck(O) \
|
||||||
|
(Py_TYPE(O)==PycStringIO->OutputType)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_CSTRINGIO_H */
|
||||||
28
python/include/cellobject.h
Normal file
28
python/include/cellobject.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/* Cell object interface */
|
||||||
|
|
||||||
|
#ifndef Py_CELLOBJECT_H
|
||||||
|
#define Py_CELLOBJECT_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyObject_HEAD
|
||||||
|
PyObject *ob_ref; /* Content of the cell or NULL when empty */
|
||||||
|
} PyCellObject;
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyCell_Type;
|
||||||
|
|
||||||
|
#define PyCell_Check(op) (Py_TYPE(op) == &PyCell_Type)
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyCell_New(PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *);
|
||||||
|
PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *);
|
||||||
|
|
||||||
|
#define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref)
|
||||||
|
#define PyCell_SET(op, v) (((PyCellObject *)(op))->ob_ref = v)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_TUPLEOBJECT_H */
|
||||||
153
python/include/ceval.h
Normal file
153
python/include/ceval.h
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
#ifndef Py_CEVAL_H
|
||||||
|
#define Py_CEVAL_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Interface to random parts in ceval.c */
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyEval_CallObjectWithKeywords(
|
||||||
|
PyObject *, PyObject *, PyObject *);
|
||||||
|
|
||||||
|
/* Inline this */
|
||||||
|
#define PyEval_CallObject(func,arg) \
|
||||||
|
PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyEval_CallFunction(PyObject *obj,
|
||||||
|
const char *format, ...);
|
||||||
|
PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj,
|
||||||
|
const char *methodname,
|
||||||
|
const char *format, ...);
|
||||||
|
|
||||||
|
PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *);
|
||||||
|
PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *);
|
||||||
|
|
||||||
|
struct _frame; /* Avoid including frameobject.h */
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void);
|
||||||
|
PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void);
|
||||||
|
PyAPI_FUNC(PyObject *) PyEval_GetLocals(void);
|
||||||
|
PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void);
|
||||||
|
PyAPI_FUNC(int) PyEval_GetRestricted(void);
|
||||||
|
|
||||||
|
/* Look at the current frame's (if any) code's co_flags, and turn on
|
||||||
|
the corresponding compiler flags in cf->cf_flags. Return 1 if any
|
||||||
|
flag was set, else return 0. */
|
||||||
|
PyAPI_FUNC(int) PyEval_MergeCompilerFlags(PyCompilerFlags *cf);
|
||||||
|
|
||||||
|
PyAPI_FUNC(int) Py_FlushLine(void);
|
||||||
|
|
||||||
|
PyAPI_FUNC(int) Py_AddPendingCall(int (*func)(void *), void *arg);
|
||||||
|
PyAPI_FUNC(int) Py_MakePendingCalls(void);
|
||||||
|
|
||||||
|
/* Protection against deeply nested recursive calls */
|
||||||
|
PyAPI_FUNC(void) Py_SetRecursionLimit(int);
|
||||||
|
PyAPI_FUNC(int) Py_GetRecursionLimit(void);
|
||||||
|
|
||||||
|
#define Py_EnterRecursiveCall(where) \
|
||||||
|
(_Py_MakeRecCheck(PyThreadState_GET()->recursion_depth) && \
|
||||||
|
_Py_CheckRecursiveCall(where))
|
||||||
|
#define Py_LeaveRecursiveCall() \
|
||||||
|
(--PyThreadState_GET()->recursion_depth)
|
||||||
|
PyAPI_FUNC(int) _Py_CheckRecursiveCall(char *where);
|
||||||
|
PyAPI_DATA(int) _Py_CheckRecursionLimit;
|
||||||
|
#ifdef USE_STACKCHECK
|
||||||
|
# define _Py_MakeRecCheck(x) (++(x) > --_Py_CheckRecursionLimit)
|
||||||
|
#else
|
||||||
|
# define _Py_MakeRecCheck(x) (++(x) > _Py_CheckRecursionLimit)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *);
|
||||||
|
PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *);
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyEval_GetCallStats(PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyEval_EvalFrame(struct _frame *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyEval_EvalFrameEx(struct _frame *f, int exc);
|
||||||
|
|
||||||
|
/* this used to be handled on a per-thread basis - now just two globals */
|
||||||
|
PyAPI_DATA(volatile int) _Py_Ticker;
|
||||||
|
PyAPI_DATA(int) _Py_CheckInterval;
|
||||||
|
|
||||||
|
/* Interface for threads.
|
||||||
|
|
||||||
|
A module that plans to do a blocking system call (or something else
|
||||||
|
that lasts a long time and doesn't touch Python data) can allow other
|
||||||
|
threads to run as follows:
|
||||||
|
|
||||||
|
...preparations here...
|
||||||
|
Py_BEGIN_ALLOW_THREADS
|
||||||
|
...blocking system call here...
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
|
...interpret result here...
|
||||||
|
|
||||||
|
The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a
|
||||||
|
{}-surrounded block.
|
||||||
|
To leave the block in the middle (e.g., with return), you must insert
|
||||||
|
a line containing Py_BLOCK_THREADS before the return, e.g.
|
||||||
|
|
||||||
|
if (...premature_exit...) {
|
||||||
|
Py_BLOCK_THREADS
|
||||||
|
PyErr_SetFromErrno(PyExc_IOError);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
An alternative is:
|
||||||
|
|
||||||
|
Py_BLOCK_THREADS
|
||||||
|
if (...premature_exit...) {
|
||||||
|
PyErr_SetFromErrno(PyExc_IOError);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
Py_UNBLOCK_THREADS
|
||||||
|
|
||||||
|
For convenience, that the value of 'errno' is restored across
|
||||||
|
Py_END_ALLOW_THREADS and Py_BLOCK_THREADS.
|
||||||
|
|
||||||
|
WARNING: NEVER NEST CALLS TO Py_BEGIN_ALLOW_THREADS AND
|
||||||
|
Py_END_ALLOW_THREADS!!!
|
||||||
|
|
||||||
|
The function PyEval_InitThreads() should be called only from
|
||||||
|
initthread() in "threadmodule.c".
|
||||||
|
|
||||||
|
Note that not yet all candidates have been converted to use this
|
||||||
|
mechanism!
|
||||||
|
*/
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyThreadState *) PyEval_SaveThread(void);
|
||||||
|
PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *);
|
||||||
|
|
||||||
|
#ifdef WITH_THREAD
|
||||||
|
|
||||||
|
PyAPI_FUNC(int) PyEval_ThreadsInitialized(void);
|
||||||
|
PyAPI_FUNC(void) PyEval_InitThreads(void);
|
||||||
|
PyAPI_FUNC(void) PyEval_AcquireLock(void);
|
||||||
|
PyAPI_FUNC(void) PyEval_ReleaseLock(void);
|
||||||
|
PyAPI_FUNC(void) PyEval_AcquireThread(PyThreadState *tstate);
|
||||||
|
PyAPI_FUNC(void) PyEval_ReleaseThread(PyThreadState *tstate);
|
||||||
|
PyAPI_FUNC(void) PyEval_ReInitThreads(void);
|
||||||
|
|
||||||
|
#define Py_BEGIN_ALLOW_THREADS { \
|
||||||
|
PyThreadState *_save; \
|
||||||
|
_save = PyEval_SaveThread();
|
||||||
|
#define Py_BLOCK_THREADS PyEval_RestoreThread(_save);
|
||||||
|
#define Py_UNBLOCK_THREADS _save = PyEval_SaveThread();
|
||||||
|
#define Py_END_ALLOW_THREADS PyEval_RestoreThread(_save); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* !WITH_THREAD */
|
||||||
|
|
||||||
|
#define Py_BEGIN_ALLOW_THREADS {
|
||||||
|
#define Py_BLOCK_THREADS
|
||||||
|
#define Py_UNBLOCK_THREADS
|
||||||
|
#define Py_END_ALLOW_THREADS }
|
||||||
|
|
||||||
|
#endif /* !WITH_THREAD */
|
||||||
|
|
||||||
|
PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_CEVAL_H */
|
||||||
83
python/include/classobject.h
Normal file
83
python/include/classobject.h
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
|
||||||
|
/* Class object interface */
|
||||||
|
|
||||||
|
/* Revealing some structures (not for general use) */
|
||||||
|
|
||||||
|
#ifndef Py_CLASSOBJECT_H
|
||||||
|
#define Py_CLASSOBJECT_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyObject_HEAD
|
||||||
|
PyObject *cl_bases; /* A tuple of class objects */
|
||||||
|
PyObject *cl_dict; /* A dictionary */
|
||||||
|
PyObject *cl_name; /* A string */
|
||||||
|
/* The following three are functions or NULL */
|
||||||
|
PyObject *cl_getattr;
|
||||||
|
PyObject *cl_setattr;
|
||||||
|
PyObject *cl_delattr;
|
||||||
|
PyObject *cl_weakreflist; /* List of weak references */
|
||||||
|
} PyClassObject;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyObject_HEAD
|
||||||
|
PyClassObject *in_class; /* The class object */
|
||||||
|
PyObject *in_dict; /* A dictionary */
|
||||||
|
PyObject *in_weakreflist; /* List of weak references */
|
||||||
|
} PyInstanceObject;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyObject_HEAD
|
||||||
|
PyObject *im_func; /* The callable object implementing the method */
|
||||||
|
PyObject *im_self; /* The instance it is bound to, or NULL */
|
||||||
|
PyObject *im_class; /* The class that asked for the method */
|
||||||
|
PyObject *im_weakreflist; /* List of weak references */
|
||||||
|
} PyMethodObject;
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyClass_Type, PyInstance_Type, PyMethod_Type;
|
||||||
|
|
||||||
|
#define PyClass_Check(op) ((op)->ob_type == &PyClass_Type)
|
||||||
|
#define PyInstance_Check(op) ((op)->ob_type == &PyInstance_Type)
|
||||||
|
#define PyMethod_Check(op) ((op)->ob_type == &PyMethod_Type)
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyClass_New(PyObject *, PyObject *, PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyInstance_New(PyObject *, PyObject *,
|
||||||
|
PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyInstance_NewRaw(PyObject *, PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyMethod_New(PyObject *, PyObject *, PyObject *);
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyMethod_Function(PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyMethod_Self(PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyMethod_Class(PyObject *);
|
||||||
|
|
||||||
|
/* Look up attribute with name (a string) on instance object pinst, using
|
||||||
|
* only the instance and base class dicts. If a descriptor is found in
|
||||||
|
* a class dict, the descriptor is returned without calling it.
|
||||||
|
* Returns NULL if nothing found, else a borrowed reference to the
|
||||||
|
* value associated with name in the dict in which name was found.
|
||||||
|
* The point of this routine is that it never calls arbitrary Python
|
||||||
|
* code, so is always "safe": all it does is dict lookups. The function
|
||||||
|
* can't fail, never sets an exception, and NULL is not an error (it just
|
||||||
|
* means "not found").
|
||||||
|
*/
|
||||||
|
PyAPI_FUNC(PyObject *) _PyInstance_Lookup(PyObject *pinst, PyObject *name);
|
||||||
|
|
||||||
|
/* Macros for direct access to these values. Type checks are *not*
|
||||||
|
done, so use with care. */
|
||||||
|
#define PyMethod_GET_FUNCTION(meth) \
|
||||||
|
(((PyMethodObject *)meth) -> im_func)
|
||||||
|
#define PyMethod_GET_SELF(meth) \
|
||||||
|
(((PyMethodObject *)meth) -> im_self)
|
||||||
|
#define PyMethod_GET_CLASS(meth) \
|
||||||
|
(((PyMethodObject *)meth) -> im_class)
|
||||||
|
|
||||||
|
PyAPI_FUNC(int) PyClass_IsSubclass(PyObject *, PyObject *);
|
||||||
|
|
||||||
|
PyAPI_FUNC(int) PyMethod_ClearFreeList(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_CLASSOBJECT_H */
|
||||||
89
python/include/cobject.h
Normal file
89
python/include/cobject.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
CObjects are marked Pending Deprecation as of Python 2.7.
|
||||||
|
The full schedule for 2.x is as follows:
|
||||||
|
- CObjects are marked Pending Deprecation in Python 2.7.
|
||||||
|
- CObjects will be marked Deprecated in Python 2.8
|
||||||
|
(if there is one).
|
||||||
|
- CObjects will be removed in Python 2.9 (if there is one).
|
||||||
|
|
||||||
|
Additionally, for the Python 3.x series:
|
||||||
|
- CObjects were marked Deprecated in Python 3.1.
|
||||||
|
- CObjects will be removed in Python 3.2.
|
||||||
|
|
||||||
|
You should switch all use of CObjects to capsules. Capsules
|
||||||
|
have a safer and more consistent API. For more information,
|
||||||
|
see Include/pycapsule.h, or read the "Capsules" topic in
|
||||||
|
the "Python/C API Reference Manual".
|
||||||
|
|
||||||
|
Python 2.7 no longer uses CObjects itself; all objects which
|
||||||
|
were formerly CObjects are now capsules. Note that this change
|
||||||
|
does not by itself break binary compatibility with extensions
|
||||||
|
built for previous versions of Python--PyCObject_AsVoidPtr()
|
||||||
|
has been changed to also understand capsules.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* original file header comment follows: */
|
||||||
|
|
||||||
|
/* C objects to be exported from one extension module to another.
|
||||||
|
|
||||||
|
C objects are used for communication between extension modules.
|
||||||
|
They provide a way for an extension module to export a C interface
|
||||||
|
to other extension modules, so that extension modules can use the
|
||||||
|
Python import mechanism to link to one another.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef Py_COBJECT_H
|
||||||
|
#define Py_COBJECT_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyCObject_Type;
|
||||||
|
|
||||||
|
#define PyCObject_Check(op) (Py_TYPE(op) == &PyCObject_Type)
|
||||||
|
|
||||||
|
/* Create a PyCObject from a pointer to a C object and an optional
|
||||||
|
destructor function. If the second argument is non-null, then it
|
||||||
|
will be called with the first argument if and when the PyCObject is
|
||||||
|
destroyed.
|
||||||
|
|
||||||
|
*/
|
||||||
|
PyAPI_FUNC(PyObject *) PyCObject_FromVoidPtr(
|
||||||
|
void *cobj, void (*destruct)(void*));
|
||||||
|
|
||||||
|
|
||||||
|
/* Create a PyCObject from a pointer to a C object, a description object,
|
||||||
|
and an optional destructor function. If the third argument is non-null,
|
||||||
|
then it will be called with the first and second arguments if and when
|
||||||
|
the PyCObject is destroyed.
|
||||||
|
*/
|
||||||
|
PyAPI_FUNC(PyObject *) PyCObject_FromVoidPtrAndDesc(
|
||||||
|
void *cobj, void *desc, void (*destruct)(void*,void*));
|
||||||
|
|
||||||
|
/* Retrieve a pointer to a C object from a PyCObject. */
|
||||||
|
PyAPI_FUNC(void *) PyCObject_AsVoidPtr(PyObject *);
|
||||||
|
|
||||||
|
/* Retrieve a pointer to a description object from a PyCObject. */
|
||||||
|
PyAPI_FUNC(void *) PyCObject_GetDesc(PyObject *);
|
||||||
|
|
||||||
|
/* Import a pointer to a C object from a module using a PyCObject. */
|
||||||
|
PyAPI_FUNC(void *) PyCObject_Import(char *module_name, char *cobject_name);
|
||||||
|
|
||||||
|
/* Modify a C object. Fails (==0) if object has a destructor. */
|
||||||
|
PyAPI_FUNC(int) PyCObject_SetVoidPtr(PyObject *self, void *cobj);
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyObject_HEAD
|
||||||
|
void *cobject;
|
||||||
|
void *desc;
|
||||||
|
void (*destructor)(void *);
|
||||||
|
} PyCObject;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_COBJECT_H */
|
||||||
107
python/include/code.h
Normal file
107
python/include/code.h
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
/* Definitions for bytecode */
|
||||||
|
|
||||||
|
#ifndef Py_CODE_H
|
||||||
|
#define Py_CODE_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Bytecode object */
|
||||||
|
typedef struct {
|
||||||
|
PyObject_HEAD
|
||||||
|
int co_argcount; /* #arguments, except *args */
|
||||||
|
int co_nlocals; /* #local variables */
|
||||||
|
int co_stacksize; /* #entries needed for evaluation stack */
|
||||||
|
int co_flags; /* CO_..., see below */
|
||||||
|
PyObject *co_code; /* instruction opcodes */
|
||||||
|
PyObject *co_consts; /* list (constants used) */
|
||||||
|
PyObject *co_names; /* list of strings (names used) */
|
||||||
|
PyObject *co_varnames; /* tuple of strings (local variable names) */
|
||||||
|
PyObject *co_freevars; /* tuple of strings (free variable names) */
|
||||||
|
PyObject *co_cellvars; /* tuple of strings (cell variable names) */
|
||||||
|
/* The rest doesn't count for hash/cmp */
|
||||||
|
PyObject *co_filename; /* string (where it was loaded from) */
|
||||||
|
PyObject *co_name; /* string (name, for reference) */
|
||||||
|
int co_firstlineno; /* first source line number */
|
||||||
|
PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See
|
||||||
|
Objects/lnotab_notes.txt for details. */
|
||||||
|
void *co_zombieframe; /* for optimization only (see frameobject.c) */
|
||||||
|
PyObject *co_weakreflist; /* to support weakrefs to code objects */
|
||||||
|
} PyCodeObject;
|
||||||
|
|
||||||
|
/* Masks for co_flags above */
|
||||||
|
#define CO_OPTIMIZED 0x0001
|
||||||
|
#define CO_NEWLOCALS 0x0002
|
||||||
|
#define CO_VARARGS 0x0004
|
||||||
|
#define CO_VARKEYWORDS 0x0008
|
||||||
|
#define CO_NESTED 0x0010
|
||||||
|
#define CO_GENERATOR 0x0020
|
||||||
|
/* The CO_NOFREE flag is set if there are no free or cell variables.
|
||||||
|
This information is redundant, but it allows a single flag test
|
||||||
|
to determine whether there is any extra work to be done when the
|
||||||
|
call frame it setup.
|
||||||
|
*/
|
||||||
|
#define CO_NOFREE 0x0040
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* This is no longer used. Stopped defining in 2.5, do not re-use. */
|
||||||
|
#define CO_GENERATOR_ALLOWED 0x1000
|
||||||
|
#endif
|
||||||
|
#define CO_FUTURE_DIVISION 0x2000
|
||||||
|
#define CO_FUTURE_ABSOLUTE_IMPORT 0x4000 /* do absolute imports by default */
|
||||||
|
#define CO_FUTURE_WITH_STATEMENT 0x8000
|
||||||
|
#define CO_FUTURE_PRINT_FUNCTION 0x10000
|
||||||
|
#define CO_FUTURE_UNICODE_LITERALS 0x20000
|
||||||
|
|
||||||
|
/* This should be defined if a future statement modifies the syntax.
|
||||||
|
For example, when a keyword is added.
|
||||||
|
*/
|
||||||
|
#if 1
|
||||||
|
#define PY_PARSER_REQUIRES_FUTURE_KEYWORD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CO_MAXBLOCKS 20 /* Max static block nesting within a function */
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyCode_Type;
|
||||||
|
|
||||||
|
#define PyCode_Check(op) (Py_TYPE(op) == &PyCode_Type)
|
||||||
|
#define PyCode_GetNumFree(op) (PyTuple_GET_SIZE((op)->co_freevars))
|
||||||
|
|
||||||
|
/* Public interface */
|
||||||
|
PyAPI_FUNC(PyCodeObject *) PyCode_New(
|
||||||
|
int, int, int, int, PyObject *, PyObject *, PyObject *, PyObject *,
|
||||||
|
PyObject *, PyObject *, PyObject *, PyObject *, int, PyObject *);
|
||||||
|
/* same as struct above */
|
||||||
|
|
||||||
|
/* Creates a new empty code object with the specified source location. */
|
||||||
|
PyAPI_FUNC(PyCodeObject *)
|
||||||
|
PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno);
|
||||||
|
|
||||||
|
/* Return the line number associated with the specified bytecode index
|
||||||
|
in this code object. If you just need the line number of a frame,
|
||||||
|
use PyFrame_GetLineNumber() instead. */
|
||||||
|
PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int);
|
||||||
|
|
||||||
|
/* for internal use only */
|
||||||
|
#define _PyCode_GETCODEPTR(co, pp) \
|
||||||
|
((*Py_TYPE((co)->co_code)->tp_as_buffer->bf_getreadbuffer) \
|
||||||
|
((co)->co_code, 0, (void **)(pp)))
|
||||||
|
|
||||||
|
typedef struct _addr_pair {
|
||||||
|
int ap_lower;
|
||||||
|
int ap_upper;
|
||||||
|
} PyAddrPair;
|
||||||
|
|
||||||
|
/* Update *bounds to describe the first and one-past-the-last instructions in the
|
||||||
|
same line as lasti. Return the number of that line.
|
||||||
|
*/
|
||||||
|
PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co,
|
||||||
|
int lasti, PyAddrPair *bounds);
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject*) PyCode_Optimize(PyObject *code, PyObject* consts,
|
||||||
|
PyObject *names, PyObject *lineno_obj);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_CODE_H */
|
||||||
167
python/include/codecs.h
Normal file
167
python/include/codecs.h
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
#ifndef Py_CODECREGISTRY_H
|
||||||
|
#define Py_CODECREGISTRY_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Python Codec Registry and support functions
|
||||||
|
|
||||||
|
|
||||||
|
Written by Marc-Andre Lemburg (mal@lemburg.com).
|
||||||
|
|
||||||
|
Copyright (c) Corporation for National Research Initiatives.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
/* Register a new codec search function.
|
||||||
|
|
||||||
|
As side effect, this tries to load the encodings package, if not
|
||||||
|
yet done, to make sure that it is always first in the list of
|
||||||
|
search functions.
|
||||||
|
|
||||||
|
The search_function's refcount is incremented by this function. */
|
||||||
|
|
||||||
|
PyAPI_FUNC(int) PyCodec_Register(
|
||||||
|
PyObject *search_function
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Codec register lookup API.
|
||||||
|
|
||||||
|
Looks up the given encoding and returns a CodecInfo object with
|
||||||
|
function attributes which implement the different aspects of
|
||||||
|
processing the encoding.
|
||||||
|
|
||||||
|
The encoding string is looked up converted to all lower-case
|
||||||
|
characters. This makes encodings looked up through this mechanism
|
||||||
|
effectively case-insensitive.
|
||||||
|
|
||||||
|
If no codec is found, a KeyError is set and NULL returned.
|
||||||
|
|
||||||
|
As side effect, this tries to load the encodings package, if not
|
||||||
|
yet done. This is part of the lazy load strategy for the encodings
|
||||||
|
package.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) _PyCodec_Lookup(
|
||||||
|
const char *encoding
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Generic codec based encoding API.
|
||||||
|
|
||||||
|
object is passed through the encoder function found for the given
|
||||||
|
encoding using the error handling method defined by errors. errors
|
||||||
|
may be NULL to use the default method defined for the codec.
|
||||||
|
|
||||||
|
Raises a LookupError in case no encoder can be found.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_Encode(
|
||||||
|
PyObject *object,
|
||||||
|
const char *encoding,
|
||||||
|
const char *errors
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Generic codec based decoding API.
|
||||||
|
|
||||||
|
object is passed through the decoder function found for the given
|
||||||
|
encoding using the error handling method defined by errors. errors
|
||||||
|
may be NULL to use the default method defined for the codec.
|
||||||
|
|
||||||
|
Raises a LookupError in case no encoder can be found.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_Decode(
|
||||||
|
PyObject *object,
|
||||||
|
const char *encoding,
|
||||||
|
const char *errors
|
||||||
|
);
|
||||||
|
|
||||||
|
/* --- Codec Lookup APIs --------------------------------------------------
|
||||||
|
|
||||||
|
All APIs return a codec object with incremented refcount and are
|
||||||
|
based on _PyCodec_Lookup(). The same comments w/r to the encoding
|
||||||
|
name also apply to these APIs.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Get an encoder function for the given encoding. */
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_Encoder(
|
||||||
|
const char *encoding
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Get a decoder function for the given encoding. */
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_Decoder(
|
||||||
|
const char *encoding
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Get a IncrementalEncoder object for the given encoding. */
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_IncrementalEncoder(
|
||||||
|
const char *encoding,
|
||||||
|
const char *errors
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Get a IncrementalDecoder object function for the given encoding. */
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_IncrementalDecoder(
|
||||||
|
const char *encoding,
|
||||||
|
const char *errors
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Get a StreamReader factory function for the given encoding. */
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_StreamReader(
|
||||||
|
const char *encoding,
|
||||||
|
PyObject *stream,
|
||||||
|
const char *errors
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Get a StreamWriter factory function for the given encoding. */
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_StreamWriter(
|
||||||
|
const char *encoding,
|
||||||
|
PyObject *stream,
|
||||||
|
const char *errors
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Unicode encoding error handling callback registry API */
|
||||||
|
|
||||||
|
/* Register the error handling callback function error under the given
|
||||||
|
name. This function will be called by the codec when it encounters
|
||||||
|
unencodable characters/undecodable bytes and doesn't know the
|
||||||
|
callback name, when name is specified as the error parameter
|
||||||
|
in the call to the encode/decode function.
|
||||||
|
Return 0 on success, -1 on error */
|
||||||
|
PyAPI_FUNC(int) PyCodec_RegisterError(const char *name, PyObject *error);
|
||||||
|
|
||||||
|
/* Lookup the error handling callback function registered under the given
|
||||||
|
name. As a special case NULL can be passed, in which case
|
||||||
|
the error handling callback for "strict" will be returned. */
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_LookupError(const char *name);
|
||||||
|
|
||||||
|
/* raise exc as an exception */
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_StrictErrors(PyObject *exc);
|
||||||
|
|
||||||
|
/* ignore the unicode error, skipping the faulty input */
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_IgnoreErrors(PyObject *exc);
|
||||||
|
|
||||||
|
/* replace the unicode encode error with ? or U+FFFD */
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_ReplaceErrors(PyObject *exc);
|
||||||
|
|
||||||
|
/* replace the unicode encode error with XML character references */
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_XMLCharRefReplaceErrors(PyObject *exc);
|
||||||
|
|
||||||
|
/* replace the unicode encode error with backslash escapes (\x, \u and \U) */
|
||||||
|
PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_CODECREGISTRY_H */
|
||||||
40
python/include/compile.h
Normal file
40
python/include/compile.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
#ifndef Py_COMPILE_H
|
||||||
|
#define Py_COMPILE_H
|
||||||
|
|
||||||
|
#include "code.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Public interface */
|
||||||
|
struct _node; /* Declare the existence of this type */
|
||||||
|
PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *);
|
||||||
|
|
||||||
|
/* Future feature support */
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int ff_features; /* flags set by future statements */
|
||||||
|
int ff_lineno; /* line number of last future statement */
|
||||||
|
} PyFutureFeatures;
|
||||||
|
|
||||||
|
#define FUTURE_NESTED_SCOPES "nested_scopes"
|
||||||
|
#define FUTURE_GENERATORS "generators"
|
||||||
|
#define FUTURE_DIVISION "division"
|
||||||
|
#define FUTURE_ABSOLUTE_IMPORT "absolute_import"
|
||||||
|
#define FUTURE_WITH_STATEMENT "with_statement"
|
||||||
|
#define FUTURE_PRINT_FUNCTION "print_function"
|
||||||
|
#define FUTURE_UNICODE_LITERALS "unicode_literals"
|
||||||
|
|
||||||
|
|
||||||
|
struct _mod; /* Declare the existence of this type */
|
||||||
|
PyAPI_FUNC(PyCodeObject *) PyAST_Compile(struct _mod *, const char *,
|
||||||
|
PyCompilerFlags *, PyArena *);
|
||||||
|
PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST(struct _mod *, const char *);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_COMPILE_H */
|
||||||
66
python/include/complexobject.h
Normal file
66
python/include/complexobject.h
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
/* Complex number structure */
|
||||||
|
|
||||||
|
#ifndef Py_COMPLEXOBJECT_H
|
||||||
|
#define Py_COMPLEXOBJECT_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
double real;
|
||||||
|
double imag;
|
||||||
|
} Py_complex;
|
||||||
|
|
||||||
|
/* Operations on complex numbers from complexmodule.c */
|
||||||
|
|
||||||
|
#define c_sum _Py_c_sum
|
||||||
|
#define c_diff _Py_c_diff
|
||||||
|
#define c_neg _Py_c_neg
|
||||||
|
#define c_prod _Py_c_prod
|
||||||
|
#define c_quot _Py_c_quot
|
||||||
|
#define c_pow _Py_c_pow
|
||||||
|
#define c_abs _Py_c_abs
|
||||||
|
|
||||||
|
PyAPI_FUNC(Py_complex) c_sum(Py_complex, Py_complex);
|
||||||
|
PyAPI_FUNC(Py_complex) c_diff(Py_complex, Py_complex);
|
||||||
|
PyAPI_FUNC(Py_complex) c_neg(Py_complex);
|
||||||
|
PyAPI_FUNC(Py_complex) c_prod(Py_complex, Py_complex);
|
||||||
|
PyAPI_FUNC(Py_complex) c_quot(Py_complex, Py_complex);
|
||||||
|
PyAPI_FUNC(Py_complex) c_pow(Py_complex, Py_complex);
|
||||||
|
PyAPI_FUNC(double) c_abs(Py_complex);
|
||||||
|
|
||||||
|
|
||||||
|
/* Complex object interface */
|
||||||
|
|
||||||
|
/*
|
||||||
|
PyComplexObject represents a complex number with double-precision
|
||||||
|
real and imaginary parts.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyObject_HEAD
|
||||||
|
Py_complex cval;
|
||||||
|
} PyComplexObject;
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyComplex_Type;
|
||||||
|
|
||||||
|
#define PyComplex_Check(op) PyObject_TypeCheck(op, &PyComplex_Type)
|
||||||
|
#define PyComplex_CheckExact(op) (Py_TYPE(op) == &PyComplex_Type)
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyComplex_FromCComplex(Py_complex);
|
||||||
|
PyAPI_FUNC(PyObject *) PyComplex_FromDoubles(double real, double imag);
|
||||||
|
|
||||||
|
PyAPI_FUNC(double) PyComplex_RealAsDouble(PyObject *op);
|
||||||
|
PyAPI_FUNC(double) PyComplex_ImagAsDouble(PyObject *op);
|
||||||
|
PyAPI_FUNC(Py_complex) PyComplex_AsCComplex(PyObject *op);
|
||||||
|
|
||||||
|
/* Format the object based on the format_spec, as defined in PEP 3101
|
||||||
|
(Advanced String Formatting). */
|
||||||
|
PyAPI_FUNC(PyObject *) _PyComplex_FormatAdvanced(PyObject *obj,
|
||||||
|
char *format_spec,
|
||||||
|
Py_ssize_t format_spec_len);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_COMPLEXOBJECT_H */
|
||||||
239
python/include/datetime.h
Normal file
239
python/include/datetime.h
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
/* datetime.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DATETIME_H
|
||||||
|
#define DATETIME_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Fields are packed into successive bytes, each viewed as unsigned and
|
||||||
|
* big-endian, unless otherwise noted:
|
||||||
|
*
|
||||||
|
* byte offset
|
||||||
|
* 0 year 2 bytes, 1-9999
|
||||||
|
* 2 month 1 byte, 1-12
|
||||||
|
* 3 day 1 byte, 1-31
|
||||||
|
* 4 hour 1 byte, 0-23
|
||||||
|
* 5 minute 1 byte, 0-59
|
||||||
|
* 6 second 1 byte, 0-59
|
||||||
|
* 7 usecond 3 bytes, 0-999999
|
||||||
|
* 10
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* # of bytes for year, month, and day. */
|
||||||
|
#define _PyDateTime_DATE_DATASIZE 4
|
||||||
|
|
||||||
|
/* # of bytes for hour, minute, second, and usecond. */
|
||||||
|
#define _PyDateTime_TIME_DATASIZE 6
|
||||||
|
|
||||||
|
/* # of bytes for year, month, day, hour, minute, second, and usecond. */
|
||||||
|
#define _PyDateTime_DATETIME_DATASIZE 10
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
PyObject_HEAD
|
||||||
|
long hashcode; /* -1 when unknown */
|
||||||
|
int days; /* -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS */
|
||||||
|
int seconds; /* 0 <= seconds < 24*3600 is invariant */
|
||||||
|
int microseconds; /* 0 <= microseconds < 1000000 is invariant */
|
||||||
|
} PyDateTime_Delta;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
PyObject_HEAD /* a pure abstract base clase */
|
||||||
|
} PyDateTime_TZInfo;
|
||||||
|
|
||||||
|
|
||||||
|
/* The datetime and time types have hashcodes, and an optional tzinfo member,
|
||||||
|
* present if and only if hastzinfo is true.
|
||||||
|
*/
|
||||||
|
#define _PyTZINFO_HEAD \
|
||||||
|
PyObject_HEAD \
|
||||||
|
long hashcode; \
|
||||||
|
char hastzinfo; /* boolean flag */
|
||||||
|
|
||||||
|
/* No _PyDateTime_BaseTZInfo is allocated; it's just to have something
|
||||||
|
* convenient to cast to, when getting at the hastzinfo member of objects
|
||||||
|
* starting with _PyTZINFO_HEAD.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
_PyTZINFO_HEAD
|
||||||
|
} _PyDateTime_BaseTZInfo;
|
||||||
|
|
||||||
|
/* All time objects are of PyDateTime_TimeType, but that can be allocated
|
||||||
|
* in two ways, with or without a tzinfo member. Without is the same as
|
||||||
|
* tzinfo == None, but consumes less memory. _PyDateTime_BaseTime is an
|
||||||
|
* internal struct used to allocate the right amount of space for the
|
||||||
|
* "without" case.
|
||||||
|
*/
|
||||||
|
#define _PyDateTime_TIMEHEAD \
|
||||||
|
_PyTZINFO_HEAD \
|
||||||
|
unsigned char data[_PyDateTime_TIME_DATASIZE];
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
_PyDateTime_TIMEHEAD
|
||||||
|
} _PyDateTime_BaseTime; /* hastzinfo false */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
_PyDateTime_TIMEHEAD
|
||||||
|
PyObject *tzinfo;
|
||||||
|
} PyDateTime_Time; /* hastzinfo true */
|
||||||
|
|
||||||
|
|
||||||
|
/* All datetime objects are of PyDateTime_DateTimeType, but that can be
|
||||||
|
* allocated in two ways too, just like for time objects above. In addition,
|
||||||
|
* the plain date type is a base class for datetime, so it must also have
|
||||||
|
* a hastzinfo member (although it's unused there).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
_PyTZINFO_HEAD
|
||||||
|
unsigned char data[_PyDateTime_DATE_DATASIZE];
|
||||||
|
} PyDateTime_Date;
|
||||||
|
|
||||||
|
#define _PyDateTime_DATETIMEHEAD \
|
||||||
|
_PyTZINFO_HEAD \
|
||||||
|
unsigned char data[_PyDateTime_DATETIME_DATASIZE];
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
_PyDateTime_DATETIMEHEAD
|
||||||
|
} _PyDateTime_BaseDateTime; /* hastzinfo false */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
_PyDateTime_DATETIMEHEAD
|
||||||
|
PyObject *tzinfo;
|
||||||
|
} PyDateTime_DateTime; /* hastzinfo true */
|
||||||
|
|
||||||
|
|
||||||
|
/* Apply for date and datetime instances. */
|
||||||
|
#define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \
|
||||||
|
((PyDateTime_Date*)o)->data[1])
|
||||||
|
#define PyDateTime_GET_MONTH(o) (((PyDateTime_Date*)o)->data[2])
|
||||||
|
#define PyDateTime_GET_DAY(o) (((PyDateTime_Date*)o)->data[3])
|
||||||
|
|
||||||
|
#define PyDateTime_DATE_GET_HOUR(o) (((PyDateTime_DateTime*)o)->data[4])
|
||||||
|
#define PyDateTime_DATE_GET_MINUTE(o) (((PyDateTime_DateTime*)o)->data[5])
|
||||||
|
#define PyDateTime_DATE_GET_SECOND(o) (((PyDateTime_DateTime*)o)->data[6])
|
||||||
|
#define PyDateTime_DATE_GET_MICROSECOND(o) \
|
||||||
|
((((PyDateTime_DateTime*)o)->data[7] << 16) | \
|
||||||
|
(((PyDateTime_DateTime*)o)->data[8] << 8) | \
|
||||||
|
((PyDateTime_DateTime*)o)->data[9])
|
||||||
|
|
||||||
|
/* Apply for time instances. */
|
||||||
|
#define PyDateTime_TIME_GET_HOUR(o) (((PyDateTime_Time*)o)->data[0])
|
||||||
|
#define PyDateTime_TIME_GET_MINUTE(o) (((PyDateTime_Time*)o)->data[1])
|
||||||
|
#define PyDateTime_TIME_GET_SECOND(o) (((PyDateTime_Time*)o)->data[2])
|
||||||
|
#define PyDateTime_TIME_GET_MICROSECOND(o) \
|
||||||
|
((((PyDateTime_Time*)o)->data[3] << 16) | \
|
||||||
|
(((PyDateTime_Time*)o)->data[4] << 8) | \
|
||||||
|
((PyDateTime_Time*)o)->data[5])
|
||||||
|
|
||||||
|
|
||||||
|
/* Define structure for C API. */
|
||||||
|
typedef struct {
|
||||||
|
/* type objects */
|
||||||
|
PyTypeObject *DateType;
|
||||||
|
PyTypeObject *DateTimeType;
|
||||||
|
PyTypeObject *TimeType;
|
||||||
|
PyTypeObject *DeltaType;
|
||||||
|
PyTypeObject *TZInfoType;
|
||||||
|
|
||||||
|
/* constructors */
|
||||||
|
PyObject *(*Date_FromDate)(int, int, int, PyTypeObject*);
|
||||||
|
PyObject *(*DateTime_FromDateAndTime)(int, int, int, int, int, int, int,
|
||||||
|
PyObject*, PyTypeObject*);
|
||||||
|
PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*);
|
||||||
|
PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*);
|
||||||
|
|
||||||
|
/* constructors for the DB API */
|
||||||
|
PyObject *(*DateTime_FromTimestamp)(PyObject*, PyObject*, PyObject*);
|
||||||
|
PyObject *(*Date_FromTimestamp)(PyObject*, PyObject*);
|
||||||
|
|
||||||
|
} PyDateTime_CAPI;
|
||||||
|
|
||||||
|
#define PyDateTime_CAPSULE_NAME "datetime.datetime_CAPI"
|
||||||
|
|
||||||
|
|
||||||
|
/* "magic" constant used to partially protect against developer mistakes. */
|
||||||
|
#define DATETIME_API_MAGIC 0x414548d5
|
||||||
|
|
||||||
|
#ifdef Py_BUILD_CORE
|
||||||
|
|
||||||
|
/* Macros for type checking when building the Python core. */
|
||||||
|
#define PyDate_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateType)
|
||||||
|
#define PyDate_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateType)
|
||||||
|
|
||||||
|
#define PyDateTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_DateTimeType)
|
||||||
|
#define PyDateTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DateTimeType)
|
||||||
|
|
||||||
|
#define PyTime_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeType)
|
||||||
|
#define PyTime_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TimeType)
|
||||||
|
|
||||||
|
#define PyDelta_Check(op) PyObject_TypeCheck(op, &PyDateTime_DeltaType)
|
||||||
|
#define PyDelta_CheckExact(op) (Py_TYPE(op) == &PyDateTime_DeltaType)
|
||||||
|
|
||||||
|
#define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType)
|
||||||
|
#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Define global variable for the C API and a macro for setting it. */
|
||||||
|
static PyDateTime_CAPI *PyDateTimeAPI = NULL;
|
||||||
|
|
||||||
|
#define PyDateTime_IMPORT \
|
||||||
|
PyDateTimeAPI = (PyDateTime_CAPI *)PyCapsule_Import(PyDateTime_CAPSULE_NAME, 0)
|
||||||
|
|
||||||
|
/* Macros for type checking when not building the Python core. */
|
||||||
|
#define PyDate_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateType)
|
||||||
|
#define PyDate_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateType)
|
||||||
|
|
||||||
|
#define PyDateTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DateTimeType)
|
||||||
|
#define PyDateTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DateTimeType)
|
||||||
|
|
||||||
|
#define PyTime_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TimeType)
|
||||||
|
#define PyTime_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TimeType)
|
||||||
|
|
||||||
|
#define PyDelta_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->DeltaType)
|
||||||
|
#define PyDelta_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->DeltaType)
|
||||||
|
|
||||||
|
#define PyTZInfo_Check(op) PyObject_TypeCheck(op, PyDateTimeAPI->TZInfoType)
|
||||||
|
#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == PyDateTimeAPI->TZInfoType)
|
||||||
|
|
||||||
|
/* Macros for accessing constructors in a simplified fashion. */
|
||||||
|
#define PyDate_FromDate(year, month, day) \
|
||||||
|
PyDateTimeAPI->Date_FromDate(year, month, day, PyDateTimeAPI->DateType)
|
||||||
|
|
||||||
|
#define PyDateTime_FromDateAndTime(year, month, day, hour, min, sec, usec) \
|
||||||
|
PyDateTimeAPI->DateTime_FromDateAndTime(year, month, day, hour, \
|
||||||
|
min, sec, usec, Py_None, PyDateTimeAPI->DateTimeType)
|
||||||
|
|
||||||
|
#define PyTime_FromTime(hour, minute, second, usecond) \
|
||||||
|
PyDateTimeAPI->Time_FromTime(hour, minute, second, usecond, \
|
||||||
|
Py_None, PyDateTimeAPI->TimeType)
|
||||||
|
|
||||||
|
#define PyDelta_FromDSU(days, seconds, useconds) \
|
||||||
|
PyDateTimeAPI->Delta_FromDelta(days, seconds, useconds, 1, \
|
||||||
|
PyDateTimeAPI->DeltaType)
|
||||||
|
|
||||||
|
/* Macros supporting the DB API. */
|
||||||
|
#define PyDateTime_FromTimestamp(args) \
|
||||||
|
PyDateTimeAPI->DateTime_FromTimestamp( \
|
||||||
|
(PyObject*) (PyDateTimeAPI->DateTimeType), args, NULL)
|
||||||
|
|
||||||
|
#define PyDate_FromTimestamp(args) \
|
||||||
|
PyDateTimeAPI->Date_FromTimestamp( \
|
||||||
|
(PyObject*) (PyDateTimeAPI->DateType), args)
|
||||||
|
|
||||||
|
#endif /* Py_BUILD_CORE */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
94
python/include/descrobject.h
Normal file
94
python/include/descrobject.h
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
/* Descriptors */
|
||||||
|
#ifndef Py_DESCROBJECT_H
|
||||||
|
#define Py_DESCROBJECT_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef PyObject *(*getter)(PyObject *, void *);
|
||||||
|
typedef int (*setter)(PyObject *, PyObject *, void *);
|
||||||
|
|
||||||
|
typedef struct PyGetSetDef {
|
||||||
|
char *name;
|
||||||
|
getter get;
|
||||||
|
setter set;
|
||||||
|
char *doc;
|
||||||
|
void *closure;
|
||||||
|
} PyGetSetDef;
|
||||||
|
|
||||||
|
typedef PyObject *(*wrapperfunc)(PyObject *self, PyObject *args,
|
||||||
|
void *wrapped);
|
||||||
|
|
||||||
|
typedef PyObject *(*wrapperfunc_kwds)(PyObject *self, PyObject *args,
|
||||||
|
void *wrapped, PyObject *kwds);
|
||||||
|
|
||||||
|
struct wrapperbase {
|
||||||
|
char *name;
|
||||||
|
int offset;
|
||||||
|
void *function;
|
||||||
|
wrapperfunc wrapper;
|
||||||
|
char *doc;
|
||||||
|
int flags;
|
||||||
|
PyObject *name_strobj;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Flags for above struct */
|
||||||
|
#define PyWrapperFlag_KEYWORDS 1 /* wrapper function takes keyword args */
|
||||||
|
|
||||||
|
/* Various kinds of descriptor objects */
|
||||||
|
|
||||||
|
#define PyDescr_COMMON \
|
||||||
|
PyObject_HEAD \
|
||||||
|
PyTypeObject *d_type; \
|
||||||
|
PyObject *d_name
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyDescr_COMMON;
|
||||||
|
} PyDescrObject;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyDescr_COMMON;
|
||||||
|
PyMethodDef *d_method;
|
||||||
|
} PyMethodDescrObject;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyDescr_COMMON;
|
||||||
|
struct PyMemberDef *d_member;
|
||||||
|
} PyMemberDescrObject;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyDescr_COMMON;
|
||||||
|
PyGetSetDef *d_getset;
|
||||||
|
} PyGetSetDescrObject;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PyDescr_COMMON;
|
||||||
|
struct wrapperbase *d_base;
|
||||||
|
void *d_wrapped; /* This can be any function pointer */
|
||||||
|
} PyWrapperDescrObject;
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyWrapperDescr_Type;
|
||||||
|
PyAPI_DATA(PyTypeObject) PyDictProxy_Type;
|
||||||
|
PyAPI_DATA(PyTypeObject) PyGetSetDescr_Type;
|
||||||
|
PyAPI_DATA(PyTypeObject) PyMemberDescr_Type;
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyDescr_NewMethod(PyTypeObject *, PyMethodDef *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyDescr_NewClassMethod(PyTypeObject *, PyMethodDef *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyDescr_NewMember(PyTypeObject *,
|
||||||
|
struct PyMemberDef *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *,
|
||||||
|
struct PyGetSetDef *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *,
|
||||||
|
struct wrapperbase *, void *);
|
||||||
|
#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL)
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PyWrapper_New(PyObject *, PyObject *);
|
||||||
|
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyProperty_Type;
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_DESCROBJECT_H */
|
||||||
|
|
||||||
156
python/include/dictobject.h
Normal file
156
python/include/dictobject.h
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
#ifndef Py_DICTOBJECT_H
|
||||||
|
#define Py_DICTOBJECT_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Dictionary object type -- mapping from hashable object to object */
|
||||||
|
|
||||||
|
/* The distribution includes a separate file, Objects/dictnotes.txt,
|
||||||
|
describing explorations into dictionary design and optimization.
|
||||||
|
It covers typical dictionary use patterns, the parameters for
|
||||||
|
tuning dictionaries, and several ideas for possible optimizations.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
There are three kinds of slots in the table:
|
||||||
|
|
||||||
|
1. Unused. me_key == me_value == NULL
|
||||||
|
Does not hold an active (key, value) pair now and never did. Unused can
|
||||||
|
transition to Active upon key insertion. This is the only case in which
|
||||||
|
me_key is NULL, and is each slot's initial state.
|
||||||
|
|
||||||
|
2. Active. me_key != NULL and me_key != dummy and me_value != NULL
|
||||||
|
Holds an active (key, value) pair. Active can transition to Dummy upon
|
||||||
|
key deletion. This is the only case in which me_value != NULL.
|
||||||
|
|
||||||
|
3. Dummy. me_key == dummy and me_value == NULL
|
||||||
|
Previously held an active (key, value) pair, but that was deleted and an
|
||||||
|
active pair has not yet overwritten the slot. Dummy can transition to
|
||||||
|
Active upon key insertion. Dummy slots cannot be made Unused again
|
||||||
|
(cannot have me_key set to NULL), else the probe sequence in case of
|
||||||
|
collision would have no way to know they were once active.
|
||||||
|
|
||||||
|
Note: .popitem() abuses the me_hash field of an Unused or Dummy slot to
|
||||||
|
hold a search finger. The me_hash field of Unused or Dummy slots has no
|
||||||
|
meaning otherwise.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* PyDict_MINSIZE is the minimum size of a dictionary. This many slots are
|
||||||
|
* allocated directly in the dict object (in the ma_smalltable member).
|
||||||
|
* It must be a power of 2, and at least 4. 8 allows dicts with no more
|
||||||
|
* than 5 active entries to live in ma_smalltable (and so avoid an
|
||||||
|
* additional malloc); instrumentation suggested this suffices for the
|
||||||
|
* majority of dicts (consisting mostly of usually-small instance dicts and
|
||||||
|
* usually-small dicts created to pass keyword arguments).
|
||||||
|
*/
|
||||||
|
#define PyDict_MINSIZE 8
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/* Cached hash code of me_key. Note that hash codes are C longs.
|
||||||
|
* We have to use Py_ssize_t instead because dict_popitem() abuses
|
||||||
|
* me_hash to hold a search finger.
|
||||||
|
*/
|
||||||
|
Py_ssize_t me_hash;
|
||||||
|
PyObject *me_key;
|
||||||
|
PyObject *me_value;
|
||||||
|
} PyDictEntry;
|
||||||
|
|
||||||
|
/*
|
||||||
|
To ensure the lookup algorithm terminates, there must be at least one Unused
|
||||||
|
slot (NULL key) in the table.
|
||||||
|
The value ma_fill is the number of non-NULL keys (sum of Active and Dummy);
|
||||||
|
ma_used is the number of non-NULL, non-dummy keys (== the number of non-NULL
|
||||||
|
values == the number of Active items).
|
||||||
|
To avoid slowing down lookups on a near-full table, we resize the table when
|
||||||
|
it's two-thirds full.
|
||||||
|
*/
|
||||||
|
typedef struct _dictobject PyDictObject;
|
||||||
|
struct _dictobject {
|
||||||
|
PyObject_HEAD
|
||||||
|
Py_ssize_t ma_fill; /* # Active + # Dummy */
|
||||||
|
Py_ssize_t ma_used; /* # Active */
|
||||||
|
|
||||||
|
/* The table contains ma_mask + 1 slots, and that's a power of 2.
|
||||||
|
* We store the mask instead of the size because the mask is more
|
||||||
|
* frequently needed.
|
||||||
|
*/
|
||||||
|
Py_ssize_t ma_mask;
|
||||||
|
|
||||||
|
/* ma_table points to ma_smalltable for small tables, else to
|
||||||
|
* additional malloc'ed memory. ma_table is never NULL! This rule
|
||||||
|
* saves repeated runtime null-tests in the workhorse getitem and
|
||||||
|
* setitem calls.
|
||||||
|
*/
|
||||||
|
PyDictEntry *ma_table;
|
||||||
|
PyDictEntry *(*ma_lookup)(PyDictObject *mp, PyObject *key, long hash);
|
||||||
|
PyDictEntry ma_smalltable[PyDict_MINSIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyDict_Type;
|
||||||
|
PyAPI_DATA(PyTypeObject) PyDictIterKey_Type;
|
||||||
|
PyAPI_DATA(PyTypeObject) PyDictIterValue_Type;
|
||||||
|
PyAPI_DATA(PyTypeObject) PyDictIterItem_Type;
|
||||||
|
PyAPI_DATA(PyTypeObject) PyDictKeys_Type;
|
||||||
|
PyAPI_DATA(PyTypeObject) PyDictItems_Type;
|
||||||
|
PyAPI_DATA(PyTypeObject) PyDictValues_Type;
|
||||||
|
|
||||||
|
#define PyDict_Check(op) \
|
||||||
|
PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_DICT_SUBCLASS)
|
||||||
|
#define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)
|
||||||
|
#define PyDictKeys_Check(op) (Py_TYPE(op) == &PyDictKeys_Type)
|
||||||
|
#define PyDictItems_Check(op) (Py_TYPE(op) == &PyDictItems_Type)
|
||||||
|
#define PyDictValues_Check(op) (Py_TYPE(op) == &PyDictValues_Type)
|
||||||
|
/* This excludes Values, since they are not sets. */
|
||||||
|
# define PyDictViewSet_Check(op) \
|
||||||
|
(PyDictKeys_Check(op) || PyDictItems_Check(op))
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyDict_New(void);
|
||||||
|
PyAPI_FUNC(PyObject *) PyDict_GetItem(PyObject *mp, PyObject *key);
|
||||||
|
PyAPI_FUNC(int) PyDict_SetItem(PyObject *mp, PyObject *key, PyObject *item);
|
||||||
|
PyAPI_FUNC(int) PyDict_DelItem(PyObject *mp, PyObject *key);
|
||||||
|
PyAPI_FUNC(void) PyDict_Clear(PyObject *mp);
|
||||||
|
PyAPI_FUNC(int) PyDict_Next(
|
||||||
|
PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value);
|
||||||
|
PyAPI_FUNC(int) _PyDict_Next(
|
||||||
|
PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, long *hash);
|
||||||
|
PyAPI_FUNC(PyObject *) PyDict_Keys(PyObject *mp);
|
||||||
|
PyAPI_FUNC(PyObject *) PyDict_Values(PyObject *mp);
|
||||||
|
PyAPI_FUNC(PyObject *) PyDict_Items(PyObject *mp);
|
||||||
|
PyAPI_FUNC(Py_ssize_t) PyDict_Size(PyObject *mp);
|
||||||
|
PyAPI_FUNC(PyObject *) PyDict_Copy(PyObject *mp);
|
||||||
|
PyAPI_FUNC(int) PyDict_Contains(PyObject *mp, PyObject *key);
|
||||||
|
PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, long hash);
|
||||||
|
PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused);
|
||||||
|
PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp);
|
||||||
|
|
||||||
|
/* PyDict_Update(mp, other) is equivalent to PyDict_Merge(mp, other, 1). */
|
||||||
|
PyAPI_FUNC(int) PyDict_Update(PyObject *mp, PyObject *other);
|
||||||
|
|
||||||
|
/* PyDict_Merge updates/merges from a mapping object (an object that
|
||||||
|
supports PyMapping_Keys() and PyObject_GetItem()). If override is true,
|
||||||
|
the last occurrence of a key wins, else the first. The Python
|
||||||
|
dict.update(other) is equivalent to PyDict_Merge(dict, other, 1).
|
||||||
|
*/
|
||||||
|
PyAPI_FUNC(int) PyDict_Merge(PyObject *mp,
|
||||||
|
PyObject *other,
|
||||||
|
int override);
|
||||||
|
|
||||||
|
/* PyDict_MergeFromSeq2 updates/merges from an iterable object producing
|
||||||
|
iterable objects of length 2. If override is true, the last occurrence
|
||||||
|
of a key wins, else the first. The Python dict constructor dict(seq2)
|
||||||
|
is equivalent to dict={}; PyDict_MergeFromSeq(dict, seq2, 1).
|
||||||
|
*/
|
||||||
|
PyAPI_FUNC(int) PyDict_MergeFromSeq2(PyObject *d,
|
||||||
|
PyObject *seq2,
|
||||||
|
int override);
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyDict_GetItemString(PyObject *dp, const char *key);
|
||||||
|
PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item);
|
||||||
|
PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_DICTOBJECT_H */
|
||||||
15
python/include/dtoa.h
Normal file
15
python/include/dtoa.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef PY_NO_SHORT_FLOAT_REPR
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PyAPI_FUNC(double) _Py_dg_strtod(const char *str, char **ptr);
|
||||||
|
PyAPI_FUNC(char *) _Py_dg_dtoa(double d, int mode, int ndigits,
|
||||||
|
int *decpt, int *sign, char **rve);
|
||||||
|
PyAPI_FUNC(void) _Py_dg_freedtoa(char *s);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
17
python/include/enumobject.h
Normal file
17
python/include/enumobject.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#ifndef Py_ENUMOBJECT_H
|
||||||
|
#define Py_ENUMOBJECT_H
|
||||||
|
|
||||||
|
/* Enumerate Object */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PyAPI_DATA(PyTypeObject) PyEnum_Type;
|
||||||
|
PyAPI_DATA(PyTypeObject) PyReversed_Type;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !Py_ENUMOBJECT_H */
|
||||||
36
python/include/errcode.h
Normal file
36
python/include/errcode.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#ifndef Py_ERRCODE_H
|
||||||
|
#define Py_ERRCODE_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Error codes passed around between file input, tokenizer, parser and
|
||||||
|
interpreter. This is necessary so we can turn them into Python
|
||||||
|
exceptions at a higher level. Note that some errors have a
|
||||||
|
slightly different meaning when passed from the tokenizer to the
|
||||||
|
parser than when passed from the parser to the interpreter; e.g.
|
||||||
|
the parser only returns E_EOF when it hits EOF immediately, and it
|
||||||
|
never returns E_OK. */
|
||||||
|
|
||||||
|
#define E_OK 10 /* No error */
|
||||||
|
#define E_EOF 11 /* End Of File */
|
||||||
|
#define E_INTR 12 /* Interrupted */
|
||||||
|
#define E_TOKEN 13 /* Bad token */
|
||||||
|
#define E_SYNTAX 14 /* Syntax error */
|
||||||
|
#define E_NOMEM 15 /* Ran out of memory */
|
||||||
|
#define E_DONE 16 /* Parsing complete */
|
||||||
|
#define E_ERROR 17 /* Execution error */
|
||||||
|
#define E_TABSPACE 18 /* Inconsistent mixing of tabs and spaces */
|
||||||
|
#define E_OVERFLOW 19 /* Node had too many children */
|
||||||
|
#define E_TOODEEP 20 /* Too many indentation levels */
|
||||||
|
#define E_DEDENT 21 /* No matching outer block for dedent */
|
||||||
|
#define E_DECODE 22 /* Error in decoding into Unicode */
|
||||||
|
#define E_EOFS 23 /* EOF in triple-quoted string */
|
||||||
|
#define E_EOLS 24 /* EOL in single-quoted string */
|
||||||
|
#define E_LINECONT 25 /* Unexpected characters after a line continuation */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_ERRCODE_H */
|
||||||
25
python/include/eval.h
Normal file
25
python/include/eval.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
/* Interface to execute compiled code */
|
||||||
|
|
||||||
|
#ifndef Py_EVAL_H
|
||||||
|
#define Py_EVAL_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyEval_EvalCode(PyCodeObject *, PyObject *, PyObject *);
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyCodeObject *co,
|
||||||
|
PyObject *globals,
|
||||||
|
PyObject *locals,
|
||||||
|
PyObject **args, int argc,
|
||||||
|
PyObject **kwds, int kwdc,
|
||||||
|
PyObject **defs, int defc,
|
||||||
|
PyObject *closure);
|
||||||
|
|
||||||
|
PyAPI_FUNC(PyObject *) _PyEval_CallTracing(PyObject *func, PyObject *args);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* !Py_EVAL_H */
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user