X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fvideo%2Fgl_renderer.cpp;h=1d062c44ba6a0574dcf3af44332b4082fc6bb783;hb=98dfd58973cda2eebb77cdc0241d9a8c7c745371;hp=2d928340d74ccbae3a3a38d3434b2dc763055110;hpb=8f4a6fbcec0779b6de56a1eba3713d89d84fb509;p=supertux.git diff --git a/src/video/gl_renderer.cpp b/src/video/gl_renderer.cpp index 2d928340d..1d062c44b 100644 --- a/src/video/gl_renderer.cpp +++ b/src/video/gl_renderer.cpp @@ -45,6 +45,10 @@ #include "obstack/obstackpp.hpp" #define LIGHTMAP_DIV 5 +#ifdef GL_VERSION_ES_CM_1_0 +# define glOrtho glOrthof +#endif + namespace { @@ -99,11 +103,11 @@ inline void intern_draw(float left, float top, float right, float bottom, bottom -= center_y; float vertices[] = { - left*ca - top*sa + center_x, left*sa + top*ca + center_y, - right*ca - top*sa + center_x, right*sa + top*ca + center_y, - right*ca - bottom*sa + center_x, right*sa + bottom*ca + center_y, - left*ca - bottom*sa + center_x, left*sa + bottom*ca + center_y - }; + left*ca - top*sa + center_x, left*sa + top*ca + center_y, + right*ca - top*sa + center_x, right*sa + top*ca + center_y, + right*ca - bottom*sa + center_x, right*sa + bottom*ca + center_y, + left*ca - bottom*sa + center_x, left*sa + bottom*ca + center_y + }; glVertexPointer(2, GL_FLOAT, 0, vertices); float uvs[] = { @@ -147,14 +151,16 @@ Renderer::Renderer() if(texture_manager != 0) texture_manager->save_textures(); +#ifdef SDL_GL_SWAP_CONTROL if(config->try_vsync) { /* we want vsync for smooth scrolling */ SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); } +#endif SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - // Hu? 16bit rendering? + // FIXME: Hu? 16bit rendering? SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); @@ -162,6 +168,7 @@ Renderer::Renderer() int flags = SDL_OPENGL; int width; int height; + if(config->use_fullscreen) { flags |= SDL_FULLSCREEN; @@ -174,9 +181,10 @@ Renderer::Renderer() width = config->window_width; height = config->window_height; } - int bpp = 0; + int bpp = 0; SDL_Surface *screen = SDL_SetVideoMode(width, height, bpp, flags); + if(screen == 0) { std::stringstream msg; msg << "Couldn't set video mode (" << width << "x" << height @@ -189,28 +197,13 @@ Renderer::Renderer() glDisable(GL_CULL_FACE); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); - glEnable(GL_VERTEX_ARRAY); - glEnable(GL_TEXTURE_COORD_ARRAY); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glViewport(0, 0, screen->w, screen->h); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - // logical resolution here not real monitor resolution -#ifdef GL_VERSION_ES_CM_1_0 - glOrthof(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1.0, 1.0); -#else - glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1.0, 1.0); -#endif - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0, 0, 0); - - check_gl_error("Setting up view matrices"); - - + // Init the projection matrix, viewport and stuff + apply_config(); + if(texture_manager == 0) texture_manager = new TextureManager(); else @@ -270,7 +263,7 @@ Renderer::draw_surface_part(const DrawingRequest& request) uv_bottom, 0.0, request.alpha, - Color(1.0, 1.0, 1.0), + request.color, Blend(), request.drawing_effect); } @@ -284,8 +277,8 @@ Renderer::draw_gradient(const DrawingRequest& request) const Color& bottom = gradientrequest->bottom; glDisable(GL_TEXTURE_2D); - glDisable(GL_TEXTURE_COORD_ARRAY); - glEnable(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); float vertices[] = { 0, 0, @@ -305,8 +298,8 @@ Renderer::draw_gradient(const DrawingRequest& request) glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - glDisable(GL_COLOR_ARRAY); - glEnable(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glColor4f(1, 1, 1, 1); @@ -318,6 +311,11 @@ Renderer::draw_filled_rect(const DrawingRequest& request) const FillRectRequest* fillrectrequest = (FillRectRequest*) request.request_data; + glDisable(GL_TEXTURE_2D); + glColor4f(fillrectrequest->color.red, fillrectrequest->color.green, + fillrectrequest->color.blue, fillrectrequest->color.alpha); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + if (fillrectrequest->radius != 0.0f) { // draw round rect @@ -333,32 +331,37 @@ Renderer::draw_filled_rect(const DrawingRequest& request) request.pos.x + fillrectrequest->size.x - radius, request.pos.y + fillrectrequest->size.y - radius); - glDisable(GL_TEXTURE_2D); - glColor4f(fillrectrequest->color.red, fillrectrequest->color.green, - fillrectrequest->color.blue, fillrectrequest->color.alpha); - int n = 8; - glBegin(GL_QUAD_STRIP); + int p = 0; + float vertices[(n+1) * 4 * 2]; + for(int i = 0; i <= n; ++i) { float x = sinf(i * (M_PI/2) / n) * radius; float y = cosf(i * (M_PI/2) / n) * radius; - glVertex2f(irect.get_left() - x, irect.get_top() - y); - glVertex2f(irect.get_right() + x, irect.get_top() - y); + vertices[p++] = irect.get_left() - x; + vertices[p++] = irect.get_top() - y; + + vertices[p++] = irect.get_right() + x; + vertices[p++] = irect.get_top() - y; } + for(int i = 0; i <= n; ++i) { float x = cosf(i * (M_PI/2) / n) * radius; float y = sinf(i * (M_PI/2) / n) * radius; - glVertex2f(irect.get_left() - x, irect.get_bottom() + y); - glVertex2f(irect.get_right() + x, irect.get_bottom() + y); + vertices[p++] = irect.get_left() - x; + vertices[p++] = irect.get_bottom() + y; + + vertices[p++] = irect.get_right() + x; + vertices[p++] = irect.get_bottom() + y; } - glEnd(); - glEnable(GL_TEXTURE_2D); - glColor4f(1, 1, 1, 1); + + glVertexPointer(2, GL_FLOAT, 0, vertices); + glDrawArrays(GL_TRIANGLE_STRIP, 0, sizeof(vertices)/sizeof(float)/2); } else { @@ -367,11 +370,6 @@ Renderer::draw_filled_rect(const DrawingRequest& request) float w = fillrectrequest->size.x; float h = fillrectrequest->size.y; - glDisable(GL_TEXTURE_2D); - glColor4f(fillrectrequest->color.red, fillrectrequest->color.green, - fillrectrequest->color.blue, fillrectrequest->color.alpha); - glDisable(GL_TEXTURE_COORD_ARRAY); - float vertices[] = { x, y, x+w, y, @@ -381,11 +379,11 @@ Renderer::draw_filled_rect(const DrawingRequest& request) glVertexPointer(2, GL_FLOAT, 0, vertices); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - - glEnable(GL_TEXTURE_COORD_ARRAY); - glEnable(GL_TEXTURE_2D); - glColor4f(1, 1, 1, 1); } + + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glEnable(GL_TEXTURE_2D); + glColor4f(1, 1, 1, 1); } void @@ -457,12 +455,12 @@ Renderer::draw_inverse_ellipse(const DrawingRequest& request) vertices[p++] = x - ex2; vertices[p++] = y + ey2; } - glDisable(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(2, GL_FLOAT, 0, vertices); glDrawArrays(GL_TRIANGLES, 0, points); - glEnable(GL_TEXTURE_COORD_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glColor4f(1, 1, 1, 1); @@ -559,16 +557,23 @@ Renderer::resize(int w, int h) void Renderer::apply_config() { - std::cout << "Applying Config:" - << "\n Desktop: " << desktop_width << "x" << desktop_height - << "\n Window: " << config->window_width << "x" << config->window_height - << "\n FullRes: " << config->fullscreen_width << "x" << config->fullscreen_height - << "\n Aspect: " << config->aspect_width << ":" << config->aspect_height - << "\n Magnif: " << config->magnification - << std::endl; + if (0) + { + std::cout << "Applying Config:" + << "\n Desktop: " << desktop_width << "x" << desktop_height + << "\n Window: " << config->window_width << "x" << config->window_height + << "\n FullRes: " << config->fullscreen_width << "x" << config->fullscreen_height + << "\n Aspect: " << config->aspect_width << ":" << config->aspect_height + << "\n Magnif: " << config->magnification + << std::endl; + } int w,h; - float target_aspect = float(config->aspect_width) / float(config->aspect_height); + float target_aspect = float(desktop_width) / desktop_height; + + if (config->aspect_width != 0 && config->aspect_height != 0) + target_aspect = float(config->aspect_width) / float(config->aspect_height); + float desktop_aspect = 4.0f / 3.0f; // random default fallback guess if (desktop_width != -1 && desktop_height != -1) @@ -576,6 +581,7 @@ Renderer::apply_config() desktop_aspect = float(desktop_width) / float(desktop_height); } + // Get the screen width if (config->use_fullscreen) { w = config->fullscreen_width; @@ -590,38 +596,38 @@ Renderer::apply_config() if (target_aspect > 1.0f) { - SCREEN_WIDTH = static_cast (w * (target_aspect / desktop_aspect)); - SCREEN_HEIGHT = static_cast (h); + SCREEN_WIDTH = static_cast(w * (target_aspect / desktop_aspect)); + SCREEN_HEIGHT = static_cast(h); } else { - SCREEN_WIDTH = static_cast (w); - SCREEN_HEIGHT = static_cast (h * (target_aspect / desktop_aspect)); + SCREEN_WIDTH = static_cast(w); + SCREEN_HEIGHT = static_cast(h * (target_aspect / desktop_aspect)); } - SCREEN_WIDTH = static_cast ((float) SCREEN_WIDTH / config->magnification); - SCREEN_HEIGHT = static_cast ((float) SCREEN_HEIGHT / config->magnification); - int max_width = 1600; // FIXME: Maybe 1920 is ok too int max_height = 1200; - if (0) + if (config->magnification == 0.0f) // Magic value that means 'minfill' { // This scales SCREEN_WIDTH/SCREEN_HEIGHT so that they never excede // max_width/max_height if (SCREEN_WIDTH > max_width || SCREEN_HEIGHT > max_height) { - float scale1 = float(max_width)/SCREEN_WIDTH; - float scale2 = float(max_height)/SCREEN_HEIGHT; - float scale = scale1 < scale2 ? scale1 : scale2; - SCREEN_WIDTH = static_cast ((float) SCREEN_WIDTH * scale); - SCREEN_HEIGHT = static_cast ((float) SCREEN_HEIGHT * scale); + float scale1 = float(max_width)/SCREEN_WIDTH; + float scale2 = float(max_height)/SCREEN_HEIGHT; + float scale = (scale1 < scale2) ? scale1 : scale2; + SCREEN_WIDTH = static_cast(SCREEN_WIDTH * scale); + SCREEN_HEIGHT = static_cast(SCREEN_HEIGHT * scale); } glViewport(0, 0, w, h); } else { + SCREEN_WIDTH = static_cast(SCREEN_WIDTH / config->magnification); + SCREEN_HEIGHT = static_cast(SCREEN_HEIGHT / config->magnification); + // This works by adding black borders around the screen to limit // SCREEN_WIDTH/SCREEN_HEIGHT to max_width/max_height int nw = w; @@ -629,37 +635,45 @@ Renderer::apply_config() if (SCREEN_WIDTH > max_width) { - nw = static_cast ((float) nw * float(max_width)/SCREEN_WIDTH); - SCREEN_WIDTH = static_cast (max_width); + nw = static_cast((float) nw * float(max_width)/SCREEN_WIDTH); + SCREEN_WIDTH = static_cast(max_width); } if (SCREEN_HEIGHT > max_height) { - nh = static_cast ((float) nh * float(max_height)/SCREEN_HEIGHT); - SCREEN_HEIGHT = static_cast (max_height); + nh = static_cast((float) nh * float(max_height)/SCREEN_HEIGHT); + SCREEN_HEIGHT = static_cast(max_height); } + // Clear both buffers so that we get a clean black border without junk glClear(GL_COLOR_BUFFER_BIT); + SDL_GL_SwapBuffers(); + glClear(GL_COLOR_BUFFER_BIT); + SDL_GL_SwapBuffers(); + + if (0) + std::cout << (w-nw)/2 << " " + << (h-nh)/2 << " " + << nw << "x" << nh << std::endl; - std::cout << (w-nw)/2 << " " - << (h-nh)/2 << " " - << nw << "x" << nh << std::endl; glViewport(std::max(0, (w-nw)/2), std::max(0, (h-nh)/2), std::min(nw, w), std::min(nh, h)); } - std::cout << " -> " << SCREEN_WIDTH << "x" << SCREEN_HEIGHT << std::endl; - + if (0) + std::cout << " -> " << SCREEN_WIDTH << "x" << SCREEN_HEIGHT << std::endl; glMatrixMode(GL_PROJECTION); glLoadIdentity(); -#ifdef GL_VERSION_ES_CM_1_0 - glOrthof(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1.0, 1.0); -#else - glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1.0, 1.0); -#endif + + glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, 0); + check_gl_error("Setting up view matrices"); } } // namespace GL