@@ -581,33 +581,34 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
581581 infostream << " GenericCAO::addToScene(): " <<
582582 enum_to_string (es_ObjectVisual, m_prop.visual )<< std::endl;
583583
584- if (m_prop.visual != OBJECTVISUAL_NODE &&
585- m_prop.visual != OBJECTVISUAL_WIELDITEM &&
586- m_prop.visual != OBJECTVISUAL_ITEM)
587- {
588- IShaderSource *shader_source = m_client->getShaderSource ();
589- MaterialType material_type;
590-
591- if (m_prop.shaded && m_prop.glow == 0 )
592- material_type = (m_prop.use_texture_alpha ) ?
593- TILE_MATERIAL_ALPHA : TILE_MATERIAL_BASIC;
594- else
595- material_type = (m_prop.use_texture_alpha ) ?
596- TILE_MATERIAL_PLAIN_ALPHA : TILE_MATERIAL_PLAIN;
597-
598- u32 shader_id = shader_source->getShader (" object_shader" , material_type, NDT_NORMAL,
599- false , true );
600- // TODO proper condition for whether we'll need skinning
601- m_material_type = shader_source->getShaderInfo (shader_id).material ;
602- } else {
603- // Not used, so make sure it's not valid
604- m_material_type = video::EMT_INVALID;
605- }
584+ auto updateMaterialType = [this ](bool hw_skin) {
585+ if (m_prop.visual != OBJECTVISUAL_NODE &&
586+ m_prop.visual != OBJECTVISUAL_WIELDITEM &&
587+ m_prop.visual != OBJECTVISUAL_ITEM)
588+ {
589+ IShaderSource *shader_source = m_client->getShaderSource ();
590+ MaterialType material_type;
591+
592+ if (m_prop.shaded && m_prop.glow == 0 )
593+ material_type = (m_prop.use_texture_alpha ) ?
594+ TILE_MATERIAL_ALPHA : TILE_MATERIAL_BASIC;
595+ else
596+ material_type = (m_prop.use_texture_alpha ) ?
597+ TILE_MATERIAL_PLAIN_ALPHA : TILE_MATERIAL_PLAIN;
598+
599+ u32 shader_id = shader_source->getShader (" object_shader" , material_type, NDT_NORMAL,
600+ false , hw_skin);
601+ m_material_type = shader_source->getShaderInfo (shader_id).material ;
602+ } else {
603+ // Not used, so make sure it's not valid
604+ m_material_type = video::EMT_INVALID;
605+ }
606+ };
606607
607608 m_matrixnode = m_smgr->addDummyTransformationSceneNode ();
608609 m_matrixnode->grab ();
609610
610- auto setMaterial = [this ] (video::SMaterial &mat) {
611+ auto setMaterial = [this ](video::SMaterial &mat) {
611612 if (m_material_type != video::EMT_INVALID)
612613 mat.MaterialType = m_material_type;
613614 mat.FogEnable = true ;
@@ -617,12 +618,15 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
617618 });
618619 };
619620
620- auto setSceneNodeMaterials = [setMaterial] (scene::ISceneNode *node) {
621+ auto setSceneNodeMaterials = [&] (scene::ISceneNode *node, bool hw_skin = false ) {
622+ updateMaterialType (hw_skin);
621623 node->forEachMaterial (setMaterial);
622624 };
623625
624626 switch (m_prop.visual ) {
625627 case OBJECTVISUAL_UPRIGHT_SPRITE: {
628+ updateMaterialType (false );
629+
626630 auto mesh = make_irr<scene::SMesh>();
627631 f32 dx = BS * m_prop.visual_size .X / 2 ;
628632 f32 dy = BS * m_prop.visual_size .Y / 2 ;
@@ -696,7 +700,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
696700 // set vertex colors to ensure alpha is set
697701 setMeshColor (m_animated_meshnode->getMesh (), video::SColor (0xFFFFFFFF ));
698702
699- setSceneNodeMaterials (m_animated_meshnode);
703+ setSceneNodeMaterials (m_animated_meshnode, mesh-> needsHwSkinning () );
700704
701705 m_animated_meshnode->forEachMaterial ([this ] (auto &mat) {
702706 mat.BackfaceCulling = m_prop.backface_culling ;
0 commit comments