//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

#include "cbase.h"

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"

#if 0

class C_AI_BaseHumanoid : public C_AI_BaseNPC
{
public:
	DECLARE_CLASS( C_AI_BaseHumanoid, C_AI_BaseNPC );
	DECLARE_CLIENTCLASS();

	C_AI_BaseHumanoid();

	// model specific
	virtual bool	Interpolate( float currentTime );
	virtual	void	StandardBlendingRules( Vector pos[], Quaternion q[], float currentTime, int boneMask );

	float				m_recanimtime[3];
	AnimationLayer_t	m_Layer[4][3];
};



C_AI_BaseHumanoid::C_AI_BaseHumanoid()
{
	memset(m_recanimtime, 0, sizeof(m_recanimtime));
	memset(m_Layer, 0, sizeof(m_Layer));
}


BEGIN_RECV_TABLE_NOBASE(AnimationLayer_t, DT_Animationlayer)
	RecvPropInt(RECVINFO_NAME(nSequence,sequence)),
	RecvPropFloat(RECVINFO_NAME(flCycle,cycle)),
	RecvPropFloat(RECVINFO_NAME(flPlaybackrate,playbackrate)),
	RecvPropFloat(RECVINFO_NAME(flWeight,weight))
END_RECV_TABLE()



IMPLEMENT_CLIENTCLASS_DT(C_AI_BaseHumanoid, DT_BaseHumanoid, CAI_BaseHumanoid)
	/*
	RecvPropDataTable(RECVINFO_DTNAME(m_Layer[0][2],m_Layer0),0, &REFERENCE_RECV_TABLE(DT_Animationlayer)),
	RecvPropDataTable(RECVINFO_DTNAME(m_Layer[1][2],m_Layer1),0, &REFERENCE_RECV_TABLE(DT_Animationlayer)),
	RecvPropDataTable(RECVINFO_DTNAME(m_Layer[2][2],m_Layer2),0, &REFERENCE_RECV_TABLE(DT_Animationlayer)),
	RecvPropDataTable(RECVINFO_DTNAME(m_Layer[3][2],m_Layer3),0, &REFERENCE_RECV_TABLE(DT_Animationlayer)),
	*/
	RecvPropInt(RECVINFO_NAME(m_Layer[0][2].nSequence,sequence0)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[0][2].flCycle,cycle0)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[0][2].flPlaybackrate,playbackrate0)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[0][2].flWeight,weight0)),
	RecvPropInt(RECVINFO_NAME(m_Layer[1][2].nSequence,sequence1)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[1][2].flCycle,cycle1)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[1][2].flPlaybackrate,playbackrate1)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[1][2].flWeight,weight1)),
	RecvPropInt(RECVINFO_NAME(m_Layer[2][2].nSequence,sequence2)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[2][2].flCycle,cycle2)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[2][2].flPlaybackrate,playbackrate2)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[2][2].flWeight,weight2)),
	RecvPropInt(RECVINFO_NAME(m_Layer[3][2].nSequence,sequence3)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[3][2].flCycle,cycle3)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[3][2].flPlaybackrate,playbackrate3)),
	RecvPropFloat(RECVINFO_NAME(m_Layer[3][2].flWeight,weight3))
END_RECV_TABLE()

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void C_AI_BaseHumanoid::StandardBlendingRules( Vector pos[], Quaternion q[], float currentTime, int boneMask )
{
	VPROF( "C_AI_BaseHumanoid::StandardBlendingRules" );

	BaseClass::StandardBlendingRules( pos, q, currentTime, boneMask );

	studiohdr_t *hdr = InitModel();
	if ( !hdr )
	{
		return;
	}

#if 0
	float poseparam[MAXSTUDIOPOSEPARAM];

	if ( GetSequence() >= hdr->numseq ) 
	{
		SetSequence( 0 );
	}

	// interpolate pose parameters
	for (int i = 0; i < hdr->numposeparameters; i++)
	{
		poseparam[ i ] = m_flPoseParameter[i];
	}

	// build root animation
	float fCycle = GetCycle();
	CalcPose( hdr, NULL, pos, q, GetSequence(), fCycle, poseparam );

	// debugoverlay->AddTextOverlay( GetAbsOrigin() + Vector( 0, 0, 64 ), 0, 0, "%30s %6.2f : %6.2f", hdr->pSeqdesc( GetSequence() )->pszLabel( ), fCycle, 1.0 );

	MaintainSequenceTransitions( fCycle, poseparam, pos, q, boneMask );

#if 1
	for (i = 0; i < 4; i++)
	{
		if (m_Layer[i][2].nSequence != m_Layer[i][1].nSequence)
		{
			if (m_Layer[i][2].flWeight > 0.5) m_Layer[i][1].flWeight = 1.0; else m_Layer[i][1].flWeight = 0;
		}
	}
#endif

#if 1
	for (i = 0; i < 4; i++)
	{
		Vector		pos2[MAXSTUDIOBONES];
		Quaternion	q2[MAXSTUDIOBONES];
		float fWeight = m_Layer[i][1].flWeight * (1 - dadt) + m_Layer[i][2].flWeight * dadt;

		/*
		debugoverlay->AddTextOverlay( GetAbsOrigin() + Vector( 0, 0, 64 ), -i - 1, 0, 
			"%2d %6.2f %6.2f : %2d %6.2f %6.2f : %2d %6.2f %6.2f", 
				m_Layer[i][0].nSequence, m_Layer[i][0].flCycle, m_Layer[i][0].flWeight,
				m_Layer[i][1].nSequence, m_Layer[i][1].flCycle, m_Layer[i][1].flWeight,
				m_Layer[i][2].nSequence, m_Layer[i][2].flCycle, m_Layer[i][2].flWeight );
		*/

		if (fWeight > 0)
		{
			mstudioseqdesc_t *pseqdesc = hdr->pSeqdesc( m_Layer[i][2].nSequence );

			float fCycle =  m_Layer[i][2].flCycle;

			// UNDONE: Do IK here.
			CalcPose( hdr, NULL, pos2, q2, m_Layer[i][2].nSequence, fCycle, poseparam );

			if (fWeight > 1)
				fWeight = 1;
			SlerpBones( hdr, q, pos, pseqdesc, q2, pos2, fWeight );

			engine->Con_NPrintf( 10 + i, "%30s %6.2f : %6.2f", pseqdesc->pszLabel(), fCycle, fWeight );
		}
		else
		{
			engine->Con_NPrintf( 10 + i, "%30s %6.2f : %6.2f", "            ", 0, 0 );
		}

	}
#endif

	CIKContext auto_ik;
	auto_ik.Init( hdr, GetRenderAngles(), GetRenderOrigin(), gpGlobals->curtime );
	CalcAutoplaySequences( hdr, &auto_ik, pos, q, poseparam, boneMask, currentTime );

	float controllers[MAXSTUDIOBONECTRLS];
	GetBoneControllers(controllers);
	CalcBoneAdj( hdr, pos, q, controllers );
#endif
}


#endif
