Fix issue #2441: crash on respawn, since a conversion std::list to std::vector on Environment.cpp

* Also change some std::list to std::vector for ClientMap::renderMap
* Remove disabled code in ClientMap::renderMap, disabled since a long time
master
Loic Blot 2015-03-05 15:34:39 +01:00
parent 0d1eedcccc
commit 9749d9fee6
7 changed files with 35 additions and 84 deletions

View File

@ -391,12 +391,12 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
struct MeshBufList struct MeshBufList
{ {
video::SMaterial m; video::SMaterial m;
std::list<scene::IMeshBuffer*> bufs; std::vector<scene::IMeshBuffer*> bufs;
}; };
struct MeshBufListList struct MeshBufListList
{ {
std::list<MeshBufList> lists; std::vector<MeshBufList> lists;
void clear() void clear()
{ {
@ -405,7 +405,7 @@ struct MeshBufListList
void add(scene::IMeshBuffer *buf) 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){ i != lists.end(); ++i){
MeshBufList &l = *i; MeshBufList &l = *i;
video::SMaterial &m = buf->getMaterial(); video::SMaterial &m = buf->getMaterial();
@ -595,25 +595,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; int timecheck_counter = 0;
for(std::list<MeshBufList>::iterator i = lists.begin(); for(std::vector<MeshBufList>::iterator i = lists.begin();
i != lists.end(); ++i) i != lists.end(); ++i) {
{ timecheck_counter++;
{ if(timecheck_counter > 50) {
timecheck_counter++; timecheck_counter = 0;
if(timecheck_counter > 50) int time2 = time(0);
{ if(time2 > time1 + 4) {
timecheck_counter = 0; infostream << "ClientMap::renderMap(): "
int time2 = time(0); "Rendering takes ages, returning."
if(time2 > time1 + 4) << std::endl;
{ return;
infostream<<"ClientMap::renderMap(): "
"Rendering takes ages, returning."
<<std::endl;
return;
}
} }
} }
@ -621,60 +616,14 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
driver->setMaterial(list.m); driver->setMaterial(list.m);
for(std::list<scene::IMeshBuffer*>::iterator j = list.bufs.begin(); for(std::vector<scene::IMeshBuffer*>::iterator j = list.bufs.begin();
j != list.bufs.end(); ++j) j != list.bufs.end(); ++j) {
{
scene::IMeshBuffer *buf = *j; scene::IMeshBuffer *buf = *j;
driver->drawMeshBuffer(buf); driver->drawMeshBuffer(buf);
vertex_count += buf->getVertexCount(); vertex_count += buf->getVertexCount();
meshbuffer_count++; 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 } // ScopeProfiler

View File

@ -2383,13 +2383,16 @@ void ClientEnvironment::step(float dtime)
g_profiler->avg("CEnv: num of simple objects", m_simple_objects.size()); g_profiler->avg("CEnv: num of simple objects", m_simple_objects.size());
for(std::vector<ClientSimpleObject*>::iterator for(std::vector<ClientSimpleObject*>::iterator
i = m_simple_objects.begin(); i != m_simple_objects.end();) { i = m_simple_objects.begin(); i != m_simple_objects.end();) {
ClientSimpleObject *simple = *i;
std::vector<ClientSimpleObject*>::iterator cur = i; std::vector<ClientSimpleObject*>::iterator cur = i;
++i; ClientSimpleObject *simple = *cur;
simple->step(dtime); simple->step(dtime);
if(simple->m_to_be_removed){ if(simple->m_to_be_removed) {
delete simple; delete simple;
m_simple_objects.erase(cur); i = m_simple_objects.erase(cur);
}
else {
++i;
} }
} }
} }

View File

@ -417,9 +417,8 @@ void GenerateNotifier::getEvents(
std::map<std::string, std::vector<v3s16> > &event_map, std::map<std::string, std::vector<v3s16> > &event_map,
bool peek_events) bool peek_events)
{ {
std::list<GenNotifyEvent>::iterator it; for (std::vector<GenNotifyEvent>::iterator it = m_notify_events.begin();
it != m_notify_events.end(); ++it) {
for (it = m_notify_events.begin(); it != m_notify_events.end(); ++it) {
GenNotifyEvent &gn = *it; GenNotifyEvent &gn = *it;
std::string name = (gn.type == GENNOTIFY_DECORATION) ? std::string name = (gn.type == GENNOTIFY_DECORATION) ?
"decoration#"+ itos(gn.id) : "decoration#"+ itos(gn.id) :

View File

@ -91,7 +91,7 @@ public:
private: private:
u32 m_notify_on; u32 m_notify_on;
std::set<u32> *m_notify_on_deco_ids; std::set<u32> *m_notify_on_deco_ids;
std::list<GenNotifyEvent> m_notify_events; std::vector<GenNotifyEvent> m_notify_events;
}; };
struct MapgenSpecificParams { struct MapgenSpecificParams {

View File

@ -443,7 +443,7 @@ private:
content_t m_next_id; content_t m_next_id;
// List of node strings and node resolver callbacks to perform // List of node strings and node resolver callbacks to perform
std::list<NodeResolveInfo *> m_pending_node_lookups; std::vector<NodeResolveInfo *> m_pending_node_lookups;
// True when all nodes have been registered // True when all nodes have been registered
bool m_node_registration_complete; bool m_node_registration_complete;
@ -479,7 +479,7 @@ void CNodeDefManager::clear()
m_next_id = 0; m_next_id = 0;
m_node_registration_complete = false; m_node_registration_complete = false;
for (std::list<NodeResolveInfo *>::iterator for (std::vector<NodeResolveInfo *>::iterator
it = m_pending_node_lookups.begin(); it = m_pending_node_lookups.begin();
it != m_pending_node_lookups.end(); it != m_pending_node_lookups.end();
++it) ++it)
@ -1309,7 +1309,7 @@ void CNodeDefManager::pendNodeResolve(NodeResolveInfo *nri)
void CNodeDefManager::cancelNodeResolve(NodeResolver *resolver) void CNodeDefManager::cancelNodeResolve(NodeResolver *resolver)
{ {
for (std::list<NodeResolveInfo *>::iterator for (std::vector<NodeResolveInfo *>::iterator
it = m_pending_node_lookups.begin(); it = m_pending_node_lookups.begin();
it != m_pending_node_lookups.end(); it != m_pending_node_lookups.end();
++it) { ++it) {
@ -1326,7 +1326,7 @@ void CNodeDefManager::runNodeResolverCallbacks()
{ {
while (!m_pending_node_lookups.empty()) { while (!m_pending_node_lookups.empty()) {
NodeResolveInfo *nri = m_pending_node_lookups.front(); NodeResolveInfo *nri = m_pending_node_lookups.front();
m_pending_node_lookups.pop_front(); m_pending_node_lookups.erase(m_pending_node_lookups.begin());
nri->resolver->resolveNodeNames(nri); nri->resolver->resolveNodeNames(nri);
nri->resolver->m_lookup_done = true; nri->resolver->m_lookup_done = true;
delete nri; delete nri;
@ -1345,7 +1345,7 @@ bool CNodeDefManager::getIdFromResolveInfo(NodeResolveInfo *nri,
content_t c; content_t c;
std::string name = nri->nodenames.front(); std::string name = nri->nodenames.front();
nri->nodenames.pop_front(); nri->nodenames.erase(nri->nodenames.begin());
bool success = getId(name, c); bool success = getId(name, c);
if (!success && node_alt != "") { if (!success && node_alt != "") {
@ -1385,7 +1385,7 @@ bool CNodeDefManager::getIdsFromResolveInfo(NodeResolveInfo *nri,
content_t c; content_t c;
std::string name = nri->nodenames.front(); std::string name = nri->nodenames.front();
nri->nodenames.pop_front(); nri->nodenames.erase(nri->nodenames.begin());
if (name.substr(0,6) != "group:") { if (name.substr(0,6) != "group:") {
if (getId(name, c)) { if (getId(name, c)) {

View File

@ -309,7 +309,7 @@ struct NodeResolveInfo {
resolver = nr; resolver = nr;
} }
std::list<std::string> nodenames; std::vector<std::string> nodenames;
std::list<NodeListInfo> nodelistinfo; std::list<NodeListInfo> nodelistinfo;
NodeResolver *resolver; NodeResolver *resolver;
}; };

View File

@ -459,7 +459,7 @@ int ModApiMapgen::l_register_biome(lua_State *L)
} }
NodeResolveInfo *nri = new NodeResolveInfo(b); NodeResolveInfo *nri = new NodeResolveInfo(b);
std::list<std::string> &nnames = nri->nodenames; std::vector<std::string> &nnames = nri->nodenames;
nnames.push_back(getstringfield_default(L, index, "node_top", "")); nnames.push_back(getstringfield_default(L, index, "node_top", ""));
nnames.push_back(getstringfield_default(L, index, "node_filler", "")); nnames.push_back(getstringfield_default(L, index, "node_filler", ""));
nnames.push_back(getstringfield_default(L, index, "node_stone", "")); nnames.push_back(getstringfield_default(L, index, "node_stone", ""));