Mapblock mesh: Allow to use VBO
parent
8eb7ddb0a2
commit
f9d727764f
|
@ -252,6 +252,9 @@ serverlist_file (Serverlist file) string favoriteservers.txt
|
||||||
|
|
||||||
[***Basic]
|
[***Basic]
|
||||||
|
|
||||||
|
# Enable VBO
|
||||||
|
enable_vbo (VBO) bool true
|
||||||
|
|
||||||
# Whether to fog out the end of the visible area.
|
# Whether to fog out the end of the visible area.
|
||||||
enable_fog (Fog) bool true
|
enable_fog (Fog) bool true
|
||||||
|
|
||||||
|
|
|
@ -176,6 +176,7 @@ void set_default_settings(Settings *settings)
|
||||||
settings->setDefault("repeat_rightclick_time", "0.25");
|
settings->setDefault("repeat_rightclick_time", "0.25");
|
||||||
settings->setDefault("enable_particles", "true");
|
settings->setDefault("enable_particles", "true");
|
||||||
settings->setDefault("enable_mesh_cache", "false");
|
settings->setDefault("enable_mesh_cache", "false");
|
||||||
|
settings->setDefault("enable_vbo", "true");
|
||||||
|
|
||||||
settings->setDefault("enable_minimap", "true");
|
settings->setDefault("enable_minimap", "true");
|
||||||
settings->setDefault("minimap_shape_round", "true");
|
settings->setDefault("minimap_shape_round", "true");
|
||||||
|
|
|
@ -1026,6 +1026,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
|
||||||
m_mesh(new scene::SMesh()),
|
m_mesh(new scene::SMesh()),
|
||||||
m_minimap_mapblock(NULL),
|
m_minimap_mapblock(NULL),
|
||||||
m_gamedef(data->m_gamedef),
|
m_gamedef(data->m_gamedef),
|
||||||
|
m_driver(m_gamedef->tsrc()->getDevice()->getVideoDriver()),
|
||||||
m_tsrc(m_gamedef->getTextureSource()),
|
m_tsrc(m_gamedef->getTextureSource()),
|
||||||
m_shdrsrc(m_gamedef->getShaderSource()),
|
m_shdrsrc(m_gamedef->getShaderSource()),
|
||||||
m_animation_force_timer(0), // force initial animation
|
m_animation_force_timer(0), // force initial animation
|
||||||
|
@ -1036,6 +1037,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
|
||||||
{
|
{
|
||||||
m_enable_shaders = data->m_use_shaders;
|
m_enable_shaders = data->m_use_shaders;
|
||||||
m_use_tangent_vertices = data->m_use_tangent_vertices;
|
m_use_tangent_vertices = data->m_use_tangent_vertices;
|
||||||
|
m_enable_vbo = g_settings->getBool("enable_vbo");
|
||||||
|
|
||||||
if (g_settings->getBool("enable_minimap")) {
|
if (g_settings->getBool("enable_minimap")) {
|
||||||
m_minimap_mapblock = new MinimapMapblock;
|
m_minimap_mapblock = new MinimapMapblock;
|
||||||
|
@ -1261,14 +1263,9 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Use VBO for mesh (this just would set this for ever buffer)
|
// Use VBO for mesh (this just would set this for ever buffer)
|
||||||
// This will lead to infinite memory usage because or irrlicht.
|
if (m_enable_vbo) {
|
||||||
//m_mesh->setHardwareMappingHint(scene::EHM_STATIC);
|
m_mesh->setHardwareMappingHint(scene::EHM_STATIC);
|
||||||
|
}
|
||||||
/*
|
|
||||||
NOTE: If that is enabled, some kind of a queue to the main
|
|
||||||
thread should be made which would call irrlicht to delete
|
|
||||||
the hardware buffer and then delete the mesh
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//std::cout<<"added "<<fastfaces.getSize()<<" faces."<<std::endl;
|
//std::cout<<"added "<<fastfaces.getSize()<<" faces."<<std::endl;
|
||||||
|
@ -1282,6 +1279,12 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
|
||||||
|
|
||||||
MapBlockMesh::~MapBlockMesh()
|
MapBlockMesh::~MapBlockMesh()
|
||||||
{
|
{
|
||||||
|
if (m_enable_vbo && m_mesh) {
|
||||||
|
for (u32 i = 0; i < m_mesh->getMeshBufferCount(); i++) {
|
||||||
|
scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i);
|
||||||
|
m_driver->removeHardwareBuffer(buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
m_mesh->drop();
|
m_mesh->drop();
|
||||||
m_mesh = NULL;
|
m_mesh = NULL;
|
||||||
delete m_minimap_mapblock;
|
delete m_minimap_mapblock;
|
||||||
|
@ -1362,6 +1365,10 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
|
||||||
// Day-night transition
|
// Day-night transition
|
||||||
if(!m_enable_shaders && (daynight_ratio != m_last_daynight_ratio))
|
if(!m_enable_shaders && (daynight_ratio != m_last_daynight_ratio))
|
||||||
{
|
{
|
||||||
|
// Force reload mesh to VBO
|
||||||
|
if (m_enable_vbo) {
|
||||||
|
m_mesh->setDirty();
|
||||||
|
}
|
||||||
for(std::map<u32, std::map<u32, std::pair<u8, u8> > >::iterator
|
for(std::map<u32, std::map<u32, std::pair<u8, u8> > >::iterator
|
||||||
i = m_daynight_diffs.begin();
|
i = m_daynight_diffs.begin();
|
||||||
i != m_daynight_diffs.end(); ++i)
|
i != m_daynight_diffs.end(); ++i)
|
||||||
|
@ -1387,6 +1394,9 @@ void MapBlockMesh::updateCameraOffset(v3s16 camera_offset)
|
||||||
{
|
{
|
||||||
if (camera_offset != m_camera_offset) {
|
if (camera_offset != m_camera_offset) {
|
||||||
translateMesh(m_mesh, intToFloat(m_camera_offset-camera_offset, BS));
|
translateMesh(m_mesh, intToFloat(m_camera_offset-camera_offset, BS));
|
||||||
|
if (m_enable_vbo) {
|
||||||
|
m_mesh->setDirty();
|
||||||
|
}
|
||||||
m_camera_offset = camera_offset;
|
m_camera_offset = camera_offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,11 +128,13 @@ private:
|
||||||
scene::IMesh *m_mesh;
|
scene::IMesh *m_mesh;
|
||||||
MinimapMapblock *m_minimap_mapblock;
|
MinimapMapblock *m_minimap_mapblock;
|
||||||
IGameDef *m_gamedef;
|
IGameDef *m_gamedef;
|
||||||
|
video::IVideoDriver *m_driver;
|
||||||
ITextureSource *m_tsrc;
|
ITextureSource *m_tsrc;
|
||||||
IShaderSource *m_shdrsrc;
|
IShaderSource *m_shdrsrc;
|
||||||
|
|
||||||
bool m_enable_shaders;
|
bool m_enable_shaders;
|
||||||
bool m_use_tangent_vertices;
|
bool m_use_tangent_vertices;
|
||||||
|
bool m_enable_vbo;
|
||||||
|
|
||||||
// Must animate() be called before rendering?
|
// Must animate() be called before rendering?
|
||||||
bool m_has_animation;
|
bool m_has_animation;
|
||||||
|
|
Loading…
Reference in New Issue