#ifndef __ORCHARACTERMANIPULATOR_H__
#define __ORCHARACTERMANIPULATOR_H__
#include "hikhostmb.h"
#define ORCHARACTERMANIPULATORCTRLSET__CLASSNAME ORCharacterManipulatorCtrlSet
class ORCharacterManipulatorCtrlSet : public FBCharacterManipulatorCtrlSet
{
public:
virtual bool FBCreate();
virtual void FBDestroy();
void ComputeGlobal(
FBTVector &pGT , FBMatrix &pGRM , FBMatrix &pGSM,
void TranslationStopManipulation ();
virtual void RotationStopManipulation ();
virtual void ScalingStopManipulation ();
virtual void SyncCharacter(FBEvaluateInfo *pEvalInfo);
void ApplySync(FBEvaluateInfo *pEvalInfo, bool pSolveBackOnRig = true, bool pWriteRig = true );
void SyncEffectorPivot(FBEvaluateInfo* pEvaluateInfo);
void RestoreInitialState();
protected:
HIKCharacter* mHIKCharacter;
HIKCharacterHost<HIKHostNodeMB,HIKHostPropertyMB> mHIKCharacterHost;
HIKControlRigHost<HIKHostNodeMB> mHIKControlRigHost;
KHIKNodeState* mDataSet;
HIKControlRigHostEvaluator<HIKHostNodeMB,HIKHostPropertyMB> mHIKCurrentControlRigHostEvaluator;
HIKControlRigHostEvaluator<HIKHostNodeMB,HIKHostPropertyMB> mHIKInitialControlRigHostEvaluator;
HIKEvaluationState mCurrentState;
HIKEvaluationState mInitialState;
bool IsDescendantPulling(int pEffectorId);
void SetResist(float pResist);
void SetBlendFact(float pFact);
void AddPostRotation(FBModel *pModel, FBMatrix &pMatrix);
void RemovePostRotation(FBModel *pModel, FBMatrix &pMatrix);
void ManipulationStart();
void UpdateManipulatedObjectCount();
void PrepareSetForManip();
bool NeedRotationSync(
FBEffectorId pEffectorIndex,
double pAngleTol);
virtual void AllocateState(FBCharacter* pCharacter);
virtual void DeallocateState();
void GetNormalizedLocalState( KHIKNodeState pDataSet[LastNodeId] ) const;
void SetNormalizedLocalState( KHIKNodeState pDataSet[LastNodeId] );
int mManipulatedObjectCount;
int mCurrentObjectManipulatedCount;
int GetManipulatedNodeExtraFKIndex();
int GetManipulatedNodeExtraBoneIndex();
};
#endif