summaryrefslogtreecommitdiff
path: root/src/content_mapblock.cpp
diff options
context:
space:
mode:
authorRealBadAngel <maciej.kasatkin@o2.pl>2014-10-28 08:02:28 +0100
committerRealBadAngel <maciej.kasatkin@o2.pl>2014-10-29 08:37:33 +0100
commitdd4c21c1808acedfbcf8402c09ce9129b6ac31c7 (patch)
tree79159a4bc4f71f4adef9f0f5e7af00c90ba9dc08 /src/content_mapblock.cpp
parent813c088c1c66df45731c9015248b22d55e694c76 (diff)
downloadminetest-dd4c21c1808acedfbcf8402c09ce9129b6ac31c7.tar.gz
minetest-dd4c21c1808acedfbcf8402c09ce9129b6ac31c7.tar.bz2
minetest-dd4c21c1808acedfbcf8402c09ce9129b6ac31c7.zip
Add option to enable mesh caching, add wallmounted for meshes.
Diffstat (limited to 'src/content_mapblock.cpp')
-rw-r--r--src/content_mapblock.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp
index ef1f1d858..9f0d8aa5f 100644
--- a/src/content_mapblock.cpp
+++ b/src/content_mapblock.cpp
@@ -25,6 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "settings.h"
#include "nodedef.h"
#include "tile.h"
+#include "mesh.h"
+#include <IMeshManipulator.h>
#include "gamedef.h"
#include "log.h"
@@ -171,6 +173,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
{
INodeDefManager *nodedef = data->m_gamedef->ndef();
ITextureSource *tsrc = data->m_gamedef->tsrc();
+ scene::ISceneManager* smgr = data->m_gamedef->getSceneManager();
+ scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator();
// 0ms
//TimeTaker timer("mapblock_mesh_generate_special()");
@@ -178,6 +182,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
/*
Some settings
*/
+ bool enable_mesh_cache = g_settings->getBool("enable_mesh_cache");
bool new_style_water = g_settings->getBool("new_style_water");
float node_liquid_level = 1.0;
@@ -1719,14 +1724,41 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
{
v3f pos = intToFloat(p, BS);
video::SColor c = MapBlock_LightColor(255, getInteriorLight(n, 1, nodedef), f.light_source);
- u8 facedir = n.getFaceDir(nodedef);
+
+ u8 facedir = 0;
+ if (f.param_type_2 == CPT2_FACEDIR) {
+ facedir = n.getFaceDir(nodedef);
+ } else if (f.param_type_2 == CPT2_WALLMOUNTED) {
+ //convert wallmounted to 6dfacedir.
+ //when cache enabled, it is already converted
+ facedir = n.getWallMounted(nodedef);
+ if (!enable_mesh_cache) {
+ static const u8 wm_to_6d[6] = {20, 0, 16, 12, 8, 4};
+ facedir = wm_to_6d[facedir];
+ }
+ }
+
if (f.mesh_ptr[facedir]) {
- for(u16 j = 0; j < f.mesh_ptr[facedir]->getMeshBufferCount(); j++) {
+ // use cached meshes
+ for(u16 j = 0; j < f.mesh_ptr[0]->getMeshBufferCount(); j++) {
scene::IMeshBuffer *buf = f.mesh_ptr[facedir]->getMeshBuffer(j);
collector.append(getNodeTileN(n, p, j, data),
(video::S3DVertex *)buf->getVertices(), buf->getVertexCount(),
buf->getIndices(), buf->getIndexCount(), pos, c);
}
+ } else if (f.mesh_ptr[0]) {
+ // no cache, clone and rotate mesh
+ scene::IMesh* mesh = cloneMesh(f.mesh_ptr[0]);
+ rotateMeshBy6dFacedir(mesh, facedir);
+ recalculateBoundingBox(mesh);
+ meshmanip->recalculateNormals(mesh, true, false);
+ for(u16 j = 0; j < mesh->getMeshBufferCount(); j++) {
+ scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
+ collector.append(getNodeTileN(n, p, j, data),
+ (video::S3DVertex *)buf->getVertices(), buf->getVertexCount(),
+ buf->getIndices(), buf->getIndexCount(), pos, c);
+ }
+ mesh->drop();
}
break;}
}