Skip to content

Commit 73de17a

Browse files
authoredApr 16, 2017
Android progressbar fix (#5601)
* Fix progressbar for Android Fixes #5599 Fixed #5403 * draw_load_screen: use texturesource this permits to unify texture loading code * scale progress bar * Add gl version check for GL_OES_texture_npot. This fixed the texture on loading screen * Remove two sanity checks pointed by @celeron55 * sfan5 comments + android ratio fixes
1 parent d176364 commit 73de17a

File tree

5 files changed

+42
-33
lines changed

5 files changed

+42
-33
lines changed
 

‎src/client.cpp

+8-6
Original file line numberDiff line numberDiff line change
@@ -1782,6 +1782,7 @@ typedef struct TextureUpdateArgs {
17821782
u32 last_time_ms;
17831783
u16 last_percent;
17841784
const wchar_t* text_base;
1785+
ITextureSource *tsrc;
17851786
} TextureUpdateArgs;
17861787

17871788
void texture_update_progress(void *args, u32 progress, u32 max_progress)
@@ -1803,8 +1804,8 @@ void texture_update_progress(void *args, u32 progress, u32 max_progress)
18031804
targs->last_time_ms = time_ms;
18041805
std::basic_stringstream<wchar_t> strm;
18051806
strm << targs->text_base << " " << targs->last_percent << "%...";
1806-
draw_load_screen(strm.str(), targs->device, targs->guienv, 0,
1807-
72 + (u16) ((18. / 100.) * (double) targs->last_percent));
1807+
draw_load_screen(strm.str(), targs->device, targs->guienv, targs->tsrc, 0,
1808+
72 + (u16) ((18. / 100.) * (double) targs->last_percent), true);
18081809
}
18091810
}
18101811

@@ -1824,21 +1825,21 @@ void Client::afterContentReceived(IrrlichtDevice *device)
18241825

18251826
// Rebuild inherited images and recreate textures
18261827
infostream<<"- Rebuilding images and textures"<<std::endl;
1827-
draw_load_screen(text,device, guienv, 0, 70);
1828+
draw_load_screen(text,device, guienv, m_tsrc, 0, 70);
18281829
m_tsrc->rebuildImagesAndTextures();
18291830
delete[] text;
18301831

18311832
// Rebuild shaders
18321833
infostream<<"- Rebuilding shaders"<<std::endl;
18331834
text = wgettext("Rebuilding shaders...");
1834-
draw_load_screen(text, device, guienv, 0, 71);
1835+
draw_load_screen(text, device, guienv, m_tsrc, 0, 71);
18351836
m_shsrc->rebuildShaders();
18361837
delete[] text;
18371838

18381839
// Update node aliases
18391840
infostream<<"- Updating node aliases"<<std::endl;
18401841
text = wgettext("Initializing nodes...");
1841-
draw_load_screen(text, device, guienv, 0, 72);
1842+
draw_load_screen(text, device, guienv, m_tsrc, 0, 72);
18421843
m_nodedef->updateAliases(m_itemdef);
18431844
std::string texture_path = g_settings->get("texture_path");
18441845
if (texture_path != "" && fs::IsDir(texture_path))
@@ -1855,6 +1856,7 @@ void Client::afterContentReceived(IrrlichtDevice *device)
18551856
tu_args.last_time_ms = getTimeMs();
18561857
tu_args.last_percent = 0;
18571858
tu_args.text_base = wgettext("Initializing nodes");
1859+
tu_args.tsrc = m_tsrc;
18581860
m_nodedef->updateTextures(this, texture_update_progress, &tu_args);
18591861
delete[] tu_args.text_base;
18601862

@@ -1871,7 +1873,7 @@ void Client::afterContentReceived(IrrlichtDevice *device)
18711873
}
18721874

