diff --git a/builtin/mainmenu/textures.lua b/builtin/mainmenu/textures.lua index cec12235..56992c0c 100644 --- a/builtin/mainmenu/textures.lua +++ b/builtin/mainmenu/textures.lua @@ -60,9 +60,12 @@ function mm_texture.reset() mm_texture.set_generic("footer") mm_texture.set_generic("header") - if not have_bg and - core.setting_getbool("menu_clouds") then + if not have_bg then + if core.setting_getbool("menu_clouds") then core.set_clouds(true) + else + mm_texture.set_dirt_bg() + end end end @@ -83,9 +86,13 @@ function mm_texture.update_game(gamedetails) mm_texture.clear("footer") core.set_clouds(false) - if not have_bg and - core.setting_getbool("menu_clouds") then + if not have_bg then + + if core.setting_getbool("menu_clouds") then core.set_clouds(true) + else + mm_texture.set_dirt_bg() + end end mm_texture.set_game("footer",gamedetails) @@ -144,3 +151,16 @@ function mm_texture.set_game(identifier,gamedetails) return false end + +function mm_texture.set_dirt_bg() + if mm_texture.texturepack ~= nil then + local path = mm_texture.texturepack .. DIR_DELIM .."default_dirt.png" + if core.set_background("background", path, true, 128) then + return true + end + end + + --use base pack + local minimalpath = defaulttexturedir .. "dirt_bg.png" + core.set_background("background", minimalpath, true, 128) +end diff --git a/doc/menu_lua_api.txt b/doc/menu_lua_api.txt index cd44fa81..13ef45de 100644 --- a/doc/menu_lua_api.txt +++ b/doc/menu_lua_api.txt @@ -103,8 +103,11 @@ core.explode_textlist_event(string) -> table ^ type: "INV" (no row selected), "CHG" (selected) or "DCL" (double-click) GUI: -core.set_background(type, texturepath) +core.set_background(type, texturepath,[tile],[minsize]) ^ type: "background", "overlay", "header" or "footer" +^ tile: tile the image instead of scaling (background only) +^ minsize: minimum tile size, images are scaled to at least this size prior +^ doing tiling (background only) core.set_clouds() core.set_topleft_text(text) core.show_keys_menu() diff --git a/src/guiEngine.cpp b/src/guiEngine.cpp index ef018021..f71c6a51 100644 --- a/src/guiEngine.cpp +++ b/src/guiEngine.cpp @@ -31,6 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "sound_openal.h" #include "clouds.h" #include "httpfetch.h" +#include "util/numeric.h" #include #include @@ -140,7 +141,7 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev, { //initialize texture pointers for (unsigned int i = 0; i < TEX_LAYER_MAX; i++) { - m_textures[i] = 0; + m_textures[i].texture = NULL; } // is deleted by guiformspec! m_buttonhandler = new TextDestGuiEngine(this); @@ -238,7 +239,6 @@ bool GUIEngine::loadMainMenuScript() /******************************************************************************/ void GUIEngine::run() { - // Always create clouds because they may or may not be // needed based on the game selected video::IVideoDriver* driver = m_device->getVideoDriver(); @@ -292,8 +292,8 @@ GUIEngine::~GUIEngine() //clean up texture pointers for (unsigned int i = 0; i < TEX_LAYER_MAX; i++) { - if (m_textures[i] != 0) - driver->removeTexture(m_textures[i]); + if (m_textures[i].texture != NULL) + driver->removeTexture(m_textures[i].texture); } delete m_texture_source; @@ -362,7 +362,7 @@ void GUIEngine::drawBackground(video::IVideoDriver* driver) { v2u32 screensize = driver->getScreenSize(); - video::ITexture* texture = m_textures[TEX_LAYER_BACKGROUND]; + video::ITexture* texture = m_textures[TEX_LAYER_BACKGROUND].texture; /* If no texture, draw background of solid color */ if(!texture){ @@ -372,8 +372,27 @@ void GUIEngine::drawBackground(video::IVideoDriver* driver) return; } - /* Draw background texture */ 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 ) + { + driver->draw2DImage(texture, + core::rect(x, y, x+tilesize.X, y+tilesize.Y), + core::rect(0, 0, sourcesize.X, sourcesize.Y), + NULL, NULL, true); + } + } + return; + } + + /* Draw background texture */ driver->draw2DImage(texture, core::rect(0, 0, screensize.X, screensize.Y), core::rect(0, 0, sourcesize.X, sourcesize.Y), @@ -385,7 +404,7 @@ void GUIEngine::drawOverlay(video::IVideoDriver* driver) { v2u32 screensize = driver->getScreenSize(); - video::ITexture* texture = m_textures[TEX_LAYER_OVERLAY]; + video::ITexture* texture = m_textures[TEX_LAYER_OVERLAY].texture; /* If no texture, draw background of solid color */ if(!texture) @@ -404,7 +423,7 @@ void GUIEngine::drawHeader(video::IVideoDriver* driver) { core::dimension2d screensize = driver->getScreenSize(); - video::ITexture* texture = m_textures[TEX_LAYER_HEADER]; + video::ITexture* texture = m_textures[TEX_LAYER_HEADER].texture; /* If no texture, draw nothing */ if(!texture) @@ -438,7 +457,7 @@ void GUIEngine::drawFooter(video::IVideoDriver* driver) { core::dimension2d screensize = driver->getScreenSize(); - video::ITexture* texture = m_textures[TEX_LAYER_FOOTER]; + video::ITexture* texture = m_textures[TEX_LAYER_FOOTER].texture; /* If no texture, draw nothing */ if(!texture) @@ -466,29 +485,38 @@ void GUIEngine::drawFooter(video::IVideoDriver* driver) } /******************************************************************************/ -bool GUIEngine::setTexture(texture_layer layer,std::string texturepath) { - +bool GUIEngine::setTexture(texture_layer layer, std::string texturepath, + bool tile_image, unsigned int minsize) +{ video::IVideoDriver* driver = m_device->getVideoDriver(); assert(driver != 0); - if (m_textures[layer] != 0) + if (m_textures[layer].texture != NULL) { - driver->removeTexture(m_textures[layer]); - m_textures[layer] = 0; + driver->removeTexture(m_textures[layer].texture); + m_textures[layer].texture = NULL; } if ((texturepath == "") || !fs::PathExists(texturepath)) + { return false; + } - m_textures[layer] = driver->getTexture(texturepath.c_str()); + m_textures[layer].texture = driver->getTexture(texturepath.c_str()); + m_textures[layer].tile = tile_image; + m_textures[layer].minsize = minsize; - if (m_textures[layer] == 0) return false; + if (m_textures[layer].texture == NULL) + { + return false; + } return true; } /******************************************************************************/ -bool GUIEngine::downloadFile(std::string url,std::string target) { +bool GUIEngine::downloadFile(std::string url,std::string target) +{ #if USE_CURL std::ofstream targetfile(target.c_str(), std::ios::out | std::ios::binary); @@ -515,7 +543,8 @@ bool GUIEngine::downloadFile(std::string url,std::string target) { } /******************************************************************************/ -void GUIEngine::setTopleftText(std::string append) { +void GUIEngine::setTopleftText(std::string append) +{ std::string toset = std::string("Minetest ") + minetest_version_hash; if (append != "") { @@ -541,7 +570,8 @@ void GUIEngine::stopSound(s32 handle) /******************************************************************************/ unsigned int GUIEngine::queueAsync(std::string serialized_func, - std::string serialized_params) { + std::string serialized_params) +{ return m_script->queueAsync(serialized_func, serialized_params); } diff --git a/src/guiEngine.h b/src/guiEngine.h index 9dcf2d4a..7f35949d 100644 --- a/src/guiEngine.h +++ b/src/guiEngine.h @@ -41,6 +41,12 @@ typedef enum { TEX_LAYER_MAX } texture_layer; +typedef struct { + video::ITexture* texture; + bool tile; + unsigned int minsize; +} image_definition; + /******************************************************************************/ /* forward declarations */ /******************************************************************************/ @@ -143,11 +149,11 @@ public: * @param data struct to transfer data to main game handling */ GUIEngine( irr::IrrlichtDevice* dev, - gui::IGUIElement* parent, - IMenuManager *menumgr, - scene::ISceneManager* smgr, - MainMenuData* data, - bool& kill); + gui::IGUIElement* parent, + IMenuManager *menumgr, + scene::ISceneManager* smgr, + MainMenuData* data, + bool& kill); /** default destructor */ virtual ~GUIEngine(); @@ -155,14 +161,16 @@ public: /** * return MainMenuScripting interface */ - MainMenuScripting* getScriptIface() { + MainMenuScripting* getScriptIface() + { return m_script; } /** * return dir of current menuscript */ - std::string getScriptDir() { + std::string getScriptDir() + { return m_scriptdir; } @@ -181,38 +189,38 @@ private: void limitFrameRate(); /** device to draw at */ - irr::IrrlichtDevice* m_device; + irr::IrrlichtDevice* m_device; /** parent gui element */ - gui::IGUIElement* m_parent; + gui::IGUIElement* m_parent; /** manager to add menus to */ - IMenuManager* m_menumanager; + IMenuManager* m_menumanager; /** scene manager to add scene elements to */ - scene::ISceneManager* m_smgr; + scene::ISceneManager* m_smgr; /** pointer to data beeing transfered back to main game handling */ - MainMenuData* m_data; + MainMenuData* m_data; /** pointer to texture source */ - ISimpleTextureSource* m_texture_source; + ISimpleTextureSource* m_texture_source; /** pointer to soundmanager*/ - ISoundManager* m_sound_manager; + ISoundManager* m_sound_manager; /** representation of form source to be used in mainmenu formspec */ - FormspecFormSource* m_formspecgui; + FormspecFormSource* m_formspecgui; /** formspec input receiver */ - TextDestGuiEngine* m_buttonhandler; + TextDestGuiEngine* m_buttonhandler; /** the formspec menu */ - GUIFormSpecMenu* m_menu; + GUIFormSpecMenu* m_menu; /** reference to kill variable managed by SIGINT handler */ - bool& m_kill; + bool& m_kill; /** variable used to abort menu and return back to main game handling */ - bool m_startgame; + bool m_startgame; /** scripting interface */ - MainMenuScripting* m_script; + MainMenuScripting* m_script; /** script basefolder */ - std::string m_scriptdir; + std::string m_scriptdir; /** * draw background layer @@ -240,7 +248,8 @@ private: * @param layer draw layer to specify texture * @param texturepath full path of texture to load */ - bool setTexture(texture_layer layer,std::string texturepath); + bool setTexture(texture_layer layer, std::string texturepath, + bool tile_image, unsigned int minsize); /** * download a file using curl @@ -250,7 +259,7 @@ private: static bool downloadFile(std::string url,std::string target); /** array containing pointers to current specified texture layers */ - video::ITexture* m_textures[TEX_LAYER_MAX]; + image_definition m_textures[TEX_LAYER_MAX]; /** draw version string in topleft corner */ void drawVersion(); @@ -274,19 +283,19 @@ private: /** internam data required for drawing clouds */ struct clouddata { /** delta time since last cloud processing */ - f32 dtime; + f32 dtime; /** absolute time of last cloud processing */ - u32 lasttime; + u32 lasttime; /** pointer to cloud class */ - Clouds* clouds; + Clouds* clouds; /** camera required for drawing clouds */ scene::ICameraSceneNode* camera; }; /** is drawing of clouds enabled atm */ - bool m_clouds_enabled; + bool m_clouds_enabled; /** data used to draw clouds */ - clouddata m_cloud; + clouddata m_cloud; /** start playing a sound and return handle */ s32 playSound(SimpleSoundSpec spec, bool looped); diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp index 226620fc..f2628d0a 100644 --- a/src/script/lua_api/l_mainmenu.cpp +++ b/src/script/lua_api/l_mainmenu.cpp @@ -146,22 +146,36 @@ int ModApiMainMenu::l_set_background(lua_State *L) std::string backgroundlevel(luaL_checkstring(L, 1)); std::string texturename(luaL_checkstring(L, 2)); - bool retval = false; + bool tile_image = false; + bool retval = false; + unsigned int minsize = 16; + + if (!lua_isnone(L, 3)) { + tile_image = lua_toboolean(L, 3); + } + + if (!lua_isnone(L, 4)) { + minsize = lua_tonumber(L, 4); + } if (backgroundlevel == "background") { - retval |= engine->setTexture(TEX_LAYER_BACKGROUND,texturename); + retval |= engine->setTexture(TEX_LAYER_BACKGROUND, texturename, + tile_image, minsize); } if (backgroundlevel == "overlay") { - retval |= engine->setTexture(TEX_LAYER_OVERLAY,texturename); + retval |= engine->setTexture(TEX_LAYER_OVERLAY, texturename, + tile_image, minsize); } if (backgroundlevel == "header") { - retval |= engine->setTexture(TEX_LAYER_HEADER,texturename); + retval |= engine->setTexture(TEX_LAYER_HEADER, texturename, + tile_image, minsize); } if (backgroundlevel == "footer") { - retval |= engine->setTexture(TEX_LAYER_FOOTER,texturename); + retval |= engine->setTexture(TEX_LAYER_FOOTER, texturename, + tile_image, minsize); } lua_pushboolean(L,retval); diff --git a/textures/base/pack/dirt_bg.png b/textures/base/pack/dirt_bg.png new file mode 100644 index 00000000..7cb9c89a Binary files /dev/null and b/textures/base/pack/dirt_bg.png differ