#ifndef __HIKHOSTMB__H_
#define __HIKHOSTMB__H_
#include "hikhost.h"
#define LEFT_EXTRA_COLLAR 0
#define RIGHT_EXTRA_COLLAR 1
class AnimationNode_Id
{
int mId;
public:
AnimationNode_Id();
AnimationNode_Id(const AnimationNode_Id &pSource);
AnimationNode_Id(const int pSource);
bool IsValid() const;
bool IsValidEffectorId() const;
bool IsValidNodeId() const;
bool IsValidType() const;
int GetType() const;
private:
};
inline AnimationNode_Id::operator
int()
const
{
return mId;
}
{
if(IsValid())
{
return AnimationNode_Id((pConnectorType << 21) | mId);
}
else
{
return AnimationNode_Id();
}
}
inline bool AnimationNode_Id::IsValid() const
{
return ((mId & 0x1) != 0);
}
inline bool AnimationNode_Id::IsValidEffectorId() const
{
const int lId = GetEffectorId();
}
inline bool AnimationNode_Id::IsValidNodeId() const
{
const int lId = GetNodeId();
}
inline bool AnimationNode_Id::IsValidType() const
{
const int lType = GetType();
}
{
if(IsValid())
{
}
}
inline HIKNodeId AnimationNode_Id::GetNodeId()
const
{
if(IsValid())
{
return (
HIKNodeId)(((mId >> 1) & 0x3FF) - 1);
}
}
inline int AnimationNode_Id::GetType() const
{
if(IsValid())
{
return (mId >> 21) & 0xF ;
}
return -1;
}
{
switch (pNodeId)
{
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
{
} break;
default:
{
} break;
}
return lChildEffector;
}
class HIKHostNodeMB
{
public:
FBModel *mNode;
FBAnimationNode* mDestTConn;
FBAnimationNode* mDestRConn;
FBAnimationNode* mDestSConn;
FBProperty* mReachT;
FBProperty* mReachR;
HIKHostNodeMB();
virtual void SetNode(FBModel *pNode, FBConstraint *pConstraint, AnimationNode_Id pConnectorId=0);
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);
};
template <> bool HIKHostNode<HIKHostNodeMB>::Valid();
template <> void HIKHostNode<HIKHostNodeMB>::ReadXForm(double *pXForm, FBEvaluateInfo* pEvalInfo);
template <> void HIKHostNode<HIKHostNodeMB>::WriteXForm(double *pXForm, FBEvaluateInfo* pEvalInfo);
template <> void HIKHostNode<HIKHostNodeMB>::WriteXFormCandidate(double *pXForm, FBEvaluateInfo* pEvalInfo);
template <>
void HIKHostNode<HIKHostNodeMB>::WriteTQSIfNotRecursive(
FBTVector &pT,
FBQuaternion &pQ,
FBVector4d &pS, FBEvaluateInfo* pEvalInfo,
int &pRecursivityInfo);
template <>
void HIKHostNode<HIKHostNodeMB>::WriteCandidateTQS(
const FBTVector &pT,
const FBQuaternion &pQ,
const FBVector4d &pS, FBEvaluateInfo* pEvalInfo);
template <> int HIKHostNode<HIKHostNodeMB>::IsEvaluationRecursiveTQS(FBEvaluateInfo* pEvalInfo);
template <> double HIKHostNode<HIKHostNodeMB>::ReadReachT( FBEvaluateInfo* pEvalInfo );
template <> double HIKHostNode<HIKHostNodeMB>::ReadReachR( FBEvaluateInfo* pEvalInfo );
template <> void HIKHostNode<HIKHostNodeMB>::ReadIKPivot(double *pIKPivot, FBEvaluateInfo* pEvalInfo);
template <> bool HIKHostNode<HIKHostNodeMB>::GetIKSync();
template <> bool HIKHostNode<HIKHostNodeMB>::GetUseRotationLimits();
template <> bool HIKHostNode<HIKHostNodeMB>::GetUseTranslationLimits();
template <> int HIKHostNode<HIKHostNodeMB>::GetRotationOrder();
template <> void HIKHostNode<HIKHostNodeMB>::GetPreQ(double *pPreQ);
template <> void HIKHostNode<HIKHostNodeMB>::GetPostQ(double *pPostQ);
template <> int HIKHostNode<HIKHostNodeMB>::GetRotationMinXYZ(double *pXYZ);
template <> int HIKHostNode<HIKHostNodeMB>::GetRotationMaxXYZ(double *pXYZ);
template <> int HIKHostProperty<HIKHostPropertyMB>::ReadMode( FBEvaluateInfo* pEvalInfo );
template <> double HIKHostProperty<HIKHostPropertyMB>::ReadValue( FBEvaluateInfo* pEvalInfo );
HIKNodeId ExtraIndexToHIKNodeId(
int pExtraIndex);
int HIKNodeIdToExtraIndex(
HIKNodeId pNodeId);
bool GetNodeIdOrEffectIdFromModel( FBCharacterSolver* pSolver, FBModel* pModel,
int& pHIKNodeId,
int& pHIKEffectorId,
FBEffectorId& pEffectorId,
FBEffectorSetID& pPivotIndex );
int GetSolvingStepBasedOnActivePart(int pIndex);
void HIKHostPropertiesInit(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost);
void HIKHostPropertiesFromCharacter(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost, FBCharacter* pCharacter);
void HIKCharacterHostFromFBCharacter(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost, FBCharacter* pCharacter, bool pFloorContacts=false);
void HIKCharacterHostFromFBCharacterSolver(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost, FBCharacterSolver* pCharacterSolver, FBConstraint* pConstraint, bool pFloorContacts=false);
void HIKControlRigHostFromFBCharacterSolver(HIKControlRigHost<HIKHostNodeMB> &pHIKControlRigHost, FBCharacterSolver* pCharacterSolver, FBControlSet* pControlSet, FBConstraint* pConstraint);
void HIKCharacterHostFromFBCharacterPose(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost, FBCharacter* pPoseCharacter, FBCharacterPose* pPose);
void HIKCharacterFromFBCharacter(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost,
HIKCharacter*& pHIKCharacter,FBCharacter* pCharacter);
void HIKCharacterFromFBCharacterSolver(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost,
HIKCharacter*& pHIKCharacter, FBCharacterSolver* pCharacterSolver);
void HIKCharacterFromFBActor(
HIKCharacter*& pHIKActorCharacter, FBActor* pActor);
void HIKCharacterFromFBCharacterPose(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost,
HIKCharacter*& pHIKCharacter,FBCharacter* pPoseCharacter, FBCharacterPose* pPose);
void UndoSetup(FBCharacter* pCharacter);
void ResetControRigModelTransformation(
HIKCharacter *pHIKCharacter, HIKEvaluationState* pStanceState,
HIKNodeId pNodeId, FBModel* pModel );
inline void CopyNormalizedState(KHIKNodeState pDstDataSet[
LastNodeId], KHIKNodeState pSrcDataSet[LastNodeId],
HIKNodeId pNodeId)
{
pDstDataSet[pNodeId].mTfv[0] = pSrcDataSet[pNodeId].mTfv[0];
pDstDataSet[pNodeId].mTfv[1] = pSrcDataSet[pNodeId].mTfv[1];
pDstDataSet[pNodeId].mTfv[2] = pSrcDataSet[pNodeId].mTfv[2];
pDstDataSet[pNodeId].mTfv[3] = pSrcDataSet[pNodeId].mTfv[3];
pDstDataSet[pNodeId].mQfv[0] = pSrcDataSet[pNodeId].mQfv[0];
pDstDataSet[pNodeId].mQfv[1] = pSrcDataSet[pNodeId].mQfv[1];
pDstDataSet[pNodeId].mQfv[2] = pSrcDataSet[pNodeId].mQfv[2];
pDstDataSet[pNodeId].mQfv[3] = pSrcDataSet[pNodeId].mQfv[3];
pDstDataSet[pNodeId].mSfv[0] = pSrcDataSet[pNodeId].mSfv[0];
pDstDataSet[pNodeId].mSfv[1] = pSrcDataSet[pNodeId].mSfv[1];
pDstDataSet[pNodeId].mSfv[2] = pSrcDataSet[pNodeId].mSfv[2];
pDstDataSet[pNodeId].mSfv[3] = pSrcDataSet[pNodeId].mSfv[3];
}
inline void HIKFillCharacterDescription(
HIKCharacter* pHIKCharacter,
int* pNodeIdDesc)
{
for(
int lNodeCounter = 0 ; lNodeCounter <
LastNodeId ; lNodeCounter++)
{
{
pNodeIdDesc[lNodeCounter] = lNodeCounter;
}
else
{
}
}
}
{
double lT[4];
double lQ[4];
double lS[4];
{
}
}
{
double lT[4];
double lQ[4];
double lS[4];
{
}
{
}
}
#endif // __HIKHOSTMB__H_