Recalculate normals for cached meshes.
authorRealBadAngel <maciej.kasatkin@o2.pl>
Tue, 21 Oct 2014 03:12:15 +0000 (05:12 +0200)
committerRealBadAngel <maciej.kasatkin@o2.pl>
Tue, 21 Oct 2014 16:43:29 +0000 (18:43 +0200)
Check if mesh is here before adding to meshcollector.

Fix deleting the meshes.

src/client.cpp
src/client.h
src/content_mapblock.cpp
src/gamedef.h
src/nodedef.cpp
src/server.cpp
src/server.h

index 7e74cf36bbd1341069b633a1bfbe9bcec9a93dbf..c6319d5846e8ca1eb536620b87641d9c6eefa280 100644 (file)
@@ -2781,6 +2781,10 @@ IShaderSource* Client::getShaderSource()
 {
        return m_shsrc;
 }
+scene::ISceneManager* Client::getSceneManager()
+{
+       return m_device->getSceneManager();
+}
 u16 Client::allocateUnknownNodeId(const std::string &name)
 {
        errorstream<<"Client::allocateUnknownNodeId(): "
index e3b425a32d0d3bdf2c8b42dfa53ccb44ceebc88a..084f7be2c42f465ad298aabf71ccbf32f575623d 100644 (file)
@@ -447,6 +447,7 @@ public:
        virtual ICraftDefManager* getCraftDefManager();
        virtual ITextureSource* getTextureSource();
        virtual IShaderSource* getShaderSource();
+       virtual scene::ISceneManager* getSceneManager();
        virtual u16 allocateUnknownNodeId(const std::string &name);
        virtual ISoundManager* getSoundManager();
        virtual MtEventManager* getEventManager();
index 996db421b35e030cce74b432788a4f695acaacac..527086b89601ad4326b7b314cbbc6b36ebb2686a 100644 (file)
@@ -1720,11 +1720,13 @@ 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);
-                       for(u16 j = 0; j < f.mesh_ptr[facedir]->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);
+                       if (f.mesh_ptr[facedir]) {
+                               for(u16 j = 0; j < f.mesh_ptr[facedir]->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);
+                               }
                        }
                break;}
                }
index 6da288bad8879992475c30592ec6045f8a6440b0..b7830373b0ccd8c2e559dbfa673f394c4e4907f3 100644 (file)
@@ -33,6 +33,7 @@ class MtEventManager;
 class IRollbackReportSink;
 namespace irr { namespace scene {
        class IAnimatedMesh;
+       class ISceneManager;
 }}
 
 /*
@@ -63,6 +64,7 @@ public:
        virtual MtEventManager* getEventManager()=0;
        virtual scene::IAnimatedMesh* getMesh(const std::string &filename)
        { return NULL; }
+       virtual scene::ISceneManager* getSceneManager()=0;
 
        // Only usable on the server, and NOT thread-safe. It is usable from the
        // environment thread.
index 2f95b68f9362f37b4302f4e9a83a35425f24fbe1..cf30d76b3f77a3e7683ca45bdb52957851da932a 100644 (file)
@@ -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);
                        }
                }
        }
index 6afe600ed052474b407a19d71b5d666fa9058ee1..d4d9816ddc125ca0be984463787d637991a3511b 100644 (file)
@@ -4890,6 +4890,11 @@ IShaderSource* Server::getShaderSource()
 {
        return NULL;
 }
+scene::ISceneManager* Server::getSceneManager()
+{
+       return NULL;
+}
+
 u16 Server::allocateUnknownNodeId(const std::string &name)
 {
        return m_nodedef->allocateDummy(name);
index cb0baceced8fd1358980192a9d8ae9b9cd2653e7..7233ffbe84894041e01cde081301253192795a56 100644 (file)
@@ -290,7 +290,8 @@ public:
        virtual ISoundManager* getSoundManager();
        virtual MtEventManager* getEventManager();
        virtual IRollbackReportSink* getRollbackReportSink();
-
+       virtual scene::ISceneManager* getSceneManager();
+       
        IWritableItemDefManager* getWritableItemDefManager();
        IWritableNodeDefManager* getWritableNodeDefManager();
        IWritableCraftDefManager* getWritableCraftDefManager();