void Mover::Update(float timeStep) { node_->Translate(Vector3::FORWARD * moveSpeed_ * timeStep); // If in risk of going outside the plane, rotate the model right Vector3 pos = node_->GetPosition(); if (pos.x_ < bounds_.min_.x_ || pos.x_ > bounds_.max_.x_ || pos.z_ < bounds_.min_.z_ || pos.z_ > bounds_.max_.z_) node_->Yaw(rotationSpeed_ * timeStep); // Get the model's first (only) animation state and advance its time. Note the convenience accessor to other components // in the same scene node AnimatedModel* model = GetComponent<AnimatedModel>(); if (model->GetNumAnimationStates()) { AnimationState* state = model->GetAnimationStates()[0]; state->AddTime(timeStep); } }
void Mover::HandleSceneUpdate(StringHash eventType, VariantMap& eventData) { // Get the timestep from the update event using namespace SceneUpdate; float timeStep = eventData[P_TIMESTEP].GetFloat(); node_->TranslateRelative(Vector3::FORWARD * moveSpeed_ * timeStep); // If in risk of going outside the plane, rotate the model right Vector3 pos = node_->GetPosition(); if (pos.x_ < bounds_.min_.x_ || pos.x_ > bounds_.max_.x_ || pos.z_ < bounds_.min_.z_ || pos.z_ > bounds_.max_.z_) node_->Yaw(rotationSpeed_ * timeStep); // Get the model's first (only) animation state and advance its time. Note the convenience accessor to other components // in the same scene node AnimatedModel* model = GetComponent<AnimatedModel>(); if (model->GetNumAnimationStates()) { AnimationState* state = model->GetAnimationStates()[0]; state->AddTime(timeStep); } }
void AnimationController::Update(float timeStep) { // Loop through animations for (unsigned i = 0; i < animations_.Size();) { AnimationControl& ctrl = animations_[i]; AnimationState* state = GetAnimationState(ctrl.hash_); bool remove = false; if (!state) remove = true; else { // Advance the animation if (ctrl.speed_ != 0.0f) state->AddTime(ctrl.speed_ * timeStep); float targetWeight = ctrl.targetWeight_; float fadeTime = ctrl.fadeTime_; // If non-looped animation at the end, activate autofade as applicable if (!state->IsLooped() && state->GetTime() >= state->GetLength() && ctrl.autoFadeTime_ > 0.0f) { targetWeight = 0.0f; fadeTime = ctrl.autoFadeTime_; } // Process weight fade float currentWeight = state->GetWeight(); if (currentWeight != targetWeight) { if (fadeTime > 0.0f) { float weightDelta = 1.0f / fadeTime * timeStep; if (currentWeight < targetWeight) currentWeight = Min(currentWeight + weightDelta, targetWeight); else if (currentWeight > targetWeight) currentWeight = Max(currentWeight - weightDelta, targetWeight); state->SetWeight(currentWeight); } else state->SetWeight(targetWeight); } // Remove if weight zero and target weight zero if (state->GetWeight() == 0.0f && (targetWeight == 0.0f || fadeTime == 0.0f) && ctrl.removeOnCompletion_) remove = true; } // Decrement the command time-to-live values if (ctrl.setTimeTtl_ > 0.0f) ctrl.setTimeTtl_ = Max(ctrl.setTimeTtl_ - timeStep, 0.0f); if (ctrl.setWeightTtl_ > 0.0f) ctrl.setWeightTtl_ = Max(ctrl.setWeightTtl_ - timeStep, 0.0f); if (remove) { if (state) RemoveAnimationState(state); animations_.Erase(i); MarkNetworkUpdate(); } else ++i; } // Node hierarchy animations need to be applied manually for (Vector<SharedPtr<AnimationState> >::Iterator i = nodeAnimationStates_.Begin(); i != nodeAnimationStates_.End(); ++i) (*i)->Apply(); }
void AnimationController::Update(float timeStep) { AnimatedModel* model = GetComponent<AnimatedModel>(); if (!model) return; // Loop through animations for (Vector<AnimationControl>::Iterator i = animations_.Begin(); i != animations_.End();) { bool remove = false; AnimationState* state = model->GetAnimationState(i->hash_); if (!state) remove = true; else { // Advance the animation if (i->speed_ != 0.0f) state->AddTime(i->speed_ * timeStep); float targetWeight = i->targetWeight_; float fadeTime = i->fadeTime_; // If non-looped animation at the end, activate autofade as applicable if (!state->IsLooped() && state->GetTime() >= state->GetLength() && i->autoFadeTime_ > 0.0f) { targetWeight = 0.0f; fadeTime = i->autoFadeTime_; } // Process weight fade float currentWeight = state->GetWeight(); if (currentWeight != targetWeight) { if (fadeTime > 0.0f) { float weightDelta = 1.0f / fadeTime * timeStep; if (currentWeight < targetWeight) currentWeight = Min(currentWeight + weightDelta, targetWeight); else if (currentWeight > targetWeight) currentWeight = Max(currentWeight - weightDelta, targetWeight); state->SetWeight(currentWeight); } else state->SetWeight(targetWeight); } // Remove if weight zero and target weight zero if (state->GetWeight() == 0.0f && (targetWeight == 0.0f || fadeTime == 0.0f)) remove = true; } // Decrement the command time-to-live values if (i->setTimeTtl_ > 0.0f) i->setTimeTtl_ = Max(i->setTimeTtl_ - timeStep, 0.0f); if (i->setWeightTtl_ > 0.0f) i->setWeightTtl_ = Max(i->setWeightTtl_ - timeStep, 0.0f); if (remove) { if (state) model->RemoveAnimationState(state); i = animations_.Erase(i); MarkNetworkUpdate(); } else ++i; } }