From ff8f2c5c16277c3029559f865376b413c1c0f9b9 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 5 Sep 2019 16:36:14 -0700 Subject: [PATCH 01/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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/21] 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 481917ae8a8814231cb5dd9d437aa06fb73b1437 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 16 Sep 2019 18:26:19 -0700 Subject: [PATCH 15/21] 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 16/21] 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 17/21] 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 fc223e4cb6fdfeaab0e6cab033f2f94ee89c6b35 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 18 Sep 2019 17:15:25 -0700 Subject: [PATCH 18/21] 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 6d98537a201912a886de3edc5edce6a90e8f7e6d Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 19 Sep 2019 10:45:20 -0700 Subject: [PATCH 19/21] 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 365aa1bf03d3baf06414988488e8be4d9dfd24c2 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 19 Sep 2019 17:30:01 -0700 Subject: [PATCH 20/21] 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 f979c4e1abad1a25a80d5115b5eb7e172cc1a909 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Fri, 20 Sep 2019 09:51:51 -0700 Subject: [PATCH 21/21] 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. */