#ifndef __ORCONSTRAINT_HIKBRIDGE_CONSTRAINT_H__
#define __ORCONSTRAINT_HIKBRIDGE_CONSTRAINT_H__
#include "hikhostmb.h"
#include "orcharactersolver_hik_manipulator.h"
#include "charactersolverdefinition.h"
#define ORCONSTRAINTHIK__CLASS ORCharacterSolver_HIK
class ORCharacterSolver_HIK : public FBCharacterSolver, public MultiState
{
public:
virtual bool FBCreate();
virtual void FBDestroy();
virtual void RemoveAllAnimationNodes();
virtual void SetupAllAnimationNodes();
virtual void FreezeSuggested ();
virtual bool AnimationNodeNotify ( FBAnimationNode* pAnimationNode, FBEvaluateInfo* pEvaluateInfo, FBConstraintInfo* pConstraintInfo );
virtual bool FbxStore ( FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat );
virtual bool FbxRetrieve ( FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat );
virtual double GetCharacterSolverVersion() override { return 4.5; };
HIKEvaluationState* EvaluationStateCreator();
bool mAlreadyConnected;
int SolvingStepFilter;
FBSystem mSystem;
FBApplication mApplication;
HIKCharacter* mHIKCharacter;
HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> mHIKCharacterHost;
HIKCharacter* mHIKCharacterSrc;
HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> mHIKCharacterHostSrc;
HIKControlRigHost<HIKHostNodeMB> mHIKControlRigHost;
HIKCharacter* mHIKActorSrc;
FBActor* mActorSrc;
HIKEffectorSetState* mHIKEffectorSetStatePlot;
HIKCharacterState* mHIKCharacterStateStance;
HIKCharacter* mHIKCharacterDebug;
HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> mHIKCharacterHostDebug;
HIKCharacterState* mHIKCharacterStateDebug;
HIKCharacterState* mHIKCharacterStateOutDebug;
HIKEffectorSetState* mHIKEffectorSetStateDebug;
HIKPropertySetState* mHIKPropertySetStateDebug;
HIKControlRigHostEvaluator<HIKHostNodeMB,HIKHostPropertyMB> mHIKControlRigHostEvaluator;
HIKCharacterHostEvaluator<HIKHostNodeMB,HIKHostPropertyMB> mHIKCharacterHostEvaluator;
void SetupTargetCharacter(FBCharacter* pCharacter);
void SetupInputControlRig(FBControlSet* pControlRig, bool pConstraintRig = false );
void SetupExtraFK(FBCharacter* pCharacter, int pExtraBoneId, FBModelMarker** pExtraMarker);
void SetupAutoProperties(FBCharacter* pCharacter);
FBArrayTemplate<FBAnimationNode*> mAutoPropertyConnArray;
virtual FBCharacterManipulatorCtrlSet* CreateCharacterManipulatorCtrlSet(const char* pName);
FBCharacterManipulatorCtrlSet * mControlSetManipulator;
void SyncPivot(FBControlSet* pControlSet);
virtual int GetExtraFKCount();
virtual const char* GetExtraFKNameAt(int pIndex);
virtual int GetExtraBoneCount();
virtual const char* GetExtraBoneNameAt(int pIndex);
virtual void CharacterPasteState( FBCharacter* pFromCharacter, FBCharacterPose* pPose, FBCharacterPoseOptions& pCharacterPoseOptions );
void DoPasteCharacter(HIKCharacter* pHIKFromCharacter, HIKCharacterState* pFromCharacterState, HIKPropertySetState* pFromPropertySetState, HIKEvaluationState* pCurrentState,
FBCharacterPoseKeyingMode pKeyingMode, FBMatrix* pHipsOffsetGX);
void DoPasteCharacterExtension(FBCharacterPose* pPose, FBCharacterPoseOptions& pCharacterPoseOptions, HIKEvaluationState* pCurrentState);
void DoPasteForBodyPart(HIKEvaluationState* pCurrentState, HIKCharacterState* pPoseState);
void RegisterExtraProperties(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost);
virtual void ResetExtraProperties() override;
private:
static int mInternalPropertiesCount;
static int mSolverPropertiesCount;
void PastePoseToTempHikCharacter( FBCharacter* pFromCharacter, FBCharacterPose* pPose, FBCharacterPoseOptions& pCharacterPoseOptions, HIKEvaluationState* pCurrentState,
HIKCharacter*& pHIKFromCharacter, HIKCharacterState*& pFromCharacterState, HIKPropertySetState*& pFromPropertySetState);
void GetTRSForMatchModel_Body(FBCharacterPoseOptions& pCharacterPoseOptions, HIKCharacter* pHIKFromCharacter, HIKCharacterState* pFromCharacterState, HIKPropertySetState* pFromPropertySetState, HIKEvaluationState* pCurrentState,
FBMatrix* pHipsOffsetGX,
int pHIKNodeId,
int pHIKEffectorId,
FBEffectorId pEffectorId,
int pPivotIndex, FBMatrix* pValue);
void GetTRSForMatchModel_Extension( FBCharacterPose* pPose, FBModel* pMatchModel, FBMatrix& pExtensionTRS );
void GetNodeEffectIds( FBModel* pModelToMatch,
int& pHIKNodeId,
int& pHIKEffectorId,
FBEffectorId& pEffectorId,
FBEffectorSetID& pPivotIndex );
void GetRotationOffset( const FBMatrix& pMatchModel_CurrentGRM, const FBMatrix& pMatchMode_PoseTRSM, const bool pGravity, FBMatrix& pHipsOffsetGX );
void GetTranslationOffset(
const FBVector3d& pMatchModel_CurrentGT,
const FBMatrix& pMatchMode_PoseTRSM,
bool pMatchX,
bool pMatchY,
bool pMatchZ,
bool pGravity, FBMatrix& pHipsOffsetGX );
void ResetPropertiesToDefault();
void RemoveAnimations();
};
#endif