From 6552fc2cf23989f5fa74db6eccbd6354d3099146 Mon Sep 17 00:00:00 2001 From: Allanis Date: Thu, 16 May 2013 00:09:39 +0100 Subject: [PATCH] [Change] Some openGL cleanup. --- src/opengl.c | 53 ++++++++++++++++++++++++++++++---------------------- src/opengl.h | 5 +++++ 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/opengl.c b/src/opengl.c index 357f547..7cec798 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -355,17 +355,18 @@ void gl_getSpriteFromDir(int* x, int* y, const glTexture* t, const double dir) { // Blit the sprite at given position. void gl_blitSprite(const glTexture* sprite, const double bx, const double by, const int sx, const int sy, const glColour* c) { + // Don't bother drawing if offscreen -- waste of cycles. - if(fabs(bx-VX(*gl_camera)+gui_xoff) > gl_screen.w / 2 + sprite->sw / 2 || - fabs(by-VY(*gl_camera)+gui_yoff) > gl_screen.h / 2 + sprite->sh / 2) + if(fabs(bx-VX(*gl_camera)+gui_xoff) > SCREEN_W / 2 + sprite->sw / 2 || + fabs(by-VY(*gl_camera)+gui_yoff) > SCREEN_H / 2 + sprite->sh / 2) return; double x, y, tx, ty; glEnable(GL_TEXTURE_2D); - x = bx - VX(*gl_camera) - sprite->sw/2. + gui_xoff; - y = by - VY(*gl_camera) - sprite->sh/2. + gui_yoff; + x = bx - (double)SCREEN_W/2.; + y = by - (double)SCREEN_H/2.; tx = sprite->sw * (double)(sx)/sprite->rw; ty = sprite->sh * (sprite->sy-(double)sy-1)/sprite->rh; @@ -578,8 +579,8 @@ static GLboolean gl_hasExt(char* name) { } // Check and report if there's been an error. +#ifndef gl_checkErr // I know, I know, it's a little hackish. void gl_checkErr(void) { -#ifdef DEBUG GLenum err; char* errstr; @@ -614,8 +615,8 @@ void gl_checkErr(void) { break; } WARN("OpenGL error: %s", errstr); -#endif } +#endif // Initialize SDL/OpenGL etc. int gl_init(void) { @@ -648,8 +649,8 @@ int gl_init(void) { DEBUG("Available fullscreen modes:"); for(i = 0; modes[i]; i++) { DEBUG("\t%dx%d", modes[i]->w, modes[i]->h); - if((flags & SDL_FULLSCREEN) && (modes[i]->w == gl_screen.w) && - (modes[i]->h == gl_screen.h)) + if((flags & SDL_FULLSCREEN) && (modes[i]->w == SCREEN_W) && + (modes[i]->h == SCREEN_H)) supported = 1; // Mode we asked for is supported. } } @@ -660,14 +661,15 @@ int gl_init(void) { off = -1; j = 0; for(i = 0; modes[i]; i++) { - toff = ABS(gl_screen.w-modes[i]->w) + ABS(gl_screen.h-modes[i]->h); + toff = ABS(SCREEN_W-modes[i]->w) + ABS(SCREEN_H-modes[i]->h); if((off == -1) || (toff < off)) { j = i; off = toff; } } WARN("Fullscreen mode %dx%d is not supported by your setup\n" - " Switching to %dx%d", gl_screen.w, gl_screen.h, + " Switching to %dx%d", + SCREEN_W, SCREEN_H, modes[j]->w, modes[j]->h); gl_screen.w = modes[j]->w; @@ -676,18 +678,18 @@ int gl_init(void) { } // Test the setup - aim for 32. - depth = SDL_VideoModeOK(gl_screen.w, gl_screen.h, gl_screen.depth, flags); + depth = SDL_VideoModeOK(SCREEN_W, SCREEN_H, gl_screen.depth, flags); if(depth == 0) WARN("Video mode %dx%d @ %d bpp not supported" " going to try to create it anyway...", - gl_screen.w, gl_screen.h, gl_screen.depth); + SCREEN_W, SCREEN_H, gl_screen.depth); if(depth != gl_screen.depth) LOG("Depth: %d bpp unavailable, will use %d bpp", gl_screen.depth, depth); gl_screen.depth = depth; // Actually creating the screen. - if(SDL_SetVideoMode(gl_screen.w, gl_screen.h, gl_screen.depth, flags) == NULL) { + if(SDL_SetVideoMode(SCREEN_W, SCREEN_H, gl_screen.depth, flags) == NULL) { ERR("Unable to create OpenGL window: %s", SDL_GetError()); return -1; } @@ -707,24 +709,31 @@ int gl_init(void) { if(gl_hasExt("GL_ARB_fragment_shader")==GL_TRUE) gl_screen.flags |= OPENGL_FRAG_SHADER; + // Max texture size. + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_screen.tex_max); + // Debug heaven. - DEBUG("OpenGL Window Created: %dx%d@%dbpp %s", gl_screen.w, gl_screen.h, + DEBUG("OpenGL Window Created: %dx%d@%dbpp %s", SCREEN_W, SCREEN_H, gl_screen.depth, (gl_has(OPENGL_FULLSCREEN)) ? "fullscreen" : "window"); - DEBUG("r: %d, g: %d, b: %d, a: %d, doublebuffer: %s", + DEBUG("r: %d, g: %d, b: %d, a: %d, db: %s, tex: %d", gl_screen.r, gl_screen.g, gl_screen.b, gl_screen.a, - (gl_has(OPENGL_DOUBLEBUF)) ? "yes" : "no"); + gl_has(OPENGL_DOUBLEBUF) ? "yes" : "no", + gl_screen.tex_max); DEBUG("Renderer: %s", glGetString(GL_RENDERER)); + if(!gl_has(OPENGL_FRAG_SHADER)) + DEBUG("No fragment shader extension detected"); + DEBUG(""); // Some openGL options. glClearColor(0., 0., 0., 1.); - glDisable(GL_DEPTH_TEST); // Set for doing 2D shidazles. - //glEnable(GL_TEXTURE_2D); // Don't enable globally, it will break non-texture blits. - glDisable(GL_LIGHTING); // No lighting, it is done when rendered. - glEnable(GL_BLEND); - glShadeModel(GL_FLAT); // Default shade model. Functions should keep this when done.. - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_DEPTH_TEST); // Set for doing 2D shidazles. + //glEnable(GL_TEXTURE_2D); // Don't enable globally, it will break non-texture blits. + glDisable(GL_LIGHTING); // No lighting, it is done when rendered. + glEnable(GL_BLEND); // Alpha blending ftw. + glShadeModel(GL_FLAT); // Default shade model. Functions should keep this when done.. + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Good blend model. glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-SCREEN_W /2, // Left edge. diff --git a/src/opengl.h b/src/opengl.h index e20aef5..b134df2 100644 --- a/src/opengl.h +++ b/src/opengl.h @@ -32,6 +32,7 @@ typedef struct glInfo_ { int depth; // Depth in bpp. int r, g, b, a; // Framebuffer values in bits. int flags; // Store different properties. + int tex_max; // Max texture size. } glInfo; extern glInfo gl_screen; // Local structure set with gl_init etc. @@ -79,5 +80,9 @@ void gl_exit(void); int gl_isTrans(const glTexture* t, const int x, const int y); void gl_getSpriteFromDir(int* x, int* y, const glTexture* t, const double dir); void gl_screenshot(const char* filename); +#if DEBUG == 1 void gl_checkErr(void); +#else +#define gl_checkErr() +#endif