| 71 | } |
| 72 | |
| 73 | Vector3 Tr2FollowCurve::GetSegmentValue( float time, ITr2FollowCurveKey& k0, ITr2FollowCurveKey& k1 ) const |
| 74 | { |
| 75 | switch( k0.GetInterpolationType() ) |
| 76 | { |
| 77 | case Tr2FollowCurveKeyInterpolation::CONSTANT: |
| 78 | return time == k1.GetTime() ? k1.GetValue() : k0.GetValue(); |
| 79 | case Tr2FollowCurveKeyInterpolation::LINEAR: |
| 80 | if( k1.GetTime() == k0.GetTime() ) |
| 81 | { |
| 82 | return k1.GetValue(); |
| 83 | } |
| 84 | return k0.GetValue() + ( k1.GetValue() - k0.GetValue() ) * ( time - k0.GetTime() ) / ( k1.GetTime() - k0.GetTime() ); |
| 85 | case Tr2FollowCurveKeyInterpolation::HERMITE: { |
| 86 | float length = k1.GetTime() - k0.GetTime(); |
| 87 | if( length == 0 ) |
| 88 | { |
| 89 | return k1.GetValue(); |
| 90 | } |
| 91 | Vector3 inTangent = k0.GetRightTangent() * length; |
| 92 | Vector3 outTangent = k1.GetLeftTangent() * length; |
| 93 | |
| 94 | float s = ( time - k0.GetTime() ) / length; |
| 95 | float s2 = s * s; |
| 96 | float s3 = s2 * s; |
| 97 | |
| 98 | float c2 = -2.0f * s3 + 3.0f * s2; |
| 99 | float c1 = 1.0f - c2; |
| 100 | float c4 = s3 - s2; |
| 101 | float c3 = s + c4 - s2; |
| 102 | |
| 103 | return k0.GetValue() * c1 + k1.GetValue() * c2 + inTangent * c3 + outTangent * c4; |
| 104 | } |
| 105 | default: |
| 106 | return Vector3( 0, 0, 0 ); |
| 107 | } |
| 108 | } |
| 109 | |
| 110 | Vector3* Tr2FollowCurve::Update( Vector3* in, Be::Time time ) |
| 111 | { |
nothing calls this directly
no test coverage detected