/*************************************************************************** file : racegl.cpp created : Sat Nov 16 18:22:00 CET 2002 copyright : (C) 2002 by Eric Espié email : eric.espie@torcs.org version : $Id: racegl.cpp,v 1.7 2004/04/05 18:25:00 olethros Exp $ ***************************************************************************/ /*************************************************************************** * * * This program 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. * * * ***************************************************************************/ /** @file @author Eric Espie @version $Id: racegl.cpp,v 1.7 2004/04/05 18:25:00 olethros Exp $ */ #include #include #include #include #include #include "racemain.h" #include "raceinit.h" #include "racestate.h" #include "raceengine.h" #include "racegl.h" static void *reScreenHandle = 0; static void *reHookHandle = 0; static int rePauseId; static int reMsgId; static int reBigMsgId; static float bgcolor[4] = {0.0, 0.0, 0.0, 0.0}; static float white[4] = {1.0, 1.0, 1.0, 1.0}; static float red[4] = {1.0, 0.0, 0.0, 1.0}; static void reDisplay(void) { ReStateManage(); } static void reScreenActivate(void * /* dummy */) { glutDisplayFunc(reDisplay); if ((ReInfo->s->_raceState & RM_RACE_PAUSED) == 0) { ReStart(); /* resynchro */ } glutPostRedisplay(); } static void ReBoardInfo(void * /* vboard */) { if (ReInfo->s->_raceState & RM_RACE_PAUSED) { ReInfo->s->_raceState &= ~RM_RACE_PAUSED; ReStart(); GfuiVisibilitySet(reScreenHandle, rePauseId, 0); } else { ReInfo->s->_raceState |= RM_RACE_PAUSED; ReStop(); GfuiVisibilitySet(reScreenHandle, rePauseId, 1); } } static void reSkipPreStart(void * /* dummy */) { if (ReInfo->s->currentTime < -1.0) { ReInfo->s->currentTime = -1.0; ReInfo->_reLastTime = -1.0; } } static void reMovieCapture(void * /* dummy */) { tRmMovieCapture *capture = &(ReInfo->movieCapture); if (!capture->enabled || (ReInfo->_displayMode == RM_DISP_MODE_NONE)) { GfOut("Video Capture Mode Not Enabled\n"); return; } capture->state = 1 - capture->state; if (capture->state) { GfOut("Video Capture Mode On\n"); capture->currentFrame = 0; capture->currentCapture++; capture->lastFrame = GfTimeClock() - capture->deltaFrame; ReInfo->_displayMode = RM_DISP_MODE_CAPTURE; } else { GfOut("Video Capture Mode Off\n"); ReInfo->_displayMode = RM_DISP_MODE_NORMAL; ReStart(); } } static void reAddKeys(void) { GfuiAddSKey(reScreenHandle, GLUT_KEY_F1, "Help", reScreenHandle, GfuiHelpScreen, NULL); GfuiAddSKey(reScreenHandle, GLUT_KEY_F12, "Screen Shot", NULL, GfuiScreenShot, NULL); GfuiAddKey(reScreenHandle, '-', "Slow Time", (void*)0, ReTimeMod, NULL); GfuiAddKey(reScreenHandle, '+', "Accelerate Time", (void*)1, ReTimeMod, NULL); GfuiAddKey(reScreenHandle, '.', "Real Time", (void*)2, ReTimeMod, NULL); GfuiAddKey(reScreenHandle, 'p', "Pause Race", (void*)0, ReBoardInfo, NULL); GfuiAddKey(reScreenHandle, 27, "Stop Current Race", (void*)RE_STATE_RACE_STOP, ReStateApply, NULL); /* GfuiAddKey(reScreenHandle, 'q', "Exit of TORCS", (void*)RE_STATE_EXIT, ReStateApply, NULL); */ GfuiAddKey(reScreenHandle, ' ', "Skip Pre Start", (void*)0, reSkipPreStart, NULL); #ifdef DEBUG //GfuiAddKey(reScreenHandle, '0', "One step simulation", (void*)1, reOneStep, NULL); #endif GfuiAddKey(reScreenHandle, 'c', "Movie Capture", (void*)0, reMovieCapture, NULL); } void ReSetRaceMsg(char *msg) { static char *curMsg = 0; if (curMsg) free(curMsg); if (msg) { curMsg = strdup(msg); GfuiLabelSetText(reScreenHandle, reMsgId, curMsg); } else { curMsg = 0; GfuiLabelSetText(reScreenHandle, reMsgId, ""); } } void ReSetRaceBigMsg(char *msg) { static char *curMsg = 0; if (curMsg) free(curMsg); if (msg) { curMsg = strdup(msg); GfuiLabelSetText(reScreenHandle, reBigMsgId, curMsg); } else { curMsg = 0; GfuiLabelSetText(reScreenHandle, reBigMsgId, ""); } } void * ReScreenInit(void) { ReScreenShutdown(); reScreenHandle = GfuiScreenCreateEx(bgcolor, 0, reScreenActivate, 0, 0, 0); reAddKeys(); reMsgId = GfuiLabelCreateEx(reScreenHandle, "", red, GFUI_FONT_LARGE_C, 320, 400, GFUI_ALIGN_HC_VB, 32); rePauseId = GfuiLabelCreateEx(reScreenHandle, "P A U S E", red, GFUI_FONT_BIG_C, 320, 420, GFUI_ALIGN_HC_VB, 0); reBigMsgId = GfuiLabelCreateEx(reScreenHandle, "", red, GFUI_FONT_BIG_C, 320, 360, GFUI_ALIGN_HC_VB, 32); GfuiVisibilitySet(reScreenHandle, rePauseId, 0); return reScreenHandle; } void ReScreenShutdown(void) { if (reScreenHandle) { GfuiScreenRelease(reScreenHandle); reScreenHandle = 0; } } static void reHookActivate(void * /* dummy */) { ReStateManage(); } void * ReHookInit(void) { if (reHookHandle) { return reHookHandle; } reHookHandle = GfuiHookCreate(0, reHookActivate); return reHookHandle; } void ReHookShutdown(void) { if (reHookHandle) { GfuiHookRelease(reHookHandle); reHookHandle = 0; } } /**************************************************************************/ /* * Result only screen */ #define LINES 21 static float *reColor[] = {white, red}; static void *reResScreenHdle = 0; static int reResTitleId; static int reResMsgId[LINES]; static int reResMsgClr[LINES]; static char *reResMsg[LINES]; static int reCurLine; static void reAddResKeys(void) { GfuiAddSKey(reResScreenHdle, GLUT_KEY_F1, "Help", reScreenHandle, GfuiHelpScreen, NULL); GfuiAddSKey(reResScreenHdle, GLUT_KEY_F12, "Screen Shot", NULL, GfuiScreenShot, NULL); GfuiAddKey(reResScreenHdle, 27, "Stop Current Race", (void*)RE_STATE_RACE_STOP, ReStateApply, NULL); /* GfuiAddKey(reResScreenHdle, 'q', "Exit of TORCS", (void*)RE_STATE_EXIT, ReStateApply, NULL); */ } static void reResScreenActivate(void * /* dummy */) { glutDisplayFunc(reDisplay); GfuiDisplay(); glutPostRedisplay(); } static void reContDisplay(void) { GfuiDisplay(); glutPostRedisplay(); } static void reResCont(void * /* dummy */) { ReStateManage(); } static void reResScreenShutdown(void * /* dummy */) { int i; for (i = 1; i < LINES; i++) { FREEZ(reResMsg[i]); } } void * ReResScreenInit(void) { int i; int y, dy; char *img; static char *title[3] = {"Practice", "Qualifications", "Race"}; if (reResScreenHdle) { GfuiScreenRelease(reResScreenHdle); } reResScreenHdle = GfuiScreenCreateEx(bgcolor, 0, reResScreenActivate, 0, reResScreenShutdown, 0); GfuiTitleCreate(reResScreenHdle, title[ReInfo->s->_raceType], strlen(title[ReInfo->s->_raceType])); img = GfParmGetStr(ReInfo->params, RM_SECT_HEADER, RM_ATTR_RUNIMG, 0); if (img) { GfuiScreenAddBgImg(reResScreenHdle, img); } reAddResKeys(); reResTitleId = GfuiLabelCreateEx(reResScreenHdle, "", red, GFUI_FONT_LARGE_C, 320, 420, GFUI_ALIGN_HC_VB, 50); y = 400; dy = 378 / LINES; for (i = 0; i < LINES; i++) { FREEZ(reResMsg[i]); reResMsgClr[i] = 0; reResMsgId[i] = GfuiLabelCreateEx(reResScreenHdle, "", white, GFUI_FONT_MEDIUM_C, 20, y, GFUI_ALIGN_HL_VB, 120); y -= dy; } reCurLine = 0; return reResScreenHdle; } void ReResScreenSetTitle(char *title) { if (reResScreenHdle) { GfuiLabelSetText(reResScreenHdle, reResTitleId, title); } } void ReResScreenAddText(char *text) { int i; if (reCurLine == LINES) { free(reResMsg[0]); for (i = 1; i < LINES; i++) { reResMsg[i - 1] = reResMsg[i]; GfuiLabelSetText(reResScreenHdle, reResMsgId[i - 1], reResMsg[i]); } reCurLine--; } reResMsg[reCurLine] = strdup(text); GfuiLabelSetText(reResScreenHdle, reResMsgId[reCurLine], reResMsg[reCurLine]); reCurLine++; } void ReResScreenSetText(char *text, int line, int clr) { if (line < LINES) { FREEZ(reResMsg[line]); reResMsg[line] = strdup(text); if ((clr >= 0) && (clr < 2)) { reResMsgClr[line] = clr; } else { reResMsgClr[line] = 0; } GfuiLabelSetText(reResScreenHdle, reResMsgId[line], reResMsg[line]); GfuiLabelSetColor(reResScreenHdle, reResMsgId[line], reColor[reResMsgClr[line]]); } } int ReResGetLines(void) { return LINES; } void ReResEraseScreen(void) { int i; for (i = 0; i < LINES; i++) { ReResScreenSetText("", i, 0); } } void ReResScreenRemoveText(int line) { if (line < LINES) { FREEZ(reResMsg[line]); GfuiLabelSetText(reResScreenHdle, reResMsgId[line], ""); } } void ReResShowCont(void) { GfuiButtonCreate(reResScreenHdle, "Continue", GFUI_FONT_LARGE_C, 320, 15, GFUI_BTNSZ, GFUI_ALIGN_HC_VB, 0, 0, reResCont, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL); GfuiAddKey(reResScreenHdle, 13, "Continue", 0, reResCont, NULL); GfuiAddKey(reResScreenHdle, 27, "Continue", 0, reResCont, NULL); glutDisplayFunc(reContDisplay); glutPostRedisplay(); }