diff options
author | Dániel Juhász <juhdanad@gmail.com> | 2017-06-21 08:47:31 +0000 |
---|---|---|
committer | SmallJoker <mk939@ymail.com> | 2018-06-03 17:31:59 +0200 |
commit | 0c91c65a1147049a0a97ef3120a025401f60c5d7 (patch) | |
tree | 655f723712136fb3d386fb9fcc5ac4210fda75c1 /src | |
parent | 849fe19f8cc89dbe92b24e6020e3a1618a3171e2 (diff) | |
download | minetest-0c91c65a1147049a0a97ef3120a025401f60c5d7.tar.gz minetest-0c91c65a1147049a0a97ef3120a025401f60c5d7.tar.bz2 minetest-0c91c65a1147049a0a97ef3120a025401f60c5d7.zip |
Fix render order of overlays (#6008)
* Fix render order of overlays
* Use C++11 loops
* Fix time_t
Diffstat (limited to 'src')
-rw-r--r-- | src/clientmap.cpp | 77 |
1 files changed, 35 insertions, 42 deletions
diff --git a/src/clientmap.cpp b/src/clientmap.cpp index 6cd24ffc6..d00443c62 100644 --- a/src/clientmap.cpp +++ b/src/clientmap.cpp @@ -290,49 +290,45 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver) struct MeshBufList { - /*! - * Specifies in which layer the list is. - * All lists which are in a lower layer are rendered before this list. - */ - u8 layer; video::SMaterial m; std::vector<scene::IMeshBuffer*> bufs; }; struct MeshBufListList { - std::vector<MeshBufList> lists; + /*! + * Stores the mesh buffers of the world. + * The array index is the material's layer. + * The vector part groups vertices by material. + */ + std::vector<MeshBufList> lists[MAX_TILE_LAYERS]; void clear() { - lists.clear(); + for (int l = 0; l < MAX_TILE_LAYERS; l++) + lists[l].clear(); } void add(scene::IMeshBuffer *buf, u8 layer) { + // Append to the correct layer + std::vector<MeshBufList> &list = lists[layer]; const video::SMaterial &m = buf->getMaterial(); - for(std::vector<MeshBufList>::iterator i = lists.begin(); - i != lists.end(); ++i){ - MeshBufList &l = *i; - + for (MeshBufList &l : list) { // comparing a full material is quite expensive so we don't do it if // not even first texture is equal if (l.m.TextureLayer[0].Texture != m.TextureLayer[0].Texture) continue; - if(l.layer != layer) - continue; - if (l.m == m) { l.bufs.push_back(buf); return; } } MeshBufList l; - l.layer = layer; l.m = m; l.bufs.push_back(buf); - lists.push_back(l); + list.push_back(l); } }; @@ -360,7 +356,7 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) Measuring time is very useful for long delays when the machine is swapping a lot. */ - int time1 = time(0); + std::time_t time1 = time(0); /* Get animation parameters @@ -476,35 +472,32 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) } } - std::vector<MeshBufList> &lists = drawbufs.lists; - - int timecheck_counter = 0; - 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; + // Render all layers in order + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { + std::vector<MeshBufList> &lists = drawbufs.lists[layer]; + + int timecheck_counter = 0; + for (MeshBufList &list : lists) { + timecheck_counter++; + if (timecheck_counter > 50) { + timecheck_counter = 0; + std::time_t time2 = time(0); + if (time2 > time1 + 4) { + infostream << "ClientMap::renderMap(): " + "Rendering takes ages, returning." + << std::endl; + return; + } } - } - MeshBufList &list = *i; + driver->setMaterial(list.m); - driver->setMaterial(list.m); - - 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++; + for (scene::IMeshBuffer *buf : list.bufs) { + driver->drawMeshBuffer(buf); + vertex_count += buf->getVertexCount(); + meshbuffer_count++; + } } - } } // ScopeProfiler |