diff --git a/Driver.cpp b/Driver.cpp index bcb60c0a..d74afb41 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -288,8 +288,10 @@ std::string TSpeedPos::GetName() { if (iFlags & spTrack) // jeśli tor return trTrack->NameGet(); - else if (iFlags & spEvent) // jeśli event + else if( iFlags & spEvent ) // jeśli event return evEvent->asName; + else + return ""; } std::string TSpeedPos::TableText() @@ -297,7 +299,7 @@ std::string TSpeedPos::TableText() if (iFlags & spEnabled) { // o ile pozycja istotna 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 // return "Flags=#" + IntToHex(iFlags, 8) + ", Dist=" + FloatToStrF(fDist, ffFixed, 7, 1) + // ", Vel=" + AnsiString(fVelNext) + ", Track=" + trTrack->NameGet(); diff --git a/DynObj.cpp b/DynObj.cpp index 0d509f7f..68d26851 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -541,9 +541,12 @@ void __inline TDynamicObject::ABuLittleUpdate(double ObjSqrDist) for (int i = 0; i < iAnimations; ++i) // wykonanie kolejnych animacji if (ObjSqrDist < pAnimations[i].fMaxDist) if (pAnimations[i].yUpdate) // jeśli zdefiniowana funkcja + pAnimations[ i ].yUpdate( &pAnimations[i] ); // aktualizacja animacji (położenia submodeli +/* pAnimations[i].yUpdate(pAnimations + 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 // te animacje wymagają bananów w modelach! @@ -1616,7 +1619,9 @@ TDynamicObject::TDynamicObject() iAnimType[ANIM_PANTS] = 0; // 5-pantografy (2) iAnimType[ANIM_STEAMS] = 0; // 6-tłoki (napęd parowozu) iAnimations = 0; // na razie nie ma żadnego +/* pAnimations = NULL; +*/ pAnimated = NULL; fShade = 0.0; // standardowe oświetlenie na starcie iHornWarning = 1; // numer syreny do użycia po otrzymaniu sygnału do jazdy @@ -1657,7 +1662,9 @@ TDynamicObject::~TDynamicObject() rsDiesielInc.Stop(); rscurve.Stop(); */ +/* delete[] pAnimations; // obiekty obsługujące animację +*/ delete[] pAnimated; // lista animowanych submodeli } @@ -4234,7 +4241,10 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, // asBaseDir=BaseDir; Global::asCurrentDynamicPath = BaseDir; 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; bool Stop_InternalData = false; @@ -4374,7 +4384,6 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, } } else - ReplacableSkinID[1] = TTexturesManager::GetTextureID( NULL, NULL, ReplacableSkin, Global::iDynamicFiltering); if (TTexturesManager::GetAlpha(ReplacableSkinID[1])) @@ -4411,8 +4420,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, // if (MoverParameters->LoadAccepted!=AnsiString("")); // && // MoverParameters->LoadType!=AnsiString("passengers")) if (MoverParameters->EnginePowerSource.SourceType == CurrentCollector) - { // wartość niby "pantstate" - nazwa dla - // formalności, ważna jest ilość + { // wartość niby "pantstate" - nazwa dla formalności, ważna jest ilość if (MoverParameters->Load == 1) MoverParameters->PantFront(true); 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 - 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 do { token = ""; parser.getTokens(); parser >> token; if( token == "animations:" ) { - // Ra: ustawienie ilości poszczególnych animacji - - // musi być jako pierwsze, inaczej ilości będą domyślne + // Ra: ustawienie ilości poszczególnych animacji - musi być jako pierwsze, inaczej ilości będą domyślne +/* 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; iAnimations = 0; do { // kolejne liczby to ilość animacj, -1 to znacznik końca parser.getTokens( 1, false ); - parser >> ile; // ilość danego typu - // animacji + parser >> ile; // ilość danego typu animacji // if (co==ANIM_PANTS) // if (!Global::bLoadTraction) - // if (!DebugModeFlag) //w debugmode pantografy mają "niby - // działać" + // if (!DebugModeFlag) //w debugmode pantografy mają "niby działać" // ile=0; //wyłączenie animacji pantografów if (co < ANIM_TYPES) if (ile >= 0) @@ -4477,15 +4488,16 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, while( co < ANIM_TYPES ) { iAnimType[ co++ ] = 0; // zerowanie pozostałych - } - + } parser.getTokens(); parser >> token; // NOTE: should this be here? seems at best superfluous } // WriteLog("Total animations: "+AnsiString(iAnimations)); } +/* 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 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 @@ -4495,29 +4507,29 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, iAnimType[ANIM_PANTS]=0; } */ +/* pAnimations = new TAnim[iAnimations]; +*/ + pAnimations.resize( iAnimations ); int i, j, k = 0, sm = 0; for (j = 0; j < ANIM_TYPES; ++j) for (i = 0; i < iAnimType[j]; ++i) { if (j == ANIM_PANTS) // zliczamy poprzednie animacje if (!pants) - if (iAnimType[ANIM_PANTS]) // o ile jakieś pantografy są (a - // domyślnie są) - pants = pAnimations + - k; // zapamiętanie na potrzeby wyszukania submodeli + if (iAnimType[ANIM_PANTS]) // o ile jakieś pantografy są (a domyślnie są) + 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 - sm += pAnimations[k++].TypeSet(j); // ustawienie typu animacji i - // zliczanie tablicowanych - // submodeli + sm += pAnimations[k++].TypeSet(j); // ustawienie typu animacji i zliczanie tablicowanych submodeli } if (sm) // o ile są bardziej złożone animacje { pAnimated = new TSubModel *[sm]; // tabela na animowane submodele for (k = 0; k < iAnimations; ++k) - pAnimations[k].smElement = - pAnimated + - pAnimations[k].iShift; // przydzielenie wskaźnika do tabelki + pAnimations[k].smElement = 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 Global::asCurrentTexturePath = BaseDir; // biezaca sciezka do tekstur to dynamic/... mdLowPolyInt = TModelsManager::GetModel(asModel, true); - // Global::asCurrentTexturePath=AnsiString(szTexturePath); //kiedyś - // uproszczone - // wnętrze mieszało tekstury nieba + // Global::asCurrentTexturePath=AnsiString(szTexturePath); //kiedyś uproszczone wnętrze mieszało tekstury nieba } 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 { // McZapkie-050402: wyszukiwanie kol o nazwie str* asAnimName = token + std::to_string(i + 1); - pAnimations[i].smAnimated = - mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu + pAnimations[i].smAnimated = mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu if (pAnimations[i].smAnimated) { //++iAnimatedAxles; - pAnimations[i].smAnimated->WillBeAnimated(); // wyłączenie optymalizacji - // transformu + pAnimations[i].smAnimated->WillBeAnimated(); // wyłączenie optymalizacji transformu /* pAnimations[i].yUpdate = UpdateAxle; // animacja osi */ pAnimations[ i ].yUpdate = std::bind( &TDynamicObject::UpdateAxle, this, std::placeholders::_1 ); - pAnimations[i].fMaxDist = - 50 * - MoverParameters->WheelDiameter; // nie kręcić w większej odległości - 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 + pAnimations[i].fMaxDist = 50 * MoverParameters->WheelDiameter; // nie kręcić w większej odległości + 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 - for (i = 0; i < iAnimType[ANIM_WHEELS]; - ++i) // ilość osi (zabezpieczenie przed błędami w CHK) - pAnimations[i].dWheelAngle = - dWheelAngle + 1; // domyślnie wskaźnik na napędzające + for (i = 0; i < iAnimType[ANIM_WHEELS]; ++i) // ilość osi (zabezpieczenie przed błędami w CHK) + pAnimations[i].dWheelAngle = dWheelAngle + 1; // domyślnie wskaźnik na napędzające i = 0; j = 1; k = 0; m = 0; // numer osi; kolejny znak; ile osi danego typu; która średnica if ((MoverParameters->WheelDiameterL != MoverParameters->WheelDiameter) || (MoverParameters->WheelDiameterT != MoverParameters->WheelDiameter)) - { // obsługa różnych średnic, o - // ile występują + { // obsługa różnych średnic, o ile występują while ((i < iAnimType[ANIM_WHEELS]) && (j <= MoverParameters->AxleArangement.length())) - { // wersja ze wskaźnikami jest - // bardziej elastyczna na nietypowe - // układy + { // wersja ze wskaźnikami jest bardziej elastyczna na nietypowe układy if ((k >= 'A') && (k <= 'J')) // 10 chyba maksimum? { 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:" ) { - // Ra: pantografy po - // nowemu mają literki - // i numerki + // Ra: pantografy po nowemu mają literki i numerki } // Pantografy - Winger 160204 if( token == "animpantrd1prefix:" ) { @@ -4634,8 +4628,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, TSubModel *sm; if (pants) for (int i = 0; i < iAnimType[ANIM_PANTS]; i++) - { // Winger 160204: wyszukiwanie max 2 patykow o nazwie - // str* + { // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* asAnimName = token + std::to_string(i + 1); sm = mdModel->GetFromName(asAnimName.c_str()); 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 sm->WillBeAnimated(); sm->ParentMatrix(&m); // pobranie macierzy transformacji - // m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie - // tak) + // m(3)[1]=m[3][1]+0.054; //w górę o wysokość ślizgu (na razie tak) if ((mdModel->Flags() & 0x8000) == 0) // jeśli wczytano z T3D - m.InitialRotate(); // może być potrzebny dodatkowy obrót, - // jeśli - // wczytano z T3D, tzn. przed wykonaniem - // Init() + m.InitialRotate(); // może być potrzebny dodatkowy obrót, jeśli wczytano z T3D, tzn. przed wykonaniem Init() pants[i].fParamPants->vPos.z = m[3][0]; // przesunięcie w bok (asymetria) pants[i].fParamPants->vPos.y = m[3][1]; // przesunięcie w górę odczytane z modelu if ((sm = pants[i].smElement[0]->ChildGet()) != NULL) - { // jeśli ma potomny, można policzyć długość - // (odległość potomnego - // od osi obrotu) - 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 + { // jeśli ma potomny, można policzyć długość (odległość potomnego od osi obrotu) + 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->fLenL1 = hypot(m[3][1], m[3][2]); // po osi OX nie potrzeba pants[i].fParamPants->fAngleL0 = atan2(fabs(m[3][2]), fabs(m[3][1])); // if (pants[i].fParamPants->fAngleL0fAngleL0+=M_PI; //gdyby w odwrotną - // stronę wyszło + // pants[i].fParamPants->fAngleL0+=M_PI; //gdyby w odwrotną stronę wyszło // if // ((pants[i].fParamPants->fAngleL0<0.03)||(pants[i].fParamPants->fAngleL0>0.09)) // //normalnie ok. 0.05 // pants[i].fParamPants->fAngleL0=pants[i].fParamPants->fAngleL; - pants[i].fParamPants->fAngleL = - pants[i].fParamPants->fAngleL0; // początkowy kąt dolnego + pants[i].fParamPants->fAngleL = pants[i].fParamPants->fAngleL0; // początkowy kąt dolnego // ramienia if ((sm = sm->ChildGet()) != NULL) - { // jeśli dalej jest - // ślizg, można policzyć - // długość górnego - // ramienia + { // jeśli dalej jest ślizg, można policzyć długość górnego ramienia m = float4x4(*sm->GetMatrix()); // wystarczyłby wskaźnik, - // nie trzeba kopiować - // trzeba by uwzględnić macierz dolnego ramienia, żeby - // uzyskać kąt do poziomu... - pants[i].fParamPants->fHoriz += - fabs(m(3)[1]); // różnica długości rzutów ramion na - // płaszczyznę podstawy (jedna dodatnia, - // druga ujemna) - 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 + // nie trzeba kopiować trzeba by uwzględnić macierz dolnego ramienia, żeby uzyskać kąt do poziomu... + pants[i].fParamPants->fHoriz += fabs(m(3)[1]); // różnica długości rzutów ramion na + // płaszczyznę podstawy (jedna dodatnia, druga ujemna) + 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->fAngleU0fAngleU0+=M_PI; //gdyby w odwrotną - // stronę wyszło + // pants[i].fParamPants->fAngleU0+=M_PI; //gdyby w odwrotną stronę wyszło // if (pants[i].fParamPants->fAngleU0<0) // pants[i].fParamPants->fAngleU0=-pants[i].fParamPants->fAngleU0; // if - // ((pants[i].fParamPants->fAngleU0<0.00)||(pants[i].fParamPants->fAngleU0>0.09)) - // //normalnie ok. 0.07 + // ((pants[i].fParamPants->fAngleU0<0.00)||(pants[i].fParamPants->fAngleU0>0.09)) //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->fAngleU = - 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 - sm->ParentMatrix(&m); // pobranie macierzy transformacji - // 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() + pants[i].fParamPants->fAngleU = 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 + sm->ParentMatrix(&m); // pobranie macierzy transformacji 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); - if (std::fabs(det - 1.0) < 0.001) // dopuszczamy 1 promil błędu - // na skalowaniu ślizgu + if (std::fabs(det - 1.0) < 0.001) // dopuszczamy 1 promil błędu na skalowaniu ślizgu { // skalowanie jest w normie, można pobrać wymiary z modelu pants[i].fParamPants->fHeight = - sm->MaxY(m); // przeliczenie maksimum wysokości - // wierzchołków względem macierzy + sm->MaxY(m); // przeliczenie maksimum wysokości wierzchołków względem macierzy pants[i].fParamPants->fHeight -= m[3][1]; // odjęcie wysokości pivota ślizgu pants[i].fParamPants->vPos.x = - m[3][2]; // przy okazji odczytać z modelu pozycję w - // długości + m[3][2]; // przy okazji odczytać z modelu pozycję w długości // ErrorLog("Model OK: "+asModel+", // height="+pants[i].fParamPants->fHeight); // 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 TSubModel *sm; if( pants ) { - for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie - // str* + for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { + // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* asAnimName = token + std::to_string( i + 1 ); sm = mdModel->GetFromName( asAnimName.c_str() ); pants[ i ].smElement[ 1 ] = sm; // jak NULL, to nie będzie animowany if( sm ) { // w EP09 wywalało się tu z powodu NULL sm->WillBeAnimated(); - if( pants[ i ].fParamPants->vPos.y == 0.0 ) { // jeśli pierwsze ramię nie ustawiło tej wartości, - // próbować drugim - //!!!! docelowo zrobić niezależną animację ramion z każdej - // strony + if( pants[ i ].fParamPants->vPos.y == 0.0 ) { + // jeśli pierwsze ramię nie ustawiło tej wartości, próbować drugim + //!!!! docelowo zrobić niezależną animację ramion z każdej strony m = float4x4( *sm->GetMatrix()); // skopiowanie, bo będziemy mnożyć m( 3 )[ 1 ] = @@ -4781,10 +4738,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, m = *sm->Parent->GetMatrix() * m; sm = sm->Parent; } - pants[ i ].fParamPants->vPos.z = - 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.z = m[3][0]; // przesunięcie w bok (asymetria) + pants[ i ].fParamPants->vPos.y = m[3][1]; // przesunięcie w górę odczytane z modelu } } else @@ -4798,8 +4753,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, // prefiks ramion górnych 1 parser.getTokens(); parser >> token; if( pants ) { - for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie - // str* + for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { + // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* asAnimName = token + std::to_string( i + 1 ); pants[ i ].smElement[ 2 ] = mdModel->GetFromName( asAnimName.c_str() ); pants[ i ].smElement[ 2 ]->WillBeAnimated(); @@ -4811,8 +4766,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, // prefiks ramion górnych 2 parser.getTokens(); parser >> token; if( pants ) { - for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie - // str* + for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { + // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* asAnimName = token + std::to_string( i + 1 ); pants[ i ].smElement[ 3 ] = mdModel->GetFromName( asAnimName.c_str() ); pants[ i ].smElement[ 3 ]->WillBeAnimated(); @@ -4824,8 +4779,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, // prefiks ślizgaczy parser.getTokens(); parser >> token; if( pants ) { - for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { // Winger 160204: wyszukiwanie max 2 patykow o nazwie - // str* + for( int i = 0; i < iAnimType[ ANIM_PANTS ]; i++ ) { + // Winger 160204: wyszukiwanie max 2 patykow o nazwie str* asAnimName = token + std::to_string( i + 1 ); pants[ i ].smElement[ 4 ] = mdModel->GetFromName( asAnimName.c_str() ); pants[ i ].smElement[ 4 ]->WillBeAnimated(); @@ -4866,12 +4821,8 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, // //wysokość początkowa // pants[i].fParamPants->PantWys=1.176289*sin(pants[i].fParamPants->fAngleL)+1.724482197*sin(pants[i].fParamPants->fAngleU); // //wysokość początkowa - if( pants[ i ].fParamPants->fHeight == 0.0 ) // gdy jest - // nieprawdopodobna - // wartość (np. nie - // znaleziony ślizg) - { // gdy pomiary modelu nie udały się, odczyt podanych parametrów - // z MMD + if( pants[ i ].fParamPants->fHeight == 0.0 ) // gdy jest nieprawdopodobna 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->fHeight = ( i & 1 ) ? pant2h : @@ -4963,8 +4914,7 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, parser.getTokens(); parser >> token; asAnimName = ""; for (int i = 1; i <= 4; i++) - { // McZapkie-050402: wyszukiwanie max 4 - // wahaczy o nazwie str* + { // McZapkie-050402: wyszukiwanie max 4 wahaczy o nazwie str* asAnimName = token + std::to_string(i); smWahacze[i - 1] = mdModel->GetFromName(asAnimName.c_str()); smWahacze[i - 1]->WillBeAnimated(); @@ -5006,13 +4956,9 @@ void TDynamicObject::LoadMMediaFile(std::string BaseDir, std::string TypeName, mdModel->GetFromName(asAnimName.c_str()); // ustalenie submodelu if (pAnimations[i + j].smAnimated) { //++iAnimatedDoors; - pAnimations[i + j].smAnimated->WillBeAnimated(); // wyłączenie - // optymalizacji - // transformu + pAnimations[i + j].smAnimated->WillBeAnimated(); // wyłączenie optymalizacji transformu switch (MoverParameters->DoorOpenMethod) - { // od razu zapinamy - // potrzebny typ - // animacji + { // od razu zapinamy potrzebny typ animacji case 1: /* pAnimations[i + j].yUpdate = UpdateDoorTranslate; */ 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].fSpeed = Random(150); // oryginalny koncept z DoorSpeedFactor pAnimations[i + j].fSpeed = (pAnimations[i + j].fSpeed + 100) / 100; - // Ra: te współczynniki są bez sensu, bo modyfikują wektor - // przesunięcia + // Ra: te współczynniki są bez sensu, bo modyfikują wektor przesunięcia } } } diff --git a/DynObj.h b/DynObj.h index 48e25b53..0f9f5d10 100644 --- a/DynObj.h +++ b/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 private: int iAnimations; // liczba obiektów animujących +/* TAnim *pAnimations; // obiekty animujące (zawierają wskaźnik do funkcji wykonującej animację) +*/ + std::vector pAnimations; TSubModel ** pAnimated; // lista animowanych submodeli (może być ich więcej niż obiektów animujących) double dWheelAngle[3]; // kąty obrotu kół: 0=przednie toczne, 1=napędzające i wiązary, 2=tylne diff --git a/Globals.cpp b/Globals.cpp index 413ad574..90d8a8b5 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -43,7 +43,9 @@ bool Global::detonatoryOK; // info o nowych detonatorach double Global::ABuDebug = 0; std::string Global::asSky = "1"; 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 +*/ double Global::fLuminance = 1.0; // jasność światła do automatycznego zapalania int Global::iReCompile = 0; // zwiększany, gdy trzeba odświeżyć siatki HWND Global::hWnd = NULL; // uchwyt okna diff --git a/Globals.h b/Globals.h index be2db597..70626200 100644 --- a/Globals.h +++ b/Globals.h @@ -236,7 +236,9 @@ class Global static int iFeedbackMode; // tryb pracy informacji zwrotnej static int iFeedbackPort; // dodatkowy adres dla informacji zwrotnych static double fOpenGL; // wersja OpenGL - przyda się +/* static bool bOpenGL_1_5; // czy są dostępne funkcje OpenGL 1.5 +*/ static double fLuminance; // jasność światła do automatycznego zapalania static int iMultiplayer; // blokada działania niektórych eventów na rzecz kominikacji static HWND hWnd; // uchwyt okna diff --git a/Ground.cpp b/Ground.cpp index 456ca379..4e8b8fb6 100644 --- a/Ground.cpp +++ b/Ground.cpp @@ -1005,8 +1005,8 @@ void TSubRect::RaAnimate() return; // nie ma nic do animowania if (Global::bUseVBO) { // odświeżenie VBO sektora - if (Global::bOpenGL_1_5) // modyfikacje VBO są dostępne od OpenGL 1.5 - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices); + if (true == GLEW_VERSION_1_5) // modyfikacje VBO są dostępne od OpenGL 1.5 + glBindBuffer(GL_ARRAY_BUFFER, m_nVBOVertices); 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 } @@ -1295,7 +1295,10 @@ void TGround::MoveGroundNode(vector3 pPosition) */ } +std::vector TempVerts; +/* TGroundVertex TempVerts[ 10000 ]; // tu wczytywane s¹ trójk¹ty +*/ BYTE TempConnectionType[ 200 ]; // Ra: sprzêgi w sk³adzie; ujemne, gdy odwrotnie TGround::TGround() @@ -1315,7 +1318,9 @@ TGround::TGround() nRootOfType[i] = NULL; // zerowanie tablic wyszukiwania bDynamicRemove = false; // na razie nic do usunięcia sTracks = new TNames(); // nazwy torów - na razie tak +/* ::SecureZeroMemory( TempVerts, sizeof( TempVerts ) ); +*/ ::SecureZeroMemory( TempConnectionType, sizeof( TempConnectionType ) ); } @@ -2071,17 +2076,35 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) } else { +/* i = 0; +*/ + TempVerts.clear(); + TGroundVertex vertex; do { +/* if (i < 9999) // 3333 trójkąty { // liczba wierzchołków nie jest nieograniczona +*/ +/* parser->getTokens(3); *parser >> TempVerts[i].Point.x >> TempVerts[i].Point.y >> TempVerts[i].Point.z; parser->getTokens(3); *parser >> TempVerts[i].Normal.x >> TempVerts[i].Normal.y >> 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(); if (str==AnsiString("x")) TempVerts[i].tu=(TempVerts[i].Point.x+Parser->GetNextSymbol().ToDouble())/Parser->GetNextSymbol().ToDouble(); @@ -2106,14 +2129,15 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) else TempVerts[i].tv=str.ToDouble();; */ +/* parser->getTokens(2); *parser >> TempVerts[i].tu >> TempVerts[i].tv; - +*/ // tf=Parser->GetNextSymbol().ToDouble(); // TempVerts[i].tu=tf; // tf=Parser->GetNextSymbol().ToDouble(); // TempVerts[i].tv=tf; - +/* TempVerts[i].Point.RotateZ(aRotate.z / 180 * M_PI); TempVerts[i].Point.RotateX(aRotate.x / 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].Point += pOrigin; 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) ErrorLog("Bad triangles: too many verices"); i++; +*/ parser->getTokens(); *parser >> token; // } } while (token.compare("endtri") != 0); +/* nv = i; +*/ + nv = TempVerts.size(); tmp->Init(nv); // utworzenie tablicy wierzchołków tmp->pCenter /= (nv > 0 ? nv : 1); @@ -2154,40 +2194,56 @@ TGroundNode * TGround::AddGroundNode(cParser *parser) break; case GL_LINES: case GL_LINE_STRIP: - case GL_LINE_LOOP: - parser->getTokens(3); - *parser >> tmp->Diffuse[0] >> tmp->Diffuse[1] >> tmp->Diffuse[2]; - // tmp->Diffuse[0]=Parser->GetNextSymbol().ToDouble()/255; - // tmp->Diffuse[1]=Parser->GetNextSymbol().ToDouble()/255; - // tmp->Diffuse[2]=Parser->GetNextSymbol().ToDouble()/255; - parser->getTokens(); - *parser >> tmp->fLineThickness; - i = 0; - parser->getTokens(); - *parser >> token; - do - { - str = token; - TempVerts[i].Point.x = atof(str.c_str()); - parser->getTokens(2); - *parser >> TempVerts[i].Point.y >> TempVerts[i].Point.z; - TempVerts[i].Point.RotateZ(aRotate.z / 180 * M_PI); - TempVerts[i].Point.RotateX(aRotate.x / 180 * M_PI); - TempVerts[i].Point.RotateY(aRotate.y / 180 * M_PI); - TempVerts[i].Point += pOrigin; - tmp->pCenter += TempVerts[i].Point; - i++; + case GL_LINE_LOOP: { + parser->getTokens( 3 ); + *parser >> tmp->Diffuse[ 0 ] >> tmp->Diffuse[ 1 ] >> tmp->Diffuse[ 2 ]; + // tmp->Diffuse[0]=Parser->GetNextSymbol().ToDouble()/255; + // tmp->Diffuse[1]=Parser->GetNextSymbol().ToDouble()/255; + // tmp->Diffuse[2]=Parser->GetNextSymbol().ToDouble()/255; + parser->getTokens(); + *parser >> tmp->fLineThickness; + TempVerts.clear(); + TGroundVertex vertex; + i = 0; parser->getTokens(); *parser >> token; - } while (token.compare("endline") != 0); - nv = i; - // tmp->Init(nv); - tmp->Points = new vector3[nv]; - tmp->iNumPts = nv; - tmp->pCenter /= (nv > 0 ? nv : 1); - for (int i = 0; i < nv; i++) - tmp->Points[i] = TempVerts[i].Point; - break; + do { + str = token; +/* + TempVerts[ i ].Point.x = atof( str.c_str() ); + parser->getTokens( 2 ); + *parser >> TempVerts[ i ].Point.y >> TempVerts[ i ].Point.z; + TempVerts[ i ].Point.RotateZ( aRotate.z / 180 * M_PI ); + TempVerts[ i ].Point.RotateX( aRotate.x / 180 * M_PI ); + TempVerts[ i ].Point.RotateY( aRotate.y / 180 * M_PI ); + TempVerts[ i ].Point += pOrigin; + 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 >> token; + } while( token.compare( "endline" ) != 0 ); + nv = i; + // tmp->Init(nv); + tmp->Points = new vector3[ nv ]; + tmp->iNumPts = nv; + tmp->pCenter /= ( nv > 0 ? nv : 1 ); + for( int i = 0; i < nv; i++ ) + tmp->Points[ i ] = TempVerts[ i ].Point; + break; + } } return tmp; } @@ -2314,7 +2370,7 @@ void TGround::FirstInit() WriteLog("InitLaunchers OK"); WriteLog("InitGlobalTime"); // ABu 160205: juz nie TODO :) - GlobalTime = std::make_shared( hh, mm, srh, srm, ssh, ssm ); // McZapkie-300302: inicjacja czasu rozkladowego - TODO: czytac z trasy! + Mtable::GlobalTime = std::make_shared( hh, mm, srh, srm, ssh, ssm ); // McZapkie-300302: inicjacja czasu rozkladowego - TODO: czytac z trasy! WriteLog("InitGlobalTime OK"); // jeszcze ustawienie pogody, gdyby nie było w scenerii wpisów glClearColor(Global::AtmoColor[0], Global::AtmoColor[1], Global::AtmoColor[2], diff --git a/McZapkie/MOVER.h b/McZapkie/MOVER.h index 8b6ad6be..d9a591f0 100644 --- a/McZapkie/MOVER.h +++ b/McZapkie/MOVER.h @@ -477,21 +477,12 @@ struct TPowerParameters /*dla lokomotyw elektrycznych:*/ struct TScheme { - int Relay; /*numer pozycji rozruchu samoczynnego*/ - double R; /*opornik rozruchowy*/ /*dla dizla napelnienie*/ - int Bn; - int Mn; /*ilosc galezi i silnikow w galezi*/ /*dla dizla Mn: czy luz czy nie*/ - bool AutoSwitch; /*czy dana pozycja nastawniana jest recznie czy autom.*/ - int ScndAct; /*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; - } + int Relay = 0; /*numer pozycji rozruchu samoczynnego*/ + double R = 0.0; /*opornik rozruchowy*/ /*dla dizla napelnienie*/ + int Bn = 0; + int Mn = 0; /*ilosc galezi i silnikow w galezi*/ /*dla dizla Mn: czy luz czy nie*/ + bool AutoSwitch = false; /*czy dana pozycja nastawniana jest recznie czy autom.*/ + int ScndAct = 0; /*jesli ma bocznik w nastawniku, to ktory bocznik na ktorej pozycji*/ }; typedef TScheme TSchemeTable[ResArraySize + 1]; /*tablica rezystorow rozr.*/ struct TDEScheme diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 8bcf08ee..1eafd31f 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -7011,6 +7011,7 @@ bool TMoverParameters::LoadFIZ(std::string chkpath) else if (aType == "182") TrainType = dt_181; // na razie tak + LoadAccepted = ToLower( bLoadAccepted ); MaxLoad = bMaxLoad; LoadQuantity = bLoadQ; OverLoadFactor = bOverLoadFactor; @@ -8019,25 +8020,30 @@ bool TMoverParameters::SetInternalCommand(std::string NewCommand, double NewValu // Q: 20160714 // 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; 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: problem jest również, jeśli AI będzie na końcu składu - OK = (dir != 0); // and Mains; - 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 (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)) - OK = (Couplers[d].Connected->RunInternalCommand() && OK); // tu jest rekurencja + OK = ( dir != 0 ); // and Mains; + 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( ( 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 ) ) + 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; } diff --git a/McZapkie/hamulce.cpp b/McZapkie/hamulce.cpp index 90a00b02..f83e8633 100644 --- a/McZapkie/hamulce.cpp +++ b/McZapkie/hamulce.cpp @@ -378,7 +378,7 @@ bool TBrake::SetBDF(int nBDF) void TBrake::Releaser(int state) { - BrakeStatus = (BrakeStatus & 247) || state * b_rls; + BrakeStatus = (BrakeStatus & 247) | ( state * b_rls ); } void TBrake::SetEPS(double nEPS) @@ -387,7 +387,7 @@ void TBrake::SetEPS(double nEPS) void TBrake::ASB(int state) { // 255-b_asb(32) - BrakeStatus = (BrakeStatus & 223) || state * b_asb; + BrakeStatus = (BrakeStatus & 223) | ( state * b_asb ); } int TBrake::GetStatus() diff --git a/PyInt.h b/PyInt.h index eb44a58a..9db84b7b 100644 --- a/PyInt.h +++ b/PyInt.h @@ -34,7 +34,7 @@ class TPythonInterpreter static TPythonInterpreter *_instance; int _screenRendererPriority; // std::set _classes; - std::set _classes; + std::set _classes; PyObject *_main; PyObject *_stdErr; // FILE *_getFile(const char *lookupPath, const char *className); diff --git a/Track.cpp b/Track.cpp index 8cea4c82..3b19869d 100644 --- a/Track.cpp +++ b/Track.cpp @@ -2861,7 +2861,7 @@ TTrack * TTrack::RaAnimate() } if (Global::bUseVBO) { // 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 { // iglice liczone tylko dla zwrotnic vector6 rpts3[24], rpts4[24]; @@ -2965,7 +2965,7 @@ TTrack * TTrack::RaAnimate() if (Global::bUseVBO) { // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment // 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 = RaArrayPrepare(); // wielkość tabeli potrzebna dla tej obrotnicy diff --git a/VBO.cpp b/VBO.cpp index dc43b318..07e8dc01 100644 --- a/VBO.cpp +++ b/VBO.cpp @@ -34,10 +34,9 @@ void CMesh::MakeArray(int n) void CMesh::BuildVBOs(bool del) { // tworzenie VBO i kasowanie już niepotrzebnych tablic // pobierz numer VBO oraz ustaw go jako aktywny - glGenBuffersARB(1, &m_nVBOVertices); // pobierz numer - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices); // ustaw bufor jako aktualny - glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_nVertexCount * sizeof(CVertNormTex), m_pVNT, - GL_STATIC_DRAW_ARB); + glGenBuffers(1, &m_nVBOVertices); // pobierz numer + glBindBuffer(GL_ARRAY_BUFFER, m_nVBOVertices); // ustaw bufor jako aktualny + glBufferData(GL_ARRAY_BUFFER, m_nVertexCount * sizeof(CVertNormTex), m_pVNT, GL_STATIC_DRAW); // WriteLog("Assigned VBO number "+AnsiString(m_nVBOVertices)+", vertices: // "+AnsiString(m_nVertexCount)); if (del) @@ -49,7 +48,7 @@ void CMesh::Clear() // inna nazwa, żeby nie mieszało się z funkcją wirtualną sprzątacza 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)); } m_nVBOVertices = 0; @@ -66,7 +65,7 @@ bool CMesh::StartVBO() glEnableClientState(GL_TEXTURE_COORD_ARRAY); 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(nullptr) ); // pozycje glNormalPointer( GL_FLOAT, sizeof( CVertNormTex ), static_cast( nullptr ) + 12 ); // normalne glTexCoordPointer( 2, GL_FLOAT, sizeof( CVertNormTex ), static_cast( nullptr ) + 24 ); // wierzchołki @@ -82,7 +81,7 @@ bool CMesh::StartColorVBO() glEnableClientState(GL_COLOR_ARRAY); if (m_nVBOVertices) { - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices); + glBindBuffer(GL_ARRAY_BUFFER, m_nVBOVertices); glVertexPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast( nullptr ) ); // pozycje // glColorPointer(3,GL_UNSIGNED_BYTE,sizeof(CVertNormTex),((char*)NULL)+12); //kolory glColorPointer( 3, GL_FLOAT, sizeof( CVertNormTex ), static_cast( nullptr ) + 12 ); // kolory @@ -97,6 +96,6 @@ void CMesh::EndVBO() glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_COLOR_ARRAY); // glBindBuffer(GL_ARRAY_BUFFER,0); //takie coś psuje, mimo iż polecali użyć - glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); // Ra: to na przyszłość + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // Ra: to na przyszłość }; diff --git a/World.cpp b/World.cpp index 8be33d74..e4d25752 100644 --- a/World.cpp +++ b/World.cpp @@ -215,13 +215,14 @@ bool TWorld::Init(HWND NhWnd, HDC hDC) if (ogl < Global::fOpenGL) // a karta oferuje niższą wersję niż wpisana 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 +/* Global::bOpenGL_1_5 = (Global::fOpenGL >= 1.5); // są fragmentaryczne animacje VBO - +*/ WriteLog("Supported 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 { // 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 { 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 WriteLog("DDS textures are not supported."); else // brak obsługi DDS - trzeba włączyć programową dekompresję