- else if(m_prop.visual == "upright_sprite")
- {
- scene::SMesh *mesh = new scene::SMesh();
- double dx = BS*m_prop.visual_size.X/2;
- double dy = BS*m_prop.visual_size.Y/2;
- { // Front
- scene::IMeshBuffer *buf = new scene::SMeshBuffer();
- u8 li = m_last_light;
- video::SColor c(255,li,li,li);
- video::S3DVertex vertices[4] =
- {
- video::S3DVertex(-dx,-dy,0, 0,0,0, c, 0,1),
- video::S3DVertex(dx,-dy,0, 0,0,0, c, 1,1),
- video::S3DVertex(dx,dy,0, 0,0,0, c, 1,0),
- video::S3DVertex(-dx,dy,0, 0,0,0, c, 0,0),
- };
- u16 indices[] = {0,1,2,2,3,0};
- buf->append(vertices, 4, indices, 6);
- // Set material
- buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
- buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
- buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
- buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
- // Add to mesh
- mesh->addMeshBuffer(buf);
- buf->drop();
- }
- { // Back
- scene::IMeshBuffer *buf = new scene::SMeshBuffer();
- u8 li = m_last_light;
- video::SColor c(255,li,li,li);
- video::S3DVertex vertices[4] =
- {
- video::S3DVertex(dx,-dy,0, 0,0,0, c, 1,1),
- video::S3DVertex(-dx,-dy,0, 0,0,0, c, 0,1),
- video::S3DVertex(-dx,dy,0, 0,0,0, c, 0,0),
- video::S3DVertex(dx,dy,0, 0,0,0, c, 1,0),
- };
- u16 indices[] = {0,1,2,2,3,0};
- buf->append(vertices, 4, indices, 6);
- // Set material
- buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
- buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
- buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
- buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
- // Add to mesh
- mesh->addMeshBuffer(buf);
- buf->drop();
- }
- m_meshnode = smgr->addMeshSceneNode(mesh, NULL);
- mesh->drop();
- // Set it to use the materials of the meshbuffers directly.
- // This is needed for changing the texture in the future
- m_meshnode->setReadOnlyMaterials(true);
- }
- else if(m_prop.visual == "cube"){
- infostream<<"GenericCAO::addToScene(): cube"<<std::endl;
- scene::IMesh *mesh = createCubeMesh(v3f(BS,BS,BS));
- m_meshnode = smgr->addMeshSceneNode(mesh, NULL);
- mesh->drop();
-
- m_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_meshnode->getMesh(), video::SColor(255,li,li,li));
-
- m_meshnode->setMaterialFlag(video::EMF_LIGHTING, false);
- m_meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
- m_meshnode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
- m_meshnode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
- }
- else if(m_prop.visual == "mesh"){
- infostream<<"GenericCAO::addToScene(): mesh"<<std::endl;
- scene::IAnimatedMesh *mesh = smgr->getMesh(m_prop.mesh.c_str());
- if(mesh)
- {
- m_animated_meshnode = smgr->addAnimatedMeshSceneNode(mesh, NULL);
- 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));
-
- 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);
- }
- else
- errorstream<<"GenericCAO::addToScene(): Could not load mesh "<<m_prop.mesh<<std::endl;
- }
- else if(m_prop.visual == "wielditem"){
- infostream<<"GenericCAO::addToScene(): node"<<std::endl;
- infostream<<"textures: "<<m_prop.textures.size()<<std::endl;
- if(m_prop.textures.size() >= 1){
- infostream<<"textures[0]: "<<m_prop.textures[0]<<std::endl;
- IItemDefManager *idef = m_gamedef->idef();
- ItemStack item(m_prop.textures[0], 1, 0, "", idef);
- scene::IMesh *item_mesh = idef->getWieldMesh(item.getDefinition(idef).name, m_gamedef);
-
- // Copy mesh to be able to set unique vertex colors
- scene::IMeshManipulator *manip =
- irr->getVideoDriver()->getMeshManipulator();
- scene::IMesh *mesh = manip->createMeshUniquePrimitives(item_mesh);
-
- m_meshnode = smgr->addMeshSceneNode(mesh, NULL);
- mesh->drop();
-
- m_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;
- setMeshColor(m_meshnode->getMesh(), video::SColor(255,li,li,li));
- }
- } else {
- infostream<<"GenericCAO::addToScene(): \""<<m_prop.visual
- <<"\" not supported"<<std::endl;
- }
- updateTextures("");
-
- scene::ISceneNode *node = NULL;
- if(m_spritenode)
- node = m_spritenode;
- else if(m_animated_meshnode)
- node = m_animated_meshnode;
- else if(m_meshnode)
- node = m_meshnode;
- if(node && m_is_player && !m_is_local_player){
- // Add a text node for showing the name
- gui::IGUIEnvironment* gui = irr->getGUIEnvironment();
- std::wstring wname = narrow_to_wide(m_name);
- m_textnode = smgr->addTextSceneNode(gui->getBuiltInFont(),
- wname.c_str(), video::SColor(255,255,255,255), node);
- m_textnode->setPosition(v3f(0, BS*1.1, 0));
- }
-
- updateNodePos();
- updateAnimation();
- updateBonePosition();
- updateAttachments();