diff --git a/src/control/game_controller_manager.cpp b/src/control/game_controller_manager.cpp
index 6680c04..401eacc 100644
--- a/src/control/game_controller_manager.cpp
+++ b/src/control/game_controller_manager.cpp
@@ -13,7 +13,6 @@
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
-
#include "control/game_controller_manager.hpp"
#include
diff --git a/src/control/input_manager.cpp b/src/control/input_manager.cpp
index ce612d4..2be2fd5 100644
--- a/src/control/input_manager.cpp
+++ b/src/control/input_manager.cpp
@@ -19,8 +19,8 @@
#include
-#include "control/game_controller_manager.hpp"
-#include "control/joystick_manager.hpp"
+//#include "control/game_controller_manager.hpp"
+//#include "control/joystick_manager.hpp"
#include "control/keyboard_manager.hpp"
#include "gui/menu_manager.hpp"
#include "lisp/list_iterator.hpp"
@@ -33,9 +33,9 @@ InputManager::InputManager(KeyboardConfig& keyboard_config,
JoystickConfig& joystick_config) :
controller(new Controller),
m_use_game_controller(true),
- keyboard_manager(new KeyboardManager(this, keyboard_config)),
- joystick_manager(new JoystickManager(this, joystick_config)),
- game_controller_manager(new GameControllerManager(this))
+ keyboard_manager(new KeyboardManager(this, keyboard_config))
+ //joystick_manager(new JoystickManager(this, joystick_config)),
+ //game_controller_manager(new GameControllerManager(this))
{
}
@@ -71,15 +71,16 @@ void
InputManager::process_event(const SDL_Event& event)
{
switch(event.type) {
- case SDL_TEXTINPUT:
- keyboard_manager->process_text_input_event(event.text);
- break;
+ //case SDL_TEXTINPUT:
+ // keyboard_manager->process_text_input_event(event.text);
+ // break;
case SDL_KEYUP:
case SDL_KEYDOWN:
keyboard_manager->process_key_event(event.key);
break;
+#if 0
case SDL_JOYAXISMOTION:
if (!m_use_game_controller) joystick_manager->process_axis_event(event.jaxis);
break;
@@ -126,7 +127,7 @@ InputManager::process_event(const SDL_Event& event)
case SDL_CONTROLLERDEVICEREMAPPED:
log_debug << "SDL_CONTROLLERDEVICEREMAPPED" << std::endl;
break;
-
+#endif
default:
break;
}
diff --git a/src/control/input_manager.hpp b/src/control/input_manager.hpp
index d047e53..a87decd 100644
--- a/src/control/input_manager.hpp
+++ b/src/control/input_manager.hpp
@@ -68,8 +68,8 @@ private:
public:
bool m_use_game_controller;
std::unique_ptr keyboard_manager;
- std::unique_ptr joystick_manager;
- std::unique_ptr game_controller_manager;
+ //std::unique_ptr joystick_manager;
+ //std::unique_ptr game_controller_manager;
private:
InputManager(const InputManager&);
diff --git a/src/control/keyboard_config.hpp b/src/control/keyboard_config.hpp
index e848067..fe1b785 100644
--- a/src/control/keyboard_config.hpp
+++ b/src/control/keyboard_config.hpp
@@ -25,6 +25,8 @@
#include "util/writer.hpp"
+typedef SDLKey SDL_Keycode;
+
class KeyboardConfig
{
public:
diff --git a/src/control/keyboard_manager.cpp b/src/control/keyboard_manager.cpp
index ca4e461..dd1908c 100644
--- a/src/control/keyboard_manager.cpp
+++ b/src/control/keyboard_manager.cpp
@@ -18,7 +18,7 @@
#include "control/keyboard_manager.hpp"
#include "control/controller.hpp"
-#include "control/joystick_manager.hpp"
+//#include "control/joystick_manager.hpp"
#include "control/keyboard_config.hpp"
#include "gui/menu_manager.hpp"
#include "lisp/list_iterator.hpp"
@@ -81,6 +81,7 @@ KeyboardManager::process_key_event(const SDL_KeyboardEvent& event)
}
}
+#if 0
void
KeyboardManager::process_text_input_event(const SDL_TextInputEvent& event)
{
@@ -91,6 +92,7 @@ KeyboardManager::process_text_input_event(const SDL_TextInputEvent& event)
}
}
}
+#endif
void
KeyboardManager::process_console_key_event(const SDL_KeyboardEvent& event)
@@ -156,6 +158,7 @@ KeyboardManager::process_menu_key_event(const SDL_KeyboardEvent& event)
return;
}
+#if 0
if (m_parent->joystick_manager->wait_for_joystick >= 0)
{
if (event.keysym.sym == SDLK_ESCAPE)
@@ -166,6 +169,7 @@ KeyboardManager::process_menu_key_event(const SDL_KeyboardEvent& event)
}
return;
}
+#endif
Controller::Control control;
/* we use default keys when the menu is open (to avoid problems when
diff --git a/src/control/keyboard_manager.hpp b/src/control/keyboard_manager.hpp
index 07885f9..aae6da9 100644
--- a/src/control/keyboard_manager.hpp
+++ b/src/control/keyboard_manager.hpp
@@ -41,7 +41,7 @@ public:
~KeyboardManager();
void process_key_event(const SDL_KeyboardEvent& event);
- void process_text_input_event(const SDL_TextInputEvent& event);
+ //void process_text_input_event(const SDL_TextInputEvent& event);
void process_console_key_event(const SDL_KeyboardEvent& event);
void process_menu_key_event(const SDL_KeyboardEvent& event);
diff --git a/src/gui/dialog.cpp b/src/gui/dialog.cpp
index e536c9c..55602c0 100644
--- a/src/gui/dialog.cpp
+++ b/src/gui/dialog.cpp
@@ -14,6 +14,8 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
+#include
+
#include "gui/dialog.hpp"
#include "control/controller.hpp"
diff --git a/src/gui/menu.cpp b/src/gui/menu.cpp
index fd253e9..adc20ce 100644
--- a/src/gui/menu.cpp
+++ b/src/gui/menu.cpp
@@ -625,7 +625,9 @@ Menu::get_item_by_id(int id)
}
}
- throw std::runtime_error("MenuItem not found: " + std::to_string(id));
+ char c[32];
+ sprintf(c, "%d", id);
+ throw std::runtime_error(std::string("MenuItem not found: ") + c);
}
const MenuItem&
diff --git a/src/physfs/physfs_sdl.cpp b/src/physfs/physfs_sdl.cpp
index 277f993..356dae0 100644
--- a/src/physfs/physfs_sdl.cpp
+++ b/src/physfs/physfs_sdl.cpp
@@ -24,7 +24,7 @@
#include "util/log.hpp"
-static Sint64 funcSeek(struct SDL_RWops* context, Sint64 offset, int whence)
+static int funcSeek(struct SDL_RWops* context, int offset, int whence)
{
PHYSFS_file* file = (PHYSFS_file*) context->hidden.unknown.data1;
int res;
@@ -51,7 +51,7 @@ static Sint64 funcSeek(struct SDL_RWops* context, Sint64 offset, int whence)
return (int) PHYSFS_tell(file);
}
-static size_t funcRead(struct SDL_RWops* context, void* ptr, size_t size, size_t maxnum)
+static int funcRead(struct SDL_RWops* context, void* ptr, int size, int maxnum)
{
PHYSFS_file* file = (PHYSFS_file*) context->hidden.unknown.data1;
diff --git a/src/supertux/gameconfig.cpp b/src/supertux/gameconfig.cpp
index c7d7778..9949e92 100644
--- a/src/supertux/gameconfig.cpp
+++ b/src/supertux/gameconfig.cpp
@@ -34,7 +34,7 @@ Config::Config() :
window_size(1280, 800),
aspect_size(0, 0), // auto detect
magnification(0.0f),
- use_fullscreen(false),
+ use_fullscreen(true),
video(VideoSystem::AUTO_VIDEO),
try_vsync(true),
show_fps(false),
diff --git a/src/supertux/main.cpp b/src/supertux/main.cpp
index 1cfba9c..76a0ed9 100644
--- a/src/supertux/main.cpp
+++ b/src/supertux/main.cpp
@@ -128,7 +128,7 @@ public:
if (!PHYSFS_init(argv0))
{
std::stringstream msg;
- msg << "Couldn't initialize physfs: " << PHYSFS_getLastError();
+ msg << "Couldn't initialize physfs: " << PHYSFS_getLastError() << " argv0: " << argv0;
throw std::runtime_error(msg.str());
}
else
@@ -143,36 +143,9 @@ public:
void find_datadir()
{
- std::string datadir;
- if (m_forced_datadir)
+ if (!PHYSFS_addToSearchPath("data.zip", 1))
{
- datadir = *m_forced_datadir;
- }
- else if (const char* env_datadir = getenv("SUPERTUX2_DATA_DIR"))
- {
- datadir = env_datadir;
- }
- else
- {
- // check if we run from source dir
- char* basepath_c = SDL_GetBasePath();
- std::string basepath = basepath_c;
- SDL_free(basepath_c);
-
- datadir = FileSystem::join(basepath, "data");
- std::string testfname = FileSystem::join(datadir, "credits.txt");
- if (!FileSystem::exists(testfname))
- {
- // if the game is not run from the source directory, try to find
- // the global install location
- datadir = datadir.substr(0, datadir.rfind(INSTALL_SUBDIR_BIN));
- datadir = FileSystem::join(datadir, INSTALL_SUBDIR_SHARE);
- }
- }
-
- if (!PHYSFS_addToSearchPath(datadir.c_str(), 1))
- {
- log_warning << "Couldn't add '" << datadir << "' to physfs searchpath: " << PHYSFS_getLastError() << std::endl;
+ log_warning << "Couldn't add data.zip to physfs searchpath: " << PHYSFS_getLastError() << std::endl;
}
}
@@ -238,7 +211,7 @@ class SDLSubsystem
public:
SDLSubsystem()
{
- if(SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) < 0)
+ if(SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
{
std::stringstream msg;
msg << "Couldn't initialize SDL: " << SDL_GetError();
@@ -257,7 +230,7 @@ public:
void
Main::init_video()
{
- SDL_SetWindowTitle(VideoSystem::current()->get_renderer().get_window(), PACKAGE_NAME " " PACKAGE_VERSION);
+ //SDL_SetWindowTitle(VideoSystem::current()->get_renderer().get_window(), PACKAGE_NAME " " PACKAGE_VERSION);
const char* icon_fname = "images/engine/icons/supertux-256x256.png";
SDL_Surface* icon = IMG_Load_RW(get_physfs_SDLRWops(icon_fname), true);
@@ -267,7 +240,7 @@ Main::init_video()
}
else
{
- SDL_SetWindowIcon(VideoSystem::current()->get_renderer().get_window(), icon);
+ SDL_WM_SetIcon(icon, NULL);
SDL_FreeSurface(icon);
}
SDL_ShowCursor(0);
diff --git a/src/supertux/menu/joystick_menu.cpp b/src/supertux/menu/joystick_menu.cpp
index bd11c9a..a2970bf 100644
--- a/src/supertux/menu/joystick_menu.cpp
+++ b/src/supertux/menu/joystick_menu.cpp
@@ -54,6 +54,7 @@ JoystickMenu::recreate_menu()
!m_input_manager.use_game_controller())
->set_help(_("Use manual configuration instead of SDL2's automatic GameController support"));
+#if 0
if (m_input_manager.use_game_controller())
{
m_joysticks_available = false;
@@ -84,13 +85,14 @@ JoystickMenu::recreate_menu()
add_toggle(MNID_JUMP_WITH_UP, _("Jump with Up"), g_config->joystick_config.jump_with_up_joy);
}
else
+#endif
{
m_joysticks_available = false;
add_inactive(-1, _("No Joysticks found"));
add_entry(MNID_SCAN_JOYSTICKS, _("Scan for Joysticks"));
}
- }
+ //}
add_hl();
add_back(_("Back"));
@@ -118,7 +120,7 @@ JoystickMenu::menu_action(MenuItem* item)
if (0 <= item->id && item->id < Controller::CONTROLCOUNT)
{
item->change_input(_("Press Button"));
- m_input_manager.joystick_manager->bind_next_event_to(static_cast(item->id));
+ //m_input_manager.joystick_manager->bind_next_event_to(static_cast(item->id));
}
else if (item->id == MNID_JUMP_WITH_UP)
{
diff --git a/src/supertux/menu/keyboard_menu.cpp b/src/supertux/menu/keyboard_menu.cpp
index 9b25f8c..2c05d16 100644
--- a/src/supertux/menu/keyboard_menu.cpp
+++ b/src/supertux/menu/keyboard_menu.cpp
@@ -82,9 +82,9 @@ KeyboardMenu::get_key_name(SDL_Keycode key)
return _("Right Alt");
case SDLK_LALT:
return _("Left Alt");
- case SDLK_RGUI:
+ case SDLK_RMETA:
return _("Right Command");
- case SDLK_LGUI:
+ case SDLK_LMETA:
return _("Left Command");
default:
return SDL_GetKeyName(static_cast(key));
diff --git a/src/supertux/menu/keyboard_menu.hpp b/src/supertux/menu/keyboard_menu.hpp
index 3230f34..5eedfd8 100644
--- a/src/supertux/menu/keyboard_menu.hpp
+++ b/src/supertux/menu/keyboard_menu.hpp
@@ -21,6 +21,8 @@
#include "control/input_manager.hpp"
#include "gui/menu_item.hpp"
+typedef SDLKey SDL_Keycode;
+
class KeyboardMenu : public Menu
{
private:
diff --git a/src/supertux/menu/options_menu.cpp b/src/supertux/menu/options_menu.cpp
index 8e1ce9d..183c5f0 100644
--- a/src/supertux/menu/options_menu.cpp
+++ b/src/supertux/menu/options_menu.cpp
@@ -103,25 +103,15 @@ OptionsMenu::OptionsMenu(bool complete)
}
}
- int display_mode_count = SDL_GetNumDisplayModes(0);
std::string last_display_mode;
- for(int i = 0; i < display_mode_count; ++i)
+ for(int i = 0; SDL_ListModes(NULL, 0)[i]; ++i)
{
- SDL_DisplayMode mode;
- int ret = SDL_GetDisplayMode(0, i, &mode);
- if (ret != 0)
- {
- log_warning << "failed to get display mode: " << SDL_GetError() << std::endl;
- }
- else
- {
std::ostringstream out;
- out << mode.w << "x" << mode.h << "@" << mode.refresh_rate;
+ out << SDL_ListModes(NULL, 0)[i]->w << "x" << SDL_ListModes(NULL, 0)[i]->h << "@60";
if(last_display_mode == out.str())
continue;
last_display_mode = out.str();
fullscreen_res->list.push_back(out.str());
- }
}
fullscreen_res->list.push_back("Desktop");
diff --git a/src/supertux/screen_manager.cpp b/src/supertux/screen_manager.cpp
index 580d875..3197a75 100644
--- a/src/supertux/screen_manager.cpp
+++ b/src/supertux/screen_manager.cpp
@@ -189,7 +189,7 @@ ScreenManager::update_gamelogic(float elapsed_time)
}
void
-ScreenManager::process_events()
+ScreenManager::process_events(DrawingContext &context)
{
InputManager::current()->update();
SDL_Event event;
@@ -205,15 +205,10 @@ ScreenManager::process_events()
quit();
break;
- case SDL_WINDOWEVENT:
- switch(event.window.event)
- {
- case SDL_WINDOWEVENT_RESIZED:
- VideoSystem::current()->resize(event.window.data1,
- event.window.data2);
+ case SDL_VIDEORESIZE:
+ VideoSystem::current()->resize(event.resize.w,
+ event.resize.h);
m_menu_manager->on_window_resize();
- break;
- }
break;
case SDL_KEYDOWN:
@@ -227,7 +222,7 @@ ScreenManager::process_events()
VideoSystem::current()->apply_config();
m_menu_manager->on_window_resize();
}
- else if (event.key.keysym.sym == SDLK_PRINTSCREEN ||
+ else if (event.key.keysym.sym == SDLK_PRINT ||
event.key.keysym.sym == SDLK_F12)
{
take_screenshot();
@@ -362,7 +357,7 @@ ScreenManager::run(DrawingContext &context)
timestep *= m_speed;
game_time += timestep;
- process_events();
+ process_events(context);
update_gamelogic(timestep);
frames += 1;
}
diff --git a/src/supertux/screen_manager.hpp b/src/supertux/screen_manager.hpp
index 59599c8..dd45acb 100644
--- a/src/supertux/screen_manager.hpp
+++ b/src/supertux/screen_manager.hpp
@@ -64,7 +64,7 @@ private:
void draw_fps(DrawingContext& context, float fps);
void draw(DrawingContext& context);
void update_gamelogic(float elapsed_time);
- void process_events();
+ void process_events(DrawingContext &context);
void handle_screen_switch();
private:
diff --git a/src/util/log.cpp b/src/util/log.cpp
index de4fb3d..3bc026e 100644
--- a/src/util/log.cpp
+++ b/src/util/log.cpp
@@ -18,18 +18,83 @@
#include "util/log.hpp"
#include
+#include
#include "math/rectf.hpp"
#include "supertux/console.hpp"
+class _android_debugbuf: public std::streambuf
+{
+ public:
+ _android_debugbuf()
+ {
+ pos = 0;
+ buf[0] = 0;
+ }
+
+ protected:
+
+
+virtual int overflow(int c = EOF)
+{
+ if (EOF == c)
+ {
+ return '\0'; // returning EOF indicates an error
+ }
+ else
+ {
+ outputchar(c);
+ return c;
+ }
+};
+
+
+// we don’t do input so always return EOF
+virtual int uflow() {return EOF;}
+
+// we don’t do input so always return 0 chars read
+virtual int xsgetn(char *, int) {return 0;}
+
+// Calls outputchar() for each character.
+virtual int xsputn(const char *s, int n)
+{
+ for (int i = 0; i < n; ++i)
+ {
+ outputchar(s[i]);
+ }
+ return n;// we always process all of the chars
+};
+
+private:
+
+// the buffer
+char buf[256];
+int pos;
+
+void outputchar(char c)
+{
+ // TODO: mutex
+ if( pos >= sizeof(buf)-1 || c == '\n' || c == '\r' || c == 0 )
+ {
+ buf[pos] = 0;
+ __android_log_print(ANDROID_LOG_INFO, "SuperTux", "%s", buf);
+ pos = 0;
+ buf[pos] = 0;
+ return;
+ };
+ buf[pos] = c;
+ pos++;
+};
+
+};
+
+static std::ostream android_logcat(new _android_debugbuf());
+
LogLevel g_log_level = LOG_WARNING;
static std::ostream& get_logging_instance (void)
{
- if (ConsoleBuffer::current())
- return (ConsoleBuffer::output);
- else
- return (std::cerr);
+ return android_logcat;
}
static std::ostream& log_generic_f (const char *prefix, const char* file, int line)
diff --git a/src/video/gl/gl_lightmap.cpp b/src/video/gl/gl_lightmap.cpp
index b5251e0..6248380 100644
--- a/src/video/gl/gl_lightmap.cpp
+++ b/src/video/gl/gl_lightmap.cpp
@@ -67,7 +67,6 @@ GLLightmap::GLLightmap() :
m_lightmap_uv_right = static_cast(m_lightmap_width) / static_cast(width);
m_lightmap_uv_bottom = static_cast(m_lightmap_height) / static_cast(height);
- TextureManager::current()->register_texture(m_lightmap.get());
}
GLLightmap::~GLLightmap()
diff --git a/src/video/gl/gl_painter.cpp b/src/video/gl/gl_painter.cpp
index ecb3cb1..705b465 100644
--- a/src/video/gl/gl_painter.cpp
+++ b/src/video/gl/gl_painter.cpp
@@ -14,6 +14,9 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
+#include
+#include
+
#include "video/gl/gl_painter.hpp"
#include "video/drawing_request.hpp"
@@ -125,8 +128,8 @@ GLPainter::draw_surface(const DrawingRequest& request)
glBindTexture(GL_TEXTURE_2D, th);
}
intern_draw(request.pos.x, request.pos.y,
- request.pos.x + surface->get_width(),
- request.pos.y + surface->get_height(),
+ request.pos.x + surface->get_width() * 1.001f, // Avoid seams between background textures
+ request.pos.y + surface->get_height() * 1.001f,
surface_data->get_uv_left(),
surface_data->get_uv_top(),
surface_data->get_uv_right(),
diff --git a/src/video/gl/gl_painter.hpp b/src/video/gl/gl_painter.hpp
index bb3dd75..d1d9f57 100644
--- a/src/video/gl/gl_painter.hpp
+++ b/src/video/gl/gl_painter.hpp
@@ -17,6 +17,7 @@
#ifndef HEADER_SUPERTUX_VIDEO_GL_GL_PAINTER_HPP
#define HEADER_SUPERTUX_VIDEO_GL_GL_PAINTER_HPP
+#ifndef GL_VERSION_ES_CM_1_0
#ifdef USE_GLBINDING
#include
using namespace gl;
@@ -25,6 +26,10 @@ using namespace gl;
#include "SDL_opengl.h"
#endif
+#else
+#include
+#include
+#endif
struct DrawingRequest;
diff --git a/src/video/gl/gl_renderer.cpp b/src/video/gl/gl_renderer.cpp
index 8f4a18ee..459624d 100644
--- a/src/video/gl/gl_renderer.cpp
+++ b/src/video/gl/gl_renderer.cpp
@@ -43,35 +43,13 @@
#endif
GLRenderer::GLRenderer() :
- m_window(),
- m_glcontext(),
+ //m_window(),
+ //m_glcontext(),
m_viewport(),
m_desktop_size(0, 0),
m_fullscreen_active(false)
{
- SDL_DisplayMode mode;
- SDL_GetCurrentDisplayMode(0, &mode);
- m_desktop_size = Size(mode.w, mode.h);
-
- if(g_config->try_vsync) {
- /* we want vsync for smooth scrolling */
- if (SDL_GL_SetSwapInterval(-1) != 0)
- {
- log_info << "no support for late swap tearing vsync: " << SDL_GetError() << std::endl;
- if (SDL_GL_SetSwapInterval(1))
- {
- log_info << "no support for vsync: " << SDL_GetError() << std::endl;
- }
- }
- }
-
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
-
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
-
- apply_video_mode();
+ m_desktop_size = Size(SDL_GetVideoInfo()->current_w, SDL_GetVideoInfo()->current_h);
#ifdef USE_GLBINDING
@@ -107,15 +85,6 @@ GLRenderer::GLRenderer() :
#endif
- // setup opengl state and transform
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_CULL_FACE);
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
// Init the projection matrix, viewport and stuff
apply_config();
@@ -136,8 +105,8 @@ GLRenderer::GLRenderer() :
GLRenderer::~GLRenderer()
{
- SDL_GL_DeleteContext(m_glcontext);
- SDL_DestroyWindow(m_window);
+ //SDL_GL_DeleteContext(m_glcontext);
+ //SDL_DestroyWindow(m_window);
}
void
@@ -213,7 +182,7 @@ void
GLRenderer::flip()
{
assert_gl("drawing");
- SDL_GL_SwapWindow(m_window);
+ SDL_GL_SwapBuffers();
}
void
@@ -229,9 +198,17 @@ GLRenderer::apply_config()
{
apply_video_mode();
- Size target_size = g_config->use_fullscreen ?
- ((g_config->fullscreen_size == Size(0, 0)) ? m_desktop_size : g_config->fullscreen_size) :
- g_config->window_size;
+ // setup opengl state and transform
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_CULL_FACE);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+
+ Size target_size = m_desktop_size;
float pixel_aspect_ratio = 1.0f;
if (g_config->aspect_size != Size(0, 0))
@@ -264,9 +241,9 @@ GLRenderer::apply_config()
{
// Clear both buffers so that we get a clean black border without junk
glClear(GL_COLOR_BUFFER_BIT);
- SDL_GL_SwapWindow(m_window);
+ SDL_GL_SwapBuffers();
glClear(GL_COLOR_BUFFER_BIT);
- SDL_GL_SwapWindow(m_window);
+ SDL_GL_SwapBuffers();
}
glViewport(m_viewport.x, m_viewport.y, m_viewport.w, m_viewport.h);
@@ -285,102 +262,9 @@ GLRenderer::apply_config()
void
GLRenderer::apply_video_mode()
{
- if (m_window)
- {
- if (!g_config->use_fullscreen)
- {
- SDL_SetWindowFullscreen(m_window, 0);
- }
- else
- {
- if (g_config->fullscreen_size.width == 0 &&
- g_config->fullscreen_size.height == 0)
- {
- if (SDL_SetWindowFullscreen(m_window, SDL_WINDOW_FULLSCREEN_DESKTOP) != 0)
- {
- log_warning << "failed to switch to desktop fullscreen mode: "
- << SDL_GetError() << std::endl;
- }
- else
- {
- log_info << "switched to desktop fullscreen mode" << std::endl;
- }
- }
- else
- {
- SDL_DisplayMode mode;
- mode.format = SDL_PIXELFORMAT_RGB888;
- mode.w = g_config->fullscreen_size.width;
- mode.h = g_config->fullscreen_size.height;
- mode.refresh_rate = g_config->fullscreen_refresh_rate;
- mode.driverdata = 0;
-
- if (SDL_SetWindowDisplayMode(m_window, &mode) != 0)
- {
- log_warning << "failed to set display mode: "
- << mode.w << "x" << mode.h << "@" << mode.refresh_rate << ": "
- << SDL_GetError() << std::endl;
- }
- else
- {
- if (SDL_SetWindowFullscreen(m_window, SDL_WINDOW_FULLSCREEN) != 0)
- {
- log_warning << "failed to switch to fullscreen mode: "
- << mode.w << "x" << mode.h << "@" << mode.refresh_rate << ": "
- << SDL_GetError() << std::endl;
- }
- else
- {
- log_info << "switched to fullscreen mode: "
- << mode.w << "x" << mode.h << "@" << mode.refresh_rate << std::endl;
- }
- }
- }
- }
- }
- else
- {
- int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE;
- Size size;
- if (g_config->use_fullscreen)
- {
- if (g_config->fullscreen_size == Size(0, 0))
- {
- flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
- size = m_desktop_size;
- }
- else
- {
- flags |= SDL_WINDOW_FULLSCREEN;
- size.width = g_config->fullscreen_size.width;
- size.height = g_config->fullscreen_size.height;
- }
- }
- else
- {
- size = g_config->window_size;
- }
-
- m_window = SDL_CreateWindow("SuperTux",
- SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
- size.width, size.height,
- flags);
- if (!m_window)
- {
- std::ostringstream msg;
- msg << "Couldn't set video mode " << size.width << "x" << size.height << ": " << SDL_GetError();
- throw std::runtime_error(msg.str());
- }
- else
- {
- m_glcontext = SDL_GL_CreateContext(m_window);
-
- SCREEN_WIDTH = size.width;
- SCREEN_HEIGHT = size.height;
-
- m_fullscreen_active = g_config->use_fullscreen;
- }
- }
+ //SCREEN_WIDTH = SDL_GetVideoInfo()->current_w;
+ //SCREEN_HEIGHT = SDL_GetVideoInfo()->current_h;
+ SDL_SetVideoMode(m_desktop_size.width, m_desktop_size.height, 24, SDL_OPENGL | SDL_DOUBLEBUF | SDL_FULLSCREEN);
}
void
@@ -433,9 +317,9 @@ GLRenderer::to_logical(int physical_x, int physical_y)
void
GLRenderer::set_gamma(float gamma)
{
- Uint16 ramp[256];
- SDL_CalculateGammaRamp(gamma, ramp);
- SDL_SetWindowGammaRamp(m_window, ramp, ramp, ramp);
+ //Uint16 ramp[256];
+ //SDL_CalculateGammaRamp(gamma, ramp);
+ //SDL_SetWindowGammaRamp(m_window, ramp, ramp, ramp);
}
/* EOF */
diff --git a/src/video/gl/gl_renderer.hpp b/src/video/gl/gl_renderer.hpp
index 5da04a8..b73eb9d 100644
--- a/src/video/gl/gl_renderer.hpp
+++ b/src/video/gl/gl_renderer.hpp
@@ -27,8 +27,8 @@
class GLRenderer : public Renderer
{
private:
- SDL_Window* m_window;
- SDL_GLContext m_glcontext;
+ //SDL_Window* m_window;
+ //SDL_GLContext m_glcontext;
SDL_Rect m_viewport;
Size m_desktop_size;
bool m_fullscreen_active;
@@ -51,7 +51,7 @@ public:
Vector to_logical(int physical_x, int physical_y) override;
void set_gamma(float gamma) override;
- SDL_Window* get_window() const { return m_window; }
+ //SDL_Window* get_window() const { return m_window; }
private:
void apply_video_mode();
diff --git a/src/video/gl/gl_texture.cpp b/src/video/gl/gl_texture.cpp
index 443fa01..3820ca7 100644
--- a/src/video/gl/gl_texture.cpp
+++ b/src/video/gl/gl_texture.cpp
@@ -16,6 +16,8 @@
#include "supertux/gameconfig.hpp"
#include "video/gl/gl_texture.hpp"
+#include "video/texture_manager.hpp"
+#include "util/log.hpp"
#ifdef USE_GLBINDING
#include
@@ -45,7 +47,8 @@ GLTexture::GLTexture(unsigned int width, unsigned int height) :
m_texture_width(),
m_texture_height(),
m_image_width(),
- m_image_height()
+ m_image_height(),
+ m_pixels(NULL)
{
#ifdef GL_VERSION_ES_CM_1_0
assert(is_power_of_2(width));
@@ -57,19 +60,9 @@ GLTexture::GLTexture(unsigned int width, unsigned int height) :
m_image_height = height;
assert_gl("before creating texture");
- glGenTextures(1, &m_handle);
-
- try {
- glBindTexture(GL_TEXTURE_2D, m_handle);
-
- glTexImage2D(GL_TEXTURE_2D, 0, static_cast(GL_RGBA), m_texture_width,
- m_texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
- set_texture_params();
- } catch(...) {
- glDeleteTextures(1, &m_handle);
- throw;
- }
+ reupload();
+ TextureManager::current()->register_texture(this);
}
GLTexture::GLTexture(SDL_Surface* image) :
@@ -77,7 +70,8 @@ GLTexture::GLTexture(SDL_Surface* image) :
m_texture_width(),
m_texture_height(),
m_image_width(),
- m_image_height()
+ m_image_height(),
+ m_pixels(NULL)
{
#ifdef GL_VERSION_ES_CM_1_0
m_texture_width = next_power_of_two(image->w);
@@ -109,11 +103,11 @@ GLTexture::GLTexture(SDL_Surface* image) :
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
SDL_Surface* convert = SDL_CreateRGBSurface(0,
- m_texture_width, m_texture_height, 32,
+ m_image_width, m_image_height, 32,
0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);
#else
SDL_Surface* convert = SDL_CreateRGBSurface(0,
- m_texture_width, m_texture_height, 32,
+ m_image_width, m_image_height, 32,
0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
#endif
@@ -121,66 +115,55 @@ GLTexture::GLTexture(SDL_Surface* image) :
throw std::runtime_error("Couldn't create texture: out of memory");
}
- SDL_SetSurfaceBlendMode(image, SDL_BLENDMODE_NONE);
SDL_BlitSurface(image, 0, convert, 0);
+ m_pixels = convert;
+
+ reupload();
+ TextureManager::current()->register_texture(this);
+
+ assert_gl("creating texture");
+}
+
+void GLTexture::reupload()
+{
assert_gl("before creating texture");
glGenTextures(1, &m_handle);
try {
GLenum sdl_format;
- if(convert->format->BytesPerPixel == 3)
- sdl_format = GL_RGB;
- else if(convert->format->BytesPerPixel == 4)
- sdl_format = GL_RGBA;
- else {
- sdl_format = GL_RGBA;
- assert(false);
- }
+ sdl_format = GL_RGBA;
glBindTexture(GL_TEXTURE_2D, m_handle);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
#if defined(GL_UNPACK_ROW_LENGTH) || defined(USE_GLBINDING)
- glPixelStorei(GL_UNPACK_ROW_LENGTH, convert->pitch/convert->format->BytesPerPixel);
+ //glPixelStorei(GL_UNPACK_ROW_LENGTH, convert->pitch/convert->format->BytesPerPixel);
#else
/* OpenGL ES doesn't support UNPACK_ROW_LENGTH, let's hope SDL didn't add
* padding bytes, otherwise we need some extra code here... */
- assert(convert->pitch == m_texture_width * convert->format->BytesPerPixel);
+ //assert(convert->pitch == m_texture_width * convert->format->BytesPerPixel);
#endif
- if(SDL_MUSTLOCK(convert))
- {
- SDL_LockSurface(convert);
- }
-
- glTexImage2D(GL_TEXTURE_2D, 0, static_cast(GL_RGBA),
+ glTexImage2D(GL_TEXTURE_2D, 0, sdl_format,
m_texture_width, m_texture_height, 0, sdl_format,
- GL_UNSIGNED_BYTE, convert->pixels);
-
- // no not use mipmaps
- if(false)
- {
- glGenerateMipmap(GL_TEXTURE_2D);
- }
-
- if(SDL_MUSTLOCK(convert))
- {
- SDL_UnlockSurface(convert);
- }
+ GL_UNSIGNED_BYTE, NULL);
- assert_gl("creating texture");
+ if (m_pixels)
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_image_width, m_image_height,
+ sdl_format, GL_UNSIGNED_BYTE, m_pixels->pixels);
set_texture_params();
} catch(...) {
glDeleteTextures(1, &m_handle);
- SDL_FreeSurface(convert);
throw;
}
- SDL_FreeSurface(convert);
}
GLTexture::~GLTexture()
{
+ TextureManager::current()->remove_texture(this);
+ if (m_pixels)
+ SDL_FreeSurface(m_pixels);
glDeleteTextures(1, &m_handle);
}
diff --git a/src/video/gl/gl_texture.hpp b/src/video/gl/gl_texture.hpp
index 7cb634f..787d702 100644
--- a/src/video/gl/gl_texture.hpp
+++ b/src/video/gl/gl_texture.hpp
@@ -32,6 +32,7 @@ protected:
unsigned int m_texture_height;
unsigned int m_image_width;
unsigned int m_image_height;
+ SDL_Surface* m_pixels;
public:
GLTexture(unsigned int width, unsigned int height);
@@ -76,6 +77,8 @@ public:
m_image_height = height;
}
+ void reupload();
+
private:
void set_texture_params();
};
diff --git a/src/video/gl/gl_video_system.cpp b/src/video/gl/gl_video_system.cpp
index 87b0ab7..328a58c 100644
--- a/src/video/gl/gl_video_system.cpp
+++ b/src/video/gl/gl_video_system.cpp
@@ -69,6 +69,7 @@ void
GLVideoSystem::resize(int w, int h)
{
m_renderer->resize(w, h);
+ TextureManager::current()->reload_textures();
m_lightmap.reset(new GLLightmap);
}
diff --git a/src/video/glutil.hpp b/src/video/glutil.hpp
index 4ead32d..d791bb1 100644
--- a/src/video/glutil.hpp
+++ b/src/video/glutil.hpp
@@ -86,7 +86,7 @@ static inline void check_gl_error(const char* message)
msg << "Unknown error (code " << error << ")";
}
- throw std::runtime_error(msg.str());
+ //throw std::runtime_error(msg.str());
}
}
diff --git a/src/video/renderer.hpp b/src/video/renderer.hpp
index b9d4ec3..2532c65 100644
--- a/src/video/renderer.hpp
+++ b/src/video/renderer.hpp
@@ -56,7 +56,7 @@ public:
virtual void apply_config() = 0;
virtual Vector to_logical(int physical_x, int physical_y) = 0;
virtual void set_gamma(float gamma) = 0;
- virtual SDL_Window* get_window() const = 0;
+ //virtual SDL_Window* get_window() const = 0;
};
#endif
diff --git a/src/video/texture.hpp b/src/video/texture.hpp
index 76964a9..86dc631 100644
--- a/src/video/texture.hpp
+++ b/src/video/texture.hpp
@@ -65,6 +65,7 @@ public:
virtual unsigned int get_texture_height() const = 0;
virtual unsigned int get_image_width() const = 0;
virtual unsigned int get_image_height() const = 0;
+ virtual void reupload() = 0;
private:
Texture(const Texture&);
diff --git a/src/video/texture_manager.cpp b/src/video/texture_manager.cpp
index e544909..aac5fa9 100644
--- a/src/video/texture_manager.cpp
+++ b/src/video/texture_manager.cpp
@@ -240,6 +240,7 @@ TextureManager::create_dummy_texture()
void
TextureManager::save_textures()
{
+#if 0
#if defined(GL_PACK_ROW_LENGTH) || defined(USE_GLBINDING)
/* all this stuff is not support by OpenGL ES */
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
@@ -261,11 +262,13 @@ TextureManager::save_textures()
{
save_texture(dynamic_cast(i->second.lock().get()));
}
+#endif
}
void
TextureManager::save_texture(GLTexture* texture)
{
+#if 0
SavedTexture saved_texture;
saved_texture.texture = texture;
glBindTexture(GL_TEXTURE_2D, texture->get_handle());
@@ -298,13 +301,14 @@ TextureManager::save_texture(GLTexture* texture)
glDeleteTextures(1, &(texture->get_handle()));
texture->set_handle(0);
-
assert_gl("retrieving texture for save");
+#endif
}
void
TextureManager::reload_textures()
{
+#if 0
#if defined(GL_UNPACK_ROW_LENGTH) || defined(USE_GLBINDING)
/* OpenGL ES doesn't support these */
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
@@ -345,6 +349,16 @@ TextureManager::reload_textures()
}
m_saved_textures.clear();
+#endif
+ for(Textures::iterator i = m_textures.begin(); i != m_textures.end(); ++i) {
+ //log_info << "Texture manager: reuploading texture " << *i << std::endl;
+ (*i)->reupload();
+ }
+ for(ImageTextures::iterator i = m_image_textures.begin();
+ i != m_image_textures.end(); ++i)
+ {
+ dynamic_cast(i->second.lock().get())->reupload();
+ }
}
#endif
diff --git a/src/video/util.hpp b/src/video/util.hpp
index 46be85c..72f7cb8 100644
--- a/src/video/util.hpp
+++ b/src/video/util.hpp
@@ -17,7 +17,7 @@
#ifndef HEADER_SUPERTUX_VIDEO_UTIL_HPP
#define HEADER_SUPERTUX_VIDEO_UTIL_HPP
-#include "SDL_rect.h"
+#include "SDL_video.h"
class Size;
class Vector;
diff --git a/src/video/video_system.cpp b/src/video/video_system.cpp
index dd736d0..726c81a 100644
--- a/src/video/video_system.cpp
+++ b/src/video/video_system.cpp
@@ -19,7 +19,7 @@
#include
#include "util/log.hpp"
-#include "video/sdl/sdl_video_system.hpp"
+//#include "video/sdl/sdl_video_system.hpp"
#ifdef HAVE_OPENGL
#include "video/gl/gl_video_system.hpp"
@@ -31,33 +31,15 @@ VideoSystem::create(VideoSystem::Enum video_system)
switch(video_system)
{
case AUTO_VIDEO:
-#ifdef HAVE_OPENGL
- try
- {
- return std::unique_ptr(new GLVideoSystem);
- }
- catch(std::exception& err)
- {
- log_warning << "Error creating GLVideoSystem, using SDL fallback: " << err.what() << std::endl;
- return std::unique_ptr(new SDLVideoSystem);
- }
-#else
- log_info << "new SDL renderer\n";
- return std::unique_ptr(new SDLVideoSystem);
-#endif
-
case OPENGL:
+ case PURE_SDL:
#ifdef HAVE_OPENGL
return std::unique_ptr(new GLVideoSystem);
#else
- log_warning << "OpenGL requested, but missing using SDL fallback" << std::endl;
- return std::unique_ptr(new SDLVideoSystem);
+ //log_warning << "OpenGL requested, but missing using SDL fallback" << std::endl;
+ //return std::unique_ptr(new SDLVideoSystem);
#endif
- case PURE_SDL:
- log_info << "new SDL renderer\n";
- return std::unique_ptr(new SDLVideoSystem);
-
default:
assert(!"invalid video system in config");
return {};