diff options
author | Sapier <sapier AT gmx dot net> | 2015-12-19 04:43:59 +0100 |
---|---|---|
committer | Sapier <sapier AT gmx dot net> | 2015-12-29 16:27:06 +0100 |
commit | 91bafceee6606fab79db1bde4cba01b84fed65c7 (patch) | |
tree | b09068be483bdac711954a112ddb4226d6504742 /src/content_cao.cpp | |
parent | f14e7bac54af65e3d3d99f89f23f114b17058e49 (diff) | |
download | minetest-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.cpp | 61 |
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) { |