diff options
Diffstat (limited to 'indra/llappearance/llavatarappearance.cpp')
| -rw-r--r-- | indra/llappearance/llavatarappearance.cpp | 66 | 
1 files changed, 64 insertions, 2 deletions
diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index 3d66809ed6..dab18c240d 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -29,16 +29,17 @@  #include "llavatarappearance.h"  #include "llavatarappearancedefines.h"  #include "llavatarjointmesh.h" +#include "lljointdata.h"  #include "llstl.h"  #include "lldir.h"  #include "llpolymorph.h"  #include "llpolymesh.h"  #include "llpolyskeletaldistortion.h" -#include "llstl.h"  #include "lltexglobalcolor.h"  #include "llwearabledata.h"  #include "boost/bind.hpp"  #include "boost/tokenizer.hpp" +#include "v4math.h"  using namespace LLAvatarAppearanceDefines; @@ -71,11 +72,13 @@ public:          mChildren.clear();      }      bool parseXml(LLXmlTreeNode* node); +    glm::mat4 getJointMatrix();  private:      std::string mName;      std::string mSupport;      std::string mAliases; +    std::string mGroup;      bool mIsJoint;      LLVector3 mPos;      LLVector3 mEnd; @@ -106,10 +109,16 @@ public:      S32 getNumCollisionVolumes() const { return mNumCollisionVolumes; }  private: +    typedef std::vector<LLAvatarBoneInfo*> bone_info_list_t; +    static void getJointMatricesAndHierarhy( +        LLAvatarBoneInfo* bone_info, +        LLJointData& data, +        const glm::mat4& parent_mat); + +private:      S32 mNumBones;      S32 mNumCollisionVolumes;      LLAvatarAppearance::joint_alias_map_t mJointAliasMap; -    typedef std::vector<LLAvatarBoneInfo*> bone_info_list_t;      bone_info_list_t mBoneInfoList;  }; @@ -1598,6 +1607,15 @@ bool LLAvatarBoneInfo::parseXml(LLXmlTreeNode* node)          mSupport = "base";      } +    // Skeleton has 133 bones, but shader only allows 110 (LL_MAX_JOINTS_PER_MESH_OBJECT) +    // Groups can be used by importer to cut out unused groups of joints +    static LLStdStringHandle group_string = LLXmlTree::addAttributeString("group"); +    if (!node->getFastAttributeString(group_string, mGroup)) +    { +        LL_WARNS() << "Bone without group " << mName << LL_ENDL; +        mGroup = "global"; +    } +      if (mIsJoint)      {          static LLStdStringHandle pivot_string = LLXmlTree::addAttributeString("pivot"); @@ -1623,6 +1641,21 @@ bool LLAvatarBoneInfo::parseXml(LLXmlTreeNode* node)      return true;  } + +glm::mat4 LLAvatarBoneInfo::getJointMatrix() +{ +    glm::mat4 mat(1.0f); +    // 1. Scaling +    mat = glm::scale(mat, glm::vec3(mScale[0], mScale[1], mScale[2])); +    // 2. Rotation (Euler angles rad) +    mat = glm::rotate(mat, mRot[0], glm::vec3(1, 0, 0)); +    mat = glm::rotate(mat, mRot[1], glm::vec3(0, 1, 0)); +    mat = glm::rotate(mat, mRot[2], glm::vec3(0, 0, 1)); +    // 3. Position +    mat = glm::translate(mat, glm::vec3(mPos[0], mPos[1], mPos[2])); +    return mat; +} +  //-----------------------------------------------------------------------------  // LLAvatarSkeletonInfo::parseXml()  //----------------------------------------------------------------------------- @@ -1653,6 +1686,25 @@ bool LLAvatarSkeletonInfo::parseXml(LLXmlTreeNode* node)      return true;  } +void LLAvatarSkeletonInfo::getJointMatricesAndHierarhy( +    LLAvatarBoneInfo* bone_info, +    LLJointData& data, +    const glm::mat4& parent_mat) +{ +    data.mName = bone_info->mName; +    data.mJointMatrix = bone_info->getJointMatrix(); +    data.mScale = glm::vec3(bone_info->mScale[0], bone_info->mScale[1], bone_info->mScale[2]); +    data.mRotation = bone_info->mRot; +    data.mRestMatrix = parent_mat * data.mJointMatrix; +    data.mIsJoint = bone_info->mIsJoint; +    data.mGroup = bone_info->mGroup; +    for (LLAvatarBoneInfo* child_info : bone_info->mChildren) +    { +        LLJointData& child_data = data.mChildren.emplace_back(); +        getJointMatricesAndHierarhy(child_info, child_data, data.mRestMatrix); +    } +} +  //Make aliases for joint and push to map.  void LLAvatarAppearance::makeJointAliases(LLAvatarBoneInfo *bone_info)  { @@ -1714,6 +1766,16 @@ const LLAvatarAppearance::joint_alias_map_t& LLAvatarAppearance::getJointAliases      return mJointAliasMap;  } +void LLAvatarAppearance::getJointMatricesAndHierarhy(std::vector<LLJointData> &data) const +{ +    glm::mat4 identity(1.f); +    for (LLAvatarBoneInfo* bone_info : sAvatarSkeletonInfo->mBoneInfoList) +    { +        LLJointData& child_data = data.emplace_back(); +        LLAvatarSkeletonInfo::getJointMatricesAndHierarhy(bone_info, child_data, identity); +    } +} +  //-----------------------------------------------------------------------------  // parseXmlSkeletonNode(): parses <skeleton> nodes from XML tree  | 
