From 90feeffa9db5076f3ca7e2bf8012d60ad11b2c1e Mon Sep 17 00:00:00 2001
From: amantley <amantley@googlemail.com>
Date: Mon, 1 Oct 2018 14:21:00 -0700
Subject: [PATCH] cleaning up. putting squat fix in vertical recenter

---
 interface/src/avatar/MyAvatar.cpp    | 70 +++++++++++++---------------
 interface/src/avatar/MyAvatar.h      |  6 +--
 plugins/oculus/src/OculusHelpers.cpp | 10 ++--
 scripts/system/avatarapp.js          |  6 +--
 4 files changed, 43 insertions(+), 49 deletions(-)

diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp
index 1bd8d4b2f0..278d2703ab 100755
--- a/interface/src/avatar/MyAvatar.cpp
+++ b/interface/src/avatar/MyAvatar.cpp
@@ -484,6 +484,19 @@ void MyAvatar::update(float deltaTime) {
 
     glm::vec3 upHead = transformVectorFast(sensorHeadPoseDebug.getMatrix(), glm::vec3(0.0f, 1.0f, 0.0f));
     float acosHead = glm::dot(upHead, glm::vec3(0.0f, 1.0f, 0.0f));
+
+    glm::vec3 headDefaultPositionAvatarSpace = getAbsoluteDefaultJointTranslationInObjectFrame(getJointIndex("Head"));
+    glm::quat spine2OrientationAvatarSpace = getAbsoluteJointRotationInObjectFrame(getJointIndex("Spine2"));
+    glm::vec3 headCurrentPositionAvatarSpace = getControllerPoseInAvatarFrame(controller::Action::HEAD).getTranslation();
+    glm::vec3 upSpine2 = spine2OrientationAvatarSpace * glm::vec3(0.0f, 1.0f, 0.0f);
+    float angleSpine2 = glm::dot(upSpine2, glm::vec3(0.0f, 1.0f, 0.0f));
+    if (headCurrentPositionAvatarSpace.y < (headDefaultPositionAvatarSpace.y - 0.05) && (angleSpine2 > 0.98f)) {
+        _squatCount++;
+    } else {
+        _squatCount = 0;
+    }
+
+
     //   qCDebug(interfaceapp) << "sensor space head pos " << sensorHeadPoseDebug.getTranslation().y;
 
     // put the average hand azimuth into sensor space.
@@ -3795,7 +3808,7 @@ bool MyAvatar::getIsInWalkingState() const {
 }
 
 bool MyAvatar::getIsInSittingState() const {
-    return _isInSittingState;
+    return _isInSittingState.get();
 }
 
 float MyAvatar::getWalkSpeed() const {
@@ -3819,7 +3832,7 @@ void MyAvatar::setIsInWalkingState(bool isWalking) {
 }
 
 void MyAvatar::setIsInSittingState(bool isSitting) {
-    _isInSittingState = isSitting;
+    _isInSittingState.set(isSitting);
     controller::Pose sensorHeadPoseDebug = getControllerPoseInSensorFrame(controller::Action::HEAD);
     _sumUserHeightSensorSpace = sensorHeadPoseDebug.getTranslation().y;
     _averageUserHeightCount = 1;
@@ -4064,8 +4077,8 @@ bool MyAvatar::FollowHelper::shouldActivateVertical(MyAvatar& myAvatar, const gl
     glm::vec3 headSensorSpace = transformVectorFast(myAvatar.getSensorToWorldMatrix(), headWorldSpace);
     //get the mode.
     //put it in sensor space.
-    // if we are 20% higher switch to standing. 
-    // 16.6% lower then switch to sitting. 
+    // if we are 20% higher switch to standing.
+    // 16.6% lower then switch to sitting.
     //  add this !!!!  And the head is upright.
     glm::vec3 upHead = transformVectorFast(sensorHeadPose.getMatrix(), glm::vec3(0.0f, 1.0f, 0.0f));
     float acosHead = glm::dot(upHead, glm::vec3(0.0f, 1.0f, 0.0f));
@@ -4074,8 +4087,9 @@ bool MyAvatar::FollowHelper::shouldActivateVertical(MyAvatar& myAvatar, const gl
     glm::vec3 sensorHips = transformVectorFast(myAvatar.getSensorToWorldMatrix(), worldHips);
     float averageSensorSpaceHeight = myAvatar._sumUserHeightSensorSpace / myAvatar._averageUserHeightCount;
     // we could add a counting here to make sure that a lean forward doesn't accidentally put you in sitting mode.
-    // but maybe so what.  
+    // but maybe so what.
     // the real test is... can I pick something up in standing mode?
+    
 
     if (myAvatar.getIsInSittingState()) {
         if (offset.y < SITTING_BOTTOM) {
@@ -4084,22 +4098,27 @@ bool MyAvatar::FollowHelper::shouldActivateVertical(MyAvatar& myAvatar, const gl
         } else if (sensorHeadPose.getTranslation().y > (1.2f * averageSensorSpaceHeight))  {
             // if we recenter upwards then no longer in sitting state
             myAvatar.setIsInSittingState(false);
-            //myAvatar._sumUserHeightSensorSpace = 1.2f * averageSensorSpaceHeight;
-           // myAvatar._averageUserHeightCount = 1;
             return true;
         } else {
             return false;
         }
     } else {
-        // in the standing state 
-        if ((sensorHeadPose.getTranslation().y < (0.83f * averageSensorSpaceHeight)) && (acosHead > 0.98f) && !(sensorHips.y > (0.4f * averageSensorSpaceHeight)) {
-            myAvatar.setIsInSittingState(true);
-           // myAvatar._sumUserHeightSensorSpace = 0.83f * averageSensorSpaceHeight;
-           // myAvatar._averageUserHeightCount = 1;
-            return true;
+        // in the standing state
+        if ((sensorHeadPose.getTranslation().y < (0.83f * averageSensorSpaceHeight)) && (acosHead > 0.98f) && !(sensorHips.y > (0.4f * averageSensorSpaceHeight))) {
+            myAvatar._sitStandStateCount++;
+            if (myAvatar._sitStandStateCount > 300) {
+                myAvatar.setIsInSittingState(true);
+                myAvatar._sitStandStateCount = 0;
+                myAvatar._squatCount = 0;
+                return true;
+            }
         } else {
-            return (offset.y > CYLINDER_TOP) || (offset.y < CYLINDER_BOTTOM);
+            if (myAvatar._squatCount > 600) {
+                return true;
+                myAvatar._squatCount = 0;
+            }
         }
+        return (offset.y > CYLINDER_TOP) || (offset.y < CYLINDER_BOTTOM);
     }
 }
 
@@ -4109,29 +4128,6 @@ void MyAvatar::FollowHelper::prePhysicsUpdate(MyAvatar& myAvatar, const glm::mat
     if (myAvatar.getHMDLeanRecenterEnabled() &&
         qApp->getCamera().getMode() != CAMERA_MODE_MIRROR) {
 
-        // debug head hips angle
-        glm::vec3 headDefaultPos = myAvatar.getAbsoluteDefaultJointTranslationInObjectFrame(myAvatar.getJointIndex("Head"));
-        if (myAvatar.getControllerPoseInAvatarFrame(controller::Action::HEAD).getTranslation().y < (headDefaultPos.y - 0.05f)) {
-            _squatCount++;
-            if ((_squatCount > 600) && !isActive(Vertical) && !isActive(Horizontal)) {
-                if (myAvatar.getIsInSittingState()) {
-                    // activate(Horizontal);
-                    //activate(Vertical);
-                    _squatCount = 0;
-                } else {
-                    if (myAvatar.getControllerPoseInAvatarFrame(controller::Action::HEAD).getTranslation().y < (headDefaultPos.y - 0.20f)) {
-                        //myAvatar.setIsInSittingState(true);
-                        //activate(Vertical);
-                    } else {
-                        //activate(Horizontal);
-                    }
-                    _squatCount = 0;
-                }   
-            }
-        } else {
-            _squatCount = 0;
-        }
-
         if (!isActive(Rotation) && (shouldActivateRotation(myAvatar, desiredBodyMatrix, currentBodyMatrix) || hasDriveInput)) {
             activate(Rotation);
             myAvatar.setHeadControllerFacingMovingAverage(myAvatar.getHeadControllerFacing());
diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h
index 62ba8d68b1..c7f6fa89ae 100644
--- a/interface/src/avatar/MyAvatar.h
+++ b/interface/src/avatar/MyAvatar.h
@@ -1737,7 +1737,6 @@ private:
         std::atomic<bool> _forceActivateVertical { false };
         std::atomic<bool> _forceActivateHorizontal { false };
         std::atomic<bool> _toggleHipsFollowing { true };
-        int _squatCount { 0 };
     };
     FollowHelper _follow;
 
@@ -1770,7 +1769,6 @@ private:
     glm::quat _customListenOrientation;
 
     AtRestDetector _hmdAtRestDetector;
-    bool _lastFrameHMDMode { false } ;
     bool _lastIsMoving { false };
 
     // all poses are in sensor-frame
@@ -1817,7 +1815,9 @@ private:
     ThreadSafeValueCache<float> _sprintSpeed { AVATAR_SPRINT_SPEED_SCALAR };
     float _walkSpeedScalar { AVATAR_WALK_SPEED_SCALAR };
     bool _isInWalkingState { false };
-    bool _isInSittingState { false };
+    ThreadSafeValueCache<bool> _isInSittingState { false };
+    int _sitStandStateCount { 0 };
+    int _squatCount { 0 };
 
     // load avatar scripts once when rig is ready
     bool _shouldLoadScripts { false };
diff --git a/plugins/oculus/src/OculusHelpers.cpp b/plugins/oculus/src/OculusHelpers.cpp
index 38d93d088d..402b05f39c 100644
--- a/plugins/oculus/src/OculusHelpers.cpp
+++ b/plugins/oculus/src/OculusHelpers.cpp
@@ -86,12 +86,10 @@ private:
             qCWarning(oculusLog) << "Failed to acquire Oculus session" << ovr::getError();
             return;
         } else {
-            qCWarning(oculusLog) << "successful init of oculus!!!!!!!!";
-            ovrTrackingOrigin fred;
-            //fred = ovr_GetTrackingOriginType(session);
-            ovrResult retTrackingType = ovr_SetTrackingOriginType(session, ovrTrackingOrigin::ovrTrackingOrigin_FloorLevel);
-            fred = ovr_GetTrackingOriginType(session);
-            qCWarning(oculusLog) << OVR_SUCCESS(retTrackingType) << (int)fred;
+            ovrResult setFloorLevelOrigin = ovr_SetTrackingOriginType(session, ovrTrackingOrigin::ovrTrackingOrigin_FloorLevel);
+            if (!OVR_SUCCESS(setFloorLevelOrigin)) {
+                qCWarning(oculusLog) << "Failed to set the Oculus tracking origin to floor level" << ovr::getError();
+            }
         }
     }
 
diff --git a/scripts/system/avatarapp.js b/scripts/system/avatarapp.js
index 16761f29a6..faf624392a 100644
--- a/scripts/system/avatarapp.js
+++ b/scripts/system/avatarapp.js
@@ -63,8 +63,8 @@ function getMyAvatar() {
 function getMyAvatarSettings() {
     return {
         dominantHand: MyAvatar.getDominantHand(),
-        collisionsEnabled: MyAvatar.getCollisionsEnabled(),
-        sittingEnabled: MyAvatar.isInSittingState,
+        collisionsEnabled : MyAvatar.getCollisionsEnabled(),
+        sittingEnabled : MyAvatar.isInSittingState,
         collisionSoundUrl : MyAvatar.collisionSoundURL,
         animGraphUrl: MyAvatar.getAnimGraphUrl(),
         animGraphOverrideUrl : MyAvatar.getAnimGraphOverrideUrl(),
@@ -326,7 +326,7 @@ function fromQml(message) { // messages are {method, params}, like json-rpc. See
         MyAvatar.isInSittingState = message.settings.sittingEnabled;
         MyAvatar.collisionSoundURL = message.settings.collisionSoundUrl;
         MyAvatar.setAnimGraphOverrideUrl(message.settings.animGraphOverrideUrl);
-        print("save settings");
+
         settings = getMyAvatarSettings();
         break;
     default: