#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
#define ORCONSTRAINTHIK__CLASSNAME "ORCharacterSolver_HIK"
class ORCharacterSolver_HIK : public FBCharacterSolver, public MultiState
{
public:
virtual bool FBCreate() override;
virtual void FBDestroy() override;
virtual void RemoveAllAnimationNodes() override;
virtual void SetupAllAnimationNodes() override;
virtual void FreezeSuggested() override;
virtual bool AnimationNodeNotify ( FBAnimationNode* pAnimationNode, FBEvaluateInfo* pEvaluateInfo, FBConstraintInfo* pConstraintInfo ) override;
void ControlRigInputEvaluateAndWrite( FBEvaluateInfo* pEvaluateInfo, HIKEvaluationState* pState, const bool pRigAlign, const bool pDoubleSolve, const bool pWriteRig=true, const int pDisableSolvingStep=0 );
static void BackgroundEvaluateInfoNotification(const FBAnimationNode* pDst, const FBAnimationNode* pSrc, void* pCustomData);
void ReadDoubleSolve( FBEvaluateInfo* pEvalInfo, HIKEvaluationState* pState );
virtual bool FbxStore ( FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat )
override;
virtual bool FbxRetrieve ( FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat )
override;
virtual double GetCharacterSolverVersion() override { return 2014; };
HIKEvaluationState* EvaluationStateCreator();
FBPropertyString HIKLibraryVersion;
#ifdef _DEBUG
FBPropertyAction ActionSaveHIKCharacter;
FBPropertyAction ActionSaveHIKState;
FBPropertyAction ActionSaveHIKEffectors;
FBPropertyAction ActionSaveHIKProperties;
void InitSolvingProperties();
#endif
void ModifySolvingStep(bool pEnable, int pStep);
virtual FBCharacterManipulatorCtrlSet* CreateCharacterManipulatorCtrlSet(const char* pName) override;
virtual int GetExtraFKCount() override;
virtual const char* GetExtraFKNameAt(int pIndex) override;
virtual FBBodyPartId GetExtraFKBodyPartAt(
int pIndex)
override;
virtual int GetExtraBoneCount() override;
virtual const char* GetExtraBoneNameAt(int pIndex) override;
virtual FBBodyPartId GetExtraBoneBodyPartAt(
int pIndex)
override;
virtual void CharacterPasteState( FBCharacter* pFromCharacter, FBCharacterPose* pPose, FBCharacterPoseOptions& pCharacterPoseOptions ) override;
void RegisterExtraProperties(HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> &pHIKCharacterHost);
virtual void ResetExtraProperties() override;
static void AddPropertiesToPropertyViewManager();
private:
int mInternalPropertiesCount;
int mSolverPropertiesCount;
int mSolvingStepFilter;
public:
HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> mHIKCharacterHost;
private:
HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> mHIKCharacterHostSrc;
HIKControlRigHost<HIKHostNodeMB> mHIKControlRigHost;
FBActor* mActorSrc;
public:
HIKControlRigHostEvaluator<HIKHostNodeMB,HIKHostPropertyMB> mHIKControlRigHostEvaluator;
HIKCharacterHostEvaluator<HIKHostNodeMB,HIKHostPropertyMB> mHIKCharacterHostEvaluator;
private:
FBCharacterManipulatorCtrlSet* mControlSetManipulator;
void SetupTargetCharacter(FBCharacter* pCharacter);
void SetupInputControlRig(FBControlSet* pControlRig, bool pConstraintRig = false );
void SetupAutoProperties(FBCharacter* pCharacter);
void ResetSnSPropertiesVisibility(FBCharacter* lCharacter);
void CreateExtraFKIfNeeded(FBCharacter* pCharacter, int pExtraBoneId, HIKEvaluationState *pStanceState);
HIKEvaluationState* pPasteState, HIKEvaluationState* pCurrentState,
HIKCharacter* pHIKFromCharacter, HIKEvaluationState* pFromState,
FBCharacterPose* pPose, FBCharacterPoseOptions& pCharacterPoseOptions,
FBMatrix& pHipsOffsetGX, FBEvaluateInfo* pPasteEvaluateInfo=
FBGetDisplayInfo());
void FilterBodyParts( HIKEvaluationState* pPasteState, HIKEvaluationState* pCurrentState );
void DoPasteCharacterExtension(FBCharacterPose* pPose, FBCharacterPoseOptions& pCharacterPoseOptions, HIKEvaluationState* pCurrentState, FBEvaluateInfo* pPasteEvaluateInfo=
FBGetDisplayInfo());
void ApplyFKTranslation(
HIKCharacter* pHIKCharacter, HIKEvaluationState* pPasteState,
HIKCharacter* pHIKFromCharacter, HIKEvaluationState* lFromState );
void PastePoseToTempHikCharacter( FBCharacter* pFromCharacter, FBCharacterPose* pPose, FBCharacterPoseOptions& pCharacterPoseOptions,
HIKCharacter*& pHIKFromCharacter, HIKEvaluationState* pTempState );
void GetRotationOffset( const FBMatrix& pMatchModel_GX, const FBMatrix& pMatchMode_PoseTRSM, const FBCharacterPoseOptions& pCharacterPoseOptions, FBMatrix& pHipsOffsetGX );
void GetTranslationOffset( const FBMatrix& pMatchModel_GX, const FBMatrix& pMatchMode_PoseTRSM, const FBCharacterPoseOptions& pCharacterPoseOptions, FBMatrix& pHipsOffsetGX );
void AddSolverPropertiesToCharacter(FBCharacter* pDstCharacter);
void RemoveSolverPropertiesFromCharacter(FBCharacter* pDstCharacter);
void RenameSolverPropertiesOnCharacters();
void SyncVisibilitySolverPropertiesOnCharacters(FBProperty* pSourceProperty, FBProperty* pRefProperty=
NULL);
void ResetPropertiesToDefault();
void RemoveAnimations();
void RetargetExtensions( FBEvaluateInfo * pEvalInfo );
};
#endif