mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-21 02:39:17 +00:00
Pre-transform bones with inverse bind instead of sending it to the shader
This commit is contained in:
@@ -29,6 +29,13 @@ void CBone::UpdateTransform(CBoneTransformData& rData, CAnimation *pAnim, float
|
||||
|
||||
for (u32 iChild = 0; iChild < mChildren.size(); iChild++)
|
||||
mChildren[iChild]->UpdateTransform(rData, pAnim, Time, AnchorRoot);
|
||||
|
||||
rTransform *= mInvBind;
|
||||
}
|
||||
|
||||
CVector3f CBone::TransformedPosition(const CBoneTransformData& rkData) const
|
||||
{
|
||||
return rkData[mID] * AbsolutePosition();
|
||||
}
|
||||
|
||||
bool CBone::IsRoot() const
|
||||
@@ -84,12 +91,12 @@ void CSkeleton::Draw(FRenderOptions /*Options*/, const CBoneTransformData& rkDat
|
||||
for (u32 iBone = 0; iBone < mBones.size(); iBone++)
|
||||
{
|
||||
CBone *pBone = mBones[iBone];
|
||||
const CTransform4f& rkBoneTransform = rkData[pBone->ID()];
|
||||
CVector3f BonePos = pBone->TransformedPosition(rkData);
|
||||
|
||||
// Draw bone
|
||||
CTransform4f Transform;
|
||||
Transform.Scale(skSphereRadius);
|
||||
Transform.Translate(rkBoneTransform.ExtractTranslation());
|
||||
Transform.Translate(BonePos);
|
||||
CGraphics::sMVPBlock.ModelMatrix = Transform;
|
||||
CGraphics::UpdateMVPBlock();
|
||||
CDrawUtil::DrawSphere(CColor::skWhite);
|
||||
@@ -100,8 +107,8 @@ void CSkeleton::Draw(FRenderOptions /*Options*/, const CBoneTransformData& rkDat
|
||||
|
||||
for (u32 iChild = 0; iChild < pBone->NumChildren(); iChild++)
|
||||
{
|
||||
const CTransform4f& rkChildTransform = rkData[pBone->ChildByIndex(iChild)->ID()];
|
||||
CDrawUtil::DrawLine(rkBoneTransform.ExtractTranslation(), rkChildTransform.ExtractTranslation());
|
||||
CVector3f ChildPos = pBone->ChildByIndex(iChild)->TransformedPosition(rkData);
|
||||
CDrawUtil::DrawLine(BonePos, ChildPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ class CSkeleton : public CResource
|
||||
|
||||
CBone *mpRootBone;
|
||||
std::vector<CBone*> mBones;
|
||||
std::vector<CTransform4f> mInvBindMatrices;
|
||||
|
||||
static const float skSphereRadius;
|
||||
|
||||
@@ -34,9 +33,6 @@ public:
|
||||
std::pair<s32,float> RayIntersect(const CRay& rkRay, const CBoneTransformData& rkData);
|
||||
|
||||
inline u32 NumBones() const { return mBones.size(); }
|
||||
inline const CTransform4f& BoneInverseBindMatrix(u32 BoneID) const { return mInvBindMatrices[BoneID]; }
|
||||
inline const void* InverseBindMatricesData() const { return mInvBindMatrices.data(); }
|
||||
inline u32 InverseBindMatricesSize() const { return mInvBindMatrices.size() * sizeof(CTransform4f); }
|
||||
};
|
||||
|
||||
class CBone
|
||||
@@ -49,10 +45,12 @@ class CBone
|
||||
u32 mID;
|
||||
CVector3f mPosition;
|
||||
TString mName;
|
||||
CTransform4f mInvBind;
|
||||
|
||||
public:
|
||||
CBone(CSkeleton *pSkel);
|
||||
void UpdateTransform(CBoneTransformData& rData, CAnimation *pAnim, float Time, bool AnchorRoot);
|
||||
CVector3f TransformedPosition(const CBoneTransformData& rkData) const;
|
||||
bool IsRoot() const;
|
||||
|
||||
// Accessors
|
||||
@@ -64,7 +62,6 @@ public:
|
||||
inline CVector3f Position() const { return mPosition; }
|
||||
inline CVector3f AbsolutePosition() const { return mPosition + (mpParent ? mpParent->AbsolutePosition() : CVector3f::skZero); }
|
||||
inline TString Name() const { return mName; }
|
||||
inline const CTransform4f& InverseBindMtx() const { return mpSkeleton->BoneInverseBindMatrix(mID); }
|
||||
};
|
||||
|
||||
#endif // CSKELETON_H
|
||||
|
||||
@@ -14,12 +14,10 @@ void CSkeletonLoader::SetLocalBoneCoords(CBone *pBone)
|
||||
|
||||
void CSkeletonLoader::CalculateBoneInverseBindMatrices()
|
||||
{
|
||||
mpSkeleton->mInvBindMatrices.resize(mpSkeleton->MaxBoneID() + 1);
|
||||
|
||||
for (u32 iBone = 0; iBone < mpSkeleton->mBones.size(); iBone++)
|
||||
{
|
||||
CBone *pBone = mpSkeleton->mBones[iBone];
|
||||
mpSkeleton->mInvBindMatrices[pBone->ID()] = CTransform4f::TranslationMatrix(-pBone->AbsolutePosition());
|
||||
pBone->mInvBind = CTransform4f::TranslationMatrix(-pBone->AbsolutePosition());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user