bool CAnimationProxyDualCharacterUpper::RemoveAnimationInLayer(IEntity *entity, int32 nLayer, uint32 token) { ICharacterInstance* pIShadowCharacter = m_firstPersonMode ? entity->GetCharacter(m_characterShadow) : NULL; ICharacterInstance* pICharacter = pIShadowCharacter ? pIShadowCharacter : entity->GetCharacter(m_characterMain); if (pICharacter) { ISkeletonAnim* pISkeletonAnim = pICharacter->GetISkeletonAnim(); if (pIShadowCharacter) { ISkeletonAnim* pIShadowSkeletonAnim = pIShadowCharacter->GetISkeletonAnim(); int nAnimsInFIFO = pIShadowSkeletonAnim->GetNumAnimsInFIFO(nLayer); for (int i=0; i<nAnimsInFIFO; ++i) { const CAnimation& anim = pIShadowSkeletonAnim->GetAnimFromFIFO(nLayer, i); if (anim.HasUserToken(token)) { pIShadowSkeletonAnim->RemoveAnimFromFIFO(nLayer, i); } } } int nAnimsInFIFO = pISkeletonAnim->GetNumAnimsInFIFO(nLayer); for (int i=0; i<nAnimsInFIFO; ++i) { const CAnimation& anim = pISkeletonAnim->GetAnimFromFIFO(nLayer, i); if (anim.HasUserToken(token)) { return pISkeletonAnim->RemoveAnimFromFIFO(nLayer, i); } } } return false; }
//------------------------------------------------------------------------ void CItem::PlayAnimationEx(const char* animationName, int slot, int layer, bool loop, float blend, float speed, uint32 flags) { bool start=true; ICharacterInstance *pCharacter = GetEntity()->GetCharacter(slot); if (!pCharacter && slot==eIGS_FirstPerson && ((m_stats.viewmode&eIVM_FirstPerson)==0)) { start=false; int idx = 0; if (m_stats.hand == eIH_Right) idx = 1; else if (m_stats.hand == eIH_Left) idx = 2; if (m_fpgeometry[idx].name.empty()) idx = 0; pCharacter = m_pItemSystem->GetCachedCharacter(m_fpgeometry[idx].name.c_str()); } if (pCharacter && animationName) { ISkeletonAnim* pSkeletonAnim = pCharacter->GetISkeletonAnim(); if (flags&eIPAF_CleanBlending) { while(pSkeletonAnim->GetNumAnimsInFIFO(layer)>1) { if (!pSkeletonAnim->RemoveAnimFromFIFO(layer, pSkeletonAnim->GetNumAnimsInFIFO(layer)-1)) break; } } if (flags&eIPAF_NoBlend) blend = 0.0f; if (start) { CryCharAnimationParams params; params.m_fTransTime = blend; params.m_nLayerID = layer; params.m_nFlags = (loop?CA_LOOP_ANIMATION:0)|(flags&eIPAF_RestartAnimation?CA_ALLOW_ANIM_RESTART:0)|(flags&eIPAF_RepeatLastFrame?CA_REPEAT_LAST_KEY:0); pSkeletonAnim->StartAnimation(animationName, params); pSkeletonAnim->SetLayerUpdateMultiplier(layer, speed); //pCharacter->GetISkeleton()->SetDebugging( true ); } float duration=0.0f; int animationId = pCharacter->GetIAnimationSet()->GetAnimIDByName(animationName); if (animationId>=0) duration = pCharacter->GetIAnimationSet()->GetDuration_sec(animationId); m_animationTime[slot] = (uint32)(duration*1000.0f/speed); m_animationEnd[slot] = (uint32)(gEnv->pTimer->GetCurrTime()*1000.0f)+m_animationTime[slot]; m_animationSpeed[slot] = speed; } }
void CScriptbind_Entity::PlayAnimation(IEntity *pEntity, mono::string animationName, int slot, int layer, float blend, float speed, EAnimationFlags flags) { // Animation graph input /*if(IGameObject *pGameObject = static_cast<CScriptSystem *>(GetMonoScriptSystem())->GetIGameFramework()->GetGameObject(pEntity->GetId())) { if(IAnimatedCharacter *pAniamtedCharacter = static_cast<IAnimatedCharacter*>(pGameObject->AcquireExtension("AnimatedCharacter"))) { pAniamtedCharacter->GetAnimationGraphState()->SetInput("Action / "Signal" } }*/ ICharacterInstance *pCharacter = pEntity->GetCharacter(slot); if(!pCharacter) return; ISkeletonAnim *pSkeletonAnim = pCharacter->GetISkeletonAnim(); if(!pSkeletonAnim) return; if(flags & EAnimFlag_CleanBending) { while(pSkeletonAnim->GetNumAnimsInFIFO(layer)>1) { if (!pSkeletonAnim->RemoveAnimFromFIFO(layer, pSkeletonAnim->GetNumAnimsInFIFO(layer)-1)) break; } } if (flags & EAnimFlag_NoBlend) blend = 0.0f; CryCharAnimationParams params; params.m_fTransTime = blend; params.m_nLayerID = layer; params.m_fPlaybackSpeed = speed; params.m_nFlags = (flags & EAnimFlag_Loop ? CA_LOOP_ANIMATION : 0) | (flags & EAnimFlag_RestartAnimation ? CA_ALLOW_ANIM_RESTART : 0) | (flags & EAnimFlag_RepeatLastFrame ? CA_REPEAT_LAST_KEY : 0); pSkeletonAnim->StartAnimation(ToCryString(animationName), params); }