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
+1 -1
View File
@@ -20,7 +20,7 @@ MergeObject <opengl>glut.o :
glutCursor.cpp glutCursor.cpp
glutMenu.cpp glutMenu.cpp
glutDstr.cpp glutDstr.cpp
# glutGameMode.cpp glutGameMode.cpp
beos_x11.cpp beos_x11.cpp
# C sources # C sources
+11 -11
View File
@@ -22,7 +22,7 @@
/*********************************************************** /***********************************************************
* Window related callbacks * Window related callbacks
***********************************************************/ ***********************************************************/
void APIENTRY void APIENTRY
glutDisplayFunc(GLUTdisplayCB displayFunc) glutDisplayFunc(GLUTdisplayCB displayFunc)
{ {
/* XXX Remove the warning after GLUT 3.0. */ /* XXX Remove the warning after GLUT 3.0. */
@@ -31,49 +31,49 @@ glutDisplayFunc(GLUTdisplayCB displayFunc)
gState.currentWindow->display = displayFunc; gState.currentWindow->display = displayFunc;
} }
void APIENTRY void APIENTRY
glutKeyboardFunc(GLUTkeyboardCB keyboardFunc) glutKeyboardFunc(GLUTkeyboardCB keyboardFunc)
{ {
gState.currentWindow->keyboard = keyboardFunc; gState.currentWindow->keyboard = keyboardFunc;
} }
void APIENTRY void APIENTRY
glutKeyboardUpFunc(GLUTkeyboardCB keyboardUpFunc) glutKeyboardUpFunc(GLUTkeyboardCB keyboardUpFunc)
{ {
gState.currentWindow->keyboardUp = keyboardUpFunc; gState.currentWindow->keyboardUp = keyboardUpFunc;
} }
void APIENTRY void APIENTRY
glutSpecialFunc(GLUTspecialCB specialFunc) glutSpecialFunc(GLUTspecialCB specialFunc)
{ {
gState.currentWindow->special = specialFunc; gState.currentWindow->special = specialFunc;
} }
void APIENTRY void APIENTRY
glutSpecialUpFunc(GLUTspecialCB specialUpFunc) glutSpecialUpFunc(GLUTspecialCB specialUpFunc)
{ {
gState.currentWindow->specialUp = specialUpFunc; gState.currentWindow->specialUp = specialUpFunc;
} }
void APIENTRY void APIENTRY
glutMouseFunc(GLUTmouseCB mouseFunc) glutMouseFunc(GLUTmouseCB mouseFunc)
{ {
gState.currentWindow->mouse = mouseFunc; gState.currentWindow->mouse = mouseFunc;
} }
void APIENTRY void APIENTRY
glutMotionFunc(GLUTmotionCB motionFunc) glutMotionFunc(GLUTmotionCB motionFunc)
{ {
gState.currentWindow->motion = motionFunc; gState.currentWindow->motion = motionFunc;
} }
void APIENTRY void APIENTRY
glutPassiveMotionFunc(GLUTpassiveCB passiveMotionFunc) glutPassiveMotionFunc(GLUTpassiveCB passiveMotionFunc)
{ {
gState.currentWindow->passive = passiveMotionFunc; gState.currentWindow->passive = passiveMotionFunc;
} }
void APIENTRY void APIENTRY
glutEntryFunc(GLUTentryCB entryFunc) glutEntryFunc(GLUTentryCB entryFunc)
{ {
gState.currentWindow->entry = entryFunc; gState.currentWindow->entry = entryFunc;
@@ -97,7 +97,7 @@ visibilityHelper(int status)
gState.currentWindow->visibility(GLUT_VISIBLE); gState.currentWindow->visibility(GLUT_VISIBLE);
} }
void APIENTRY void APIENTRY
glutVisibilityFunc(GLUTvisibilityCB visibilityFunc) glutVisibilityFunc(GLUTvisibilityCB visibilityFunc)
{ {
gState.currentWindow->visibility = visibilityFunc; gState.currentWindow->visibility = visibilityFunc;
@@ -107,7 +107,7 @@ glutVisibilityFunc(GLUTvisibilityCB visibilityFunc)
glutWindowStatusFunc(NULL); glutWindowStatusFunc(NULL);
} }
void APIENTRY void APIENTRY
glutReshapeFunc(GLUTreshapeCB reshapeFunc) glutReshapeFunc(GLUTreshapeCB reshapeFunc)
{ {
if (reshapeFunc) { if (reshapeFunc) {
+101
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
}
+21
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;
};
+7 -4
View File
@@ -17,8 +17,10 @@
***********************************************************/ ***********************************************************/
#include <GL/glut.h> #include <GL/glut.h>
#include <Application.h> #include <Application.h>
#include "glutWindow.h" #include "glutWindow.h"
#include "glutMenu.h" #include "glutMenu.h"
#include "glutGameMode.h"
/*********************************************************** /***********************************************************
* CLASS: GlutState * CLASS: GlutState
@@ -45,7 +47,7 @@ struct GlutState {
int modifierKeys; // only valid during keyboard callback int modifierKeys; // only valid during keyboard callback
int keyRepeatMode; // global repeat int keyRepeatMode; // global repeat
bool gameMode; // game mode is active GlutGameMode* gameMode;
bool debug; // call glGetError bool debug; // call glGetError
bool quitAll; // quit bool quitAll; // quit
@@ -57,14 +59,15 @@ struct GlutState {
initWidth = initHeight = 300; initWidth = initHeight = 300;
displayMode = GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH; displayMode = GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH;
displayString = 0; displayString = 0;
currentWindow = 0; currentWindow = NULL;
currentMenu = 0; currentMenu = NULL;
windowList = 0; windowList = NULL;
windowListSize = 0; windowListSize = 0;
idle = 0; idle = 0;
menuStatus = 0; menuStatus = 0;
modifierKeys = ~0; modifierKeys = ~0;
keyRepeatMode = GLUT_KEY_REPEAT_DEFAULT; keyRepeatMode = GLUT_KEY_REPEAT_DEFAULT;
gameMode = NULL;
debug = quitAll = false; debug = quitAll = false;
} }
}; };
+18 -18
View File
@@ -103,16 +103,16 @@ GlutWindow::GlutWindow(GlutWindow *nparent, const char *name,
// clear callbacks // clear callbacks
display = __glutDefaultDisplay; display = __glutDefaultDisplay;
reshape = __glutDefaultReshape; reshape = __glutDefaultReshape;
mouse = 0; mouse = NULL;
motion = 0; motion = NULL;
passive = 0; passive = NULL;
entry = 0; entry = NULL;
keyboard = 0; keyboard = NULL;
keyboardUp = 0; keyboardUp = NULL;
visibility = 0; visibility = NULL;
special = 0; special = NULL;
specialUp = 0; specialUp = NULL;
windowStatus = 0; windowStatus = NULL;
// clear event counters // clear event counters
anyevents = 1; anyevents = 1;
@@ -124,7 +124,7 @@ GlutWindow::GlutWindow(GlutWindow *nparent, const char *name,
entryEvent = 0; entryEvent = 0;
keybEvent = 0; keybEvent = 0;
keybUpEvent = 0; keybUpEvent = 0;
windowStatusEvent = 0; // DirectConnected() will report change in windowStatusEvent = 0; // DirectConnected() will report change in
visState = -1; // visibility visState = -1; // visibility
specialEvent = 0; specialEvent = 0;
specialUpEvent = 0; specialUpEvent = 0;
@@ -132,7 +132,7 @@ GlutWindow::GlutWindow(GlutWindow *nparent, const char *name,
menuEvent = 0; menuEvent = 0;
visible = true; visible = true;
ignoreKeyRepeat = (gState.keyRepeatMode == GLUT_KEY_REPEAT_OFF); ignoreKeyRepeat = (gState.keyRepeatMode == GLUT_KEY_REPEAT_OFF);
gBlock.QuickNewEvent(); gBlock.QuickNewEvent();
// if i'm a subwindow, add me to my parent view // if i'm a subwindow, add me to my parent view
@@ -218,7 +218,7 @@ void
glutSetWindow(int win) glutSetWindow(int win)
{ {
GlutWindow *window; GlutWindow *window;
if (win < 1 || win > gState.windowListSize) { if (win < 1 || win > gState.windowListSize) {
__glutWarning("glutSetWindow attempted on bogus window."); __glutWarning("glutSetWindow attempted on bogus window.");
return; return;
@@ -270,7 +270,7 @@ __glutDestroyWindow(GlutWindow *window, GlutWindow *initialWindow)
cur = cur->siblings; cur = cur->siblings;
} }
} }
// finally, check if we are the current window, and set to 0 // finally, check if we are the current window, and set to 0
if (gState.currentWindow == window) if (gState.currentWindow == window)
gState.currentWindow = 0; gState.currentWindow = 0;
@@ -484,7 +484,7 @@ glutIconifyWindow()
{ {
if (gState.currentWindow->parent) if (gState.currentWindow->parent)
__glutFatalError("can't iconify a subwindow"); __glutFatalError("can't iconify a subwindow");
gState.currentWindow->Window()->Lock(); gState.currentWindow->Window()->Lock();
gState.currentWindow->Window()->Minimize(true); gState.currentWindow->Window()->Minimize(true);
gState.currentWindow->Window()->Unlock(); gState.currentWindow->Window()->Unlock();
@@ -494,7 +494,7 @@ glutIconifyWindow()
/*! Sets the window title */ /*! Sets the window title */
void void
glutSetWindowTitle(const char *name) glutSetWindowTitle(const char *name)
{ {
if (gState.currentWindow->parent) if (gState.currentWindow->parent)
__glutFatalError("glutSetWindowTitle: isn't a top-level window"); __glutFatalError("glutSetWindowTitle: isn't a top-level window");
@@ -545,7 +545,7 @@ __glutConvertDisplayMode(unsigned long *options)
newoptions |= BGL_STENCIL; newoptions |= BGL_STENCIL;
*options = newoptions; *options = newoptions;
} }
if (gState.displayMode & GLUT_INDEX) { if (gState.displayMode & GLUT_INDEX) {
__glutWarning("BeOS doesn't support indexed color"); __glutWarning("BeOS doesn't support indexed color");
return 0; return 0;
@@ -625,7 +625,7 @@ GlutBWindow::~GlutBWindow()
Hide(); Hide();
Sync(); Sync();
} }
bool bool
+9 -9
View File
@@ -11,7 +11,7 @@
#include "glutint.h" #include "glutint.h"
/* CENTRY */ /* CENTRY */
int GLUTAPIENTRY int GLUTAPIENTRY
glutExtensionSupported(const char *extension) glutExtensionSupported(const char *extension)
{ {
static const GLubyte *extensions = NULL; static const GLubyte *extensions = NULL;
@@ -125,7 +125,7 @@ static struct name_address_pair glut_functions[] = {
{ "glutWindowStatusFunc", (const GLUTproc) glutWindowStatusFunc }, { "glutWindowStatusFunc", (const GLUTproc) glutWindowStatusFunc },
{ "glutKeyboardUpFunc", (const GLUTproc) glutKeyboardUpFunc }, { "glutKeyboardUpFunc", (const GLUTproc) glutKeyboardUpFunc },
{ "glutSpecialUpFunc", (const GLUTproc) glutSpecialUpFunc }, { "glutSpecialUpFunc", (const GLUTproc) glutSpecialUpFunc },
// { "glutJoystickFunc", (const GLUTproc) glutJoystickFunc }, { "glutJoystickFunc", (const GLUTproc) glutJoystickFunc },
{ "glutSetColor", (const GLUTproc) glutSetColor }, { "glutSetColor", (const GLUTproc) glutSetColor },
{ "glutGetColor", (const GLUTproc) glutGetColor }, { "glutGetColor", (const GLUTproc) glutGetColor },
{ "glutCopyColormap", (const GLUTproc) glutCopyColormap }, { "glutCopyColormap", (const GLUTproc) glutCopyColormap },
@@ -167,17 +167,17 @@ static struct name_address_pair glut_functions[] = {
{ "glutReportErrors", (const GLUTproc) glutReportErrors }, { "glutReportErrors", (const GLUTproc) glutReportErrors },
{ "glutIgnoreKeyRepeat", (const GLUTproc) glutIgnoreKeyRepeat }, { "glutIgnoreKeyRepeat", (const GLUTproc) glutIgnoreKeyRepeat },
{ "glutSetKeyRepeat", (const GLUTproc) glutSetKeyRepeat }, { "glutSetKeyRepeat", (const GLUTproc) glutSetKeyRepeat },
// { "glutForceJoystickFunc", (const GLUTproc) glutForceJoystickFunc }, { "glutForceJoystickFunc", (const GLUTproc) glutForceJoystickFunc },
// { "glutGameModeString", (const GLUTproc) glutGameModeString }, { "glutGameModeString", (const GLUTproc) glutGameModeString },
// { "glutEnterGameMode", (const GLUTproc) glutEnterGameMode }, { "glutEnterGameMode", (const GLUTproc) glutEnterGameMode },
// { "glutLeaveGameMode", (const GLUTproc) glutLeaveGameMode }, { "glutLeaveGameMode", (const GLUTproc) glutLeaveGameMode },
// { "glutGameModeGet", (const GLUTproc) glutGameModeGet }, { "glutGameModeGet", (const GLUTproc) glutGameModeGet },
{ NULL, NULL } { NULL, NULL }
}; };
/* XXX This isn't an official GLUT function, yet */ /* XXX This isn't an official GLUT function, yet */
GLUTproc GLUTAPIENTRY GLUTproc GLUTAPIENTRY
glutGetProcAddress(const char *procName) glutGetProcAddress(const char *procName)
{ {
/* Try GLUT functions first */ /* Try GLUT functions first */