maintenance: removed deprecated code from memcells, tracks, events

This commit is contained in:
tmj-fstate
2017-03-23 16:47:29 +01:00
parent 2c76a4418e
commit 89a9a18428
18 changed files with 96 additions and 934 deletions

View File

@@ -36,9 +36,6 @@ class TMtableTime; // czas dla danego posterunku
};
class TController; // obiekt sterujący pociągiem (AI)
#ifdef EU07_USE_OLD_TNAMES_CLASS
class TNames; // obiekt sortujący nazwy
#endif
typedef enum
{ // binarne odpowiedniki komend w komórce pamięci

View File

@@ -87,7 +87,7 @@ const double HardAcceleration = 0.9;
const double PrepareTime = 2.0; //[s] przebłyski świadomości przy odpalaniu
bool WriteLogFlag = false;
string StopReasonTable[] = {
std::string StopReasonTable[] = {
// przyczyny zatrzymania ruchu AI
"", // stopNone, //nie ma powodu - powinien jechać
"Off", // stopSleep, //nie został odpalony, to nie pojedzie
@@ -240,23 +240,15 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
// głównej drogi - chyba że jest równorzędne...
fVelNext = 30.0; // uzależnić prędkość od promienia; albo niech będzie
// ograniczona w skrzyżowaniu (velocity z ujemną wartością)
if ((iFlags & spElapsed) == 0) // jeśli nie wjechał
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (trTrack->iNumDynamics > 0) // a skrzyżowanie zawiera pojazd
{
if (Global::iWriteLogEnabled & 8)
WriteLog("Tor " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + std::to_string(trTrack->iNumDynamics) + "Dist= " + std::to_string(fDist));
fVelNext =
0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto)
}
#else
if( ( iFlags & spElapsed ) == 0 ) {
// jeśli nie wjechał
if( false == trTrack->Dynamics.empty() ) {
if( Global::iWriteLogEnabled & 8 ) {
WriteLog( "Tor " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + std::to_string( trTrack->Dynamics.size() ) + "Dist= " + std::to_string( fDist ) );
fVelNext = 0.0; // to zabronić wjazdu (chyba że ten z przodu też jedzie prosto)
}
}
#endif
}
}
if (iFlags & spSwitch) // jeśli odcinek zmienny
{
@@ -271,19 +263,6 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
// na Mydelniczce potrafi skanować na wprost mimo pojechania na bok
}
// poniższe nie dotyczy trybu łączenia?
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if ((iFlags & spElapsed) ? false :
trTrack->iNumDynamics >
0) // jeśli jeszcze nie wjechano na tor, a coś na nim jest
{
if (Global::iWriteLogEnabled & 8)
WriteLog("Rozjazd " + trTrack->NameGet() + " zajety przed pojazdem. Num=" + std::to_string(trTrack->iNumDynamics) + "Dist= "+std::to_string(fDist));
//fDist -= 30.0;
fVelNext = 0.0; // to niech stanie w zwiększonej odległości
// else if (fVelNext==0.0) //jeśli została wyzerowana
// fVelNext=trTrack->VelocityGet(); //odczyt prędkości
}
#else
if( ( ( iFlags & spElapsed ) == 0 )
&& ( false == trTrack->Dynamics.empty() ) ) {
// jeśli jeszcze nie wjechano na tor, a coś na nim jest
@@ -292,7 +271,6 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
}
fVelNext = 0.0; // to niech stanie w zwiększonej odległości
}
#endif
}
}
}
@@ -1504,10 +1482,10 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
if( WriteLogFlag ) {
mkdir( "physicslog\\" );
LogFile.open( string( "physicslog\\" + VehicleName + ".dat" ).c_str(),
LogFile.open( std::string( "physicslog\\" + VehicleName + ".dat" ).c_str(),
std::ios::in | std::ios::out | std::ios::trunc );
#if LOGPRESS == 0
LogFile << string( " Time [s] Velocity [m/s] Acceleration [m/ss] Coupler.Dist[m] "
LogFile << std::string( " Time [s] Velocity [m/s] Acceleration [m/ss] Coupler.Dist[m] "
"Coupler.Force[N] TractionForce [kN] FrictionForce [kN] "
"BrakeForce [kN] BrakePress [MPa] PipePress [MPa] "
"MotorCurrent [A] MCP SCP BCP LBP DmgFlag Command CVal1 CVal2" )
@@ -1698,7 +1676,7 @@ void TController::AutoRewident()
ustaw = 16 + bdelay_R; // lokomotywa luzem (może być wieloczłonowa)
else
{ // jeśli są wagony
ustaw = (g < min(4, r + p) ? 16 : 0);
ustaw = (g < std::min(4, r + p) ? 16 : 0);
if (ustaw) // jeśli towarowe < Min(4, pospieszne+osobowe)
{ // to skład pasażerski - nastawianie pasażerskiego
ustaw += (g && (r < g + p)) ? bdelay_P : bdelay_R;
@@ -4927,7 +4905,7 @@ void TController::OrdersInit(double fVel)
// Ale mozna by je zapodac ze scenerii
};
string TController::StopReasonText()
std::string TController::StopReasonText()
{ // informacja tekstowa o przyczynie zatrzymania
if (eStopReason != 7) // zawalidroga będzie inaczej
return StopReasonTable[eStopReason];
@@ -4952,15 +4930,6 @@ double TController::Distance(vector3 &p1,vector3 &n,vector3 &p2)
bool TController::BackwardTrackBusy(TTrack *Track)
{ // najpierw sprawdzamy, czy na danym torze są pojazdy z innego składu
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (Track->iNumDynamics)
{ // jeśli tylko z własnego składu, to tor jest wolny
for (int i = 0; i < Track->iNumDynamics; ++i)
if (Track->Dynamics[i]->ctOwner != this) // jeśli jest jakiś cudzy
return true; // to tor jest zajęty i skanowanie nie obowiązuje
}
return false; // wolny
#else
if( false == Track->Dynamics.empty() ) {
for( auto dynamic : Track->Dynamics ) {
if( dynamic->ctOwner != this ) {
@@ -4970,7 +4939,6 @@ bool TController::BackwardTrackBusy(TTrack *Track)
}
}
return false; // wolny
#endif
};
TEvent * TController::CheckTrackEventBackward(double fDirection, TTrack *Track)
@@ -5435,5 +5403,5 @@ void TController::RouteSwitch(int d)
};
std::string TController::OwnerName()
{
return pVehicle ? pVehicle->MoverParameters->Name : string("none");
return ( pVehicle ? pVehicle->MoverParameters->Name : "none" );
};

View File

@@ -950,69 +950,15 @@ double ABuAcos(const vector3 &calc_temp)
return atan2(-calc_temp.x, calc_temp.z); // Ra: tak prościej
}
TDynamicObject * TDynamicObject::ABuFindNearestObject(TTrack *Track,
TDynamicObject *MyPointer,
int &CouplNr)
{ // zwraca wskaznik do obiektu znajdujacego sie na torze
// (Track), którego sprzęg jest najblizszy
// kamerze
TDynamicObject * TDynamicObject::ABuFindNearestObject(TTrack *Track, TDynamicObject *MyPointer, int &CouplNr)
{
// zwraca wskaznik do obiektu znajdujacego sie na torze (Track), którego sprzęg jest najblizszy kamerze
// służy np. do łączenia i rozpinania sprzęgów
// WE: Track - tor, na ktorym odbywa sie poszukiwanie
// MyPointer - wskaznik do obiektu szukajacego
// WY: CouplNr - który sprzęg znalezionego obiektu jest bliższy kamerze
// Uwaga! Jesli CouplNr==-2 to szukamy njblizszego obiektu, a nie sprzegu!!!
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if ((Track->iNumDynamics) > 0)
{ // o ile w ogóle jest co przeglądać na tym torze
// vector3 poz; //pozycja pojazdu XYZ w scenerii
// vector3 kon; //wektor czoła względem środka pojazdu wzglęem początku toru
vector3 tmp; // wektor pomiędzy kamerą i sprzęgiem
double dist; // odległość
for (int i = 0; i < Track->iNumDynamics; i++)
{
if (CouplNr == -2)
{ // wektor [kamera-obiekt] - poszukiwanie obiektu
tmp = Global::GetCameraPosition() - Track->Dynamics[i]->vPosition;
dist = tmp.x * tmp.x + tmp.y * tmp.y + tmp.z * tmp.z; // odległość do kwadratu
if (dist < 100.0) // 10 metrów
return Track->Dynamics[i];
}
else // jeśli (CouplNr) inne niz -2, szukamy sprzęgu
{ // wektor [kamera-sprzeg0], potem [kamera-sprzeg1]
// Powinno byc wyliczone, ale nie zaszkodzi drugi raz:
//(bo co, jesli nie wykonuje sie obrotow wozkow?) - Ra: ale zawsze są
// liczone
// współrzędne sprzęgów
// Track->Dynamics[i]->modelRot.z=ABuAcos(Track->Dynamics[i]->Axle0.pPosition-Track->Dynamics[i]->Axle1.pPosition);
// poz=Track->Dynamics[i]->vPosition; //pozycja środka pojazdu
// kon=vector3( //położenie przodu względem środka
// -((0.5*Track->Dynamics[i]->MoverParameters->Dim.L)*sin(Track->Dynamics[i]->modelRot.z)),
// 0, //yyy... jeśli duże pochylenie i długi pojazd, to może być problem
// +((0.5*Track->Dynamics[i]->MoverParameters->Dim.L)*cos(Track->Dynamics[i]->modelRot.z))
//);
tmp =
Global::GetCameraPosition() -
Track->Dynamics[i]->vCoulpler[0]; // Ra: pozycje sprzęgów też są zawsze liczone
dist = tmp.x * tmp.x + tmp.y * tmp.y + tmp.z * tmp.z; // odległość do kwadratu
if (dist < 25.0) // 5 metrów
{
CouplNr = 0;
return Track->Dynamics[i];
}
tmp = Global::GetCameraPosition() - Track->Dynamics[i]->vCoulpler[1];
dist = tmp.x * tmp.x + tmp.y * tmp.y + tmp.z * tmp.z; // odległość do kwadratu
if (dist < 25.0) // 5 metrów
{
CouplNr = 1;
return Track->Dynamics[i];
}
}
}
return NULL;
}
#else
for( auto dynamic : Track->Dynamics ) {
if( CouplNr == -2 ) {
@@ -1038,7 +984,6 @@ TDynamicObject * TDynamicObject::ABuFindNearestObject(TTrack *Track,
}
// empty track or nothing found
return nullptr;
#endif
}
TDynamicObject * TDynamicObject::ABuScanNearestObject(TTrack *Track, double ScanDir,
@@ -1160,21 +1105,13 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir,
// WY: wskaznik do znalezionego obiektu.
// CouplFound - nr sprzegu znalezionego obiektu
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (Track->iNumDynamics > 0)
#else
if( false == Track->Dynamics.empty() )
#endif
{ // sens szukania na tym torze jest tylko, gdy są na nim pojazdy
double MyTranslation; // pozycja szukającego na torze
double MinDist = Track->Length(); // najmniejsza znaleziona odleglość
// (zaczynamy od długości toru)
double TestDist; // robocza odległość od kolejnych pojazdów na danym odcinku
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
int iMinDist = -1; // indeks wykrytego obiektu
#else
TDynamicObject *collider = nullptr;
#endif
// if (Track->iNumDynamics>1)
// iMinDist+=0; //tymczasowo pułapka
if (MyTrack == Track) // gdy szukanie na tym samym torze
@@ -1186,54 +1123,6 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir,
MyTranslation = MinDist; // szukanie w kierunku Point1 (do zera) - jesteśmy w Point2
if (ScanDir >= 0)
{ // jeśli szukanie w kierunku Point2
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( int i = 0; i < Track->iNumDynamics; i++ )
{ // pętla po pojazdach
if (Track->Dynamics[i] != this) // szukający się nie liczy
{
TestDist = (Track->Dynamics[i]->RaTranslationGet()) -
MyTranslation; // odległogłość tamtego od szukającego
if ((TestDist > 0) && (TestDist <= MinDist))
{ // gdy jest po właściwej stronie i bliżej
// niż jakiś wcześniejszy
CouplFound = (Track->Dynamics[i]->RaDirectionGet() > 0) ?
1 :
0; // to, bo (ScanDir>=0)
if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy
{ // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po
// jednej
// szynie i się mija
// Ra: mijanie samochodów wcale nie jest proste
// Przesuniecie wzgledne pojazdow. Wyznaczane, zeby sprawdzic,
// czy pojazdy faktycznie sie zderzaja (moga byc przesuniete
// w/m siebie tak, ze nie zachodza na siebie i wtedy sie mijaja).
double RelOffsetH; // wzajemna odległość poprzeczna
if (CouplFound) // my na tym torze byśmy byli w kierunku Point2
// dla CouplFound=1 są zwroty zgodne - istotna różnica
// przesunięć
RelOffsetH = (MoverParameters->OffsetTrackH -
Track->Dynamics[i]->MoverParameters->OffsetTrackH);
else
// dla CouplFound=0 są zwroty przeciwne - przesunięcia sumują
// się
RelOffsetH = (MoverParameters->OffsetTrackH +
Track->Dynamics[i]->MoverParameters->OffsetTrackH);
if (RelOffsetH < 0)
RelOffsetH = -RelOffsetH;
if (RelOffsetH + RelOffsetH >
MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W)
continue; // odległość większa od połowy sumy szerokości -
// kolizji
// nie będzie
// jeśli zahaczenie jest niewielkie, a jest miejsce na poboczu, to
// zjechać na pobocze
}
iMinDist = i; // potencjalna kolizja
MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów
}
}
}
#else
for( auto dynamic : Track->Dynamics ) {
// pętla po pojazdach
if( dynamic == this ) {
@@ -1277,56 +1166,9 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir,
}
}
#endif
}
else //(ScanDir<0)
{
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( int i = 0; i < Track->iNumDynamics; i++ )
{
if (Track->Dynamics[i] != this)
{
TestDist = MyTranslation -
(Track->Dynamics[i]->RaTranslationGet()); //???-przesunięcie wózka
// względem Point1 toru
if ((TestDist > 0) && (TestDist < MinDist))
{
CouplFound = (Track->Dynamics[i]->RaDirectionGet() > 0) ?
0 :
1; // odwrotnie, bo (ScanDir<0)
if (Track->iCategoryFlag & 254) // trajektoria innego typu niż tor kolejowy
{ // dla torów nie ma sensu tego sprawdzać, rzadko co jedzie po
// jednej
// szynie i się mija
// Ra: mijanie samochodów wcale nie jest proste
// Przesunięcie względne pojazdów. Wyznaczane, żeby sprawdzić,
// czy pojazdy faktycznie się zderzają (mogą być przesunięte
// w/m siebie tak, że nie zachodzą na siebie i wtedy sie mijają).
double RelOffsetH; // wzajemna odległość poprzeczna
if (CouplFound) // my na tym torze byśmy byli w kierunku Point1
// dla CouplFound=1 są zwroty zgodne - istotna różnica
// przesunięć
RelOffsetH = (MoverParameters->OffsetTrackH -
Track->Dynamics[i]->MoverParameters->OffsetTrackH);
else
// dla CouplFound=0 są zwroty przeciwne - przesunięcia sumują
// się
RelOffsetH = (MoverParameters->OffsetTrackH +
Track->Dynamics[i]->MoverParameters->OffsetTrackH);
if (RelOffsetH < 0)
RelOffsetH = -RelOffsetH;
if (RelOffsetH + RelOffsetH >
MoverParameters->Dim.W + Track->Dynamics[i]->MoverParameters->Dim.W)
continue; // odległość większa od połowy sumy szerokości -
// kolizji
// nie będzie
}
iMinDist = i; // potencjalna kolizja
MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów
}
}
}
#else
for( auto dynamic : Track->Dynamics ) {
if( dynamic == this ) { continue; }
@@ -1362,14 +1204,9 @@ TDynamicObject * TDynamicObject::ABuFindObject(TTrack *Track, int ScanDir,
MinDist = TestDist; // odleglość pomiędzy aktywnymi osiami pojazdów
}
}
#endif
}
dist += MinDist; // doliczenie odległości przeszkody albo długości odcinka do przeskanowanej odległości
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
return ( iMinDist >= 0 ) ? Track->Dynamics[ iMinDist ] : NULL;
#else
return collider;
#endif
}
dist += Track->Length(); // doliczenie długości odcinka do przeskanowanej
// odległości

View File

@@ -36,21 +36,13 @@ TEventLauncher::TEventLauncher()
DeltaTime = -1;
UpdatedTime = 0;
fVal1 = fVal2 = 0;
#ifdef EU07_USE_OLD_TEVENTLAUNCHER_TEXT_ARRAY
szText = NULL;
#endif
iHour = iMinute = -1; // takiego czasu nigdy nie będzie
dRadius = 0;
Event1 = Event2 = NULL;
MemCell = NULL;
iCheckMask = 0;
}
#ifdef EU07_USE_OLD_TEVENTLAUNCHER_TEXT_ARRAY
TEventLauncher::~TEventLauncher()
{
SafeDeleteArray(szText);
}
#endif
void TEventLauncher::Init()
{
}
@@ -126,13 +118,7 @@ bool TEventLauncher::Load(cParser *parser)
asMemCellName = token;
parser->getTokens();
*parser >> token;
#ifdef EU07_USE_OLD_TEVENTLAUNCHER_TEXT_ARRAY
SafeDeleteArray(szText);
szText = new char[256];
strcpy(szText, token.c_str());
#else
szText = token;
#endif
if (token != "*") //*=nie brać command pod uwagę
iCheckMask |= conditional_memstring;
parser->getTokens();

View File

@@ -7,8 +7,7 @@ obtain one at
http://mozilla.org/MPL/2.0/.
*/
#ifndef EvLaunchH
#define EvLaunchH
#pragma once
#include <string>
#include "Classes.h"
@@ -21,11 +20,7 @@ class TEventLauncher
double UpdatedTime;
double fVal1;
double fVal2;
#ifdef EU07_USE_OLD_TEVENTLAUNCHER_TEXT_ARRAY
char * szText;
#else
std::string szText;
#endif
int iHour, iMinute; // minuta uruchomienia
public:
double dRadius;
@@ -37,9 +32,6 @@ class TEventLauncher
TMemCell *MemCell;
int iCheckMask;
TEventLauncher();
#ifdef EU07_USE_OLD_TEVENTLAUNCHER_TEXT_ARRAY
~TEventLauncher();
#endif
void Init();
bool Load(cParser *parser);
bool Render();
@@ -47,4 +39,3 @@ class TEventLauncher
};
//---------------------------------------------------------------------------
#endif

View File

@@ -70,7 +70,7 @@ void TEvent::Init(){
};
void TEvent::Conditions(cParser *parser, string s)
void TEvent::Conditions(cParser *parser, std::string s)
{ // przetwarzanie warunków, wspólne dla Multiple i UpdateValues
if (s == "condition")
{ // jesli nie "endevent"
@@ -623,14 +623,14 @@ void TEvent::AddToQuery(TEvent *e)
//---------------------------------------------------------------------------
string TEvent::CommandGet()
std::string TEvent::CommandGet()
{ // odczytanie komendy z eventu
switch (Type)
{ // to się wykonuje również składu jadącego bez obsługi
case tp_GetValues:
return string(Params[9].asMemCell->Text());
return std::string(Params[9].asMemCell->Text());
case tp_PutValues:
return string(Params[0].asText);
return std::string(Params[0].asText);
}
return ""; // inne eventy się nie liczą
};

View File

@@ -47,7 +47,7 @@ extern "C"
}
bool bCondition; // McZapkie: do testowania warunku na event multiple
string LogComment;
std::string LogComment;
//---------------------------------------------------------------------------
// Obiekt renderujący siatkę jest sztucznie tworzonym obiektem pomocniczym,
@@ -707,7 +707,7 @@ void TGroundNode::RenderAlphaDL()
if ((PROBLEND)) // sprawdza, czy w nazwie nie ma @ //Q: 13122011 - Szociu: 27012012
{
glEnable(GL_BLEND);
glAlphaFunc(GL_GREATER, 0.02f);
glAlphaFunc(GL_GREATER, 0.04f);
};
#endif
}
@@ -1430,9 +1430,6 @@ TGround::TGround()
for( int i = 0; i < TP_LAST; ++i ) {
nRootOfType[ i ] = nullptr; // zerowanie tablic wyszukiwania
}
#ifdef EU07_USE_OLD_TNAMES_CLASS
sTracks = new TNames(); // nazwy torów - na razie tak
#endif
::SecureZeroMemory( TempConnectionType, sizeof( TempConnectionType ) );
::SecureZeroMemory( pRendered, sizeof( pRendered ) );
@@ -1487,9 +1484,6 @@ void TGround::Free()
iNumNodes = 0;
// RootNode=NULL;
nRootDynamic = NULL;
#ifdef EU07_USE_OLD_TNAMES_CLASS
delete sTracks;
#endif
}
TGroundNode * TGround::DynamicFindAny(std::string asNameToFind)
@@ -1522,9 +1516,6 @@ TGroundNode * TGround::FindGroundNode(std::string asNameToFind, TGroundNodeType
{ // wyszukiwanie obiektu o podanej nazwie i konkretnym typie
if ((iNodeType == TP_TRACK) || (iNodeType == TP_MEMCELL) || (iNodeType == TP_MODEL))
{ // wyszukiwanie w drzewie binarnym
#ifdef EU07_USE_OLD_TNAMES_CLASS
return (TGroundNode *)sTracks->Find(iNodeType, asNameToFind.c_str());
#else
/*
switch( iNodeType ) {
@@ -1553,7 +1544,6 @@ TGroundNode * TGround::FindGroundNode(std::string asNameToFind, TGroundNodeType
return nullptr;
*/
return m_trackmap.Find( iNodeType, asNameToFind );
#endif
}
// standardowe wyszukiwanie liniowe
TGroundNode *Current;
@@ -1566,10 +1556,10 @@ TGroundNode * TGround::FindGroundNode(std::string asNameToFind, TGroundNodeType
double fTrainSetVel = 0;
double fTrainSetDir = 0;
double fTrainSetDist = 0; // odległość składu od punktu 1 w stronę punktu 2
string asTrainSetTrack = "";
std::string asTrainSetTrack = "";
int iTrainSetConnection = 0;
bool bTrainSet = false;
string asTrainName = "";
std::string asTrainName = "";
int iTrainSetWehicleNumber = 0;
TGroundNode *nTrainSetNode = NULL; // poprzedni pojazd do łączenia
TGroundNode *nTrainSetDriver = NULL; // pojazd, któremu zostanie wysłany rozkład
@@ -1703,7 +1693,7 @@ void TGround::RaTriangleDivider(TGroundNode *node)
TGroundNode * TGround::AddGroundNode(cParser *parser)
{ // wczytanie wpisu typu "node"
// parser->LoadTraction=Global::bLoadTraction; //Ra: tu nie potrzeba powtarzać
string str, str1, str2, str3, str4, Skin, DriverType, asNodeName;
std::string str, str1, str2, str3, str4, Skin, DriverType, asNodeName;
int nv, i;
double tf, r, rmin, tf1, tf3;
int int1;
@@ -1725,7 +1715,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
//str = AnsiString(token.c_str());
TGroundNode *tmp;
tmp = new TGroundNode();
tmp->asName = (asNodeName == "none" ? string("") : asNodeName);
tmp->asName = (asNodeName == "none" ? "" : asNodeName);
if (r >= 0)
tmp->fSquareRadius = r * r;
tmp->fSquareMinRadius = rmin * rmin;
@@ -1876,21 +1866,10 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
tmp->MemCell->Load(parser);
if (!tmp->asName.empty()) // jest pusta gdy "none"
{ // dodanie do wyszukiwarki
#ifdef EU07_USE_OLD_TNAMES_CLASS
if (sTracks->Update(TP_MEMCELL, tmp->asName.c_str(),
tmp)) // najpierw sprawdzić, czy już jest
{ // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność
// wsteczna)
ErrorLog("Duplicated memcell: " + tmp->asName); // to zgłaszać duplikat
}
else
sTracks->Add(TP_MEMCELL, tmp->asName.c_str(), tmp); // nazwa jest unikalna
#else
if( false == m_trackmap.Add( TP_MEMCELL, tmp->asName, tmp ) ) {
// przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność wsteczna)
ErrorLog( "Duplicated memcell: " + tmp->asName ); // to zgłaszać duplikat
}
#endif
}
break;
case TP_EVLAUNCH:
@@ -1910,22 +1889,10 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
tmp->asName); // w nazwie może być nazwa odcinka izolowanego
if (!tmp->asName.empty()) // jest pusta gdy "none"
{ // dodanie do wyszukiwarki
#ifdef EU07_USE_OLD_TNAMES_CLASS
if (sTracks->Update(TP_TRACK, tmp->asName.c_str(),
tmp)) // najpierw sprawdzić, czy już jest
{ // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność
// wsteczna)
if (tmp->pTrack->iCategoryFlag & 1) // jeśli jest zdublowany tor kolejowy
ErrorLog("Duplicated track: " + tmp->asName); // to zgłaszać duplikat
}
else
sTracks->Add(TP_TRACK, tmp->asName.c_str(), tmp); // nazwa jest unikalna
#else
if( false == m_trackmap.Add( TP_TRACK, tmp->asName, tmp ) ) {
// przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność wsteczna)
ErrorLog( "Duplicated track: " + tmp->asName ); // to zgłaszać duplikat
}
#endif
}
tmp->pCenter = (tmp->pTrack->CurrentSegment()->FastGetPoint_0() +
tmp->pTrack->CurrentSegment()->FastGetPoint(0.5) +
@@ -1969,7 +1936,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
>> str4;
tf3 = fTrainSetVel; // prędkość
int2 = str4.find("."); // yB: wykorzystuje tutaj zmienna, ktora potem bedzie ladunkiem
if (int2 != string::npos) // yB: jesli znalazl kropke, to ja przetwarza jako parametry
if (int2 != std::string::npos) // yB: jesli znalazl kropke, to ja przetwarza jako parametry
{
size_t dlugosc = str4.length();
int1 = atoi(str4.substr(0, int2).c_str()); // niech sprzegiem bedzie do kropki cos
@@ -2165,21 +2132,10 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
}
else if (!tmp->asName.empty()) // jest pusta gdy "none"
{ // dodanie do wyszukiwarki
#ifdef EU07_USE_OLD_TNAMES_CLASS
if (sTracks->Update(TP_MODEL, tmp->asName.c_str(),
tmp)) // najpierw sprawdzić, czy już jest
{ // przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność
// wsteczna)
ErrorLog("Duplicated model: " + tmp->asName); // to zgłaszać duplikat
}
else
sTracks->Add(TP_MODEL, tmp->asName.c_str(), tmp); // nazwa jest unikalna
#else
if( false == m_trackmap.Add( TP_MODEL, tmp->asName, tmp ) ) {
// przy zdublowaniu wskaźnik zostanie podmieniony w drzewku na późniejszy (zgodność wsteczna)
ErrorLog( "Duplicated model: " + tmp->asName ); // to zgłaszać duplikat
}
#endif
}
// str=Parser->GetNextSymbol().LowerCase();
break;
@@ -2239,7 +2195,7 @@ TGroundNode * TGround::AddGroundNode(cParser *parser)
// PROBLEND Q: 13122011 - Szociu: 27012012
PROBLEND = true; // domyslnie uruchomione nowe wyświetlanie
tmp->PROBLEND = true; // odwolanie do tgroundnode, bo rendering jest w tej klasie
if (str.find('@') != string::npos) // sprawdza, czy w nazwie tekstury jest znak "@"
if (str.find('@') != std::string::npos) // sprawdza, czy w nazwie tekstury jest znak "@"
{
PROBLEND = false; // jeśli jest, wyswietla po staremu
tmp->PROBLEND = false;
@@ -2457,17 +2413,13 @@ TSubRect * TGround::GetSubRect(int iCol, int iRow)
return (Rects[br][bc].SafeGetRect(sc, sr)); // pobranie małego kwadratu
}
TEvent * TGround::FindEvent(const string &asEventName)
TEvent * TGround::FindEvent(const std::string &asEventName)
{
#ifdef EU07_USE_OLD_TNAMES_CLASS
return (TEvent *)sTracks->Find(0, asEventName.c_str()); // wyszukiwanie w drzewie
#else
auto const lookup = m_eventmap.find( asEventName );
return
lookup != m_eventmap.end() ?
lookup->second :
nullptr;
#endif
/* //powolna wyszukiwarka
for (TEvent *Current=RootEvent;Current;Current=Current->Next2)
{
@@ -2478,27 +2430,19 @@ TEvent * TGround::FindEvent(const string &asEventName)
*/
}
TEvent * TGround::FindEventScan(const string &asEventName)
TEvent * TGround::FindEventScan( std::string const &asEventName )
{ // wyszukanie eventu z opcją utworzenia niejawnego dla komórek skanowanych
#ifdef EU07_USE_OLD_TNAMES_CLASS
TEvent *e = (TEvent *)sTracks->Find( 0, asEventName.c_str() ); // wyszukiwanie w drzewie eventów
#else
auto const lookup = m_eventmap.find( asEventName );
auto e =
lookup != m_eventmap.end() ?
lookup->second :
nullptr;
#endif
if (e)
return e; // jak istnieje, to w porządku
if (asEventName.rfind(":scan") != std::string::npos) // jeszcze może być event niejawny
{ // no to szukamy komórki pamięci o nazwie zawartej w evencie
string n = asEventName.substr(0, asEventName.length() - 5); // do dwukropka
#ifdef EU07_USE_OLD_TNAMES_CLASS
if( sTracks->Find( TP_MEMCELL, n.c_str() ) ) // jeśli jest takowa komórka pamięci
#else
std::string n = asEventName.substr(0, asEventName.length() - 5); // do dwukropka
if( m_trackmap.Find( TP_MEMCELL, n ) != nullptr ) // jeśli jest takowa komórka pamięci
#endif
e = new TEvent(n); // utworzenie niejawnego eventu jej odczytu
}
return e; // utworzony albo się nie udało
@@ -2582,7 +2526,7 @@ bool TGround::Init(std::string File)
Global::pGround = this;
// pTrain=NULL;
pOrigin = aRotate = vector3(0, 0, 0); // zerowanie przesunięcia i obrotu
string str = "";
std::string str;
// TFileStream *fs;
// int size;
std::string subpath = Global::asCurrentSceneryPath; // "scenery/";
@@ -2792,13 +2736,9 @@ bool TGround::Init(std::string File)
// pierwszy
if (RootEvent->Type != tp_Ignored)
if (RootEvent->asName.find(
"onstart") != string::npos) // event uruchamiany automatycznie po starcie
"onstart") != std::string::npos) // event uruchamiany automatycznie po starcie
AddToQuery(RootEvent, NULL); // dodanie do kolejki
#ifdef EU07_USE_OLD_TNAMES_CLASS
sTracks->Add(0, tmp->asName.c_str(), tmp); // dodanie do wyszukiwarki
#else
m_eventmap.emplace( tmp->asName, tmp ); // dodanie do wyszukiwarki
#endif
}
}
}
@@ -3035,7 +2975,7 @@ bool TGround::Init(std::string File)
WriteLog("Scenery sky definition");
parser.getTokens();
parser >> token;
string SkyTemp = token;
std::string SkyTemp = token;
if (Global::asSky == "1")
Global::asSky = SkyTemp;
do
@@ -3096,12 +3036,6 @@ bool TGround::Init(std::string File)
parser >> token;
}
#ifdef EU07_USE_OLD_TNAMES_CLASS
sTracks->Sort(TP_TRACK); // finalne sortowanie drzewa torów
sTracks->Sort(TP_MEMCELL); // finalne sortowanie drzewa komórek pamięci
sTracks->Sort(TP_MODEL); // finalne sortowanie drzewa modeli
sTracks->Sort(0); // finalne sortowanie drzewa eventów
#endif
if (!bInitDone)
FirstInit(); // jeśli nie było w scenerii
if (Global::pTerrainCompact)
@@ -3345,24 +3279,19 @@ bool TGround::InitEvents()
Current->Params[9].asTrack = tmp->pTrack;
if (!Current->Params[9].asTrack)
{
ErrorLog("Bad event: Track \"" + string(buff) +
"\" does not exist in \"" + Current->asName + "\"");
Current->iFlags &=
~(conditional_trackoccupied | conditional_trackfree); // zerowanie flag
ErrorLog("Bad event: Track \"" + std::string(buff) + "\" does not exist in \"" + Current->asName + "\"");
Current->iFlags &= ~(conditional_trackoccupied | conditional_trackfree); // zerowanie flag
}
}
else if (Current->iFlags &
(conditional_memstring | conditional_memval1 | conditional_memval2))
else if (Current->iFlags & (conditional_memstring | conditional_memval1 | conditional_memval2))
{ // jeśli chodzi o komorke pamieciową
tmp = FindGroundNode(buff, TP_MEMCELL);
if (tmp)
Current->Params[9].asMemCell = tmp->MemCell;
if (!Current->Params[9].asMemCell)
{
ErrorLog("Bad event: MemCell \"" + string(buff) +
"\" does not exist in \"" + Current->asName + "\"");
Current->iFlags &=
~(conditional_memstring | conditional_memval1 | conditional_memval2);
ErrorLog("Bad event: MemCell \"" + std::string(buff) + "\" does not exist in \"" + Current->asName + "\"");
Current->iFlags &= ~(conditional_memstring | conditional_memval1 | conditional_memval2);
}
}
for (i = 0; i < 8; i++)
@@ -3375,8 +3304,8 @@ bool TGround::InitEvents()
if( !Current->Params[ i ].asEvent ) { // Ra: tylko w logu informacja o braku
if( ( Current->Params[ i ].asText == NULL )
|| ( std::string( Current->Params[ i ].asText ).substr( 0, 5 ) != "none_" ) ) {
WriteLog( "Event \"" + string( buff ) + "\" does not exist" );
ErrorLog( "Missed event: " + string( buff ) + " in multiple " + Current->asName );
WriteLog( "Event \"" + std::string( buff ) + "\" does not exist" );
ErrorLog( "Missed event: " + std::string( buff ) + " in multiple " + Current->asName );
}
}
}
@@ -3414,7 +3343,7 @@ void TGround::InitTracks()
TTrack *tmp; // znaleziony tor
TTrack *Track;
int iConnection;
string name;
std::string name;
// tracks=tracksfar=0;
for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext)
{
@@ -3568,11 +3497,7 @@ void TGround::InitTracks()
Current = new TGroundNode(); // to nie musi mieć nazwy, nazwa w wyszukiwarce wystarczy
// Current->asName=p->asName; //mazwa identyczna, jak nazwa odcinka izolowanego
Current->MemCell = new TMemCell(NULL); // nowa komórka
#ifdef EU07_USE_OLD_TNAMES_CLASS
sTracks->Add(TP_MEMCELL, p->asName.c_str(), Current); // dodanie do wyszukiwarki
#else
m_trackmap.Add( TP_MEMCELL, p->asName, Current );
#endif
Current->nNext =
nRootOfType[TP_MEMCELL]; // to nie powinno tutaj być, bo robi się śmietnik
nRootOfType[TP_MEMCELL] = Current;
@@ -3592,7 +3517,7 @@ void TGround::InitTraction()
TTraction *tmp; // znalezione przęsło
TTraction *Traction;
int iConnection;
string name;
std::string name;
for (nCurrent = nRootOfType[TP_TRACTION]; nCurrent; nCurrent = nCurrent->nNext)
{ // podłączenie do zasilacza, żeby można było sumować prąd kilku pojazdów
// a jednocześnie z jednego miejsca zmieniać napięcie eventem
@@ -4015,18 +3940,11 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node)
if (Event->Params[6].asTrack)
{ // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla
// wszystkich 'dynamic' na danym torze
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for (int i = 0; i < Event->Params[6].asTrack->iNumDynamics; ++i)
Event->Params[5].asMemCell->PutCommand(
Event->Params[6].asTrack->Dynamics[i]->Mechanik,
&Event->Params[4].nGroundNode->pCenter);
#else
for( auto dynamic : Event->Params[ 6 ].asTrack->Dynamics ) {
Event->Params[ 5 ].asMemCell->PutCommand(
dynamic->Mechanik,
&Event->Params[ 4 ].nGroundNode->pCenter );
}
#endif
//if (DebugModeFlag)
WriteLog("EVENT EXECUTED: AddValues & Track command - " +
std::string(Event->Params[0].asText) + " " +
@@ -4045,8 +3963,7 @@ bool TGround::AddToQuery(TEvent *Event, TDynamicObject *Node)
}
if (Event)
{ // standardowe dodanie do kolejki
WriteLog("EVENT ADDED TO QUEUE: " + Event->asName +
(Node ? (" by " + Node->asName) : string("")));
WriteLog("EVENT ADDED TO QUEUE: " + Event->asName + (Node ? (" by " + Node->asName) : ""));
Event->fStartTime =
fabs(Event->fDelay) + Timer::GetTime(); // czas od uruchomienia scenerii
if (Event->fRandomDelay > 0.0)
@@ -4091,12 +4008,12 @@ bool TGround::EventConditon(TEvent *e)
if (tmpEvent->Params[9].asMemCell->Compare(e->Params[10].asText, e->Params[11].asdouble,
e->Params[12].asdouble, e->iFlags))
{ //logowanie spełnionych warunków
LogComment = e->Params[9].asMemCell->Text() + string(" ") +
LogComment = e->Params[9].asMemCell->Text() + " " +
to_string(e->Params[9].asMemCell->Value1(), 2, 8) + " " +
to_string(tmpEvent->Params[9].asMemCell->Value2(), 2, 8) +
" = ";
if (TestFlag(e->iFlags, conditional_memstring))
LogComment += string(tmpEvent->Params[10].asText);
LogComment += std::string(tmpEvent->Params[10].asText);
else
LogComment += "*";
if (TestFlag(tmpEvent->iFlags, conditional_memval1))
@@ -4113,7 +4030,7 @@ bool TGround::EventConditon(TEvent *e)
//else if (Global::iWriteLogEnabled && DebugModeFlag) //zawsze bo to bardzo istotne w debugowaniu scenariuszy
else
{ // nie zgadza się, więc sprawdzmy, co
LogComment = e->Params[9].asMemCell->Text() + string(" ") +
LogComment = e->Params[9].asMemCell->Text() + " " +
to_string(e->Params[9].asMemCell->Value1(), 2, 8) + " " +
to_string(tmpEvent->Params[9].asMemCell->Value2(), 2, 8) +
" != ";
@@ -4199,8 +4116,9 @@ bool TGround::CheckQuery()
if (tmpEvent->bEnabled)
{ // w zasadzie te wyłączone są skanowane i nie powinny się nigdy w kolejce znaleźć
WriteLog("EVENT LAUNCHED: " + tmpEvent->asName +
(tmpEvent->Activator ? string(" by " + tmpEvent->Activator->asName) :
string("")));
(tmpEvent->Activator ?
std::string(" by " + tmpEvent->Activator->asName) :
"" ));
switch (tmpEvent->Type)
{
case tp_CopyValues: // skopiowanie wartości z innej komórki
@@ -4224,18 +4142,11 @@ bool TGround::CheckQuery()
if (tmpEvent->Params[6].asTrack)
{ // McZapkie-100302 - updatevalues oprocz zmiany wartosci robi putcommand dla
// wszystkich 'dynamic' na danym torze
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for (int i = 0; i < tmpEvent->Params[6].asTrack->iNumDynamics; ++i)
tmpEvent->Params[5].asMemCell->PutCommand(
tmpEvent->Params[6].asTrack->Dynamics[i]->Mechanik,
&tmpEvent->Params[4].nGroundNode->pCenter);
#else
for( auto dynamic : tmpEvent->Params[ 6 ].asTrack->Dynamics ) {
tmpEvent->Params[ 5 ].asMemCell->PutCommand(
dynamic->Mechanik,
&tmpEvent->Params[ 4 ].nGroundNode->pCenter );
}
#endif
//if (DebugModeFlag)
WriteLog("Type: UpdateValues & Track command - " +
tmpEvent->Params[5].asMemCell->Text() + " " +
@@ -4409,71 +4320,31 @@ bool TGround::CheckQuery()
if (tmpEvent->iFlags & update_load)
{ // jeśli pytanie o ładunek
if (tmpEvent->iFlags & update_memadd) // jeśli typ pojazdu
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
tmpEvent->Params[ 9 ].asMemCell->UpdateValues(
strdup(tmpEvent->Activator->MoverParameters->TypeName.c_str()), // typ pojazdu
0, // na razie nic
0, // na razie nic
tmpEvent->iFlags &
(update_memstring | update_memval1 | update_memval2));
#else
tmpEvent->Params[ 9 ].asMemCell->UpdateValues(
tmpEvent->Activator->MoverParameters->TypeName, // typ pojazdu
0, // na razie nic
0, // na razie nic
tmpEvent->iFlags &
(update_memstring | update_memval1 | update_memval2));
#endif
else // jeśli parametry ładunku
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
tmpEvent->Params[ 9 ].asMemCell->UpdateValues(
tmpEvent->Activator->MoverParameters->LoadType != "" ?
strdup(tmpEvent->Activator->MoverParameters->LoadType.c_str()) :
(char*)"none", // nazwa ładunku
tmpEvent->Activator->MoverParameters->Load, // aktualna ilość
tmpEvent->Activator->MoverParameters->MaxLoad, // maksymalna ilość
tmpEvent->iFlags &
(update_memstring | update_memval1 | update_memval2));
#else
tmpEvent->Params[ 9 ].asMemCell->UpdateValues(
tmpEvent->Activator->MoverParameters->LoadType, // nazwa ładunku
tmpEvent->Activator->MoverParameters->Load, // aktualna ilość
tmpEvent->Activator->MoverParameters->MaxLoad, // maksymalna ilość
tmpEvent->iFlags &
(update_memstring | update_memval1 | update_memval2));
#endif
}
else if (tmpEvent->iFlags & update_memadd)
{ // jeśli miejsce docelowe pojazdu
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
tmpEvent->Params[ 9 ].asMemCell->UpdateValues(
strdup(tmpEvent->Activator->asDestination.c_str()), // adres docelowy
tmpEvent->Activator->DirectionGet(), // kierunek pojazdu względem czoła
// składu (1=zgodny,-1=przeciwny)
tmpEvent->Activator->MoverParameters
->Power, // moc pojazdu silnikowego: 0 dla wagonu
tmpEvent->iFlags & (update_memstring | update_memval1 | update_memval2));
#else
tmpEvent->Params[ 9 ].asMemCell->UpdateValues(
tmpEvent->Activator->asDestination, // adres docelowy
tmpEvent->Activator->DirectionGet(), // kierunek pojazdu względem czoła składu (1=zgodny,-1=przeciwny)
tmpEvent->Activator->MoverParameters ->Power, // moc pojazdu silnikowego: 0 dla wagonu
tmpEvent->iFlags & (update_memstring | update_memval1 | update_memval2));
#endif
}
else if (tmpEvent->Activator->Mechanik)
if (tmpEvent->Activator->Mechanik->Primary())
{ // tylko jeśli ktoś tam siedzi - nie powinno dotyczyć pasażera!
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
tmpEvent->Params[ 9 ].asMemCell->UpdateValues(
const_cast<char *>(tmpEvent->Activator->Mechanik->TrainName().c_str()),
tmpEvent->Activator->Mechanik->StationCount() -
tmpEvent->Activator->Mechanik
->StationIndex(), // ile przystanków do końca
tmpEvent->Activator->Mechanik->IsStop() ? 1 :
0, // 1, gdy ma tu zatrzymanie
tmpEvent->iFlags);
#else
tmpEvent->Params[ 9 ].asMemCell->UpdateValues(
tmpEvent->Activator->Mechanik->TrainName(),
tmpEvent->Activator->Mechanik->StationCount() -
@@ -4482,7 +4353,6 @@ bool TGround::CheckQuery()
tmpEvent->Activator->Mechanik->IsStop() ? 1 :
0, // 1, gdy ma tu zatrzymanie
tmpEvent->iFlags);
#endif
WriteLog("Train detected: " + tmpEvent->Activator->Mechanik->TrainName());
}
break;
@@ -4975,7 +4845,7 @@ bool TGround::RenderDL(vector3 pPosition)
bool TGround::RenderAlphaDL(vector3 pPosition)
{ // renderowanie scenerii z Display List - faza przezroczystych
glEnable(GL_BLEND);
glAlphaFunc(GL_GREATER, 0.02f); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
glAlphaFunc(GL_GREATER, 0.04f); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
TGroundNode *node;
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
TSubRect *tmp;
@@ -5269,13 +5139,13 @@ void TGround::WyslijObsadzone()
}
while (i <= 30)
{
strcpy(r.cString + 64 * i, string("none").c_str());
strcpy(r.cString + 64 * i, "none");
r.fPar[16 * i + 4] = 1;
r.fPar[16 * i + 5] = 2;
r.fPar[16 * i + 6] = 3;
r.iPar[16 * i + 7] = 0;
strcpy(r.cString + 64 * i + 32, string("none").c_str());
strcpy(r.cString + 64 * i + 48, string("none").c_str());
strcpy(r.cString + 64 * i + 32, "none");
strcpy(r.cString + 64 * i + 48, "none");
i++;
}
@@ -5345,18 +5215,6 @@ TDynamicObject * TGround::DynamicNearest(vector3 pPosition, double distance, boo
if ((tmp = FastGetSubRect(i, j)) != NULL)
for (node = tmp->nRootNode; node; node = node->nNext2) // następny z sektora
if (node->iType == TP_TRACK) // Ra: przebudować na użycie tabeli torów?
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( k = 0; k < node->pTrack->iNumDynamics; k++ )
if (mech ? (node->pTrack->Dynamics[k]->Mechanik != NULL) :
true) // czy ma mieć obsadę
if ((sqd = SquareMagnitude(
node->pTrack->Dynamics[k]->GetPosition() - pPosition)) <
sqm)
{
sqm = sqd; // nowa odległość
dyn = node->pTrack->Dynamics[k]; // nowy lider
}
#else
for( auto dynamic : node->pTrack->Dynamics ) {
if( mech ? ( dynamic->Mechanik != nullptr ) : true ) {
// czy ma mieć obsadę
@@ -5366,7 +5224,6 @@ TDynamicObject * TGround::DynamicNearest(vector3 pPosition, double distance, boo
}
}
}
#endif
return dyn;
};
TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, bool mech)
@@ -5383,27 +5240,6 @@ TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, boo
if ((tmp = FastGetSubRect(i, j)) != NULL)
for (node = tmp->nRootNode; node; node = node->nNext2) // następny z sektora
if (node->iType == TP_TRACK) // Ra: przebudować na użycie tabeli torów?
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( k = 0; k < node->pTrack->iNumDynamics; k++ )
if (mech ? (node->pTrack->Dynamics[k]->Mechanik != NULL) :
true) // czy ma mieć obsadę
{
if ((sqd = SquareMagnitude(
node->pTrack->Dynamics[k]->HeadPosition() - pPosition)) <
sqm)
{
sqm = sqd; // nowa odległość
dyn = node->pTrack->Dynamics[k]; // nowy lider
}
if ((sqd = SquareMagnitude(
node->pTrack->Dynamics[k]->RearPosition() - pPosition)) <
sqm)
{
sqm = sqd; // nowa odległość
dyn = node->pTrack->Dynamics[k]; // nowy lider
}
}
#else
for( auto dynamic : node->pTrack->Dynamics ) {
if( mech ? ( dynamic->Mechanik != nullptr ) : true ) {
// czy ma mieć obsadę
@@ -5417,7 +5253,6 @@ TDynamicObject * TGround::CouplerNearest(vector3 pPosition, double distance, boo
}
}
}
#endif
return dyn;
};
//---------------------------------------------------------------------------
@@ -5556,11 +5391,7 @@ void TGround::TrackBusyList()
TGroundNode *Current;
for (Current = nRootOfType[TP_TRACK]; Current; Current = Current->nNext)
if (!Current->asName.empty()) // musi być nazwa
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if( Current->pTrack->iNumDynamics ) // osi to chyba nie ma jak policzyć
#else
if( false == Current->pTrack->Dynamics.empty() )
#endif
WyslijString(Current->asName, 8); // zajęty
};
//---------------------------------------------------------------------------

View File

@@ -306,13 +306,9 @@ class TGround
ssh = 0,
ssm = 0; // ustawienia czasu
// int tracks,tracksfar; //liczniki torów
#ifdef EU07_USE_OLD_TNAMES_CLASS
TNames *sTracks = nullptr; // posortowane nazwy torów i eventów
#else
typedef std::unordered_map<std::string, TEvent *> event_map;
event_map m_eventmap;
TNames<TGroundNode *> m_trackmap;
#endif
light_array m_lights; // collection of dynamic light sources present in the scene
private: // metody prywatne

View File

@@ -28,37 +28,20 @@ http://mozilla.org/MPL/2.0/.
TMemCell::TMemCell(vector3 *p)
{
fValue1 = fValue2 = 0;
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
szText = new char[256]; // musi być dla automatycznie tworzonych komórek dla odcinków izolowanych
#endif
vPosition =
p ? *p : vector3(0, 0, 0); // ustawienie współrzędnych, bo do TGroundNode nie ma dostępu
bCommand = false; // komenda wysłana
OnSent = NULL;
}
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
TMemCell::~TMemCell()
{
SafeDeleteArray(szText);
}
#endif
void TMemCell::Init()
{
}
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
void TMemCell::UpdateValues(char const *szNewText, double const fNewValue1, double const fNewValue2, int const CheckMask)
#else
void TMemCell::UpdateValues( std::string const &szNewText, double const fNewValue1, double const fNewValue2, int const CheckMask )
#endif
{
if (CheckMask & update_memadd)
{ // dodawanie wartości
if( TestFlag( CheckMask, update_memstring ) )
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
strcat( szText, szNewText );
#else
szText += szNewText;
#endif
if (TestFlag(CheckMask, update_memval1))
fValue1 += fNewValue1;
if (TestFlag(CheckMask, update_memval2))
@@ -67,11 +50,7 @@ void TMemCell::UpdateValues( std::string const &szNewText, double const fNewValu
else
{
if( TestFlag( CheckMask, update_memstring ) )
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
strcpy( szText, szNewText );
#else
szText = szNewText;
#endif
if (TestFlag(CheckMask, update_memval1))
fValue1 = fNewValue1;
if (TestFlag(CheckMask, update_memval2))
@@ -83,56 +62,32 @@ void TMemCell::UpdateValues( std::string const &szNewText, double const fNewValu
TCommandType TMemCell::CommandCheck()
{ // rozpoznanie komendy
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
if (strcmp(szText, "SetVelocity") == 0) // najpopularniejsze
#else
if( szText == "SetVelocity" ) // najpopularniejsze
#endif
{
eCommand = cm_SetVelocity;
bCommand = false; // ta komenda nie jest wysyłana
}
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
else if( strcmp( szText, "ShuntVelocity" ) == 0 ) // w tarczach manewrowych
#else
else if( szText == "ShuntVelocity" ) // w tarczach manewrowych
#endif
{
eCommand = cm_ShuntVelocity;
bCommand = false; // ta komenda nie jest wysyłana
}
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
else if( strcmp( szText, "Change_direction" ) == 0 ) // zdarza się
#else
else if( szText == "Change_direction" ) // zdarza się
#endif
{
eCommand = cm_ChangeDirection;
bCommand = true; // do wysłania
}
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
else if( strcmp( szText, "OutsideStation" ) == 0 ) // zdarza się
#else
else if( szText == "OutsideStation" ) // zdarza się
#endif
{
eCommand = cm_OutsideStation;
bCommand = false; // tego nie powinno być w komórce
}
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
else if( strncmp( szText, "PassengerStopPoint:", 19 ) == 0 ) // porównanie początków
#else
else if( szText.compare( 0, 19, "PassengerStopPoint:" ) == 0 ) // porównanie początków
#endif
{
eCommand = cm_PassengerStopPoint;
bCommand = false; // tego nie powinno być w komórce
}
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
else if( strcmp( szText, "SetProximityVelocity" ) == 0 ) // nie powinno tego być
#else
else if( szText == "SetProximityVelocity" ) // nie powinno tego być
#endif
{
eCommand = cm_SetProximityVelocity;
bCommand = false; // ta komenda nie jest wysyłana
@@ -149,14 +104,7 @@ bool TMemCell::Load(cParser *parser)
{
std::string token;
parser->getTokens(1, false); // case sensitive
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
*parser >> token;
SafeDeleteArray(szText);
szText = new char[256]; // musi być bufor do łączenia tekstów
strcpy(szText, token.c_str());
#else
*parser >> szText;
#endif
parser->getTokens( 2, false );
*parser
>> fValue1
@@ -179,32 +127,6 @@ void TMemCell::PutCommand(TController *Mech, vector3 *Loc)
Mech->PutCommand(szText, fValue1, fValue2, Loc);
}
bool TMemCell::Compare(char const *szTestText, double const fTestValue1, double const fTestValue2, int const CheckMask)
{ // porównanie zawartości komórki pamięci z podanymi wartościami
if (TestFlag(CheckMask, conditional_memstring))
{ // porównać teksty
std::string
match( szTestText );
auto range = match.find( '*' );
if( range != std::string::npos ) {
// compare string parts
if( 0 != szText.compare( 0, range, match, 0, range ) ) {
return false;
}
}
else {
// compare full strings
if( szText != match ) {
return false;
}
}
}
// tekst zgodny, porównać resztę
return ((!TestFlag(CheckMask, conditional_memval1) || (fValue1 == fTestValue1)) &&
(!TestFlag(CheckMask, conditional_memval2) || (fValue2 == fTestValue2)));
};
#ifndef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
bool TMemCell::Compare( std::string const &szTestText, double const fTestValue1, double const fTestValue2, int const CheckMask ) {
// porównanie zawartości komórki pamięci z podanymi wartościami
if( TestFlag( CheckMask, conditional_memstring ) ) {
@@ -224,10 +146,9 @@ bool TMemCell::Compare( std::string const &szTestText, double const fTestValue1,
}
}
// tekst zgodny, porównać resztę
return ( ( !TestFlag( CheckMask, conditional_memval1 ) || ( fValue1 == fTestValue1 ) ) &&
( !TestFlag( CheckMask, conditional_memval2 ) || ( fValue2 == fTestValue2 ) ) );
return ( ( !TestFlag( CheckMask, conditional_memval1 ) || ( fValue1 == fTestValue1 ) )
&& ( !TestFlag( CheckMask, conditional_memval2 ) || ( fValue2 == fTestValue2 ) ) );
};
#endif
bool TMemCell::Render()
{

View File

@@ -7,56 +7,31 @@ obtain one at
http://mozilla.org/MPL/2.0/.
*/
#ifndef MemCellH
#define MemCellH
#pragma once
#include "Classes.h"
#include "dumb3d.h"
using namespace Math3D;
using namespace std;
class TMemCell
{
private:
vector3 vPosition;
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
char *szText;
#else
Math3D::vector3 vPosition;
std::string szText;
#endif
double fValue1;
double fValue2;
TCommandType eCommand;
bool bCommand; // czy zawiera komendę dla zatrzymanego AI
TEvent *OnSent; // event dodawany do kolejki po wysłaniu komendy zatrzymującej skład
public:
string
asTrackName; // McZapkie-100302 - zeby nazwe toru na ktory jest Putcommand wysylane pamietac
TMemCell(vector3 *p);
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
~TMemCell();
#endif
std::string asTrackName; // McZapkie-100302 - zeby nazwe toru na ktory jest Putcommand wysylane pamietac
TMemCell( Math3D::vector3 *p );
void Init();
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
void UpdateValues( char const *szNewText, double const fNewValue1, double const fNewValue2, int const CheckMask );
#else
void UpdateValues( std::string const &szNewText, double const fNewValue1, double const fNewValue2, int const CheckMask );
#endif
bool Load(cParser *parser);
void PutCommand(TController *Mech, vector3 *Loc);
bool Compare( char const *szTestText, double const fTestValue1, double const fTestValue2, int const CheckMask );
#ifndef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
void PutCommand( TController *Mech, Math3D::vector3 *Loc );
bool Compare( std::string const &szTestText, double const fTestValue1, double const fTestValue2, int const CheckMask );
#endif
bool Render();
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
inline char * Text()
{
return szText;
};
#else
inline std::string const &Text() { return szText; }
#endif
inline double Value1()
{
return fValue1;
@@ -65,7 +40,7 @@ class TMemCell
{
return fValue2;
};
inline vector3 Position()
inline Math3D::vector3 Position()
{
return vPosition;
};
@@ -84,4 +59,3 @@ class TMemCell
};
//---------------------------------------------------------------------------
#endif

176
Names.cpp
View File

@@ -11,179 +11,3 @@ http://mozilla.org/MPL/2.0/.
#include "Names.h"
//---------------------------------------------------------------------------
/*
Moduł zarządzający plikami oraz wyszukiwaniem obiektów wg nazw.
1. Ma przydzielony z góry (EU07.INI) obszar pamięci (rzędu 16MB).
2. W przypadku przepełnienia dostępnej pamięci wystąpi błąd wczytywania.
3. Obszar ten będzie zużywany na rekordy obiektów oraz ciągi tekstowe z nazwami.
4. Rekordy będą sortowane w ramach typu (tekstury, dźwięki, modele, node, eventy).
5. Pierwszy etap wyszukiwania to 5 bitów z pierwszego bajtu i 3 z drugiego (256).
6. Dla plików istnieje możliwość wczytania ich w innym terminie.
7. Możliwość wczytania plików w oddzielnym watku (np. tekstur).
Obsługiwane pliki:
1. Tekstury, można wczytywać później, rekord przechowuje numer podany przez kartę graficzną.
2. Dźwięki, można wczytać później.
3. Modele, można wczytać później o ile nie mają animacji eventami i nie dotyczą pojazdów.
Obiekty sortowane wg nazw, można dodawać i usuwać komórki scenerii:
4. Tory, drogi, rzeki - wyszukiwanie w celu sprawdzenia zajetości.
5. Eventy - wyszukiwane przy zewnętrznym wywołaniu oraz podczas wczytywania.
6. Pojazdy - wyszukiwane w celu wysyłania komend.
7. Egzemplarze modeli animowanych - wyszukiwanie w celu połączenia z animacjami.
*/
#ifdef EU07_USE_OLD_TNAMES_CLASS
void ItemRecord::TreeAdd(ItemRecord *r, int c)
{ // dodanie rekordu do drzewa - ustalenie w której gałęzi
// zapisać w (iFlags) ile znaków jest zgodnych z nadrzędnym, żeby nie sprawdzać wszystkich od
// zera
if ((cName[c] && r->cName[c]) ? cName[c] == r->cName[c] : false)
TreeAdd(r, c + 1); // ustawić wg kolejnego znaku, chyba że zero
else if ((unsigned char)(cName[c]) < (unsigned char)(r->cName[c]))
{ // zero jest najmniejsze - doczepiamy jako (rNext)
if (!rNext)
rNext = r;
else
rNext->TreeAdd(r, 0); // doczepić do tej gałęzi
}
else
{
if (!rPrev)
rPrev = r;
else
rPrev->TreeAdd(r, 0); // doczepić do tej gałęzi
}
};
void ItemRecord::ListGet(ItemRecord *r, int *&n)
{ // rekurencyjne wypełnianie posortowanej listy na podstawie drzewa
if (rPrev)
rPrev->ListGet(r, n); // dodanie wszystkich wcześniejszych
*n++ = this - r; // dodanie swojego indeksu do tabeli
if (rNext)
rNext->ListGet(r, n); // dodanie wszystkich późniejszych
};
void * ItemRecord::TreeFind(const char *n)
{ // wyszukanie ciągu (n)
ItemRecord *r = TreeFindRecord(n);
return r ? r->pData : NULL;
};
ItemRecord * ItemRecord::TreeFindRecord(const char *n)
{ // wyszukanie ciągu (n)
ItemRecord *r = this; //żeby nie robić rekurencji
int i = 0;
do
{
if (!n[i])
if (!r->cName[i])
return r; // znaleziony
if (n[i] == r->cName[i])
++i; // porównać kolejny znak
else if ((unsigned char)(n[i]) < (unsigned char)(r->cName[i]))
{
i = 0; // porównywać od nowa
r = r->rPrev; // wcześniejsza gałąź drzewa
}
else
{
i = 0; // porównywać od nowa
r = r->rNext; // późniejsza gałąź drzewa
}
} while (r);
return NULL;
};
TNames::TNames()
{ // tworzenie bufora
iSize = 16 * 1024 * 1024; // rozmiar bufora w bajtach
cBuffer = new char[iSize];
ZeroMemory(cBuffer, iSize); // nie trzymać jakiś starych śmieci
rRecords = (ItemRecord *)cBuffer;
cLast = cBuffer + iSize; // bajt za buforem
iLast = -1;
ZeroMemory(rTypes, 20 * sizeof(ItemRecord *));
};
TNames::~TNames() {
delete[] cBuffer;
}
int TNames::Add(int t, const char *n)
{ // dodanie obiektu typu (t) o nazwie (n)
int len = strlen(n) + 1; // ze znacznikiem końca
cLast -= len; // rezerwacja miejsca
memcpy(cLast, n, len); // przekopiowanie tekstu do bufora
// cLast[len-1]='\0';
rRecords[++iLast].cName = cLast; // połączenie nazwy z rekordem
rRecords[iLast].iFlags = t;
if (!rTypes[t])
rTypes[t] = rRecords + iLast; // korzeń drzewa, bo nie było wcześniej
else
rTypes[t]->TreeAdd(rRecords + iLast, 0); // doczepienie jako gałąź
// rTypes[t]=Sort(t); //sortowanie uruchamiać ręcznie
if ((iLast & 0x3F) == 0) // nie za często, bo sortowania zajmą więcej czasu niż wyszukiwania
Sort(t); // optymalizacja drzewa co jakiś czas
return iLast;
}
int TNames::Add(int t, const char *n, void *d)
{
int i = Add(t, n);
rRecords[iLast].pData = d;
return i;
};
bool TNames::Update(int t, const char *n, void *d)
{ // dodanie jeśli nie ma, wymiana (d), gdy jest
ItemRecord *r = FindRecord(t, n); // najpierw sprawdzić, czy już jest
if (r)
{ // przy zdublowaniu nazwy podmieniać w drzewku na późniejszy
r->pData = d;
return true; // duplikat
}
// Add(t,n,d); //nazwa unikalna
return false; // został dodany nowy
};
ItemRecord * TNames::TreeSet(int *n, int d, int u)
{ // rekurencyjne wypełnianie drzewa pozycjami od (d) do (u)
if (d == u)
{
rRecords[n[d]].rPrev = rRecords[n[d]].rNext = NULL;
return rRecords + n[d]; // tej gałęzi nie ma
}
else if (d > u)
return NULL;
int p = (u + d) >> 1; // połowa
rRecords[n[p]].rPrev = TreeSet(n, d, p - 1); // zapisanie wcześniejszych gałęzi
rRecords[n[p]].rNext = TreeSet(n, p + 1, u); // zapisanie późniejszych gałęzi
return rRecords + n[p];
};
void TNames::Sort(int t)
{ // przebudowa drzewa typu (t), zwraca wierzchołek drzewa
if (iLast < 3)
return; // jak jest mało, to nie ma sensu sortować
if (rTypes[t]) // jeśli jest jakiś rekord danego typu
{
int *r = new int[iLast + 1]; // robocza tablica indeksów - numery posortowanych rekordów
int *q = r; // wskaźnik roboczy, przekazywany przez referencję
rTypes[t]->ListGet(rRecords, q); // drzewo jest już posortowane - zamienić je na listę
rTypes[t] = TreeSet(r, 0, (q - r) - 1);
delete[] r;
}
return;
};
ItemRecord * TNames::FindRecord(const int t, const char *n)
{ // poszukiwanie rekordu w celu np. zmiany wskaźnika
return rTypes[t] ? rTypes[t]->TreeFindRecord(n) : NULL;
};
#endif

82
Names.h
View File

@@ -1,4 +1,3 @@
#pragma once
/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
@@ -8,12 +7,12 @@ obtain one at
http://mozilla.org/MPL/2.0/.
*/
#pragma once
#include <unordered_map>
#include <string>
#ifndef EU07_USE_OLD_TNAMES_CLASS
template <typename _Pointer>
template <typename _Type>
class TNames {
public:
@@ -27,7 +26,7 @@ public:
// methods:
// dodanie obiektu z wskaźnikiem. updates data field if the object already exists. returns true for insertion, false for update
bool
Add( int const Type, std::string const &Name, _Pointer Data ) {
Add( int const Type, std::string const &Name, _Type Data ) {
auto lookup = find_map( Type ).emplace( Name, Data );
if( lookup.second == false ) {
@@ -41,7 +40,7 @@ public:
}
}
// returns pointer associated with provided label, or nullptr if there's no match
_Pointer
_Type
Find( int const Type, std::string const &Name ) {
auto const &map = find_map( Type );
@@ -52,78 +51,17 @@ public:
private:
// types:
typedef std::unordered_map<std::string, _Pointer> pointer_map;
typedef std::unordered_map<int, pointer_map> pointermap_map;
typedef std::unordered_map<std::string, _Type> type_map;
typedef std::unordered_map<int, type_map> typemap_map;
// methods:
// returns database stored with specified type key; creates new database if needed.
pointer_map &
type_map &
find_map( int const Type ) {
return m_maps.emplace( Type, pointer_map() ).first->second;
return m_maps.emplace( Type, type_map() ).first->second;
}
// members:
pointermap_map m_maps; // list of pointer maps of types specified so far
typemap_map m_maps; // list of object maps of types specified so far
};
#else
//---------------------------------------------------------------------------
class ItemRecord
{ // rekord opisujący obiekt; raz utworzony nie przemieszcza się
// rozmiar rekordu można zmienić w razie potrzeby
public:
char *cName; // wskaźnik do nazwy umieszczonej w buforze
int iFlags; // flagi bitowe
ItemRecord *rPrev, *rNext; // posortowane drzewo (przebudowywane w razie potrzeby)
union
{
void *pData; // wskaźnik do obiektu
int iData; // albo numer obiektu (tekstury)
unsigned int uData;
};
// typedef
void ListGet(ItemRecord *r, int *&n);
void TreeAdd(ItemRecord *r, int c);
template <typename TOut> inline TOut *DataGet()
{
return (TOut *)pData;
};
template <typename TOut> inline void DataSet(TOut *x)
{
pData = (void *)x;
};
void * TreeFind(const char *n);
ItemRecord * TreeFindRecord(const char *n);
};
class TNames
{
public:
int iSize; // rozmiar bufora
char *cBuffer; // bufor dla rekordów (na początku) i nazw (na końcu)
ItemRecord *rRecords; // rekordy na początku bufora
char *cLast; // ostatni użyty bajt na nazwy
ItemRecord *rTypes[20]; // rożne typy obiektów (początek drzewa)
int iLast; // ostatnio użyty rekord
public:
TNames();
~TNames();
int Add(int t, const char *n); // dodanie obiektu typu (t)
int Add(int t, const char *n, void *d); // dodanie obiektu z wskaźnikiem
int Add(int t, const char *n, int d); // dodanie obiektu z numerem
bool Update(int t, const char *n, void *d); // dodanie jeśli nie ma, wymiana (d), gdy jest
void TreeSet();
ItemRecord * TreeSet(int *n, int d, int u);
void Sort(int t); // przebudowa drzewa typu (t)
ItemRecord * Item(int n); // rekord o numerze (n)
inline void *Find(const int t, const char *n)
{
return rTypes[t] ? rTypes[t]->TreeFind(n) : NULL;
};
ItemRecord * FindRecord(const int t, const char *n);
// template <typename TOut> inline TOut* Find(const int t,const char *n)
//{return (TOut*)(rTypes[t]->TreeFind(n));};
};
#endif

112
Track.cpp
View File

@@ -77,8 +77,8 @@ TIsolated::TIsolated()
TIsolated("none", NULL);
};
TIsolated::TIsolated(const string &n, TIsolated *i) :
asName( n ), pNext( i )
TIsolated::TIsolated(std::string const &n, TIsolated *i) :
asName( n ), pNext( i )
{
// utworznie obwodu izolowanego. nothing to do here.
};
@@ -96,7 +96,7 @@ TIsolated::~TIsolated(){
*/
};
TIsolated * TIsolated::Find(const string &n)
TIsolated * TIsolated::Find(std::string const &n)
{ // znalezienie obiektu albo utworzenie nowego
TIsolated *p = pRoot;
while (p)
@@ -121,13 +121,8 @@ void TIsolated::Modify(int i, TDynamicObject *o)
if (Global::iMultiplayer) // jeśli multiplayer
Global::pGround->WyslijString(asName, 10); // wysłanie pakietu o zwolnieniu
if (pMemCell) // w powiązanej komórce
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
pMemCell->UpdateValues( NULL, 0, int( pMemCell->Value2() ) & ~0xFF,
update_memval2); //"zerujemy" ostatnią wartość
#else
pMemCell->UpdateValues( "", 0, int( pMemCell->Value2() ) & ~0xFF,
update_memval2 ); //"zerujemy" ostatnią wartość
#endif
}
}
else
@@ -140,12 +135,7 @@ void TIsolated::Modify(int i, TDynamicObject *o)
if (Global::iMultiplayer) // jeśli multiplayer
Global::pGround->WyslijString(asName, 11); // wysłanie pakietu o zajęciu
if (pMemCell) // w powiązanej komórce
#ifdef EU07_USE_OLD_TMEMCELL_TEXT_ARRAY
pMemCell->UpdateValues( NULL, 0, int( pMemCell->Value2() ) | 1,
update_memval2); // zmieniamy ostatnią wartość na nieparzystą
#else
pMemCell->UpdateValues( "", 0, int( pMemCell->Value2() ) | 1, update_memval2 ); // zmieniamy ostatnią wartość na nieparzystą
#endif
}
}
};
@@ -154,9 +144,6 @@ void TIsolated::Modify(int i, TDynamicObject *o)
TTrack::TTrack(TGroundNode *g) :
pMyNode( g ) // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode
{
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
::SecureZeroMemory( Dynamics, sizeof( Dynamics ) );
#endif
fRadiusTable[ 0 ] = 0.0;
fRadiusTable[ 1 ] = 0.0;
nFouling[ 0 ] = nullptr;
@@ -199,7 +186,7 @@ void TTrack::Init()
break;
case tt_Table: // oba potrzebne
SwitchExtension = std::make_shared<TSwitchExtension>( this, 1 ); // kopia oryginalnego toru
Segment = make_shared<TSegment>(this);
Segment = std::make_shared<TSegment>(this);
break;
}
}
@@ -413,7 +400,7 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name)
{ // pobranie obiektu trajektorii ruchu
vector3 pt, vec, p1, p2, cp1, cp2, p3, p4, cp3, cp4; // dodatkowe punkty potrzebne do skrzyżowań
double a1, a2, r1, r2, r3, r4;
string str;
std::string str;
size_t i; //,state; //Ra: teraz już nie ma początkowego stanu zwrotnicy we wpisie
std::string token;
@@ -808,7 +795,7 @@ void TTrack::Load(cParser *parser, vector3 pOrigin, std::string name)
}
// alternatywny zapis nazwy odcinka izolowanego - po znaku "@" w nazwie toru
if (!pIsolated)
if ((i = name.find("@")) != string::npos)
if ((i = name.find("@")) != std::string::npos)
if (i < name.length()) // nie może być puste
{
pIsolated = TIsolated::Find(name.substr(i + 1, name.length()));
@@ -976,7 +963,7 @@ bool TTrack::AssignForcedEvents(TEvent *NewEventPlus, TEvent *NewEventMinus)
return false;
};
string TTrack::IsolatedName()
std::string TTrack::IsolatedName()
{ // podaje nazwę odcinka izolowanego, jesli nie ma on jeszcze przypisanych zdarzeń
if (pIsolated)
if (!pIsolated->evBusy && !pIsolated->evFree)
@@ -1007,27 +994,6 @@ bool TTrack::AddDynamicObject(TDynamicObject *Dynamic)
Dynamic->MyTrack = NULL; // trzeba by to uzależnić od kierunku ruchu...
return true;
}
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (Global::iMultiplayer) // jeśli multiplayer
if (!iNumDynamics) // pierwszy zajmujący
if (pMyNode->asName != "none")
Global::pGround->WyslijString(pMyNode->asName,
8); // przekazanie informacji o zajętości toru
if (iNumDynamics < iMaxNumDynamics)
{ // jeśli jest miejsce, dajemy na koniec
Dynamics[iNumDynamics++] = Dynamic;
Dynamic->MyTrack = this; // ABu: na ktorym torze jesteśmy
if (Dynamic->iOverheadMask) // jeśli ma pantografy
Dynamic->OverheadTrack(
fOverhead); // przekazanie informacji o jeździe bezprądowej na tym odcinku toru
return true;
}
else
{
Error("Too many dynamics on track " + pMyNode->asName);
return false;
}
#else
if( Global::iMultiplayer ) {
// jeśli multiplayer
if( true == Dynamics.empty() ) {
@@ -1045,7 +1011,6 @@ bool TTrack::AddDynamicObject(TDynamicObject *Dynamic)
Dynamic->OverheadTrack( fOverhead ); // przekazanie informacji o jeździe bezprądowej na tym odcinku toru
}
return true;
#endif
};
void TTrack::MoveMe(vector3 pPosition)
@@ -1863,42 +1828,16 @@ void TTrack::Render()
bool TTrack::CheckDynamicObject(TDynamicObject *Dynamic)
{ // sprawdzenie, czy pojazd jest przypisany do toru
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for (int i = 0; i < iNumDynamics; i++)
if (Dynamic == Dynamics[i])
return true;
return false;
#else
for( auto dynamic : Dynamics ) {
if( dynamic == Dynamic ) {
return true;
}
}
return false;
#endif
};
bool TTrack::RemoveDynamicObject(TDynamicObject *Dynamic)
{ // usunięcie pojazdu z listy przypisanych do toru
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for (int i = 0; i < iNumDynamics; i++)
{ // sprawdzanie wszystkich po kolei
if (Dynamic == Dynamics[i])
{ // znaleziony, przepisanie następnych, żeby dziur nie było
--iNumDynamics;
for (i; i < iNumDynamics; i++)
Dynamics[i] = Dynamics[i + 1];
if (Global::iMultiplayer) // jeśli multiplayer
if (!iNumDynamics) // jeśli już nie ma żadnego
if (pMyNode->asName != "none")
Global::pGround->WyslijString(
pMyNode->asName, 9); // przekazanie informacji o zwolnieniu toru
return true;
}
}
Error("Cannot remove dynamic from track");
return false;
#else
bool result = false;
if( *Dynamics.begin() == Dynamic ) {
// most likely the object getting removed is at the front...
@@ -1935,7 +1874,6 @@ bool TTrack::RemoveDynamicObject(TDynamicObject *Dynamic)
}
return result;
#endif
}
bool TTrack::InMovement()
@@ -2660,14 +2598,6 @@ void TTrack::EnvironmentReset()
void TTrack::RenderDyn()
{ // renderowanie nieprzezroczystych fragmentów pojazdów
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (!iNumDynamics)
return; // po co kombinować, jeśli nie ma pojazdów?
// EnvironmentSet(); //Ra: pojazdy sobie same teraz liczą cienie
for (int i = 0; i < iNumDynamics; i++)
Dynamics[i]->Render(); // sam sprawdza, czy VBO; zmienia kontekst VBO!
// EnvironmentReset();
#else
for( auto dynamic : Dynamics ) {
// sam sprawdza, czy VBO; zmienia kontekst VBO!
#ifdef EU07_USE_OLD_RENDERCODE
@@ -2676,19 +2606,10 @@ void TTrack::RenderDyn()
GfxRenderer.Render( dynamic );
#endif
}
#endif
};
void TTrack::RenderDynAlpha()
{ // renderowanie przezroczystych fragmentów pojazdów
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
if (!iNumDynamics)
return; // po co kombinować, jeśli nie ma pojazdów?
// EnvironmentSet(); //Ra: pojazdy sobie same teraz liczą cienie
for (int i = 0; i < iNumDynamics; i++)
Dynamics[i]->RenderAlpha(); // sam sprawdza, czy VBO; zmienia kontekst VBO!
// EnvironmentReset();
#else
for( auto dynamic : Dynamics ) {
// sam sprawdza, czy VBO; zmienia kontekst VBO!
#ifdef EU07_USE_OLD_RENDERCODE
@@ -2697,19 +2618,13 @@ void TTrack::RenderDynAlpha()
GfxRenderer.Render_Alpha( dynamic );
#endif
}
#endif
};
void TTrack::RenderDynSounds()
{ // odtwarzanie dźwięków pojazdów jest niezależne od ich wyświetlania
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( int i = 0; i < iNumDynamics; i++ )
Dynamics[i]->RenderSounds();
#else
for( auto dynamic : Dynamics ) {
dynamic->RenderSounds();
}
#endif
};
//---------------------------------------------------------------------------
bool TTrack::SetConnections(int i)
@@ -3043,15 +2958,10 @@ TTrack * TTrack::RaAnimate()
SwitchExtension->vTrans; // SwitchExtension->Segments[0]->FastGetPoint(0.5);
Segment->Init(middle + vector3(sina, 0.0, cosa),
middle - vector3(sina, 0.0, cosa), 5.0); // nowy odcinek
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for( int i = 0; i < iNumDynamics; i++ )
Dynamics[i]->Move(0.000001); // minimalny ruch, aby przeliczyć pozycję i
#else
for( auto dynamic : Dynamics ) {
// minimalny ruch, aby przeliczyć pozycję
dynamic->Move( 0.000001 );
}
#endif
// kąty
if (Global::bUseVBO)
{ // dla OpenGL 1.4 odświeży się cały sektor, w późniejszych poprawiamy fragment
@@ -3083,15 +2993,9 @@ TTrack * TTrack::RaAnimate()
//---------------------------------------------------------------------------
void TTrack::RadioStop()
{ // przekazanie pojazdom rozkazu zatrzymania
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
for (int i = 0; i < iNumDynamics; i++)
Dynamics[i]->RadioStop();
#else
for( auto dynamic : Dynamics ) {
dynamic->RadioStop();
}
#endif
};
double TTrack::WidthTotal()
@@ -3200,7 +3104,7 @@ void TTrack::MovedUp1(double dh)
fTexHeight1 += dh;
};
string TTrack::NameGet()
std::string TTrack::NameGet()
{ // ustalenie nazwy toru
if (this)
if (pMyNode)

13
Track.h
View File

@@ -95,10 +95,6 @@ class TSwitchExtension
private:
};
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
const int iMaxNumDynamics = 40; // McZapkie-100303
#endif
class TIsolated
{ // obiekt zbierający zajętości z kilku odcinków
int iAxles = 0; // ilość osi na odcinkach obsługiwanych przez obiekt
@@ -152,13 +148,8 @@ class TTrack : public Resource
TGroundNode *
pMyNode = nullptr; // Ra: proteza, żeby tor znał swoją nazwę TODO: odziedziczyć TTrack z TGroundNode
public:
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
int iNumDynamics = 0;
TDynamicObject *Dynamics[iMaxNumDynamics];
#else
typedef std::deque<TDynamicObject *> dynamics_sequence;
dynamics_sequence Dynamics;
#endif
int iEvents = 0; // Ra: flaga informująca o obecności eventów
TEvent *evEventall0 = nullptr; // McZapkie-140302: wyzwalany gdy pojazd stoi
TEvent *evEventall1 = nullptr;
@@ -204,11 +195,7 @@ class TTrack : public Resource
TTrack * NullCreate(int dir);
inline bool IsEmpty()
{
#ifdef EU07_USE_OLD_TTRACK_DYNAMICS_ARRAY
return (iNumDynamics <= 0);
#else
return Dynamics.empty();
#endif
};
void ConnectPrevPrev(TTrack *pNewPrev, int typ);
void ConnectPrevNext(TTrack *pNewPrev, int typ);

View File

@@ -207,7 +207,7 @@
<ClCompile Include="uilayer.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="glwidgetlibrary.cpp">
<ClCompile Include="openglmatrixstack.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
@@ -404,9 +404,6 @@
<ClInclude Include="uilayer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="glwidgetlibrary.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="openglmatrixstack.h">
<Filter>Header Files</Filter>
</ClInclude>

13
openglmatrixstack.cpp Normal file
View File

@@ -0,0 +1,13 @@
/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*/
#include "stdafx.h"
#include "openglmatrixstack.h"
opengl_matrices OpenGLMatrices;

View File

@@ -135,7 +135,7 @@ public:
void
perspective( _Type const Fovy, _Type const Aspect, _Type const Znear, _Type const Zfar ) {
m_stacks[ m_mode ].perspective(
static_cast<float>( Fovy ),
static_cast<float>(Fovy) * 0.0174532925f, // deg2rad
static_cast<float>( Aspect ),
static_cast<float>( Znear ),
static_cast<float>( Zfar ) ); }

View File

@@ -16,10 +16,8 @@ http://mozilla.org/MPL/2.0/.
#include "uilayer.h"
#include "logs.h"
#include "usefull.h"
#include "glwidgetlibrary.h"
opengl_renderer GfxRenderer;
opengl_matrices OpenGLMatrices;
extern TWorld World;
// returns true if specified object is within camera frustum, false otherwise
@@ -134,7 +132,7 @@ opengl_renderer::Render() {
::glMatrixMode( GL_PROJECTION ); // select the Projection Matrix
::gluPerspective(
Global::FieldOfView / Global::ZoomFactor * 0.0174532925f,
Global::FieldOfView / Global::ZoomFactor,
std::max( 1.0f, (float)Global::ScreenWidth ) / std::max( 1.0f, (float)Global::ScreenHeight ),
0.1f * Global::ZoomFactor,
m_drawrange * Global::fDistanceFactor );
@@ -183,7 +181,7 @@ bool
opengl_renderer::Render( TGround *Ground ) {
glDisable( GL_BLEND );
glAlphaFunc( GL_GREATER, 0.35f ); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
glAlphaFunc( GL_GREATER, 0.45f ); // im mniejsza wartość, tym większa ramka, domyślnie 0.1f
glEnable( GL_LIGHTING );
glColor3f( 1.0f, 1.0f, 1.0f );
@@ -444,7 +442,7 @@ opengl_renderer::Render_Alpha( TDynamicObject *Dynamic ) {
}
TSubModel::iInstance = ( size_t )this; //żeby nie robić cudzych animacji
double squaredistance = SquareMagnitude( Global::pCameraPosition - Dynamic->vPosition );
double squaredistance = SquareMagnitude( Global::pCameraPosition - Dynamic->vPosition ) / Global::ZoomFactor;
Dynamic->ABuLittleUpdate( squaredistance ); // ustawianie zmiennych submodeli dla wspólnego modelu
::glPushMatrix();