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