Fixed viewing range stuff a bit (now it works better with very low ranges)

This commit is contained in:
Perttu Ahola 2011-05-06 16:58:06 +03:00
parent 59c4a342a9
commit 1a6e1e142f
2 changed files with 44 additions and 16 deletions

@ -181,8 +181,15 @@ void updateViewingRange(f32 frametime_in, Client *client)
float range_min = g_settings.getS16("viewing_range_nodes_min"); float range_min = g_settings.getS16("viewing_range_nodes_min");
float range_max = g_settings.getS16("viewing_range_nodes_max"); float range_max = g_settings.getS16("viewing_range_nodes_max");
// Limit minimum to keep the feedback loop stable
if(range_min < 5)
range_min = 5;
draw_control.wanted_min_range = range_min; draw_control.wanted_min_range = range_min;
draw_control.wanted_max_blocks = (1.2*draw_control.blocks_drawn)+1; //draw_control.wanted_max_blocks = (1.5*draw_control.blocks_drawn)+1;
draw_control.wanted_max_blocks = (1.5*draw_control.blocks_would_have_drawn)+1;
if(draw_control.wanted_max_blocks < 10)
draw_control.wanted_max_blocks = 10;
float block_draw_ratio = 1.0; float block_draw_ratio = 1.0;
if(draw_control.blocks_would_have_drawn != 0) if(draw_control.blocks_would_have_drawn != 0)
@ -261,18 +268,15 @@ void updateViewingRange(f32 frametime_in, Client *client)
} }
new_range += wanted_range_change; new_range += wanted_range_change;
//dstream<<"new_range="<<new_range/*<<std::endl*/;
//float new_range_unclamped = new_range; float new_range_unclamped = new_range;
if(new_range < range_min) if(new_range < range_min)
new_range = range_min; new_range = range_min;
if(new_range > range_max) if(new_range > range_max)
new_range = range_max; new_range = range_max;
/*if(new_range != new_range_unclamped) dstream<<"new_range="<<new_range_unclamped
dstream<<", clamped to "<<new_range<<std::endl; <<", clamped to "<<new_range<<std::endl;
else
dstream<<std::endl;*/
draw_control.wanted_range = new_range; draw_control.wanted_range = new_range;
@ -653,14 +657,14 @@ void the_game(
/* /*
Draw "Loading" screen Draw "Loading" screen
*/ */
const wchar_t *text = L"Loading and connecting..."; const wchar_t *loadingtext = L"Loading and connecting...";
u32 text_height = font->getDimension(text).Height; u32 text_height = font->getDimension(loadingtext).Height;
core::vector2d<s32> center(screensize.X/2, screensize.Y/2); core::vector2d<s32> center(screensize.X/2, screensize.Y/2);
core::vector2d<s32> textsize(300, text_height); core::vector2d<s32> textsize(300, text_height);
core::rect<s32> textrect(center - textsize/2, center + textsize/2); core::rect<s32> textrect(center - textsize/2, center + textsize/2);
gui::IGUIStaticText *gui_loadingtext = guienv->addStaticText( gui::IGUIStaticText *gui_loadingtext = guienv->addStaticText(
text, textrect, false, false); loadingtext, textrect, false, false);
gui_loadingtext->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT); gui_loadingtext->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
driver->beginScene(true, true, video::SColor(255,0,0,0)); driver->beginScene(true, true, video::SColor(255,0,0,0));
@ -793,9 +797,8 @@ void the_game(
*/ */
float cloud_height = BS*100; float cloud_height = BS*100;
//float cloud_height = BS*55; Clouds *clouds = NULL;
//float cloud_height = BS*20; clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1,
Clouds *clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1,
cloud_height, time(0)); cloud_height, time(0));
/* /*
@ -1729,9 +1732,12 @@ void the_game(
/* /*
Update coulds Update coulds
*/ */
clouds->step(dtime); if(clouds)
clouds->update(v2f(player_position.X, player_position.Z), {
0.05+brightness*0.95); clouds->step(dtime);
clouds->update(v2f(player_position.X, player_position.Z),
0.05+brightness*0.95);
}
// Store brightness value // Store brightness value
old_brightness = brightness; old_brightness = brightness;
@ -1745,6 +1751,8 @@ void the_game(
f32 range = draw_control.wanted_range*BS + MAP_BLOCKSIZE*BS*1.5; f32 range = draw_control.wanted_range*BS + MAP_BLOCKSIZE*BS*1.5;
if(draw_control.range_all) if(draw_control.range_all)
range = 100000*BS; range = 100000*BS;
if(range < 50*BS)
range = range * 0.5 + 25*BS;
driver->setFog( driver->setFog(
bgcolor, bgcolor,
@ -2069,6 +2077,22 @@ void the_game(
lastFPS = fps; lastFPS = fps;
} }
} }
/*
Draw a "shutting down" screen, which will be shown while the map
generator and other stuff quits
*/
{
const wchar_t *shuttingdowntext = L"Shutting down stuff...";
gui::IGUIStaticText *gui_shuttingdowntext = guienv->addStaticText(
shuttingdowntext, textrect, false, false);
gui_shuttingdowntext->setTextAlignment(gui::EGUIA_CENTER,
gui::EGUIA_UPPERLEFT);
driver->beginScene(true, true, video::SColor(255,0,0,0));
guienv->drawAll();
driver->endScene();
gui_shuttingdowntext->remove();
}
} }

@ -184,6 +184,10 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir, f32 range,
if(distance_ptr) if(distance_ptr)
*distance_ptr = d; *distance_ptr = d;
// If block is very close, it is always in sight
if(d < 1.44*1.44*MAP_BLOCKSIZE*BS/2)
return true;
// If block is far away, it's not in sight // If block is far away, it's not in sight
if(d > range * BS) if(d > range * BS)
return false; return false;