16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-09-05 01:19:18 +02:00

Merge pull request #19 from tmj-fstate/mover_in_c++

Poprawki hamulców i opengl
This commit is contained in:
firleju
2017-01-26 20:36:16 +01:00
committed by GitHub
18 changed files with 921 additions and 877 deletions

View File

@@ -290,6 +290,8 @@ std::string TSpeedPos::GetName()
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();

View File

@@ -541,8 +541,11 @@ 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
@@ -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
{
if( false == asLoadName.empty() ) {
mdLoad = TModelsManager::GetModel( asLoadName, true ); // ladunek 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
} }
} }
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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,7 +2194,7 @@ 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;
@@ -2162,12 +2202,14 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
// 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() ); TempVerts[ i ].Point.x = atof( str.c_str() );
parser->getTokens( 2 ); parser->getTokens( 2 );
*parser >> TempVerts[ i ].Point.y >> TempVerts[ i ].Point.z; *parser >> TempVerts[ i ].Point.y >> TempVerts[ i ].Point.z;
@@ -2176,7 +2218,20 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
TempVerts[ i ].Point.RotateY( aRotate.y / 180 * M_PI ); TempVerts[ i ].Point.RotateY( aRotate.y / 180 * M_PI );
TempVerts[ i ].Point += pOrigin; TempVerts[ i ].Point += pOrigin;
tmp->pCenter += TempVerts[ i ].Point; tmp->pCenter += TempVerts[ i ].Point;
i++; */
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 );
@@ -2189,6 +2244,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
tmp->Points[ i ] = TempVerts[ i ].Point; tmp->Points[ i ] = TempVerts[ i ].Point;
break; break;
} }
}
return tmp; return tmp;
} }
@@ -2313,7 +2369,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],

View File

@@ -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

View File

@@ -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,8 +8020,7 @@ 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
@@ -8028,16 +8028,22 @@ bool TMoverParameters::SendCtrlToNext(std::string CtrlCommand, double ctrlvalue,
// 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 ].ConnectedNr != d ) {
// jeśli ten nastpęny jest zgodny z aktualnym
if( Couplers[ d ].Connected->SetInternalCommand( CtrlCommand, ctrlvalue, dir ) ) if( Couplers[ d ].Connected->SetInternalCommand( CtrlCommand, ctrlvalue, dir ) )
OK = ( Couplers[ d ].Connected->RunInternalCommand() && OK ); // tu jest rekurencja OK = ( Couplers[ d ].Connected->RunInternalCommand() && OK ); // tu jest rekurencja
} }
else // jeśli następny jest ustawiony przeciwnie, zmieniamy kierunek else {
// jeśli następny jest ustawiony przeciwnie, zmieniamy kierunek
if( Couplers[ d ].Connected->SetInternalCommand( CtrlCommand, ctrlvalue, -dir ) ) if( Couplers[ d ].Connected->SetInternalCommand( CtrlCommand, ctrlvalue, -dir ) )
OK = ( Couplers[ d ].Connected->RunInternalCommand() && OK ); // tu jest rekurencja OK = ( Couplers[ d ].Connected->RunInternalCommand() && OK ); // tu jest rekurencja
}
}
}
return OK; return OK;
} }

View File

