/* -----------------------------------------------------------------------------
	GSFramework
	Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */


#ifndef	__NAUTOMATIONSOURCE__
#define	__NAUTOMATIONSOURCE__


		#include "geometry/curve.h"
		#include "math/quaternion.h"
		#include "math/vector.h"
		#include "memory/nshared_ptr.h"


namespace GS {
	namespace Automation {
		class Player;

/*!
	@short	Base automation source.
	@author	Emmanuel Julien (ejulien@gsworks.fr)
*/
class	Source : public SharedObject
{
public:

enum	Type
{
		TypeMotion		=	0
};

protected:

		Type		type;

		Vector4		p_pos,
					p_euler;
		Quaternion	p_quat;

		float		weight,
					weight_target,
					weight_step;

		bool		dispose;

public:

		NPLACEMENT_NEW(AnimationSource)

		Time		time;
		float		time_scale;

		bool		relative;

		Type		GetType() const { return type; }

virtual	void		Update(const Time &dt_time);

virtual	void		Evaluate(Player &target) = 0;
virtual	bool		EvaluateRotation(Quaternion &q) = 0;

virtual	void		SetLoopMode(Curve::LoopMode = Curve::Reset) {}
virtual	void		SetLoop(const Time &start = Time::Inf, const Time &end = Time::Inf) {}

		/// Is animation source done.
virtual	bool		IsDone() const = 0;

		/// Mark the source as disposable.
		void		Dispose(float blend = Units::Sec(0.1));
		/// Can the source be disposed of.
		bool		CanDispose() const;

		void		SetWeight(float _weight = 1, float _blend = Units::Sec(1));
		float		GetWeight() const { return weight; }

		explicit Source();
		~Source();
};

	} // Automation
} // GS


#endif	// __NAUTOMATIONSOURCE__
