blob: 645bd8f4a12f97895b82cbee8626eedd8db0a2db [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <math.h>
#include "easing/easing.h"
#define HALF_PI 1.57079632679f /* PI/2 */
#define ONE_DIV_E 0.36787944117f /* 1/e */
#define PI_TIMES2 6.28318530718f /* 2PI */
/* Custom */
static inline float exponential_custom_io(float step, float max_steps, float max_val)
{
float R = max_steps * log10(2) / log10(max_val);
return pow(2, (step / R)) - 1;
}
static inline float exp_sin_custom_io(float step, float max_steps, float max_val)
{
float mplier = max_val / 2.35040238729f;
float pi_d_maxs = M_PI / max_steps;
step += max_steps;
return ( exp( sin((step * pi_d_maxs) + M_PI_2)) - ONE_DIV_E ) * mplier;
}
static inline float sine_custom_io(float step, float max_steps, float max_val)
{
return max_val * cos((PI_TIMES2 * step/max_steps) + M_PI) + max_val;
}
/* Linear */
static inline float linear_io(float step, float max_steps, float max_val)
{
return step * max_val / max_steps;
}
/* Exponential */
static inline float exponential_in(float step, float max_steps, float max_val)
{
return (step == 0) ?
0 :
pow(max_val, (float)step/max_steps);
}
static inline float exponential_out(float step, float max_steps, float max_val)
{
return (step == max_steps) ?
max_val :
max_val - pow(max_val, 1.0 - (float)step/max_steps);
}
static inline float exponential_io(float step, float max_steps, float max_val)
{
float ratio = ( (float)step / (max_steps / 2.0) );
if (step == 0)
return 0;
if (step == max_steps)
return max_val;
if (ratio < 1)
return powf((float)max_val/2.0, (float)step/(max_steps/2.0));
return max_val/2.0 + max_val/2.0 -
pow(max_val/2.0, 1.0 - ((float)step - (max_steps / 2)) /
(max_steps / 2) );
}
/* Quadratic */
static inline float quadratic_in(float step, float max_steps, float max_val)
{
float ratio = step / max_steps;
return max_val * pow(ratio, 2);
}
static inline float quadratic_out(float step, float max_steps, float max_val)
{
float ratio = step / max_steps;
return -max_val * ratio * (ratio - 2.0);
}
static inline float quadratic_io(float step, float max_steps, float max_val)
{
float ratio = step / (max_steps / 2.0);
if (ratio < 1)
return max_val / 2.0 * pow(ratio, 2);
ratio = (step - (max_steps/2.0)) / (max_steps/2.0);
return (max_val / 2.0) - (max_val / 2.0) * ratio * (ratio - 2.0);
}
/* Cubic */
static inline float cubic_in(float step, float max_steps, float max_val)
{
float ratio = step / max_steps;
return max_val * pow(ratio, 3);
}
static inline float cubic_out(float step, float max_steps, float max_val)
{
float ratio = step / (max_steps - 1.0);
return max_val * (pow(ratio, 3) + 1);
}
static inline float cubic_io(float step, float max_steps, float max_val)
{
float ratio = step / (max_steps / 2.0);
if (ratio < 1)
return max_val / 2 * pow(ratio, 3);
return max_val / 2 * (pow(ratio - 2, 3) + 2);
}
/* Quartic */
static inline float quartic_in(float step, float max_steps, float max_val)
{
float ratio = step / max_steps;
return max_val * pow(ratio, 4);
}
static inline float quartic_out(float step, float max_steps, float max_val)
{
float ratio = (step / max_steps) - 1.0;
return max_val + max_val * pow(ratio, 5);
}
static inline float quartic_io(float step, float max_steps, float max_val)
{
float ratio = step / (max_steps / 2.0);
if (ratio < 1)
return max_val / 2 * pow(ratio, 4);
return max_val + max_val / 2 * pow(ratio -2, 5);
}
/* Quintic */
static inline float quintic_in(float step, float max_steps, float max_val)
{
float ratio = step / max_steps;
return max_val * pow(ratio, 5);
}
static inline float quintic_out(float step, float max_steps, float max_val)
{
float ratio = (step / max_steps) - 1.0;
return max_val + max_val * pow(ratio, 5);
}
static inline float quintic_io(float step, float max_steps, float max_val)
{
float ratio = step / (max_steps / 2.0);
if (ratio < 1)
return max_val / 2 * pow(ratio, 5);
ratio -= 2;
return max_val + max_val / 2 * pow(ratio, 5);
}
/* Circular */
static inline float circular_in(float step, float max_steps, float max_val)
{
float ratio = step / max_steps;
return - max_val * (sqrt(1 - pow(ratio, 2) ) - 1);
}
static inline float circular_out(float step, float max_steps, float max_val)
{
float ratio = (step - max_steps) / (max_steps - 1.0);
return max_val * sqrt(1 - pow(ratio, 2));
}
static inline float circular_io(float step, float max_steps, float max_val)
{
float ratio = step / (max_steps / 2.0);
if (ratio < 1)
return - max_val / 2 * (sqrt(1 - pow(ratio, 2)) - 1);
return max_val / 2 * (sqrt(1 - pow(ratio - 2, 2)) + 1);
}
/* Sine */
static inline float sine_in(float step, float max_steps, float max_val)
{
return -max_val * cos((float)step / max_steps * M_PI_2) + max_val;
}
static inline float sine_out(float step, float max_steps, float max_val)
{
return max_val * sin((((float)step / max_steps)) * M_PI_2);
}
static inline float sine_io(float step, float max_steps, float max_val)
{
return -max_val / 2 * (cos(M_PI * step / max_steps) - 1);
}
/* Bounce */
static inline float bounce_out(float step, float max_steps, float max_val)
{
float ratio = step / max_steps;
if (ratio < (1 / 2.75)) {
return max_val * (7.5625 * ratio * ratio);
}
if (ratio < (2 / 2.75)) {
ratio -= 1.5 / 2.75;
return max_val * (7.5625 * ratio * ratio + .75);
}
if (ratio < (2.5 / 2.75)) {
ratio -= 2.25 / 2.75;
return max_val * (7.5625 * ratio * ratio + .9375);
}
ratio -= 2.625 / 2.75;
return max_val * (7.5625 * ratio * ratio + .984375);
}
static inline float bounce_in(float step, float max_steps, float max_val)
{
return max_val - bounce_out(max_steps - step, max_steps, max_val);
}
static inline float bounce_io(float step, float max_steps, float max_val)
{
if (step < max_steps / 2)
return bounce_in(step * 2, max_steps, max_val) * 0.5;
else
return bounce_out(step * 2 - max_steps, max_steps, max_val) *
0.5 + max_val * 0.5;
}
/* Back */
static inline float back_in(float step, float max_steps, float max_val)
{
float s = 1.70158f;
float ratio = step / max_steps;
return max_val * ratio * ratio * ((s + 1) * ratio - s);
}
static inline float back_out(float step, float max_steps, float max_val)
{
float s = 1.70158f;
float ratio = (step / max_steps) - 1;
return max_val * (ratio * ratio * ((s + 1) * ratio + s) + 1);
}
static inline float back_io(float step, float max_steps, float max_val)
{
float s = 1.70158f * 1.525;
float ratio = step / (max_steps / 2);
if (ratio < 1)
return max_val / 2 * (ratio * ratio * ((s + 1) * ratio - s));
ratio -= 2;
return max_val / 2 * (ratio * ratio * ((s + 1) * ratio + s) + 2);
}
/* Float Functions */
/* Custom, used for breathing */
float
exponential_custom_f_io(float step, float max_steps, float max_val)
{
return exponential_custom_io(step, max_steps, max_val);
}
float
exp_sin_custom_f_io(float step, float max_steps, float max_val)
{
return exp_sin_custom_io(step, max_steps, max_val);
}
float
sine_custom_f_io(float step, float max_steps, float max_val)
{
return sine_custom_io(step, max_steps, max_val);
}
/* Linear */
float
linear_f_io(float step, float max_steps, float max_val)
{
return linear_io(step, max_steps, max_val);
}
/* Exponential */
float
exponential_f_in(float step, float max_steps, float max_val)
{
return exponential_in(step, max_steps, max_val);
}
float
exponential_f_out(float step, float max_steps, float max_val)
{
return exponential_out(step, max_steps, max_val);
}
float
exponential_f_io(float step, float max_steps, float max_val)
{
return exponential_io(step, max_steps, max_val);
}
/* Quadratic */
float
quadratic_f_in(float step, float max_steps, float max_val)
{
return quadratic_in(step, max_steps, max_val);
}
float
quadratic_f_out(float step, float max_steps, float max_val)
{
return quadratic_out(step, max_steps, max_val);
}
float
quadratic_f_io(float step, float max_steps, float max_val)
{
return quadratic_io(step, max_steps, max_val);
}
/* Cubic */
float
cubic_f_in(float step, float max_steps, float max_val)
{
return cubic_in(step, max_steps, max_val);
}
float
cubic_f_out(float step, float max_steps, float max_val)
{
return cubic_out(step, max_steps, max_val);
}
float
cubic_f_int_io(float step, float max_steps, float max_val)
{
return cubic_io(step, max_steps, max_val);
}
/* Quartic */
float
quartic_f_in(float step, float max_steps, float max_val)
{
return quartic_in(step, max_steps, max_val);
}
float
quartic_f_out(float step, float max_steps, float max_val)
{
return quartic_out(step,
max_steps,
max_val);
}
float
quartic_f_io(float step, float max_steps, float max_val)
{
return quartic_io(step, max_steps, max_val);
}
/* Quintic */
float
quintic_f_in(float step, float max_steps, float max_val)
{
return quintic_in(step, max_steps, max_val);
}
float
quintic_f_out(float step, float max_steps, float max_val)
{
return quintic_out(step, max_steps, max_val);
}
float
quintic_f_io(float step, float max_steps, float max_val)
{
return quintic_io(step, max_steps, max_val);
}
/* Circular */
float
circular_f_in(float step, float max_steps, float max_val)
{
return circular_in(step, max_steps, max_val);
}
float
circular_f_out(float step, float max_steps, float max_val)
{
return circular_out(step, max_steps, max_val);
}
float
circular_f_io(float step, float max_steps, float max_val)
{
return circular_io(step, max_steps, max_val);
}
/* Sine */
float
sine_f_in(float step, float max_steps, float max_val)
{
return sine_in(step, max_steps, max_val);
}
float
sine_f_out(float step, float max_steps, float max_val)
{
return sine_out(step, max_steps, max_val);
}
float
sine_f_io(float step, float max_steps, float max_val)
{
return sine_io(step, max_steps, max_val);
}
/* Bounce */
float
bounce_f_in(float step, float max_steps, float max_val)
{
return bounce_in(step, max_steps, max_val);
}
float
bounce_f_out(float step, float max_steps, float max_val)
{
return bounce_out(step, max_steps, max_val);
}
float
bounce_f_io(float step, float max_steps, float max_val)
{
return bounce_io(step, max_steps, max_val);
}
/* Back */
float
back_f_in(float step, float max_steps, float max_val)
{
return back_in(step, max_steps, max_val);
}
float
back_f_out(float step, float max_steps, float max_val)
{
return back_out(step, max_steps, max_val);
}
float
back_f_io(float step, float max_steps, float max_val)
{
return back_io(step, max_steps, max_val);
}
/* Integer Functions */
/* Custom */
int32_t
exponential_custom_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) exponential_custom_io((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
exp_sin_custom_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) exp_sin_custom_io((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
sine_custom_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) sine_custom_io((float) step,
(float) max_steps,
(float) max_val);
}
/* Linear */
int32_t
linear_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) linear_io((float) step,
(float) max_steps,
(float) max_val);
}
/* Exponential */
int32_t
exponential_int_in(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) exponential_in((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
exponential_int_out(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) exponential_out((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
exponential_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) exponential_io((float) step,
(float) max_steps,
(float) max_val);
}
/* Quadratic */
int32_t
quadratic_int_in(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) quadratic_in((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
quadratic_int_out(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) quadratic_out((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
quadratic_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) quadratic_io((float) step,
(float) max_steps,
(float) max_val);
}
/* Cubic */
int32_t
cubic_int_in(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) cubic_in((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
cubic_int_out(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) cubic_out((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
cubic_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) cubic_io((float) step,
(float) max_steps,
(float) max_val);
}
/* Quartic */
int32_t
quartic_int_in(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) quartic_in((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
quartic_int_out(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) quartic_out((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
quartic_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) quartic_io((float) step,
(float) max_steps,
(float) max_val);
}
/* Quintic */
int32_t
quintic_int_in(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) quintic_in((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
quintic_int_out(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) quintic_out((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
quintic_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) quintic_io((float) step,
(float) max_steps,
(float) max_val);
}
/* Circular */
int32_t
circular_int_in(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) circular_in((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
circular_int_out(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) circular_out((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
circular_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) circular_io((float) step,
(float) max_steps,
(float) max_val);
}
/* Sine */
int32_t
sine_int_in(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) sine_in((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
sine_int_out(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) sine_out((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
sine_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) sine_io((float) step,
(float) max_steps,
(float) max_val);
}
/* Bounce */
int32_t
bounce_int_in(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) bounce_in((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
bounce_int_out(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) bounce_out((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
bounce_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) bounce_io((float) step,
(float) max_steps,
(float) max_val);
}
/* Back */
int32_t
back_int_in(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) back_in((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
back_int_out(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) back_out((float) step,
(float) max_steps,
(float) max_val);
}
int32_t
back_int_io(int32_t step, int32_t max_steps, int32_t max_val)
{
return (int32_t) back_io((float) step,
(float) max_steps,
(float) max_val);
}