summaryrefslogtreecommitdiff
path: root/src/content_cao.cpp
diff options
context:
space:
mode:
authorSapier <sapier AT gmx dot net>2015-12-19 04:43:59 +0100
committerSapier <sapier AT gmx dot net>2015-12-29 16:27:06 +0100
commit91bafceee6606fab79db1bde4cba01b84fed65c7 (patch)
treeb09068be483bdac711954a112ddb4226d6504742 /src/content_cao.cpp
parentf14e7bac54af65e3d3d99f89f23f114b17058e49 (diff)
downloadminetest-91bafceee6606fab79db1bde4cba01b84fed65c7.tar.gz
minetest-91bafceee6606fab79db1bde4cba01b84fed65c7.tar.bz2
minetest-91bafceee6606fab79db1bde4cba01b84fed65c7.zip
Add support for using arbitrary meshes as items
Diffstat (limited to 'src/content_cao.cpp')
-rw-r--r--src/content_cao.cpp61
1 files changed, 52 insertions, 9 deletions
diff --git a/src/content_cao.cpp b/src/content_cao.cpp
index 1b8e84c8f..bde0dd320 100644
--- a/src/content_cao.cpp
+++ b/src/content_cao.cpp
@@ -954,15 +954,43 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc,
IItemDefManager *idef = m_gamedef->idef();
ItemStack item(m_prop.textures[0], 1, 0, "", idef);
- m_wield_meshnode = new WieldMeshSceneNode(
- smgr->getRootSceneNode(), smgr, -1);
- m_wield_meshnode->setItem(item, m_gamedef);
-
- m_wield_meshnode->setScale(v3f(m_prop.visual_size.X/2,
- m_prop.visual_size.Y/2,
- m_prop.visual_size.X/2));
- u8 li = m_last_light;
- m_wield_meshnode->setColor(video::SColor(255,li,li,li));
+ if (!item.getDefinition(idef).meshname.empty())
+ {
+ scene::IAnimatedMesh *mesh = m_gamedef->getMesh(item.getDefinition(idef).meshname);
+ if(mesh)
+ {
+ m_animated_meshnode = smgr->addAnimatedMeshSceneNode(mesh, NULL);
+
+ m_animated_meshnode->grab();
+ mesh->drop(); // The scene node took hold of it
+ m_animated_meshnode->animateJoints(); // Needed for some animations
+ m_animated_meshnode->setScale(v3f(m_prop.visual_size.X,
+ m_prop.visual_size.Y,
+ m_prop.visual_size.X));
+ u8 li = m_last_light;
+ setMeshColor(m_animated_meshnode->getMesh(), video::SColor(255,li,li,li));
+
+ bool backface_culling = m_prop.backface_culling;
+ if (m_is_player)
+ backface_culling = false;
+
+ m_animated_meshnode->setMaterialFlag(video::EMF_LIGHTING, false);
+ m_animated_meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
+ 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_BACK_FACE_CULLING, backface_culling);
+ }
+ }
+ else {
+ m_wield_meshnode = new WieldMeshSceneNode(
+ smgr->getRootSceneNode(), smgr, -1);
+ m_wield_meshnode->setItem(item, m_gamedef);
+ m_wield_meshnode->setScale(v3f(m_prop.visual_size.X/2,
+ m_prop.visual_size.Y/2,
+ m_prop.visual_size.X/2));
+ u8 li = m_last_light;
+ m_wield_meshnode->setColor(video::SColor(255,li,li,li));
+ }
}
} else {
infostream<<"GenericCAO::addToScene(): \""<<m_prop.visual
@@ -1402,6 +1430,21 @@ void GenericCAO::updateTextures(const std::string &mod)
m_animated_meshnode->getMaterial(i).SpecularColor = m_prop.colors[i];
}
}
+ else if (m_prop.visual == "wielditem") {
+ IItemDefManager *idef = m_gamedef->idef();
+ ItemStack item(m_prop.textures[0], 1, 0, "", idef);
+
+ if (!item.getDefinition(idef).meshname.empty()) {
+
+ unsigned int materialcount = m_animated_meshnode->getMaterialCount();
+
+ for (unsigned int i = 0; i < materialcount; i++) {
+ m_animated_meshnode->getMaterial(i)
+ .setTexture(0, tsrc->getTexture(item
+ .getDefinition(idef).meshtexture));
+ }
+ }
+ }
}
if(m_meshnode)
{