Browse Source

Merge pull request #423 from mendsley/vr_viewportfix

VR: Fix skewed viewports with buffered eye textures
Branimir Karadžić 10 years ago
parent
commit
d2204e5cf2
4 changed files with 31 additions and 4 deletions
  1. 8 0
      src/ovr.cpp
  2. 1 0
      src/ovr.h
  3. 11 2
      src/renderer_d3d11.cpp
  4. 11 2
      src/renderer_gl.cpp

+ 8 - 0
src/ovr.cpp

@@ -69,6 +69,14 @@ namespace bgfx
 		ovr_Shutdown();
 	}
 
+	void OVR::getViewport(uint8_t _eye, Rect* _viewport)
+	{
+		_viewport->m_width = (m_rtSize.w - s_eyeBuffer)/2;
+		_viewport->m_height = m_rtSize.h;
+		_viewport->m_x = _eye * (m_rtSize.w + s_eyeBuffer + 1)/2;
+		_viewport->m_y = 0;
+	}
+
 	bool OVR::postReset(void* _nwh, ovrRenderAPIConfig* _config, bool _debug)
 	{
 		if (_debug)

+ 1 - 0
src/ovr.h

@@ -67,6 +67,7 @@ namespace bgfx
 		void init();
 		void shutdown();
 
+		void getViewport(uint8_t _eye, Rect* _viewport);
 		bool postReset(void* _nwh, ovrRenderAPIConfig* _config, bool _debug = false);
 		void postReset(const ovrTexture& _texture);
 		void preReset();

+ 11 - 2
src/renderer_d3d11.cpp

@@ -3856,8 +3856,17 @@ BX_PRAGMA_DIAGNOSTIC_POP();
 							PIX_BEGINEVENT(D3DCOLOR_RGBA(0xff, 0x00, 0x00, 0xff), viewNameW);
 						}
 
-						viewState.m_rect.m_x = eye * (viewState.m_rect.m_width+1)/2;
-						viewState.m_rect.m_width /= 2;
+#if BGFX_CONFIG_USE_OVR
+						if (m_ovr.isEnabled())
+						{
+							m_ovr.getViewport(eye, &viewState.m_rect);
+						}
+						else
+#endif // BGFX_CONFIG_USE_OVR
+						{
+							viewState.m_rect.m_x = eye * (viewState.m_rect.m_width+1)/2;
+							viewState.m_rect.m_width /= 2;
+						}
 					}
 					else
 					{

+ 11 - 2
src/renderer_gl.cpp

@@ -4963,8 +4963,17 @@ namespace bgfx { namespace gl
 							GL_CHECK(glInsertEventMarker(0, viewName) );
 						}
 
-						viewState.m_rect.m_x = eye * (viewState.m_rect.m_width+1)/2;
-						viewState.m_rect.m_width /= 2;
+#if BGFX_CONFIG_USE_OVR
+						if (m_ovr.isEnabled())
+						{
+							m_ovr.getViewport(eye, &viewState.m_rect);
+						}
+						else
+#endif // BGFX_CONFIG_USE_OVR
+						{
+							viewState.m_rect.m_x = eye * (viewState.m_rect.m_width+1)/2;
+							viewState.m_rect.m_width /= 2;
+						}
 					}
 					else
 					{