bool PlayAnimationJob::execute(Ogre::Real time) { if (mActor && !mAnimationRunning) { MeshObject* mo = dynamic_cast<MeshObject*>(mActor->getControlledObject()); if (mReplaceAllAnims) { mo->stopAllAnimationsExcept(mAnimName); } if (mo->hasAnimation(mAnimName)) { if (mDuration > 0) { mAnimation = mo->startAnimation(mAnimName, 1.0f, 0); mTimeToGo = mDuration; mAnimationRunning = true; } else { mAnimation = mo->startAnimation(mAnimName, 1.0f, mLoops); mTimeToGo = mAnimation->getLength() * (float)mLoops; mAnimationRunning = true; } } else { mAnimation = NULL; mTimeToGo = 0; } } mTimeToGo -= time; if (mTimeToGo <= 0.0f) { if (mAnimationRunning && mAnimation) { mAnimationRunning = false; mAnimation->pause(); if (!mHoldOnEnd) { if( mActor ) { MeshObject* mo = dynamic_cast<MeshObject*>(mActor->getControlledObject()); mo->stopAnimation(mAnimName); } else { //! TODO: what to do here? } } mAnimation = NULL; } return true; } return false; }