Esempio n. 1
0
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;
		}
	}
}
Esempio n. 2
0
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;
        }
    }
}
Esempio n. 3
0
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);
						}
					}
				}
			}
		}
	}
}
Esempio n. 4
0
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;
    }
}