mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	Recalculate normals for cached meshes.
Check if mesh is here before adding to meshcollector. Fix deleting the meshes.
This commit is contained in:
		@@ -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(): "
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
 
 | 
			
		||||
@@ -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;}
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -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.
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -290,7 +290,8 @@ public:
 | 
			
		||||
	virtual ISoundManager* getSoundManager();
 | 
			
		||||
	virtual MtEventManager* getEventManager();
 | 
			
		||||
	virtual IRollbackReportSink* getRollbackReportSink();
 | 
			
		||||
 | 
			
		||||
	virtual scene::ISceneManager* getSceneManager();
 | 
			
		||||
	
 | 
			
		||||
	IWritableItemDefManager* getWritableItemDefManager();
 | 
			
		||||
	IWritableNodeDefManager* getWritableNodeDefManager();
 | 
			
		||||
	IWritableCraftDefManager* getWritableCraftDefManager();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user