Skip to content

Commit

Permalink
Add texture pack selection to main menu
Browse files Browse the repository at this point in the history
  • Loading branch information
Ekdohibs authored and PilzAdam committed Aug 4, 2013
1 parent fe1fe1b commit 3831534
Show file tree
Hide file tree
Showing 10 changed files with 125 additions and 17 deletions.
100 changes: 98 additions & 2 deletions builtin/mainmenu.lua
Expand Up @@ -20,6 +20,17 @@ menu = {}
local tabbuilder = {}
local worldlist = nil

--------------------------------------------------------------------------------
local function filterTP(TPlist)
TPlist2 = {"None"}
for _,i in ipairs(TPlist) do
if i~="base" then
table.insert(TPlist2, i)
end
end
return TPlist2
end

--------------------------------------------------------------------------------
function menu.render_favorite(spec,render_details)
local text = ""
Expand Down Expand Up @@ -162,6 +173,23 @@ function menu.render_world_list()
return retval
end

--------------------------------------------------------------------------------
function menu.render_TP_list(TPlist)
local retval = ""

--local current_TP = filterlist.get_list(TPlist)

for i,v in ipairs(TPlist) do
if retval ~= "" then
retval = retval ..","
end

retval = retval .. v
end

return retval
end

--------------------------------------------------------------------------------
function menu.init()
--init menu data
Expand All @@ -179,8 +207,7 @@ function menu.init()
menu.favorites = engine.get_favorites("local")
end

menu.defaulttexturedir = engine.get_gamepath() .. DIR_DELIM .. ".." ..
DIR_DELIM .. "textures" .. DIR_DELIM .. "base" ..
menu.defaulttexturedir = engine.get_texturepath() .. DIR_DELIM .. "base" ..
DIR_DELIM .. "pack" .. DIR_DELIM
end

Expand Down Expand Up @@ -307,6 +334,10 @@ function tabbuilder.gettab()
retval = retval .. tabbuilder.tab_settings()
end

if tabbuilder.current_tab == "texture_packs" then
retval = retval .. tabbuilder.tab_TP()
end

if tabbuilder.current_tab == "credits" then
retval = retval .. tabbuilder.tab_credits()
end
Expand Down Expand Up @@ -734,6 +765,23 @@ function tabbuilder.handle_singleplayer_buttons(fields)
end
end

--------------------------------------------------------------------------------
function tabbuilder.handle_TP_buttons(fields)
if fields["TPs"] ~= nil then
local event = explode_textlist_event(fields["TPs"])
if event.typ == "CHG" or event.typ=="DCL" then
local index = engine.get_textlist_index("TPs")
engine.setting_set("mainmenu_last_selected_TP",
index)
local TPlist = filterTP(engine.get_dirlist(engine.get_texturepath(), true))
local TPname = TPlist[engine.get_textlist_index("TPs")]
local TPpath = engine.get_texturepath()..DIR_DELIM..TPname
if TPname == "None" then TPpath = "" end
engine.setting_set("texture_path", TPpath)
end
end
end

--------------------------------------------------------------------------------
function tabbuilder.tab_header()

Expand Down Expand Up @@ -798,6 +846,7 @@ function tabbuilder.init()
table.insert(tabbuilder.current_buttons,{name="multiplayer", caption="Client"})
table.insert(tabbuilder.current_buttons,{name="server", caption="Server"})
table.insert(tabbuilder.current_buttons,{name="settings", caption="Settings"})
table.insert(tabbuilder.current_buttons,{name="texture_packs", caption="Texture Packs"})

if engine.setting_getbool("main_menu_game_mgr") then
table.insert(tabbuilder.current_buttons,{name="game_mgr", caption="Games"})
Expand Down Expand Up @@ -946,6 +995,49 @@ function tabbuilder.tab_singleplayer()
menubar.formspec
end

--------------------------------------------------------------------------------
function tabbuilder.tab_TP()
local TPpath = engine.setting_get("texture_path")
local TPlist = filterTP(engine.get_dirlist(engine.get_texturepath(), true))
local index = tonumber(engine.setting_get("mainmenu_last_selected_TP"))
if index == nil then index = 1 end
if TPpath == "" then
return "label[4,-0.25;Select texture pack:]"..
"vertlabel[0,-0.25;TEXTURE PACKS]" ..
"textlist[4,0.25;7.5,5.0;TPs;" ..
menu.render_TP_list(TPlist) ..
";" .. index .. "]" ..
menubar.formspec
end
local TPinfofile = TPpath..DIR_DELIM.."info.txt"
local f = io.open(TPinfofile, "r")
if f==nil then
menu.TPinfo = "No information available"
else
menu.TPinfo = f:read("*all")
f:close()
end
local TPscreenfile = TPpath..DIR_DELIM.."screenshot.png"
local f = io.open(TPscreenfile, "r")
if f==nil then
menu.TPscreen = nil
else
menu.TPscreen = TPscreenfile
f:close()
end

local no_screenshot = engine.get_texturepath()..DIR_DELIM.."base"..DIR_DELIM.."pack"..DIR_DELIM.."no_screenshot.png"

