Skip to content

Commit 81c863a

Browse files
Zeg9PilzAdam
authored andcommittedMay 10, 2013
Add clouds to all loading screens and better progress handling
1 parent d859ad7 commit 81c863a

File tree

3 files changed

+161
-79
lines changed

3 files changed

+161
-79
lines changed
 

‎src/game.cpp

+127-61
Original file line numberDiff line numberDiff line change
@@ -396,12 +396,11 @@ PointedThing getPointedThing(Client *client, v3f player_position,
396396
Draws a screen with a single text on it.
397397
Text will be removed when the screen is drawn the next time.
398398
Additionally, a progressbar can be drawn when percent is set between 0 and 100.
399-
With drawsmgr, you can for example draw clouds
400399
*/
401400
/*gui::IGUIStaticText **/
402401
void draw_load_screen(const std::wstring &text,
403402
IrrlichtDevice* device, gui::IGUIFont* font,
404-
int percent=-1, bool drawsmgr=false)
403+
float dtime=0 ,int percent=0, bool clouds=true)
405404
{
406405
video::IVideoDriver* driver = device->getVideoDriver();
407406
v2u32 screensize = driver->getScreenSize();
@@ -415,11 +414,13 @@ void draw_load_screen(const std::wstring &text,
415414
loadingtext, textrect, false, false);
416415
guitext->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
417416

418-
if (drawsmgr)
417+
bool cloud_menu_background = clouds && g_settings->getBool("menu_clouds");
418+
if (cloud_menu_background)
419419
{
420+
g_menuclouds->step(dtime*3);
421+
g_menuclouds->render();
420422
driver->beginScene(true, true, video::SColor(255,140,186,250));
421-
scene::ISceneManager* smgr = device->getSceneManager();
422-
smgr->drawAll();
423+
g_menucloudsmgr->drawAll();
423424
}
424425
else
425426
driver->beginScene(true, true, video::SColor(255,0,0,0));
@@ -428,7 +429,7 @@ void draw_load_screen(const std::wstring &text,
428429
core::vector2d<s32> barsize(256,32);
429430
core::rect<s32> barrect(center-barsize/2, center+barsize/2);
430431
driver->draw2DRectangle(video::SColor(255,255,255,255),barrect, NULL); // border
431-
driver->draw2DRectangle(video::SColor(255,0,0,0), core::rect<s32> (
432+
driver->draw2DRectangle(video::SColor(255,64,64,64), core::rect<s32> (
432433
barrect.UpperLeftCorner+1,
433434
barrect.LowerRightCorner-1), NULL); // black inside the bar
434435
driver->draw2DRectangle(video::SColor(255,128,128,128), core::rect<s32> (
@@ -907,7 +908,11 @@ void the_game(
907908
Draw "Loading" screen
908909
*/
909910

910-
draw_load_screen(L"Loading...", device, font);
911+
{
912+
wchar_t* text = wgettext("Loading...");
913+
draw_load_screen(text, device, font,0,0);
914+
delete[] text;
915+
}
911916

912917
// Create texture source
913918
IWritableTextureSource *tsrc = createTextureSource(device);
@@ -964,7 +969,9 @@ void the_game(
964969
*/
965970

966971
if(address == ""){
967-
draw_load_screen(L"Creating server...", device, font);
972+
wchar_t* text = wgettext("Creating server....");
973+
draw_load_screen(text, device, font,0,25);
974+
delete[] text;
968975
infostream<<"Creating server"<<std::endl;
969976
server = new Server(map_dir, configpath, gamespec,
970977
simple_singleplayer_mode);
@@ -977,7 +984,11 @@ void the_game(
977984
Create client
978985
*/
979986

980-
draw_load_screen(L"Creating client...", device, font);
987+
{
988+
wchar_t* text = wgettext("Creating client...");
989+
draw_load_screen(text, device, font,0,50);
990+
delete[] text;
991+
}
981992
infostream<<"Creating client"<<std::endl;
982993

983994
MapDrawControl draw_control;
@@ -987,8 +998,12 @@ void the_game(
987998

988999
// Client acts as our GameDef
9891000
IGameDef *gamedef = &client;
990-
991-
draw_load_screen(L"Resolving address...", device, font);
1001+
1002+
{
1003+
wchar_t* text = wgettext("Resolving address...");
1004+
draw_load_screen(text, device, font,0,75);
1005+
delete[] text;
1006+
}
9921007
Address connect_address(0,0,0,0, port);
9931008
try{
9941009
if(address == "")
@@ -1020,15 +1035,26 @@ void the_game(
10201035
bool could_connect = false;
10211036
bool connect_aborted = false;
10221037
try{
1023-
float frametime = 0.033;
10241038
float time_counter = 0.0;
10251039
input->clear();
1040+
float fps_max = g_settings->getFloat("fps_max");
1041+
bool cloud_menu_background = g_settings->getBool("menu_clouds");
1042+
u32 lasttime = device->getTimer()->getTime();
10261043
while(device->run())
10271044
{
1045+
f32 dtime=0; // in seconds
1046+
if (cloud_menu_background) {
1047+
u32 time = device->getTimer()->getTime();
1048+
if(time > lasttime)
1049+
dtime = (time - lasttime) / 1000.0;
1050+
else
1051+
dtime = 0;
1052+
lasttime = time;
1053+
}
10281054
// Update client and server
1029-
client.step(frametime);
1055+
client.step(dtime);
10301056
if(server != NULL)
1031-
server->step(frametime);
1057+
server->step(dtime);
10321058

10331059
// End condition
10341060
if(client.connectedAndInitialized()){
@@ -1049,15 +1075,37 @@ void the_game(
10491075
}
10501076

10511077
// Display status
1052-
std::wostringstream ss;
1053-
ss<<L"Connecting to server... (press Escape to cancel)\n";
1054-
std::wstring animation = L"/-\\|";
1055-
ss<<animation[(int)(time_counter/0.2)%4];
1056-
draw_load_screen(ss.str(), device, font);
1078+
{
1079+
wchar_t* text = wgettext("Connecting to server...");
1080+
draw_load_screen(text, device, font, dtime, 100);
1081+
delete[] text;
1082+
}
10571083

1058-
// Delay a bit
1059-
sleep_ms(1000*frametime);
1060-
time_counter += frametime;
1084+
// On some computers framerate doesn't seem to be
1085+
// automatically limited
1086+
if (cloud_menu_background) {
1087+
// Time of frame without fps limit
1088+
float busytime;
1089+
u32 busytime_u32;
1090+
// not using getRealTime is necessary for wine
1091+
u32 time = device->getTimer()->getTime();
1092+
if(time > lasttime)
1093+
busytime_u32 = time - lasttime;
1094+
else
1095+
busytime_u32 = 0;
1096+
busytime = busytime_u32 / 1000.0;
1097+
1098+
// FPS limiter
1099+
u32 frametime_min = 1000./fps_max;
1100+
1101+
if(busytime_u32 < frametime_min) {
1102+
u32 sleeptime = frametime_min - busytime_u32;
1103+
device->sleep(sleeptime);
1104+
}
1105+
} else {
1106+
sleep_ms(25);
1107+
}
1108+
time_counter += dtime;
10611109
}
10621110
}
10631111
catch(con::PeerNotFoundException &e)
@@ -1081,32 +1129,26 @@ void the_game(
10811129
bool got_content = false;
10821130
bool content_aborted = false;
10831131
{
1084-
float frametime = 0.033;
10851132
float time_counter = 0.0;
10861133
input->clear();
1087-
1088-
scene::ISceneManager* smgr = device->getSceneManager();
1089-
Clouds *clouds = 0;
1090-
if (g_settings->getBool("menu_clouds"))
1091-
{
1092-
// add clouds
1093-
clouds = new Clouds(smgr->getRootSceneNode(),
1094-
smgr, -1, rand(), 100);
1095-
clouds->update(v2f(0, 0), video::SColor(255,200,200,255));
1096-
1097-
// A camera to see the clouds
1098-
scene::ICameraSceneNode* camera;
1099-
camera = smgr->addCameraSceneNode(0,
1100-
v3f(0,0,0), v3f(0, 60, 100));
1101-
camera->setFarValue(10000);
1102-
}
1103-
1134+
float fps_max = g_settings->getFloat("fps_max");
1135+
bool cloud_menu_background = g_settings->getBool("menu_clouds");
1136+
u32 lasttime = device->getTimer()->getTime();
11041137
while(device->run())
11051138
{
1139+
f32 dtime=0; // in seconds
1140+
if (cloud_menu_background) {
1141+
u32 time = device->getTimer()->getTime();
1142+
if(time > lasttime)
1143+
dtime = (time - lasttime) / 1000.0;
1144+
else
1145+
dtime = 0;
1146+
lasttime = time;
1147+
}
11061148
// Update client and server
1107-
client.step(frametime);
1149+
client.step(dtime);
11081150
if(server != NULL)
1109-
server->step(frametime);
1151+
server->step(dtime);
11101152

11111153
// End condition
11121154
if(client.texturesReceived() &&
@@ -1128,30 +1170,52 @@ void the_game(
11281170
}
11291171

11301172
// Display status
1131-
std::wostringstream ss;
1173+
std::ostringstream ss;
1174+
int progress=0;
11321175
if (!client.itemdefReceived())
1133-
ss << L"Item definitions...";
1176+
{
1177+
ss << "Item definitions...";
1178+
progress = 0;
1179+
}
11341180
else if (!client.nodedefReceived())
1135-
ss << L"Node definitions...";
1181+
{
1182+
ss << "Node definitions...";
1183+
progress = 25;
1184+
}
11361185
else
1137-
ss << L"Media (" << (int)(client.mediaReceiveProgress()*100+0.5) << L"%)...";
1138-
1139-
if (clouds != 0)
11401186
{
1141-
clouds->step(frametime*3);
1142-
clouds->render();
1187+
ss << "Media...";
1188+
progress = 50+client.mediaReceiveProgress()*50+0.5;
11431189
}
1190+
wchar_t* text = wgettext(ss.str().c_str());
1191+
draw_load_screen(text, device, font, dtime, progress);
1192+
delete[] text;
11441193

1145-
draw_load_screen(ss.str(), device, font, client.mediaReceiveProgress()*100+0.5, clouds!=0);
1146-
1147-
// Delay a bit
1148-
sleep_ms(1000*frametime);
1149-
time_counter += frametime;
1150-
}
1151-
if (clouds != 0)
1152-
{
1153-
smgr->addToDeletionQueue(clouds);
1154-
clouds->drop();
1194+
// On some computers framerate doesn't seem to be
1195+
// automatically limited
1196+
if (cloud_menu_background) {
1197+
// Time of frame without fps limit
1198+
float busytime;
1199+
u32 busytime_u32;
1200+
// not using getRealTime is necessary for wine
1201+
u32 time = device->getTimer()->getTime();
1202+
if(time > lasttime)
1203+
busytime_u32 = time - lasttime;
1204+
else
1205+
busytime_u32 = 0;
1206+
busytime = busytime_u32 / 1000.0;
1207+
1208+
// FPS limiter
1209+
u32 frametime_min = 1000./fps_max;
1210+
1211+
if(busytime_u32 < frametime_min) {
1212+
u32 sleeptime = frametime_min - busytime_u32;
1213+
device->sleep(sleeptime);
1214+
}
1215+
} else {
1216+
sleep_ms(25);
1217+
}
1218+
time_counter += dtime;
11551219
}
11561220
}
11571221

@@ -3278,7 +3342,9 @@ void the_game(
32783342
*/
32793343
{
32803344
/*gui::IGUIStaticText *gui_shuttingdowntext = */
3281-
draw_load_screen(L"Shutting down stuff...", device, font);
3345+
wchar_t* text = wgettext("Shutting down stuff...");
3346+
draw_load_screen(text, device, font, 0, -1, false);
3347+
delete[] text;
32823348
/*driver->beginScene(true, true, video::SColor(255,0,0,0));
32833349
guienv->drawAll();
32843350
driver->endScene();

‎src/main.cpp

+26-18
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ Settings *g_settings = &main_settings;
8888
Profiler main_profiler;
8989
Profiler *g_profiler = &main_profiler;
9090

91+
// Menu clouds are created later
92+
Clouds *g_menuclouds = 0;
93+
irr::scene::ISceneManager *g_menucloudsmgr = 0;
94+
9195
/*
9296
Debug streams
9397
*/
@@ -1569,6 +1573,19 @@ int main(int argc, char *argv[])
15691573
skin->setColor(gui::EGDC_FOCUSED_EDITABLE, video::SColor(255,96,134,49));
15701574
#endif
15711575

1576+
1577+
// Create the menu clouds
1578+
if (!g_menucloudsmgr)
1579+
g_menucloudsmgr = smgr->createNewSceneManager();
1580+
if (!g_menuclouds)
1581+
g_menuclouds = new Clouds(g_menucloudsmgr->getRootSceneNode(),
1582+
g_menucloudsmgr, -1, rand(), 100);
1583+
g_menuclouds->update(v2f(0, 0), video::SColor(255,200,200,255));
1584+
scene::ICameraSceneNode* camera;
1585+
camera = g_menucloudsmgr->addCameraSceneNode(0,
1586+
v3f(0,0,0), v3f(0, 60, 100));
1587+
camera->setFarValue(10000);
1588+
15721589
/*
15731590
GUI stuff
15741591
*/
@@ -1744,18 +1761,6 @@ int main(int argc, char *argv[])
17441761
&g_menumgr, &menudata, g_gamecallback);
17451762
menu->allowFocusRemoval(true);
17461763

1747-
// Always create clouds because they may or may not be
1748-
// needed based on the game selected
1749-
Clouds *clouds = new Clouds(smgr->getRootSceneNode(),
1750-
smgr, -1, rand(), 100);
1751-
clouds->update(v2f(0, 0), video::SColor(255,200,200,255));
1752-
1753-
// A camera to see the clouds
1754-
scene::ICameraSceneNode* camera;
1755-
camera = smgr->addCameraSceneNode(0,
1756-
v3f(0,0,0), v3f(0, 60, 100));
1757-
camera->setFarValue(10000);
1758-
17591764
if(error_message != L"")
17601765
{
17611766
verbosestream<<"error_message = "
@@ -1796,7 +1801,7 @@ int main(int argc, char *argv[])
17961801
}
17971802

17981803
// Time calc for the clouds
1799-
f32 dtime; // in seconds
1804+
f32 dtime=0; // in seconds
18001805
if (cloud_menu_background) {
18011806
u32 time = device->getTimer()->getTime();
18021807
if(time > lasttime)
@@ -1811,9 +1816,9 @@ int main(int argc, char *argv[])
18111816

18121817
if (cloud_menu_background) {
18131818
// *3 otherwise the clouds would move very slowly
1814-
clouds->step(dtime*3);
1815-
clouds->render();
1816-
smgr->drawAll();
1819+
g_menuclouds->step(dtime*3);
1820+
g_menuclouds->render();
1821+
g_menucloudsmgr->drawAll();
18171822
drawMenuOverlay(driver, menutextures);
18181823
drawMenuHeader(driver, menutextures);
18191824
drawMenuFooter(driver, menutextures);
@@ -1856,8 +1861,6 @@ int main(int argc, char *argv[])
18561861
infostream<<"Dropping main menu"<<std::endl;
18571862

18581863
menu->drop();
1859-
clouds->drop();
1860-
smgr->clear();
18611864
}
18621865

18631866
playername = wide_to_narrow(menudata.name);
@@ -2018,6 +2021,7 @@ int main(int argc, char *argv[])
20182021
gamespec,
20192022
simple_singleplayer_mode
20202023
);
2024+
smgr->clear();
20212025

20222026
} //try
20232027
catch(con::PeerNotFoundException &e)
@@ -2048,6 +2052,10 @@ int main(int argc, char *argv[])
20482052
}
20492053
} // Menu-game loop
20502054

2055+
2056+
g_menuclouds->drop();
2057+
g_menucloudsmgr->drop();
2058+
20512059
delete input;
20522060

20532061
/*

‎src/main.h

+8
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ extern Settings *g_settings;
2828
class Profiler;
2929
extern Profiler *g_profiler;
3030

31+
// Menu clouds
32+
class Clouds;
33+
extern Clouds *g_menuclouds;
34+
35+
// Scene manager used for menu clouds
36+
namespace irr{namespace scene{class ISceneManager;}}
37+
extern irr::scene::ISceneManager *g_menucloudsmgr;
38+
3139
// Debug streams
3240

3341
#include <fstream>

0 commit comments

Comments
 (0)
Please sign in to comment.