void CMPTrackViewManager::Client_SynchAnimationTimes(const CGameRules::STrackViewParameters& params) { IMovieSystem *pMovieSystem = gEnv->pMovieSystem; int numTrackViews = params.m_NumberOfTrackViews + params.m_NumberOfFinishedTrackViews; CryLog("CMPTrackViewManager::Client_SynchAnimationTimes() numTrackViews=%d; numFinishedTrackViews=%d", params.m_NumberOfTrackViews, params.m_NumberOfFinishedTrackViews); for(int i = 0; i < numTrackViews; ++i) { int trackviewHashId = params.m_Ids[i]; if(trackviewHashId == 0) continue; for(int k = 0; k < pMovieSystem->GetNumSequences(); ++k) { IAnimSequence* pSequence = pMovieSystem->GetSequence(k); CryHashStringId id(pSequence->GetName()); if(id == trackviewHashId) { float timeValue = params.m_Times[i]; // even finished sequences include their time now, to handle aborted sequences float currentTimeValue = pMovieSystem->GetPlayingTime(pSequence); CryLog("CMPTrackViewManager::Client_SynchAnimationTimes() Sequence %d %s at time %f", i, pSequence->GetName(), timeValue); if(pMovieSystem->IsPlaying(pSequence)) { // always update finished anims if( i>=params.m_NumberOfTrackViews || fabs(currentTimeValue - timeValue) > s_TrackViewMinTimeDifferenceForSynch) //If we are close enough don't update - avoid unnecessary jerking { pMovieSystem->SetPlayingTime(pSequence, timeValue); } } else { pMovieSystem->PlaySequence(pSequence, NULL, true, false, timeValue); if(params.m_bInitialData && i>=params.m_NumberOfTrackViews && m_FinishedTrackViewCount < CGameRules::STrackViewParameters::sMaxTrackViews) { m_FinishedTrackViews[m_FinishedTrackViewCount++] = id.id; } } if (i>=params.m_NumberOfTrackViews) { // this is a finished trackview, so having setup the correct playtime above, lets actually stop it like it should be CryLog("CMPTrackViewManager::Client_SynchAnimationTimes() Sequence %d %s is a finished trackview, stopping it", i, pSequence->GetName()); pMovieSystem->StopSequence(pSequence); } } } } }
void CMPTrackViewManager::AnimationRequested(const CGameRules::STrackViewRequestParameters& params) { int trackviewID = params.m_TrackViewID; if(trackviewID) { IAnimSequence* pSequence = FindTrackviewSequence(trackviewID); if(pSequence) { IMovieSystem *pMovieSystem = gEnv->pMovieSystem; //Ignore requests for an animation that is already playing if(!pMovieSystem->IsPlaying(pSequence)) { pMovieSystem->PlaySequence(pSequence, NULL, true, false); } } } }