Пример #1
0
void AnimatedEntity::native_IsAnimationPlaying(CallStruct &cs)
{
    BOOL& returnVal = (BOOL&)cs.GetIntOut(RETURNVAL);
    int id = cs.GetInt(0);

    returnVal = IsAnimationPlaying(id);
}
Пример #2
0
void AnimatedEntity::native_IsAnimationPlaying_2(CallStruct &cs)
{
    BOOL& returnVal = (BOOL&)cs.GetIntOut(RETURNVAL);
    String seqName = cs.GetString(0);

    returnVal = IsAnimationPlaying(seqName);
}
// add animation to ModelInstance
void CModelInstance::AddAnimation(INDEX iAnimID, ULONG ulFlags, FLOAT fStrength, INDEX iGroupID, FLOAT fSpeedMul/*=1.0f*/)
{

#ifdef SKADEBUG
// see whether this animation even exists in the current skeleton
INDEX iDummy1, iDummy2;
if (!FindAnimationByID(iAnimID, &iDummy1, &iDummy2)) { 
  /*this ModelInstance does not contain the required animation!!!*/
  SKAASSERT(FALSE);
}
#endif

  fSpeedMul = 1/fSpeedMul;
  // if no restart flag was set
  if(ulFlags&AN_NORESTART) {
    // if given animtion is allready playing
    if(IsAnimationPlaying(iAnimID)) {
      if(ulFlags&AN_LOOPING) {
        AddFlagsToPlayingAnim(iAnimID,AN_LOOPING);
      }
      // return without adding animtion
      return;
    }
  }

  // if flag for new cleared state is set
  if(ulFlags&AN_CLEAR) {
    // do new clear state with default length
    NewClearState(CLEAR_STATE_LENGTH);
  // if flag for new cloned state is set
  } else if(ulFlags&AN_CLONE) {
    // do new clear state with default length
    NewClonedState(CLONED_STATE_LENGTH);
  }

  // if anim queue is empty 
  INDEX ctal = mi_aqAnims.aq_Lists.Count();
  if(ctal == 0) {
    // add new clear state
    NewClearState(0);
  }

  ctal = mi_aqAnims.aq_Lists.Count();
  AnimList &alList = mi_aqAnims.aq_Lists[ctal-1];

  // if flag is set not to sort anims
  if(ulFlags&AN_NOGROUP_SORT) {
    // just add new animations to end of list
    PlayedAnim &plAnim = alList.al_PlayedAnims.Push();
    plAnim.pa_iAnimID = iAnimID;
    plAnim.pa_fSpeedMul = fSpeedMul;
    plAnim.pa_fStartTime = _pTimer->CurrentTick();
    plAnim.pa_Strength = fStrength;
    plAnim.pa_ulFlags = ulFlags;
    plAnim.pa_GroupID = iGroupID;
  // no flag set, sort animation by groupID
  } else {
    // add one animation to anim list
    alList.al_PlayedAnims.Push();
    INDEX ctpa = alList.al_PlayedAnims.Count();

    INDEX ipa=ctpa-1;
    if(ipa>0) {
      // for each old animation from last to first
      for(;ipa>0;ipa--) {
        PlayedAnim &pa = alList.al_PlayedAnims[ipa-1];
        PlayedAnim &paNext = alList.al_PlayedAnims[ipa];
        // if anim group id is larger than new group id
        if(pa.pa_GroupID>iGroupID) {
          // move animation in array to right
          paNext = pa;
        } else break;
      }
    }
    // set new animation as current index in anim list
    PlayedAnim &plAnim = alList.al_PlayedAnims[ipa];
    plAnim.pa_iAnimID = iAnimID;
    plAnim.pa_fSpeedMul = fSpeedMul;
    plAnim.pa_fStartTime = _pTimer->CurrentTick();
    plAnim.pa_Strength = fStrength;
    plAnim.pa_ulFlags = ulFlags;
    plAnim.pa_GroupID = iGroupID;
  }
}