
///////////////////////////////////////////////////////////////////////////////
//
// File   : Asura_FacialAnimation_System.cpp
// Author : Andy Tate
// Date   : 9-May-2008
//
// Copyright (C) 2008 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

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

#include "Core/Asura.h"

#if defined(ASURA_USE_FACIAL_ANIMATION_SYSTEM)

// This file's header...
#include "FacialAnimation/Asura_FacialAnimation_System.h"

// Asura independent header-files...
#include "Core/Asura_Timers.h"
#include "FacialAnimation/Asura_FacialAnimation_Face.h"
#include "FacialAnimation/Asura_FacialAnimation_FaceAnimation.h"
#include "FacialAnimation/Asura_FacialAnimation_MuscleGroup.h"
#include "FacialAnimation/Asura_FacialAnimation_MuscleGroupAnimation.h"


////////////////////////////////////////////////////////////////////////////////
// Constant declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Static variable declarations...
////////////////////////////////////////////////////////////////////////////////

Asura_FacialAnimation_System::FaceContainer				Asura_FacialAnimation_System::s_xFaceContainer;
Asura_FacialAnimation_System::FaceAnimationContainer	Asura_FacialAnimation_System::s_xFaceAnimationContainer;
Asura_FacialAnimation_System::AnimationHandlerContainer	Asura_FacialAnimation_System::s_xAnimationHandlerContainer;


////////////////////////////////////////////////////////////////////////////////
// Private functions...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Protected functions...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Public functions...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_FacialAnimation_System::Initialise
// Author       : Andy Tate
// Date         : 5-Sep-2008
////////////////////////////////////////////////////////////////////////////////

void Asura_FacialAnimation_System::Initialise(void)
{
}

/// End of function 'Asura_FacialAnimation_System::Initialise'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_FacialAnimation_System::Reset
// Author       : Andy Tate
// Date         : 5-Sep-2008
////////////////////////////////////////////////////////////////////////////////

void Asura_FacialAnimation_System::Reset(void)
{
	s_xFaceContainer.Reset();
	s_xFaceAnimationContainer.Reset();
	s_xAnimationHandlerContainer.Reset();
}

/// End of function 'Asura_FacialAnimation_System::Reset'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_FacialAnimation_System::Shutdown
// Author       : Andy Tate
// Date         : 5-Sep-2008
////////////////////////////////////////////////////////////////////////////////

void Asura_FacialAnimation_System::Shutdown(void)
{
	s_xFaceContainer.Reset();
	s_xFaceAnimationContainer.Reset();
	s_xAnimationHandlerContainer.Reset();
}

/// End of function 'Asura_FacialAnimation_System::Shutdown'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_FacialAnimation_System::Update
// Author       : Andy Tate
// Date         : 5-Sep-2008
////////////////////////////////////////////////////////////////////////////////

void Asura_FacialAnimation_System::Update(void)
{
	const float	fTimeStep	= Asura_Timers::GetGameTimeSlice();

	// Update each animation-handler in-turn...
	for(AnimationHandlerIterator xIterator(s_xAnimationHandlerContainer); !xIterator.Done(); xIterator.Next())
	{
		Asura_FacialAnimation_AnimationHandler**	ppxAnimationHandler	= xIterator.GetCurrent();
		Asura_FacialAnimation_AnimationHandler*		pxAnimationHandler	= (ppxAnimationHandler == NULL) ? NULL : *ppxAnimationHandler;

		if(pxAnimationHandler != NULL)
		{
			pxAnimationHandler->Update(fTimeStep);
		}
	}
}

/// End of function 'Asura_FacialAnimation_System::Update'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_FacialAnimation_System::AddAnimationHandler
// Author       : Andy Tate
// Date         : 27-Aug-2008
////////////////////////////////////////////////////////////////////////////////

bool Asura_FacialAnimation_System::AddAnimationHandler(const Asura_Guid uGuid,
													   Asura_FacialAnimation_AnimationHandler* pxHandler)
{
	Asura_FacialAnimation_AnimationHandler**	ppxHandler	= s_xAnimationHandlerContainer.GetDataByHash(uGuid);

	if(ppxHandler == NULL)
	{
		ppxHandler	= s_xAnimationHandlerContainer.AddNode(uGuid, pxHandler);
		return(ppxHandler != NULL);
	}
	else
	{
		Asura_Assertf(false, ("Already have a facial-animation animation-handler for GUID %d.", uGuid));
		return(false);
	}
}

/// End of function 'Asura_FacialAnimation_System::AddAnimationHandler'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : Asura_FacialAnimation_System::RemoveAnimationHandler
// Author       : Andy Tate
// Date         : 27-Aug-2008
////////////////////////////////////////////////////////////////////////////////

bool Asura_FacialAnimation_System::RemoveAnimationHandler(const Asura_Guid uGuid)
{
	Asura_FacialAnimation_AnimationHandler**	ppxHandler	= s_xAnimationHandlerContainer.GetDataByHash(uGuid);

	if(ppxHandler == NULL)
	{
		Asura_Assertf(false, ("Cannot find the facial-animation animation-handler for GUID %d.", uGuid));
		return(false);
	}
	else
	{
		return(s_xAnimationHandlerContainer.DeleteNodeByHash(uGuid));
	}
}

/// End of function 'Asura_FacialAnimation_System::RemoveAnimationHandler'. ///

#endif	//defined(ASURA_USE_FACIAL_ANIMATION_SYSTEM)


/// End of file. ///
