void C_BaseAnimatingOverlay::GetRenderBounds( Vector& theMins, Vector& theMaxs ) { BaseClass::GetRenderBounds( theMins, theMaxs ); if ( !IsRagdoll() ) { CStudioHdr *pStudioHdr = GetModelPtr(); if ( !pStudioHdr || !pStudioHdr->SequencesAvailable() ) return; int nSequences = pStudioHdr->GetNumSeq(); int i; for (i = 0; i < m_AnimOverlay.Count(); i++) { if (m_AnimOverlay[i].m_flWeight > 0.0) { if ( m_AnimOverlay[i].m_nSequence >= nSequences ) { continue; } mstudioseqdesc_t &seqdesc = pStudioHdr->pSeqdesc( m_AnimOverlay[i].m_nSequence ); VectorMin( seqdesc.bbmin, theMins, theMins ); VectorMax( seqdesc.bbmax, theMaxs, theMaxs ); } } } }
//========================================================= //========================================================= bool CAnimating::HasPoseParameter( int iSequence, int iParameter ) { CStudioHdr *pstudiohdr = GetModelPtr( ); if ( !pstudiohdr ) { return false; } if ( !pstudiohdr->SequencesAvailable() ) { return false; } if (iSequence < 0 || iSequence >= pstudiohdr->GetNumSeq()) { return false; } mstudioseqdesc_t &seqdesc = pstudiohdr->pSeqdesc( iSequence ); if (pstudiohdr->GetSharedPoseParameter( iSequence, seqdesc.paramindex[0] ) == iParameter || pstudiohdr->GetSharedPoseParameter( iSequence, seqdesc.paramindex[1] ) == iParameter) { return true; } return false; }
bool C_CFPlayer::GetIntervalMovement( float flIntervalUsed, bool &bMoveSeqFinished, Vector &newPosition, QAngle &newAngles ) { CStudioHdr *pstudiohdr = GetModelPtr( ); if (! pstudiohdr || !pstudiohdr->SequencesAvailable()) return false; float flComputedCycleRate = GetSequenceCycleRate( pstudiohdr, GetSequence() ); float flNextCycle = GetCycle() + flIntervalUsed * flComputedCycleRate * m_flPlaybackRate; if ((!SequenceLoops()) && flNextCycle > 1.0) { flIntervalUsed = GetCycle() / (flComputedCycleRate * m_flPlaybackRate); flNextCycle = 1.0; bMoveSeqFinished = true; } else { bMoveSeqFinished = false; } Vector deltaPos; QAngle deltaAngles; float poseParameters[MAXSTUDIOPOSEPARAM]; GetPoseParameters(pstudiohdr, poseParameters); if (Studio_SeqMovement( pstudiohdr, GetSequence(), GetCycle(), flNextCycle, poseParameters, deltaPos, deltaAngles )) { VectorYawRotate( deltaPos, GetLocalAngles().y, deltaPos ); newPosition = GetLocalOrigin() + deltaPos; newAngles.Init(); newAngles.y = GetLocalAngles().y + deltaAngles.y; return true; } else { newPosition = GetLocalOrigin(); newAngles = GetLocalAngles(); return false; } }
float CAnimating::GetPoseParameter( int iParameter ) { CStudioHdr *pstudiohdr = GetModelPtr( ); if ( !pstudiohdr ) { Assert(!"CBaseAnimating::GetPoseParameter: model missing"); return 0.0; } if ( !pstudiohdr->SequencesAvailable() ) { return 0; } if (iParameter >= 0) { return Studio_GetPoseParameter( pstudiohdr, iParameter, GetPoseParameterArray()[iParameter]); } return 0.0; }
void CAnimationLayer::DispatchAnimEvents( CBaseAnimating *eventHandler, CBaseAnimating *pOwner ) { animevent_t event; CStudioHdr *pstudiohdr = pOwner->GetModelPtr( ); if ( !pstudiohdr ) { Assert(!"CBaseAnimating::DispatchAnimEvents: model missing"); return; } if ( !pstudiohdr->SequencesAvailable() ) { return; } if ( m_nSequence >= pstudiohdr->GetNumSeq() ) return; // don't fire if here are no events if ( pstudiohdr->pSeqdesc( m_nSequence ).numevents == 0 ) { return; } // look from when it last checked to some short time in the future float flCycleRate = pOwner->GetSequenceCycleRate( m_nSequence ) * m_flPlaybackRate; float flStart = m_flLastEventCheck; float flEnd = m_flCycle; if (!m_bLooping) { // fire off events early float flLastVisibleCycle = 1.0f - (pstudiohdr->pSeqdesc( m_nSequence ).fadeouttime) * flCycleRate; if (flEnd >= flLastVisibleCycle || flEnd < 0.0) { m_bSequenceFinished = true; flEnd = 1.01f; } } m_flLastEventCheck = flEnd; /* if (pOwner->m_debugOverlays & OVERLAY_NPC_SELECTED_BIT) { Msg( "%s:%s : checking %.2f %.2f (%d)\n", STRING(pOwner->GetModelName()), pstudiohdr->pSeqdesc( m_nSequence ).pszLabel(), flStart, flEnd, m_bSequenceFinished ); } */ // FIXME: does not handle negative framerates! int index = 0; while ( (index = GetAnimationEvent( pstudiohdr, m_nSequence, &event, flStart, flEnd, index ) ) != 0 ) { event.pSource = pOwner; // calc when this event should happen if (flCycleRate > 0.0) { float flCycle = event.cycle; if (flCycle > m_flCycle) { flCycle = flCycle - 1.0; } event.eventtime = pOwner->m_flAnimTime + (flCycle - m_flCycle) / flCycleRate + pOwner->GetAnimTimeInterval(); } // Msg( "dispatch %d (%d : %.2f)\n", index - 1, event.event, event.eventtime ); event.m_bHandledByScript = eventHandler->HandleScriptedAnimEvent( &event ); if ( eventHandler->HandleBehaviorAnimEvent( &event ) ) { event.m_bHandledByScript = true; } eventHandler->HandleAnimEvent( &event ); } }