Skip to content

Commit

Permalink
Finer progress bar updates when initializing nodes
Browse files Browse the repository at this point in the history
The bar is only drawn when the user will notice a change, which prevents time overheads that this commit would cause, resulting from useless draws.
  • Loading branch information
est31 authored and Zeno- committed Mar 15, 2015
1 parent 2bc0165 commit e4f7c92
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 10 deletions.
47 changes: 43 additions & 4 deletions src/client.cpp
Expand Up @@ -1553,7 +1553,39 @@ float Client::mediaReceiveProgress()
return 1.0; // downloader only exists when not yet done
}

void Client::afterContentReceived(IrrlichtDevice *device, gui::IGUIFont* font)
typedef struct TextureUpdateArgs {
IrrlichtDevice *device;
gui::IGUIEnvironment *guienv;
u32 last_time_ms;
u16 last_percent;
const wchar_t* text_base;
} TextureUpdateArgs;

void texture_update_progress(void *args, u32 progress, u32 max_progress)
{
TextureUpdateArgs* targs = (TextureUpdateArgs*) args;
u16 cur_percent = ceil(progress / (double) max_progress * 100.);

// update the loading menu -- if neccessary
bool do_draw = false;
u32 time_ms = targs->last_time_ms;
if (cur_percent != targs->last_percent) {
targs->last_percent = cur_percent;
time_ms = getTimeMs();
// only draw when the user will notice something:
do_draw = (time_ms - targs->last_time_ms > 100);
}

if (do_draw) {
targs->last_time_ms = time_ms;
std::basic_stringstream<wchar_t> strm;
strm << targs->text_base << " " << targs->last_percent << "%...";
draw_load_screen(strm.str(), targs->device, targs->guienv, 0,
72 + (u16) ((18. / 100.) * (double) targs->last_percent));
}
}

void Client::afterContentReceived(IrrlichtDevice *device)
{
infostream<<"Client::afterContentReceived() started"<<std::endl;
assert(m_itemdef_received); // pre-condition
Expand All @@ -1571,22 +1603,29 @@ void Client::afterContentReceived(IrrlichtDevice *device, gui::IGUIFont* font)
// Rebuild shaders
infostream<<"- Rebuilding shaders"<<std::endl;
text = wgettext("Rebuilding shaders...");
draw_load_screen(text, device, guienv, 0, 75);
draw_load_screen(text, device, guienv, 0, 71);
m_shsrc->rebuildShaders();
delete[] text;

// Update node aliases
infostream<<"- Updating node aliases"<<std::endl;
text = wgettext("Initializing nodes...");
draw_load_screen(text, device, guienv, 0, 80);
draw_load_screen(text, device, guienv, 0, 72);
m_nodedef->updateAliases(m_itemdef);
m_nodedef->setNodeRegistrationStatus(true);
m_nodedef->runNodeResolverCallbacks();
delete[] text;

// Update node textures and assign shaders to each tile
infostream<<"- Updating node textures"<<std::endl;
m_nodedef->updateTextures(this);
TextureUpdateArgs tu_args;
tu_args.device = device;
tu_args.guienv = guienv;
tu_args.last_time_ms = getTimeMs();
tu_args.last_percent = 0;
tu_args.text_base = wgettext("Initializing nodes");
m_nodedef->updateTextures(this, texture_update_progress, &tu_args);
delete[] tu_args.text_base;

// Preload item textures and meshes if configured to
if(g_settings->getBool("preload_item_visuals"))
Expand Down
2 changes: 1 addition & 1 deletion src/client.h
Expand Up @@ -492,7 +492,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef

float mediaReceiveProgress();

void afterContentReceived(IrrlichtDevice *device, gui::IGUIFont* font);
void afterContentReceived(IrrlichtDevice *device);

float getRTT(void);
float getCurRate(void);
Expand Down
2 changes: 1 addition & 1 deletion src/game.cpp
Expand Up @@ -1998,7 +1998,7 @@ bool Game::createClient(const std::string &playername,
}

// Update cached textures, meshes and materials
client->afterContentReceived(device, g_fontengine->getFont());
client->afterContentReceived(device);

/* Camera
*/
Expand Down
14 changes: 11 additions & 3 deletions src/nodedef.cpp
Expand Up @@ -398,7 +398,9 @@ class CNodeDefManager: public IWritableNodeDefManager {
virtual content_t set(const std::string &name, const ContentFeatures &def);
virtual content_t allocateDummy(const std::string &name);
virtual void updateAliases(IItemDefManager *idef);
virtual void updateTextures(IGameDef *gamedef);
virtual void updateTextures(IGameDef *gamedef,
/*argument: */void (*progress_callback)(void *progress_args, u32 progress, u32 max_progress),
/*argument: */void *progress_callback_args);
void serialize(std::ostream &os, u16 protocol_version);
void deSerialize(std::istream &is);

Expand Down Expand Up @@ -715,7 +717,9 @@ void CNodeDefManager::updateAliases(IItemDefManager *idef)
}


void CNodeDefManager::updateTextures(IGameDef *gamedef)
void CNodeDefManager::updateTextures(IGameDef *gamedef,
void (*progress_callback)(void *progress_args, u32 progress, u32 max_progress),
void *progress_callback_args)
{
#ifndef SERVER
infostream << "CNodeDefManager::updateTextures(): Updating "
Expand All @@ -738,7 +742,9 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
bool use_normal_texture = enable_shaders &&
(enable_bumpmapping || enable_parallax_occlusion);

for (u32 i = 0; i < m_content_features.size(); i++) {
u32 size = m_content_features.size();

for (u32 i = 0; i < size; i++) {
ContentFeatures *f = &m_content_features[i];

// Figure out the actual tiles to use
Expand Down Expand Up @@ -911,6 +917,8 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
recalculateBoundingBox(f->mesh_ptr[0]);
meshmanip->recalculateNormals(f->mesh_ptr[0], true, false);
}

progress_callback(progress_callback_args, i, size);
}
#endif
}
Expand Down
4 changes: 3 additions & 1 deletion src/nodedef.h
Expand Up @@ -378,7 +378,9 @@ class IWritableNodeDefManager : public INodeDefManager
/*
Update tile textures to latest return values of TextueSource.
*/
virtual void updateTextures(IGameDef *gamedef)=0;
virtual void updateTextures(IGameDef *gamedef,
/*argument: */void (*progress_callback)(void *progress_args, u32 progress, u32 max_progress),
/*argument: */void *progress_callback_args)=0;

virtual void serialize(std::ostream &os, u16 protocol_version)=0;
virtual void deSerialize(std::istream &is)=0;
Expand Down

0 comments on commit e4f7c92

Please sign in to comment.