-struct MenuTextures
-{
- std::string current_gameid;
- bool global_textures;
- video::ITexture *background;
- video::ITexture *overlay;
- video::ITexture *header;
- video::ITexture *footer;
-
- MenuTextures():
- global_textures(false),
- background(NULL),
- overlay(NULL),
- header(NULL),
- footer(NULL)
- {}
-
- static video::ITexture* getMenuTexture(const std::string &tname,
- video::IVideoDriver* driver, const SubgameSpec *spec)
- {
- if(spec){
- std::string path;
- // eg. minetest_menu_background.png (for texture packs)
- std::string pack_tname = spec->id + "_menu_" + tname + ".png";
- path = getTexturePath(pack_tname);
- if(path != "")
- return driver->getTexture(path.c_str());
- // eg. games/minetest_game/menu/background.png
- path = getImagePath(spec->path + DIR_DELIM + "menu" + DIR_DELIM + tname + ".png");
- if(path != "")
- return driver->getTexture(path.c_str());
- } else {
- std::string path;
- // eg. menu_background.png
- std::string pack_tname = "menu_" + tname + ".png";
- path = getTexturePath(pack_tname);
- if(path != "")
- return driver->getTexture(path.c_str());
- }
- return NULL;
- }
-
- void update(video::IVideoDriver* driver, const SubgameSpec *spec, int tab)
- {
- if(tab == TAB_SINGLEPLAYER){
- if(spec->id == current_gameid)
- return;
- current_gameid = spec->id;
- global_textures = false;
- background = getMenuTexture("background", driver, spec);
- overlay = getMenuTexture("overlay", driver, spec);
- header = getMenuTexture("header", driver, spec);
- footer = getMenuTexture("footer", driver, spec);
- } else {
- if(global_textures)
- return;
- current_gameid = "";
- global_textures = true;
- background = getMenuTexture("background", driver, NULL);
- overlay = getMenuTexture("overlay", driver, NULL);
- header = getMenuTexture("header", driver, NULL);
- footer = getMenuTexture("footer", driver, NULL);
- }
- }
-};
-
-void drawMenuBackground(video::IVideoDriver* driver, const MenuTextures &menutextures)
-{
- v2u32 screensize = driver->getScreenSize();
- video::ITexture *texture = menutextures.background;
-
- /* If no texture, draw background of solid color */
- if(!texture){
- video::SColor color(255,80,58,37);
- core::rect<s32> rect(0, 0, screensize.X, screensize.Y);
- driver->draw2DRectangle(color, rect, NULL);
- return;
- }
-
- /* Draw background texture */
- v2u32 sourcesize = texture->getSize();
- driver->draw2DImage(texture,
- core::rect<s32>(0, 0, screensize.X, screensize.Y),
- core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y),
- NULL, NULL, true);
-}
-
-void drawMenuOverlay(video::IVideoDriver* driver, const MenuTextures &menutextures)
-{
- v2u32 screensize = driver->getScreenSize();
- video::ITexture *texture = menutextures.overlay;
-
- /* If no texture, draw nothing */
- if(!texture)
- return;
-
- /* Draw overlay texture */
- v2u32 sourcesize = texture->getSize();
- driver->draw2DImage(texture,
- core::rect<s32>(0, 0, screensize.X, screensize.Y),
- core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y),
- NULL, NULL, true);
-}
-
-void drawMenuHeader(video::IVideoDriver* driver, const MenuTextures &menutextures)
-{
- core::dimension2d<u32> screensize = driver->getScreenSize();
- video::ITexture *texture = menutextures.header;
-
- /* If no texture, draw nothing */
- if(!texture)
- return;
-
- f32 mult = (((f32)screensize.Width / 2)) /
- ((f32)texture->getOriginalSize().Width);
-
- v2s32 splashsize(((f32)texture->getOriginalSize().Width) * mult,
- ((f32)texture->getOriginalSize().Height) * mult);
-
- // Don't draw the header is there isn't enough room
- s32 free_space = (((s32)screensize.Height)-320)/2;
- if (free_space > splashsize.Y) {
- core::rect<s32> 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);
-
- driver->draw2DImage(texture, splashrect,
- core::rect<s32>(core::position2d<s32>(0,0),
- core::dimension2di(texture->getSize())),
- NULL, NULL, true);
- }
-}
-
-void drawMenuFooter(video::IVideoDriver* driver, const MenuTextures &menutextures)
-{
- core::dimension2d<u32> screensize = driver->getScreenSize();
- video::ITexture *texture = menutextures.footer;
-
- /* If no texture, draw nothing */
- if(!texture)
- return;
-
- 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;
- if (free_space > footersize.Y) {
- core::rect<s32> rect(0,0,footersize.X,footersize.Y);
- rect += v2s32(screensize.Width/2,screensize.Height-footersize.Y);
- rect -= v2s32(footersize.X/2, 0);
-
- driver->draw2DImage(texture, rect,
- core::rect<s32>(core::position2d<s32>(0,0),
- core::dimension2di(texture->getSize())),
- NULL, NULL, true);
- }
-}
-
-static const SubgameSpec* getMenuGame(const MainMenuData &menudata)
-{
- for(size_t i=0; i<menudata.games.size(); i++){
- if(menudata.games[i].id == menudata.selected_game){
- return &menudata.games[i];
- }
- }
- return NULL;
-}
-