Set dp branch as trunk

This commit is contained in:
ShaXbee
2015-04-03 13:34:06 +00:00
commit 45f4c0d98a
132 changed files with 94789 additions and 0 deletions

725
EU07.cpp Normal file
View File

@@ -0,0 +1,725 @@
//---------------------------------------------------------------------------
/*
MaSzyna EU07 locomotive simulator
Copyright (C) 2001-2004 Marcin Wozniak, Maciej Czapkiewicz and others
*/
#include "opengl/glew.h"
#include "opengl/glut.h"
#include "opengl/ARB_Multisample.h"
#include "system.hpp"
#include "classes.hpp"
#include "Globals.h"
#include "Console.h"
#include "QueryParserComp.hpp"
#include "Mover.h"
#include "Logs.h"
#pragma hdrstop
#include <dsound.h> //_clear87() itp.
USERES("EU07.res");
USEUNIT("dumb3d.cpp");
USEUNIT("Camera.cpp");
USEUNIT("Texture.cpp");
USEUNIT("World.cpp");
USELIB("opengl\glut32.lib");
USEUNIT("Model3d.cpp");
USEUNIT("MdlMngr.cpp");
USEUNIT("Train.cpp");
USEUNIT("wavread.cpp");
USEUNIT("Timer.cpp");
USEUNIT("Event.cpp");
USEUNIT("MemCell.cpp");
USEUNIT("Logs.cpp");
USELIB("DirectX\Dsound.lib");
USEUNIT("Spring.cpp");
USEUNIT("Button.cpp");
USEUNIT("Globals.cpp");
USEUNIT("Gauge.cpp");
USEUNIT("AnimModel.cpp");
USEUNIT("Ground.cpp");
USEUNIT("TrkFoll.cpp");
USEUNIT("Segment.cpp");
USEUNIT("Sound.cpp");
USEUNIT("AdvSound.cpp");
USEUNIT("Track.cpp");
USEUNIT("DynObj.cpp");
USEUNIT("RealSound.cpp");
USEUNIT("EvLaunch.cpp");
USEUNIT("QueryParserComp.pas");
USEUNIT("FadeSound.cpp");
USEUNIT("Traction.cpp");
USEUNIT("TractionPower.cpp");
USEUNIT("parser.cpp");
USEUNIT("sky.cpp");
USEUNIT("AirCoupler.cpp");
USEUNIT("opengl\glew.c");
USEUNIT("ResourceManager.cpp");
USEUNIT("VBO.cpp");
USEUNIT("McZapkie\mtable.pas");
USEUNIT("TextureDDS.cpp");
USEUNIT("opengl\ARB_Multisample.cpp");
USEUNIT("Float3d.cpp");
USEUNIT("Classes.cpp");
USEUNIT("Driver.cpp");
USEUNIT("Names.cpp");
USEUNIT("Console.cpp");
USEUNIT("Mover.cpp");
USEUNIT("McZapkie\_mover.pas");
USEUNIT("McZapkie\hamulce.pas");
USEUNIT("Console\PoKeys55.cpp");
USEUNIT("Forth.cpp");
USEUNIT("Console\LPT.cpp");
//---------------------------------------------------------------------------
#include "World.h"
HDC hDC=NULL; // Private GDI Device Context
HGLRC hRC=NULL; // Permanent Rendering Context
HWND hWnd=NULL; // Holds Our Window Handle
TWorld World;
//bool active=TRUE; //window active flag set to TRUE by default
bool fullscreen=TRUE; //fullscreen flag set to fullscreen mode by default
int WindowWidth= 800;
int WindowHeight= 600;
int Bpp= 32;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
//#include "dbgForm.h"
//---------------------------------------------------------------------------
int InitGL(GLvoid) // All Setup For OpenGL Goes Here
{
_clear87();
_control87(MCW_EM,MCW_EM);
glewInit();
//hunter-271211: przeniesione
//AllocConsole();
//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
// ShaXbee-121209: Wlaczenie obslugi tablic wierzcholkow
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
Global::pWorld=&World; //Ra: wskaŸnik potrzebny do usuwania pojazdów
return World.Init(hWnd,hDC); //true jeœli wszystko pójdzie dobrze
}
//---------------------------------------------------------------------------
GLvoid ReSizeGLScene(GLsizei width,GLsizei height) // resize and initialize the GL Window
{
WindowWidth=width;
WindowHeight=height;
if (height==0) // prevent a divide by zero by
height=1; // making height equal one
glViewport(0,0,width,height); // Reset The Current Viewport
glMatrixMode(GL_PROJECTION); // select the Projection Matrix
glLoadIdentity(); // reset the Projection Matrix
//calculate the aspect ratio of the window
gluPerspective(45.0f,(GLdouble)width/(GLdouble)height,0.2f,2500.0f);
glMatrixMode(GL_MODELVIEW); // select the Modelview Matrix
glLoadIdentity(); // reset the Modelview Matrix
}
//---------------------------------------------------------------------------
GLvoid KillGLWindow(GLvoid) // properly kill the window
{
if (hRC) // Do We Have A Rendering Context?
{
if (!wglMakeCurrent(NULL,NULL)) // are we able to release the DC and RC contexts?
{
ErrorLog("Fail: window releasing");
MessageBox(NULL,"Release of DC and RC failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC)) // are we able to delete the RC?
{
ErrorLog("Fail: rendering context releasing");
MessageBox(NULL,"Release rendering context failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
hRC=NULL; // set RC to NULL
}
if (hDC && !ReleaseDC(hWnd,hDC)) // are we able to release the DC?
{
ErrorLog("Fail: device context releasing");
MessageBox(NULL,"Release device context failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hDC=NULL; // set DC to NULL
}
if (hWnd && !DestroyWindow(hWnd)) // are we able to destroy the window?
{
ErrorLog("Fail: window destroying");
MessageBox(NULL,"Could not release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hWnd=NULL; // set hWnd to NULL
}
if (fullscreen) // Are We In Fullscreen Mode?
{
ChangeDisplaySettings(NULL,0); // if so switch back to the desktop
ShowCursor(TRUE); // show mouse pointer
}
// KillFont();
}
/* This code creates our OpenGL Window. Parameters are: *
* title - title to appear at the top of the window *
* width - width of the GL Window or fullscreen mode *
* height - height of the GL Window or fullscreen mode *
* bits - number of bits to use for color (8/16/24/32) *
* fullscreenflag - use fullscreen mode (TRUE) or windowed mode (FALSE) */
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
GLuint PixelFormat; // holds the results after searching for a match
HINSTANCE hInstance; // holds the instance of the application
WNDCLASS wc; // windows class structure
DWORD dwExStyle; // window extended style
DWORD dwStyle; // window style
RECT WindowRect; // grabs rectangle upper left / lower right values
WindowRect.left=(long)0; // set left value to 0
WindowRect.right=(long)width; // set right value to requested width
WindowRect.top=(long)0; // set top value to 0
WindowRect.bottom=(long)height; // set bottom value to requested height
fullscreen=fullscreenflag; // set the global fullscreen flag
hInstance =GetModuleHandle(NULL); // grab an instance for our window
wc.style =CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // redraw on size, and own DC for window.
wc.lpfnWndProc =(WNDPROC) WndProc; // wndproc handles messages
wc.cbClsExtra =0; // no extra window data
wc.cbWndExtra =0; // no extra window data
wc.hInstance =hInstance; // set the instance
wc.hIcon =LoadIcon(NULL, IDI_WINLOGO); // load the default icon
wc.hCursor =LoadCursor(NULL, IDC_ARROW); // load the arrow pointer
wc.hbrBackground=NULL; // no background required for GL
wc.lpszMenuName =NULL; // we don't want a menu
wc.lpszClassName="EU07"; //nazwa okna do komunikacji zdalnej // Set The Class Name
if (!arbMultisampleSupported) //tylko dla pierwszego okna
if (!RegisterClass(&wc)) // Attempt To Register The Window Class
{
ErrorLog("Fail: window class registeration");
MessageBox(NULL,"Failed to register the window class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
if (fullscreen) // Attempt Fullscreen Mode?
{
DEVMODE dmScreenSettings; // device mode
memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // makes sure memory's cleared
dmScreenSettings.dmSize=sizeof(dmScreenSettings); // size of the devmode structure
//tolaris-240403: poprawka na odswiezanie monitora
// locate primary monitor...
if (Global::bAdjustScreenFreq)
{
POINT point; point.x=0; point.y=0;
MONITORINFOEX monitorinfo; monitorinfo.cbSize=sizeof(MONITORINFOEX);
::GetMonitorInfo( ::MonitorFromPoint(point,MONITOR_DEFAULTTOPRIMARY),&monitorinfo);
// ..and query for highest supported refresh rate
unsigned int refreshrate=0;
int i=0;
while (::EnumDisplaySettings(monitorinfo.szDevice,i,&dmScreenSettings))
{
if (i>0)
if (dmScreenSettings.dmPelsWidth==(unsigned int)width)
if (dmScreenSettings.dmPelsHeight==(unsigned int)height)
if (dmScreenSettings.dmBitsPerPel==(unsigned int)bits)
if (dmScreenSettings.dmDisplayFrequency>refreshrate)
refreshrate=dmScreenSettings.dmDisplayFrequency;
++i;
}
// fill refresh rate info for screen mode change
dmScreenSettings.dmDisplayFrequency=refreshrate;
dmScreenSettings.dmFields=DM_DISPLAYFREQUENCY;
}
dmScreenSettings.dmPelsWidth =width; // selected screen width
dmScreenSettings.dmPelsHeight=height; // selected screen height
dmScreenSettings.dmBitsPerPel=bits; // selected bits per pixel
dmScreenSettings.dmFields=dmScreenSettings.dmFields|DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
// Try to set selected mode and get results. NOTE: CDS_FULLSCREEN gets rid of start bar.
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
// If the mode fails, offer two options. Quit or use windowed mode.
ErrorLog("Fail: full screen");
if (MessageBox(NULL,"The requested fullscreen mode is not supported by\nyour video card. Use windowed mode instead?","EU07",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{
fullscreen=FALSE; // Windowed Mode Selected. Fullscreen = FALSE
}
else
{
// Pop Up A Message Box Letting User Know The Program Is Closing.
Error("Program will now close.");
return FALSE; // Return FALSE
}
}
}
if (fullscreen) // Are We Still In Fullscreen Mode?
{
dwExStyle=WS_EX_APPWINDOW; // Window Extended Style
dwStyle=WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // Windows Style
ShowCursor(FALSE); // Hide Mouse Pointer
}
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style
dwStyle=WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; // Windows Style
}
AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle); // Adjust Window To True Requested Size
// Create The Window
if (NULL==(hWnd=CreateWindowEx(dwExStyle, // Extended Style For The Window
"EU07", // Class Name
title, // Window Title
dwStyle | // Defined Window Style
WS_CLIPSIBLINGS | // Required Window Style
WS_CLIPCHILDREN, // Required Window Style
0, 0, // Window Position
WindowRect.right-WindowRect.left, // Calculate Window Width
WindowRect.bottom-WindowRect.top, // Calculate Window Height
NULL, // No Parent Window
NULL, // No Menu
hInstance, // Instance
NULL))) // Dont Pass Anything To WM_CREATE
{
KillGLWindow(); // Reset The Display
ErrorLog("Fail: window creation");
MessageBox(NULL,"Window creation error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be
{
sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1, // Version Number
PFD_DRAW_TO_WINDOW | // Format Must Support Window
PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format
bits, // Select Our Color Depth
0, 0, 0, 0, 0, 0, // Color Bits Ignored
0, // No Alpha Buffer
0, // Shift Bit Ignored
0, // No Accumulation Buffer
0, 0, 0, 0, // Accumulation Bits Ignored
24, // 32Bit Z-Buffer (Depth Buffer)
0, // No Stencil Buffer
0, // No Auxiliary Buffer
PFD_MAIN_PLANE, // Main Drawing Layer
0, // Reserved
0, 0, 0 // Layer Masks Ignored
};
if (NULL==(hDC=GetDC(hWnd))) // Did We Get A Device Context?
{
KillGLWindow(); // Reset The Display
ErrorLog("Fail: device context");
MessageBox(NULL,"Can't create a GL device context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
/*
Our first pass, Multisampling hasn't been created yet, so we create a window normally
If it is supported, then we're on our second pass
that means we want to use our pixel format for sampling
so set PixelFormat to arbMultiSampleformat instead
*/
if (!arbMultisampleSupported)
{
if (NULL==(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
{
KillGLWindow(); // Reset The Display
ErrorLog("Fail: pixelformat");
MessageBox(NULL,"Can't find a suitable pixelformat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
}
else
PixelFormat=arbMultisampleFormat;
if (!SetPixelFormat(hDC,PixelFormat,&pfd)) // Are We Able To Set The Pixel Format?
{
KillGLWindow(); // Reset The Display
ErrorLog("Fail: pixelformat");
MessageBox(NULL,"Can't set the pixelformat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
if (NULL==(hRC=wglCreateContext(hDC))) // Are We Able To Get A Rendering Context?
{
KillGLWindow(); // Reset The Display
ErrorLog("Fail: OpenGL rendering context creation");
MessageBox(NULL,"Can't create a GL rendering context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
if (!wglMakeCurrent(hDC,hRC)) // Try To Activate The Rendering Context
{
KillGLWindow(); // Reset The Display
ErrorLog("Fail: OpenGL rendering context activation");
MessageBox(NULL,"Can't activate the GL rendering context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
/*
Now that our window is created, we want to queary what samples are available
we call our InitMultiSample window
if we return a valid context, we want to destroy our current window
and create a new one using the multisample interface.
*/
if (Global::iMultisampling)
if (!arbMultisampleSupported)
if ((Global::iMultisampling=InitMultisample(hInstance,hWnd,pfd,1<<Global::iMultisampling))!=0)
{
//WriteConsoleOnly("Opening second window for multisampling of "+AnsiString(Global::iMultisampling)+" samples.");
KillGLWindow(); // reset the display
return CreateGLWindow(title,width,height,bits,fullscreenflag); //rekurencja
}
ShowWindow(hWnd,SW_SHOW); // show the window
SetForegroundWindow(hWnd); // slightly higher priority
SetFocus(hWnd); // sets keyboard focus to the window
ReSizeGLScene(width, height); // set up our perspective GL screen
if (!InitGL()) // initialize our newly created GL Window
{
KillGLWindow(); // reset the display
ErrorLog("Fail: OpenGL initialization");
MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // return FALSE
}
return TRUE; //success
}
static int mx=0, my=0;
static POINT mouse;
static int test= 0;
/**/
// ************ Globals ************
//
#define MYDISPLAY 1
PCOPYDATASTRUCT pDane;
LRESULT CALLBACK WndProc(HWND hWnd, //handle for this window
UINT uMsg, //message for this window
WPARAM wParam, //additional message information
LPARAM lParam) //additional message information
{
TRect rect;
switch (uMsg) //check for windows messages
{
case WM_PASTE: //[Ctrl]+[V] potrzebujemy do innych celów
return 0;
case WM_COPYDATA: //obs³uga danych przes³anych przez program steruj¹cy
pDane=(PCOPYDATASTRUCT)lParam;
if (pDane->dwData=='EU07') //sygnatura danych
World.OnCommandGet((DaneRozkaz*)(pDane->lpData));
break;
case WM_ACTIVATE: //watch for window activate message
//case WM_ACTIVATEAPP:
{//Ra: uzale¿nienie aktywnoœci od bycia na wierzchu
Global::bActive=(LOWORD(wParam)!=WA_INACTIVE);
if (Global::bInactivePause) //jeœli ma byæ pauzowanie okna w tle
if (Global::bActive)
Global::iPause&=~4; //odpauzowanie, gdy jest na pierwszym planie
else
Global::iPause|=4; //w³¹czenie pauzy, gdy nieaktywy
if (Global::bActive)
SetCursorPos(mx,my);
ShowCursor(!Global::bActive);
/*
if (!HIWORD(wParam)) //check minimization state
active=TRUE; //program is active
else
active=FALSE; //program is no longer active
*/
return 0; // return to the message loop
}
case WM_SYSCOMMAND: //intercept system commands
{
switch (wParam) //check system calls
{
case 61696: //F10
World.OnKeyDown(VK_F10);
return 0;
case SC_SCREENSAVE: //screensaver trying to start?
case SC_MONITORPOWER: //monitor trying to enter powersave?
return 0; //prevent from happening
}
break; //exit
}
case WM_CLOSE: // did we receive a close message?
{
PostQuitMessage(0); //send a quit message [Alt]+[F4]
return 0; //jump back
}
case WM_MOUSEMOVE:
{
//mx= 100;//Global::iWindowWidth/2;
//my= 100;//Global::iWindowHeight/2;
//SetCursorPos(Global::iWindowWidth/2,Global::iWindowHeight/2);
//m_x= LOWORD(lParam);
//m_y= HIWORD(lParam);
GetCursorPos(&mouse);
if (Global::bActive && ((mouse.x!=mx) || (mouse.y!=my)))
{
World.OnMouseMove(double(mouse.x-mx)*0.005,double(mouse.y-my)*0.01);
SetCursorPos(mx,my);
}
return 0; // jump back
}
case WM_KEYUP :
if (Global::bActive)
{
World.OnKeyUp(wParam);
return 0;
}
case WM_KEYDOWN :
if (Global::bActive)
{
if (wParam!=17) //bo naciœniêcia [Ctrl] nie ma po co przekazywaæ
if (wParam!=145) //[Scroll Lock] te¿ nie
World.OnKeyDown(wParam);
switch (wParam)
{
case VK_ESCAPE: //[Esc] pauzuje tylko bez Debugmode
if (DebugModeFlag) break;
case 19: //[Pause]
if (Global::iPause&1) //jeœli pauza startowa
Global::iPause&=~1; //odpauzowanie, gdy po wczytaniu mia³o nie startowaæ
else if (!(Global::iMultiplayer&2)) //w multiplayerze pauza nie ma sensu
if (!Console::Pressed(VK_CONTROL)) //z [Ctrl] to radiostop jest
//Ra: poni¿sze nie ma sensu, bo brak komunikacji natychmiast zapauzuje ponownie
//if (Global::iPause&8) //jeœli pauza zwi¹zana z brakiem komunikacji z PoKeys
// Global::iPause&=~10; //odpauzowanie pauzy PoKeys (chyba nic nie da) i ewentualnie klawiszowej równie¿
//else
Global::iPause^=2; //zmiana stanu zapauzowania
if (Global::iPause) //jak pauza
Global::iTextMode=VK_F1; //to wyœwietliæ zegar i informacjê
break;
case VK_F7:
if (DebugModeFlag)
{//siatki wyœwietlane tyko w trybie testowym
Global::bWireFrame=!Global::bWireFrame;
++Global::iReCompile; //odœwie¿yæ siatki
//Ra: jeszcze usun¹æ siatki ze skompilowanych obiektów!
}
break;
}
}
return 0; // jump back
case WM_CHAR:
{
/*
switch ((TCHAR) wParam)
{
// case 'q':
// done= true;
// KillGLWindow();
// PostQuitMessage(0);
// DestroyWindow( hWnd );
// break;
};
*/
return 0;
}
case WM_SIZE: //resize the OpenGL window
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width, HiWord=Height
if (GetWindowRect(hWnd,&rect))
{//Ra: zmiana rozmiaru okna bez przesuwania myszy
//mx=WindowWidth/2+rect.left; // horizontal position
//my=WindowHeight/2+rect.top; // vertical position
//SetCursorPos(mx,my);
}
return 0; //jump back
}
case WM_MOVE: //przesuwanie okna?
{
mx=WindowWidth/2+LOWORD(lParam); // horizontal position
my=WindowHeight/2+HIWORD(lParam); // vertical position
//SetCursorPos(mx,my);
break;
}
case WM_PAINT:
{//odrysowanie okna
break;
}
//case WM_ERASEBKGND: //Process this message to keep Windows from erasing background.
case MM_JOY1BUTTONDOWN:
{
//WriteLog("Joystick button "+AnsiString(wParam));
break;
}
case WM_CREATE:
/* Capture the joystick. If this fails, beep and display
* error, then quit.
*/
if (joySetCapture(hWnd,JOYSTICKID1,0,FALSE))
{
//MessageBeep(MB_ICONEXCLAMATION);
//MessageBox(hWnd,"Couldn't capture the joystick",NULL,MB_OK|MB_ICONEXCLAMATION);
//return -1;
}
break;
}
// pass all unhandled messages to DefWindowProc
return DefWindowProc(hWnd,uMsg,wParam,lParam);
};
int WINAPI WinMain( HINSTANCE hInstance, //instance
HINSTANCE hPrevInstance, //previous instance
LPSTR lpCmdLine, //command line parameters
int nCmdShow) //window show state
{
MSG msg; //windows message structure
BOOL done=FALSE; //bool variable to exit loop
fullscreen=true;
DecimalSeparator= '.';
/* //Ra: tutaj to nie dzia³a - zwraca NULL
//najpierw ustalmy wersjê OpenGL
AnsiString glver=((char*)glGetString(GL_VERSION));
while (glver.LastDelimiter(".")>glver.Pos("."))
glver=glver.SubString(1,glver.LastDelimiter(".")-1); //obciêcie od drugiej kropki
try {Global::fOpenGL=glver.ToDouble();} catch (...) {Global::fOpenGL=0.0;}
Global::bOpenGL_1_5=(Global::fOpenGL>=1.5);
*/
DeleteFile("errors.txt"); //usuniêcie starego
Global::LoadIniFile("eu07.ini"); //teraz dopiero mo¿na przejrzeæ plik z ustawieniami
Global::InitKeys("keys.ini"); //wczytanie mapowania klawiszy - jest na sta³e
//hunter-271211: ukrywanie konsoli
if (Global::iWriteLogEnabled&2)
{
AllocConsole();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
}
AnsiString str=lpCmdLine; //parametry uruchomienia
if (!str.IsEmpty())
{//analizowanie parametrów
TQueryParserComp *Parser;
Parser=new TQueryParserComp(NULL);
Parser->TextToParse=lpCmdLine;
Parser->First();
while (!Parser->EndOfFile)
{
str=Parser->GetNextSymbol().LowerCase();
if (str==AnsiString("-s"))
{//nazwa scenerii
str=Parser->GetNextSymbol().LowerCase();
strcpy(Global::szSceneryFile,str.c_str());
}
else if (str==AnsiString("-v"))
{//nazwa wybranego pojazdu
str=Parser->GetNextSymbol().LowerCase();
Global::asHumanCtrlVehicle=str;
}
else if (str==AnsiString("-modifytga"))
{//wykonanie modyfikacji wszystkich plików TGA
Global::iModifyTGA=-1; //specjalny tryb wykonania totalnej modyfikacji
}
else if (str==AnsiString("-e3d"))
{//wygenerowanie wszystkich plików E3D
if (Global::iConvertModels>0)
Global::iConvertModels=-Global::iConvertModels; //specjalny tryb
else
Global::iConvertModels=-7; //z optymalizacj¹, bananami i prawid³owym Opacity
}
else
Error("Program usage: EU07 [-s sceneryfilepath] [-v vehiclename] [-modifytga] [-e3d]",!Global::iWriteLogEnabled);
}
delete Parser; //ABu 050205: tego wczesniej nie bylo
}
/* MC: usunalem tymczasowo bo sie gryzlo z nowym parserem - 8.6.2003
AnsiString csp=AnsiString(Global::szSceneryFile);
csp=csp.Delete(csp.Pos(AnsiString(strrchr(Global::szSceneryFile,'/')))+1,csp.Length());
Global::asCurrentSceneryPath=csp;
*/
fullscreen=Global::bFullScreen;
WindowWidth=Global::iWindowWidth;
WindowHeight=Global::iWindowHeight;
Bpp=Global::iBpp;
if (Bpp!=32) Bpp=16;
//create our OpenGL window
if (!CreateGLWindow(Global::asHumanCtrlVehicle.c_str(),WindowWidth,WindowHeight,Bpp,fullscreen))
return 0; //quit if window was not created
SetForegroundWindow(hWnd);
//McZapkie: proba przeplukania klawiatury
Console *pConsole=new Console(); //Ra: nie wiem, czy ma to sens, ale jakoœ zainicjowac trzeba
while (Console::Pressed(VK_F10))
Error("Keyboard buffer problem - press F10"); //na Windows 98 lubi siê to pojawiaæ
int iOldSpeed, iOldDelay;
SystemParametersInfo(SPI_GETKEYBOARDSPEED,0,&iOldSpeed,0);
SystemParametersInfo(SPI_GETKEYBOARDDELAY,0,&iOldDelay,0);
SystemParametersInfo(SPI_SETKEYBOARDSPEED,20,NULL,0);
//SystemParametersInfo(SPI_SETKEYBOARDDELAY,10,NULL,0);
if (!joyGetNumDevs())
WriteLog("No joystick");
if (Global::iModifyTGA<0)
{//tylko modyfikacja TGA, bez uruchamiania symulacji
Global::iMaxTextureSize=64; //¿eby nie zamulaæ pamiêci
World.ModifyTGA(); //rekurencyjne przegl¹danie katalogów
}
else
{if (Global::iConvertModels<0)
{Global::iConvertModels=-Global::iConvertModels;
World.CreateE3D("models\\"); //rekurencyjne przegl¹danie katalogów
World.CreateE3D("dynamic\\",true);
} //po zrobieniu E3D odpalamy normalnie sceneriê, by j¹ zobaczyæ
//else
//{//g³ówna pêtla programu
Console::On(); //w³¹czenie konsoli
while (!done) //loop that runs while done=FALSE
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //is there a message waiting?
{
if (msg.message==WM_QUIT) //have we received a quit message?
done=TRUE; //if so
else //if not, deal with window messages
{
//if (msg.message==WM_CHAR)
//World.OnKeyDown(msg.wParam);
TranslateMessage(&msg); //translate the message
DispatchMessage(&msg); //dispatch the message
}
}
else //if there are no messages
{
//draw the scene, watch for quit messages
//DrawGLScene()
//if (!pause)
//if (Global::bInactivePause?Global::bActive:true) //tak nie, bo spada z góry
if (World.Update()) // Was There A Quit Received?
SwapBuffers(hDC); // Swap Buffers (Double Buffering)
else
done=true; //[F10] or DrawGLScene signalled a quit
}
}
Console::Off(); //wy³¹czenie konsoli (komunikacji zwrotnej)
}
SystemParametersInfo(SPI_SETKEYBOARDSPEED,iOldSpeed,NULL,0);
SystemParametersInfo(SPI_SETKEYBOARDDELAY,iOldDelay,NULL,0);
delete pConsole; //deaktywania sterownika
//shutdown
KillGLWindow(); //kill the window
return (msg.wParam); //exit the program
}