Fixed viewing range stuff a bit (now it works better with very low ranges)
authorPerttu Ahola <celeron55@gmail.com>
Fri, 6 May 2011 13:58:06 +0000 (16:58 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Fri, 6 May 2011 13:58:06 +0000 (16:58 +0300)
src/game.cpp
src/utility.cpp

index 92e690a2c8a154cd1fba278135928c0c5a2b3767..f32a2f0c98cdb91d297ec7f4fa25bd2368ceb960 100644 (file)
@@ -181,8 +181,15 @@ void updateViewingRange(f32 frametime_in, Client *client)
        float range_min = g_settings.getS16("viewing_range_nodes_min");
        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_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;
        if(draw_control.blocks_would_have_drawn != 0)
@@ -261,18 +268,15 @@ void updateViewingRange(f32 frametime_in, Client *client)
        }
 
        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)
                new_range = range_min;
        if(new_range > range_max)
                new_range = range_max;
        
-       /*if(new_range != new_range_unclamped)
-               dstream<<", clamped to "<<new_range<<std::endl;
-       else
-               dstream<<std::endl;*/
+       dstream<<"new_range="<<new_range_unclamped
+                       <<", clamped to "<<new_range<<std::endl;
 
        draw_control.wanted_range = new_range;
 
@@ -653,14 +657,14 @@ void the_game(
        /*
                Draw "Loading" screen
        */
-       const wchar_t *text = L"Loading and connecting...";
-       u32 text_height = font->getDimension(text).Height;
+       const wchar_t *loadingtext = L"Loading and connecting...";
+       u32 text_height = font->getDimension(loadingtext).Height;
        core::vector2d<s32> center(screensize.X/2, screensize.Y/2);
        core::vector2d<s32> textsize(300, text_height);
        core::rect<s32> textrect(center - textsize/2, center + textsize/2);
 
        gui::IGUIStaticText *gui_loadingtext = guienv->addStaticText(
-                       text, textrect, false, false);
+                       loadingtext, textrect, false, false);
        gui_loadingtext->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_UPPERLEFT);
 
        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*55;
-       //float cloud_height = BS*20;
-       Clouds *clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1,
+       Clouds *clouds = NULL;
+       clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1,
                        cloud_height, time(0));
 
        /*
@@ -1729,9 +1732,12 @@ void the_game(
                /*
                        Update coulds
                */
-               clouds->step(dtime);
-               clouds->update(v2f(player_position.X, player_position.Z),
-                               0.05+brightness*0.95);
+               if(clouds)
+               {
+                       clouds->step(dtime);
+                       clouds->update(v2f(player_position.X, player_position.Z),
+                                       0.05+brightness*0.95);
+               }
                
                // Store brightness value
                old_brightness = brightness;
@@ -1745,6 +1751,8 @@ void the_game(
                        f32 range = draw_control.wanted_range*BS + MAP_BLOCKSIZE*BS*1.5;
                        if(draw_control.range_all)
                                range = 100000*BS;
+                       if(range < 50*BS)
+                               range = range * 0.5 + 25*BS;
 
                        driver->setFog(
                                bgcolor,
@@ -2069,6 +2077,22 @@ void the_game(
                        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();
+       }
 }
 
 
index 95c5d8bf572a75707cab022fa52de65a5e48a657..fc657b27bd63bd7fbf06751d3b3d202995e0b4d6 100644 (file)
@@ -184,6 +184,10 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir, f32 range,
        if(distance_ptr)
                *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(d > range * BS)
                return false;