X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fmain.cpp;h=2148861eb09228c317f8dc00fe00063e1c5170ff;hb=566f8eb2da26d5a2bb4ed5798a5774499f2e511f;hp=a8aab0649d4f044de18ccd60a8087613101f5656;hpb=b3df78c0b5dcf53a730bd4372aa11e3f5636606f;p=supertux.git diff --git a/src/main.cpp b/src/main.cpp index a8aab0649..2148861eb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,17 +25,18 @@ #include #include -#include -#include +#include +#include #include #include -#include #include -#include #include #include #include -#include + +#ifdef MACOSX +# include +#endif #include "gameconfig.hpp" #include "resources.hpp" @@ -43,6 +44,7 @@ #include "audio/sound_manager.hpp" #include "video/surface.hpp" #include "video/texture_manager.hpp" +#include "video/drawing_context.hpp" #include "video/glutil.hpp" #include "control/joystickkeyboardcontroller.hpp" #include "options_menu.hpp" @@ -57,7 +59,8 @@ #include "worldmap/worldmap.hpp" #include "binreloc/binreloc.h" -SDL_Surface* screen = 0; +namespace { DrawingContext *context_pointer; } +SDL_Surface *screen; JoystickKeyboardController* main_controller = 0; TinyGetText::DictionaryManager dictionary_manager; @@ -78,6 +81,11 @@ static void init_tinygettext() { dictionary_manager.add_directory("locale"); dictionary_manager.set_charset("UTF-8"); + + // Config setting "locale" overrides language detection + if (config->locale != "") { + dictionary_manager.set_language( config->locale ); + } } static void init_physfs(const char* argv0) @@ -161,8 +169,18 @@ static void init_physfs(const char* argv0) #ifdef MACOSX // when started from Application file on Mac OS X... - dir = PHYSFS_getBaseDir(); - dir += "SuperTux.app/Contents/Resources/data"; + char path[PATH_MAX]; + CFBundleRef mainBundle = CFBundleGetMainBundle(); + assert(mainBundle != 0); + CFURLRef mainBundleURL = CFBundleCopyBundleURL(mainBundle); + assert(mainBundleURL != 0); + CFStringRef pathStr = CFUrlCopyFileSystemPath(mainBundleURL, kCFURLPOSIXPathStyle); + assert(pathStr != 0); + CFStringGetCString(pathStr, path, PATH_MAX, kCFStringEncodingUTF8); + CFRelease(mainBundleURL); + CFRelease(pathStr); + + dir = std::string(path) + "/Contents/Resources/data"; testfname = dir + "/credits.txt"; sourcedir = false; f = fopen(testfname.c_str(), "r"); @@ -176,21 +194,26 @@ static void init_physfs(const char* argv0) } #endif +#ifdef _WIN32 + PHYSFS_addToSearchPath(".\\data", 1); +#endif + if(!sourcedir) { #if defined(APPDATADIR) || defined(ENABLE_BINRELOC) std::string datadir; #ifdef ENABLE_BINRELOC char* dir; - br_init (NULL); - dir = br_find_data_dir(APPDATADIR); + br_init (NULL); + dir = br_find_data_dir(APPDATADIR); datadir = dir; - datadir += "/" PACKAGE_NAME; - free(dir); + free(dir); #else datadir = APPDATADIR; #endif + datadir += "/"; + datadir += application; if(!PHYSFS_addToSearchPath(datadir.c_str(), 1)) { log_warning << "Couldn't add '" << datadir << "' to physfs searchpath: " << PHYSFS_getLastError() << std::endl; } @@ -201,8 +224,10 @@ static void init_physfs(const char* argv0) PHYSFS_permitSymbolicLinks(1); //show search Path - for(char** i = PHYSFS_getSearchPath(); *i != NULL; i++) + char** searchpath = PHYSFS_getSearchPath(); + for(char** i = searchpath; *i != NULL; i++) log_info << "[" << *i << "] is in the search path" << std::endl; + PHYSFS_freeList(searchpath); } static void print_usage(const char* argv0) @@ -235,10 +260,7 @@ static bool pre_parse_commandline(int argc, char** argv) for(int i = 1; i < argc; ++i) { std::string arg = argv[i]; - if(arg == "--help") { - print_usage(argv[0]); - return true; - } else if(arg == "--version") { + if(arg == "--version") { std::cout << PACKAGE_NAME << " " << PACKAGE_VERSION << std::endl; return true; } @@ -255,7 +277,10 @@ static bool parse_commandline(int argc, char** argv) for(int i = 1; i < argc; ++i) { std::string arg = argv[i]; - if(arg == "--fullscreen" || arg == "-f") { + if(arg == "--help") { + print_usage(argv[0]); + return true; + } else if(arg == "--fullscreen" || arg == "-f") { config->use_fullscreen = true; } else if(arg == "--window" || arg == "-w") { config->use_fullscreen = false; @@ -274,10 +299,17 @@ static bool parse_commandline(int argc, char** argv) print_usage(argv[0]); throw std::runtime_error("Need to specify a parameter for aspect switch"); } - if(sscanf(argv[++i], "%d:%d", &config->aspectwidth, &config->aspectheight) - != 2) { - print_usage(argv[0]); - throw std::runtime_error("Invalid aspect spec, should be WIDTH:HEIGHT"); + if(strcasecmp(argv[i+1], "auto") == 0) { + i++; + config->aspect_ratio = -1; + } else { + int aspect_width, aspect_height; + if(sscanf(argv[++i], "%d:%d", &aspect_width, &aspect_height) != 2) { + print_usage(argv[0]); + throw std::runtime_error("Invalid aspect spec, should be WIDTH:HEIGHT"); + } + config->aspect_ratio = static_cast(aspect_width) / + static_cast(aspect_height); } } else if(arg == "--show-fps") { config->show_fps = true; @@ -338,38 +370,50 @@ static void init_sdl() static void init_rand() { - const char *how = config->random_seed? ", user fixed.": ", from time()."; - config->random_seed = systemRandom.srand(config->random_seed); - log_info << "Using random seed " << config->random_seed << how << std::endl; + //const char *how = config->random_seed? ", user fixed.": ", from time()."; + //log_info << "Using random seed " << config->random_seed << how << std::endl; } void init_video() { - if(texture_manager != NULL) - texture_manager->save_textures(); - - 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); - - int flags = SDL_OPENGL; - if(config->use_fullscreen) - flags |= SDL_FULLSCREEN; - int width = config->screenwidth; - int height = config->screenheight; - int bpp = 0; - - screen = SDL_SetVideoMode(width, height, bpp, flags); - if(screen == 0) { - std::stringstream msg; - msg << "Couldn't set video mode (" << width << "x" << height - << "-" << bpp << "bpp): " << SDL_GetError(); - throw std::runtime_error(msg.str()); + static int desktop_width = 0; + static int desktop_height = 0; + +/* unfortunately only newer SDLs have these infos */ +#if SDL_MAJOR_VERSION > 1 || SDL_MINOR_VERSION > 2 || (SDL_MINOR_VERSION == 2 && SDL_PATCHLEVEL >= 10) + /* find which resolution the user normally uses */ + if(desktop_width == 0) { + const SDL_VideoInfo *info = SDL_GetVideoInfo(); + desktop_width = info->current_w; + desktop_height = info->current_h; + } +#endif + + double aspect_ratio = config->aspect_ratio; + + // try to guess aspect ratio of monitor if needed + if (aspect_ratio <= 0) { + if(config->use_fullscreen && desktop_width > 0) { + aspect_ratio = static_cast(desktop_width) / static_cast(desktop_height); + } else { + aspect_ratio = 4.0 / 3.0; + } + } + + // use aspect ratio to calculate logical resolution + if (aspect_ratio > 1) { + SCREEN_WIDTH = static_cast (600 * aspect_ratio + 0.5); + SCREEN_HEIGHT = 600; + } else { + SCREEN_WIDTH = 600; + SCREEN_HEIGHT = static_cast (600 * 1/aspect_ratio + 0.5); } + context_pointer->init_renderer(); + screen = SDL_GetVideoSurface(); + SDL_WM_SetCaption(PACKAGE_NAME " " PACKAGE_VERSION, 0); // set icon @@ -385,38 +429,9 @@ void init_video() } #endif - // use aspect ratio to calculate logical resolution - if (config->aspectwidth > config->aspectheight) { - SCREEN_HEIGHT=600; - SCREEN_WIDTH=600*config->aspectwidth/config->aspectheight; - } - else { - SCREEN_WIDTH=600; - SCREEN_HEIGHT=600*config->aspectheight/config->aspectwidth; - } + SDL_ShowCursor(0); - // setup opengl state and transform - glDisable(GL_DEPTH_TEST); - glDisable(GL_CULL_FACE); - glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - 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 - glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1.0, 1.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0, 0, 0); - - check_gl_error("Setting up view matrices"); - - if(texture_manager != NULL) - texture_manager->reload_textures(); - else - texture_manager = new TextureManager(); + log_info << (config->use_fullscreen?"fullscreen ":"window ") << SCREEN_WIDTH << "x" << SCREEN_HEIGHT << " Ratio: " << aspect_ratio << "\n"; } static void init_audio() @@ -500,7 +515,9 @@ int main(int argc, char** argv) { int result = 0; +#ifndef NO_CATCH try { +#endif if(pre_parse_commandline(argc, argv)) return 0; @@ -521,6 +538,8 @@ int main(int argc, char** argv) timelog("audio"); init_audio(); timelog("video"); + DrawingContext context; + context_pointer = &context; init_video(); Console::instance->init_graphics(); timelog("scripting"); @@ -563,7 +582,8 @@ int main(int argc, char** argv) } //init_rand(); PAK: this call might subsume the above 3, but I'm chicken! - main_loop->run(); + main_loop->run(context); +#ifndef NO_CATCH } catch(std::exception& e) { log_fatal << "Unexpected exception: " << e.what() << std::endl; result = 1; @@ -571,11 +591,11 @@ int main(int argc, char** argv) log_fatal << "Unexpected exception" << std::endl; result = 1; } +#endif delete main_loop; main_loop = NULL; - free_options_menu(); unload_shared(); quit_audio();