ovr.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  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. static const int s_eyeBuffer = 100;
  11. #else
  12. static const int s_eyeBuffer = 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 + s_eyeBuffer;
  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. bool OVR::postReset(void* _nwh, ovrRenderAPIConfig* _config, bool _debug)
  62. {
  63. if (_debug)
  64. {
  65. switch (_config->Header.API)
  66. {
  67. #if BGFX_CONFIG_RENDERER_DIRECT3D11
  68. case ovrRenderAPI_D3D11:
  69. {
  70. ovrD3D11ConfigData* data = (ovrD3D11ConfigData*)_config;
  71. # if OVR_VERSION > OVR_VERSION_043
  72. m_rtSize = data->Header.BackBufferSize;
  73. # else
  74. m_rtSize = data->Header.RTSize;
  75. # endif // OVR_VERSION > OVR_VERSION_043
  76. }
  77. break;
  78. #endif // BGFX_CONFIG_RENDERER_DIRECT3D11
  79. #if BGFX_CONFIG_RENDERER_OPENGL
  80. case ovrRenderAPI_OpenGL:
  81. {
  82. ovrGLConfigData* data = (ovrGLConfigData*)_config;
  83. # if OVR_VERSION > OVR_VERSION_043
  84. m_rtSize = data->Header.BackBufferSize;
  85. # else
  86. m_rtSize = data->Header.RTSize;
  87. # endif // OVR_VERSION > OVR_VERSION_043
  88. }
  89. break;
  90. #endif // BGFX_CONFIG_RENDERER_OPENGL
  91. case ovrRenderAPI_None:
  92. default:
  93. BX_CHECK(false, "You should not be here!");
  94. break;
  95. }
  96. m_debug = true;
  97. return false;
  98. }
  99. if (NULL == m_hmd)
  100. {
  101. return false;
  102. }
  103. m_isenabled = true;
  104. ovrBool result;
  105. result = ovrHmd_AttachToWindow(m_hmd, _nwh, NULL, NULL);
  106. if (!result) { goto ovrError; }
  107. ovrFovPort eyeFov[2] = { m_hmd->DefaultEyeFov[0], m_hmd->DefaultEyeFov[1] };
  108. result = ovrHmd_ConfigureRendering(m_hmd
  109. , _config
  110. , 0
  111. #if OVR_VERSION < OVR_VERSION_050
  112. | ovrDistortionCap_Chromatic // permanently enabled >= v5.0
  113. #endif
  114. | ovrDistortionCap_Vignette
  115. | ovrDistortionCap_TimeWarp
  116. | ovrDistortionCap_Overdrive
  117. | ovrDistortionCap_NoRestore
  118. | ovrDistortionCap_HqDistortion
  119. , eyeFov
  120. , m_erd
  121. );
  122. if (!result) { goto ovrError; }
  123. ovrHmd_SetEnabledCaps(m_hmd
  124. , 0
  125. | ovrHmdCap_LowPersistence
  126. | ovrHmdCap_DynamicPrediction
  127. );
  128. result = ovrHmd_ConfigureTracking(m_hmd
  129. , 0
  130. | ovrTrackingCap_Orientation
  131. | ovrTrackingCap_MagYawCorrection
  132. | ovrTrackingCap_Position
  133. , 0
  134. );
  135. if (!result)
  136. {
  137. ovrError:
  138. BX_TRACE("Failed to initialize OVR.");
  139. m_isenabled = false;
  140. return false;
  141. }
  142. m_warning = true;
  143. return true;
  144. }
  145. void OVR::postReset(const ovrTexture& _texture)
  146. {
  147. if (NULL != m_hmd)
  148. {
  149. m_texture[0] = _texture;
  150. m_texture[1] = _texture;
  151. ovrRecti rect;
  152. rect.Pos.x = 0;
  153. rect.Pos.y = 0;
  154. rect.Size.w = (m_rtSize.w - s_eyeBuffer)/2;
  155. rect.Size.h = m_rtSize.h;
  156. m_texture[0].Header.RenderViewport = rect;
  157. rect.Pos.x += rect.Size.w + s_eyeBuffer;
  158. m_texture[1].Header.RenderViewport = rect;
  159. m_timing = ovrHmd_BeginFrame(m_hmd, 0);
  160. #if OVR_VERSION > OVR_VERSION_042
  161. m_pose[0] = ovrHmd_GetHmdPosePerEye(m_hmd, ovrEye_Left);
  162. m_pose[1] = ovrHmd_GetHmdPosePerEye(m_hmd, ovrEye_Right);
  163. #else
  164. m_pose[0] = ovrHmd_GetEyePose(m_hmd, ovrEye_Left);
  165. m_pose[1] = ovrHmd_GetEyePose(m_hmd, ovrEye_Right);
  166. #endif // OVR_VERSION > OVR_VERSION_042
  167. }
  168. }
  169. void OVR::preReset()
  170. {
  171. if (m_isenabled)
  172. {
  173. ovrHmd_EndFrame(m_hmd, m_pose, m_texture);
  174. ovrHmd_AttachToWindow(m_hmd, NULL, NULL, NULL);
  175. ovrHmd_ConfigureRendering(m_hmd, NULL, 0, NULL, NULL);
  176. m_isenabled = false;
  177. }
  178. m_debug = false;
  179. }
  180. bool OVR::swap(HMD& _hmd)
  181. {
  182. _hmd.flags = BGFX_HMD_NONE;
  183. if (NULL != m_hmd)
  184. {
  185. _hmd.flags |= BGFX_HMD_DEVICE_RESOLUTION;
  186. _hmd.deviceWidth = m_hmd->Resolution.w;
  187. _hmd.deviceHeight = m_hmd->Resolution.h;
  188. }
  189. if (!m_isenabled)
  190. {
  191. return false;
  192. }
  193. _hmd.flags |= BGFX_HMD_RENDERING;
  194. ovrHmd_EndFrame(m_hmd, m_pose, m_texture);
  195. if (m_warning)
  196. {
  197. m_warning = !ovrHmd_DismissHSWDisplay(m_hmd);
  198. }
  199. m_timing = ovrHmd_BeginFrame(m_hmd, 0);
  200. #if OVR_VERSION > OVR_VERSION_042
  201. m_pose[0] = ovrHmd_GetHmdPosePerEye(m_hmd, ovrEye_Left);
  202. m_pose[1] = ovrHmd_GetHmdPosePerEye(m_hmd, ovrEye_Right);
  203. #else
  204. m_pose[0] = ovrHmd_GetEyePose(m_hmd, ovrEye_Left);
  205. m_pose[1] = ovrHmd_GetEyePose(m_hmd, ovrEye_Right);
  206. #endif // OVR_VERSION > OVR_VERSION_042
  207. getEyePose(_hmd);
  208. return true;
  209. }
  210. void OVR::recenter()
  211. {
  212. if (NULL != m_hmd)
  213. {
  214. ovrHmd_RecenterPose(m_hmd);
  215. }
  216. }
  217. void OVR::getEyePose(HMD& _hmd)
  218. {
  219. if (NULL != m_hmd)
  220. {
  221. for (int ii = 0; ii < 2; ++ii)
  222. {
  223. const ovrPosef& pose = m_pose[ii];
  224. HMD::Eye& eye = _hmd.eye[ii];
  225. eye.rotation[0] = pose.Orientation.x;
  226. eye.rotation[1] = pose.Orientation.y;
  227. eye.rotation[2] = pose.Orientation.z;
  228. eye.rotation[3] = pose.Orientation.w;
  229. eye.translation[0] = pose.Position.x;
  230. eye.translation[1] = pose.Position.y;
  231. eye.translation[2] = pose.Position.z;
  232. const ovrEyeRenderDesc& erd = m_erd[ii];
  233. eye.fov[0] = erd.Fov.UpTan;
  234. eye.fov[1] = erd.Fov.DownTan;
  235. eye.fov[2] = erd.Fov.LeftTan;
  236. eye.fov[3] = erd.Fov.RightTan;
  237. #if OVR_VERSION > OVR_VERSION_042
  238. eye.viewOffset[0] = erd.HmdToEyeViewOffset.x;
  239. eye.viewOffset[1] = erd.HmdToEyeViewOffset.y;
  240. eye.viewOffset[2] = erd.HmdToEyeViewOffset.z;
  241. #else
  242. eye.viewOffset[0] = erd.ViewAdjust.x;
  243. eye.viewOffset[1] = erd.ViewAdjust.y;
  244. eye.viewOffset[2] = erd.ViewAdjust.z;
  245. #endif // OVR_VERSION > OVR_VERSION_042
  246. eye.pixelsPerTanAngle[0] = erd.PixelsPerTanAngleAtCenter.x;
  247. eye.pixelsPerTanAngle[1] = erd.PixelsPerTanAngleAtCenter.y;
  248. }
  249. }
  250. else
  251. {
  252. for (int ii = 0; ii < 2; ++ii)
  253. {
  254. _hmd.eye[ii].rotation[0] = 0.0f;
  255. _hmd.eye[ii].rotation[1] = 0.0f;
  256. _hmd.eye[ii].rotation[2] = 0.0f;
  257. _hmd.eye[ii].rotation[3] = 1.0f;
  258. _hmd.eye[ii].translation[0] = 0.0f;
  259. _hmd.eye[ii].translation[1] = 0.0f;
  260. _hmd.eye[ii].translation[2] = 0.0f;
  261. _hmd.eye[ii].fov[0] = 1.32928634f;
  262. _hmd.eye[ii].fov[1] = 1.32928634f;
  263. _hmd.eye[ii].fov[2] = 0 == ii ? 1.05865765f : 1.09236801f;
  264. _hmd.eye[ii].fov[3] = 0 == ii ? 1.09236801f : 1.05865765f;
  265. _hmd.eye[ii].viewOffset[0] = 0 == ii ? 0.0355070010f : -0.0375000015f;
  266. _hmd.eye[ii].viewOffset[1] = 0.0f;
  267. _hmd.eye[ii].viewOffset[2] = 0 == ii ? 0.00150949787f : -0.00150949787f;
  268. _hmd.eye[ii].pixelsPerTanAngle[0] = 1;
  269. _hmd.eye[ii].pixelsPerTanAngle[1] = 1;
  270. }
  271. }
  272. _hmd.width = uint16_t(m_rtSize.w);
  273. _hmd.height = uint16_t(m_rtSize.h);
  274. }
  275. } // namespace bgfx
  276. #endif // BGFX_CONFIG_USE_OVR