// BLANKART
//-----------------------------------------------------------------------------
// Copyright (C) 2020-2021 by Jaime "Lactozilla" Passos.
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file  m_easing.h
/// \brief Easing functions

#ifndef __M_EASING_H__
#define __M_EASING_H__

#include "doomtype.h"
#include "m_fixed.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum
{
	EASE_LINEAR = 0,

	EASE_INSINE,
	EASE_OUTSINE,
	EASE_INOUTSINE,

	EASE_INQUAD,
	EASE_OUTQUAD,
	EASE_INOUTQUAD,

	EASE_INCUBIC,
	EASE_OUTCUBIC,
	EASE_INOUTCUBIC,

	EASE_INQUART,
	EASE_OUTQUART,
	EASE_INOUTQUART,

	EASE_INQUINT,
	EASE_OUTQUINT,
	EASE_INOUTQUINT,

	EASE_INEXPO,
	EASE_OUTEXPO,
	EASE_INOUTEXPO,

	EASE_INBACK,
	EASE_OUTBACK,
	EASE_INOUTBACK,

	EASE_MAX,
} easing_t;

typedef fixed_t (*easingfunc_t)(fixed_t, fixed_t, fixed_t);

extern easingfunc_t easing_funclist[EASE_MAX];
extern const char *easing_funcnames[EASE_MAX];

#define EASINGFUNCLIST(sep) \
	EASINGFUNC(Linear) sep /* Easing_Linear */ \
 \
	EASINGFUNC(InSine) sep /* Easing_InSine */ \
	EASINGFUNC(OutSine) sep /* Easing_OutSine */ \
	EASINGFUNC(InOutSine) sep /* Easing_InOutSine */ \
 \
	EASINGFUNC(InQuad) sep /* Easing_InQuad */ \
	EASINGFUNC(OutQuad) sep /* Easing_OutQuad */ \
	EASINGFUNC(InOutQuad) sep /* Easing_InOutQuad */ \
 \
	EASINGFUNC(InCubic) sep /* Easing_InCubic */ \
	EASINGFUNC(OutCubic) sep /* Easing_OutCubic */ \
	EASINGFUNC(InOutCubic) sep /* Easing_InOutCubic */ \
 \
	EASINGFUNC(InQuart) sep /* Easing_InQuart */ \
	EASINGFUNC(OutQuart) sep /* Easing_OutQuart */ \
	EASINGFUNC(InOutQuart) sep /* Easing_InOutQuart */ \
 \
	EASINGFUNC(InQuint) sep /* Easing_InQuint */ \
	EASINGFUNC(OutQuint) sep /* Easing_OutQuint */ \
	EASINGFUNC(InOutQuint) sep /* Easing_InOutQuint */ \
 \
	EASINGFUNC(InExpo) sep /* Easing_InExpo */ \
	EASINGFUNC(OutExpo) sep /* Easing_OutExpo */ \
	EASINGFUNC(InOutExpo) sep /* Easing_InOutExpo */ \
 \
	EASINGFUNC(InBack) sep /* Easing_InBack */ \
	EASINGFUNC(OutBack) sep /* Easing_OutBack */ \
	EASINGFUNC(InOutBack) sep /* Easing_InOutBack */

#define EASINGFUNC(type) fixed_t Easing_ ## type (fixed_t t, fixed_t start, fixed_t end);

EASINGFUNCLIST()

#undef EASINGFUNC
#define EASINGFUNC(type) fixed_t Easing_ ## type (fixed_t t, fixed_t start, fixed_t end, fixed_t param);

EASINGFUNC(InBackParameterized) /* Easing_InBackParameterized */
EASINGFUNC(OutBackParameterized) /* Easing_OutBackParameterized */
EASINGFUNC(InOutBackParameterized) /* Easing_InOutBackParameterized */

#undef EASINGFUNC

#ifdef __cplusplus
} // extern "C"
#endif

#endif
