//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CPathKeyFrame::CalculateFrameDuration( void ) { // calculate time from speed if ( m_pNextKey && m_flSpeed > 0 ) { m_flNextTime = (m_Origin - m_pNextKey->m_Origin).Length() / m_flSpeed; // couldn't get time from distance, get it from rotation instead if ( !m_flNextTime ) { // speed is in degrees per second // find the largest rotation component and use that QAngle ang = m_Angles - m_pNextKey->m_Angles; FixupAngles( ang ); float x = 0; for ( int i = 0; i < 3; i++ ) { if ( abs(ang[i]) > x ) { x = abs(ang[i]); } } m_flNextTime = x / m_flSpeed; } } }
void GetAttachment(CBaseEntity *pEntity, int iBone, Vector *pVecOrigin, Vector *pVecAngles) { Vector vecOrigin, vecAngles; edict_t *pEdict = pEntity->edict(); // force to update frame StudioFrameAdvanceEnt(pEdict); GET_ATTACHMENT(pEdict, iBone, vecOrigin, vecAngles); if (!pEntity->IsPlayer()) { FixupAngles(pEdict, vecOrigin); } if (pVecOrigin) { *pVecOrigin = vecOrigin; } if (pVecAngles) { *pVecAngles = vecAngles; } }
void GetBonePosition(CBaseEntity *pEntity, int iBone, Vector *pVecOrigin, Vector *pVecAngles) { Vector vecOrigin, vecAngles; edict_t *pEdict = pEntity->edict(); // force to update frame StudioFrameAdvanceEnt(pEdict); pEntity->pev->angles.x = -pEntity->pev->angles.x; GET_BONE_POSITION(pEdict, iBone, vecOrigin, vecAngles); pEntity->pev->angles.x = -pEntity->pev->angles.x; if (!pEntity->IsPlayer()) { FixupAngles(pEdict, vecOrigin); } if (pVecOrigin) { *pVecOrigin = vecOrigin; } if (pVecAngles) { *pVecAngles = vecAngles; } }