void StudioModel::CalcRotations ( vec3_t *pos, vec4_t *q, mstudioseqdesc_t *pseqdesc, mstudioanim_t *panim, float f ) { int i; int frame; mstudiobone_t *pbone; float s; frame = (int)f; s = (f - frame); // add in programatic controllers CalcBoneAdj( ); pbone = (mstudiobone_t *)((byte *)m_pstudiohdr + m_pstudiohdr->boneindex); for (i = 0; i < m_pstudiohdr->numbones; i++, pbone++, panim++) { CalcBoneQuaternion( frame, s, pbone, panim, q[i] ); CalcBonePosition( frame, s, pbone, panim, pos[i] ); } if (pseqdesc->motiontype & STUDIO_X) pos[pseqdesc->motionbone][0] = 0.0; if (pseqdesc->motiontype & STUDIO_Y) pos[pseqdesc->motionbone][1] = 0.0; if (pseqdesc->motiontype & STUDIO_Z) pos[pseqdesc->motionbone][2] = 0.0; }
void CBaseAnimatingOverlay::GetSkeleton( CStudioHdr *pStudioHdr, Vector pos[], Quaternion q[], int boneMask ) { if(!pStudioHdr) { Assert(!"CBaseAnimating::GetSkeleton() without a model"); return; } if (!pStudioHdr->SequencesAvailable()) { return; } InitPose( pStudioHdr, pos, q, boneMask ); AccumulatePose( pStudioHdr, m_pIk, pos, q, GetSequence(), GetCycle(), GetPoseParameterArray(), boneMask, 1.0, gpGlobals->curtime ); // sort the layers int layer[MAX_OVERLAYS]; int i; for (i = 0; i < m_AnimOverlay.Count(); i++) { layer[i] = MAX_OVERLAYS; } for (i = 0; i < m_AnimOverlay.Count(); i++) { CAnimationLayer &pLayer = m_AnimOverlay[i]; if( (pLayer.m_flWeight > 0) && pLayer.IsActive() && pLayer.m_nOrder >= 0 && pLayer.m_nOrder < m_AnimOverlay.Count()) { layer[pLayer.m_nOrder] = i; } } for (i = 0; i < m_AnimOverlay.Count(); i++) { if (layer[i] >= 0 && layer[i] < m_AnimOverlay.Count()) { CAnimationLayer &pLayer = m_AnimOverlay[layer[i]]; // UNDONE: Is it correct to use overlay weight for IK too? AccumulatePose( pStudioHdr, m_pIk, pos, q, pLayer.m_nSequence, pLayer.m_flCycle, GetPoseParameterArray(), boneMask, pLayer.m_flWeight, gpGlobals->curtime ); } } if ( m_pIk ) { CIKContext auto_ik; auto_ik.Init( pStudioHdr, GetAbsAngles(), GetAbsOrigin(), gpGlobals->curtime, 0, boneMask ); CalcAutoplaySequences( pStudioHdr, &auto_ik, pos, q, GetPoseParameterArray(), boneMask, gpGlobals->curtime ); } else { CalcAutoplaySequences( pStudioHdr, NULL, pos, q, GetPoseParameterArray(), boneMask, gpGlobals->curtime ); } CalcBoneAdj( pStudioHdr, pos, q, GetEncodedControllerArray(), boneMask ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_AI_BaseHumanoid::StandardBlendingRules( Vector pos[], Quaternion q[], float currentTime, int boneMask ) { VPROF( "C_AI_BaseHumanoid::StandardBlendingRules" ); BaseClass::StandardBlendingRules( pos, q, currentTime, boneMask ); studiohdr_t *hdr = InitModel(); if ( !hdr ) { return; } #if 0 float poseparam[MAXSTUDIOPOSEPARAM]; if (m_nSequence >= hdr->numseq) { m_nSequence = 0; } // interpolate pose parameters for (int i = 0; i < hdr->numposeparameters; i++) { poseparam[ i ] = m_flPoseParameter[i]; } // build root animation float fCycle = m_flCycle; CalcPose( hdr, NULL, pos, q, m_nSequence, fCycle, poseparam ); // debugoverlay->AddTextOverlay( GetAbsOrigin() + Vector( 0, 0, 64 ), 0, 0, "%30s %6.2f : %6.2f", hdr->pSeqdesc( m_nSequence )->pszLabel( ), fCycle, 1.0 ); MaintainSequenceTransitions( fCycle, poseparam, pos, q, boneMask ); #if 1 for (i = 0; i < 4; i++) { if (m_Layer[i][2].nSequence != m_Layer[i][1].nSequence) { if (m_Layer[i][2].flWeight > 0.5) m_Layer[i][1].flWeight = 1.0; else m_Layer[i][1].flWeight = 0; } } #endif #if 1 for (i = 0; i < 4; i++) { Vector pos2[MAXSTUDIOBONES]; Quaternion q2[MAXSTUDIOBONES]; float fWeight = m_Layer[i][1].flWeight * (1 - dadt) + m_Layer[i][2].flWeight * dadt; /* debugoverlay->AddTextOverlay( GetAbsOrigin() + Vector( 0, 0, 64 ), -i - 1, 0, "%2d %6.2f %6.2f : %2d %6.2f %6.2f : %2d %6.2f %6.2f", m_Layer[i][0].nSequence, m_Layer[i][0].flCycle, m_Layer[i][0].flWeight, m_Layer[i][1].nSequence, m_Layer[i][1].flCycle, m_Layer[i][1].flWeight, m_Layer[i][2].nSequence, m_Layer[i][2].flCycle, m_Layer[i][2].flWeight ); */ if (fWeight > 0) { mstudioseqdesc_t *pseqdesc = hdr->pSeqdesc( m_Layer[i][2].nSequence ); float fCycle = m_Layer[i][2].flCycle; // UNDONE: Do IK here. CalcPose( hdr, NULL, pos2, q2, m_Layer[i][2].nSequence, fCycle, poseparam ); if (fWeight > 1) fWeight = 1; SlerpBones( hdr, q, pos, pseqdesc, q2, pos2, fWeight ); engine->Con_NPrintf( 10 + i, "%30s %6.2f : %6.2f", pseqdesc->pszLabel(), fCycle, fWeight ); } else { engine->Con_NPrintf( 10 + i, "%30s %6.2f : %6.2f", " ", 0, 0 ); } } #endif CIKContext auto_ik; auto_ik.Init( hdr, GetRenderAngles(), GetRenderOrigin(), gpGlobals->curtime ); CalcAutoplaySequences( hdr, &auto_ik, pos, q, poseparam, boneMask, currentTime ); float controllers[MAXSTUDIOBONECTRLS]; GetBoneControllers(controllers); CalcBoneAdj( hdr, pos, q, controllers ); #endif }