#ifndef __ORCHARACTERMANIPULATOR_H__
#define __ORCHARACTERMANIPULATOR_H__
#include "hikhostmb.h"
#define ORCHARACTERMANIPULATORCTRLSET__CLASSNAME ORCharacterManipulatorCtrlSet
class ORCharacterSolver_HIK;
class ORCharacterManipulatorCtrlSet : public FBCharacterManipulatorCtrlSet
{
public:
virtual bool FBCreate();
virtual void FBDestroy();
virtual void TranslationStopManipulation () override;
virtual void RotationStopManipulation () override;
virtual void ScalingStopManipulation ();
virtual void SyncCharacter(FBEvaluateInfo *pEvalInfo) override;
protected:
HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> mHIKCharacterHost;
HIKControlRigHost<HIKHostNodeMB> mHIKControlRigHost;
HIKControlRigHostEvaluator<HIKHostNodeMB,HIKHostPropertyMB> mHIKCurrentControlRigHostEvaluator;
HIKControlRigHostEvaluator<HIKHostNodeMB,HIKHostPropertyMB> mHIKInitialControlRigHostEvaluator;
HIKEvaluationState mCurrentState;
HIKEvaluationState mInitialState;
int mManipulatedEffectorsCount;
bool mHIKUndoSetup;
virtual void AllocateState(FBCharacter* pCharacter) override;
virtual void DeallocateState() override;
int GetManipulationSolvingStep();
void AskSync(bool pForce = false);
void ApplySync(FBEvaluateInfo *pEvalInfo, bool pForce = false );
void RestoreInitialState();
void SetResist(float pResist);
void SetBlendFact(float pFact);
void AddPostRotation(FBModel *pModel, FBMatrix &pMatrix);
void RemovePostRotation(FBModel *pModel, FBMatrix &pMatrix);
void PrepareSetForManip(
FBManipMode pManipMode, FBEvaluateInfo *pEvalInfo=
NULL);
void CleanForManipulation();
bool NeedRotationSync(
FBEffectorId pEffectorIndex,
double pAngleTol);
void GetNormalizedLocalState( KHIKNodeState pDataSet[
LastNodeId] )
const;
void SetNormalizedLocalState( KHIKNodeState pDataSet[
LastNodeId] );
ORCharacterSolver_HIK* GetORCharacterSolver_HIK(FBCharacter* pCharacter=
NULL);
int GetManipulatedNodeExtraFKIndex();
int GetManipulatedNodeExtraBoneIndex();
bool IsManipulated_FK();
bool IsManipulated_IK();
};
#endif