From b56107acaa66148777a6c63b28e8a16b6ec4d713 Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Sun, 18 Jun 2006 18:58:07 -0400 Subject: [PATCH] *** empty log message *** --- include/window.h | 42 ++- src/macosx.cpp | 872 +++++++++++++++++++++++++++++++++++++++++++++++ src/window.cpp | 51 ++- 3 files changed, 925 insertions(+), 40 deletions(-) create mode 100644 src/macosx.cpp diff --git a/include/window.h b/include/window.h index 3561090..f31ead7 100644 --- a/include/window.h +++ b/include/window.h @@ -8,6 +8,16 @@ #include #include #endif + +#ifdef __APPLE__ +#include +#include +#include +#include +#include +#include +#endif + #ifdef WIN32 #include #include @@ -16,26 +26,37 @@ #include "vector.h" namespace OpenArena -{ - typedef void (*ResizeFunc)(GLsizei width, GLsizei height); - typedef int (*InitFunc)(); - +{ class Window: public Screen { + public: + class Resizer + { + public: + void Resize(GLsizei width, GLsizei height); + }; + + class Initializer + { + public: + int Initialize(); + }; + public: Window(); ~Window(); void Close(); bool Open(); bool Open(string title, int width, int height, int bits, bool fullscreenflag); //make that string a const char* after this works - void SetOnInit(InitFunc function); - void SetOnResize(ResizeFunc function); + void SetInitializer(Initializer* initializer); + void SetResizer(Resizer* resizer); void SwapBuffers(); void Resize(GLsizei width, GLsizei height); Vec2i GetMousePosition(); void SetMousePosition(Vec2i pos); - #ifdef __linux +// #ifdef __linux + #ifdef __APPLE__ Display* GetDisplay(); private: @@ -51,8 +72,8 @@ namespace OpenArena Display* display; #endif private: - ResizeFunc OnResize; - InitFunc OnInit; + Resizer* _resizer; + Initializer* _initializer; #ifdef WIN32 HGLRC glContext; HWND window; @@ -60,9 +81,6 @@ namespace OpenArena HINSTANCE instance; #endif }; - - void DefaultResize(GLsizei width, GLsizei height); - int DefaultInit(); }; #ifdef WIN32 diff --git a/src/macosx.cpp b/src/macosx.cpp new file mode 100644 index 0000000..4149f35 --- /dev/null +++ b/src/macosx.cpp @@ -0,0 +1,872 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Module: macosx.cpp +// Author: Tom Hicks +// Creation: 03-11-2006 +// LastEdit: 03-11-2006 +// Editors: Tom Hicks +// +// Purpose: +// To implement the OpenArena SDK. +// +// Summary of Methods: +// Global +// -InitControls() +// Loads the defaultPlayer's configuration. +// -InitGL() +// Initializes OpenGL and is responsible for loading textures. +// -ResizeGLScene(GLsizei width, GLsizei height) +// Resizes the viewport to the current size of the visible area of the window specified by width and height. +// -KillGLWindow() +// Closes the window. +// -CreateGLWindow(string title, int width, int height, int bits, bool fullscreenflag) +// Creates the window with the specified parameters. +// -WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) +// Main procedure. +// -WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +// Window Procedure for the OpenGL window. +// +//////////////////////////////////////////////////////////////////////////////// +#ifdef __APPLE__ + +//include necessary header files +#include "../include/main.h" +#include "../include/version.h" +using namespace std; + +//void InitControls(); +//unsigned char TranslateKey(int keyCode); +//unsigned char TranslateButton(int keyCode); +//void HandleConsoleKeyPress(OpenArena::Keys key); + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Function Definitions + +void ResizeGLScene(GLsizei width, GLsizei height) +{ + if(height == 0) + height = 1; + + glViewport(0,0,width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45.0f, (GLfloat)width/height, 0.1f, 100.0f); + glMatrixMode(GL_MODELVIEW); +} + +int DrawGLScene() +{ + level.Render(); + + g_Screen.SwapBuffers(); + + return true; +} + +// +//void InitControls() +// Purpose: +// Initializes controls by loading the default control config file "my.cfg". +void InitControls() +{ + if (!level.LoadConfig("my.cfg")) + level.LoadConfig(); +} + +// +//int InitGL(GLvoid) +// Purpose: +// To do all required setup before creating an OpenGL window +int InitGL(GLvoid) +{ + level.LoadGLTextures(); + + glEnable(GL_TEXTURE_2D); + glShadeModel(GL_SMOOTH); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClearDepth(1.0f); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + + /*lighting disabled temporarily + glLightfv(GL_LIGHT1, GL_AMBIENT, level.LightAmbient); + for(index=0; index 0) + { + //Equivalent of WNDPROC + XNextEvent(g_Screen.GetDisplay(), &event); + switch(event.type) + { + case Expose: + if(event.xexpose.count != 0) + { + break; + } + DrawGLScene(); + break; + case ConfigureNotify: + if((event.xconfigure.width != g_Screen.GetWidth()) || (event.xconfigure.height != g_Screen.GetHeight())) + { + g_Screen.SetWidth(event.xconfigure.width); + g_Screen.SetHeight(event.xconfigure.height); + ResizeGLScene(event.xconfigure.width, event.xconfigure.height); + } + break; + case ButtonPress: + keys[TranslateButton(event.xbutton.button)] = true; + break; + case ButtonRelease: + keys[TranslateButton(event.xbutton.button)] = false; + keys2[TranslateButton(event.xbutton.button)] = false; + break; + case KeyPress: + if(level.showConsole) + { + HandleConsoleKeyPress((OpenArena::Keys)TranslateKey(XLookupKeysym(&event.xkey, 0))); + } + else + { + keys[TranslateKey(XLookupKeysym(&event.xkey, 0))] = true; + } + break; + case KeyRelease: + keys[TranslateKey(XLookupKeysym(&event.xkey, 0))] = false; + keys2[TranslateKey(XLookupKeysym(&event.xkey, 0))] = false; + break; + case ClientMessage: + if(*XGetAtomName(g_Screen.GetDisplay(), event.xclient.message_type) == *"WM_PROTOCOLS") + { + printf("Exiting sanely...\n"); + done = true; + } + break; + default: + break; + } + } //End Equivalent of WNDPROC + + if(active) + { + if(keys[OpenArena::KEY_ESCAPE]) + { + done = true; + } + else if(keys[OpenArena::KEY_F1]) + { + g_Screen.Close(); + g_Screen.ToggleFullscreen(); + g_Screen.Open(); + } + else + { + level.defaultPlayer[0].camera.Update(); + if(!level.showConsole) + { + if(level.mlook) + { + level.defaultPlayer[0].camera.SetViewByMouse(g_Screen); + } + else + { + SetCursorPos(g_Screen.width/2, g_Screen.height/2);//Shit this may be windows specific + } + + //Maybe some of these if not almost all should be moved into Level + ////////// + //Move Backward + if(!level.defaultPlayer->controls.backward.IsEmpty()) + { + level.defaultPlayer->controls.backward.FirstPosition(); + if(keys[level.defaultPlayer->controls.backward.Retrieve()]) + { + level.defaultPlayer->camera.MoveCamera(-level.moveSpeed); + } + else + { + while(level.defaultPlayer->controls.backward.NextPosition() && (keys[level.defaultPlayer->controls.backward.Retrieve()] != true)); + { + if(keys[level.defaultPlayer->controls.backward.Retrieve()]) + { + level.defaultPlayer->camera.MoveCamera(-level.moveSpeed); + } + } + } + } + + ////////// + //Move forward + if(!level.defaultPlayer->controls.forward.IsEmpty()) + { + level.defaultPlayer->controls.forward.FirstPosition(); + if(keys[level.defaultPlayer->controls.forward.Retrieve()]) + { + level.defaultPlayer->camera.MoveCamera(level.moveSpeed); + } + else + { + while(level.defaultPlayer->controls.forward.NextPosition() && (keys[level.defaultPlayer->controls.forward.Retrieve()] != true)); + { + if(keys[level.defaultPlayer->controls.forward.Retrieve()]) + { + level.defaultPlayer->camera.MoveCamera(level.moveSpeed); + } + } + } + } + + ////////// + //Strafe Left + if(!level.defaultPlayer->controls.moveLeft.IsEmpty()) + { + level.defaultPlayer->controls.moveLeft.FirstPosition(); + if(keys[level.defaultPlayer->controls.moveLeft.Retrieve()]) + { + level.defaultPlayer->camera.StrafeCamera(-level.moveSpeed); + } + else + { + while(level.defaultPlayer->controls.moveLeft.NextPosition() && (keys[level.defaultPlayer->controls.moveLeft.Retrieve()] != true)); + { + if(keys[level.defaultPlayer->controls.moveLeft.Retrieve()]) + { + level.defaultPlayer->camera.StrafeCamera(-level.moveSpeed); + } + } + } + } + + ////////// + //Strafe Right + if(!level.defaultPlayer->controls.moveRight.IsEmpty()) + { + level.defaultPlayer->controls.moveRight.FirstPosition(); + if(keys[level.defaultPlayer->controls.moveRight.Retrieve()]) + { + level.defaultPlayer[0].camera.StrafeCamera(level.moveSpeed); + } + else + { + while(level.defaultPlayer->controls.moveRight.NextPosition() && (keys[level.defaultPlayer->controls.moveRight.Retrieve()] != true)); + { + if(keys[level.defaultPlayer->controls.moveRight.Retrieve()]) + { + level.defaultPlayer->camera.StrafeCamera(level.moveSpeed); + } + } + } + } + + ////////// + //Keyboard Look Left + if(!level.defaultPlayer->controls.lookLeft.IsEmpty()) + { + level.defaultPlayer->controls.lookLeft.FirstPosition(); + if(keys[level.defaultPlayer->controls.lookLeft.Retrieve()]) + { + level.defaultPlayer[0].camera.RotateView(level.turnSpeed, 0, 1, 0); + } + else + { + while(level.defaultPlayer->controls.lookLeft.NextPosition() && (keys[level.defaultPlayer->controls.lookLeft.Retrieve()] != true)); + { + if(keys[level.defaultPlayer->controls.lookLeft.Retrieve()]) + { + level.defaultPlayer[0].camera.RotateView(level.turnSpeed, 0, 1, 0); + } + } + } + } + + ////////// + //Keyboard Look Right + if(!level.defaultPlayer->controls.lookRight.IsEmpty()) + { + level.defaultPlayer->controls.lookRight.FirstPosition(); + if(keys[level.defaultPlayer->controls.lookRight.Retrieve()]) + { + level.defaultPlayer->camera.RotateView(-level.turnSpeed, 0, 1, 0); + } + else + { + while(level.defaultPlayer->controls.lookRight.NextPosition() && (keys[level.defaultPlayer->controls.lookRight.Retrieve()] != true)); + { + if(keys[level.defaultPlayer->controls.lookRight.Retrieve()]) + { + level.defaultPlayer->camera.RotateView(-level.turnSpeed, 0, 1, 0); + } + } + } + } + + ////////// + //Keyboard Look Up + if(!level.defaultPlayer->controls.lookUp.IsEmpty()) + { + level.defaultPlayer->controls.lookUp.FirstPosition(); + if(keys[level.defaultPlayer->controls.lookUp.Retrieve()]) + { + level.defaultPlayer->camera.RotateView(level.turnSpeed, 1, 0, 0); + } + else + { + while(level.defaultPlayer->controls.lookUp.NextPosition() && (keys[level.defaultPlayer->controls.lookUp.Retrieve()] != true)); + { + if(keys[level.defaultPlayer->controls.lookUp.Retrieve()]) + { + level.defaultPlayer->camera.RotateView(level.turnSpeed, 1, 0, 0); + } + } + } + } + + ////////// + //Keyboard Look Down + if(!level.defaultPlayer->controls.lookDown.IsEmpty()) + { + level.defaultPlayer->controls.lookDown.FirstPosition(); + if(keys[level.defaultPlayer->controls.lookDown.Retrieve()]) + { + level.defaultPlayer->camera.RotateView(-level.turnSpeed, 1, 0, 0); + } + else + { + while(level.defaultPlayer->controls.lookDown.NextPosition() && (keys[level.defaultPlayer->controls.lookDown.Retrieve()] != true)); + { + if(keys[level.defaultPlayer->controls.lookDown.Retrieve()]) + { + level.defaultPlayer->camera.RotateView(-level.turnSpeed, 1, 0, 0); + } + } + } + } + + ////////// + //Toggle Show FPS + if(!level.defaultPlayer->controls.toggleFPS.IsEmpty()) + { + level.defaultPlayer->controls.toggleFPS.FirstPosition(); + if(keys[level.defaultPlayer->controls.toggleFPS.Retrieve()]) + { + if(!keys2[level.defaultPlayer->controls.toggleFPS.Retrieve()]) + { + level.showFPS = !level.showFPS; + } + } + else + { + while(level.defaultPlayer->controls.toggleFPS.NextPosition() && (keys[level.defaultPlayer->controls.toggleFPS.Retrieve()] != true)); + { + if(keys[level.defaultPlayer->controls.toggleFPS.Retrieve()]) + { + if(!keys2[level.defaultPlayer->controls.toggleFPS.Retrieve()]) + { + level.showFPS = !level.showFPS; + } + } + } + } + } + + ////////// + //Toggle MouseLook + if(!level.defaultPlayer->controls.toggleMouseLook.IsEmpty()) + { + level.defaultPlayer->controls.toggleMouseLook.FirstPosition(); + if(keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) + { + if(keys2[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) + { + level.mlook = ! level.mlook; + } + } + else + { + while(level.defaultPlayer->controls.toggleMouseLook.NextPosition() && (keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()] != true)); + { + if(keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) + { + if(keys2[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) + { + level.mlook = ! level.mlook; + } + } + } + } + } + + ////////// + //Toggle Console + if(!level.defaultPlayer[0].controls.toggleConsole.IsEmpty()) + { + level.defaultPlayer[0].controls.toggleConsole.FirstPosition(); + if(keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) + { + if(!keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) + { + level.showConsole = !level.showConsole; + keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()] = true; + } + } + else + { + while(level.defaultPlayer[0].controls.toggleConsole.NextPosition() && (keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()] != true)); + { + if(keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) + { + if(!keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) + { + level.showConsole = !level.showConsole; + keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()] = true; + } + } + } + } + } + + ////////// + //Quick MouseLook + if(!level.defaultPlayer->controls.quickMouseLook.IsEmpty()) + { + level.defaultPlayer->controls.quickMouseLook.FirstPosition(); + if(keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) + { + if(keys2[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) + { + level.mlook = ! level.mlook; + } + } + else + { + while(level.defaultPlayer->controls.quickMouseLook.NextPosition() && (keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()] != true)); + { + if(keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) + { + if(keys2[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) + { + level.mlook = ! level.mlook; + } + } + } + } + } + } + } + } + + DrawGLScene(); + + if(keys[OpenArena::KEY_F1]) + { + keys[OpenArena::KEY_F1] = false; + g_Screen.Close(); + g_Screen.ToggleFullscreen(); + if(!g_Screen.Open(OPENARENA_VERSION, level.screen.GetWidth(), level.screen.GetHeight(), level.screen.GetColorDepth(), level.screen.GetFullscreen())) + { + return 1; + } + } + + } + level.UnloadMap(); + g_Screen.Close(); + exit(0); +} + +//This should probably be moved into oa_input +unsigned char TranslateKey(int keyCode) +{ + switch (keyCode) + { + case XK_BackSpace: + return OpenArena::KEY_BACK; + case XK_Tab: + return OpenArena::KEY_TAB; + case XK_Return: + return OpenArena::KEY_RETURN; + case XK_Escape: + return OpenArena::KEY_ESCAPE; + case XK_Left: + return OpenArena::KEY_LEFT; + case XK_Right: + return OpenArena::KEY_RIGHT; + case XK_Up: + return OpenArena::KEY_UP; + case XK_Down: + return OpenArena::KEY_DOWN; + case XK_Home: + return OpenArena::KEY_HOME; + case XK_End: + return OpenArena::KEY_END; + case XK_Prior: + return OpenArena::KEY_PRIOR; + case XK_Next: + return OpenArena::KEY_NEXT; + case XK_Num_Lock: + return OpenArena::KEY_NUMLOCK; + case XK_KP_Enter: + return OpenArena::KEY_RETURN; + case XK_KP_Home: + return OpenArena::KEY_HOME; + case XK_KP_End: + return OpenArena::KEY_END; + case XK_KP_Prior: + return OpenArena::KEY_PRIOR; + case XK_KP_Next: + return OpenArena::KEY_NEXT; + case XK_KP_0: + return OpenArena::KEY_NUMPAD0; + case XK_KP_1: + return OpenArena::KEY_NUMPAD1; + case XK_KP_2: + return OpenArena::KEY_NUMPAD2; + case XK_KP_3: + return OpenArena::KEY_NUMPAD3; + case XK_KP_4: + return OpenArena::KEY_NUMPAD4; + case XK_KP_5: + return OpenArena::KEY_NUMPAD5; + case XK_KP_6: + return OpenArena::KEY_NUMPAD6; + case XK_KP_7: + return OpenArena::KEY_NUMPAD7; + case XK_KP_8: + return OpenArena::KEY_NUMPAD8; + case XK_KP_9: + return OpenArena::KEY_NUMPAD9; + case XK_KP_Multiply: + return OpenArena::KEY_MULTIPLY; + case XK_KP_Add: + return OpenArena::KEY_ADD; + case XK_KP_Subtract: + return OpenArena::KEY_SUBTRACT; + case XK_KP_Divide: + return OpenArena::KEY_DIVIDE; + case XK_F1: + return OpenArena::KEY_F1; + case XK_F2: + return OpenArena::KEY_F2; + case XK_F3: + return OpenArena::KEY_F3; + case XK_F4: + return OpenArena::KEY_F4; + case XK_F5: + return OpenArena::KEY_F5; + case XK_F6: + return OpenArena::KEY_F6; + case XK_F7: + return OpenArena::KEY_F7; + case XK_F8: + return OpenArena::KEY_F8; + case XK_F9: + return OpenArena::KEY_F9; + case XK_F10: + return OpenArena::KEY_F10; + case XK_F11: + return OpenArena::KEY_F11; + case XK_F12: + return OpenArena::KEY_F12; + case XK_Shift_L: + return OpenArena::KEY_SHIFT; + case XK_Shift_R: + return OpenArena::KEY_SHIFT; + case XK_Control_L: + return OpenArena::KEY_CONTROL; + case XK_Control_R: + return OpenArena::KEY_CONTROL; + case XK_Caps_Lock: + return OpenArena::KEY_CAPITAL; + case XK_Pause: + return OpenArena::KEY_PAUSE; + case XK_KP_Space: + case XK_space: + return OpenArena::KEY_SPACE; + case XK_Insert: + return OpenArena::KEY_INSERT; + case XK_Delete: + return OpenArena::KEY_DELETE; + case XK_KP_Separator: + return OpenArena::KEY_SEPARATOR; + case XK_Scroll_Lock: + return OpenArena::KEY_SCROLL; + case XK_period: + return OpenArena::KEY_OEM_PERIOD; + case XK_plus: + return OpenArena::KEY_OEM_PLUS; + case XK_minus: + return OpenArena::KEY_OEM_MINUS; + case XK_comma: + return OpenArena::KEY_OEM_COMMA; + case XK_0: + return OpenArena::KEY_0; + case XK_1: + return OpenArena::KEY_1; + case XK_2: + return OpenArena::KEY_2; + case XK_3: + return OpenArena::KEY_3; + case XK_4: + return OpenArena::KEY_4; + case XK_5: + return OpenArena::KEY_5; + case XK_6: + return OpenArena::KEY_6; + case XK_7: + return OpenArena::KEY_7; + case XK_8: + return OpenArena::KEY_8; + case XK_9: + return OpenArena::KEY_9; + case XK_a: + case XK_A: + return OpenArena::KEY_A; + case XK_b: + case XK_B: + return OpenArena::KEY_B; + case XK_c: + case XK_C: + return OpenArena::KEY_C; + case XK_d: + case XK_D: + return OpenArena::KEY_D; + case XK_e: + case XK_E: + return OpenArena::KEY_E; + case XK_f: + case XK_F: + return OpenArena::KEY_F; + case XK_g: + case XK_G: + return OpenArena::KEY_G; + case XK_h: + case XK_H: + return OpenArena::KEY_H; + case XK_i: + case XK_I: + return OpenArena::KEY_I; + case XK_j: + case XK_J: + return OpenArena::KEY_J; + case XK_k: + case XK_K: + return OpenArena::KEY_K; + case XK_l: + case XK_L: + return OpenArena::KEY_L; + case XK_m: + case XK_M: + return OpenArena::KEY_M; + case XK_n: + case XK_N: + return OpenArena::KEY_N; + case XK_o: + case XK_O: + return OpenArena::KEY_O; + case XK_p: + case XK_P: + return OpenArena::KEY_P; + case XK_q: + case XK_Q: + return OpenArena::KEY_Q; + case XK_r: + case XK_R: + return OpenArena::KEY_R; + case XK_s: + case XK_S: + return OpenArena::KEY_S; + case XK_t: + case XK_T: + return OpenArena::KEY_T; + case XK_u: + case XK_U: + return OpenArena::KEY_U; + case XK_v: + case XK_V: + return OpenArena::KEY_V; + case XK_w: + case XK_W: + return OpenArena::KEY_W; + case XK_x: + case XK_X: + return OpenArena::KEY_X; + case XK_y: + case XK_Y: + return OpenArena::KEY_Y; + case XK_z: + case XK_Z: + return OpenArena::KEY_Z; + case XK_grave: + return OpenArena::KEY_OEM_3; + case XK_Super_L: + return OpenArena::KEY_LWIN; + case XK_Super_R: + return OpenArena::KEY_RWIN; + case XK_Menu: + return OpenArena::KEY_APPS; + case XK_bracketleft: + return OpenArena::KEY_OEM_4; + case XK_bracketright: + return OpenArena::KEY_OEM_6; + case XK_backslash: + return OpenArena::KEY_OEM_5; + case XK_semicolon: + return OpenArena::KEY_OEM_1; + case XK_apostrophe: + return OpenArena::KEY_OEM_7; + case XK_slash: + return OpenArena::KEY_OEM_2; + case XK_Alt_L: + return OpenArena::KEY_UNKNOWN; + case XK_Alt_R: + return OpenArena::KEY_UNKNOWN; + +/*These keys definately still need to be accounted for +` 96 +pause 65299 +win 65515 +apps 65383 +- 45 += 61 +[ 91 +] 93 +\ 92 +; 59 +' 39 +' 47 +left alt 65513 +right alt 65514 + +#define KEY_LBUTTON 1 +#define KEY_RBUTTON 2 +#define KEY_MBUTTON 3 +#define KEY_LWIN 21 +#define KEY_RWIN 22 +#define KEY_APPS 23 +#define KEY_OEM_1 53 +#define KEY_OEM_2 54 +#define KEY_OEM_3 55 +#define KEY_OEM_4 56 +#define KEY_OEM_5 57 +#define KEY_OEM_6 58 +#define KEY_OEM_7 59 +*/ + default: + return OpenArena::KEY_UNKNOWN; + } +} + +unsigned char TranslateButton(int keyCode) +{ + switch(keyCode) + { + case Button1: + return OpenArena::KEY_BUTTON0; + case Button2: + return OpenArena::KEY_BUTTON2; + case Button3: + return OpenArena::KEY_BUTTON1; + case Button4: + return OpenArena::KEY_BUTTON3; + case Button5: + return OpenArena::KEY_BUTTON4; + } +} + +void HandleConsoleKeyPress(OpenArena::Keys key) +{ + //See if we need to hide the console + level.defaultPlayer[0].controls.toggleConsole.FirstPosition(); + if(key == level.defaultPlayer[0].controls.toggleConsole.Retrieve()) + { + level.showConsole = false; + } + else + { + while(level.defaultPlayer[0].controls.toggleConsole.NextPosition() && level.showConsole) + { + if(level.defaultPlayer[0].controls.toggleConsole.Retrieve() == key) + { + level.showConsole = false; + } + } + } + switch (key) + { + case OpenArena::KEY_SHIFT: + keys[OpenArena::KEY_SHIFT] = true; + break; + case OpenArena::KEY_RETURN: + level.UpdateConsole('\n'); + break; + case OpenArena::KEY_SPACE: + printf("hello"); + level.UpdateConsole(' '); + break; + case OpenArena::KEY_BACK: + level.UpdateConsole(OpenArena::KEY_BACK); + break; + default: + char ascii = OpenArena::KeyToASCII(key, keys[OpenArena::KEY_SHIFT]); + if(ascii != '\0') + { + level.UpdateConsole(ascii); + } + } +} + +#endif diff --git a/src/window.cpp b/src/window.cpp index 1affddf..9903024 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -325,42 +325,26 @@ bool OpenArena::Window::Open(string title, int width, int height, int bits, bool OpenArena::Window::Window() { - OnInit = OpenArena::DefaultInit; - OnResize = OpenArena::DefaultResize; + _initializer = new Initializer(); + _resizer = new Resizer(); } OpenArena::Window::~Window() { } -void OpenArena::Window::SetOnInit(InitFunc function) +void OpenArena::Window::SetInitializer(OpenArena::Window::Initializer* initializer) { - OnInit = function; + _initializer = initializer; } -void OpenArena::Window::SetOnResize(ResizeFunc function) +void OpenArena::Window::SetResizer(OpenArena::Window::Resizer* resizer) { - OnResize = function; + _resizer = resizer; } -int OpenArena::DefaultInit() +void OpenArena::Window::Resizer::Resize(GLsizei width, GLsizei height) { - glEnable(GL_TEXTURE_2D); - glShadeModel(GL_SMOOTH); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClearDepth(1.0f); - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LEQUAL); - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - - return true; -} - -void OpenArena::DefaultResize(GLsizei width, GLsizei height) -{ - //TODO see if this really needs to be os specific - #ifdef WIN32 if (height==0) height=1; @@ -372,15 +356,26 @@ void OpenArena::DefaultResize(GLsizei width, GLsizei height) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - #endif - #ifdef __linux - //TODO Implement this - #endif + +} + +int OpenArena::Window::Initializer::Initialize() +{ + glEnable(GL_TEXTURE_2D); + glShadeModel(GL_SMOOTH); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClearDepth(1.0f); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + + return true; } void OpenArena::Window::Resize(GLsizei width, GLsizei height) { - OnResize(width, height); + _resizer->Resize(width, height); } #ifdef __linux