diff options
author | RealBadAngel <maciej.kasatkin@o2.pl> | 2014-10-28 08:02:28 +0100 |
---|---|---|
committer | RealBadAngel <maciej.kasatkin@o2.pl> | 2014-10-29 08:37:33 +0100 |
commit | dd4c21c1808acedfbcf8402c09ce9129b6ac31c7 (patch) | |
tree | 79159a4bc4f71f4adef9f0f5e7af00c90ba9dc08 /src/content_mapblock.cpp | |
parent | 813c088c1c66df45731c9015248b22d55e694c76 (diff) | |
download | minetest-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.cpp | 36 |
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;} } |