Initiate game mode support

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37820 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Philippe Houdoin 2010-07-30 11:57:26 +00:00
parent ff973abc41
commit a5d4249c2e
7 changed files with 168 additions and 43 deletions

View File

@ -20,7 +20,7 @@ MergeObject <opengl>glut.o :
glutCursor.cpp
glutMenu.cpp
glutDstr.cpp
# glutGameMode.cpp
glutGameMode.cpp
beos_x11.cpp
# C sources

View File

@ -22,7 +22,7 @@
/***********************************************************
* Window related callbacks
***********************************************************/
void APIENTRY
void APIENTRY
glutDisplayFunc(GLUTdisplayCB displayFunc)
{
/* XXX Remove the warning after GLUT 3.0. */
@ -31,49 +31,49 @@ glutDisplayFunc(GLUTdisplayCB displayFunc)
gState.currentWindow->display = displayFunc;
}
void APIENTRY
void APIENTRY
glutKeyboardFunc(GLUTkeyboardCB keyboardFunc)
{
gState.currentWindow->keyboard = keyboardFunc;
}
void APIENTRY
void APIENTRY
glutKeyboardUpFunc(GLUTkeyboardCB keyboardUpFunc)
{
gState.currentWindow->keyboardUp = keyboardUpFunc;
}
void APIENTRY
void APIENTRY
glutSpecialFunc(GLUTspecialCB specialFunc)
{
gState.currentWindow->special = specialFunc;
}
void APIENTRY
void APIENTRY
glutSpecialUpFunc(GLUTspecialCB specialUpFunc)
{
gState.currentWindow->specialUp = specialUpFunc;
}
void APIENTRY
void APIENTRY
glutMouseFunc(GLUTmouseCB mouseFunc)
{
gState.currentWindow->mouse = mouseFunc;
}
void APIENTRY
void APIENTRY
glutMotionFunc(GLUTmotionCB motionFunc)
{
gState.currentWindow->motion = motionFunc;
}
void APIENTRY
void APIENTRY
glutPassiveMotionFunc(GLUTpassiveCB passiveMotionFunc)
{
gState.currentWindow->passive = passiveMotionFunc;
}
void APIENTRY
void APIENTRY
glutEntryFunc(GLUTentryCB entryFunc)
{
gState.currentWindow->entry = entryFunc;
@ -97,7 +97,7 @@ visibilityHelper(int status)
gState.currentWindow->visibility(GLUT_VISIBLE);
}
void APIENTRY
void APIENTRY
glutVisibilityFunc(GLUTvisibilityCB visibilityFunc)
{
gState.currentWindow->visibility = visibilityFunc;
@ -107,7 +107,7 @@ glutVisibilityFunc(GLUTvisibilityCB visibilityFunc)
glutWindowStatusFunc(NULL);
}
void APIENTRY
void APIENTRY
glutReshapeFunc(GLUTreshapeCB reshapeFunc)
{
if (reshapeFunc) {

View File

@ -0,0 +1,101 @@
/*
* Copyright 2010, Haiku Inc.
* Authors:
* Philippe Houdoin <phoudoin %at% haiku-os %dot% org>
*
* Distributed under the terms of the MIT License.
*/
#include <GL/glut.h>
#include "glutint.h"
#include "glutState.h"
#include "glutBlocker.h"
#include <stdio.h>
void APIENTRY
glutGameModeString(const char *string)
{
// TODO
}
int APIENTRY
glutEnterGameMode(void)
{
// TODO
return 0;
}
void APIENTRY
glutLeaveGameMode(void)
{
// TODO
}
int APIENTRY
glutGameModeGet(GLenum pname)
{
int ret = -1;
switch( pname ) {
case GLUT_GAME_MODE_ACTIVE:
ret = gState.gameMode != NULL;
break;
case GLUT_GAME_MODE_POSSIBLE:
// TODO
break;
case GLUT_GAME_MODE_WIDTH:
if (gState.gameMode)
ret = gState.gameMode->width;
break;
case GLUT_GAME_MODE_HEIGHT:
if (gState.gameMode)
ret = gState.gameMode->height;
break;
case GLUT_GAME_MODE_PIXEL_DEPTH:
if (gState.gameMode)
ret = gState.gameMode->pixelDepth;
break;
case GLUT_GAME_MODE_REFRESH_RATE:
if (gState.gameMode)
ret = gState.gameMode->refreshRate;
break;
case GLUT_GAME_MODE_DISPLAY_CHANGED:
// TODO
break;
default:
__glutWarning( "Unknown gamemode get: %d", pname );
break;
}
return ret;
}
void APIENTRY
glutForceJoystickFunc(void)
{
/*
Forces a joystick poll and callback.
Forces the OpenGLUT joystick code to poll your
joystick(s) and to call your joystick callbacks
with the result. The operation completes, including
callbacks, before glutForceJoystickFunc() returns.
See also glutJoystickFunc()
*/
// TODO
}

View File

@ -0,0 +1,21 @@
/*
* Copyright 2010, Haiku Inc.
* Authors:
* Philippe Houdoin <phoudoin %at% haiku-os %dot% org>
*
* Distributed under the terms of the MIT License.
*/
#include <GL/glut.h>
/*! All information needed for game mode and
subwindows (handled as similarly as possible).
*/
class GlutGameMode {
public:
int width;
int height;
int pixelDepth;
int refreshRate;
};

View File

@ -17,8 +17,10 @@
***********************************************************/
#include <GL/glut.h>
#include <Application.h>
#include "glutWindow.h"
#include "glutMenu.h"
#include "glutGameMode.h"
/***********************************************************
* CLASS: GlutState
@ -45,7 +47,7 @@ struct GlutState {
int modifierKeys; // only valid during keyboard callback
int keyRepeatMode; // global repeat
bool gameMode; // game mode is active
GlutGameMode* gameMode;
bool debug; // call glGetError
bool quitAll; // quit
@ -57,14 +59,15 @@ struct GlutState {
initWidth = initHeight = 300;
displayMode = GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH;
displayString = 0;
currentWindow = 0;
currentMenu = 0;
windowList = 0;
currentWindow = NULL;
currentMenu = NULL;
windowList = NULL;
windowListSize = 0;
idle = 0;
menuStatus = 0;
modifierKeys = ~0;
keyRepeatMode = GLUT_KEY_REPEAT_DEFAULT;
gameMode = NULL;
debug = quitAll = false;
}
};

View File

@ -103,16 +103,16 @@ GlutWindow::GlutWindow(GlutWindow *nparent, const char *name,
// clear callbacks
display = __glutDefaultDisplay;
reshape = __glutDefaultReshape;
mouse = 0;
motion = 0;
passive = 0;
entry = 0;
keyboard = 0;
keyboardUp = 0;
visibility = 0;
special = 0;
specialUp = 0;
windowStatus = 0;
mouse = NULL;
motion = NULL;
passive = NULL;
entry = NULL;
keyboard = NULL;
keyboardUp = NULL;
visibility = NULL;
special = NULL;
specialUp = NULL;
windowStatus = NULL;
// clear event counters
anyevents = 1;
@ -124,7 +124,7 @@ GlutWindow::GlutWindow(GlutWindow *nparent, const char *name,
entryEvent = 0;
keybEvent = 0;
keybUpEvent = 0;
windowStatusEvent = 0; // DirectConnected() will report change in
windowStatusEvent = 0; // DirectConnected() will report change in
visState = -1; // visibility
specialEvent = 0;
specialUpEvent = 0;
@ -132,7 +132,7 @@ GlutWindow::GlutWindow(GlutWindow *nparent, const char *name,
menuEvent = 0;
visible = true;
ignoreKeyRepeat = (gState.keyRepeatMode == GLUT_KEY_REPEAT_OFF);
gBlock.QuickNewEvent();
// if i'm a subwindow, add me to my parent view
@ -218,7 +218,7 @@ void
glutSetWindow(int win)
{
GlutWindow *window;
if (win < 1 || win > gState.windowListSize) {
__glutWarning("glutSetWindow attempted on bogus window.");
return;
@ -270,7 +270,7 @@ __glutDestroyWindow(GlutWindow *window, GlutWindow *initialWindow)
cur = cur->siblings;
}
}
// finally, check if we are the current window, and set to 0
if (gState.currentWindow == window)
gState.currentWindow = 0;
@ -484,7 +484,7 @@ glutIconifyWindow()
{
if (gState.currentWindow->parent)
__glutFatalError("can't iconify a subwindow");
gState.currentWindow->Window()->Lock();
gState.currentWindow->Window()->Minimize(true);
gState.currentWindow->Window()->Unlock();
@ -494,7 +494,7 @@ glutIconifyWindow()
/*! Sets the window title */
void
glutSetWindowTitle(const char *name)
{
{
if (gState.currentWindow->parent)
__glutFatalError("glutSetWindowTitle: isn't a top-level window");
@ -545,7 +545,7 @@ __glutConvertDisplayMode(unsigned long *options)
newoptions |= BGL_STENCIL;
*options = newoptions;
}
if (gState.displayMode & GLUT_INDEX) {
__glutWarning("BeOS doesn't support indexed color");
return 0;
@ -625,7 +625,7 @@ GlutBWindow::~GlutBWindow()
Hide();
Sync();
}
}
bool

View File

@ -11,7 +11,7 @@
#include "glutint.h"
/* CENTRY */
int GLUTAPIENTRY
int GLUTAPIENTRY
glutExtensionSupported(const char *extension)
{
static const GLubyte *extensions = NULL;
@ -125,7 +125,7 @@ static struct name_address_pair glut_functions[] = {
{ "glutWindowStatusFunc", (const GLUTproc) glutWindowStatusFunc },
{ "glutKeyboardUpFunc", (const GLUTproc) glutKeyboardUpFunc },
{ "glutSpecialUpFunc", (const GLUTproc) glutSpecialUpFunc },
// { "glutJoystickFunc", (const GLUTproc) glutJoystickFunc },
{ "glutJoystickFunc", (const GLUTproc) glutJoystickFunc },
{ "glutSetColor", (const GLUTproc) glutSetColor },
{ "glutGetColor", (const GLUTproc) glutGetColor },
{ "glutCopyColormap", (const GLUTproc) glutCopyColormap },
@ -167,17 +167,17 @@ static struct name_address_pair glut_functions[] = {
{ "glutReportErrors", (const GLUTproc) glutReportErrors },
{ "glutIgnoreKeyRepeat", (const GLUTproc) glutIgnoreKeyRepeat },
{ "glutSetKeyRepeat", (const GLUTproc) glutSetKeyRepeat },
// { "glutForceJoystickFunc", (const GLUTproc) glutForceJoystickFunc },
// { "glutGameModeString", (const GLUTproc) glutGameModeString },
// { "glutEnterGameMode", (const GLUTproc) glutEnterGameMode },
// { "glutLeaveGameMode", (const GLUTproc) glutLeaveGameMode },
// { "glutGameModeGet", (const GLUTproc) glutGameModeGet },
{ "glutForceJoystickFunc", (const GLUTproc) glutForceJoystickFunc },
{ "glutGameModeString", (const GLUTproc) glutGameModeString },
{ "glutEnterGameMode", (const GLUTproc) glutEnterGameMode },
{ "glutLeaveGameMode", (const GLUTproc) glutLeaveGameMode },
{ "glutGameModeGet", (const GLUTproc) glutGameModeGet },
{ NULL, NULL }
};
};
/* XXX This isn't an official GLUT function, yet */
GLUTproc GLUTAPIENTRY
GLUTproc GLUTAPIENTRY
glutGetProcAddress(const char *procName)
{
/* Try GLUT functions first */