Fix render order of overlays (#6008)

* Fix render order of overlays

* Use C++11 loops

* Fix time_t
This commit is contained in:
Dániel Juhász 2017-06-21 08:47:31 +00:00 committed by SmallJoker
parent 849fe19f8c
commit 0c91c65a11

@ -290,49 +290,45 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
struct MeshBufList 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; video::SMaterial m;
std::vector<scene::IMeshBuffer*> bufs; std::vector<scene::IMeshBuffer*> bufs;
}; };
struct MeshBufListList 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() void clear()
{ {
lists.clear(); for (int l = 0; l < MAX_TILE_LAYERS; l++)
lists[l].clear();
} }
void add(scene::IMeshBuffer *buf, u8 layer) void add(scene::IMeshBuffer *buf, u8 layer)
{ {
// Append to the correct layer
std::vector<MeshBufList> &list = lists[layer];
const video::SMaterial &m = buf->getMaterial(); const video::SMaterial &m = buf->getMaterial();
for(std::vector<MeshBufList>::iterator i = lists.begin(); for (MeshBufList &l : list) {
i != lists.end(); ++i){
MeshBufList &l = *i;
// comparing a full material is quite expensive so we don't do it if // comparing a full material is quite expensive so we don't do it if
// not even first texture is equal // not even first texture is equal
if (l.m.TextureLayer[0].Texture != m.TextureLayer[0].Texture) if (l.m.TextureLayer[0].Texture != m.TextureLayer[0].Texture)
continue; continue;
if(l.layer != layer)
continue;
if (l.m == m) { if (l.m == m) {
l.bufs.push_back(buf); l.bufs.push_back(buf);
return; return;
} }
} }
MeshBufList l; MeshBufList l;
l.layer = layer;
l.m = m; l.m = m;
l.bufs.push_back(buf); 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 Measuring time is very useful for long delays when the
machine is swapping a lot. machine is swapping a lot.
*/ */
int time1 = time(0); std::time_t time1 = time(0);
/* /*
Get animation parameters Get animation parameters
@ -476,35 +472,32 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
} }
} }
std::vector<MeshBufList> &lists = drawbufs.lists; // 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; int timecheck_counter = 0;
for (std::vector<MeshBufList>::iterator i = lists.begin(); for (MeshBufList &list : lists) {
i != lists.end(); ++i) { timecheck_counter++;
timecheck_counter++; if (timecheck_counter > 50) {
if (timecheck_counter > 50) { timecheck_counter = 0;
timecheck_counter = 0; std::time_t time2 = time(0);
int time2 = time(0); if (time2 > time1 + 4) {
if (time2 > time1 + 4) { infostream << "ClientMap::renderMap(): "
infostream << "ClientMap::renderMap(): " "Rendering takes ages, returning."
"Rendering takes ages, returning." << std::endl;
<< std::endl; return;
return; }
}
driver->setMaterial(list.m);
for (scene::IMeshBuffer *buf : list.bufs) {
driver->drawMeshBuffer(buf);
vertex_count += buf->getVertexCount();
meshbuffer_count++;
} }
} }
MeshBufList &list = *i;
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++;
}
} }
} // ScopeProfiler } // ScopeProfiler