X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fgui%2FguiEngine.cpp;h=694baf482f24c64c757b265ba6cea70d502323ec;hb=7824a4956bf489b4e2cc35e0c97272eee06be6ba;hp=2e1bc7fed634c1ec8643ad4c45eb267d0dddca88;hpb=5d9ae5a91c544fc7fbd475decf47cef7e09ef8fc;p=dragonfireclient.git diff --git a/src/gui/guiEngine.cpp b/src/gui/guiEngine.cpp index 2e1bc7fed..694baf482 100644 --- a/src/gui/guiEngine.cpp +++ b/src/gui/guiEngine.cpp @@ -43,6 +43,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/tile.h" #endif + /******************************************************************************/ void TextDestGuiEngine::gotText(const StringMap &fields) { @@ -74,8 +75,6 @@ video::ITexture *MenuTextureSource::getTexture(const std::string &name, u32 *id) if (name.empty()) return NULL; - m_to_delete.insert(name); - #if ENABLE_GLES video::ITexture *retval = m_driver->findTexture(name.c_str()); if (retval) @@ -87,6 +86,7 @@ video::ITexture *MenuTextureSource::getTexture(const std::string &name, u32 *id) image = Align2Npot2(image, m_driver); retval = m_driver->addTexture(name.c_str(), image); + m_to_delete.insert(name); image->drop(); return retval; #else @@ -98,72 +98,88 @@ video::ITexture *MenuTextureSource::getTexture(const std::string &name, u32 *id) /** MenuMusicFetcher */ /******************************************************************************/ void MenuMusicFetcher::fetchSounds(const std::string &name, - std::set &dst_paths, std::set &dst_datas) + std::set &dst_paths, + std::set &dst_datas) { - if (m_fetched.count(name)) + if(m_fetched.count(name)) return; m_fetched.insert(name); std::string base; base = porting::path_share + DIR_DELIM + "sounds"; dst_paths.insert(base + DIR_DELIM + name + ".ogg"); int i; - for (i = 0; i < 10; i++) - dst_paths.insert(base + DIR_DELIM + name + "." + itos(i) + ".ogg"); + for(i=0; i<10; i++) + dst_paths.insert(base + DIR_DELIM + name + "."+itos(i)+".ogg"); base = porting::path_user + DIR_DELIM + "sounds"; dst_paths.insert(base + DIR_DELIM + name + ".ogg"); - for (i = 0; i < 10; i++) - dst_paths.insert(base + DIR_DELIM + name + "." + itos(i) + ".ogg"); + for(i=0; i<10; i++) + dst_paths.insert(base + DIR_DELIM + name + "."+itos(i)+".ogg"); } /******************************************************************************/ /** GUIEngine */ /******************************************************************************/ -GUIEngine::GUIEngine(JoystickController *joystick, gui::IGUIElement *parent, - IMenuManager *menumgr, MainMenuData *data, bool &kill) : - m_parent(parent), - m_menumanager(menumgr), m_smgr(RenderingEngine::get_scene_manager()), - m_data(data), m_kill(kill) +GUIEngine::GUIEngine(JoystickController *joystick, + gui::IGUIElement *parent, + RenderingEngine *rendering_engine, + IMenuManager *menumgr, + MainMenuData *data, + bool &kill) : + m_rendering_engine(rendering_engine), + m_parent(parent), + m_menumanager(menumgr), + m_smgr(rendering_engine->get_scene_manager()), + m_data(data), + m_kill(kill) { - // initialize texture pointers + //initialize texture pointers for (image_definition &texture : m_textures) { texture.texture = NULL; } // is deleted by guiformspec! m_buttonhandler = new TextDestGuiEngine(this); - // create texture source - m_texture_source = new MenuTextureSource(RenderingEngine::get_video_driver()); + //create texture source + m_texture_source = new MenuTextureSource(rendering_engine->get_video_driver()); - // create soundmanager + //create soundmanager MenuMusicFetcher soundfetcher; #if USE_SOUND if (g_settings->getBool("enable_sound") && g_sound_manager_singleton.get()) - m_sound_manager = createOpenALSoundManager( - g_sound_manager_singleton.get(), &soundfetcher); + m_sound_manager = createOpenALSoundManager(g_sound_manager_singleton.get(), &soundfetcher); #endif if (!m_sound_manager) m_sound_manager = &dummySoundManager; - // create topleft header + //create topleft header m_toplefttext = L""; core::rect rect(0, 0, g_fontengine->getTextWidth(m_toplefttext.c_str()), - g_fontengine->getTextHeight()); + g_fontengine->getTextHeight()); rect += v2s32(4, 0); - m_irr_toplefttext = gui::StaticText::add(RenderingEngine::get_gui_env(), + m_irr_toplefttext = gui::StaticText::add(rendering_engine->get_gui_env(), m_toplefttext, rect, false, true, 0, -1); - // create formspecsource + //create formspecsource m_formspecgui = new FormspecFormSource(""); /* Create menu */ - m_menu = new GUIFormSpecMenu(joystick, m_parent, -1, m_menumanager, - NULL /* &client */, m_texture_source, m_formspecgui, - m_buttonhandler, "", false); + m_menu = new GUIFormSpecMenu(joystick, + m_parent, + -1, + m_menumanager, + NULL /* &client */, + m_rendering_engine->get_gui_env(), + m_texture_source, + m_sound_manager, + m_formspecgui, + m_buttonhandler, + "", + false); m_menu->allowClose(false); - m_menu->lockSize(true, v2u32(800, 600)); + m_menu->lockSize(true,v2u32(800,600)); // Initialize scripting @@ -197,20 +213,18 @@ bool GUIEngine::loadMainMenuScript() // Set main menu path (for core.get_mainmenu_path()) m_scriptdir = g_settings->get("main_menu_path"); if (m_scriptdir.empty()) { - m_scriptdir = porting::path_share + DIR_DELIM + "builtin" + DIR_DELIM + - "mainmenu"; + m_scriptdir = porting::path_share + DIR_DELIM + "builtin" + DIR_DELIM + "mainmenu"; } // Load builtin (which will load the main menu script) - std::string script = - porting::path_share + DIR_DELIM "builtin" + DIR_DELIM "init.lua"; + std::string script = porting::path_share + DIR_DELIM "builtin" + DIR_DELIM "init.lua"; try { m_script->loadScript(script); // Menu script loaded return true; } catch (const ModError &e) { - errorstream << "GUIEngine: execution of menu script failed: " << e.what() - << std::endl; + errorstream << "GUIEngine: execution of menu script failed: " + << e.what() << std::endl; } return false; @@ -221,14 +235,14 @@ void GUIEngine::run() { // Always create clouds because they may or may not be // needed based on the game selected - video::IVideoDriver *driver = RenderingEngine::get_video_driver(); + video::IVideoDriver *driver = m_rendering_engine->get_video_driver(); cloudInit(); unsigned int text_height = g_fontengine->getTextHeight(); - irr::core::dimension2d previous_screen_size( - g_settings->getU16("screen_w"), g_settings->getU16("screen_h")); + irr::core::dimension2d previous_screen_size(g_settings->getU16("screen_w"), + g_settings->getU16("screen_h")); static const video::SColor sky_color(255, 140, 186, 250); @@ -248,23 +262,22 @@ void GUIEngine::run() fog_pixelfog, fog_rangefog); } - while (RenderingEngine::run() && (!m_startgame) && (!m_kill)) { + while (m_rendering_engine->run() && (!m_startgame) && (!m_kill)) { const irr::core::dimension2d ¤t_screen_size = - RenderingEngine::get_video_driver()->getScreenSize(); + m_rendering_engine->get_video_driver()->getScreenSize(); // Verify if window size has changed and save it if it's the case // Ensure evaluating settings->getBool after verifying screensize // First condition is cheaper if (previous_screen_size != current_screen_size && - current_screen_size != - irr::core::dimension2d(0, 0) && + current_screen_size != irr::core::dimension2d(0,0) && g_settings->getBool("autosave_screensize")) { g_settings->setU16("screen_w", current_screen_size.Width); g_settings->setU16("screen_h", current_screen_size.Height); previous_screen_size = current_screen_size; } - // check if we need to update the "upper left corner"-text + //check if we need to update the "upper left corner"-text if (text_height != g_fontengine->getTextHeight()) { updateTopLeftTextSize(); text_height = g_fontengine->getTextHeight(); @@ -272,23 +285,29 @@ void GUIEngine::run() driver->beginScene(true, true, sky_color); - if (m_clouds_enabled) { + if (m_clouds_enabled) + { cloudPreProcess(); drawOverlay(driver); - } else + } + else drawBackground(driver); drawHeader(driver); drawFooter(driver); - RenderingEngine::get_gui_env()->drawAll(); + m_rendering_engine->get_gui_env()->drawAll(); driver->endScene(); + IrrlichtDevice *device = m_rendering_engine->get_raw_device(); + u32 frametime_min = 1000 / (device->isWindowFocused() + ? g_settings->getFloat("fps_max") + : g_settings->getFloat("fps_max_unfocused")); if (m_clouds_enabled) - cloudPostProcess(); + cloudPostProcess(frametime_min, device); else - sleep_ms(25); + sleep_ms(frametime_min); m_script->step(); @@ -301,21 +320,20 @@ void GUIEngine::run() /******************************************************************************/ GUIEngine::~GUIEngine() { - if (m_sound_manager != &dummySoundManager) { + if (m_sound_manager != &dummySoundManager){ delete m_sound_manager; m_sound_manager = NULL; } - infostream << "GUIEngine: Deinitializing scripting" << std::endl; + infostream<<"GUIEngine: Deinitializing scripting"<setText(L""); - // clean up texture pointers + //clean up texture pointers for (image_definition &texture : m_textures) { if (texture.texture) - RenderingEngine::get_video_driver()->removeTexture( - texture.texture); + m_rendering_engine->get_video_driver()->removeTexture(texture.texture); } delete m_texture_source; @@ -329,51 +347,49 @@ void GUIEngine::cloudInit() { m_cloud.clouds = new Clouds(m_smgr, -1, rand()); m_cloud.clouds->setHeight(100.0f); - m_cloud.clouds->update(v3f(0, 0, 0), video::SColor(255, 240, 240, 255)); + m_cloud.clouds->update(v3f(0, 0, 0), video::SColor(255,240,240,255)); - m_cloud.camera = m_smgr->addCameraSceneNode(0, v3f(0, 0, 0), v3f(0, 60, 100)); + m_cloud.camera = m_smgr->addCameraSceneNode(0, + v3f(0,0,0), v3f(0, 60, 100)); m_cloud.camera->setFarValue(10000); - m_cloud.lasttime = RenderingEngine::get_timer_time(); + m_cloud.lasttime = m_rendering_engine->get_timer_time(); } /******************************************************************************/ void GUIEngine::cloudPreProcess() { - u32 time = RenderingEngine::get_timer_time(); + u32 time = m_rendering_engine->get_timer_time(); - if (time > m_cloud.lasttime) + if(time > m_cloud.lasttime) m_cloud.dtime = (time - m_cloud.lasttime) / 1000.0; else m_cloud.dtime = 0; m_cloud.lasttime = time; - m_cloud.clouds->step(m_cloud.dtime * 3); + m_cloud.clouds->step(m_cloud.dtime*3); m_cloud.clouds->render(); m_smgr->drawAll(); } /******************************************************************************/ -void GUIEngine::cloudPostProcess() +void GUIEngine::cloudPostProcess(u32 frametime_min, IrrlichtDevice *device) { - float fps_max = g_settings->getFloat("pause_fps_max"); // Time of frame without fps limit u32 busytime_u32; // not using getRealTime is necessary for wine - u32 time = RenderingEngine::get_timer_time(); - if (time > m_cloud.lasttime) + u32 time = m_rendering_engine->get_timer_time(); + if(time > m_cloud.lasttime) busytime_u32 = time - m_cloud.lasttime; else busytime_u32 = 0; - // FPS limiter - u32 frametime_min = 1000. / fps_max; - + // FPS limit if (busytime_u32 < frametime_min) { u32 sleeptime = frametime_min - busytime_u32; - RenderingEngine::get_raw_device()->sleep(sleeptime); + device->sleep(sleeptime); } } @@ -385,16 +401,17 @@ void GUIEngine::setFormspecPrepend(const std::string &fs) } } + /******************************************************************************/ void GUIEngine::drawBackground(video::IVideoDriver *driver) { v2u32 screensize = driver->getScreenSize(); - video::ITexture *texture = m_textures[TEX_LAYER_BACKGROUND].texture; + video::ITexture* texture = m_textures[TEX_LAYER_BACKGROUND].texture; /* If no texture, draw background of solid color */ - if (!texture) { - video::SColor color(255, 80, 58, 37); + if(!texture){ + video::SColor color(255,80,58,37); core::rect rect(0, 0, screensize.X, screensize.Y); driver->draw2DRectangle(color, rect, NULL); return; @@ -402,19 +419,19 @@ void GUIEngine::drawBackground(video::IVideoDriver *driver) v2u32 sourcesize = texture->getOriginalSize(); - if (m_textures[TEX_LAYER_BACKGROUND].tile) { - v2u32 tilesize(MYMAX(sourcesize.X, - m_textures[TEX_LAYER_BACKGROUND].minsize), - MYMAX(sourcesize.Y, m_textures[TEX_LAYER_BACKGROUND] - .minsize)); - for (unsigned int x = 0; x < screensize.X; x += tilesize.X) { - for (unsigned int y = 0; y < screensize.Y; y += tilesize.Y) { + if (m_textures[TEX_LAYER_BACKGROUND].tile) + { + v2u32 tilesize( + MYMAX(sourcesize.X,m_textures[TEX_LAYER_BACKGROUND].minsize), + MYMAX(sourcesize.Y,m_textures[TEX_LAYER_BACKGROUND].minsize)); + for (unsigned int x = 0; x < screensize.X; x += tilesize.X ) + { + for (unsigned int y = 0; y < screensize.Y; y += tilesize.Y ) + { draw2DImageFilterScaled(driver, texture, - core::rect(x, y, x + tilesize.X, - y + tilesize.Y), - core::rect(0, 0, sourcesize.X, - sourcesize.Y), - NULL, NULL, true); + core::rect(x, y, x+tilesize.X, y+tilesize.Y), + core::rect(0, 0, sourcesize.X, sourcesize.Y), + NULL, NULL, true); } } return; @@ -422,9 +439,9 @@ void GUIEngine::drawBackground(video::IVideoDriver *driver) /* Draw background texture */ draw2DImageFilterScaled(driver, texture, - core::rect(0, 0, screensize.X, screensize.Y), - core::rect(0, 0, sourcesize.X, sourcesize.Y), NULL, NULL, - true); + core::rect(0, 0, screensize.X, screensize.Y), + core::rect(0, 0, sourcesize.X, sourcesize.Y), + NULL, NULL, true); } /******************************************************************************/ @@ -432,18 +449,18 @@ void GUIEngine::drawOverlay(video::IVideoDriver *driver) { v2u32 screensize = driver->getScreenSize(); - video::ITexture *texture = m_textures[TEX_LAYER_OVERLAY].texture; + video::ITexture* texture = m_textures[TEX_LAYER_OVERLAY].texture; /* If no texture, draw nothing */ - if (!texture) + if(!texture) return; /* Draw background texture */ v2u32 sourcesize = texture->getOriginalSize(); draw2DImageFilterScaled(driver, texture, - core::rect(0, 0, screensize.X, screensize.Y), - core::rect(0, 0, sourcesize.X, sourcesize.Y), NULL, NULL, - true); + core::rect(0, 0, screensize.X, screensize.Y), + core::rect(0, 0, sourcesize.X, sourcesize.Y), + NULL, NULL, true); } /******************************************************************************/ @@ -451,33 +468,30 @@ void GUIEngine::drawHeader(video::IVideoDriver *driver) { core::dimension2d screensize = driver->getScreenSize(); - video::ITexture *texture = m_textures[TEX_LAYER_HEADER].texture; + video::ITexture* texture = m_textures[TEX_LAYER_HEADER].texture; /* If no texture, draw nothing */ - if (!texture) + if(!texture) return; f32 mult = (((f32)screensize.Width / 2.0)) / - ((f32)texture->getOriginalSize().Width); + ((f32)texture->getOriginalSize().Width); v2s32 splashsize(((f32)texture->getOriginalSize().Width) * mult, ((f32)texture->getOriginalSize().Height) * mult); // Don't draw the header if there isn't enough room - s32 free_space = (((s32)screensize.Height) - 320) / 2; + s32 free_space = (((s32)screensize.Height)-320)/2; if (free_space > splashsize.Y) { core::rect splashrect(0, 0, splashsize.X, splashsize.Y); - splashrect += v2s32((screensize.Width / 2) - (splashsize.X / 2), - ((free_space / 2) - splashsize.Y / 2) + 10); - - video::SColor bgcolor(255, 50, 50, 50); + splashrect += v2s32((screensize.Width/2)-(splashsize.X/2), + ((free_space/2)-splashsize.Y/2)+10); - draw2DImageFilterScaled(driver, texture, splashrect, - core::rect(core::position2d(0, 0), - core::dimension2di( - texture->getOriginalSize())), - NULL, NULL, true); + draw2DImageFilterScaled(driver, texture, splashrect, + core::rect(core::position2d(0,0), + core::dimension2di(texture->getOriginalSize())), + NULL, NULL, true); } } @@ -486,30 +500,30 @@ void GUIEngine::drawFooter(video::IVideoDriver *driver) { core::dimension2d screensize = driver->getScreenSize(); - video::ITexture *texture = m_textures[TEX_LAYER_FOOTER].texture; + video::ITexture* texture = m_textures[TEX_LAYER_FOOTER].texture; /* If no texture, draw nothing */ - if (!texture) + if(!texture) return; - f32 mult = (((f32)screensize.Width)) / ((f32)texture->getOriginalSize().Width); + f32 mult = (((f32)screensize.Width)) / + ((f32)texture->getOriginalSize().Width); v2s32 footersize(((f32)texture->getOriginalSize().Width) * mult, ((f32)texture->getOriginalSize().Height) * mult); // Don't draw the footer if there isn't enough room - s32 free_space = (((s32)screensize.Height) - 320) / 2; + s32 free_space = (((s32)screensize.Height)-320)/2; if (free_space > footersize.Y) { - core::rect rect(0, 0, footersize.X, footersize.Y); - rect += v2s32(screensize.Width / 2, screensize.Height - footersize.Y); - rect -= v2s32(footersize.X / 2, 0); + core::rect rect(0,0,footersize.X,footersize.Y); + rect += v2s32(screensize.Width/2,screensize.Height-footersize.Y); + rect -= v2s32(footersize.X/2, 0); draw2DImageFilterScaled(driver, texture, rect, - core::rect(core::position2d(0, 0), - core::dimension2di( - texture->getOriginalSize())), - NULL, NULL, true); + core::rect(core::position2d(0,0), + core::dimension2di(texture->getOriginalSize())), + NULL, NULL, true); } } @@ -517,7 +531,7 @@ void GUIEngine::drawFooter(video::IVideoDriver *driver) bool GUIEngine::setTexture(texture_layer layer, const std::string &texturepath, bool tile_image, unsigned int minsize) { - video::IVideoDriver *driver = RenderingEngine::get_video_driver(); + video::IVideoDriver *driver = m_rendering_engine->get_video_driver(); if (m_textures[layer].texture) { driver->removeTexture(m_textures[layer].texture); @@ -529,7 +543,7 @@ bool GUIEngine::setTexture(texture_layer layer, const std::string &texturepath, } m_textures[layer].texture = driver->getTexture(texturepath.c_str()); - m_textures[layer].tile = tile_image; + m_textures[layer].tile = tile_image; m_textures[layer].minsize = minsize; if (!m_textures[layer].texture) { @@ -580,11 +594,11 @@ void GUIEngine::setTopleftText(const std::string &text) void GUIEngine::updateTopLeftTextSize() { core::rect rect(0, 0, g_fontengine->getTextWidth(m_toplefttext.c_str()), - g_fontengine->getTextHeight()); + g_fontengine->getTextHeight()); rect += v2s32(4, 0); m_irr_toplefttext->remove(); - m_irr_toplefttext = gui::StaticText::add(RenderingEngine::get_gui_env(), + m_irr_toplefttext = gui::StaticText::add(m_rendering_engine->get_gui_env(), m_toplefttext, rect, false, true, 0, -1); } @@ -602,8 +616,8 @@ void GUIEngine::stopSound(s32 handle) } /******************************************************************************/ -unsigned int GUIEngine::queueAsync( - const std::string &serialized_func, const std::string &serialized_params) +unsigned int GUIEngine::queueAsync(const std::string &serialized_func, + const std::string &serialized_params) { return m_script->queueAsync(serialized_func, serialized_params); }