return "label[4,-0.25;Select texture pack:]"..
"vertlabel[0,-0.25;TEXTURE PACKS]" ..
"textlist[4,0.25;7.5,5.0;TPs;" ..
menu.render_TP_list(TPlist) ..
";" .. index .. "]" ..
"image[0.65,0.25;4.0,3.7;"..(menu.TPscreen or no_screenshot).."]"..
"textarea[1.0,3.25;3.7,1.5;;"..(menu.TPinfo or "")..";]"..
menubar.formspec
end

--------------------------------------------------------------------------------
function tabbuilder.tab_credits()
return "vertlabel[0,-0.5;CREDITS]" ..
Expand Down Expand Up @@ -1039,6 +1131,10 @@ engine.button_handler = function(fields)
tabbuilder.handle_singleplayer_buttons(fields)
end

if tabbuilder.current_tab == "texture_packs" then
tabbuilder.handle_TP_buttons(fields)
end

if tabbuilder.current_tab == "multiplayer" then
tabbuilder.handle_multiplayer_buttons(fields)
end
Expand Down
1 change: 1 addition & 0 deletions src/game.cpp
Expand Up @@ -3482,6 +3482,7 @@ void the_game(
infostream << "\t\t" << i << ":" << texture->getName().getPath().c_str()
<< std::endl;
}
clearTextureNameCache();
infostream << "\tRemaining materials: "
<< driver-> getMaterialRendererCount ()
<< " (note: irrlicht doesn't support removing renderers)"<< std::endl;
Expand Down
10 changes: 10 additions & 0 deletions src/guiLuaApi.cpp
Expand Up @@ -82,6 +82,7 @@ void guiLuaApi::initialize(lua_State* L,GUIEngine* engine)
retval &= API_FCT(set_topleft_text);
retval &= API_FCT(get_modpath);
retval &= API_FCT(get_gamepath);
retval &= API_FCT(get_texturepath);
retval &= API_FCT(get_dirlist);
retval &= API_FCT(create_dir);
retval &= API_FCT(delete_dir);
Expand Down Expand Up @@ -829,6 +830,15 @@ int guiLuaApi::l_get_gamepath(lua_State *L)
return 1;
}

/******************************************************************************/
int guiLuaApi::l_get_texturepath(lua_State *L)
{
std::string gamepath
= fs::RemoveRelativePathComponents(porting::path_user + DIR_DELIM + "textures");
lua_pushstring(L, gamepath.c_str());
return 1;
}

/******************************************************************************/
int guiLuaApi::l_get_dirlist(lua_State *L) {
const char *path = luaL_checkstring(L, 1);
Expand Down
2 changes: 2 additions & 0 deletions src/guiLuaApi.h
Expand Up @@ -164,6 +164,8 @@ class guiLuaApi {
static int l_get_modpath(lua_State *L);

static int l_get_gamepath(lua_State *L);

static int l_get_texturepath(lua_State *L);

static int l_get_dirlist(lua_State *L);

Expand Down
3 changes: 1 addition & 2 deletions src/server.cpp
Expand Up @@ -4273,8 +4273,7 @@ void Server::fillMediaCache()
paths.push_back(mod.path + DIR_DELIM + "media");
paths.push_back(mod.path + DIR_DELIM + "models");
}
std::string path_all = "textures";
paths.push_back(path_all + DIR_DELIM + "all");
paths.push_back(porting::path_user + DIR_DELIM + "textures" + DIR_DELIM + "server");

// Collect media file information from paths into cache
for(std::list<std::string>::iterator i = paths.begin();
Expand Down
17 changes: 5 additions & 12 deletions src/tile.cpp
Expand Up @@ -131,18 +131,6 @@ std::string getTexturePath(const std::string &filename)
// Check all filename extensions. Returns "" if not found.
fullpath = getImagePath(testpath);
}

/*
Check from $user/textures/all
*/
if(fullpath == "")
{
std::string texture_path = porting::path_user + DIR_DELIM
+ "textures" + DIR_DELIM + "all";
std::string testpath = texture_path + DIR_DELIM + filename;
// Check all filename extensions. Returns "" if not found.
fullpath = getImagePath(testpath);
}

/*
Check from default data directory
Expand All @@ -163,6 +151,11 @@ std::string getTexturePath(const std::string &filename)
return fullpath;
}

void clearTextureNameCache()
{
g_texturename_to_path_cache.clear();
}

/*
Stores internal information about a texture.
*/
Expand Down
2 changes: 2 additions & 0 deletions src/tile.h
Expand Up @@ -57,6 +57,8 @@ std::string getImagePath(std::string path);
*/
std::string getTexturePath(const std::string &filename);

void clearTextureNameCache();

/*
ITextureSource::generateTextureFromMesh parameters
*/
Expand Down
5 changes: 5 additions & 0 deletions src/util/container.h
Expand Up @@ -118,6 +118,11 @@ class MutexedMap
}
return result;
}

void clear ()
{
m_values.clear();
}

private:
std::map<Key, Value> m_values;
Expand Down
1 change: 0 additions & 1 deletion textures/all/textures_here.txt

This file was deleted.

1 change: 1 addition & 0 deletions textures/texture_packs_here.txt
@@ -0,0 +1 @@
Put your texture pack folders in this folder. Textures in the "server" pack will be used by the server.

0 comments on commit 3831534

Please sign in to comment.