ovr.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. /*
  2. * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
  3. * License: http://www.opensource.org/licenses/BSD-2-Clause
  4. */
  5. #include "ovr.h"
  6. #if BGFX_CONFIG_USE_OVR
  7. namespace bgfx
  8. {
  9. #if OVR_VERSION <= OVR_VERSION_050
  10. # define OVR_EYE_BUFFER 100
  11. #else
  12. # define OVR_EYE_BUFFER 8
  13. #endif // OVR_VERSION...
  14. OVR::OVR()
  15. : m_hmd(NULL)
  16. , m_isenabled(false)
  17. , m_debug(false)
  18. {
  19. }
  20. OVR::~OVR()
  21. {
  22. BX_CHECK(NULL == m_hmd, "OVR not shutdown properly.");
  23. }
  24. void OVR::init()
  25. {
  26. bool initialized = !!ovr_Initialize();
  27. BX_WARN(initialized, "Unable to create OVR device.");
  28. if (!initialized)
  29. {
  30. return;
  31. }
  32. m_hmd = ovrHmd_Create(0);
  33. if (NULL == m_hmd)
  34. {
  35. m_hmd = ovrHmd_CreateDebug(ovrHmd_DK2);
  36. BX_WARN(NULL != m_hmd, "Unable to create OVR device.");
  37. if (NULL == m_hmd)
  38. {
  39. return;
  40. }
  41. }
  42. BX_TRACE("HMD: %s, %s, firmware: %d.%d"
  43. , m_hmd->ProductName
  44. , m_hmd->Manufacturer
  45. , m_hmd->FirmwareMajor
  46. , m_hmd->FirmwareMinor
  47. );
  48. ovrSizei sizeL = ovrHmd_GetFovTextureSize(m_hmd, ovrEye_Left, m_hmd->DefaultEyeFov[0], 1.0f);
  49. ovrSizei sizeR = ovrHmd_GetFovTextureSize(m_hmd, ovrEye_Right, m_hmd->DefaultEyeFov[1], 1.0f);
  50. m_rtSize.w = sizeL.w + sizeR.w + OVR_EYE_BUFFER;
  51. m_rtSize.h = bx::uint32_max(sizeL.h, sizeR.h);
  52. m_warning = true;
  53. }
  54. void OVR::shutdown()
  55. {
  56. BX_CHECK(!m_isenabled, "HMD not disabled.");
  57. ovrHmd_Destroy(m_hmd);
  58. m_hmd = NULL;
  59. ovr_Shutdown();
  60. }
  61. void OVR::getViewport(uint8_t _eye, Rect* _viewport)
  62. {
  63. _viewport->m_x = _eye * (m_rtSize.w + OVR_EYE_BUFFER + 1)/2;
  64. _viewport->m_y = 0;
  65. _viewport->m_width = (m_rtSize.w - OVR_EYE_BUFFER)/2;
  66. _viewport->m_height = m_rtSize.h;
  67. }
  68. bool OVR::postReset(void* _nwh, ovrRenderAPIConfig* _config, bool _debug)
  69. {
  70. if (_debug)
  71. {
  72. switch (_config->Header.API)
  73. {
  74. #if BGFX_CONFIG_RENDERER_DIRECT3D11
  75. case ovrRenderAPI_D3D11:
  76. {
  77. ovrD3D11ConfigData* data = (ovrD3D11ConfigData*)_config;
  78. # if OVR_VERSION > OVR_VERSION_043
  79. m_rtSize = data->Header.BackBufferSize;
  80. # else
  81. m_rtSize = data->Header.RTSize;
  82. # endif // OVR_VERSION > OVR_VERSION_043
  83. }
  84. break;
  85. #endif // BGFX_CONFIG_RENDERER_DIRECT3D11
  86. #if BGFX_CONFIG_RENDERER_OPENGL
  87. case ovrRenderAPI_OpenGL:
  88. {
  89. ovrGLConfigData* data = (ovrGLConfigData*)_config;
  90. # if OVR_VERSION > OVR_VERSION_043
  91. m_rtSize = data->Header.BackBufferSize;
  92. # else
  93. m_rtSize = data->Header.RTSize;
  94. # endif // OVR_VERSION > OVR_VERSION_043
  95. }
  96. break;
  97. #endif // BGFX_CONFIG_RENDERER_OPENGL
  98. case ovrRenderAPI_None:
  99. default:
  100. BX_CHECK(false, "You should not be here!");
  101. break;
  102. }
  103. m_debug = true;
  104. return false;
  105. }
  106. if (NULL == m_hmd)
  107. {
  108. return false;
  109. }
  110. m_isenabled = true;
  111. ovrBool result;
  112. result = ovrHmd_AttachToWindow(m_hmd, _nwh, NULL, NULL);
  113. if (!result) { goto ovrError; }
  114. ovrFovPort eyeFov[2] = { m_hmd->DefaultEyeFov[0], m_hmd->DefaultEyeFov[1] };
  115. result = ovrHmd_ConfigureRendering(m_hmd
  116. , _config
  117. , 0
  118. #if OVR_VERSION < OVR_VERSION_050
  119. | ovrDistortionCap_Chromatic // permanently enabled >= v5.0
  120. #endif
  121. | ovrDistortionCap_Vignette
  122. | ovrDistortionCap_TimeWarp
  123. | ovrDistortionCap_Overdrive
  124. | ovrDistortionCap_NoRestore
  125. | ovrDistortionCap_HqDistortion
  126. , eyeFov
  127. , m_erd
  128. );
  129. if (!result) { goto ovrError; }
  130. ovrHmd_SetEnabledCaps(m_hmd
  131. , 0
  132. | ovrHmdCap_LowPersistence
  133. | ovrHmdCap_DynamicPrediction
  134. );
  135. result = ovrHmd_ConfigureTracking(m_hmd
  136. , 0
  137. | ovrTrackingCap_Orientation
  138. | ovrTrackingCap_MagYawCorrection
  139. | ovrTrackingCap_Position
  140. , 0
  141. );
  142. if (!result)
  143. {
  144. ovrError:
  145. BX_TRACE("Failed to initialize OVR.");
  146. m_isenabled = false;
  147. return false;
  148. }
  149. m_warning = true;
  150. return true;
  151. }
  152. void OVR::postReset(const ovrTexture& _texture)
  153. {
  154. if (NULL != m_hmd)
  155. {
  156. m_texture[0] = _texture;
  157. m_texture[1] = _texture;
  158. ovrRecti rect;
  159. rect.Pos.x = 0;
  160. rect.Pos.y = 0;
  161. rect.Size.w = (m_rtSize.w - OVR_EYE_BUFFER)/2;
  162. rect.Size.h = m_rtSize.h;
  163. m_texture[0].Header.RenderViewport = rect;
  164. rect.Pos.x += rect.Size.w + OVR_EYE_BUFFER;
  165. m_texture[1].Header.RenderViewport = rect;
  166. m_timing = ovrHmd_BeginFrame(m_hmd, 0);
  167. #if OVR_VERSION > OVR_VERSION_042
  168. m_pose[0] = ovrHmd_GetHmdPosePerEye(m_hmd, ovrEye_Left);
  169. m_pose[1] = ovrHmd_GetHmdPosePerEye(m_hmd, ovrEye_Right);
  170. #else
  171. m_pose[0] = ovrHmd_GetEyePose(m_hmd, ovrEye_Left);
  172. m_pose[1] = ovrHmd_GetEyePose(m_hmd, ovrEye_Right);
  173. #endif // OVR_VERSION > OVR_VERSION_042
  174. }
  175. }
  176. void OVR::preReset()
  177. {
  178. if (m_isenabled)
  179. {
  180. ovrHmd_EndFrame(m_hmd, m_pose, m_texture);
  181. ovrHmd_AttachToWindow(m_hmd, NULL, NULL, NULL);
  182. ovrHmd_ConfigureRendering(m_hmd, NULL, 0, NULL, NULL);
  183. m_isenabled = false;
  184. }
  185. m_debug = false;
  186. }
  187. bool OVR::swap(HMD& _hmd)
  188. {
  189. _hmd.flags = BGFX_HMD_NONE;
  190. if (NULL != m_hmd)
  191. {
  192. _hmd.flags |= BGFX_HMD_DEVICE_RESOLUTION;
  193. _hmd.deviceWidth = m_hmd->Resolution.w;
  194. _hmd.deviceHeight = m_hmd->Resolution.h;
  195. }
  196. if (!m_isenabled)
  197. {
  198. return false;
  199. }
  200. _hmd.flags |= BGFX_HMD_RENDERING;
  201. ovrHmd_EndFrame(m_hmd, m_pose, m_texture);
  202. if (m_warning)
  203. {
  204. m_warning = !ovrHmd_DismissHSWDisplay(m_hmd);
  205. }
  206. m_timing = ovrHmd_BeginFrame(m_hmd, 0);
  207. #if OVR_VERSION > OVR_VERSION_042
  208. m_pose[0] = ovrHmd_GetHmdPosePerEye(m_hmd, ovrEye_Left);
  209. m_pose[1] = ovrHmd_GetHmdPosePerEye(m_hmd, ovrEye_Right);
  210. #else
  211. m_pose[0] = ovrHmd_GetEyePose(m_hmd, ovrEye_Left);
  212. m_pose[1] = ovrHmd_GetEyePose(m_hmd, ovrEye_Right);
  213. #endif // OVR_VERSION > OVR_VERSION_042
  214. getEyePose(_hmd);
  215. return true;
  216. }
  217. void OVR::recenter()
  218. {
  219. if (NULL != m_hmd)
  220. {
  221. ovrHmd_RecenterPose(m_hmd);
  222. }
  223. }
  224. void OVR::getEyePose(HMD& _hmd)
  225. {
  226. if (NULL != m_hmd)
  227. {
  228. for (int ii = 0; ii < 2; ++ii)
  229. {
  230. const ovrPosef& pose = m_pose[ii];
  231. HMD::Eye& eye = _hmd.eye[ii];
  232. eye.rotation[0] = pose.Orientation.x;
  233. eye.rotation[1] = pose.Orientation.y;
  234. eye.rotation[2] = pose.Orientation.z;
  235. eye.rotation[3] = pose.Orientation.w;
  236. eye.translation[0] = pose.Position.x;
  237. eye.translation[1] = pose.Position.y;
  238. eye.translation[2] = pose.Position.z;
  239. const ovrEyeRenderDesc& erd = m_erd[ii];
  240. eye.fov[0] = erd.Fov.UpTan;
  241. eye.fov[1] = erd.Fov.DownTan;
  242. eye.fov[2] = erd.Fov.LeftTan;
  243. eye.fov[3] = erd.Fov.RightTan;
  244. #if OVR_VERSION > OVR_VERSION_042
  245. eye.viewOffset[0] = erd.HmdToEyeViewOffset.x;
  246. eye.viewOffset[1] = erd.HmdToEyeViewOffset.y;
  247. eye.viewOffset[2] = erd.HmdToEyeViewOffset.z;
  248. #else
  249. eye.viewOffset[0] = erd.ViewAdjust.x;
  250. eye.viewOffset[1] = erd.ViewAdjust.y;
  251. eye.viewOffset[2] = erd.ViewAdjust.z;
  252. #endif // OVR_VERSION > OVR_VERSION_042
  253. eye.pixelsPerTanAngle[0] = erd.PixelsPerTanAngleAtCenter.x;
  254. eye.pixelsPerTanAngle[1] = erd.PixelsPerTanAngleAtCenter.y;
  255. }
  256. }
  257. else
  258. {
  259. for (int ii = 0; ii < 2; ++ii)
  260. {
  261. _hmd.eye[ii].rotation[0] = 0.0f;
  262. _hmd.eye[ii].rotation[1] = 0.0f;
  263. _hmd.eye[ii].rotation[2] = 0.0f;
  264. _hmd.eye[ii].rotation[3] = 1.0f;
  265. _hmd.eye[ii].translation[0] = 0.0f;
  266. _hmd.eye[ii].translation[1] = 0.0f;
  267. _hmd.eye[ii].translation[2] = 0.0f;
  268. _hmd.eye[ii].fov[0] = 1.32928634f;
  269. _hmd.eye[ii].fov[1] = 1.32928634f;
  270. _hmd.eye[ii].fov[2] = 0 == ii ? 1.05865765f : 1.09236801f;
  271. _hmd.eye[ii].fov[3] = 0 == ii ? 1.09236801f : 1.05865765f;
  272. _hmd.eye[ii].viewOffset[0] = 0 == ii ? 0.0355070010f : -0.0375000015f;
  273. _hmd.eye[ii].viewOffset[1] = 0.0f;
  274. _hmd.eye[ii].viewOffset[2] = 0 == ii ? 0.00150949787f : -0.00150949787f;
  275. _hmd.eye[ii].pixelsPerTanAngle[0] = 1;
  276. _hmd.eye[ii].pixelsPerTanAngle[1] = 1;
  277. }
  278. }
  279. _hmd.width = uint16_t(m_rtSize.w);
  280. _hmd.height = uint16_t(m_rtSize.h);
  281. }
  282. } // namespace bgfx
  283. #endif // BGFX_CONFIG_USE_OVR