Mapblock mesh: Allow to use VBO
authorRealBadAngel <maciej.kasatkin@o2.pl>
Mon, 22 Feb 2016 03:26:32 +0000 (04:26 +0100)
committerparamat <mat.gregory@virginmedia.com>
Fri, 26 Feb 2016 00:51:01 +0000 (00:51 +0000)
builtin/settingtypes.txt
src/defaultsettings.cpp
src/mapblock_mesh.cpp
src/mapblock_mesh.h

index 003a6685e5f99b21aa88dfb10cd24eb2dc03406e..493cedd683f48538df4d5b35547d3f56cf9f61a4 100644 (file)
@@ -252,6 +252,9 @@ serverlist_file (Serverlist file) string favoriteservers.txt
 
 [***Basic]
 
+#    Enable VBO
+enable_vbo (VBO) bool true
+
 #    Whether to fog out the end of the visible area.
 enable_fog (Fog) bool true
 
index f7ac310be437a309fab612c2019242c03cc3c47d..db2950fc239295d4c2d9a7ea2c492099c5648a81 100644 (file)
@@ -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");
index e1ec50ab08ff9946528b2eb690d999130a97fc94..e1b044271cb4983ab0432e05525bd7bdb18110aa 100644 (file)
@@ -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 "<<fastfaces.getSize()<<" faces."<<std::endl;
@@ -1282,6 +1279,12 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
 
 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 = 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<u32, std::map<u32, std::pair<u8, u8> > >::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;
        }
 }
index 987490408171084996c47f68fc5001cd0904e698..f89fbe66945a76264a46f89f4ac5a4952833083c 100644 (file)
@@ -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;