From 60366c7ad0b65043a87cd06b24e333c5a39f8871 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Sun, 8 Apr 2012 18:16:35 +0100 Subject: [PATCH] [Add] Implemented Input decices. --- src/IO/Input.cpp | 4 + src/IO/Input.h | 58 +++---- src/Main/Game.cpp | 53 +++---- src/Main/Game.h | 7 +- src/Main/LGLXWindow.cpp | 338 ++++++++++++++++++++-------------------- src/Main/LGLXWindow.h | 20 +-- src/Main/main.cpp | 3 +- 7 files changed, 247 insertions(+), 236 deletions(-) diff --git a/src/IO/Input.cpp b/src/IO/Input.cpp index a99b5d3..a983ef2 100644 --- a/src/IO/Input.cpp +++ b/src/IO/Input.cpp @@ -31,6 +31,9 @@ bool CreateInput(void) { memcpy(keyboard.keys, tempKeys, sizeof(char) * keyboard.keycount); mouse.buttons = SDL_GetMouseState(&mouse.dx, &mouse.dy); + if(&keyboard > 0 || &mouse > 0){ + Debug::logger->message("Input device registered"); + } return true; } @@ -79,4 +82,5 @@ bool MouseStillUp(int button) { return(!_curr_mouse(button) && !_old_mouse(b void DestroyInput(void) { free(keyboard.keys); free(keyboard.oldKeys); + Debug::logger->message("Input device destroyed"); } diff --git a/src/IO/Input.h b/src/IO/Input.h index 988dfee..e2d906c 100644 --- a/src/IO/Input.h +++ b/src/IO/Input.h @@ -1,43 +1,45 @@ #pragma once #include +#include "../System/Debug.h" + typedef struct mouse_s { - int dx, dy; - int oldx, oldy; - unsigned int buttons; - unsigned int oldButtons; + int dx, dy; + int oldx, oldy; + unsigned int buttons; + unsigned int oldButtons; } mouse_t; typedef struct keyboard_s { - unsigned char *keys; - unsigned char *oldKeys; - int keycount; - int lastChar; - unsigned int mods; + unsigned char *keys; + unsigned char *oldKeys; + int keycount; + int lastChar; + unsigned int mods; } keyboard_t; typedef struct input_s { - mouse_t mouse; - keyboard_t keyboard; + mouse_t mouse; + keyboard_t keyboard; } input_t; - bool CreateInput(void); - void UpdateInput(void); + bool CreateInput(void); + void UpdateInput(void); - char GetKey(void); + char GetKey(void); - unsigned int GetX(void); - unsigned int GetY(void); - unsigned int GetOldX(void); - unsigned int GetOldY(void); - unsigned int GetMods(void); - bool KeyDown(int index); - bool KeyStillDown(int index); - bool KeyUp(int index); - bool KeyStillUp(int index); - bool MouseDown(int button); - bool MouseStillDown(int button); - bool MouseUp(int button); - bool MouseStillUp(int button); + unsigned int GetX(void); + unsigned int GetY(void); + unsigned int GetOldX(void); + unsigned int GetOldY(void); + unsigned int GetMods(void); + bool KeyDown(int index); + bool KeyStillDown(int index); + bool KeyUp(int index); + bool KeyStillUp(int index); + bool MouseDown(int button); + bool MouseStillDown(int button); + bool MouseUp(int button); + bool MouseStillUp(int button); - void DestroyInput(void); + void DestroyInput(void); diff --git a/src/Main/Game.cpp b/src/Main/Game.cpp index 24fbe3e..0749b66 100644 --- a/src/Main/Game.cpp +++ b/src/Main/Game.cpp @@ -6,12 +6,12 @@ #include #include "../System/Debug.h" -#include "Game.h" #include "../Sprite/Sprite.h" #include "../Texture/Texture.h" +#include "Game.h" Game::Game(void) { - _rotationAngle = 0.0f; + _rotationAngle = 0.0f; } Game::~Game(void) { @@ -19,56 +19,57 @@ Game::~Game(void) { } bool Game::Init(void) { - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LEQUAL); - + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + Texture* testTexture = new Texture(); testTexture->Load("../Data/Img/test.png"); - + _testSprite = new Sprite(); _testSprite->SetTexture(testTexture); _testSprite->SetHandle(Vec2(800/2, 600/2)); _testSprite->SetScale(Vec2(5.0f, 5.0f)); - // Return success. - return true; + // Return success. + return true; } void Game::Prepare(float dt) { - const float SPEED = 15.0f; - _rotationAngle += SPEED*dt; - if(_rotationAngle > 360.0f) { + const float SPEED = 15.0f; + _rotationAngle += SPEED*dt; + if(_rotationAngle > 360.0f) { _rotationAngle -= 360.0f; - } + } } void Game::Render(void) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, 800.0, 600.0, 0.0, 0.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - + _testSprite->SetRotation(_rotationAngle); - _testSprite->Draw(); + _testSprite->Draw(); } void Game::Shutdown(void) { - delete _testSprite->GetTexture(); + Debug::logger->message("\n ----- Cleaning Engine -----"); + delete _testSprite->GetTexture(); delete _testSprite; } void Game::OnResize(int width, int height) { - glViewport(0, 0, width, height); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - gluPerspective(45.0f, float(width) / float(height), 1.0f, 100.0f); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); + glViewport(0, 0, width, height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + gluPerspective(45.0f, float(width) / float(height), 1.0f, 100.0f); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); } diff --git a/src/Main/Game.h b/src/Main/Game.h index 8ab2c71..a99e890 100644 --- a/src/Main/Game.h +++ b/src/Main/Game.h @@ -1,4 +1,5 @@ #pragma once +#include "../IO/Input.h" class Sprite; @@ -6,15 +7,15 @@ class Game { public: Game(void); ~Game(void); - + bool Init(void); void Prepare(float dt); void Render(void); void Shutdown(void); - + void OnResize(int width, int height); private: float _rotationAngle; - Sprite* _testSprite; + Sprite* _testSprite; }; diff --git a/src/Main/LGLXWindow.cpp b/src/Main/LGLXWindow.cpp index ea987fe..d2056bf 100644 --- a/src/Main/LGLXWindow.cpp +++ b/src/Main/LGLXWindow.cpp @@ -17,13 +17,13 @@ using std::string; unsigned int GetTickCount(void) { struct timeval t; gettimeofday(&t, NULL); - + unsigned long secs = t.tv_sec * 1000; - secs += (t.tv_usec / 1000); - return secs; + secs += (t.tv_usec / 1000); + return secs; } -LGLXWindow::LGLXWindow(void) : +LGLXWindow::LGLXWindow(void) : _game(NULL), _isRunning(true), _lastTime(0), @@ -35,208 +35,210 @@ LGLXWindow::LGLXWindow(void) : _width(0), _height(0), _bpp(0), - _GL3Supported(false) - {} - + _GL3Supported(false) + { CreateInput(); } + LGLXWindow::~LGLXWindow(void) { } bool LGLXWindow::Create(int width, int height, int bpp, bool fullscreen) { - // Open the default display. - _display = XOpenDisplay(0); - if(!_display) { - Debug::logger->message("Could not open the display."); - return false; - } - - // Get the default screen ID. - _screenID = DefaultScreen(_display); - - int n = 0, modeNum = 0; - // Get a frambuffer config useing the default attributes. - GLXFBConfig framebufferConfig = (*glXChooseFBConfig(_display, DefaultScreen(_display), 0, &n)); - - XF86VidModeModeInfo **modes; - if(!XF86VidModeGetAllModeLines(_display, _screenID, &modeNum, &modes)) { + // Open the default display. + _display = XOpenDisplay(0); + if(!_display) { + Debug::logger->message("Could not open the display."); + return false; + } + + // Get the default screen ID. + _screenID = DefaultScreen(_display); + + int n = 0, modeNum = 0; + // Get a frambuffer config useing the default attributes. + GLXFBConfig framebufferConfig = (*glXChooseFBConfig(_display, DefaultScreen(_display), 0, &n)); + + XF86VidModeModeInfo **modes; + if(!XF86VidModeGetAllModeLines(_display, _screenID, &modeNum, &modes)) { Debug::logger->message("Could not query the video modes."); return false; - } - - _XF86DeskMode = *modes[0]; - - int bestMode = -1; - for(int i = 0; i < modeNum; i++) { + } + + _XF86DeskMode = *modes[0]; + + int bestMode = -1; + for(int i = 0; i < modeNum; i++) { if((modes[i]->hdisplay == width) && (modes[i]->vdisplay == height)) { bestMode = i; - } - } - - if(bestMode == -1) { + } + } + + if(bestMode == -1) { Debug::logger->message("Could not find a suitable graphics mode."); return false; - } - - int doubleBufferedAttribList[] = { + } + + int doubleBufferedAttribList[] = { GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE, 4, GLX_GREEN_SIZE, 4, GLX_BLUE_SIZE, 4, GLX_DEPTH_SIZE, 16, None - }; - - XVisualInfo* vi = NULL; - // Attempt to create a double buffered window. - vi = glXChooseVisual(_display, _screenID, doubleBufferedAttribList); - if(!vi) { + }; + + XVisualInfo* vi = NULL; + // Attempt to create a double buffered window. + vi = glXChooseVisual(_display, _screenID, doubleBufferedAttribList); + if(!vi) { Debug::logger->message("Could not create a double buffere window.. Sux.."); - } - - // Time to create a GL 2.1 context. - GLXContext gl2Context = glXCreateContext(_display, vi, 0, GL_TRUE); - if(!gl2Context) { + } + + // Time to create a GL 2.1 context. + GLXContext gl2Context = glXCreateContext(_display, vi, 0, GL_TRUE); + if(!gl2Context) { Debug::logger->message("Could Not create a GL 2.1 context, check your darn graphics drivers"); return false; - } - - // Get a pointer to the GL 3.0 context creation. - PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribs + } + + // Get a pointer to the GL 3.0 context creation. + PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribs = (PFNGLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddress((GLubyte*)"glXCreateContextAttribsARB"); - if(glXCreateContextAttribs == NULL) { + if(glXCreateContextAttribs == NULL) { Debug::logger->message("OpenGL 3.0 is not supported, falling back to 2.1"); _glContext = gl2Context; _GL3Supported = false; - } else { - // We create a GL 3.0 context.. - + } else { + // We create a GL 3.0 context.. + int attribs[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, 3, // We want a 3.0 context. - GLX_CONTEXT_MINOR_VERSION_ARB, 0, - 0 // Zero indicates the end of the array. - }; - - _glContext = glXCreateContextAttribs(_display, framebufferConfig, 0, true, &attribs[0]); - // We can destroy thr GL 2.0 context once the 3.0 one has been checked. - glXDestroyContext(_display, gl2Context); - _GL3Supported = true; - } - - Colormap cmap = XCreateColormap(_display, RootWindow(_display, vi->screen), vi->visual, AllocNone); - _XSetAttr.colormap = cmap; - _XSetAttr.border_pixel = 0; - _XSetAttr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | + GLX_CONTEXT_MINOR_VERSION_ARB, 0, + 0 // Zero indicates the end of the array. + }; + + _glContext = glXCreateContextAttribs(_display, framebufferConfig, 0, true, &attribs[0]); + // We can destroy thr GL 2.0 context once the 3.0 one has been checked. + glXDestroyContext(_display, gl2Context); + _GL3Supported = true; + } + + Colormap cmap = XCreateColormap(_display, RootWindow(_display, vi->screen), vi->visual, AllocNone); + _XSetAttr.colormap = cmap; + _XSetAttr.border_pixel = 0; + _XSetAttr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | StructureNotifyMask; - _XSetAttr.override_redirect = False; - - //unsigned long windowAttributes = CWBorderPixel | CWColormap | CWEventMask; - - if(fullscreen) { - //windowAttributes = CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect; - - XF86VidModeSwitchToMode(_display, _screenID, modes[bestMode]); - XF86VidModeSetViewPort(_display, _screenID, 0, 0); - _XSetAttr.override_redirect = True; - } - - _xWindow = XCreateWindow(_display, RootWindow(_display, vi->screen), + _XSetAttr.override_redirect = False; + + //unsigned long windowAttributes = CWBorderPixel | CWColormap | CWEventMask; + + if(fullscreen) { + //windowAttributes = CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect; + + XF86VidModeSwitchToMode(_display, _screenID, modes[bestMode]); + XF86VidModeSetViewPort(_display, _screenID, 0, 0); + _XSetAttr.override_redirect = True; + } + + _xWindow = XCreateWindow(_display, RootWindow(_display, vi->screen), 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask, &_XSetAttr); - string title = "LibD"; - - if(fullscreen) { - XWarpPointer(_display, None, _xWindow, 0, 0, 0, 0, 0, 0); - XMapRaised(_display, _xWindow); - XGrabKeyboard(_display, _xWindow, True, GrabModeAsync, GrabModeAsync, CurrentTime); - XGrabPointer(_display, _xWindow, True, ButtonPressMask, GrabModeAsync, GrabModeAsync, + string title = "LibD"; + + if(fullscreen) { + XWarpPointer(_display, None, _xWindow, 0, 0, 0, 0, 0, 0); + XMapRaised(_display, _xWindow); + XGrabKeyboard(_display, _xWindow, True, GrabModeAsync, GrabModeAsync, CurrentTime); + XGrabPointer(_display, _xWindow, True, ButtonPressMask, GrabModeAsync, GrabModeAsync, _xWindow, None, CurrentTime); - } else { - Atom wmDelete = XInternAtom(_display, "WM_DELETE_WINDOW", True); - XSetWMProtocols(_display, _xWindow, &wmDelete, 1); - XSetStandardProperties(_display, _xWindow, title.c_str(), None, 0, NULL, 0, NULL); - XMapRaised(_display, _xWindow); - } - - XFree(modes); - - glXMakeCurrent(_display, _xWindow, _glContext); - - int posX = 0; - int posY = 0; - Window winDummy; - unsigned int borderDummy; - - _width = (unsigned) width; - _height = (unsigned) height; - _bpp = (unsigned) bpp; - - XGetGeometry(_display, _xWindow, &winDummy, &posX, &posY, + } else { + Atom wmDelete = XInternAtom(_display, "WM_DELETE_WINDOW", True); + XSetWMProtocols(_display, _xWindow, &wmDelete, 1); + XSetStandardProperties(_display, _xWindow, title.c_str(), None, 0, NULL, 0, NULL); + XMapRaised(_display, _xWindow); + } + + XFree(modes); + + glXMakeCurrent(_display, _xWindow, _glContext); + + int posX = 0; + int posY = 0; + Window winDummy; + unsigned int borderDummy; + + _width = (unsigned) width; + _height = (unsigned) height; + _bpp = (unsigned) bpp; + + XGetGeometry(_display, _xWindow, &winDummy, &posX, &posY, &_width, &_height, &borderDummy, &_bpp); - // Init the time. - _lastTime = GetTickCount(); - return true; + // Init the time. + _lastTime = GetTickCount(); + return true; } - + void LGLXWindow::Destroy(void) { - if(_glContext) { - glXMakeCurrent(_display, None, NULL); - glXDestroyContext(_display, _glContext); - _glContext = NULL; - } - if(_isFullscreen) { - XF86VidModeSwitchToMode(_display, _screenID, &_XF86DeskMode); - XF86VidModeSetViewPort(_display, _screenID, 0, 0); - } - - XCloseDisplay(_display); -} + if(_glContext) { + glXMakeCurrent(_display, None, NULL); + glXDestroyContext(_display, _glContext); + _glContext = NULL; + } + if(_isFullscreen) { + XF86VidModeSwitchToMode(_display, _screenID, &_XF86DeskMode); + XF86VidModeSetViewPort(_display, _screenID, 0, 0); + } + DestroyInput(); + XCloseDisplay(_display); +} void LGLXWindow::ProcessEvents(void) { - XEvent event; - - while(XPending(_display) > 0) { - XNextEvent(_display, &event); - switch(event.type) { - case Expose: - if(event.xexpose.count != 0) - break; - break; - case ConfigureNotify: - { - int width = event.xconfigure.width; - int height = event.xconfigure.height; - GetAttachedGame()->OnResize(width, height); - } - break; - case KeyPress: - { - if(XLookupKeysym(&event.xkey, 0) == XK_Escape) { + XEvent event; + + while(XPending(_display) > 0) { + XNextEvent(_display, &event); + switch(event.type) { + case Expose: + if(event.xexpose.count != 0) + break; + break; + case ConfigureNotify: + { + int width = event.xconfigure.width; + int height = event.xconfigure.height; + GetAttachedGame()->OnResize(width, height); + } + break; + case KeyPress: + { + if(XLookupKeysym(&event.xkey, 0) == XK_Escape) { _isRunning = false; - } + } // Register the key press with keyboard interface. - } - break; - case KeyRelease: - { - // Code here NAW! - } - break; - case ClientMessage: - if(string(XGetAtomName(_display, event.xclient.message_type)) == string("WM_PROTOCOLS")) { - _isRunning = true; - } - break; - default: - break; - } - } + } + break; + case KeyRelease: + { + if(KeyStillUp(SDLK_SPACE)) { + Debug::logger->message("Testing Input!"); + } + // Code here NAW! + } + break; + case ClientMessage: + if(string(XGetAtomName(_display, event.xclient.message_type)) == string("WM_PROTOCOLS")) { + _isRunning = true; + } + break; + default: + break; + } + } } float LGLXWindow::GetElapsedSeconds(void) { - unsigned int currentTime = GetTickCount(); - unsigned int diff = currentTime - _lastTime; - _lastTime = currentTime; - return float(diff) / 1000.0f; -} - \ No newline at end of file + unsigned int currentTime = GetTickCount(); + unsigned int diff = currentTime - _lastTime; + _lastTime = currentTime; + return float(diff) / 1000.0f; +} diff --git a/src/Main/LGLXWindow.h b/src/Main/LGLXWindow.h index eec4f77..20f6406 100644 --- a/src/Main/LGLXWindow.h +++ b/src/Main/LGLXWindow.h @@ -18,39 +18,41 @@ class LGLXWindow { public: LGLXWindow(void); virtual ~LGLXWindow(void); - + bool Create(int width, int hight, int bpp, bool fullscreen); void Destroy(void); void ProcessEvents(void); void AttachGame(Game* game) { _game = game; } - + bool IsRunning(void) { return _isRunning; } void SwapBuffers(void) { glXSwapBuffers(_display, _xWindow); } - + float GetElapsedSeconds(void); - + private: // A pointer to our game thingy.. Game* _game; // Check to see if the window is still running FFS. bool _isRunning; - + + keyboard_t keyboard; + Game* GetAttachedGame(void) { return _game; } - + unsigned int _lastTime; - + Display* _display; Window _xWindow; GLXContext _glContext; XF86VidModeModeInfo _XF86DeskMode; XSetWindowAttributes _XSetAttr; int _screenID; - + bool _isFullscreen; unsigned int _width; unsigned int _height; unsigned int _bpp; - + bool _GL3Supported; // I think that's about all I need for now.. FOR NOW!!! }; diff --git a/src/Main/main.cpp b/src/Main/main.cpp index 294ce05..18d7234 100644 --- a/src/Main/main.cpp +++ b/src/Main/main.cpp @@ -69,8 +69,7 @@ int main(int argc, char** argv) { programWindow.SwapBuffers(); } game.Shutdown(); // Free any resouces. - Debug::closeLog(); programWindow.Destroy(); // Destroy the program window. - + Debug::closeLog(); return 0; }