bool CActionScope::InstallAnimation(const SAnimationEntry &animEntry, int layer, const SAnimBlend &animBlend) { if ((BIT(layer) & m_mutedAnimLayerMask) == BIT(layer)) { return false; } if (animEntry.animRef.IsEmpty()) { StopAnimationOnLayer(layer, animBlend.duration); return true; } else { int animID = m_scopeContext.pCharInst->GetIAnimationSet()->GetAnimIDByCRC(animEntry.animRef.crc); if (animID >= 0) { //--- Cleared for install, install across scopes CryCharAnimationParams animParams; InitAnimationParams(animEntry, layer, animBlend, animParams); return InstallAnimation(animID, animParams); } else { CryWarning(VALIDATOR_MODULE_GAME, VALIDATOR_WARNING, "Invalid anim ref '%s' on scope '%s' in database '%s'. Skeleton '%s'", animEntry.animRef.c_str(), m_name.c_str(), m_scopeContext.pDatabase->GetFilename(), m_scopeContext.pCharInst->GetIDefaultSkeleton().GetModelFilePath()); StopAnimationOnLayer(layer, animBlend.duration); return false; } } }
bool CActionScope::InstallAnimation(const SAnimationEntry &animEntry, int layer, const SAnimBlend &animBlend) { if (animEntry.animRef.IsEmpty()) { StopAnimationOnLayer(layer, animBlend.duration); return true; } else { int animID = m_scopeContext.charInst->GetIAnimationSet()->GetAnimIDByCRC(animEntry.animRef.crc); if (animID >= 0) { //--- Cleared for install, install across scopes CryCharAnimationParams animParams; InitAnimationParams(animEntry, layer, animBlend, animParams); return InstallAnimation(animID, animParams); } else { CryWarning(VALIDATOR_MODULE_GAME, VALIDATOR_WARNING, "Invalid anim ref %s on scope %s in database %s", animEntry.animRef.GetString(), m_name.c_str(), m_scopeContext.database->GetFilename()); StopAnimationOnLayer(layer, animBlend.duration); return false; } } }
void CActionScope::Resume(float forcedBlendTime, uint32 resumeFlags) { if (!m_scopeContext.pCharInst) { return; } IAnimationSet* pAnimSet = m_scopeContext.pCharInst->GetIAnimationSet(); if (!pAnimSet) { return; } ISkeletonAnim &skeletonAnimation = *m_scopeContext.pCharInst->GetISkeletonAnim(); const bool useDefaultBlendTime = (forcedBlendTime < 0); for (int i = 0; i < m_numLayers; ++i) { SSequencer &sequencer = m_layerSequencers[i]; const int animationLayer = m_layer + i; const float blendTime = useDefaultBlendTime ? sequencer.blend.duration : forcedBlendTime; if (sequencer.savedAnimNormalisedTime < 0) { skeletonAnimation.StopAnimationInLayer(animationLayer, blendTime); } else { const uint32 pos = sequencer.pos - 1; if (pos < sequencer.sequence.size()) { SAnimClip &clip = sequencer.sequence[pos]; const int animID = pAnimSet->GetAnimIDByCRC(clip.animation.animRef.crc); if (0 <= animID) { CryCharAnimationParams params; InitAnimationParams(clip.animation, i, clip.blend, params); const bool installAnimationSuccess = InstallAnimation(animID, params); if (installAnimationSuccess) { const int animationsInLayer = skeletonAnimation.GetNumAnimsInFIFO(animationLayer); CRY_ASSERT(1 <= animationsInLayer); const bool loopingAnimation = ((clip.animation.flags & CA_LOOP_ANIMATION) != 0); const uint32 restoreAnimationTimeFlagToCheck = loopingAnimation ? IActionController::ERF_RestoreLoopingAnimationTime : IActionController::ERF_RestoreNonLoopingAnimationTime; const bool restoreAnimationTime = ((restoreAnimationTimeFlagToCheck & resumeFlags) != 0); if (restoreAnimationTime) { const int lastAnimationIndex = animationsInLayer - 1; CAnimation &animation = skeletonAnimation.GetAnimFromFIFO(animationLayer, lastAnimationIndex); skeletonAnimation.SetAnimationNormalizedTime(&animation, sequencer.savedAnimNormalisedTime); } } } } } } }
bool CActionScope::PlayPendingAnim(uint32 layer, float timePassed) { CRY_ASSERT_MESSAGE(layer < m_numLayers, "Invalid layer idx"); SSequencer &sequencer = m_layerSequencers[layer]; IActionPtr pPlayingAction = GetPlayingAction(); const bool isBlendingOut = (sequencer.flags & eSF_BlendingOut) != 0; sequencer.flags &= ~eSF_Queued; sequencer.installTime = 0.0f; sequencer.referenceTime = -1.0f; if ((sequencer.pos < sequencer.sequence.size()) || isBlendingOut) { uint8 fragPart = 0; bool isTransition = false; const SAnimationEntry *animation = NULL; SAnimationEntry animNull; animNull.animRef.SetByString(NULL); animNull.flags = 0; animNull.playbackSpeed = 1.0f; animNull.playbackWeight = 1.0f; if (!isBlendingOut) { const SAnimClip &animClip = sequencer.sequence[sequencer.pos]; fragPart = animClip.part; animation = &animClip.animation; sequencer.pos++; } else { animation = &animNull; sequencer.flags &= ~eSF_BlendingOut; } InstallAnimation(*animation, layer, sequencer.blend); if (pPlayingAction && (&pPlayingAction->GetRootScope() == this) && !isBlendingOut) { ClipInstalled(fragPart); } QueueAnimFromSequence(layer, sequencer.pos, (animation->flags & CA_LOOP_ANIMATION) != 0); return true; } else { //--- Notify action about completion if (pPlayingAction) { pPlayingAction->OnSequenceFinished(layer, m_id); } return false; } }