void OptionsScreenVideo::eventCallback(Widget* widget, const std::string& name, const int playerID) { if (name == "options_choice") { std::string selection = ((RibbonWidget*)widget)->getSelectionIDString(PLAYER_ID_GAME_MASTER); Screen *screen = NULL; if (selection == "tab_audio") screen = OptionsScreenAudio::getInstance(); //else if (selection == "tab_video") // screen = OptionsScreenVideo::getInstance(); else if (selection == "tab_players") screen = TabbedUserScreen::getInstance(); else if (selection == "tab_controls") screen = OptionsScreenInput::getInstance(); else if (selection == "tab_ui") screen = OptionsScreenUI::getInstance(); if(screen) StateManager::get()->replaceTopMostScreen(screen); } else if(name == "back") { StateManager::get()->escapePressed(); } else if(name == "custom") { new CustomVideoSettingsDialog(0.8f, 0.9f); } else if(name == "apply_resolution") { using namespace GUIEngine; DynamicRibbonWidget* w1=getWidget<DynamicRibbonWidget>("resolutions"); assert(w1 != NULL); const std::string& res = w1->getSelectionIDString(PLAYER_ID_GAME_MASTER); int w = -1, h = -1; if (sscanf(res.c_str(), "%ix%i", &w, &h) != 2 || w == -1 || h == -1) { Log::error("OptionsScreenVideo", "Failed to decode resolution %s", res.c_str()); return; } CheckBoxWidget* w2 = getWidget<CheckBoxWidget>("fullscreen"); assert(w2 != NULL); irr_driver->changeResolution(w, h, w2->getState()); } else if (name == "gfx_level") { GUIEngine::SpinnerWidget* gfx_level = getWidget<GUIEngine::SpinnerWidget>("gfx_level"); assert( gfx_level != NULL ); const int level = gfx_level->getValue() - 1; UserConfigParams::m_show_steering_animations = GFX_PRESETS[level].animatedCharacters; UserConfigParams::m_graphical_effects = GFX_PRESETS[level].animatedScenery; UserConfigParams::m_anisotropic = GFX_PRESETS[level].anisotropy; UserConfigParams::m_bloom = GFX_PRESETS[level].bloom; UserConfigParams::m_glow = GFX_PRESETS[level].glow; UserConfigParams::m_dynamic_lights = GFX_PRESETS[level].lights; UserConfigParams::m_light_shaft = GFX_PRESETS[level].lightshaft; UserConfigParams::m_mlaa = GFX_PRESETS[level].mlaa; UserConfigParams::m_motionblur = GFX_PRESETS[level].motionblur; //UserConfigParams::m_pixel_shaders = GFX_PRESETS[level].shaders; UserConfigParams::m_shadows_resolution = GFX_PRESETS[level].shadows; UserConfigParams::m_ssao = GFX_PRESETS[level].ssao; UserConfigParams::m_weather_effects = GFX_PRESETS[level].weather; UserConfigParams::m_dof = GFX_PRESETS[level].dof; UserConfigParams::m_gi = GFX_PRESETS[level].global_illumination; UserConfigParams::m_degraded_IBL = GFX_PRESETS[level].degraded_ibl; UserConfigParams::m_high_definition_textures = 0x02 | GFX_PRESETS[level].hd_textures; updateGfxSlider(); } else if (name == "vsync") { GUIEngine::CheckBoxWidget* vsync = getWidget<GUIEngine::CheckBoxWidget>("vsync"); assert( vsync != NULL ); UserConfigParams::m_vsync = vsync->getState(); } else if (name == "rememberWinpos") { CheckBoxWidget* rememberWinpos = getWidget<CheckBoxWidget>("rememberWinpos"); UserConfigParams::m_remember_window_location = rememberWinpos->getState(); } else if (name == "fullscreen") { CheckBoxWidget* fullscreen = getWidget<CheckBoxWidget>("fullscreen"); CheckBoxWidget* rememberWinpos = getWidget<CheckBoxWidget>("rememberWinpos"); rememberWinpos->setActive(!fullscreen->getState()); } } // eventCallback
virtual void onCancel() { m_cb->setState(false); m_parent_screen->makeEntryFieldsVisible(); ModalDialog::dismiss(); } // onCancel
void OptionsScreenVideo::init() { Screen::init(); RibbonWidget* ribbon = getWidget<RibbonWidget>("options_choice"); assert(ribbon != NULL); ribbon->select( "tab_video", PLAYER_ID_GAME_MASTER ); ribbon->getRibbonChildren()[1].setTooltip( _("Audio") ); ribbon->getRibbonChildren()[2].setTooltip( _("User Interface") ); ribbon->getRibbonChildren()[3].setTooltip( _("Players") ); ribbon->getRibbonChildren()[4].setTooltip( _("Controls") ); GUIEngine::ButtonWidget* applyBtn = getWidget<GUIEngine::ButtonWidget>("apply_resolution"); assert( applyBtn != NULL ); GUIEngine::SpinnerWidget* gfx = getWidget<GUIEngine::SpinnerWidget>("gfx_level"); assert( gfx != NULL ); GUIEngine::CheckBoxWidget* vsync = getWidget<GUIEngine::CheckBoxWidget>("vsync"); assert( vsync != NULL ); vsync->setState( UserConfigParams::m_vsync ); // ---- video modes DynamicRibbonWidget* res = getWidget<DynamicRibbonWidget>("resolutions"); assert( res != NULL ); CheckBoxWidget* full = getWidget<CheckBoxWidget>("fullscreen"); assert( full != NULL ); full->setState( UserConfigParams::m_fullscreen ); CheckBoxWidget* rememberWinpos = getWidget<CheckBoxWidget>("rememberWinpos"); rememberWinpos->setState(UserConfigParams::m_remember_window_location); rememberWinpos->setActive(UserConfigParams::m_fullscreen); // --- get resolution list from irrlicht the first time if (!m_inited) { res->clearItems(); const std::vector<IrrDriver::VideoMode>& modes = irr_driver->getVideoModes(); const int amount = (int)modes.size(); std::vector<Resolution> resolutions; Resolution r; bool found_config_res = false; // for some odd reason, irrlicht sometimes fails to report the good // old standard resolutions // those are always useful for windowed mode bool found_1024_768 = false; for (int n=0; n<amount; n++) { r.width = modes[n].getWidth(); r.height = modes[n].getHeight(); resolutions.push_back(r); if (r.width == UserConfigParams::m_width && r.height == UserConfigParams::m_height) { found_config_res = true; } if (r.width == 1024 && r.height == 768) { found_1024_768 = true; } } if (!found_config_res) { r.width = UserConfigParams::m_width; r.height = UserConfigParams::m_height; resolutions.push_back(r); if (r.width == 1024 && r.height == 768) { found_1024_768 = true; } } // next found resolution // Add default resolutions that were not found by irrlicht if (!found_1024_768) { r.width = 1024; r.height = 768; resolutions.push_back(r); } // Sort resolutions by size std::sort(resolutions.begin(), resolutions.end()); // Add resolutions list for(std::vector<Resolution>::iterator it = resolutions.begin(); it != resolutions.end(); it++) { const float ratio = it->getRatio(); char name[32]; sprintf(name, "%ix%i", it->width, it->height); core::stringw label; label += it->width; label += L"\u00D7"; label += it->height; #define ABOUT_EQUAL(a , b) (fabsf( a - b ) < 0.01) if (ABOUT_EQUAL( ratio, (5.0f/4.0f) )) res->addItem(label, name, "/gui/screen54.png"); else if (ABOUT_EQUAL( ratio, (4.0f/3.0f) )) res->addItem(label, name, "/gui/screen43.png"); else if (ABOUT_EQUAL( ratio, (16.0f/10.0f))) res->addItem(label, name, "/gui/screen1610.png"); else if (ABOUT_EQUAL( ratio, (5.0f/3.0f) )) res->addItem(label, name, "/gui/screen53.png"); else if (ABOUT_EQUAL( ratio, (3.0f/2.0f) )) res->addItem(label, name, "/gui/screen32.png"); else if (ABOUT_EQUAL( ratio, (16.0f/9.0f) )) res->addItem(label, name, "/gui/screen169.png"); else res->addItem(label, name, "/gui/screen_other.png"); #undef ABOUT_EQUAL } // add next resolution } // end if not inited res->updateItemDisplay(); // ---- select current resolution every time char searching_for[32]; snprintf(searching_for, 32, "%ix%i", (int)UserConfigParams::m_width, (int)UserConfigParams::m_height); if (!res->setSelection(searching_for, PLAYER_ID_GAME_MASTER, false /* focus it */, true /* even if deactivated*/)) { Log::error("OptionsScreenVideo", "Cannot find resolution %s", searching_for); } // --- set gfx settings values updateGfxSlider(); // ---- forbid changing resolution or animation settings from in-game // (we need to disable them last because some items can't be edited when // disabled) bool in_game = StateManager::get()->getGameState() == GUIEngine::INGAME_MENU; res->setActive(!in_game); full->setActive(!in_game); applyBtn->setActive(!in_game); gfx->setActive(!in_game); getWidget<ButtonWidget>("custom")->setActive(!in_game); } // init
void OptionsScreenVideo::init() { Screen::init(); RibbonWidget* ribbon = getWidget<RibbonWidget>("options_choice"); if (ribbon != NULL) ribbon->select( "tab_video", PLAYER_ID_GAME_MASTER ); ribbon->getRibbonChildren()[1].setTooltip( _("Audio") ); ribbon->getRibbonChildren()[2].setTooltip( _("User Interface") ); ribbon->getRibbonChildren()[3].setTooltip( _("Players") ); ribbon->getRibbonChildren()[4].setTooltip( _("Controls") ); GUIEngine::ButtonWidget* applyBtn = getWidget<GUIEngine::ButtonWidget>("apply_resolution"); assert( applyBtn != NULL ); GUIEngine::SpinnerWidget* gfx = getWidget<GUIEngine::SpinnerWidget>("gfx_level"); assert( gfx != NULL ); GUIEngine::CheckBoxWidget* vsync = getWidget<GUIEngine::CheckBoxWidget>("vsync"); assert( vsync != NULL ); vsync->setState( UserConfigParams::m_vsync ); // ---- video modes DynamicRibbonWidget* res = getWidget<DynamicRibbonWidget>("resolutions"); assert( res != NULL ); CheckBoxWidget* full = getWidget<CheckBoxWidget>("fullscreen"); assert( full != NULL ); full->setState( UserConfigParams::m_fullscreen ); CheckBoxWidget* rememberWinpos = getWidget<CheckBoxWidget>("rememberWinpos"); rememberWinpos->setState(UserConfigParams::m_remember_window_location); if (UserConfigParams::m_fullscreen) rememberWinpos->setDeactivated(); else rememberWinpos->setActivated(); // --- get resolution list from irrlicht the first time if (!m_inited) { res->clearItems(); const std::vector<IrrDriver::VideoMode>& modes = irr_driver->getVideoModes(); const int amount = (int)modes.size(); bool found_config_res = false; // for some odd reason, irrlicht sometimes fails to report the good // old standard resolutions // those are always useful for windowed mode // allow 800x600 only for debug mode #ifdef DEBUG bool found_800_600 = false; #endif bool found_1024_640 = false; bool found_1024_768 = false; for (int n=0; n<amount; n++) { const int w = modes[n].getWidth(); const int h = modes[n].getHeight(); const float ratio = (float)w / h; if (w == UserConfigParams::m_width && h == UserConfigParams::m_height) { found_config_res = true; } if (w == 800 && h == 600) { #ifdef DEBUG found_800_600 = true; #else continue; #endif } else if (w == 1024 && h == 640) { found_1024_640 = true; } else if (w == 1024 && h == 768) { found_1024_768 = true; } char name[32]; sprintf( name, "%ix%i", w, h ); core::stringw label; label += w; label += L"\u00D7"; label += h; #define ABOUT_EQUAL(a , b) (fabsf( a - b ) < 0.01) if (ABOUT_EQUAL( ratio, (5.0f/4.0f) )) res->addItem(label, name, "/gui/screen54.png"); else if (ABOUT_EQUAL( ratio, (4.0f/3.0f) )) res->addItem(label, name, "/gui/screen43.png"); else if (ABOUT_EQUAL( ratio, (16.0f/10.0f))) res->addItem(label, name, "/gui/screen1610.png"); else if (ABOUT_EQUAL( ratio, (5.0f/3.0f) )) res->addItem(label, name, "/gui/screen53.png"); else if (ABOUT_EQUAL( ratio, (3.0f/2.0f) )) res->addItem(label, name, "/gui/screen32.png"); else if (ABOUT_EQUAL( ratio, (16.0f/9.0f) )) res->addItem(label, name, "/gui/screen169.png"); else res->addItem(label, name, "/gui/screen_other.png"); #undef ABOUT_EQUAL } // next resolution if (!found_config_res) { const int w = UserConfigParams::m_width; const int h = UserConfigParams::m_height; const float ratio = (float)w / h; if (w == 800 && h == 600) { #ifdef DEBUG found_800_600 = true; #endif } else if (w == 1024 && h == 640) { found_1024_640 = true; } else if (w == 1024 && h == 768) { found_1024_768 = true; } char name[32]; sprintf( name, "%ix%i", w, h ); core::stringw label; label += w; label += L"\u00D7"; label += h; #define ABOUT_EQUAL(a , b) (fabsf( a - b ) < 0.01) if (ABOUT_EQUAL( ratio, (5.0f/4.0f) )) res->addItem(label, name, "/gui/screen54.png"); else if (ABOUT_EQUAL( ratio, (4.0f/3.0f) )) res->addItem(label, name, "/gui/screen43.png"); else if (ABOUT_EQUAL( ratio, (16.0f/10.0f) )) res->addItem(label, name, "/gui/screen1610.png"); else if (ABOUT_EQUAL( ratio, (5.0f/3.0f) )) res->addItem(label, name, "/gui/screen53.png"); else if (ABOUT_EQUAL( ratio, (3.0f/2.0f) )) res->addItem(label, name, "/gui/screen32.png"); else if (ABOUT_EQUAL( ratio, (16.0f/9.0f) )) res->addItem(label, name, "/gui/screen169.png"); else res->addItem(label, name, "/gui/screen_other.png"); #undef ABOUT_EQUAL } #ifdef DEBUG if (!found_800_600) { res->addItem(L"800\u00D7600", "800x600", "/gui/screen43.png"); } #endif if (!found_1024_640) { res->addItem(L"1024\u00D7640", "1024x640", "/gui/screen1610.png"); } if (!found_1024_768) { res->addItem(L"1024\u00D7768", "1024x768", "/gui/screen43.png"); } } // end if not inited res->updateItemDisplay(); // ---- select current resolution every time char searching_for[32]; snprintf(searching_for, 32, "%ix%i", (int)UserConfigParams::m_width, (int)UserConfigParams::m_height); if (!res->setSelection(searching_for, PLAYER_ID_GAME_MASTER, false /* focus it */, true /* even if deactivated*/)) { Log::error("OptionsScreenVideo", "Cannot find resolution %s", searching_for); } // --- set gfx settings values updateGfxSlider(); // ---- forbid changing resolution or animation settings from in-game // (we need to disable them last because some items can't be edited when // disabled) if (StateManager::get()->getGameState() == GUIEngine::INGAME_MENU) { res->setDeactivated(); full->setDeactivated(); applyBtn->setDeactivated(); gfx->setDeactivated(); getWidget<ButtonWidget>("custom")->setDeactivated(); } else { // Enable back widgets if they were visited in-game previously res->setActivated(); full->setActivated(); applyBtn->setActivated(); gfx->setActivated(); getWidget<ButtonWidget>("custom")->setActivated(); } } // init