Use Irrlicht's mesh cache for animated meshes.

Fixes #6676.
Allow animated meshes to be cached in Irrlicht's builtin mesh cache.
Use Material.EmmissiveColor instead of manipulating the mesh' vertex colors.
master
Lars Hofhansl 2017-12-04 22:25:09 -08:00
parent f470cb7270
commit fd9f195fcc
5 changed files with 25 additions and 9 deletions

View File

@ -1836,7 +1836,7 @@ ParticleManager* Client::getParticleManager()
return &m_particle_manager; return &m_particle_manager;
} }
scene::IAnimatedMesh* Client::getMesh(const std::string &filename) scene::IAnimatedMesh* Client::getMesh(const std::string &filename, bool cache)
{ {
StringMap::const_iterator it = m_mesh_data.find(filename); StringMap::const_iterator it = m_mesh_data.find(filename);
if (it == m_mesh_data.end()) { if (it == m_mesh_data.end()) {
@ -1855,9 +1855,8 @@ scene::IAnimatedMesh* Client::getMesh(const std::string &filename)
scene::IAnimatedMesh *mesh = RenderingEngine::get_scene_manager()->getMesh(rfile); scene::IAnimatedMesh *mesh = RenderingEngine::get_scene_manager()->getMesh(rfile);
rfile->drop(); rfile->drop();
// NOTE: By playing with Irrlicht refcounts, maybe we could cache a bunch
// of uniquely named instances and re-use them
mesh->grab(); mesh->grab();
if (!cache)
RenderingEngine::get_mesh_cache()->removeMesh(mesh); RenderingEngine::get_mesh_cache()->removeMesh(mesh);
return mesh; return mesh;
} }

View File

@ -376,7 +376,7 @@ public:
virtual ParticleManager* getParticleManager(); virtual ParticleManager* getParticleManager();
bool checkLocalPrivilege(const std::string &priv) bool checkLocalPrivilege(const std::string &priv)
{ return checkPrivilege(priv); } { return checkPrivilege(priv); }
virtual scene::IAnimatedMesh* getMesh(const std::string &filename); virtual scene::IAnimatedMesh* getMesh(const std::string &filename, bool cache = false);
const std::string* getModFile(const std::string &filename); const std::string* getModFile(const std::string &filename);
virtual std::string getModStoragePath() const; virtual std::string getModStoragePath() const;

View File

@ -563,7 +563,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
} }
else if(m_prop.visual == "mesh") { else if(m_prop.visual == "mesh") {
infostream<<"GenericCAO::addToScene(): mesh"<<std::endl; infostream<<"GenericCAO::addToScene(): mesh"<<std::endl;
scene::IAnimatedMesh *mesh = m_client->getMesh(m_prop.mesh); scene::IAnimatedMesh *mesh = m_client->getMesh(m_prop.mesh, true);
if(mesh) if(mesh)
{ {
m_animated_meshnode = RenderingEngine::get_scene_manager()-> m_animated_meshnode = RenderingEngine::get_scene_manager()->
@ -575,13 +575,17 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
m_prop.visual_size.Y, m_prop.visual_size.Y,
m_prop.visual_size.X)); m_prop.visual_size.X));
u8 li = m_last_light; u8 li = m_last_light;
// set vertex colors to ensure alpha is set
setMeshColor(m_animated_meshnode->getMesh(), video::SColor(255,li,li,li)); setMeshColor(m_animated_meshnode->getMesh(), video::SColor(255,li,li,li));
setAnimatedMeshColor(m_animated_meshnode, video::SColor(255,li,li,li));
bool backface_culling = m_prop.backface_culling; bool backface_culling = m_prop.backface_culling;
if (m_is_player) if (m_is_player)
backface_culling = false; backface_culling = false;
m_animated_meshnode->setMaterialFlag(video::EMF_LIGHTING, false); m_animated_meshnode->setMaterialFlag(video::EMF_LIGHTING, true);
m_animated_meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false); m_animated_meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
m_animated_meshnode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF); m_animated_meshnode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
m_animated_meshnode->setMaterialFlag(video::EMF_FOG_ENABLE, true); m_animated_meshnode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
@ -669,7 +673,7 @@ void GenericCAO::updateLightNoCheck(u8 light_at_pos)
if (m_meshnode) { if (m_meshnode) {
setMeshColor(m_meshnode->getMesh(), color); setMeshColor(m_meshnode->getMesh(), color);
} else if (m_animated_meshnode) { } else if (m_animated_meshnode) {
setMeshColor(m_animated_meshnode->getMesh(), color); setAnimatedMeshColor(m_animated_meshnode, color);
} else if (m_wield_meshnode) { } else if (m_wield_meshnode) {
m_wield_meshnode->setColor(color); m_wield_meshnode->setColor(color);
} else if (m_spritenode) { } else if (m_spritenode) {
@ -1025,7 +1029,7 @@ void GenericCAO::updateTextures(std::string mod)
// Set material flags and texture // Set material flags and texture
video::SMaterial& material = m_animated_meshnode->getMaterial(i); video::SMaterial& material = m_animated_meshnode->getMaterial(i);
material.TextureLayer[0].Texture = texture; material.TextureLayer[0].Texture = texture;
material.setFlag(video::EMF_LIGHTING, false); material.setFlag(video::EMF_LIGHTING, true);
material.setFlag(video::EMF_BILINEAR_FILTER, false); material.setFlag(video::EMF_BILINEAR_FILTER, false);
// don't filter low-res textures, makes them look blurry // don't filter low-res textures, makes them look blurry

View File

@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <iostream> #include <iostream>
#include <IAnimatedMesh.h> #include <IAnimatedMesh.h>
#include <SAnimatedMesh.h> #include <SAnimatedMesh.h>
#include <IAnimatedMeshSceneNode.h>
// In Irrlicht 1.8 the signature of ITexture::lock was changed from // In Irrlicht 1.8 the signature of ITexture::lock was changed from
// (bool, u32) to (E_TEXTURE_LOCK_MODE, u32). // (bool, u32) to (E_TEXTURE_LOCK_MODE, u32).
@ -184,6 +185,13 @@ void setMeshBufferColor(scene::IMeshBuffer *buf, const video::SColor &color)
((video::S3DVertex *) (vertices + i * stride))->Color = color; ((video::S3DVertex *) (vertices + i * stride))->Color = color;
} }
void setAnimatedMeshColor(scene::IAnimatedMeshSceneNode *node, const video::SColor &color)
{
for (u32 i = 0; i < node->getMaterialCount(); ++i) {
node->getMaterial(i).EmissiveColor = color;
}
}
void setMeshColor(scene::IMesh *mesh, const video::SColor &color) void setMeshColor(scene::IMesh *mesh, const video::SColor &color)
{ {
if (mesh == NULL) if (mesh == NULL)

View File

@ -58,6 +58,11 @@ void setMeshBufferColor(scene::IMeshBuffer *buf, const video::SColor &color);
*/ */
void setMeshColor(scene::IMesh *mesh, const video::SColor &color); void setMeshColor(scene::IMesh *mesh, const video::SColor &color);
/*
Set a constant color for an animated mesh
*/
void setAnimatedMeshColor(scene::IAnimatedMeshSceneNode *node, const video::SColor &color);
/*! /*!
* Overwrites the color of a mesh buffer. * Overwrites the color of a mesh buffer.
* The color is darkened based on the normal vector of the vertices. * The color is darkened based on the normal vector of the vertices.