bool AnimationController::Play(const String& name, unsigned char layer, bool looped, float fadeInTime) { // Check if already exists unsigned index; AnimationState* state; FindAnimation(name, index, state); if (!state) { Animation* newAnimation = GetSubsystem<ResourceCache>()->GetResource<Animation>(name); state = AddAnimationState(newAnimation); if (!state) return false; } if (index == M_MAX_UNSIGNED) { AnimationControl newControl; Animation* animation = state->GetAnimation(); newControl.name_ = animation->GetName(); newControl.hash_ = animation->GetNameHash(); animations_.Push(newControl); index = animations_.Size() - 1; } state->SetLayer(layer); state->SetLooped(looped); animations_[index].targetWeight_ = 1.0f; animations_[index].fadeTime_ = fadeInTime; MarkNetworkUpdate(); return true; }
AnimationState* AnimatedModel::GetAnimationState(StringHash animationNameHash) const { for (Vector<SharedPtr<AnimationState> >::ConstIterator i = animationStates_.Begin(); i != animationStates_.End(); ++i) { Animation* animation = (*i)->GetAnimation(); if (animation) { // Check both the animation and the resource name if (animation->GetNameHash() == animationNameHash || animation->GetAnimationNameHash() == animationNameHash) return *i; } } return nullptr; }
AnimationState* AnimationController::GetAnimationState(StringHash nameHash) const { // Model mode AnimatedModel* model = GetComponent<AnimatedModel>(); if (model) return model->GetAnimationState(nameHash); // Node hierarchy mode for (Vector<SharedPtr<AnimationState> >::ConstIterator i = nodeAnimationStates_.Begin(); i != nodeAnimationStates_.End(); ++i) { Animation* animation = (*i)->GetAnimation(); if (animation->GetNameHash() == nameHash || animation->GetAnimationNameHash() == nameHash) return *i; } return 0; }
AnimationState* AnimationController::GetAnimationState(StringHash nameHash) const { // Model mode auto* model = GetComponent<AnimatedModel>(); if (model) return model->GetAnimationState(nameHash); // Node hierarchy mode for (auto i = nodeAnimationStates_.begin(); i != nodeAnimationStates_.end(); ++i) { Animation* animation = (*i)->GetAnimation(); if (animation->GetNameHash() == nameHash || animation->GetAnimationNameHash() == nameHash) return *i; } return nullptr; }
void AnimatedModel::RemoveAnimationState(StringHash animationNameHash) { for (Vector<SharedPtr<AnimationState> >::Iterator i = animationStates_.Begin(); i != animationStates_.End(); ++i) { AnimationState* state = *i; Animation* animation = state->GetAnimation(); if (animation) { // Check both the animation and the resource name if (animation->GetNameHash() == animationNameHash || animation->GetAnimationNameHash() == animationNameHash) { animationStates_.Erase(i); MarkAnimationDirty(); return; } } } }
VariantVector AnimatedModel::GetAnimationStatesAttr() const { VariantVector ret; ret.Reserve(animationStates_.Size() * 6 + 1); ret.Push(animationStates_.Size()); for (Vector<SharedPtr<AnimationState> >::ConstIterator i = animationStates_.Begin(); i != animationStates_.End(); ++i) { AnimationState* state = *i; Animation* animation = state->GetAnimation(); Bone* startBone = state->GetStartBone(); ret.Push(ResourceRef(Animation::GetTypeStatic(), animation ? animation->GetNameHash() : StringHash())); ret.Push(startBone ? startBone->name_ : String::EMPTY); ret.Push(state->IsLooped()); ret.Push(state->GetWeight()); ret.Push(state->GetTime()); ret.Push((int)state->GetLayer()); } return ret; }
bool AnimationController::Play(const String& name, unsigned char layer, bool looped, float fadeInTime) { // Get the animation resource first to be able to get the canonical resource name // (avoids potential adding of duplicate animations) Animation* newAnimation = GetSubsystem<ResourceCache>()->GetResource<Animation>(name); if (!newAnimation) return false; // Check if already exists unsigned index; AnimationState* state; FindAnimation(newAnimation->GetName(), index, state); if (!state) { state = AddAnimationState(newAnimation); if (!state) return false; } if (index == M_MAX_UNSIGNED) { AnimationControl newControl; newControl.name_ = newAnimation->GetName(); newControl.hash_ = newAnimation->GetNameHash(); animations_.Push(newControl); index = animations_.Size() - 1; } state->SetLayer(layer); state->SetLooped(looped); animations_[index].targetWeight_ = 1.0f; animations_[index].fadeTime_ = fadeInTime; MarkNetworkUpdate(); return true; }
bool AnimationController::Play(const String& name, unsigned char layer, bool looped, float fadeInTime) { // ATOMIC BEGIN Animation* newAnimation = 0; // Check if we're using attached animation resource if (animation_.NotNull() && animation_->GetAnimationName() == name) { newAnimation = animation_; } else { for (unsigned i = 0; i < animationResources_.Size(); i++) { if (name == animationResources_[i]->GetAnimationName()) { newAnimation = animationResources_[i]; break; } } } // Get the animation resource first to be able to get the canonical resource name // (avoids potential adding of duplicate animations) if (!newAnimation) newAnimation = GetSubsystem<ResourceCache>()->GetResource<Animation>(name); if (!newAnimation) return false; // ATOMIC END // Check if already exists unsigned index; AnimationState* state; FindAnimation(newAnimation->GetName(), index, state); if (!state) { state = AddAnimationState(newAnimation); if (!state) return false; } if (index == M_MAX_UNSIGNED) { AnimationControl newControl; newControl.name_ = newAnimation->GetName(); newControl.hash_ = newAnimation->GetNameHash(); animations_.Push(newControl); index = animations_.Size() - 1; } state->SetLayer(layer); state->SetLooped(looped); animations_[index].targetWeight_ = 1.0f; animations_[index].fadeTime_ = fadeInTime; MarkNetworkUpdate(); return true; }