
///////////////////////////////////////////////////////////////////////////////
//
// File   : AVP_Predator_Description.h
// Author : Andy Tate
// Date   : 12-Feb-2007
//
// Copyright (C) 2007 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

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

#ifndef __AVP_PREDATOR_DESCRIPTION_H__
#define __AVP_PREDATOR_DESCRIPTION_H__

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

#include "Core/Asura_Hash.h"

#if defined(ASURA_TOOLS)
#include "Misc/list_tem.hpp"
#endif	// defined(ASURA_TOOLS)

#include "Entity/PhysicalObject/Actor/AVP_ClientEntity_Actor.h"
#include "Physics/AVP_Collision_Descriptor.h"

static const u_int uAVP_PREDATOR_NUM_IK_BONES_PER_LIMB = 3;

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


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

////////////////////////////////////////////////////////////////////////////////
// Class        : AVP_Predator_Description
// Author       : Andy Tate
// Date         : 12-Feb-2007
//
// Description  : Class used to contain the appropriate descriptions for the
//				  Predator skins.
////////////////////////////////////////////////////////////////////////////////

class AVP_Predator_Description
{
public:
	// Public enumerated types...
	enum MarkerPointType
	{
		BLADE_RIGHT_MARKER_POINT_HASH,
		BLADE_LEFT_MARKER_POINT_HASH,
		RIGHT_HAND_MARKER_POINT_HASH,
		PLASMA_MARKER_POINT_HASH,
		LASER_MARKER_POINT_HASH,
		EYES_MARKER_POINT_HASH,
		TARGET_MARKER_POINT_HASH,

		NUM_MARKER_POINT_IDS
	};

	enum ThirdPersonBoneID
	{
		TP_BIP01,							// 0
		TP_BIP01_PELVIS,					//_1_
		TP_BIP01_SPINE,						//_2_
		TP_BIP01_SPINE1,					//_3_
		TP_BIP01_SPINE2,					//_4_
		TP_BIP01_BIP01_PLASMASHOULDER,		//_5_
		TP_BIP01_BIP01_PLASMA_GUN_SUPPORT,	//_6_
		TP_BIP01_PLASMA_GUN,				//_7_
		TP_BIP01_NECK,						//_8_
		TP_BIP01_HEAD,						//_9_
		TP_BIP01_CHEEK_LEFT,				//_10
		TP_BIP01_CHEEK_RIGHT,				//_11
		TP_BIP01_EYEBROW_LEFT,				//_12
		TP_BIP01_EYEBROW_RIGHT,				//_13
		TP_BIP01_HAIR_BACK,					//_14
		TP_BIP01_HAIR_BACK02,				//_15
		TP_BIP01_HAIR_FRONT_LEFT,			//_16
		TP_BIP01_HAIR_FRONT_LEFT02,			//_17
		TP_BIP01_HAIR_FRONT_RIGHT,			//_18
		TP_BIP01_HAIR_FRONT_RIGHT02,		//_19
		TP_BIP01_JAW,						//_20
		TP_BIP01_MOUTH_BOTTOM_LEFT,			//_21
		TP_BIP01_MOUTH_BOTTOM_LEFT02,		//_22
		TP_BIP01_MOUTH_BOTTOM_RIGHT,		//_23
		TP_BIP01_MOUTH_BOTTOM_RIGHT02,		//_24
		TP_BIP01_MOUTH_TOP_LEFT,			//_25
		TP_BIP01_MOUTH_TOP_LEFT02,			//_26
		TP_BIP01_MOUTH_TOP_RIGHT01,			//_27
		TP_BIP01_MOUTH_TOP_RIGHT02,			//_28
		TP_EYE_LEFT,						//_29
		TP_EYE_RIGHT,						//_30
		TP_BIP01_L_CLAVICLE,				//_31
		TP_BIP01_L_UPPERARM,				//_32
		TP_BIP01_L_FOREARM,					//_33
		TP_ARM_PANEL,						//_34
		TP_BIP01_CLAW_LEFT01,				//_35
		TP_BIP01_CLAW_LEFT02,				//_36
		TP_BIP01_CLAW_LEFT03,				//_37
		TP_BIP01_L_HAND,					//_38
		TP_BIP01_L_FINGER0,					//_39
		TP_BIP01_L_FINGER01,				//_40
		TP_BIP01_L_FINGER1,					//_41
		TP_BIP01_L_FINGER11,				//_42
		TP_BIP01_L_FINGER2,					//_43
		TP_BIP01_L_FINGER21,				//_44
		TP_BIP01_L_FINGER3,					//_45
		TP_BIP01_L_FINGER31,				//_46
		TP_BIP01_L_FINGER4,					//_47
		TP_BIP01_L_FINGER41,				//_48
		TP_LEFT_LOWERFOREARM_TWIST,			//_49
		TP_LEFT_UPPERFOREARM_TWIST,			//_50
		TP_BIP01_R_CLAVICLE,				//_51
		TP_BIP01_R_UPPERARM,				//_52
		TP_BIP01_R_FOREARM,					//_53
		TP_BIP01_CLAW_RIGHT01,				//_54
		TP_BIP01_CLAW_RIGHT02,				//_55
		TP_BIP01_CLAW_RIGHT03,				//_56
		TP_BIP01_R_HAND,					//_57
		TP_BIP01_R_FINGER0,					//_58
		TP_BIP01_R_FINGER01,				//_59
		TP_BIP01_R_FINGER1,					//_60
		TP_BIP01_R_FINGER11,				//_61
		TP_BIP01_R_FINGER2,					//_62
		TP_BIP01_R_FINGER21,				//_63
		TP_BIP01_R_FINGER3,					//_64
		TP_BIP01_R_FINGER31,				//_65
		TP_BIP01_R_FINGER4,					//_66
		TP_BIP01_R_FINGER41,				//_67
		TP_RIGHT_LOWERFOREARM_TWIST,		//_68
		TP_RIGHT_UPPERFOREARM_TWIST,		//_69
		TP_SHOULDER_PINCHER_RIGHT,			//_70
		TP_BIP01_L_THIGH,					//_71
		TP_BIP01_L_CALF,					//_72
		TP_BIP01_L_FOOT,					//_73
		TP_BIP01_L_TOE0,					//_74
		TP_BIP01_R_THIGH,					//_75
		TP_BIP01_R_CALF,					//_76
		TP_BIP01_R_FOOT,					//_77
		TP_BIP01_R_TOE0,					//_78
		TP_BIP01_CLOTH,						//_79
		TP_BIP01_CLOTH02,					//_80
		TP_BIP01_CLOTH_BACK,				// 81

