forked from Mirrorlandia_minetest/minetest
Fix render order of overlays (#6008)
* Fix render order of overlays * Use C++11 loops * Fix time_t
This commit is contained in:
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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user