mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
maintenance: removed deprecated code from memcells, tracks, events
This commit is contained in:
@@ -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
|
||||
|
||||
50
Driver.cpp
50
Driver.cpp
@@ -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" );
|
||||
};
|
||||
|
||||
169
DynObj.cpp
169
DynObj.cpp
@@ -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
|
||||
|
||||
16
EvLaunch.cpp
16
EvLaunch.cpp
@@ -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();
|
||||
|
||||
11
EvLaunch.h
11
EvLaunch.h
@@ -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
|
||||
|
||||
@@ -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ą
|
||||
};
|
||||
|
||||
237
Ground.cpp
237
Ground.cpp
@@ -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
|
||||
};
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
4
Ground.h
4
Ground.h
@@ -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
|
||||
|
||||
83
MemCell.cpp
83
MemCell.cpp
@@ -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()
|
||||
{
|
||||
|
||||
38
MemCell.h
38
MemCell.h
@@ -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
176
Names.cpp
@@ -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
82
Names.h
@@ -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
112
Track.cpp
@@ -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
13
Track.h
@@ -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);
|
||||
|
||||
@@ -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
13
openglmatrixstack.cpp
Normal 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;
|
||||
@@ -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 ) ); }
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user