forked from Mirrorlandia_minetest/minetest
meshbuffer cache test. No much speed improvement.
This commit is contained in:
parent
c18af6e728
commit
3ad212c90b
@ -297,6 +297,8 @@ void MapBlock::updateMesh()
|
|||||||
|
|
||||||
core::list<FastFace*> *fastfaces_new = new core::list<FastFace*>;
|
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.
|
We are including the faces of the trailing edges of the block.
|
||||||
This means that when something changes, the caller must
|
This means that when something changes, the caller must
|
||||||
@ -340,13 +342,27 @@ void MapBlock::updateMesh()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//timer1.stop();
|
||||||
|
//TimeTaker timer2("updateMesh2", g_device);
|
||||||
|
|
||||||
scene::SMesh *mesh_new = NULL;
|
scene::SMesh *mesh_new = NULL;
|
||||||
|
|
||||||
|
//s32 appendtime = 0;
|
||||||
|
|
||||||
if(fastfaces_new->getSize() > 0)
|
if(fastfaces_new->getSize() > 0)
|
||||||
{
|
{
|
||||||
mesh_new = new scene::SMesh();
|
mesh_new = new scene::SMesh();
|
||||||
scene::IMeshBuffer *buf = NULL;
|
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();
|
core::list<FastFace*>::Iterator i = fastfaces_new->begin();
|
||||||
|
|
||||||
// MATERIAL_AIR shouldn't be used by any face
|
// MATERIAL_AIR shouldn't be used by any face
|
||||||
@ -359,6 +375,15 @@ void MapBlock::updateMesh()
|
|||||||
if(f->material != material_in_use || buf == NULL)
|
if(f->material != material_in_use || buf == NULL)
|
||||||
{
|
{
|
||||||
// Try to get a meshbuffer associated with the material
|
// Try to get a meshbuffer associated with the material
|
||||||
|
core::map<u8, scene::IMeshBuffer*>::Node*
|
||||||
|
n = bufs.find(f->material);
|
||||||
|
|
||||||
|
if(n != NULL)
|
||||||
|
{
|
||||||
|
buf = n->getValue();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
buf = mesh_new->getMeshBuffer(g_materials[f->material]);
|
buf = mesh_new->getMeshBuffer(g_materials[f->material]);
|
||||||
// If not found, create one
|
// If not found, create one
|
||||||
if(buf == NULL)
|
if(buf == NULL)
|
||||||
@ -366,6 +391,7 @@ void MapBlock::updateMesh()
|
|||||||
// This is a "Standard MeshBuffer",
|
// This is a "Standard MeshBuffer",
|
||||||
// it's a typedeffed CMeshBuffer<video::S3DVertex>
|
// it's a typedeffed CMeshBuffer<video::S3DVertex>
|
||||||
buf = new scene::SMeshBuffer();
|
buf = new scene::SMeshBuffer();
|
||||||
|
bufs[f->material] = buf;
|
||||||
// Set material
|
// Set material
|
||||||
((scene::SMeshBuffer*)buf)->Material = g_materials[f->material];
|
((scene::SMeshBuffer*)buf)->Material = g_materials[f->material];
|
||||||
// Use VBO
|
// Use VBO
|
||||||
@ -375,11 +401,17 @@ void MapBlock::updateMesh()
|
|||||||
// Mesh grabbed it
|
// Mesh grabbed it
|
||||||
buf->drop();
|
buf->drop();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
material_in_use = f->material;
|
material_in_use = f->material;
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 indices[] = {0,1,2,2,3,0};
|
u16 indices[] = {0,1,2,2,3,0};
|
||||||
|
|
||||||
|
//TimeTaker timer("", g_device);
|
||||||
|
|
||||||
buf->append(f->vertices, 4, indices, 6);
|
buf->append(f->vertices, 4, indices, 6);
|
||||||
|
|
||||||
|
//appendtime += timer.stop(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use VBO for mesh (this just would set this for ever buffer)
|
// Use VBO for mesh (this just would set this for ever buffer)
|
||||||
@ -390,6 +422,8 @@ void MapBlock::updateMesh()
|
|||||||
<<" materials"<<std::endl;*/
|
<<" materials"<<std::endl;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//dstream<<"appendtime="<<appendtime<<std::endl;
|
||||||
|
|
||||||
// TODO: Get rid of the FastFace stage
|
// TODO: Get rid of the FastFace stage
|
||||||
core::list<FastFace*>::Iterator i;
|
core::list<FastFace*>::Iterator i;
|
||||||
i = fastfaces_new->begin();
|
i = fastfaces_new->begin();
|
||||||
|
Loading…
Reference in New Issue
Block a user