From 777ac58f85c74d2945886869e9b63b0f450ac3aa Mon Sep 17 00:00:00 2001 From: Kahrl Date: Sat, 27 Apr 2013 03:47:52 +0200 Subject: Predict wallmounted param2 during node placement prediction. Also clean up the_game a bit: move node placement prediction to a separate function. --- src/game.cpp | 112 ++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 68 insertions(+), 44 deletions(-) (limited to 'src/game.cpp') diff --git a/src/game.cpp b/src/game.cpp index 189003e4c..a5011b6ff 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -789,6 +789,65 @@ public: } }; +void nodePlacementPrediction(Client &client, + const ItemDefinition &playeritem_def, + v3s16 nodepos, v3s16 neighbourpos) +{ + std::string prediction = playeritem_def.node_placement_prediction; + INodeDefManager *nodedef = client.ndef(); + ClientMap &map = client.getEnv().getClientMap(); + + if(prediction != "" && !nodedef->get(map.getNode(nodepos)).rightclickable) + { + verbosestream<<"Node placement prediction for " + <get(n_under).buildable_to) + p = nodepos; + }catch(InvalidPositionException &e){} + // Find id of predicted node + content_t id; + bool found = nodedef->getId(prediction, id); + if(!found){ + errorstream<<"Node placement prediction failed for " + <get(id).param_type_2 == CPT2_WALLMOUNTED){ + v3s16 dir = nodepos - neighbourpos; + if(abs(dir.Y) > MYMAX(abs(dir.X), abs(dir.Z))){ + param2 = dir.Y < 0 ? 1 : 0; + } else if(abs(dir.X) > abs(dir.Z)){ + param2 = dir.X < 0 ? 3 : 2; + } else { + param2 = dir.Z < 0 ? 5 : 4; + } + } + // TODO: Facedir prediction + // TODO: If predicted node is in attached_node group, check attachment + // Add node to client map + MapNode n(id, 0, param2); + try{ + // This triggers the required mesh update too + client.addNode(p, n); + }catch(InvalidPositionException &e){ + errorstream<<"Node placement prediction failed for " + <getItem(client.getPlayerItem()); - playeritem_usable = playeritem.getDefinition(itemdef).usable; - playeritem_liquids_pointable = playeritem.getDefinition(itemdef).liquids_pointable; } } + const ItemDefinition &playeritem_def = + playeritem.getDefinition(itemdef); ToolCapabilities playeritem_toolcap = playeritem.getToolCapabilities(itemdef); @@ -2267,7 +2324,7 @@ void the_game( // input &client, player_position, camera_direction, camera_position, shootline, d, - playeritem_liquids_pointable, !ldown_for_dig, + playeritem_def.liquids_pointable, !ldown_for_dig, // output hilightboxes, selected_object); @@ -2327,7 +2384,7 @@ void the_game( else repeat_rightclick_timer = 0; - if(playeritem_usable && input->getLeftState()) + if(playeritem_def.usable && input->getLeftState()) { if(input->getLeftClicked()) client.interact(4, pointed); @@ -2534,46 +2591,13 @@ void the_game( // If the wielded item has node placement prediction, // make that happen - const ItemDefinition &def = - playeritem.getDefinition(itemdef); - if(def.node_placement_prediction != "" - && !nodedef->get(map.getNode(nodepos)).rightclickable) - do{ // breakable - verbosestream<<"Node placement prediction for " - <get(n_under).buildable_to) - p = nodepos; - }catch(InvalidPositionException &e){} - // Find id of predicted node - content_t id; - bool found = - nodedef->getId(def.node_placement_prediction, id); - if(!found){ - errorstream<<"Node placement prediction failed for " - < Date: Sat, 20 Apr 2013 17:01:02 -0400 Subject: Don't predict placement of nodes if they would replace a non buildable_to node --- src/game.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/game.cpp') diff --git a/src/game.cpp b/src/game.cpp index a5011b6ff..3fbfad801 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -808,6 +808,8 @@ void nodePlacementPrediction(Client &client, MapNode n_under = map.getNode(nodepos); if(nodedef->get(n_under).buildable_to) p = nodepos; + else if (!nodedef->get(map.getNode(p)).buildable_to) + return; }catch(InvalidPositionException &e){} // Find id of predicted node content_t id; -- cgit v1.2.3 From 0913287578504f89489df6e0573c28c7ac428805 Mon Sep 17 00:00:00 2001 From: Zeg9 Date: Wed, 8 May 2013 15:03:42 +0200 Subject: Add progress bar and clouds to loading screen --- src/game.cpp | 87 +++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 69 insertions(+), 18 deletions(-) (limited to 'src/game.cpp') diff --git a/src/game.cpp b/src/game.cpp index 3fbfad801..61e4963c0 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -395,11 +395,15 @@ PointedThing getPointedThing(Client *client, v3f player_position, /* Draws a screen with a single text on it. Text will be removed when the screen is drawn the next time. + Additionally, a progressbar can be drawn when percent is set between 0 and 100. + With drawsmgr, you can for example draw clouds */ /*gui::IGUIStaticText **/ void draw_load_screen(const std::wstring &text, - video::IVideoDriver* driver, gui::IGUIFont* font) + IrrlichtDevice* device, gui::IGUIFont* font, + int percent=-1, bool drawsmgr=false) { + video::IVideoDriver* driver = device->getVideoDriver(); v2u32 screensize = driver->getScreenSize(); const wchar_t *loadingtext = text.c_str(); core::vector2d textsize_u = font->getDimension(loadingtext); @@ -411,7 +415,28 @@ void draw_load_screen(const std::wstring &text, loadingtext, textrect, false, false); guitext->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT); - driver->beginScene(true, true, video::SColor(255,0,0,0)); + if (drawsmgr) + { + driver->beginScene(true, true, video::SColor(255,140,186,250)); + scene::ISceneManager* smgr = device->getSceneManager(); + smgr->drawAll(); + } + else + driver->beginScene(true, true, video::SColor(255,0,0,0)); + if (percent >= 0 && percent <= 100) // draw progress bar + { + core::vector2d barsize(256,32); + core::rect barrect(center-barsize/2, center+barsize/2); + driver->draw2DRectangle(video::SColor(255,255,255,255),barrect, NULL); // border + driver->draw2DRectangle(video::SColor(255,0,0,0), core::rect ( + barrect.UpperLeftCorner+1, + barrect.LowerRightCorner-1), NULL); // black inside the bar + driver->draw2DRectangle(video::SColor(255,128,128,128), core::rect ( + barrect.UpperLeftCorner+1, + core::vector2d( + barrect.LowerRightCorner.X-(barsize.X-1)+percent*(barsize.X-2)/100, + barrect.LowerRightCorner.Y-1)), NULL); // the actual progress + } guienv->drawAll(); driver->endScene(); @@ -882,7 +907,7 @@ void the_game( Draw "Loading" screen */ - draw_load_screen(L"Loading...", driver, font); + draw_load_screen(L"Loading...", device, font); // Create texture source IWritableTextureSource *tsrc = createTextureSource(device); @@ -939,7 +964,7 @@ void the_game( */ if(address == ""){ - draw_load_screen(L"Creating server...", driver, font); + draw_load_screen(L"Creating server...", device, font); infostream<<"Creating server"<clear(); + + scene::ISceneManager* smgr = device->getSceneManager(); + Clouds *clouds = 0; + if (g_settings->getBool("menu_clouds")) + { + // add clouds + clouds = new Clouds(smgr->getRootSceneNode(), + smgr, -1, rand(), 100); + clouds->update(v2f(0, 0), video::SColor(255,200,200,255)); + + // A camera to see the clouds + scene::ICameraSceneNode* camera; + camera = smgr->addCameraSceneNode(0, + v3f(0,0,0), v3f(0, 60, 100)); + camera->setFarValue(10000); + } + while(device->run()) { // Update client and server @@ -1087,21 +1129,30 @@ void the_game( // Display status std::wostringstream ss; - ss<step(frametime*3); + clouds->render(); + } + + draw_load_screen(ss.str(), device, font, client.mediaReceiveProgress()*100+0.5, clouds!=0); // Delay a bit sleep_ms(1000*frametime); time_counter += frametime; } + if (clouds != 0) + { + smgr->addToDeletionQueue(clouds); + clouds->drop(); + } } if(!got_content){ @@ -3227,7 +3278,7 @@ void the_game( */ { /*gui::IGUIStaticText *gui_shuttingdowntext = */ - draw_load_screen(L"Shutting down stuff...", driver, font); + draw_load_screen(L"Shutting down stuff...", device, font); /*driver->beginScene(true, true, video::SColor(255,0,0,0)); guienv->drawAll(); driver->endScene(); -- cgit v1.2.3 From 81c863ac4df1530123ef7952713623dadb049bec Mon Sep 17 00:00:00 2001 From: Zeg9 Date: Thu, 9 May 2013 18:23:48 +0200 Subject: Add clouds to all loading screens and better progress handling --- src/game.cpp | 188 ++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 127 insertions(+), 61 deletions(-) (limited to 'src/game.cpp') diff --git a/src/game.cpp b/src/game.cpp index 61e4963c0..81f35d4c0 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -396,12 +396,11 @@ PointedThing getPointedThing(Client *client, v3f player_position, Draws a screen with a single text on it. Text will be removed when the screen is drawn the next time. Additionally, a progressbar can be drawn when percent is set between 0 and 100. - With drawsmgr, you can for example draw clouds */ /*gui::IGUIStaticText **/ void draw_load_screen(const std::wstring &text, IrrlichtDevice* device, gui::IGUIFont* font, - int percent=-1, bool drawsmgr=false) + float dtime=0 ,int percent=0, bool clouds=true) { video::IVideoDriver* driver = device->getVideoDriver(); v2u32 screensize = driver->getScreenSize(); @@ -415,11 +414,13 @@ void draw_load_screen(const std::wstring &text, loadingtext, textrect, false, false); guitext->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT); - if (drawsmgr) + bool cloud_menu_background = clouds && g_settings->getBool("menu_clouds"); + if (cloud_menu_background) { + g_menuclouds->step(dtime*3); + g_menuclouds->render(); driver->beginScene(true, true, video::SColor(255,140,186,250)); - scene::ISceneManager* smgr = device->getSceneManager(); - smgr->drawAll(); + g_menucloudsmgr->drawAll(); } else driver->beginScene(true, true, video::SColor(255,0,0,0)); @@ -428,7 +429,7 @@ void draw_load_screen(const std::wstring &text, core::vector2d barsize(256,32); core::rect barrect(center-barsize/2, center+barsize/2); driver->draw2DRectangle(video::SColor(255,255,255,255),barrect, NULL); // border - driver->draw2DRectangle(video::SColor(255,0,0,0), core::rect ( + driver->draw2DRectangle(video::SColor(255,64,64,64), core::rect ( barrect.UpperLeftCorner+1, barrect.LowerRightCorner-1), NULL); // black inside the bar driver->draw2DRectangle(video::SColor(255,128,128,128), core::rect ( @@ -907,7 +908,11 @@ void the_game( Draw "Loading" screen */ - draw_load_screen(L"Loading...", device, font); + { + wchar_t* text = wgettext("Loading..."); + draw_load_screen(text, device, font,0,0); + delete[] text; + } // Create texture source IWritableTextureSource *tsrc = createTextureSource(device); @@ -964,7 +969,9 @@ void the_game( */ if(address == ""){ - draw_load_screen(L"Creating server...", device, font); + wchar_t* text = wgettext("Creating server...."); + draw_load_screen(text, device, font,0,25); + delete[] text; infostream<<"Creating server"<clear(); + float fps_max = g_settings->getFloat("fps_max"); + bool cloud_menu_background = g_settings->getBool("menu_clouds"); + u32 lasttime = device->getTimer()->getTime(); while(device->run()) { + f32 dtime=0; // in seconds + if (cloud_menu_background) { + u32 time = device->getTimer()->getTime(); + if(time > lasttime) + dtime = (time - lasttime) / 1000.0; + else + dtime = 0; + lasttime = time; + } // Update client and server - client.step(frametime); + client.step(dtime); if(server != NULL) - server->step(frametime); + server->step(dtime); // End condition if(client.connectedAndInitialized()){ @@ -1049,15 +1075,37 @@ void the_game( } // Display status - std::wostringstream ss; - ss<getTimer()->getTime(); + if(time > lasttime) + busytime_u32 = time - lasttime; + else + busytime_u32 = 0; + busytime = busytime_u32 / 1000.0; + + // FPS limiter + u32 frametime_min = 1000./fps_max; + + if(busytime_u32 < frametime_min) { + u32 sleeptime = frametime_min - busytime_u32; + device->sleep(sleeptime); + } + } else { + sleep_ms(25); + } + time_counter += dtime; } } catch(con::PeerNotFoundException &e) @@ -1081,32 +1129,26 @@ void the_game( bool got_content = false; bool content_aborted = false; { - float frametime = 0.033; float time_counter = 0.0; input->clear(); - - scene::ISceneManager* smgr = device->getSceneManager(); - Clouds *clouds = 0; - if (g_settings->getBool("menu_clouds")) - { - // add clouds - clouds = new Clouds(smgr->getRootSceneNode(), - smgr, -1, rand(), 100); - clouds->update(v2f(0, 0), video::SColor(255,200,200,255)); - - // A camera to see the clouds - scene::ICameraSceneNode* camera; - camera = smgr->addCameraSceneNode(0, - v3f(0,0,0), v3f(0, 60, 100)); - camera->setFarValue(10000); - } - + float fps_max = g_settings->getFloat("fps_max"); + bool cloud_menu_background = g_settings->getBool("menu_clouds"); + u32 lasttime = device->getTimer()->getTime(); while(device->run()) { + f32 dtime=0; // in seconds + if (cloud_menu_background) { + u32 time = device->getTimer()->getTime(); + if(time > lasttime) + dtime = (time - lasttime) / 1000.0; + else + dtime = 0; + lasttime = time; + } // Update client and server - client.step(frametime); + client.step(dtime); if(server != NULL) - server->step(frametime); + server->step(dtime); // End condition if(client.texturesReceived() && @@ -1128,30 +1170,52 @@ void the_game( } // Display status - std::wostringstream ss; + std::ostringstream ss; + int progress=0; if (!client.itemdefReceived()) - ss << L"Item definitions..."; + { + ss << "Item definitions..."; + progress = 0; + } else if (!client.nodedefReceived()) - ss << L"Node definitions..."; + { + ss << "Node definitions..."; + progress = 25; + } else - ss << L"Media (" << (int)(client.mediaReceiveProgress()*100+0.5) << L"%)..."; - - if (clouds != 0) { - clouds->step(frametime*3); - clouds->render(); + ss << "Media..."; + progress = 50+client.mediaReceiveProgress()*50+0.5; } + wchar_t* text = wgettext(ss.str().c_str()); + draw_load_screen(text, device, font, dtime, progress); + delete[] text; - draw_load_screen(ss.str(), device, font, client.mediaReceiveProgress()*100+0.5, clouds!=0); - - // Delay a bit - sleep_ms(1000*frametime); - time_counter += frametime; - } - if (clouds != 0) - { - smgr->addToDeletionQueue(clouds); - clouds->drop(); + // On some computers framerate doesn't seem to be + // automatically limited + if (cloud_menu_background) { + // Time of frame without fps limit + float busytime; + u32 busytime_u32; + // not using getRealTime is necessary for wine + u32 time = device->getTimer()->getTime(); + if(time > lasttime) + busytime_u32 = time - lasttime; + else + busytime_u32 = 0; + busytime = busytime_u32 / 1000.0; + + // FPS limiter + u32 frametime_min = 1000./fps_max; + + if(busytime_u32 < frametime_min) { + u32 sleeptime = frametime_min - busytime_u32; + device->sleep(sleeptime); + } + } else { + sleep_ms(25); + } + time_counter += dtime; } } @@ -3278,7 +3342,9 @@ void the_game( */ { /*gui::IGUIStaticText *gui_shuttingdowntext = */ - draw_load_screen(L"Shutting down stuff...", device, font); + wchar_t* text = wgettext("Shutting down stuff..."); + draw_load_screen(text, device, font, 0, -1, false); + delete[] text; /*driver->beginScene(true, true, video::SColor(255,0,0,0)); guienv->drawAll(); driver->endScene(); -- cgit v1.2.3 From 782d06be460e81c9fe4760c78003ac6522676e82 Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Fri, 10 May 2013 19:12:02 +0200 Subject: Fix memory leak by dropping sky --- src/game.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/game.cpp') diff --git a/src/game.cpp b/src/game.cpp index 81f35d4c0..16d550776 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3334,6 +3334,8 @@ void the_game( clouds->drop(); if (gui_chat_console) gui_chat_console->drop(); + if (sky) + sky->drop(); clear_particles(); /* -- cgit v1.2.3 From bda62bd3bf7f41a25f2c6294ddc0ec144081e3ef Mon Sep 17 00:00:00 2001 From: Zeg9 Date: Sat, 11 May 2013 16:02:41 +0200 Subject: Add progress bar to item visuals preloading --- src/game.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/game.cpp') 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 -- cgit v1.2.3 From 822723c2468ea763cdef447218059a5586e8e033 Mon Sep 17 00:00:00 2001 From: "Esteban I. Ruiz Moreno" Date: Sun, 14 Apr 2013 14:53:00 -0300 Subject: Add mouse_sensitivity option --- src/game.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/game.cpp') diff --git a/src/game.cpp b/src/game.cpp index 23e794de2..f63a4a400 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2061,7 +2061,8 @@ void the_game( if(input->isKeyDown(irr::KEY_RIGHT)) dx += dtime * keyspeed;*/ - float d = 0.2; + float d = g_settings->getFloat("mouse_sensitivity"); + d = rangelim(d, 0.01, 100.0); camera_yaw -= dx*d; camera_pitch += dy*d; if(camera_pitch < -89.5) camera_pitch = -89.5; -- cgit v1.2.3