@@ -396,12 +396,11 @@ PointedThing getPointedThing(Client *client, v3f player_position,
396
396
Draws a screen with a single text on it.
397
397
Text will be removed when the screen is drawn the next time.
398
398
Additionally, a progressbar can be drawn when percent is set between 0 and 100.
399
- With drawsmgr, you can for example draw clouds
400
399
*/
401
400
/* gui::IGUIStaticText **/
402
401
void draw_load_screen (const std::wstring &text,
403
402
IrrlichtDevice* device, gui::IGUIFont* font,
404
- int percent=- 1 , bool drawsmgr= false )
403
+ float dtime= 0 , int percent=0 , bool clouds= true )
405
404
{
406
405
video::IVideoDriver* driver = device->getVideoDriver ();
407
406
v2u32 screensize = driver->getScreenSize ();
@@ -415,11 +414,13 @@ void draw_load_screen(const std::wstring &text,
415
414
loadingtext, textrect, false , false );
416
415
guitext->setTextAlignment (gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
417
416
418
- if (drawsmgr)
417
+ bool cloud_menu_background = clouds && g_settings->getBool (" menu_clouds" );
418
+ if (cloud_menu_background)
419
419
{
420
+ g_menuclouds->step (dtime*3 );
421
+ g_menuclouds->render ();
420
422
driver->beginScene (true , true , video::SColor (255 ,140 ,186 ,250 ));
421
- scene::ISceneManager* smgr = device->getSceneManager ();
422
- smgr->drawAll ();
423
+ g_menucloudsmgr->drawAll ();
423
424
}
424
425
else
425
426
driver->beginScene (true , true , video::SColor (255 ,0 ,0 ,0 ));
@@ -428,7 +429,7 @@ void draw_load_screen(const std::wstring &text,
428
429
core::vector2d<s32> barsize (256 ,32 );
429
430
core::rect<s32> barrect (center-barsize/2 , center+barsize/2 );
430
431
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> (
432
433
barrect.UpperLeftCorner +1 ,
433
434
barrect.LowerRightCorner -1 ), NULL ); // black inside the bar
434
435
driver->draw2DRectangle (video::SColor (255 ,128 ,128 ,128 ), core::rect<s32> (
@@ -907,7 +908,11 @@ void the_game(
907
908
Draw "Loading" screen
908
909
*/
909
910
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
+ }
911
916
912
917
// Create texture source
913
918
IWritableTextureSource *tsrc = createTextureSource (device);
@@ -964,7 +969,9 @@ void the_game(
964
969
*/
965
970
966
971
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;
968
975
infostream<<" Creating server" <<std::endl;
969
976
server = new Server (map_dir, configpath, gamespec,
970
977
simple_singleplayer_mode);
@@ -977,7 +984,11 @@ void the_game(
977
984
Create client
978
985
*/
979
986
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
+ }
981
992
infostream<<" Creating client" <<std::endl;
982
993
983
994
MapDrawControl draw_control;
@@ -987,8 +998,12 @@ void the_game(
987
998
988
999
// Client acts as our GameDef
989
1000
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
+ }
992
1007
Address connect_address (0 ,0 ,0 ,0 , port);
993
1008
try {
994
1009
if (address == " " )
@@ -1020,15 +1035,26 @@ void the_game(
1020
1035
bool could_connect = false ;
1021
1036
bool connect_aborted = false ;
1022
1037
try {
1023
- float frametime = 0.033 ;
1024
1038
float time_counter = 0.0 ;
1025
1039
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 ();
1026
1043
while (device->run ())
1027
1044
{
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
+ }
1028
1054
// Update client and server
1029
- client.step (frametime );
1055
+ client.step (dtime );
1030
1056
if (server != NULL )
1031
- server->step (frametime );
1057
+ server->step (dtime );
1032
1058
1033
1059
// End condition
1034
1060
if (client.connectedAndInitialized ()){
@@ -1049,15 +1075,37 @@ void the_game(
1049
1075
}
1050
1076
1051
1077
// 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
+ }
1057
1083
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;
1061
1109
}
1062
1110
}
1063
1111
catch (con::PeerNotFoundException &e)
@@ -1081,32 +1129,26 @@ void the_game(
1081
1129
bool got_content = false ;
1082
1130
bool content_aborted = false ;
1083
1131
{
1084
- float frametime = 0.033 ;
1085
1132
float time_counter = 0.0 ;
1086
1133
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 ();
1104
1137
while (device->run ())
1105
1138
{
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
+ }
1106
1148
// Update client and server
1107
- client.step (frametime );
1149
+ client.step (dtime );
1108
1150
if (server != NULL )
1109
- server->step (frametime );
1151
+ server->step (dtime );
1110
1152
1111
1153
// End condition
1112
1154
if (client.texturesReceived () &&
@@ -1128,30 +1170,52 @@ void the_game(
1128
1170
}
1129
1171
1130
1172
// Display status
1131
- std::wostringstream ss;
1173
+ std::ostringstream ss;
1174
+ int progress=0 ;
1132
1175
if (!client.itemdefReceived ())
1133
- ss << L" Item definitions..." ;
1176
+ {
1177
+ ss << " Item definitions..." ;
1178
+ progress = 0 ;
1179
+ }
1134
1180
else if (!client.nodedefReceived ())
1135
- ss << L" Node definitions..." ;
1181
+ {
1182
+ ss << " Node definitions..." ;
1183
+ progress = 25 ;
1184
+ }
1136
1185
else
1137
- ss << L" Media (" << (int )(client.mediaReceiveProgress ()*100 +0.5 ) << L" %)..." ;
1138
-
1139
- if (clouds != 0 )
1140
1186
{
1141
- clouds-> step (frametime* 3 );
1142
- clouds-> render () ;
1187
+ ss << " Media... " ;
1188
+ progress = 50 +client. mediaReceiveProgress ()* 50 + 0.5 ;
1143
1189
}
1190
+ wchar_t * text = wgettext (ss.str ().c_str ());
1191
+ draw_load_screen (text, device, font, dtime, progress);
1192
+ delete[] text;
1144
1193
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;
1155
1219
}
1156
1220
}
1157
1221
@@ -3278,7 +3342,9 @@ void the_game(
3278
3342
*/
3279
3343
{
3280
3344
/* 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;
3282
3348
/* driver->beginScene(true, true, video::SColor(255,0,0,0));
3283
3349
guienv->drawAll();
3284
3350
driver->endScene();
0 commit comments