razerHydraDevice.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #include "platform/input/razerHydra/razerHydraDevice.h"
  23. #include "platform/input/razerHydra/razerHydraData.h"
  24. #include "platform/input/razerHydra/razerHydraConstants.h"
  25. #include "platform/input/razerHydra/razerHydraFrameStore.h"
  26. #include "platform/platformInput.h"
  27. #include "core/module.h"
  28. #include "console/engineAPI.h"
  29. #include "math/mAngAxis.h"
  30. #include "math/mTransform.h"
  31. MODULE_BEGIN( RazerHydraDevice )
  32. MODULE_INIT_AFTER( InputEventManager )
  33. MODULE_SHUTDOWN_BEFORE( InputEventManager )
  34. MODULE_INIT
  35. {
  36. RazerHydraDevice::staticInit();
  37. ManagedSingleton< RazerHydraDevice >::createSingleton();
  38. if(RazerHydraDevice::smEnableDevice)
  39. {
  40. RAZERHYDRADEV->enable();
  41. }
  42. // Register the device with the Input Event Manager
  43. INPUTMGR->registerDevice(RAZERHYDRADEV);
  44. }
  45. MODULE_SHUTDOWN
  46. {
  47. INPUTMGR->unregisterDevice(RAZERHYDRADEV);
  48. ManagedSingleton< RazerHydraDevice >::deleteSingleton();
  49. }
  50. MODULE_END;
  51. bool RazerHydraDevice::smEnableDevice = true;
  52. bool RazerHydraDevice::smProcessWhenDocked = false;
  53. bool RazerHydraDevice::smSeparatePositionEvents = true;
  54. bool RazerHydraDevice::smCombinedPositionEvents = false;
  55. bool RazerHydraDevice::smRotationAsAxisEvents = false;
  56. F32 RazerHydraDevice::smMaximumAxisAngle = 25.0;
  57. bool RazerHydraDevice::smGenerateWholeFrameEvents = false;
  58. U32 RazerHydraDevice::RH_DOCKED[RazerHydraConstants::MaxControllers] = {0};
  59. U32 RazerHydraDevice::RH_POSX[RazerHydraConstants::MaxControllers] = {0};
  60. U32 RazerHydraDevice::RH_POSY[RazerHydraConstants::MaxControllers] = {0};
  61. U32 RazerHydraDevice::RH_POSZ[RazerHydraConstants::MaxControllers] = {0};
  62. U32 RazerHydraDevice::RH_POS[RazerHydraConstants::MaxControllers] = {0};
  63. U32 RazerHydraDevice::RH_ROT[RazerHydraConstants::MaxControllers] = {0};
  64. U32 RazerHydraDevice::RH_ROTAXISX[RazerHydraConstants::MaxControllers] = {0};
  65. U32 RazerHydraDevice::RH_ROTAXISY[RazerHydraConstants::MaxControllers] = {0};
  66. U32 RazerHydraDevice::RH_THUMBX[RazerHydraConstants::MaxControllers] = {0};
  67. U32 RazerHydraDevice::RH_THUMBY[RazerHydraConstants::MaxControllers] = {0};
  68. U32 RazerHydraDevice::RH_TRIGGER[RazerHydraConstants::MaxControllers] = {0};
  69. U32 RazerHydraDevice::RH_SHOULDER[RazerHydraConstants::MaxControllers] = {0};
  70. U32 RazerHydraDevice::RH_THUMB[RazerHydraConstants::MaxControllers] = {0};
  71. U32 RazerHydraDevice::RH_START[RazerHydraConstants::MaxControllers] = {0};
  72. U32 RazerHydraDevice::RH_1[RazerHydraConstants::MaxControllers] = {0};
  73. U32 RazerHydraDevice::RH_2[RazerHydraConstants::MaxControllers] = {0};
  74. U32 RazerHydraDevice::RH_3[RazerHydraConstants::MaxControllers] = {0};
  75. U32 RazerHydraDevice::RH_4[RazerHydraConstants::MaxControllers] = {0};
  76. U32 RazerHydraDevice::RH_FRAME = 0;
  77. RazerHydraDevice::RazerHydraDevice()
  78. {
  79. // From IInputDevice
  80. dStrcpy(mName, "razerhydra", 30);
  81. mDeviceType = INPUTMGR->getNextDeviceType();
  82. //
  83. mRazerHydraLib = NULL;
  84. mEnabled = false;
  85. mActive = false;
  86. mNumberActiveControllers = 0;
  87. mLastActiveCheck = 0;
  88. for(U32 i=0; i<RazerHydraConstants::MaxControllers; ++i)
  89. {
  90. for(U32 j=0; j<2; ++j)
  91. {
  92. mDataBuffer[i][j] = new RazerHyrdaControllerData();
  93. }
  94. mPrevData[i] = mDataBuffer[i][0];
  95. }
  96. buildCodeTable();
  97. }
  98. RazerHydraDevice::~RazerHydraDevice()
  99. {
  100. mRazerHydraLib = NULL;
  101. // Delete the controller data buffers
  102. for(U32 i=0; i<RazerHydraConstants::MaxControllers; ++i)
  103. {
  104. for(U32 j=0; j<2; ++j)
  105. {
  106. delete mDataBuffer[i][j];
  107. mDataBuffer[i][j] = NULL;
  108. mPrevData[i] = NULL;
  109. }
  110. }
  111. }
  112. void RazerHydraDevice::staticInit()
  113. {
  114. Con::addVariable("pref::RazerHydra::EnableDevice", TypeBool, &smEnableDevice,
  115. "@brief If true, the Razer Hydra device will be enabled, if present.\n\n"
  116. "@ingroup Game");
  117. Con::addVariable("RazerHydra::ProcessWhenDocked", TypeBool, &smProcessWhenDocked,
  118. "@brief If true, events will still be sent when a controller is docked.\n\n"
  119. "@ingroup Game");
  120. Con::addVariable("RazerHydra::SeparatePositionEvents", TypeBool, &smSeparatePositionEvents,
  121. "@brief If true, separate position events will be sent for each component.\n\n"
  122. "@ingroup Game");
  123. Con::addVariable("RazerHydra::CombinedPositionEvents", TypeBool, &smCombinedPositionEvents,
  124. "@brief If true, one position event will be sent that includes one component per argument.\n\n"
  125. "@ingroup Game");
  126. Con::addVariable("RazerHydra::RotationAsAxisEvents", TypeBool, &smRotationAsAxisEvents,
  127. "@brief If true, broadcast controller rotation as axis events.\n\n"
  128. "@ingroup Game");
  129. Con::addVariable("RazerHydra::MaximumAxisAngle", TypeF32, &smMaximumAxisAngle,
  130. "@brief The maximum controller angle when used as an axis event as measured from a vector pointing straight up (in degrees).\n\n"
  131. "Shoud range from 0 to 90 degrees.\n\n"
  132. "@ingroup Game");
  133. Con::addVariable("RazerHydra::GenerateWholeFrameEvents", TypeBool, &smGenerateWholeFrameEvents,
  134. "@brief Indicates that a whole frame event should be generated and frames should be buffered.\n\n"
  135. "@ingroup Game");
  136. }
  137. void RazerHydraDevice::buildCodeTable()
  138. {
  139. // Obtain all of the device codes
  140. for(U32 i=0; i<RazerHydraConstants::MaxControllers; ++i)
  141. {
  142. RH_DOCKED[i] = INPUTMGR->getNextDeviceCode();
  143. RH_POSX[i] = INPUTMGR->getNextDeviceCode();
  144. RH_POSY[i] = INPUTMGR->getNextDeviceCode();
  145. RH_POSZ[i] = INPUTMGR->getNextDeviceCode();
  146. RH_POS[i] = INPUTMGR->getNextDeviceCode();
  147. RH_ROT[i] = INPUTMGR->getNextDeviceCode();
  148. RH_ROTAXISX[i] = INPUTMGR->getNextDeviceCode();
  149. RH_ROTAXISY[i] = INPUTMGR->getNextDeviceCode();
  150. RH_THUMBX[i] = INPUTMGR->getNextDeviceCode();
  151. RH_THUMBY[i] = INPUTMGR->getNextDeviceCode();
  152. RH_TRIGGER[i] = INPUTMGR->getNextDeviceCode();
  153. RH_SHOULDER[i] = INPUTMGR->getNextDeviceCode();
  154. RH_THUMB[i] = INPUTMGR->getNextDeviceCode();
  155. RH_START[i] = INPUTMGR->getNextDeviceCode();
  156. RH_1[i] = INPUTMGR->getNextDeviceCode();
  157. RH_2[i] = INPUTMGR->getNextDeviceCode();
  158. RH_3[i] = INPUTMGR->getNextDeviceCode();
  159. RH_4[i] = INPUTMGR->getNextDeviceCode();
  160. }
  161. RH_FRAME = INPUTMGR->getNextDeviceCode();
  162. // Build out the virtual map
  163. char buffer[64];
  164. for(U32 i=0; i<RazerHydraConstants::MaxControllers; ++i)
  165. {
  166. dSprintf(buffer, 64, "rh_docked%d", i);
  167. INPUTMGR->addVirtualMap( buffer, SI_BUTTON, RH_DOCKED[i] );
  168. dSprintf(buffer, 64, "rh_posx%d", i);
  169. INPUTMGR->addVirtualMap( buffer, SI_FLOAT, RH_POSX[i] );
  170. dSprintf(buffer, 64, "rh_posy%d", i);
  171. INPUTMGR->addVirtualMap( buffer, SI_FLOAT, RH_POSY[i] );
  172. dSprintf(buffer, 64, "rh_posz%d", i);
  173. INPUTMGR->addVirtualMap( buffer, SI_FLOAT, RH_POSZ[i] );
  174. dSprintf(buffer, 64, "rh_pos%d", i);
  175. INPUTMGR->addVirtualMap( buffer, SI_POS, RH_POS[i] );
  176. dSprintf(buffer, 64, "rh_rot%d", i);
  177. INPUTMGR->addVirtualMap( buffer, SI_ROT, RH_ROT[i] );
  178. dSprintf(buffer, 64, "rh_rotaxisx%d", i);
  179. INPUTMGR->addVirtualMap( buffer, SI_AXIS, RH_ROTAXISX[i] );
  180. dSprintf(buffer, 64, "rh_rotaxisy%d", i);
  181. INPUTMGR->addVirtualMap( buffer, SI_AXIS, RH_ROTAXISY[i] );
  182. dSprintf(buffer, 64, "rh_thumbx%d", i);
  183. INPUTMGR->addVirtualMap( buffer, SI_AXIS, RH_THUMBX[i] );
  184. dSprintf(buffer, 64, "rh_thumby%d", i);
  185. INPUTMGR->addVirtualMap( buffer, SI_AXIS, RH_THUMBY[i] );
  186. dSprintf(buffer, 64, "rh_trigger%d", i);
  187. INPUTMGR->addVirtualMap( buffer, SI_AXIS, RH_TRIGGER[i] );
  188. dSprintf(buffer, 64, "rh_shoulder%d", i);
  189. INPUTMGR->addVirtualMap( buffer, SI_BUTTON, RH_SHOULDER[i] );
  190. dSprintf(buffer, 64, "rh_thumb%d", i);
  191. INPUTMGR->addVirtualMap( buffer, SI_BUTTON, RH_THUMB[i] );
  192. dSprintf(buffer, 64, "rh_start%d", i);
  193. INPUTMGR->addVirtualMap( buffer, SI_BUTTON, RH_START[i] );
  194. dSprintf(buffer, 64, "rh_1button%d", i);
  195. INPUTMGR->addVirtualMap( buffer, SI_BUTTON, RH_1[i] );
  196. dSprintf(buffer, 64, "rh_2button%d", i);
  197. INPUTMGR->addVirtualMap( buffer, SI_BUTTON, RH_2[i] );
  198. dSprintf(buffer, 64, "rh_3button%d", i);
  199. INPUTMGR->addVirtualMap( buffer, SI_BUTTON, RH_3[i] );
  200. dSprintf(buffer, 64, "rh_4button%d", i);
  201. INPUTMGR->addVirtualMap( buffer, SI_BUTTON, RH_4[i] );
  202. }
  203. AddInputVirtualMap( rh_frame, SI_INT, RH_FRAME );
  204. }
  205. bool RazerHydraDevice::enable()
  206. {
  207. // Start off with disabling the device if it is already enabled
  208. disable();
  209. // Dynamically load the Razer Hydra library and set up function pointers
  210. #ifdef LOG_INPUT
  211. Input::log( "Enabling Razer Hydra...\n" );
  212. #endif
  213. const char* dllName;
  214. #ifdef TORQUE_OS_WIN
  215. #ifdef TORQUE_DEBUG
  216. dllName = "sixensed.dll";
  217. #else
  218. dllName = "sixense.dll";
  219. #endif
  220. #else
  221. #ifdef LOG_INPUT
  222. Input::log( "...platform not supported for Razer Hydra\n" );
  223. #endif
  224. return;
  225. #endif
  226. mRazerHydraLib = OsLoadLibrary( dllName );
  227. if(mRazerHydraLib)
  228. {
  229. #ifdef LOG_INPUT
  230. Input::log( "Razer Hydra library loaded.\n" );
  231. #endif
  232. Con::printf("Razer Hydra Init:");
  233. // Obtain library function pointers
  234. mfnSixenseInit = (FN_SixenseInit) mRazerHydraLib->bind( "sixenseInit" );
  235. mfnSixenseExit = (FN_SixenseExit) mRazerHydraLib->bind( "sixenseExit" );
  236. mfnSixenseGetMaxBases = (FN_SixenseGetMaxBases) mRazerHydraLib->bind( "sixenseGetMaxBases" );
  237. mfnSixenseSetActiveBase = (FN_SixenseSetActiveBase) mRazerHydraLib->bind( "sixenseSetActiveBase" );
  238. mfnSixenseIsBaseConnected = (FN_SixenseIsBaseConnected) mRazerHydraLib->bind( "sixenseIsBaseConnected" );
  239. mfnSixenseGetMaxControllers = (FN_SixenseGetMaxControllers) mRazerHydraLib->bind( "sixenseGetMaxControllers" );
  240. mfnSixenseIsControllerEnabled = (FN_SixenseIsControllerEnabled) mRazerHydraLib->bind( "sixenseIsControllerEnabled" );
  241. mfnSixenseGetNumActiveControllers = (FN_SixenseGetNumActiveControllers) mRazerHydraLib->bind( "sixenseGetNumActiveControllers" );
  242. mfnSixenseGetHistorySize = (FN_SixenseGetHistorySize) mRazerHydraLib->bind( "sixenseGetHistorySize" );
  243. mfnSixenseGetData = (FN_SixenseGetData) mRazerHydraLib->bind( "sixenseGetData" );
  244. mfnSixenseGetAllData = (FN_SixenseGetAllData) mRazerHydraLib->bind( "sixenseGetAllData" );
  245. mfnSixenseGetNewestData = (FN_SixenseGetNewestData) mRazerHydraLib->bind( "sixenseGetNewestData" );
  246. mfnSixenseGetAllNewestData = (FN_SixenseGetAllNewestData) mRazerHydraLib->bind( "sixenseGetAllNewestData" );
  247. mfnSixenseSetHemisphereTrackingMode = (FN_SixenseSetHemisphereTrackingMode) mRazerHydraLib->bind( "sixenseSetHemisphereTrackingMode" );
  248. mfnSixenseGetHemisphereTrackingMode = (FN_SixenseGetHemisphereTrackingMode) mRazerHydraLib->bind( "sixenseGetHemisphereTrackingMode" );
  249. mfnSixenseAutoEnableHemisphereTracking = (FN_SixenseAutoEnableHemisphereTracking) mRazerHydraLib->bind( "sixenseAutoEnableHemisphereTracking" );
  250. mfnSixenseSetHighPriorityBindingEnabled = (FN_SixenseSetHighPriorityBindingEnabled) mRazerHydraLib->bind( "sixenseSetHighPriorityBindingEnabled" );
  251. mfnSixenseGetHighPriorityBindingEnabled = (FN_SixenseGetHighPriorityBindingEnabled) mRazerHydraLib->bind( "sixenseGetHighPriorityBindingEnabled" );
  252. mfnSixenseTriggerVibration = (FN_SixenseTriggerVibration) mRazerHydraLib->bind( "sixenseTriggerVibration" );
  253. mfnSixenseSetFilterEnabled = (FN_SixenseSetFilterEnabled) mRazerHydraLib->bind( "sixenseSetFilterEnabled" );
  254. mfnSixenseGetFilterEnabled = (FN_SixenseGetFilterEnabled) mRazerHydraLib->bind( "sixenseGetFilterEnabled" );
  255. mfnSixenseSetFilterParams = (FN_SixenseSetFilterParams) mRazerHydraLib->bind( "sixenseSetFilterParams" );
  256. mfnSixenseGetFilterParams = (FN_SixenseGetFilterParams) mRazerHydraLib->bind( "sixenseGetFilterParams" );
  257. mfnSixenseSetBaseColor = (FN_SixenseSetBaseColor) mRazerHydraLib->bind( "sixenseSetBaseColor" );
  258. mfnSixenseGetBaseColor = (FN_SixenseGetBaseColor) mRazerHydraLib->bind( "sixenseGetBaseColor" );
  259. // Init the sixense library
  260. S32 result = mfnSixenseInit();
  261. if(result == SIXENSE_FAILURE)
  262. {
  263. // Problem with starting the library
  264. Con::printf(" Sixense library startup failure");
  265. mRazerHydraLib = NULL;
  266. mEnabled = false;
  267. mActive = false;
  268. return false;
  269. }
  270. // Retrieve some information about the Hydra
  271. mMaximumBases = mfnSixenseGetMaxBases();
  272. Con::printf(" Max bases: %d", mMaximumBases);
  273. mMaximumControllers = mfnSixenseGetMaxControllers();
  274. Con::printf(" Max controllers: %d", mMaximumControllers);
  275. mEnabled = true;
  276. if(checkControllers())
  277. {
  278. Con::printf(" Active controllers: %d", mNumberActiveControllers);
  279. mActive = true;
  280. }
  281. else
  282. {
  283. Con::printf(" Controllers not yet found. Starting to poll.");
  284. mLastActiveCheck = Platform::getRealMilliseconds();
  285. mActive = false;
  286. }
  287. Con::printf("");
  288. return true;
  289. }
  290. else
  291. {
  292. #ifdef LOG_INPUT
  293. Input::log( "Razer Hydra library was not found.\n" );
  294. #endif
  295. Con::errorf("Razer Hydra library was not found.");
  296. mEnabled = false;
  297. mActive = false;
  298. }
  299. return false;
  300. }
  301. void RazerHydraDevice::disable()
  302. {
  303. if(mRazerHydraLib)
  304. {
  305. // Shutdown the sixense library
  306. mfnSixenseExit();
  307. mRazerHydraLib = NULL;
  308. }
  309. mEnabled = false;
  310. }
  311. bool RazerHydraDevice::process()
  312. {
  313. if(!mEnabled)
  314. return false;
  315. //Con::printf("RazerHydraDevice::process()");
  316. if(!mActive)
  317. {
  318. // Only perform a check on a periodic basis
  319. S32 time = Platform::getRealMilliseconds();
  320. if((time - mLastActiveCheck) < RazerHydraConstants::HydraActiveCheckFreq)
  321. return false;
  322. mLastActiveCheck = time;
  323. if(checkControllers())
  324. {
  325. Con::printf("Razer Hydra now has %d active controllers", mNumberActiveControllers);
  326. mActive = true;
  327. }
  328. else
  329. {
  330. return false;
  331. }
  332. }
  333. else if(!checkControllers())
  334. {
  335. // We no longer have active controllers
  336. Con::printf("Razer Hydra now has NO active controllers");
  337. mLastActiveCheck = Platform::getRealMilliseconds();
  338. mActive = false;
  339. return false;
  340. }
  341. //Build the maximum axis angle to be passed into the RazerHyrdaControllerData::setData()
  342. F32 maxAxisRadius = mSin(mDegToRad(smMaximumAxisAngle));
  343. // Get the controller data
  344. mfnSixenseSetActiveBase(RazerHydraConstants::DefaultHydraBase);
  345. sixenseAllControllerData acd;
  346. mfnSixenseGetAllNewestData(&acd);
  347. // Store the current data from each controller and compare with previous data
  348. U32 diff[RazerHydraConstants::MaxControllers];
  349. U32 metaDiff[RazerHydraConstants::MaxControllers];
  350. RazerHyrdaControllerData* currentBuffer[RazerHydraConstants::MaxControllers];
  351. for(U32 i=0; i<RazerHydraConstants::MaxControllers; ++i)
  352. {
  353. currentBuffer[i] = (mPrevData[i] == mDataBuffer[i][0]) ? mDataBuffer[i][1] : mDataBuffer[i][0];
  354. currentBuffer[i]->setData(acd.controllers[i], maxAxisRadius);
  355. diff[i] = mPrevData[i]->compare(currentBuffer[i]);
  356. metaDiff[i] = mPrevData[i]->compareMeta(currentBuffer[i]);
  357. }
  358. // Update the previous data pointers. We do this here in case someone calls our
  359. // console functions during one of the input events below.
  360. mPrevData[0] = currentBuffer[0];
  361. mPrevData[1] = currentBuffer[1];
  362. // Process each controller's meta data.
  363. for(U32 i=0; i<RazerHydraConstants::MaxControllers; ++i)
  364. {
  365. // Docked
  366. if(metaDiff[i] != RazerHyrdaControllerData::METADIFF_NONE)
  367. {
  368. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_BUTTON, RH_DOCKED[i], currentBuffer[i]->mIsDocked ? SI_MAKE : SI_BREAK, currentBuffer[i]->mIsDocked ? 1.0f : 0.0f);
  369. }
  370. // Position, rotation and buttons
  371. if(diff[i] != RazerHyrdaControllerData::DIFF_NONE && (!currentBuffer[i]->mIsDocked || smProcessWhenDocked && currentBuffer[i]->mIsDocked))
  372. {
  373. // Position
  374. if(smSeparatePositionEvents)
  375. {
  376. if(diff[i] & RazerHyrdaControllerData::DIFF_POSX)
  377. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_FLOAT, RH_POSX[i], SI_MOVE, currentBuffer[i]->mPos[0]);
  378. if(diff[i] & RazerHyrdaControllerData::DIFF_POSY)
  379. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_FLOAT, RH_POSY[i], SI_MOVE, currentBuffer[i]->mPos[1]);
  380. if(diff[i] & RazerHyrdaControllerData::DIFF_POSZ)
  381. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_FLOAT, RH_POSZ[i], SI_MOVE, currentBuffer[i]->mPos[2]);
  382. }
  383. if(smCombinedPositionEvents)
  384. {
  385. if(diff[i] & RazerHyrdaControllerData::DIFF_POSX || diff[i] & RazerHyrdaControllerData::DIFF_POSY || diff[i] & RazerHyrdaControllerData::DIFF_POSZ)
  386. {
  387. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_POS, RH_POS[i], SI_MOVE, currentBuffer[i]->mPosPoint);
  388. }
  389. }
  390. // Rotation
  391. if(diff[i] & RazerHyrdaControllerData::DIFF_ROT)
  392. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_ROT, RH_ROT[i], SI_MOVE, currentBuffer[i]->mRotQuat);
  393. // Thumb stick
  394. if(diff[i] & RazerHyrdaControllerData::DIFF_AXISX)
  395. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_AXIS, RH_THUMBX[i], SI_MOVE, currentBuffer[i]->mThumbStick[0]);
  396. if(diff[i] & RazerHyrdaControllerData::DIFF_AXISY)
  397. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_AXIS, RH_THUMBY[i], SI_MOVE, currentBuffer[i]->mThumbStick[1]);
  398. // Trigger
  399. if(diff[i] & RazerHyrdaControllerData::DIFF_TRIGGER)
  400. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_AXIS, RH_TRIGGER[i], SI_MOVE, currentBuffer[i]->mTrigger);
  401. // Shoulder button
  402. if(diff[i] & RazerHyrdaControllerData::DIFF_BUTTON_SHOULDER)
  403. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_BUTTON, RH_SHOULDER[i], currentBuffer[i]->mShoulder ? SI_MAKE : SI_BREAK, currentBuffer[i]->mShoulder ? 1.0f : 0.0f);
  404. // Thumb button
  405. if(diff[i] & RazerHyrdaControllerData::DIFF_BUTTON_THUMB)
  406. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_BUTTON, RH_THUMB[i], currentBuffer[i]->mThumb ? SI_MAKE : SI_BREAK, currentBuffer[i]->mThumb ? 1.0f : 0.0f);
  407. // Start button
  408. if(diff[i] & RazerHyrdaControllerData::DIFF_BUTTON_START)
  409. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_BUTTON, RH_START[i], currentBuffer[i]->mStart ? SI_MAKE : SI_BREAK, currentBuffer[i]->mStart ? 1.0f : 0.0f);
  410. // Button 1
  411. if(diff[i] & RazerHyrdaControllerData::DIFF_BUTTON1)
  412. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_BUTTON, RH_1[i], currentBuffer[i]->mButton1 ? SI_MAKE : SI_BREAK, currentBuffer[i]->mButton1 ? 1.0f : 0.0f);
  413. // Button 2
  414. if(diff[i] & RazerHyrdaControllerData::DIFF_BUTTON2)
  415. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_BUTTON, RH_2[i], currentBuffer[i]->mButton2 ? SI_MAKE : SI_BREAK, currentBuffer[i]->mButton2 ? 1.0f : 0.0f);
  416. // Button 3
  417. if(diff[i] & RazerHyrdaControllerData::DIFF_BUTTON3)
  418. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_BUTTON, RH_3[i], currentBuffer[i]->mButton3 ? SI_MAKE : SI_BREAK, currentBuffer[i]->mButton3 ? 1.0f : 0.0f);
  419. // Button 4
  420. if(diff[i] & RazerHyrdaControllerData::DIFF_BUTTON4)
  421. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_BUTTON, RH_4[i], currentBuffer[i]->mButton4 ? SI_MAKE : SI_BREAK, currentBuffer[i]->mButton4 ? 1.0f : 0.0f);
  422. }
  423. // Left rotation as axis. Done here as we still need to send events even when docked.
  424. if(smRotationAsAxisEvents && diff[i] & RazerHyrdaControllerData::DIFF_ROTAXIS)
  425. {
  426. if(diff[i] & RazerHyrdaControllerData::DIFF_ROTAXISX)
  427. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_AXIS, RH_ROTAXISX[i], SI_MOVE, currentBuffer[i]->mRotAxis.x);
  428. if(diff[i] & RazerHyrdaControllerData::DIFF_ROTAXISY)
  429. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_AXIS, RH_ROTAXISY[i], SI_MOVE, currentBuffer[i]->mRotAxis.y);
  430. }
  431. }
  432. // Send out whole frame event, but only if the special frame group is defined
  433. if(smGenerateWholeFrameEvents && RazerHydraFrameStore::isFrameGroupDefined())
  434. {
  435. S32 id = RAZERHYDRAFS->generateNewFrame(acd, maxAxisRadius);
  436. if(id != 0)
  437. {
  438. INPUTMGR->buildInputEvent(mDeviceType, RazerHydraConstants::DefaultHydraBase, SI_INT, RH_FRAME, SI_VALUE, id);
  439. }
  440. }
  441. return true;
  442. }
  443. bool RazerHydraDevice::checkControllers()
  444. {
  445. if(!mEnabled)
  446. return false;
  447. bool hasBase = (mfnSixenseIsBaseConnected(RazerHydraConstants::DefaultHydraBase) == 1);
  448. if(!hasBase)
  449. {
  450. mNumberActiveControllers = 0;
  451. return false;
  452. }
  453. mfnSixenseSetActiveBase(RazerHydraConstants::DefaultHydraBase);
  454. mNumberActiveControllers = mfnSixenseGetNumActiveControllers();
  455. if(mNumberActiveControllers < 1)
  456. return false;
  457. return true;
  458. }
  459. bool RazerHydraDevice::isControllerDocked(U32 controller)
  460. {
  461. if(!mEnabled || !mActive)
  462. return true;
  463. if(controller >= RazerHydraConstants::MaxControllers)
  464. return true;
  465. // Results are based on the last retrieved data from the device
  466. return mPrevData[controller]->mIsDocked || !mPrevData[controller]->mDataSet;
  467. }
  468. const Point3F& RazerHydraDevice::getControllerPosition(U32 controller)
  469. {
  470. if(!mEnabled || !mActive)
  471. return Point3F::Zero;
  472. if(controller >= RazerHydraConstants::MaxControllers)
  473. return Point3F::Zero;
  474. // Results are based on the last retrieved data from the device
  475. return mPrevData[controller]->mPosPoint;
  476. }
  477. const QuatF& RazerHydraDevice::getControllerRotation(U32 controller)
  478. {
  479. if(!mEnabled || !mActive)
  480. return QuatF::Identity;
  481. if(controller >= RazerHydraConstants::MaxControllers)
  482. return QuatF::Identity;
  483. // Results are based on the last retrieved data from the device
  484. return mPrevData[controller]->mRotQuat;
  485. }
  486. //-----------------------------------------------------------------------------
  487. DefineEngineFunction(isRazerHydraActive, bool, (),,
  488. "@brief Used to determine if the Razer Hydra input device active\n\n"
  489. "The Razer Hydra input device is considered active when the support library has been "
  490. "loaded and the controller has been found.\n\n"
  491. "@return True if the Razer Hydra input device is active.\n"
  492. "@ingroup Game")
  493. {
  494. if(!ManagedSingleton<RazerHydraDevice>::instanceOrNull())
  495. {
  496. return false;
  497. }
  498. return RAZERHYDRADEV->isActive();
  499. }
  500. DefineEngineFunction(isRazerHydraControllerDocked, bool, (S32 controller),,
  501. "@brief Used to determine if the given Razer Hydra controller is docked\n\n"
  502. "@param controller Controller number to check.\n"
  503. "@return True if the given Razer Hydra controller is docked. Also returns true if "
  504. "the input device is not found or active.\n"
  505. "@ingroup Game")
  506. {
  507. if(!ManagedSingleton<RazerHydraDevice>::instanceOrNull())
  508. {
  509. return true;
  510. }
  511. return RAZERHYDRADEV->isControllerDocked(controller);
  512. }
  513. DefineEngineFunction(getRazerHydraControllerPos, Point3F, (S32 controller),,
  514. "@brief Get the given Razer Hydra controller's last position\n\n"
  515. "@param controller Controller number to check.\n"
  516. "@return A Point3F containing the last known position.\n"
  517. "@ingroup Game")
  518. {
  519. if(!ManagedSingleton<RazerHydraDevice>::instanceOrNull())
  520. {
  521. return Point3F::Zero;
  522. }
  523. return RAZERHYDRADEV->getControllerPosition(controller);
  524. }
  525. DefineEngineFunction(getRazerHydraControllerRot, AngAxisF, (S32 controller),,
  526. "@brief Get the given Razer Hydra controller's last rotation\n\n"
  527. "@param controller Controller number to check.\n"
  528. "@return A AngAxisF containing the last known rotation.\n"
  529. "@ingroup Game")
  530. {
  531. AngAxisF aa(Point3F(0, 0, 1), 0);
  532. if(!ManagedSingleton<RazerHydraDevice>::instanceOrNull())
  533. {
  534. return aa;
  535. }
  536. const QuatF& qa = RAZERHYDRADEV->getControllerRotation(controller);
  537. aa.set(qa);
  538. aa.axis.normalize();
  539. return aa;
  540. }
  541. DefineEngineFunction(getRazerHydraControllerTransform, TransformF, (S32 controller),,
  542. "@brief Get the given Razer Hydra controller's last transform\n\n"
  543. "@param controller Controller number to check.\n"
  544. "@return A TransformF containing the last known transform.\n"
  545. "@ingroup Game")
  546. {
  547. TransformF trans;
  548. if(!ManagedSingleton<RazerHydraDevice>::instanceOrNull())
  549. {
  550. return trans;
  551. }
  552. const Point3F& pos = RAZERHYDRADEV->getControllerPosition(controller);
  553. const QuatF& qa = RAZERHYDRADEV->getControllerRotation(controller);
  554. AngAxisF aa(qa);
  555. aa.axis.normalize();
  556. trans.set(pos, aa);
  557. return trans;
  558. }