@@ -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 & ~b_rls) | ( 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 & ~b_asb) | ( state * b_asb );
} }
int TBrake::GetStatus() int TBrake::GetStatus()
@@ -441,17 +441,17 @@ double TWest::GetPF(double PP, double dt, double Vel)
CVP = BrakeCyl->P(); CVP = BrakeCyl->P();
BCP = BrakeCyl->P(); BCP = BrakeCyl->P();
if ((BrakeStatus & 1) == 1) if ((BrakeStatus & b_hld) == b_hld)
if ((VVP + 0.03 < BVP)) if ((VVP + 0.03 < BVP))
BrakeStatus |= 2; BrakeStatus |= b_on;
else if ((VVP > BVP + 0.1)) else if ((VVP > BVP + 0.1))
BrakeStatus &= 252; BrakeStatus &= ~(b_on | b_hld);
else if ((VVP > BVP)) else if ((VVP > BVP))
BrakeStatus &= 253; BrakeStatus &= ~b_on;
else else
; ;
else if ((VVP + 0.25 < BVP)) else if ((VVP + 0.25 < BVP))
BrakeStatus |= 3; BrakeStatus |= (b_on | b_hld);
if (((BrakeStatus & b_hld) == b_off) && (!DCV)) if (((BrakeStatus & b_hld) == b_off) && (!DCV))
dv = PF(0, CVP, 0.0068 * SizeBC) * dt; dv = PF(0, CVP, 0.0068 * SizeBC) * dt;
@@ -562,17 +562,13 @@ void TWest::SetLP(double TM, double LM, double TBP)
//---OERLIKON EST4--- //---OERLIKON EST4---
void TESt::CheckReleaser(double dt) void TESt::CheckReleaser(double dt)
{ {
double VVP; double VVP = std::min(ValveRes->P(), BrakeRes->P() + 0.05);
double BVP; double CVP = CntrlRes->P() - 0.0;
double CVP;
VVP = Min0R(ValveRes->P(), BrakeRes->P() + 0.05);
CVP = CntrlRes->P() - 0.0;
// odluzniacz // odluzniacz
if ((BrakeStatus & b_rls) == b_rls) if ((BrakeStatus & b_rls) == b_rls)
if ((CVP - VVP < 0)) if ((CVP - VVP < 0))
BrakeStatus &= 247; BrakeStatus &= ~b_rls;
else else
{ {
CntrlRes->Flow(+PF(CVP, 0, 0.1) * dt); CntrlRes->Flow(+PF(CVP, 0, 0.1) * dt);
@@ -592,33 +588,33 @@ void TESt::CheckState(double BCP, double &dV1)
CVP = CntrlRes->P() - 0.0; CVP = CntrlRes->P() - 0.0;
// sprawdzanie stanu // sprawdzanie stanu
if (((BrakeStatus & 1) == 1) && (BCP > 0.25)) if (((BrakeStatus & b_hld) == b_hld) && (BCP > 0.25))
if ((VVP + 0.003 + BCP / BVM < CVP)) if ((VVP + 0.003 + BCP / BVM < CVP))
BrakeStatus |= 2; // hamowanie stopniowe BrakeStatus |= b_on; // hamowanie stopniowe
else if ((VVP - 0.003 + (BCP - 0.1) / BVM > CVP)) else if ((VVP - 0.003 + (BCP - 0.1) / BVM > CVP))
BrakeStatus &= 252; // luzowanie BrakeStatus &= ~( b_on | b_hld ); // luzowanie
else if ((VVP + BCP / BVM > CVP)) else if ((VVP + BCP / BVM > CVP))
BrakeStatus &= 253; // zatrzymanie napelaniania BrakeStatus &= ~b_on; // zatrzymanie napelaniania
else else
; ;
else if ((VVP + 0.10 < CVP) && (BCP < 0.25)) // poczatek hamowania else if ((VVP + 0.10 < CVP) && (BCP < 0.25)) // poczatek hamowania
{ {
if ((BrakeStatus & 1) == 0) if ((BrakeStatus & b_hld) == b_off)
{ {
ValveRes->CreatePress(0.02 * VVP); ValveRes->CreatePress(0.02 * VVP);
SoundFlag |= sf_Acc; SoundFlag |= sf_Acc;
ValveRes->Act(); ValveRes->Act();
} }
BrakeStatus |= 3; BrakeStatus |= (b_on | b_hld);
// ValveRes.CreatePress(0); // ValveRes.CreatePress(0);
// dV1:=1; // dV1:=1;
} }
else if ((VVP + (BCP - 0.1) / BVM < CVP) && ((CVP - VVP) * BVM > 0.25) && else if ((VVP + (BCP - 0.1) / BVM < CVP) && ((CVP - VVP) * BVM > 0.25) &&
(BCP > 0.25)) // zatrzymanie luzowanie (BCP > 0.25)) // zatrzymanie luzowanie
BrakeStatus |= 1; BrakeStatus |= b_hld;
if ((BrakeStatus & 1) == 0) if ((BrakeStatus & b_hld) == b_off)
SoundFlag |= sf_CylU; SoundFlag |= sf_CylU;
} }
@@ -743,7 +739,7 @@ void TESt::Init(double PP, double HPP, double LPP, double BP, int BDF)
BrakeRes->CreatePress(PP); BrakeRes->CreatePress(PP);
CntrlRes->CreateCap(15); CntrlRes->CreateCap(15);
CntrlRes->CreatePress(HPP); CntrlRes->CreatePress(HPP);
BrakeStatus = 0; BrakeStatus = b_off;
BVM = 1.0 / (HPP - LPP) * MaxBP; BVM = 1.0 / (HPP - LPP) * MaxBP;
@@ -796,13 +792,13 @@ double TEStEP2::GetPF(double PP, double dt, double Vel)
CheckReleaser(dt); CheckReleaser(dt);
// sprawdzanie stanu // sprawdzanie stanu
if (((BrakeStatus & 1) == 1) && (BCP > 0.25)) if (((BrakeStatus & b_hld) == b_hld) && (BCP > 0.25))
if ((VVP + 0.003 + BCP / BVM < CVP - 0.12)) if ((VVP + 0.003 + BCP / BVM < CVP - 0.12))
BrakeStatus |= 2; // hamowanie stopniowe; BrakeStatus |= b_on; // hamowanie stopniowe;
else if ((VVP - 0.003 + BCP / BVM > CVP - 0.12)) else if ((VVP - 0.003 + BCP / BVM > CVP - 0.12))
BrakeStatus &= 252; // luzowanie; BrakeStatus &= ~(b_on | b_hld); // luzowanie;
else if ((VVP + BCP / BVM > CVP - 0.12)) else if ((VVP + BCP / BVM > CVP - 0.12))
BrakeStatus &= 253; // zatrzymanie napelaniania; BrakeStatus &= ~b_on; // zatrzymanie napelaniania;
else else
; ;
else if ((VVP + 0.10 < CVP - 0.12) && (BCP < 0.25)) // poczatek hamowania else if ((VVP + 0.10 < CVP - 0.12) && (BCP < 0.25)) // poczatek hamowania
@@ -813,13 +809,13 @@ double TEStEP2::GetPF(double PP, double dt, double Vel)
// // SoundFlag:=SoundFlag or sf_Acc; // // SoundFlag:=SoundFlag or sf_Acc;
// // ValveRes.Act; // // ValveRes.Act;
//} //}
BrakeStatus |= 3; BrakeStatus |= (b_on | b_hld);
} }
else if ((VVP + BCP / BVM < CVP - 0.12) && (BCP > 0.25)) // zatrzymanie luzowanie else if ((VVP + BCP / BVM < CVP - 0.12) && (BCP > 0.25)) // zatrzymanie luzowanie
BrakeStatus |= 1; BrakeStatus |= b_hld;
// przeplyw ZS <-> PG // przeplyw ZS <-> PG
if ((BVP < CVP - 0.2) || (BrakeStatus > 0) || (BCP > 0.25)) if ((BVP < CVP - 0.2) || (BrakeStatus != b_off) || (BCP > 0.25))
temp = 0; temp = 0;
else if ((VVP > CVP + 0.4)) else if ((VVP > CVP + 0.4))
temp = 0.1; temp = 0.1;
@@ -1113,7 +1109,7 @@ double TESt3AL2::GetPF(double PP, double dt, double Vel)
dV1 = dV1 - 0.96 * dv; dV1 = dV1 - 0.96 * dv;
// luzowanie KI // luzowanie KI
if ((BrakeStatus && b_hld) == b_off) if ((BrakeStatus & b_hld) == b_off)
dv = PF(0, BCP, 0.00017 * (1.37 - int(BrakeDelayFlag == bdelay_G))) * dt; dv = PF(0, BCP, 0.00017 * (1.37 - int(BrakeDelayFlag == bdelay_G))) * dt;
else else
dv = 0; dv = 0;
@@ -1213,7 +1209,7 @@ double TLSt::GetPF(double PP, double dt, double Vel)
// sprawdzanie stanu // sprawdzanie stanu
if ((BrakeStatus & b_rls) == b_rls) if ((BrakeStatus & b_rls) == b_rls)
if ((CVP < 0)) if ((CVP < 0))
BrakeStatus &= 247; BrakeStatus &= ~b_rls;
else else
{ // 008 { // 008
dv = PF1(CVP, BCP, 0.024) * dt; dv = PF1(CVP, BCP, 0.024) * dt;
@@ -1363,7 +1359,6 @@ double TEStED::GetPF(double PP, double dt, double Vel)
double CVP; double CVP;
double MPP; double MPP;
double nastG; double nastG;
int i;
BVP = BrakeRes->P(); BVP = BrakeRes->P();
VVP = ValveRes->P(); VVP = ValveRes->P();
@@ -1380,13 +1375,13 @@ double TEStED::GetPF(double PP, double dt, double Vel)
// sprawdzanie stanu // sprawdzanie stanu
if ((VVP + 0.002 + BCP / BVM < CVP - 0.05) && (Przys_blok)) if ((VVP + 0.002 + BCP / BVM < CVP - 0.05) && (Przys_blok))
BrakeStatus |= 3; // hamowanie stopniowe; BrakeStatus |= (b_on | b_hld); // hamowanie stopniowe;
else if ((VVP - 0.002 + (BCP - 0.1) / BVM > CVP - 0.05)) else if ((VVP - 0.002 + (BCP - 0.1) / BVM > CVP - 0.05))
BrakeStatus &= 252; // luzowanie; BrakeStatus &= ~(b_on | b_hld); // luzowanie;
else if ((VVP + BCP / BVM > CVP - 0.05)) else if ((VVP + BCP / BVM > CVP - 0.05))
BrakeStatus &= 253; // zatrzymanie napelaniania; BrakeStatus &= ~b_on; // zatrzymanie napelaniania;
else if ((VVP + (BCP - 0.1) / BVM < CVP - 0.05) && (BCP > 0.25)) // zatrzymanie luzowania else if ((VVP + (BCP - 0.1) / BVM < CVP - 0.05) && (BCP > 0.25)) // zatrzymanie luzowania
BrakeStatus |= 1; BrakeStatus |= b_hld;
if ((VVP + 0.10 < CVP) && (BCP < 0.25)) // poczatek hamowania if ((VVP + 0.10 < CVP) && (BCP < 0.25)) // poczatek hamowania
if ((!Przys_blok)) if ((!Przys_blok))
@@ -1513,7 +1508,7 @@ void TEStED::Init(double PP, double HPP, double LPP, double BP, int BDF)
// CntrlRes.CreateCap(15); // CntrlRes.CreateCap(15);
// CntrlRes.CreatePress(1*HPP); // CntrlRes.CreatePress(1*HPP);
BrakeStatus = int(BP > 1); BrakeStatus = (BP > 1.0) ? 1 : 0;
Miedzypoj->CreateCap(5); Miedzypoj->CreateCap(5);
Miedzypoj->CreatePress(PP); Miedzypoj->CreatePress(PP);
@@ -1579,25 +1574,25 @@ void TCV1::CheckState(double BCP, double &dV1)
// odluzniacz // odluzniacz
if (((BrakeStatus & b_rls) == b_rls) && (CVP - VVP < 0)) if (((BrakeStatus & b_rls) == b_rls) && (CVP - VVP < 0))
BrakeStatus &= 247; BrakeStatus &= ~b_rls;
// sprawdzanie stanu // sprawdzanie stanu
if ((BrakeStatus & b_hld) == b_hld) if ((BrakeStatus & b_hld) == b_hld)
if ((VVP + 0.003 + BCP / BVM < CVP)) if ((VVP + 0.003 + BCP / BVM < CVP))
BrakeStatus |= 2; // hamowanie stopniowe; BrakeStatus |= b_on; // hamowanie stopniowe;
else if ((VVP - 0.003 + BCP * 1.0 / BVM > CVP)) else if ((VVP - 0.003 + BCP * 1.0 / BVM > CVP))
BrakeStatus &= 252; // luzowanie; BrakeStatus &= ~( b_on | b_hld ); // luzowanie;
else if ((VVP + BCP * 1.0 / BVM > CVP)) else if ((VVP + BCP * 1.0 / BVM > CVP))
BrakeStatus &= 253; // zatrzymanie napelaniania; BrakeStatus &= ~b_on; // zatrzymanie napelaniania;
else else
; ;
else if ((VVP + 0.10 < CVP) && (BCP < 0.1)) // poczatek hamowania else if ((VVP + 0.10 < CVP) && (BCP < 0.1)) // poczatek hamowania
{ {
BrakeStatus |= 3; BrakeStatus |= ( b_on | b_hld );
dV1 = 1.25; dV1 = 1.25;
} }
else if ((VVP + BCP / BVM < CVP) && (BCP > 0.25)) // zatrzymanie luzowanie else if ((VVP + BCP / BVM < CVP) && (BCP > 0.25)) // zatrzymanie luzowanie
BrakeStatus |= 1; BrakeStatus |= b_hld;
} }
double TCV1::CVs(double BP) double TCV1::CVs(double BP)
@@ -1703,7 +1698,7 @@ void TCV1::Init(double PP, double HPP, double LPP, double BP, int BDF)
BrakeRes->CreatePress(PP); BrakeRes->CreatePress(PP);
CntrlRes->CreateCap(15); CntrlRes->CreateCap(15);
CntrlRes->CreatePress(HPP); CntrlRes->CreatePress(HPP);
BrakeStatus = 0; BrakeStatus = b_off;
BVM = 1.0 / (HPP - LPP) * MaxBP; BVM = 1.0 / (HPP - LPP) * MaxBP;
@@ -1837,7 +1832,7 @@ void TKE::CheckReleaser(double dt)
// odluzniacz // odluzniacz
if ( true == ((BrakeStatus & b_rls) == b_rls)) if ( true == ((BrakeStatus & b_rls) == b_rls))
if ((CVP - VVP < 0)) if ((CVP - VVP < 0))
BrakeStatus &= 247; BrakeStatus &= ~b_rls;
else else
CntrlRes->Flow(+PF(CVP, 0, 0.1) * dt); CntrlRes->Flow(+PF(CVP, 0, 0.1) * dt);
} }
@@ -1853,22 +1848,22 @@ void TKE::CheckState(double BCP, double &dV1)
CVP = CntrlRes->P(); CVP = CntrlRes->P();
// sprawdzanie stanu // sprawdzanie stanu
if ((BrakeStatus && 1) == 1) if ((BrakeStatus & b_hld) == b_hld)
if ((VVP + 0.003 + BCP / BVM < CVP)) if ((VVP + 0.003 + BCP / BVM < CVP))
BrakeStatus |= 2; // hamowanie stopniowe; BrakeStatus |= b_on; // hamowanie stopniowe;
else if ((VVP - 0.003 + BCP / BVM > CVP)) else if ((VVP - 0.003 + BCP / BVM > CVP))
BrakeStatus &= 252; // luzowanie; BrakeStatus &= ~( b_on | b_hld ); // luzowanie;
else if ((VVP + BCP / BVM > CVP)) else if ((VVP + BCP / BVM > CVP))
BrakeStatus &= 253; // zatrzymanie napelaniania; BrakeStatus &= ~b_on; // zatrzymanie napelaniania;
else else
; ;
else if ((VVP + 0.10 < CVP) && (BCP < 0.1)) // poczatek hamowania else if ((VVP + 0.10 < CVP) && (BCP < 0.1)) // poczatek hamowania
{ {
BrakeStatus |= 3; BrakeStatus |= (b_on | b_hld);
ValveRes->CreatePress(0.8 * VVP); // przyspieszacz ValveRes->CreatePress(0.8 * VVP); // przyspieszacz
} }
else if ((VVP + BCP / BVM < CVP) && ((CVP - VVP) * BVM > 0.25)) // zatrzymanie luzowanie else if ((VVP + BCP / BVM < CVP) && ((CVP - VVP) * BVM > 0.25)) // zatrzymanie luzowanie
BrakeStatus |= 1; BrakeStatus |= b_hld;
} }
double TKE::CVs(double BP) double TKE::CVs(double BP)
@@ -2038,7 +2033,7 @@ void TKE::Init(double PP, double HPP, double LPP, double BP, int BDF)
ImplsRes->CreateCap(1); ImplsRes->CreateCap(1);
ImplsRes->CreatePress(BP); ImplsRes->CreatePress(BP);
BrakeStatus = 0; BrakeStatus = b_off;
BVM = 1.0 / (HPP - LPP) * MaxBP; BVM = 1.0 / (HPP - LPP) * MaxBP;
@@ -2651,7 +2646,6 @@ double TSt113::GetPF(double i_bcp, double PP, double HP, double dt, double ep)
static double const NomPress = 5.0; static double const NomPress = 5.0;
double LimPP; double LimPP;
double dpPipe;
double dpMainValve; double dpMainValve;
double ActFlowSpeed; double ActFlowSpeed;
int BCP; int BCP;
@@ -2710,7 +2704,6 @@ void TSt113::Init(double Press)
double Ttest::GetPF(double i_bcp, double PP, double HP, double dt, double ep) double Ttest::GetPF(double i_bcp, double PP, double HP, double dt, double ep)
{ {
double result;
static int const LBDelay = 100; static int const LBDelay = 100;
double LimPP; double LimPP;
@@ -2822,7 +2815,6 @@ double TFVel6::GetPF(double i_bcp, double PP, double HP, double dt, double ep)
static int const LBDelay = 100; static int const LBDelay = 100;
double LimPP; double LimPP;
double dpPipe;
double dpMainValve; double dpMainValve;
double ActFlowSpeed; double ActFlowSpeed;

View File

@@ -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
View File

@@ -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ść
}; };

