Skip to content

Commit d221917

Browse files
committedOct 21, 2014
Recalculate normals for cached meshes.
Check if mesh is here before adding to meshcollector. Fix deleting the meshes.
1 parent 9029a34 commit d221917

File tree

7 files changed

+44
-17
lines changed

7 files changed

+44
-17
lines changed
 

Diff for: ‎src/client.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -2781,6 +2781,10 @@ IShaderSource* Client::getShaderSource()
27812781
{
27822782
return m_shsrc;
27832783
}
2784+
scene::ISceneManager* Client::getSceneManager()
2785+
{
2786+
return m_device->getSceneManager();
2787+
}
27842788
u16 Client::allocateUnknownNodeId(const std::string &name)
27852789
{
27862790
errorstream<<"Client::allocateUnknownNodeId(): "

Diff for: ‎src/client.h

+1
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
447447
virtual ICraftDefManager* getCraftDefManager();
448448
virtual ITextureSource* getTextureSource();
449449
virtual IShaderSource* getShaderSource();
450+
virtual scene::ISceneManager* getSceneManager();
450451
virtual u16 allocateUnknownNodeId(const std::string &name);
451452
virtual ISoundManager* getSoundManager();
452453
virtual MtEventManager* getEventManager();

Diff for: ‎src/content_mapblock.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -1720,11 +1720,13 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
17201720
v3f pos = intToFloat(p, BS);
17211721
video::SColor c = MapBlock_LightColor(255, getInteriorLight(n, 1, nodedef), f.light_source);
17221722
u8 facedir = n.getFaceDir(nodedef);
1723-
for(u16 j = 0; j < f.mesh_ptr[facedir]->getMeshBufferCount(); j++) {
1724-
scene::IMeshBuffer *buf = f.mesh_ptr[facedir]->getMeshBuffer(j);
1725-
collector.append(getNodeTileN(n, p, j, data),
1726-
(video::S3DVertex *)buf->getVertices(), buf->getVertexCount(),
1727-
buf->getIndices(), buf->getIndexCount(), pos, c);
1723+
if (f.mesh_ptr[facedir]) {
1724+
for(u16 j = 0; j < f.mesh_ptr[facedir]->getMeshBufferCount(); j++) {
1725+
scene::IMeshBuffer *buf = f.mesh_ptr[facedir]->getMeshBuffer(j);
1726+
collector.append(getNodeTileN(n, p, j, data),
1727+
(video::S3DVertex *)buf->getVertices(), buf->getVertexCount(),
1728+
buf->getIndices(), buf->getIndexCount(), pos, c);
1729+
}
17281730
}
17291731
break;}
17301732
}

Diff for: ‎src/gamedef.h

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class MtEventManager;
3333
class IRollbackReportSink;
3434
namespace irr { namespace scene {
3535
class IAnimatedMesh;
36+
class ISceneManager;
3637
}}
3738

