void TSShapeInstance::transitionToSequence(TSThread * thread, S32 seq, F32 pos, F32 duration, bool continuePlay) { // make sure all transforms on all detail levels are accurate sortThreads(); animateNodeSubtrees(); thread->transitionToSequence(seq,pos,duration,continuePlay); setDirty(AllDirtyMask); mGroundThread = NULL; if (mScaleCurrentlyAnimated && !thread->getSequence()->animatesScale()) checkScaleCurrentlyAnimated(); else if (!mScaleCurrentlyAnimated && thread->getSequence()->animatesScale()) mScaleCurrentlyAnimated=true; mTransitionRotationNodes.overlap(thread->transitionData.oldRotationNodes); mTransitionRotationNodes.overlap(thread->getSequence()->rotationMatters); mTransitionTranslationNodes.overlap(thread->transitionData.oldTranslationNodes); mTransitionTranslationNodes.overlap(thread->getSequence()->translationMatters); mTransitionScaleNodes.overlap(thread->transitionData.oldScaleNodes); mTransitionScaleNodes.overlap(thread->getSequence()->scaleMatters); // if we aren't already in the list of transition threads, add us now S32 i; for (i=0; i<mTransitionThreads.size(); i++) if (mTransitionThreads[i]==thread) break; if (i==mTransitionThreads.size()) mTransitionThreads.push_back(thread); updateTransitions(); }
void TSShapeInstance::clearTransition(TSThread * thread) { if (!thread->transitionData.inTransition) return; // if other transitions are still playing, // make sure transforms are up to date if (mTransitionThreads.size()>1) animateNodeSubtrees(); // turn off transition... thread->transitionData.inTransition = false; // remove us from transition list S32 i; if (mTransitionThreads.size() != 0) { for (i=0; i<mTransitionThreads.size(); i++) if (mTransitionThreads[i]==thread) break; AssertFatal(i!=mTransitionThreads.size(),"TSShapeInstance::clearTransition"); mTransitionThreads.erase(i); } // recompute transitionNodes mTransitionRotationNodes.clearAll(); mTransitionTranslationNodes.clearAll(); mTransitionScaleNodes.clearAll(); for (i=0; i<mTransitionThreads.size(); i++) { mTransitionRotationNodes.overlap(mTransitionThreads[i]->transitionData.oldRotationNodes); mTransitionRotationNodes.overlap(mTransitionThreads[i]->getSequence()->rotationMatters); mTransitionTranslationNodes.overlap(mTransitionThreads[i]->transitionData.oldTranslationNodes); mTransitionTranslationNodes.overlap(mTransitionThreads[i]->getSequence()->translationMatters); mTransitionScaleNodes.overlap(mTransitionThreads[i]->transitionData.oldScaleNodes); mTransitionScaleNodes.overlap(mTransitionThreads[i]->getSequence()->scaleMatters); } setDirty(ThreadDirty); updateTransitions(); }
void TSShapeInstance::setSequence(TSThread * thread, S32 seq, F32 pos) { if ( (thread->transitionData.inTransition && mTransitionThreads.size()>1) || mTransitionThreads.size()>0) { // if we have transitions, make sure transforms are up to date... sortThreads(); animateNodeSubtrees(); } thread->setSequence(seq,pos); setDirty(AllDirtyMask); mGroundThread = NULL; if (mScaleCurrentlyAnimated && !thread->getSequence()->animatesScale()) checkScaleCurrentlyAnimated(); else if (!mScaleCurrentlyAnimated && thread->getSequence()->animatesScale()) mScaleCurrentlyAnimated=true; updateTransitions(); }