Fixed #153 (full width 3rd split screen in 3-way mode) & #154 (TAB key to switch between ssplit screens); Re #155 (sound follows currently active screen) & #156 (save/restore split screen state)
git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@2717 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 118329f950d5ef2e73af6de28b44bdb380409e06 Former-commit-id: 7f50848f468dd704380ae3b24db4e550bea3b48d
This commit is contained in:
parent
779473d3b0
commit
8d55096c04
7 changed files with 228 additions and 170 deletions
|
@ -148,19 +148,19 @@ cGrBoard::selectBoard(int val)
|
|||
* 1 - Display the FPS only
|
||||
* 2 - Display FPS, the segment the car is on, car's distance from startline, current camera
|
||||
*
|
||||
* @param fps Frame per second value to display
|
||||
* @param instFps Instant frame rate value to display
|
||||
* @param avgFps Average frame rate value to display
|
||||
* @param car The current car
|
||||
*/
|
||||
void
|
||||
cGrBoard::grDispDebug(float fps, tCarElt *car)
|
||||
cGrBoard::grDispDebug(float instFps, float avgFps, tCarElt *car)
|
||||
{
|
||||
char buf[256];
|
||||
int x, y;
|
||||
x = Winx + Winw - 100;
|
||||
y = Winy + Winh - 15;
|
||||
int x = Winx + Winw - 100;
|
||||
int y = Winy + Winh - 15;
|
||||
|
||||
//Display frame per second
|
||||
sprintf(buf, "FPS: %.1f", fps);
|
||||
//Display frame rates (instant and average)
|
||||
sprintf(buf, "FPS: %.1f(%.1f)", instFps, avgFps);
|
||||
GfuiPrintString(buf, grWhite, GFUI_FONT_SMALL_C, x, y, GFUI_ALIGN_HL_VB);
|
||||
|
||||
if(debugFlag == 2) { //Only display detailed information in Debug Mode 2
|
||||
|
@ -301,20 +301,25 @@ cGrBoard::grDrawGauge(tdble X1, tdble Y1, tdble H, float *clr1, float *clr2, tdb
|
|||
}
|
||||
|
||||
void
|
||||
cGrBoard::grDispMisc(tCarElt *car)
|
||||
cGrBoard::grDispMisc(bool bCurrentScreen)
|
||||
{
|
||||
float *clr;
|
||||
|
||||
if (car->_fuel < 5.0f) {
|
||||
clr = grRed;
|
||||
} else {
|
||||
clr = grWhite;
|
||||
if (bCurrentScreen)
|
||||
{
|
||||
// Draw the current screen indicator (only in split screen mode)
|
||||
// (a green-filled square on the bottom right corner of the screen).
|
||||
static const float h = 10.0f;
|
||||
const float w = h; // * Winh / Winw;
|
||||
const float x = Winx + Winw - w - 5; // * Winh / Winw;
|
||||
const float y = Winy + 5;
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
glColor4f(0.0, 1.0, 0.0, 1.0);
|
||||
glVertex2f(x, y);
|
||||
glVertex2f(x + w, y);
|
||||
glVertex2f(x + w, y + h);
|
||||
glVertex2f(x, y + h);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
tdble fw = Winw/800.0f;
|
||||
|
||||
grDrawGauge(545.0f*fw, 20.0f*fw, 80.0f, clr, grBlack, car->_fuel / car->_tank, "F");
|
||||
grDrawGauge(560.0f*fw, 20.0f*fw, 80.0f, grRed, grGreen, (tdble)(car->_dammage) / grMaxDammage, "D");
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -863,7 +868,17 @@ cGrBoard::grDispCounterBoard2(tCarElt *car)
|
|||
}
|
||||
|
||||
if (counterFlag == 1){
|
||||
grDispMisc(car);
|
||||
float *clr;
|
||||
if (car->_fuel < 5.0f) {
|
||||
clr = grRed;
|
||||
} else {
|
||||
clr = grWhite;
|
||||
}
|
||||
|
||||
const tdble fw = Winw/800.0f;
|
||||
|
||||
grDrawGauge(545.0f*fw, 20.0f*fw, 80.0f, clr, grBlack, car->_fuel / car->_tank, "F");
|
||||
grDrawGauge(560.0f*fw, 20.0f*fw, 80.0f, grRed, grGreen, (tdble)(car->_dammage) / grMaxDammage, "D");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1116,19 +1131,27 @@ void cGrBoard::grGetLapsTime(tSituation *s, tCarElt *car, char* result, char con
|
|||
}
|
||||
}
|
||||
|
||||
void cGrBoard::refreshBoard(tSituation *s, float Fps, int forceArcade, tCarElt *curr)
|
||||
void cGrBoard::refreshBoard(tSituation *s, float instFps, float avgFps,
|
||||
bool forceArcade, tCarElt *currCar, bool isCurrScreen)
|
||||
{
|
||||
grDispMisc(isCurrScreen);
|
||||
|
||||
if (arcadeFlag || forceArcade) {
|
||||
grDispArcade(curr, s);
|
||||
grDispArcade(currCar, s);
|
||||
} else {
|
||||
if (debugFlag) grDispDebug(Fps, curr);
|
||||
if (GFlag) grDispGGraph(curr);
|
||||
if (boardFlag) grDispCarBoard(curr, s);
|
||||
if (leaderFlag) grDispLeaderBoard(curr, s);
|
||||
if (counterFlag) grDispCounterBoard2(curr);
|
||||
if (debugFlag)
|
||||
grDispDebug(instFps, avgFps, currCar);
|
||||
if (GFlag)
|
||||
grDispGGraph(currCar);
|
||||
if (boardFlag)
|
||||
grDispCarBoard(currCar, s);
|
||||
if (leaderFlag)
|
||||
grDispLeaderBoard(currCar, s);
|
||||
if (counterFlag)
|
||||
grDispCounterBoard2(currCar);
|
||||
}
|
||||
|
||||
trackMap->display(curr, s, Winx, Winy, Winw, Winh);
|
||||
|
||||
trackMap->display(currCar, s, Winx, Winy, Winw, Winh);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -40,25 +40,25 @@ class cGrBoard
|
|||
int counterFlag;
|
||||
int GFlag;
|
||||
int arcadeFlag;
|
||||
std::vector<std::string> sShortNames;
|
||||
std::vector<std::string> sShortNames;
|
||||
|
||||
private:
|
||||
void grDispDebug(float fps, tCarElt *car);
|
||||
void grDispDebug(float instFps, float avgFps, tCarElt *car);
|
||||
void grDispGGraph(tCarElt *car);
|
||||
void grDispCarBoard1(tCarElt *car, tSituation *s);
|
||||
void grDispMisc(tCarElt *car);
|
||||
void grDispMisc(bool bCurrentScreen);
|
||||
void grDrawGauge(tdble X1, tdble Y1, tdble H, float *clr1, float *clr2, tdble val, const char *title);
|
||||
void grDispCarBoard2(tCarElt *car, tSituation *s);
|
||||
void grDispCarBoard(tCarElt *car, tSituation *s);
|
||||
void grDispCounterBoard(tCarElt *car);
|
||||
void grDispLeaderBoard(const tCarElt *car, const tSituation *s);
|
||||
void grDispLeaderBoardScroll(const tCarElt *car, const tSituation *s) const;
|
||||
void grDispLeaderBoardScrollLine(const tCarElt *car, const tSituation *s);
|
||||
void grDispLeaderBoardScrollLine(const tCarElt *car, const tSituation *s);
|
||||
void grDispCounterBoard2(tCarElt *car);
|
||||
void grDispArcade(tCarElt *car, tSituation *s);
|
||||
std::string grGenerateLeaderBoardEntry(const tCarElt *car, const tSituation *s, const bool isLeader) const;
|
||||
// Track overview object
|
||||
cGrTrackMap *trackMap;
|
||||
std::string grGenerateLeaderBoardEntry(const tCarElt *car, const tSituation *s, const bool isLeader) const;
|
||||
// Track overview object
|
||||
cGrTrackMap *trackMap;
|
||||
|
||||
bool grGetSplitTime(tSituation *s, tCarElt *car, bool gap_inrace, double &time, int *laps_different, float **color);
|
||||
void grGetLapsTime(tSituation *s, tCarElt *car, char* result, char const** label) const;
|
||||
|
@ -66,16 +66,16 @@ class cGrBoard
|
|||
|
||||
public:
|
||||
cGrBoard(int myid);
|
||||
~cGrBoard();
|
||||
~cGrBoard();
|
||||
|
||||
void initBoard(void);
|
||||
void shutdown(void);
|
||||
void selectBoard(int brd);
|
||||
void dispGaph(tCarElt *car);
|
||||
void initBoardCar(tCarElt *car);
|
||||
inline cGrTrackMap *getTrackMap() { return trackMap; }
|
||||
inline cGrTrackMap *getTrackMap() { return trackMap; }
|
||||
|
||||
void refreshBoard(tSituation *s, float Fps, int forceArcade, tCarElt *curr);
|
||||
void refreshBoard(tSituation *s, float instFps, float avgFps,
|
||||
bool forceArcade, tCarElt *currCar, bool isCurrScreen);
|
||||
void loadDefaults(tCarElt *curCar);
|
||||
};
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <plib/ssg.h>
|
||||
#include <glfeatures.h>
|
||||
#include <robot.h> //ROB_SECT_ARBITRARY
|
||||
|
@ -39,14 +38,8 @@
|
|||
#include "grboard.h"
|
||||
#include "grtracklight.h"
|
||||
|
||||
|
||||
int maxTextureUnits = 0;
|
||||
static double OldTime;
|
||||
static int nFrame;
|
||||
static int nTotalFrame;
|
||||
static int nSeconds;
|
||||
float grFps;
|
||||
double grCurTime;
|
||||
double grDeltaTime;
|
||||
int segIndice = 0;
|
||||
|
||||
tdble grMaxDammage = 10000.0;
|
||||
|
@ -57,16 +50,28 @@ void *grTrackHandle = NULL;
|
|||
|
||||
int grWinx, grWiny, grWinw, grWinh;
|
||||
|
||||
static float grMouseRatioX, grMouseRatioY;
|
||||
|
||||
tgrCarInfo *grCarInfo;
|
||||
ssgContext grContext;
|
||||
class cGrScreen *grScreens[GR_NB_MAX_SCREEN] = {NULL, NULL, NULL, NULL};
|
||||
int grNbScreen = 1;
|
||||
tdble grLodFactorValue = 1.0;
|
||||
|
||||
// FPS indicator variables.
|
||||
static float grInstFps; // Instant frame rate (average along a 1 second shifting window).
|
||||
static float grAvgFps; // Average frame rate (since the beginning of the race).
|
||||
static double dFPSPrevTime;
|
||||
static int nFPSFrames;
|
||||
static int nFPSTotalFrames;
|
||||
static int nFPSTotalSeconds;
|
||||
|
||||
// Mouse coords graphics backend to screen ratios.
|
||||
static float fMouseRatioX, fMouseRatioY;
|
||||
|
||||
// Number of active screens.
|
||||
int grNbActiveScreens = 1;
|
||||
|
||||
// Current screen index.
|
||||
static int nCurrentScreenIndex = 0;
|
||||
|
||||
static char buf[1024];
|
||||
|
||||
#ifdef WIN32
|
||||
#include <GL/glext.h>
|
||||
|
@ -108,33 +113,45 @@ bool InitMultiTex(void)
|
|||
}
|
||||
|
||||
|
||||
static void grAdaptScreenSize(void)
|
||||
static void
|
||||
grAdaptScreenSize(void)
|
||||
{
|
||||
switch (grNbScreen) {
|
||||
case 0:
|
||||
case 1:
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw, grWinh);
|
||||
grScreens[1]->deactivate();
|
||||
grScreens[2]->deactivate();
|
||||
grScreens[3]->deactivate();
|
||||
break;
|
||||
case 2:
|
||||
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw, grWinh / 2);
|
||||
grScreens[1]->activate(grWinx, grWiny, grWinw, grWinh / 2);
|
||||
grScreens[2]->deactivate();
|
||||
grScreens[3]->deactivate();
|
||||
break;
|
||||
case 3:
|
||||
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
|
||||
grScreens[1]->activate(grWinx + grWinw / 2, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
|
||||
grScreens[2]->activate(grWinx + grWinw / 4, grWiny, grWinw / 2, grWinh / 2);
|
||||
grScreens[3]->deactivate();
|
||||
break;
|
||||
case 4:
|
||||
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
|
||||
grScreens[1]->activate(grWinx + grWinw / 2, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
|
||||
grScreens[2]->activate(grWinx, grWiny, grWinw / 2, grWinh / 2);
|
||||
grScreens[3]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh / 2);
|
||||
switch (grNbActiveScreens)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
// Full window.
|
||||
grScreens[0]->activate(grWinx, grWiny, grWinw, grWinh);
|
||||
grScreens[1]->deactivate();
|
||||
grScreens[2]->deactivate();
|
||||
grScreens[3]->deactivate();
|
||||
break;
|
||||
case 2:
|
||||
// Top half of the window
|
||||
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw, grWinh / 2);
|
||||
// Bottom half of the window
|
||||
grScreens[1]->activate(grWinx, grWiny, grWinw, grWinh / 2);
|
||||
grScreens[2]->deactivate();
|
||||
grScreens[3]->deactivate();
|
||||
break;
|
||||
case 3:
|
||||
// Top left quarter of the window
|
||||
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
|
||||
// Top right quarter of the window
|
||||
grScreens[1]->activate(grWinx + grWinw / 2, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
|
||||
// Bottom half of the window
|
||||
grScreens[2]->activate(grWinx, grWiny, grWinw, grWinh / 2);
|
||||
grScreens[3]->deactivate();
|
||||
break;
|
||||
case 4:
|
||||
// Top left quarter of the window
|
||||
grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
|
||||
// Top right quarter of the window
|
||||
grScreens[1]->activate(grWinx + grWinw / 2, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
|
||||
// Bottom left quarter of the window
|
||||
grScreens[2]->activate(grWinx, grWiny, grWinw / 2, grWinh / 2);
|
||||
// Bottom right quarter of the window
|
||||
grScreens[3]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh / 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -142,90 +159,98 @@ static void grAdaptScreenSize(void)
|
|||
static void
|
||||
grSplitScreen(void *vp)
|
||||
{
|
||||
// Change the number of active screens as specified.
|
||||
long p = (long)vp;
|
||||
|
||||
switch (p) {
|
||||
case GR_SPLIT_ADD:
|
||||
grNbScreen++;
|
||||
if (grNbScreen > GR_NB_MAX_SCREEN) {
|
||||
grNbScreen = GR_NB_MAX_SCREEN;
|
||||
}
|
||||
break;
|
||||
case GR_SPLIT_REM:
|
||||
grNbScreen--;
|
||||
if (grNbScreen < 1) {
|
||||
grNbScreen = 1;
|
||||
}
|
||||
break;
|
||||
case GR_SPLIT_ADD:
|
||||
if (grNbActiveScreens < GR_NB_MAX_SCREEN)
|
||||
grNbActiveScreens++;
|
||||
break;
|
||||
case GR_SPLIT_REM:
|
||||
if (grNbActiveScreens > 1)
|
||||
grNbActiveScreens--;
|
||||
break;
|
||||
}
|
||||
GfParmSetNum(grHandle, GR_SCT_DISPMODE, GR_ATT_NB_SCREENS, NULL, grNbScreen);
|
||||
|
||||
// Ensure current screen index stays in the righ range.
|
||||
if (nCurrentScreenIndex >= grNbActiveScreens)
|
||||
nCurrentScreenIndex = grNbActiveScreens - 1;
|
||||
|
||||
// Save nb of active screens to user settings.
|
||||
GfParmSetNum(grHandle, GR_SCT_DISPMODE, GR_ATT_NB_SCREENS, NULL, grNbActiveScreens);
|
||||
GfParmWriteFile(NULL, grHandle, "Graph");
|
||||
grAdaptScreenSize();
|
||||
}
|
||||
|
||||
static class cGrScreen *
|
||||
grGetcurrentScreen(void)
|
||||
static void
|
||||
grChangeScreen(void *vp)
|
||||
{
|
||||
tMouseInfo *mouse;
|
||||
int i;
|
||||
int x, y;
|
||||
long p = (long)vp;
|
||||
|
||||
mouse = GfuiMouseInfo();
|
||||
x = (int)(mouse->X * grMouseRatioX);
|
||||
y = (int)(mouse->Y * grMouseRatioY);
|
||||
for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
|
||||
if (grScreens[i]->isInScreen(x, y)) {
|
||||
return grScreens[i];
|
||||
}
|
||||
switch (p) {
|
||||
case GR_NEXT_SCREEN:
|
||||
nCurrentScreenIndex = (nCurrentScreenIndex + 1) % grNbActiveScreens;
|
||||
break;
|
||||
case GR_PREV_SCREEN:
|
||||
nCurrentScreenIndex = (nCurrentScreenIndex - 1 + grNbActiveScreens) % grNbActiveScreens;
|
||||
break;
|
||||
}
|
||||
return grScreens[0];
|
||||
GfLogInfo("Changing current screen to #%d (out of %d)\n", nCurrentScreenIndex, grNbActiveScreens);
|
||||
}
|
||||
|
||||
class cGrScreen *
|
||||
grGetCurrentScreen(void)
|
||||
{
|
||||
return grScreens[nCurrentScreenIndex];
|
||||
}
|
||||
|
||||
static void
|
||||
grSetZoom(void *vp)
|
||||
{
|
||||
grGetcurrentScreen()->setZoom((long)vp);
|
||||
grGetCurrentScreen()->setZoom((long)vp);
|
||||
}
|
||||
|
||||
static void
|
||||
grSelectCamera(void *vp)
|
||||
{
|
||||
grGetcurrentScreen()->selectCamera((long)vp);
|
||||
grGetCurrentScreen()->selectCamera((long)vp);
|
||||
}
|
||||
|
||||
static void
|
||||
grSelectBoard(void *vp)
|
||||
{
|
||||
grGetcurrentScreen()->selectBoard((long)vp);
|
||||
grGetCurrentScreen()->selectBoard((long)vp);
|
||||
}
|
||||
|
||||
static void
|
||||
grSelectTrackMap(void * /* vp */)
|
||||
{
|
||||
grGetcurrentScreen()->selectTrackMap();
|
||||
grGetCurrentScreen()->selectTrackMap();
|
||||
}
|
||||
|
||||
static void
|
||||
grPrevCar(void * /* dummy */)
|
||||
{
|
||||
grGetcurrentScreen()->selectPrevCar();
|
||||
grGetCurrentScreen()->selectPrevCar();
|
||||
}
|
||||
|
||||
static void
|
||||
grNextCar(void * /* dummy */)
|
||||
{
|
||||
grGetcurrentScreen()->selectNextCar();
|
||||
grGetCurrentScreen()->selectNextCar();
|
||||
}
|
||||
|
||||
static void
|
||||
grSwitchMirror(void * /* dummy */)
|
||||
{
|
||||
grGetcurrentScreen()->switchMirror();
|
||||
grGetCurrentScreen()->switchMirror();
|
||||
}
|
||||
|
||||
int
|
||||
initView(int x, int y, int width, int height, int /* flag */, void *screen)
|
||||
{
|
||||
char buf[256];
|
||||
int i;
|
||||
|
||||
if (maxTextureUnits==0)
|
||||
|
@ -238,14 +263,15 @@ initView(int x, int y, int width, int height, int /* flag */, void *screen)
|
|||
grWinw = width;
|
||||
grWinh = height;
|
||||
|
||||
grMouseRatioX = width / 640.0;
|
||||
grMouseRatioY = height / 480.0;
|
||||
fMouseRatioX = width / 640.0;
|
||||
fMouseRatioY = height / 480.0;
|
||||
|
||||
OldTime = GfTimeClock();
|
||||
nFrame = 0;
|
||||
nTotalFrame = 0;
|
||||
nSeconds = 0;
|
||||
grFps = 0;
|
||||
dFPSPrevTime = GfTimeClock();
|
||||
nFPSFrames = 0;
|
||||
nFPSTotalFrames = 0;
|
||||
nFPSTotalSeconds = 0;
|
||||
grInstFps = 0;
|
||||
grAvgFps = 0;
|
||||
|
||||
if (!grHandle)
|
||||
{
|
||||
|
@ -275,21 +301,24 @@ initView(int x, int y, int width, int height, int /* flag */, void *screen)
|
|||
GfuiAddKey(screen, GFUIK_F10, "Follow Car Zoomed", (void*)8, grSelectCamera, NULL);
|
||||
GfuiAddKey(screen, GFUIK_F11, "TV Director View", (void*)9, grSelectCamera, NULL);
|
||||
|
||||
GfuiAddKey(screen, '5', "FPS Counter", (void*)3, grSelectBoard, NULL);
|
||||
GfuiAddKey(screen, '5', "Debug Info", (void*)3, grSelectBoard, NULL);
|
||||
GfuiAddKey(screen, '4', "G/Cmd Graph", (void*)4, grSelectBoard, NULL);
|
||||
GfuiAddKey(screen, '3', "Leaders Board", (void*)2, grSelectBoard, NULL);
|
||||
GfuiAddKey(screen, '2', "Driver Counters", (void*)1, grSelectBoard, NULL);
|
||||
GfuiAddKey(screen, '1', "Driver Board", (void*)0, grSelectBoard, NULL);
|
||||
GfuiAddKey(screen, '9', "Mirror", (void*)0, grSwitchMirror, NULL);
|
||||
GfuiAddKey(screen, '0', "Arcade Board", (void*)5, grSelectBoard, NULL);
|
||||
GfuiAddKey(screen, '>', "Zoom In", (void*)GR_ZOOM_IN, grSetZoom, NULL);
|
||||
GfuiAddKey(screen, '<', "Zoom Out", (void*)GR_ZOOM_OUT, grSetZoom, NULL);
|
||||
GfuiAddKey(screen, '[', "Split Screen", (void*)GR_SPLIT_ADD, grSplitScreen, NULL);
|
||||
GfuiAddKey(screen, ']', "UnSplit Screen", (void*)GR_SPLIT_REM, grSplitScreen, NULL);
|
||||
GfuiAddKey(screen, '>', "Zoom In", (void*)GR_ZOOM_IN, grSetZoom, NULL);
|
||||
GfuiAddKey(screen, '<', "Zoom Out", (void*)GR_ZOOM_OUT, grSetZoom, NULL);
|
||||
GfuiAddKey(screen, '(', "Split Screen", (void*)GR_SPLIT_ADD, grSplitScreen, NULL);
|
||||
GfuiAddKey(screen, ')', "UnSplit Screen", (void*)GR_SPLIT_REM, grSplitScreen, NULL);
|
||||
GfuiAddKey(screen, GFUIK_TAB, "Next (split) Screen", (void*)GR_NEXT_SCREEN, grChangeScreen, NULL);
|
||||
GfuiAddKey(screen, 'm', "Track Maps", (void*)0, grSelectTrackMap, NULL);
|
||||
|
||||
grAdaptScreenSize();
|
||||
|
||||
GfLogInfo("Current screen is #%d (out of %d)\n", nCurrentScreenIndex, grNbActiveScreens);
|
||||
|
||||
grInitScene();
|
||||
|
||||
grLodFactorValue = GfParmGetNum(grHandle, GR_SCT_GRAPHIC, GR_ATT_LODFACTOR, NULL, 1.0);
|
||||
|
@ -301,26 +330,27 @@ initView(int x, int y, int width, int height, int /* flag */, void *screen)
|
|||
int
|
||||
refresh(tSituation *s)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
GfProfStartProfile("refresh");
|
||||
|
||||
nFrame++;
|
||||
nTotalFrame++;
|
||||
grCurTime = GfTimeClock();
|
||||
grDeltaTime = grCurTime - OldTime;
|
||||
if ((grCurTime - OldTime) > 1.0) {
|
||||
/* The Frames Per Second (FPS) display is refreshed every second */
|
||||
grFps = (tdble)nFrame / (grCurTime - OldTime);
|
||||
nFrame = 0;
|
||||
++nSeconds;
|
||||
OldTime = grCurTime;
|
||||
// Compute FPS indicators every second.
|
||||
nFPSFrames++;
|
||||
nFPSTotalFrames++;
|
||||
const double dCurTime = GfTimeClock();
|
||||
const double dDeltaTime = dCurTime - dFPSPrevTime;
|
||||
if (dDeltaTime > 1.0) {
|
||||
++nFPSTotalSeconds;
|
||||
grInstFps = nFPSFrames / dDeltaTime;
|
||||
nFPSFrames = 0;
|
||||
dFPSPrevTime = dCurTime;
|
||||
grAvgFps = (tdble)nFPSTotalFrames / nFPSTotalSeconds;
|
||||
}
|
||||
|
||||
TRACE_GL("refresh: start");
|
||||
|
||||
GfProfStartProfile("grRefreshSound*");
|
||||
grRefreshSound(s, grScreens[0]->getCurCamera());
|
||||
grRefreshSound(s, grGetCurrentScreen()->getCurCamera());
|
||||
GfProfStopProfile("grRefreshSound*");
|
||||
|
||||
// WIP #132 (D13) : Moved car collision damage propagation from grcar::grDrawCar.
|
||||
|
@ -333,8 +363,8 @@ refresh(tSituation *s)
|
|||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
GfProfStopProfile("grDrawBackground/glClear");
|
||||
|
||||
for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
|
||||
grScreens[i]->update(s, grFps);
|
||||
for (i = 0; i < grNbActiveScreens; i++) {
|
||||
grScreens[i]->update(s, grInstFps, grAvgFps);
|
||||
}
|
||||
|
||||
grUpdateSmoke(s->currentTime);
|
||||
|
@ -347,6 +377,7 @@ refresh(tSituation *s)
|
|||
int
|
||||
initCars(tSituation *s)
|
||||
{
|
||||
char buf[256];
|
||||
char idx[16];
|
||||
int index;
|
||||
int i;
|
||||
|
@ -380,7 +411,7 @@ initCars(tSituation *s)
|
|||
grInitSkidmarks(elt);
|
||||
}
|
||||
|
||||
grNbScreen = 0;
|
||||
grNbActiveScreens = 0;
|
||||
for (i = 0; i < s->_ncars; i++) {
|
||||
elt = s->cars[i];
|
||||
index = elt->index;
|
||||
|
@ -404,16 +435,14 @@ initCars(tSituation *s)
|
|||
grCarInfo[index].iconColor[2] = GfParmGetNum(hdle, idx, "blue", (char*)NULL, GfParmGetNum(hdle, ROB_SECT_ARBITRARY, "blue", NULL, 0));
|
||||
grCarInfo[index].iconColor[3] = 1.0;
|
||||
grInitCar(elt);
|
||||
if ((elt->_driverType == RM_DRV_HUMAN) && (grNbScreen < GR_NB_MAX_SCREEN) &&(elt->_networkPlayer == 0))
|
||||
if ((elt->_driverType == RM_DRV_HUMAN) && (grNbActiveScreens < GR_NB_MAX_SCREEN) &&(elt->_networkPlayer == 0))
|
||||
{
|
||||
grScreens[grNbScreen]->setCurrentCar(elt);
|
||||
grNbScreen++;
|
||||
grScreens[grNbActiveScreens]->setCurrentCar(elt);
|
||||
grNbActiveScreens++;
|
||||
}
|
||||
}
|
||||
|
||||
if (grNbScreen == 0) {
|
||||
grNbScreen = (int)GfParmGetNum(grHandle, GR_SCT_DISPMODE, GR_ATT_NB_SCREENS, NULL, 1.0);
|
||||
}
|
||||
grNbActiveScreens = (int)GfParmGetNum(grHandle, GR_SCT_DISPMODE, GR_ATT_NB_SCREENS, NULL, 1.0);
|
||||
|
||||
for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
|
||||
grScreens[i]->initCams(s);
|
||||
|
@ -467,8 +496,10 @@ shutdownCars(void)
|
|||
grScreens[i]->setCurrentCar(NULL);
|
||||
}
|
||||
|
||||
if (nSeconds > 0)
|
||||
printf( "Average FPS: %.2f\n", (double)nTotalFrame/((double)nSeconds+GfTimeClock()-OldTime) );}
|
||||
if (nFPSTotalSeconds > 0)
|
||||
GfLogTrace("Average FPS: %.2f\n",
|
||||
(double)nFPSTotalFrames/((double)nFPSTotalSeconds + GfTimeClock() - dFPSPrevTime));
|
||||
}
|
||||
|
||||
int
|
||||
initTrack(tTrack *track)
|
||||
|
@ -480,7 +511,7 @@ initTrack(tTrack *track)
|
|||
grContext.makeCurrent();
|
||||
|
||||
grTrackHandle = GfParmReadFile(track->filename, GFPARM_RMODE_STD | GFPARM_RMODE_CREAT);
|
||||
if (grNbScreen)
|
||||
if (grNbActiveScreens > 0)
|
||||
grLoadScene(track);
|
||||
|
||||
for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
|
||||
|
@ -500,7 +531,7 @@ shutdownTrack(void)
|
|||
grShutdownState();
|
||||
|
||||
for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
|
||||
if (grScreens[i] != NULL) {
|
||||
if (grScreens[i]) {
|
||||
delete grScreens[i];
|
||||
grScreens[i] = NULL;
|
||||
}
|
||||
|
|
|
@ -27,14 +27,15 @@
|
|||
#include <windows.h>
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glext.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
////// Multitexturing Info
|
||||
extern PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB ;
|
||||
extern PFNGLMULTITEXCOORD2FVARBPROC glMultiTexCoord2fvARB;
|
||||
extern PFNGLACTIVETEXTUREARBPROC glActiveTextureARB ;
|
||||
extern PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB ;
|
||||
|
||||
extern bool InStr(char *searchStr, char *str);
|
||||
#endif
|
||||
|
||||
extern bool InitMultiTex();
|
||||
|
@ -62,14 +63,21 @@ extern void shutdownTrack(void);
|
|||
extern int maxTextureUnits;
|
||||
extern tdble grMaxDammage;
|
||||
|
||||
// Number of active screens.
|
||||
extern int grNbActiveScreens;
|
||||
|
||||
extern class cGrScreen *grScreens[];
|
||||
extern class cGrScreen* grGetCurrentScreen(void);
|
||||
|
||||
|
||||
#define GR_SPLIT_ADD 0
|
||||
#define GR_SPLIT_REM 1
|
||||
|
||||
#define GR_NEXT_SCREEN 0
|
||||
#define GR_PREV_SCREEN 1
|
||||
|
||||
#define GR_NB_MAX_SCREEN 4
|
||||
|
||||
extern tdble grLodFactorValue;
|
||||
extern double grDeltaTime;
|
||||
|
||||
#endif /* _GRMAIN_H_ */
|
||||
|
|
|
@ -524,10 +524,9 @@ grLoadScene(tTrack *track)
|
|||
|
||||
void
|
||||
grDrawScene(float speedcar, tSituation *s)
|
||||
//grDrawScene(void)
|
||||
{
|
||||
TRACE_GL("refresh: ssgCullAndDraw start");
|
||||
if ((skydynamic >= SKYDYNAMIC_THR) && (grTrack->skyversion > 0))
|
||||
{
|
||||
const bool bDrawSky = skydynamic >= SKYDYNAMIC_THR && grTrack->skyversion > 0;
|
||||
if (bDrawSky)
|
||||
{
|
||||
if(TimeDyn == 1) {grUpdateTime(s);}
|
||||
|
||||
|
@ -549,11 +548,14 @@ grDrawScene(float speedcar, tSituation *s)
|
|||
ssgGetLight(0) -> setColour( GL_AMBIENT, scene_ambiant);
|
||||
ssgGetLight(0) -> setColour( GL_DIFFUSE, scene_diffuse);
|
||||
ssgGetLight(0) -> setColour( GL_SPECULAR, scene_specular);
|
||||
|
||||
TRACE_GL("refresh: ssgCullAndDraw start");
|
||||
ssgCullAndDraw(TheScene);
|
||||
TRACE_GL("refresh: ssgCullAndDraw");
|
||||
|
||||
}
|
||||
|
||||
TRACE_GL("refresh: ssgCullAndDraw start");
|
||||
ssgCullAndDraw(TheScene);
|
||||
TRACE_GL("refresh: ssgCullAndDraw");
|
||||
|
||||
if (bDrawSky)
|
||||
{
|
||||
Sky->postDraw(skydynamic);
|
||||
if(RainBool > 0)
|
||||
{
|
||||
|
@ -561,12 +563,6 @@ grDrawScene(float speedcar, tSituation *s)
|
|||
}
|
||||
|
||||
}
|
||||
else
|
||||
{ //if (skydynamic==0 | grTrack->version < 5)
|
||||
TRACE_GL("refresh: ssgCullAndDraw start");
|
||||
ssgCullAndDraw(TheScene);
|
||||
TRACE_GL("refresh: ssgCullAndDraw");
|
||||
}
|
||||
}//grDrawScene
|
||||
|
||||
|
||||
|
|
|
@ -261,13 +261,12 @@ void cGrScreen::camDraw(tSituation *s)
|
|||
else
|
||||
speedcar = 0.0f;
|
||||
grDrawScene(speedcar, s);
|
||||
//grDrawScene();
|
||||
GfProfStopProfile("grDrawScene*");
|
||||
}
|
||||
|
||||
|
||||
/* Update screen display */
|
||||
void cGrScreen::update(tSituation *s, float Fps)
|
||||
void cGrScreen::update(tSituation *s, float instFps, float avgFps)
|
||||
{
|
||||
int i;
|
||||
ssgLight *light;
|
||||
|
@ -353,7 +352,8 @@ void cGrScreen::update(tSituation *s, float Fps)
|
|||
glDisable(GL_TEXTURE_2D);
|
||||
|
||||
TRACE_GL("cGrScreen::update glDisable(GL_DEPTH_TEST)");
|
||||
board->refreshBoard(s, Fps, 0, curCar);
|
||||
board->refreshBoard(s, instFps, avgFps, false, curCar,
|
||||
grNbActiveScreens > 1 && grGetCurrentScreen() == this);
|
||||
TRACE_GL("cGrScreen::update display boards");
|
||||
|
||||
GfProfStopProfile("grDisp**");
|
||||
|
|
|
@ -62,7 +62,7 @@ class cGrScreen {
|
|||
inline void deactivate(void) { active = false; }
|
||||
inline void setZoom(const long zoom) { curCam->setZoom(zoom); }
|
||||
int isInScreen(int x, int y);
|
||||
void update(tSituation *s, float Fps);
|
||||
void update(tSituation *s, float instFps, float avgFps);
|
||||
void camDraw(tSituation *s);
|
||||
void updateCurrent(tSituation *s);
|
||||
|
||||
|
|
Loading…
Reference in a new issue