]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/clientmap.cpp
shader.cpp: don't test twice if shader programs are present
[dragonfireclient.git] / src / clientmap.cpp
index a5d364b73bb21a338c5ac00eee7587b78190c3a7..024f2a266e2beb69a330de54b2ab5a3d0f180121 100644 (file)
@@ -24,12 +24,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <matrix4.h>
 #include "log.h"
 #include "mapsector.h"
-#include "main.h" // dout_client, g_settings
 #include "nodedef.h"
 #include "mapblock.h"
 #include "profiler.h"
 #include "settings.h"
-#include "camera.h" // CameraModes
+#include "camera.h"               // CameraModes
 #include "util/mathconstants.h"
 #include <algorithm>
 
@@ -71,7 +70,7 @@ ClientMap::ClientMap(
 
 ClientMap::~ClientMap()
 {
-       /*JMutexAutoLock lock(mesh_mutex);
+       /*MutexAutoLock lock(mesh_mutex);
 
        if(mesh != NULL)
        {
@@ -82,7 +81,7 @@ ClientMap::~ClientMap()
 
 MapSector * ClientMap::emergeSector(v2s16 p2d)
 {
-       DSTACK(__FUNCTION_NAME);
+       DSTACK(FUNCTION_NAME);
        // Check that it doesn't exist already
        try{
                return getSectorNoGenerate(p2d);
@@ -95,41 +94,13 @@ MapSector * ClientMap::emergeSector(v2s16 p2d)
        ClientMapSector *sector = new ClientMapSector(this, p2d, m_gamedef);
 
        {
-               //JMutexAutoLock lock(m_sector_mutex); // Bulk comment-out
+               //MutexAutoLock lock(m_sector_mutex); // Bulk comment-out
                m_sectors[p2d] = sector;
        }
 
        return sector;
 }
 
-#if 0
-void ClientMap::deSerializeSector(v2s16 p2d, std::istream &is)
-{
-       DSTACK(__FUNCTION_NAME);
-       ClientMapSector *sector = NULL;
-
-       //JMutexAutoLock lock(m_sector_mutex); // Bulk comment-out
-
-       core::map<v2s16, MapSector*>::Node *n = m_sectors.find(p2d);
-
-       if(n != NULL)
-       {
-               sector = (ClientMapSector*)n->getValue();
-               assert(sector->getId() == MAPSECTOR_CLIENT);
-       }
-       else
-       {
-               sector = new ClientMapSector(this, p2d);
-               {
-                       //JMutexAutoLock lock(m_sector_mutex); // Bulk comment-out
-                       m_sectors.insert(p2d, sector);
-               }
-       }
-
-       sector->deSerialize(is);
-}
-#endif
-
 void ClientMap::OnRegisterSceneNode()
 {
        if(IsVisible)
@@ -161,9 +132,9 @@ static bool isOccluded(Map *map, v3s16 p0, v3s16 p1, float step, float stepfac,
                else
                        is_transparent = (f.solidness != 2);
                if(!is_transparent){
-                       count++;
-                       if(count >= needed_count)
+                       if(count == needed_count)
                                return true;
+                       count++;
                }
                step *= stepfac;
        }
@@ -186,12 +157,9 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
        }
        m_drawlist.clear();
 
-       m_camera_mutex.Lock();
        v3f camera_position = m_camera_position;
        v3f camera_direction = m_camera_direction;
        f32 camera_fov = m_camera_fov;
-       v3s16 camera_offset = m_camera_offset;
-       m_camera_mutex.Unlock();
 
        // Use a higher fov to accomodate faster camera movements.
        // Blocks are cropped better when they are drawn.
@@ -247,7 +215,7 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
                                continue;
                }
 
-               std::list< MapBlock * > sectorblocks;
+               MapBlockVect sectorblocks;
                sector->getBlocks(sectorblocks);
 
                /*
@@ -256,8 +224,8 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
 
                u32 sector_blocks_drawn = 0;
 
-               std::list< MapBlock * >::iterator i;
-               for(i=sectorblocks.begin(); i!=sectorblocks.end(); i++)
+               for(MapBlockVect::iterator i = sectorblocks.begin();
+                               i != sectorblocks.end(); ++i)
                {
                        MapBlock *block = *i;
 
@@ -292,7 +260,7 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
                                Ignore if mesh doesn't exist
                        */
                        {
-                               //JMutexAutoLock lock(block->mesh_mutex);
+                               //MutexAutoLock lock(block->mesh_mutex);
 
                                if(block->mesh == NULL){
                                        blocks_in_range_without_mesh++;
@@ -391,12 +359,12 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
 struct MeshBufList
 {
        video::SMaterial m;
-       std::list<scene::IMeshBuffer*> bufs;
+       std::vector<scene::IMeshBuffer*> bufs;
 };
 
 struct MeshBufListList
 {
-       std::list<MeshBufList> lists;
+       std::vector<MeshBufList> lists;
 
        void clear()
        {
@@ -405,7 +373,7 @@ struct MeshBufListList
 
        void add(scene::IMeshBuffer *buf)
        {
-               for(std::list<MeshBufList>::iterator i = lists.begin();
+               for(std::vector<MeshBufList>::iterator i = lists.begin();
                                i != lists.end(); ++i){
                        MeshBufList &l = *i;
                        video::SMaterial &m = buf->getMaterial();
@@ -429,7 +397,7 @@ struct MeshBufListList
 
 void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
 {
-       DSTACK(__FUNCTION_NAME);
+       DSTACK(FUNCTION_NAME);
 
        bool is_transparent_pass = pass == scene::ESNRP_TRANSPARENT;
 
@@ -462,11 +430,9 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
        int crack = m_client->getCrackLevel();
        u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
 
-       m_camera_mutex.Lock();
        v3f camera_position = m_camera_position;
        v3f camera_direction = m_camera_direction;
        f32 camera_fov = m_camera_fov;
-       m_camera_mutex.Unlock();
 
        /*
                Get all blocks and draw all visible ones
@@ -533,7 +499,7 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
 
                // Mesh animation
                {
-                       //JMutexAutoLock lock(block->mesh_mutex);
+                       //MutexAutoLock lock(block->mesh_mutex);
                        MapBlockMesh *mapBlockMesh = block->mesh;
                        assert(mapBlockMesh);
                        // Pretty random but this should work somewhat nicely
@@ -563,12 +529,12 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
                        Get the meshbuffers of the block
                */
                {
-                       //JMutexAutoLock lock(block->mesh_mutex);
+                       //MutexAutoLock lock(block->mesh_mutex);
 
                        MapBlockMesh *mapBlockMesh = block->mesh;
                        assert(mapBlockMesh);
 
-                       scene::SMesh *mesh = mapBlockMesh->getMesh();
+                       scene::IMesh *mesh = mapBlockMesh->getMesh();
                        assert(mesh);
 
                        u32 c = mesh->getMeshBufferCount();
@@ -595,25 +561,20 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
                }
        }
 
-       std::list<MeshBufList> &lists = drawbufs.lists;
+       std::vector<MeshBufList> &lists = drawbufs.lists;
 
        int timecheck_counter = 0;
-       for(std::list<MeshBufList>::iterator i = lists.begin();
-                       i != lists.end(); ++i)
-       {
-               {
-                       timecheck_counter++;
-                       if(timecheck_counter > 50)
-                       {
-                               timecheck_counter = 0;
-                               int time2 = time(0);
-                               if(time2 > time1 + 4)
-                               {
-                                       infostream<<"ClientMap::renderMap(): "
-                                               "Rendering takes ages, returning."
-                                               <<std::endl;
-                                       return;
-                               }
+       for(std::vector<MeshBufList>::iterator i = lists.begin();
+                       i != lists.end(); ++i) {
+               timecheck_counter++;
+               if(timecheck_counter > 50) {
+                       timecheck_counter = 0;
+                       int time2 = time(0);
+                       if(time2 > time1 + 4) {
+                               infostream << "ClientMap::renderMap(): "
+                                       "Rendering takes ages, returning."
+                                       << std::endl;
+                               return;
                        }
                }
 
@@ -621,60 +582,14 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
 
                driver->setMaterial(list.m);
 
-               for(std::list<scene::IMeshBuffer*>::iterator j = list.bufs.begin();
-                               j != list.bufs.end(); ++j)
-               {
+               for(std::vector<scene::IMeshBuffer*>::iterator j = list.bufs.begin();
+                               j != list.bufs.end(); ++j) {
                        scene::IMeshBuffer *buf = *j;
                        driver->drawMeshBuffer(buf);
                        vertex_count += buf->getVertexCount();
                        meshbuffer_count++;
                }
-#if 0
-               /*
-                       Draw the faces of the block
-               */
-               {
-                       //JMutexAutoLock lock(block->mesh_mutex);
-
-                       MapBlockMesh *mapBlockMesh = block->mesh;
-                       assert(mapBlockMesh);
 
-                       scene::SMesh *mesh = mapBlockMesh->getMesh();
-                       assert(mesh);
-
-                       u32 c = mesh->getMeshBufferCount();
-                       bool stuff_actually_drawn = false;
-                       for(u32 i=0; i<c; i++)
-                       {
-                               scene::IMeshBuffer *buf = mesh->getMeshBuffer(i);
-                               const video::SMaterial& material = buf->getMaterial();
-                               video::IMaterialRenderer* rnd =
-                                               driver->getMaterialRenderer(material.MaterialType);
-                               bool transparent = (rnd && rnd->isTransparent());
-                               // Render transparent on transparent pass and likewise.
-                               if(transparent == is_transparent_pass)
-                               {
-                                       if(buf->getVertexCount() == 0)
-                                               errorstream<<"Block ["<<analyze_block(block)
-                                                               <<"] contains an empty meshbuf"<<std::endl;
-                                       /*
-                                               This *shouldn't* hurt too much because Irrlicht
-                                               doesn't change opengl textures if the old
-                                               material has the same texture.
-                                       */
-                                       driver->setMaterial(buf->getMaterial());
-                                       driver->drawMeshBuffer(buf);
-                                       vertex_count += buf->getVertexCount();
-                                       meshbuffer_count++;
-                                       stuff_actually_drawn = true;
-                               }
-                       }
-                       if(stuff_actually_drawn)
-                               blocks_had_pass_meshbuf++;
-                       else
-                               blocks_without_stuff++;
-               }
-#endif
        }
        } // ScopeProfiler
 
@@ -854,7 +769,6 @@ int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor,
                        ret = decode_light(n.getLightBlend(daylight_factor, ndef));
                } else {
                        ret = oldvalue;
-                       //ret = blend_light(255, 0, daylight_factor);
                }
        } else {
                /*float pre = (float)brightness_sum / (float)brightness_count;
@@ -880,11 +794,7 @@ void ClientMap::renderPostFx(CameraMode cam_mode)
        // Sadly ISceneManager has no "post effects" render pass, in that case we
        // could just register for that and handle it in renderMap().
 
-       m_camera_mutex.Lock();
-       v3f camera_position = m_camera_position;
-       m_camera_mutex.Unlock();
-
-       MapNode n = getNodeNoEx(floatToInt(camera_position, BS));
+       MapNode n = getNodeNoEx(floatToInt(m_camera_position, BS));
 
        // - If the player is in a solid node, make everything black.
        // - If the player is in liquid, draw a semi-transparent overlay.