#ifndef __HIKHOSTMB__H_
#define __HIKHOSTMB__H_
#include "hikhost.h"
#define LEFT_EXTRA_COLLAR 0
#define RIGHT_EXTRA_COLLAR 1
class HIKHostNodeMB
{
public:
FBModel *mNode;
FBAnimationNode* mDestTConn;
FBAnimationNode* mDestRConn;
FBAnimationNode* mDestSConn;
FBProperty* mReachT;
FBProperty* mReachR;
HIKHostNodeMB();
virtual void SetNode(FBModel *pNode, FBConstraint *pConstraint);
virtual void Clear();
virtual bool IsDestinationConn(FBAnimationNode* pConnector);
};
class HIKHostPropertyMB
{
public:
int mDefaultMode;
double mDefaultValue;
FBProperty *mModeP;
FBProperty *mValueP;
int mValueIndex;
double mValueScale;
bool mIsEnum;
HIKHostPropertyMB();
void Init(FBProperty *pModeP, FBProperty *pValueP,int pValueIndex,double pValueScale,bool pIsEnum);
};
void HIKHostPropertiesInit(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost);
void HIKCharacterHostFromMBCharacterHierarchy(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost,FBCharacter* pCharacter,FBConstraint* pConstraint,bool pPlotActorToCtrlRig=false);
void HIKCharacterHostFromMBCharacterGeometry(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost,HIKCharacter *pHIKCharacter,FBCharacter* pCharacter);
void HIKHostPropertiesFromCharacter(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost, FBCharacter* pCharacter);
void HIKControlRigHostFromMBControlRig(HIKControlRigHost<HIKHostNodeMB> &pHIKControlRigHost, FBCharacter* pCharacter);
void HIKControlRigHostFromMBControlRig(HIKControlRigHost<HIKHostNodeMB> &pHIKControlRigHost, FBControlSet* pControlRig,FBConstraint* pConstraint=
NULL);
void HIKCharacterHostFromHIKHostMB(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost, FBModel* pLeftShoulderModel, FBModel* pRightShoulderModel, FBConstraint* pConstraint);
void CharacterizeHIKCharacterHostFromHIKHostMB(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost,HIKCharacter *pHIKCharacter,
void HIKExtraShoulderControlRigHost(HIKControlRigHost<HIKHostNodeMB> &pHIKControlRigHost, FBModel* pLeftShoulderModel, FBModel* pRightShoulderModel, FBConstraint* pConstraint=
NULL);
int GetSolvingStepBasedOnActivePart(int pIndex);
void UndoSetup(FBCharacter* pCharacter);
template <> bool HIKHostNode<HIKHostNodeMB>::Valid();
template <> void HIKHostNode<HIKHostNodeMB>::ReadXForm(double *pXForm,void *pUserData);
template <> void HIKHostNode<HIKHostNodeMB>::WriteXForm(double *pXForm,void *pUserData);
template <> void HIKHostNode<HIKHostNodeMB>::WriteXFormCandidate(double *pXForm,void *pUserData);
template <> double HIKHostNode<HIKHostNodeMB>::ReadReachT(void *pUserData);
template <> double HIKHostNode<HIKHostNodeMB>::ReadReachR(void *pUserData);
template <> void HIKHostNode<HIKHostNodeMB>::ReadIKPivot(double *pIKPivot, void *);
template <> bool HIKHostNode<HIKHostNodeMB>::GetIKSync();
template <> bool HIKHostNode<HIKHostNodeMB>::GetUseLimits();
template <> int HIKHostNode<HIKHostNodeMB>::GetRotationOrder();
template <> void HIKHostNode<HIKHostNodeMB>::GetPreQ(double *pPreQ);
template <> void HIKHostNode<HIKHostNodeMB>::GetPostQ(double *pPostQ);
template <> int HIKHostNode<HIKHostNodeMB>::GetMinXYZ(double *pXYZ);
template <> int HIKHostNode<HIKHostNodeMB>::GetMaxXYZ(double *pXYZ);
template <> int HIKHostProperty<HIKHostPropertyMB>::ReadMode(void *pUserData);
template <> double HIKHostProperty<HIKHostPropertyMB>::ReadValue(void *pUserData);
#endif // __HIKHOSTMB__H_