コード例 #1
0
ファイル: Animation.cpp プロジェクト: xctrex/KrakEngine
    void Skeleton::RecursiveProcess(float time, Bone& bone, Animation& anim, MatrixBuffer& buffer, TrackBuffer& trackData, XMFLOAT4X4 parentTransform)
    {
        VQS vqs;

        anim.CalculateTransform(time, bone.BoneIndex, vqs, trackData[bone.BoneIndex]);

        XMFLOAT4X4 localTransform = vqs.GetMatrix();
        XMFLOAT4X4 modelTransform; // = localTransform  * parentTransform;
        XMStoreFloat4x4(&modelTransform, XMMatrixMultiply(XMLoadFloat4x4(&localTransform), XMLoadFloat4x4(&parentTransform)));
        buffer[bone.BoneIndex] = modelTransform;

        for (UINT i = 0; i < bone.Children.size(); ++i)
        {
            RecursiveProcess(time, *bone.Children[i], anim, buffer, trackData, modelTransform);
        }
    }
コード例 #2
0
ファイル: Animation.cpp プロジェクト: xctrex/KrakEngine
 void Skeleton::ProcessAnimationGraph(float time, MatrixBuffer& buffer, Animation& anim, TrackBuffer& trackData)
 {
     //Linear Form This only works because the bone parent is always guaranteed to be in front
     //of its children (breath first order)
     XMFLOAT4X4 identity;
     XMStoreFloat4x4(&identity, XMMatrixIdentity());
     for (UINT boneIndex = 0; boneIndex < m_Bones.size(); ++boneIndex)
     {
         Bone& bone = m_Bones[boneIndex];
         VQS vqs;
         anim.CalculateTransform(time, boneIndex, vqs, trackData[boneIndex]);
         XMFLOAT4X4 parentTransform = bone.ParentBoneIndex != -1 ? buffer[bone.ParentBoneIndex] : identity;
         XMFLOAT4X4 localTransform = vqs.GetMatrix();
         XMFLOAT4X4 modelTransform; // = localTransform  * parentTransform;
         XMStoreFloat4x4(&modelTransform, XMMatrixMultiply(XMLoadFloat4x4(&localTransform), XMLoadFloat4x4(&parentTransform)));
         buffer[boneIndex] = modelTransform;
     }
 }