Skip to content

Commit dd4c21c

Browse files
committed
Add option to enable mesh caching, add wallmounted for meshes.
1 parent 813c088 commit dd4c21c

File tree

5 files changed

+61
-13
lines changed

5 files changed

+61
-13
lines changed

minetest.conf.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,8 @@
201201
#enable_waving_leaves = false
202202
# Set to true enables waving plants. Requires shaders enabled.
203203
#enable_waving_plants = false
204+
# Enables caching of facedir rotated meshes
205+
#enable_mesh_cache = true
204206
# The time in seconds it takes between repeated
205207
# right clicks when holding the right mouse button
206208
#repeat_rightclick_time = 0.25

src/content_mapblock.cpp

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2525
#include "settings.h"
2626
#include "nodedef.h"
2727
#include "tile.h"
28+
#include "mesh.h"
29+
#include <IMeshManipulator.h>
2830
#include "gamedef.h"
2931
#include "log.h"
3032

@@ -171,13 +173,16 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
171173
{
172174
INodeDefManager *nodedef = data->m_gamedef->ndef();
173175
ITextureSource *tsrc = data->m_gamedef->tsrc();
176+
scene::ISceneManager* smgr = data->m_gamedef->getSceneManager();
177+
scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator();
174178

175179
// 0ms
176180
//TimeTaker timer("mapblock_mesh_generate_special()");
177181

178182
/*
179183
Some settings
180184
*/
185+
bool enable_mesh_cache = g_settings->getBool("enable_mesh_cache");
181186
bool new_style_water = g_settings->getBool("new_style_water");
182187

183188
float node_liquid_level = 1.0;
@@ -1719,14 +1724,41 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
17191724
{
17201725
v3f pos = intToFloat(p, BS);
17211726
video::SColor c = MapBlock_LightColor(255, getInteriorLight(n, 1, nodedef), f.light_source);
1722-
u8 facedir = n.getFaceDir(nodedef);
1727+
1728+
u8 facedir = 0;
1729+
if (f.param_type_2 == CPT2_FACEDIR) {
1730+
facedir = n.getFaceDir(nodedef);
1731+
} else if (f.param_type_2 == CPT2_WALLMOUNTED) {
1732+
//convert wallmounted to 6dfacedir.
1733+
//when cache enabled, it is already converted
1734+
facedir = n.getWallMounted(nodedef);
1735+
if (!enable_mesh_cache) {
1736+
static const u8 wm_to_6d[6] = {20, 0, 16, 12, 8, 4};
1737+
facedir = wm_to_6d[facedir];
1738+
}
1739+
}
1740+
17231741
if (f.mesh_ptr[facedir]) {
1724-
for(u16 j = 0; j < f.mesh_ptr[facedir]->getMeshBufferCount(); j++) {
1742+
// use cached meshes
1743+
for(u16 j = 0; j < f.mesh_ptr[0]->getMeshBufferCount(); j++) {
17251744
scene::IMeshBuffer *buf = f.mesh_ptr[facedir]->getMeshBuffer(j);
17261745
collector.append(getNodeTileN(n, p, j, data),
17271746
(video::S3DVertex *)buf->getVertices(), buf->getVertexCount(),
17281747
buf->getIndices(), buf->getIndexCount(), pos, c);
17291748
}
1749+
} else if (f.mesh_ptr[0]) {
1750+
// no cache, clone and rotate mesh
1751+
scene::IMesh* mesh = cloneMesh(f.mesh_ptr[0]);
1752+
rotateMeshBy6dFacedir(mesh, facedir);
1753+
recalculateBoundingBox(mesh);
1754+
meshmanip->recalculateNormals(mesh, true, false);
1755+
for(u16 j = 0; j < mesh->getMeshBufferCount(); j++) {
1756+
scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
1757+
collector.append(getNodeTileN(n, p, j, data),
1758+
(video::S3DVertex *)buf->getVertices(), buf->getVertexCount(),
1759+
buf->getIndices(), buf->getIndexCount(), pos, c);
1760+
}
1761+
mesh->drop();
17301762
}
17311763
break;}
17321764
}

src/defaultsettings.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ void set_default_settings(Settings *settings)
153153
settings->setDefault("enable_shaders", "true");
154154
settings->setDefault("repeat_rightclick_time", "0.25");
155155
settings->setDefault("enable_particles", "true");
156+
settings->setDefault("enable_mesh_cache", "true");
156157

157158
settings->setDefault("curl_timeout", "5000");
158159
settings->setDefault("curl_parallel_limit", "8");

src/itemdef.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,10 @@ class CItemDefManager: public IWritableItemDefManager
400400
g_settings->setBool("enable_shaders",false);
401401
}
402402
MeshMakeData mesh_make_data(gamedef);
403-
MapNode mesh_make_node(id, param1, 0);
403+
u8 param2 = 0;
404+
if (f.param_type_2 == CPT2_WALLMOUNTED)
405+
param2 = 1;
406+
MapNode mesh_make_node(id, param1, param2);
404407
mesh_make_data.fillSingleNode(&mesh_make_node);
405408
MapBlockMesh mapblock_mesh(&mesh_make_data, v3s16(0, 0, 0));
406409
scene::IMesh *node_mesh = mapblock_mesh.getMesh();

