aboutsummaryrefslogtreecommitdiffstats
path: root/q3radiant/WIN_QE3.CPP
diff options
context:
space:
mode:
Diffstat (limited to 'q3radiant/WIN_QE3.CPP')
-rwxr-xr-xq3radiant/WIN_QE3.CPP753
1 files changed, 753 insertions, 0 deletions
diff --git a/q3radiant/WIN_QE3.CPP b/q3radiant/WIN_QE3.CPP
new file mode 100755
index 0000000..86cad56
--- /dev/null
+++ b/q3radiant/WIN_QE3.CPP
@@ -0,0 +1,753 @@
+/*
+===========================================================================
+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));
+}
+
+
+
+}
+