3839
/*
@@ -63,6 +64,7 @@ class IGameDef
6364
virtual MtEventManager* getEventManager()=0;
6465
virtual scene::IAnimatedMesh* getMesh(const std::string &filename)
6566
{ return NULL; }
67+
virtual scene::ISceneManager* getSceneManager()=0;
6668

6769
// Only usable on the server, and NOT thread-safe. It is usable from the
6870
// environment thread.

Diff for: ‎src/nodedef.cpp

+23-11
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2424
#ifndef SERVER
2525
#include "tile.h"
2626
#include "mesh.h"
27+
#include <IMeshManipulator.h>
2728
#endif
2829
#include "log.h"
2930
#include "settings.h"
@@ -171,12 +172,6 @@ ContentFeatures::ContentFeatures()
171172

172173
ContentFeatures::~ContentFeatures()
173174
{
174-
#ifndef SERVER
175-
for (u32 i = 0; i < 24; i++) {
176-
if (mesh_ptr[i])
177-
mesh_ptr[i]->drop();
178-
}
179-
#endif
180175
}
181176

182177
void ContentFeatures::reset()
@@ -446,6 +441,15 @@ CNodeDefManager::CNodeDefManager()
446441

447442
CNodeDefManager::~CNodeDefManager()
448443
{
444+
#ifndef SERVER
445+
for (u32 i = 0; i < m_content_features.size(); i++) {
446+
ContentFeatures *f = &m_content_features[i];
447+
for (u32 j = 0; j < 24; j++) {
448+
if (f->mesh_ptr[j])
449+
f->mesh_ptr[j]->drop();
450+
}
451+
}
452+
#endif
449453
}
450454

451455

@@ -695,6 +699,8 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
695699

696700
ITextureSource *tsrc = gamedef->tsrc();
697701
IShaderSource *shdsrc = gamedef->getShaderSource();
702+
scene::ISceneManager* smgr = gamedef->getSceneManager();
703+
scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator();
698704

699705
bool new_style_water = g_settings->getBool("new_style_water");
700706
bool new_style_leaves = g_settings->getBool("new_style_leaves");
@@ -840,18 +846,23 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
840846
// Read the mesh and apply scale
841847
if ((f->drawtype == NDT_MESH) && (f->mesh != "")) {
842848
f->mesh_ptr[0] = gamedef->getMesh(f->mesh);
843-
scaleMesh(f->mesh_ptr[0], v3f(f->visual_scale,f->visual_scale,f->visual_scale));
844-
recalculateBoundingBox(f->mesh_ptr[0]);
849+
if (f->mesh_ptr[0]){
850+
v3f scale = v3f(1.0, 1.0, 1.0) * BS * f->visual_scale;
851+
scaleMesh(f->mesh_ptr[0], scale);
852+
recalculateBoundingBox(f->mesh_ptr[0]);
853+
}
845854
}
846855

847856
//Convert regular nodebox nodes to meshnodes
848857
//Change the drawtype and apply scale
849-
if ((f->drawtype == NDT_NODEBOX) &&
850-
((f->node_box.type == NODEBOX_REGULAR) || (f->node_box.type == NODEBOX_FIXED)) &&
858+
else if ((f->drawtype == NDT_NODEBOX) &&
859+
((f->node_box.type == NODEBOX_REGULAR) ||
860+
(f->node_box.type == NODEBOX_FIXED)) &&
851861
(!f->node_box.fixed.empty())) {
852862
f->drawtype = NDT_MESH;
853863
f->mesh_ptr[0] = convertNodeboxNodeToMesh(f);
854-
scaleMesh(f->mesh_ptr[0], v3f(f->visual_scale,f->visual_scale,f->visual_scale));
864+
v3f scale = v3f(1.0, 1.0, 1.0) * f->visual_scale;
865+
scaleMesh(f->mesh_ptr[0], scale);
855866
recalculateBoundingBox(f->mesh_ptr[0]);
856867
}
857868

@@ -861,6 +872,7 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef)
861872
f->mesh_ptr[j] = cloneMesh(f->mesh_ptr[0]);
862873
rotateMeshBy6dFacedir(f->mesh_ptr[j], j);
863874
recalculateBoundingBox(f->mesh_ptr[j]);
875+
meshmanip->recalculateNormals(f->mesh_ptr[j], false, false);
864876
}
865877
}
866878
}

Diff for: ‎src/server.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -4890,6 +4890,11 @@ IShaderSource* Server::getShaderSource()
48904890
{
48914891
return NULL;
48924892
}
4893+
scene::ISceneManager* Server::getSceneManager()
4894+
{
4895+
return NULL;
4896+
}
4897+
48934898
u16 Server::allocateUnknownNodeId(const std::string &name)
48944899
{
48954900
return m_nodedef->allocateDummy(name);

Diff for: ‎src/server.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,8 @@ class Server : public con::PeerHandler, public MapEventReceiver,
290290
virtual ISoundManager* getSoundManager();
291291
virtual MtEventManager* getEventManager();
292292
virtual IRollbackReportSink* getRollbackReportSink();
293-
293+
virtual scene::ISceneManager* getSceneManager();
294+
294295
IWritableItemDefManager* getWritableItemDefManager();
295296
IWritableNodeDefManager* getWritableNodeDefManager();
296297
IWritableCraftDefManager* getWritableCraftDefManager();

0 commit comments

Comments
 (0)
Please sign in to comment.