src/nodedef.cpp

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,7 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
714714
bool enable_shaders = g_settings->getBool("enable_shaders");
715715
bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping");
716716
bool enable_parallax_occlusion = g_settings->getBool("enable_parallax_occlusion");
717+
bool enable_mesh_cache = g_settings->getBool("enable_mesh_cache");
717718

718719
bool use_normal_texture = enable_shaders &&
719720
(enable_bumpmapping || enable_parallax_occlusion);
@@ -847,38 +848,47 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
847848
f->tiledef_special[j].backface_culling, f->alpha, material_type);
848849
}
849850

850-
// Meshnode drawtype
851-
// Read the mesh and apply scale
852851
if ((f->drawtype == NDT_MESH) && (f->mesh != "")) {
852+
// Meshnode drawtype
853+
// Read the mesh and apply scale
853854
f->mesh_ptr[0] = gamedef->getMesh(f->mesh);
854855
if (f->mesh_ptr[0]){
855856
v3f scale = v3f(1.0, 1.0, 1.0) * BS * f->visual_scale;
856857
scaleMesh(f->mesh_ptr[0], scale);
857858
recalculateBoundingBox(f->mesh_ptr[0]);
858859
}
859-
}
860-
861-
//Convert regular nodebox nodes to meshnodes
862-
//Change the drawtype and apply scale
863-
else if ((f->drawtype == NDT_NODEBOX) &&
860+
} else if ((f->drawtype == NDT_NODEBOX) &&
864861
((f->node_box.type == NODEBOX_REGULAR) ||
865862
(f->node_box.type == NODEBOX_FIXED)) &&
866863
(!f->node_box.fixed.empty())) {
864+
//Convert regular nodebox nodes to meshnodes
865+
//Change the drawtype and apply scale
867866
f->drawtype = NDT_MESH;
868867
f->mesh_ptr[0] = convertNodeboxNodeToMesh(f);
869868
v3f scale = v3f(1.0, 1.0, 1.0) * f->visual_scale;
870869
scaleMesh(f->mesh_ptr[0], scale);
871870
recalculateBoundingBox(f->mesh_ptr[0]);
872871
}
873872

874-
//Cache 6dfacedir rotated clones of meshes
875-
if (f->mesh_ptr[0] && (f->param_type_2 == CPT2_FACEDIR)) {
873+
//Cache 6dfacedir and wallmounted rotated clones of meshes
874+
if (enable_mesh_cache && f->mesh_ptr[0] && (f->param_type_2 == CPT2_FACEDIR)) {
876875
for (u16 j = 1; j < 24; j++) {
877876
f->mesh_ptr[j] = cloneMesh(f->mesh_ptr[0]);
878877
rotateMeshBy6dFacedir(f->mesh_ptr[j], j);
879878
recalculateBoundingBox(f->mesh_ptr[j]);
880-
meshmanip->recalculateNormals(f->mesh_ptr[j], false, false);
879+
meshmanip->recalculateNormals(f->mesh_ptr[j], true, false);
880+
}
881+
} else if (enable_mesh_cache && f->mesh_ptr[0] && (f->param_type_2 == CPT2_WALLMOUNTED)) {
882+
static const u8 wm_to_6d[6] = {20, 0, 16, 12, 8, 4};
883+
for (u16 j = 1; j < 6; j++) {
884+
f->mesh_ptr[j] = cloneMesh(f->mesh_ptr[0]);
885+
rotateMeshBy6dFacedir(f->mesh_ptr[j], wm_to_6d[j]);
886+
recalculateBoundingBox(f->mesh_ptr[j]);
887+
meshmanip->recalculateNormals(f->mesh_ptr[j], true, false);
881888
}
889+
rotateMeshBy6dFacedir(f->mesh_ptr[0], wm_to_6d[0]);
890+
recalculateBoundingBox(f->mesh_ptr[0]);
891+
meshmanip->recalculateNormals(f->mesh_ptr[0], true, false);
882892
}
883893
}
884894
#endif

0 commit comments

Comments
 (0)