#pragma once

#include "gamefuncs.h"

enum EInterpolationType
{
	Interp_Invalid = -1,
	Interp_Sect_Floorz = 0,
	Interp_Sect_Ceilingz,
	Interp_Sect_Floorheinum,
	Interp_Sect_Ceilingheinum,

	Interp_Wall_X,
	Interp_Wall_Y,

	Interp_Sprite_Z,

	Interp_Pan_First,
	// order of the following 4 flags must match the corresponding sector flags.
	Interp_Sect_FloorPanX = Interp_Pan_First,
	Interp_Sect_FloorPanY,
	Interp_Sect_CeilingPanX,
	Interp_Sect_CeilingPanY,
	Interp_Wall_PanX,
	Interp_Wall_PanY,
};

void StartInterpolation(int index, int type);
void StopInterpolation(int index, int type);
void StartInterpolation(DCoreActor* actor, int type);
void StopInterpolation(DCoreActor* actor, int type);
void UpdateInterpolations();
void ClearInterpolations();
void ClearMovementInterpolations();
void DoInterpolations(double interpfrac);
void RestoreInterpolations();
void SerializeInterpolations(FSerializer& arc);
void clearsectinterpolate(sectortype* sectnum);
void setsectinterpolate(sectortype* sectnum);

inline void StartInterpolation(walltype* wall, int type)
{
	assert(type == Interp_Wall_X || type == Interp_Wall_Y || type == Interp_Wall_PanX || type == Interp_Wall_PanY);
	return StartInterpolation(wallnum(wall), type);
}

inline void StartInterpolation(sectortype* sect, int type)
{
	assert(type == Interp_Sect_Floorz || type == Interp_Sect_Ceilingz || type == Interp_Sect_Floorheinum || type == Interp_Sect_Ceilingheinum ||
		type == Interp_Sect_FloorPanX || type == Interp_Sect_FloorPanY || type == Interp_Sect_CeilingPanX || type == Interp_Sect_CeilingPanY);
	return StartInterpolation(sectnum(sect), type);
}

inline void StopInterpolation(walltype* wall, int type)
{
	assert(type == Interp_Wall_X || type == Interp_Wall_Y || type == Interp_Wall_PanX || type == Interp_Wall_PanY);
	return StopInterpolation(wallnum(wall), type);
}

inline void StopInterpolation(sectortype* sect, int type)
{
	assert(type == Interp_Sect_Floorz || type == Interp_Sect_Ceilingz || type == Interp_Sect_Floorheinum || type == Interp_Sect_Ceilingheinum ||
		type == Interp_Sect_FloorPanX || type == Interp_Sect_FloorPanY || type == Interp_Sect_CeilingPanX || type == Interp_Sect_CeilingPanY);
	return StopInterpolation(sectnum(sect), type);
}