#include "ordevicemocap_hardware.h"
#include "speech/speech.h"
static FBMatrix RotationMatrix4ToFBMatrix(
Matrix4 pMatrix4);
ORDeviceMocapKinect::ORDeviceMocapKinect() :
mChannelCount( 0 ),
m_hNextSkeletonEvent(INVALID_HANDLE_VALUE),
mKinectMocapJointsState(
NULL),
mAverageSensorFloorOffset(0.0),
mSensorFloorOffsetSet(
false),
{
}
ORDeviceMocapKinect::~ORDeviceMocapKinect()
{
if(mSpeech)
{
mSpeech->Stop();
delete mSpeech;
}
if (mNuiSensor)
{
}
if (m_hNextSkeletonEvent && (m_hNextSkeletonEvent != INVALID_HANDLE_VALUE))
{
CloseHandle(m_hNextSkeletonEvent);
}
if ( mNuiSensor )
{
mNuiSensor->Release();
}
if (mKinectMocapJointsState)
{
delete mKinectMocapJointsState;
}
}
bool ORDeviceMocapKinect::Init()
{
__try
{
mInitSuccessful = true;
}
__except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER )
{
StatusHandle::One()->PopMessage(eSTATUS_SENSOR_RUNTIME_DLL_MISSING);
mInitSuccessful = false;
return false;
}
return true;
}
bool ORDeviceMocapKinect::Open()
{
if( !mInitSuccessful )
return false;
bool lResult = false;
if (!mOpened)
{
int lSensorCount = 0;
if (FAILED(hr))
{
return false;
}
for (
int i = 0;
i < lSensorCount; ++
i)
{
if (FAILED(hr))
{
continue;
}
hr = lNuiSensor->NuiStatus();
if( hr == S_OK )
{
mNuiSensor = lNuiSensor;
lResult = true;
break;
}
else
{
switch (hr)
{
StatusHandle::One()->PopMessage(eSTATUS_SENSOR_INITIALIZING);
break;
StatusHandle::One()->PopMessage(eSTATUS_SENSOR_NOTCONNECTED);
break;
StatusHandle::One()->PopMessage(eSTATUS_SENSOR_NOTGENUINE);
break;
StatusHandle::One()->PopMessage(eSTATUS_SENSOR_NOTSUPPORTED);
break;
StatusHandle::One()->PopMessage(eSTATUS_SENSOR_INSUFFICIENTBANDWIDTH);
break;
StatusHandle::One()->PopMessage(eSTATUS_SENSOR_NOTPOWERED);
break;
StatusHandle::One()->PopMessage(eSTATUS_SENSOR_NOTREADY);
break;
default:
break;
}
lNuiSensor->Release();
}
}
}
if( lResult )
{
static bool gVoiceControl_NotAskAgain = false;
if( !gVoiceControl_NotAskAgain )
{
"Activate Voice Control?",
"Don't show this dialog", gVoiceControl_NotAskAgain
);
if(lSelect == 1)
mHasVoiceControl = true;
else
mHasVoiceControl = false;
}
}
return lResult;
}
bool ORDeviceMocapKinect::AdjustAngle()
{
if( mNuiSensor )
{
long lVerticalAngle = 0;
HRESULT hr = mNuiSensor->NuiCameraElevationGetAngle(&lVerticalAngle);
if( hr != S_OK )
{
return false;
}
if( lVerticalAngle != 0 )
{
hr = mNuiSensor->NuiCameraElevationSetAngle(0);
if( hr != S_OK )
{
return false;
}
}
}
return true;
}
bool ORDeviceMocapKinect::StartDataStream()
{
if (!mOpened)
{
{
HRESULT hr;
if( mHasVoiceControl )
else
if (SUCCEEDED(hr))
{
m_hNextSkeletonEvent = CreateEventW(
NULL, TRUE, FALSE,
NULL);
hr = mNuiSensor->NuiSkeletonTrackingEnable(m_hNextSkeletonEvent, 0);
if ( SUCCEEDED(hr))
{
mOpened = true;
return true;
}
else
{
mNuiSensor->Release();
return false;
}
}
else
{
mNuiSensor->Release();
return false;
}
}
}
return false;
}
bool ORDeviceMocapKinect::Close()
{
{
mNuiSensor->NuiShutdown();
mOpened = false;
}
return true;
}
bool ORDeviceMocapKinect::StopDataStream()
{
if( mOpened )
{
{
if( mSpeech && mSpeech->IsValid() )
mSpeech->Stop();
HRESULT hr = mNuiSensor->NuiSkeletonTrackingDisable();
if ( SUCCEEDED(hr))
{
mOpened = false;
return true;
}
}
}
return false;
}
bool ORDeviceMocapKinect::GetSetupInfo()
{
mChannel[0].mName = "Hips";
mChannel[0].mParentChannel = -1;
mChannel[0].mT[0] = 0;
mChannel[0].mT[1] = 90.2313919067;
mChannel[0].mT[2] = 0.0;
mChannel[0].mR[0] = 0.0;
mChannel[0].mR[1] = 0.0;
mChannel[0].mR[2] = 0.0;
mChannel[1].mName = "Spine";
mChannel[1].mParentChannel = 0;
mChannel[1].mT[0] = 0;
mChannel[1].mT[1] = 109;
mChannel[1].mT[2] = 0.0;
mChannel[1].mR[0] = 0.0;
mChannel[1].mR[1] = 0.0;
mChannel[1].mR[2] = 0.0;
mChannel[2].mName = "Neck";
mChannel[2].mParentChannel = 1;
mChannel[2].mT[0] = 0;
mChannel[2].mT[1] = 133.325692751;
mChannel[2].mT[2] = 0.0;
mChannel[2].mR[0] = 0.0;
mChannel[2].mR[1] = 0.0;
mChannel[2].mR[2] = 0.0;
mChannel[3].mName = "Head";
mChannel[3].mParentChannel = 2;
mChannel[3].mT[0] = 0;
mChannel[3].mT[1] = 145.887693025;
mChannel[3].mT[2] = 0.0;
mChannel[3].mR[0] = 0.0;
mChannel[3].mR[1] = 0.0;
mChannel[3].mR[2] = 0.0;
mChannel[20].mName = "LeftShoulder";
mChannel[20].mParentChannel = 1;
mChannel[20].mT[0] = 20;
mChannel[20].mT[1] = 133.325692751;
mChannel[20].mT[2] = 0.0;
mChannel[20].mR[0] = 0.0;
mChannel[20].mR[1] = 0.0;
mChannel[20].mR[2] = -125.0;
mChannel[4].mName = "LeftArm";
mChannel[4].mParentChannel = 20;
mChannel[4].mT[0] = 20;
mChannel[4].mT[1] = 133.325692751;
mChannel[4].mT[2] = 0.0;
mChannel[4].mR[0] = 0.0;
mChannel[4].mR[1] = 0.0;
mChannel[4].mR[2] = -90.0002104591;
mChannel[5].mName = "LeftForeArm";
mChannel[5].mParentChannel = 4;
mChannel[5].mT[0] = 45;
mChannel[5].mT[1] = 133.325613014;
mChannel[5].mT[2] = 0.0;
mChannel[5].mR[0] = 0.0;
mChannel[5].mR[1] = 0.0;
mChannel[5].mR[2] = -90.0002104591;
mChannel[6].mName = "LeftHand";
mChannel[6].mParentChannel = 5;
mChannel[6].mT[0] = 70;
mChannel[6].mT[1] = 133.325516399;
mChannel[6].mT[2] = 0.0;
mChannel[6].mR[0] = 0.0;
mChannel[6].mR[1] = 0.0;
mChannel[6].mR[2] = -90.0002104591;
mChannel[7].mName = "LeftFingerBase";
mChannel[7].mParentChannel = 6;
mChannel[7].mT[0] = 75;
mChannel[7].mT[1] = 133.325415281;
mChannel[7].mT[2] = 0.0;
mChannel[7].mR[0] = 0.0;
mChannel[7].mR[1] = 0.0;
mChannel[7].mR[2] = -90.0002104591;
mChannel[21].mName = "RightShoulder";
mChannel[21].mParentChannel = 1;
mChannel[21].mT[0] = -20;
mChannel[21].mT[1] = 133.325692751;
mChannel[21].mT[2] = 0.0;
mChannel[21].mR[0] = 0.0;
mChannel[21].mR[1] = 0.0;
mChannel[21].mR[2] = 125.0;
mChannel[8].mName = "RightArm";
mChannel[8].mParentChannel = 21;
mChannel[8].mT[0] = -20;
mChannel[8].mT[1] = 133.325692751;
mChannel[8].mT[2] = 0.0;
mChannel[8].mR[0] = 0.0;
mChannel[8].mR[1] = 0.0;
mChannel[8].mR[2] = 90.0002104591;
mChannel[9].mName = "RightForeArm";
mChannel[9].mParentChannel = 8;
mChannel[9].mT[0] = -45;
mChannel[9].mT[1] = 133.325613014;
mChannel[9].mT[2] = 0.0;
mChannel[9].mR[0] = 0.0;
mChannel[9].mR[1] = 0.0;
mChannel[9].mR[2] = 90.0002104591;
mChannel[10].mName = "RightHand";
mChannel[10].mParentChannel = 9;
mChannel[10].mT[0] = -70;
mChannel[10].mT[1] = 133.325516399;
mChannel[10].mT[2] = 0.0;
mChannel[10].mR[0] = 0.0;
mChannel[10].mR[1] = 0.0;
mChannel[10].mR[2] = 90.0002104591;
mChannel[11].mName = "RightFingerBase";
mChannel[11].mParentChannel = 10;
mChannel[11].mT[0] = -75.5387020106;
mChannel[11].mT[1] = 133.325415281;
mChannel[11].mT[2] = 0.0;
mChannel[11].mR[0] = 0.0;
mChannel[11].mR[1] = 0.0;
mChannel[11].mR[2] = 90.0002104591;
mChannel[12].mName = "LeftUpLeg";
mChannel[12].mParentChannel = 0;
mChannel[12].mT[0] = 10.8919000626;
mChannel[12].mT[1] = 90.2313919067;
mChannel[12].mT[2] = 0.0;
mChannel[12].mR[0] = 0.0;
mChannel[12].mR[1] = 0.0;
mChannel[12].mR[2] = -180.0;
mChannel[13].mName = "LeftLeg";
mChannel[13].mParentChannel = 12;
mChannel[13].mT[0] = 10.8919000626;
mChannel[13].mT[1] = 46.1967926025;
mChannel[13].mT[2] = 0.0;
mChannel[13].mR[0] = 0.0;
mChannel[13].mR[1] = 0.0;
mChannel[13].mR[2] = -180.0;
mChannel[14].mName = "LeftFoot";
mChannel[14].mParentChannel = 13;
mChannel[14].mT[0] = 10.8919000626;
mChannel[14].mT[1] = 4.74909210205;
mChannel[14].mT[2] = 0.0;
mChannel[14].mR[0] = 33;
mChannel[14].mR[1] = 0.0;
mChannel[14].mR[2] = -180.0;
mChannel[15].mName = "LeftToeBase";
mChannel[15].mParentChannel = 14;
mChannel[15].mT[0] = 10.8919000626;
mChannel[15].mT[1] = 1.05947666894;
mChannel[15].mT[2] = 13.7698536165;
mChannel[15].mR[0] = 28;
mChannel[15].mR[1] = 0.0;
mChannel[15].mR[2] = -180.0;
mChannel[16].mName = "RightUpLeg";
mChannel[16].mParentChannel = 0;
mChannel[16].mT[0] = -10.8919000626;
mChannel[16].mT[1] = 90.2313919067;
mChannel[16].mT[2] = 0.0;
mChannel[16].mR[0] = 0.0;
mChannel[16].mR[1] = 0.0;
mChannel[16].mR[2] = 180.0;
mChannel[17].mName = "RightLeg";
mChannel[17].mParentChannel = 16;
mChannel[17].mT[0] = -10.8919000626;
mChannel[17].mT[1] = 46.1967926025;
mChannel[17].mT[2] = 0.0;
mChannel[17].mR[0] = 0.0;
mChannel[17].mR[1] = 0.0;
mChannel[17].mR[2] = 180.0;
mChannel[18].mName = "RightFoot";
mChannel[18].mParentChannel = 17;
mChannel[18].mT[0] = -10.8919000626;
mChannel[18].mT[1] = 4.74909210205;
mChannel[18].mT[2] = 0.0;
mChannel[18].mR[0] = 33;
mChannel[18].mR[1] = 0.0;
mChannel[18].mR[2] = 180.0;
mChannel[19].mName = "RightToeBase";
mChannel[19].mParentChannel = 18;
mChannel[19].mT[0] = -10.8919000626;
mChannel[19].mT[1] = 1.05947666894;
mChannel[19].mT[2] = 13.7698536165;
mChannel[19].mR[0] = 28;
mChannel[19].mR[1] = 0.0;
mChannel[19].mR[2] = 180.0;
for(
int i = 0;
i < mChannelCount;
i++)
{
memcpy(mChannel[
i].mDefaultT,mChannel[
i].mT,
sizeof(
double)*3);
memcpy(mChannel[
i].mDefaultR,mChannel[
i].mR,
sizeof(
double)*3);
}
return true;
}
void ORDeviceMocapKinect::GetSkeletonJointsOrder(
FBBodyNodeId* &pSkeletonJointsOrder)
{
}
FBString ORDeviceMocapKinect::GetHardWareName()
{
return FBString("Kinect");
}
double ORDeviceMocapKinect::GetAverageSensorFloorOffset()
{
return mAverageSensorFloorOffset;
}
void ORDeviceMocapKinect::SetSensorFloorOffsetSet()
{
mSensorFloorOffsetSet = true;
}
bool ORDeviceMocapKinect::FetchMocapData(FBTime &pTime)
{
if ( !mNuiSensor)
{
return false;
}
if ( WAIT_OBJECT_0 == WaitForSingleObject(m_hNextSkeletonEvent, 0))
{
HRESULT hr = mNuiSensor->NuiSkeletonGetNextFrame(0, &skeletonFrame);
if ( FAILED(hr) )
{
return false;
}
mNuiSensor->NuiTransformSmooth(&skeletonFrame,
NULL);
{
{
CalculateAverageSensorFloorOffset();
mKinectMocapJointsState->mSkeletonPosition = PositionVector4ToFBTVector(lSkeletonData.
Position);
SkeletonNodeInfo* lIter;
{
lIter = &mChannel[j];
{
mKinectMocapJointsState->mSkeletonJointsPositions[j] = PositionVector4ToFBTVector(lSkeletonData.
SkeletonPositions[j]);
FBMatrix lGlobalRotationMatrix = RotationMatrix4ToFBMatrix(lLocalRotationMatrix4);
mKinectMocapJointsState->mSkeletonJointsGlobalOrientations[j] = lGlobalRotationMatrix;
lIter->mR[0] = lRVector[0];
lIter->mR[1] = lRVector[1];
lIter->mR[2] = lRVector[2];
}
else
{
lIter->mT[0] = mKinectMocapJointsState->mSkeletonJointsPositions[j][0];
lIter->mT[1] = mKinectMocapJointsState->mSkeletonJointsPositions[j][1];
lIter->mT[2] = mKinectMocapJointsState->mSkeletonJointsPositions[j][2];
FBMatrixToRotation(lRVector,mKinectMocapJointsState->mSkeletonJointsGlobalOrientations[j]);
lIter->mR[0] = lRVector[0];
lIter->mR[1] = lRVector[1];
lIter->mR[2] = lRVector[2];
}
}
}
{
}
}
}
else
{
return false;
}
return true;
}
void ORDeviceMocapKinect::CalculateAverageSensorFloorOffset()
{
if (!mSensorFloorOffsetSet)
{
if ( mKinectMocapJointsState->mFloorClipPlaneW != 0.0)
{
if (0.0 == mAverageSensorFloorOffset)
{
mAverageSensorFloorOffset = mKinectMocapJointsState->mFloorClipPlaneW*100.0;
}
else
{
mAverageSensorFloorOffset = (mAverageSensorFloorOffset * 0.9) + (mKinectMocapJointsState->mFloorClipPlaneW*100.0 * 0.1);
}
}
}
}
bool ORDeviceMocapKinect::SetupSpeechConnection()
{
if( mHasVoiceControl && mNuiSensor )
{
if(!mSpeech)
mSpeech = new Speech();
HRESULT hr = mSpeech->CreateFirstConnected(mNuiSensor);
if (FAILED(hr))
{
mSpeech->Stop();
return false;
}
}
return true;
}
SpeechCommands ORDeviceMocapKinect::ProcessSpeech()
{
if( mHasVoiceControl && mSpeech && mSpeech->IsValid() )
{
return mSpeech->Process();
}
return eNoCommand;
}
static FBMatrix RotationMatrix4ToFBMatrix(
Matrix4 pMatrix4)
{
FBMatrix lMatrix;
lMatrix(0,0) = pMatrix4.
M11;
lMatrix(0,1) = pMatrix4.
M12;
lMatrix(0,2) = pMatrix4.
M13;
lMatrix(1,0) = pMatrix4.
M21;
lMatrix(1,1) = pMatrix4.
M22;
lMatrix(1,2) = pMatrix4.
M23;
lMatrix(2,0) = pMatrix4.
M31;
lMatrix(2,1) = pMatrix4.
M32;
lMatrix(2,2) = pMatrix4.
M33;
lMatrix(3,3) = pMatrix4.
M44;
return lMatrix;
}
{
return FBTVector(pVector4.
x*100, pVector4.
y*100, pVector4.
z*100);
}