forked from Mirrorlandia_minetest/minetest
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
This commit is contained in:
parent
0d1eedcccc
commit
9749d9fee6
@ -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
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) :
|
||||||
|
@ -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 {
|
||||||
|
@ -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)) {
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
@ -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", ""));
|
||||||
|
Loading…
Reference in New Issue
Block a user