X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=clvm_cmds.c;h=c7b24a4a9dc9bd5b924581473eff9f3d8524d7d8;hb=22c99765dd61bdd198911b916ea1fe9bec851be0;hp=d49eab5671f95053374ab12d71449a784cab5e11;hpb=db464b010f52191276feba9b4c7a89d9ad555ac3;p=xonotic%2Fdarkplaces.git diff --git a/clvm_cmds.c b/clvm_cmds.c index d49eab56..c7b24a4a 100644 --- a/clvm_cmds.c +++ b/clvm_cmds.c @@ -3970,7 +3970,7 @@ static void VM_CL_skel_build(prvm_prog_t *prog) int blendindex; framegroupblend_t framegroupblend[MAX_FRAMEGROUPBLENDS]; frameblend_t frameblend[MAX_FRAMEBLENDS]; - matrix4x4_t blendedmatrix; + matrix4x4_t bonematrix; matrix4x4_t matrix; PRVM_G_FLOAT(OFS_RETURN) = 0; if (skeletonindex < 0 || skeletonindex >= MAX_EDICTS || !(skeleton = prog->skeletons[skeletonindex])) @@ -3982,17 +3982,18 @@ static void VM_CL_skel_build(prvm_prog_t *prog) VM_FrameBlendFromFrameGroupBlend(frameblend, framegroupblend, model, cl.time); blendfrac = 1.0f - retainfrac; for (numblends = 0;numblends < MAX_FRAMEBLENDS && frameblend[numblends].lerp;numblends++) - frameblend[numblends].lerp *= blendfrac; + ; for (bonenum = firstbone;bonenum <= lastbone;bonenum++) { - memset(&blendedmatrix, 0, sizeof(blendedmatrix)); - Matrix4x4_Accumulate(&blendedmatrix, &skeleton->relativetransforms[bonenum], retainfrac); + memset(&bonematrix, 0, sizeof(bonematrix)); for (blendindex = 0;blendindex < numblends;blendindex++) { Matrix4x4_FromBonePose7s(&matrix, model->num_posescale, model->data_poses7s + 7 * (frameblend[blendindex].subframe * model->num_bones + bonenum)); - Matrix4x4_Accumulate(&blendedmatrix, &matrix, frameblend[blendindex].lerp); + Matrix4x4_Accumulate(&bonematrix, &matrix, frameblend[blendindex].lerp); } - skeleton->relativetransforms[bonenum] = blendedmatrix; + Matrix4x4_Normalize3(&bonematrix, &bonematrix); + Matrix4x4_Scale(&skeleton->relativetransforms[bonenum], retainfrac, retainfrac); + Matrix4x4_Accumulate(&skeleton->relativetransforms[bonenum], &bonematrix, blendfrac); } PRVM_G_FLOAT(OFS_RETURN) = skeletonindex + 1; }