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:
pouillot 2010-09-04 13:39:41 +00:00
parent 779473d3b0
commit 8d55096c04
7 changed files with 228 additions and 170 deletions

View file

@ -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);
}

View file

@ -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);
};

View file

@ -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;
}

View file

@ -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_ */

View file

@ -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

View file

@ -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**");

View file

@ -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);