123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754 |
- /*
- ===========================================================================
- Copyright (C) 1999-2005 Id Software, Inc.
- This file is part of Quake III Arena source code.
- Quake III Arena source code is free software; you can redistribute it
- and/or modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of the License,
- or (at your option) any later version.
- Quake III Arena source code is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with Foobar; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- ===========================================================================
- */
- #include "stdafx.h"
- #include "qe3.h"
- #include "mru.h"
- #include "PrefsDlg.h"
- ////////////////////////////////////////////////////////////////////////////
- // BSP frontend plugin
- // global flag for BSP frontend plugin is g_qeglobals.bBSPFrontendPlugin
- _QERPlugBSPFrontendTable g_BSPFrontendTable;
- CStringArray g_BSPFrontendCommands;
- extern CEdit* g_pEdit;
- int screen_width;
- int screen_height;
- qboolean have_quit;
- int update_bits;
- HANDLE bsp_process;
- //===========================================
- void Sys_MarkMapModified (void)
- {
- char title[1024];
- if (modified != 1)
- {
- modified = true; // mark the map as changed
- sprintf (title, "%s *", currentmap);
- QE_ConvertDOSToUnixName( title, title );
- Sys_SetTitle (title);
- }
- }
- void Sys_SetTitle (char *text)
- {
- SetWindowText (g_qeglobals.d_hwndMain, text);
- }
- HCURSOR waitcursor;
- void Sys_BeginWait (void)
- {
- waitcursor = SetCursor (LoadCursor (NULL, IDC_WAIT));
- }
- void Sys_EndWait (void)
- {
- if (waitcursor)
- {
- SetCursor (waitcursor);
- waitcursor = NULL;
- }
- }
- void Sys_GetCursorPos (int *x, int *y)
- {
- POINT lpPoint;
- GetCursorPos (&lpPoint);
- *x = lpPoint.x;
- *y = lpPoint.y;
- }
- void Sys_SetCursorPos (int x, int y)
- {
- SetCursorPos (x, y);
- }
- void Sys_Beep (void)
- {
- MessageBeep (MB_ICONASTERISK);
- }
- char *TranslateString (char *buf)
- {
- static char buf2[32768];
- int i, l;
- char *out;
- l = strlen(buf);
- out = buf2;
- for (i=0 ; i<l ; i++)
- {
- if (buf[i] == '\n')
- {
- *out++ = '\r';
- *out++ = '\n';
- }
- else
- *out++ = buf[i];
- }
- *out++ = 0;
- return buf2;
- }
- void Sys_ClearPrintf (void)
- {
- char text[4];
- text[0] = 0;
- SendMessage (g_qeglobals.d_hwndEdit, WM_SETTEXT, 0, (LPARAM)text);
- }
- #define SCROLLBACK_MAX_LINES 600
- #define SCROLLBACK_DEL_CHARS 500
- void Sys_Printf (char *text, ...)
- {
- va_list argptr;
- char buf[32768];
- char *out;
- LRESULT result; // PGM
- DWORD oldPosS, oldPosE; // PGM
- va_start (argptr,text);
- vsprintf (buf, text,argptr);
- va_end (argptr);
- out = TranslateString (buf);
- #ifdef LATER
- Sys_Status(out);
- #else
- //PGM
- result = SendMessage (g_qeglobals.d_hwndEdit, EM_GETLINECOUNT, 0, 0);
- if(result > SCROLLBACK_MAX_LINES)
- {
- char replaceText[5];
-
- replaceText[0] = '\0';
- SendMessage (g_qeglobals.d_hwndEdit, WM_SETREDRAW, (WPARAM)0, (LPARAM)0);
- SendMessage (g_qeglobals.d_hwndEdit, EM_GETSEL, (WPARAM)&oldPosS, (LPARAM)&oldPosE);
- SendMessage (g_qeglobals.d_hwndEdit, EM_SETSEL, 0, SCROLLBACK_DEL_CHARS);
- SendMessage (g_qeglobals.d_hwndEdit, EM_REPLACESEL, (WPARAM)0, (LPARAM)replaceText);
- SendMessage (g_qeglobals.d_hwndEdit, EM_SETSEL, oldPosS, oldPosE);
- SendMessage (g_qeglobals.d_hwndEdit, WM_SETREDRAW, (WPARAM)1, (LPARAM)0);
- }
- //PGM
- SendMessage (g_qeglobals.d_hwndEdit, EM_REPLACESEL, 0, (LPARAM)out);
- #endif
- }
- double Sys_DoubleTime (void)
- {
- return clock()/ 1000.0;
- }
- void PrintPixels (HDC hDC)
- {
- int i;
- PIXELFORMATDESCRIPTOR p[64];
- printf ("### flags color layer\n");
- for (i=1 ; i<64 ; i++)
- {
- if (!DescribePixelFormat ( hDC, i, sizeof(p[0]), &p[i]))
- break;
- printf ("%3i %5i %5i %5i\n", i,
- p[i].dwFlags,
- p[i].cColorBits,
- p[i].bReserved);
- }
- printf ("%i modes\n", i-1);
- }
- //==========================================================================
- void QEW_StopGL( HWND hWnd, HGLRC hGLRC, HDC hDC )
- {
- qwglMakeCurrent( NULL, NULL );
- qwglDeleteContext( hGLRC );
- ReleaseDC( hWnd, hDC );
- }
-
- int WINAPI QEW_SetupPixelFormat(HDC hDC, qboolean zbuffer )
- {
- static PIXELFORMATDESCRIPTOR pfd = {
- sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
- 1, // version number
- PFD_DRAW_TO_WINDOW | // support window
- PFD_SUPPORT_OPENGL | // support OpenGL
- PFD_DOUBLEBUFFER, // double buffered
- PFD_TYPE_RGBA, // RGBA type
- 24, // 24-bit 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, // accum bits ignored
- 32, // depth bits
- 0, // no stencil buffer
- 0, // no auxiliary buffer
- PFD_MAIN_PLANE, // main layer
- 0, // reserved
- 0, 0, 0 // layer masks ignored
- }; //
- int pixelformat = 0;
- zbuffer = true;
- if ( !zbuffer )
- pfd.cDepthBits = 0;
- if (g_PrefsDlg.m_bSGIOpenGL)
- {
- if ( (pixelformat = qwglChoosePixelFormat(hDC, &pfd)) == 0 )
- {
- printf("%d",GetLastError());
- Error ("ChoosePixelFormat failed");
- }
-
- if (!qwglSetPixelFormat(hDC, pixelformat, &pfd))
- Error ("SetPixelFormat failed");
- }
- else
- {
- if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 )
- {
- printf("%d",GetLastError());
- Error ("ChoosePixelFormat failed");
- }
- if (!SetPixelFormat(hDC, pixelformat, &pfd))
- Error ("SetPixelFormat failed");
- }
- return pixelformat;
- }
- /*
- =================
- Error
- For abnormal program terminations
- =================
- */
- void Error (char *error, ...)
- {
- va_list argptr;
- char text[1024];
- char text2[1024];
- int err;
-
- err = GetLastError ();
- int i = qglGetError();
-
- va_start (argptr,error);
- vsprintf (text, error,argptr);
- va_end (argptr);
-
- sprintf (text2, "%s\nGetLastError() = %i - %i\nAn unrecoverable error has occured. Would you like to edit Preferences before exiting Q3Radiant?", text, err, i);
-
- if (MessageBox(g_qeglobals.d_hwndMain, text2, "Error", MB_YESNO) == IDYES)
- {
- g_PrefsDlg.LoadPrefs();
- g_PrefsDlg.DoModal();
- }
-
- exit (1);
- }
- void Warning (char *error, ...)
- {
- va_list argptr;
- char text[1024];
- int err;
- err = GetLastError ();
- int i = qglGetError();
- va_start (argptr,error);
- vsprintf (text, error,argptr);
- va_end (argptr);
- Sys_Printf(text);
- }
- /*
- ======================================================================
- FILE DIALOGS
- ======================================================================
- */
-
- qboolean ConfirmModified (void)
- {
- if (!modified)
- return true;
- if (MessageBox (g_qeglobals.d_hwndMain, "This will lose changes to the map"
- , "warning", MB_OKCANCEL) == IDCANCEL)
- return false;
- return true;
- }
- static OPENFILENAME ofn; /* common dialog box structure */
- static char szDirName[MAX_PATH]; /* directory string */
- static char szFile[260]; /* filename string */
- static char szFileTitle[260]; /* file title string */
- static char szFilter[260] = /* filter string */
- "Map file (*.map, *.reg)\0*.map\0*.reg\0\0";
- static char szProjectFilter[260] = /* filter string */
- "Q3Radiant project (*.qe4, *.prj)\0*.qe4\0*.prj\0\0";
- static char chReplace; /* string separator for szFilter */
- static int i, cbString; /* integer count variables */
- static HANDLE hf; /* file handle */
- void OpenDialog (void)
- {
- /*
- * Obtain the system directory name and
- * store it in szDirName.
- */
-
- strcpy (szDirName, ValueForKey (g_qeglobals.d_project_entity, "mapspath") );
- if (strlen(szDirName) == 0)
- {
- strcpy (szDirName, ValueForKey (g_qeglobals.d_project_entity, "basepath") );
- strcat (szDirName, "\\maps");
- }
- /* Place the terminating null character in the szFile. */
-
- szFile[0] = '\0';
-
- /* Set the members of the OPENFILENAME structure. */
-
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = g_qeglobals.d_hwndCamera;
- ofn.lpstrFilter = szFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = szFile;
- ofn.nMaxFile = sizeof(szFile);
- ofn.lpstrFileTitle = szFileTitle;
- ofn.nMaxFileTitle = sizeof(szFileTitle);
- ofn.lpstrInitialDir = szDirName;
- ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST |
- OFN_FILEMUSTEXIST;
- /* Display the Open dialog box. */
-
- if (!GetOpenFileName(&ofn))
- return; // canceled
-
- // Add the file in MRU.
- //FIXME
- AddNewItem( g_qeglobals.d_lpMruMenu, ofn.lpstrFile);
- // Refresh the File menu.
- //FIXME
- PlaceMenuMRUItem(g_qeglobals.d_lpMruMenu,GetSubMenu(GetMenu(g_qeglobals.d_hwndMain),0),
- ID_FILE_EXIT);
- /* Open the file. */
-
- Map_LoadFile (ofn.lpstrFile);
- }
- void ProjectDialog (void)
- {
- /*
- * Obtain the system directory name and
- * store it in szDirName.
- */
-
- strcpy (szDirName, ValueForKey(g_qeglobals.d_project_entity, "basepath") );
- strcat (szDirName, "\\scripts");
- /* Place the terminating null character in the szFile. */
-
- szFile[0] = '\0';
-
- /* Set the members of the OPENFILENAME structure. */
-
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = g_qeglobals.d_hwndCamera;
- ofn.lpstrFilter = szProjectFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = szFile;
- ofn.nMaxFile = sizeof(szFile);
- ofn.lpstrFileTitle = szFileTitle;
- ofn.nMaxFileTitle = sizeof(szFileTitle);
- ofn.lpstrInitialDir = szDirName;
- ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST |
- OFN_FILEMUSTEXIST;
- /* Display the Open dialog box. */
-
- if (!GetOpenFileName(&ofn))
- return; // canceled
-
- // Refresh the File menu.
- PlaceMenuMRUItem(g_qeglobals.d_lpMruMenu,GetSubMenu(GetMenu(g_qeglobals.d_hwndMain),0),
- ID_FILE_EXIT);
- /* Open the file. */
- if (!QE_LoadProject(ofn.lpstrFile))
- Error ("Couldn't load project file");
- }
- extern void AddSlash(CString& strPath);
- void SaveAsDialog (bool bRegion)
- {
- strcpy (szDirName, ValueForKey (g_qeglobals.d_project_entity, "basepath") );
- CString strPath = szDirName;
- AddSlash(strPath);
- strPath += "maps";
- /* Place the terminating null character in the szFile. */
-
- szFile[0] = '\0';
-
- /* Set the members of the OPENFILENAME structure. */
-
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = g_qeglobals.d_hwndCamera;
- ofn.lpstrFilter = szFilter;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = szFile;
- ofn.nMaxFile = sizeof(szFile);
- ofn.lpstrFileTitle = szFileTitle;
- ofn.nMaxFileTitle = sizeof(szFileTitle);
- ofn.lpstrInitialDir = strPath;
- ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST |
- OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT;
- /* Display the Open dialog box. */
-
- if (!GetSaveFileName(&ofn))
- return; // canceled
- if (bRegion)
- DefaultExtension (ofn.lpstrFile, ".reg");
- else
- DefaultExtension (ofn.lpstrFile, ".map");
- if (!bRegion)
- {
- strcpy (currentmap, ofn.lpstrFile);
- AddNewItem(g_qeglobals.d_lpMruMenu, ofn.lpstrFile);
- PlaceMenuMRUItem(g_qeglobals.d_lpMruMenu,GetSubMenu(GetMenu(g_qeglobals.d_hwndMain),0), ID_FILE_EXIT);
- }
- Map_SaveFile (ofn.lpstrFile, bRegion); // ignore region
- }
- /*
- =======================================================
- Menu modifications
- =======================================================
- */
- /*
- ==================
- FillBSPMenu
- ==================
- */
- char *bsp_commands[256];
- void FillBSPMenu (void)
- {
- HMENU hmenu;
- epair_t *ep;
- int i;
- static int count;
- hmenu = GetSubMenu (GetMenu(g_qeglobals.d_hwndMain), MENU_BSP);
- for (i=0 ; i<count ; i++)
- DeleteMenu (hmenu, CMD_BSPCOMMAND+i, MF_BYCOMMAND);
- count = 0;
- if ( g_qeglobals.bBSPFrontendPlugin )
- {
- CString str = g_BSPFrontendTable.m_pfnGetBSPMenu();
- char cTemp[1024];
- strcpy(cTemp, str);
- char* token = strtok(cTemp, ",;");
- if (token && *token == ' ')
- {
- while (*token == ' ')
- token++;
- }
- i = 0;
- // first token is menu name
- ModifyMenu( GetMenu(g_qeglobals.d_hwndMain), MENU_BSP, MF_BYPOSITION, MENU_BSP, (LPCTSTR)token );
- // redraw the menu bar
- DrawMenuBar( g_qeglobals.d_hwndMain );
- token = strtok(NULL, ",;");
- while (token != NULL)
- {
- g_BSPFrontendCommands.Add(token);
- AppendMenu (hmenu, MF_ENABLED|MF_STRING, CMD_BSPCOMMAND+i, (LPCTSTR)token );
- token = strtok(NULL, ",;");
- i++;
- }
- count = i;
- }
- else
- {
- i = 0;
- for (ep = g_qeglobals.d_project_entity->epairs ; ep ; ep=ep->next)
- {
- if (ep->key[0] == 'b' && ep->key[1] == 's' && ep->key[2] == 'p')
- {
- bsp_commands[i] = ep->key;
- AppendMenu (hmenu, MF_ENABLED|MF_STRING,
- CMD_BSPCOMMAND+i, (LPCTSTR)ep->key);
- i++;
- }
- }
- count = i;
- }
- }
- //==============================================
- void AddSlash(CString& strPath)
- {
- if (strPath.GetLength() > 0)
- {
- if (strPath.GetAt(strPath.GetLength()-1) != '\\')
- strPath += '\\';
- }
- }
- bool ExtractPath_and_Filename(const char* pPath, CString& strPath, CString& strFilename)
- {
- CString strPathName = pPath;
- int nSlash = strPathName.ReverseFind('\\');
- if (nSlash >= 0)
- {
- strPath = strPathName.Left(nSlash+1);
- strFilename = strPathName.Right(strPathName.GetLength() - nSlash - 1);
- }
- else strFilename = pPath;
- return true;
- }
- /*
- ===============
- CheckBspProcess
- See if the BSP is done yet
- ===============
- */
- extern void FindReplace(CString& strContents, const char* pTag, const char* pValue);
- extern CTime g_tBegin;
- void CheckBspProcess (void)
- {
- char outputpath[1024];
- char temppath[512];
- DWORD exitcode;
- char *out;
- BOOL ret;
- if (!bsp_process)
- return;
- ret = GetExitCodeProcess (bsp_process, &exitcode);
- if (!ret)
- Error ("GetExitCodeProcess failed");
- if (exitcode == STILL_ACTIVE)
- return;
- bsp_process = 0;
- GetTempPath(512, temppath);
- sprintf (outputpath, "%sjunk.txt", temppath);
- LoadFile (outputpath, (void **)&out);
- Sys_Printf ("%s", out);
- Sys_Printf ("\ncompleted.\n");
- free (out);
- CTime tEnd = CTime::GetCurrentTime();
- CTimeSpan tElapsed = tEnd - g_tBegin;
- CString strElapsed;
- strElapsed.Format("Run time was %i hours, %i minutes and %i seconds", tElapsed.GetHours(), tElapsed.GetMinutes(), tElapsed.GetSeconds());
- Sys_Printf(strElapsed.GetBuffer(0));
- Sys_Beep ();
- Pointfile_Check();
- // run game if no PointFile and pref is set
- //++timo needs to stop after BSP if leaked .. does run through vis and light instead ..
- if (g_PrefsDlg.m_bRunQuake == TRUE && !g_qeglobals.d_pointfile_display_list)
- {
- char cCurDir[1024];
- GetCurrentDirectory(1024, cCurDir);
- CString strExePath = g_PrefsDlg.m_strQuake2;
- CString strOrgPath;
- CString strOrgFile;
- ExtractPath_and_Filename(currentmap, strOrgPath, strOrgFile);
- if (g_PrefsDlg.m_bSetGame == TRUE) // run in place with set game.. don't copy map
- {
- CString strBasePath = ValueForKey(g_qeglobals.d_project_entity, "basepath");
- strExePath += " +set game ";
- strExePath += strBasePath;
- WinExec(strExePath, SW_SHOW);
- }
- else
- {
- CString strCopyPath = strExePath;
- char* pBuffer = strCopyPath.GetBufferSetLength(_MAX_PATH + 1);
- pBuffer[strCopyPath.ReverseFind('\\') + 1] = '\0';
- strCopyPath.ReleaseBuffer();
- SetCurrentDirectory(strCopyPath);
- CString strOrgPath;
- CString strOrgFile;
- ExtractPath_and_Filename(currentmap, strOrgPath, strOrgFile);
- AddSlash(strCopyPath);
- FindReplace(strOrgFile, ".map", ".bsp");
- //++timo modified for Quake3 !!
- strCopyPath += "baseq3\\maps\\";
- strCopyPath += strOrgFile;
- AddSlash(strOrgPath);
- strOrgPath += strOrgFile;
- bool bRun = (strOrgPath.CompareNoCase(strCopyPath) == 0);
- if (!bRun)
- bRun = (CopyFile(strOrgPath, strCopyPath, FALSE) == TRUE);
- if (bRun)
- {
- FindReplace(strOrgFile, ".bsp", "");
- strExePath += " +map ";
- strExePath += strOrgFile;
- WinExec(strExePath, SW_SHOW);
- }
- }
- SetCurrentDirectory(cCurDir);
- }
- }
- extern int cambuttonstate;
- extern "C" {
- void *Com_Allocate( int bytes ) {
- return malloc(bytes);
- }
- void Com_Dealloc( void *ptr ) {
- free(ptr);
- }
- void Com_Printf( const char *msg, ... ) {
- va_list argptr;
- char buf[32768];
- char *out;
- va_start (argptr,msg);
- vsprintf (buf, msg,argptr);
- va_end (argptr);
- out = TranslateString (buf);
- Sys_Printf(buf);
- }
- void Com_Error( int level, const char *error, ... ) {
- va_list argptr;
- char buf[32768];
- char *out;
- va_start (argptr,error);
- vsprintf (buf, error,argptr);
- va_end (argptr);
- out = TranslateString (buf);
- Sys_Printf(buf);
- }
- void Com_DPrintf( const char *msg, ... ) {
- return;
- }
- int FS_Write( const void *buffer, int len, fileHandle_t h ) {
- SafeWrite(reinterpret_cast<FILE*>(h), buffer, len);
- return len;
- }
- int FS_ReadFile( const char *qpath, void **buffer ) {
- CString strPath = ValueForKey(g_qeglobals.d_project_entity, "basepath");
- AddSlash(strPath);
- strPath += qpath;
- return LoadFile(strPath, buffer);
- }
- void FS_FreeFile( void *buffer ) {
- Com_Dealloc(buffer);
- }
- fileHandle_t FS_FOpenFileWrite( const char *filename ) {
- CString strPath = ValueForKey(g_qeglobals.d_project_entity, "basepath");
- AddSlash(strPath);
- strPath += filename;
- // bad casting ptr to int
- return reinterpret_cast<fileHandle_t>(SafeOpenWrite(strPath));
- }
- void FS_FCloseFile( fileHandle_t f ) {
- fclose(reinterpret_cast<FILE*>(f));
- }
- }
|