111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright 2013 The Android Open Source Project 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Licensed under the Apache License, Version 2.0 (the "License"); 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * you may not use this file except in compliance with the License. 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * You may obtain a copy of the License at 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * http://www.apache.org/licenses/LICENSE-2.0 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Unless required by applicable law or agreed to in writing, software 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * distributed under the License is distributed on an "AS IS" BASIS, 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * See the License for the specific language governing permissions and 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * limitations under the License. 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "interpolator.h" 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <math.h> 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "interpolator.h" 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace ndk_helper 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//------------------------------------------------- 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//Ctor 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//------------------------------------------------- 2711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertInterpolator::Interpolator() 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert list_params_.clear(); 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//------------------------------------------------- 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//Dtor 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//------------------------------------------------- 3511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertInterpolator::~Interpolator() 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert list_params_.clear(); 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid Interpolator::Clear() 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert list_params_.clear(); 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertInterpolator& Interpolator::Set( const float start, 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const float dest, 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const INTERPOLATOR_TYPE type, 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const double duration ) 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //init the parameters for the interpolation process 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert start_time_ = PerfMonitor::GetCurrentTime(); 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert dest_time_ = start_time_ + duration; 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert type_ = type; 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert start_value_ = start; 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert dest_value_ = dest; 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6011cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertInterpolator& Interpolator::Add( const float dest, 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const INTERPOLATOR_TYPE type, 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const double duration ) 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert InterpolatorParams param; 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert param.dest_value_ = dest; 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert param.type_ = type; 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert param.duration_ = duration; 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert list_params_.push_back( param ); 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *this; 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool Interpolator::Update( const double current_time, float& p ) 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool bContinue; 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if( current_time >= dest_time_ ) 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert p = dest_value_; 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if( list_params_.size() ) 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert InterpolatorParams& item = list_params_.front(); 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert Set( dest_value_, item.dest_value_, item.type_, item.duration_ ); 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert list_params_.pop_front(); 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bContinue = true; 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bContinue = false; 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert float t = (float) (current_time - start_time_); 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert float d = (float) (dest_time_ - start_time_); 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert float b = start_value_; 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert float c = dest_value_ - start_value_; 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert p = GetFormula( type_, t, b, d, c ); 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bContinue = true; 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return bContinue; 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertfloat Interpolator::GetFormula( const INTERPOLATOR_TYPE type, 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const float t, 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const float b, 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const float d, 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const float c ) 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert float t1; 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert switch( type ) 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case INTERPOLATOR_TYPE_LINEAR: 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // simple linear interpolation - no easing 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (c * t / d + b); 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case INTERPOLATOR_TYPE_EASEINQUAD: 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // quadratic (t^2) easing in - accelerating from zero velocity 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert t1 = t / d; 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (c * t1 * t1 + b); 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case INTERPOLATOR_TYPE_EASEOUTQUAD: 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // quadratic (t^2) easing out - decelerating to zero velocity 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert t1 = t / d; 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (-c * t1 * (t1 - 2) + b); 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case INTERPOLATOR_TYPE_EASEINOUTQUAD: 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // quadratic easing in/out - acceleration until halfway, then deceleration 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert t1 = t / d / 2; 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if( t1 < 1 ) 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (c / 2 * t1 * t1 + b); 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert t1 = t1 - 1; 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (-c / 2 * (t1 * (t1 - 2) - 1) + b); 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case INTERPOLATOR_TYPE_EASEINCUBIC: 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // cubic easing in - accelerating from zero velocity 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert t1 = t / d; 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (c * t1 * t1 * t1 + b); 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case INTERPOLATOR_TYPE_EASEOUTCUBIC: 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // cubic easing in - accelerating from zero velocity 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert t1 = t / d - 1; 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (c * (t1 * t1 * t1 + 1) + b); 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case INTERPOLATOR_TYPE_EASEINOUTCUBIC: 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // cubic easing in - accelerating from zero velocity 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert t1 = t / d / 2; 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if( t1 < 1 ) 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (c / 2 * t1 * t1 * t1 + b); 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert t1 -= 2; 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (c / 2 * (t1 * t1 * t1 + 2) + b); 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case INTERPOLATOR_TYPE_EASEINQUART: 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // quartic easing in - accelerating from zero velocity 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert t1 = t / d; 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (c * t1 * t1 * t1 * t1 + b); 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case INTERPOLATOR_TYPE_EASEINEXPO: 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // exponential (2^t) easing in - accelerating from zero velocity 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if( t == 0 ) 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return b; 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (c * powf( 2, (10 * (t / d - 1)) ) + b); 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert case INTERPOLATOR_TYPE_EASEOUTEXPO: 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // exponential (2^t) easing out - decelerating to zero velocity 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if( t == d ) 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (b + c); 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return (c * (-powf( 2, -10 * t / d ) + 1) + b); 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default: 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return 0; 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} //namespace ndkHelper 182