00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef _XNV_SESSION_MANAGER_H_
00010 #define _XNV_SESSION_MANAGER_H_
00011
00012 #include "XnVDeviceControl.h"
00013 #include "XnVMessageGenerator.h"
00014 #include "XnVMultipleHands.h"
00015 #include "XnVGesture.h"
00016 #include "XnVPointTracker.h"
00017 #include "XnVPointMessage.h"
00018 #include "XnVSessionGenerator.h"
00019 #include "XnV3DVector.h"
00020 #include "XnVSteadyDetector.h"
00021
00022 class XnVGestureHash;
00032 class XNV_NITE_API XnVSessionManager :
00033 public XnVContextControl,
00034 public XnVSessionGenerator
00035 {
00036 public:
00042 XnVSessionManager(const XnChar* strName = "XnVSessionManager");
00043 ~XnVSessionManager();
00044
00057 XnStatus Initialize(xn::Context* pContext,
00058 const XnChar* strUseAsFocus, const XnChar* strUseAsQuickRefocus,
00059 xn::HandsGenerator* pTracker = NULL, xn::GestureGenerator* pFocusGenerator = NULL,
00060 xn::GestureGenerator* pQuickRefocusGenerator = NULL);
00061
00069 void Update(XnVMessage* pMessage);
00075 void Update(const xn::Context* pContext);
00081 void ProcessPoints(XnVMultipleHands* pHands);
00082
00088 void SetTracker(XnVPointTracker* pTracker);
00089 void SetTracker(xn::HandsGenerator generator);
00090
00096 void SetQuickRefocusTimeout(XnUInt32 nMilliseconds);
00097 XnUInt32 GetQuickRefocusTimeout() const;
00098
00104 XnStatus LosePoint(XnUInt32 nID);
00108 XnStatus LosePoints();
00109
00113 XnStatus EndSession();
00119 XnStatus ForceSession(const XnPoint3D& ptFocus);
00125 XnStatus TrackPoint(const XnPoint3D& pt);
00126
00130 void ClearQueue();
00131
00137 XnStatus SetQuickRefocusArea(const XnBoundingBox3D& bbQuickRefocusArea);
00145 XnStatus SetQuickRefocusArea(XnFloat fLengthX, XnFloat fLengthY, XnFloat fLengthZ);
00146
00147 void GetQuickRefocusArea(XnFloat& fLengthX, XnFloat& fLengthY, XnFloat& fLengthZ);
00154 void ForceQuickRefocus(XnBoundingBox3D* pbbForcedArea, XnUInt32 nForcedTimeout);
00155
00163 XnUInt32 AddGesture(XnVGesture* pGesture);
00172 XnUInt32 AddGesture(xn::GestureGenerator& generator, const XnChar* strName);
00181 XnUInt32 AddGesture(xn::Context& context, const XnChar* strName);
00187 void RemoveGesture(XnUInt32 nId);
00188
00196 XnUInt32 AddQuickRefocus(XnVGesture* pGesture);
00205 XnUInt32 AddQuickRefocus(xn::GestureGenerator& generator, const XnChar* strName);
00214 XnUInt32 AddQuickRefocus(xn::Context& context, const XnChar* strName);
00220 void RemoveQuickRefocus(XnUInt32 nId);
00221
00225 void StartPrimaryStatic();
00229 void StopPrimaryStatic();
00235 void SetPrimaryStaticTimeout(XnFloat fTimeout);
00241 XnFloat GetPrimarySteadyTimeout() const;
00242
00251 void SetPrimaryStaticBoundingBox(XnFloat fX, XnFloat fY, XnFloat fZ);
00259 void GetPrimaryStaticBoundingBox(XnFloat& fX, XnFloat& fY, XnFloat& fZ);
00260
00261 XnStatus XN_API_DEPRECATED("Please use Initialize() instead.")
00262 Initialize(XnVGesture* pFocusGesture, XnVGesture* pQuickRefocusGesture, XnVPointTracker* pTracker);
00263
00264 void XN_API_DEPRECATED("Please use AddGesture() instead.")
00265 SetGesture(XnVGesture* pGesture);
00266 void XN_API_DEPRECATED("Please use AddGesture() instead.")
00267 SetGesture(xn::GestureGenerator gestureGenerator, const XnChar* strGestures);
00268
00269 void XN_API_DEPRECATED("Please use AddQuickRefocus() instead.")
00270 SetQRGesture(XnVGesture* pGesture);
00271 void XN_API_DEPRECATED("Please use AddQuickRefocus() instead.")
00272 SetQRGesture(xn::GestureGenerator gestureGenerator, const XnChar* strGestures);
00273
00274 protected:
00275
00276 void SessionStop();
00277 void StartQuickRefocus(XnBoundingBox3D* pbbROI, XnUInt32 nTimeout);
00278
00279 XnStatus FindTracker(xn::Context* pContext, xn::HandsGenerator* pTracker, xn::HandsGenerator& tracker);
00280
00281 static void XN_CALLBACK_TYPE Gesture_Recognized(const XnChar* strGesture, const XnPoint3D& ptIDPosition, const XnPoint3D& ptEndPosition, void* cxt);
00282 static void XN_CALLBACK_TYPE Gesture_StartRecognized(const XnChar* strGesture, const XnPoint3D& pos, XnFloat fProgress, void* cxt);
00283 void GestureRecognized(const XnChar* strGesture, const XnPoint3D& ptIDPosition, const XnPoint3D& ptEndPosition);
00284 void GestureStartRecognized(const XnChar* strGesture, const XnPoint3D& pos, XnFloat fProgress);
00285
00286 XnUInt64 GetTime();
00287
00288 void EnableGestures(XnBoundingBox3D* pROI = NULL);
00289 void EnableQuickRefocusGestures(XnBoundingBox3D* pROI = NULL);
00290 void DisableGestures();
00291 void DisableQuickRefocusGestures();
00292 void UpdateGestures(const xn::Context* pContext);
00293 void UpdateQuickRefocusGestures(const xn::Context* pContext);
00294
00295 XnBool m_bGesturesEnabled;
00296 XnBool m_bQuickRefocusEnabled;
00297
00298 void ClearGestureHash(XnVGestureHash& hash);
00299 XnVGestureHash* m_pMainGestures;
00300 XnVGestureHash* m_pQuickRefocusGestures;
00301 XnUInt32 m_nNextGestureID;
00302
00303 XnUInt32 AddGesture(XnVGesture* pGesture, XnBool bAuto, XnUInt32 nHintID, XnBool bFocus);
00304
00305 XnUInt32 AddGesture(xn::Context& context, const XnChar* strName, const XnStringsHash& hash, XnBool bFocus);
00306 XnUInt32 AddGesture(xn::GestureGenerator& generator, const XnChar* strName, const XnStringsHash& hash, XnBool bFocus);
00307
00308 void RemoveGesture(XnUInt32 nId, XnVGestureHash& hash);
00309
00310 XnVPointTracker* m_pTracker;
00311 XnBool m_bAutoTracker;
00312
00313 enum
00314 {
00315 SMGR_ILLEGAL = 0x0000,
00316 SMGR_NOT_IN_SESSION = 0x0001,
00317 SMGR_IN_SESSION = 0x0002,
00318 SMGR_QUICK_REFOCUS = SMGR_IN_SESSION | SMGR_NOT_IN_SESSION,
00319 SMGR_START_SESSION = 0x0004,
00320 } m_eSessionState;
00321
00322 inline XnBool IsInSession() const {return (m_eSessionState & SMGR_IN_SESSION) != 0;}
00323 inline XnBool IsNotInSession() const {return (m_eSessionState & SMGR_NOT_IN_SESSION) != 0;}
00324 inline XnBool IsQuickRefocus() const {return m_eSessionState == SMGR_QUICK_REFOCUS;}
00325
00326 XnBool m_bQuickRefocusAllowed;
00327
00328 XnCallbackHandle m_hGesture;
00329 XnCallbackHandle m_hGestureMid;
00330 XnCallbackHandle m_hQRGesture;
00331
00332 XnUInt32 m_nQuickRefocusTimeout;
00333 XnUInt64 m_nQuickRefocusExpire;
00334
00335 static const XnUInt32 ms_nQuickRefocusDefaultTimeout;
00336
00337 XnV3DVector m_ptLastPrimaryPosition;
00338
00339 XnBoundingBox3D m_bbQuickRefocusArea;
00340 const xn::Context* m_pContext;
00341
00342 XnBool m_bCheckPrimaryForStatic;
00343 XnBool m_bPrimaryIsStatic;
00344 XnVSteadyDetector* m_pSteadyDetector;
00345
00346 static void XN_CALLBACK_TYPE PrimaryIsSteady(XnUInt32 id, XnFloat dummy, void* cxt);
00347 static void XN_CALLBACK_TYPE PrimaryIsNotSteady(XnUInt32 id, XnFloat dummy, void* cxt);
00348
00349 XnFloat m_fLastSteadyTime;
00350 XnFloat m_fLastPrimaryTime;
00351 XnFloat m_fSteadyTimeout;
00352
00353 XnUInt32 m_nLastPrimaryID;
00354 XnPoint3D m_GestureWhileTrackingThreshold;
00355
00356 void InitializeStatic();
00357 void FinalizeStatic();
00358 };
00359
00360 #endif