---------------------------------------------------------------------
| 78 | } |
| 79 | //--------------------------------------------------------------------- |
| 80 | Real AnimationTrack::getKeyFramesAtTime( const TimeIndex &timeIndex, KeyFrame **keyFrame1, |
| 81 | KeyFrame **keyFrame2, |
| 82 | unsigned short *firstKeyIndex ) const |
| 83 | { |
| 84 | // Parametric time |
| 85 | // t1 = time of previous keyframe |
| 86 | // t2 = time of next keyframe |
| 87 | Real t1, t2; |
| 88 | |
| 89 | Real timePos = timeIndex.getTimePos(); |
| 90 | |
| 91 | // Find first keyframe after or on current time |
| 92 | KeyFrameList::const_iterator i; |
| 93 | if( timeIndex.hasKeyIndex() ) |
| 94 | { |
| 95 | // Global keyframe index available, map to local keyframe index directly. |
| 96 | assert( timeIndex.getKeyIndex() < mKeyFrameIndexMap.size() ); |
| 97 | i = mKeyFrames.begin() + mKeyFrameIndexMap[timeIndex.getKeyIndex()]; |
| 98 | #if OGRE_DEBUG_MODE |
| 99 | KeyFrame timeKey( 0, timePos ); |
| 100 | if( i != std::lower_bound( mKeyFrames.begin(), mKeyFrames.end(), &timeKey, |
| 101 | KeyFrameTimeLess() ) ) |
| 102 | { |
| 103 | OGRE_EXCEPT( Exception::ERR_INTERNAL_ERROR, "Optimised key frame search failed", |
| 104 | "AnimationTrack::getKeyFramesAtTime" ); |
| 105 | } |
| 106 | #endif |
| 107 | } |
| 108 | else |
| 109 | { |
| 110 | // Wrap time |
| 111 | Real totalAnimationLength = mParent->getLength(); |
| 112 | assert( totalAnimationLength > 0.0f && "Invalid animation length!" ); |
| 113 | |
| 114 | if( timePos > totalAnimationLength && totalAnimationLength > 0.0f ) |
| 115 | timePos = std::fmod( timePos, totalAnimationLength ); |
| 116 | |
| 117 | // No global keyframe index, need to search with local keyframes. |
| 118 | KeyFrame timeKey( 0, timePos ); |
| 119 | i = std::lower_bound( mKeyFrames.begin(), mKeyFrames.end(), &timeKey, |
| 120 | KeyFrameTimeLess() ); |
| 121 | } |
| 122 | |
| 123 | if( i == mKeyFrames.end() ) |
| 124 | { |
| 125 | // There is no keyframe after this time, wrap back to first |
| 126 | *keyFrame2 = mKeyFrames.front(); |
| 127 | t2 = mParent->getLength() + ( *keyFrame2 )->getTime(); |
| 128 | |
| 129 | // Use last keyframe as previous keyframe |
| 130 | --i; |
| 131 | } |
| 132 | else |
| 133 | { |
| 134 | *keyFrame2 = *i; |
| 135 | t2 = ( *keyFrame2 )->getTime(); |
| 136 | |
| 137 | // Find last keyframe before or on current time |