16
VBO.h
View File

@@ -13,14 +13,14 @@ http://mozilla.org/MPL/2.0/.
class CVertNormTex class CVertNormTex
{ {
public: public:
float x; // X wierzchołka float x = 0.0; // X wierzchołka
float y; // Y wierzchołka float y = 0.0; // Y wierzchołka
float z; // Z wierzchołka float z = 0.0; // Z wierzchołka
float nx; // X wektora normalnego float nx = 0.0; // X wektora normalnego
float ny; // Y wektora normalnego float ny = 0.0; // Y wektora normalnego
float nz; // Z wektora normalnego float nz = 0.0; // Z wektora normalnego
float u; // U mapowania float u = 0.0; // U mapowania
float v; // V mapowania float v = 0.0; // V mapowania
}; };
class CMesh class CMesh

View File

@@ -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ę

View File

@@ -13,18 +13,17 @@
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<ProjectGuid>{8E0232E5-1C67-442F-9E04-45ED2DDFC960}</ProjectGuid> <ProjectGuid>{8E0232E5-1C67-442F-9E04-45ED2DDFC960}</ProjectGuid>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140_xp</PlatformToolset> <PlatformToolset>v120</PlatformToolset>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140_xp</PlatformToolset> <PlatformToolset>v120</PlatformToolset>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings"> <ImportGroup Label="ExtensionSettings">
@@ -37,9 +36,9 @@
</ImportGroup> </ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<TargetName>eu07++d</TargetName> <TargetName>eu07++</TargetName>
<IntDir>$(SolutionDir)tmp\$(PlatformShortName)-$(Configuration)\$(ProjectName)\</IntDir> <IntDir>$(SolutionDir)tmp\$(PlatformShortName)-$(Configuration)\$(ProjectName)\</IntDir>
<OutDir>E:\Gry\MaSzyna_15_04\</OutDir> <OutDir>$(SolutionDir)bin\</OutDir>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<TargetName>eu07++</TargetName> <TargetName>eu07++</TargetName>
@@ -51,12 +50,12 @@
<ClCompile> <ClCompile>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)console;$(SolutionDir)mczapkie;$(SolutionDir)opengl;$(SolutionDir)python/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)console;$(SolutionDir)mczapkie;$(SolutionDir)opengl;$(SolutionDir)python/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeader>Use</PrecompiledHeader>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<MinimalRebuild>false</MinimalRebuild> <MinimalRebuild>false</MinimalRebuild>
<FloatingPointExceptions>true</FloatingPointExceptions>
</ClCompile> </ClCompile>
<Link> <Link>
<TargetMachine>MachineX86</TargetMachine> <TargetMachine>MachineX86</TargetMachine>
@@ -152,9 +151,11 @@
<ClInclude Include="Console\LPT.h" /> <ClInclude Include="Console\LPT.h" />
<ClInclude Include="Console\MWD.h" /> <ClInclude Include="Console\MWD.h" />
<ClInclude Include="Console\PoKeys55.h" /> <ClInclude Include="Console\PoKeys55.h" />
<ClInclude Include="Driver.h" />
<ClInclude Include="dumb3d.h" /> <ClInclude Include="dumb3d.h" />
<ClInclude Include="DynObj.h" /> <ClInclude Include="DynObj.h" />
<ClInclude Include="Event.h" /> <ClInclude Include="Event.h" />
<ClInclude Include="EvLaunch.h" />
<ClInclude Include="FadeSound.h" /> <ClInclude Include="FadeSound.h" />
<ClInclude Include="Float3d.h" /> <ClInclude Include="Float3d.h" />
<ClInclude Include="Gauge.h" /> <ClInclude Include="Gauge.h" />
@@ -167,7 +168,9 @@
<ClInclude Include="McZapkie\mover.h" /> <ClInclude Include="McZapkie\mover.h" />
<ClInclude Include="McZapkie\Oerlikon_ESt.h" /> <ClInclude Include="McZapkie\Oerlikon_ESt.h" />
<ClInclude Include="MdlMngr.h" /> <ClInclude Include="MdlMngr.h" />
<ClInclude Include="MemCell.h" />
<ClInclude Include="Model3d.h" /> <ClInclude Include="Model3d.h" />
<ClInclude Include="mtable.h" />
<ClInclude Include="Names.h" /> <ClInclude Include="Names.h" />
<ClInclude Include="opengl\arb_multisample.h" /> <ClInclude Include="opengl\arb_multisample.h" />
<ClInclude Include="opengl\glew.h" /> <ClInclude Include="opengl\glew.h" />
@@ -177,6 +180,7 @@
<ClInclude Include="python\include\Python.h" /> <ClInclude Include="python\include\Python.h" />
<ClInclude Include="RealSound.h" /> <ClInclude Include="RealSound.h" />
<ClInclude Include="resource.h" /> <ClInclude Include="resource.h" />
<ClInclude Include="ResourceManager.h" />
<ClInclude Include="Segment.h" /> <ClInclude Include="Segment.h" />
<ClInclude Include="sky.h" /> <ClInclude Include="sky.h" />
<ClInclude Include="Sound.h" /> <ClInclude Include="Sound.h" />
@@ -184,10 +188,16 @@
<ClInclude Include="stdafx.h" /> <ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" /> <ClInclude Include="targetver.h" />
<ClInclude Include="Texture.h" /> <ClInclude Include="Texture.h" />
<ClInclude Include="TextureDDS.h" />
<ClInclude Include="Timer.h" />
<ClInclude Include="Track.h" />
<ClInclude Include="Traction.h" />
<ClInclude Include="TractionPower.h" /> <ClInclude Include="TractionPower.h" />
<ClInclude Include="Train.h" /> <ClInclude Include="Train.h" />
<ClInclude Include="TrkFoll.h" />
<ClInclude Include="usefull.h" /> <ClInclude Include="usefull.h" />
<ClInclude Include="VBO.h" /> <ClInclude Include="VBO.h" />
<ClInclude Include="wavread.h" />
<ClInclude Include="World.h" /> <ClInclude Include="World.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -329,6 +329,39 @@
<ClInclude Include="opengl\wglew.h"> <ClInclude Include="opengl\wglew.h">
<Filter>Header Files\opengl</Filter> <Filter>Header Files\opengl</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="wavread.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Track.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="TrkFoll.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Traction.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Timer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="TextureDDS.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ResourceManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="mtable.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="MemCell.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="EvLaunch.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Driver.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Console\MWD.h"> <ClInclude Include="Console\MWD.h">
<Filter>Header Files\console</Filter> <Filter>Header Files\console</Filter>
</ClInclude> </ClInclude>

View File

@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LocalDebuggerWorkingDirectory>E:\Gry\MaSzyna_15_04\</LocalDebuggerWorkingDirectory> <LocalDebuggerCommand>T:\sources\Projects\maszyna\eu07++.exe</LocalDebuggerCommand>
<LocalDebuggerWorkingDirectory>..\..\Projects\maszyna</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LocalDebuggerCommand>T:\sources\Projects\maszyna\eu07++.exe</LocalDebuggerCommand> <LocalDebuggerCommand>T:\sources\Projects\maszyna\eu07++.exe</LocalDebuggerCommand>
<LocalDebuggerWorkingDirectory>..\..\Projects\maszyna</LocalDebuggerWorkingDirectory> <LocalDebuggerWorkingDirectory>..\..\Projects\maszyna</LocalDebuggerWorkingDirectory>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerEnvironment>_NO_DEBUG_HEAP=1</LocalDebuggerEnvironment>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

BIN
opengl/glew32s.lib Normal file

Binary file not shown.