hmd_ovr.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /*
  2. * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
  4. */
  5. #include "bgfx_p.h"
  6. #if BGFX_CONFIG_USE_OVR
  7. #include "hmd_ovr.h"
  8. namespace bgfx
  9. {
  10. #define _OVR_CHECK(_call) \
  11. BX_MACRO_BLOCK_BEGIN \
  12. ovrResult __result__ = _call; \
  13. BX_CHECK(OVR_SUCCESS(__result__), #_call " FAILED %d", __result__); \
  14. BX_MACRO_BLOCK_END
  15. #if BGFX_CONFIG_DEBUG
  16. # define OVR_CHECK(_call) _OVR_CHECK(_call)
  17. #else
  18. # define OVR_CHECK(_call) _call
  19. #endif // BGFX_CONFIG_DEBUG
  20. VRImplOVR::VRImplOVR()
  21. : m_session(NULL)
  22. {
  23. }
  24. VRImplOVR::~VRImplOVR()
  25. {
  26. if (NULL != g_platformData.session)
  27. {
  28. return;
  29. }
  30. BX_CHECK(NULL == m_session, "OVR not shutdown properly.");
  31. }
  32. bool VRImplOVR::init()
  33. {
  34. if (NULL != g_platformData.session)
  35. {
  36. return true;
  37. }
  38. ovrResult initialized = ovr_Initialize(NULL);
  39. if (!OVR_SUCCESS(initialized))
  40. {
  41. BX_TRACE("Unable to initialize OVR runtime.");
  42. return false;
  43. }
  44. return true;
  45. }
  46. void VRImplOVR::shutdown()
  47. {
  48. if (NULL != g_platformData.session)
  49. {
  50. return;
  51. }
  52. ovr_Shutdown();
  53. }
  54. void VRImplOVR::connect(VRDesc* _desc)
  55. {
  56. if (NULL == g_platformData.session)
  57. {
  58. ovrGraphicsLuid luid;
  59. ovrResult result = ovr_Create(&m_session, &luid);
  60. if (!OVR_SUCCESS(result))
  61. {
  62. BX_TRACE("Failed to create OVR device.");
  63. return;
  64. }
  65. }
  66. else
  67. {
  68. m_session = (ovrSession)g_platformData.session;
  69. }
  70. ovrHmdDesc hmdDesc = ovr_GetHmdDesc(m_session);
  71. _desc->m_deviceType = hmdDesc.Type;
  72. _desc->m_refreshRate = hmdDesc.DisplayRefreshRate;
  73. _desc->m_deviceSize.m_w = hmdDesc.Resolution.w;
  74. _desc->m_deviceSize.m_h = hmdDesc.Resolution.h;
  75. BX_TRACE("OVR HMD: %s, %s, firmware: %d.%d"
  76. , hmdDesc.ProductName
  77. , hmdDesc.Manufacturer
  78. , hmdDesc.FirmwareMajor
  79. , hmdDesc.FirmwareMinor
  80. );
  81. ovrSizei eyeSize[2] =
  82. {
  83. ovr_GetFovTextureSize(m_session, ovrEye_Left, hmdDesc.DefaultEyeFov[0], 1.0f),
  84. ovr_GetFovTextureSize(m_session, ovrEye_Right, hmdDesc.DefaultEyeFov[0], 1.0f),
  85. };
  86. for (int eye = 0; eye < 2; ++eye)
  87. {
  88. BX_STATIC_ASSERT(sizeof(_desc->m_eyeFov[eye]) == sizeof(hmdDesc.DefaultEyeFov[eye]));
  89. bx::memCopy(&_desc->m_eyeFov[eye], &hmdDesc.DefaultEyeFov[eye], sizeof(_desc->m_eyeFov[eye]));
  90. _desc->m_eyeSize[eye].m_w = eyeSize[eye].w;
  91. _desc->m_eyeSize[eye].m_h = eyeSize[eye].h;
  92. }
  93. float neckOffset[2] = {OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL, OVR_DEFAULT_NECK_TO_EYE_VERTICAL};
  94. ovr_GetFloatArray(m_session, OVR_KEY_NECK_TO_EYE_DISTANCE, neckOffset, 2);
  95. _desc->m_neckOffset[0] = neckOffset[0];
  96. _desc->m_neckOffset[1] = neckOffset[1];
  97. // build constant layer settings
  98. m_renderLayer.Header.Type = ovrLayerType_EyeFov;
  99. m_renderLayer.Header.Flags = 0;
  100. m_renderLayer.Fov[0] = hmdDesc.DefaultEyeFov[0];
  101. m_renderLayer.Fov[1] = hmdDesc.DefaultEyeFov[1];
  102. m_renderLayer.Viewport[0].Pos.x = 0;
  103. m_renderLayer.Viewport[0].Pos.y = 0;
  104. m_renderLayer.Viewport[0].Size.w = _desc->m_eyeSize[0].m_w;
  105. m_renderLayer.Viewport[0].Size.h = _desc->m_eyeSize[0].m_h;
  106. m_renderLayer.Viewport[1].Pos.x = _desc->m_eyeSize[0].m_w+1;
  107. m_renderLayer.Viewport[1].Pos.y = 0;
  108. m_renderLayer.Viewport[1].Size.w = _desc->m_eyeSize[1].m_w;
  109. m_renderLayer.Viewport[1].Size.h = _desc->m_eyeSize[1].m_h;
  110. m_viewScale.HmdSpaceToWorldScaleInMeters = 1.0f;
  111. for (int eye = 0; eye < 2; ++eye)
  112. {
  113. ovrEyeRenderDesc erd = ovr_GetRenderDesc(m_session, static_cast<ovrEyeType>(eye), hmdDesc.DefaultEyeFov[eye]);
  114. m_viewScale.HmdToEyeOffset[eye] = erd.HmdToEyeOffset;
  115. m_eyeFov[eye] = erd.Fov;
  116. m_pixelsPerTanAngleAtCenter[eye] = erd.PixelsPerTanAngleAtCenter;
  117. }
  118. }
  119. void VRImplOVR::disconnect()
  120. {
  121. if (NULL != g_platformData.session)
  122. {
  123. return;
  124. }
  125. if (NULL != m_session)
  126. {
  127. ovr_Destroy(m_session);
  128. m_session = NULL;
  129. }
  130. }
  131. bool VRImplOVR::updateTracking(HMD& _hmd)
  132. {
  133. if (NULL == m_session)
  134. {
  135. return false;
  136. }
  137. ovr_GetEyePoses(m_session, 0, ovrTrue, m_viewScale.HmdToEyeOffset, m_renderLayer.RenderPose, &m_renderLayer.SensorSampleTime);
  138. for (int eye = 0; eye < 2; ++eye)
  139. {
  140. const ovrPosef& pose = m_renderLayer.RenderPose[eye];
  141. HMD::Eye& hmdEye = _hmd.eye[eye];
  142. hmdEye.rotation[0] = pose.Orientation.x;
  143. hmdEye.rotation[1] = pose.Orientation.y;
  144. hmdEye.rotation[2] = pose.Orientation.z;
  145. hmdEye.rotation[3] = pose.Orientation.w;
  146. hmdEye.translation[0] = pose.Position.x;
  147. hmdEye.translation[1] = pose.Position.y;
  148. hmdEye.translation[2] = pose.Position.z;
  149. hmdEye.viewOffset[0] = -m_viewScale.HmdToEyeOffset[eye].x;
  150. hmdEye.viewOffset[1] = -m_viewScale.HmdToEyeOffset[eye].y;
  151. hmdEye.viewOffset[2] = -m_viewScale.HmdToEyeOffset[eye].z;
  152. hmdEye.pixelsPerTanAngle[0] = m_pixelsPerTanAngleAtCenter[eye].x;
  153. hmdEye.pixelsPerTanAngle[1] = m_pixelsPerTanAngleAtCenter[eye].y;
  154. ovrMatrix4f projection = ovrMatrix4f_Projection(m_eyeFov[eye], 0.1f, 1000.0f, ovrProjection_LeftHanded);
  155. for (uint32_t ii = 0; ii < 4; ++ii)
  156. {
  157. for (uint32_t jj = 0; jj < 4; ++jj)
  158. {
  159. hmdEye.projection[4*ii + jj] = projection.M[jj][ii];
  160. }
  161. }
  162. }
  163. return true;
  164. }
  165. void VRImplOVR::updateInput(HMD& /* _hmd */)
  166. {
  167. }
  168. void VRImplOVR::recenter()
  169. {
  170. if (NULL != m_session)
  171. {
  172. ovr_RecenterTrackingOrigin(m_session);
  173. }
  174. }
  175. } // namespace bgfx
  176. #endif // BGFX_CONFIG_USE_OVR