From f9d727764fc9c74990fc979d4966a33882d0c19b Mon Sep 17 00:00:00 2001 From: RealBadAngel Date: Mon, 22 Feb 2016 04:26:32 +0100 Subject: Mapblock mesh: Allow to use VBO --- src/defaultsettings.cpp | 3 ++- src/mapblock_mesh.cpp | 28 +++++++++++++++++++--------- src/mapblock_mesh.h | 2 ++ 3 files changed, 23 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index f7ac310be..db2950fc2 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -176,7 +176,8 @@ void set_default_settings(Settings *settings) settings->setDefault("repeat_rightclick_time", "0.25"); settings->setDefault("enable_particles", "true"); settings->setDefault("enable_mesh_cache", "false"); - + settings->setDefault("enable_vbo", "true"); + settings->setDefault("enable_minimap", "true"); settings->setDefault("minimap_shape_round", "true"); settings->setDefault("minimap_double_scan_height", "true"); diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index e1ec50ab0..e1b044271 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -1026,6 +1026,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): m_mesh(new scene::SMesh()), m_minimap_mapblock(NULL), m_gamedef(data->m_gamedef), + m_driver(m_gamedef->tsrc()->getDevice()->getVideoDriver()), m_tsrc(m_gamedef->getTextureSource()), m_shdrsrc(m_gamedef->getShaderSource()), m_animation_force_timer(0), // force initial animation @@ -1036,7 +1037,8 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): { m_enable_shaders = data->m_use_shaders; m_use_tangent_vertices = data->m_use_tangent_vertices; - + m_enable_vbo = g_settings->getBool("enable_vbo"); + if (g_settings->getBool("enable_minimap")) { m_minimap_mapblock = new MinimapMapblock; m_minimap_mapblock->getMinimapNodes( @@ -1261,14 +1263,9 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): #endif // Use VBO for mesh (this just would set this for ever buffer) - // This will lead to infinite memory usage because or irrlicht. - //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 - */ + if (m_enable_vbo) { + m_mesh->setHardwareMappingHint(scene::EHM_STATIC); + } } //std::cout<<"added "<getMeshBufferCount(); i++) { + scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i); + m_driver->removeHardwareBuffer(buf); + } + } m_mesh->drop(); m_mesh = NULL; delete m_minimap_mapblock; @@ -1362,6 +1365,10 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat // Day-night transition 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 > >::iterator i = m_daynight_diffs.begin(); i != m_daynight_diffs.end(); ++i) @@ -1387,6 +1394,9 @@ void MapBlockMesh::updateCameraOffset(v3s16 camera_offset) { if (camera_offset != m_camera_offset) { translateMesh(m_mesh, intToFloat(m_camera_offset-camera_offset, BS)); + if (m_enable_vbo) { + m_mesh->setDirty(); + } m_camera_offset = camera_offset; } } diff --git a/src/mapblock_mesh.h b/src/mapblock_mesh.h index 987490408..f89fbe669 100644 --- a/src/mapblock_mesh.h +++ b/src/mapblock_mesh.h @@ -128,11 +128,13 @@ private: scene::IMesh *m_mesh; MinimapMapblock *m_minimap_mapblock; IGameDef *m_gamedef; + video::IVideoDriver *m_driver; ITextureSource *m_tsrc; IShaderSource *m_shdrsrc; bool m_enable_shaders; bool m_use_tangent_vertices; + bool m_enable_vbo; // Must animate() be called before rendering? bool m_has_animation; -- cgit v1.2.3