2929#include  " llavatarappearance.h" 
3030#include  " llavatarappearancedefines.h" 
3131#include  " llavatarjointmesh.h" 
32+ #include  " lljointdata.h" 
3233#include  " llstl.h" 
3334#include  " lldir.h" 
3435#include  " llpolymorph.h" 
3536#include  " llpolymesh.h" 
3637#include  " llpolyskeletaldistortion.h" 
37- #include  " llstl.h" 
3838#include  " lltexglobalcolor.h" 
3939#include  " llwearabledata.h" 
4040#include  " boost/bind.hpp" 
4141#include  " boost/tokenizer.hpp" 
42+ #include  " v4math.h" 
4243
4344using  namespace  LLAvatarAppearanceDefines ; 
4445
@@ -71,11 +72,13 @@ class LLAvatarBoneInfo
7172        mChildren .clear ();
7273    }
7374    bool  parseXml (LLXmlTreeNode* node);
75+     glm::mat4 getJointMatrix ();
7476
7577private: 
7678    std::string mName ;
7779    std::string mSupport ;
7880    std::string mAliases ;
81+     std::string mGroup ;
7982    bool  mIsJoint ;
8083    LLVector3 mPos ;
8184    LLVector3 mEnd ;
@@ -105,11 +108,17 @@ class LLAvatarSkeletonInfo
105108    S32 getNumBones () const  { return  mNumBones ; }
106109    S32 getNumCollisionVolumes () const  { return  mNumCollisionVolumes ; }
107110
111+ private: 
112+     typedef  std::vector<LLAvatarBoneInfo*> bone_info_list_t ;
113+     static  void  getJointMatricesAndHierarhy (
114+         LLAvatarBoneInfo* bone_info,
115+         LLJointData& data,
116+         const  glm::mat4& parent_mat);
117+ 
108118private: 
109119    S32 mNumBones ;
110120    S32 mNumCollisionVolumes ;
111121    LLAvatarAppearance::joint_alias_map_t  mJointAliasMap ;
112-     typedef  std::vector<LLAvatarBoneInfo*> bone_info_list_t ;
113122    bone_info_list_t  mBoneInfoList ;
114123};
115124
@@ -1598,6 +1607,15 @@ bool LLAvatarBoneInfo::parseXml(LLXmlTreeNode* node)
15981607        mSupport  = " base"  ;
15991608    }
16001609
1610+     //  Skeleton has 133 bones, but shader only allows 110 (LL_MAX_JOINTS_PER_MESH_OBJECT)
1611+     //  Groups can be used by importer to cut out unused groups of joints
1612+     static  LLStdStringHandle group_string = LLXmlTree::addAttributeString (" group"  );
1613+     if  (!node->getFastAttributeString (group_string, mGroup ))
1614+     {
1615+         LL_WARNS () << " Bone without group "   << mName  << LL_ENDL;
1616+         mGroup  = " global"  ;
1617+     }
1618+ 
16011619    if  (mIsJoint )
16021620    {
16031621        static  LLStdStringHandle pivot_string = LLXmlTree::addAttributeString (" pivot"  );
@@ -1623,6 +1641,21 @@ bool LLAvatarBoneInfo::parseXml(LLXmlTreeNode* node)
16231641    return  true ;
16241642}
16251643
1644+ 
1645+ glm::mat4 LLAvatarBoneInfo::getJointMatrix ()
1646+ {
1647+     glm::mat4 mat (1 .0f );
1648+     //  1. Scaling
1649+     mat = glm::scale (mat, glm::vec3 (mScale [0 ], mScale [1 ], mScale [2 ]));
1650+     //  2. Rotation (Euler angles rad)
1651+     mat = glm::rotate (mat, mRot [0 ], glm::vec3 (1 , 0 , 0 ));
1652+     mat = glm::rotate (mat, mRot [1 ], glm::vec3 (0 , 1 , 0 ));
1653+     mat = glm::rotate (mat, mRot [2 ], glm::vec3 (0 , 0 , 1 ));
1654+     //  3. Position
1655+     mat = glm::translate (mat, glm::vec3 (mPos [0 ], mPos [1 ], mPos [2 ]));
1656+     return  mat;
1657+ }
1658+ 
16261659// -----------------------------------------------------------------------------
16271660//  LLAvatarSkeletonInfo::parseXml()
16281661// -----------------------------------------------------------------------------
@@ -1653,6 +1686,25 @@ bool LLAvatarSkeletonInfo::parseXml(LLXmlTreeNode* node)
16531686    return  true ;
16541687}
16551688
1689+ void  LLAvatarSkeletonInfo::getJointMatricesAndHierarhy (
1690+     LLAvatarBoneInfo* bone_info,
1691+     LLJointData& data,
1692+     const  glm::mat4& parent_mat)
1693+ {
1694+     data.mName  = bone_info->mName ;
1695+     data.mJointMatrix  = bone_info->getJointMatrix ();
1696+     data.mScale  = glm::vec3 (bone_info->mScale [0 ], bone_info->mScale [1 ], bone_info->mScale [2 ]);
1697+     data.mRotation  = bone_info->mRot ;
1698+     data.mRestMatrix  = parent_mat * data.mJointMatrix ;
1699+     data.mIsJoint  = bone_info->mIsJoint ;
1700+     data.mGroup  = bone_info->mGroup ;
1701+     for  (LLAvatarBoneInfo* child_info : bone_info->mChildren )
1702+     {
1703+         LLJointData& child_data = data.mChildren .emplace_back ();
1704+         getJointMatricesAndHierarhy (child_info, child_data, data.mRestMatrix );
1705+     }
1706+ }
1707+ 
16561708// Make aliases for joint and push to map.
16571709void  LLAvatarAppearance::makeJointAliases (LLAvatarBoneInfo *bone_info)
16581710{
@@ -1714,6 +1766,16 @@ const LLAvatarAppearance::joint_alias_map_t& LLAvatarAppearance::getJointAliases
17141766    return  mJointAliasMap ;
17151767}
17161768
1769+ void  LLAvatarAppearance::getJointMatricesAndHierarhy (std::vector<LLJointData> &data) const 
1770+ {
1771+     glm::mat4 identity (1 .f );
1772+     for  (LLAvatarBoneInfo* bone_info : sAvatarSkeletonInfo ->mBoneInfoList )
1773+     {
1774+         LLJointData& child_data = data.emplace_back ();
1775+         LLAvatarSkeletonInfo::getJointMatricesAndHierarhy (bone_info, child_data, identity);
1776+     }
1777+ }
1778+ 
17171779
17181780// -----------------------------------------------------------------------------
17191781//  parseXmlSkeletonNode(): parses <skeleton> nodes from XML tree
0 commit comments