From bda62bd3bf7f41a25f2c6294ddc0ec144081e3ef Mon Sep 17 00:00:00 2001
From: Zeg9 <dazeg9@gmail.com>
Date: Sat, 11 May 2013 16:02:41 +0200
Subject: [PATCH] Add progress bar to item visuals preloading

---
 src/client.cpp | 16 +++++++++++++++-
 src/client.h   |  2 +-
 src/game.cpp   |  2 +-
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/client.cpp b/src/client.cpp
index 329496db7..929ed0eab 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -29,6 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapblock.h"
 #include "settings.h"
 #include "profiler.h"
+#include "gettext.h"
 #include "log.h"
 #include "nodemetadata.h"
 #include "nodedef.h"
@@ -2804,7 +2805,10 @@ ClientEvent Client::getClientEvent()
 	return m_client_event_queue.pop_front();
 }
 
-void Client::afterContentReceived()
+void draw_load_screen(const std::wstring &text,
+		IrrlichtDevice* device, gui::IGUIFont* font,
+		float dtime=0 ,int percent=0, bool clouds=true);
+void Client::afterContentReceived(IrrlichtDevice *device, gui::IGUIFont* font)
 {
 	infostream<<"Client::afterContentReceived() started"<<std::endl;
 	assert(m_itemdef_received);
@@ -2839,13 +2843,23 @@ void Client::afterContentReceived()
 	if(g_settings->getBool("preload_item_visuals"))
 	{
 		verbosestream<<"Updating item textures and meshes"<<std::endl;
+		wchar_t* text = wgettext("Item textures...");
+		draw_load_screen(text,device,font,0,0);
 		std::set<std::string> names = m_itemdef->getAll();
+		size_t size = names.size();
+		size_t count = 0;
+		int percent = 0;
 		for(std::set<std::string>::const_iterator
 				i = names.begin(); i != names.end(); ++i){
 			// Asking for these caches the result
 			m_itemdef->getInventoryTexture(*i, this);
 			m_itemdef->getWieldMesh(*i, this);
+			count++;
+			percent = count*100/size;
+			if (count%50 == 0) // only update every 50 item
+				draw_load_screen(text,device,font,0,percent);
 		}
+		delete[] text;
 	}
 
 	// Start mesh update thread after setting up content definitions
diff --git a/src/client.h b/src/client.h
index 67ba6c565..f0cc55868 100644
--- a/src/client.h
+++ b/src/client.h
@@ -385,7 +385,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
 	bool nodedefReceived()
 	{ return m_nodedef_received; }
 	
-	void afterContentReceived();
+	void afterContentReceived(IrrlichtDevice *device, gui::IGUIFont* font);
 
 	float getRTT(void);
 
diff --git a/src/game.cpp b/src/game.cpp
index 16d550776..23e794de2 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -1232,7 +1232,7 @@ void the_game(
 		After all content has been received:
 		Update cached textures, meshes and materials
 	*/
-	client.afterContentReceived();
+	client.afterContentReceived(device,font);
 
 	/*
 		Create the camera node
-- 
GitLab