#
# patch -p1 < contrib/supertux-nogl.diff
#
-# This patch works for revision 3294. It may break for later revisions.
+# This patch works for revision 4186. It may break for later revisions.
#
# -----------------------------------------------------------------------------
diff -Naur supertux/INSTALL supertux-nogl/INSTALL
AC_CONFIG_SRCDIR([src/main.cpp])
AC_CONFIG_AUX_DIR([mk/autoconf])
AC_CANONICAL_TARGET
-@@ -105,6 +105,14 @@
+@@ -120,6 +120,14 @@
[AC_MSG_ERROR([Please install SDLImage >= 1.2.1])],
[$SDL_CFLAGS], [$SDL_LIBS])
NP_FINDLIB([PHYSFS], [physfs], [physfs >= 1.0.0],
NP_LANG_PROGRAM([
#include <stdio.h>
-@@ -124,11 +132,6 @@
+@@ -139,11 +147,6 @@
[AC_MSG_ERROR([Please intall OpenAL])],
[], [])
diff -Naur supertux/src/Jamfile supertux-nogl/src/Jamfile
--- supertux/src/Jamfile 2006-03-03 20:34:49.000000000 +0100
+++ supertux-nogl/src/Jamfile 2006-04-07 04:11:50.000000000 +0200
-@@ -24,7 +24,7 @@
- Application supertux : $(sources) $(wrapper_objects) ;
+@@ -26,7 +26,7 @@
+ Application supertux : $(sources) $(wrapper_objects) : linkerfile ;
C++Flags supertux : -DAPPDATADIR='\"$(appdatadir)\"' ;
LinkWith supertux : squirrel ;
-ExternalLibs supertux : SDL SDLIMAGE GL OPENAL VORBIS VORBISFILE OGG ICONV PHYSFS BINRELOC ;
+ExternalLibs supertux : SDL SDLIMAGE SDLGFX OPENAL VORBIS VORBISFILE OGG ICONV PHYSFS BINRELOC ;
Help supertux : "Build the supertux executable" ;
- IncludeDir supertux : squirrel/include ;
+ IncludeDir supertux : squirrel/include squirrel ;
diff -Naur supertux/src/main.cpp supertux-nogl/src/main.cpp
--- supertux/src/main.cpp 2006-04-07 03:32:14.000000000 +0200
#include <physfs.h>
#include <SDL.h>
#include <SDL_image.h>
--#include <SDL_opengl.h>
+-#include <GL/gl.h>
#include "gameconfig.hpp"
#include "resources.hpp"
-@@ -266,44 +265,6 @@
- ;
- }
-
--static void check_gl_error()
--{
-- GLenum glerror = glGetError();
-- std::string errormsg;
--
-- if(glerror != GL_NO_ERROR) {
-- switch(glerror) {
-- case GL_INVALID_ENUM:
-- errormsg = "Invalid enumeration value";
-- break;
-- case GL_INVALID_VALUE:
-- errormsg = "Numeric argzment out of range";
-- break;
-- case GL_INVALID_OPERATION:
-- errormsg = "Invalid operation";
-- break;
-- case GL_STACK_OVERFLOW:
-- errormsg = "stack overflow";
-- break;
-- case GL_STACK_UNDERFLOW:
-- errormsg = "stack underflow";
-- break;
-- case GL_OUT_OF_MEMORY:
-- errormsg = "out of memory";
-- break;
-- case GL_TABLE_TOO_LARGE:
-- errormsg = "table too large";
-- break;
-- default:
-- errormsg = "unknown error number";
-- break;
-- }
-- std::stringstream msg;
-- msg << "OpenGL Error: " << errormsg;
-- throw std::runtime_error(msg.str());
-- }
--}
--
- void init_video()
- {
- if(texture_manager != NULL)
-@@ -314,7 +275,7 @@
+@@ -308,7 +307,7 @@
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
-
+
- int flags = SDL_OPENGL;
+ int flags = SDL_SWSURFACE;
if(config->use_fullscreen)
flags |= SDL_FULLSCREEN;
int width = config->screenwidth;
-@@ -344,24 +305,6 @@
+@@ -338,24 +337,6 @@
}
#endif
- glLoadIdentity();
- glTranslatef(0, 0, 0);
-
-- check_gl_error();
+- check_gl_error("Setting up view matrices");
-
if(texture_manager != NULL)
texture_manager->reload_textures();
else
-diff -Naur supertux/src/video/drawing_context.cpp supertux-nogl/src/video/drawing_context.cpp
---- supertux/src/video/drawing_context.cpp 2006-03-31 04:18:01.000000000 +0200
-+++ supertux-nogl/src/video/drawing_context.cpp 2006-04-07 04:11:49.000000000 +0200
-@@ -22,8 +22,6 @@
+diff -aur supertux/src/video/drawing_context.cpp supertux-nogl/src/video/drawing_context.cpp
+--- supertux/src/video/drawing_context.cpp 2006-07-03 02:00:48.000000000 +0200
++++ supertux-nogl/src/video/drawing_context.cpp 2006-07-03 02:00:29.000000000 +0200
+@@ -23,7 +23,6 @@
#include <cassert>
#include <iostream>
#include <SDL_image.h>
-#include <GL/gl.h>
--#include <GL/glu.h>
#include "drawing_context.hpp"
#include "surface.hpp"
-@@ -49,30 +47,20 @@
+@@ -49,24 +48,12 @@
{
screen = SDL_GetVideoSurface();
}
void
- DrawingContext::draw_surface(const Surface* surface, const Vector& position,
- int layer)
+@@ -74,6 +61,8 @@
+ float angle, const Color& color, const Blend& blend,
+ int layer)
{
+ if(target != NORMAL) return;
+
assert(surface != 0);
-
+
DrawingRequest request;
-@@ -97,6 +85,8 @@
+@@ -109,6 +98,8 @@
DrawingContext::draw_surface_part(const Surface* surface, const Vector& source,
const Vector& size, const Vector& dest, int layer)
{
assert(surface != 0);
DrawingRequest request;
-@@ -136,6 +126,8 @@
+@@ -148,6 +139,8 @@
DrawingContext::draw_text(const Font* font, const std::string& text,
const Vector& position, FontAlignment alignment, int layer)
{
DrawingRequest request;
request.type = TEXT;
-@@ -157,6 +149,8 @@
+@@ -169,6 +162,8 @@
DrawingContext::draw_center_text(const Font* font, const std::string& text,
const Vector& position, int layer)
{
draw_text(font, text, Vector(position.x + SCREEN_WIDTH/2, position.y),
CENTER_ALLIGN, layer);
}
-@@ -164,6 +158,8 @@
+@@ -176,6 +171,8 @@
void
DrawingContext::draw_gradient(const Color& top, const Color& bottom, int layer)
{
DrawingRequest request;
request.type = GRADIENT;
-@@ -185,6 +181,8 @@
+@@ -197,6 +194,8 @@
DrawingContext::draw_filled_rect(const Vector& topleft, const Vector& size,
const Color& color, int layer)
{
DrawingRequest request;
request.type = FILLRECT;
-@@ -218,23 +216,55 @@
+@@ -219,6 +218,8 @@
+ DrawingContext::draw_filled_rect(const Rect& rect, const Color& color,
+ int layer)
+ {
++ if(target != NORMAL) return;
++
+ DrawingRequest request;
+
+ request.type = FILLRECT;
+@@ -238,39 +239,20 @@
+ }
+
+ void
+-DrawingContext::get_light(const Vector& position, Color* color)
++DrawingContext::get_light(const Vector& , Color* color)
+ {
+- if( ambient_color.red == 1.0f && ambient_color.green == 1.0f
+- && ambient_color.blue == 1.0f ) {
+- *color = Color( 1.0f, 1.0f, 1.0f);
+- return;
++ static int i = 0;
++ i += 1; i &= 0xFFFF;
++ if (i & 0x8000) {
++ *color = Color(0.0f, 0.0f, 0.0f);
++ } else {
++ *color = Color(1.0f, 1.0f, 1.0f);
+ }
+- DrawingRequest request;
+- request.type = GETLIGHT;
+- request.pos = transform.apply(position);
+- request.layer = LAYER_GUI; //make sure all get_light requests are handled last.
+-
+- GetLightRequest* getlightrequest = new GetLightRequest;
+- getlightrequest->color_ptr = color;
+- request.request_data = getlightrequest;
+- lightmap_requests.push_back(request);
+ }
+
+ void
+-DrawingContext::get_light(DrawingRequest& request)
++DrawingContext::get_light(DrawingRequest& )
+ {
+- GetLightRequest* getlightrequest = (GetLightRequest*) request.request_data;
+-
+- float pixels[3];
+- for( int i = 0; i<3; i++)
+- pixels[i] = 0.0f; //set to black
+-
+- //TODO: hacky. Make coordinate conversion more generic
+- glReadPixels((GLint) request.pos.x / 4, 600-(GLint)request.pos.y / 4, 1, 1, GL_RGB, GL_FLOAT, pixels);
+- *(getlightrequest->color_ptr) = Color( pixels[0], pixels[1], pixels[2]);
+- //printf("get_light %f/%f r%f g%f b%f\n", request.pos.x, request.pos.y, pixels[0], pixels[1], pixels[2]);
+-
+- delete getlightrequest;
+ }
+
+ void
+@@ -288,6 +264,45 @@
delete surfacepartrequest;
}
void
DrawingContext::draw_gradient(DrawingRequest& request)
{
- GradientRequest* gradientrequest = (GradientRequest*) request.request_data;
+@@ -295,16 +310,9 @@
const Color& top = gradientrequest->top;
const Color& bottom = gradientrequest->bottom;
--
+
- glDisable(GL_TEXTURE_2D);
- glBegin(GL_QUADS);
- glColor4f(top.red, top.green, top.blue, top.alpha);
- glVertex2f(0, SCREEN_HEIGHT);
- glEnd();
- glEnable(GL_TEXTURE_2D);
-+
+ int width = 800;
+ int height = 600;
+ for(float y = 0; y < height; y += 2) ::fillrect(screen, 0, (int)y, width, 2, (int)(((float)(top.red-bottom.red)/(0-height)) * y + top.red), (int)(((float)(top.green-bottom.green)/(0-height)) * y + top.green), (int)(((float)(top.blue-bottom.blue)/(0-height)) * y + top.blue), 255);
delete gradientrequest;
}
-@@ -260,17 +290,12 @@
+@@ -330,47 +338,19 @@
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);
--
++ int r = static_cast<int>(fillrectrequest->color.red);
++ int g = static_cast<int>(fillrectrequest->color.green);
++ int b = static_cast<int>(fillrectrequest->color.blue);
++ int a = static_cast<int>(fillrectrequest->color.alpha);
+
- glBegin(GL_QUADS);
- glVertex2f(x, y);
- glVertex2f(x+w, y);
- glVertex2f(x, y+h);
- glEnd();
- glEnable(GL_TEXTURE_2D);
-+ int r = static_cast<int>(fillrectrequest->color.red);
-+ int g = static_cast<int>(fillrectrequest->color.green);
-+ int b = static_cast<int>(fillrectrequest->color.blue);
-+ int a = static_cast<int>(fillrectrequest->color.alpha);
-+
+ ::fillrect(screen, x, y, w, h, r, g, b, a);
delete fillrectrequest;
}
-@@ -285,66 +310,10 @@
+
+ void
+-DrawingContext::draw_lightmap(DrawingRequest& request)
++DrawingContext::draw_lightmap(DrawingRequest& )
+ {
+- const Texture* texture = reinterpret_cast<Texture*> (request.request_data);
+-
+- // multiple the lightmap with the framebuffer
+- glBlendFunc(GL_DST_COLOR, GL_ZERO);
+-
+- glBindTexture(GL_TEXTURE_2D, texture->get_handle());
+- glBegin(GL_QUADS);
+-
+- glTexCoord2f(0, lightmap_uv_bottom);
+- glVertex2f(0, 0);
+-
+- glTexCoord2f(lightmap_uv_right, lightmap_uv_bottom);
+- glVertex2f(SCREEN_WIDTH, 0);
+-
+- glTexCoord2f(lightmap_uv_right, 0);
+- glVertex2f(SCREEN_WIDTH, SCREEN_HEIGHT);
+-
+- glTexCoord2f(0, 0);
+- glVertex2f(0, SCREEN_HEIGHT);
+-
+- glEnd();
+-
+- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ void
+@@ -383,50 +363,9 @@
transformstack.clear();
target_stack.clear();
-- bool use_lightmap = lightmap_requests.size() != 0;
--
+- //Use Lightmap if ambient color is not white.
+- bool use_lightmap = ( ambient_color.red != 1.0f || ambient_color.green != 1.0f ||
+- ambient_color.blue != 1.0f );
+-
- // PART1: create lightmap
- if(use_lightmap) {
- glViewport(0, screen->h - lightmap_height, lightmap_width, lightmap_height);
- glMatrixMode(GL_PROJECTION);
-- glLoadIdentity();
+- glLoadIdentity();
- glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1.0, 1.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
-- //glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
-- glClearColor(0, 0, 0, 1);
+- glClearColor( ambient_color.red, ambient_color.green, ambient_color.blue, 1 );
- glClear(GL_COLOR_BUFFER_BIT);
- handle_drawing_requests(lightmap_requests);
- lightmap_requests.clear();
--
+-
- glDisable(GL_BLEND);
- glBindTexture(GL_TEXTURE_2D, lightmap->get_handle());
- glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, screen->h - lightmap_height, lightmap_width, lightmap_height);
-
- glViewport(0, 0, screen->w, screen->h);
- glMatrixMode(GL_PROJECTION);
-- glLoadIdentity();
+- glLoadIdentity();
- glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1.0, 1.0);
-- glMatrixMode(GL_MODELVIEW);
+- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glEnable(GL_BLEND);
+-
+- // add a lightmap drawing request into the queue
+- DrawingRequest request;
+- request.type = LIGHTMAPREQUEST;
+- request.layer = LAYER_HUD - 1;
+- request.request_data = lightmap;
+- requests->push_back(request);
- }
-
- //glClear(GL_COLOR_BUFFER_BIT);
handle_drawing_requests(drawing_requests);
drawing_requests.clear();
-
-- if(use_lightmap) {
-- glBlendFunc(GL_SRC_ALPHA, GL_ONE);
--
-- glBindTexture(GL_TEXTURE_2D, lightmap->get_handle());
-- glBegin(GL_QUADS);
--
-- glTexCoord2f(0, lightmap_uv_bottom);
-- glVertex2f(0, 0);
--
-- glTexCoord2f(lightmap_uv_right, lightmap_uv_bottom);
-- glVertex2f(SCREEN_WIDTH, 0);
--
-- glTexCoord2f(lightmap_uv_right, 0);
-- glVertex2f(SCREEN_WIDTH, SCREEN_HEIGHT);
--
-- glTexCoord2f(0, 0);
-- glVertex2f(0, SCREEN_HEIGHT);
--
-- glEnd();
--
-- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-- }
--
- assert_gl("drawing");
-
- SDL_GL_SwapBuffers();
}
void
-@@ -433,9 +402,5 @@
+@@ -524,10 +463,6 @@
DrawingContext::set_target(Target target)
{
this->target = target;
- requests = &drawing_requests;
}
-diff -Naur supertux/src/video/drawing_context.hpp supertux-nogl/src/video/drawing_context.hpp
---- supertux/src/video/drawing_context.hpp 2006-03-03 20:34:27.000000000 +0100
-+++ supertux-nogl/src/video/drawing_context.hpp 2006-04-07 04:11:49.000000000 +0200
-@@ -23,7 +23,6 @@
+ void
+diff -aur supertux/src/video/drawing_context.hpp supertux-nogl/src/video/drawing_context.hpp
+--- supertux/src/video/drawing_context.hpp 2006-07-03 02:00:48.000000000 +0200
++++ supertux-nogl/src/video/drawing_context.hpp 2006-07-03 02:00:29.000000000 +0200
+@@ -24,7 +24,6 @@
#include <string>
#include <stdint.h>
#include <SDL.h>
#include <stdint.h>
#include <memory>
-@@ -33,8 +32,9 @@
+@@ -35,8 +34,9 @@
#include "font.hpp"
#include "color.hpp"
// some constants for predefined layer values
enum {
-@@ -202,16 +202,12 @@
+@@ -225,18 +225,14 @@
void draw_filled_rect(DrawingRequest& request);
-
+ void draw_lightmap(DrawingRequest& request);
+
DrawingRequests drawing_requests;
- DrawingRequests lightmap_requests;
DrawingRequests* requests;
+ Color ambient_color;
SDL_Surface* screen;
Target target;
};
#endif
-diff -Naur supertux/src/video/glutil.hpp supertux-nogl/src/video/glutil.hpp
---- supertux/src/video/glutil.hpp 2006-03-21 16:13:11.000000000 +0100
-+++ supertux-nogl/src/video/glutil.hpp 2006-04-07 04:11:49.000000000 +0200
-@@ -21,45 +21,14 @@
+diff -aur supertux/src/video/glutil.hpp supertux-nogl/src/video/glutil.hpp
+--- supertux/src/video/glutil.hpp 2006-07-03 02:00:48.000000000 +0200
++++ supertux-nogl/src/video/glutil.hpp 2006-07-03 02:00:29.000000000 +0200
+@@ -21,58 +21,12 @@
#include <sstream>
#include <stdexcept>
-#include <GL/gl.h>
--static inline void assert_gl(const char* message)
+-static inline void check_gl_error(const char* message)
-{
-#ifdef DEBUG
- GLenum error = glGetError();
- msg << "OUT_OF_MEMORY: There is not enough memory left to execute the "
- "command.";
- break;
+-#ifdef GL_TABLE_TOO_LARGE
+- case GL_TABLE_TOO_LARGE:
+- msg << "TABLE_TOO_LARGE: table is too large";
+- break;
+-#endif
- default:
- msg << "Unknown error (code " << error << ")";
- }
--
+-
- throw std::runtime_error(msg.str());
- }
-#endif
+#define GL_SRC_ALPHA 0
+#define GL_ONE_MINUS_SRC_ALPHA 1
+#define GL_RGBA 2
-+
-+
++#define GL_ONE 3
- #endif
-
-diff -Naur supertux/src/video/screen.cpp supertux-nogl/src/video/screen.cpp
---- supertux/src/video/screen.cpp 2006-04-07 03:32:13.000000000 +0200
-+++ supertux-nogl/src/video/screen.cpp 2006-04-07 04:11:49.000000000 +0200
-@@ -38,61 +38,70 @@
-
- static const float LOOP_DELAY = 20.0;
-
--void fillrect(float x, float y, float w, float h, const Color& col)
+-static inline void assert_gl(const char* message)
-{
-- if(w < 0) {
-- x += w;
-- w = -w;
-- }
-- if(h < 0) {
-- y += h;
-- h = -h;
-- }
--
-- glColor4f(col.red, col.green, col.blue, col.alpha);
-
-- glDisable(GL_TEXTURE_2D);
-- glBegin(GL_POLYGON);
-- glVertex2f(x, y);
-- glVertex2f(x+w, y);
-- glVertex2f(x+w, y+h);
-- glVertex2f(x, y+h);
-- glEnd();
-- glEnable(GL_TEXTURE_2D);
--
-- glColor4f(0, 0, 0, 1);
-+void fillrect(float x, float y, float w, float h, int r, int g, int b, int a)
-+ {
-+ SDL_Surface* screen = SDL_GetVideoSurface();
-+
-+ if(w < 0) {
-+ x += w;
-+ w = -w;
-+ }
-+ if(h < 0) {
-+ y += h;
-+ h = -h;
-+ }
-+
-+ SDL_Rect src, rect;
-+ SDL_Surface *temp = NULL;
-+
-+ rect.x = (int)x;
-+ rect.y = (int)y;
-+ rect.w = (int)w;
-+ rect.h = (int)h;
-+
-+ if(a != 255) {
-+ temp = SDL_CreateRGBSurface(screen->flags, rect.w, rect.h, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask);
-+
-+ src.x = 0;
-+ src.y = 0;
-+ src.w = rect.w;
-+ src.h = rect.h;
-+
-+ SDL_FillRect(temp, &src, SDL_MapRGB(screen->format, r, g, b));
-+ SDL_SetAlpha(temp, SDL_SRCALPHA, a);
-+ SDL_BlitSurface(temp,0,screen,&rect);
-+ SDL_FreeSurface(temp);
-+ }
-+ else
-+ SDL_FillRect(screen, &rect, SDL_MapRGB(screen->format, r, g, b));
- }
-
- void fadeout(float fade_time)
- {
-- float alpha_inc = LOOP_DELAY / fade_time;
-- Color c(0, 0, 0, alpha_inc);
-- float alpha = 1.0;
-+ float alpha_inc = 256 / (fade_time / LOOP_DELAY);
-+ float alpha = 256;
-
-- while(alpha >= 0) {
-+ while(alpha > 0) {
- alpha -= alpha_inc;
-- fillrect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, c);
-- // left side
-+ fillrect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0,0,0, (int)alpha_inc); // left side
-
-- SDL_GL_SwapBuffers();
-+ SDL_Flip(SDL_GetVideoSurface());
- sound_manager->update();
-
- SDL_Delay(int(LOOP_DELAY));
-- alpha -= alpha_inc;
- }
--
-- fillrect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, Color());
-+ fillrect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0, 255);
- }
-
- void shrink_fade(const Vector& point, float fade_time)
- {
-- float left_inc = point.x / (fade_time / LOOP_DELAY);
-- float right_inc = (SCREEN_WIDTH - point.x) / (fade_time / LOOP_DELAY);
-- float up_inc = point.y / (fade_time / LOOP_DELAY);
-- float down_inc = (SCREEN_HEIGHT - point.y) / (fade_time / LOOP_DELAY);
-+ float left_inc = point.x / ((float)fade_time / LOOP_DELAY);
-+ float right_inc = (SCREEN_WIDTH - point.x) / ((float)fade_time / LOOP_DELAY);
-+ float up_inc = point.y / ((float)fade_time / LOOP_DELAY);
-+ float down_inc = (SCREEN_HEIGHT - point.y) / ((float)fade_time / LOOP_DELAY);
-
- float left_cor = 0, right_cor = 0, up_cor = 0, down_cor = 0;
-- Color c;
-
- while(left_cor < point.x && right_cor < SCREEN_WIDTH - point.x &&
- up_cor < point.y && down_cor < SCREEN_HEIGHT - point.y) {
-@@ -101,15 +110,14 @@
- up_cor += up_inc;
- down_cor += down_inc;
-
-- fillrect(0, 0, left_cor, SCREEN_HEIGHT, c); // left side
-- fillrect(SCREEN_WIDTH - right_cor, 0, right_cor, SCREEN_HEIGHT, c); // right side
-- fillrect(0, 0, SCREEN_WIDTH, up_cor, c); // up side
-- fillrect(0, SCREEN_HEIGHT - down_cor, SCREEN_WIDTH, down_cor+1, c); // down side
-+ fillrect(0, 0, left_cor, SCREEN_HEIGHT, 0,0,0, 255); // left side
-+ fillrect(SCREEN_WIDTH - right_cor, 0, right_cor, SCREEN_HEIGHT, 0,0,0, 255); // right side
-+ fillrect(0, 0, SCREEN_WIDTH, up_cor, 0,0,0, 255); // up side
-+ fillrect(0, SCREEN_HEIGHT - down_cor, SCREEN_WIDTH, down_cor+1, 0,0,0, 255); // down side
-
-- SDL_GL_SwapBuffers();
-+ SDL_Flip(SDL_GetVideoSurface());
-
- sound_manager->update();
- SDL_Delay(int(LOOP_DELAY));
- }
- }
+-#ifdef DEBUG
+- check_gl_error(message);
+-#else
+- (void) message;
+ #endif
+-}
-
-diff -Naur supertux/src/video/screen.hpp supertux-nogl/src/video/screen.hpp
---- supertux/src/video/screen.hpp 2006-04-07 03:32:13.000000000 +0200
-+++ supertux-nogl/src/video/screen.hpp 2006-04-07 04:11:49.000000000 +0200
-@@ -20,7 +20,6 @@
- #define SUPERTUX_SCREEN_H
-
- #include <SDL.h>
--#include <GL/gl.h>
- #include <iostream>
-
- #include <vector>
-diff -Naur supertux/src/video/surface.cpp supertux-nogl/src/video/surface.cpp
---- supertux/src/video/surface.cpp 2006-03-25 01:16:31.000000000 +0100
-+++ supertux-nogl/src/video/surface.cpp 2006-04-07 04:11:49.000000000 +0200
-@@ -28,6 +29,7 @@
+-#endif
+diff -aur supertux/src/video/surface.cpp supertux-nogl/src/video/surface.cpp
+--- supertux/src/video/surface.cpp 2006-07-03 02:00:48.000000000 +0200
++++ supertux-nogl/src/video/surface.cpp 2006-07-03 02:00:29.000000000 +0200
+@@ -28,6 +28,7 @@
#include <SDL.h>
#include <SDL_image.h>
#include "gameconfig.hpp"
#include "physfs/physfs_sdl.hpp"
-@@ -40,13 +42,13 @@
+@@ -41,13 +42,13 @@
{
texture = texture_manager->get(file);
texture->ref();
}
Surface::Surface(const std::string& file, int x, int y, int w, int h)
-@@ -54,15 +56,12 @@
+@@ -55,15 +56,12 @@
texture = texture_manager->get(file);
texture->ref();
}
Surface::Surface(const Surface& other)
-@@ -70,12 +69,12 @@
+@@ -71,12 +69,12 @@
texture = other.texture;
texture->ref();
}
const Surface&
-@@ -85,81 +84,95 @@
+@@ -86,52 +84,33 @@
texture->unref();
texture = other.texture;
Surface::hflip()
{
- std::swap(uv_left, uv_right);
--}
--
++ flipx = !flipx;
+ }
+
-static inline void intern_draw(float left, float top, float right, float bottom, float uv_left, float uv_top,
- float uv_right, float uv_bottom,
- DrawingEffect effect)
- if(effect & VERTICAL_FLIP) {
- std::swap(uv_top, uv_bottom);
- }
--
+-
- glBegin(GL_QUADS);
- glTexCoord2f(uv_left, uv_top);
- glVertex2f(left, top);
--
+-
- glTexCoord2f(uv_right, uv_top);
- glVertex2f(right, top);
-
- glTexCoord2f(uv_left, uv_bottom);
- glVertex2f(left, bottom);
- glEnd();
-+ flipx = !flipx;
+-}
+-
++/*
+ static inline void intern_draw2(float left, float top, float right, float bottom,
+ float uv_left, float uv_top,
+ float uv_right, float uv_bottom,
+@@ -182,50 +161,76 @@
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
++*/
+
+ void
+-Surface::draw(float x, float y, float alpha, float angle, const Color& color, const Blend& blend, DrawingEffect effect) const
++Surface::draw(float x, float y, float alpha, float, const Color&, const Blend&, DrawingEffect effect) const
+ {
+- glColor4f(1.0f, 1.0f, 1.0f, alpha);
+- glBindTexture(GL_TEXTURE_2D, texture->get_handle());
+-
+- intern_draw2(x, y,
+- x + width, y + height,
+- uv_left, uv_top, uv_right, uv_bottom,
+- angle,
+- color,
+- blend,
+- effect);
++ draw_part(0, 0, x, y, width, height, alpha, effect);
}
void
void
Surface::draw_part(float src_x, float src_y, float dst_x, float dst_y,
- float width, float height, float alpha,
-+ float width, float height, float,
++ float width, float height, float ,
DrawingEffect effect) const
{
- float uv_width = uv_right - uv_left;
- float uv_height = uv_bottom - uv_top;
--
++ //FIXME: support parameter "alpha"
++ SDL_Surface* surface = texture->getSurface();
+
- float uv_left = this->uv_left + (uv_width * src_x) / this->width;
- float uv_top = this->uv_top + (uv_height * src_y) / this->height;
- float uv_right = this->uv_left + (uv_width * (src_x + width)) / this->width;
- float uv_bottom = this->uv_top + (uv_height * (src_y + height)) / this->height;
--
-- glColor4f(1.0f, 1.0f, 1.0f, alpha);
-- glBindTexture(GL_TEXTURE_2D, texture->get_handle());
--
-- intern_draw(dst_x, dst_y,
-- dst_x + width, dst_y + height,
-- uv_left, uv_top, uv_right, uv_bottom, effect);
-+ //FIXME: support parameter "alpha"
-+ SDL_Surface* surface = texture->getSurface();
-+
+ // get and check SDL_Surface
+ if (surface == 0) {
+ std::cerr << "Warning: Tried to draw NULL surface, skipped draw" << std::endl;
+ return;
+ }
-+
+
+- glColor4f(1.0f, 1.0f, 1.0f, alpha);
+- glBindTexture(GL_TEXTURE_2D, texture->get_handle());
+ SDL_Surface* transformedSurface = surface;
-+
+
+- intern_draw(dst_x, dst_y,
+- dst_x + width, dst_y + height,
+- uv_left, uv_top, uv_right, uv_bottom, effect);
+ if (flipx) effect = HORIZONTAL_FLIP;
+
+ if (effect != NO_EFFECT) {
+
+ SDL_BlitSurface(transformedSurface, &srcRect, screen, &dstRect);
}
-
-diff -Naur supertux/src/video/surface.hpp supertux-nogl/src/video/surface.hpp
---- supertux/src/video/surface.hpp 2006-03-03 20:34:27.000000000 +0100
-+++ supertux-nogl/src/video/surface.hpp 2006-04-07 04:11:49.000000000 +0200
+diff -aur supertux/src/video/surface.hpp supertux-nogl/src/video/surface.hpp
+--- supertux/src/video/surface.hpp 2006-07-03 02:00:48.000000000 +0200
++++ supertux-nogl/src/video/surface.hpp 2006-07-03 02:00:29.000000000 +0200
@@ -20,7 +20,9 @@
#ifndef __SURFACE_HPP__
#define __SURFACE_HPP__
+#include <SDL_image.h>
#include <string>
+#include <list>
+ #include "math/vector.hpp"
- class ImageTexture;
-
-@@ -35,6 +37,15 @@
+ class Color;
+@@ -37,6 +39,15 @@
};
/**
* A rectangular image.
* The class basically holds a reference to a texture with additional UV
* coordinates that specify a rectangular area on this texture
-@@ -46,18 +57,23 @@
+@@ -48,19 +59,26 @@
friend class Font;
ImageTexture* texture;
+ bool flipx;
+ /** draw the surface on the screen, applying a ::DrawingEffect on-the-fly. Transformed Surfaces will be cached in ::transformedSurfaces */
+ void draw(float x, float y, float alpha, float angle, const Color& color, const Blend& blend, DrawingEffect effect) const;
++
++ /** draw the surface on the screen, applying a ::DrawingEffect on-the-fly. Transformed Surfaces will be cached in ::transformedSurfaces */
void draw(float x, float y, float alpha, DrawingEffect effect) const;
-+
++
+ /** draw the surface on the screen, applying a ::DrawingEffect on-the-fly. Transformed Surfaces will be cached in ::transformedSurfaces */
void draw_part(float src_x, float src_y, float dst_x, float dst_y,
float width, float height,
public:
Surface(const std::string& file);
Surface(const std::string& file, int x, int y, int w, int h);
-diff -Naur supertux/src/video/texture.cpp supertux-nogl/src/video/texture.cpp
---- supertux/src/video/texture.cpp 2006-03-03 20:34:27.000000000 +0100
-+++ supertux-nogl/src/video/texture.cpp 2006-04-07 04:11:49.000000000 +0200
-@@ -20,7 +20,6 @@
+diff -aur supertux/src/video/texture.cpp supertux-nogl/src/video/texture.cpp
+--- supertux/src/video/texture.cpp 2006-07-03 02:00:48.000000000 +0200
++++ supertux-nogl/src/video/texture.cpp 2006-07-03 02:00:29.000000000 +0200
+@@ -21,7 +21,6 @@
#include "texture.hpp"
#include <assert.h>
#include "glutil.hpp"
-@@ -29,81 +28,37 @@
+@@ -30,7 +29,7 @@
return (v & (v-1)) == 0;
}
{
assert(is_power_of_2(w));
assert(is_power_of_2(h));
-
+@@ -38,23 +37,10 @@
this->width = w;
this->height = h;
--
+
- assert_gl("before creating texture");
- glGenTextures(1, &handle);
--
+-
- try {
- glBindTexture(GL_TEXTURE_2D, handle);
-
- glDeleteTextures(1, &handle);
- throw;
- }
-+
+ surface = 0;
}
{
const SDL_PixelFormat* format = image->format;
if(!is_power_of_2(image->w) || !is_power_of_2(image->h))
- throw std::runtime_error("image has no power of 2 size");
- if(format->BitsPerPixel != 24 && format->BitsPerPixel != 32)
- throw std::runtime_error("image has no 24 or 32 bit color depth");
--
-+
+@@ -65,45 +51,14 @@
this->width = image->w;
this->height = image->h;
- assert_gl("before creating texture");
- glGenTextures(1, &handle);
--
+-
- try {
- GLenum sdl_format;
- if(format->BytesPerPixel == 3)
-
- assert_gl("creating texture");
-
-- set_texture_params();
+- set_texture_params();
- } catch(...) {
- glDeleteTextures(1, &handle);
- throw;
-
- assert_gl("set texture params");
}
-
-diff -Naur supertux/src/video/texture.hpp supertux-nogl/src/video/texture.hpp
---- supertux/src/video/texture.hpp 2006-03-03 20:34:27.000000000 +0100
-+++ supertux-nogl/src/video/texture.hpp 2006-04-07 04:11:49.000000000 +0200
-@@ -20,7 +20,7 @@
+diff -aur supertux/src/video/texture.hpp supertux-nogl/src/video/texture.hpp
+--- supertux/src/video/texture.hpp 2006-07-03 02:00:48.000000000 +0200
++++ supertux-nogl/src/video/texture.hpp 2006-07-03 02:00:29.000000000 +0200
+@@ -21,7 +21,7 @@
#define __TEXTURE_HPP__
#include <SDL.h>
/**
* This class is a wrapper around a texture handle. It stores the texture width
-@@ -30,8 +30,9 @@
+@@ -31,8 +31,9 @@
class Texture
{
protected:
unsigned int width;
unsigned int height;
-@@ -40,11 +41,6 @@
+@@ -41,11 +42,6 @@
Texture(SDL_Surface* surface, GLenum glformat);
virtual ~Texture();
-
+
- GLuint get_handle() const
- {
- return handle;
unsigned int get_width() const
{
return width;
-@@ -55,6 +51,14 @@
+@@ -56,6 +52,14 @@
return height;
}
private:
void set_texture_params();
};
-diff -Naur supertux/src/video/texture_manager.cpp supertux-nogl/src/video/texture_manager.cpp
---- supertux/src/video/texture_manager.cpp 2006-04-07 03:32:13.000000000 +0200
-+++ supertux-nogl/src/video/texture_manager.cpp 2006-04-07 04:11:49.000000000 +0200
-@@ -5,8 +5,6 @@
+diff -aur supertux/src/video/texture_manager.cpp supertux-nogl/src/video/texture_manager.cpp
+--- supertux/src/video/texture_manager.cpp 2006-07-03 02:00:48.000000000 +0200
++++ supertux-nogl/src/video/texture_manager.cpp 2006-07-03 02:00:29.000000000 +0200
+@@ -24,8 +24,6 @@
#include <assert.h>
#include <SDL.h>
#include <SDL_image.h>
#include <iostream>
#include <sstream>
#include <stdexcept>
-@@ -126,12 +124,6 @@
+@@ -145,12 +143,6 @@
void
TextureManager::save_textures()
{
for(Textures::iterator i = textures.begin(); i != textures.end(); ++i) {
save_texture(*i);
}
-@@ -146,75 +138,16 @@
+@@ -165,74 +157,15 @@
{
SavedTexture saved_texture;
saved_texture.texture = texture;
size_t pixelssize = saved_texture.width * saved_texture.height * 4;
saved_texture.pixels = new char[pixelssize];
--
+-
- glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE,
- saved_texture.pixels);
- glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
- glPixelStorei(GL_UNPACK_SKIP_IMAGES, 0);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
--
+-
- for(std::vector<SavedTexture>::iterator i = saved_textures.begin();
- i != saved_textures.end(); ++i) {
- SavedTexture& saved_texture = *i;
--
+-
- GLuint handle;
- glGenTextures(1, &handle);
- assert_gl("creating texture handle");
-
saved_textures.clear();
}
-
-diff -Naur supertux/src/video/texture_manager.hpp supertux-nogl/src/video/texture_manager.hpp
---- supertux/src/video/texture_manager.hpp 2006-03-03 20:34:27.000000000 +0100
-+++ supertux-nogl/src/video/texture_manager.hpp 2006-04-07 04:11:49.000000000 +0200
-@@ -1,7 +1,7 @@
+diff -aur supertux/src/video/texture_manager.hpp supertux-nogl/src/video/texture_manager.hpp
+--- supertux/src/video/texture_manager.hpp 2006-07-03 02:00:48.000000000 +0200
++++ supertux-nogl/src/video/texture_manager.hpp 2006-07-03 02:00:29.000000000 +0200
+@@ -20,7 +20,7 @@
#ifndef __IMAGE_TEXTURE_MANAGER_HPP__
#define __IMAGE_TEXTURE_MANAGER_HPP__