]> git.lizzy.rs Git - minetest.git/blobdiff - src/clientmap.cpp
Fix invalid usage of texture->getSize() where actually texture->getOriginalSize(...
[minetest.git] / src / clientmap.cpp
index 02c9fe9b1db78ecadbbf9518545a2fec7959d40d..e0c41c7629a24ee2ca46e00865612ebdb25e3ec1 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Minetest-c55
-Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "profiler.h"
 #include "settings.h"
 #include "util/mathconstants.h"
+#include <algorithm>
 
 #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
 
@@ -83,7 +84,7 @@ MapSector * ClientMap::emergeSector(v2s16 p2d)
        
        {
                //JMutexAutoLock lock(m_sector_mutex); // Bulk comment-out
-               m_sectors.insert(p2d, sector);
+               m_sectors[p2d] = sector;
        }
        
        return sector;
@@ -164,11 +165,11 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
 
        INodeDefManager *nodemgr = m_gamedef->ndef();
 
-       for(core::map<v3s16, MapBlock*>::Iterator
-                       i = m_drawlist.getIterator();
-                       i.atEnd() == false; i++)
+       for(std::map<v3s16, MapBlock*>::iterator
+                       i = m_drawlist.begin();
+                       i != m_drawlist.end(); ++i)
        {
-               MapBlock *block = i.getNode()->getValue();
+               MapBlock *block = i->second;
                block->refDrop();
        }
        m_drawlist.clear();
@@ -214,12 +215,14 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
        //u32 blocks_had_pass_meshbuf = 0;
        // Blocks from which stuff was actually drawn
        //u32 blocks_without_stuff = 0;
+       // Distance to farthest drawn block
+       float farthest_drawn = 0;
 
-       for(core::map<v2s16, MapSector*>::Iterator
-                       si = m_sectors.getIterator();
-                       si.atEnd() == false; si++)
+       for(std::map<v2s16, MapSector*>::iterator
+                       si = m_sectors.begin();
+                       si != m_sectors.end(); ++si)
        {
-               MapSector *sector = si.getNode()->getValue();
+               MapSector *sector = si->second;
                v2s16 sp = sector->getPos();
                
                if(m_control.range_all == false)
@@ -231,7 +234,7 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
                                continue;
                }
 
-               core::list< MapBlock * > sectorblocks;
+               std::list< MapBlock * > sectorblocks;
                sector->getBlocks(sectorblocks);
                
                /*
@@ -240,7 +243,7 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
 
                u32 sector_blocks_drawn = 0;
                
-               core::list< MapBlock * >::Iterator i;
+               std::list< MapBlock * >::iterator i;
                for(i=sectorblocks.begin(); i!=sectorblocks.end(); i++)
                {
                        MapBlock *block = *i;
@@ -346,30 +349,38 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
 
                        sector_blocks_drawn++;
                        blocks_drawn++;
+                       if(d/BS > farthest_drawn)
+                               farthest_drawn = d/BS;
 
                } // foreach sectorblocks
 
                if(sector_blocks_drawn != 0)
-                       m_last_drawn_sectors[sp] = true;
+                       m_last_drawn_sectors.insert(sp);
        }
-       
+
+       m_control.blocks_would_have_drawn = blocks_would_have_drawn;
+       m_control.blocks_drawn = blocks_drawn;
+       m_control.farthest_drawn = farthest_drawn;
+
        g_profiler->avg("CM: blocks in range", blocks_in_range);
        g_profiler->avg("CM: blocks occlusion culled", blocks_occlusion_culled);
        if(blocks_in_range != 0)
                g_profiler->avg("CM: blocks in range without mesh (frac)",
                                (float)blocks_in_range_without_mesh/blocks_in_range);
        g_profiler->avg("CM: blocks drawn", blocks_drawn);
+       g_profiler->avg("CM: farthest drawn", farthest_drawn);
+       g_profiler->avg("CM: wanted max blocks", m_control.wanted_max_blocks);
 }
 
 struct MeshBufList
 {
        video::SMaterial m;
-       core::list<scene::IMeshBuffer*> bufs;
+       std::list<scene::IMeshBuffer*> bufs;
 };
 
 struct MeshBufListList
 {
-       core::list<MeshBufList> lists;
+       std::list<MeshBufList> lists;
        
        void clear()
        {
@@ -378,8 +389,8 @@ struct MeshBufListList
        
        void add(scene::IMeshBuffer *buf)
        {
-               for(core::list<MeshBufList>::Iterator i = lists.begin();
-                               i != lists.end(); i++){
+               for(std::list<MeshBufList>::iterator i = lists.begin();
+                               i != lists.end(); ++i){
                        MeshBufList &l = *i;
                        if(l.m == buf->getMaterial()){
                                l.bufs.push_back(buf);
@@ -467,9 +478,6 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
        u32 mesh_animate_count = 0;
        u32 mesh_animate_count_far = 0;
        
-       // Blocks that had mesh that would have been drawn according to
-       // rendering range (if max blocks limit didn't kick in)
-       u32 blocks_would_have_drawn = 0;
        // Blocks that were drawn and had a mesh
        u32 blocks_drawn = 0;
        // Blocks which had a corresponding meshbuffer for this pass
@@ -486,11 +494,11 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
 
        MeshBufListList drawbufs;
 
-       for(core::map<v3s16, MapBlock*>::Iterator
-                       i = m_drawlist.getIterator();
-                       i.atEnd() == false; i++)
+       for(std::map<v3s16, MapBlock*>::iterator
+                       i = m_drawlist.begin();
+                       i != m_drawlist.end(); ++i)
        {
-               MapBlock *block = i.getNode()->getValue();
+               MapBlock *block = i->second;
 
                // If the mesh of the block happened to get deleted, ignore it
                if(block->mesh == NULL)
@@ -568,11 +576,11 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
                }
        }
        
-       core::list<MeshBufList> &lists = drawbufs.lists;
+       std::list<MeshBufList> &lists = drawbufs.lists;
        
        int timecheck_counter = 0;
-       for(core::list<MeshBufList>::Iterator i = lists.begin();
-                       i != lists.end(); i++)
+       for(std::list<MeshBufList>::iterator i = lists.begin();
+                       i != lists.end(); ++i)
        {
                {
                        timecheck_counter++;
@@ -594,8 +602,8 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
                
                driver->setMaterial(list.m);
                
-               for(core::list<scene::IMeshBuffer*>::Iterator j = list.bufs.begin();
-                               j != list.bufs.end(); j++)
+               for(std::list<scene::IMeshBuffer*>::iterator j = list.bufs.begin();
+                               j != list.bufs.end(); ++j)
                {
                        scene::IMeshBuffer *buf = *j;
                        driver->drawMeshBuffer(buf);
@@ -665,9 +673,6 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
                g_profiler->avg(prefix+"empty blocks (frac)",
                                (float)blocks_without_stuff / blocks_drawn);
 
-       m_control.blocks_drawn = blocks_drawn;
-       m_control.blocks_would_have_drawn = blocks_would_have_drawn;
-
        /*infostream<<"renderMap(): is_transparent_pass="<<is_transparent_pass
                        <<", rendered "<<vertex_count<<" vertices."<<std::endl;*/
 }
@@ -771,7 +776,7 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor,
        float sunlight_min_d = max_d*0.8;
        if(sunlight_min_d > 35*BS)
                sunlight_min_d = 35*BS;
-       core::array<int> values;
+       std::vector<int> values;
        for(u32 i=0; i<sizeof(z_directions)/sizeof(*z_directions); i++){
                v3f z_dir = z_directions[i];
                z_dir.normalize();
@@ -800,7 +805,7 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor,
        }
        int brightness_sum = 0;
        int brightness_count = 0;
-       values.sort();
+       std::sort(values.begin(), values.end());
        u32 num_values_to_use = values.size();
        if(num_values_to_use >= 10)
                num_values_to_use -= num_values_to_use/2;
@@ -866,7 +871,7 @@ void ClientMap::renderPostFx()
        // - If the player is in liquid, draw a semi-transparent overlay.
        const ContentFeatures& features = nodemgr->get(n);
        video::SColor post_effect_color = features.post_effect_color;
-       if(features.solidness == 2 && g_settings->getBool("free_move") == false)
+       if(features.solidness == 2 && !(g_settings->getBool("noclip") && m_gamedef->checkLocalPrivilege("noclip")))
        {
                post_effect_color = video::SColor(255, 0, 0, 0);
        }