#ifndef __ORDEVICE_MOCAP_DEVICE_H__
#define __ORDEVICE_MOCAP_DEVICE_H__
#include "ordevicemocap_hardware.h"
#include "fileio.h"
#define ORDEVICEMOCAP_CLASSNAME ORDeviceMocap
#define ORDEVICEMOCAP_CLASSSTR "ORDeviceMocap"
class DataChannel
{
public:
DataChannel()
{
}
~DataChannel()
{
}
public:
FBAnimationNode* mTAnimNode;
FBAnimationNode* mRAnimNode;
FBModelTemplate* mModelTemplate;
};
enum OperationStatus
{
eAskForCreateModelBinding,
eAskForPressOnline,
eAskForPressSetupRecording,
eAskForPressCalibration,
eAskForDoCalibration,
eReadyForRecording,
};
class ORDeviceMocap : public FBDevice
{
public:
virtual bool FBCreate() override;
virtual void FBDestroy() override;
virtual bool DeviceOperation ( kDeviceOperations pOperation ) override;
virtual bool AnimationNodeNotify( FBAnimationNode* pAnimationNode,FBEvaluateInfo* pEvaluateInfo ) override;
virtual void DeviceIONotify ( kDeviceIOs pAction, FBDeviceNotifyInfo &pDeviceNotifyInfo ) override;
virtual void DeviceTransportNotify( kTransportMode pMode, FBTime pTime, FBTime pSystem ) override;
virtual void RecordingDoneAnimation( FBAnimationNode* pAnimationNode) override;
void DeviceRecordFrame (FBTime &pTime,FBDeviceNotifyInfo &pDeviceNotifyInfo);
virtual bool FbxStore ( FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat )
override;
virtual bool FbxRetrieve( FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat )
override;
bool Init ();
bool Start ();
bool Stop ();
bool Reset ();
bool Done ();
double GetDataTX(int pChannelIndex) { return mHardware.GetDataTX(pChannelIndex); }
double GetDataTY(int pChannelIndex) { return mHardware.GetDataTY(pChannelIndex); }
double GetDataTZ(int pChannelIndex) { return mHardware.GetDataTZ(pChannelIndex); }
double GetDataRX(int pChannelIndex) { return mHardware.GetDataRX(pChannelIndex); }
double GetDataRY(int pChannelIndex) { return mHardware.GetDataRY(pChannelIndex); }
double GetDataRZ(int pChannelIndex) { return mHardware.GetDataRZ(pChannelIndex); }
void DefineHierarchy ();
void Bind();
void UnBind();
int GetChannelCount() { return mHardware.GetChannelCount(); }
int GetChannelParent(int pMarkerIndex) { return mHardware.GetChannelParent(pMarkerIndex);}
const char* GetChannelName(int pMarkerIndex){ return mHardware.GetChannelName(pMarkerIndex); }
virtual bool ModelTemplateBindNotify( FBModel* pModel,int pIndex, FBModelTemplate* pModelTemplate );
virtual bool ModelTemplateUnBindNotify( int pIndex, FBModelTemplate* pModelTemplate );
bool SetupRecording();
void PrepareSetupRecording(FBString pCharacterPath, FBString pClipDirectory);
bool SetupMocapCharacter ();
bool TriggerMocapCalibration();
OperationStatus GetOperationState();
void SetOperationState(OperationStatus pState);
FileIOStatus GetFileIOStatus();
void SetFileIOStatus(FileIOStatus pState);
private:
void UpdateInfo(FBString pInfo, FBString pStatus);
void ProcessGlobalToLocal();
void SetupLocalGlobal(bool pGlobal);
void PostCalibration();
void ProcessSpeech();
void ResetRecording();
public:
ORDeviceMocapKinect mHardware;
FBModelTemplate* mRootTemplate;
private:
FBCharacter* mMocapCharacter;
FBCharacter* mTargetCharacter;
bool mHierarchyIsDefined;
FBPlayerControl mPlayerControl;
FBApplication mApplication;
bool mHasAnimationToTranspose;
bool mPlotting;
FBString mCharacterPath;
FBString mClipDirectory;
bool mReadyToSetupRecording;
const char* mMocapCharacterName;
FileIO* mFileIO;
bool mDataFromFile;
OperationStatus mOperationState;
SpeechCommands mSpeechCommandType;
HdlFBPlugTemplate<FBAudioClip> mCalibrationAudio;
FBTime mCalibrationAudioStartTime;
};
#endif