From ff8f2c5c16277c3029559f865376b413c1c0f9b9 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 5 Sep 2019 16:36:14 -0700 Subject: [PATCH 01/29] Add new LookAt camera --- interface/src/Application.cpp | 36 +++++++++++++--------- interface/src/avatar/MyAvatar.cpp | 42 +++++++++++++++++++++----- interface/src/avatar/MyAvatar.h | 5 +++ libraries/shared/src/shared/Camera.cpp | 4 +++ libraries/shared/src/shared/Camera.h | 1 + 5 files changed, 65 insertions(+), 23 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b318f07d8f..22bf3e2555 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -709,6 +709,7 @@ static const QString STATE_CAMERA_FIRST_PERSON = "CameraFirstPerson"; static const QString STATE_CAMERA_THIRD_PERSON = "CameraThirdPerson"; static const QString STATE_CAMERA_ENTITY = "CameraEntity"; static const QString STATE_CAMERA_INDEPENDENT = "CameraIndependent"; +static const QString STATE_CAMERA_LOOK_AT = "CameraLookAt"; static const QString STATE_SNAP_TURN = "SnapTurn"; static const QString STATE_ADVANCED_MOVEMENT_CONTROLS = "AdvancedMovement"; static const QString STATE_GROUNDED = "Grounded"; @@ -925,7 +926,7 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { DependencyManager::set(); DependencyManager::set(); controller::StateController::setStateVariables({ { STATE_IN_HMD, STATE_CAMERA_FULL_SCREEN_MIRROR, - STATE_CAMERA_FIRST_PERSON, STATE_CAMERA_THIRD_PERSON, STATE_CAMERA_ENTITY, STATE_CAMERA_INDEPENDENT, + STATE_CAMERA_FIRST_PERSON, STATE_CAMERA_THIRD_PERSON, STATE_CAMERA_ENTITY, STATE_CAMERA_INDEPENDENT, STATE_CAMERA_LOOK_AT, STATE_SNAP_TURN, STATE_ADVANCED_MOVEMENT_CONTROLS, STATE_GROUNDED, STATE_NAV_FOCUSED, STATE_PLATFORM_WINDOWS, STATE_PLATFORM_MAC, STATE_PLATFORM_ANDROID, STATE_LEFT_HAND_DOMINANT, STATE_RIGHT_HAND_DOMINANT, STATE_STRAFE_ENABLED } }); DependencyManager::set(); @@ -1872,6 +1873,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo _applicationStateDevice->setInputVariant(STATE_CAMERA_THIRD_PERSON, []() -> float { return qApp->getCamera().getMode() == CAMERA_MODE_THIRD_PERSON ? 1 : 0; }); + // Look at camera and third person camera use the same input mapping + _applicationStateDevice->setInputVariant(STATE_CAMERA_THIRD_PERSON, []() -> float { + return qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT ? 1 : 0; + }); _applicationStateDevice->setInputVariant(STATE_CAMERA_ENTITY, []() -> float { return qApp->getCamera().getMode() == CAMERA_MODE_ENTITY ? 1 : 0; }); @@ -3607,8 +3612,7 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { _myCamera.setPosition(myAvatar->getDefaultEyePosition()); _myCamera.setOrientation(myAvatar->getMyHead()->getHeadOrientation()); } - } - else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { + } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON || _myCamera.getMode() == CAMERA_MODE_LOOK_AT) { if (isHMDMode()) { if (!_thirdPersonHMDCameraBoomValid) { @@ -3625,22 +3629,24 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { _myCamera.setOrientation(glm::normalize(glmExtractRotation(worldCameraMat))); _myCamera.setPosition(extractTranslation(worldCameraMat)); - } - else { + } else { _thirdPersonHMDCameraBoomValid = false; - - _myCamera.setOrientation(myAvatar->getHead()->getOrientation()); - if (isOptionChecked(MenuOption::CenterPlayerInView)) { + if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { + _myCamera.setOrientation(myAvatar->getHead()->getOrientation()); + if (isOptionChecked(MenuOption::CenterPlayerInView)) { + _myCamera.setPosition(myAvatar->getDefaultEyePosition() + + _myCamera.getOrientation() * boomOffset); + } else { + _myCamera.setPosition(myAvatar->getDefaultEyePosition() + + myAvatar->getWorldOrientation() * boomOffset); + } + } else { _myCamera.setPosition(myAvatar->getDefaultEyePosition() - + _myCamera.getOrientation() * boomOffset); - } - else { - _myCamera.setPosition(myAvatar->getDefaultEyePosition() - + myAvatar->getWorldOrientation() * boomOffset); + + myAvatar->getLookAtOffset() * boomOffset); + _myCamera.lookAt(myAvatar->getDefaultEyePosition()); } } - } - else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { + } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { _thirdPersonHMDCameraBoomValid= false; if (isHMDMode()) { diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 4d1c20010c..5cd3ab20ca 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -451,7 +451,7 @@ QByteArray MyAvatar::toByteArrayStateful(AvatarDataDetail dataDetail, bool dropF _globalBoundingBoxDimensions.y = _characterController.getCapsuleHalfHeight(); _globalBoundingBoxDimensions.z = _characterController.getCapsuleRadius(); _globalBoundingBoxOffset = _characterController.getCapsuleLocalOffset(); - if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT) { + if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT || mode == CAMERA_MODE_LOOK_AT) { // fake the avatar position that is sent up to the AvatarMixer glm::vec3 oldPosition = getWorldPosition(); setWorldPosition(getSkeletonPosition()); @@ -2556,7 +2556,7 @@ void MyAvatar::useFullAvatarURL(const QUrl& fullAvatarURL, const QString& modelN glm::vec3 MyAvatar::getSkeletonPosition() const { CameraMode mode = qApp->getCamera().getMode(); - if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT) { + if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT || mode == CAMERA_MODE_LOOK_AT) { // The avatar is rotated PI about the yAxis, so we have to correct for it // to get the skeleton offset contribution in the world-frame. const glm::quat FLIP = glm::angleAxis(PI, glm::vec3(0.0f, 1.0f, 0.0f)); @@ -3322,11 +3322,15 @@ void MyAvatar::setRotationThreshold(float angleRadians) { } void MyAvatar::updateOrientation(float deltaTime) { - // Smoothly rotate body with arrow keys float targetSpeed = getDriveKey(YAW) * _yawSpeed; + bool faceForward = false; + if (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) { + targetSpeed = (getDriveKey(YAW) + getDriveKey(STEP_YAW) + getDriveKey(DELTA_YAW)) * _yawSpeed; + faceForward = getDriveKey(TRANSLATE_Z) != 0.0f; + } if (targetSpeed != 0.0f) { - const float ROTATION_RAMP_TIMESCALE = 0.1f; + const float ROTATION_RAMP_TIMESCALE = 0.5f; float blend = deltaTime / ROTATION_RAMP_TIMESCALE; if (blend > 1.0f) { blend = 1.0f; @@ -3349,7 +3353,9 @@ void MyAvatar::updateOrientation(float deltaTime) { float totalBodyYaw = _bodyYawDelta * deltaTime; // Rotate directly proportional to delta yaw and delta pitch from right-click mouse movement. - totalBodyYaw += getDriveKey(DELTA_YAW) * _yawSpeed / YAW_SPEED_DEFAULT; + if (qApp->getCamera().getMode() != CAMERA_MODE_LOOK_AT) { + totalBodyYaw += getDriveKey(DELTA_YAW) * _yawSpeed / YAW_SPEED_DEFAULT; + } // Comfort Mode: If you press any of the left/right rotation drive keys or input, you'll // get an instantaneous 15 degree turn. If you keep holding the key down you'll get another @@ -3394,7 +3400,19 @@ void MyAvatar::updateOrientation(float deltaTime) { // update body orientation by movement inputs glm::quat initialOrientation = getOrientationOutbound(); - setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f)))); + if (qApp->getCamera().getMode() != CAMERA_MODE_LOOK_AT) { + setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f)))); + } else { + // Set look at vector + float pitchIncrement = getDriveKey(PITCH) * _pitchSpeed * deltaTime + + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT; + _lookAtOffsetYaw = _lookAtOffsetYaw * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))); + _lookAtOffsetPitch = _lookAtOffsetPitch * glm::quat(glm::radians(glm::vec3(pitchIncrement, 0.0f, 0.0f))); + if (faceForward) { + setWorldOrientation(glm::slerp(getWorldOrientation(), _lookAtOffsetYaw, 0.25f)); + } + + } if (snapTurn) { // Whether or not there is an existing smoothing going on, just reset the smoothing timer and set the starting position as the avatar's current position, then smooth to the new position. @@ -3417,7 +3435,7 @@ void MyAvatar::updateOrientation(float deltaTime) { head->setBaseRoll(ROLL(euler)); } else { head->setBaseYaw(0.0f); - head->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime + head->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT); head->setBaseRoll(0.0f); } @@ -3486,7 +3504,15 @@ glm::vec3 MyAvatar::scaleMotorSpeed(const glm::vec3 forward, const glm::vec3 rig } } else { // Desktop mode. - direction = (zSpeed * forward) + (xSpeed * right); + if (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) { + //glm::vec3 frontVector = getWorldOrientation() * IDENTITY_FORWARD; + //glm::vec3 frontVectorXY = glm::normalize(glm::vec3(frontVector.x, frontVector.y, 0.0f)); + //direction = (zSpeed * forward) + (1.0f - glm::abs(glm::dot(frontVectorXY, forward))) * right; + direction = (zSpeed * forward); + } else { + direction = (zSpeed * forward) + (xSpeed * right); + } + auto length = glm::length(direction); if (length > EPSILON) { direction /= length; diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 0108fb5eda..966babfd2f 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1747,6 +1747,8 @@ public: glm::vec3 getNextPosition() { return _goToPending ? _goToPosition : getWorldPosition(); } void prepareAvatarEntityDataForReload(); + glm::quat getLookAtOffset() { return _lookAtOffsetYaw * _lookAtOffsetPitch; } + /**jsdoc * Creates a new grab that grabs an entity. * @function MyAvatar.grab @@ -2618,6 +2620,9 @@ private: glm::vec3 _trackedHeadPosition; + glm::quat _lookAtOffsetPitch; + glm::quat _lookAtOffsetYaw; + Setting::Handle _realWorldFieldOfView; Setting::Handle _useAdvancedMovementControls; Setting::Handle _showPlayArea; diff --git a/libraries/shared/src/shared/Camera.cpp b/libraries/shared/src/shared/Camera.cpp index 787b7bfb1a..4716713a2b 100644 --- a/libraries/shared/src/shared/Camera.cpp +++ b/libraries/shared/src/shared/Camera.cpp @@ -67,6 +67,8 @@ CameraMode stringToMode(const QString& mode) { return CAMERA_MODE_INDEPENDENT; } else if (mode == "entity") { return CAMERA_MODE_ENTITY; + } else if (mode == "look at") { + return CAMERA_MODE_LOOK_AT; } return CAMERA_MODE_NULL; } @@ -82,6 +84,8 @@ QString modeToString(CameraMode mode) { return "independent"; } else if (mode == CAMERA_MODE_ENTITY) { return "entity"; + } else if (mode == CAMERA_MODE_LOOK_AT) { + return "look at"; } return "unknown"; } diff --git a/libraries/shared/src/shared/Camera.h b/libraries/shared/src/shared/Camera.h index 0df83cfb9a..2de5332538 100644 --- a/libraries/shared/src/shared/Camera.h +++ b/libraries/shared/src/shared/Camera.h @@ -23,6 +23,7 @@ enum CameraMode CAMERA_MODE_MIRROR, CAMERA_MODE_INDEPENDENT, CAMERA_MODE_ENTITY, + CAMERA_MODE_LOOK_AT, NUM_CAMERA_MODES }; From ddbd30fac9f1ea44edf5bb6553e22b6757dde184 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 5 Sep 2019 17:14:35 -0700 Subject: [PATCH 02/29] Fix magic numbers and refactor some code --- interface/src/avatar/MyAvatar.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 5cd3ab20ca..40d517767d 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3409,9 +3409,9 @@ void MyAvatar::updateOrientation(float deltaTime) { _lookAtOffsetYaw = _lookAtOffsetYaw * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))); _lookAtOffsetPitch = _lookAtOffsetPitch * glm::quat(glm::radians(glm::vec3(pitchIncrement, 0.0f, 0.0f))); if (faceForward) { - setWorldOrientation(glm::slerp(getWorldOrientation(), _lookAtOffsetYaw, 0.25f)); + const float FACE_FORWARD_BLEND = 0.25f; + setWorldOrientation(glm::slerp(getWorldOrientation(), _lookAtOffsetYaw, FACE_FORWARD_BLEND)); } - } if (snapTurn) { @@ -3435,7 +3435,7 @@ void MyAvatar::updateOrientation(float deltaTime) { head->setBaseRoll(ROLL(euler)); } else { head->setBaseYaw(0.0f); - head->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime + head->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT); head->setBaseRoll(0.0f); } @@ -3505,9 +3505,6 @@ glm::vec3 MyAvatar::scaleMotorSpeed(const glm::vec3 forward, const glm::vec3 rig } else { // Desktop mode. if (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) { - //glm::vec3 frontVector = getWorldOrientation() * IDENTITY_FORWARD; - //glm::vec3 frontVectorXY = glm::normalize(glm::vec3(frontVector.x, frontVector.y, 0.0f)); - //direction = (zSpeed * forward) + (1.0f - glm::abs(glm::dot(frontVectorXY, forward))) * right; direction = (zSpeed * forward); } else { direction = (zSpeed * forward) + (xSpeed * right); From 78eee5961cd016671465a2396e24b6d2e244436a Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 5 Sep 2019 18:05:46 -0700 Subject: [PATCH 03/29] Fix key mapping for new camera --- .../resources/controllers/keyboardMouse.json | 29 +++++++++++++++++++ interface/src/Application.cpp | 3 +- interface/src/avatar/MyAvatar.cpp | 2 +- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/interface/resources/controllers/keyboardMouse.json b/interface/resources/controllers/keyboardMouse.json index 9b3c711c63..c48269b83b 100644 --- a/interface/resources/controllers/keyboardMouse.json +++ b/interface/resources/controllers/keyboardMouse.json @@ -85,6 +85,15 @@ "when": ["Application.CameraThirdPerson", "!Keyboard.Shift"], "to": "Actions.Yaw" }, + + { "from": { "makeAxis" : [ + ["Keyboard.Left"], + ["Keyboard.Right"] + ] + }, + "when": ["Application.CameraLookAt", "!Keyboard.Shift"], + "to": "Actions.Yaw" + }, { "from": { "makeAxis" : [ ["Keyboard.A"], @@ -104,6 +113,15 @@ "to": "Actions.Yaw" }, + { "from": { "makeAxis" : [ + ["Keyboard.A"], + ["Keyboard.D"] + ] + }, + "when": ["Application.CameraLookAt", "!Keyboard.Control"], + "to": "Actions.Yaw" + }, + { "from": { "makeAxis" : [ ["Keyboard.TouchpadLeft"], ["Keyboard.TouchpadRight"] @@ -122,6 +140,15 @@ "to": "Actions.Yaw" }, + { "from": { "makeAxis" : [ + ["Keyboard.TouchpadLeft"], + ["Keyboard.TouchpadRight"] + ] + }, + "when": "Application.CameraLookAt", + "to": "Actions.Yaw" + }, + { "from": { "makeAxis" : ["Keyboard.MouseMoveLeft", "Keyboard.MouseMoveRight"] }, "when": "Keyboard.RightMouseButton", "to": "Actions.DeltaYaw", @@ -148,8 +175,10 @@ { "from": "Keyboard.Right", "when": "Keyboard.Shift", "to": "Actions.LATERAL_RIGHT" }, { "from": "Keyboard.Up", "when": "Application.CameraFirstPerson", "to": "Actions.LONGITUDINAL_FORWARD" }, { "from": "Keyboard.Up", "when": "Application.CameraThirdPerson", "to": "Actions.LONGITUDINAL_FORWARD" }, + { "from": "Keyboard.Up", "when": "Application.CameraLookAt", "to": "Actions.LONGITUDINAL_FORWARD" }, { "from": "Keyboard.Down", "when": "Application.CameraFirstPerson", "to": "Actions.LONGITUDINAL_BACKWARD" }, { "from": "Keyboard.Down", "when": "Application.CameraThirdPerson", "to": "Actions.LONGITUDINAL_BACKWARD" }, + { "from": "Keyboard.Down", "when": "Application.CameraLookAt", "to": "Actions.LONGITUDINAL_BACKWARD" }, { "from": "Keyboard.PgDown", "to": "Actions.VERTICAL_DOWN" }, { "from": "Keyboard.PgUp", "to": "Actions.VERTICAL_UP" }, diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 22bf3e2555..0dea3e2708 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1873,8 +1873,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo _applicationStateDevice->setInputVariant(STATE_CAMERA_THIRD_PERSON, []() -> float { return qApp->getCamera().getMode() == CAMERA_MODE_THIRD_PERSON ? 1 : 0; }); - // Look at camera and third person camera use the same input mapping - _applicationStateDevice->setInputVariant(STATE_CAMERA_THIRD_PERSON, []() -> float { + _applicationStateDevice->setInputVariant(STATE_CAMERA_LOOK_AT, []() -> float { return qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT ? 1 : 0; }); _applicationStateDevice->setInputVariant(STATE_CAMERA_ENTITY, []() -> float { diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 40d517767d..a367f6331f 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3505,7 +3505,7 @@ glm::vec3 MyAvatar::scaleMotorSpeed(const glm::vec3 forward, const glm::vec3 rig } else { // Desktop mode. if (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) { - direction = (zSpeed * forward); + direction = (zSpeed * forward) + (xSpeed * right); } else { direction = (zSpeed * forward) + (xSpeed * right); } From 0e4e09acb59801b8e7c84013d750a0b6f89a2828 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Fri, 6 Sep 2019 14:25:03 -0700 Subject: [PATCH 04/29] Add blending --- .../resources/avatar/avatar-animation.json | 9410 +++++++++-------- interface/src/avatar/MyAvatar.cpp | 55 +- interface/src/avatar/MyAvatar.h | 8 + libraries/animation/src/Rig.cpp | 5 + libraries/animation/src/Rig.h | 1 + 5 files changed, 4862 insertions(+), 4617 deletions(-) diff --git a/interface/resources/avatar/avatar-animation.json b/interface/resources/avatar/avatar-animation.json index cd0cbf4045..1d61dddd50 100644 --- a/interface/resources/avatar/avatar-animation.json +++ b/interface/resources/avatar/avatar-animation.json @@ -11,343 +11,112 @@ "children": [ { "children": [ - { - "children": [ - ], - "data": { - "solutionSource": "relaxToUnderPoses", - "solutionSourceVar": "solutionSource", - "targets": [ - { - "flexCoefficients": [ - 1 - ], - "jointName": "Hips", - "positionVar": "hipsPosition", - "rotationVar": "hipsRotation", - "typeVar": "hipsType", - "weight": 1, - "weightVar": "hipsWeight" - }, - { - "flexCoefficients": [ - 1, - 0.5, - 0.5, - 0.2, - 0.01, - 0.005, - 0.001, - 0, - 0 - ], - "jointName": "RightHand", - "poleReferenceVectorVar": "rightHandPoleReferenceVector", - "poleVectorEnabledVar": "rightHandPoleVectorEnabled", - "poleVectorVar": "rightHandPoleVector", - "positionVar": "rightHandPosition", - "rotationVar": "rightHandRotation", - "typeVar": "rightHandType", - "weight": 1, - "weightVar": "rightHandWeight" - }, - { - "flexCoefficients": [ - 1, - 0.5, - 0.5, - 0.2, - 0.01, - 0.005, - 0.001, - 0, - 0 - ], - "jointName": "LeftHand", - "poleReferenceVectorVar": "leftHandPoleReferenceVector", - "poleVectorEnabledVar": "leftHandPoleVectorEnabled", - "poleVectorVar": "leftHandPoleVector", - "positionVar": "leftHandPosition", - "rotationVar": "leftHandRotation", - "typeVar": "leftHandType", - "weight": 1, - "weightVar": "leftHandWeight" - }, - { - "flexCoefficients": [ - 1, - 0.5, - 0.25 - ], - "jointName": "Spine2", - "positionVar": "spine2Position", - "rotationVar": "spine2Rotation", - "typeVar": "spine2Type", - "weight": 2, - "weightVar": "spine2Weight" - }, - { - "flexCoefficients": [ - 1, - 0.5, - 0.25, - 0.2, - 0.1 - ], - "jointName": "Head", - "positionVar": "headPosition", - "rotationVar": "headRotation", - "typeVar": "headType", - "weight": 4, - "weightVar": "headWeight" - } - ] - }, - "id": "ik", - "type": "inverseKinematics" - }, { "children": [ { "children": [ ], "data": { + "solutionSource": "relaxToUnderPoses", + "solutionSourceVar": "solutionSource", + "targets": [ + { + "flexCoefficients": [ + 1 + ], + "jointName": "Hips", + "positionVar": "hipsPosition", + "rotationVar": "hipsRotation", + "typeVar": "hipsType", + "weight": 1, + "weightVar": "hipsWeight" + }, + { + "flexCoefficients": [ + 1, + 0.5, + 0.5, + 0.2, + 0.01, + 0.005, + 0.001, + 0, + 0 + ], + "jointName": "RightHand", + "poleReferenceVectorVar": "rightHandPoleReferenceVector", + "poleVectorEnabledVar": "rightHandPoleVectorEnabled", + "poleVectorVar": "rightHandPoleVector", + "positionVar": "rightHandPosition", + "rotationVar": "rightHandRotation", + "typeVar": "rightHandType", + "weight": 1, + "weightVar": "rightHandWeight" + }, + { + "flexCoefficients": [ + 1, + 0.5, + 0.5, + 0.2, + 0.01, + 0.005, + 0.001, + 0, + 0 + ], + "jointName": "LeftHand", + "poleReferenceVectorVar": "leftHandPoleReferenceVector", + "poleVectorEnabledVar": "leftHandPoleVectorEnabled", + "poleVectorVar": "leftHandPoleVector", + "positionVar": "leftHandPosition", + "rotationVar": "leftHandRotation", + "typeVar": "leftHandType", + "weight": 1, + "weightVar": "leftHandWeight" + }, + { + "flexCoefficients": [ + 1, + 0.5, + 0.25 + ], + "jointName": "Spine2", + "positionVar": "spine2Position", + "rotationVar": "spine2Rotation", + "typeVar": "spine2Type", + "weight": 2, + "weightVar": "spine2Weight" + }, + { + "flexCoefficients": [ + 1, + 0.5, + 0.25, + 0.2, + 0.1 + ], + "jointName": "Head", + "positionVar": "headPosition", + "rotationVar": "headRotation", + "typeVar": "headType", + "weight": 4, + "weightVar": "headWeight" + } + ] }, - "id": "defaultPose", - "type": "defaultPose" + "id": "ik", + "type": "inverseKinematics" }, { "children": [ { "children": [ - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 0, - "loopFlag": true, - "startFrame": 0, - "timeScale": 1, - "url": "qrc:///avatar/animations/hydra_pose_open_right.fbx" - }, - "id": "rightHandGraspOpen", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 0, - "loopFlag": true, - "startFrame": 0, - "timeScale": 1, - "url": "qrc:///avatar/animations/hydra_pose_closed_right.fbx" - }, - "id": "rightHandGraspClosed", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "rightHandGraspAlpha" - }, - "id": "rightHandGrasp", - "type": "blendLinear" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_point_open_right.fbx" - }, - "id": "rightIndexPointOpen", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_point_closed_right.fbx" - }, - "id": "rightIndexPointClosed", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "rightHandGraspAlpha" - }, - "id": "rightIndexPoint", - "type": "blendLinear" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_open_right.fbx" - }, - "id": "rightThumbRaiseOpen", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_closed_right.fbx" - }, - "id": "rightThumbRaiseClosed", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "rightHandGraspAlpha" - }, - "id": "rightThumbRaise", - "type": "blendLinear" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_point_open_right.fbx" - }, - "id": "rightIndexPointAndThumbRaiseOpen", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_point_closed_right.fbx" - }, - "id": "rightIndexPointAndThumbRaiseClosed", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "rightHandGraspAlpha" - }, - "id": "rightIndexPointAndThumbRaise", - "type": "blendLinear" - } ], "data": { - "currentState": "rightHandGrasp", - "states": [ - { - "id": "rightHandGrasp", - "interpDuration": 3, - "interpTarget": 3, - "transitions": [ - { - "state": "rightIndexPoint", - "var": "isRightIndexPoint" - }, - { - "state": "rightThumbRaise", - "var": "isRightThumbRaise" - }, - { - "state": "rightIndexPointAndThumbRaise", - "var": "isRightIndexPointAndThumbRaise" - } - ] - }, - { - "id": "rightIndexPoint", - "interpDuration": 3, - "interpTarget": 15, - "transitions": [ - { - "state": "rightHandGrasp", - "var": "isRightHandGrasp" - }, - { - "state": "rightThumbRaise", - "var": "isRightThumbRaise" - }, - { - "state": "rightIndexPointAndThumbRaise", - "var": "isRightIndexPointAndThumbRaise" - } - ] - }, - { - "id": "rightThumbRaise", - "interpDuration": 3, - "interpTarget": 15, - "transitions": [ - { - "state": "rightHandGrasp", - "var": "isRightHandGrasp" - }, - { - "state": "rightIndexPoint", - "var": "isRightIndexPoint" - }, - { - "state": "rightIndexPointAndThumbRaise", - "var": "isRightIndexPointAndThumbRaise" - } - ] - }, - { - "id": "rightIndexPointAndThumbRaise", - "interpDuration": 3, - "interpTarget": 15, - "transitions": [ - { - "state": "rightHandGrasp", - "var": "isRightHandGrasp" - }, - { - "state": "rightIndexPoint", - "var": "isRightIndexPoint" - }, - { - "state": "rightThumbRaise", - "var": "isRightThumbRaise" - } - ] - } - ] }, - "id": "rightHandStateMachine", - "type": "stateMachine" + "id": "defaultPose", + "type": "defaultPose" }, { "children": [ @@ -363,30 +132,30 @@ "loopFlag": true, "startFrame": 0, "timeScale": 1, - "url": "qrc:///avatar/animations/hydra_pose_open_left.fbx" + "url": "qrc:///avatar/animations/hydra_pose_open_right.fbx" }, - "id": "leftHandGraspOpen", + "id": "rightHandGraspOpen", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 10, + "endFrame": 0, "loopFlag": true, - "startFrame": 10, + "startFrame": 0, "timeScale": 1, - "url": "qrc:///avatar/animations/hydra_pose_closed_left.fbx" + "url": "qrc:///avatar/animations/hydra_pose_closed_right.fbx" }, - "id": "leftHandGraspClosed", + "id": "rightHandGraspClosed", "type": "clip" } ], "data": { "alpha": 0, - "alphaVar": "leftHandGraspAlpha" + "alphaVar": "rightHandGraspAlpha" }, - "id": "leftHandGrasp", + "id": "rightHandGrasp", "type": "blendLinear" }, { @@ -399,9 +168,9 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_point_open_left.fbx" + "url": "qrc:///avatar/animations/touch_point_open_right.fbx" }, - "id": "leftIndexPointOpen", + "id": "rightIndexPointOpen", "type": "clip" }, { @@ -412,17 +181,17 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_point_closed_left.fbx" + "url": "qrc:///avatar/animations/touch_point_closed_right.fbx" }, - "id": "leftIndexPointClosed", + "id": "rightIndexPointClosed", "type": "clip" } ], "data": { "alpha": 0, - "alphaVar": "leftHandGraspAlpha" + "alphaVar": "rightHandGraspAlpha" }, - "id": "leftIndexPoint", + "id": "rightIndexPoint", "type": "blendLinear" }, { @@ -435,9 +204,9 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_open_left.fbx" + "url": "qrc:///avatar/animations/touch_thumb_open_right.fbx" }, - "id": "leftThumbRaiseOpen", + "id": "rightThumbRaiseOpen", "type": "clip" }, { @@ -448,17 +217,17 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_closed_left.fbx" + "url": "qrc:///avatar/animations/touch_thumb_closed_right.fbx" }, - "id": "leftThumbRaiseClosed", + "id": "rightThumbRaiseClosed", "type": "clip" } ], "data": { "alpha": 0, - "alphaVar": "leftHandGraspAlpha" + "alphaVar": "rightHandGraspAlpha" }, - "id": "leftThumbRaise", + "id": "rightThumbRaise", "type": "blendLinear" }, { @@ -471,9 +240,9 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_point_open_left.fbx" + "url": "qrc:///avatar/animations/touch_thumb_point_open_right.fbx" }, - "id": "leftIndexPointAndThumbRaiseOpen", + "id": "rightIndexPointAndThumbRaiseOpen", "type": "clip" }, { @@ -484,102 +253,102 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_point_closed_left.fbx" + "url": "qrc:///avatar/animations/touch_thumb_point_closed_right.fbx" }, - "id": "leftIndexPointAndThumbRaiseClosed", + "id": "rightIndexPointAndThumbRaiseClosed", "type": "clip" } ], "data": { "alpha": 0, - "alphaVar": "leftHandGraspAlpha" + "alphaVar": "rightHandGraspAlpha" }, - "id": "leftIndexPointAndThumbRaise", + "id": "rightIndexPointAndThumbRaise", "type": "blendLinear" } ], "data": { - "currentState": "leftHandGrasp", + "currentState": "rightHandGrasp", "states": [ { - "id": "leftHandGrasp", + "id": "rightHandGrasp", "interpDuration": 3, "interpTarget": 3, "transitions": [ { - "state": "leftIndexPoint", - "var": "isLeftIndexPoint" + "state": "rightIndexPoint", + "var": "isRightIndexPoint" }, { - "state": "leftThumbRaise", - "var": "isLeftThumbRaise" + "state": "rightThumbRaise", + "var": "isRightThumbRaise" }, { - "state": "leftIndexPointAndThumbRaise", - "var": "isLeftIndexPointAndThumbRaise" + "state": "rightIndexPointAndThumbRaise", + "var": "isRightIndexPointAndThumbRaise" } ] }, { - "id": "leftIndexPoint", + "id": "rightIndexPoint", "interpDuration": 3, "interpTarget": 15, "transitions": [ { - "state": "leftHandGrasp", - "var": "isLeftHandGrasp" + "state": "rightHandGrasp", + "var": "isRightHandGrasp" }, { - "state": "leftThumbRaise", - "var": "isLeftThumbRaise" + "state": "rightThumbRaise", + "var": "isRightThumbRaise" }, { - "state": "leftIndexPointAndThumbRaise", - "var": "isLeftIndexPointAndThumbRaise" + "state": "rightIndexPointAndThumbRaise", + "var": "isRightIndexPointAndThumbRaise" } ] }, { - "id": "leftThumbRaise", + "id": "rightThumbRaise", "interpDuration": 3, "interpTarget": 15, "transitions": [ { - "state": "leftHandGrasp", - "var": "isLeftHandGrasp" + "state": "rightHandGrasp", + "var": "isRightHandGrasp" }, { - "state": "leftIndexPoint", - "var": "isLeftIndexPoint" + "state": "rightIndexPoint", + "var": "isRightIndexPoint" }, { - "state": "leftIndexPointAndThumbRaise", - "var": "isLeftIndexPointAndThumbRaise" + "state": "rightIndexPointAndThumbRaise", + "var": "isRightIndexPointAndThumbRaise" } ] }, { - "id": "leftIndexPointAndThumbRaise", + "id": "rightIndexPointAndThumbRaise", "interpDuration": 3, "interpTarget": 15, "transitions": [ { - "state": "leftHandGrasp", - "var": "isLeftHandGrasp" + "state": "rightHandGrasp", + "var": "isRightHandGrasp" }, { - "state": "leftIndexPoint", - "var": "isLeftIndexPoint" + "state": "rightIndexPoint", + "var": "isRightIndexPoint" }, { - "state": "leftThumbRaise", - "var": "isLeftThumbRaise" + "state": "rightThumbRaise", + "var": "isRightThumbRaise" } ] } ] }, - "id": "leftHandStateMachine", + "id": "rightHandStateMachine", "type": "stateMachine" }, { @@ -590,184 +359,37 @@ "children": [ { "children": [ - { - "children": [ - ], - "data": { - "endFrame": 271, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_talk02.fbx" - }, - "id": "seatedTalk02", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 252, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_talk03.fbx" - }, - "id": "seatedTalk03", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 442, - "loopFlag": true, - "startFrame": 0, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_talk04.fbx" - }, - "id": "seatedTalk04", - "type": "clip" - } ], "data": { - "currentState": "seatedTalk02", - "randomSwitchTimeMax": 12, - "randomSwitchTimeMin": 7, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "seatedTalk02", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 1, - "resume": true, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedTalk03", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 1, - "resume": true, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedTalk04", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 1, - "resume": true, - "transitions": [ - ] - } - ], - "triggerRandomSwitch": "seatedTalkSwitch" + "endFrame": 0, + "loopFlag": true, + "startFrame": 0, + "timeScale": 1, + "url": "qrc:///avatar/animations/hydra_pose_open_left.fbx" }, - "id": "seatedTalk", - "type": "randomSwitchStateMachine" + "id": "leftHandGraspOpen", + "type": "clip" }, { "children": [ - { - "children": [ - ], - "data": { - "endFrame": 800, - "loopFlag": true, - "startFrame": 0, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_idle.fbx" - }, - "id": "seatedIdle01", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 800, - "loopFlag": true, - "startFrame": 0, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_idle02.fbx" - }, - "id": "seatedIdle02", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 800, - "loopFlag": true, - "startFrame": 0, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_idle03.fbx" - }, - "id": "seatedIdle03", - "type": "clip" - } ], "data": { - "currentState": "seatedIdle01", - "randomSwitchTimeMax": 20, - "randomSwitchTimeMin": 10, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "seatedIdle01", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 1, - "resume": true, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedIdle02", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 1, - "resume": true, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedIdle03", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 1, - "resume": true, - "transitions": [ - ] - } - ], - "triggerRandomSwitch": "seatedIdleSwitch" + "endFrame": 10, + "loopFlag": true, + "startFrame": 10, + "timeScale": 1, + "url": "qrc:///avatar/animations/hydra_pose_closed_left.fbx" }, - "id": "seatedIdle", - "type": "randomSwitchStateMachine" + "id": "leftHandGraspClosed", + "type": "clip" } ], "data": { - "alpha": 1, - "alphaVar": "talkOverlayAlpha", - "boneSet": "upperBody" + "alpha": 0, + "alphaVar": "leftHandGraspAlpha" }, - "id": "seatedTalkOverlay", - "type": "overlay" + "id": "leftHandGrasp", + "type": "blendLinear" }, { "children": [ @@ -775,106 +397,35 @@ "children": [ ], "data": { - "endFrame": 44, - "loopFlag": false, - "startFrame": 1, + "endFrame": 15, + "loopFlag": true, + "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_agree_headnod.fbx" + "url": "qrc:///avatar/animations/touch_point_open_left.fbx" }, - "id": "seatedReactionPositiveHeadNod", + "id": "leftIndexPointOpen", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 78, - "loopFlag": false, - "startFrame": 1, + "endFrame": 15, + "loopFlag": true, + "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_agree_headnodyes.fbx" + "url": "qrc:///avatar/animations/touch_point_closed_left.fbx" }, - "id": "seatedReactionPositiveHeadNodYes", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 65, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_agree_longheadnod.fbx" - }, - "id": "seatedReactionPositiveLongHeadNod", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 78, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_agree_cheer.fbx" - }, - "id": "seatedReactionPositiveCheer", + "id": "leftIndexPointClosed", "type": "clip" } ], "data": { - "currentState": "seatedReactionPositiveHeadNod", - "endFrame": 30, - "loopFlag": false, - "randomSwitchTimeMax": 12, - "randomSwitchTimeMin": 7, - "startFrame": 0, - "states": [ - { - "id": "seatedReactionPositiveHeadNod", - "interpDuration": 1, - "interpTarget": 1, - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "id": "seatedReactionPositiveHeadNodYes", - "interpDuration": 1, - "interpTarget": 1, - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "id": "seatedReactionPositiveLongHeadNod", - "interpDuration": 1, - "interpTarget": 1, - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "id": "seatedReactionPositiveCheer", - "interpDuration": 1, - "interpTarget": 1, - "priority": 1, - "resume": false, - "transitions": [ - ] - } - ], - "timeScale": 1, - "triggerRandomSwitch": "", - "url": "qrc:///avatar/animations/sitting_idle.fbx" + "alpha": 0, + "alphaVar": "leftHandGraspAlpha" }, - "id": "seatedReactionPositive", - "type": "randomSwitchStateMachine" + "id": "leftIndexPoint", + "type": "blendLinear" }, { "children": [ @@ -882,90 +433,35 @@ "children": [ ], "data": { - "endFrame": 64, - "loopFlag": false, - "startFrame": 0, + "endFrame": 15, + "loopFlag": true, + "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_disagree_headshake.fbx" + "url": "qrc:///avatar/animations/touch_thumb_open_left.fbx" }, - "id": "seatedReactionNegativeDisagreeHeadshake", + "id": "leftThumbRaiseOpen", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 99, - "loopFlag": false, - "startFrame": 0, + "endFrame": 15, + "loopFlag": true, + "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_disagree_drophead.fbx" + "url": "qrc:///avatar/animations/touch_thumb_closed_left.fbx" }, - "id": "seatedReactionNegativeDisagreeDropHead", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 124, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_disagree_disbelief.fbx" - }, - "id": "seatedReactionNegativeDisagreeDisbelief", + "id": "leftThumbRaiseClosed", "type": "clip" } ], "data": { - "currentState": "seatedReactionNegativeDisagreeHeadshake", - "endFrame": 30, - "loopFlag": false, - "randomSwitchTimeMax": 10, - "randomSwitchTimeMin": 1, - "startFrame": 0, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "seatedReactionNegativeDisagreeHeadshake", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionNegativeDisagreeDropHead", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionNegativeDisagreeDisbelief", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - } - ], - "timeScale": 1, - "triggerRandomSwitch": "", - "url": "qrc:///avatar/animations/sitting_idle.fbx" + "alpha": 0, + "alphaVar": "leftHandGraspAlpha" }, - "id": "seatedReactionNegative", - "type": "randomSwitchStateMachine" + "id": "leftThumbRaise", + "type": "blendLinear" }, { "children": [ @@ -973,847 +469,125 @@ "children": [ ], "data": { - "endFrame": 32, - "loopFlag": false, - "startFrame": 0, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_raisehand_all.fbx" - }, - "id": "seatedReactionRaiseHandIntro", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 345, + "endFrame": 15, "loopFlag": true, - "startFrame": 32, + "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_raisehand_all.fbx" + "url": "qrc:///avatar/animations/touch_thumb_point_open_left.fbx" }, - "id": "seatedReactionRaiseHandLoop", + "id": "leftIndexPointAndThumbRaiseOpen", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 400, - "loopFlag": false, - "startFrame": 345, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_raisehand_all.fbx" - }, - "id": "seatedReactionRaiseHandOutro", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 18, - "loopFlag": false, - "startFrame": 0, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_raisehand02_all.fbx" - }, - "id": "seatedReactionRaiseHand02Intro", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 378, + "endFrame": 15, "loopFlag": true, - "startFrame": 18, + "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_raisehand02_all.fbx" + "url": "qrc:///avatar/animations/touch_thumb_point_closed_left.fbx" }, - "id": "seatedReactionRaiseHand02Loop", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 435, - "loopFlag": false, - "startFrame": 378, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_raisehand02_all.fbx" - }, - "id": "seatedReactionRaiseHand02Outro", + "id": "leftIndexPointAndThumbRaiseClosed", "type": "clip" } ], "data": { - "currentState": "seatedReactionRaiseHandIntro", - "randomSwitchTimeMax": 10, - "randomSwitchTimeMin": 1, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "seatedReactionRaiseHandIntro", - "interpDuration": 8, - "interpTarget": 8, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionRaiseHandLoop", - "var": "seatedReactionRaiseHandIntroOnDone" - } - ] - }, - { - "id": "seatedReactionRaiseHandLoop", - "interpDuration": 1, - "interpTarget": 1, - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionRaiseHandOutro", - "var": "reactionRaiseHandDisabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionRaiseHandOutro", - "interpDuration": 12, - "interpTarget": 12, - "interpType": "evaluateBoth", - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionRaiseHandLoop", - "var": "reactionRaiseHandEnabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionRaiseHand02Intro", - "interpDuration": 8, - "interpTarget": 8, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionRaiseHand02Loop", - "var": "seatedReactionRaiseHand02IntroOnDone" - } - ] - }, - { - "id": "seatedReactionRaiseHand02Loop", - "interpDuration": 1, - "interpTarget": 1, - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionRaiseHand02Outro", - "var": "reactionRaiseHandDisabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionRaiseHand02Outro", - "interpDuration": 12, - "interpTarget": 12, - "interpType": "evaluateBoth", - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionRaiseHand02Loop", - "var": "reactionRaiseHandEnabled" - } - ] - } - ], - "triggerRandomSwitch": "" + "alpha": 0, + "alphaVar": "leftHandGraspAlpha" }, - "id": "seatedReactionRaiseHand", - "type": "randomSwitchStateMachine" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 12, - "loopFlag": false, - "startFrame": 0, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_clap_all.fbx" - }, - "id": "seatedReactionApplaudIntro", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 76, - "loopFlag": true, - "startFrame": 12, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_clap_all.fbx" - }, - "id": "seatedReactionApplaudLoop", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 99, - "loopFlag": false, - "startFrame": 76, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_clap_all.fbx" - }, - "id": "seatedReactionApplaudOutro", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 12, - "loopFlag": false, - "startFrame": 0, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_clap02_all.fbx" - }, - "id": "seatedReactionApplaud02Intro", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 112, - "loopFlag": true, - "startFrame": 12, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_clap02_all.fbx" - }, - "id": "seatedReactionApplaud02Loop", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 132, - "loopFlag": false, - "startFrame": 112, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_clap02_all.fbx" - }, - "id": "seatedReactionApplaud02Outro", - "type": "clip" - } - ], - "data": { - "currentState": "seatedReactionApplaudIntro", - "randomSwitchTimeMax": 10, - "randomSwitchTimeMin": 1, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "seatedReactionApplaudIntro", - "interpDuration": 8, - "interpTarget": 8, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionApplaudLoop", - "var": "seatedReactionApplaudIntroOnDone" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionApplaudLoop", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionApplaudOutro", - "var": "reactionApplaudDisabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionApplaudOutro", - "interpDuration": 12, - "interpTarget": 12, - "interpType": "evaluateBoth", - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionApplaudLoop", - "var": "reactionApplaudEnabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionApplaud02Intro", - "interpDuration": 8, - "interpTarget": 8, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionApplaud02Loop", - "var": "seatedReactionApplaud02IntroOnDone" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionApplaud02Loop", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionApplaud02Outro", - "var": "reactionApplaudDisabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionApplaud02Outro", - "interpDuration": 12, - "interpTarget": 12, - "interpType": "evaluateBoth", - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionApplaud02Loop", - "var": "reactionApplaudEnabled" - } - ] - } - ], - "triggerRandomSwitch": "" - }, - "id": "seatedReactionApplaud", - "type": "randomSwitchStateMachine" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 22, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_point_all.fbx" - }, - "id": "seatedReactionPointIntro", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 43, - "loopFlag": true, - "startFrame": 22, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_point_all.fbx" - }, - "id": "seatedReactionPointLoop", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 71, - "loopFlag": false, - "startFrame": 43, - "timeScale": 1, - "url": "qrc:///avatar/animations/sitting_emote_point_all.fbx" - }, - "id": "seatedReactionPointOutro", - "type": "clip" - } - ], - "data": { - "currentState": "seatedReactionPointIntro", - "randomSwitchTimeMax": 10, - "randomSwitchTimeMin": 1, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "seatedReactionPointIntro", - "interpDuration": 18, - "interpTarget": 18, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionPointLoop", - "var": "seatedReactionPointIntroOnDone" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionPointLoop", - "interpDuration": 18, - "interpTarget": 18, - "interpType": "evaluateBoth", - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionPointOutro", - "var": "reactionPointDisabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionPointOutro", - "interpDuration": 18, - "interpTarget": 18, - "interpType": "evaluateBoth", - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "seatedReactionPointLoop", - "var": "reactionPointEnabled" - } - ] - } - ], - "triggerRandomSwitch": "" - }, - "id": "seatedReactionPoint", - "type": "randomSwitchStateMachine" + "id": "leftIndexPointAndThumbRaise", + "type": "blendLinear" } ], "data": { - "currentState": "seatedTalkOverlay", + "currentState": "leftHandGrasp", "states": [ { - "easingType": "easeInOutQuad", - "id": "seatedTalkOverlay", - "interpDuration": 25, - "interpTarget": 25, - "interpType": "evaluateBoth", + "id": "leftHandGrasp", + "interpDuration": 3, + "interpTarget": 3, "transitions": [ { - "state": "seatedReactionPositive", - "var": "reactionPositiveTrigger" + "state": "leftIndexPoint", + "var": "isLeftIndexPoint" }, { - "state": "seatedReactionNegative", - "var": "reactionNegativeTrigger" + "state": "leftThumbRaise", + "var": "isLeftThumbRaise" }, { - "state": "seatedReactionRaiseHand", - "var": "reactionRaiseHandEnabled" - }, - { - "state": "seatedReactionApplaud", - "var": "reactionApplaudEnabled" - }, - { - "state": "seatedReactionPoint", - "var": "reactionPointEnabled" + "state": "leftIndexPointAndThumbRaise", + "var": "isLeftIndexPointAndThumbRaise" } ] }, { - "easingType": "easeInOutQuad", - "id": "seatedReactionPositive", - "interpDuration": 12, - "interpTarget": 12, - "interpType": "evaluateBoth", + "id": "leftIndexPoint", + "interpDuration": 3, + "interpTarget": 15, "transitions": [ { - "state": "seatedTalkOverlay", - "var": "seatedReactionPositiveHeadNodOnDone" + "state": "leftHandGrasp", + "var": "isLeftHandGrasp" }, { - "state": "seatedTalkOverlay", - "var": "seatedReactionPositiveHeadNodYesOnDone" + "state": "leftThumbRaise", + "var": "isLeftThumbRaise" }, { - "state": "seatedTalkOverlay", - "var": "seatedReactionPositiveLongHeadNodOnDone" - }, - { - "state": "seatedTalkOverlay", - "var": "seatedReactionPositiveCheerOnDone" - }, - { - "state": "seatedReactionNegative", - "var": "reactionNegativeTrigger" - }, - { - "state": "seatedReactionRaiseHand", - "var": "reactionRaiseHandEnabled" - }, - { - "state": "seatedReactionApplaud", - "var": "reactionApplaudEnabled" - }, - { - "state": "seatedReactionPoint", - "var": "reactionPointEnabled" + "state": "leftIndexPointAndThumbRaise", + "var": "isLeftIndexPointAndThumbRaise" } ] }, { - "easingType": "easeInOutQuad", - "id": "seatedReactionNegative", - "interpDuration": 12, - "interpTarget": 12, - "interpType": "evaluateBoth", + "id": "leftThumbRaise", + "interpDuration": 3, + "interpTarget": 15, "transitions": [ { - "state": "seatedReactionPositive", - "var": "reactionPositiveTrigger" + "state": "leftHandGrasp", + "var": "isLeftHandGrasp" }, { - "state": "seatedTalkOverlay", - "var": "seatedReactionNegativeDisagreeHeadshakeOnDone" + "state": "leftIndexPoint", + "var": "isLeftIndexPoint" }, { - "state": "seatedTalkOverlay", - "var": "seatedReactionNegativeDisagreeDropHeadOnDone" - }, - { - "state": "seatedTalkOverlay", - "var": "seatedReactionNegativeDisagreeDisbeliefOnDone" - }, - { - "state": "seatedReactionRaiseHand", - "var": "reactionRaiseHandEnabled" - }, - { - "state": "seatedReactionApplaud", - "var": "reactionApplaudEnabled" - }, - { - "state": "seatedReactionPoint", - "var": "reactionPointEnabled" + "state": "leftIndexPointAndThumbRaise", + "var": "isLeftIndexPointAndThumbRaise" } ] }, { - "easingType": "easeInOutQuad", - "id": "seatedReactionRaiseHand", - "interpDuration": 12, - "interpTarget": 12, - "interpType": "evaluateBoth", + "id": "leftIndexPointAndThumbRaise", + "interpDuration": 3, + "interpTarget": 15, "transitions": [ { - "state": "seatedReactionNegative", - "var": "reactionNegativeTrigger" + "state": "leftHandGrasp", + "var": "isLeftHandGrasp" }, { - "state": "seatedReactionPositive", - "var": "reactionPositiveTrigger" + "state": "leftIndexPoint", + "var": "isLeftIndexPoint" }, { - "state": "seatedTalkOverlay", - "var": "reactionRaiseHandDisabled" - }, - { - "state": "seatedReactionApplaud", - "var": "reactionApplaudEnabled" - }, - { - "state": "seatedReactionPoint", - "var": "reactionPointEnabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionApplaud", - "interpDuration": 12, - "interpTarget": 12, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "seatedReactionNegative", - "var": "reactionNegativeTrigger" - }, - { - "state": "seatedReactionPositive", - "var": "reactionPositiveTrigger" - }, - { - "state": "seatedReactionRaiseHand", - "var": "reactionRaiseHandEnabled" - }, - { - "state": "seatedTalkOverlay", - "var": "reactionApplaudDisabled" - }, - { - "state": "seatedReactionPoint", - "var": "reactionPointEnabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "seatedReactionPoint", - "interpDuration": 12, - "interpTarget": 12, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "seatedReactionNegative", - "var": "reactionNegativeTrigger" - }, - { - "state": "seatedReactionPositive", - "var": "reactionPositiveTrigger" - }, - { - "state": "seatedReactionRaiseHand", - "var": "reactionRaiseHandEnabled" - }, - { - "state": "seatedReactionApplaud", - "var": "reactionApplaudEnabled" - }, - { - "state": "seatedTalkOverlay", - "var": "reactionPointDisabled" + "state": "leftThumbRaise", + "var": "isLeftThumbRaise" } ] } ] }, - "id": "seated", + "id": "leftHandStateMachine", "type": "stateMachine" }, { "children": [ { "children": [ - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 500, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/talk.fbx" - }, - "id": "talk", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 325, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/talk02.fbx" - }, - "id": "talk02", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 300, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/talk03.fbx" - }, - "id": "talk03", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 500, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/talk04.fbx" - }, - "id": "talk04", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 215, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/talk_armsdown.fbx" - }, - "id": "talk_armsdown", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 500, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/talk_lefthand.fbx" - }, - "id": "talk_lefthand", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 502, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/talk_righthand.fbx" - }, - "id": "talk_righthand", - "type": "clip" - } - ], - "data": { - "currentState": "talk", - "randomSwitchTimeMax": 12, - "randomSwitchTimeMin": 7, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "talk", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.33, - "resume": true, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "talk02", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.33, - "resume": true, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "talk03", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.33, - "resume": true, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "talk04", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.33, - "resume": true, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "talk_armsdown", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.33, - "resume": true, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "talk_lefthand", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.33, - "resume": true, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "talk_righthand", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.33, - "resume": true, - "transitions": [ - ] - } - ], - "triggerRandomSwitch": "idleTalkSwitch" - }, - "id": "idleTalk", - "type": "randomSwitchStateMachine" - }, { "children": [ { @@ -1822,26 +596,99 @@ "children": [ ], "data": { - "endFrame": 300, + "endFrame": 271, "loopFlag": true, "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/idle.fbx" + "url": "qrc:///avatar/animations/sitting_talk02.fbx" }, - "id": "masterIdle1", + "id": "seatedTalk02", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 400, + "endFrame": 252, "loopFlag": true, "startFrame": 1, - "timeScale": 0.75, - "url": "qrc:///avatar/animations/idle02.fbx" + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_talk03.fbx" }, - "id": "masterIdle2", + "id": "seatedTalk03", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 442, + "loopFlag": true, + "startFrame": 0, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_talk04.fbx" + }, + "id": "seatedTalk04", + "type": "clip" + } + ], + "data": { + "currentState": "seatedTalk02", + "randomSwitchTimeMax": 12, + "randomSwitchTimeMin": 7, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "seatedTalk02", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 1, + "resume": true, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedTalk03", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 1, + "resume": true, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedTalk04", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 1, + "resume": true, + "transitions": [ + ] + } + ], + "triggerRandomSwitch": "seatedTalkSwitch" + }, + "id": "seatedTalk", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 800, + "loopFlag": true, + "startFrame": 0, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_idle.fbx" + }, + "id": "seatedIdle01", "type": "clip" }, { @@ -1850,893 +697,185 @@ "data": { "endFrame": 800, "loopFlag": true, - "startFrame": 1, + "startFrame": 0, "timeScale": 1, - "url": "qrc:///avatar/animations/idle03.fbx" + "url": "qrc:///avatar/animations/sitting_idle02.fbx" }, - "id": "masterIdle3", + "id": "seatedIdle02", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 902, + "endFrame": 800, "loopFlag": true, - "startFrame": 1, + "startFrame": 0, "timeScale": 1, - "url": "qrc:///avatar/animations/idle04.fbx" + "url": "qrc:///avatar/animations/sitting_idle03.fbx" }, - "id": "masterIdle4", + "id": "seatedIdle03", "type": "clip" } ], "data": { - "currentState": "masterIdle1", - "randomSwitchTimeMax": 30, + "currentState": "seatedIdle01", + "randomSwitchTimeMax": 20, "randomSwitchTimeMin": 10, "states": [ { "easingType": "easeInOutQuad", - "id": "masterIdle1", - "interpDuration": 30, - "interpTarget": 30, + "id": "seatedIdle01", + "interpDuration": 15, + "interpTarget": 15, "interpType": "evaluateBoth", - "priority": 0.25, + "priority": 1, "resume": true, "transitions": [ ] }, { "easingType": "easeInOutQuad", - "id": "masterIdle2", - "interpDuration": 30, - "interpTarget": 30, + "id": "seatedIdle02", + "interpDuration": 15, + "interpTarget": 15, "interpType": "evaluateBoth", - "priority": 0.25, + "priority": 1, "resume": true, "transitions": [ ] }, { "easingType": "easeInOutQuad", - "id": "masterIdle3", - "interpDuration": 30, - "interpTarget": 30, + "id": "seatedIdle03", + "interpDuration": 15, + "interpTarget": 15, "interpType": "evaluateBoth", - "priority": 0.25, - "resume": true, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "masterIdle4", - "interpDuration": 30, - "interpTarget": 30, - "interpType": "evaluateBoth", - "priority": 0.25, + "priority": 1, "resume": true, "transitions": [ ] } ], - "triggerRandomSwitch": "masterIdleSwitch" + "triggerRandomSwitch": "seatedIdleSwitch" }, - "id": "masterIdle", - "type": "randomSwitchStateMachine" - }, - { - "children": [ - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 91, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_once_slownod.fbx" - }, - "id": "idle_once_slownod", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 154, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_once_headtilt.fbx" - }, - "id": "idle_once_headtilt", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 491, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_once_shiftheelpivot.fbx" - }, - "id": "idle_once_shiftheelpivot", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 1620, - "loopFlag": false, - "startFrame": 1, - "timeScale": 0.7, - "url": "qrc:///avatar/animations/idleWS_all.fbx" - }, - "id": "idleWS_all", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 324, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_once_lookaround.fbx" - }, - "id": "idle_once_lookaround", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 169, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_once_neckstretch.fbx" - }, - "id": "idle_once_neckstretch", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 375, - "loopFlag": false, - "startFrame": 1, - "timeScale": 0.7, - "url": "qrc:///avatar/animations/idle_once_lookleftright.fbx" - }, - "id": "idle_once_lookleftright", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 429, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_once_fidget.fbx" - }, - "id": "idle_once_fidget", - "type": "clip" - } - ], - "data": { - "currentState": "idle_once_slownod", - "states": [ - { - "easingType": "easeInOutQuad", - "id": "idle_once_slownod", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.2, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "idle_once_headtilt", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.2, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "idle_once_shiftheelpivot", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.2, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "idleWS_all", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.2, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "idle_once_lookaround", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.2, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "idle_once_neckstretch", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.2, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "idle_once_lookleftright", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.2, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "idle_once_fidget", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 0.2, - "resume": false, - "transitions": [ - ] - } - ] - }, - "id": "movement", - "type": "randomSwitchStateMachine" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 80, - "loopFlag": false, - "startFrame": 1, - "startFrameVar": "", - "timeScale": 0.65, - "url": "qrc:///avatar/animations/idle_LFF_all.fbx" - }, - "id": "transitionToAltIdle1", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 80, - "loopFlag": false, - "startFrame": 1, - "timeScale": 0.65, - "url": "qrc:///avatar/animations/idle_RFF_all.fbx" - }, - "id": "transitionToAltIdle2", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 388, - "loopFlag": true, - "startFrame": 80, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_LFF_all.fbx" - }, - "id": "altIdle1", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 388, - "loopFlag": true, - "startFrame": 80, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_RFF_all.fbx" - }, - "id": "altIdle2", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 472, - "loopFlag": false, - "startFrame": 388, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_LFF_all.fbx" - }, - "id": "alt1ToMasterIdle", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 453, - "loopFlag": false, - "startFrame": 388, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_RFF_all.fbx" - }, - "id": "alt2ToMasterIdle", - "type": "clip" - } - ], - "data": { - "currentState": "transitionToAltIdle1", - "states": [ - { - "easingType": "easeInOutQuad", - "id": "transitionToAltIdle1", - "interpDuration": 20, - "interpTarget": 20, - "interpType": "evaluateBoth", - "priority": 0.5, - "resume": false, - "transitions": [ - { - "randomSwitchState": "altIdle1", - "var": "transitionToAltIdle1OnDone" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "transitionToAltIdle2", - "interpDuration": 20, - "interpTarget": 20, - "interpType": "evaluateBoth", - "priority": 0.5, - "resume": false, - "transitions": [ - { - "randomSwitchState": "altIdle2", - "var": "transitionToAltIdle2OnDone" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "altIdle1", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": -1, - "resume": false, - "transitions": [ - { - "randomSwitchState": "alt1ToMasterIdle", - "var": "finishAltIdle2" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "altIdle2", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": -1, - "resume": false, - "transitions": [ - { - "randomSwitchState": "alt2ToMasterIdle", - "var": "finishAltIdle2" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "alt1ToMasterIdle", - "interpDuration": 24, - "interpTarget": 24, - "interpType": "evaluateBoth", - "priority": -1, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "alt2ToMasterIdle", - "interpDuration": 24, - "interpTarget": 24, - "interpType": "evaluateBoth", - "priority": -1, - "resume": false, - "transitions": [ - ] - } - ], - "transitionVar": "finishAltIdle2", - "triggerTimeMax": 60, - "triggerTimeMin": 10 - }, - "id": "alternateIdle", - "type": "randomSwitchStateMachine" - } - ], - "data": { - "currentState": "movement", - "states": [ - { - "easingType": "easeInOutQuad", - "id": "movement", - "interpDuration": 30, - "interpTarget": 30, - "interpType": "evaluateBoth", - "priority": 0.6, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "alternateIdle", - "interpDuration": 30, - "interpTarget": 30, - "interpType": "evaluateBoth", - "priority": 0.4, - "resume": false, - "transitions": [ - ] - } - ] - }, - "id": "fidget", + "id": "seatedIdle", "type": "randomSwitchStateMachine" } ], "data": { - "currentState": "masterIdle", - "states": [ - { - "easingType": "easeInOutQuad", - "id": "masterIdle", - "interpDuration": 30, - "interpTarget": 30, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - { - "randomSwitchState": "fidget", - "var": "timeToFidget" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "fidget", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": -1, - "resume": false, - "transitions": [ - { - "randomSwitchState": "masterIdle", - "var": "idle_once_slownodOnDone" - }, - { - "randomSwitchState": "masterIdle", - "var": "idle_once_headtiltOnDone" - }, - { - "randomSwitchState": "masterIdle", - "var": "idle_once_shiftheelpivotOnDone" - }, - { - "randomSwitchState": "masterIdle", - "var": "idleWS_allOnDone" - }, - { - "randomSwitchState": "masterIdle", - "var": "idle_once_lookaroundOnDone" - }, - { - "randomSwitchState": "masterIdle", - "var": "idle_once_neckstretchOnDone" - }, - { - "randomSwitchState": "masterIdle", - "var": "idle_once_lookleftrightOnDone" - }, - { - "randomSwitchState": "masterIdle", - "var": "idle_once_fidgetOnDone" - }, - { - "randomSwitchState": "masterIdle", - "var": "alt1ToMasterIdleOnDone" - }, - { - "randomSwitchState": "masterIdle", - "var": "alt2ToMasterIdleOnDone" - } - ] - } - ], - "transitionVar": "timeToFidget", - "triggerTimeMax": 50, - "triggerTimeMin": 10 + "alpha": 1, + "alphaVar": "talkOverlayAlpha", + "boneSet": "upperBody" }, - "id": "idleStand", - "type": "randomSwitchStateMachine" - } - ], - "data": { - "alpha": 1, - "alphaVar": "talkOverlayAlpha", - "boneSet": "upperBody" - }, - "id": "idleTalkOverlay", - "type": "overlay" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 58, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_agree_acknowledge.fbx" - }, - "id": "positiveAcknowledge", - "type": "clip" + "id": "seatedTalkOverlay", + "type": "overlay" }, - { - "children": [ - ], - "data": { - "endFrame": 55, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_agree_headnod.fbx" - }, - "id": "positiveHeadNod", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 78, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_agree_headnodyes.fbx" - }, - "id": "positiveHeadNodYes", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 66, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_agree_longheadnod.fbx" - }, - "id": "positiveLongHeadNod", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 85, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_agree_thoughtfulheadnod.fbx" - }, - "id": "positiveThoughtfulHeadNod", - "type": "clip" - } - ], - "data": { - "currentState": "positiveAcknowledge", - "randomSwitchTimeMax": 10, - "randomSwitchTimeMin": 1, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "positiveAcknowledge", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "positiveHeadNod", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "positiveHeadNodYes", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "positiveLongHeadNod", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "positiveThoughtfulHeadNod", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 0.33, - "resume": false, - "transitions": [ - ] - } - ], - "triggerRandomSwitch": "" - }, - "id": "reactionPositive", - "type": "randomSwitchStateMachine" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 72, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_disagree_annoyedheadshake.fbx" - }, - "id": "negativeAnnoyedHeadshake", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 92, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_disagree_thoughtfulheadshake.fbx" - }, - "id": "negativeThoughtfulHeadshake", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 158, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_disagree_drophead.fbx" - }, - "id": "negativeDropHead", - "type": "clip" - } - ], - "data": { - "currentState": "negativeAnnoyedHeadshake", - "randomSwitchTimeMax": 10, - "randomSwitchTimeMin": 1, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "negativeAnnoyedHeadshake", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "negativeThoughtfulHeadshake", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "negativeDropHead", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - } - ] - }, - "id": "reactionNegative", - "type": "randomSwitchStateMachine" - }, - { - "children": [ { "children": [ { "children": [ ], "data": { - "endFrame": 18, + "endFrame": 44, "loopFlag": false, "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_raisehand01_all.fbx" + "url": "qrc:///avatar/animations/sitting_emote_agree_headnod.fbx" }, - "id": "raiseHand01Intro", + "id": "seatedReactionPositiveHeadNod", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 378, - "loopFlag": true, - "startFrame": 18, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_raisehand01_all.fbx" - }, - "id": "raiseHand01Loop", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 435, + "endFrame": 78, "loopFlag": false, - "startFrame": 378, + "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_raisehand01_all.fbx" + "url": "qrc:///avatar/animations/sitting_emote_agree_headnodyes.fbx" }, - "id": "raiseHand01Outro", + "id": "seatedReactionPositiveHeadNodYes", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 65, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_agree_longheadnod.fbx" + }, + "id": "seatedReactionPositiveLongHeadNod", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 78, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_agree_cheer.fbx" + }, + "id": "seatedReactionPositiveCheer", "type": "clip" } ], "data": { - "currentState": "raiseHand01Intro", - "randomSwitchTimeMax": 10, - "randomSwitchTimeMin": 1, + "currentState": "seatedReactionPositiveHeadNod", + "endFrame": 30, + "loopFlag": false, + "randomSwitchTimeMax": 12, + "randomSwitchTimeMin": 7, + "startFrame": 0, "states": [ { - "easingType": "easeInOutQuad", - "id": "raiseHand01Intro", - "interpDuration": 10, - "interpTarget": 10, - "interpType": "evaluateBoth", + "id": "seatedReactionPositiveHeadNod", + "interpDuration": 1, + "interpTarget": 1, "priority": 1, "resume": false, "transitions": [ - { - "randomSwitchState": "raiseHand01Loop", - "var": "raiseHand01IntroOnDone" - } ] }, { - "id": "raiseHand01Loop", + "id": "seatedReactionPositiveHeadNodYes", "interpDuration": 1, "interpTarget": 1, - "priority": 0, + "priority": 1, "resume": false, "transitions": [ - { - "randomSwitchState": "raiseHand01Outro", - "var": "reactionRaiseHandDisabled" - } ] }, { - "id": "raiseHand01Outro", - "interpDuration": 6, - "interpTarget": 6, - "priority": 0, + "id": "seatedReactionPositiveLongHeadNod", + "interpDuration": 1, + "interpTarget": 1, + "priority": 1, + "resume": false, + "transitions": [ + ] + }, + { + "id": "seatedReactionPositiveCheer", + "interpDuration": 1, + "interpTarget": 1, + "priority": 1, "resume": false, "transitions": [ - { - "randomSwitchState": "raiseHand01Loop", - "var": "reactionRaiseHandEnabled" - } ] } ], - "triggerRandomSwitch": "" + "timeScale": 1, + "triggerRandomSwitch": "", + "url": "qrc:///avatar/animations/sitting_idle.fbx" }, - "id": "raiseHand01", + "id": "seatedReactionPositive", "type": "randomSwitchStateMachine" }, { @@ -2745,92 +884,89 @@ "children": [ ], "data": { - "endFrame": 19, + "endFrame": 64, + "loopFlag": false, + "startFrame": 0, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_disagree_headshake.fbx" + }, + "id": "seatedReactionNegativeDisagreeHeadshake", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 99, + "loopFlag": false, + "startFrame": 0, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_disagree_drophead.fbx" + }, + "id": "seatedReactionNegativeDisagreeDropHead", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 124, "loopFlag": false, "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_raisehand03_all.fbx" + "url": "qrc:///avatar/animations/sitting_emote_disagree_disbelief.fbx" }, - "id": "raiseHand03Intro", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 237, - "loopFlag": true, - "startFrame": 19, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_raisehand03_all.fbx" - }, - "id": "raiseHand03Loop", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 300, - "loopFlag": false, - "startFrame": 237, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_raisehand03_all.fbx" - }, - "id": "raiseHand03Outro", + "id": "seatedReactionNegativeDisagreeDisbelief", "type": "clip" } ], "data": { - "currentState": "raiseHand03Intro", + "currentState": "seatedReactionNegativeDisagreeHeadshake", + "endFrame": 30, + "loopFlag": false, "randomSwitchTimeMax": 10, "randomSwitchTimeMin": 1, + "startFrame": 0, "states": [ { "easingType": "easeInOutQuad", - "id": "raiseHand03Intro", - "interpDuration": 15, - "interpTarget": 15, + "id": "seatedReactionNegativeDisagreeHeadshake", + "interpDuration": 1, + "interpTarget": 1, "interpType": "evaluateBoth", "priority": 1, "resume": false, "transitions": [ - { - "randomSwitchState": "raiseHand03Loop", - "var": "raiseHand03IntroOnDone" - } ] }, { - "id": "raiseHand03Loop", + "easingType": "easeInOutQuad", + "id": "seatedReactionNegativeDisagreeDropHead", "interpDuration": 1, "interpTarget": 1, - "priority": 0, + "interpType": "evaluateBoth", + "priority": 1, "resume": false, "transitions": [ - { - "randomSwitchState": "raiseHand03Outro", - "var": "reactionRaiseHandDisabled" - } ] }, { - "id": "raiseHand03Outro", - "interpDuration": 6, - "interpTarget": 6, - "priority": 0, + "easingType": "easeInOutQuad", + "id": "seatedReactionNegativeDisagreeDisbelief", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 1, "resume": false, "transitions": [ - { - "randomSwitchState": "raiseHand03Loop", - "var": "reactionRaiseHandEnabled" - } ] } ], - "triggerRandomSwitch": "" + "timeScale": 1, + "triggerRandomSwitch": "", + "url": "qrc:///avatar/animations/sitting_idle.fbx" }, - "id": "raiseHand03", + "id": "seatedReactionNegative", "type": "randomSwitchStateMachine" }, { @@ -2841,11 +977,11 @@ "data": { "endFrame": 32, "loopFlag": false, - "startFrame": 1, + "startFrame": 0, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_raisehand04_all.fbx" + "url": "qrc:///avatar/animations/sitting_emote_raisehand_all.fbx" }, - "id": "raiseHand04Intro", + "id": "seatedReactionRaiseHandIntro", "type": "clip" }, { @@ -2856,9 +992,9 @@ "loopFlag": true, "startFrame": 32, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_raisehand04_all.fbx" + "url": "qrc:///avatar/animations/sitting_emote_raisehand_all.fbx" }, - "id": "raiseHand04Loop", + "id": "seatedReactionRaiseHandLoop", "type": "clip" }, { @@ -2869,54 +1005,138 @@ "loopFlag": false, "startFrame": 345, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_raisehand04_all.fbx" + "url": "qrc:///avatar/animations/sitting_emote_raisehand_all.fbx" }, - "id": "raiseHand04Outro", + "id": "seatedReactionRaiseHandOutro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 18, + "loopFlag": false, + "startFrame": 0, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_raisehand02_all.fbx" + }, + "id": "seatedReactionRaiseHand02Intro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 378, + "loopFlag": true, + "startFrame": 18, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_raisehand02_all.fbx" + }, + "id": "seatedReactionRaiseHand02Loop", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 435, + "loopFlag": false, + "startFrame": 378, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_raisehand02_all.fbx" + }, + "id": "seatedReactionRaiseHand02Outro", "type": "clip" } ], "data": { - "currentState": "raiseHand04Intro", + "currentState": "seatedReactionRaiseHandIntro", "randomSwitchTimeMax": 10, "randomSwitchTimeMin": 1, "states": [ { "easingType": "easeInOutQuad", - "id": "raiseHand04Intro", - "interpDuration": 15, - "interpTarget": 15, + "id": "seatedReactionRaiseHandIntro", + "interpDuration": 8, + "interpTarget": 8, "interpType": "evaluateBoth", "priority": 1, "resume": false, "transitions": [ { - "randomSwitchState": "raiseHand04Loop", - "var": "raiseHand04IntroOnDone" + "randomSwitchState": "seatedReactionRaiseHandLoop", + "var": "seatedReactionRaiseHandIntroOnDone" } ] }, { - "id": "raiseHand04Loop", + "id": "seatedReactionRaiseHandLoop", "interpDuration": 1, "interpTarget": 1, "priority": 0, "resume": false, "transitions": [ { - "randomSwitchState": "raiseHand04Outro", + "randomSwitchState": "seatedReactionRaiseHandOutro", "var": "reactionRaiseHandDisabled" } ] }, { - "id": "raiseHand04Outro", - "interpDuration": 6, - "interpTarget": 6, + "easingType": "easeInOutQuad", + "id": "seatedReactionRaiseHandOutro", + "interpDuration": 12, + "interpTarget": 12, + "interpType": "evaluateBoth", "priority": 0, "resume": false, "transitions": [ { - "randomSwitchState": "raiseHand04Loop", + "randomSwitchState": "seatedReactionRaiseHandLoop", + "var": "reactionRaiseHandEnabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionRaiseHand02Intro", + "interpDuration": 8, + "interpTarget": 8, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionRaiseHand02Loop", + "var": "seatedReactionRaiseHand02IntroOnDone" + } + ] + }, + { + "id": "seatedReactionRaiseHand02Loop", + "interpDuration": 1, + "interpTarget": 1, + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionRaiseHand02Outro", + "var": "reactionRaiseHandDisabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionRaiseHand02Outro", + "interpDuration": 12, + "interpTarget": 12, + "interpType": "evaluateBoth", + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionRaiseHand02Loop", "var": "reactionRaiseHandEnabled" } ] @@ -2924,148 +1144,7 @@ ], "triggerRandomSwitch": "" }, - "id": "raiseHand04", - "type": "randomSwitchStateMachine" - } - ], - "data": { - "currentState": "raiseHand01", - "randomSwitchTimeMax": 10, - "randomSwitchTimeMin": 1, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "raiseHand01", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "raiseHand03", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - }, - { - "easingType": "easeInOutQuad", - "id": "raiseHand04", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - ] - } - ] - }, - "id": "reactionRaiseHand", - "type": "randomSwitchStateMachine" - }, - { - "children": [ - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 18, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_clap01_all.fbx" - }, - "id": "applaudClap01Intro", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 97, - "loopFlag": true, - "startFrame": 18, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_clap01_all.fbx" - }, - "id": "applaudClap01Loop", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 146, - "loopFlag": false, - "startFrame": 97, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_clap01_all.fbx" - }, - "id": "applaudClap01Outro", - "type": "clip" - } - ], - "data": { - "currentState": "applaudClap01Intro", - "randomSwitchTimeMax": 10, - "randomSwitchTimeMin": 1, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "applaudClap01Intro", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - { - "randomSwitchState": "applaudClap01Loop", - "var": "applaudClap01IntroOnDone" - } - ] - }, - { - "id": "applaudClap01Loop", - "interpDuration": 1, - "interpTarget": 1, - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "applaudClap01Outro", - "var": "reactionApplaudDisabled" - } - ] - }, - { - "id": "applaudClap01Outro", - "interpDuration": 6, - "interpTarget": 6, - "interpType": "evaluateBoth", - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "applaudClap01Loop", - "var": "reactionApplaudEnabled" - } - ] - } - ], - "triggerRandomSwitch": "" - }, - "id": "applaudClap01", + "id": "seatedReactionRaiseHand", "type": "randomSwitchStateMachine" }, { @@ -3074,13 +1153,1305 @@ "children": [ ], "data": { - "endFrame": 14, + "endFrame": 12, + "loopFlag": false, + "startFrame": 0, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_clap_all.fbx" + }, + "id": "seatedReactionApplaudIntro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 76, + "loopFlag": true, + "startFrame": 12, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_clap_all.fbx" + }, + "id": "seatedReactionApplaudLoop", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 99, + "loopFlag": false, + "startFrame": 76, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_clap_all.fbx" + }, + "id": "seatedReactionApplaudOutro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 12, + "loopFlag": false, + "startFrame": 0, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_clap02_all.fbx" + }, + "id": "seatedReactionApplaud02Intro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 112, + "loopFlag": true, + "startFrame": 12, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_clap02_all.fbx" + }, + "id": "seatedReactionApplaud02Loop", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 132, + "loopFlag": false, + "startFrame": 112, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_clap02_all.fbx" + }, + "id": "seatedReactionApplaud02Outro", + "type": "clip" + } + ], + "data": { + "currentState": "seatedReactionApplaudIntro", + "randomSwitchTimeMax": 10, + "randomSwitchTimeMin": 1, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "seatedReactionApplaudIntro", + "interpDuration": 8, + "interpTarget": 8, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionApplaudLoop", + "var": "seatedReactionApplaudIntroOnDone" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionApplaudLoop", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionApplaudOutro", + "var": "reactionApplaudDisabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionApplaudOutro", + "interpDuration": 12, + "interpTarget": 12, + "interpType": "evaluateBoth", + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionApplaudLoop", + "var": "reactionApplaudEnabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionApplaud02Intro", + "interpDuration": 8, + "interpTarget": 8, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionApplaud02Loop", + "var": "seatedReactionApplaud02IntroOnDone" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionApplaud02Loop", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionApplaud02Outro", + "var": "reactionApplaudDisabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionApplaud02Outro", + "interpDuration": 12, + "interpTarget": 12, + "interpType": "evaluateBoth", + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionApplaud02Loop", + "var": "reactionApplaudEnabled" + } + ] + } + ], + "triggerRandomSwitch": "" + }, + "id": "seatedReactionApplaud", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 22, "loopFlag": false, "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_clap02_all.fbx" + "url": "qrc:///avatar/animations/sitting_emote_point_all.fbx" }, - "id": "applaudClap02Intro", + "id": "seatedReactionPointIntro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 43, + "loopFlag": true, + "startFrame": 22, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_point_all.fbx" + }, + "id": "seatedReactionPointLoop", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 71, + "loopFlag": false, + "startFrame": 43, + "timeScale": 1, + "url": "qrc:///avatar/animations/sitting_emote_point_all.fbx" + }, + "id": "seatedReactionPointOutro", + "type": "clip" + } + ], + "data": { + "currentState": "seatedReactionPointIntro", + "randomSwitchTimeMax": 10, + "randomSwitchTimeMin": 1, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "seatedReactionPointIntro", + "interpDuration": 18, + "interpTarget": 18, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionPointLoop", + "var": "seatedReactionPointIntroOnDone" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionPointLoop", + "interpDuration": 18, + "interpTarget": 18, + "interpType": "evaluateBoth", + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionPointOutro", + "var": "reactionPointDisabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionPointOutro", + "interpDuration": 18, + "interpTarget": 18, + "interpType": "evaluateBoth", + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "seatedReactionPointLoop", + "var": "reactionPointEnabled" + } + ] + } + ], + "triggerRandomSwitch": "" + }, + "id": "seatedReactionPoint", + "type": "randomSwitchStateMachine" + } + ], + "data": { + "currentState": "seatedTalkOverlay", + "states": [ + { + "easingType": "easeInOutQuad", + "id": "seatedTalkOverlay", + "interpDuration": 25, + "interpTarget": 25, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "seatedReactionPositive", + "var": "reactionPositiveTrigger" + }, + { + "state": "seatedReactionNegative", + "var": "reactionNegativeTrigger" + }, + { + "state": "seatedReactionRaiseHand", + "var": "reactionRaiseHandEnabled" + }, + { + "state": "seatedReactionApplaud", + "var": "reactionApplaudEnabled" + }, + { + "state": "seatedReactionPoint", + "var": "reactionPointEnabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionPositive", + "interpDuration": 12, + "interpTarget": 12, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "seatedTalkOverlay", + "var": "seatedReactionPositiveHeadNodOnDone" + }, + { + "state": "seatedTalkOverlay", + "var": "seatedReactionPositiveHeadNodYesOnDone" + }, + { + "state": "seatedTalkOverlay", + "var": "seatedReactionPositiveLongHeadNodOnDone" + }, + { + "state": "seatedTalkOverlay", + "var": "seatedReactionPositiveCheerOnDone" + }, + { + "state": "seatedReactionNegative", + "var": "reactionNegativeTrigger" + }, + { + "state": "seatedReactionRaiseHand", + "var": "reactionRaiseHandEnabled" + }, + { + "state": "seatedReactionApplaud", + "var": "reactionApplaudEnabled" + }, + { + "state": "seatedReactionPoint", + "var": "reactionPointEnabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionNegative", + "interpDuration": 12, + "interpTarget": 12, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "seatedReactionPositive", + "var": "reactionPositiveTrigger" + }, + { + "state": "seatedTalkOverlay", + "var": "seatedReactionNegativeDisagreeHeadshakeOnDone" + }, + { + "state": "seatedTalkOverlay", + "var": "seatedReactionNegativeDisagreeDropHeadOnDone" + }, + { + "state": "seatedTalkOverlay", + "var": "seatedReactionNegativeDisagreeDisbeliefOnDone" + }, + { + "state": "seatedReactionRaiseHand", + "var": "reactionRaiseHandEnabled" + }, + { + "state": "seatedReactionApplaud", + "var": "reactionApplaudEnabled" + }, + { + "state": "seatedReactionPoint", + "var": "reactionPointEnabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionRaiseHand", + "interpDuration": 12, + "interpTarget": 12, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "seatedReactionNegative", + "var": "reactionNegativeTrigger" + }, + { + "state": "seatedReactionPositive", + "var": "reactionPositiveTrigger" + }, + { + "state": "seatedTalkOverlay", + "var": "reactionRaiseHandDisabled" + }, + { + "state": "seatedReactionApplaud", + "var": "reactionApplaudEnabled" + }, + { + "state": "seatedReactionPoint", + "var": "reactionPointEnabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionApplaud", + "interpDuration": 12, + "interpTarget": 12, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "seatedReactionNegative", + "var": "reactionNegativeTrigger" + }, + { + "state": "seatedReactionPositive", + "var": "reactionPositiveTrigger" + }, + { + "state": "seatedReactionRaiseHand", + "var": "reactionRaiseHandEnabled" + }, + { + "state": "seatedTalkOverlay", + "var": "reactionApplaudDisabled" + }, + { + "state": "seatedReactionPoint", + "var": "reactionPointEnabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "seatedReactionPoint", + "interpDuration": 12, + "interpTarget": 12, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "seatedReactionNegative", + "var": "reactionNegativeTrigger" + }, + { + "state": "seatedReactionPositive", + "var": "reactionPositiveTrigger" + }, + { + "state": "seatedReactionRaiseHand", + "var": "reactionRaiseHandEnabled" + }, + { + "state": "seatedReactionApplaud", + "var": "reactionApplaudEnabled" + }, + { + "state": "seatedTalkOverlay", + "var": "reactionPointDisabled" + } + ] + } + ] + }, + "id": "seated", + "type": "stateMachine" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 500, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/talk.fbx" + }, + "id": "talk", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 325, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/talk02.fbx" + }, + "id": "talk02", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 300, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/talk03.fbx" + }, + "id": "talk03", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 500, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/talk04.fbx" + }, + "id": "talk04", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 215, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/talk_armsdown.fbx" + }, + "id": "talk_armsdown", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 500, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/talk_lefthand.fbx" + }, + "id": "talk_lefthand", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 502, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/talk_righthand.fbx" + }, + "id": "talk_righthand", + "type": "clip" + } + ], + "data": { + "currentState": "talk", + "randomSwitchTimeMax": 12, + "randomSwitchTimeMin": 7, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "talk", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.33, + "resume": true, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "talk02", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.33, + "resume": true, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "talk03", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.33, + "resume": true, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "talk04", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.33, + "resume": true, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "talk_armsdown", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.33, + "resume": true, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "talk_lefthand", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.33, + "resume": true, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "talk_righthand", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.33, + "resume": true, + "transitions": [ + ] + } + ], + "triggerRandomSwitch": "idleTalkSwitch" + }, + "id": "idleTalk", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 300, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle.fbx" + }, + "id": "masterIdle1", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 400, + "loopFlag": true, + "startFrame": 1, + "timeScale": 0.75, + "url": "qrc:///avatar/animations/idle02.fbx" + }, + "id": "masterIdle2", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 800, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle03.fbx" + }, + "id": "masterIdle3", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 902, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle04.fbx" + }, + "id": "masterIdle4", + "type": "clip" + } + ], + "data": { + "currentState": "masterIdle1", + "randomSwitchTimeMax": 30, + "randomSwitchTimeMin": 10, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "masterIdle1", + "interpDuration": 30, + "interpTarget": 30, + "interpType": "evaluateBoth", + "priority": 0.25, + "resume": true, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "masterIdle2", + "interpDuration": 30, + "interpTarget": 30, + "interpType": "evaluateBoth", + "priority": 0.25, + "resume": true, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "masterIdle3", + "interpDuration": 30, + "interpTarget": 30, + "interpType": "evaluateBoth", + "priority": 0.25, + "resume": true, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "masterIdle4", + "interpDuration": 30, + "interpTarget": 30, + "interpType": "evaluateBoth", + "priority": 0.25, + "resume": true, + "transitions": [ + ] + } + ], + "triggerRandomSwitch": "masterIdleSwitch" + }, + "id": "masterIdle", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 91, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_once_slownod.fbx" + }, + "id": "idle_once_slownod", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 154, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_once_headtilt.fbx" + }, + "id": "idle_once_headtilt", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 491, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_once_shiftheelpivot.fbx" + }, + "id": "idle_once_shiftheelpivot", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 1620, + "loopFlag": false, + "startFrame": 1, + "timeScale": 0.7, + "url": "qrc:///avatar/animations/idleWS_all.fbx" + }, + "id": "idleWS_all", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 324, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_once_lookaround.fbx" + }, + "id": "idle_once_lookaround", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 169, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_once_neckstretch.fbx" + }, + "id": "idle_once_neckstretch", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 375, + "loopFlag": false, + "startFrame": 1, + "timeScale": 0.7, + "url": "qrc:///avatar/animations/idle_once_lookleftright.fbx" + }, + "id": "idle_once_lookleftright", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 429, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_once_fidget.fbx" + }, + "id": "idle_once_fidget", + "type": "clip" + } + ], + "data": { + "currentState": "idle_once_slownod", + "states": [ + { + "easingType": "easeInOutQuad", + "id": "idle_once_slownod", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.2, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "idle_once_headtilt", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.2, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "idle_once_shiftheelpivot", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.2, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "idleWS_all", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.2, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "idle_once_lookaround", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.2, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "idle_once_neckstretch", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.2, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "idle_once_lookleftright", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.2, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "idle_once_fidget", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 0.2, + "resume": false, + "transitions": [ + ] + } + ] + }, + "id": "movement", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 80, + "loopFlag": false, + "startFrame": 1, + "startFrameVar": "", + "timeScale": 0.65, + "url": "qrc:///avatar/animations/idle_LFF_all.fbx" + }, + "id": "transitionToAltIdle1", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 80, + "loopFlag": false, + "startFrame": 1, + "timeScale": 0.65, + "url": "qrc:///avatar/animations/idle_RFF_all.fbx" + }, + "id": "transitionToAltIdle2", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 388, + "loopFlag": true, + "startFrame": 80, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_LFF_all.fbx" + }, + "id": "altIdle1", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 388, + "loopFlag": true, + "startFrame": 80, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_RFF_all.fbx" + }, + "id": "altIdle2", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 472, + "loopFlag": false, + "startFrame": 388, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_LFF_all.fbx" + }, + "id": "alt1ToMasterIdle", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 453, + "loopFlag": false, + "startFrame": 388, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_RFF_all.fbx" + }, + "id": "alt2ToMasterIdle", + "type": "clip" + } + ], + "data": { + "currentState": "transitionToAltIdle1", + "states": [ + { + "easingType": "easeInOutQuad", + "id": "transitionToAltIdle1", + "interpDuration": 20, + "interpTarget": 20, + "interpType": "evaluateBoth", + "priority": 0.5, + "resume": false, + "transitions": [ + { + "randomSwitchState": "altIdle1", + "var": "transitionToAltIdle1OnDone" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "transitionToAltIdle2", + "interpDuration": 20, + "interpTarget": 20, + "interpType": "evaluateBoth", + "priority": 0.5, + "resume": false, + "transitions": [ + { + "randomSwitchState": "altIdle2", + "var": "transitionToAltIdle2OnDone" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "altIdle1", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": -1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "alt1ToMasterIdle", + "var": "finishAltIdle2" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "altIdle2", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": -1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "alt2ToMasterIdle", + "var": "finishAltIdle2" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "alt1ToMasterIdle", + "interpDuration": 24, + "interpTarget": 24, + "interpType": "evaluateBoth", + "priority": -1, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "alt2ToMasterIdle", + "interpDuration": 24, + "interpTarget": 24, + "interpType": "evaluateBoth", + "priority": -1, + "resume": false, + "transitions": [ + ] + } + ], + "transitionVar": "finishAltIdle2", + "triggerTimeMax": 60, + "triggerTimeMin": 10 + }, + "id": "alternateIdle", + "type": "randomSwitchStateMachine" + } + ], + "data": { + "currentState": "movement", + "states": [ + { + "easingType": "easeInOutQuad", + "id": "movement", + "interpDuration": 30, + "interpTarget": 30, + "interpType": "evaluateBoth", + "priority": 0.6, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "alternateIdle", + "interpDuration": 30, + "interpTarget": 30, + "interpType": "evaluateBoth", + "priority": 0.4, + "resume": false, + "transitions": [ + ] + } + ] + }, + "id": "fidget", + "type": "randomSwitchStateMachine" + } + ], + "data": { + "currentState": "masterIdle", + "states": [ + { + "easingType": "easeInOutQuad", + "id": "masterIdle", + "interpDuration": 30, + "interpTarget": 30, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "fidget", + "var": "timeToFidget" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "fidget", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": -1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "masterIdle", + "var": "idle_once_slownodOnDone" + }, + { + "randomSwitchState": "masterIdle", + "var": "idle_once_headtiltOnDone" + }, + { + "randomSwitchState": "masterIdle", + "var": "idle_once_shiftheelpivotOnDone" + }, + { + "randomSwitchState": "masterIdle", + "var": "idleWS_allOnDone" + }, + { + "randomSwitchState": "masterIdle", + "var": "idle_once_lookaroundOnDone" + }, + { + "randomSwitchState": "masterIdle", + "var": "idle_once_neckstretchOnDone" + }, + { + "randomSwitchState": "masterIdle", + "var": "idle_once_lookleftrightOnDone" + }, + { + "randomSwitchState": "masterIdle", + "var": "idle_once_fidgetOnDone" + }, + { + "randomSwitchState": "masterIdle", + "var": "alt1ToMasterIdleOnDone" + }, + { + "randomSwitchState": "masterIdle", + "var": "alt2ToMasterIdleOnDone" + } + ] + } + ], + "transitionVar": "timeToFidget", + "triggerTimeMax": 50, + "triggerTimeMin": 10 + }, + "id": "idleStand", + "type": "randomSwitchStateMachine" + } + ], + "data": { + "alpha": 1, + "alphaVar": "talkOverlayAlpha", + "boneSet": "upperBody" + }, + "id": "idleTalkOverlay", + "type": "overlay" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 58, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_agree_acknowledge.fbx" + }, + "id": "positiveAcknowledge", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 55, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_agree_headnod.fbx" + }, + "id": "positiveHeadNod", "type": "clip" }, { @@ -3088,79 +2459,105 @@ ], "data": { "endFrame": 78, - "loopFlag": true, - "startFrame": 14, + "loopFlag": false, + "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_clap02_all.fbx" + "url": "qrc:///avatar/animations/emote_agree_headnodyes.fbx" }, - "id": "applaudClap02Loop", + "id": "positiveHeadNodYes", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 115, + "endFrame": 66, "loopFlag": false, - "startFrame": 78, + "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_clap02_all.fbx" + "url": "qrc:///avatar/animations/emote_agree_longheadnod.fbx" }, - "id": "applaudClap02Outro", + "id": "positiveLongHeadNod", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 85, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_agree_thoughtfulheadnod.fbx" + }, + "id": "positiveThoughtfulHeadNod", "type": "clip" } ], "data": { - "currentState": "applaudClap02Intro", + "currentState": "positiveAcknowledge", "randomSwitchTimeMax": 10, "randomSwitchTimeMin": 1, "states": [ { "easingType": "easeInOutQuad", - "id": "applaudClap02Intro", - "interpDuration": 15, - "interpTarget": 15, + "id": "positiveAcknowledge", + "interpDuration": 1, + "interpTarget": 1, "interpType": "evaluateBoth", "priority": 1, "resume": false, "transitions": [ - { - "randomSwitchState": "applaudClap02Loop", - "var": "applaudClap02IntroOnDone" - } ] }, { - "id": "applaudClap02Loop", + "easingType": "easeInOutQuad", + "id": "positiveHeadNod", "interpDuration": 1, "interpTarget": 1, - "priority": 0, + "interpType": "evaluateBoth", + "priority": 1, "resume": false, "transitions": [ - { - "randomSwitchState": "applaudClap02Outro", - "var": "reactionApplaudDisabled" - } ] }, { - "id": "applaudClap02Outro", - "interpDuration": 6, - "interpTarget": 6, + "easingType": "easeInOutQuad", + "id": "positiveHeadNodYes", + "interpDuration": 1, + "interpTarget": 1, "interpType": "evaluateBoth", - "priority": 0, + "priority": 1, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "positiveLongHeadNod", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "positiveThoughtfulHeadNod", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 0.33, "resume": false, "transitions": [ - { - "randomSwitchState": "applaudClap02Loop", - "var": "reactionApplaudEnabled" - } ] } ], "triggerRandomSwitch": "" }, - "id": "applaudClap02", + "id": "reactionPositive", "type": "randomSwitchStateMachine" }, { @@ -3169,77 +2566,822 @@ "children": [ ], "data": { - "endFrame": 14, + "endFrame": 72, "loopFlag": false, "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_clap03_all.fbx" + "url": "qrc:///avatar/animations/emote_disagree_annoyedheadshake.fbx" }, - "id": "applaudClap03Intro", + "id": "negativeAnnoyedHeadshake", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 100, - "loopFlag": true, - "startFrame": 14, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_clap03_all.fbx" - }, - "id": "applaudClap03Loop", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 149, + "endFrame": 92, "loopFlag": false, - "startFrame": 100, + "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_clap03_all.fbx" + "url": "qrc:///avatar/animations/emote_disagree_thoughtfulheadshake.fbx" }, - "id": "applaudClap03Outro", + "id": "negativeThoughtfulHeadshake", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 158, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_disagree_drophead.fbx" + }, + "id": "negativeDropHead", "type": "clip" } ], "data": { - "currentState": "applaudClap03Intro", + "currentState": "negativeAnnoyedHeadshake", "randomSwitchTimeMax": 10, "randomSwitchTimeMin": 1, "states": [ { "easingType": "easeInOutQuad", - "id": "applaudClap03Intro", - "interpDuration": 15, - "interpTarget": 15, + "id": "negativeAnnoyedHeadshake", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "negativeThoughtfulHeadshake", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "negativeDropHead", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + ] + } + ] + }, + "id": "reactionNegative", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 18, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_raisehand01_all.fbx" + }, + "id": "raiseHand01Intro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 378, + "loopFlag": true, + "startFrame": 18, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_raisehand01_all.fbx" + }, + "id": "raiseHand01Loop", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 435, + "loopFlag": false, + "startFrame": 378, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_raisehand01_all.fbx" + }, + "id": "raiseHand01Outro", + "type": "clip" + } + ], + "data": { + "currentState": "raiseHand01Intro", + "randomSwitchTimeMax": 10, + "randomSwitchTimeMin": 1, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "raiseHand01Intro", + "interpDuration": 10, + "interpTarget": 10, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "raiseHand01Loop", + "var": "raiseHand01IntroOnDone" + } + ] + }, + { + "id": "raiseHand01Loop", + "interpDuration": 1, + "interpTarget": 1, + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "raiseHand01Outro", + "var": "reactionRaiseHandDisabled" + } + ] + }, + { + "id": "raiseHand01Outro", + "interpDuration": 6, + "interpTarget": 6, + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "raiseHand01Loop", + "var": "reactionRaiseHandEnabled" + } + ] + } + ], + "triggerRandomSwitch": "" + }, + "id": "raiseHand01", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 19, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_raisehand03_all.fbx" + }, + "id": "raiseHand03Intro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 237, + "loopFlag": true, + "startFrame": 19, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_raisehand03_all.fbx" + }, + "id": "raiseHand03Loop", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 300, + "loopFlag": false, + "startFrame": 237, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_raisehand03_all.fbx" + }, + "id": "raiseHand03Outro", + "type": "clip" + } + ], + "data": { + "currentState": "raiseHand03Intro", + "randomSwitchTimeMax": 10, + "randomSwitchTimeMin": 1, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "raiseHand03Intro", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "raiseHand03Loop", + "var": "raiseHand03IntroOnDone" + } + ] + }, + { + "id": "raiseHand03Loop", + "interpDuration": 1, + "interpTarget": 1, + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "raiseHand03Outro", + "var": "reactionRaiseHandDisabled" + } + ] + }, + { + "id": "raiseHand03Outro", + "interpDuration": 6, + "interpTarget": 6, + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "raiseHand03Loop", + "var": "reactionRaiseHandEnabled" + } + ] + } + ], + "triggerRandomSwitch": "" + }, + "id": "raiseHand03", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 32, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_raisehand04_all.fbx" + }, + "id": "raiseHand04Intro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 345, + "loopFlag": true, + "startFrame": 32, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_raisehand04_all.fbx" + }, + "id": "raiseHand04Loop", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 400, + "loopFlag": false, + "startFrame": 345, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_raisehand04_all.fbx" + }, + "id": "raiseHand04Outro", + "type": "clip" + } + ], + "data": { + "currentState": "raiseHand04Intro", + "randomSwitchTimeMax": 10, + "randomSwitchTimeMin": 1, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "raiseHand04Intro", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "raiseHand04Loop", + "var": "raiseHand04IntroOnDone" + } + ] + }, + { + "id": "raiseHand04Loop", + "interpDuration": 1, + "interpTarget": 1, + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "raiseHand04Outro", + "var": "reactionRaiseHandDisabled" + } + ] + }, + { + "id": "raiseHand04Outro", + "interpDuration": 6, + "interpTarget": 6, + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "raiseHand04Loop", + "var": "reactionRaiseHandEnabled" + } + ] + } + ], + "triggerRandomSwitch": "" + }, + "id": "raiseHand04", + "type": "randomSwitchStateMachine" + } + ], + "data": { + "currentState": "raiseHand01", + "randomSwitchTimeMax": 10, + "randomSwitchTimeMin": 1, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "raiseHand01", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "raiseHand03", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "raiseHand04", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + ] + } + ] + }, + "id": "reactionRaiseHand", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 18, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_clap01_all.fbx" + }, + "id": "applaudClap01Intro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 97, + "loopFlag": true, + "startFrame": 18, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_clap01_all.fbx" + }, + "id": "applaudClap01Loop", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 146, + "loopFlag": false, + "startFrame": 97, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_clap01_all.fbx" + }, + "id": "applaudClap01Outro", + "type": "clip" + } + ], + "data": { + "currentState": "applaudClap01Intro", + "randomSwitchTimeMax": 10, + "randomSwitchTimeMin": 1, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "applaudClap01Intro", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "applaudClap01Loop", + "var": "applaudClap01IntroOnDone" + } + ] + }, + { + "id": "applaudClap01Loop", + "interpDuration": 1, + "interpTarget": 1, + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "applaudClap01Outro", + "var": "reactionApplaudDisabled" + } + ] + }, + { + "id": "applaudClap01Outro", + "interpDuration": 6, + "interpTarget": 6, + "interpType": "evaluateBoth", + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "applaudClap01Loop", + "var": "reactionApplaudEnabled" + } + ] + } + ], + "triggerRandomSwitch": "" + }, + "id": "applaudClap01", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 14, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_clap02_all.fbx" + }, + "id": "applaudClap02Intro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 78, + "loopFlag": true, + "startFrame": 14, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_clap02_all.fbx" + }, + "id": "applaudClap02Loop", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 115, + "loopFlag": false, + "startFrame": 78, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_clap02_all.fbx" + }, + "id": "applaudClap02Outro", + "type": "clip" + } + ], + "data": { + "currentState": "applaudClap02Intro", + "randomSwitchTimeMax": 10, + "randomSwitchTimeMin": 1, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "applaudClap02Intro", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "applaudClap02Loop", + "var": "applaudClap02IntroOnDone" + } + ] + }, + { + "id": "applaudClap02Loop", + "interpDuration": 1, + "interpTarget": 1, + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "applaudClap02Outro", + "var": "reactionApplaudDisabled" + } + ] + }, + { + "id": "applaudClap02Outro", + "interpDuration": 6, + "interpTarget": 6, + "interpType": "evaluateBoth", + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "applaudClap02Loop", + "var": "reactionApplaudEnabled" + } + ] + } + ], + "triggerRandomSwitch": "" + }, + "id": "applaudClap02", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 14, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_clap03_all.fbx" + }, + "id": "applaudClap03Intro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 100, + "loopFlag": true, + "startFrame": 14, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_clap03_all.fbx" + }, + "id": "applaudClap03Loop", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 149, + "loopFlag": false, + "startFrame": 100, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_clap03_all.fbx" + }, + "id": "applaudClap03Outro", + "type": "clip" + } + ], + "data": { + "currentState": "applaudClap03Intro", + "randomSwitchTimeMax": 10, + "randomSwitchTimeMin": 1, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "applaudClap03Intro", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + { + "randomSwitchState": "applaudClap03Loop", + "var": "applaudClap03IntroOnDone" + } + ] + }, + { + "id": "applaudClap03Loop", + "interpDuration": 1, + "interpTarget": 1, + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "applaudClap03Outro", + "var": "reactionApplaudDisabled" + } + ] + }, + { + "id": "applaudClap03Outro", + "interpDuration": 6, + "interpTarget": 6, + "interpType": "evaluateBoth", + "priority": 0, + "resume": false, + "transitions": [ + { + "randomSwitchState": "applaudClap03Loop", + "var": "reactionApplaudEnabled" + } + ] + } + ], + "triggerRandomSwitch": "" + }, + "id": "applaudClap03", + "type": "randomSwitchStateMachine" + } + ], + "data": { + "currentState": "applaudClap01", + "randomSwitchTimeMax": 10, + "randomSwitchTimeMin": 1, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "applaudClap01", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "applaudClap02", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + ] + }, + { + "easingType": "easeInOutQuad", + "id": "applaudClap03", + "interpDuration": 1, + "interpTarget": 1, + "interpType": "evaluateBoth", + "priority": 1, + "resume": false, + "transitions": [ + ] + } + ] + }, + "id": "reactionApplaud", + "type": "randomSwitchStateMachine" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 22, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_point01_all.fbx" + }, + "id": "reactionPointIntro", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 40, + "loopFlag": true, + "startFrame": 22, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_point01_all.fbx" + }, + "id": "reactionPointLoop", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 78, + "loopFlag": false, + "startFrame": 40, + "timeScale": 1, + "url": "qrc:///avatar/animations/emote_point01_all.fbx" + }, + "id": "reactionPointOutro", + "type": "clip" + } + ], + "data": { + "currentState": "reactionPointIntro", + "randomSwitchTimeMax": 10, + "randomSwitchTimeMin": 1, + "states": [ + { + "easingType": "easeInOutQuad", + "id": "reactionPointIntro", + "interpDuration": 1, + "interpTarget": 1, "interpType": "evaluateBoth", "priority": 1, "resume": false, "transitions": [ { - "randomSwitchState": "applaudClap03Loop", - "var": "applaudClap03IntroOnDone" + "randomSwitchState": "reactionPointLoop", + "var": "reactionPointIntroOnDone" } ] }, { - "id": "applaudClap03Loop", + "id": "reactionPointLoop", "interpDuration": 1, "interpTarget": 1, "priority": 0, "resume": false, "transitions": [ { - "randomSwitchState": "applaudClap03Outro", - "var": "reactionApplaudDisabled" + "randomSwitchState": "reactionPointOutro", + "var": "reactionPointDisabled" } ] }, { - "id": "applaudClap03Outro", + "easingType": "easeInOutQuad", + "id": "reactionPointOutro", "interpDuration": 6, "interpTarget": 6, "interpType": "evaluateBoth", @@ -3247,2227 +3389,2263 @@ "resume": false, "transitions": [ { - "randomSwitchState": "applaudClap03Loop", - "var": "reactionApplaudEnabled" + "randomSwitchState": "reactionPointLoop", + "var": "reactionPointEnabled" } ] } ], "triggerRandomSwitch": "" }, - "id": "applaudClap03", + "id": "reactionPoint", "type": "randomSwitchStateMachine" } ], "data": { - "currentState": "applaudClap01", - "randomSwitchTimeMax": 10, - "randomSwitchTimeMin": 1, + "currentState": "idleTalkOverlay", "states": [ { "easingType": "easeInOutQuad", - "id": "applaudClap01", - "interpDuration": 1, - "interpTarget": 1, + "id": "idleTalkOverlay", + "interpDuration": 24, + "interpTarget": 24, "interpType": "evaluateBoth", - "priority": 1, - "resume": false, "transitions": [ + { + "state": "reactionPositive", + "var": "reactionPositiveTrigger" + }, + { + "state": "reactionNegative", + "var": "reactionNegativeTrigger" + }, + { + "state": "reactionRaiseHand", + "var": "reactionRaiseHandEnabled" + }, + { + "state": "reactionApplaud", + "var": "reactionApplaudEnabled" + }, + { + "state": "reactionPoint", + "var": "reactionPointEnabled" + } ] }, { "easingType": "easeInOutQuad", - "id": "applaudClap02", - "interpDuration": 1, - "interpTarget": 1, + "id": "reactionPositive", + "interpDuration": 18, + "interpTarget": 18, "interpType": "evaluateBoth", - "priority": 1, - "resume": false, "transitions": [ + { + "state": "idleTalkOverlay", + "var": "positiveAcknowledgeOnDone" + }, + { + "state": "idleTalkOverlay", + "var": "positiveHeadNodOnDone" + }, + { + "state": "idleTalkOverlay", + "var": "positiveHeadNodYesOnDone" + }, + { + "state": "idleTalkOverlay", + "var": "positiveLongHeadNodOnDone" + }, + { + "state": "idleTalkOverlay", + "var": "positiveThoughtfulHeadNodOnDone" + }, + { + "state": "reactionNegative", + "var": "reactionNegativeTrigger" + }, + { + "state": "reactionRaiseHand", + "var": "reactionRaiseHandEnabled" + }, + { + "state": "reactionApplaud", + "var": "reactionApplaudEnabled" + }, + { + "state": "reactionPoint", + "var": "reactionPointEnabled" + } ] }, { "easingType": "easeInOutQuad", - "id": "applaudClap03", - "interpDuration": 1, - "interpTarget": 1, + "id": "reactionNegative", + "interpDuration": 18, + "interpTarget": 18, "interpType": "evaluateBoth", - "priority": 1, - "resume": false, "transitions": [ + { + "state": "reactionPositive", + "var": "reactionPositiveTrigger" + }, + { + "state": "idleTalkOverlay", + "var": "negativeAnnoyedHeadshakeOnDone" + }, + { + "state": "idleTalkOverlay", + "var": "negativeThoughtfulHeadshakeOnDone" + }, + { + "state": "idleTalkOverlay", + "var": "negativeDropHeadOnDone" + }, + { + "state": "reactionRaiseHand", + "var": "reactionRaiseHandEnabled" + }, + { + "state": "reactionApplaud", + "var": "reactionApplaudEnabled" + }, + { + "state": "reactionPoint", + "var": "reactionPointEnabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "reactionRaiseHand", + "interpDuration": 18, + "interpTarget": 18, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "reactionNegative", + "var": "reactionNegativeTrigger" + }, + { + "state": "reactionPositive", + "var": "reactionPositiveTrigger" + }, + { + "state": "idleTalkOverlay", + "var": "reactionRaiseHandDisabled" + }, + { + "state": "reactionApplaud", + "var": "reactionApplaudEnabled" + }, + { + "state": "reactionPoint", + "var": "reactionPointEnabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "reactionApplaud", + "interpDuration": 18, + "interpTarget": 18, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "reactionNegative", + "var": "reactionNegativeTrigger" + }, + { + "state": "reactionPositive", + "var": "reactionPositiveTrigger" + }, + { + "state": "reactionRaiseHand", + "var": "reactionRaiseHandEnabled" + }, + { + "state": "idleTalkOverlay", + "var": "reactionApplaudDisabled" + }, + { + "state": "reactionPoint", + "var": "reactionPointEnabled" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "reactionPoint", + "interpDuration": 18, + "interpTarget": 18, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "reactionNegative", + "var": "reactionNegativeTrigger" + }, + { + "state": "reactionPositive", + "var": "reactionPositiveTrigger" + }, + { + "state": "reactionRaiseHand", + "var": "reactionRaiseHandEnabled" + }, + { + "state": "reactionApplaud", + "var": "reactionApplaudEnabled" + }, + { + "state": "idleTalkOverlay", + "var": "reactionPointDisabled" + } ] } ] }, - "id": "reactionApplaud", - "type": "randomSwitchStateMachine" + "id": "idle", + "type": "stateMachine" }, { "children": [ - { - "children": [ - ], - "data": { - "endFrame": 22, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/emote_point01_all.fbx" - }, - "id": "reactionPointIntro", - "type": "clip" - }, { "children": [ ], "data": { "endFrame": 40, "loopFlag": true, - "startFrame": 22, + "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_point01_all.fbx" + "url": "qrc:///avatar/animations/walk_short_fwd.fbx" }, - "id": "reactionPointLoop", + "id": "walkFwdShort_c", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 78, - "loopFlag": false, - "startFrame": 40, + "endFrame": 30, + "loopFlag": true, + "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/emote_point01_all.fbx" + "url": "qrc:///avatar/animations/walk_fwd.fbx" }, - "id": "reactionPointOutro", + "id": "walkFwdNormal_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 26, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/walk_fwd_fast.fbx" + }, + "id": "walkFwdFast_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 18, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/jog_fwd.fbx" + }, + "id": "walkFwdJog_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 19, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/run_fast_fwd.fbx" + }, + "id": "walkFwdRun_c", "type": "clip" } ], "data": { - "currentState": "reactionPointIntro", - "randomSwitchTimeMax": 10, - "randomSwitchTimeMin": 1, - "states": [ - { - "easingType": "easeInOutQuad", - "id": "reactionPointIntro", - "interpDuration": 1, - "interpTarget": 1, - "interpType": "evaluateBoth", - "priority": 1, - "resume": false, - "transitions": [ - { - "randomSwitchState": "reactionPointLoop", - "var": "reactionPointIntroOnDone" - } - ] - }, - { - "id": "reactionPointLoop", - "interpDuration": 1, - "interpTarget": 1, - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "reactionPointOutro", - "var": "reactionPointDisabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "reactionPointOutro", - "interpDuration": 6, - "interpTarget": 6, - "interpType": "evaluateBoth", - "priority": 0, - "resume": false, - "transitions": [ - { - "randomSwitchState": "reactionPointLoop", - "var": "reactionPointEnabled" - } - ] - } + "alpha": 0, + "alphaVar": "moveForwardAlpha", + "characteristicSpeeds": [ + 0.5, + 1.8, + 2.5, + 3.55, + 5.675 ], - "triggerRandomSwitch": "" + "desiredSpeed": 1.4, + "desiredSpeedVar": "moveForwardSpeed" }, - "id": "reactionPoint", - "type": "randomSwitchStateMachine" - } - ], - "data": { - "currentState": "idleTalkOverlay", - "states": [ - { - "easingType": "easeInOutQuad", - "id": "idleTalkOverlay", - "interpDuration": 24, - "interpTarget": 24, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "reactionPositive", - "var": "reactionPositiveTrigger" - }, - { - "state": "reactionNegative", - "var": "reactionNegativeTrigger" - }, - { - "state": "reactionRaiseHand", - "var": "reactionRaiseHandEnabled" - }, - { - "state": "reactionApplaud", - "var": "reactionApplaudEnabled" - }, - { - "state": "reactionPoint", - "var": "reactionPointEnabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "reactionPositive", - "interpDuration": 18, - "interpTarget": 18, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "idleTalkOverlay", - "var": "positiveAcknowledgeOnDone" - }, - { - "state": "idleTalkOverlay", - "var": "positiveHeadNodOnDone" - }, - { - "state": "idleTalkOverlay", - "var": "positiveHeadNodYesOnDone" - }, - { - "state": "idleTalkOverlay", - "var": "positiveLongHeadNodOnDone" - }, - { - "state": "idleTalkOverlay", - "var": "positiveThoughtfulHeadNodOnDone" - }, - { - "state": "reactionNegative", - "var": "reactionNegativeTrigger" - }, - { - "state": "reactionRaiseHand", - "var": "reactionRaiseHandEnabled" - }, - { - "state": "reactionApplaud", - "var": "reactionApplaudEnabled" - }, - { - "state": "reactionPoint", - "var": "reactionPointEnabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "reactionNegative", - "interpDuration": 18, - "interpTarget": 18, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "reactionPositive", - "var": "reactionPositiveTrigger" - }, - { - "state": "idleTalkOverlay", - "var": "negativeAnnoyedHeadshakeOnDone" - }, - { - "state": "idleTalkOverlay", - "var": "negativeThoughtfulHeadshakeOnDone" - }, - { - "state": "idleTalkOverlay", - "var": "negativeDropHeadOnDone" - }, - { - "state": "reactionRaiseHand", - "var": "reactionRaiseHandEnabled" - }, - { - "state": "reactionApplaud", - "var": "reactionApplaudEnabled" - }, - { - "state": "reactionPoint", - "var": "reactionPointEnabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "reactionRaiseHand", - "interpDuration": 18, - "interpTarget": 18, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "reactionNegative", - "var": "reactionNegativeTrigger" - }, - { - "state": "reactionPositive", - "var": "reactionPositiveTrigger" - }, - { - "state": "idleTalkOverlay", - "var": "reactionRaiseHandDisabled" - }, - { - "state": "reactionApplaud", - "var": "reactionApplaudEnabled" - }, - { - "state": "reactionPoint", - "var": "reactionPointEnabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "reactionApplaud", - "interpDuration": 18, - "interpTarget": 18, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "reactionNegative", - "var": "reactionNegativeTrigger" - }, - { - "state": "reactionPositive", - "var": "reactionPositiveTrigger" - }, - { - "state": "reactionRaiseHand", - "var": "reactionRaiseHandEnabled" - }, - { - "state": "idleTalkOverlay", - "var": "reactionApplaudDisabled" - }, - { - "state": "reactionPoint", - "var": "reactionPointEnabled" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "reactionPoint", - "interpDuration": 18, - "interpTarget": 18, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "reactionNegative", - "var": "reactionNegativeTrigger" - }, - { - "state": "reactionPositive", - "var": "reactionPositiveTrigger" - }, - { - "state": "reactionRaiseHand", - "var": "reactionRaiseHandEnabled" - }, - { - "state": "reactionApplaud", - "var": "reactionApplaudEnabled" - }, - { - "state": "idleTalkOverlay", - "var": "reactionPointDisabled" - } - ] - } - ] - }, - "id": "idle", - "type": "stateMachine" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 40, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/walk_short_fwd.fbx" - }, - "id": "walkFwdShort_c", - "type": "clip" + "id": "WALKFWD", + "type": "blendLinearMove" }, { "children": [ ], "data": { - "endFrame": 30, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/walk_fwd.fbx" - }, - "id": "walkFwdNormal_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 26, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/walk_fwd_fast.fbx" - }, - "id": "walkFwdFast_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 18, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/jog_fwd.fbx" - }, - "id": "walkFwdJog_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 19, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/run_fast_fwd.fbx" - }, - "id": "walkFwdRun_c", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "moveForwardAlpha", - "characteristicSpeeds": [ - 0.5, - 1.8, - 2.5, - 3.55, - 5.675 - ], - "desiredSpeed": 1.4, - "desiredSpeedVar": "moveForwardSpeed" - }, - "id": "WALKFWD", - "type": "blendLinearMove" - }, - { - "children": [ - ], - "data": { - "endFrame": 13, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_to_walk.fbx" - }, - "id": "idleToWalkFwd", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 59, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/settle_to_idle_small.fbx" - }, - "id": "idleSettle", - "type": "clip" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 37, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/walk_bwd.fbx" - }, - "id": "walkBwdShort_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 28, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/walk_bwd_fast.fbx" - }, - "id": "walkBwdFast_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 20, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/jog_bwd.fbx" - }, - "id": "jogBwd_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 14, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/run_bwd.fbx" - }, - "id": "runBwd_c", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "moveBackwardAlpha", - "characteristicSpeeds": [ - 0.6, - 1.6, - 2.8, - 4.5 - ], - "desiredSpeed": 1.4, - "desiredSpeedVar": "moveBackwardSpeed" - }, - "id": "WALKBWD", - "type": "blendLinearMove" - }, - { - "children": [ - ], - "data": { - "endFrame": 33, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/turn_left.fbx" - }, - "id": "turnLeft", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 31, - "loopFlag": true, - "mirrorFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/turn_right.fbx" - }, - "id": "turnRight", - "type": "clip" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 30, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/side_step_short_left.fbx" - }, - "id": "strafeLeftShortStep_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 20, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/side_step_left.fbx" - }, - "id": "strafeLeftStep_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 35, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/walk_left.fbx" - }, - "id": "strafeLeftWalk_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 21, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/walk_left_fast.fbx" - }, - "id": "strafeLeftWalkFast_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 20, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/jog_left.fbx" - }, - "id": "strafeLeftJog_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 19, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/run_fast_left.fbx" - }, - "id": "strafeLeftRun_c", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "moveLateralAlpha", - "characteristicSpeeds": [ - 0.1, - 0.5, - 1, - 2.55, - 3.35, - 5.25 - ], - "desiredSpeed": 1.4, - "desiredSpeedVar": "moveLateralSpeed" - }, - "id": "STRAFELEFT", - "type": "blendLinearMove" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 30, - "loopFlag": true, - "mirrorFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/side_step_short_left.fbx" - }, - "id": "strafeRightShortStep_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 20, - "loopFlag": true, - "mirrorFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/side_step_left.fbx" - }, - "id": "strafeRightStep_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 35, - "loopFlag": true, - "mirrorFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/walk_right.fbx" - }, - "id": "strafeRightWalk_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 21, - "loopFlag": true, - "mirrorFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/walk_right_fast.fbx" - }, - "id": "strafeRightFast_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 20, - "loopFlag": true, - "mirrorFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/jog_right.fbx" - }, - "id": "strafeRightJog_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 19, - "loopFlag": true, - "mirrorFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/run_fast_right.fbx" - }, - "id": "strafeRightRun_c", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "moveLateralAlpha", - "characteristicSpeeds": [ - 0.1, - 0.5, - 1, - 2.55, - 3.4, - 5.25 - ], - "desiredSpeed": 1.4, - "desiredSpeedVar": "moveLateralSpeed" - }, - "id": "STRAFERIGHT", - "type": "blendLinearMove" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 30, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/side_step_short_left.fbx" - }, - "id": "stepLeftShort_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 20, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/side_step_left.fbx" - }, - "id": "stepLeft_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 16, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/side_step_left_fast.fbx" - }, - "id": "strafeLeftAnim_c", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "moveLateralAlpha", - "characteristicSpeeds": [ - 0, - 0.5, - 2.5 - ], - "desiredSpeed": 1.4, - "desiredSpeedVar": "moveLateralSpeed" - }, - "id": "strafeLeftHmd", - "type": "blendLinearMove" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 30, - "loopFlag": true, - "mirrorFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/side_step_short_left.fbx" - }, - "id": "stepRightShort_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 20, - "loopFlag": true, - "mirrorFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/side_step_left.fbx" - }, - "id": "stepRight_c", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 16, - "loopFlag": true, - "mirrorFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/side_step_left_fast.fbx" - }, - "id": "strafeRightAnim_c", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "moveLateralAlpha", - "characteristicSpeeds": [ - 0, - 0.5, - 2.5 - ], - "desiredSpeed": 1.4, - "desiredSpeedVar": "moveLateralSpeed" - }, - "id": "strafeRightHmd", - "type": "blendLinearMove" - }, - { - "children": [ - ], - "data": { - "endFrame": 79, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/fly.fbx" - }, - "id": "fly", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 16, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/jump_standing_launch_all.fbx" - }, - "id": "takeoffStand", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": false, - "startFrame": 4, - "timeScale": 1, - "url": "qrc:///avatar/animations/jump_running_launch_land_all.fbx" - }, - "id": "TAKEOFFRUN", - "type": "clip" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 1, + "endFrame": 13, "loopFlag": false, "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/jump_standing_apex_all.fbx" + "url": "qrc:///avatar/animations/idle_to_walk.fbx" }, - "id": "inAirStandPreApex", + "id": "idleToWalkFwd", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 2, + "endFrame": 59, "loopFlag": false, - "startFrame": 2, + "startFrame": 1, "timeScale": 1, - "url": "qrc:///avatar/animations/jump_standing_apex_all.fbx" + "url": "qrc:///avatar/animations/settle_to_idle_small.fbx" }, - "id": "inAirStandApex", + "id": "idleSettle", "type": "clip" }, { "children": [ + { + "children": [ + ], + "data": { + "endFrame": 37, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/walk_bwd.fbx" + }, + "id": "walkBwdShort_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 28, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/walk_bwd_fast.fbx" + }, + "id": "walkBwdFast_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 20, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/jog_bwd.fbx" + }, + "id": "jogBwd_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 14, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/run_bwd.fbx" + }, + "id": "runBwd_c", + "type": "clip" + } ], "data": { - "endFrame": 3, - "loopFlag": false, - "startFrame": 3, - "timeScale": 1, - "url": "qrc:///avatar/animations/jump_standing_apex_all.fbx" + "alpha": 0, + "alphaVar": "moveBackwardAlpha", + "characteristicSpeeds": [ + 0.6, + 1.6, + 2.8, + 4.5 + ], + "desiredSpeed": 1.4, + "desiredSpeedVar": "moveBackwardSpeed" }, - "id": "inAirStandPostApex", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "inAirAlpha" - }, - "id": "inAirStand", - "type": "blendLinear" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 16, - "loopFlag": false, - "startFrame": 16, - "timeScale": 1, - "url": "qrc:///avatar/animations/jump_running_launch_land_all.fbx" - }, - "id": "inAirRunPreApex", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 22, - "loopFlag": false, - "startFrame": 22, - "timeScale": 1, - "url": "qrc:///avatar/animations/jump_running_launch_land_all.fbx" - }, - "id": "inAirRunApex", - "type": "clip" + "id": "WALKBWD", + "type": "blendLinearMove" }, { "children": [ ], "data": { "endFrame": 33, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/turn_left.fbx" + }, + "id": "turnLeft", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 31, + "loopFlag": true, + "mirrorFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/turn_right.fbx" + }, + "id": "turnRight", + "type": "clip" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 30, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/side_step_short_left.fbx" + }, + "id": "strafeLeftShortStep_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 20, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/side_step_left.fbx" + }, + "id": "strafeLeftStep_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 35, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/walk_left.fbx" + }, + "id": "strafeLeftWalk_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 21, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/walk_left_fast.fbx" + }, + "id": "strafeLeftWalkFast_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 20, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/jog_left.fbx" + }, + "id": "strafeLeftJog_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 19, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/run_fast_left.fbx" + }, + "id": "strafeLeftRun_c", + "type": "clip" + } + ], + "data": { + "alpha": 0, + "alphaVar": "moveLateralAlpha", + "characteristicSpeeds": [ + 0.1, + 0.5, + 1, + 2.55, + 3.35, + 5.25 + ], + "desiredSpeed": 1.4, + "desiredSpeedVar": "moveLateralSpeed" + }, + "id": "STRAFELEFT", + "type": "blendLinearMove" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 30, + "loopFlag": true, + "mirrorFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/side_step_short_left.fbx" + }, + "id": "strafeRightShortStep_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 20, + "loopFlag": true, + "mirrorFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/side_step_left.fbx" + }, + "id": "strafeRightStep_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 35, + "loopFlag": true, + "mirrorFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/walk_right.fbx" + }, + "id": "strafeRightWalk_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 21, + "loopFlag": true, + "mirrorFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/walk_right_fast.fbx" + }, + "id": "strafeRightFast_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 20, + "loopFlag": true, + "mirrorFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/jog_right.fbx" + }, + "id": "strafeRightJog_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 19, + "loopFlag": true, + "mirrorFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/run_fast_right.fbx" + }, + "id": "strafeRightRun_c", + "type": "clip" + } + ], + "data": { + "alpha": 0, + "alphaVar": "moveLateralAlpha", + "characteristicSpeeds": [ + 0.1, + 0.5, + 1, + 2.55, + 3.4, + 5.25 + ], + "desiredSpeed": 1.4, + "desiredSpeedVar": "moveLateralSpeed" + }, + "id": "STRAFERIGHT", + "type": "blendLinearMove" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 30, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/side_step_short_left.fbx" + }, + "id": "stepLeftShort_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 20, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/side_step_left.fbx" + }, + "id": "stepLeft_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 16, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/side_step_left_fast.fbx" + }, + "id": "strafeLeftAnim_c", + "type": "clip" + } + ], + "data": { + "alpha": 0, + "alphaVar": "moveLateralAlpha", + "characteristicSpeeds": [ + 0, + 0.5, + 2.5 + ], + "desiredSpeed": 1.4, + "desiredSpeedVar": "moveLateralSpeed" + }, + "id": "strafeLeftHmd", + "type": "blendLinearMove" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 30, + "loopFlag": true, + "mirrorFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/side_step_short_left.fbx" + }, + "id": "stepRightShort_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 20, + "loopFlag": true, + "mirrorFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/side_step_left.fbx" + }, + "id": "stepRight_c", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 16, + "loopFlag": true, + "mirrorFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/side_step_left_fast.fbx" + }, + "id": "strafeRightAnim_c", + "type": "clip" + } + ], + "data": { + "alpha": 0, + "alphaVar": "moveLateralAlpha", + "characteristicSpeeds": [ + 0, + 0.5, + 2.5 + ], + "desiredSpeed": 1.4, + "desiredSpeedVar": "moveLateralSpeed" + }, + "id": "strafeRightHmd", + "type": "blendLinearMove" + }, + { + "children": [ + ], + "data": { + "endFrame": 79, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/fly.fbx" + }, + "id": "fly", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 16, "loopFlag": false, - "startFrame": 33, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/jump_standing_launch_all.fbx" + }, + "id": "takeoffStand", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 15, + "loopFlag": false, + "startFrame": 4, "timeScale": 1, "url": "qrc:///avatar/animations/jump_running_launch_land_all.fbx" }, - "id": "inAirRunPostApex", + "id": "TAKEOFFRUN", + "type": "clip" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 1, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/jump_standing_apex_all.fbx" + }, + "id": "inAirStandPreApex", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 2, + "loopFlag": false, + "startFrame": 2, + "timeScale": 1, + "url": "qrc:///avatar/animations/jump_standing_apex_all.fbx" + }, + "id": "inAirStandApex", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 3, + "loopFlag": false, + "startFrame": 3, + "timeScale": 1, + "url": "qrc:///avatar/animations/jump_standing_apex_all.fbx" + }, + "id": "inAirStandPostApex", + "type": "clip" + } + ], + "data": { + "alpha": 0, + "alphaVar": "inAirAlpha" + }, + "id": "inAirStand", + "type": "blendLinear" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 16, + "loopFlag": false, + "startFrame": 16, + "timeScale": 1, + "url": "qrc:///avatar/animations/jump_running_launch_land_all.fbx" + }, + "id": "inAirRunPreApex", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 22, + "loopFlag": false, + "startFrame": 22, + "timeScale": 1, + "url": "qrc:///avatar/animations/jump_running_launch_land_all.fbx" + }, + "id": "inAirRunApex", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 33, + "loopFlag": false, + "startFrame": 33, + "timeScale": 1, + "url": "qrc:///avatar/animations/jump_running_launch_land_all.fbx" + }, + "id": "inAirRunPostApex", + "type": "clip" + } + ], + "data": { + "alpha": 0, + "alphaVar": "inAirAlpha" + }, + "id": "INAIRRUN", + "type": "blendLinear" + }, + { + "children": [ + ], + "data": { + "endFrame": 6, + "loopFlag": false, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/jump_standing_land_settle_all.fbx" + }, + "id": "landStandImpact", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 68, + "loopFlag": false, + "startFrame": 6, + "timeScale": 1, + "url": "qrc:///avatar/animations/jump_standing_land_settle_all.fbx" + }, + "id": "landStand", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 40, + "loopFlag": false, + "startFrame": 29, + "timeScale": 1, + "url": "qrc:///avatar/animations/jump_running_launch_land_all.fbx" + }, + "id": "LANDRUN", "type": "clip" } ], "data": { - "alpha": 0, - "alphaVar": "inAirAlpha" + "currentState": "idle", + "outputJoints": [ + "LeftFoot", + "RightFoot" + ], + "states": [ + { + "easingType": "easeInOutQuad", + "id": "seated", + "interpDuration": 6, + "interpTarget": 6, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "idle", + "var": "isNotMoving" + }, + { + "state": "WALKFWD", + "var": "isMovingForward" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "idle", + "interpDuration": 30, + "interpTarget": 30, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "WALKFWD", + "var": "isMovingForward" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "id": "idleToWalkFwd", + "interpDuration": 8, + "interpTarget": 12, + "transitions": [ + { + "state": "WALKFWD", + "var": "idleToWalkFwdOnDone" + }, + { + "state": "idle", + "var": "isNotMoving" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "idleSettle", + "interpDuration": 12, + "interpTarget": 12, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "idle", + "var": "idleSettleOnDone" + }, + { + "state": "WALKFWD", + "var": "isMovingForward" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "id": "WALKFWD", + "interpDuration": 10, + "interpTarget": 35, + "interpType": "snapshotPrev", + "transitions": [ + { + "state": "idleSettle", + "var": "isNotMoving" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "id": "WALKBWD", + "interpDuration": 10, + "interpTarget": 35, + "interpType": "snapshotPrev", + "transitions": [ + { + "state": "idleSettle", + "var": "isNotMoving" + }, + { + "state": "WALKFWD", + "var": "isMovingForward" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "id": "STRAFERIGHT", + "interpDuration": 8, + "interpTarget": 25, + "interpType": "snapshotPrev", + "transitions": [ + { + "state": "idleSettle", + "var": "isNotMoving" + }, + { + "state": "WALKFWD", + "var": "isMovingForward" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "id": "STRAFELEFT", + "interpDuration": 8, + "interpTarget": 25, + "interpType": "snapshotPrev", + "transitions": [ + { + "state": "idleSettle", + "var": "isNotMoving" + }, + { + "state": "WALKFWD", + "var": "isMovingForward" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "turnRight", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "idle", + "var": "isNotTurning" + }, + { + "state": "WALKFWD", + "var": "isMovingForward" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "turnLeft", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "idle", + "var": "isNotTurning" + }, + { + "state": "WALKFWD", + "var": "isMovingForward" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "id": "strafeRightHmd", + "interpDuration": 8, + "interpTarget": 8, + "interpType": "snapshotPrev", + "transitions": [ + { + "state": "idleSettle", + "var": "isNotMoving" + }, + { + "state": "WALKFWD", + "var": "isMovingForward" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "id": "strafeLeftHmd", + "interpDuration": 8, + "interpTarget": 8, + "interpType": "snapshotPrev", + "transitions": [ + { + "state": "idleSettle", + "var": "isNotMoving" + }, + { + "state": "WALKFWD", + "var": "isMovingForward" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "fly", + "interpDuration": 24, + "interpTarget": 24, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "idleSettle", + "var": "isNotFlying" + } + ] + }, + { + "id": "takeoffStand", + "interpDuration": 2, + "interpTarget": 2, + "transitions": [ + { + "state": "inAirStand", + "var": "isNotTakeoff" + } + ] + }, + { + "id": "TAKEOFFRUN", + "interpDuration": 2, + "interpTarget": 2, + "transitions": [ + { + "state": "INAIRRUN", + "var": "isNotTakeoff" + } + ] + }, + { + "id": "inAirStand", + "interpDuration": 3, + "interpTarget": 3, + "interpType": "snapshotPrev", + "transitions": [ + { + "state": "landStandImpact", + "var": "isNotInAir" + } + ] + }, + { + "id": "INAIRRUN", + "interpDuration": 3, + "interpTarget": 3, + "interpType": "snapshotPrev", + "transitions": [ + { + "state": "WALKFWD", + "var": "isNotInAir" + } + ] + }, + { + "id": "landStandImpact", + "interpDuration": 1, + "interpTarget": 1, + "transitions": [ + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "landStand", + "var": "landStandImpactOnDone" + } + ] + }, + { + "id": "landStand", + "interpDuration": 1, + "interpTarget": 1, + "transitions": [ + { + "state": "WALKFWD", + "var": "isMovingForward" + }, + { + "state": "WALKBWD", + "var": "isMovingBackward" + }, + { + "state": "STRAFERIGHT", + "var": "isMovingRight" + }, + { + "state": "STRAFELEFT", + "var": "isMovingLeft" + }, + { + "state": "turnRight", + "var": "isTurningRight" + }, + { + "state": "turnLeft", + "var": "isTurningLeft" + }, + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "inAirStand", + "var": "isInAirStand" + }, + { + "state": "INAIRRUN", + "var": "isInAirRun" + }, + { + "state": "idle", + "var": "landStandOnDone" + }, + { + "state": "strafeRightHmd", + "var": "isMovingRightHmd" + }, + { + "state": "strafeLeftHmd", + "var": "isMovingLeftHmd" + }, + { + "state": "seated", + "var": "isSeated" + } + ] + }, + { + "id": "LANDRUN", + "interpDuration": 2, + "interpTarget": 2, + "transitions": [ + { + "state": "fly", + "var": "isFlying" + }, + { + "state": "takeoffStand", + "var": "isTakeoffStand" + }, + { + "state": "TAKEOFFRUN", + "var": "isTakeoffRun" + }, + { + "state": "WALKFWD", + "var": "landRunOnDone" + } + ] + } + ] }, - "id": "INAIRRUN", - "type": "blendLinear" - }, - { - "children": [ - ], - "data": { - "endFrame": 6, - "loopFlag": false, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/jump_standing_land_settle_all.fbx" - }, - "id": "landStandImpact", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 68, - "loopFlag": false, - "startFrame": 6, - "timeScale": 1, - "url": "qrc:///avatar/animations/jump_standing_land_settle_all.fbx" - }, - "id": "landStand", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 40, - "loopFlag": false, - "startFrame": 29, - "timeScale": 1, - "url": "qrc:///avatar/animations/jump_running_launch_land_all.fbx" - }, - "id": "LANDRUN", - "type": "clip" + "id": "mainStateMachine", + "type": "stateMachine" } ], "data": { - "currentState": "idle", - "outputJoints": [ - "LeftFoot", - "RightFoot" - ], - "states": [ - { - "easingType": "easeInOutQuad", - "id": "seated", - "interpDuration": 6, - "interpTarget": 6, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "idle", - "var": "isNotMoving" - }, - { - "state": "WALKFWD", - "var": "isMovingForward" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "idle", - "interpDuration": 30, - "interpTarget": 30, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "WALKFWD", - "var": "isMovingForward" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "id": "idleToWalkFwd", - "interpDuration": 8, - "interpTarget": 12, - "transitions": [ - { - "state": "WALKFWD", - "var": "idleToWalkFwdOnDone" - }, - { - "state": "idle", - "var": "isNotMoving" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "idleSettle", - "interpDuration": 12, - "interpTarget": 12, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "idle", - "var": "idleSettleOnDone" - }, - { - "state": "WALKFWD", - "var": "isMovingForward" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "id": "WALKFWD", - "interpDuration": 10, - "interpTarget": 35, - "interpType": "snapshotPrev", - "transitions": [ - { - "state": "idleSettle", - "var": "isNotMoving" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "id": "WALKBWD", - "interpDuration": 10, - "interpTarget": 35, - "interpType": "snapshotPrev", - "transitions": [ - { - "state": "idleSettle", - "var": "isNotMoving" - }, - { - "state": "WALKFWD", - "var": "isMovingForward" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "id": "STRAFERIGHT", - "interpDuration": 8, - "interpTarget": 25, - "interpType": "snapshotPrev", - "transitions": [ - { - "state": "idleSettle", - "var": "isNotMoving" - }, - { - "state": "WALKFWD", - "var": "isMovingForward" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "id": "STRAFELEFT", - "interpDuration": 8, - "interpTarget": 25, - "interpType": "snapshotPrev", - "transitions": [ - { - "state": "idleSettle", - "var": "isNotMoving" - }, - { - "state": "WALKFWD", - "var": "isMovingForward" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "turnRight", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "idle", - "var": "isNotTurning" - }, - { - "state": "WALKFWD", - "var": "isMovingForward" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "turnLeft", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "idle", - "var": "isNotTurning" - }, - { - "state": "WALKFWD", - "var": "isMovingForward" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "id": "strafeRightHmd", - "interpDuration": 8, - "interpTarget": 8, - "interpType": "snapshotPrev", - "transitions": [ - { - "state": "idleSettle", - "var": "isNotMoving" - }, - { - "state": "WALKFWD", - "var": "isMovingForward" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "id": "strafeLeftHmd", - "interpDuration": 8, - "interpTarget": 8, - "interpType": "snapshotPrev", - "transitions": [ - { - "state": "idleSettle", - "var": "isNotMoving" - }, - { - "state": "WALKFWD", - "var": "isMovingForward" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "fly", - "interpDuration": 24, - "interpTarget": 24, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "idleSettle", - "var": "isNotFlying" - } - ] - }, - { - "id": "takeoffStand", - "interpDuration": 2, - "interpTarget": 2, - "transitions": [ - { - "state": "inAirStand", - "var": "isNotTakeoff" - } - ] - }, - { - "id": "TAKEOFFRUN", - "interpDuration": 2, - "interpTarget": 2, - "transitions": [ - { - "state": "INAIRRUN", - "var": "isNotTakeoff" - } - ] - }, - { - "id": "inAirStand", - "interpDuration": 3, - "interpTarget": 3, - "interpType": "snapshotPrev", - "transitions": [ - { - "state": "landStandImpact", - "var": "isNotInAir" - } - ] - }, - { - "id": "INAIRRUN", - "interpDuration": 3, - "interpTarget": 3, - "interpType": "snapshotPrev", - "transitions": [ - { - "state": "WALKFWD", - "var": "isNotInAir" - } - ] - }, - { - "id": "landStandImpact", - "interpDuration": 1, - "interpTarget": 1, - "transitions": [ - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "landStand", - "var": "landStandImpactOnDone" - } - ] - }, - { - "id": "landStand", - "interpDuration": 1, - "interpTarget": 1, - "transitions": [ - { - "state": "WALKFWD", - "var": "isMovingForward" - }, - { - "state": "WALKBWD", - "var": "isMovingBackward" - }, - { - "state": "STRAFERIGHT", - "var": "isMovingRight" - }, - { - "state": "STRAFELEFT", - "var": "isMovingLeft" - }, - { - "state": "turnRight", - "var": "isTurningRight" - }, - { - "state": "turnLeft", - "var": "isTurningLeft" - }, - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "inAirStand", - "var": "isInAirStand" - }, - { - "state": "INAIRRUN", - "var": "isInAirRun" - }, - { - "state": "idle", - "var": "landStandOnDone" - }, - { - "state": "strafeRightHmd", - "var": "isMovingRightHmd" - }, - { - "state": "strafeLeftHmd", - "var": "isMovingLeftHmd" - }, - { - "state": "seated", - "var": "isSeated" - } - ] - }, - { - "id": "LANDRUN", - "interpDuration": 2, - "interpTarget": 2, - "transitions": [ - { - "state": "fly", - "var": "isFlying" - }, - { - "state": "takeoffStand", - "var": "isTakeoffStand" - }, - { - "state": "TAKEOFFRUN", - "var": "isTakeoffRun" - }, - { - "state": "WALKFWD", - "var": "landRunOnDone" - } - ] - } - ] + "alpha": 0, + "alphaVar": "leftHandOverlayAlpha", + "boneSet": "leftHand" }, - "id": "mainStateMachine", - "type": "stateMachine" + "id": "leftHandOverlay", + "type": "overlay" } ], "data": { "alpha": 0, - "alphaVar": "leftHandOverlayAlpha", - "boneSet": "leftHand" + "alphaVar": "rightHandOverlayAlpha", + "boneSet": "rightHand" }, - "id": "leftHandOverlay", + "id": "rightHandOverlay", "type": "overlay" } ], "data": { "alpha": 0, - "alphaVar": "rightHandOverlayAlpha", - "boneSet": "rightHand" + "alphaVar": "defaultPoseOverlayAlpha", + "boneSet": "fullBody", + "boneSetVar": "defaultPoseOverlayBoneSet" }, - "id": "rightHandOverlay", + "id": "defaultPoseOverlay", "type": "overlay" } ], "data": { - "alpha": 0, - "alphaVar": "defaultPoseOverlayAlpha", - "boneSet": "fullBody", - "boneSetVar": "defaultPoseOverlayBoneSet" + "alpha": 1, + "alphaVar": "ikOverlayAlpha", + "boneSet": "fullBody" }, - "id": "defaultPoseOverlay", + "id": "ikOverlay", "type": "overlay" } ], "data": { "alpha": 1, - "alphaVar": "ikOverlayAlpha", - "boneSet": "fullBody" + "alphaVar": "leftFootIKAlpha", + "baseJointName": "LeftUpLeg", + "enabled": false, + "enabledVar": "leftFootIKEnabled", + "endEffectorPositionVarVar": "leftFootIKPositionVar", + "endEffectorRotationVarVar": "leftFootIKRotationVar", + "interpDuration": 15, + "midHingeAxis": [ + -1, + 0, + 0 + ], + "midJointName": "LeftLeg", + "tipJointName": "LeftFoot" }, - "id": "ikOverlay", - "type": "overlay" + "id": "leftFootIK", + "type": "twoBoneIK" } ], "data": { - "alpha": 1, - "alphaVar": "leftFootIKAlpha", "baseJointName": "LeftUpLeg", "enabled": false, - "enabledVar": "leftFootIKEnabled", - "endEffectorPositionVarVar": "leftFootIKPositionVar", - "endEffectorRotationVarVar": "leftFootIKRotationVar", - "interpDuration": 15, - "midHingeAxis": [ - -1, - 0, - 0 - ], + "enabledVar": "leftFootPoleVectorEnabled", "midJointName": "LeftLeg", + "poleVectorVar": "leftFootPoleVector", + "referenceVector": [ + 0, + 0, + 1 + ], "tipJointName": "LeftFoot" }, - "id": "leftFootIK", - "type": "twoBoneIK" + "id": "leftFootPoleVector", + "type": "poleVectorConstraint" } ], "data": { - "baseJointName": "LeftUpLeg", + "alpha": 1, + "alphaVar": "rightFootIKAlpha", + "baseJointName": "RightUpLeg", "enabled": false, - "enabledVar": "leftFootPoleVectorEnabled", - "midJointName": "LeftLeg", - "poleVectorVar": "leftFootPoleVector", - "referenceVector": [ + "enabledVar": "rightFootIKEnabled", + "endEffectorPositionVarVar": "rightFootIKPositionVar", + "endEffectorRotationVarVar": "rightFootIKRotationVar", + "interpDuration": 15, + "midHingeAxis": [ + -1, 0, - 0, - 1 + 0 ], - "tipJointName": "LeftFoot" + "midJointName": "RightLeg", + "tipJointName": "RightFoot" }, - "id": "leftFootPoleVector", - "type": "poleVectorConstraint" + "id": "rightFootIK", + "type": "twoBoneIK" } ], "data": { - "alpha": 1, - "alphaVar": "rightFootIKAlpha", "baseJointName": "RightUpLeg", "enabled": false, - "enabledVar": "rightFootIKEnabled", - "endEffectorPositionVarVar": "rightFootIKPositionVar", - "endEffectorRotationVarVar": "rightFootIKRotationVar", - "interpDuration": 15, - "midHingeAxis": [ - -1, - 0, - 0 - ], + "enabledVar": "rightFootPoleVectorEnabled", "midJointName": "RightLeg", + "poleVectorVar": "rightFootPoleVector", + "referenceVector": [ + 0, + 0, + 1 + ], "tipJointName": "RightFoot" }, - "id": "rightFootIK", - "type": "twoBoneIK" + "id": "userAnimNone", + "type": "poleVectorConstraint" + }, + { + "children": [ + ], + "data": { + "endFrame": 300, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle.fbx" + }, + "id": "userAnimA", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 300, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle.fbx" + }, + "id": "userAnimB", + "type": "clip" } ], "data": { - "baseJointName": "RightUpLeg", - "enabled": false, - "enabledVar": "rightFootPoleVectorEnabled", - "midJointName": "RightLeg", - "poleVectorVar": "rightFootPoleVector", - "referenceVector": [ + "currentState": "userAnimNone", + "states": [ + { + "easingType": "easeInOutQuad", + "id": "userAnimNone", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "userAnimA", + "var": "userAnimA" + }, + { + "state": "userAnimB", + "var": "userAnimB" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "userAnimA", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "userAnimNone", + "var": "userAnimNone" + }, + { + "state": "userAnimB", + "var": "userAnimB" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "userAnimB", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "userAnimNone", + "var": "userAnimNone" + }, + { + "state": "userAnimA", + "var": "userAnimA" + } + ] + } + ] + }, + "id": "userAnimStateMachine", + "type": "stateMachine" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 11, + "loopFlag": true, + "startFrame": 11, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookLeft", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 30, + "loopFlag": true, + "startFrame": 30, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookRight", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 50, + "loopFlag": true, + "startFrame": 50, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookUp", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 70, + "loopFlag": true, + "startFrame": 70, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookDown", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 97, + "loopFlag": true, + "startFrame": 97, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookUpLeft", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 110, + "loopFlag": true, + "startFrame": 110, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookUpRight", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 130, + "loopFlag": true, + "startFrame": 130, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookDownLeft", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 150, + "loopFlag": true, + "startFrame": 150, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookDownRight", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 3, + "loopFlag": true, + "startFrame": 3, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookCenter", + "type": "clip" + } + ], + "data": { + "alpha": [ 0, 0, - 1 + 0 ], - "tipJointName": "RightFoot" + "alphaVar": "lookAroundAlpha", + "centerId": "lookCenter", + "downId": "lookDown", + "downLeftId": "lookDownLeft", + "downRightId": "lookDownRight", + "leftId": "lookLeft", + "rightId": "lookRight", + "upId": "lookUp", + "upLeftId": "lookUpLeft", + "upRightId": "lookUpRight" }, - "id": "userAnimNone", - "type": "poleVectorConstraint" - }, - { - "children": [ - ], - "data": { - "endFrame": 300, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle.fbx" - }, - "id": "userAnimA", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 300, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle.fbx" - }, - "id": "userAnimB", - "type": "clip" + "id": "lookAround", + "type": "blendDirectional" } ], "data": { - "currentState": "userAnimNone", - "states": [ - { - "easingType": "easeInOutQuad", - "id": "userAnimNone", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "userAnimA", - "var": "userAnimA" - }, - { - "state": "userAnimB", - "var": "userAnimB" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "userAnimA", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "userAnimNone", - "var": "userAnimNone" - }, - { - "state": "userAnimB", - "var": "userAnimB" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "userAnimB", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "userAnimNone", - "var": "userAnimNone" - }, - { - "state": "userAnimA", - "var": "userAnimA" - } - ] - } - ] + "alpha": 0, + "alphaVar": "additiveBlendAlpha", + "blendType": "addAbsolute" }, - "id": "userAnimStateMachine", - "type": "stateMachine" + "id": "additiveBlend", + "type": "blendLinear" }, "version": "1.1" } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index a367f6331f..5a12771661 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3433,11 +3433,32 @@ void MyAvatar::updateOrientation(float deltaTime) { head->setBaseYaw(YAW(euler)); head->setBasePitch(PITCH(euler)); head->setBaseRoll(ROLL(euler)); - } else { + } else if (qApp->getCamera().getMode() != CAMERA_MODE_LOOK_AT) { head->setBaseYaw(0.0f); head->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT); head->setBaseRoll(0.0f); + } else { + head->setBaseYaw(0.0f); + head->setBasePitch(0.0f); + head->setBaseRoll(0.0f); + /* + if (_rigEnabled) { + glm::vec3 avatarXVector = getWorldOrientation() * Vectors::UNIT_X; + glm::vec3 avatarZVector = getWorldOrientation() * Vectors::UNIT_Z; + glm::vec3 cameraZVector = _lookAtOffsetYaw * Vectors::UNIT_Z; + float xOffset = glm::dot(avatarXVector, cameraZVector); + float yOffset = glm::dot(avatarZVector, cameraZVector); + const QString HEAD_BLENDING_NAME = "lookAroundAlpha"; + const QString HEAD_ALPHA_NAME = "additiveBlendAlpha"; + _skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, glm::vec3(-xOffset, -0.2*yOffset, 0.0f), HEAD_ALPHA_NAME, 1.0f); + } + */ + glm::vec3 cameraVector = getLookAtOffset() * Vectors::UNIT_Z; + glm::vec3 cameraPos = qApp->getCamera().getPosition(); + float distanceTargetFromCamera = 2.0f * glm::length(cameraPos - getWorldPosition()); + glm::vec3 targetPoint = qApp->getCamera().getPosition() + distanceTargetFromCamera * cameraVector; + QMetaObject::invokeMethod(this, "headLookAt", Q_ARG(const glm::vec3&, targetPoint)); } } @@ -6313,3 +6334,35 @@ void MyAvatar::endSit(const glm::vec3& position, const glm::quat& rotation) { }); } } + +void MyAvatar::headLookAt(const glm::vec3& lookAtTarget) { + if (QThread::currentThread() != thread()) { + BLOCKING_INVOKE_METHOD(this, "headLookAt", + Q_ARG(const glm::vec3&, lookAtTarget)); + return; + } + if (_rigEnabled) { + glm::vec3 avatarXVector = getWorldOrientation() * Vectors::UNIT_X; + glm::vec3 avatarYVector = getWorldOrientation() * Vectors::UNIT_Y; + glm::vec3 headToTargetVector = lookAtTarget - getHead()->getPosition(); + if (glm::length(headToTargetVector) > EPSILON) { + headToTargetVector = glm::normalize(headToTargetVector); + } else { + return; + } + float xOffset = -glm::dot(avatarXVector, headToTargetVector); + float yOffset = -glm::dot(avatarYVector, headToTargetVector); + const QString HEAD_BLENDING_NAME = "lookAroundAlpha"; + const QString HEAD_ALPHA_NAME = "additiveBlendAlpha"; + const float HEAD_ALPHA_BLENDING = 1.0f; + const float LOOK_UP_ATTENUATION = 0.75f; + const float LOOK_DOWN_ATTENUATION = 0.25f; + const float LOOK_AT_TAU = 0.2f; + yOffset = yOffset > 0 ? LOOK_UP_ATTENUATION * yOffset : LOOK_DOWN_ATTENUATION * yOffset; + _lookAtBlend = _lookAtBlend + LOOK_AT_TAU * (glm::vec3(xOffset, yOffset, 0.0f) - _lookAtBlend); + + + _skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, _lookAtBlend, + HEAD_ALPHA_NAME, HEAD_ALPHA_BLENDING); + } +} \ No newline at end of file diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 966babfd2f..51e4fe1121 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1747,6 +1747,13 @@ public: glm::vec3 getNextPosition() { return _goToPending ? _goToPosition : getWorldPosition(); } void prepareAvatarEntityDataForReload(); + /**jsdoc + * Turn the avatar's head until it faces the target point within the 90/-90 degrees range. + * @function MyAvatar.headLookAt + * @param {Vec3} lookAtTarget - The target 3D point. + */ + Q_INVOKABLE void headLookAt(const glm::vec3& lookAtTarget); + glm::quat getLookAtOffset() { return _lookAtOffsetYaw * _lookAtOffsetPitch; } /**jsdoc @@ -2622,6 +2629,7 @@ private: glm::quat _lookAtOffsetPitch; glm::quat _lookAtOffsetYaw; + glm::vec3 _lookAtBlend; Setting::Handle _realWorldFieldOfView; Setting::Handle _useAdvancedMovementControls; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index ceb18041f1..9b015adf85 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -2632,3 +2632,8 @@ float Rig::getUnscaledEyeHeight() const { return DEFAULT_AVATAR_EYE_HEIGHT; } } + +void Rig::setDirectionalBlending(const QString& targetName, const glm::vec3& blendingTarget, const QString& alphaName, float alpha) { + _animVars.set(targetName, blendingTarget); + _animVars.set(alphaName, alpha); +} diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 99794fd0a7..47f96221f9 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -252,6 +252,7 @@ public: int getOverrideJointCount() const; bool getFlowActive() const; bool getNetworkGraphActive() const; + void setDirectionalBlending(const QString& targetName, const glm::vec3& blendingTarget, const QString& alphaName, float alpha); signals: void onLoadComplete(); From 3b8d3f987d558d6838de8290a2ee364e5a3081a8 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Fri, 6 Sep 2019 14:28:45 -0700 Subject: [PATCH 05/29] Add animation --- .../avatar/animations/idle_aimoffsets.fbx | Bin 0 -> 248576 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 interface/resources/avatar/animations/idle_aimoffsets.fbx diff --git a/interface/resources/avatar/animations/idle_aimoffsets.fbx b/interface/resources/avatar/animations/idle_aimoffsets.fbx new file mode 100644 index 0000000000000000000000000000000000000000..6e5ab05fdc565ccb10bdf611e2556dcd1040f813 GIT binary patch literal 248576 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 ZKmP5T|G Date: Fri, 6 Sep 2019 17:50:06 -0700 Subject: [PATCH 06/29] Refactorting, up/down attenuation and comments --- interface/src/avatar/MyAvatar.cpp | 62 +++++++++++++++++-------------- interface/src/avatar/MyAvatar.h | 2 +- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 5a12771661..fdea692f14 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3433,32 +3433,45 @@ void MyAvatar::updateOrientation(float deltaTime) { head->setBaseYaw(YAW(euler)); head->setBasePitch(PITCH(euler)); head->setBaseRoll(ROLL(euler)); - } else if (qApp->getCamera().getMode() != CAMERA_MODE_LOOK_AT) { - head->setBaseYaw(0.0f); - head->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime - + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT); - head->setBaseRoll(0.0f); - } else { + } else if (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) { + // Reset head orientation before applying the blending offset head->setBaseYaw(0.0f); head->setBasePitch(0.0f); head->setBaseRoll(0.0f); - /* - if (_rigEnabled) { - glm::vec3 avatarXVector = getWorldOrientation() * Vectors::UNIT_X; - glm::vec3 avatarZVector = getWorldOrientation() * Vectors::UNIT_Z; - glm::vec3 cameraZVector = _lookAtOffsetYaw * Vectors::UNIT_Z; - float xOffset = glm::dot(avatarXVector, cameraZVector); - float yOffset = glm::dot(avatarZVector, cameraZVector); - const QString HEAD_BLENDING_NAME = "lookAroundAlpha"; - const QString HEAD_ALPHA_NAME = "additiveBlendAlpha"; - _skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, glm::vec3(-xOffset, -0.2*yOffset, 0.0f), HEAD_ALPHA_NAME, 1.0f); + // Attenuate head pitch + glm::vec3 cameraVector = (faceForward ? _lookAtOffsetPitch * getWorldOrientation() : getLookAtOffset()) * Vectors::UNIT_Z; + glm::vec3 cameraYawVector = _lookAtOffsetYaw * Vectors::UNIT_Z; + float upDownDirection = glm::dot(cameraVector, Vectors::UNIT_Y); + float upDownValue = abs(upDownDirection); + const float LOOK_UP_MIN_DOT = 0.25f; + const float LOOK_DOWN_MIN_DOT = 0.75f; + if (upDownDirection < 0.0f) { + float lookUpAttenuation = upDownValue > LOOK_UP_MIN_DOT ? (upDownValue - LOOK_UP_MIN_DOT) / (1.0f - LOOK_UP_MIN_DOT) : 0.0f; + cameraVector = glm::mix(cameraVector, cameraYawVector, 1.0f - lookUpAttenuation); + } else { + float lookDownAttenuation = upDownValue > LOOK_DOWN_MIN_DOT ? (upDownValue - LOOK_DOWN_MIN_DOT) / (1.0f - LOOK_DOWN_MIN_DOT) : 0.0f; + cameraVector = glm::mix(cameraVector, cameraYawVector, 1.0f - lookDownAttenuation); } - */ - glm::vec3 cameraVector = getLookAtOffset() * Vectors::UNIT_Z; + // Calculate the camera target point. glm::vec3 cameraPos = qApp->getCamera().getPosition(); float distanceTargetFromCamera = 2.0f * glm::length(cameraPos - getWorldPosition()); glm::vec3 targetPoint = qApp->getCamera().getPosition() + distanceTargetFromCamera * cameraVector; - QMetaObject::invokeMethod(this, "headLookAt", Q_ARG(const glm::vec3&, targetPoint)); + + const float LOOKAT_MIX_ALPHA = 0.05f; + const float FPS = 60.0f; + + // Approximate the head's look at vector to the camera look at vector with some delay. + float mixAlpha = LOOKAT_MIX_ALPHA * deltaTime * FPS; + mixAlpha = targetSpeed != 0.0f ? mixAlpha * abs(targetSpeed) / _yawSpeed : mixAlpha; + _lookAtCameraTarget = glm::mix(_lookAtCameraTarget, targetPoint, mixAlpha); + + // Set the head look at target + QMetaObject::invokeMethod(this, "headLookAt", Q_ARG(const glm::vec3&, _lookAtCameraTarget)); + } else { + head->setBaseYaw(0.0f); + head->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime + + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT); + head->setBaseRoll(0.0f); } } @@ -6348,6 +6361,7 @@ void MyAvatar::headLookAt(const glm::vec3& lookAtTarget) { if (glm::length(headToTargetVector) > EPSILON) { headToTargetVector = glm::normalize(headToTargetVector); } else { + // The target point is the avatar head return; } float xOffset = -glm::dot(avatarXVector, headToTargetVector); @@ -6355,14 +6369,8 @@ void MyAvatar::headLookAt(const glm::vec3& lookAtTarget) { const QString HEAD_BLENDING_NAME = "lookAroundAlpha"; const QString HEAD_ALPHA_NAME = "additiveBlendAlpha"; const float HEAD_ALPHA_BLENDING = 1.0f; - const float LOOK_UP_ATTENUATION = 0.75f; - const float LOOK_DOWN_ATTENUATION = 0.25f; - const float LOOK_AT_TAU = 0.2f; - yOffset = yOffset > 0 ? LOOK_UP_ATTENUATION * yOffset : LOOK_DOWN_ATTENUATION * yOffset; - _lookAtBlend = _lookAtBlend + LOOK_AT_TAU * (glm::vec3(xOffset, yOffset, 0.0f) - _lookAtBlend); - - - _skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, _lookAtBlend, + glm::vec3 lookAtBlend = glm::vec3(xOffset, yOffset, 0.0f); + _skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, lookAtBlend, HEAD_ALPHA_NAME, HEAD_ALPHA_BLENDING); } } \ No newline at end of file diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 51e4fe1121..e570942480 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -2629,7 +2629,7 @@ private: glm::quat _lookAtOffsetPitch; glm::quat _lookAtOffsetYaw; - glm::vec3 _lookAtBlend; + glm::vec3 _lookAtCameraTarget; Setting::Handle _realWorldFieldOfView; Setting::Handle _useAdvancedMovementControls; From 2f33e37eb6d7c7730b6a2c3d1b785ba1a7c48a10 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 10 Sep 2019 18:10:02 -0700 Subject: [PATCH 07/29] Angles instead dot product and fix API --- interface/src/Application.cpp | 10 +-- interface/src/avatar/MyAvatar.cpp | 110 ++++++++++++++++++--------- interface/src/avatar/MyAvatar.h | 8 ++ libraries/shared/src/shared/Camera.h | 2 +- 4 files changed, 89 insertions(+), 41 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0dea3e2708..af330b4ad0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5527,7 +5527,7 @@ void Application::loadSettings() { // dictated that we should be in first person Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, isFirstPerson); Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, !isFirstPerson); - _myCamera.setMode((isFirstPerson) ? CAMERA_MODE_FIRST_PERSON : CAMERA_MODE_THIRD_PERSON); + _myCamera.setMode((isFirstPerson) ? CAMERA_MODE_FIRST_PERSON : CAMERA_MODE_LOOK_AT); cameraMenuChanged(); auto inputs = pluginManager->getInputPlugins(); @@ -5984,7 +5984,7 @@ void Application::cameraModeChanged() { case CAMERA_MODE_FIRST_PERSON: Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, true); break; - case CAMERA_MODE_THIRD_PERSON: + case CAMERA_MODE_LOOK_AT: Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, true); break; case CAMERA_MODE_MIRROR: @@ -6006,7 +6006,7 @@ void Application::changeViewAsNeeded(float boomLength) { Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, false); Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, true); cameraMenuChanged(); - } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON && !boomLengthGreaterThanMinimum) { + } else if (_myCamera.getMode() == CAMERA_MODE_LOOK_AT && !boomLengthGreaterThanMinimum) { Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, true); Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, false); cameraMenuChanged(); @@ -6028,8 +6028,8 @@ void Application::cameraMenuChanged() { getMyAvatar()->setBoomLength(MyAvatar::ZOOM_MIN); } } else if (menu->isOptionChecked(MenuOption::ThirdPerson)) { - if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) { - _myCamera.setMode(CAMERA_MODE_THIRD_PERSON); + if (_myCamera.getMode() != CAMERA_MODE_LOOK_AT) { + _myCamera.setMode(CAMERA_MODE_LOOK_AT); if (getMyAvatar()->getBoomLength() == MyAvatar::ZOOM_MIN) { getMyAvatar()->setBoomLength(MyAvatar::ZOOM_DEFAULT); } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index fdea692f14..06fbc368db 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -99,6 +99,10 @@ static const QString USER_RECENTER_MODEL_FORCE_STAND = QStringLiteral("ForceStan static const QString USER_RECENTER_MODEL_AUTO = QStringLiteral("Auto"); static const QString USER_RECENTER_MODEL_DISABLE_HMD_LEAN = QStringLiteral("DisableHMDLean"); +const QString HEAD_BLENDING_NAME = "lookAroundAlpha"; +const QString HEAD_ALPHA_NAME = "additiveBlendAlpha"; +const float HEAD_ALPHA_BLENDING = 1.0f; + MyAvatar::SitStandModelType stringToUserRecenterModel(const QString& str) { if (str == USER_RECENTER_MODEL_FORCE_SIT) { return MyAvatar::ForceSit; @@ -936,6 +940,12 @@ void MyAvatar::simulate(float deltaTime, bool inView) { head->setPosition(headPosition); head->setScale(getModelScale()); head->simulate(deltaTime); + if (_scriptControlsHeadLookAt || qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) { + updateHeadLookAt(deltaTime); + } else if (_headLookAtActive){ + resetHeadLookAt(); + _headLookAtActive = false; + } } // Record avatars movements. @@ -3402,6 +3412,9 @@ void MyAvatar::updateOrientation(float deltaTime) { glm::quat initialOrientation = getOrientationOutbound(); if (qApp->getCamera().getMode() != CAMERA_MODE_LOOK_AT) { setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f)))); + _lookAtCameraTarget = getHead()->getPosition() + getWorldOrientation() * Vectors::FRONT; + _lookAtOffsetYaw = getWorldOrientation(); + _lookAtOffsetPitch = Quaternions::IDENTITY; } else { // Set look at vector float pitchIncrement = getDriveKey(PITCH) * _pitchSpeed * deltaTime @@ -3439,12 +3452,12 @@ void MyAvatar::updateOrientation(float deltaTime) { head->setBasePitch(0.0f); head->setBaseRoll(0.0f); // Attenuate head pitch - glm::vec3 cameraVector = (faceForward ? _lookAtOffsetPitch * getWorldOrientation() : getLookAtOffset()) * Vectors::UNIT_Z; - glm::vec3 cameraYawVector = _lookAtOffsetYaw * Vectors::UNIT_Z; - float upDownDirection = glm::dot(cameraVector, Vectors::UNIT_Y); + glm::vec3 cameraVector = (faceForward ? _lookAtOffsetPitch * getWorldOrientation() : getLookAtOffset()) * Vectors::FRONT; + glm::vec3 cameraYawVector = _lookAtOffsetYaw * Vectors::FRONT; + float upDownDirection = glm::dot(cameraVector, Vectors::UP); float upDownValue = abs(upDownDirection); - const float LOOK_UP_MIN_DOT = 0.25f; - const float LOOK_DOWN_MIN_DOT = 0.75f; + const float LOOK_UP_MIN_DOT = 0.35f; + const float LOOK_DOWN_MIN_DOT = 0.25f; if (upDownDirection < 0.0f) { float lookUpAttenuation = upDownValue > LOOK_UP_MIN_DOT ? (upDownValue - LOOK_UP_MIN_DOT) / (1.0f - LOOK_UP_MIN_DOT) : 0.0f; cameraVector = glm::mix(cameraVector, cameraYawVector, 1.0f - lookUpAttenuation); @@ -3454,8 +3467,8 @@ void MyAvatar::updateOrientation(float deltaTime) { } // Calculate the camera target point. glm::vec3 cameraPos = qApp->getCamera().getPosition(); - float distanceTargetFromCamera = 2.0f * glm::length(cameraPos - getWorldPosition()); - glm::vec3 targetPoint = qApp->getCamera().getPosition() + distanceTargetFromCamera * cameraVector; + const float targetDistanceFromHead = 2.0f; + glm::vec3 targetPoint = getHead()->getPosition() + targetDistanceFromHead * glm::normalize(cameraVector); const float LOOKAT_MIX_ALPHA = 0.05f; const float FPS = 60.0f; @@ -3464,9 +3477,7 @@ void MyAvatar::updateOrientation(float deltaTime) { float mixAlpha = LOOKAT_MIX_ALPHA * deltaTime * FPS; mixAlpha = targetSpeed != 0.0f ? mixAlpha * abs(targetSpeed) / _yawSpeed : mixAlpha; _lookAtCameraTarget = glm::mix(_lookAtCameraTarget, targetPoint, mixAlpha); - - // Set the head look at target - QMetaObject::invokeMethod(this, "headLookAt", Q_ARG(const glm::vec3&, _lookAtCameraTarget)); + _headLookAtActive = true; } else { head->setBaseYaw(0.0f); head->setBasePitch(getHead()->getBasePitch() + getDriveKey(PITCH) * _pitchSpeed * deltaTime @@ -3538,11 +3549,7 @@ glm::vec3 MyAvatar::scaleMotorSpeed(const glm::vec3 forward, const glm::vec3 rig } } else { // Desktop mode. - if (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) { - direction = (zSpeed * forward) + (xSpeed * right); - } else { - direction = (zSpeed * forward) + (xSpeed * right); - } + direction = (zSpeed * forward) + (xSpeed * right); auto length = glm::length(direction); if (length > EPSILON) { @@ -6348,29 +6355,62 @@ void MyAvatar::endSit(const glm::vec3& position, const glm::quat& rotation) { } } +void MyAvatar::resetHeadLookAt() { + if (_rigEnabled) { + _skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, glm::vec3(), + HEAD_ALPHA_NAME, HEAD_ALPHA_BLENDING); + } +} + +void MyAvatar::updateHeadLookAt(float deltaTime) { + if (_rigEnabled) { + glm::vec3 lookAtTarget = _scriptControlsHeadLookAt ? _lookAtScriptTarget : _lookAtCameraTarget; + glm::vec3 avatarXVector = glm::normalize(getWorldOrientation() * Vectors::UNIT_X); + glm::vec3 avatarYVector = glm::normalize(getWorldOrientation() * Vectors::UNIT_Y); + glm::vec3 headToTargetVector = lookAtTarget - getHead()->getPosition(); + if (glm::length(headToTargetVector) > EPSILON) { + headToTargetVector = glm::normalize(headToTargetVector); + } + else { + // The target point is the avatar head + return; + } + + float xDot = glm::dot(avatarXVector, headToTargetVector); + float yDot = glm::dot(avatarYVector, headToTargetVector); + + bool isLookingUp = yDot >= 0.0f; + float xAngle = acosf(xDot); + float yAngle = acosf(yDot); + + // xBlend and yBlend are the values from -1.0 to 1.0 that set the directional blending. + // We compute them using the angles (0 to PI/2) => (1.0 to 0.0) and (PI/2 to PI) => (0.0 to -1.0) + float xBlend = -(xAngle - 0.5f * PI) / (0.5f * PI); + float yBlend = -(yAngle - 0.5f * PI) / (0.5f * PI); + + glm::vec3 lookAtBlend = glm::vec3(xBlend, yBlend, 0.0f); + _skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, lookAtBlend, + HEAD_ALPHA_NAME, HEAD_ALPHA_BLENDING); + + if (_scriptControlsHeadLookAt) { + _scriptHeadControlSinceUpdate += deltaTime; + if (_scriptHeadControlSinceUpdate > MAX_LOOK_AT_TIME_SCRIPT_CONTROL) { + _scriptHeadControlSinceUpdate = 0.0f; + _scriptControlsHeadLookAt = false; + _lookAtCameraTarget = _lookAtScriptTarget; + } + } + } +} + void MyAvatar::headLookAt(const glm::vec3& lookAtTarget) { if (QThread::currentThread() != thread()) { BLOCKING_INVOKE_METHOD(this, "headLookAt", Q_ARG(const glm::vec3&, lookAtTarget)); return; } - if (_rigEnabled) { - glm::vec3 avatarXVector = getWorldOrientation() * Vectors::UNIT_X; - glm::vec3 avatarYVector = getWorldOrientation() * Vectors::UNIT_Y; - glm::vec3 headToTargetVector = lookAtTarget - getHead()->getPosition(); - if (glm::length(headToTargetVector) > EPSILON) { - headToTargetVector = glm::normalize(headToTargetVector); - } else { - // The target point is the avatar head - return; - } - float xOffset = -glm::dot(avatarXVector, headToTargetVector); - float yOffset = -glm::dot(avatarYVector, headToTargetVector); - const QString HEAD_BLENDING_NAME = "lookAroundAlpha"; - const QString HEAD_ALPHA_NAME = "additiveBlendAlpha"; - const float HEAD_ALPHA_BLENDING = 1.0f; - glm::vec3 lookAtBlend = glm::vec3(xOffset, yOffset, 0.0f); - _skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, lookAtBlend, - HEAD_ALPHA_NAME, HEAD_ALPHA_BLENDING); - } -} \ No newline at end of file + _headLookAtActive = true; + _scriptControlsHeadLookAt = true; + _scriptHeadControlSinceUpdate = 0.0f; + _lookAtScriptTarget = lookAtTarget; +} diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index e570942480..d4bd7bbd3b 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -2627,9 +2627,15 @@ private: glm::vec3 _trackedHeadPosition; + const float MAX_LOOK_AT_TIME_SCRIPT_CONTROL = 2.0f; glm::quat _lookAtOffsetPitch; glm::quat _lookAtOffsetYaw; glm::vec3 _lookAtCameraTarget; + glm::vec3 _lookAtScriptTarget; + bool _headLookAtActive { false }; + bool _scriptControlsHeadLookAt { false }; + float _scriptHeadControlSinceUpdate { 0.0f }; + Setting::Handle _realWorldFieldOfView; Setting::Handle _useAdvancedMovementControls; @@ -2655,6 +2661,8 @@ private: void initHeadBones(); void initAnimGraph(); void initFlowFromFST(); + void updateHeadLookAt(float deltaTime); + void resetHeadLookAt(); // Avatar Preferences QUrl _fullAvatarURLFromPreferences; diff --git a/libraries/shared/src/shared/Camera.h b/libraries/shared/src/shared/Camera.h index 2de5332538..bae4b9aeae 100644 --- a/libraries/shared/src/shared/Camera.h +++ b/libraries/shared/src/shared/Camera.h @@ -183,7 +183,7 @@ private: void recompose(); void decompose(); - CameraMode _mode{ CAMERA_MODE_THIRD_PERSON }; + CameraMode _mode{ CAMERA_MODE_LOOK_AT }; glm::mat4 _transform; glm::mat4 _projection; From 7584fe587e1069f1e70d5f7fcaad1e23a0f0709c Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 11 Sep 2019 11:21:53 -0700 Subject: [PATCH 08/29] Fix warnings and initial camera orientation --- interface/src/avatar/MyAvatar.cpp | 69 ++++++++++++++++++------------- interface/src/avatar/MyAvatar.h | 3 +- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 06fbc368db..f1febb0c78 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3089,7 +3089,7 @@ void MyAvatar::initAnimGraph() { } emit animGraphUrlChanged(graphUrl); - + _lookAtCameraReady = false; _skeletonModel->getRig().initAnimGraph(graphUrl); _currentAnimGraphUrl.set(graphUrl); connect(&(_skeletonModel->getRig()), SIGNAL(onLoadComplete()), this, SLOT(animGraphLoaded())); @@ -3104,6 +3104,7 @@ void MyAvatar::animGraphLoaded() { updateSensorToWorldMatrix(); // Uses updated position/orientation and _bodySensorMatrix changes _isAnimatingScale = true; _cauterizationNeedsUpdate = true; + _lookAtCameraReady = true; disconnect(&(_skeletonModel->getRig()), SIGNAL(onLoadComplete()), this, SLOT(animGraphLoaded())); } @@ -3363,7 +3364,8 @@ void MyAvatar::updateOrientation(float deltaTime) { float totalBodyYaw = _bodyYawDelta * deltaTime; // Rotate directly proportional to delta yaw and delta pitch from right-click mouse movement. - if (qApp->getCamera().getMode() != CAMERA_MODE_LOOK_AT) { + bool computeCameraLookAt = qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT && _lookAtCameraReady; + if (!computeCameraLookAt) { totalBodyYaw += getDriveKey(DELTA_YAW) * _yawSpeed / YAW_SPEED_DEFAULT; } @@ -3410,7 +3412,7 @@ void MyAvatar::updateOrientation(float deltaTime) { // update body orientation by movement inputs glm::quat initialOrientation = getOrientationOutbound(); - if (qApp->getCamera().getMode() != CAMERA_MODE_LOOK_AT) { + if (!computeCameraLookAt) { setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f)))); _lookAtCameraTarget = getHead()->getPosition() + getWorldOrientation() * Vectors::FRONT; _lookAtOffsetYaw = getWorldOrientation(); @@ -3446,7 +3448,7 @@ void MyAvatar::updateOrientation(float deltaTime) { head->setBaseYaw(YAW(euler)); head->setBasePitch(PITCH(euler)); head->setBaseRoll(ROLL(euler)); - } else if (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) { + } else if (computeCameraLookAt) { // Reset head orientation before applying the blending offset head->setBaseYaw(0.0f); head->setBasePitch(0.0f); @@ -3454,29 +3456,40 @@ void MyAvatar::updateOrientation(float deltaTime) { // Attenuate head pitch glm::vec3 cameraVector = (faceForward ? _lookAtOffsetPitch * getWorldOrientation() : getLookAtOffset()) * Vectors::FRONT; glm::vec3 cameraYawVector = _lookAtOffsetYaw * Vectors::FRONT; - float upDownDirection = glm::dot(cameraVector, Vectors::UP); - float upDownValue = abs(upDownDirection); - const float LOOK_UP_MIN_DOT = 0.35f; - const float LOOK_DOWN_MIN_DOT = 0.25f; - if (upDownDirection < 0.0f) { - float lookUpAttenuation = upDownValue > LOOK_UP_MIN_DOT ? (upDownValue - LOOK_UP_MIN_DOT) / (1.0f - LOOK_UP_MIN_DOT) : 0.0f; - cameraVector = glm::mix(cameraVector, cameraYawVector, 1.0f - lookUpAttenuation); + + // Cap and attenuate head's lookat pitch angle + const float START_LOOKING_UP_DEGREES = 5.0f; + const float START_LOOKING_DOWN_DEGREES = 15.0f; + const float MAX_UP_DOWN_DEGREES = 90.0f; + + float upDownDot = glm::dot(cameraVector, Vectors::UP); + float upDownDegrees = MAX_UP_DOWN_DEGREES - glm::degrees(acosf(abs(upDownDot))); + + float lookAttenuation = 0.0f; + if (upDownDot <= 0.0f) { + if (upDownDegrees > START_LOOKING_DOWN_DEGREES) { + lookAttenuation = (upDownDegrees - START_LOOKING_DOWN_DEGREES) / (MAX_UP_DOWN_DEGREES - START_LOOKING_DOWN_DEGREES); + } } else { - float lookDownAttenuation = upDownValue > LOOK_DOWN_MIN_DOT ? (upDownValue - LOOK_DOWN_MIN_DOT) / (1.0f - LOOK_DOWN_MIN_DOT) : 0.0f; - cameraVector = glm::mix(cameraVector, cameraYawVector, 1.0f - lookDownAttenuation); + if (upDownDegrees > START_LOOKING_UP_DEGREES) { + lookAttenuation = (upDownDegrees - START_LOOKING_UP_DEGREES) / (MAX_UP_DOWN_DEGREES - START_LOOKING_UP_DEGREES); + } } + cameraVector = glm::mix(cameraVector, cameraYawVector, 1.0f - lookAttenuation); // Calculate the camera target point. - glm::vec3 cameraPos = qApp->getCamera().getPosition(); - const float targetDistanceFromHead = 2.0f; - glm::vec3 targetPoint = getHead()->getPosition() + targetDistanceFromHead * glm::normalize(cameraVector); + const float TARGET_DISTANCE_FROM_HEAD = 2.0f; + glm::vec3 targetPoint = head->getPosition() + TARGET_DISTANCE_FROM_HEAD * glm::normalize(cameraVector); const float LOOKAT_MIX_ALPHA = 0.05f; const float FPS = 60.0f; - // Approximate the head's look at vector to the camera look at vector with some delay. - float mixAlpha = LOOKAT_MIX_ALPHA * deltaTime * FPS; - mixAlpha = targetSpeed != 0.0f ? mixAlpha * abs(targetSpeed) / _yawSpeed : mixAlpha; - _lookAtCameraTarget = glm::mix(_lookAtCameraTarget, targetPoint, mixAlpha); + if (getDriveKey(TRANSLATE_Y) == 0.0f) { + // Approximate the head's look at vector to the camera look at vector with some delay. + float mixAlpha = LOOKAT_MIX_ALPHA * deltaTime * FPS; + _lookAtCameraTarget = glm::mix(_lookAtCameraTarget, targetPoint, mixAlpha); + } else { + _lookAtCameraTarget = targetPoint; + } _headLookAtActive = true; } else { head->setBaseYaw(0.0f); @@ -6356,22 +6369,21 @@ void MyAvatar::endSit(const glm::vec3& position, const glm::quat& rotation) { } void MyAvatar::resetHeadLookAt() { - if (_rigEnabled) { + if (_skeletonModelLoaded) { _skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, glm::vec3(), HEAD_ALPHA_NAME, HEAD_ALPHA_BLENDING); } } void MyAvatar::updateHeadLookAt(float deltaTime) { - if (_rigEnabled) { + if (_skeletonModelLoaded) { glm::vec3 lookAtTarget = _scriptControlsHeadLookAt ? _lookAtScriptTarget : _lookAtCameraTarget; glm::vec3 avatarXVector = glm::normalize(getWorldOrientation() * Vectors::UNIT_X); glm::vec3 avatarYVector = glm::normalize(getWorldOrientation() * Vectors::UNIT_Y); glm::vec3 headToTargetVector = lookAtTarget - getHead()->getPosition(); if (glm::length(headToTargetVector) > EPSILON) { headToTargetVector = glm::normalize(headToTargetVector); - } - else { + } else { // The target point is the avatar head return; } @@ -6379,7 +6391,6 @@ void MyAvatar::updateHeadLookAt(float deltaTime) { float xDot = glm::dot(avatarXVector, headToTargetVector); float yDot = glm::dot(avatarYVector, headToTargetVector); - bool isLookingUp = yDot >= 0.0f; float xAngle = acosf(xDot); float yAngle = acosf(yDot); @@ -6393,9 +6404,9 @@ void MyAvatar::updateHeadLookAt(float deltaTime) { HEAD_ALPHA_NAME, HEAD_ALPHA_BLENDING); if (_scriptControlsHeadLookAt) { - _scriptHeadControlSinceUpdate += deltaTime; - if (_scriptHeadControlSinceUpdate > MAX_LOOK_AT_TIME_SCRIPT_CONTROL) { - _scriptHeadControlSinceUpdate = 0.0f; + _scriptHeadControlTimer += deltaTime; + if (_scriptHeadControlTimer > MAX_LOOK_AT_TIME_SCRIPT_CONTROL) { + _scriptHeadControlTimer = 0.0f; _scriptControlsHeadLookAt = false; _lookAtCameraTarget = _lookAtScriptTarget; } @@ -6411,6 +6422,6 @@ void MyAvatar::headLookAt(const glm::vec3& lookAtTarget) { } _headLookAtActive = true; _scriptControlsHeadLookAt = true; - _scriptHeadControlSinceUpdate = 0.0f; + _scriptHeadControlTimer = 0.0f; _lookAtScriptTarget = lookAtTarget; } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index d4bd7bbd3b..d06eb50249 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -2633,8 +2633,9 @@ private: glm::vec3 _lookAtCameraTarget; glm::vec3 _lookAtScriptTarget; bool _headLookAtActive { false }; + bool _lookAtCameraReady { false }; bool _scriptControlsHeadLookAt { false }; - float _scriptHeadControlSinceUpdate { 0.0f }; + float _scriptHeadControlTimer { 0.0f }; Setting::Handle _realWorldFieldOfView; From b28154235a51d397f96597c3425bdbddc69ffa0b Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 11 Sep 2019 11:43:26 -0700 Subject: [PATCH 09/29] Look at camera when camera in front --- interface/src/avatar/MyAvatar.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index f1febb0c78..4f98de85b9 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3463,6 +3463,8 @@ void MyAvatar::updateOrientation(float deltaTime) { const float MAX_UP_DOWN_DEGREES = 90.0f; float upDownDot = glm::dot(cameraVector, Vectors::UP); + float frontBackDot = glm::dot(cameraVector, Vectors::FRONT); + float frontBackSign = frontBackDot / abs(frontBackDot); float upDownDegrees = MAX_UP_DOWN_DEGREES - glm::degrees(acosf(abs(upDownDot))); float lookAttenuation = 0.0f; @@ -3478,7 +3480,7 @@ void MyAvatar::updateOrientation(float deltaTime) { cameraVector = glm::mix(cameraVector, cameraYawVector, 1.0f - lookAttenuation); // Calculate the camera target point. const float TARGET_DISTANCE_FROM_HEAD = 2.0f; - glm::vec3 targetPoint = head->getPosition() + TARGET_DISTANCE_FROM_HEAD * glm::normalize(cameraVector); + glm::vec3 targetPoint = head->getPosition() + frontBackSign * TARGET_DISTANCE_FROM_HEAD * glm::normalize(cameraVector); const float LOOKAT_MIX_ALPHA = 0.05f; const float FPS = 60.0f; From f0dcfa7f15dc6a5490de002949980a12b2092522 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 11 Sep 2019 12:04:23 -0700 Subject: [PATCH 10/29] fix rotation frame --- interface/src/avatar/MyAvatar.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 4f98de85b9..0ef996d797 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3453,7 +3453,7 @@ void MyAvatar::updateOrientation(float deltaTime) { head->setBaseYaw(0.0f); head->setBasePitch(0.0f); head->setBaseRoll(0.0f); - // Attenuate head pitch + glm::vec3 cameraVector = (faceForward ? _lookAtOffsetPitch * getWorldOrientation() : getLookAtOffset()) * Vectors::FRONT; glm::vec3 cameraYawVector = _lookAtOffsetYaw * Vectors::FRONT; @@ -3462,9 +3462,8 @@ void MyAvatar::updateOrientation(float deltaTime) { const float START_LOOKING_DOWN_DEGREES = 15.0f; const float MAX_UP_DOWN_DEGREES = 90.0f; - float upDownDot = glm::dot(cameraVector, Vectors::UP); - float frontBackDot = glm::dot(cameraVector, Vectors::FRONT); - float frontBackSign = frontBackDot / abs(frontBackDot); + glm::vec3 avatarVectorUp = getWorldOrientation() * Vectors::UP; + float upDownDot = glm::dot(cameraVector, avatarVectorUp); float upDownDegrees = MAX_UP_DOWN_DEGREES - glm::degrees(acosf(abs(upDownDot))); float lookAttenuation = 0.0f; @@ -3479,6 +3478,10 @@ void MyAvatar::updateOrientation(float deltaTime) { } cameraVector = glm::mix(cameraVector, cameraYawVector, 1.0f - lookAttenuation); // Calculate the camera target point. + glm::vec3 avatarVectorFront = getWorldOrientation() * Vectors::FRONT; + float frontBackDot = glm::dot(cameraVector, avatarVectorFront); + float frontBackSign = frontBackDot / abs(frontBackDot); + const float TARGET_DISTANCE_FROM_HEAD = 2.0f; glm::vec3 targetPoint = head->getPosition() + frontBackSign * TARGET_DISTANCE_FROM_HEAD * glm::normalize(cameraVector); From 8a6cb93a84a12172a48aeba143b46fbc92fed3a0 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 11 Sep 2019 16:08:14 -0700 Subject: [PATCH 11/29] Limit the camera pitch and use the eyes as the pivot point --- interface/src/avatar/MyAvatar.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 0ef996d797..6af6a5c6a0 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3412,9 +3412,10 @@ void MyAvatar::updateOrientation(float deltaTime) { // update body orientation by movement inputs glm::quat initialOrientation = getOrientationOutbound(); + glm::vec3 eyesPosition = getDefaultEyePosition(); if (!computeCameraLookAt) { setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f)))); - _lookAtCameraTarget = getHead()->getPosition() + getWorldOrientation() * Vectors::FRONT; + _lookAtCameraTarget = eyesPosition + getWorldOrientation() * Vectors::FRONT; _lookAtOffsetYaw = getWorldOrientation(); _lookAtOffsetPitch = Quaternions::IDENTITY; } else { @@ -3422,7 +3423,16 @@ void MyAvatar::updateOrientation(float deltaTime) { float pitchIncrement = getDriveKey(PITCH) * _pitchSpeed * deltaTime + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT; _lookAtOffsetYaw = _lookAtOffsetYaw * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))); + + glm::quat _previousLookAtOffsetPitch = _lookAtOffsetPitch; _lookAtOffsetPitch = _lookAtOffsetPitch * glm::quat(glm::radians(glm::vec3(pitchIncrement, 0.0f, 0.0f))); + // Limit the camera horizontal pitch + float MAX_LOOK_AT_PITCH_DEGREES = 80.0f; + float pitchFromHorizont = glm::degrees(angleBetween(getLookAtOffset() * Vectors::FRONT, _lookAtOffsetYaw * Vectors::FRONT)); + if (pitchFromHorizont > MAX_LOOK_AT_PITCH_DEGREES || pitchFromHorizont < -MAX_LOOK_AT_PITCH_DEGREES) { + _lookAtOffsetPitch = _previousLookAtOffsetPitch; + } + // Blend the avatar orientation with the camera look at if moving forward. if (faceForward) { const float FACE_FORWARD_BLEND = 0.25f; setWorldOrientation(glm::slerp(getWorldOrientation(), _lookAtOffsetYaw, FACE_FORWARD_BLEND)); @@ -3482,8 +3492,8 @@ void MyAvatar::updateOrientation(float deltaTime) { float frontBackDot = glm::dot(cameraVector, avatarVectorFront); float frontBackSign = frontBackDot / abs(frontBackDot); - const float TARGET_DISTANCE_FROM_HEAD = 2.0f; - glm::vec3 targetPoint = head->getPosition() + frontBackSign * TARGET_DISTANCE_FROM_HEAD * glm::normalize(cameraVector); + const float TARGET_DISTANCE_FROM_EYES = 20.0f; + glm::vec3 targetPoint = eyesPosition + frontBackSign * TARGET_DISTANCE_FROM_EYES * glm::normalize(cameraVector); const float LOOKAT_MIX_ALPHA = 0.05f; const float FPS = 60.0f; @@ -6385,7 +6395,7 @@ void MyAvatar::updateHeadLookAt(float deltaTime) { glm::vec3 lookAtTarget = _scriptControlsHeadLookAt ? _lookAtScriptTarget : _lookAtCameraTarget; glm::vec3 avatarXVector = glm::normalize(getWorldOrientation() * Vectors::UNIT_X); glm::vec3 avatarYVector = glm::normalize(getWorldOrientation() * Vectors::UNIT_Y); - glm::vec3 headToTargetVector = lookAtTarget - getHead()->getPosition(); + glm::vec3 headToTargetVector = lookAtTarget - getDefaultEyePosition(); if (glm::length(headToTargetVector) > EPSILON) { headToTargetVector = glm::normalize(headToTargetVector); } else { From 793b2917f6b424f39570c0693528af978c1dc320 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 11 Sep 2019 16:25:48 -0700 Subject: [PATCH 12/29] Compute only when delta is not zero --- interface/src/avatar/MyAvatar.cpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 6af6a5c6a0..c3cea26512 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3419,19 +3419,23 @@ void MyAvatar::updateOrientation(float deltaTime) { _lookAtOffsetYaw = getWorldOrientation(); _lookAtOffsetPitch = Quaternions::IDENTITY; } else { - // Set look at vector + // Compute new look at vectors + if (totalBodyYaw > 0.0f) { + _lookAtOffsetYaw = _lookAtOffsetYaw * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))); + } float pitchIncrement = getDriveKey(PITCH) * _pitchSpeed * deltaTime + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT; - _lookAtOffsetYaw = _lookAtOffsetYaw * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))); - - glm::quat _previousLookAtOffsetPitch = _lookAtOffsetPitch; - _lookAtOffsetPitch = _lookAtOffsetPitch * glm::quat(glm::radians(glm::vec3(pitchIncrement, 0.0f, 0.0f))); - // Limit the camera horizontal pitch - float MAX_LOOK_AT_PITCH_DEGREES = 80.0f; - float pitchFromHorizont = glm::degrees(angleBetween(getLookAtOffset() * Vectors::FRONT, _lookAtOffsetYaw * Vectors::FRONT)); - if (pitchFromHorizont > MAX_LOOK_AT_PITCH_DEGREES || pitchFromHorizont < -MAX_LOOK_AT_PITCH_DEGREES) { - _lookAtOffsetPitch = _previousLookAtOffsetPitch; + if (pitchIncrement > 0.0f) { + glm::quat _previousLookAtOffsetPitch = _lookAtOffsetPitch; + _lookAtOffsetPitch = _lookAtOffsetPitch * glm::quat(glm::radians(glm::vec3(pitchIncrement, 0.0f, 0.0f))); + // Limit the camera horizontal pitch + float MAX_LOOK_AT_PITCH_DEGREES = 80.0f; + float pitchFromHorizont = glm::degrees(angleBetween(getLookAtOffset() * Vectors::FRONT, _lookAtOffsetYaw * Vectors::FRONT)); + if (pitchFromHorizont > MAX_LOOK_AT_PITCH_DEGREES || pitchFromHorizont < -MAX_LOOK_AT_PITCH_DEGREES) { + _lookAtOffsetPitch = _previousLookAtOffsetPitch; + } } + // Blend the avatar orientation with the camera look at if moving forward. if (faceForward) { const float FACE_FORWARD_BLEND = 0.25f; From 8af22f0c0464499db2b10e8acdce07e6b7f800eb Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 11 Sep 2019 16:27:07 -0700 Subject: [PATCH 13/29] Compute when negative deltas --- interface/src/avatar/MyAvatar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index c3cea26512..43e60f2296 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3420,12 +3420,12 @@ void MyAvatar::updateOrientation(float deltaTime) { _lookAtOffsetPitch = Quaternions::IDENTITY; } else { // Compute new look at vectors - if (totalBodyYaw > 0.0f) { + if (totalBodyYaw != 0.0f) { _lookAtOffsetYaw = _lookAtOffsetYaw * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))); } float pitchIncrement = getDriveKey(PITCH) * _pitchSpeed * deltaTime + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT; - if (pitchIncrement > 0.0f) { + if (pitchIncrement != 0.0f) { glm::quat _previousLookAtOffsetPitch = _lookAtOffsetPitch; _lookAtOffsetPitch = _lookAtOffsetPitch * glm::quat(glm::radians(glm::vec3(pitchIncrement, 0.0f, 0.0f))); // Limit the camera horizontal pitch From 5adf3e8c25dac6dee1883afda5fad0c73b395163 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Fri, 13 Sep 2019 14:10:11 -0700 Subject: [PATCH 14/29] Expose API some parameters for live configuration --- interface/src/avatar/MyAvatar.cpp | 64 +++++++++++++++++++++++++++---- interface/src/avatar/MyAvatar.h | 6 +++ 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 43e60f2296..8009831bf8 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3490,21 +3490,36 @@ void MyAvatar::updateOrientation(float deltaTime) { lookAttenuation = (upDownDegrees - START_LOOKING_UP_DEGREES) / (MAX_UP_DOWN_DEGREES - START_LOOKING_UP_DEGREES); } } - cameraVector = glm::mix(cameraVector, cameraYawVector, 1.0f - lookAttenuation); - // Calculate the camera target point. glm::vec3 avatarVectorFront = getWorldOrientation() * Vectors::FRONT; float frontBackDot = glm::dot(cameraVector, avatarVectorFront); - float frontBackSign = frontBackDot / abs(frontBackDot); + + glm::vec3 avatarVectorRight = getWorldOrientation() * Vectors::RIGHT; + float leftRightDot = glm::dot(cameraVector, avatarVectorRight); + + // const float SELFIE_TRIGGER_ANGLE = 55.0f; + float triggerSelfie = false; + glm::vec3 ajustedYawVector = cameraYawVector; + if (frontBackDot < 0.0f) { + if (frontBackDot < -glm::sin(glm::radians(_selfieTriggerAngle))) { + triggerSelfie = true; + } else { + ajustedYawVector = (leftRightDot < 0.0f ? -avatarVectorRight : avatarVectorRight); + cameraVector = (ajustedYawVector * _lookAtOffsetPitch) * Vectors::FRONT; + } + } + + cameraVector = glm::mix(cameraVector, ajustedYawVector, 1.0f - lookAttenuation); + // Calculate the camera target point. const float TARGET_DISTANCE_FROM_EYES = 20.0f; - glm::vec3 targetPoint = eyesPosition + frontBackSign * TARGET_DISTANCE_FROM_EYES * glm::normalize(cameraVector); + glm::vec3 targetPoint = eyesPosition + (triggerSelfie ? -1.0f : 1.0f) * TARGET_DISTANCE_FROM_EYES * glm::normalize(cameraVector); - const float LOOKAT_MIX_ALPHA = 0.05f; + // const float LOOKAT_MIX_ALPHA = 0.05f; const float FPS = 60.0f; if (getDriveKey(TRANSLATE_Y) == 0.0f) { // Approximate the head's look at vector to the camera look at vector with some delay. - float mixAlpha = LOOKAT_MIX_ALPHA * deltaTime * FPS; + float mixAlpha = (frontBackDot > 0.0f ? _backLookAtSpeed : _frontLookAtSpeed) * deltaTime * FPS; _lookAtCameraTarget = glm::mix(_lookAtCameraTarget, targetPoint, mixAlpha); } else { _lookAtCameraTarget = targetPoint; @@ -6263,6 +6278,36 @@ QVariantMap MyAvatar::getFlowData() { return result; } +QVariantMap MyAvatar::getLookAtCameraData() { + QVariantMap result; + if (QThread::currentThread() != thread()) { + BLOCKING_INVOKE_METHOD(this, "getLookAtCameraData", + Q_RETURN_ARG(QVariantMap, result)); + return result; + } + result.insert("selfieTriggerAngle", _selfieTriggerAngle); + result.insert("backLookAtSpeed", glm::pow(_backLookAtSpeed, 0.25f)); + result.insert("frontLookAtSpeed", glm::pow(_frontLookAtSpeed, 0.25f)); + return result; +} + +Q_INVOKABLE void MyAvatar::setLookAtCameraData(const QVariantMap& data) { + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "setLookAtCameraData", + Q_ARG(const QVariantMap&, data)); + return; + } + if (data.contains("selfieTriggerAngle")) { + _selfieTriggerAngle = data["selfieTriggerAngle"].toFloat(); + } + if (data.contains("backLookAtSpeed")) { + _backLookAtSpeed = glm::pow(data["backLookAtSpeed"].toFloat(), 4.0f); + } + if (data.contains("frontLookAtSpeed")) { + _frontLookAtSpeed = glm::pow(data["frontLookAtSpeed"].toFloat(), 4.0f); + } +} + QVariantList MyAvatar::getCollidingFlowJoints() { QVariantList result; if (QThread::currentThread() != thread()) { @@ -6410,14 +6455,17 @@ void MyAvatar::updateHeadLookAt(float deltaTime) { float xDot = glm::dot(avatarXVector, headToTargetVector); float yDot = glm::dot(avatarYVector, headToTargetVector); + // Make sure dot products are in range to avoid acosf returning NaN + xDot = glm::min(glm::max(xDot, -1.0f), 1.0f); + yDot = glm::min(glm::max(yDot, -1.0f), 1.0f); + float xAngle = acosf(xDot); float yAngle = acosf(yDot); // xBlend and yBlend are the values from -1.0 to 1.0 that set the directional blending. // We compute them using the angles (0 to PI/2) => (1.0 to 0.0) and (PI/2 to PI) => (0.0 to -1.0) float xBlend = -(xAngle - 0.5f * PI) / (0.5f * PI); - float yBlend = -(yAngle - 0.5f * PI) / (0.5f * PI); - + float yBlend = -(yAngle - 0.5f * PI) / (0.5f * PI); glm::vec3 lookAtBlend = glm::vec3(xBlend, yBlend, 0.0f); _skeletonModel->getRig().setDirectionalBlending(HEAD_BLENDING_NAME, lookAtBlend, HEAD_ALPHA_NAME, HEAD_ALPHA_BLENDING); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index d06eb50249..abfeada32c 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1845,6 +1845,8 @@ public: * @returns {MyAvatar.FlowData} */ Q_INVOKABLE QVariantMap getFlowData(); + Q_INVOKABLE QVariantMap getLookAtCameraData(); + Q_INVOKABLE void setLookAtCameraData(const QVariantMap& data); /**jsdoc * Gets the indexes of currently colliding flow joints. @@ -2637,6 +2639,10 @@ private: bool _scriptControlsHeadLookAt { false }; float _scriptHeadControlTimer { 0.0f }; + // LookAt camera data + float _selfieTriggerAngle { 55.0f }; + float _frontLookAtSpeed { 0.15f }; + float _backLookAtSpeed { 0.03f }; Setting::Handle _realWorldFieldOfView; Setting::Handle _useAdvancedMovementControls; From f2534078a9833611ed58c723b89605d28569c2be Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 16 Sep 2019 15:37:46 -0700 Subject: [PATCH 15/29] add trace stats for workload region sizes --- libraries/workload/src/workload/ViewTask.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/workload/src/workload/ViewTask.cpp b/libraries/workload/src/workload/ViewTask.cpp index 1c8e4d34b1..97d1e3a46e 100644 --- a/libraries/workload/src/workload/ViewTask.cpp +++ b/libraries/workload/src/workload/ViewTask.cpp @@ -10,6 +10,8 @@ // #include "ViewTask.h" +#include + using namespace workload; @@ -181,8 +183,11 @@ void ControlViews::regulateViews(workload::Views& outViews, const workload::Timi auto loopDuration = timings[5]; regionBackFronts[workload::Region::R1] = regionRegulators[workload::Region::R1].run(loopDuration, timings[2] + timings[3], regionBackFronts[workload::Region::R1]); + PROFILE_COUNTER(workload, "R1Front", { { "R1", regionBackFronts[workload::Region::R1].y} } ); regionBackFronts[workload::Region::R2] = regionRegulators[workload::Region::R2].run(loopDuration, timings[2] + timings[3], regionBackFronts[workload::Region::R2]); + PROFILE_COUNTER(workload, "R2Front", { { "R2", regionBackFronts[workload::Region::R2].y } } ); regionBackFronts[workload::Region::R3] = regionRegulators[workload::Region::R3].run(loopDuration, timings[4], regionBackFronts[workload::Region::R3]); + PROFILE_COUNTER(workload, "R3Front", { { "R3", regionBackFronts[workload::Region::R3].y } } ); enforceRegionContainment(); for (auto& outView : outViews) { From 481917ae8a8814231cb5dd9d437aa06fb73b1437 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 16 Sep 2019 18:26:19 -0700 Subject: [PATCH 16/29] Rotate avatar with camera and diagonal rotation --- interface/src/avatar/MyAvatar.cpp | 47 ++++++++++++++++++++----------- interface/src/avatar/MyAvatar.h | 4 +-- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 8009831bf8..ea443ef068 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3089,7 +3089,6 @@ void MyAvatar::initAnimGraph() { } emit animGraphUrlChanged(graphUrl); - _lookAtCameraReady = false; _skeletonModel->getRig().initAnimGraph(graphUrl); _currentAnimGraphUrl.set(graphUrl); connect(&(_skeletonModel->getRig()), SIGNAL(onLoadComplete()), this, SLOT(animGraphLoaded())); @@ -3104,7 +3103,6 @@ void MyAvatar::animGraphLoaded() { updateSensorToWorldMatrix(); // Uses updated position/orientation and _bodySensorMatrix changes _isAnimatingScale = true; _cauterizationNeedsUpdate = true; - _lookAtCameraReady = true; disconnect(&(_skeletonModel->getRig()), SIGNAL(onLoadComplete()), this, SLOT(animGraphLoaded())); } @@ -3336,9 +3334,11 @@ void MyAvatar::updateOrientation(float deltaTime) { // Smoothly rotate body with arrow keys float targetSpeed = getDriveKey(YAW) * _yawSpeed; bool faceForward = false; + const float FPS = 60.0f; if (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) { - targetSpeed = (getDriveKey(YAW) + getDriveKey(STEP_YAW) + getDriveKey(DELTA_YAW)) * _yawSpeed; - faceForward = getDriveKey(TRANSLATE_Z) != 0.0f; + float TIMESCALE_SPEED_CORRECTOR = deltaTime != 0.0f ? 1.0f / (FPS * deltaTime) : 1.0f; + targetSpeed = (getDriveKey(YAW) + getDriveKey(STEP_YAW) + getDriveKey(DELTA_YAW)) * _yawSpeed * TIMESCALE_SPEED_CORRECTOR; + faceForward = getDriveKey(TRANSLATE_Z) != 0.0f || getDriveKey(TRANSLATE_X) != 0.0f; } if (targetSpeed != 0.0f) { const float ROTATION_RAMP_TIMESCALE = 0.5f; @@ -3364,7 +3364,7 @@ void MyAvatar::updateOrientation(float deltaTime) { float totalBodyYaw = _bodyYawDelta * deltaTime; // Rotate directly proportional to delta yaw and delta pitch from right-click mouse movement. - bool computeCameraLookAt = qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT && _lookAtCameraReady; + bool computeCameraLookAt = qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT && isReadyForPhysics(); if (!computeCameraLookAt) { totalBodyYaw += getDriveKey(DELTA_YAW) * _yawSpeed / YAW_SPEED_DEFAULT; } @@ -3437,9 +3437,21 @@ void MyAvatar::updateOrientation(float deltaTime) { } // Blend the avatar orientation with the camera look at if moving forward. - if (faceForward) { + if (faceForward || _shouldTurnToFaceCamera != 0) { const float FACE_FORWARD_BLEND = 0.25f; - setWorldOrientation(glm::slerp(getWorldOrientation(), _lookAtOffsetYaw, FACE_FORWARD_BLEND)); + const float FACE_TURN_BLEND = 0.03f; + const float DIAGONAL_TURN_BLEND = 0.02f; + float blend = _shouldTurnToFaceCamera ? FACE_TURN_BLEND : FACE_FORWARD_BLEND; + glm::quat faceRotation = _lookAtOffsetYaw; + if (getDriveKey(TRANSLATE_Z) != 0.0f && getDriveKey(TRANSLATE_X) != 0.0f) { + blend = DIAGONAL_TURN_BLEND; + if (getDriveKey(TRANSLATE_X) > 0.0f) { + faceRotation = _lookAtOffsetYaw * glm::angleAxis(-0.25f * PI, Vectors::UP); + } else if (getDriveKey(TRANSLATE_X) < 0.0f) { + faceRotation = _lookAtOffsetYaw * glm::angleAxis(0.25f * PI, Vectors::UP); + } + } + setWorldOrientation(glm::slerp(getWorldOrientation(), faceRotation, blend * deltaTime * FPS)); } } @@ -3496,26 +3508,26 @@ void MyAvatar::updateOrientation(float deltaTime) { glm::vec3 avatarVectorRight = getWorldOrientation() * Vectors::RIGHT; float leftRightDot = glm::dot(cameraVector, avatarVectorRight); - // const float SELFIE_TRIGGER_ANGLE = 55.0f; - float triggerSelfie = false; + const float REORIENT_ANGLE = 65.0f; + const float TRIGGER_REORIENT_ANGLE = 45.0f; glm::vec3 ajustedYawVector = cameraYawVector; if (frontBackDot < 0.0f) { - if (frontBackDot < -glm::sin(glm::radians(_selfieTriggerAngle))) { - triggerSelfie = true; - } else { - ajustedYawVector = (leftRightDot < 0.0f ? -avatarVectorRight : avatarVectorRight); - cameraVector = (ajustedYawVector * _lookAtOffsetPitch) * Vectors::FRONT; + ajustedYawVector = (leftRightDot < 0.0f ? -avatarVectorRight : avatarVectorRight); + cameraVector = (ajustedYawVector * _lookAtOffsetPitch) * Vectors::FRONT; + if (frontBackDot < -glm::sin(glm::radians(TRIGGER_REORIENT_ANGLE))) { + _shouldTurnToFaceCamera = true; } + } else if (frontBackDot > glm::sin(glm::radians(REORIENT_ANGLE))) { + _shouldTurnToFaceCamera = false; } cameraVector = glm::mix(cameraVector, ajustedYawVector, 1.0f - lookAttenuation); // Calculate the camera target point. const float TARGET_DISTANCE_FROM_EYES = 20.0f; - glm::vec3 targetPoint = eyesPosition + (triggerSelfie ? -1.0f : 1.0f) * TARGET_DISTANCE_FROM_EYES * glm::normalize(cameraVector); + glm::vec3 targetPoint = eyesPosition + TARGET_DISTANCE_FROM_EYES * glm::normalize(cameraVector); // const float LOOKAT_MIX_ALPHA = 0.05f; - const float FPS = 60.0f; if (getDriveKey(TRANSLATE_Y) == 0.0f) { // Approximate the head's look at vector to the camera look at vector with some delay. @@ -3597,6 +3609,9 @@ glm::vec3 MyAvatar::scaleMotorSpeed(const glm::vec3 forward, const glm::vec3 rig } else { // Desktop mode. direction = (zSpeed * forward) + (xSpeed * right); + if (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT && zSpeed != 0.0f && xSpeed != 0.0f){ + direction = (zSpeed * forward); + } auto length = glm::length(direction); if (length > EPSILON) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index abfeada32c..7c3091bf6a 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -2635,14 +2635,14 @@ private: glm::vec3 _lookAtCameraTarget; glm::vec3 _lookAtScriptTarget; bool _headLookAtActive { false }; - bool _lookAtCameraReady { false }; + bool _shouldTurnToFaceCamera { false }; bool _scriptControlsHeadLookAt { false }; float _scriptHeadControlTimer { 0.0f }; // LookAt camera data float _selfieTriggerAngle { 55.0f }; float _frontLookAtSpeed { 0.15f }; - float _backLookAtSpeed { 0.03f }; + float _backLookAtSpeed { 0.25f }; Setting::Handle _realWorldFieldOfView; Setting::Handle _useAdvancedMovementControls; From 1054e8fcde8d7a117c3b51e5a47c9feb2bc93713 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 17 Sep 2019 17:15:16 -0700 Subject: [PATCH 17/29] Selfie camera and updated camera menus --- .../resources/controllers/keyboardMouse.json | 49 +++++++++++-- interface/src/Application.cpp | 58 ++++++++++++---- interface/src/Menu.cpp | 15 ++-- interface/src/Menu.h | 2 + interface/src/avatar/MyAvatar.cpp | 69 ++++++++++++------- interface/src/avatar/MyAvatar.h | 11 ++- libraries/shared/src/shared/Camera.cpp | 4 ++ libraries/shared/src/shared/Camera.h | 1 + 8 files changed, 158 insertions(+), 51 deletions(-) diff --git a/interface/resources/controllers/keyboardMouse.json b/interface/resources/controllers/keyboardMouse.json index c48269b83b..39b44a646e 100644 --- a/interface/resources/controllers/keyboardMouse.json +++ b/interface/resources/controllers/keyboardMouse.json @@ -3,8 +3,8 @@ "channels": [ { "from": "Keyboard.A", "when": ["Keyboard.RightMouseButton", "!Keyboard.Control"], "to": "Actions.LATERAL_LEFT" }, { "from": "Keyboard.D", "when": ["Keyboard.RightMouseButton", "!Keyboard.Control"], "to": "Actions.LATERAL_RIGHT" }, - { "from": "Keyboard.E", "when": "!Keyboard.Control", "to": "Actions.LATERAL_RIGHT" }, - { "from": "Keyboard.Q", "when": "!Keyboard.Control", "to": "Actions.LATERAL_LEFT" }, + { "from": "Keyboard.E", "when": ["!Application.CameraLookAt", "!Keyboard.Control"], "to": "Actions.LATERAL_RIGHT" }, + { "from": "Keyboard.Q", "when": ["!Application.CameraLookAt", "!Keyboard.Control"], "to": "Actions.LATERAL_LEFT" }, { "from": "Keyboard.T", "when": "!Keyboard.Control", "to": "Actions.TogglePushToTalk" }, { "comment" : "Mouse turn need to be small continuous increments", @@ -39,7 +39,6 @@ ] }, - { "from": { "makeAxis" : [ ["Keyboard.Left" ], ["Keyboard.Right"] @@ -95,6 +94,15 @@ "to": "Actions.Yaw" }, + { "from": { "makeAxis" : [ + ["Keyboard.Left"], + ["Keyboard.Right"] + ] + }, + "when": ["Application.CameraSelfie", "!Keyboard.Shift"], + "to": "Actions.Yaw" + }, + { "from": { "makeAxis" : [ ["Keyboard.A"], ["Keyboard.D"] @@ -113,12 +121,21 @@ "to": "Actions.Yaw" }, + { "from": { "makeAxis" : [ + ["Keyboard.Q"], + ["Keyboard.E"] + ] + }, + "when": ["Application.CameraLookAt", "!Keyboard.Control"], + "to": "Actions.Yaw" + }, + { "from": { "makeAxis" : [ ["Keyboard.A"], ["Keyboard.D"] ] }, - "when": ["Application.CameraLookAt", "!Keyboard.Control"], + "when": ["Application.CameraSelfie", "!Keyboard.Control"], "to": "Actions.Yaw" }, @@ -149,6 +166,15 @@ "to": "Actions.Yaw" }, + { "from": { "makeAxis" : [ + ["Keyboard.TouchpadLeft"], + ["Keyboard.TouchpadRight"] + ] + }, + "when": "Application.CameraSelfie", + "to": "Actions.Yaw" + }, + { "from": { "makeAxis" : ["Keyboard.MouseMoveLeft", "Keyboard.MouseMoveRight"] }, "when": "Keyboard.RightMouseButton", "to": "Actions.DeltaYaw", @@ -159,7 +185,16 @@ }, { "from": { "makeAxis" : ["Keyboard.MouseMoveUp", "Keyboard.MouseMoveDown"] }, - "when": "Keyboard.RightMouseButton", + "when": ["!Application.CameraSelfie", "Keyboard.RightMouseButton"], + "to": "Actions.DeltaPitch", + "filters": + [ + { "type": "scale", "scale": 0.6 } + ] + }, + + { "from": { "makeAxis" : ["Keyboard.MouseMoveDown", "Keyboard.MouseMoveUp"] }, + "when": ["Application.CameraSelfie", "Keyboard.RightMouseButton"], "to": "Actions.DeltaPitch", "filters": [ @@ -169,6 +204,8 @@ { "from": "Keyboard.W", "when": "!Keyboard.Control", "to": "Actions.LONGITUDINAL_FORWARD" }, { "from": "Keyboard.S", "when": "!Keyboard.Control", "to": "Actions.LONGITUDINAL_BACKWARD" }, + { "from": "Keyboard.A", "when": "Application.CameraLookAt", "to": "Actions.LATERAL_LEFT" }, + { "from": "Keyboard.D", "when": "Application.CameraLookAt", "to": "Actions.LATERAL_RIGHT" }, { "from": "Keyboard.Shift", "when": ["!Keyboard.Left", "!Keyboard.Right"], "to": "Actions.SPRINT" }, { "from": "Keyboard.C", "when": "!Keyboard.Control", "to": "Actions.VERTICAL_DOWN" }, { "from": "Keyboard.Left", "when": "Keyboard.Shift", "to": "Actions.LATERAL_LEFT" }, @@ -176,9 +213,11 @@ { "from": "Keyboard.Up", "when": "Application.CameraFirstPerson", "to": "Actions.LONGITUDINAL_FORWARD" }, { "from": "Keyboard.Up", "when": "Application.CameraThirdPerson", "to": "Actions.LONGITUDINAL_FORWARD" }, { "from": "Keyboard.Up", "when": "Application.CameraLookAt", "to": "Actions.LONGITUDINAL_FORWARD" }, + { "from": "Keyboard.Up", "when": "Application.CameraSelfie", "to": "Actions.LONGITUDINAL_FORWARD" }, { "from": "Keyboard.Down", "when": "Application.CameraFirstPerson", "to": "Actions.LONGITUDINAL_BACKWARD" }, { "from": "Keyboard.Down", "when": "Application.CameraThirdPerson", "to": "Actions.LONGITUDINAL_BACKWARD" }, { "from": "Keyboard.Down", "when": "Application.CameraLookAt", "to": "Actions.LONGITUDINAL_BACKWARD" }, + { "from": "Keyboard.Down", "when": "Application.CameraSelfie", "to": "Actions.LONGITUDINAL_BACKWARD" }, { "from": "Keyboard.PgDown", "to": "Actions.VERTICAL_DOWN" }, { "from": "Keyboard.PgUp", "to": "Actions.VERTICAL_UP" }, diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e45d0b4c57..ab7fda9201 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -710,6 +710,7 @@ static const QString STATE_CAMERA_THIRD_PERSON = "CameraThirdPerson"; static const QString STATE_CAMERA_ENTITY = "CameraEntity"; static const QString STATE_CAMERA_INDEPENDENT = "CameraIndependent"; static const QString STATE_CAMERA_LOOK_AT = "CameraLookAt"; +static const QString STATE_CAMERA_SELFIE = "CameraSelfie"; static const QString STATE_SNAP_TURN = "SnapTurn"; static const QString STATE_ADVANCED_MOVEMENT_CONTROLS = "AdvancedMovement"; static const QString STATE_GROUNDED = "Grounded"; @@ -926,7 +927,7 @@ bool setupEssentials(int& argc, char** argv, bool runningMarkerExisted) { DependencyManager::set(); DependencyManager::set(); controller::StateController::setStateVariables({ { STATE_IN_HMD, STATE_CAMERA_FULL_SCREEN_MIRROR, - STATE_CAMERA_FIRST_PERSON, STATE_CAMERA_THIRD_PERSON, STATE_CAMERA_ENTITY, STATE_CAMERA_INDEPENDENT, STATE_CAMERA_LOOK_AT, + STATE_CAMERA_FIRST_PERSON, STATE_CAMERA_THIRD_PERSON, STATE_CAMERA_ENTITY, STATE_CAMERA_INDEPENDENT, STATE_CAMERA_LOOK_AT, STATE_CAMERA_SELFIE, STATE_SNAP_TURN, STATE_ADVANCED_MOVEMENT_CONTROLS, STATE_GROUNDED, STATE_NAV_FOCUSED, STATE_PLATFORM_WINDOWS, STATE_PLATFORM_MAC, STATE_PLATFORM_ANDROID, STATE_LEFT_HAND_DOMINANT, STATE_RIGHT_HAND_DOMINANT, STATE_STRAFE_ENABLED } }); DependencyManager::set(); @@ -1876,6 +1877,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo _applicationStateDevice->setInputVariant(STATE_CAMERA_LOOK_AT, []() -> float { return qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT ? 1 : 0; }); + _applicationStateDevice->setInputVariant(STATE_CAMERA_SELFIE, []() -> float { + return qApp->getCamera().getMode() == CAMERA_MODE_SELFIE ? 1 : 0; + }); _applicationStateDevice->setInputVariant(STATE_CAMERA_ENTITY, []() -> float { return qApp->getCamera().getMode() == CAMERA_MODE_ENTITY ? 1 : 0; }); @@ -3611,7 +3615,9 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { _myCamera.setPosition(myAvatar->getDefaultEyePosition()); _myCamera.setOrientation(myAvatar->getMyHead()->getHeadOrientation()); } - } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON || _myCamera.getMode() == CAMERA_MODE_LOOK_AT) { + } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON || + _myCamera.getMode() == CAMERA_MODE_LOOK_AT || + _myCamera.getMode() == CAMERA_MODE_SELFIE) { if (isHMDMode()) { if (!_thirdPersonHMDCameraBoomValid) { @@ -3640,8 +3646,12 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { + myAvatar->getWorldOrientation() * boomOffset); } } else { + glm::quat lookAtOffset = myAvatar->getLookAtOffset(); + if (_myCamera.getMode() == CAMERA_MODE_SELFIE) { + lookAtOffset = lookAtOffset * glm::angleAxis(PI, myAvatar->getWorldOrientation() * Vectors::UP); + } _myCamera.setPosition(myAvatar->getDefaultEyePosition() - + myAvatar->getLookAtOffset() * boomOffset); + + lookAtOffset * boomOffset); _myCamera.lookAt(myAvatar->getDefaultEyePosition()); } } @@ -3683,8 +3693,7 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { glm::vec3(0.0f, 0.0f, -1.0f) * myAvatar->getBoomLength() * _scaleMirror); } renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; - } - else if (_myCamera.getMode() == CAMERA_MODE_ENTITY) { + } else if (_myCamera.getMode() == CAMERA_MODE_ENTITY) { _thirdPersonHMDCameraBoomValid= false; EntityItemPointer cameraEntity = _myCamera.getCameraEntityPointer(); if (cameraEntity != nullptr) { @@ -4401,15 +4410,19 @@ void Application::keyPressEvent(QKeyEvent* event) { } case Qt::Key_2: { Menu* menu = Menu::getInstance(); - menu->triggerOption(MenuOption::FullscreenMirror); + menu->triggerOption(MenuOption::SelfieScreen); break; } case Qt::Key_3: { Menu* menu = Menu::getInstance(); - menu->triggerOption(MenuOption::ThirdPerson); + menu->triggerOption(MenuOption::LookAtScreen); + break; + } + case Qt::Key_4: { + Menu* menu = Menu::getInstance(); + menu->triggerOption(MenuOption::FullscreenMirror); break; } - case Qt::Key_4: case Qt::Key_5: case Qt::Key_6: case Qt::Key_7: @@ -5968,11 +5981,16 @@ void Application::cycleCamera() { } else if (menu->isOptionChecked(MenuOption::FirstPerson)) { menu->setIsOptionChecked(MenuOption::FirstPerson, false); - menu->setIsOptionChecked(MenuOption::ThirdPerson, true); + menu->setIsOptionChecked(MenuOption::LookAtScreen, true); - } else if (menu->isOptionChecked(MenuOption::ThirdPerson)) { + } else if (menu->isOptionChecked(MenuOption::LookAtScreen)) { - menu->setIsOptionChecked(MenuOption::ThirdPerson, false); + menu->setIsOptionChecked(MenuOption::LookAtScreen, false); + menu->setIsOptionChecked(MenuOption::SelfieScreen, true); + + } else if (menu->isOptionChecked(MenuOption::SelfieScreen)) { + + menu->setIsOptionChecked(MenuOption::SelfieScreen, false); menu->setIsOptionChecked(MenuOption::FullscreenMirror, true); } @@ -5985,7 +6003,10 @@ void Application::cameraModeChanged() { Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, true); break; case CAMERA_MODE_LOOK_AT: - Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, true); + Menu::getInstance()->setIsOptionChecked(MenuOption::LookAtScreen, true); + break; + case CAMERA_MODE_SELFIE: + Menu::getInstance()->setIsOptionChecked(MenuOption::SelfieScreen, true); break; case CAMERA_MODE_MIRROR: Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, true); @@ -6027,13 +6048,20 @@ void Application::cameraMenuChanged() { _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); getMyAvatar()->setBoomLength(MyAvatar::ZOOM_MIN); } - } else if (menu->isOptionChecked(MenuOption::ThirdPerson)) { + } else if (menu->isOptionChecked(MenuOption::LookAtScreen)) { if (_myCamera.getMode() != CAMERA_MODE_LOOK_AT) { _myCamera.setMode(CAMERA_MODE_LOOK_AT); if (getMyAvatar()->getBoomLength() == MyAvatar::ZOOM_MIN) { getMyAvatar()->setBoomLength(MyAvatar::ZOOM_DEFAULT); } } + } else if (menu->isOptionChecked(MenuOption::SelfieScreen)) { + if (_myCamera.getMode() != CAMERA_MODE_SELFIE) { + _myCamera.setMode(CAMERA_MODE_SELFIE); + if (getMyAvatar()->getBoomLength() == MyAvatar::ZOOM_MIN) { + getMyAvatar()->setBoomLength(MyAvatar::ZOOM_DEFAULT); + } + } } } @@ -9117,9 +9145,11 @@ void Application::setDisplayPlugin(DisplayPluginPointer newDisplayPlugin) { cameraMenuChanged(); } - // Remove the mirror camera option from menu if in HMD mode + // Remove the mirror and selfie camera options from menu if in HMD mode auto mirrorAction = menu->getActionForOption(MenuOption::FullscreenMirror); mirrorAction->setVisible(!isHmd); + auto selfieAction = menu->getActionForOption(MenuOption::SelfieScreen); + selfieAction->setVisible(!isHmd); } Q_ASSERT_X(_displayPlugin, "Application::updateDisplayMode", "could not find an activated display plugin"); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 8c6292681b..82fcade805 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -177,12 +177,19 @@ Menu::Menu() { firstPersonAction->setProperty(EXCLUSION_GROUP_KEY, QVariant::fromValue(cameraModeGroup)); - // View > Third Person - auto thirdPersonAction = cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash( - viewMenu, MenuOption::ThirdPerson, 0, + // View > Look At + auto lookAtAction = cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash( + viewMenu, MenuOption::LookAtScreen, 0, false, qApp, SLOT(cameraMenuChanged()))); - thirdPersonAction->setProperty(EXCLUSION_GROUP_KEY, QVariant::fromValue(cameraModeGroup)); + lookAtAction->setProperty(EXCLUSION_GROUP_KEY, QVariant::fromValue(cameraModeGroup)); + + // View > Selfie + auto selfieAction = cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash( + viewMenu, MenuOption::SelfieScreen, 0, + false, qApp, SLOT(cameraMenuChanged()))); + + selfieAction->setProperty(EXCLUSION_GROUP_KEY, QVariant::fromValue(cameraModeGroup)); // View > Mirror auto viewMirrorAction = cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash( diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 7dff264adc..9db06b40e7 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -129,6 +129,7 @@ namespace MenuOption { const QString Login = "Login/Sign Up"; const QString Log = "Log"; const QString LogExtraTimings = "Log Extra Timing Details"; + const QString LookAtScreen = "Look At"; const QString LowVelocityFilter = "Low Velocity Filter"; const QString MeshVisible = "Draw Mesh"; const QString MuteEnvironment = "Mute Environment"; @@ -181,6 +182,7 @@ namespace MenuOption { const QString RunTimingTests = "Run Timing Tests"; const QString ScriptedMotorControl = "Enable Scripted Motor Control"; const QString ShowTrackedObjects = "Show Tracked Objects"; + const QString SelfieScreen = "Selfie"; const QString SendWrongDSConnectVersion = "Send wrong DS connect version"; const QString SendWrongProtocolVersion = "Send wrong protocol version"; const QString SetHomeLocation = "Set Home Location"; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index ea443ef068..36d3ad3156 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -455,7 +455,7 @@ QByteArray MyAvatar::toByteArrayStateful(AvatarDataDetail dataDetail, bool dropF _globalBoundingBoxDimensions.y = _characterController.getCapsuleHalfHeight(); _globalBoundingBoxDimensions.z = _characterController.getCapsuleRadius(); _globalBoundingBoxOffset = _characterController.getCapsuleLocalOffset(); - if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT || mode == CAMERA_MODE_LOOK_AT) { + if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT || mode == CAMERA_MODE_LOOK_AT || mode == CAMERA_MODE_SELFIE) { // fake the avatar position that is sent up to the AvatarMixer glm::vec3 oldPosition = getWorldPosition(); setWorldPosition(getSkeletonPosition()); @@ -940,7 +940,7 @@ void MyAvatar::simulate(float deltaTime, bool inView) { head->setPosition(headPosition); head->setScale(getModelScale()); head->simulate(deltaTime); - if (_scriptControlsHeadLookAt || qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) { + if (_scriptControlsHeadLookAt || qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT || qApp->getCamera().getMode() == CAMERA_MODE_SELFIE) { updateHeadLookAt(deltaTime); } else if (_headLookAtActive){ resetHeadLookAt(); @@ -2566,7 +2566,7 @@ void MyAvatar::useFullAvatarURL(const QUrl& fullAvatarURL, const QString& modelN glm::vec3 MyAvatar::getSkeletonPosition() const { CameraMode mode = qApp->getCamera().getMode(); - if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT || mode == CAMERA_MODE_LOOK_AT) { + if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT || mode == CAMERA_MODE_LOOK_AT || mode == CAMERA_MODE_SELFIE) { // The avatar is rotated PI about the yAxis, so we have to correct for it // to get the skeleton offset contribution in the world-frame. const glm::quat FLIP = glm::angleAxis(PI, glm::vec3(0.0f, 1.0f, 0.0f)); @@ -3333,13 +3333,15 @@ void MyAvatar::setRotationThreshold(float angleRadians) { void MyAvatar::updateOrientation(float deltaTime) { // Smoothly rotate body with arrow keys float targetSpeed = getDriveKey(YAW) * _yawSpeed; - bool faceForward = false; - const float FPS = 60.0f; - if (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT) { - float TIMESCALE_SPEED_CORRECTOR = deltaTime != 0.0f ? 1.0f / (FPS * deltaTime) : 1.0f; - targetSpeed = (getDriveKey(YAW) + getDriveKey(STEP_YAW) + getDriveKey(DELTA_YAW)) * _yawSpeed * TIMESCALE_SPEED_CORRECTOR; - faceForward = getDriveKey(TRANSLATE_Z) != 0.0f || getDriveKey(TRANSLATE_X) != 0.0f; + bool computeCameraLookAt = (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT || + qApp->getCamera().getMode() == CAMERA_MODE_SELFIE) && isReadyForPhysics(); + if (computeCameraLookAt) { + // Rotate directly proportional to delta yaw and delta pitch from right-click mouse movement. + float speedFromDeltaYaw = deltaTime > FLT_EPSILON ? getDriveKey(DELTA_YAW) / deltaTime : 0.0f; + speedFromDeltaYaw *= _yawSpeed / YAW_SPEED_DEFAULT; + targetSpeed += speedFromDeltaYaw; } + if (targetSpeed != 0.0f) { const float ROTATION_RAMP_TIMESCALE = 0.5f; float blend = deltaTime / ROTATION_RAMP_TIMESCALE; @@ -3362,13 +3364,9 @@ void MyAvatar::updateOrientation(float deltaTime) { } } float totalBodyYaw = _bodyYawDelta * deltaTime; - - // Rotate directly proportional to delta yaw and delta pitch from right-click mouse movement. - bool computeCameraLookAt = qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT && isReadyForPhysics(); if (!computeCameraLookAt) { totalBodyYaw += getDriveKey(DELTA_YAW) * _yawSpeed / YAW_SPEED_DEFAULT; } - // Comfort Mode: If you press any of the left/right rotation drive keys or input, you'll // get an instantaneous 15 degree turn. If you keep holding the key down you'll get another // snap turn every half second. @@ -3377,7 +3375,6 @@ void MyAvatar::updateOrientation(float deltaTime) { totalBodyYaw += getDriveKey(STEP_YAW); snapTurn = true; } - // Use head/HMD roll to turn while flying, but not when standing still. if (qApp->isHMDMode() && getCharacterController()->getState() == CharacterController::State::Hover && _hmdRollControlEnabled && hasDriveInput()) { @@ -3413,6 +3410,10 @@ void MyAvatar::updateOrientation(float deltaTime) { // update body orientation by movement inputs glm::quat initialOrientation = getOrientationOutbound(); glm::vec3 eyesPosition = getDefaultEyePosition(); + const float FPS = 60.0f; + float timeScale = deltaTime * FPS; + + bool faceForward = false; if (!computeCameraLookAt) { setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f)))); _lookAtCameraTarget = eyesPosition + getWorldOrientation() * Vectors::FRONT; @@ -3423,8 +3424,9 @@ void MyAvatar::updateOrientation(float deltaTime) { if (totalBodyYaw != 0.0f) { _lookAtOffsetYaw = _lookAtOffsetYaw * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))); } + float deltalPitchSign = 1.0f;// qApp->getCamera().getMode() == CAMERA_MODE_SELFIE ? -1.0f : 1.0f; float pitchIncrement = getDriveKey(PITCH) * _pitchSpeed * deltaTime - + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT; + + deltalPitchSign * getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT; if (pitchIncrement != 0.0f) { glm::quat _previousLookAtOffsetPitch = _lookAtOffsetPitch; _lookAtOffsetPitch = _lookAtOffsetPitch * glm::quat(glm::radians(glm::vec3(pitchIncrement, 0.0f, 0.0f))); @@ -3435,15 +3437,21 @@ void MyAvatar::updateOrientation(float deltaTime) { _lookAtOffsetPitch = _previousLookAtOffsetPitch; } } - + bool isMovingFwdBwd = getDriveKey(TRANSLATE_Z) != 0.0f; + bool isMovingSideways = getDriveKey(TRANSLATE_X) != 0.0f; + faceForward = computeCameraLookAt && (isMovingFwdBwd || isMovingSideways); // Blend the avatar orientation with the camera look at if moving forward. - if (faceForward || _shouldTurnToFaceCamera != 0) { - const float FACE_FORWARD_BLEND = 0.25f; - const float FACE_TURN_BLEND = 0.03f; + if (faceForward || _shouldTurnToFaceCamera) { + const float REORIENT_FORWARD_BLEND = 0.25f; + const float REORIENT_TURN_BLEND = 0.03f; const float DIAGONAL_TURN_BLEND = 0.02f; - float blend = _shouldTurnToFaceCamera ? FACE_TURN_BLEND : FACE_FORWARD_BLEND; + float blend = (_shouldTurnToFaceCamera ? REORIENT_TURN_BLEND : REORIENT_FORWARD_BLEND) * timeScale; + if (blend > 1.0f) { + blend = 1.0f; + } glm::quat faceRotation = _lookAtOffsetYaw; - if (getDriveKey(TRANSLATE_Z) != 0.0f && getDriveKey(TRANSLATE_X) != 0.0f) { + if (isMovingFwdBwd && isMovingSideways) { + // Reorient avatar to face camera diagonal blend = DIAGONAL_TURN_BLEND; if (getDriveKey(TRANSLATE_X) > 0.0f) { faceRotation = _lookAtOffsetYaw * glm::angleAxis(-0.25f * PI, Vectors::UP); @@ -3451,7 +3459,7 @@ void MyAvatar::updateOrientation(float deltaTime) { faceRotation = _lookAtOffsetYaw * glm::angleAxis(0.25f * PI, Vectors::UP); } } - setWorldOrientation(glm::slerp(getWorldOrientation(), faceRotation, blend * deltaTime * FPS)); + setWorldOrientation(glm::slerp(getWorldOrientation(), faceRotation, blend)); } } @@ -3527,11 +3535,14 @@ void MyAvatar::updateOrientation(float deltaTime) { const float TARGET_DISTANCE_FROM_EYES = 20.0f; glm::vec3 targetPoint = eyesPosition + TARGET_DISTANCE_FROM_EYES * glm::normalize(cameraVector); - // const float LOOKAT_MIX_ALPHA = 0.05f; + // const float LOOKAT_MIX_ALPHA = 0.25f; if (getDriveKey(TRANSLATE_Y) == 0.0f) { // Approximate the head's look at vector to the camera look at vector with some delay. - float mixAlpha = (frontBackDot > 0.0f ? _backLookAtSpeed : _frontLookAtSpeed) * deltaTime * FPS; + float mixAlpha = (frontBackDot > 0.0f ? _backLookAtSpeed : _frontLookAtSpeed) * timeScale; + if (mixAlpha > 1.0f) { + mixAlpha = 1.0f; + } _lookAtCameraTarget = glm::mix(_lookAtCameraTarget, targetPoint, mixAlpha); } else { _lookAtCameraTarget = targetPoint; @@ -6459,6 +6470,7 @@ void MyAvatar::updateHeadLookAt(float deltaTime) { glm::vec3 lookAtTarget = _scriptControlsHeadLookAt ? _lookAtScriptTarget : _lookAtCameraTarget; glm::vec3 avatarXVector = glm::normalize(getWorldOrientation() * Vectors::UNIT_X); glm::vec3 avatarYVector = glm::normalize(getWorldOrientation() * Vectors::UNIT_Y); + glm::vec3 avatarZVector = glm::normalize(getWorldOrientation() * Vectors::UNIT_Z); glm::vec3 headToTargetVector = lookAtTarget - getDefaultEyePosition(); if (glm::length(headToTargetVector) > EPSILON) { headToTargetVector = glm::normalize(headToTargetVector); @@ -6469,6 +6481,11 @@ void MyAvatar::updateHeadLookAt(float deltaTime) { float xDot = glm::dot(avatarXVector, headToTargetVector); float yDot = glm::dot(avatarYVector, headToTargetVector); + float zDot = glm::dot(avatarZVector, headToTargetVector); + // Force the head to look at one of the sides when the look at point is behind the avatar + if (zDot > 0.0f && xDot != 0.0f) { + //xDot /= fabsf(xDot); + } // Make sure dot products are in range to avoid acosf returning NaN xDot = glm::min(glm::max(xDot, -1.0f), 1.0f); @@ -6496,9 +6513,9 @@ void MyAvatar::updateHeadLookAt(float deltaTime) { } } -void MyAvatar::headLookAt(const glm::vec3& lookAtTarget) { +void MyAvatar::setHeadLookAt(const glm::vec3& lookAtTarget) { if (QThread::currentThread() != thread()) { - BLOCKING_INVOKE_METHOD(this, "headLookAt", + BLOCKING_INVOKE_METHOD(this, "setHeadLookAt", Q_ARG(const glm::vec3&, lookAtTarget)); return; } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 7c3091bf6a..90a2c0887a 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1749,10 +1749,17 @@ public: /**jsdoc * Turn the avatar's head until it faces the target point within the 90/-90 degrees range. - * @function MyAvatar.headLookAt + * @function MyAvatar.setHeadLookAt * @param {Vec3} lookAtTarget - The target 3D point. */ - Q_INVOKABLE void headLookAt(const glm::vec3& lookAtTarget); + Q_INVOKABLE void setHeadLookAt(const glm::vec3& lookAtTarget); + + /**jsdoc + * Returns the current head look at target point in world coordenates. + * @function MyAvatar.getHeadLookAt + * @returns {Vec3} Default position between your avatar's eyes in world coordinates. + */ + Q_INVOKABLE glm::vec3 getHeadLookAt() { return _lookAtCameraTarget; } glm::quat getLookAtOffset() { return _lookAtOffsetYaw * _lookAtOffsetPitch; } diff --git a/libraries/shared/src/shared/Camera.cpp b/libraries/shared/src/shared/Camera.cpp index 4716713a2b..c87b30b499 100644 --- a/libraries/shared/src/shared/Camera.cpp +++ b/libraries/shared/src/shared/Camera.cpp @@ -69,6 +69,8 @@ CameraMode stringToMode(const QString& mode) { return CAMERA_MODE_ENTITY; } else if (mode == "look at") { return CAMERA_MODE_LOOK_AT; + } else if (mode == "selfie") { + return CAMERA_MODE_SELFIE; } return CAMERA_MODE_NULL; } @@ -86,6 +88,8 @@ QString modeToString(CameraMode mode) { return "entity"; } else if (mode == CAMERA_MODE_LOOK_AT) { return "look at"; + } else if (mode == CAMERA_MODE_SELFIE) { + return "selfie"; } return "unknown"; } diff --git a/libraries/shared/src/shared/Camera.h b/libraries/shared/src/shared/Camera.h index bae4b9aeae..eecad34838 100644 --- a/libraries/shared/src/shared/Camera.h +++ b/libraries/shared/src/shared/Camera.h @@ -24,6 +24,7 @@ enum CameraMode CAMERA_MODE_INDEPENDENT, CAMERA_MODE_ENTITY, CAMERA_MODE_LOOK_AT, + CAMERA_MODE_SELFIE, NUM_CAMERA_MODES }; From 7bc8e6b237fe1a78792098e3d88e4eb940ac1a22 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 18 Sep 2019 17:00:10 -0700 Subject: [PATCH 18/29] Solved some sitting and sound issues while looking at --- .../resources/controllers/keyboardMouse.json | 29 ++++++++++---- interface/src/Application.cpp | 26 +++--------- interface/src/Menu.cpp | 7 ---- interface/src/Menu.h | 4 +- interface/src/avatar/MyAvatar.cpp | 40 +++++++++++-------- 5 files changed, 51 insertions(+), 55 deletions(-) diff --git a/interface/resources/controllers/keyboardMouse.json b/interface/resources/controllers/keyboardMouse.json index 39b44a646e..c748243fec 100644 --- a/interface/resources/controllers/keyboardMouse.json +++ b/interface/resources/controllers/keyboardMouse.json @@ -3,8 +3,8 @@ "channels": [ { "from": "Keyboard.A", "when": ["Keyboard.RightMouseButton", "!Keyboard.Control"], "to": "Actions.LATERAL_LEFT" }, { "from": "Keyboard.D", "when": ["Keyboard.RightMouseButton", "!Keyboard.Control"], "to": "Actions.LATERAL_RIGHT" }, - { "from": "Keyboard.E", "when": ["!Application.CameraLookAt", "!Keyboard.Control"], "to": "Actions.LATERAL_RIGHT" }, - { "from": "Keyboard.Q", "when": ["!Application.CameraLookAt", "!Keyboard.Control"], "to": "Actions.LATERAL_LEFT" }, + { "from": "Keyboard.E", "when": ["!Application.CameraSelfie", "!Application.CameraLookAt", "!Keyboard.Control"], "to": "Actions.LATERAL_RIGHT" }, + { "from": "Keyboard.Q", "when": ["!Application.CameraSelfie"," !Application.CameraLookAt", "!Keyboard.Control"], "to": "Actions.LATERAL_LEFT" }, { "from": "Keyboard.T", "when": "!Keyboard.Control", "to": "Actions.TogglePushToTalk" }, { "comment" : "Mouse turn need to be small continuous increments", @@ -131,8 +131,8 @@ }, { "from": { "makeAxis" : [ - ["Keyboard.A"], - ["Keyboard.D"] + ["Keyboard.E"], + ["Keyboard.Q"] ] }, "when": ["Application.CameraSelfie", "!Keyboard.Control"], @@ -185,7 +185,7 @@ }, { "from": { "makeAxis" : ["Keyboard.MouseMoveUp", "Keyboard.MouseMoveDown"] }, - "when": ["!Application.CameraSelfie", "Keyboard.RightMouseButton"], + "when": ["!Application.CameraSelfie", "!Application.CameraLookAt", "Keyboard.RightMouseButton"], "to": "Actions.DeltaPitch", "filters": [ @@ -193,19 +193,32 @@ ] }, + { "from": { "makeAxis" : ["Keyboard.MouseMoveUp", "Keyboard.MouseMoveDown"] }, + "when": ["Application.CameraLookAt", "Keyboard.RightMouseButton"], + "to": "Actions.DeltaPitch", + "filters": + [ + { "type": "scale", "scale": 0.3 } + ] + }, + { "from": { "makeAxis" : ["Keyboard.MouseMoveDown", "Keyboard.MouseMoveUp"] }, "when": ["Application.CameraSelfie", "Keyboard.RightMouseButton"], "to": "Actions.DeltaPitch", "filters": [ - { "type": "scale", "scale": 0.6 } + { "type": "scale", "scale": 0.3 } ] }, - { "from": "Keyboard.W", "when": "!Keyboard.Control", "to": "Actions.LONGITUDINAL_FORWARD" }, - { "from": "Keyboard.S", "when": "!Keyboard.Control", "to": "Actions.LONGITUDINAL_BACKWARD" }, + { "from": "Keyboard.W", "when": ["!Application.CameraSelfie", "!Keyboard.Control"], "to": "Actions.LONGITUDINAL_FORWARD" }, + { "from": "Keyboard.S", "when": ["!Application.CameraSelfie", "!Keyboard.Control"], "to": "Actions.LONGITUDINAL_BACKWARD" }, + { "from": "Keyboard.S", "when": ["Application.CameraSelfie", "!Keyboard.Control"], "to": "Actions.LONGITUDINAL_FORWARD" }, + { "from": "Keyboard.W", "when": ["Application.CameraSelfie", "!Keyboard.Control"], "to": "Actions.LONGITUDINAL_BACKWARD" }, { "from": "Keyboard.A", "when": "Application.CameraLookAt", "to": "Actions.LATERAL_LEFT" }, { "from": "Keyboard.D", "when": "Application.CameraLookAt", "to": "Actions.LATERAL_RIGHT" }, + { "from": "Keyboard.A", "when": "Application.CameraSelfie", "to": "Actions.LATERAL_RIGHT" }, + { "from": "Keyboard.D", "when": "Application.CameraSelfie", "to": "Actions.LATERAL_LEFT" }, { "from": "Keyboard.Shift", "when": ["!Keyboard.Left", "!Keyboard.Right"], "to": "Actions.SPRINT" }, { "from": "Keyboard.C", "when": "!Keyboard.Control", "to": "Actions.VERTICAL_DOWN" }, { "from": "Keyboard.Left", "when": "Keyboard.Shift", "to": "Actions.LATERAL_LEFT" }, diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ab7fda9201..e48f669c17 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4418,11 +4418,7 @@ void Application::keyPressEvent(QKeyEvent* event) { menu->triggerOption(MenuOption::LookAtScreen); break; } - case Qt::Key_4: { - Menu* menu = Menu::getInstance(); - menu->triggerOption(MenuOption::FullscreenMirror); - break; - } + case Qt::Key_4: case Qt::Key_5: case Qt::Key_6: case Qt::Key_7: @@ -6008,9 +6004,6 @@ void Application::cameraModeChanged() { case CAMERA_MODE_SELFIE: Menu::getInstance()->setIsOptionChecked(MenuOption::SelfieScreen, true); break; - case CAMERA_MODE_MIRROR: - Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, true); - break; default: // we don't have menu items for the others, so just leave it alone. return; @@ -6025,25 +6018,18 @@ void Application::changeViewAsNeeded(float boomLength) { if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON && boomLengthGreaterThanMinimum) { Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, false); - Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, true); + Menu::getInstance()->setIsOptionChecked(MenuOption::LookAtScreen, true); cameraMenuChanged(); } else if (_myCamera.getMode() == CAMERA_MODE_LOOK_AT && !boomLengthGreaterThanMinimum) { Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, true); - Menu::getInstance()->setIsOptionChecked(MenuOption::ThirdPerson, false); + Menu::getInstance()->setIsOptionChecked(MenuOption::LookAtScreen, false); cameraMenuChanged(); } } void Application::cameraMenuChanged() { auto menu = Menu::getInstance(); - if (menu->isOptionChecked(MenuOption::FullscreenMirror)) { - if (!isHMDMode() && _myCamera.getMode() != CAMERA_MODE_MIRROR) { - _mirrorYawOffset = 0.0f; - _myCamera.setMode(CAMERA_MODE_MIRROR); - getMyAvatar()->reset(false, false, false); // to reset any active MyAvatar::FollowHelpers - getMyAvatar()->setBoomLength(MyAvatar::ZOOM_DEFAULT); - } - } else if (menu->isOptionChecked(MenuOption::FirstPerson)) { + if (menu->isOptionChecked(MenuOption::FirstPerson)) { if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON) { _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); getMyAvatar()->setBoomLength(MyAvatar::ZOOM_MIN); @@ -9145,9 +9131,7 @@ void Application::setDisplayPlugin(DisplayPluginPointer newDisplayPlugin) { cameraMenuChanged(); } - // Remove the mirror and selfie camera options from menu if in HMD mode - auto mirrorAction = menu->getActionForOption(MenuOption::FullscreenMirror); - mirrorAction->setVisible(!isHmd); + // Remove the selfie camera options from menu if in HMD mode auto selfieAction = menu->getActionForOption(MenuOption::SelfieScreen); selfieAction->setVisible(!isHmd); } diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 82fcade805..ea265a1fc9 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -191,13 +191,6 @@ Menu::Menu() { selfieAction->setProperty(EXCLUSION_GROUP_KEY, QVariant::fromValue(cameraModeGroup)); - // View > Mirror - auto viewMirrorAction = cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash( - viewMenu, MenuOption::FullscreenMirror, 0, - false, qApp, SLOT(cameraMenuChanged()))); - - viewMirrorAction->setProperty(EXCLUSION_GROUP_KEY, QVariant::fromValue(cameraModeGroup)); - viewMenu->addSeparator(); // View > Center Player In View diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 9db06b40e7..2291ea4fb8 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -129,7 +129,7 @@ namespace MenuOption { const QString Login = "Login/Sign Up"; const QString Log = "Log"; const QString LogExtraTimings = "Log Extra Timing Details"; - const QString LookAtScreen = "Look At"; + const QString LookAtScreen = "Third Person"; const QString LowVelocityFilter = "Low Velocity Filter"; const QString MeshVisible = "Draw Mesh"; const QString MuteEnvironment = "Mute Environment"; @@ -201,7 +201,7 @@ namespace MenuOption { const QString AnimStats = "Show Animation Stats"; const QString StopAllScripts = "Stop All Scripts"; const QString SuppressShortTimings = "Suppress Timings Less than 10ms"; - const QString ThirdPerson = "Third Person"; + const QString ThirdPerson = "Third Person Legacy"; const QString ThreePointCalibration = "3 Point Calibration"; const QString ThrottleFPSIfNotFocus = "Throttle FPS If Not Focus"; // FIXME - this value duplicated in Basic2DWindowOpenGLDisplayPlugin.cpp const QString ToggleHipsFollowing = "Toggle Hips Following"; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 36d3ad3156..610404fa78 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3333,10 +3333,10 @@ void MyAvatar::setRotationThreshold(float angleRadians) { void MyAvatar::updateOrientation(float deltaTime) { // Smoothly rotate body with arrow keys float targetSpeed = getDriveKey(YAW) * _yawSpeed; - bool computeCameraLookAt = (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT || - qApp->getCamera().getMode() == CAMERA_MODE_SELFIE) && isReadyForPhysics(); - if (computeCameraLookAt) { - // Rotate directly proportional to delta yaw and delta pitch from right-click mouse movement. + bool computeLookAt = (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT || + qApp->getCamera().getMode() == CAMERA_MODE_SELFIE) && isReadyForPhysics(); + if (computeLookAt) { + // For "Look At" and "Selfie" camera modes we also smooth the yaw rotation from right-click mouse movement. float speedFromDeltaYaw = deltaTime > FLT_EPSILON ? getDriveKey(DELTA_YAW) / deltaTime : 0.0f; speedFromDeltaYaw *= _yawSpeed / YAW_SPEED_DEFAULT; targetSpeed += speedFromDeltaYaw; @@ -3364,7 +3364,8 @@ void MyAvatar::updateOrientation(float deltaTime) { } } float totalBodyYaw = _bodyYawDelta * deltaTime; - if (!computeCameraLookAt) { + if (!computeLookAt) { + // Rotate directly proportional to delta yaw and delta pitch from right-click mouse movement. totalBodyYaw += getDriveKey(DELTA_YAW) * _yawSpeed / YAW_SPEED_DEFAULT; } // Comfort Mode: If you press any of the left/right rotation drive keys or input, you'll @@ -3414,7 +3415,7 @@ void MyAvatar::updateOrientation(float deltaTime) { float timeScale = deltaTime * FPS; bool faceForward = false; - if (!computeCameraLookAt) { + if (!computeLookAt) { setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f)))); _lookAtCameraTarget = eyesPosition + getWorldOrientation() * Vectors::FRONT; _lookAtOffsetYaw = getWorldOrientation(); @@ -3439,7 +3440,8 @@ void MyAvatar::updateOrientation(float deltaTime) { } bool isMovingFwdBwd = getDriveKey(TRANSLATE_Z) != 0.0f; bool isMovingSideways = getDriveKey(TRANSLATE_X) != 0.0f; - faceForward = computeCameraLookAt && (isMovingFwdBwd || isMovingSideways); + bool isRotatingWhileSeated = isMovingSideways && _characterController.getSeated(); + faceForward = isMovingFwdBwd || (isMovingSideways && !isRotatingWhileSeated); // Blend the avatar orientation with the camera look at if moving forward. if (faceForward || _shouldTurnToFaceCamera) { const float REORIENT_FORWARD_BLEND = 0.25f; @@ -3453,13 +3455,14 @@ void MyAvatar::updateOrientation(float deltaTime) { if (isMovingFwdBwd && isMovingSideways) { // Reorient avatar to face camera diagonal blend = DIAGONAL_TURN_BLEND; - if (getDriveKey(TRANSLATE_X) > 0.0f) { - faceRotation = _lookAtOffsetYaw * glm::angleAxis(-0.25f * PI, Vectors::UP); - } else if (getDriveKey(TRANSLATE_X) < 0.0f) { - faceRotation = _lookAtOffsetYaw * glm::angleAxis(0.25f * PI, Vectors::UP); - } + float turnSign = getDriveKey(TRANSLATE_Z) < 0.0f ? -1.0f : 1.0f; + turnSign = getDriveKey(TRANSLATE_X) > 0.0f ? -turnSign : turnSign; + faceRotation = _lookAtOffsetYaw * glm::angleAxis(turnSign * 0.25f * PI, Vectors::UP); } setWorldOrientation(glm::slerp(getWorldOrientation(), faceRotation, blend)); + } else if (isRotatingWhileSeated) { + float rotatingWhileSeatedYaw = -getDriveKey(TRANSLATE_X) * _yawSpeed * deltaTime; + setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, rotatingWhileSeatedYaw, 0.0f)))); } } @@ -3482,7 +3485,7 @@ void MyAvatar::updateOrientation(float deltaTime) { head->setBaseYaw(YAW(euler)); head->setBasePitch(PITCH(euler)); head->setBaseRoll(ROLL(euler)); - } else if (computeCameraLookAt) { + } else if (computeLookAt) { // Reset head orientation before applying the blending offset head->setBaseYaw(0.0f); head->setBasePitch(0.0f); @@ -3582,7 +3585,7 @@ float MyAvatar::calculateGearedSpeed(const float driveKey) { glm::vec3 MyAvatar::scaleMotorSpeed(const glm::vec3 forward, const glm::vec3 right) { float stickFullOn = 0.85f; auto zSpeed = getDriveKey(TRANSLATE_Z); - auto xSpeed = getDriveKey(TRANSLATE_X); + auto xSpeed = !_characterController.getSeated() ? getDriveKey(TRANSLATE_X) : 0.0f; glm::vec3 direction; if (!useAdvancedMovementControls() && qApp->isHMDMode()) { // Walking disabled in settings. @@ -5272,9 +5275,13 @@ glm::quat MyAvatar::getOrientationForAudio() { glm::quat result; switch (_audioListenerMode) { - case AudioListenerMode::FROM_HEAD: - result = getHead()->getFinalOrientationInWorldFrame(); + case AudioListenerMode::FROM_HEAD: { + // Compute the head orientation if we are using the look at blending + CameraMode mode = qApp->getCamera().getMode(); + bool headFollowsCamera = mode == CAMERA_MODE_LOOK_AT || mode == CAMERA_MODE_SELFIE; + result = headFollowsCamera ? qApp->getCamera().getOrientation() : getHead()->getFinalOrientationInWorldFrame(); break; + } case AudioListenerMode::FROM_CAMERA: result = qApp->getCamera().getOrientation(); break; @@ -6400,7 +6407,6 @@ void MyAvatar::sendPacket(const QUuid& entityID) const { void MyAvatar::setSitDriveKeysStatus(bool enabled) { const std::vector DISABLED_DRIVE_KEYS_DURING_SIT = { - DriveKeys::TRANSLATE_X, DriveKeys::TRANSLATE_Y, DriveKeys::TRANSLATE_Z, DriveKeys::STEP_TRANSLATE_X, From 527b27b32d70f414478f8e827763abeeed5ab8cf Mon Sep 17 00:00:00 2001 From: Clement Date: Wed, 18 Sep 2019 17:03:47 -0700 Subject: [PATCH 19/29] Make sure the flush timer is not spawned too early --- assignment-client/src/AssignmentClientApp.cpp | 3 +++ domain-server/src/DomainServer.cpp | 5 ++++- interface/src/Application.cpp | 3 +++ libraries/shared/src/LogHandler.cpp | 8 -------- libraries/shared/src/LogHandler.h | 5 ++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/assignment-client/src/AssignmentClientApp.cpp b/assignment-client/src/AssignmentClientApp.cpp index 2fa052e244..162f18f712 100644 --- a/assignment-client/src/AssignmentClientApp.cpp +++ b/assignment-client/src/AssignmentClientApp.cpp @@ -240,6 +240,9 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) : QThread::currentThread()->setObjectName("main thread"); + LogHandler::getInstance().setParent(this); + LogHandler::getInstance().setupRepeatedMessageFlusher(); + DependencyManager::registerInheritance(); DependencyManager::set(); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 307a43ee88..bad553c65e 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -174,6 +174,9 @@ DomainServer::DomainServer(int argc, char* argv[]) : LogUtils::init(); + LogHandler::getInstance().setParent(this); + LogHandler::getInstance().setupRepeatedMessageFlusher(); + qDebug() << "Setting up domain-server"; qDebug() << "[VERSION] Build sequence:" << qPrintable(applicationVersion()); qDebug() << "[VERSION] MODIFIED_ORGANIZATION:" << BuildInfo::MODIFIED_ORGANIZATION; @@ -320,7 +323,7 @@ DomainServer::DomainServer(int argc, char* argv[]) : connect(_contentManager.get(), &DomainContentBackupManager::recoveryCompleted, this, &DomainServer::restart); -static const int NODE_PING_MONITOR_INTERVAL_MSECS = 1 * MSECS_PER_SECOND; + static const int NODE_PING_MONITOR_INTERVAL_MSECS = 1 * MSECS_PER_SECOND; _nodePingMonitorTimer = new QTimer{ this }; connect(_nodePingMonitorTimer, &QTimer::timeout, this, &DomainServer::nodePingMonitor); _nodePingMonitorTimer->start(NODE_PING_MONITOR_INTERVAL_MSECS); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 388775cba5..acac514a18 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1060,6 +1060,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo setProperty(hifi::properties::STEAM, (steamClient && steamClient->isRunning())); setProperty(hifi::properties::CRASHED, _previousSessionCrashed); + LogHandler::getInstance().setParent(this); + LogHandler::getInstance().setupRepeatedMessageFlusher(); + { const QStringList args = arguments(); diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index c51d9bf611..aff4de6e3a 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -32,14 +32,6 @@ LogHandler& LogHandler::getInstance() { return staticInstance; } -LogHandler::LogHandler() { - // make sure we setup the repeated message flusher, but do it on the LogHandler thread - QMetaObject::invokeMethod(this, "setupRepeatedMessageFlusher"); -} - -LogHandler::~LogHandler() { -} - const char* stringForLogType(LogMsgType msgType) { switch (msgType) { case LogInfo: diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index 56450768ff..8f84899b78 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -54,12 +54,11 @@ public: int newRepeatedMessageID(); void printRepeatedMessage(int messageID, LogMsgType type, const QMessageLogContext& context, const QString &message); -private slots: void setupRepeatedMessageFlusher(); private: - LogHandler(); - ~LogHandler(); + LogHandler() = default; + ~LogHandler() = default; void flushRepeatedMessages(); From fc223e4cb6fdfeaab0e6cab033f2f94ee89c6b35 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 18 Sep 2019 17:15:25 -0700 Subject: [PATCH 20/29] Reverse the up/down arrow keys if in selfie mode --- interface/resources/controllers/keyboardMouse.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/resources/controllers/keyboardMouse.json b/interface/resources/controllers/keyboardMouse.json index c748243fec..ff02142891 100644 --- a/interface/resources/controllers/keyboardMouse.json +++ b/interface/resources/controllers/keyboardMouse.json @@ -226,11 +226,11 @@ { "from": "Keyboard.Up", "when": "Application.CameraFirstPerson", "to": "Actions.LONGITUDINAL_FORWARD" }, { "from": "Keyboard.Up", "when": "Application.CameraThirdPerson", "to": "Actions.LONGITUDINAL_FORWARD" }, { "from": "Keyboard.Up", "when": "Application.CameraLookAt", "to": "Actions.LONGITUDINAL_FORWARD" }, - { "from": "Keyboard.Up", "when": "Application.CameraSelfie", "to": "Actions.LONGITUDINAL_FORWARD" }, + { "from": "Keyboard.Up", "when": "Application.CameraSelfie", "to": "Actions.LONGITUDINAL_BACKWARD" }, { "from": "Keyboard.Down", "when": "Application.CameraFirstPerson", "to": "Actions.LONGITUDINAL_BACKWARD" }, { "from": "Keyboard.Down", "when": "Application.CameraThirdPerson", "to": "Actions.LONGITUDINAL_BACKWARD" }, { "from": "Keyboard.Down", "when": "Application.CameraLookAt", "to": "Actions.LONGITUDINAL_BACKWARD" }, - { "from": "Keyboard.Down", "when": "Application.CameraSelfie", "to": "Actions.LONGITUDINAL_BACKWARD" }, + { "from": "Keyboard.Down", "when": "Application.CameraSelfie", "to": "Actions.LONGITUDINAL_FORWARD" }, { "from": "Keyboard.PgDown", "to": "Actions.VERTICAL_DOWN" }, { "from": "Keyboard.PgUp", "to": "Actions.VERTICAL_UP" }, From ab419ddd236a534eb1ffcf28e63dbe1f03b7e27c Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 19 Sep 2019 08:25:01 -0700 Subject: [PATCH 21/29] beware null sessionID --- libraries/entities/src/EntityScriptingInterface.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 87f15896f2..7cfdc8a68d 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -481,11 +481,15 @@ QUuid EntityScriptingInterface::addEntityInternal(const EntityItemProperties& pr _activityTracking.addedEntityCount++; auto nodeList = DependencyManager::get(); - const auto sessionID = nodeList->getSessionUUID(); + auto sessionID = nodeList->getSessionUUID(); EntityItemProperties propertiesWithSimID = properties; propertiesWithSimID.setEntityHostType(entityHostType); if (entityHostType == entity::HostType::AVATAR) { + if (sessionID.isNull()) { + // null sessionID is unacceptable in this case + sessionID = AVATAR_SELF_ID; + } propertiesWithSimID.setOwningAvatarID(sessionID); } else if (entityHostType == entity::HostType::LOCAL) { // For now, local entities are always collisionless @@ -801,7 +805,7 @@ QUuid EntityScriptingInterface::editEntity(const QUuid& id, const EntityItemProp return; } - if (entity->isAvatarEntity() && entity->getOwningAvatarID() != sessionID) { + if (entity->isAvatarEntity() && entity->getOwningAvatarID() != sessionID && entity->getOwningAvatarID() != AVATAR_SELF_ID) { // don't edit other avatar's avatarEntities properties = EntityItemProperties(); return; From 5e96ce8822d699bf317b7e8de6e99079406fde2e Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 19 Sep 2019 09:48:11 -0700 Subject: [PATCH 22/29] DEV-152: Implement 'Smooth/Snap Turn' setting in SimplifiedUI > Settings > VR --- .../hifi/simplifiedUI/settingsApp/vr/VR.qml | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/simplifiedUI/settingsApp/vr/VR.qml b/interface/resources/qml/hifi/simplifiedUI/settingsApp/vr/VR.qml index 5f0fbe49d5..420ee11a05 100644 --- a/interface/resources/qml/hifi/simplifiedUI/settingsApp/vr/VR.qml +++ b/interface/resources/qml/hifi/simplifiedUI/settingsApp/vr/VR.qml @@ -71,7 +71,7 @@ Flickable { ColumnLayout { id: controlsContainer Layout.preferredWidth: parent.width - Layout.topMargin: 24 + Layout.topMargin: 24 spacing: 0 HifiStylesUit.GraphikSemiBold { @@ -154,6 +154,45 @@ Flickable { } } } + + ColumnLayout { + Layout.preferredWidth: parent.width + spacing: 0 + + HifiStylesUit.GraphikSemiBold { + text: "VR Rotation Mode" + Layout.preferredWidth: parent.width + height: paintedHeight + size: 22 + color: simplifiedUI.colors.text.white + } + + ColumnLayout { + width: parent.width + Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin + spacing: simplifiedUI.margins.settings.spacingBetweenRadiobuttons + + ButtonGroup { id: rotationButtonGroup } + + SimplifiedControls.RadioButton { + text: "Snap Turn" + ButtonGroup.group: rotationButtonGroup + checked: MyAvatar.getSnapTurn() === true + onClicked: { + MyAvatar.setSnapTurn(true); + } + } + + SimplifiedControls.RadioButton { + text: "Smooth Turn" + ButtonGroup.group: rotationButtonGroup + checked: MyAvatar.getSnapTurn() === false + onClicked: { + MyAvatar.setSnapTurn(false); + } + } + } + } ColumnLayout { id: micControlsContainer From 6d98537a201912a886de3edc5edce6a90e8f7e6d Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 19 Sep 2019 10:45:20 -0700 Subject: [PATCH 23/29] Clean up code and refactor avatar-animation.json --- .../resources/avatar/avatar-animation.json | 1375 +++++++++-------- interface/src/Application.cpp | 46 +- interface/src/Menu.cpp | 4 +- interface/src/Menu.h | 4 +- interface/src/avatar/MyAvatar.cpp | 49 +- interface/src/avatar/MyAvatar.h | 2 - libraries/animation/src/Rig.cpp | 2 +- 7 files changed, 724 insertions(+), 758 deletions(-) diff --git a/interface/resources/avatar/avatar-animation.json b/interface/resources/avatar/avatar-animation.json index b23b03861d..15ef447e61 100644 --- a/interface/resources/avatar/avatar-animation.json +++ b/interface/resources/avatar/avatar-animation.json @@ -11,112 +11,343 @@ "children": [ { "children": [ + { + "children": [ + ], + "data": { + "solutionSource": "relaxToUnderPoses", + "solutionSourceVar": "solutionSource", + "targets": [ + { + "flexCoefficients": [ + 1 + ], + "jointName": "Hips", + "positionVar": "hipsPosition", + "rotationVar": "hipsRotation", + "typeVar": "hipsType", + "weight": 1, + "weightVar": "hipsWeight" + }, + { + "flexCoefficients": [ + 1, + 0.5, + 0.5, + 0.2, + 0.01, + 0.005, + 0.001, + 0, + 0 + ], + "jointName": "RightHand", + "poleReferenceVectorVar": "rightHandPoleReferenceVector", + "poleVectorEnabledVar": "rightHandPoleVectorEnabled", + "poleVectorVar": "rightHandPoleVector", + "positionVar": "rightHandPosition", + "rotationVar": "rightHandRotation", + "typeVar": "rightHandType", + "weight": 1, + "weightVar": "rightHandWeight" + }, + { + "flexCoefficients": [ + 1, + 0.5, + 0.5, + 0.2, + 0.01, + 0.005, + 0.001, + 0, + 0 + ], + "jointName": "LeftHand", + "poleReferenceVectorVar": "leftHandPoleReferenceVector", + "poleVectorEnabledVar": "leftHandPoleVectorEnabled", + "poleVectorVar": "leftHandPoleVector", + "positionVar": "leftHandPosition", + "rotationVar": "leftHandRotation", + "typeVar": "leftHandType", + "weight": 1, + "weightVar": "leftHandWeight" + }, + { + "flexCoefficients": [ + 1, + 0.5, + 0.25 + ], + "jointName": "Spine2", + "positionVar": "spine2Position", + "rotationVar": "spine2Rotation", + "typeVar": "spine2Type", + "weight": 2, + "weightVar": "spine2Weight" + }, + { + "flexCoefficients": [ + 1, + 0.5, + 0.25, + 0.2, + 0.1 + ], + "jointName": "Head", + "positionVar": "headPosition", + "rotationVar": "headRotation", + "typeVar": "headType", + "weight": 4, + "weightVar": "headWeight" + } + ] + }, + "id": "ik", + "type": "inverseKinematics" + }, { "children": [ { "children": [ ], "data": { - "solutionSource": "relaxToUnderPoses", - "solutionSourceVar": "solutionSource", - "targets": [ - { - "flexCoefficients": [ - 1 - ], - "jointName": "Hips", - "positionVar": "hipsPosition", - "rotationVar": "hipsRotation", - "typeVar": "hipsType", - "weight": 1, - "weightVar": "hipsWeight" - }, - { - "flexCoefficients": [ - 1, - 0.5, - 0.5, - 0.2, - 0.01, - 0.005, - 0.001, - 0, - 0 - ], - "jointName": "RightHand", - "poleReferenceVectorVar": "rightHandPoleReferenceVector", - "poleVectorEnabledVar": "rightHandPoleVectorEnabled", - "poleVectorVar": "rightHandPoleVector", - "positionVar": "rightHandPosition", - "rotationVar": "rightHandRotation", - "typeVar": "rightHandType", - "weight": 1, - "weightVar": "rightHandWeight" - }, - { - "flexCoefficients": [ - 1, - 0.5, - 0.5, - 0.2, - 0.01, - 0.005, - 0.001, - 0, - 0 - ], - "jointName": "LeftHand", - "poleReferenceVectorVar": "leftHandPoleReferenceVector", - "poleVectorEnabledVar": "leftHandPoleVectorEnabled", - "poleVectorVar": "leftHandPoleVector", - "positionVar": "leftHandPosition", - "rotationVar": "leftHandRotation", - "typeVar": "leftHandType", - "weight": 1, - "weightVar": "leftHandWeight" - }, - { - "flexCoefficients": [ - 1, - 0.5, - 0.25 - ], - "jointName": "Spine2", - "positionVar": "spine2Position", - "rotationVar": "spine2Rotation", - "typeVar": "spine2Type", - "weight": 2, - "weightVar": "spine2Weight" - }, - { - "flexCoefficients": [ - 1, - 0.5, - 0.25, - 0.2, - 0.1 - ], - "jointName": "Head", - "positionVar": "headPosition", - "rotationVar": "headRotation", - "typeVar": "headType", - "weight": 4, - "weightVar": "headWeight" - } - ] }, - "id": "ik", - "type": "inverseKinematics" + "id": "defaultPose", + "type": "defaultPose" }, { "children": [ { "children": [ + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 0, + "loopFlag": true, + "startFrame": 0, + "timeScale": 1, + "url": "qrc:///avatar/animations/hydra_pose_open_right.fbx" + }, + "id": "rightHandGraspOpen", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 0, + "loopFlag": true, + "startFrame": 0, + "timeScale": 1, + "url": "qrc:///avatar/animations/hydra_pose_closed_right.fbx" + }, + "id": "rightHandGraspClosed", + "type": "clip" + } + ], + "data": { + "alpha": 0, + "alphaVar": "rightHandGraspAlpha" + }, + "id": "rightHandGrasp", + "type": "blendLinear" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 15, + "loopFlag": true, + "startFrame": 15, + "timeScale": 1, + "url": "qrc:///avatar/animations/touch_point_open_right.fbx" + }, + "id": "rightIndexPointOpen", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 15, + "loopFlag": true, + "startFrame": 15, + "timeScale": 1, + "url": "qrc:///avatar/animations/touch_point_closed_right.fbx" + }, + "id": "rightIndexPointClosed", + "type": "clip" + } + ], + "data": { + "alpha": 0, + "alphaVar": "rightHandGraspAlpha" + }, + "id": "rightIndexPoint", + "type": "blendLinear" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 15, + "loopFlag": true, + "startFrame": 15, + "timeScale": 1, + "url": "qrc:///avatar/animations/touch_thumb_open_right.fbx" + }, + "id": "rightThumbRaiseOpen", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 15, + "loopFlag": true, + "startFrame": 15, + "timeScale": 1, + "url": "qrc:///avatar/animations/touch_thumb_closed_right.fbx" + }, + "id": "rightThumbRaiseClosed", + "type": "clip" + } + ], + "data": { + "alpha": 0, + "alphaVar": "rightHandGraspAlpha" + }, + "id": "rightThumbRaise", + "type": "blendLinear" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "endFrame": 15, + "loopFlag": true, + "startFrame": 15, + "timeScale": 1, + "url": "qrc:///avatar/animations/touch_thumb_point_open_right.fbx" + }, + "id": "rightIndexPointAndThumbRaiseOpen", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 15, + "loopFlag": true, + "startFrame": 15, + "timeScale": 1, + "url": "qrc:///avatar/animations/touch_thumb_point_closed_right.fbx" + }, + "id": "rightIndexPointAndThumbRaiseClosed", + "type": "clip" + } + ], + "data": { + "alpha": 0, + "alphaVar": "rightHandGraspAlpha" + }, + "id": "rightIndexPointAndThumbRaise", + "type": "blendLinear" + } ], "data": { + "currentState": "rightHandGrasp", + "states": [ + { + "id": "rightHandGrasp", + "interpDuration": 3, + "interpTarget": 3, + "transitions": [ + { + "state": "rightIndexPoint", + "var": "isRightIndexPoint" + }, + { + "state": "rightThumbRaise", + "var": "isRightThumbRaise" + }, + { + "state": "rightIndexPointAndThumbRaise", + "var": "isRightIndexPointAndThumbRaise" + } + ] + }, + { + "id": "rightIndexPoint", + "interpDuration": 3, + "interpTarget": 15, + "transitions": [ + { + "state": "rightHandGrasp", + "var": "isRightHandGrasp" + }, + { + "state": "rightThumbRaise", + "var": "isRightThumbRaise" + }, + { + "state": "rightIndexPointAndThumbRaise", + "var": "isRightIndexPointAndThumbRaise" + } + ] + }, + { + "id": "rightThumbRaise", + "interpDuration": 3, + "interpTarget": 15, + "transitions": [ + { + "state": "rightHandGrasp", + "var": "isRightHandGrasp" + }, + { + "state": "rightIndexPoint", + "var": "isRightIndexPoint" + }, + { + "state": "rightIndexPointAndThumbRaise", + "var": "isRightIndexPointAndThumbRaise" + } + ] + }, + { + "id": "rightIndexPointAndThumbRaise", + "interpDuration": 3, + "interpTarget": 15, + "transitions": [ + { + "state": "rightHandGrasp", + "var": "isRightHandGrasp" + }, + { + "state": "rightIndexPoint", + "var": "isRightIndexPoint" + }, + { + "state": "rightThumbRaise", + "var": "isRightThumbRaise" + } + ] + } + ] }, - "id": "defaultPose", - "type": "defaultPose" + "id": "rightHandStateMachine", + "type": "stateMachine" }, { "children": [ @@ -132,30 +363,30 @@ "loopFlag": true, "startFrame": 0, "timeScale": 1, - "url": "qrc:///avatar/animations/hydra_pose_open_right.fbx" + "url": "qrc:///avatar/animations/hydra_pose_open_left.fbx" }, - "id": "rightHandGraspOpen", + "id": "leftHandGraspOpen", "type": "clip" }, { "children": [ ], "data": { - "endFrame": 0, + "endFrame": 10, "loopFlag": true, - "startFrame": 0, + "startFrame": 10, "timeScale": 1, - "url": "qrc:///avatar/animations/hydra_pose_closed_right.fbx" + "url": "qrc:///avatar/animations/hydra_pose_closed_left.fbx" }, - "id": "rightHandGraspClosed", + "id": "leftHandGraspClosed", "type": "clip" } ], "data": { "alpha": 0, - "alphaVar": "rightHandGraspAlpha" + "alphaVar": "leftHandGraspAlpha" }, - "id": "rightHandGrasp", + "id": "leftHandGrasp", "type": "blendLinear" }, { @@ -168,9 +399,9 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_point_open_right.fbx" + "url": "qrc:///avatar/animations/touch_point_open_left.fbx" }, - "id": "rightIndexPointOpen", + "id": "leftIndexPointOpen", "type": "clip" }, { @@ -181,17 +412,17 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_point_closed_right.fbx" + "url": "qrc:///avatar/animations/touch_point_closed_left.fbx" }, - "id": "rightIndexPointClosed", + "id": "leftIndexPointClosed", "type": "clip" } ], "data": { "alpha": 0, - "alphaVar": "rightHandGraspAlpha" + "alphaVar": "leftHandGraspAlpha" }, - "id": "rightIndexPoint", + "id": "leftIndexPoint", "type": "blendLinear" }, { @@ -204,9 +435,9 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_open_right.fbx" + "url": "qrc:///avatar/animations/touch_thumb_open_left.fbx" }, - "id": "rightThumbRaiseOpen", + "id": "leftThumbRaiseOpen", "type": "clip" }, { @@ -217,17 +448,17 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_closed_right.fbx" + "url": "qrc:///avatar/animations/touch_thumb_closed_left.fbx" }, - "id": "rightThumbRaiseClosed", + "id": "leftThumbRaiseClosed", "type": "clip" } ], "data": { "alpha": 0, - "alphaVar": "rightHandGraspAlpha" + "alphaVar": "leftHandGraspAlpha" }, - "id": "rightThumbRaise", + "id": "leftThumbRaise", "type": "blendLinear" }, { @@ -240,9 +471,9 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_point_open_right.fbx" + "url": "qrc:///avatar/animations/touch_thumb_point_open_left.fbx" }, - "id": "rightIndexPointAndThumbRaiseOpen", + "id": "leftIndexPointAndThumbRaiseOpen", "type": "clip" }, { @@ -253,337 +484,106 @@ "loopFlag": true, "startFrame": 15, "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_point_closed_right.fbx" + "url": "qrc:///avatar/animations/touch_thumb_point_closed_left.fbx" }, - "id": "rightIndexPointAndThumbRaiseClosed", + "id": "leftIndexPointAndThumbRaiseClosed", "type": "clip" } ], "data": { "alpha": 0, - "alphaVar": "rightHandGraspAlpha" + "alphaVar": "leftHandGraspAlpha" }, - "id": "rightIndexPointAndThumbRaise", + "id": "leftIndexPointAndThumbRaise", "type": "blendLinear" } ], "data": { - "currentState": "rightHandGrasp", + "currentState": "leftHandGrasp", "states": [ { - "id": "rightHandGrasp", + "id": "leftHandGrasp", "interpDuration": 3, "interpTarget": 3, "transitions": [ { - "state": "rightIndexPoint", - "var": "isRightIndexPoint" + "state": "leftIndexPoint", + "var": "isLeftIndexPoint" }, { - "state": "rightThumbRaise", - "var": "isRightThumbRaise" + "state": "leftThumbRaise", + "var": "isLeftThumbRaise" }, { - "state": "rightIndexPointAndThumbRaise", - "var": "isRightIndexPointAndThumbRaise" + "state": "leftIndexPointAndThumbRaise", + "var": "isLeftIndexPointAndThumbRaise" } ] }, { - "id": "rightIndexPoint", + "id": "leftIndexPoint", "interpDuration": 3, "interpTarget": 15, "transitions": [ { - "state": "rightHandGrasp", - "var": "isRightHandGrasp" + "state": "leftHandGrasp", + "var": "isLeftHandGrasp" }, { - "state": "rightThumbRaise", - "var": "isRightThumbRaise" + "state": "leftThumbRaise", + "var": "isLeftThumbRaise" }, { - "state": "rightIndexPointAndThumbRaise", - "var": "isRightIndexPointAndThumbRaise" + "state": "leftIndexPointAndThumbRaise", + "var": "isLeftIndexPointAndThumbRaise" } ] }, { - "id": "rightThumbRaise", + "id": "leftThumbRaise", "interpDuration": 3, "interpTarget": 15, "transitions": [ { - "state": "rightHandGrasp", - "var": "isRightHandGrasp" + "state": "leftHandGrasp", + "var": "isLeftHandGrasp" }, { - "state": "rightIndexPoint", - "var": "isRightIndexPoint" + "state": "leftIndexPoint", + "var": "isLeftIndexPoint" }, { - "state": "rightIndexPointAndThumbRaise", - "var": "isRightIndexPointAndThumbRaise" + "state": "leftIndexPointAndThumbRaise", + "var": "isLeftIndexPointAndThumbRaise" } ] }, { - "id": "rightIndexPointAndThumbRaise", + "id": "leftIndexPointAndThumbRaise", "interpDuration": 3, "interpTarget": 15, "transitions": [ { - "state": "rightHandGrasp", - "var": "isRightHandGrasp" + "state": "leftHandGrasp", + "var": "isLeftHandGrasp" }, { - "state": "rightIndexPoint", - "var": "isRightIndexPoint" + "state": "leftIndexPoint", + "var": "isLeftIndexPoint" }, { - "state": "rightThumbRaise", - "var": "isRightThumbRaise" + "state": "leftThumbRaise", + "var": "isLeftThumbRaise" } ] } ] }, - "id": "rightHandStateMachine", + "id": "leftHandStateMachine", "type": "stateMachine" }, { "children": [ - { - "children": [ - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 0, - "loopFlag": true, - "startFrame": 0, - "timeScale": 1, - "url": "qrc:///avatar/animations/hydra_pose_open_left.fbx" - }, - "id": "leftHandGraspOpen", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 10, - "loopFlag": true, - "startFrame": 10, - "timeScale": 1, - "url": "qrc:///avatar/animations/hydra_pose_closed_left.fbx" - }, - "id": "leftHandGraspClosed", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "leftHandGraspAlpha" - }, - "id": "leftHandGrasp", - "type": "blendLinear" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_point_open_left.fbx" - }, - "id": "leftIndexPointOpen", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_point_closed_left.fbx" - }, - "id": "leftIndexPointClosed", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "leftHandGraspAlpha" - }, - "id": "leftIndexPoint", - "type": "blendLinear" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_open_left.fbx" - }, - "id": "leftThumbRaiseOpen", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_closed_left.fbx" - }, - "id": "leftThumbRaiseClosed", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "leftHandGraspAlpha" - }, - "id": "leftThumbRaise", - "type": "blendLinear" - }, - { - "children": [ - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_point_open_left.fbx" - }, - "id": "leftIndexPointAndThumbRaiseOpen", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 15, - "loopFlag": true, - "startFrame": 15, - "timeScale": 1, - "url": "qrc:///avatar/animations/touch_thumb_point_closed_left.fbx" - }, - "id": "leftIndexPointAndThumbRaiseClosed", - "type": "clip" - } - ], - "data": { - "alpha": 0, - "alphaVar": "leftHandGraspAlpha" - }, - "id": "leftIndexPointAndThumbRaise", - "type": "blendLinear" - } - ], - "data": { - "currentState": "leftHandGrasp", - "states": [ - { - "id": "leftHandGrasp", - "interpDuration": 3, - "interpTarget": 3, - "transitions": [ - { - "state": "leftIndexPoint", - "var": "isLeftIndexPoint" - }, - { - "state": "leftThumbRaise", - "var": "isLeftThumbRaise" - }, - { - "state": "leftIndexPointAndThumbRaise", - "var": "isLeftIndexPointAndThumbRaise" - } - ] - }, - { - "id": "leftIndexPoint", - "interpDuration": 3, - "interpTarget": 15, - "transitions": [ - { - "state": "leftHandGrasp", - "var": "isLeftHandGrasp" - }, - { - "state": "leftThumbRaise", - "var": "isLeftThumbRaise" - }, - { - "state": "leftIndexPointAndThumbRaise", - "var": "isLeftIndexPointAndThumbRaise" - } - ] - }, - { - "id": "leftThumbRaise", - "interpDuration": 3, - "interpTarget": 15, - "transitions": [ - { - "state": "leftHandGrasp", - "var": "isLeftHandGrasp" - }, - { - "state": "leftIndexPoint", - "var": "isLeftIndexPoint" - }, - { - "state": "leftIndexPointAndThumbRaise", - "var": "isLeftIndexPointAndThumbRaise" - } - ] - }, - { - "id": "leftIndexPointAndThumbRaise", - "interpDuration": 3, - "interpTarget": 15, - "transitions": [ - { - "state": "leftHandGrasp", - "var": "isLeftHandGrasp" - }, - { - "state": "leftIndexPoint", - "var": "isLeftIndexPoint" - }, - { - "state": "leftThumbRaise", - "var": "isLeftThumbRaise" - } - ] - } - ] - }, - "id": "leftHandStateMachine", - "type": "stateMachine" - }, { "children": [ { @@ -5494,381 +5494,382 @@ }, "id": "mainStateMachine", "type": "stateMachine" + }, + { + "children": [ + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 11, + "loopFlag": true, + "startFrame": 11, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookLeft", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 30, + "loopFlag": true, + "startFrame": 30, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookRight", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 50, + "loopFlag": true, + "startFrame": 50, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookUp", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 70, + "loopFlag": true, + "startFrame": 70, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookDown", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 97, + "loopFlag": true, + "startFrame": 97, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookUpLeft", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 110, + "loopFlag": true, + "startFrame": 110, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookUpRight", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 130, + "loopFlag": true, + "startFrame": 130, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookDownLeft", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 150, + "loopFlag": true, + "startFrame": 150, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookDownRight", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "baseFrame": 1, + "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", + "blendType": "addAbsolute", + "endFrame": 3, + "loopFlag": true, + "startFrame": 3, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" + }, + "id": "lookCenter", + "type": "clip" + } + ], + "data": { + "alpha": [ + 0, + 0, + 0 + ], + "alphaVar": "lookAroundAlpha", + "centerId": "lookCenter", + "downId": "lookDown", + "downLeftId": "lookDownLeft", + "downRightId": "lookDownRight", + "leftId": "lookLeft", + "rightId": "lookRight", + "upId": "lookUp", + "upLeftId": "lookUpLeft", + "upRightId": "lookUpRight" + }, + "id": "lookAround", + "type": "blendDirectional" } ], "data": { "alpha": 0, - "alphaVar": "leftHandOverlayAlpha", - "boneSet": "leftHand" + "alphaVar": "additiveBlendAlpha", + "blendType": "addAbsolute" }, - "id": "leftHandOverlay", - "type": "overlay" + "id": "additiveBlend", + "type": "blendLinear" } ], "data": { "alpha": 0, - "alphaVar": "rightHandOverlayAlpha", - "boneSet": "rightHand" + "alphaVar": "leftHandOverlayAlpha", + "boneSet": "leftHand" }, - "id": "rightHandOverlay", + "id": "leftHandOverlay", "type": "overlay" } ], "data": { "alpha": 0, - "alphaVar": "defaultPoseOverlayAlpha", - "boneSet": "fullBody", - "boneSetVar": "defaultPoseOverlayBoneSet" + "alphaVar": "rightHandOverlayAlpha", + "boneSet": "rightHand" }, - "id": "defaultPoseOverlay", + "id": "rightHandOverlay", "type": "overlay" } ], "data": { - "alpha": 1, - "alphaVar": "ikOverlayAlpha", - "boneSet": "fullBody" + "alpha": 0, + "alphaVar": "defaultPoseOverlayAlpha", + "boneSet": "fullBody", + "boneSetVar": "defaultPoseOverlayBoneSet" }, - "id": "ikOverlay", + "id": "defaultPoseOverlay", "type": "overlay" } ], "data": { "alpha": 1, - "alphaVar": "leftFootIKAlpha", - "baseJointName": "LeftUpLeg", - "enabled": false, - "enabledVar": "leftFootIKEnabled", - "endEffectorPositionVarVar": "leftFootIKPositionVar", - "endEffectorRotationVarVar": "leftFootIKRotationVar", - "interpDuration": 15, - "midHingeAxis": [ - -1, - 0, - 0 - ], - "midJointName": "LeftLeg", - "tipJointName": "LeftFoot" + "alphaVar": "ikOverlayAlpha", + "boneSet": "fullBody" }, - "id": "leftFootIK", - "type": "twoBoneIK" + "id": "ikOverlay", + "type": "overlay" } ], "data": { + "alpha": 1, + "alphaVar": "leftFootIKAlpha", "baseJointName": "LeftUpLeg", "enabled": false, - "enabledVar": "leftFootPoleVectorEnabled", - "midJointName": "LeftLeg", - "poleVectorVar": "leftFootPoleVector", - "referenceVector": [ + "enabledVar": "leftFootIKEnabled", + "endEffectorPositionVarVar": "leftFootIKPositionVar", + "endEffectorRotationVarVar": "leftFootIKRotationVar", + "interpDuration": 15, + "midHingeAxis": [ + -1, 0, - 0, - 1 + 0 ], + "midJointName": "LeftLeg", "tipJointName": "LeftFoot" }, - "id": "leftFootPoleVector", - "type": "poleVectorConstraint" + "id": "leftFootIK", + "type": "twoBoneIK" } ], "data": { - "alpha": 1, - "alphaVar": "rightFootIKAlpha", - "baseJointName": "RightUpLeg", + "baseJointName": "LeftUpLeg", "enabled": false, - "enabledVar": "rightFootIKEnabled", - "endEffectorPositionVarVar": "rightFootIKPositionVar", - "endEffectorRotationVarVar": "rightFootIKRotationVar", - "interpDuration": 15, - "midHingeAxis": [ - -1, + "enabledVar": "leftFootPoleVectorEnabled", + "midJointName": "LeftLeg", + "poleVectorVar": "leftFootPoleVector", + "referenceVector": [ 0, - 0 + 0, + 1 ], - "midJointName": "RightLeg", - "tipJointName": "RightFoot" + "tipJointName": "LeftFoot" }, - "id": "rightFootIK", - "type": "twoBoneIK" + "id": "leftFootPoleVector", + "type": "poleVectorConstraint" } ], "data": { + "alpha": 1, + "alphaVar": "rightFootIKAlpha", "baseJointName": "RightUpLeg", "enabled": false, - "enabledVar": "rightFootPoleVectorEnabled", - "midJointName": "RightLeg", - "poleVectorVar": "rightFootPoleVector", - "referenceVector": [ + "enabledVar": "rightFootIKEnabled", + "endEffectorPositionVarVar": "rightFootIKPositionVar", + "endEffectorRotationVarVar": "rightFootIKRotationVar", + "interpDuration": 15, + "midHingeAxis": [ + -1, 0, - 0, - 1 + 0 ], + "midJointName": "RightLeg", "tipJointName": "RightFoot" }, - "id": "userAnimNone", - "type": "poleVectorConstraint" - }, - { - "children": [ - ], - "data": { - "endFrame": 300, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle.fbx" - }, - "id": "userAnimA", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "endFrame": 300, - "loopFlag": true, - "startFrame": 1, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle.fbx" - }, - "id": "userAnimB", - "type": "clip" + "id": "rightFootIK", + "type": "twoBoneIK" } ], "data": { - "currentState": "userAnimNone", - "states": [ - { - "easingType": "easeInOutQuad", - "id": "userAnimNone", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "userAnimA", - "var": "userAnimA" - }, - { - "state": "userAnimB", - "var": "userAnimB" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "userAnimA", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "userAnimNone", - "var": "userAnimNone" - }, - { - "state": "userAnimB", - "var": "userAnimB" - } - ] - }, - { - "easingType": "easeInOutQuad", - "id": "userAnimB", - "interpDuration": 15, - "interpTarget": 15, - "interpType": "evaluateBoth", - "transitions": [ - { - "state": "userAnimNone", - "var": "userAnimNone" - }, - { - "state": "userAnimA", - "var": "userAnimA" - } - ] - } - ] + "baseJointName": "RightUpLeg", + "enabled": false, + "enabledVar": "rightFootPoleVectorEnabled", + "midJointName": "RightLeg", + "poleVectorVar": "rightFootPoleVector", + "referenceVector": [ + 0, + 0, + 1 + ], + "tipJointName": "RightFoot" }, - "id": "userAnimStateMachine", - "type": "stateMachine" + "id": "userAnimNone", + "type": "poleVectorConstraint" }, { "children": [ - { - "children": [ - ], - "data": { - "baseFrame": 1, - "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", - "blendType": "addAbsolute", - "endFrame": 11, - "loopFlag": true, - "startFrame": 11, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" - }, - "id": "lookLeft", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "baseFrame": 1, - "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", - "blendType": "addAbsolute", - "endFrame": 30, - "loopFlag": true, - "startFrame": 30, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" - }, - "id": "lookRight", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "baseFrame": 1, - "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", - "blendType": "addAbsolute", - "endFrame": 50, - "loopFlag": true, - "startFrame": 50, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" - }, - "id": "lookUp", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "baseFrame": 1, - "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", - "blendType": "addAbsolute", - "endFrame": 70, - "loopFlag": true, - "startFrame": 70, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" - }, - "id": "lookDown", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "baseFrame": 1, - "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", - "blendType": "addAbsolute", - "endFrame": 97, - "loopFlag": true, - "startFrame": 97, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" - }, - "id": "lookUpLeft", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "baseFrame": 1, - "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", - "blendType": "addAbsolute", - "endFrame": 110, - "loopFlag": true, - "startFrame": 110, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" - }, - "id": "lookUpRight", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "baseFrame": 1, - "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", - "blendType": "addAbsolute", - "endFrame": 130, - "loopFlag": true, - "startFrame": 130, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" - }, - "id": "lookDownLeft", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "baseFrame": 1, - "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", - "blendType": "addAbsolute", - "endFrame": 150, - "loopFlag": true, - "startFrame": 150, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" - }, - "id": "lookDownRight", - "type": "clip" - }, - { - "children": [ - ], - "data": { - "baseFrame": 1, - "baseURL": "qrc:///avatar/animations/idle_aimoffsets.fbx", - "blendType": "addAbsolute", - "endFrame": 3, - "loopFlag": true, - "startFrame": 3, - "timeScale": 1, - "url": "qrc:///avatar/animations/idle_aimoffsets.fbx" - }, - "id": "lookCenter", - "type": "clip" - } ], "data": { - "alpha": [ - 0, - 0, - 0 - ], - "alphaVar": "lookAroundAlpha", - "centerId": "lookCenter", - "downId": "lookDown", - "downLeftId": "lookDownLeft", - "downRightId": "lookDownRight", - "leftId": "lookLeft", - "rightId": "lookRight", - "upId": "lookUp", - "upLeftId": "lookUpLeft", - "upRightId": "lookUpRight" + "endFrame": 300, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle.fbx" }, - "id": "lookAround", - "type": "blendDirectional" + "id": "userAnimA", + "type": "clip" + }, + { + "children": [ + ], + "data": { + "endFrame": 300, + "loopFlag": true, + "startFrame": 1, + "timeScale": 1, + "url": "qrc:///avatar/animations/idle.fbx" + }, + "id": "userAnimB", + "type": "clip" } ], "data": { - "alpha": 0, - "alphaVar": "additiveBlendAlpha", - "blendType": "addAbsolute" + "currentState": "userAnimNone", + "states": [ + { + "easingType": "easeInOutQuad", + "id": "userAnimNone", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "userAnimA", + "var": "userAnimA" + }, + { + "state": "userAnimB", + "var": "userAnimB" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "userAnimA", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "userAnimNone", + "var": "userAnimNone" + }, + { + "state": "userAnimB", + "var": "userAnimB" + } + ] + }, + { + "easingType": "easeInOutQuad", + "id": "userAnimB", + "interpDuration": 15, + "interpTarget": 15, + "interpType": "evaluateBoth", + "transitions": [ + { + "state": "userAnimNone", + "var": "userAnimNone" + }, + { + "state": "userAnimA", + "var": "userAnimA" + } + ] + } + ] }, - "id": "additiveBlend", - "type": "blendLinear" + "id": "userAnimStateMachine", + "type": "stateMachine" + }, "version": "1.1" } \ No newline at end of file diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e48f669c17..f5ba1bfd32 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3604,7 +3604,8 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { // 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) { + CameraMode mode = _myCamera.getMode(); + if (mode == CAMERA_MODE_FIRST_PERSON) { _thirdPersonHMDCameraBoomValid= false; if (isHMDMode()) { mat4 camMat = myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix(); @@ -3615,11 +3616,8 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { _myCamera.setPosition(myAvatar->getDefaultEyePosition()); _myCamera.setOrientation(myAvatar->getMyHead()->getHeadOrientation()); } - } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON || - _myCamera.getMode() == CAMERA_MODE_LOOK_AT || - _myCamera.getMode() == CAMERA_MODE_SELFIE) { + } else if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_LOOK_AT || mode == CAMERA_MODE_SELFIE) { if (isHMDMode()) { - if (!_thirdPersonHMDCameraBoomValid) { const glm::vec3 CAMERA_OFFSET = glm::vec3(0.0f, 0.0f, 0.7f); _thirdPersonHMDCameraBoom = cancelOutRollAndPitch(myAvatar->getHMDSensorOrientation()) * CAMERA_OFFSET; @@ -3636,7 +3634,7 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { _myCamera.setPosition(extractTranslation(worldCameraMat)); } else { _thirdPersonHMDCameraBoomValid = false; - if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { + if (mode == CAMERA_MODE_THIRD_PERSON) { _myCamera.setOrientation(myAvatar->getHead()->getOrientation()); if (isOptionChecked(MenuOption::CenterPlayerInView)) { _myCamera.setPosition(myAvatar->getDefaultEyePosition() @@ -3647,7 +3645,7 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { } } else { glm::quat lookAtOffset = myAvatar->getLookAtOffset(); - if (_myCamera.getMode() == CAMERA_MODE_SELFIE) { + if (mode == CAMERA_MODE_SELFIE) { lookAtOffset = lookAtOffset * glm::angleAxis(PI, myAvatar->getWorldOrientation() * Vectors::UP); } _myCamera.setPosition(myAvatar->getDefaultEyePosition() @@ -3655,7 +3653,7 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { _myCamera.lookAt(myAvatar->getDefaultEyePosition()); } } - } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { + } else if (mode == CAMERA_MODE_MIRROR) { _thirdPersonHMDCameraBoomValid= false; if (isHMDMode()) { @@ -3693,7 +3691,7 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { glm::vec3(0.0f, 0.0f, -1.0f) * myAvatar->getBoomLength() * _scaleMirror); } renderArgs._renderMode = RenderArgs::MIRROR_RENDER_MODE; - } else if (_myCamera.getMode() == CAMERA_MODE_ENTITY) { + } else if (mode == CAMERA_MODE_ENTITY) { _thirdPersonHMDCameraBoomValid= false; EntityItemPointer cameraEntity = _myCamera.getCameraEntityPointer(); if (cameraEntity != nullptr) { @@ -4410,12 +4408,12 @@ void Application::keyPressEvent(QKeyEvent* event) { } case Qt::Key_2: { Menu* menu = Menu::getInstance(); - menu->triggerOption(MenuOption::SelfieScreen); + menu->triggerOption(MenuOption::SelfieCamera); break; } case Qt::Key_3: { Menu* menu = Menu::getInstance(); - menu->triggerOption(MenuOption::LookAtScreen); + menu->triggerOption(MenuOption::LookAtCamera); break; } case Qt::Key_4: @@ -5977,16 +5975,16 @@ void Application::cycleCamera() { } else if (menu->isOptionChecked(MenuOption::FirstPerson)) { menu->setIsOptionChecked(MenuOption::FirstPerson, false); - menu->setIsOptionChecked(MenuOption::LookAtScreen, true); + menu->setIsOptionChecked(MenuOption::LookAtCamera, true); - } else if (menu->isOptionChecked(MenuOption::LookAtScreen)) { + } else if (menu->isOptionChecked(MenuOption::LookAtCamera)) { - menu->setIsOptionChecked(MenuOption::LookAtScreen, false); - menu->setIsOptionChecked(MenuOption::SelfieScreen, true); + menu->setIsOptionChecked(MenuOption::LookAtCamera, false); + menu->setIsOptionChecked(MenuOption::SelfieCamera, true); - } else if (menu->isOptionChecked(MenuOption::SelfieScreen)) { + } else if (menu->isOptionChecked(MenuOption::SelfieCamera)) { - menu->setIsOptionChecked(MenuOption::SelfieScreen, false); + menu->setIsOptionChecked(MenuOption::SelfieCamera, false); menu->setIsOptionChecked(MenuOption::FullscreenMirror, true); } @@ -5999,10 +5997,10 @@ void Application::cameraModeChanged() { Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, true); break; case CAMERA_MODE_LOOK_AT: - Menu::getInstance()->setIsOptionChecked(MenuOption::LookAtScreen, true); + Menu::getInstance()->setIsOptionChecked(MenuOption::LookAtCamera, true); break; case CAMERA_MODE_SELFIE: - Menu::getInstance()->setIsOptionChecked(MenuOption::SelfieScreen, true); + Menu::getInstance()->setIsOptionChecked(MenuOption::SelfieCamera, true); break; default: // we don't have menu items for the others, so just leave it alone. @@ -6018,11 +6016,11 @@ void Application::changeViewAsNeeded(float boomLength) { if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON && boomLengthGreaterThanMinimum) { Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, false); - Menu::getInstance()->setIsOptionChecked(MenuOption::LookAtScreen, true); + Menu::getInstance()->setIsOptionChecked(MenuOption::LookAtCamera, true); cameraMenuChanged(); } else if (_myCamera.getMode() == CAMERA_MODE_LOOK_AT && !boomLengthGreaterThanMinimum) { Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, true); - Menu::getInstance()->setIsOptionChecked(MenuOption::LookAtScreen, false); + Menu::getInstance()->setIsOptionChecked(MenuOption::LookAtCamera, false); cameraMenuChanged(); } } @@ -6034,14 +6032,14 @@ void Application::cameraMenuChanged() { _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); getMyAvatar()->setBoomLength(MyAvatar::ZOOM_MIN); } - } else if (menu->isOptionChecked(MenuOption::LookAtScreen)) { + } else if (menu->isOptionChecked(MenuOption::LookAtCamera)) { if (_myCamera.getMode() != CAMERA_MODE_LOOK_AT) { _myCamera.setMode(CAMERA_MODE_LOOK_AT); if (getMyAvatar()->getBoomLength() == MyAvatar::ZOOM_MIN) { getMyAvatar()->setBoomLength(MyAvatar::ZOOM_DEFAULT); } } - } else if (menu->isOptionChecked(MenuOption::SelfieScreen)) { + } else if (menu->isOptionChecked(MenuOption::SelfieCamera)) { if (_myCamera.getMode() != CAMERA_MODE_SELFIE) { _myCamera.setMode(CAMERA_MODE_SELFIE); if (getMyAvatar()->getBoomLength() == MyAvatar::ZOOM_MIN) { @@ -9132,7 +9130,7 @@ void Application::setDisplayPlugin(DisplayPluginPointer newDisplayPlugin) { } // Remove the selfie camera options from menu if in HMD mode - auto selfieAction = menu->getActionForOption(MenuOption::SelfieScreen); + auto selfieAction = menu->getActionForOption(MenuOption::SelfieCamera); selfieAction->setVisible(!isHmd); } diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ea265a1fc9..046a1bd892 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -179,14 +179,14 @@ Menu::Menu() { // View > Look At auto lookAtAction = cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash( - viewMenu, MenuOption::LookAtScreen, 0, + viewMenu, MenuOption::LookAtCamera, 0, false, qApp, SLOT(cameraMenuChanged()))); lookAtAction->setProperty(EXCLUSION_GROUP_KEY, QVariant::fromValue(cameraModeGroup)); // View > Selfie auto selfieAction = cameraModeGroup->addAction(addCheckableActionToQMenuAndActionHash( - viewMenu, MenuOption::SelfieScreen, 0, + viewMenu, MenuOption::SelfieCamera, 0, false, qApp, SLOT(cameraMenuChanged()))); selfieAction->setProperty(EXCLUSION_GROUP_KEY, QVariant::fromValue(cameraModeGroup)); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 2291ea4fb8..098e635578 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -129,7 +129,7 @@ namespace MenuOption { const QString Login = "Login/Sign Up"; const QString Log = "Log"; const QString LogExtraTimings = "Log Extra Timing Details"; - const QString LookAtScreen = "Third Person"; + const QString LookAtCamera = "Third Person"; const QString LowVelocityFilter = "Low Velocity Filter"; const QString MeshVisible = "Draw Mesh"; const QString MuteEnvironment = "Mute Environment"; @@ -182,7 +182,7 @@ namespace MenuOption { const QString RunTimingTests = "Run Timing Tests"; const QString ScriptedMotorControl = "Enable Scripted Motor Control"; const QString ShowTrackedObjects = "Show Tracked Objects"; - const QString SelfieScreen = "Selfie"; + const QString SelfieCamera = "Selfie"; const QString SendWrongDSConnectVersion = "Send wrong DS connect version"; const QString SendWrongProtocolVersion = "Send wrong protocol version"; const QString SetHomeLocation = "Set Home Location"; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 610404fa78..f20495ef31 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -940,7 +940,8 @@ void MyAvatar::simulate(float deltaTime, bool inView) { head->setPosition(headPosition); head->setScale(getModelScale()); head->simulate(deltaTime); - if (_scriptControlsHeadLookAt || qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT || qApp->getCamera().getMode() == CAMERA_MODE_SELFIE) { + CameraMode mode = qApp->getCamera().getMode(); + if (_scriptControlsHeadLookAt || mode == CAMERA_MODE_LOOK_AT || mode == CAMERA_MODE_SELFIE) { updateHeadLookAt(deltaTime); } else if (_headLookAtActive){ resetHeadLookAt(); @@ -3333,8 +3334,8 @@ void MyAvatar::setRotationThreshold(float angleRadians) { void MyAvatar::updateOrientation(float deltaTime) { // Smoothly rotate body with arrow keys float targetSpeed = getDriveKey(YAW) * _yawSpeed; - bool computeLookAt = (qApp->getCamera().getMode() == CAMERA_MODE_LOOK_AT || - qApp->getCamera().getMode() == CAMERA_MODE_SELFIE) && isReadyForPhysics(); + CameraMode mode = qApp->getCamera().getMode(); + bool computeLookAt = (mode == CAMERA_MODE_LOOK_AT || mode == CAMERA_MODE_SELFIE) && isReadyForPhysics() && !qApp->isHMDMode(); if (computeLookAt) { // For "Look At" and "Selfie" camera modes we also smooth the yaw rotation from right-click mouse movement. float speedFromDeltaYaw = deltaTime > FLT_EPSILON ? getDriveKey(DELTA_YAW) / deltaTime : 0.0f; @@ -3425,9 +3426,8 @@ void MyAvatar::updateOrientation(float deltaTime) { if (totalBodyYaw != 0.0f) { _lookAtOffsetYaw = _lookAtOffsetYaw * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))); } - float deltalPitchSign = 1.0f;// qApp->getCamera().getMode() == CAMERA_MODE_SELFIE ? -1.0f : 1.0f; float pitchIncrement = getDriveKey(PITCH) * _pitchSpeed * deltaTime - + deltalPitchSign * getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT; + + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT; if (pitchIncrement != 0.0f) { glm::quat _previousLookAtOffsetPitch = _lookAtOffsetPitch; _lookAtOffsetPitch = _lookAtOffsetPitch * glm::quat(glm::radians(glm::vec3(pitchIncrement, 0.0f, 0.0f))); @@ -3535,14 +3535,13 @@ void MyAvatar::updateOrientation(float deltaTime) { cameraVector = glm::mix(cameraVector, ajustedYawVector, 1.0f - lookAttenuation); // Calculate the camera target point. - const float TARGET_DISTANCE_FROM_EYES = 20.0f; - glm::vec3 targetPoint = eyesPosition + TARGET_DISTANCE_FROM_EYES * glm::normalize(cameraVector); + glm::vec3 targetPoint = eyesPosition + glm::normalize(cameraVector); - // const float LOOKAT_MIX_ALPHA = 0.25f; + const float LOOKAT_MIX_ALPHA = 0.25f; if (getDriveKey(TRANSLATE_Y) == 0.0f) { // Approximate the head's look at vector to the camera look at vector with some delay. - float mixAlpha = (frontBackDot > 0.0f ? _backLookAtSpeed : _frontLookAtSpeed) * timeScale; + float mixAlpha = LOOKAT_MIX_ALPHA * timeScale; if (mixAlpha > 1.0f) { mixAlpha = 1.0f; } @@ -5276,7 +5275,7 @@ glm::quat MyAvatar::getOrientationForAudio() { switch (_audioListenerMode) { case AudioListenerMode::FROM_HEAD: { - // Compute the head orientation if we are using the look at blending + // Using the camera's orientation instead, when the current mode is controlling the avatar's head. CameraMode mode = qApp->getCamera().getMode(); bool headFollowsCamera = mode == CAMERA_MODE_LOOK_AT || mode == CAMERA_MODE_SELFIE; result = headFollowsCamera ? qApp->getCamera().getOrientation() : getHead()->getFinalOrientationInWorldFrame(); @@ -6311,36 +6310,6 @@ QVariantMap MyAvatar::getFlowData() { return result; } -QVariantMap MyAvatar::getLookAtCameraData() { - QVariantMap result; - if (QThread::currentThread() != thread()) { - BLOCKING_INVOKE_METHOD(this, "getLookAtCameraData", - Q_RETURN_ARG(QVariantMap, result)); - return result; - } - result.insert("selfieTriggerAngle", _selfieTriggerAngle); - result.insert("backLookAtSpeed", glm::pow(_backLookAtSpeed, 0.25f)); - result.insert("frontLookAtSpeed", glm::pow(_frontLookAtSpeed, 0.25f)); - return result; -} - -Q_INVOKABLE void MyAvatar::setLookAtCameraData(const QVariantMap& data) { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "setLookAtCameraData", - Q_ARG(const QVariantMap&, data)); - return; - } - if (data.contains("selfieTriggerAngle")) { - _selfieTriggerAngle = data["selfieTriggerAngle"].toFloat(); - } - if (data.contains("backLookAtSpeed")) { - _backLookAtSpeed = glm::pow(data["backLookAtSpeed"].toFloat(), 4.0f); - } - if (data.contains("frontLookAtSpeed")) { - _frontLookAtSpeed = glm::pow(data["frontLookAtSpeed"].toFloat(), 4.0f); - } -} - QVariantList MyAvatar::getCollidingFlowJoints() { QVariantList result; if (QThread::currentThread() != thread()) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 90a2c0887a..0a74f9a16d 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1852,8 +1852,6 @@ public: * @returns {MyAvatar.FlowData} */ Q_INVOKABLE QVariantMap getFlowData(); - Q_INVOKABLE QVariantMap getLookAtCameraData(); - Q_INVOKABLE void setLookAtCameraData(const QVariantMap& data); /**jsdoc * Gets the indexes of currently colliding flow joints. diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index a29a8ed98d..6dfcfc6994 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1644,7 +1644,7 @@ void Rig::updateHead(bool headEnabled, bool hipsEnabled, const AnimPose& headPos _animVars.set("splineIKEnabled", false); _animVars.unset("headPosition"); _animVars.set("headRotation", headPose.rot()); - _animVars.set("headType", (int)IKTarget::Type::RotationOnly); + _animVars.set("headType", (int)IKTarget::Type::Unknown); } } } From 5077089518588c48ef21a323dff8b13af6b31925 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 19 Sep 2019 11:15:53 -0700 Subject: [PATCH 24/29] BUGZ-1529: Iteration on JumpTo Field visuals/interaction states. NOTE - need to fix placeholder text swap --- .../simplifiedUI/simplifiedControls/TextField.qml | 15 +++++++++++++++ .../hifi/simplifiedUI/topBar/SimplifiedTopBar.qml | 9 +++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/interface/resources/qml/hifi/simplifiedUI/simplifiedControls/TextField.qml b/interface/resources/qml/hifi/simplifiedUI/simplifiedControls/TextField.qml index 1dd3a80a52..44f34c3356 100644 --- a/interface/resources/qml/hifi/simplifiedUI/simplifiedControls/TextField.qml +++ b/interface/resources/qml/hifi/simplifiedUI/simplifiedControls/TextField.qml @@ -24,6 +24,8 @@ TextField { property string rightGlyph: "" property alias bottomBorderVisible: bottomRectangle.visible property alias backgroundColor: textFieldBackground.color + property string unfocusedPlaceholderText + property bool blankPlaceholderTextOnFocus: true color: simplifiedUI.colors.text.white font.family: "Graphik Medium" @@ -47,6 +49,19 @@ TextField { } } + onFocusChanged: { + if (!root.blankPlaceholderTextOnFocus) { + return; + } + + if (focus) { + root.unfocusedPlaceholderText = root.placeholderText; + root.placeholderText = ""; + } else { + root.placeholderText = root.unfocusedPlaceholderText; + } + } + background: Rectangle { id: textFieldBackground color: Qt.rgba(0, 0, 0, 0); diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml b/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml index 5e82804cf6..f53a72bc00 100644 --- a/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml +++ b/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml @@ -372,12 +372,13 @@ Rectangle { readonly property string shortPlaceholderText: "Jump to..." readonly property string longPlaceholderText: "Type the name of a location to quickly jump there..." anchors.centerIn: parent - width: Math.min(parent.width, 600) - height: parent.height - 11 + width: Math.min(parent.width, 445) + height: 35 leftPadding: 8 rightPadding: 8 bottomBorderVisible: false - backgroundColor: "#313131" + backgroundColor: "#1D1D1D" + font.pixelSize: 14 placeholderText: width - leftPadding - rightPadding < goToTextFieldMetrics.width ? shortPlaceholderText : longPlaceholderText clip: true selectByMouse: true @@ -386,8 +387,8 @@ Rectangle { if (goToTextField.length > 0) { AddressManager.handleLookupString(goToTextField.text); goToTextField.text = ""; - parent.forceActiveFocus(); } + parent.forceActiveFocus(); } } } From 80414a6f1c3bd44f8915cdf39499b9f0718d6268 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 19 Sep 2019 11:17:39 -0700 Subject: [PATCH 25/29] DEV-613: Remove unnecessary audio injector logging --- libraries/audio/src/AudioInjector.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index c09dba6190..2df766377f 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -210,7 +210,6 @@ qint64 writeStringToStream(const QString& string, QDataStream& stream) { int64_t AudioInjector::injectNextFrame() { if (stateHas(AudioInjectorState::NetworkInjectionFinished)) { - qCDebug(audio) << "AudioInjector::injectNextFrame called but AudioInjector has finished and was not restarted. Returning."; return NEXT_FRAME_DELTA_ERROR_OR_FINISHED; } From 10352f1cb26f88ade382bb7b987675c8be4e61a1 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 19 Sep 2019 13:38:37 -0700 Subject: [PATCH 26/29] New placeholder text color --- .../resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml b/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml index f53a72bc00..427e45abba 100644 --- a/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml +++ b/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml @@ -378,6 +378,7 @@ Rectangle { rightPadding: 8 bottomBorderVisible: false backgroundColor: "#1D1D1D" + placeholderTextColor: "#8E8E8E" font.pixelSize: 14 placeholderText: width - leftPadding - rightPadding < goToTextFieldMetrics.width ? shortPlaceholderText : longPlaceholderText clip: true From 365aa1bf03d3baf06414988488e8be4d9dfd24c2 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 19 Sep 2019 17:30:01 -0700 Subject: [PATCH 27/29] Add jdoc to camera modes and fix variable namings --- interface/src/Application.cpp | 6 +++--- interface/src/avatar/MyAvatar.cpp | 30 +++++++++++++------------- interface/src/avatar/MyAvatar.h | 6 +++--- libraries/shared/src/shared/Camera.cpp | 12 +++++++++++ 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 02cbdb1849..ec313703b3 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3631,12 +3631,12 @@ void Application::updateCamera(RenderArgs& renderArgs, float deltaTime) { + myAvatar->getWorldOrientation() * boomOffset); } } else { - glm::quat lookAtOffset = myAvatar->getLookAtOffset(); + glm::quat lookAtRotation = myAvatar->getLookAtRotation(); if (mode == CAMERA_MODE_SELFIE) { - lookAtOffset = lookAtOffset * glm::angleAxis(PI, myAvatar->getWorldOrientation() * Vectors::UP); + lookAtRotation = lookAtRotation * glm::angleAxis(PI, myAvatar->getWorldOrientation() * Vectors::UP); } _myCamera.setPosition(myAvatar->getDefaultEyePosition() - + lookAtOffset * boomOffset); + + lookAtRotation * boomOffset); _myCamera.lookAt(myAvatar->getDefaultEyePosition()); } } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index dbd4644ef2..112685e891 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3513,23 +3513,23 @@ void MyAvatar::updateOrientation(float deltaTime) { if (!computeLookAt) { setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f)))); _lookAtCameraTarget = eyesPosition + getWorldOrientation() * Vectors::FRONT; - _lookAtOffsetYaw = getWorldOrientation(); - _lookAtOffsetPitch = Quaternions::IDENTITY; + _lookAtYaw = getWorldOrientation(); + _lookAtPitch = Quaternions::IDENTITY; } else { // Compute new look at vectors if (totalBodyYaw != 0.0f) { - _lookAtOffsetYaw = _lookAtOffsetYaw * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))); + _lookAtYaw = _lookAtYaw * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))); } float pitchIncrement = getDriveKey(PITCH) * _pitchSpeed * deltaTime + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT; if (pitchIncrement != 0.0f) { - glm::quat _previousLookAtOffsetPitch = _lookAtOffsetPitch; - _lookAtOffsetPitch = _lookAtOffsetPitch * glm::quat(glm::radians(glm::vec3(pitchIncrement, 0.0f, 0.0f))); + glm::quat _previousLookAtPitch = _lookAtPitch; + _lookAtPitch = _lookAtPitch * glm::quat(glm::radians(glm::vec3(pitchIncrement, 0.0f, 0.0f))); // Limit the camera horizontal pitch float MAX_LOOK_AT_PITCH_DEGREES = 80.0f; - float pitchFromHorizont = glm::degrees(angleBetween(getLookAtOffset() * Vectors::FRONT, _lookAtOffsetYaw * Vectors::FRONT)); - if (pitchFromHorizont > MAX_LOOK_AT_PITCH_DEGREES || pitchFromHorizont < -MAX_LOOK_AT_PITCH_DEGREES) { - _lookAtOffsetPitch = _previousLookAtOffsetPitch; + float pitchFromHorizont = glm::degrees(angleBetween(getLookAtRotation() * Vectors::FRONT, _lookAtYaw * Vectors::FRONT)); + if (pitchFromHorizont > MAX_LOOK_AT_PITCH_DEGREES) { + _lookAtPitch = _previousLookAtPitch; } } bool isMovingFwdBwd = getDriveKey(TRANSLATE_Z) != 0.0f; @@ -3545,13 +3545,13 @@ void MyAvatar::updateOrientation(float deltaTime) { if (blend > 1.0f) { blend = 1.0f; } - glm::quat faceRotation = _lookAtOffsetYaw; + glm::quat faceRotation = _lookAtYaw; if (isMovingFwdBwd && isMovingSideways) { // Reorient avatar to face camera diagonal blend = DIAGONAL_TURN_BLEND; float turnSign = getDriveKey(TRANSLATE_Z) < 0.0f ? -1.0f : 1.0f; turnSign = getDriveKey(TRANSLATE_X) > 0.0f ? -turnSign : turnSign; - faceRotation = _lookAtOffsetYaw * glm::angleAxis(turnSign * 0.25f * PI, Vectors::UP); + faceRotation = _lookAtYaw * glm::angleAxis(turnSign * 0.25f * PI, Vectors::UP); } setWorldOrientation(glm::slerp(getWorldOrientation(), faceRotation, blend)); } else if (isRotatingWhileSeated) { @@ -3585,8 +3585,8 @@ void MyAvatar::updateOrientation(float deltaTime) { head->setBasePitch(0.0f); head->setBaseRoll(0.0f); - glm::vec3 cameraVector = (faceForward ? _lookAtOffsetPitch * getWorldOrientation() : getLookAtOffset()) * Vectors::FRONT; - glm::vec3 cameraYawVector = _lookAtOffsetYaw * Vectors::FRONT; + glm::vec3 cameraVector = (faceForward ? _lookAtPitch * getWorldOrientation() : getLookAtRotation()) * Vectors::FRONT; + glm::vec3 cameraYawVector = _lookAtYaw * Vectors::FRONT; // Cap and attenuate head's lookat pitch angle const float START_LOOKING_UP_DEGREES = 5.0f; @@ -3608,17 +3608,17 @@ void MyAvatar::updateOrientation(float deltaTime) { } } glm::vec3 avatarVectorFront = getWorldOrientation() * Vectors::FRONT; - float frontBackDot = glm::dot(cameraVector, avatarVectorFront); + float frontBackDot = glm::dot(cameraYawVector, avatarVectorFront); glm::vec3 avatarVectorRight = getWorldOrientation() * Vectors::RIGHT; - float leftRightDot = glm::dot(cameraVector, avatarVectorRight); + float leftRightDot = glm::dot(cameraYawVector, avatarVectorRight); const float REORIENT_ANGLE = 65.0f; const float TRIGGER_REORIENT_ANGLE = 45.0f; glm::vec3 ajustedYawVector = cameraYawVector; if (frontBackDot < 0.0f) { ajustedYawVector = (leftRightDot < 0.0f ? -avatarVectorRight : avatarVectorRight); - cameraVector = (ajustedYawVector * _lookAtOffsetPitch) * Vectors::FRONT; + cameraVector = (ajustedYawVector * _lookAtPitch) * Vectors::FRONT; if (frontBackDot < -glm::sin(glm::radians(TRIGGER_REORIENT_ANGLE))) { _shouldTurnToFaceCamera = true; } diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 0adb0f5bf7..ea3bb3df4e 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1763,7 +1763,7 @@ public: */ Q_INVOKABLE glm::vec3 getHeadLookAt() { return _lookAtCameraTarget; } - glm::quat getLookAtOffset() { return _lookAtOffsetYaw * _lookAtOffsetPitch; } + glm::quat getLookAtRotation() { return _lookAtYaw * _lookAtPitch; } /**jsdoc * Creates a new grab that grabs an entity. @@ -2643,8 +2643,8 @@ private: glm::vec3 _trackedHeadPosition; const float MAX_LOOK_AT_TIME_SCRIPT_CONTROL = 2.0f; - glm::quat _lookAtOffsetPitch; - glm::quat _lookAtOffsetYaw; + glm::quat _lookAtPitch; + glm::quat _lookAtYaw; glm::vec3 _lookAtCameraTarget; glm::vec3 _lookAtScriptTarget; bool _headLookAtActive { false }; diff --git a/libraries/shared/src/shared/Camera.cpp b/libraries/shared/src/shared/Camera.cpp index c87b30b499..b39b8b9169 100644 --- a/libraries/shared/src/shared/Camera.cpp +++ b/libraries/shared/src/shared/Camera.cpp @@ -35,6 +35,18 @@ * your avatar. * * + * Look At + * "look at" + * The camera is positioned behind your avatar. The camera moves and rotates independently from your avatar. + * The avatar's head always faces the camera look at point. + * + * + * Selfie + * "selfie" + * The camera is positioned in front of your avatar. The camera moves and rotates independently from your avatar. + * Your avatar's head is always facing the camera. + * + * * Mirror * "mirror" * The camera is positioned such that you are looking directly at your avatar. The camera moves and rotates with your From fe2a4c3600682e5ace881fabdf22c9243e0a4122 Mon Sep 17 00:00:00 2001 From: dante ruiz Date: Thu, 19 Sep 2019 18:20:08 -0700 Subject: [PATCH 28/29] fix fix-snap-html-issue --- .../hifi/tablet/TabletGeneralPreferences.qml | 5 ++ .../resources/qml/hifi/tablet/TabletRoot.qml | 6 +- .../tabletWindows/TabletPreferencesDialog.qml | 5 +- .../ui/src/ui/TabletScriptingInterface.cpp | 74 +++++++++++++------ .../ui/src/ui/TabletScriptingInterface.h | 16 ++++ scripts/system/snapshot.js | 11 ++- 6 files changed, 91 insertions(+), 26 deletions(-) diff --git a/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml b/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml index 254e4203ce..1d15fe8b23 100644 --- a/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml +++ b/interface/resources/qml/hifi/tablet/TabletGeneralPreferences.qml @@ -19,6 +19,7 @@ StackView { objectName: "stack" property string title: "General Settings" property alias gotoPreviousApp: root.gotoPreviousApp; + property alias gotoPreviousAppFromScript: root.gotoPreviousAppFromScript; signal sendToScript(var message); function pushSource(path) { @@ -30,6 +31,10 @@ StackView { profileRoot.pop(); } + function emitSendToScript(message) { + profileRoot.sendToScript(message); + } + TabletPreferencesDialog { id: root objectName: "TabletGeneralPreferences" diff --git a/interface/resources/qml/hifi/tablet/TabletRoot.qml b/interface/resources/qml/hifi/tablet/TabletRoot.qml index 5559c36fd1..6001497743 100644 --- a/interface/resources/qml/hifi/tablet/TabletRoot.qml +++ b/interface/resources/qml/hifi/tablet/TabletRoot.qml @@ -104,6 +104,10 @@ Rectangle { if (loader.item.hasOwnProperty("gotoPreviousApp")) { loader.item.gotoPreviousApp = true; } + + if (loader.item.hasOwnProperty("gotoPreviousAppFromScript")) { + loader.item.gotoPreviousAppFromScript = true; + } }); } } @@ -276,7 +280,7 @@ Rectangle { } else { console.log("newSource is of unknown type!"); } - + screenChanged(type, newSource); }); } diff --git a/interface/resources/qml/hifi/tablet/tabletWindows/TabletPreferencesDialog.qml b/interface/resources/qml/hifi/tablet/tabletWindows/TabletPreferencesDialog.qml index c6b4fce14e..8e8a262107 100644 --- a/interface/resources/qml/hifi/tablet/tabletWindows/TabletPreferencesDialog.qml +++ b/interface/resources/qml/hifi/tablet/tabletWindows/TabletPreferencesDialog.qml @@ -30,6 +30,7 @@ Item { property bool keyboardRaised: false property bool punctuationMode: false property bool gotoPreviousApp: false + property bool gotoPreviousAppFromScript: false property var tablet; @@ -72,7 +73,9 @@ Item { function closeDialog() { var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); - if (gotoPreviousApp) { + if (gotoPreviousAppFromScript) { + dialog.parent.sendToScript("returnToPreviousApp"); + } else if (gotoPreviousApp) { tablet.returnToPreviousApp(); } else { tablet.gotoHomeScreen(); diff --git a/libraries/ui/src/ui/TabletScriptingInterface.cpp b/libraries/ui/src/ui/TabletScriptingInterface.cpp index 3465138e00..75b08ba44f 100644 --- a/libraries/ui/src/ui/TabletScriptingInterface.cpp +++ b/libraries/ui/src/ui/TabletScriptingInterface.cpp @@ -592,12 +592,51 @@ void TabletProxy::gotoMenuScreen(const QString& submenu) { } } -void TabletProxy::loadQMLOnTop(const QVariant& path) { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "loadQMLOnTop", Q_ARG(QVariant, path)); +void TabletProxy::loadQMLOnTopImpl(const QVariant& path, bool localSafeContext) { + if (QThread::currentThread() != thread()) { + qCWarning(uiLogging) << __FUNCTION__ << "may not be called directly by scripts"; return; } + QObject* root = nullptr; + if (!_toolbarMode && _qmlTabletRoot) { + root = _qmlTabletRoot; + } else if (_toolbarMode && _desktopWindow) { + root = _desktopWindow->asQuickItem(); + } + + if (root) { + if (localSafeContext) { + hifi::scripting::setLocalAccessSafeThread(true); + } + QMetaObject::invokeMethod(root, "loadQMLOnTop", Q_ARG(const QVariant&, path)); + QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true))); + if (_toolbarMode && _desktopWindow) { + QMetaObject::invokeMethod(root, "setResizable", Q_ARG(const QVariant&, QVariant(false))); + } + hifi::scripting::setLocalAccessSafeThread(false); + } else { + qCDebug(uiLogging) << "tablet cannot load QML because _qmlTabletRoot is null"; + } +} + +void TabletProxy::loadQMLOnTop(const QVariant& path) { + bool localSafeContext = hifi::scripting::isLocalAccessSafeThread(); + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "loadQMLOnTopImpl", Q_ARG(QVariant, path), Q_ARG(bool, localSafeContext)); + return; + } + + loadQMLOnTopImpl(path, localSafeContext); +} + +void TabletProxy::returnToPreviousAppImpl(bool localSafeContext) { + if (QThread::currentThread() != thread()) { + qCWarning(uiLogging) << __FUNCTION__ << "may not be called directly by scripts"; + return; + + } + QObject* root = nullptr; if (!_toolbarMode && _qmlTabletRoot) { root = _qmlTabletRoot; @@ -606,35 +645,26 @@ void TabletProxy::loadQMLOnTop(const QVariant& path) { } if (root) { - QMetaObject::invokeMethod(root, "loadQMLOnTop", Q_ARG(const QVariant&, path)); - QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true))); - if (_toolbarMode && _desktopWindow) { - QMetaObject::invokeMethod(root, "setResizable", Q_ARG(const QVariant&, QVariant(false))); + if (localSafeContext) { + hifi::scripting::setLocalAccessSafeThread(true); } + QMetaObject::invokeMethod(root, "returnToPreviousApp"); + QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true))); + hifi::scripting::setLocalAccessSafeThread(false); } else { qCDebug(uiLogging) << "tablet cannot load QML because _qmlTabletRoot is null"; } } void TabletProxy::returnToPreviousApp() { + bool localSafeContext = hifi::scripting::isLocalAccessSafeThread(); + qDebug() << "TabletProxy::returnToPreviousApp -> localSafeContext: " << localSafeContext; if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "returnToPreviousApp"); + QMetaObject::invokeMethod(this, "returnToPreviousAppImpl", Q_ARG(bool, localSafeContext)); return; } - QObject* root = nullptr; - if (!_toolbarMode && _qmlTabletRoot) { - root = _qmlTabletRoot; - } else if (_toolbarMode && _desktopWindow) { - root = _desktopWindow->asQuickItem(); - } - - if (root) { - QMetaObject::invokeMethod(root, "returnToPreviousApp"); - QMetaObject::invokeMethod(root, "setShown", Q_ARG(const QVariant&, QVariant(true))); - } else { - qCDebug(uiLogging) << "tablet cannot load QML because _qmlTabletRoot is null"; - } + returnToPreviousAppImpl(localSafeContext); } void TabletProxy::loadQMLSource(const QVariant& path, bool resizable) { @@ -940,8 +970,6 @@ void TabletProxy::sendToQml(const QVariant& msg) { } } - - OffscreenQmlSurface* TabletProxy::getTabletSurface() { if (QThread::currentThread() != thread()) { OffscreenQmlSurface* result = nullptr; diff --git a/libraries/ui/src/ui/TabletScriptingInterface.h b/libraries/ui/src/ui/TabletScriptingInterface.h index 9a5ff9efac..bae5eda29e 100644 --- a/libraries/ui/src/ui/TabletScriptingInterface.h +++ b/libraries/ui/src/ui/TabletScriptingInterface.h @@ -298,10 +298,26 @@ public: */ Q_INVOKABLE void loadQMLSourceImpl(const QVariant& path, bool resizable, bool localSafeContext); + /**jsdoc + * Internal function, do not call from scripts + * @function TabletProxy#loadHTMLSourceImpl + */ Q_INVOKABLE void loadHTMLSourceImpl(const QVariant& url, const QString& injectJavaScriptUrl, bool localSafeContext); + /**jsdoc + * Internal function, do not call from scripts + * @function TabletProxy#loadHTMLSourceImpl + */ Q_INVOKABLE void loadHTMLSourceImpl(const QString& url, const QString& injectedJavaScriptUrl, bool loadOtherBase, bool localSafeContext); + /**jsdoc + * Internal function, do not call from scripts + * @function TabletProxy#returnToPreviousAppImpl + */ + Q_INVOKABLE void returnToPreviousAppImpl(bool localSafeContext); + + Q_INVOKABLE void loadQMLOnTopImpl(const QVariant& path, bool localSafeContext); + // FIXME: This currently relies on a script initializing the tablet (hence the bool denoting success); // it should be initialized internally so it cannot fail diff --git a/scripts/system/snapshot.js b/scripts/system/snapshot.js index 946de6df0f..a37fb13bd9 100644 --- a/scripts/system/snapshot.js +++ b/scripts/system/snapshot.js @@ -65,6 +65,7 @@ function onMessage(message) { // 2. Although we currently use a single image, we would like to take snapshot, a selfie, a 360 etc. all at the // same time, show the user all of them, and have the user deselect any that they do not want to share. // So we'll ultimately be receiving a set of objects, perhaps with different post processing for each. + if (message.type !== "snapshot") { return; } @@ -85,7 +86,7 @@ function onMessage(message) { image_data: imageData, canShare: canShare }); - }); + }); } else { ui.sendMessage({ type: "snapshot", @@ -274,6 +275,14 @@ var POLAROID_MODEL_URL = 'http://hifi-content.s3.amazonaws.com/alan/dev/Test/sna var POLAROID_RATE_LIMIT_MS = 1000; var polaroidPrintingIsRateLimited = false; +// force call the gotoPreviousApp on script thead to load snapshot html page. +var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); +tablet.fromQml.connect(function(message) { + if (message === 'returnToPreviousApp') { + tablet.returnToPreviousApp(); + } +}); + function printToPolaroid(image_url) { // Rate-limit printing if (polaroidPrintingIsRateLimited) { From f979c4e1abad1a25a80d5115b5eb7e172cc1a909 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Fri, 20 Sep 2019 09:51:51 -0700 Subject: [PATCH 29/29] Add more info to jdocs --- interface/src/avatar/MyAvatar.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index ea3bb3df4e..a6c53c1c0b 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1750,14 +1750,16 @@ public: void prepareAvatarEntityDataForReload(); /**jsdoc - * Turn the avatar's head until it faces the target point within the 90/-90 degrees range. + * Turn the avatar's head until it faces the target point within the 90/-90 degree range. + * Once this method is called, API calls will have full control of the head for a limited time. + * If this method is not called for two seconds, the engine will regain control of the head. * @function MyAvatar.setHeadLookAt - * @param {Vec3} lookAtTarget - The target 3D point. + * @param {Vec3} lookAtTarget - The target point in world coordinates. */ Q_INVOKABLE void setHeadLookAt(const glm::vec3& lookAtTarget); /**jsdoc - * Returns the current head look at target point in world coordenates. + * Returns the current head look at target point in world coordinates. * @function MyAvatar.getHeadLookAt * @returns {Vec3} Default position between your avatar's eyes in world coordinates. */