diff --git a/src/client.cpp b/src/client.cpp index 7e74cf36b..c6319d584 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -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(): " diff --git a/src/client.h b/src/client.h index e3b425a32..084f7be2c 100644 --- a/src/client.h +++ b/src/client.h @@ -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(); diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp index 996db421b..527086b89 100644 --- a/src/content_mapblock.cpp +++ b/src/content_mapblock.cpp @@ -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;} } diff --git a/src/gamedef.h b/src/gamedef.h index 6da288bad..b7830373b 100644 --- a/src/gamedef.h +++ b/src/gamedef.h @@ -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. 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 #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); } } } diff --git a/src/server.cpp b/src/server.cpp index 6afe600ed..d4d9816dd 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -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); diff --git a/src/server.h b/src/server.h index cb0bacece..7233ffbe8 100644 --- a/src/server.h +++ b/src/server.h @@ -290,7 +290,8 @@ public: virtual ISoundManager* getSoundManager(); virtual MtEventManager* getEventManager(); virtual IRollbackReportSink* getRollbackReportSink(); - + virtual scene::ISceneManager* getSceneManager(); + IWritableItemDefManager* getWritableItemDefManager(); IWritableNodeDefManager* getWritableNodeDefManager(); IWritableCraftDefManager* getWritableCraftDefManager();