mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-24 03:09:18 +02:00
re-enabled cargo mesh loading; minor brake fixes; increased use of glew and stl containers
This commit is contained in:
@@ -288,8 +288,10 @@ std::string TSpeedPos::GetName()
|
|||||||
{
|
{
|
||||||
if (iFlags & spTrack) // jeśli tor
|
if (iFlags & spTrack) // jeśli tor
|
||||||
return trTrack->NameGet();
|
return trTrack->NameGet();
|
||||||
else if (iFlags & spEvent) // jeśli event
|
else if( iFlags & spEvent ) // jeśli event
|
||||||
return evEvent->asName;
|
return evEvent->asName;
|
||||||
|
else
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string TSpeedPos::TableText()
|
std::string TSpeedPos::TableText()
|
||||||
@@ -297,7 +299,7 @@ std::string TSpeedPos::TableText()
|
|||||||
if (iFlags & spEnabled)
|
if (iFlags & spEnabled)
|
||||||
{ // o ile pozycja istotna
|
{ // o ile pozycja istotna
|
||||||
return "Flags=" + to_hex_str(iFlags, 6) + ", Dist=" + to_string(fDist, 1, 7) +
|
return "Flags=" + to_hex_str(iFlags, 6) + ", Dist=" + to_string(fDist, 1, 7) +
|
||||||
", Vel=" + std::to_string(fVelNext) + ", Name=" + GetName();
|
", Vel=" + to_string(fVelNext, 1, 5) + ", Name=" + GetName();
|
||||||
//if (iFlags & spTrack) // jeśli tor
|
//if (iFlags & spTrack) // jeśli tor
|
||||||
// return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1) +
|
// return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1) +
|
||||||
// ", Vel=" + AnsiString(fVelNext) + ", Track=" + trTrack->NameGet();
|
// ", Vel=" + AnsiString(fVelNext) + ", Track=" + trTrack->NameGet();
|
||||||
|
|||||||
245
DynObj.cpp
245
DynObj.cpp
@@ -541,9 +541,12 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist)
|
|||||||
for (int i = 0; i < iAnimations; ++i) // wykonanie kolejnych animacji
|
for (int i = 0; i < iAnimations; ++i) // wykonanie kolejnych animacji
|
||||||
if (ObjSqrDist < pAnimations[i].fMaxDist)
|
if (ObjSqrDist < pAnimations[i].fMaxDist)
|
||||||
if (pAnimations[i].yUpdate) // jeśli zdefiniowana funkcja
|
if (pAnimations[i].yUpdate) // jeśli zdefiniowana funkcja
|
||||||
|
pAnimations[ i ].yUpdate( &pAnimations[i] ); // aktualizacja animacji (położenia submodeli
|
||||||
|
/*
|
||||||
pAnimations[i].yUpdate(pAnimations +
|
pAnimations[i].yUpdate(pAnimations +
|
||||||
i); // aktualizacja animacji (położenia submodeli
|
i); // aktualizacja animacji (położenia submodeli
|
||||||
if (ObjSqrDist < 2500) // gdy bliżej niż 50m
|
*/
|
||||||
|
if( ObjSqrDist < 2500 ) // gdy bliżej niż 50m
|
||||||
{
|
{
|
||||||
// ABu290105: rzucanie pudlem
|
// ABu290105: rzucanie pudlem
|
||||||
// te animacje wymagają bananów w modelach!
|
// te animacje wymagają bananów w modelach!
|
||||||
@@ -1616,7 +1619,9 @@ TDynamicObject::TDynamicObject()
|
|||||||
iAnimType[ANIM_PANTS] = 0; // 5-pantografy (2)
|
iAnimType[ANIM_PANTS] = 0; // 5-pantografy (2)
|
||||||
iAnimType[ANIM_STEAMS] = 0; // 6-tłoki (napęd parowozu)
|
iAnimType[ANIM_STEAMS] = 0; // 6-tłoki (napęd parowozu)
|
||||||
iAnimations = 0; // na razie nie ma żadnego
|
iAnimations = 0; // na razie nie ma żadnego
|
||||||
|
/*
|
||||||
pAnimations = NULL;
|
pAnimations = NULL;
|
||||||
|
*/
|
||||||
pAnimated = NULL;
|
pAnimated = NULL;
|
||||||
fShade = 0.0; // standardowe oświetlenie na starcie
|
fShade = 0.0; // standardowe oświetlenie na starcie
|
||||||
iHornWarning = 1; // numer syreny do użycia po otrzymaniu sygnału do jazdy
|
iHornWarning = 1; // numer syreny do użycia po otrzymaniu sygnału do jazdy
|
||||||
@@ -1657,7 +1662,9 @@ TDynamicObject::~TDynamicObject()
|
|||||||
rsDiesielInc.Stop();
|
rsDiesielInc.Stop();
|
||||||
rscurve.Stop();
|
rscurve.Stop();
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
delete[] pAnimations; // obiekty obsługujące animację
|
delete[] pAnimations; // obiekty obsługujące animację
|
||||||
|
*/
|
||||||
delete[] pAnimated; // lista animowanych submodeli
|
delete[] pAnimated; // lista animowanych submodeli
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4234,7 +4241,10 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
// asBaseDir=BaseDir;
|
// asBaseDir=BaseDir;
|
||||||
Global::asCurrentDynamicPath = BaseDir;
|
Global::asCurrentDynamicPath = BaseDir;
|
||||||
std::string asFileName = BaseDir + TypeName + ".mmd";
|
std::string asFileName = BaseDir + TypeName + ".mmd";
|
||||||
std::string asLoadName = BaseDir + MoverParameters->LoadType + ".t3d";
|
std::string asLoadName;
|
||||||
|
if( false == MoverParameters->LoadType.empty() ) {
|
||||||
|
asLoadName = BaseDir + MoverParameters->LoadType + ".t3d";
|
||||||
|
}
|
||||||
|
|
||||||
std::string asAnimName;
|
std::string asAnimName;
|
||||||
bool Stop_InternalData = false;
|
bool Stop_InternalData = false;
|
||||||
@@ -4374,7 +4384,6 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
||||||
ReplacableSkinID[1] = TTexturesManager::GetTextureID(
|
ReplacableSkinID[1] = TTexturesManager::GetTextureID(
|
||||||
NULL, NULL, ReplacableSkin, Global::iDynamicFiltering);
|
NULL, NULL, ReplacableSkin, Global::iDynamicFiltering);
|
||||||
if (TTexturesManager::GetAlpha(ReplacableSkinID[1]))
|
if (TTexturesManager::GetAlpha(ReplacableSkinID[1]))
|
||||||
@@ -4411,8 +4420,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
// if (MoverParameters->LoadAccepted!=AnsiString("")); // &&
|
// if (MoverParameters->LoadAccepted!=AnsiString("")); // &&
|
||||||
// MoverParameters->LoadType!=AnsiString("passengers"))
|
// MoverParameters->LoadType!=AnsiString("passengers"))
|
||||||
if (MoverParameters->EnginePowerSource.SourceType == CurrentCollector)
|
if (MoverParameters->EnginePowerSource.SourceType == CurrentCollector)
|
||||||
{ // wartość niby "pantstate" - nazwa dla
|
{ // wartość niby "pantstate" - nazwa dla formalności, ważna jest ilość
|
||||||
// formalności, ważna jest ilość
|
|
||||||
if (MoverParameters->Load == 1)
|
if (MoverParameters->Load == 1)
|
||||||
MoverParameters->PantFront(true);
|
MoverParameters->PantFront(true);
|
||||||
else if (MoverParameters->Load == 2)
|
else if (MoverParameters->Load == 2)
|
||||||
@@ -4442,29 +4450,32 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // Ra: tu wczytywanie modelu ładunku jest w porządku
|
else // Ra: tu wczytywanie modelu ładunku jest w porządku
|
||||||
mdLoad = TModelsManager::GetModel(asLoadName, true); // ladunek
|
{
|
||||||
|
if( false == asLoadName.empty() ) {
|
||||||
|
mdLoad = TModelsManager::GetModel( asLoadName, true ); // ladunek
|
||||||
|
}
|
||||||
|
}
|
||||||
Global::asCurrentTexturePath = szTexturePath; // z powrotem defaultowa sciezka do tekstur
|
Global::asCurrentTexturePath = szTexturePath; // z powrotem defaultowa sciezka do tekstur
|
||||||
do {
|
do {
|
||||||
token = "";
|
token = "";
|
||||||
parser.getTokens(); parser >> token;
|
parser.getTokens(); parser >> token;
|
||||||
|
|
||||||
if( token == "animations:" ) {
|
if( token == "animations:" ) {
|
||||||
// Ra: ustawienie ilości poszczególnych animacji -
|
// Ra: ustawienie ilości poszczególnych animacji - musi być jako pierwsze, inaczej ilości będą domyślne
|
||||||
// musi być jako pierwsze, inaczej ilości będą domyślne
|
/*
|
||||||
if( nullptr == pAnimations )
|
if( nullptr == pAnimations )
|
||||||
{ // jeśli nie ma jeszcze tabeli animacji, można
|
*/
|
||||||
// odczytać nowe ilości
|
if( true == pAnimations.empty() )
|
||||||
|
{ // jeśli nie ma jeszcze tabeli animacji, można odczytać nowe ilości
|
||||||
int co = 0, ile = -1;
|
int co = 0, ile = -1;
|
||||||
iAnimations = 0;
|
iAnimations = 0;
|
||||||
do
|
do
|
||||||
{ // kolejne liczby to ilość animacj, -1 to znacznik końca
|
{ // kolejne liczby to ilość animacj, -1 to znacznik końca
|
||||||
parser.getTokens( 1, false );
|
parser.getTokens( 1, false );
|
||||||
parser >> ile; // ilość danego typu
|
parser >> ile; // 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
|
// if (!DebugModeFlag) //w debugmode pantografy mają "niby działać"
|
||||||
// działać"
|
|
||||||
// ile=0; //wyłączenie animacji pantografów
|
// ile=0; //wyłączenie animacji pantografów
|
||||||
if (co < ANIM_TYPES)
|
if (co < ANIM_TYPES)
|
||||||
if (ile >= 0)
|
if (ile >= 0)
|
||||||
@@ -4478,14 +4489,15 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
while( co < ANIM_TYPES ) {
|
while( co < ANIM_TYPES ) {
|
||||||
iAnimType[ co++ ] = 0; // zerowanie pozostałych
|
iAnimType[ co++ ] = 0; // zerowanie pozostałych
|
||||||
}
|
}
|
||||||
|
|
||||||
parser.getTokens(); parser >> token; // NOTE: should this be here? seems at best superfluous
|
parser.getTokens(); parser >> token; // NOTE: should this be here? seems at best superfluous
|
||||||
}
|
}
|
||||||
// WriteLog("Total animations: "+AnsiString(iAnimations));
|
// WriteLog("Total animations: "+AnsiString(iAnimations));
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
if( nullptr == pAnimations )
|
if( nullptr == pAnimations )
|
||||||
{ // Ra: tworzenie tabeli animacji, jeśli jeszcze nie
|
*/
|
||||||
// było
|
if( true == pAnimations.empty() )
|
||||||
|
{ // Ra: tworzenie tabeli animacji, jeśli jeszcze nie było
|
||||||
if (!iAnimations) // jeśli nie podano jawnie, ile ma być animacji
|
if (!iAnimations) // jeśli nie podano jawnie, ile ma być animacji
|
||||||
iAnimations = 28; // tyle było kiedyś w każdym pojeździe (2 wiązary wypadły)
|
iAnimations = 28; // tyle było kiedyś w każdym pojeździe (2 wiązary wypadły)
|
||||||
/* //pojazd może mieć pantograf do innych celów niż napęd
|
/* //pojazd może mieć pantograf do innych celów niż napęd
|
||||||
@@ -4495,29 +4507,29 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
iAnimType[ANIM_PANTS]=0;
|
iAnimType[ANIM_PANTS]=0;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
pAnimations = new TAnim[iAnimations];
|
pAnimations = new TAnim[iAnimations];
|
||||||
|
*/
|
||||||
|
pAnimations.resize( iAnimations );
|
||||||
int i, j, k = 0, sm = 0;
|
int i, j, k = 0, sm = 0;
|
||||||
for (j = 0; j < ANIM_TYPES; ++j)
|
for (j = 0; j < ANIM_TYPES; ++j)
|
||||||
for (i = 0; i < iAnimType[j]; ++i)
|
for (i = 0; i < iAnimType[j]; ++i)
|
||||||
{
|
{
|
||||||
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[k]; // zapamiętanie na potrzeby wyszukania submodeli
|
||||||
pants = pAnimations +
|
/*
|
||||||
k; // zapamiętanie na potrzeby wyszukania submodeli
|
pants = pAnimations + 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
|
||||||
sm += pAnimations[k++].TypeSet(j); // ustawienie typu animacji i
|
sm += pAnimations[k++].TypeSet(j); // ustawienie typu animacji i zliczanie tablicowanych submodeli
|
||||||
// zliczanie tablicowanych
|
|
||||||
// submodeli
|
|
||||||
}
|
}
|
||||||
if (sm) // o ile są bardziej złożone animacje
|
if (sm) // o ile są bardziej złożone animacje
|
||||||
{
|
{
|
||||||
pAnimated = new TSubModel *[sm]; // tabela na animowane submodele
|
pAnimated = new TSubModel *[sm]; // tabela na animowane submodele
|
||||||
for (k = 0; k < iAnimations; ++k)
|
for (k = 0; k < iAnimations; ++k)
|
||||||
pAnimations[k].smElement =
|
pAnimations[k].smElement = pAnimated + pAnimations[k].iShift; // przydzielenie wskaźnika do tabelki
|
||||||
pAnimated +
|
|
||||||
pAnimations[k].iShift; // przydzielenie wskaźnika do tabelki
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4528,9 +4540,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
asModel = BaseDir + asModel; // McZapkie-200702 - dynamics maja swoje modele w dynamic/basedir
|
asModel = BaseDir + asModel; // McZapkie-200702 - dynamics maja swoje modele w dynamic/basedir
|
||||||
Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/...
|
Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/...
|
||||||
mdLowPolyInt = TModelsManager::GetModel(asModel, true);
|
mdLowPolyInt = TModelsManager::GetModel(asModel, true);
|
||||||
// Global::asCurrentTexturePath=AnsiString(szTexturePath); //kiedyś
|
// Global::asCurrentTexturePath=AnsiString(szTexturePath); //kiedyś uproszczone wnętrze mieszało tekstury nieba
|
||||||
// uproszczone
|
|
||||||
// wnętrze mieszało tekstury nieba
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( token == "brakemode:" ) {
|
if( token == "brakemode:" ) {
|
||||||
@@ -4556,44 +4566,30 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // liczba osi
|
for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // liczba osi
|
||||||
{ // McZapkie-050402: wyszukiwanie kol o nazwie str*
|
{ // McZapkie-050402: wyszukiwanie kol o nazwie str*
|
||||||
asAnimName = token + std::to_string(i + 1);
|
asAnimName = token + std::to_string(i + 1);
|
||||||
pAnimations[i].smAnimated =
|
pAnimations[i].smAnimated = mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu
|
||||||
mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu
|
|
||||||
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 ].yUpdate = std::bind( &TDynamicObject::UpdateAxle, this, std::placeholders::_1 );
|
*/ pAnimations[ i ].yUpdate = std::bind( &TDynamicObject::UpdateAxle, this, std::placeholders::_1 );
|
||||||
pAnimations[i].fMaxDist =
|
pAnimations[i].fMaxDist = 50 * MoverParameters->WheelDiameter; // nie kręcić w większej odległości
|
||||||
50 *
|
pAnimations[i].fMaxDist *= pAnimations[i].fMaxDist * MoverParameters->WheelDiameter; // 50m do kwadratu, a średnica do trzeciej
|
||||||
MoverParameters->WheelDiameter; // nie kręcić w większej odległości
|
pAnimations[i].fMaxDist *= Global::fDistanceFactor; // współczynnik przeliczeniowy jakości ekranu
|
||||||
pAnimations[i].fMaxDist *=
|
|
||||||
pAnimations[i].fMaxDist *
|
|
||||||
MoverParameters->WheelDiameter; // 50m do kwadratu, a średnica
|
|
||||||
// do trzeciej
|
|
||||||
pAnimations[i].fMaxDist *= Global::fDistanceFactor; // współczynnik
|
|
||||||
// przeliczeniowy
|
|
||||||
// jakości ekranu
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Ra: ustawianie indeksów osi
|
// Ra: ustawianie indeksów osi
|
||||||
for (i = 0; i < iAnimType[ANIM_WHEELS];
|
for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // ilość osi (zabezpieczenie przed błędami w CHK)
|
||||||
++i) // ilość osi (zabezpieczenie przed błędami w CHK)
|
pAnimations[i].dWheelAngle = dWheelAngle + 1; // domyślnie wskaźnik na napędzające
|
||||||
pAnimations[i].dWheelAngle =
|
|
||||||
dWheelAngle + 1; // domyślnie wskaźnik na napędzające
|
|
||||||
i = 0;
|
i = 0;
|
||||||
j = 1;
|
j = 1;
|
||||||
k = 0;
|
k = 0;
|
||||||
m = 0; // numer osi; kolejny znak; ile osi danego typu; która średnica
|
m = 0; // numer osi; kolejny znak; ile osi danego typu; która średnica
|
||||||
if ((MoverParameters->WheelDiameterL != MoverParameters->WheelDiameter) ||
|
if ((MoverParameters->WheelDiameterL != MoverParameters->WheelDiameter) ||
|
||||||
(MoverParameters->WheelDiameterT != MoverParameters->WheelDiameter))
|
(MoverParameters->WheelDiameterT != MoverParameters->WheelDiameter))
|
||||||
{ // obsługa różnych średnic, o
|
{ // obsługa różnych średnic, o ile występują
|
||||||
// ile występują
|
|
||||||
while ((i < iAnimType[ANIM_WHEELS]) &&
|
while ((i < iAnimType[ANIM_WHEELS]) &&
|
||||||
(j <= MoverParameters->AxleArangement.length()))
|
(j <= MoverParameters->AxleArangement.length()))
|
||||||
{ // wersja ze wskaźnikami jest
|
{ // wersja ze wskaźnikami jest bardziej elastyczna na nietypowe układy
|
||||||
// bardziej elastyczna na nietypowe
|
|
||||||
// układy
|
|
||||||
if ((k >= 'A') && (k <= 'J')) // 10 chyba maksimum?
|
if ((k >= 'A') && (k <= 'J')) // 10 chyba maksimum?
|
||||||
{
|
{
|
||||||
pAnimations[i++].dWheelAngle = dWheelAngle + 1; // obrót osi napędzających
|
pAnimations[i++].dWheelAngle = dWheelAngle + 1; // obrót osi napędzających
|
||||||
@@ -4622,9 +4618,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
else if( token == "animpantprefix:" ) {
|
else if( token == "animpantprefix:" ) {
|
||||||
// Ra: pantografy po
|
// Ra: pantografy po nowemu mają literki i numerki
|
||||||
// nowemu mają literki
|
|
||||||
// i numerki
|
|
||||||
}
|
}
|
||||||
// Pantografy - Winger 160204
|
// Pantografy - Winger 160204
|
||||||
if( token == "animpantrd1prefix:" ) {
|
if( token == "animpantrd1prefix:" ) {
|
||||||
@@ -4634,8 +4628,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
TSubModel *sm;
|
TSubModel *sm;
|
||||||
if (pants)
|
if (pants)
|
||||||
for (int i = 0; i < iAnimType[ANIM_PANTS]; i++)
|
for (int i = 0; i < iAnimType[ANIM_PANTS]; i++)
|
||||||
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie
|
{ // Winger 160204: wyszukiwanie max 2 patykow o nazwie str*
|
||||||
// str*
|
|
||||||
asAnimName = token + std::to_string(i + 1);
|
asAnimName = token + std::to_string(i + 1);
|
||||||
sm = mdModel->GetFromName(asAnimName.c_str());
|
sm = mdModel->GetFromName(asAnimName.c_str());
|
||||||
pants[i].smElement[0] = sm; // jak NULL, to nie będzie animowany
|
pants[i].smElement[0] = sm; // jak NULL, to nie będzie animowany
|
||||||
@@ -4643,96 +4636,61 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
{ // w EP09 wywalało się tu z powodu NULL
|
{ // w EP09 wywalało się tu z powodu NULL
|
||||||
sm->WillBeAnimated();
|
sm->WillBeAnimated();
|
||||||
sm->ParentMatrix(&m); // pobranie macierzy transformacji
|
sm->ParentMatrix(&m); // pobranie macierzy transformacji
|
||||||
// m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie
|
// m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie tak)
|
||||||
// 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,
|
m.InitialRotate(); // może być potrzebny dodatkowy obrót, jeśli wczytano z T3D, tzn. przed wykonaniem Init()
|
||||||
// jeśli
|
|
||||||
// wczytano z T3D, tzn. przed wykonaniem
|
|
||||||
// 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ść
|
{ // jeśli ma potomny, można policzyć długość (odległość potomnego od osi obrotu)
|
||||||
// (odległość potomnego
|
m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, nie trzeba kopiować
|
||||||
// od osi obrotu)
|
// może trzeba: pobrać macierz dolnego ramienia, wyzerować przesunięcie, przemnożyć przez macierz górnego
|
||||||
m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, nie
|
|
||||||
// trzeba kopiować
|
|
||||||
// może trzeba: pobrać macierz dolnego ramienia, wyzerować
|
|
||||||
// przesunięcie, przemnożyć przez macierz górnego
|
|
||||||
pants[i].fParamPants->fHoriz = -fabs(m[3][1]);
|
pants[i].fParamPants->fHoriz = -fabs(m[3][1]);
|
||||||
pants[i].fParamPants->fLenL1 =
|
pants[i].fParamPants->fLenL1 =
|
||||||
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->fAngleL0 =
|
pants[i].fParamPants->fAngleL0 =
|
||||||
atan2(fabs(m[3][2]), fabs(m[3][1]));
|
atan2(fabs(m[3][2]), fabs(m[3][1]));
|
||||||
// if (pants[i].fParamPants->fAngleL0<M_PI_2)
|
// if (pants[i].fParamPants->fAngleL0<M_PI_2)
|
||||||
// pants[i].fParamPants->fAngleL0+=M_PI; //gdyby w odwrotną
|
// pants[i].fParamPants->fAngleL0+=M_PI; //gdyby w odwrotną stronę wyszło
|
||||||
// stronę wyszło
|
|
||||||
// if
|
// if
|
||||||
// ((pants[i].fParamPants->fAngleL0<0.03)||(pants[i].fParamPants->fAngleL0>0.09))
|
// ((pants[i].fParamPants->fAngleL0<0.03)||(pants[i].fParamPants->fAngleL0>0.09))
|
||||||
// //normalnie ok. 0.05
|
// //normalnie ok. 0.05
|
||||||
// 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
|
{ // jeśli dalej jest ślizg, można policzyć długość górnego ramienia
|
||||||
// ślizg, można policzyć
|
|
||||||
// długość górnego
|
|
||||||
// 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 uzyskać kąt do poziomu...
|
||||||
// trzeba by uwzględnić macierz dolnego ramienia, żeby
|
pants[i].fParamPants->fHoriz += fabs(m(3)[1]); // różnica długości rzutów ramion na
|
||||||
// uzyskać kąt do poziomu...
|
// płaszczyznę podstawy (jedna dodatnia, druga ujemna)
|
||||||
pants[i].fParamPants->fHoriz +=
|
pants[i].fParamPants->fLenU1 = hypot( m[3][1], m[3][2] ); // po osi OX nie potrzeba
|
||||||
fabs(m(3)[1]); // różnica długości rzutów ramion na
|
// pants[i].fParamPants->pantu=acos((1.22*cos(pants[i].fParamPants->fAngleL)+0.535)/1.755); //górne ramię
|
||||||
// płaszczyznę podstawy (jedna dodatnia,
|
// pants[i].fParamPants->fAngleU0=acos((1.176289*cos(pants[i].fParamPants->fAngleL)+0.54555075)/1.724482197); //górne ramię
|
||||||
// druga ujemna)
|
pants[i].fParamPants->fAngleU0 = atan2( fabs(m[3][2]), fabs(m[3][1]) ); // początkowy kąt górnego ramienia, odczytany z modelu
|
||||||
pants[i].fParamPants->fLenU1 =
|
|
||||||
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);
|
|
||||||
// //górne ramię
|
|
||||||
// pants[i].fParamPants->fAngleU0=acos((1.176289*cos(pants[i].fParamPants->fAngleL)+0.54555075)/1.724482197);
|
|
||||||
// //górne ramię
|
|
||||||
pants[i].fParamPants->fAngleU0 =
|
|
||||||
atan2(fabs(m[3][2]),
|
|
||||||
fabs(m[3][1])); // początkowy kąt górnego
|
|
||||||
// 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
|
|
||||||
// if (pants[i].fParamPants->fAngleU0<0)
|
// if (pants[i].fParamPants->fAngleU0<0)
|
||||||
// pants[i].fParamPants->fAngleU0=-pants[i].fParamPants->fAngleU0;
|
// pants[i].fParamPants->fAngleU0=-pants[i].fParamPants->fAngleU0;
|
||||||
// if
|
// if
|
||||||
// ((pants[i].fParamPants->fAngleU0<0.00)||(pants[i].fParamPants->fAngleU0>0.09))
|
// ((pants[i].fParamPants->fAngleU0<0.00)||(pants[i].fParamPants->fAngleU0>0.09)) //normalnie ok. 0.07
|
||||||
// //normalnie ok. 0.07
|
|
||||||
// pants[i].fParamPants->fAngleU0=acos((pants[i].fParamPants->fLenL1*cos(pants[i].fParamPants->fAngleL)+pants[i].fParamPants->fHoriz)/pants[i].fParamPants->fLenU1);
|
// pants[i].fParamPants->fAngleU0=acos((pants[i].fParamPants->fLenL1*cos(pants[i].fParamPants->fAngleL)+pants[i].fParamPants->fHoriz)/pants[i].fParamPants->fLenU1);
|
||||||
pants[i].fParamPants->fAngleU =
|
pants[i].fParamPants->fAngleU = pants[i].fParamPants->fAngleU0; // początkowy kąt
|
||||||
pants[i].fParamPants->fAngleU0; // początkowy kąt
|
// Ra: ze względu na to, że niektóre modele pantografów są zrąbane, ich mierzenie ma obecnie ograniczony sens
|
||||||
// Ra: ze względu na to, że niektóre modele pantografów są
|
sm->ParentMatrix(&m); // pobranie macierzy transformacji pivota ślizgu względem wstawienia pojazdu
|
||||||
// zrąbane, ich mierzenie ma obecnie ograniczony sens
|
if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z T3D
|
||||||
sm->ParentMatrix(&m); // pobranie macierzy transformacji
|
m.InitialRotate(); // może być potrzebny dodatkowy obrót, jeśli wczytano z T3D, tzn. przed wykonaniem Init()
|
||||||
// pivota ślizgu względem wstawienia
|
|
||||||
// pojazdu
|
|
||||||
if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z
|
|
||||||
// T3D
|
|
||||||
m.InitialRotate(); // może być potrzebny dodatkowy
|
|
||||||
// obrót, jeśli wczytano z T3D, tzn.
|
|
||||||
// przed wykonaniem Init()
|
|
||||||
float det = Det(m);
|
float det = Det(m);
|
||||||
if (std::fabs(det - 1.0) < 0.001) // dopuszczamy 1 promil błędu
|
if (std::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+",
|
||||||
@@ -4761,17 +4719,16 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
float4x4 m; // macierz do wyliczenia pozycji i wektora ruchu pantografu
|
float4x4 m; // macierz do wyliczenia pozycji i wektora ruchu pantografu
|
||||||
TSubModel *sm;
|
TSubModel *sm;
|
||||||
if( pants ) {
|
if( pants ) {
|
||||||
for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie
|
for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) {
|
||||||
// str*
|
// Winger 160204: wyszukiwanie max 2 patykow o nazwie str*
|
||||||
asAnimName = token + std::to_string( i + 1 );
|
asAnimName = token + std::to_string( i + 1 );
|
||||||
sm = mdModel->GetFromName( asAnimName.c_str() );
|
sm = mdModel->GetFromName( asAnimName.c_str() );
|
||||||
pants[ i ].smElement[ 1 ] = sm; // jak NULL, to nie będzie animowany
|
pants[ i ].smElement[ 1 ] = sm; // jak NULL, to nie będzie animowany
|
||||||
if( sm ) { // w EP09 wywalało się tu z powodu NULL
|
if( sm ) { // w EP09 wywalało się tu z powodu NULL
|
||||||
sm->WillBeAnimated();
|
sm->WillBeAnimated();
|
||||||
if( pants[ i ].fParamPants->vPos.y == 0.0 ) { // jeśli pierwsze ramię nie ustawiło tej wartości,
|
if( pants[ i ].fParamPants->vPos.y == 0.0 ) {
|
||||||
// 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 ] =
|
||||||
@@ -4781,10 +4738,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
m = *sm->Parent->GetMatrix() * m;
|
m = *sm->Parent->GetMatrix() * m;
|
||||||
sm = sm->Parent;
|
sm = sm->Parent;
|
||||||
}
|
}
|
||||||
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 = m[3][1]; // przesunięcie w górę odczytane z modelu
|
||||||
pants[ i ].fParamPants->vPos.y =
|
|
||||||
m[3][1]; // przesunięcie w górę odczytane z modelu
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -4798,8 +4753,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
// prefiks ramion górnych 1
|
// prefiks ramion górnych 1
|
||||||
parser.getTokens(); parser >> token;
|
parser.getTokens(); parser >> token;
|
||||||
if( pants ) {
|
if( pants ) {
|
||||||
for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie
|
for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) {
|
||||||
// str*
|
// Winger 160204: wyszukiwanie max 2 patykow o nazwie str*
|
||||||
asAnimName = token + std::to_string( i + 1 );
|
asAnimName = token + std::to_string( i + 1 );
|
||||||
pants[ i ].smElement[ 2 ] = mdModel->GetFromName( asAnimName.c_str() );
|
pants[ i ].smElement[ 2 ] = mdModel->GetFromName( asAnimName.c_str() );
|
||||||
pants[ i ].smElement[ 2 ]->WillBeAnimated();
|
pants[ i ].smElement[ 2 ]->WillBeAnimated();
|
||||||
@@ -4811,8 +4766,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
// prefiks ramion górnych 2
|
// prefiks ramion górnych 2
|
||||||
parser.getTokens(); parser >> token;
|
parser.getTokens(); parser >> token;
|
||||||
if( pants ) {
|
if( pants ) {
|
||||||
for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie
|
for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) {
|
||||||
// str*
|
// Winger 160204: wyszukiwanie max 2 patykow o nazwie str*
|
||||||
asAnimName = token + std::to_string( i + 1 );
|
asAnimName = token + std::to_string( i + 1 );
|
||||||
pants[ i ].smElement[ 3 ] = mdModel->GetFromName( asAnimName.c_str() );
|
pants[ i ].smElement[ 3 ] = mdModel->GetFromName( asAnimName.c_str() );
|
||||||
pants[ i ].smElement[ 3 ]->WillBeAnimated();
|
pants[ i ].smElement[ 3 ]->WillBeAnimated();
|
||||||
@@ -4824,8 +4779,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
// prefiks ślizgaczy
|
// prefiks ślizgaczy
|
||||||
parser.getTokens(); parser >> token;
|
parser.getTokens(); parser >> token;
|
||||||
if( pants ) {
|
if( pants ) {
|
||||||
for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie
|
for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) {
|
||||||
// str*
|
// Winger 160204: wyszukiwanie max 2 patykow o nazwie str*
|
||||||
asAnimName = token + std::to_string( i + 1 );
|
asAnimName = token + std::to_string( i + 1 );
|
||||||
pants[ i ].smElement[ 4 ] = mdModel->GetFromName( asAnimName.c_str() );
|
pants[ i ].smElement[ 4 ] = mdModel->GetFromName( asAnimName.c_str() );
|
||||||
pants[ i ].smElement[ 4 ]->WillBeAnimated();
|
pants[ i ].smElement[ 4 ]->WillBeAnimated();
|
||||||
@@ -4866,12 +4821,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
// //wysokość początkowa
|
// //wysokość początkowa
|
||||||
// pants[i].fParamPants->PantWys=1.176289*sin(pants[i].fParamPants->fAngleL)+1.724482197*sin(pants[i].fParamPants->fAngleU);
|
// pants[i].fParamPants->PantWys=1.176289*sin(pants[i].fParamPants->fAngleL)+1.724482197*sin(pants[i].fParamPants->fAngleU);
|
||||||
// //wysokość początkowa
|
// //wysokość początkowa
|
||||||
if( pants[ i ].fParamPants->fHeight == 0.0 ) // gdy jest
|
if( pants[ i ].fParamPants->fHeight == 0.0 ) // gdy jest nieprawdopodobna wartość (np. nie znaleziony ślizg)
|
||||||
// nieprawdopodobna
|
{ // gdy pomiary modelu nie udały się, odczyt podanych parametrów z MMD
|
||||||
// wartość (np. nie
|
|
||||||
// znaleziony ślizg)
|
|
||||||
{ // gdy pomiary modelu nie udały się, odczyt podanych parametrów
|
|
||||||
// z MMD
|
|
||||||
pants[ i ].fParamPants->vPos.x = ( i & 1 ) ? pant2x : pant1x;
|
pants[ i ].fParamPants->vPos.x = ( i & 1 ) ? pant2x : pant1x;
|
||||||
pants[ i ].fParamPants->fHeight =
|
pants[ i ].fParamPants->fHeight =
|
||||||
( i & 1 ) ? pant2h :
|
( i & 1 ) ? pant2h :
|
||||||
@@ -4963,8 +4914,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
parser.getTokens(); parser >> token;
|
parser.getTokens(); parser >> token;
|
||||||
asAnimName = "";
|
asAnimName = "";
|
||||||
for (int i = 1; i <= 4; i++)
|
for (int i = 1; i <= 4; i++)
|
||||||
{ // McZapkie-050402: wyszukiwanie max 4
|
{ // McZapkie-050402: wyszukiwanie max 4 wahaczy o nazwie str*
|
||||||
// wahaczy o nazwie str*
|
|
||||||
asAnimName = token + std::to_string(i);
|
asAnimName = token + std::to_string(i);
|
||||||
smWahacze[i - 1] = mdModel->GetFromName(asAnimName.c_str());
|
smWahacze[i - 1] = mdModel->GetFromName(asAnimName.c_str());
|
||||||
smWahacze[i - 1]->WillBeAnimated();
|
smWahacze[i - 1]->WillBeAnimated();
|
||||||
@@ -5006,13 +4956,9 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu
|
mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu
|
||||||
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 transformu
|
||||||
// optymalizacji
|
|
||||||
// transformu
|
|
||||||
switch (MoverParameters->DoorOpenMethod)
|
switch (MoverParameters->DoorOpenMethod)
|
||||||
{ // od razu zapinamy
|
{ // od razu zapinamy potrzebny typ animacji
|
||||||
// potrzebny typ
|
|
||||||
// animacji
|
|
||||||
case 1:
|
case 1:
|
||||||
/* pAnimations[i + j].yUpdate = UpdateDoorTranslate;
|
/* pAnimations[i + j].yUpdate = UpdateDoorTranslate;
|
||||||
*/ pAnimations[ i + j ].yUpdate = std::bind( &TDynamicObject::UpdateDoorTranslate, this, std::placeholders::_1 );
|
*/ pAnimations[ i + j ].yUpdate = std::bind( &TDynamicObject::UpdateDoorTranslate, this, std::placeholders::_1 );
|
||||||
@@ -5036,8 +4982,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName,
|
|||||||
pAnimations[i + j].fMaxDist = 300 * 300; // drzwi to z daleka widać
|
pAnimations[i + j].fMaxDist = 300 * 300; // drzwi to z daleka widać
|
||||||
pAnimations[i + j].fSpeed = Random(150); // oryginalny koncept z DoorSpeedFactor
|
pAnimations[i + j].fSpeed = Random(150); // oryginalny koncept z DoorSpeedFactor
|
||||||
pAnimations[i + j].fSpeed = (pAnimations[i + j].fSpeed + 100) / 100;
|
pAnimations[i + j].fSpeed = (pAnimations[i + j].fSpeed + 100) / 100;
|
||||||
// Ra: te współczynniki są bez sensu, bo modyfikują wektor
|
// Ra: te współczynniki są bez sensu, bo modyfikują wektor przesunięcia
|
||||||
// przesunięcia
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
3
DynObj.h
3
DynObj.h
@@ -184,7 +184,10 @@ class TDynamicObject
|
|||||||
int iAnimType[ANIM_TYPES]; // 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki
|
int iAnimType[ANIM_TYPES]; // 0-osie,1-drzwi,2-obracane,3-zderzaki,4-wózki,5-pantografy,6-tłoki
|
||||||
private:
|
private:
|
||||||
int iAnimations; // liczba obiektów animujących
|
int iAnimations; // liczba obiektów animujących
|
||||||
|
/*
|
||||||
TAnim *pAnimations; // obiekty animujące (zawierają wskaźnik do funkcji wykonującej animację)
|
TAnim *pAnimations; // obiekty animujące (zawierają wskaźnik do funkcji wykonującej animację)
|
||||||
|
*/
|
||||||
|
std::vector<TAnim> pAnimations;
|
||||||
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
|
||||||
|
|||||||
@@ -43,7 +43,9 @@ bool Global::detonatoryOK; // info o nowych detonatorach
|
|||||||
double Global::ABuDebug = 0;
|
double Global::ABuDebug = 0;
|
||||||
std::string Global::asSky = "1";
|
std::string Global::asSky = "1";
|
||||||
double Global::fOpenGL = 0.0; // wersja OpenGL - do sprawdzania obecności rozszerzeń
|
double Global::fOpenGL = 0.0; // wersja OpenGL - do sprawdzania obecności rozszerzeń
|
||||||
|
/*
|
||||||
bool Global::bOpenGL_1_5 = false; // czy są dostępne funkcje OpenGL 1.5
|
bool Global::bOpenGL_1_5 = false; // czy są dostępne funkcje OpenGL 1.5
|
||||||
|
*/
|
||||||
double Global::fLuminance = 1.0; // jasność światła do automatycznego zapalania
|
double Global::fLuminance = 1.0; // jasność światła do automatycznego zapalania
|
||||||
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
|
||||||
|
|||||||
@@ -236,7 +236,9 @@ class Global
|
|||||||
static int iFeedbackMode; // tryb pracy informacji zwrotnej
|
static int iFeedbackMode; // tryb pracy informacji zwrotnej
|
||||||
static int iFeedbackPort; // dodatkowy adres dla informacji zwrotnych
|
static int iFeedbackPort; // dodatkowy adres dla informacji zwrotnych
|
||||||
static double fOpenGL; // wersja OpenGL - przyda się
|
static double fOpenGL; // wersja OpenGL - przyda się
|
||||||
|
/*
|
||||||
static bool bOpenGL_1_5; // czy są dostępne funkcje OpenGL 1.5
|
static bool bOpenGL_1_5; // czy są dostępne funkcje OpenGL 1.5
|
||||||
|
*/
|
||||||
static double fLuminance; // jasność światła do automatycznego zapalania
|
static double fLuminance; // jasność światła do automatycznego zapalania
|
||||||
static int iMultiplayer; // blokada działania niektórych eventów na rzecz kominikacji
|
static int iMultiplayer; // blokada działania niektórych eventów na rzecz kominikacji
|
||||||
static HWND hWnd; // uchwyt okna
|
static HWND hWnd; // uchwyt okna
|
||||||
|
|||||||
104
Ground.cpp
104
Ground.cpp
@@ -1005,8 +1005,8 @@ void TSubRect::RaAnimate()
|
|||||||
return; // nie ma nic do animowania
|
return; // nie ma nic do animowania
|
||||||
if (Global::bUseVBO)
|
if (Global::bUseVBO)
|
||||||
{ // odświeżenie VBO sektora
|
{ // odświeżenie VBO sektora
|
||||||
if (Global::bOpenGL_1_5) // modyfikacje VBO są dostępne od OpenGL 1.5
|
if (true == GLEW_VERSION_1_5) // modyfikacje VBO są dostępne od OpenGL 1.5
|
||||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices);
|
glBindBuffer(GL_ARRAY_BUFFER, m_nVBOVertices);
|
||||||
else // dla OpenGL 1.4 z GL_ARB_vertex_buffer_object odświeżenie całego sektora
|
else // dla OpenGL 1.4 z GL_ARB_vertex_buffer_object odświeżenie całego sektora
|
||||||
Release(); // opróżnienie VBO sektora, aby się odświeżył z nowymi ustawieniami
|
Release(); // opróżnienie VBO sektora, aby się odświeżył z nowymi ustawieniami
|
||||||
}
|
}
|
||||||
@@ -1295,7 +1295,10 @@ void TGround::MoveGroundNode(vector3 pPosition)
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<TGroundVertex> TempVerts;
|
||||||
|
/*
|
||||||
TGroundVertex TempVerts[ 10000 ]; // tu wczytywane s¹ trójk¹ty
|
TGroundVertex TempVerts[ 10000 ]; // tu wczytywane s¹ trójk¹ty
|
||||||
|
*/
|
||||||
BYTE TempConnectionType[ 200 ]; // Ra: sprzêgi w sk³adzie; ujemne, gdy odwrotnie
|
BYTE TempConnectionType[ 200 ]; // Ra: sprzêgi w sk³adzie; ujemne, gdy odwrotnie
|
||||||
|
|
||||||
TGround::TGround()
|
TGround::TGround()
|
||||||
@@ -1315,7 +1318,9 @@ TGround::TGround()
|
|||||||
nRootOfType[i] = NULL; // zerowanie tablic wyszukiwania
|
nRootOfType[i] = NULL; // zerowanie tablic wyszukiwania
|
||||||
bDynamicRemove = false; // na razie nic do usunięcia
|
bDynamicRemove = false; // na razie nic do usunięcia
|
||||||
sTracks = new TNames(); // nazwy torów - na razie tak
|
sTracks = new TNames(); // nazwy torów - na razie tak
|
||||||
|
/*
|
||||||
::SecureZeroMemory( TempVerts, sizeof( TempVerts ) );
|
::SecureZeroMemory( TempVerts, sizeof( TempVerts ) );
|
||||||
|
*/
|
||||||
::SecureZeroMemory( TempConnectionType, sizeof( TempConnectionType ) );
|
::SecureZeroMemory( TempConnectionType, sizeof( TempConnectionType ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2071,16 +2076,34 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
i = 0;
|
i = 0;
|
||||||
|
*/
|
||||||
|
TempVerts.clear();
|
||||||
|
TGroundVertex vertex;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
if (i < 9999) // 3333 trójkąty
|
if (i < 9999) // 3333 trójkąty
|
||||||
{ // liczba wierzchołków nie jest nieograniczona
|
{ // liczba wierzchołków nie jest nieograniczona
|
||||||
|
*/
|
||||||
|
/*
|
||||||
parser->getTokens(3);
|
parser->getTokens(3);
|
||||||
*parser >> TempVerts[i].Point.x >> TempVerts[i].Point.y >> TempVerts[i].Point.z;
|
*parser >> TempVerts[i].Point.x >> TempVerts[i].Point.y >> TempVerts[i].Point.z;
|
||||||
parser->getTokens(3);
|
parser->getTokens(3);
|
||||||
*parser >> TempVerts[i].Normal.x >> TempVerts[i].Normal.y >>
|
*parser >> TempVerts[i].Normal.x >> TempVerts[i].Normal.y >>
|
||||||
TempVerts[i].Normal.z;
|
TempVerts[i].Normal.z;
|
||||||
|
*/
|
||||||
|
parser->getTokens( 8, false );
|
||||||
|
*parser
|
||||||
|
>> vertex.Point.x
|
||||||
|
>> vertex.Point.y
|
||||||
|
>> vertex.Point.z
|
||||||
|
>> vertex.Normal.x
|
||||||
|
>> vertex.Normal.y
|
||||||
|
>> vertex.Normal.z
|
||||||
|
>> vertex.tu
|
||||||
|
>> vertex.tv;
|
||||||
/*
|
/*
|
||||||
str=Parser->GetNextSymbol().LowerCase();
|
str=Parser->GetNextSymbol().LowerCase();
|
||||||
if (str==AnsiString("x"))
|
if (str==AnsiString("x"))
|
||||||
@@ -2106,14 +2129,15 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
|||||||
else
|
else
|
||||||
TempVerts[i].tv=str.ToDouble();;
|
TempVerts[i].tv=str.ToDouble();;
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
parser->getTokens(2);
|
parser->getTokens(2);
|
||||||
*parser >> TempVerts[i].tu >> TempVerts[i].tv;
|
*parser >> TempVerts[i].tu >> TempVerts[i].tv;
|
||||||
|
*/
|
||||||
// tf=Parser->GetNextSymbol().ToDouble();
|
// tf=Parser->GetNextSymbol().ToDouble();
|
||||||
// TempVerts[i].tu=tf;
|
// TempVerts[i].tu=tf;
|
||||||
// tf=Parser->GetNextSymbol().ToDouble();
|
// tf=Parser->GetNextSymbol().ToDouble();
|
||||||
// TempVerts[i].tv=tf;
|
// TempVerts[i].tv=tf;
|
||||||
|
/*
|
||||||
TempVerts[i].Point.RotateZ(aRotate.z / 180 * M_PI);
|
TempVerts[i].Point.RotateZ(aRotate.z / 180 * M_PI);
|
||||||
TempVerts[i].Point.RotateX(aRotate.x / 180 * M_PI);
|
TempVerts[i].Point.RotateX(aRotate.x / 180 * M_PI);
|
||||||
TempVerts[i].Point.RotateY(aRotate.y / 180 * M_PI);
|
TempVerts[i].Point.RotateY(aRotate.y / 180 * M_PI);
|
||||||
@@ -2122,17 +2146,33 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
|||||||
TempVerts[i].Normal.RotateY(aRotate.y / 180 * M_PI);
|
TempVerts[i].Normal.RotateY(aRotate.y / 180 * M_PI);
|
||||||
TempVerts[i].Point += pOrigin;
|
TempVerts[i].Point += pOrigin;
|
||||||
tmp->pCenter += TempVerts[i].Point;
|
tmp->pCenter += TempVerts[i].Point;
|
||||||
|
*/
|
||||||
|
vertex.Point.RotateZ( aRotate.z / 180 * M_PI );
|
||||||
|
vertex.Point.RotateX( aRotate.x / 180 * M_PI );
|
||||||
|
vertex.Point.RotateY( aRotate.y / 180 * M_PI );
|
||||||
|
vertex.Normal.RotateZ( aRotate.z / 180 * M_PI );
|
||||||
|
vertex.Normal.RotateX( aRotate.x / 180 * M_PI );
|
||||||
|
vertex.Normal.RotateY( aRotate.y / 180 * M_PI );
|
||||||
|
vertex.Point += pOrigin;
|
||||||
|
tmp->pCenter += vertex.Point;
|
||||||
|
|
||||||
|
TempVerts.emplace_back( vertex );
|
||||||
|
/*
|
||||||
}
|
}
|
||||||
else if (i == 9999)
|
else if (i == 9999)
|
||||||
ErrorLog("Bad triangles: too many verices");
|
ErrorLog("Bad triangles: too many verices");
|
||||||
i++;
|
i++;
|
||||||
|
*/
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
} while (token.compare("endtri") != 0);
|
} while (token.compare("endtri") != 0);
|
||||||
|
/*
|
||||||
nv = i;
|
nv = i;
|
||||||
|
*/
|
||||||
|
nv = TempVerts.size();
|
||||||
tmp->Init(nv); // utworzenie tablicy wierzchołków
|
tmp->Init(nv); // utworzenie tablicy wierzchołków
|
||||||
tmp->pCenter /= (nv > 0 ? nv : 1);
|
tmp->pCenter /= (nv > 0 ? nv : 1);
|
||||||
|
|
||||||
@@ -2154,41 +2194,57 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
|
|||||||
break;
|
break;
|
||||||
case GL_LINES:
|
case GL_LINES:
|
||||||
case GL_LINE_STRIP:
|
case GL_LINE_STRIP:
|
||||||
case GL_LINE_LOOP:
|
case GL_LINE_LOOP: {
|
||||||
parser->getTokens(3);
|
parser->getTokens( 3 );
|
||||||
*parser >> tmp->Diffuse[0] >> tmp->Diffuse[1] >> tmp->Diffuse[2];
|
*parser >> tmp->Diffuse[ 0 ] >> tmp->Diffuse[ 1 ] >> tmp->Diffuse[ 2 ];
|
||||||
// tmp->Diffuse[0]=Parser->GetNextSymbol().ToDouble()/255;
|
// tmp->Diffuse[0]=Parser->GetNextSymbol().ToDouble()/255;
|
||||||
// tmp->Diffuse[1]=Parser->GetNextSymbol().ToDouble()/255;
|
// tmp->Diffuse[1]=Parser->GetNextSymbol().ToDouble()/255;
|
||||||
// tmp->Diffuse[2]=Parser->GetNextSymbol().ToDouble()/255;
|
// tmp->Diffuse[2]=Parser->GetNextSymbol().ToDouble()/255;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> tmp->fLineThickness;
|
*parser >> tmp->fLineThickness;
|
||||||
|
TempVerts.clear();
|
||||||
|
TGroundVertex vertex;
|
||||||
i = 0;
|
i = 0;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
do
|
do {
|
||||||
{
|
|
||||||
str = token;
|
str = token;
|
||||||
TempVerts[i].Point.x = atof(str.c_str());
|
/*
|
||||||
parser->getTokens(2);
|
TempVerts[ i ].Point.x = atof( str.c_str() );
|
||||||
*parser >> TempVerts[i].Point.y >> TempVerts[i].Point.z;
|
parser->getTokens( 2 );
|
||||||
TempVerts[i].Point.RotateZ(aRotate.z / 180 * M_PI);
|
*parser >> TempVerts[ i ].Point.y >> TempVerts[ i ].Point.z;
|
||||||
TempVerts[i].Point.RotateX(aRotate.x / 180 * M_PI);
|
TempVerts[ i ].Point.RotateZ( aRotate.z / 180 * M_PI );
|
||||||
TempVerts[i].Point.RotateY(aRotate.y / 180 * M_PI);
|
TempVerts[ i ].Point.RotateX( aRotate.x / 180 * M_PI );
|
||||||
TempVerts[i].Point += pOrigin;
|
TempVerts[ i ].Point.RotateY( aRotate.y / 180 * M_PI );
|
||||||
tmp->pCenter += TempVerts[i].Point;
|
TempVerts[ i ].Point += pOrigin;
|
||||||
i++;
|
tmp->pCenter += TempVerts[ i ].Point;
|
||||||
|
*/
|
||||||
|
vertex.Point.x = std::atof( str.c_str() );
|
||||||
|
parser->getTokens( 2 );
|
||||||
|
*parser
|
||||||
|
>> vertex.Point.y
|
||||||
|
>> vertex.Point.z;
|
||||||
|
vertex.Point.RotateZ( aRotate.z / 180 * M_PI );
|
||||||
|
vertex.Point.RotateX( aRotate.x / 180 * M_PI );
|
||||||
|
vertex.Point.RotateY( aRotate.y / 180 * M_PI );
|
||||||
|
vertex.Point += pOrigin;
|
||||||
|
tmp->pCenter += vertex.Point;
|
||||||
|
TempVerts.emplace_back( vertex );
|
||||||
|
|
||||||
|
++i;
|
||||||
parser->getTokens();
|
parser->getTokens();
|
||||||
*parser >> token;
|
*parser >> token;
|
||||||
} while (token.compare("endline") != 0);
|
} while( token.compare( "endline" ) != 0 );
|
||||||
nv = i;
|
nv = i;
|
||||||
// tmp->Init(nv);
|
// tmp->Init(nv);
|
||||||
tmp->Points = new vector3[nv];
|
tmp->Points = new vector3[ nv ];
|
||||||
tmp->iNumPts = nv;
|
tmp->iNumPts = nv;
|
||||||
tmp->pCenter /= (nv > 0 ? nv : 1);
|
tmp->pCenter /= ( nv > 0 ? nv : 1 );
|
||||||
for (int i = 0; i < nv; i++)
|
for( int i = 0; i < nv; i++ )
|
||||||
tmp->Points[i] = TempVerts[i].Point;
|
tmp->Points[ i ] = TempVerts[ i ].Point;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2314,7 +2370,7 @@ void TGround::FirstInit()
|
|||||||
WriteLog("InitLaunchers OK");
|
WriteLog("InitLaunchers OK");
|
||||||
WriteLog("InitGlobalTime");
|
WriteLog("InitGlobalTime");
|
||||||
// ABu 160205: juz nie TODO :)
|
// ABu 160205: juz nie TODO :)
|
||||||
GlobalTime = std::make_shared<TMTableTime>( hh, mm, srh, srm, ssh, ssm ); // McZapkie-300302: inicjacja czasu rozkladowego - TODO: czytac z trasy!
|
Mtable::GlobalTime = std::make_shared<TMTableTime>( hh, mm, srh, srm, ssh, ssm ); // McZapkie-300302: inicjacja czasu rozkladowego - TODO: czytac z trasy!
|
||||||
WriteLog("InitGlobalTime OK");
|
WriteLog("InitGlobalTime OK");
|
||||||
// jeszcze ustawienie pogody, gdyby nie było w scenerii wpisów
|
// jeszcze ustawienie pogody, gdyby nie było w scenerii wpisów
|
||||||
glClearColor(Global::AtmoColor[0], Global::AtmoColor[1], Global::AtmoColor[2],
|
glClearColor(Global::AtmoColor[0], Global::AtmoColor[1], Global::AtmoColor[2],
|
||||||
|
|||||||
@@ -477,21 +477,12 @@ struct TPowerParameters
|
|||||||
/*dla lokomotyw elektrycznych:*/
|
/*dla lokomotyw elektrycznych:*/
|
||||||
struct TScheme
|
struct TScheme
|
||||||
{
|
{
|
||||||
int Relay; /*numer pozycji rozruchu samoczynnego*/
|
int Relay = 0; /*numer pozycji rozruchu samoczynnego*/
|
||||||
double R; /*opornik rozruchowy*/ /*dla dizla napelnienie*/
|
double R = 0.0; /*opornik rozruchowy*/ /*dla dizla napelnienie*/
|
||||||
int Bn;
|
int Bn = 0;
|
||||||
int Mn; /*ilosc galezi i silnikow w galezi*/ /*dla dizla Mn: czy luz czy nie*/
|
int Mn = 0; /*ilosc galezi i silnikow w galezi*/ /*dla dizla Mn: czy luz czy nie*/
|
||||||
bool AutoSwitch; /*czy dana pozycja nastawniana jest recznie czy autom.*/
|
bool AutoSwitch = false; /*czy dana pozycja nastawniana jest recznie czy autom.*/
|
||||||
int ScndAct; /*jesli ma bocznik w nastawniku, to ktory bocznik na ktorej pozycji*/
|
int ScndAct = 0; /*jesli ma bocznik w nastawniku, to ktory bocznik na ktorej pozycji*/
|
||||||
inline TScheme()
|
|
||||||
{
|
|
||||||
Relay = 0;
|
|
||||||
R = 0.0;
|
|
||||||
Bn = 0.0;
|
|
||||||
Mn = 0.0;
|
|
||||||
AutoSwitch = false;
|
|
||||||
ScndAct = 0;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
typedef TScheme TSchemeTable[ResArraySize + 1]; /*tablica rezystorow rozr.*/
|
typedef TScheme TSchemeTable[ResArraySize + 1]; /*tablica rezystorow rozr.*/
|
||||||
struct TDEScheme
|
struct TDEScheme
|
||||||
|
|||||||
@@ -7011,6 +7011,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath)
|
|||||||
else if (aType == "182")
|
else if (aType == "182")
|
||||||
TrainType = dt_181; // na razie tak
|
TrainType = dt_181; // na razie tak
|
||||||
|
|
||||||
|
LoadAccepted = ToLower( bLoadAccepted );
|
||||||
MaxLoad = bMaxLoad;
|
MaxLoad = bMaxLoad;
|
||||||
LoadQuantity = bLoadQ;
|
LoadQuantity = bLoadQ;
|
||||||
OverLoadFactor = bOverLoadFactor;
|
OverLoadFactor = bOverLoadFactor;
|
||||||
@@ -8019,25 +8020,30 @@ bool TMoverParameters::SetInternalCommand(std::string NewCommand, double NewValu
|
|||||||
// Q: 20160714
|
// Q: 20160714
|
||||||
// wysyłanie komendy w kierunku dir (1=przód, -1=tył) do kolejnego pojazdu (jednego)
|
// wysyłanie komendy w kierunku dir (1=przód, -1=tył) do kolejnego pojazdu (jednego)
|
||||||
// *************************************************************************************************
|
// *************************************************************************************************
|
||||||
bool TMoverParameters::SendCtrlToNext(std::string CtrlCommand, double ctrlvalue, double dir)
|
bool TMoverParameters::SendCtrlToNext( std::string CtrlCommand, double ctrlvalue, double dir ) {
|
||||||
{
|
|
||||||
bool OK;
|
bool OK;
|
||||||
int d; // numer sprzęgu w kierunku którego wysyłamy
|
int d; // numer sprzęgu w kierunku którego wysyłamy
|
||||||
|
|
||||||
// Ra: był problem z propagacją, jeśli w składzie jest pojazd wstawiony odwrotnie
|
// Ra: był problem z propagacją, jeśli w składzie jest pojazd wstawiony odwrotnie
|
||||||
// Ra: problem jest również, jeśli AI będzie na końcu składu
|
// Ra: problem jest również, jeśli AI będzie na końcu składu
|
||||||
OK = (dir != 0); // and Mains;
|
OK = ( dir != 0 ); // and Mains;
|
||||||
d = (1 + Sign(dir)) / 2; // dir=-1=>d=0, dir=1=>d=1 - wysyłanie tylko w tył
|
d = ( 1 + Sign( dir ) ) / 2; // dir=-1=>d=0, dir=1=>d=1 - wysyłanie tylko w tył
|
||||||
if (OK) // musi być wybrana niezerowa kabina
|
if( OK ) {
|
||||||
if (TestFlag(Couplers[d].CouplingFlag, ctrain_controll))
|
// musi być wybrana niezerowa kabina
|
||||||
if (Couplers[d].ConnectedNr != d) // jeśli ten nastpęny jest zgodny z aktualnym
|
if( ( Couplers[ d ].Connected != nullptr )
|
||||||
{
|
&& ( TestFlag( Couplers[ d ].CouplingFlag, ctrain_controll ) ) ) {
|
||||||
if (Couplers[d].Connected->SetInternalCommand(CtrlCommand, ctrlvalue, dir))
|
if( Couplers[ d ].ConnectedNr != d ) {
|
||||||
OK = (Couplers[d].Connected->RunInternalCommand() && OK); // tu jest rekurencja
|
// jeśli ten nastpęny jest zgodny z aktualnym
|
||||||
|
if( Couplers[ d ].Connected->SetInternalCommand( CtrlCommand, ctrlvalue, dir ) )
|
||||||
|
OK = ( Couplers[ d ].Connected->RunInternalCommand() && OK ); // tu jest rekurencja
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// jeśli następny jest ustawiony przeciwnie, zmieniamy kierunek
|
||||||
|
if( Couplers[ d ].Connected->SetInternalCommand( CtrlCommand, ctrlvalue, -dir ) )
|
||||||
|
OK = ( Couplers[ d ].Connected->RunInternalCommand() && OK ); // tu jest rekurencja
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else // jeśli następny jest ustawiony przeciwnie, zmieniamy kierunek
|
|
||||||
if (Couplers[d].Connected->SetInternalCommand(CtrlCommand, ctrlvalue, -dir))
|
|
||||||
OK = (Couplers[d].Connected->RunInternalCommand() && OK); // tu jest rekurencja
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -378,7 +378,7 @@ bool TBrake::SetBDF(int nBDF)
|
|||||||
|
|
||||||
void TBrake::Releaser(int state)
|
void TBrake::Releaser(int state)
|
||||||
{
|
{
|
||||||
BrakeStatus = (BrakeStatus & 247) || state * b_rls;
|
BrakeStatus = (BrakeStatus & 247) | ( state * b_rls );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TBrake::SetEPS(double nEPS)
|
void TBrake::SetEPS(double nEPS)
|
||||||
@@ -387,7 +387,7 @@ void TBrake::SetEPS(double nEPS)
|
|||||||
|
|
||||||
void TBrake::ASB(int state)
|
void TBrake::ASB(int state)
|
||||||
{ // 255-b_asb(32)
|
{ // 255-b_asb(32)
|
||||||
BrakeStatus = (BrakeStatus & 223) || state * b_asb;
|
BrakeStatus = (BrakeStatus & 223) | ( state * b_asb );
|
||||||
}
|
}
|
||||||
|
|
||||||
int TBrake::GetStatus()
|
int TBrake::GetStatus()
|
||||||
|
|||||||
2
PyInt.h
2
PyInt.h
@@ -34,7 +34,7 @@ class TPythonInterpreter
|
|||||||
static TPythonInterpreter *_instance;
|
static TPythonInterpreter *_instance;
|
||||||
int _screenRendererPriority;
|
int _screenRendererPriority;
|
||||||
// std::set<const char *, ltstr> _classes;
|
// std::set<const char *, ltstr> _classes;
|
||||||
std::set<std::string const> _classes;
|
std::set<std::string> _classes;
|
||||||
PyObject *_main;
|
PyObject *_main;
|
||||||
PyObject *_stdErr;
|
PyObject *_stdErr;
|
||||||
// FILE *_getFile(const char *lookupPath, const char *className);
|
// FILE *_getFile(const char *lookupPath, const char *className);
|
||||||
|
|||||||
@@ -2861,7 +2861,7 @@ TTrack * TTrack::RaAnimate()
|
|||||||
}
|
}
|
||||||
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
|
||||||
if (Global::bOpenGL_1_5) // dla OpenGL 1.4 to się nie wykona poprawnie
|
if (true == GLEW_VERSION_1_5) // dla OpenGL 1.4 to się nie wykona poprawnie
|
||||||
if (TextureID1) // Ra: !!!! tu jest do poprawienia
|
if (TextureID1) // Ra: !!!! tu jest do poprawienia
|
||||||
{ // iglice liczone tylko dla zwrotnic
|
{ // iglice liczone tylko dla zwrotnic
|
||||||
vector6 rpts3[24], rpts4[24];
|
vector6 rpts3[24], rpts4[24];
|
||||||
@@ -2965,7 +2965,7 @@ TTrack * TTrack::RaAnimate()
|
|||||||
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
|
||||||
if (Global::bOpenGL_1_5) // dla OpenGL 1.4 to się nie wykona poprawnie
|
if (true == GLEW_VERSION_1_5) // dla OpenGL 1.4 to się nie wykona poprawnie
|
||||||
{
|
{
|
||||||
int size =
|
int size =
|
||||||
RaArrayPrepare(); // wielkość tabeli potrzebna dla tej obrotnicy
|
RaArrayPrepare(); // wielkość tabeli potrzebna dla tej obrotnicy
|
||||||
|
|||||||
17
VBO.cpp
17
VBO.cpp
@@ -34,10 +34,9 @@ void CMesh::MakeArray(int n)
|
|||||||
void CMesh::BuildVBOs(bool del)
|
void CMesh::BuildVBOs(bool del)
|
||||||
{ // tworzenie VBO i kasowanie już niepotrzebnych tablic
|
{ // tworzenie VBO i kasowanie już niepotrzebnych tablic
|
||||||
// pobierz numer VBO oraz ustaw go jako aktywny
|
// pobierz numer VBO oraz ustaw go jako aktywny
|
||||||
glGenBuffersARB(1, &m_nVBOVertices); // pobierz numer
|
glGenBuffers(1, &m_nVBOVertices); // pobierz numer
|
||||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices); // ustaw bufor jako aktualny
|
glBindBuffer(GL_ARRAY_BUFFER, m_nVBOVertices); // ustaw bufor jako aktualny
|
||||||
glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_nVertexCount * sizeof(CVertNormTex), m_pVNT,
|
glBufferData(GL_ARRAY_BUFFER, m_nVertexCount * sizeof(CVertNormTex), m_pVNT, GL_STATIC_DRAW);
|
||||||
GL_STATIC_DRAW_ARB);
|
|
||||||
// WriteLog("Assigned VBO number "+AnsiString(m_nVBOVertices)+", vertices:
|
// WriteLog("Assigned VBO number "+AnsiString(m_nVBOVertices)+", vertices:
|
||||||
// "+AnsiString(m_nVertexCount));
|
// "+AnsiString(m_nVertexCount));
|
||||||
if (del)
|
if (del)
|
||||||
@@ -49,7 +48,7 @@ void CMesh::Clear()
|
|||||||
// inna nazwa, żeby nie mieszało się z funkcją wirtualną sprzątacza
|
// inna nazwa, żeby nie mieszało się z funkcją wirtualną sprzątacza
|
||||||
if (m_nVBOVertices) // jeśli było coś rezerwowane
|
if (m_nVBOVertices) // jeśli było coś rezerwowane
|
||||||
{
|
{
|
||||||
glDeleteBuffersARB(1, &m_nVBOVertices); // Free The Memory
|
glDeleteBuffers(1, &m_nVBOVertices); // Free The Memory
|
||||||
// WriteLog("Released VBO number "+AnsiString(m_nVBOVertices));
|
// WriteLog("Released VBO number "+AnsiString(m_nVBOVertices));
|
||||||
}
|
}
|
||||||
m_nVBOVertices = 0;
|
m_nVBOVertices = 0;
|
||||||
@@ -66,7 +65,7 @@ bool CMesh::StartVBO()
|
|||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
if (m_nVBOVertices)
|
if (m_nVBOVertices)
|
||||||
{
|
{
|
||||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices);
|
glBindBuffer(GL_ARRAY_BUFFER_ARB, m_nVBOVertices);
|
||||||
glVertexPointer( 3, GL_FLOAT, sizeof(CVertNormTex), static_cast<char *>(nullptr) ); // pozycje
|
glVertexPointer( 3, GL_FLOAT, sizeof(CVertNormTex), static_cast<char *>(nullptr) ); // pozycje
|
||||||
glNormalPointer( GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 12 ); // normalne
|
glNormalPointer( GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 12 ); // normalne
|
||||||
glTexCoordPointer( 2, GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 24 ); // wierzchołki
|
glTexCoordPointer( 2, GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 24 ); // wierzchołki
|
||||||
@@ -82,7 +81,7 @@ bool CMesh::StartColorVBO()
|
|||||||
glEnableClientState(GL_COLOR_ARRAY);
|
glEnableClientState(GL_COLOR_ARRAY);
|
||||||
if (m_nVBOVertices)
|
if (m_nVBOVertices)
|
||||||
{
|
{
|
||||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices);
|
glBindBuffer(GL_ARRAY_BUFFER, m_nVBOVertices);
|
||||||
glVertexPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) ); // pozycje
|
glVertexPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) ); // pozycje
|
||||||
// glColorPointer(3,GL_UNSIGNED_BYTE,sizeof(CVertNormTex),((char*)NULL)+12); //kolory
|
// glColorPointer(3,GL_UNSIGNED_BYTE,sizeof(CVertNormTex),((char*)NULL)+12); //kolory
|
||||||
glColorPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 12 ); // kolory
|
glColorPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast<char *>( nullptr ) + 12 ); // kolory
|
||||||
@@ -97,6 +96,6 @@ void CMesh::EndVBO()
|
|||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
glDisableClientState(GL_COLOR_ARRAY);
|
glDisableClientState(GL_COLOR_ARRAY);
|
||||||
// glBindBuffer(GL_ARRAY_BUFFER,0); //takie coś psuje, mimo iż polecali użyć
|
// glBindBuffer(GL_ARRAY_BUFFER,0); //takie coś psuje, mimo iż polecali użyć
|
||||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); // Ra: to na przyszłość
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // Ra: to na przyszłość
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -215,13 +215,14 @@ bool TWorld::Init(HWND NhWnd, HDC hDC)
|
|||||||
if (ogl < Global::fOpenGL) // a karta oferuje niższą wersję niż wpisana
|
if (ogl < Global::fOpenGL) // a karta oferuje niższą wersję niż wpisana
|
||||||
Global::fOpenGL = ogl; // to przyjąc to z karty
|
Global::fOpenGL = ogl; // to przyjąc to z karty
|
||||||
}
|
}
|
||||||
else if (ogl < 1.3) // sprzętowa deompresja DDS zwykle wymaga 1.3
|
else if (false == GLEW_VERSION_1_3) // sprzętowa deompresja DDS zwykle wymaga 1.3
|
||||||
Error("Missed OpenGL 1.3+ drivers!"); // błąd np. gdy wersja 1.1, a nie ma wpisu w EU07.INI
|
Error("Missed OpenGL 1.3+ drivers!"); // błąd np. gdy wersja 1.1, a nie ma wpisu w EU07.INI
|
||||||
|
/*
|
||||||
Global::bOpenGL_1_5 = (Global::fOpenGL >= 1.5); // są fragmentaryczne animacje VBO
|
Global::bOpenGL_1_5 = (Global::fOpenGL >= 1.5); // są fragmentaryczne animacje VBO
|
||||||
|
*/
|
||||||
WriteLog("Supported extensions:");
|
WriteLog("Supported extensions:");
|
||||||
WriteLog((char *)glGetString(GL_EXTENSIONS));
|
WriteLog((char *)glGetString(GL_EXTENSIONS));
|
||||||
if (GL_ARB_vertex_buffer_object) // czy jest VBO w karcie graficznej
|
if (GLEW_ARB_vertex_buffer_object) // czy jest VBO w karcie graficznej
|
||||||
{
|
{
|
||||||
if( std::string( (char *)glGetString(GL_VENDOR) ).find("Intel") != std::string::npos ) // wymuszenie tylko dla kart Intel
|
if( std::string( (char *)glGetString(GL_VENDOR) ).find("Intel") != std::string::npos ) // wymuszenie tylko dla kart Intel
|
||||||
{ // karty Intel nie nadają się do grafiki 3D, ale robimy wyjątek, bo to w końcu symulator
|
{ // karty Intel nie nadają się do grafiki 3D, ale robimy wyjątek, bo to w końcu symulator
|
||||||
@@ -247,7 +248,7 @@ bool TWorld::Init(HWND NhWnd, HDC hDC)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Global::bDecompressDDS =
|
Global::bDecompressDDS =
|
||||||
!(GL_EXT_texture_compression_s3tc); // czy obsługiwane?
|
!(true == GLEW_EXT_texture_compression_s3tc); // czy obsługiwane?
|
||||||
if (Global::bDecompressDDS) // czy jest obsługa DDS w karcie graficznej
|
if (Global::bDecompressDDS) // czy jest obsługa DDS w karcie graficznej
|
||||||
WriteLog("DDS textures are not supported.");
|
WriteLog("DDS textures are not supported.");
|
||||||
else // brak obsługi DDS - trzeba włączyć programową dekompresję
|
else // brak obsługi DDS - trzeba włączyć programową dekompresję
|
||||||
|
|||||||
Reference in New Issue
Block a user