18731875
text = wgettext("Done!");
1874-
draw_load_screen(text, device, guienv, 0, 100);
1876+
draw_load_screen(text, device, guienv, m_tsrc, 0, 100);
18751877
infostream<<"Client::afterContentReceived() done"<<std::endl;
18761878
delete[] text;
18771879
}

‎src/client/tile.cpp

+12-3
Original file line numberDiff line numberDiff line change
@@ -790,8 +790,6 @@ void TextureSource::rebuildImagesAndTextures()
790790
video::IImage *img = generateImage(ti->name);
791791
#ifdef __ANDROID__
792792
img = Align2Npot2(img, driver);
793-
sanity_check(img->getDimension().Height == npot2(img->getDimension().Height));
794-
sanity_check(img->getDimension().Width == npot2(img->getDimension().Width));
795793
#endif
796794
// Create texture from resulting image
797795
video::ITexture *t = NULL;
@@ -1124,6 +1122,14 @@ video::IImage* TextureSource::generateImage(const std::string &name)
11241122
* @param driver driver to use for image operations
11251123
* @return image or copy of image aligned to npot2
11261124
*/
1125+
1126+
inline u16 get_GL_major_version()
1127+
{
1128+
const GLubyte *gl_version = glGetString(GL_VERSION);
1129+
std::string gl_ver((const char *)gl_version);
Has conversations. Original line has conversations.
1130+
return (u16) (gl_version[0] - '0');
1131+
}
1132+
11271133
video::IImage * Align2Npot2(video::IImage * image,
11281134
video::IVideoDriver* driver)
11291135
{
@@ -1134,7 +1140,10 @@ video::IImage * Align2Npot2(video::IImage * image,
11341140
core::dimension2d<u32> dim = image->getDimension();
11351141

11361142
std::string extensions = (char*) glGetString(GL_EXTENSIONS);
1137-
if (extensions.find("GL_OES_texture_npot") != std::string::npos) {
1143+
1144+
// Only GLES2 is trusted to correctly report npot support
1145+
if (get_GL_major_version() > 1 &&
1146+
extensions.find("GL_OES_texture_npot") != std::string::npos) {
11381147
return image;
11391148
}
11401149

‎src/drawscene.cpp

+11-17
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,8 @@ void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr,
599599
Additionally, a progressbar can be drawn when percent is set between 0 and 100.
600600
*/
601601
void draw_load_screen(const std::wstring &text, IrrlichtDevice* device,
602-
gui::IGUIEnvironment* guienv, float dtime, int percent, bool clouds )
602+
gui::IGUIEnvironment* guienv, ITextureSource *tsrc,
603+
float dtime, int percent, bool clouds)
603604
{
604605
video::IVideoDriver* driver = device->getVideoDriver();
605606
v2u32 screensize = porting::getWindowSize();
@@ -625,27 +626,20 @@ void draw_load_screen(const std::wstring &text, IrrlichtDevice* device,
625626

626627
// draw progress bar
627628
if ((percent >= 0) && (percent <= 100)) {
628-
const std::string &texture_path = g_settings->get("texture_path");
629-
std::string tp_progress_bar = texture_path + "/progress_bar.png";
630-
std::string tp_progress_bar_bg = texture_path + "/progress_bar_bg.png";
631-
632-
if (!(fs::PathExists(tp_progress_bar) &&
633-
fs::PathExists(tp_progress_bar_bg))) {
634-
std::string gamepath = fs::RemoveRelativePathComponents(
635-
porting::path_share + DIR_DELIM + "textures");
636-
tp_progress_bar = gamepath + "/base/pack/progress_bar.png";
637-
tp_progress_bar_bg = gamepath + "/base/pack/progress_bar_bg.png";
638-
}
639-
640-
video::ITexture *progress_img =
641-
driver->getTexture(tp_progress_bar.c_str());
642-
video::ITexture *progress_img_bg =
643-
driver->getTexture(tp_progress_bar_bg.c_str());
629+
video::ITexture *progress_img = tsrc->getTexture("progress_bar.png");
630+
video::ITexture *progress_img_bg = tsrc->getTexture("progress_bar_bg.png");
644631

645632
if (progress_img && progress_img_bg) {
633+
#ifndef __ANDROID__
646634
const core::dimension2d<u32> &img_size = progress_img_bg->getSize();
647635
u32 imgW = rangelim(img_size.Width, 200, 600);
648636
u32 imgH = rangelim(img_size.Height, 24, 72);
637+
#else
638+
const core::dimension2d<u32> img_size(256, 48);
Has a conversation. Original line has a conversation.
639+
float imgRatio = (float) img_size.Height / img_size.Width;
640+
u32 imgW = screensize.X / 2.2f;
641+
u32 imgH = floor(imgW * imgRatio);
642+
#endif
649643
v2s32 img_pos((screensize.X - imgW) / 2, (screensize.Y - imgH) / 2);
650644

651645
draw2DImageFilterScaled(

‎src/drawscene.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2727

2828

2929
void draw_load_screen(const std::wstring &text, IrrlichtDevice *device,
30-
gui::IGUIEnvironment *guienv, float dtime = 0, int percent = 0,
31-
bool clouds = true);
30+
gui::IGUIEnvironment *guienv, ITextureSource *tsrc, float dtime = 0,
31+
int percent = 0, bool clouds = true);
3232

3333
void draw_scene(video::IVideoDriver *driver, scene::ISceneManager *smgr,
3434
Camera &camera, Client &client, LocalPlayer *player,

‎src/game.cpp

+9-5
Original file line numberDiff line numberDiff line change
@@ -1725,9 +1725,10 @@ bool Game::init(
17251725
u16 port,
17261726
const SubgameSpec &gamespec)
17271727
{
1728+
texture_src = createTextureSource(device);
1729+
17281730
showOverlayMessage(wgettext("Loading..."), 0, 0);
17291731

1730-
texture_src = createTextureSource(device);
17311732
shader_src = createShaderSource(device);
17321733

17331734
itemdef_manager = createItemDefManager();
@@ -2183,12 +2184,14 @@ bool Game::getServerContent(bool *aborted)
21832184
if (!client->itemdefReceived()) {
21842185
const wchar_t *text = wgettext("Item definitions...");
21852186
progress = 25;
2186-
draw_load_screen(text, device, guienv, dtime, progress);
2187+
draw_load_screen(text, device, guienv, texture_src,
2188+
dtime, progress);
21872189
delete[] text;
21882190
} else if (!client->nodedefReceived()) {
21892191
const wchar_t *text = wgettext("Node definitions...");
21902192
progress = 30;
2191-
draw_load_screen(text, device, guienv, dtime, progress);
2193+
draw_load_screen(text, device, guienv, texture_src,
2194+
dtime, progress);
21922195
delete[] text;
21932196
} else {
21942197
std::stringstream message;
@@ -2212,7 +2215,7 @@ bool Game::getServerContent(bool *aborted)
22122215

22132216
progress = 30 + client->mediaReceiveProgress() * 35 + 0.5;
22142217
draw_load_screen(utf8_to_wide(message.str()), device,
2215-
guienv, dtime, progress);
2218+
guienv, texture_src, dtime, progress);
22162219
}
22172220
}
22182221

@@ -4357,7 +4360,8 @@ inline void Game::limitFps(FpsControl *fps_timings, f32 *dtime)
43574360
void Game::showOverlayMessage(const wchar_t *msg, float dtime,
43584361
int percent, bool draw_clouds)
43594362
{
4360-
draw_load_screen(msg, device, guienv, dtime, percent, draw_clouds);
4363+
draw_load_screen(msg, device, guienv, texture_src, dtime, percent,
4364+
draw_clouds);
43614365
delete[] msg;
43624366
}
43634367

0 commit comments

Comments
 (0)
Please sign in to comment.