From a5d4249c2e8ced0154146699dc61be64f58d176a Mon Sep 17 00:00:00 2001 From: Philippe Houdoin Date: Fri, 30 Jul 2010 11:57:26 +0000 Subject: [PATCH] Initiate game mode support git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37820 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/libs/mesa/glut/Jamfile | 2 +- src/libs/mesa/glut/glutCallback.cpp | 22 +++--- src/libs/mesa/glut/glutGameMode.cpp | 101 ++++++++++++++++++++++++++++ src/libs/mesa/glut/glutGameMode.h | 21 ++++++ src/libs/mesa/glut/glutState.h | 11 +-- src/libs/mesa/glut/glutWindow.cpp | 36 +++++----- src/libs/mesa/glut/glut_ext.c | 18 ++--- 7 files changed, 168 insertions(+), 43 deletions(-) create mode 100644 src/libs/mesa/glut/glutGameMode.cpp create mode 100644 src/libs/mesa/glut/glutGameMode.h diff --git a/src/libs/mesa/glut/Jamfile b/src/libs/mesa/glut/Jamfile index 1d97dab96c..7f80af4e0e 100644 --- a/src/libs/mesa/glut/Jamfile +++ b/src/libs/mesa/glut/Jamfile @@ -20,7 +20,7 @@ MergeObject glut.o : glutCursor.cpp glutMenu.cpp glutDstr.cpp - # glutGameMode.cpp + glutGameMode.cpp beos_x11.cpp # C sources diff --git a/src/libs/mesa/glut/glutCallback.cpp b/src/libs/mesa/glut/glutCallback.cpp index be56d4637b..b4afc82639 100644 --- a/src/libs/mesa/glut/glutCallback.cpp +++ b/src/libs/mesa/glut/glutCallback.cpp @@ -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) { diff --git a/src/libs/mesa/glut/glutGameMode.cpp b/src/libs/mesa/glut/glutGameMode.cpp new file mode 100644 index 0000000000..1554c39788 --- /dev/null +++ b/src/libs/mesa/glut/glutGameMode.cpp @@ -0,0 +1,101 @@ +/* + * Copyright 2010, Haiku Inc. + * Authors: + * Philippe Houdoin + * + * Distributed under the terms of the MIT License. + */ + + +#include +#include "glutint.h" +#include "glutState.h" +#include "glutBlocker.h" +#include + + +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 +} diff --git a/src/libs/mesa/glut/glutGameMode.h b/src/libs/mesa/glut/glutGameMode.h new file mode 100644 index 0000000000..86a7884c82 --- /dev/null +++ b/src/libs/mesa/glut/glutGameMode.h @@ -0,0 +1,21 @@ +/* + * Copyright 2010, Haiku Inc. + * Authors: + * Philippe Houdoin + * + * Distributed under the terms of the MIT License. + */ + +#include + + +/*! All information needed for game mode and + subwindows (handled as similarly as possible). +*/ +class GlutGameMode { +public: + int width; + int height; + int pixelDepth; + int refreshRate; +}; diff --git a/src/libs/mesa/glut/glutState.h b/src/libs/mesa/glut/glutState.h index b6d1920c84..0c10f17f55 100644 --- a/src/libs/mesa/glut/glutState.h +++ b/src/libs/mesa/glut/glutState.h @@ -17,8 +17,10 @@ ***********************************************************/ #include #include + #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; } }; diff --git a/src/libs/mesa/glut/glutWindow.cpp b/src/libs/mesa/glut/glutWindow.cpp index 033021b122..0f47402f49 100644 --- a/src/libs/mesa/glut/glutWindow.cpp +++ b/src/libs/mesa/glut/glutWindow.cpp @@ -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 diff --git a/src/libs/mesa/glut/glut_ext.c b/src/libs/mesa/glut/glut_ext.c index 6ce7eaa4b8..ed902111af 100644 --- a/src/libs/mesa/glut/glut_ext.c +++ b/src/libs/mesa/glut/glut_ext.c @@ -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 */