summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRealBadAngel <maciej.kasatkin@o2.pl>2016-02-22 04:26:32 +0100
committerparamat <mat.gregory@virginmedia.com>2016-02-26 00:51:01 +0000
commitf9d727764fc9c74990fc979d4966a33882d0c19b (patch)
tree3b64e5b69de34576c0cb2489ddd79ddad87474a9
parent8eb7ddb0a2f03ae514a96191f6edba9333ba2423 (diff)
downloadminetest-f9d727764fc9c74990fc979d4966a33882d0c19b.tar.gz
minetest-f9d727764fc9c74990fc979d4966a33882d0c19b.tar.bz2
minetest-f9d727764fc9c74990fc979d4966a33882d0c19b.zip
Mapblock mesh: Allow to use VBO
-rw-r--r--builtin/settingtypes.txt3
-rw-r--r--src/defaultsettings.cpp3
-rw-r--r--src/mapblock_mesh.cpp28
-rw-r--r--src/mapblock_mesh.h2
4 files changed, 26 insertions, 10 deletions
diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt
index 003a6685e..493cedd68 100644
--- a/builtin/settingtypes.txt
+++ b/builtin/settingtypes.txt
@@ -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
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 "<<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;
}
}
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;