MCPcopy Create free account
hub / github.com/OGRECave/ogre-next / getKeyFramesAtTime

Method getKeyFramesAtTime

OgreMain/src/OgreAnimationTrack.cpp:80–163  ·  view source on GitHub ↗

---------------------------------------------------------------------

Source from the content-addressed store, hash-verified

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

Calls 8

KeyFrameTimeLessClass · 0.85
getTimeMethod · 0.80
distanceFunction · 0.50
sizeMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
getLengthMethod · 0.45
frontMethod · 0.45

Tested by

no test coverage detected