diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8485de67c5..636045a218 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -687,6 +687,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : auto applicationUpdater = DependencyManager::get(); connect(applicationUpdater.data(), &AutoUpdater::newVersionIsAvailable, dialogsManager.data(), &DialogsManager::showUpdateDialog); applicationUpdater->checkForUpdate(); + + // Now that menu is initalized we can sync myAvatar with it's state. + _myAvatar->updateMotionBehaviorFromMenu(); + _myAvatar->updateStandingHMDModeFromMenu(); } void Application::aboutToQuit() { diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 2df4d96725..03e0a57d57 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -244,16 +244,16 @@ Menu::Menu() { SLOT(resetSize())); addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::KeyboardMotorControl, - Qt::CTRL | Qt::SHIFT | Qt::Key_K, true, avatar, SLOT(updateMotionBehavior())); + Qt::CTRL | Qt::SHIFT | Qt::Key_K, true, avatar, SLOT(updateMotionBehaviorFromMenu())); addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::ScriptedMotorControl, 0, true, - avatar, SLOT(updateMotionBehavior())); + avatar, SLOT(updateMotionBehaviorFromMenu())); addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::NamesAboveHeads, 0, true); addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::GlowWhenSpeaking, 0, true); addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::BlueSpeechSphere, 0, true); addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::EnableCharacterController, 0, true, - avatar, SLOT(updateMotionBehavior())); + avatar, SLOT(updateMotionBehaviorFromMenu())); addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::ShiftHipsForIdleAnimations, 0, false, - avatar, SLOT(updateMotionBehavior())); + avatar, SLOT(updateMotionBehaviorFromMenu())); MenuWrapper* viewMenu = addMenu("View"); { @@ -325,6 +325,9 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::TurnWithHead, 0, false); + addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::StandingHMDSensorMode, 0, false, + avatar, SLOT(updateStandingHMDModeFromMenu())); + addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Stats); addActionToQMenuAndActionHash(viewMenu, MenuOption::Log, Qt::CTRL | Qt::SHIFT | Qt::Key_L, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 55a3538125..e204cf3bb6 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -273,6 +273,7 @@ namespace MenuOption { const QString SimpleShadows = "Simple"; const QString SixenseEnabled = "Enable Hydra Support"; const QString ShiftHipsForIdleAnimations = "Shift hips for idle animations"; + const QString StandingHMDSensorMode = "Standing HMD Sensor Mode"; const QString Stars = "Stars"; const QString Stats = "Stats"; const QString StopAllScripts = "Stop All Scripts"; diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index c33c888e37..0518dec5bd 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -28,8 +28,6 @@ using namespace std; -static bool isRoomTracking = true; - Head::Head(Avatar* owningAvatar) : HeadData((AvatarData*)owningAvatar), _returnHeadToCenter(false), @@ -120,7 +118,7 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { } } - if (!isRoomTracking) { + if (!myAvatar->getStandingHMDSensorMode()) { // Twist the upper body to follow the rotation of the head, but only do this with my avatar, // since everyone else will see the full joint rotations for other people. const float BODY_FOLLOW_HEAD_YAW_RATE = 0.1f; @@ -342,7 +340,7 @@ glm::quat Head::getCameraOrientation() const { // always the same. if (qApp->isHMDMode()) { MyAvatar* myAvatar = dynamic_cast(_owningAvatar); - if (isRoomTracking && myAvatar) { + if (myAvatar && myAvatar->getStandingHMDSensorMode()) { return glm::quat_cast(myAvatar->getSensorToWorldMatrix()) * myAvatar->getHMDSensorOrientation(); } else { return getOrientation(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 55e19cf86d..eee1c5e8a5 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -76,8 +76,6 @@ const float MyAvatar::ZOOM_MIN = 0.5f; const float MyAvatar::ZOOM_MAX = 25.0f; const float MyAvatar::ZOOM_DEFAULT = 1.5f; -static bool isRoomTracking = true; - MyAvatar::MyAvatar() : Avatar(), _gravity(0.0f, 0.0f, 0.0f), @@ -109,7 +107,8 @@ MyAvatar::MyAvatar() : _hmdSensorPosition(), _bodySensorMatrix(), _inverseBodySensorMatrix(), - _sensorToWorldMatrix() + _sensorToWorldMatrix(), + _standingHMDSensorMode(false) { _firstPersonSkeletonModel.setIsFirstPerson(true); @@ -310,7 +309,7 @@ void MyAvatar::updateFromTrackers(float deltaTime) { Head* head = getHead(); if (inHmd || isPlaying()) { - if (!isRoomTracking) { + if (!getStandingHMDSensorMode()) { head->setDeltaPitch(estimatedRotation.x); head->setDeltaYaw(estimatedRotation.y); head->setDeltaRoll(estimatedRotation.z); @@ -336,7 +335,7 @@ void MyAvatar::updateFromTrackers(float deltaTime) { relativePosition.x = -relativePosition.x; } - if (!(inHmd && isRoomTracking)) { + if (!(inHmd && getStandingHMDSensorMode())) { head->setLeanSideways(glm::clamp(glm::degrees(atanf(relativePosition.x * _leanScale / TORSO_LENGTH)), -MAX_LEAN, MAX_LEAN)); head->setLeanForward(glm::clamp(glm::degrees(atanf(relativePosition.z * _leanScale / TORSO_LENGTH)), @@ -1313,7 +1312,7 @@ void MyAvatar::updateOrientation(float deltaTime) { glm::mat4 sensorOffset = bodyMat * glm::mat4_cast(twist) * glm::inverse(bodyMat); _sensorToWorldMatrix = sensorOffset * _sensorToWorldMatrix; - if (!(qApp->isHMDMode() && isRoomTracking)) { + if (!(qApp->isHMDMode() && getStandingHMDSensorMode())) { setOrientation(twist * getOrientation()); } @@ -1505,7 +1504,7 @@ void MyAvatar::updatePosition(float deltaTime) { const float MOVING_SPEED_THRESHOLD = 0.01f; _moving = speed > MOVING_SPEED_THRESHOLD; - if (qApp->isHMDMode() && isRoomTracking) { + if (qApp->isHMDMode() && getStandingHMDSensorMode()) { Avatar::setPosition(getWorldBodyPosition()); } } @@ -1599,7 +1598,7 @@ void MyAvatar::goToLocation(const glm::vec3& newPosition, qCDebug(interfaceapp).nospace() << "MyAvatar goToLocation - moving to " << newPosition.x << ", " << newPosition.y << ", " << newPosition.z; - if (qApp->isHMDMode() && isRoomTracking) { + if (qApp->isHMDMode() && getStandingHMDSensorMode()) { // AJT: FIXME, does not work with orientation. // AJT: FIXME, does not work with shouldFaceLocation flag. // Set the orientation of the sensor room, not the avatar itself. @@ -1631,7 +1630,7 @@ void MyAvatar::goToLocation(const glm::vec3& newPosition, emit transformChanged(); } -void MyAvatar::updateMotionBehavior() { +void MyAvatar::updateMotionBehaviorFromMenu() { Menu* menu = Menu::getInstance(); if (menu->isOptionChecked(MenuOption::KeyboardMotorControl)) { _motionBehaviors |= AVATAR_MOTION_KEYBOARD_MOTOR_ENABLED; @@ -1647,6 +1646,11 @@ void MyAvatar::updateMotionBehavior() { _feetTouchFloor = menu->isOptionChecked(MenuOption::ShiftHipsForIdleAnimations); } +void MyAvatar::updateStandingHMDModeFromMenu() { + Menu* menu = Menu::getInstance(); + _standingHMDSensorMode = menu->isOptionChecked(MenuOption::StandingHMDSensorMode); +} + //Renders sixense laser pointers for UI selection with controllers void MyAvatar::renderLaserPointers(gpu::Batch& batch) { const float PALM_TIP_ROD_RADIUS = 0.002f; diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index c65a4bce38..6dea63ca30 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -185,6 +185,8 @@ public: static const float ZOOM_MAX; static const float ZOOM_DEFAULT; + bool getStandingHMDSensorMode() const { return _standingHMDSensorMode; } + public slots: void increaseSize(); void decreaseSize(); @@ -199,7 +201,8 @@ public slots: glm::vec3 getThrust() { return _thrust; }; void setThrust(glm::vec3 newThrust) { _thrust = newThrust; } - void updateMotionBehavior(); + void updateMotionBehaviorFromMenu(); + void updateStandingHMDModeFromMenu(); glm::vec3 getLeftPalmPosition(); glm::vec3 getRightPalmPosition(); @@ -217,6 +220,8 @@ public slots: virtual void rebuildSkeletonBody(); + + signals: void transformChanged(); void newCollisionSoundURL(const QUrl& url); @@ -316,6 +321,8 @@ private: // used to transform any sensor into world space, including the _hmdSensorMat, or hand controllers. glm::mat4 _sensorToWorldMatrix; + + bool _standingHMDSensorMode; }; #endif // hifi_MyAvatar_h