From 0f85c280983f0353b859e44a839ca15eb6380b05 Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Mon, 21 Sep 2015 21:08:13 -0700
Subject: [PATCH 1/2] Fix HMD 3rd person view

---
 interface/src/Application.cpp | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index ee98ce4c25..0d55c08860 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -1136,18 +1136,23 @@ void Application::paintGL() {
         }
     } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
         if (isHMDMode()) {
-            _myCamera.setRotation(_myAvatar->getWorldAlignedOrientation());
+            glm::quat hmdRotation = extractRotation(_myAvatar->getHMDSensorMatrix());
+            _myCamera.setRotation(_myAvatar->getWorldAlignedOrientation() * hmdRotation);
+            // Ignore MenuOption::CenterPlayerInView in HMD view
+            glm::vec3 hmdOffset = extractTranslation(_myAvatar->getHMDSensorMatrix());
+            _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
+                + _myAvatar->getOrientation() 
+                * (_myAvatar->getScale() * _myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f) + hmdOffset));
         } else {
             _myCamera.setRotation(_myAvatar->getHead()->getOrientation());
+            if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) {
+                _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
+                    + _myCamera.getRotation() * glm::vec3(0.0f, 0.0f, 1.0f) * _myAvatar->getBoomLength() * _myAvatar->getScale());
+            } else {
+                _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
+                    + _myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, 1.0f) * _myAvatar->getBoomLength() * _myAvatar->getScale());
+            }
         }
-        if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) {
-            _myCamera.setPosition(_myAvatar->getDefaultEyePosition() +
-                                  _myCamera.getRotation() * glm::vec3(0.0f, 0.0f, 1.0f) * _myAvatar->getBoomLength() * _myAvatar->getScale());
-        } else {
-            _myCamera.setPosition(_myAvatar->getDefaultEyePosition() +
-                                  _myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, 1.0f) * _myAvatar->getBoomLength() * _myAvatar->getScale());
-        }
-
     } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) {
         if (isHMDMode()) {
             glm::quat hmdRotation = extractRotation(_myAvatar->getHMDSensorMatrix());

From 30dc07b62122139a04e08fd18462cd4847cb6c46 Mon Sep 17 00:00:00 2001
From: David Rowe <david@ctrlaltstudio.com>
Date: Mon, 21 Sep 2015 21:22:36 -0700
Subject: [PATCH 2/2] Code tidying

---
 interface/src/Application.cpp | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index 0d55c08860..3d69cdd17c 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -1120,19 +1120,17 @@ void Application::paintGL() {
     // The render mode is default or mirror if the camera is in mirror mode, assigned further below
     renderArgs._renderMode = RenderArgs::DEFAULT_RENDER_MODE;
 
+    // Always use the default eye position, not the actual head eye position.
+    // Using the latter will cause the camera to wobble with idle animations,
+    // or with changes from the face tracker
     if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) {
-        // Always use the default eye position, not the actual head eye position.
-        // Using the latter will cause the camera to wobble with idle animations,
-        // or with changes from the face tracker
-        renderArgs._renderMode = RenderArgs::DEFAULT_RENDER_MODE;
-
-        if (!getActiveDisplayPlugin()->isHmd()) {
-            _myCamera.setPosition(_myAvatar->getDefaultEyePosition());
-            _myCamera.setRotation(_myAvatar->getHead()->getCameraOrientation());
-        } else {
+        if (isHMDMode()) {
             mat4 camMat = _myAvatar->getSensorToWorldMatrix() * _myAvatar->getHMDSensorMatrix();
             _myCamera.setPosition(extractTranslation(camMat));
             _myCamera.setRotation(glm::quat_cast(camMat));
+        } else {
+            _myCamera.setPosition(_myAvatar->getDefaultEyePosition());
+            _myCamera.setRotation(_myAvatar->getHead()->getCameraOrientation());
         }
     } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
         if (isHMDMode()) {
@@ -1147,10 +1145,12 @@ void Application::paintGL() {
             _myCamera.setRotation(_myAvatar->getHead()->getOrientation());
             if (Menu::getInstance()->isOptionChecked(MenuOption::CenterPlayerInView)) {
                 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
-                    + _myCamera.getRotation() * glm::vec3(0.0f, 0.0f, 1.0f) * _myAvatar->getBoomLength() * _myAvatar->getScale());
+                    + _myCamera.getRotation()
+                    * (_myAvatar->getScale() * _myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f)));
             } else {
                 _myCamera.setPosition(_myAvatar->getDefaultEyePosition()
-                    + _myAvatar->getOrientation() * glm::vec3(0.0f, 0.0f, 1.0f) * _myAvatar->getBoomLength() * _myAvatar->getScale());
+                    + _myAvatar->getOrientation() 
+                    * (_myAvatar->getScale() * _myAvatar->getBoomLength() * glm::vec3(0.0f, 0.0f, 1.0f)));
             }
         }
     } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) {