		MAX_THIRD_PERSON_BONES_IDS			   
	};							

	enum FirstPersonBoneID
	{
		FP_BIP01,
		FP_BIP01_PELVIS,
		FP_BIP01_SPINE,
		FP_BIP01_SPINE1,
		FP_BIP01_SPINE2,
		FP_BIP01_NECK,
		FP_BIP01_L_CLAVICLE,
		FP_BIP01_L_UPPERARM,
		FP_BIP01_L_FOREARM,
		FP_BIP01_L_HAND,
		FP_BIP01_L_FINGER0,
		FP_BIP01_L_FINGER01,
		FP_BIP01_L_FINGER02,
		FP_BIP01_L_FINGER1,
		FP_BIP01_L_FINGER11,
		FP_BIP01_L_FINGER12,
		FP_BIP01_L_FINGER2,
		FP_BIP01_L_FINGER21,
		FP_BIP01_L_FINGER22,
		FP_BIP01_L_FINGER3,
		FP_BIP01_L_FINGER31,
		FP_BIP01_L_FINGER32,
		FP_BIP01_L_FINGER4,
		FP_BIP01_L_FINGER41,
		FP_BIP01_L_FINGER42,
		FP_LEFT_ARM_TWISTER,
		FP_ARM_PANEL,
		FP_LEFTCLAW1,
		FP_LEFTCLAW2,
		FP_LEFTCLAW3,
		FP_BIP01_R_CLAVICLE,
		FP_BIP01_R_UPPERARM,
		FP_BIP01_R_FOREARM,
		FP_BIP01_R_HAND,
		FP_BIP01_R_FINGER0,
		FP_BIP01_R_FINGER01,
		FP_BIP01_R_FINGER02,
		FP_BIP01_R_FINGER1,
		FP_BIP01_R_FINGER11,
		FP_BIP01_R_FINGER12,
		FP_BIP01_R_FINGER2,
		FP_BIP01_R_FINGER21,
		FP_BIP01_R_FINGER22,
		FP_BIP01_R_FINGER3,
		FP_BIP01_R_FINGER31,
		FP_BIP01_R_FINGER32,
		FP_BIP01_R_FINGER4,
		FP_BIP01_R_FINGER41,
		FP_BIP01_R_FINGER42,
		FP_RIGHT_ARM_TWISTER,
		FP_RIGHTCLAW1,
		FP_RIGHTCLAW2,
		FP_RIGHTCLAW3,
		FP_PLASMA_GUN,
		FP_BIP01_L_THIGH,
		FP_BIP01_L_CALF,
		FP_BIP01_L_FOOT,
		FP_BIP01_L_TOE0,
		FP_BIP01_R_THIGH,
		FP_BIP01_R_CALF,
		FP_BIP01_R_FOOT,
		FP_BIP01_R_TOE0,
		FP_BIP01_XTRA01,
		FP_BIP01_XTRA0102,
		FP_BIP01_XTRA0103,
		FP_CAMERA_BONE,

