Exemple #1
0
bool CActionScope::IsDifferent(const FragmentID aaID, const TagState &fragmentTags, const TagID subContext /*= TAG_ID_INVALID*/) const
{
    if (m_lastFragmentID != aaID)
    {
        return true;
    }
    else
    {
        SFragmentQuery fragQuery(aaID, SFragTagState(m_context.state.GetMask(), fragmentTags));
        if (subContext != TAG_ID_INVALID)
        {
            const SSubContext subContextDef = m_context.controllerDef.m_subContext[subContext];
            fragQuery.tagState.globalTags = m_context.controllerDef.m_tags.GetUnion(fragQuery.tagState.globalTags, m_context.subStates[subContext].GetMask());
            fragQuery.tagState.globalTags = m_context.controllerDef.m_tags.GetUnion(fragQuery.tagState.globalTags, subContextDef.additionalTags);
        }
        fragQuery.tagState.globalTags = m_context.controllerDef.m_tags.GetUnion(fragQuery.tagState.globalTags, m_additionalTags);
        fragQuery.requiredTags = m_additionalTags;

        SFragTagState foundState;
        const bool foundMatch = (GetDatabase().FindBestMatchingTag(fragQuery, &foundState) > 0);

        return ((foundMatch != HasFragment()) || (foundMatch && (foundState != m_lastFragSelection.tagState)));
    }

    return false;
}
bool CAnimActionAIStance::FindFragmentInfo( const SAnimationContext& context, FragmentID& fragmentIdOut, SFragTagState& fragTagStateOut ) const
{
	const SMannequinAiStanceUserParams* pUserParams = GetMannequinUserParams< SMannequinAiStanceUserParams >( context );
	const TChangeStanceFragment& changeStanceFragment = pUserParams->fragments.CODE_AI_ChangeStance;

	const FragmentID fragmentId = changeStanceFragment.fragmentID;
	if ( fragmentId == FRAGMENT_ID_INVALID )
	{
		return false;
	}

	const TagID stanceFragmentTagId = GetFragmentTagIdFromStance( changeStanceFragment, m_targetStance );
	if ( stanceFragmentTagId == TAG_ID_INVALID )
	{
		return false;
	}

	fragmentIdOut = fragmentId;

	TagState tagState = TAG_STATE_EMPTY;
	changeStanceFragment.pTagDefinition->Set( tagState, stanceFragmentTagId, true );
	fragTagStateOut = SFragTagState( context.state.GetMask(), tagState );

	return true;
}
Exemple #3
0
void CActionScope::Flush(EFlushMethod flushMethod)
{
    ISkeletonAnim *pSkelAnim = m_scopeContext.charInst.get() ? m_scopeContext.charInst->GetISkeletonAnim() : NULL;

    for (uint32 i=0; i<m_numLayers; i++)
    {
        SSequencer &sequencer = m_layerSequencers[i];
        //const uint32 numAnims = sequencer.sequence.size();
        sequencer.sequence.resize(0);
        sequencer.installTime = -1.0f;
        sequencer.pos = 0;
        sequencer.flags = 0;

        //clear FIFO regardless of whether actionscope believes it has animations in the sequence or not
        //fixes issue where clearing a scope context wouldn't clear all animations because an empty fragment gets queued first clearing the sequencer
        if (/*(numAnims > 0) &&*/ pSkelAnim && (flushMethod != FM_NormalLeaveAnimations))
        {
            pSkelAnim->ClearFIFOLayer(m_layer + i);
        }
    }
    const int numProcs = m_procSequencers.size();
    for (uint32 i=0; i<numProcs; i++)
    {
        SProcSequencer &procSeq = m_procSequencers[i];
        if (procSeq.proceduralClip)
        {
            switch(flushMethod)
            {
            case FM_Normal:
            case FM_NormalLeaveAnimations:
                procSeq.proceduralClip->OnExit(0.0f);
                break;
            case FM_Failure:
                procSeq.proceduralClip->OnFail();
                break;
            default:
                CRY_ASSERT(false);
            }
        }
    }
    m_procSequencers.resize(0);

    m_lastFragmentID = FRAGMENT_ID_INVALID;
    m_fragmentTime = 0.0f;
    m_lastFragSelection = SFragmentSelection();
    m_lastQueueTagState = SFragTagState();
    m_sequenceFlags = 0;
}
Exemple #4
0
bool CActionScope::IsDifferent(const FragmentID aaID, const TagState &fragmentTags, const TagID subContext /*= TAG_ID_INVALID*/) const
{
	if (m_lastFragmentID != aaID)
	{
		return true;
	}
	else
	{
		uint32 tagSetIdx;
		if (aaID == m_cachedaaID &&
		    fragmentTags == m_cachedFragmentTags &&
		    m_context.state.GetMask() == m_cachedContextStateMask)
		{
			tagSetIdx = m_cachedTagSetIdx;
		}
		else
		{
			SFragmentQuery fragQuery(aaID, SFragTagState(m_context.state.GetMask(), fragmentTags));
			if (subContext != TAG_ID_INVALID)
			{
				const SSubContext subContextDef = m_context.controllerDef.m_subContext[subContext];
				fragQuery.tagState.globalTags = m_context.controllerDef.m_tags.GetUnion(fragQuery.tagState.globalTags, m_context.subStates[subContext].GetMask());
				fragQuery.tagState.globalTags = m_context.controllerDef.m_tags.GetUnion(fragQuery.tagState.globalTags, subContextDef.additionalTags);
			}
			fragQuery.tagState.globalTags = m_context.controllerDef.m_tags.GetUnion(fragQuery.tagState.globalTags, m_additionalTags);
			fragQuery.requiredTags        = m_additionalTags;

			// the database may not exist in case of full enslavement
			if (!m_scopeContext.pDatabase)
			{
				return false;
			}
			GetDatabase().FindBestMatchingTag(fragQuery, NULL, &tagSetIdx);

			//--- Store cache
			m_cachedaaID             = aaID;
			m_cachedFragmentTags     = fragmentTags;
			m_cachedContextStateMask = m_context.state.GetMask();
			m_cachedTagSetIdx        = tagSetIdx;
		}

		return tagSetIdx != m_lastFragSelection.tagSetIdx;
	}

	return false;
}
Exemple #5
0
void CActionScope::BlendOutFragments()
{
    QueueFragment(FRAGMENT_ID_INVALID, SFragTagState(m_context.state.GetMask()), OPTION_IDX_RANDOM, 0.0f, m_userToken);
}