mirror of
https://github.com/minetest/minetest.git
synced 2024-08-19 04:54:18 +02:00
reversed meshbuffer cache
This commit is contained in:
parent
3ad212c90b
commit
aaafb5add0
@ -297,8 +297,6 @@ void MapBlock::updateMesh()
|
||||
|
||||
core::list<FastFace*> *fastfaces_new = new core::list<FastFace*>;
|
||||
|
||||
//TimeTaker timer1("updateMesh1", g_device);
|
||||
|
||||
/*
|
||||
We are including the faces of the trailing edges of the block.
|
||||
This means that when something changes, the caller must
|
||||
@ -342,27 +340,13 @@ void MapBlock::updateMesh()
|
||||
}
|
||||
}
|
||||
|
||||
//timer1.stop();
|
||||
//TimeTaker timer2("updateMesh2", g_device);
|
||||
|
||||
scene::SMesh *mesh_new = NULL;
|
||||
|
||||
//s32 appendtime = 0;
|
||||
|
||||
if(fastfaces_new->getSize() > 0)
|
||||
{
|
||||
mesh_new = new scene::SMesh();
|
||||
scene::IMeshBuffer *buf = NULL;
|
||||
|
||||
/*
|
||||
Buffer for lesser calls to
|
||||
mesh_new->getMeshBuffer(g_materials[f->material]),
|
||||
which is slow.
|
||||
|
||||
key = material id, value = meshbuffer of that material
|
||||
*/
|
||||
core::map<u8, scene::IMeshBuffer*> bufs;
|
||||
|
||||
core::list<FastFace*>::Iterator i = fastfaces_new->begin();
|
||||
|
||||
// MATERIAL_AIR shouldn't be used by any face
|
||||
@ -375,43 +359,27 @@ void MapBlock::updateMesh()
|
||||
if(f->material != material_in_use || buf == NULL)
|
||||
{
|
||||
// Try to get a meshbuffer associated with the material
|
||||
core::map<u8, scene::IMeshBuffer*>::Node*
|
||||
n = bufs.find(f->material);
|
||||
|
||||
if(n != NULL)
|
||||
buf = mesh_new->getMeshBuffer(g_materials[f->material]);
|
||||
// If not found, create one
|
||||
if(buf == NULL)
|
||||
{
|
||||
buf = n->getValue();
|
||||
}
|
||||
else
|
||||
{
|
||||
buf = mesh_new->getMeshBuffer(g_materials[f->material]);
|
||||
// If not found, create one
|
||||
if(buf == NULL)
|
||||
{
|
||||
// This is a "Standard MeshBuffer",
|
||||
// it's a typedeffed CMeshBuffer<video::S3DVertex>
|
||||
buf = new scene::SMeshBuffer();
|
||||
bufs[f->material] = buf;
|
||||
// Set material
|
||||
((scene::SMeshBuffer*)buf)->Material = g_materials[f->material];
|
||||
// Use VBO
|
||||
//buf->setHardwareMappingHint(scene::EHM_STATIC);
|
||||
// Add to mesh
|
||||
mesh_new->addMeshBuffer(buf);
|
||||
// Mesh grabbed it
|
||||
buf->drop();
|
||||
}
|
||||
// This is a "Standard MeshBuffer",
|
||||
// it's a typedeffed CMeshBuffer<video::S3DVertex>
|
||||
buf = new scene::SMeshBuffer();
|
||||
// Set material
|
||||
((scene::SMeshBuffer*)buf)->Material = g_materials[f->material];
|
||||
// Use VBO
|
||||
//buf->setHardwareMappingHint(scene::EHM_STATIC);
|
||||
// Add to mesh
|
||||
mesh_new->addMeshBuffer(buf);
|
||||
// Mesh grabbed it
|
||||
buf->drop();
|
||||
}
|
||||
material_in_use = f->material;
|
||||
}
|
||||
|
||||
u16 indices[] = {0,1,2,2,3,0};
|
||||
|
||||
//TimeTaker timer("", g_device);
|
||||
|
||||
buf->append(f->vertices, 4, indices, 6);
|
||||
|
||||
//appendtime += timer.stop(true);
|
||||
}
|
||||
|
||||
// Use VBO for mesh (this just would set this for ever buffer)
|
||||
@ -422,8 +390,6 @@ void MapBlock::updateMesh()
|
||||
<<" materials"<<std::endl;*/
|
||||
}
|
||||
|
||||
//dstream<<"appendtime="<<appendtime<<std::endl;
|
||||
|
||||
// TODO: Get rid of the FastFace stage
|
||||
core::list<FastFace*>::Iterator i;
|
||||
i = fastfaces_new->begin();
|
||||
|
Loading…
Reference in New Issue
Block a user