		MAX_FIRST_PERSON_BONES_IDS
	};

	// Public functions...
#if defined(ASURA_TOOLS)
	static void	AddFilesToExport(const bool bFirstPerson, const Asura_Hash_ID uBlueprintHash, List<Asura_String>& xNameList);
#endif	// defined(ASURA_TOOLS)

	// Accessor functions...
	static Asura_Hash_ID	GetMarkerPointHashID(const MarkerPointType eID)	{ return(s_auMarkerPointHashIDs[eID]); }
	static int				GetFootBoneID( u_int uFootIndex, bool bFirstPerson ) { Asura_Assert( uFootIndex < AVP_ClientEntity_Actor::MAX_NUM_FEET, "Bad foot index" ); return bFirstPerson ? s_aiFirstPersonFootBoneID[ uFootIndex ] : s_aiThirdPersonFootBoneID[ uFootIndex ]; }

	static const int* 		GetFirstPersonLeftLegChainBonesArray(void)	{ return(s_aiFirstPersonLeftLegChainBonesArray); }
	static const int* 		GetFirstPersonRightLegChainBonesArray(void)	{ return(s_aiFirstPersonRightLegChainBonesArray); }

	static const int* 		GetThirdPersonLeftLegChainBonesArray(void)	{ return(s_aiThirdPersonLeftLegChainBonesArray); }
	static const int* 		GetThirdPersonRightLegChainBonesArray(void)	{ return(s_aiThirdPersonRightLegChainBonesArray); }

	static u_int			GetElementFromBoneID(int iBoneID);
	static int				GetAnyBoneIDFromElement(u_int uElement); // Since bones->elements is a many->one mapping, this function will return one of the bones associated with the given element, but not necessarily the only one.

protected:
	// Protected variables...
	static const Asura_Hash_ID	s_auMarkerPointHashIDs[NUM_MARKER_POINT_IDS];
	static const int			s_aiFirstPersonFootBoneID[ AVP_ClientEntity_Actor::MAX_NUM_FEET ];
	static const int			s_aiThirdPersonFootBoneID[ AVP_ClientEntity_Actor::MAX_NUM_FEET ];

	static const int 			s_aiFirstPersonLeftLegChainBonesArray[ uAVP_PREDATOR_NUM_IK_BONES_PER_LIMB + 1 ];
	static const int 			s_aiFirstPersonRightLegChainBonesArray[ uAVP_PREDATOR_NUM_IK_BONES_PER_LIMB + 1 ];

	static const int 			s_aiThirdPersonLeftLegChainBonesArray[ uAVP_PREDATOR_NUM_IK_BONES_PER_LIMB + 1 ];
	static const int 			s_aiThirdPersonRightLegChainBonesArray[ uAVP_PREDATOR_NUM_IK_BONES_PER_LIMB + 1 ];

	// Protected functions...


private:
	// Private functions...
	AVP_Predator_Description(void);
	AVP_Predator_Description(const AVP_Predator_Description& xOther);
	~AVP_Predator_Description();

	AVP_Predator_Description&	operator=(const AVP_Predator_Description& xOther);

};   // End of class 'AVP_Predator_Description'.


#endif   // ifndef __AVP_PREDATOR_DESCRIPTION_H__


/// End of file. ///
