--------------------------------------------------------------------------------
| 280 | |
| 281 | // -------------------------------------------------------------------------------- |
| 282 | void Tr2CurveScalar::OnKeysChanged() |
| 283 | { |
| 284 | std::stable_sort( |
| 285 | m_keys.begin(), |
| 286 | m_keys.end(), |
| 287 | []( const Tr2CurveScalarKey& k0, const Tr2CurveScalarKey& k1 ) { return k0.m_time < k1.m_time; } ); |
| 288 | |
| 289 | for( size_t i = 0; i < m_keys.size(); ++i ) |
| 290 | { |
| 291 | auto& k = m_keys[i]; |
| 292 | switch( k.m_tangentType ) |
| 293 | { |
| 294 | case Tr2CurveTangentType::AUTO_CLAMP: |
| 295 | if( i == 0 ) |
| 296 | { |
| 297 | k.m_leftTangent = k.m_rightTangent = 0; |
| 298 | } |
| 299 | else if( i + 1 == m_keys.size() ) |
| 300 | { |
| 301 | k.m_leftTangent = k.m_rightTangent = 0; |
| 302 | } |
| 303 | else |
| 304 | { |
| 305 | float tangent = GetAutoClamppedTangent( |
| 306 | m_keys[i - 1].m_time, |
| 307 | m_keys[i - 1].m_value, |
| 308 | k.m_time, |
| 309 | k.m_value, |
| 310 | m_keys |
| 311 | [i + 1] |
| 312 | .m_time, |
| 313 | m_keys[i + 1].m_value ); |
| 314 | |
| 315 | k.m_leftTangent = tangent; |
| 316 | k.m_rightTangent = tangent; |
| 317 | } |
| 318 | break; |
| 319 | case Tr2CurveTangentType::AUTO: |
| 320 | if( i == 0 ) |
| 321 | { |
| 322 | k.m_leftTangent = k.m_rightTangent = 0; |
| 323 | } |
| 324 | else if( i + 1 == m_keys.size() ) |
| 325 | { |
| 326 | k.m_leftTangent = k.m_rightTangent = 0; |
| 327 | } |
| 328 | else |
| 329 | { |
| 330 | float tangent = GetAutoTangent( |
| 331 | m_keys[i - 1].m_time, |
| 332 | m_keys[i - 1].m_value, |
| 333 | k.m_time, |
| 334 | k.m_value, |
| 335 | m_keys[i + 1].m_time, |
| 336 | m_keys[i + 1].m_value ); |
| 337 | |
| 338 | k.m_leftTangent = tangent; |
| 339 | k.m_rightTangent = tangent; |
no test coverage detected