Skip to content

Commit

Permalink
Recalculate normals for cached meshes.
Browse files Browse the repository at this point in the history
Check if mesh is here before adding to meshcollector.

Fix deleting the meshes.
  • Loading branch information
RealBadAngel committed Oct 21, 2014
1 parent 9029a34 commit d221917
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 17 deletions.
4 changes: 4 additions & 0 deletions src/client.cpp
Expand Up @@ -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(): "
Expand Down
1 change: 1 addition & 0 deletions src/client.h
Expand Up @@ -447,6 +447,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
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();
Expand Down
12 changes: 7 additions & 5 deletions src/content_mapblock.cpp
Expand Up @@ -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;}
}
Expand Down
2 changes: 2 additions & 0 deletions src/gamedef.h
Expand Up @@ -33,6 +33,7 @@ class MtEventManager;
class IRollbackReportSink;
namespace irr { namespace scene {
class IAnimatedMesh;
class ISceneManager;
}}

/*
Expand Down Expand Up @@ -63,6 +64,7 @@ class IGameDef
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.
Expand Down
34 changes: 23 additions & 11 deletions src/nodedef.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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
}


Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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]);
}

Expand All @@ -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);
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions src/server.cpp
Expand Up @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion src/server.h
Expand Up @@ -290,7 +290,8 @@ class Server : public con::PeerHandler, public MapEventReceiver,
virtual ISoundManager* getSoundManager();
virtual MtEventManager* getEventManager();
virtual IRollbackReportSink* getRollbackReportSink();

virtual scene::ISceneManager* getSceneManager();

IWritableItemDefManager* getWritableItemDefManager();
IWritableNodeDefManager* getWritableNodeDefManager();
IWritableCraftDefManager* getWritableCraftDefManager();
Expand Down

0 comments on commit d221917

Please sign in to comment.