From 6b23b97921ec90e12c52e026b1aa99f234f252c5 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Thu, 5 Apr 2012 21:56:37 +0100 Subject: [PATCH] [Add] Adding initial directory structure and initial code. --- .gitignore | 7 ++ Bin/Makefile | 24 ++++++ Data/Img/test.bmp | Bin 0 -> 120054 bytes Data/Img/test.png | Bin 0 -> 1005 bytes src/Main/GLWindow.cpp | 192 ++++++++++++++++++++++++++++++++++++++++++ src/Main/GLWindow.h | 50 +++++++++++ src/Main/Makefile | 20 +++++ 7 files changed, 293 insertions(+) create mode 100644 .gitignore create mode 100644 Bin/Makefile create mode 100644 Data/Img/test.bmp create mode 100644 Data/Img/test.png create mode 100644 src/Main/GLWindow.cpp create mode 100644 src/Main/GLWindow.h create mode 100644 src/Main/Makefile diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ca41f0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +src/LibD +src/Makefile +*.pro.user +moc_* +*.o +*.log +*swp diff --git a/Bin/Makefile b/Bin/Makefile new file mode 100644 index 0000000..3a3f8dd --- /dev/null +++ b/Bin/Makefile @@ -0,0 +1,24 @@ +CC = g++ +CFLAGS = -ansi -Wall -g +LDADD = -lGL -lGLU -lglut -lSDL -lSDL_image -lSDL_gfx -lSDL_ttf -ltinyxml +LDADDSTATIC = -Wl,-Bstatic -lSDL -lSDL_image -lopenal -lalut -L/usr/X11 -Wl,-Bdynamic -lasound -lartsc -lesd -lpulse -lpulse-simple -ldirectfb -lvga -laa -lcaca -ljpeg -ltiff - + +.PHONY: default static all clean + +default: all + +all: + $(MAKE) -C ../src/Main + + $(CC) $(CFLAGS) -o LibD ../src/Main/main.cpp ../src/Main/Main/*.o $(LDADD) + +static: + @echo -e "\033[1;31mThis is an experimental build, if it does not work, don't complain...\033[0m" + @sleep 1 + $(MAKE) -C ../src/Main/Main + + $(CC) $(CFLAGS) -o build/LibD-static ../src/Main/main.cpp ../src/Main/Main/*.o $(LDADDSTATIC) + +clean: + $(MAKE) -C ../src/Main/Main clean + rm -f LibD diff --git a/Data/Img/test.bmp b/Data/Img/test.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d23f5ceb2ce924ae42edd210e3f23e3da1cccdd1 GIT binary patch literal 120054 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 b?tA +#include + +#ifdef _unix_ +#include +#endif + +#include "GLWindow.h" + +using std::string; + +typedef GLXConext (*PFNGLXCREATECONTEXTATTRIBSARBPROC)(Display* dpy, GLXFBConfig config, + GLXContext share_context, bool direct, const int* attrib_list); + +unsigned int GetTickCount(void) { + struct timeval t; + gettimeofdat(&t, NULL); + + unsigned long secs = t.tv_sec * 1000; + secs += (t.tv_usec / 1000); + return secs; +} + +GLWindow::GLWindow(void) : + _game(NULL), + _isRunning(true), + _lastTime(0), + _display(NULL), + _xWindow(0), + _glContext(0), + _screenID(0), + _isFullscreen(false), + _width(0), + _height(0), + _bpp(0), + _GL3Supported(false) {} + +GLWindow::~GLWindow(void) { + +} + +bool GLWindow::Create(int width, int height, int bpp, bool fullscreen) { + // Open the default display. + _display = XOpenDisplay(0); + if(!_display) { + std::cerr << "Could not open the display." << std::endl; + 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)); + + XF86VidModeInfo **modes; + if(!XF86VidModeGetAllModeLines(_display, _screenID, *modeNum, &modes)) { + std::cerr << "Could not query the video modes." << std::endl; + return false; + } + + _XF86DeskMode = *modes[0]; + + int bestModes = -1; + for(int i = 0; i < modeNum; i++) { + if((modes[i]->hdisplay == width) && (modes[i]->vdisplay == height)) { + bestModes = i; + } + } + + if(bestMode == -1 { + std::cerr << "Could not find a suitable graphics mode." << std::endl; + return false; + } + + int doubleBufferAttribList[] = { + 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) { + std::cerr << "Could not create a double buffere window.. Sux.." <screen), vi->visual, AllocNone); + _XSetAttr.colormap = cmap; + _XSetAttr.border_pixel = 0; + _XSetAttr.even_mask = ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | + StructureNotifyMask; + _XSetAttr.override_redirect = False; + + unsigned long windowAttributes = CWBorderPixel | CWColorMap | CWEventMask; + + if(fullscreen) { + windowAttributes = CWBorderPixel | CWColorMap | CWColorMap | CWEventMask | CWOverrideRedirect; + + XF86VidModeSwitchToMode(_display, _screenID, modes[bestModes]); + 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 = "Some GL Demo stuff.."; + + // TODO; + if(fullscreen) { + // Some code here.. + } else { + // Some more code here.. + } + + 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; +} + +void GLWindow::Destroy(void) { + if(_glContext) { + // Some code here. + } + if(_isFullscreen) { + // And here.. + } + + XCloseDisplay(_display); +} + +void GLWindow::ProcessEvents(void) { + // Events are boring.. do the later. +} + +float GLWindow::GetElapsedSeconds(void) { + unsigned int currentTime = GetTickCount(); + unsigned int diff = currentTime - _lastTime; + _lastTime = currentTime; + return float(diff) / 1000.0f); +} \ No newline at end of file diff --git a/src/Main/GLWindow.h b/src/Main/GLWindow.h new file mode 100644 index 0000000..a2476fb --- /dev/null +++ b/src/Main/GLWindow.h @@ -0,0 +1,50 @@ +#pragma once +#include +#include + +#include +#include + +class Game; + +class GLWindow { +public: + GLWindow(void); + virtual ~GLWindow(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; + + Game* GetAttachedGame(void) { return _game; } + + unsigned int _lastTime; + + Display _display; + Window _xWindow; + GLXContext _glContext; + XF86VidModeInfo _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/Makefile b/src/Main/Makefile new file mode 100644 index 0000000..7d2f480 --- /dev/null +++ b/src/Main/Makefile @@ -0,0 +1,20 @@ +CC = g++ +CFLAGS = -ansi -Wall -g +LDADD = -lGL -lGLU -lSDL -lSDL_image + +objects = GLWindow.o \ + + +.PHONY: default all clean + +default: all + +%.cpp: %.h + +%.o: %.cpp + $(CC) $(CFLAGS) -c -o $@ $< + +all: $(objects) + +clean: + rm -f $(objects)