
///////////////////////////////////////////////////////////////////////////////
//
// File   : AVP_SurfaceReorientationNormalInterpolator_Slerp.h
// Author : Andy Tate
// Date   : 11-Mar-2008
//
// Copyright (C) 2008 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
	#pragma once
#endif   // ifdef ASURA_USE_PRAGMA_ONCE

#ifndef __AVP_SURFACEREORIENTATIONNORMALINTERPOLATOR_SLERP_H__
#define __AVP_SURFACEREORIENTATIONNORMALINTERPOLATOR_SLERP_H__

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////

#include "Core/Asura_Maths.h"

#include "Physics/AVP_SurfaceReorientationNormalInterpolator.h"


////////////////////////////////////////////////////////////////////////////////
// Forward class declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Class declaration...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Class        : AVP_SurfaceReorientationNormalInterpolator_Slerp
// Author       : Andy Tate
// Date         : 7-Feb-2008
//
// Description  : Class used to interpolate to a desired normal (using a 
//				  slerp) during surface-reorientation.
////////////////////////////////////////////////////////////////////////////////

class AVP_SurfaceReorientationNormalInterpolator_Slerp : public AVP_SurfaceReorientationNormalInterpolator
{
public:
	// Public functions...
	AVP_SurfaceReorientationNormalInterpolator_Slerp(void);
	//virtual ~AVP_SurfaceReorientationNormalInterpolator_Slerp();

	// Overridden functions...
	virtual void	Reset(Asura_AVector3_InParam xNormal);

	virtual	void	Update(const float fTimeStep, Asura_AVector3_InParam xDesiredNormal, Asura_AVector3_InOutParam xCurrentNormal);
	virtual	void	Update(const float fTimeStep, const AVP_CalculateSurfaceReorientationNormal& xNormalCalculation, Asura_AVector3_InOutParam xCurrentNormal);


protected:
	// Protected variables...
	Asura_AVector3	m_xInitialNormal;			// The normal we're interpolating from.
	Asura_AVector3	m_xTargetNormal;			// The normal we're interpolating to.
	Asura_Quat		m_xRotationBetweenNormals;	// The rotation between the initial and target normals.
	float			m_fTimeTaken;				// The time taken since the last normal was set.
	float			m_fDurationToTarget;		// The number of seconds until we reach our target.

	// Protected functions...


private:
	// Private typedefs...
	typedef AVP_SurfaceReorientationNormalInterpolator PARENT;

	// Private variables...

	// Private functions...
	AVP_SurfaceReorientationNormalInterpolator_Slerp(const AVP_SurfaceReorientationNormalInterpolator_Slerp& xOther);

	AVP_SurfaceReorientationNormalInterpolator_Slerp&	operator=(const AVP_SurfaceReorientationNormalInterpolator_Slerp& xOther);

};   // End of class 'AVP_SurfaceReorientationNormalInterpolator_Slerp'.

#endif   // ifndef __AVP_SURFACEREORIENTATIONNORMALINTERPOLATOR_SLERP_H__


/// End of file. ///
