NITE 1.4.1 - API Reference
|
00001 /******************************************************************************* 00002 * * 00003 * PrimeSense NITE 1.3 * 00004 * Copyright (C) 2010 PrimeSense Ltd. * 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