1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Add option to enable mesh caching, add wallmounted for meshes.

This commit is contained in:
RealBadAngel 2014-10-28 08:02:28 +01:00
parent 813c088c1c
commit dd4c21c180
5 changed files with 61 additions and 13 deletions

View file

@ -714,6 +714,7 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
bool enable_shaders = g_settings->getBool("enable_shaders");
bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping");
bool enable_parallax_occlusion = g_settings->getBool("enable_parallax_occlusion");
bool enable_mesh_cache = g_settings->getBool("enable_mesh_cache");
bool use_normal_texture = enable_shaders &&
(enable_bumpmapping || enable_parallax_occlusion);
@ -847,23 +848,21 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
f->tiledef_special[j].backface_culling, f->alpha, material_type);
}
// Meshnode drawtype
// Read the mesh and apply scale
if ((f->drawtype == NDT_MESH) && (f->mesh != "")) {
// Meshnode drawtype
// Read the mesh and apply scale
f->mesh_ptr[0] = gamedef->getMesh(f->mesh);
if (f->mesh_ptr[0]){
v3f scale = v3f(1.0, 1.0, 1.0) * BS * f->visual_scale;
scaleMesh(f->mesh_ptr[0], scale);
recalculateBoundingBox(f->mesh_ptr[0]);
}
}
//Convert regular nodebox nodes to meshnodes
//Change the drawtype and apply scale
else if ((f->drawtype == NDT_NODEBOX) &&
} else if ((f->drawtype == NDT_NODEBOX) &&
((f->node_box.type == NODEBOX_REGULAR) ||
(f->node_box.type == NODEBOX_FIXED)) &&
(!f->node_box.fixed.empty())) {
//Convert regular nodebox nodes to meshnodes
//Change the drawtype and apply scale
f->drawtype = NDT_MESH;
f->mesh_ptr[0] = convertNodeboxNodeToMesh(f);
v3f scale = v3f(1.0, 1.0, 1.0) * f->visual_scale;
@ -871,14 +870,25 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
recalculateBoundingBox(f->mesh_ptr[0]);
}
//Cache 6dfacedir rotated clones of meshes
if (f->mesh_ptr[0] && (f->param_type_2 == CPT2_FACEDIR)) {
//Cache 6dfacedir and wallmounted rotated clones of meshes
if (enable_mesh_cache && f->mesh_ptr[0] && (f->param_type_2 == CPT2_FACEDIR)) {
for (u16 j = 1; j < 24; j++) {
f->mesh_ptr[j] = cloneMesh(f->mesh_ptr[0]);
rotateMeshBy6dFacedir(f->mesh_ptr[j], j);
recalculateBoundingBox(f->mesh_ptr[j]);
meshmanip->recalculateNormals(f->mesh_ptr[j], false, false);
meshmanip->recalculateNormals(f->mesh_ptr[j], true, false);
}
} else if (enable_mesh_cache && f->mesh_ptr[0] && (f->param_type_2 == CPT2_WALLMOUNTED)) {
static const u8 wm_to_6d[6] = {20, 0, 16, 12, 8, 4};
for (u16 j = 1; j < 6; j++) {
f->mesh_ptr[j] = cloneMesh(f->mesh_ptr[0]);
rotateMeshBy6dFacedir(f->mesh_ptr[j], wm_to_6d[j]);
recalculateBoundingBox(f->mesh_ptr[j]);
meshmanip->recalculateNormals(f->mesh_ptr[j], true, false);
}
rotateMeshBy6dFacedir(f->mesh_ptr[0], wm_to_6d[0]);
recalculateBoundingBox(f->mesh_ptr[0]);
meshmanip->recalculateNormals(f->mesh_ptr[0], true, false);
}
}
#endif