GUI: Allow texture packs to customize the progress bar (#5368)
authorkilbith <kilbith@users.noreply.github.com>
Mon, 13 Mar 2017 07:07:14 +0000 (08:07 +0100)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Mon, 13 Mar 2017 07:07:14 +0000 (08:07 +0100)
doc/texture_packs.txt
src/drawscene.cpp

index 5c535a9f1213e90b47b358e6c7d1024c5d0e2809..1813c29e42a75dcb33778f3ebbd67d126faa43ec 100644 (file)
@@ -76,6 +76,9 @@ by texture packs. All existing fallback textures can be found in the directory
 * `player.png`: front texture of the 2D upright sprite player
 * `player_back.png`: back texture of the 2D upright sprite player
 
+* `progress_bar.png`: foreground texture of the loading screen's progress bar
+* `progress_bar_bg.png`: background texture of the loading screen's progress bar
+
 * `moon.png`: texture of the moon. Default texture is generated by Minetest
 * `moon_tonemap.png`: tonemap to be used when `moon.png` was found
 * `sun.png`: texture of the sun. Default texture is generated by Minetest
index c4ef3cc5172c386583942b6952081e8d3b19f4a8..e3e6301a8a7cefb9c1a79e18804b8b2c729eae80 100644 (file)
@@ -592,30 +592,51 @@ void draw_load_screen(const std::wstring &text, IrrlichtDevice* device,
 
        // draw progress bar
        if ((percent >= 0) && (percent <= 100)) {
-               std::string gamepath = fs::RemoveRelativePathComponents(
-                       porting::path_share + DIR_DELIM + "textures");
-               video::ITexture *progress_img = driver->getTexture(
-                       (gamepath + "/base/pack/progress_bar.png").c_str());
-               video::ITexture *progress_img_bg = driver->getTexture(
-                       (gamepath + "/base/pack/progress_bar_bg.png").c_str());
-
-               const core::dimension2d<u32> &img_size = progress_img_bg->getSize();
-               u32 imgW = MYMAX(208, img_size.Width);
-               u32 imgH = MYMAX(24, img_size.Height);
-               v2s32 img_pos((screensize.X - imgW) / 2, (screensize.Y - imgH) / 2);
-
-               draw2DImageFilterScaled(
-                       driver, progress_img_bg,
-                       core::rect<s32>(img_pos.X, img_pos.Y, img_pos.X + imgW, img_pos.Y + imgH),
-                       core::rect<s32>(0, 0, img_size.Width, img_size.Height),
-                       0, 0, true);
-
-               draw2DImageFilterScaled(
-                       driver, progress_img,
-                       core::rect<s32>(img_pos.X, img_pos.Y,
-                                       img_pos.X + (percent * imgW) / 100, img_pos.Y + imgH),
-                       core::rect<s32>(0, 0, ((percent * img_size.Width) / 100), img_size.Height),
-                       0, 0, true);
+               const std::string &texture_path = g_settings->get("texture_path");
+               std::string tp_progress_bar = texture_path + "/progress_bar.png";
+               std::string tp_progress_bar_bg = texture_path + "/progress_bar_bg.png";
+
+               if (!(fs::PathExists(tp_progress_bar) &&
+                               fs::PathExists(tp_progress_bar_bg))) {
+                       std::string gamepath = fs::RemoveRelativePathComponents(
+                               porting::path_share + DIR_DELIM + "textures");
+                       tp_progress_bar = gamepath + "/base/pack/progress_bar.png";
+                       tp_progress_bar_bg = gamepath + "/base/pack/progress_bar_bg.png";
+               }
+
+               video::ITexture *progress_img =
+                       driver->getTexture(tp_progress_bar.c_str());
+               video::ITexture *progress_img_bg =
+                       driver->getTexture(tp_progress_bar_bg.c_str());
+
+               if (progress_img && progress_img_bg) {
+                       const core::dimension2d<u32> &img_size = progress_img_bg->getSize();
+                       u32 imgW = rangelim(img_size.Width, 200, 600);
+                       u32 imgH = rangelim(img_size.Height, 24, 72);
+                       v2s32 img_pos((screensize.X - imgW) / 2, (screensize.Y - imgH) / 2);
+
+                       draw2DImageFilterScaled(
+                               driver, progress_img_bg,
+                               core::rect<s32>(img_pos.X,
+                                               img_pos.Y,
+                                               img_pos.X + imgW,
+                                               img_pos.Y + imgH),
+                               core::rect<s32>(0, 0,
+                                               img_size.Width,
+                                               img_size.Height),
+                               0, 0, true);
+
+                       draw2DImageFilterScaled(
+                               driver, progress_img,
+                               core::rect<s32>(img_pos.X,
+                                               img_pos.Y,
+                                               img_pos.X + (percent * imgW) / 100,
+                                               img_pos.Y + imgH),
+                               core::rect<s32>(0, 0,
+                                               (percent * img_size.Width) / 100,
+                                               img_size.Height),
+                               0, 0, true);
+               }
        }
 
        guienv->drawAll();