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