summaryrefslogtreecommitdiff
path: root/src/nodedef.cpp
diff options
context:
space:
mode:
authorRealBadAngel <maciej.kasatkin@o2.pl>2014-10-21 05:12:15 +0200
committerRealBadAngel <maciej.kasatkin@o2.pl>2014-10-21 18:43:29 +0200
commitd221917170c2bb43c66e5e09f2a43350cf28d71b (patch)
treeb76f4ef279a5139756787413a423102b3dd20a68 /src/nodedef.cpp
parent9029a34cc6a3b19c1a431fe3ba069c30a13321fc (diff)
downloadminetest-d221917170c2bb43c66e5e09f2a43350cf28d71b.tar.gz
minetest-d221917170c2bb43c66e5e09f2a43350cf28d71b.tar.bz2
minetest-d221917170c2bb43c66e5e09f2a43350cf28d71b.zip
Recalculate normals for cached meshes.
Check if mesh is here before adding to meshcollector. Fix deleting the meshes.
Diffstat (limited to 'src/nodedef.cpp')
-rw-r--r--src/nodedef.cpp34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index 2f95b68f9..cf30d76b3 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef SERVER
#include "tile.h"
#include "mesh.h"
+#include <IMeshManipulator.h>
#endif
#include "log.h"
#include "settings.h"
@@ -171,12 +172,6 @@ ContentFeatures::ContentFeatures()
ContentFeatures::~ContentFeatures()
{
-#ifndef SERVER
- for (u32 i = 0; i < 24; i++) {
- if (mesh_ptr[i])
- mesh_ptr[i]->drop();
- }
-#endif
}
void ContentFeatures::reset()
@@ -446,6 +441,15 @@ CNodeDefManager::CNodeDefManager()
CNodeDefManager::~CNodeDefManager()
{
+#ifndef SERVER
+ for (u32 i = 0; i < m_content_features.size(); i++) {
+ ContentFeatures *f = &m_content_features[i];
+ for (u32 j = 0; j < 24; j++) {
+ if (f->mesh_ptr[j])
+ f->mesh_ptr[j]->drop();
+ }
+ }
+#endif
}
@@ -695,6 +699,8 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
ITextureSource *tsrc = gamedef->tsrc();
IShaderSource *shdsrc = gamedef->getShaderSource();
+ scene::ISceneManager* smgr = gamedef->getSceneManager();
+ scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator();
bool new_style_water = g_settings->getBool("new_style_water");
bool new_style_leaves = g_settings->getBool("new_style_leaves");
@@ -840,18 +846,23 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
// Read the mesh and apply scale
if ((f->drawtype == NDT_MESH) && (f->mesh != "")) {
f->mesh_ptr[0] = gamedef->getMesh(f->mesh);
- scaleMesh(f->mesh_ptr[0], v3f(f->visual_scale,f->visual_scale,f->visual_scale));
- recalculateBoundingBox(f->mesh_ptr[0]);
+ 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
- if ((f->drawtype == NDT_NODEBOX) &&
- ((f->node_box.type == NODEBOX_REGULAR) || (f->node_box.type == NODEBOX_FIXED)) &&
+ else if ((f->drawtype == NDT_NODEBOX) &&
+ ((f->node_box.type == NODEBOX_REGULAR) ||
+ (f->node_box.type == NODEBOX_FIXED)) &&
(!f->node_box.fixed.empty())) {
f->drawtype = NDT_MESH;
f->mesh_ptr[0] = convertNodeboxNodeToMesh(f);
- scaleMesh(f->mesh_ptr[0], v3f(f->visual_scale,f->visual_scale,f->visual_scale));
+ v3f scale = v3f(1.0, 1.0, 1.0) * f->visual_scale;
+ scaleMesh(f->mesh_ptr[0], scale);
recalculateBoundingBox(f->mesh_ptr[0]);
}
@@ -861,6 +872,7 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
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);
}
}
}