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
00031 class XNV_NITE_API XnVSessionManager :
00032 public XnVContextControl,
00033 public XnVSessionGenerator
00034 {
00035 public:
00041 XnVSessionManager(const XnChar* strName = "XnVSessionManager");
00042 ~XnVSessionManager();
00043
00056 XnStatus Initialize(xn::Context* pContext,
00057 const XnChar* strUseAsFocus, const XnChar* strUseAsQuickRefocus,
00058 xn::HandsGenerator* pTracker = NULL, xn::GestureGenerator* pFocusGenerator = NULL,
00059 xn::GestureGenerator* pQuickRefocusGenerator = NULL);
00060
00068 void Update(XnVMessage* pMessage);
00074 void Update(const xn::Context* pContext);
00080 void ProcessPoints(XnVMultipleHands* pHands);
00081
00087 void SetTracker(XnVPointTracker* pTracker);
00088 void SetTracker(xn::HandsGenerator generator);
00089
00095 void SetQuickRefocusTimeout(XnUInt32 nMilliseconds);
00096 XnUInt32 GetQuickRefocusTimeout() const;
00097
00103 XnStatus LosePoint(XnUInt32 nID);
00107 XnStatus LosePoints();
00108
00112 XnStatus EndSession();
00118 XnStatus ForceSession(const XnPoint3D& ptFocus);
00124 XnStatus TrackPoint(const XnPoint3D& pt);
00125
00129 void ClearQueue();
00130
00136 XnStatus SetQuickRefocusArea(const XnBoundingBox3D& bbQuickRefocusArea);
00144 XnStatus SetQuickRefocusArea(XnFloat fLengthX, XnFloat fLengthY, XnFloat fLengthZ);
00145
00146 void GetQuickRefocusArea(XnFloat& fLengthX, XnFloat& fLengthY, XnFloat& fLengthZ);
00153 void ForceQuickRefocus(XnBoundingBox3D* pbbForcedArea, XnUInt32 nForcedTimeout);
00154
00162 XnUInt32 AddGesture(XnVGesture* pGesture);
00171 XnUInt32 AddGesture(xn::GestureGenerator& generator, const XnChar* strName);
00180 XnUInt32 AddGesture(xn::Context& context, const XnChar* strName);
00186 void RemoveGesture(XnUInt32 nId);
00187
00195 XnUInt32 AddQuickRefocus(XnVGesture* pGesture);
00204 XnUInt32 AddQuickRefocus(xn::GestureGenerator& generator, const XnChar* strName);
00213 XnUInt32 AddQuickRefocus(xn::Context& context, const XnChar* strName);
00219 void RemoveQuickRefocus(XnUInt32 nId);
00220
00224 void StartPrimaryStatic();
00228 void StopPrimaryStatic();
00234 void SetPrimaryStaticTimeout(XnFloat fTimeout);
00240 XnFloat GetPrimarySteadyTimeout() const;
00241
00250 void SetPrimaryStaticBoundingBox(XnFloat fX, XnFloat fY, XnFloat fZ);
00258 void GetPrimaryStaticBoundingBox(XnFloat& fX, XnFloat& fY, XnFloat& fZ);
00259
00260 XnStatus XN_API_DEPRECATED("Please use Initialize() instead.")
00261 Initialize(XnVGesture* pFocusGesture, XnVGesture* pQuickRefocusGesture, XnVPointTracker* pTracker);
00262
00263 void XN_API_DEPRECATED("Please use AddGesture() instead.")
00264 SetGesture(XnVGesture* pGesture);
00265 void XN_API_DEPRECATED("Please use AddGesture() instead.")
00266 SetGesture(xn::GestureGenerator gestureGenerator, const XnChar* strGestures);
00267
00268 void XN_API_DEPRECATED("Please use AddQuickRefocus() instead.")
00269 SetQRGesture(XnVGesture* pGesture);
00270 void XN_API_DEPRECATED("Please use AddQuickRefocus() instead.")
00271 SetQRGesture(xn::GestureGenerator gestureGenerator, const XnChar* strGestures);
00272
00273 protected:
00274
00275 void SessionStop();
00276 void StartQuickRefocus(XnBoundingBox3D* pbbROI, XnUInt32 nTimeout);
00277
00278 XnStatus FindTracker(xn::Context* pContext, xn::HandsGenerator* pTracker, xn::HandsGenerator& tracker);
00279
00280 static void XN_CALLBACK_TYPE Gesture_Recognized(const XnChar* strGesture, const XnPoint3D& ptIDPosition, const XnPoint3D& ptEndPosition, void* cxt);
00281 static void XN_CALLBACK_TYPE Gesture_StartRecognized(const XnChar* strGesture, const XnPoint3D& pos, XnFloat fProgress, void* cxt);
00282 void GestureRecognized(const XnChar* strGesture, const XnPoint3D& ptIDPosition, const XnPoint3D& ptEndPosition);
00283 void GestureStartRecognized(const XnChar* strGesture, const XnPoint3D& pos, XnFloat fProgress);
00284
00285 XnUInt64 GetTime();
00286
00287 void EnableGestures(XnBoundingBox3D* pROI = NULL);
00288 void EnableQuickRefocusGestures(XnBoundingBox3D* pROI = NULL);
00289 void DisableGestures();
00290 void DisableQuickRefocusGestures();
00291 void UpdateGestures(const xn::Context* pContext);
00292 void UpdateQuickRefocusGestures(const xn::Context* pContext);
00293
00294 XnBool m_bGesturesEnabled;
00295 XnBool m_bQuickRefocusEnabled;
00296
00297 struct GestureDescription
00298 {
00299 XnUInt32 nID;
00300 XnVGesture* pGesture;
00301 XnBool bAuto;
00302 XnCallbackHandle hFocus;
00303 XnCallbackHandle hMidFocus;
00304 };
00305 XN_DECLARE_DEFAULT_HASH(XnUInt32, GestureDescription*, GestureHash);
00306 void ClearGestureHash(GestureHash& hash);
00307 GestureHash m_MainGestures;
00308 GestureHash m_QuickRefocusGestures;
00309 XnUInt32 m_nNextGestureID;
00310
00311 XnUInt32 AddGesture(XnVGesture* pGesture, XnBool bAuto, XnUInt32 nHintID, XnBool bFocus);
00312
00313 XnUInt32 AddGesture(xn::Context& context, const XnChar* strName, const XnStringsHash& hash, XnBool bFocus);
00314 XnUInt32 AddGesture(xn::GestureGenerator& generator, const XnChar* strName, const XnStringsHash& hash, XnBool bFocus);
00315
00316 void RemoveGesture(XnUInt32 nId, GestureHash& hash);
00317
00318 XnVPointTracker* m_pTracker;
00319 XnBool m_bAutoTracker;
00320
00321 enum
00322 {
00323 SMGR_ILLEGAL = 0x0000,
00324 SMGR_NOT_IN_SESSION = 0x0001,
00325 SMGR_IN_SESSION = 0x0002,
00326 SMGR_QUICK_REFOCUS = SMGR_IN_SESSION | SMGR_NOT_IN_SESSION,
00327 SMGR_START_SESSION = 0x0004,
00328 } m_eSessionState;
00329
00330 inline XnBool IsInSession() const {return (m_eSessionState & SMGR_IN_SESSION) != 0;}
00331 inline XnBool IsNotInSession() const {return (m_eSessionState & SMGR_NOT_IN_SESSION) != 0;}
00332 inline XnBool IsQuickRefocus() const {return m_eSessionState == SMGR_QUICK_REFOCUS;}
00333
00334 XnBool m_bQuickRefocusAllowed;
00335
00336 XnCallbackHandle m_hGesture;
00337 XnCallbackHandle m_hGestureMid;
00338 XnCallbackHandle m_hQRGesture;
00339
00340 XnUInt32 m_nQuickRefocusTimeout;
00341 XnUInt64 m_nQuickRefocusExpire;
00342
00343 static const XnUInt32 ms_nQuickRefocusDefaultTimeout;
00344
00345 XnV3DVector m_ptLastPrimaryPosition;
00346
00347 XnBoundingBox3D m_bbQuickRefocusArea;
00348 const xn::Context* m_pContext;
00349
00350 XnBool m_bCheckPrimaryForStatic;
00351 XnBool m_bPrimaryIsStatic;
00352 XnVSteadyDetector* m_pSteadyDetector;
00353
00354 static void XN_CALLBACK_TYPE PrimaryIsSteady(XnUInt32 id, XnFloat dummy, void* cxt);
00355 static void XN_CALLBACK_TYPE PrimaryIsNotSteady(XnUInt32 id, XnFloat dummy, void* cxt);
00356
00357 XnFloat m_fLastSteadyTime;
00358 XnFloat m_fLastPrimaryTime;
00359 XnFloat m_fSteadyTimeout;
00360
00361 XnUInt32 m_nLastPrimaryID;
00362 XnPoint3D m_GestureWhileTrackingThreshold;
00363
00364 void InitializeStatic();
00365 void FinalizeStatic();
00366 };
00367
00368 #endif