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
parent
f470cb7270
commit
fd9f195fcc
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue