diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 2cad2ca722..ad68b07bb1 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -399,6 +399,7 @@ void Agent::executeScript() { } // these procedural movements are included in the recordings + scriptedAvatar->setHasScriptedBlendshapes(true); scriptedAvatar->setHasProceduralEyeFaceMovement(false); scriptedAvatar->setHasProceduralBlinkFaceMovement(false); scriptedAvatar->setHasAudioEnabledFaceMovement(false); @@ -406,6 +407,7 @@ void Agent::executeScript() { scriptedAvatar->clearRecordingBasis(); // restore procedural blendshape movement + scriptedAvatar->setHasScriptedBlendshapes(false); scriptedAvatar->setHasProceduralEyeFaceMovement(true); scriptedAvatar->setHasProceduralBlinkFaceMovement(true); scriptedAvatar->setHasAudioEnabledFaceMovement(true); diff --git a/cmake/init.cmake b/cmake/init.cmake index 3f632b30f8..aac350ce0b 100644 --- a/cmake/init.cmake +++ b/cmake/init.cmake @@ -58,3 +58,7 @@ if (ANDROID) list(APPEND EXTERNAL_ARGS -DANDROID_TOOLCHAIN=${ANDROID_TOOLCHAIN}) list(APPEND EXTERNAL_ARGS -DANDROID_STL=${ANDROID_STL}) endif () + +if (APPLE) + set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--deep") +endif() \ No newline at end of file diff --git a/interface/resources/avatar/animations/sitting_idle04.fbx b/interface/resources/avatar/animations/sitting_idle04.fbx index 7012481b2a..7967627daf 100644 Binary files a/interface/resources/avatar/animations/sitting_idle04.fbx and b/interface/resources/avatar/animations/sitting_idle04.fbx differ diff --git a/interface/resources/avatar/animations/sitting_idle05.fbx b/interface/resources/avatar/animations/sitting_idle05.fbx index 1b89d26f15..bef1e3f73b 100644 Binary files a/interface/resources/avatar/animations/sitting_idle05.fbx and b/interface/resources/avatar/animations/sitting_idle05.fbx differ diff --git a/interface/resources/avatar/animations/sitting_idle_once_leanforward.fbx b/interface/resources/avatar/animations/sitting_idle_once_leanforward.fbx index 75a4603335..66be22f4c4 100644 Binary files a/interface/resources/avatar/animations/sitting_idle_once_leanforward.fbx and b/interface/resources/avatar/animations/sitting_idle_once_leanforward.fbx differ diff --git a/interface/resources/avatar/animations/sitting_idle_once_lookfidget.fbx b/interface/resources/avatar/animations/sitting_idle_once_lookfidget.fbx index b3ab378c26..ce0f4861cc 100644 Binary files a/interface/resources/avatar/animations/sitting_idle_once_lookfidget.fbx and b/interface/resources/avatar/animations/sitting_idle_once_lookfidget.fbx differ diff --git a/interface/resources/avatar/animations/sitting_idle_once_shakelegs.fbx b/interface/resources/avatar/animations/sitting_idle_once_shakelegs.fbx index a020e20044..2a6db1cf3f 100644 Binary files a/interface/resources/avatar/animations/sitting_idle_once_shakelegs.fbx and b/interface/resources/avatar/animations/sitting_idle_once_shakelegs.fbx differ diff --git a/interface/resources/avatar/animations/sitting_idle_once_shiftweight.fbx b/interface/resources/avatar/animations/sitting_idle_once_shiftweight.fbx index 90d2bd220b..9016403b96 100644 Binary files a/interface/resources/avatar/animations/sitting_idle_once_shiftweight.fbx and b/interface/resources/avatar/animations/sitting_idle_once_shiftweight.fbx differ diff --git a/interface/resources/controllers/standard.json b/interface/resources/controllers/standard.json index b6cb4e3e27..aa995c6ecb 100644 --- a/interface/resources/controllers/standard.json +++ b/interface/resources/controllers/standard.json @@ -201,8 +201,6 @@ { "from": "Standard.LipsStretch_R", "to": "Actions.LipsStretch_R" }, { "from": "Standard.LipsUpperClose", "to": "Actions.LipsUpperClose" }, { "from": "Standard.LipsLowerClose", "to": "Actions.LipsLowerClose" }, - { "from": "Standard.LipsUpperOpen", "to": "Actions.LipsUpperOpen" }, - { "from": "Standard.LipsLowerOpen", "to": "Actions.LipsLowerOpen" }, { "from": "Standard.LipsFunnel", "to": "Actions.LipsFunnel" }, { "from": "Standard.LipsPucker", "to": "Actions.LipsPucker" }, { "from": "Standard.Puff", "to": "Actions.Puff" }, diff --git a/interface/resources/controllers/standard_nomovement.json b/interface/resources/controllers/standard_nomovement.json index 04c0d2f329..9e1437d2e8 100644 --- a/interface/resources/controllers/standard_nomovement.json +++ b/interface/resources/controllers/standard_nomovement.json @@ -96,8 +96,6 @@ { "from": "Standard.LipsStretch_R", "to": "Actions.LipsStretch_R" }, { "from": "Standard.LipsUpperClose", "to": "Actions.LipsUpperClose" }, { "from": "Standard.LipsLowerClose", "to": "Actions.LipsLowerClose" }, - { "from": "Standard.LipsUpperOpen", "to": "Actions.LipsUpperOpen" }, - { "from": "Standard.LipsLowerOpen", "to": "Actions.LipsLowerOpen" }, { "from": "Standard.LipsFunnel", "to": "Actions.LipsFunnel" }, { "from": "Standard.LipsPucker", "to": "Actions.LipsPucker" }, { "from": "Standard.Puff", "to": "Actions.Puff" }, diff --git a/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml b/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml index 7dbadc59f4..5ca2227dfb 100644 --- a/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml +++ b/interface/resources/qml/hifi/simplifiedUI/avatarApp/AvatarApp.qml @@ -106,33 +106,6 @@ Rectangle { } } - Image { - id: homeButton - source: "images/homeIcon.svg" - opacity: homeButtonMouseArea.containsMouse ? 1.0 : 0.7 - anchors.top: parent.top - anchors.topMargin: 15 - anchors.right: parent.right - anchors.rightMargin: 24 - width: 14 - height: 13 - - MouseArea { - id: homeButtonMouseArea - anchors.fill: parent - hoverEnabled: true - onEntered: { - Tablet.playSound(TabletEnums.ButtonHover); - } - onClicked: { - Tablet.playSound(TabletEnums.ButtonClick); - // Can't use `Window.location` in QML, so just use what setting `Window.location` actually calls under the hood: - // AddressManager.handleLookupString(). - AddressManager.handleLookupString(LocationBookmarks.getAddress("hqhome")); - } - } - } - AvatarAppComponents.DisplayNameHeader { id: displayNameHeader previewUrl: root.avatarPreviewUrl diff --git a/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml b/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml index 812971dc3a..778c626048 100644 --- a/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml +++ b/interface/resources/qml/hifi/simplifiedUI/topBar/SimplifiedTopBar.qml @@ -288,6 +288,7 @@ Rectangle { Item { id: outputDeviceButtonContainer + visible: false // An experiment. Will you notice? anchors.verticalCenter: parent.verticalCenter anchors.left: inputDeviceButton.right anchors.leftMargin: 7 @@ -343,6 +344,7 @@ Rectangle { Item { id: statusButtonContainer + visible: false // An experiment. Will you notice? anchors.verticalCenter: parent.verticalCenter anchors.left: outputDeviceButtonContainer.right anchors.leftMargin: 8 diff --git a/interface/src/AvatarBookmarks.cpp b/interface/src/AvatarBookmarks.cpp index 2ebe769bec..6f6a93ff19 100644 --- a/interface/src/AvatarBookmarks.cpp +++ b/interface/src/AvatarBookmarks.cpp @@ -232,12 +232,6 @@ void AvatarBookmarks::loadBookmark(const QString& bookmarkName) { emit bookmarkLoaded(bookmarkName); }); - std::shared_ptr connection2 = std::make_shared(); - *connection2 = connect(myAvatar.get(), &MyAvatar::onLoadFailed, [this, bookmarkName, connection2]() { - qCDebug(interfaceapp) << "Failed to load avatar bookmark" << bookmarkName; - QObject::disconnect(*connection2); - }); - qCDebug(interfaceapp) << "Start loading avatar bookmark" << bookmarkName; const QString& avatarUrl = bookmark.value(ENTRY_AVATAR_URL, "").toString(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 48f218b817..5ecce1456f 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -3452,7 +3452,7 @@ void MyAvatar::updateOrientation(float deltaTime) { bool isCameraYawing = getDriveKey(DELTA_YAW) + getDriveKey(STEP_YAW) + getDriveKey(YAW) != 0.0f; bool isRotatingWhileSeated = !isCameraYawing && isMovingSideways && _characterController.getSeated(); glm::quat previousOrientation = getWorldOrientation(); - + glm::quat previousYaw = _lookAtYaw; if (!computeLookAt) { setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f)))); _lookAtCameraTarget = eyesPosition + getWorldOrientation() * Vectors::FRONT; @@ -3462,6 +3462,7 @@ void MyAvatar::updateOrientation(float deltaTime) { // Compute new look at vectors if (totalBodyYaw != 0.0f) { _lookAtYaw = _lookAtYaw * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))); + _lookAtYawSpeed = glm::degrees(glm::angle(_lookAtYaw * glm::inverse(previousYaw))) / deltaTime; } float pitchIncrement = getDriveKey(PITCH) * _pitchSpeed * deltaTime + getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT; @@ -3482,7 +3483,19 @@ void MyAvatar::updateOrientation(float deltaTime) { const float REORIENT_FORWARD_BLEND = 0.25f; const float REORIENT_TURN_BLEND = 0.03f; const float DIAGONAL_TURN_BLEND = 0.1f; + const float AVATAR_TURNS_TO_CAM_IN_SPEED = 130.0f; // Degrees per second + const float AVATAR_TURNS_TO_CAM_OUT_SPEED = 720.0f; // Degrees per second + float blend = (_shouldTurnToFaceCamera ? REORIENT_TURN_BLEND : REORIENT_FORWARD_BLEND) * timeScale; + if (mode == CAMERA_MODE_FIRST_PERSON_LOOK_AT && _lookAtYawSpeed > AVATAR_TURNS_TO_CAM_IN_SPEED) { + // When the camera is rotating fast we should accelerate the avatar's face forward speed + // to avoid showing the cauterized head; + float cameraYawSpeed = glm::min(_lookAtYawSpeed, AVATAR_TURNS_TO_CAM_OUT_SPEED); + float blendFactor = REORIENT_TURN_BLEND + REORIENT_FORWARD_BLEND * ((cameraYawSpeed - AVATAR_TURNS_TO_CAM_IN_SPEED) / + (AVATAR_TURNS_TO_CAM_OUT_SPEED - AVATAR_TURNS_TO_CAM_IN_SPEED)); + blend = glm::min(1.0f, blendFactor * timeScale); + } + if (blend > 1.0f) { blend = 1.0f; } @@ -3573,7 +3586,6 @@ void MyAvatar::updateOrientation(float deltaTime) { if (frontBackDot < limitAngle) { if (frontBackDot < 0.0f) { ajustedYawVector = (leftRightDot < 0.0f ? -avatarVectorRight : avatarVectorRight); - cameraVector = (ajustedYawVector * _lookAtPitch) * Vectors::FRONT; } if (!isRotatingWhileSeated) { if (frontBackDot < triggerAngle) { @@ -6762,19 +6774,18 @@ glm::vec3 MyAvatar::getLookAtPivotPoint() { glm::vec3 MyAvatar::getCameraEyesPosition(float deltaTime) { glm::vec3 defaultEyesPosition = getLookAtPivotPoint(); - if (isFlying()) { - return defaultEyesPosition; - } + glm::vec3 avatarFrontVector = getWorldOrientation() * Vectors::FRONT; glm::vec3 avatarUpVector = getWorldOrientation() * Vectors::UP; // Compute the offset between the default and real eye positions. glm::vec3 defaultEyesToEyesVector = getHead()->getEyePosition() - defaultEyesPosition; - float FRONT_OFFSET_IDLE_MULTIPLIER = 2.5f; - float FRONT_OFFSET_JUMP_MULTIPLIER = 1.5f; + const float FRONT_OFFSET_IDLE_MULTIPLIER = 3.5f; + const float FRONT_OFFSET_JUMP_MULTIPLIER = 1.5f; float frontOffset = FRONT_OFFSET_IDLE_MULTIPLIER * glm::length(defaultEyesPosition - getDefaultEyePosition()); - - // Looking down will aproximate move the camera forward to meet the real eye position + + // Looking down will move the camera forward to meet the real eye position float mixAlpha = glm::dot(_lookAtPitch * Vectors::FRONT, -avatarUpVector); + bool isLanding = false; // When jumping the camera should follow the real eye on the Y coordenate float upOffset = 0.0f; diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 4d0dea61c1..5a59e6129a 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -2693,6 +2693,7 @@ private: const float MAX_LOOK_AT_TIME_SCRIPT_CONTROL = 2.0f; glm::quat _lookAtPitch; glm::quat _lookAtYaw; + float _lookAtYawSpeed { 0.0f }; glm::vec3 _lookAtCameraTarget; glm::vec3 _lookAtScriptTarget; bool _headLookAtActive { false }; diff --git a/interface/src/avatar/MyHead.cpp b/interface/src/avatar/MyHead.cpp index a0e70a3049..1b88a518c8 100644 --- a/interface/src/avatar/MyHead.cpp +++ b/interface/src/avatar/MyHead.cpp @@ -57,8 +57,6 @@ static controller::Action blendshapeActions[] = { controller::Action::LIPSSTRETCH_R, controller::Action::LIPSUPPERCLOSE, controller::Action::LIPSLOWERCLOSE, - controller::Action::LIPSUPPEROPEN, - controller::Action::LIPSLOWEROPEN, controller::Action::LIPSFUNNEL, controller::Action::LIPSPUCKER, controller::Action::PUFF, diff --git a/interface/src/scripting/AudioDevices.cpp b/interface/src/scripting/AudioDevices.cpp index 688b4df8cd..500cedcb09 100644 --- a/interface/src/scripting/AudioDevices.cpp +++ b/interface/src/scripting/AudioDevices.cpp @@ -287,18 +287,19 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QListinfo.deviceName() == device.info.deviceName()) { - isNewDevice = false; - break; - } - } - - if (isNewDevice) { - emit selectedDevicePlugged(device.info, isHMD); - } } } @@ -403,6 +387,14 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QListgetActiveAudioDevice(QAudio::AudioInput), contextIsHMD); - _outputs.onDeviceChanged(client->getActiveAudioDevice(QAudio::AudioOutput), contextIsHMD); - - // connections are made after client is initialized, so we must also fetch the devices - const QList& devicesInput = client->getAudioDevices(QAudio::AudioInput); - const QList& devicesOutput = client->getAudioDevices(QAudio::AudioOutput); - - if (devicesInput.size() > 0 && devicesOutput.size() > 0) { - //setup devices - _inputs.onDevicesChanged(QAudio::AudioInput, devicesInput); - _outputs.onDevicesChanged(QAudio::AudioOutput, devicesOutput); - } } AudioDevices::~AudioDevices() {} @@ -526,29 +505,12 @@ void AudioDevices::onDevicesChanged(QAudio::Mode mode, const QList().data(); - _inputs._hmdSavedDeviceName = getTargetDevice(true, QAudio::AudioInput); _inputs._desktopSavedDeviceName = getTargetDevice(false, QAudio::AudioInput); - //fallback to default device - if (_inputs._desktopSavedDeviceName.isEmpty()) { - _inputs._desktopSavedDeviceName = client->getActiveAudioDevice(QAudio::AudioInput).deviceName(); - } - //fallback to desktop device - if (_inputs._hmdSavedDeviceName.isEmpty()) { - _inputs._hmdSavedDeviceName = _inputs._desktopSavedDeviceName; - } - _outputs._hmdSavedDeviceName = getTargetDevice(true, QAudio::AudioOutput); _outputs._desktopSavedDeviceName = getTargetDevice(false, QAudio::AudioOutput); - if (_outputs._desktopSavedDeviceName.isEmpty()) { - _outputs._desktopSavedDeviceName = client->getActiveAudioDevice(QAudio::AudioOutput).deviceName(); - } - if (_outputs._hmdSavedDeviceName.isEmpty()) { - _outputs._hmdSavedDeviceName = _outputs._desktopSavedDeviceName; - } onContextChanged(QString()); }); diff --git a/launchers/qt/src/LauncherInstaller_windows.cpp b/launchers/qt/src/LauncherInstaller_windows.cpp index 78c7dadd2b..b5558f972c 100644 --- a/launchers/qt/src/LauncherInstaller_windows.cpp +++ b/launchers/qt/src/LauncherInstaller_windows.cpp @@ -14,7 +14,16 @@ #include #include #include +#include + +void timeDelay() { + static const int ONE_SECOND = 1; + QTime delayTime = QTime::currentTime().addSecs(ONE_SECOND); + while (QTime::currentTime() < delayTime) { + qDebug() << "Delaying time"; + } +} LauncherInstaller::LauncherInstaller() { _launcherInstallDir = PathUtils::getLauncherDirectory(); _launcherApplicationsDir = PathUtils::getApplicationsDirectory(); @@ -56,8 +65,8 @@ void LauncherInstaller::install() { } deleteShortcuts(); - createShortcuts(); deleteApplicationRegistryKeys(); + createShortcuts(); createApplicationRegistryKeys(); } else { qDebug() << "Failed to install HQ Launcher"; @@ -67,26 +76,26 @@ void LauncherInstaller::install() { void LauncherInstaller::createShortcuts() { QString launcherPath = PathUtils::getLauncherFilePath(); - QString uninstallLinkPath = _launcherInstallDir.absoluteFilePath("Uninstall HQ.lnk"); + QString uninstallLinkPath = _launcherInstallDir.absoluteFilePath("Uninstall HQ Launcher.lnk"); QDir desktopDir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString appStartLinkPath = _launcherApplicationsDir.absoluteFilePath("HQ Launcher.lnk"); - QString uninstallAppStartLinkPath = _launcherApplicationsDir.absoluteFilePath("Uninstall HQ.lnk"); + QString uninstallAppStartLinkPath = _launcherApplicationsDir.absoluteFilePath("Uninstall HQ Launcher.lnk"); QString desktopAppLinkPath = desktopDir.absoluteFilePath("HQ Launcher.lnk"); createSymbolicLink((LPCSTR)launcherPath.toStdString().c_str(), (LPCSTR)uninstallLinkPath.toStdString().c_str(), - (LPCSTR)("Click to Uninstall HQ"), (LPCSTR)("--uninstall")); + (LPCSTR)("Click to Uninstall HQ Launcher"), (LPCSTR)("--uninstall")); createSymbolicLink((LPCSTR)launcherPath.toStdString().c_str(), (LPCSTR)uninstallAppStartLinkPath.toStdString().c_str(), - (LPCSTR)("Click to Uninstall HQ"), (LPCSTR)("--uninstall")); + (LPCSTR)("Click to Uninstall HQ Launcher"), (LPCSTR)("--uninstall")); createSymbolicLink((LPCSTR)launcherPath.toStdString().c_str(), (LPCSTR)desktopAppLinkPath.toStdString().c_str(), - (LPCSTR)("Click to Setup and Launch HQ")); + (LPCSTR)("Click to Setup and Launch HQ Launcher")); createSymbolicLink((LPCSTR)launcherPath.toStdString().c_str(), (LPCSTR)appStartLinkPath.toStdString().c_str(), - (LPCSTR)("Click to Setup and Launch HQ")); + (LPCSTR)("Click to Setup and Launch HQ Launcher")); } QString randomQtString() { @@ -141,20 +150,42 @@ void LauncherInstaller::uninstall() { qDebug() << "Failed to complete uninstall launcher"; } return; + } else { + + bool deletedHQLauncherExe = deleteHQLauncherExecutable(); + if (deletedHQLauncherExe) { + qDebug() << "Deleteing registry keys"; + deleteApplicationRegistryKeys(); + } } +} + +bool LauncherInstaller::deleteHQLauncherExecutable() { + static const int MAX_DELETE_ATTEMPTS = 3; + + int deleteAttempts = 0; + bool fileRemoved = false; QString launcherPath = _launcherInstallDir.absoluteFilePath("HQ Launcher.exe"); - if (QFile::exists(launcherPath)) { - bool removed = QFile::remove(launcherPath); - qDebug() << "Successfully removed " << launcherPath << ": " << removed; + while (deleteAttempts < MAX_DELETE_ATTEMPTS) { + fileRemoved = QFile::remove(launcherPath); + if (fileRemoved) { + break; + } + + timeDelay(); + deleteAttempts++; } - deleteApplicationRegistryKeys(); + + qDebug() << "Successfully removed " << launcherPath << ": " << fileRemoved; + + return fileRemoved; } void LauncherInstaller::deleteShortcuts() { QDir desktopDir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QString applicationPath = _launcherApplicationsDir.absolutePath(); - QString uninstallLinkPath = _launcherInstallDir.absoluteFilePath("Uninstall HQ.lnk"); + QString uninstallLinkPath = _launcherInstallDir.absoluteFilePath("Uninstall HQ Launcher.lnk"); if (QFile::exists(uninstallLinkPath)) { QFile::remove(uninstallLinkPath); } @@ -164,7 +195,7 @@ void LauncherInstaller::deleteShortcuts() { QFile::remove(appStartLinkPath); } - QString uninstallAppStartLinkPath = _launcherApplicationsDir.absoluteFilePath("Uninstall HQ.lnk"); + QString uninstallAppStartLinkPath = _launcherApplicationsDir.absoluteFilePath("Uninstall HQ Launcher.lnk"); if (QFile::exists(uninstallAppStartLinkPath)) { QFile::remove(uninstallAppStartLinkPath); } @@ -212,7 +243,7 @@ void LauncherInstaller::uninstallOldLauncher() { void LauncherInstaller::createApplicationRegistryKeys() { const std::string REGISTRY_PATH = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\HQ"; - bool success = insertRegistryKey(REGISTRY_PATH, "DisplayName", "HQ"); + bool success = insertRegistryKey(REGISTRY_PATH, "DisplayName", "HQ Launcher"); std::string installPath = _launcherInstallDir.absolutePath().replace("/", "\\").toStdString(); success = insertRegistryKey(REGISTRY_PATH, "InstallLocation", installPath); std::string applicationExe = installPath + "\\HQ Launcher.exe"; diff --git a/launchers/qt/src/LauncherInstaller_windows.h b/launchers/qt/src/LauncherInstaller_windows.h index ffb402cce5..e06cbc4b40 100644 --- a/launchers/qt/src/LauncherInstaller_windows.h +++ b/launchers/qt/src/LauncherInstaller_windows.h @@ -15,6 +15,7 @@ private: void createApplicationRegistryKeys(); void deleteShortcuts(); void deleteApplicationRegistryKeys(); + bool deleteHQLauncherExecutable(); QDir _launcherInstallDir; QDir _launcherApplicationsDir; diff --git a/launchers/qt/src/PathUtils.cpp b/launchers/qt/src/PathUtils.cpp index 538303b564..d7e7b0af8b 100644 --- a/launchers/qt/src/PathUtils.cpp +++ b/launchers/qt/src/PathUtils.cpp @@ -28,7 +28,7 @@ QDir PathUtils::getLauncherDirectory() { } QDir PathUtils::getApplicationsDirectory() { - return QDir(QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation)).absoluteFilePath("Launcher"); + return QDir(QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation)).absoluteFilePath("HQ"); } // The client directory is where interface is installed to. diff --git a/launchers/qt/src/main.cpp b/launchers/qt/src/main.cpp index 9aef6990fa..75c35cd708 100644 --- a/launchers/qt/src/main.cpp +++ b/launchers/qt/src/main.cpp @@ -32,7 +32,7 @@ bool hasSuffix(const std::string& path, const std::string& suffix) { int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QCoreApplication::setOrganizationName("High Fidelity"); - QCoreApplication::setApplicationName("Launcher"); + QCoreApplication::setApplicationName("HQ Launcher"); Q_INIT_RESOURCE(resources); cleanLogFile(); diff --git a/libraries/animation/src/AnimBlendDirectional.cpp b/libraries/animation/src/AnimBlendDirectional.cpp index 4e7c67f276..4cc67683da 100644 --- a/libraries/animation/src/AnimBlendDirectional.cpp +++ b/libraries/animation/src/AnimBlendDirectional.cpp @@ -96,7 +96,9 @@ const AnimPoseVec& AnimBlendDirectional::evaluate(const AnimVariantMap& animVars } } _poses.resize(minSize); - blend4(minSize, &poseVecs[0][0], &poseVecs[1][0], &poseVecs[2][0], &poseVecs[3][0], &alphas[0], &_poses[0]); + if (minSize > 0) { + blend4(minSize, &poseVecs[0][0], &poseVecs[1][0], &poseVecs[2][0], &poseVecs[3][0], &alphas[0], &_poses[0]); + } // animation stack debug stats for (int i = 0; i < 9; i++) { diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index d6faea4396..612493db2e 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -153,9 +153,6 @@ void AudioClient::checkDevices() { auto inputDevices = getAvailableDevices(QAudio::AudioInput, hmdInputName); auto outputDevices = getAvailableDevices(QAudio::AudioOutput, hmdOutputName); - checkDefaultChanges(inputDevices); - checkDefaultChanges(outputDevices); - Lock lock(_deviceMutex); if (inputDevices != _inputDevices) { _inputDevices.swap(inputDevices); @@ -168,14 +165,6 @@ void AudioClient::checkDevices() { } } -void AudioClient::checkDefaultChanges(QList& devices) { - foreach(auto device, devices) { - if (device.isDefault()) { - QMetaObject::invokeMethod(this, "changeDefault", Q_ARG(HifiAudioDeviceInfo, device), Q_ARG(QAudio::Mode, device.getMode())); - } - } -} - HifiAudioDeviceInfo AudioClient::getActiveAudioDevice(QAudio::Mode mode) const { Lock lock(_deviceMutex); @@ -335,12 +324,10 @@ AudioClient::AudioClient() { connect(&_receivedAudioStream, &InboundAudioStream::mismatchedAudioCodec, this, &AudioClient::handleMismatchAudioFormat); - { - QReadLocker readLock(&_hmdNameLock); - // initialize wasapi; if getAvailableDevices is called from the CheckDevicesThread before this, it will crash - getAvailableDevices(QAudio::AudioInput, _hmdInputName); - getAvailableDevices(QAudio::AudioOutput, _hmdOutputName); - } + // initialize wasapi; if getAvailableDevices is called from the CheckDevicesThread before this, it will crash + getAvailableDevices(QAudio::AudioInput, QString()); + getAvailableDevices(QAudio::AudioOutput, QString()); + // start a thread to detect any device changes _checkDevicesTimer = new QTimer(this); const unsigned long DEVICE_CHECK_INTERVAL_MSECS = 2 * 1000; @@ -996,13 +983,6 @@ void AudioClient::selectAudioFormat(const QString& selectedCodecName) { } -void AudioClient::changeDefault(HifiAudioDeviceInfo newDefault, QAudio::Mode mode) { - HifiAudioDeviceInfo currentDevice = mode == QAudio::AudioInput ? _inputDeviceInfo : _outputDeviceInfo; - if (currentDevice.isDefault() && currentDevice.getDeviceType() == newDefault.getDeviceType() && currentDevice.getDevice() != newDefault.getDevice()) { - switchAudioDevice(mode, newDefault); - } -} - bool AudioClient::switchAudioDevice(QAudio::Mode mode, const HifiAudioDeviceInfo& deviceInfo) { auto device = deviceInfo; if (deviceInfo.getDevice().isNull()) { @@ -1883,11 +1863,8 @@ bool AudioClient::switchInputToAudioDevice(const HifiAudioDeviceInfo inputDevice qCDebug(audioclient) << "The audio input device" << inputDeviceInfo.deviceName() << ":" << inputDeviceInfo.getDevice().deviceName() << "is available."; //do not update UI that we're changing devices if default or same device - bool doEmit = _inputDeviceInfo.deviceName() != inputDeviceInfo.deviceName(); _inputDeviceInfo = inputDeviceInfo; - if (doEmit) { - emit deviceChanged(QAudio::AudioInput, _inputDeviceInfo); - } + emit deviceChanged(QAudio::AudioInput, _inputDeviceInfo); if (adjustedFormatForAudioDevice(_inputDeviceInfo.getDevice(), _desiredInputFormat, _inputFormat)) { qCDebug(audioclient) << "The format to be used for audio input is" << _inputFormat; @@ -2125,11 +2102,8 @@ bool AudioClient::switchOutputToAudioDevice(const HifiAudioDeviceInfo outputDevi qCDebug(audioclient) << "The audio output device" << outputDeviceInfo.deviceName() << ":" << outputDeviceInfo.getDevice().deviceName() << "is available."; //do not update UI that we're changing devices if default or same device - bool doEmit = _outputDeviceInfo.deviceName() != outputDeviceInfo.deviceName(); _outputDeviceInfo = outputDeviceInfo; - if (doEmit) { - emit deviceChanged(QAudio::AudioOutput, _outputDeviceInfo); - } + emit deviceChanged(QAudio::AudioOutput, _outputDeviceInfo); if (adjustedFormatForAudioDevice(_outputDeviceInfo.getDevice(), _desiredOutputFormat, _outputFormat)) { qCDebug(audioclient) << "The format to be used for audio output is" << _outputFormat; diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index dafa81081c..e31b4789ce 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -237,8 +237,6 @@ public slots: int setOutputBufferSize(int numFrames, bool persist = true); bool shouldLoopbackInjectors() override { return _shouldEchoToServer; } - Q_INVOKABLE void changeDefault(HifiAudioDeviceInfo newDefault, QAudio::Mode mode); - void checkDefaultChanges(QList& devices); // calling with a null QAudioDevice will use the system default bool switchAudioDevice(QAudio::Mode mode, const HifiAudioDeviceInfo& deviceInfo = HifiAudioDeviceInfo()); diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.cpp b/libraries/audio-client/src/HifiAudioDeviceInfo.cpp index 73d0670fa6..2a4c9065f4 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.cpp +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.cpp @@ -23,6 +23,7 @@ HifiAudioDeviceInfo& HifiAudioDeviceInfo::operator=(const HifiAudioDeviceInfo& o _mode = other.getMode(); _isDefault = other.isDefault(); _deviceType = other.getDeviceType(); + _debugName = other.getDevice().deviceName(); return *this; } diff --git a/libraries/audio-client/src/HifiAudioDeviceInfo.h b/libraries/audio-client/src/HifiAudioDeviceInfo.h index 5bc7125574..ddf5493241 100644 --- a/libraries/audio-client/src/HifiAudioDeviceInfo.h +++ b/libraries/audio-client/src/HifiAudioDeviceInfo.h @@ -35,13 +35,15 @@ public: _mode = deviceInfo.getMode(); _isDefault = deviceInfo.isDefault(); _deviceType = deviceInfo.getDeviceType(); + _debugName = deviceInfo.getDevice().deviceName(); } HifiAudioDeviceInfo(QAudioDeviceInfo deviceInfo, bool isDefault, QAudio::Mode mode, DeviceType devType=both) : _audioDeviceInfo(deviceInfo), _isDefault(isDefault), _mode(mode), - _deviceType(devType){ + _deviceType(devType), + _debugName(deviceInfo.deviceName()) { } void setMode(QAudio::Mode mode) { _mode = mode; } @@ -70,6 +72,7 @@ private: bool _isDefault { false }; QAudio::Mode _mode { QAudio::AudioInput }; DeviceType _deviceType{ both }; + QString _debugName; public: static const QString DEFAULT_DEVICE_NAME; diff --git a/libraries/controllers/src/controllers/Actions.cpp b/libraries/controllers/src/controllers/Actions.cpp index 36f454b5d0..30f4181b43 100644 --- a/libraries/controllers/src/controllers/Actions.cpp +++ b/libraries/controllers/src/controllers/Actions.cpp @@ -386,8 +386,6 @@ namespace controller { makeAxisPair(Action::LIPSSTRETCH_R, "LipsStretch_R"), makeAxisPair(Action::LIPSUPPERCLOSE, "LipsUpperClose"), makeAxisPair(Action::LIPSLOWERCLOSE, "LipsLowerClose"), - makeAxisPair(Action::LIPSUPPEROPEN, "LipsUpperOpen"), - makeAxisPair(Action::LIPSLOWEROPEN, "LipsLowerOpen"), makeAxisPair(Action::LIPSFUNNEL, "LipsFunnel"), makeAxisPair(Action::LIPSPUCKER, "LipsPucker"), makeAxisPair(Action::PUFF, "Puff"), diff --git a/libraries/controllers/src/controllers/Actions.h b/libraries/controllers/src/controllers/Actions.h index 5c96923dc3..6868483a14 100644 --- a/libraries/controllers/src/controllers/Actions.h +++ b/libraries/controllers/src/controllers/Actions.h @@ -220,8 +220,6 @@ enum class Action { LIPSSTRETCH_R, LIPSUPPERCLOSE, LIPSLOWERCLOSE, - LIPSUPPEROPEN, - LIPSLOWEROPEN, LIPSFUNNEL, LIPSPUCKER, PUFF, diff --git a/libraries/controllers/src/controllers/StandardController.cpp b/libraries/controllers/src/controllers/StandardController.cpp index 936f1c391f..41835223ea 100644 --- a/libraries/controllers/src/controllers/StandardController.cpp +++ b/libraries/controllers/src/controllers/StandardController.cpp @@ -392,8 +392,6 @@ Input::NamedVector StandardController::getAvailableInputs() const { makePair(LIPSSTRETCH_R, "LipsStretch_R"), makePair(LIPSUPPERCLOSE, "LipsUpperClose"), makePair(LIPSLOWERCLOSE, "LipsLowerClose"), - makePair(LIPSUPPEROPEN, "LipsUpperOpen"), - makePair(LIPSLOWEROPEN, "LipsLowerOpen"), makePair(LIPSFUNNEL, "LipsFunnel"), makePair(LIPSPUCKER, "LipsPucker"), makePair(PUFF, "Puff"), diff --git a/libraries/controllers/src/controllers/StandardControls.h b/libraries/controllers/src/controllers/StandardControls.h index 965c095187..051f6dcc3a 100644 --- a/libraries/controllers/src/controllers/StandardControls.h +++ b/libraries/controllers/src/controllers/StandardControls.h @@ -127,8 +127,6 @@ namespace controller { LIPSSTRETCH_R, LIPSUPPERCLOSE, LIPSLOWERCLOSE, - LIPSUPPEROPEN, - LIPSLOWEROPEN, LIPSFUNNEL, LIPSPUCKER, PUFF, diff --git a/libraries/fbx/src/FSTReader.cpp b/libraries/fbx/src/FSTReader.cpp index 2835151bfe..b647fe2e7f 100644 --- a/libraries/fbx/src/FSTReader.cpp +++ b/libraries/fbx/src/FSTReader.cpp @@ -82,6 +82,8 @@ static void fixUpLegacyBlendshapes(QVariantHash& properties) { removeBlendshape(bs, "JawChew"); removeBlendshape(bs, "ChinLowerRaise"); removeBlendshape(bs, "ChinUpperRaise"); + removeBlendshape(bs, "LipsUpperOpen"); + removeBlendshape(bs, "LipsLowerOpen"); // These blendshapes are split in ARKit, we replace them with their left and right sides with a weight of 1/2. splitBlendshapes(bs, "LipsUpperUp", "MouthUpperUp_L", "MouthUpperUp_R"); diff --git a/libraries/render-utils/src/RenderShadowTask.cpp b/libraries/render-utils/src/RenderShadowTask.cpp index 0d0b776074..22decb47a7 100755 --- a/libraries/render-utils/src/RenderShadowTask.cpp +++ b/libraries/render-utils/src/RenderShadowTask.cpp @@ -257,7 +257,9 @@ void RenderShadowMap::run(const render::RenderContextPointer& renderContext, con ShapeKey::Builder(), ShapeKey::Builder().withFade(), ShapeKey::Builder().withDeformed(), ShapeKey::Builder().withDeformed().withFade(), ShapeKey::Builder().withDeformed().withDualQuatSkinned(), ShapeKey::Builder().withDeformed().withDualQuatSkinned().withFade(), - ShapeKey::Builder().withOwnPipeline(), ShapeKey::Builder().withOwnPipeline().withFade() + ShapeKey::Builder().withOwnPipeline(), ShapeKey::Builder().withOwnPipeline().withFade(), + ShapeKey::Builder().withDeformed().withOwnPipeline(), ShapeKey::Builder().withDeformed().withOwnPipeline().withFade(), + ShapeKey::Builder().withDeformed().withDualQuatSkinned().withOwnPipeline(), ShapeKey::Builder().withDeformed().withDualQuatSkinned().withOwnPipeline().withFade(), }; std::vector> sortedShapeKeys(keys.size()); diff --git a/libraries/shared/src/BlendshapeConstants.cpp b/libraries/shared/src/BlendshapeConstants.cpp index 91b68ed8a9..172df461fd 100644 --- a/libraries/shared/src/BlendshapeConstants.cpp +++ b/libraries/shared/src/BlendshapeConstants.cpp @@ -47,8 +47,6 @@ const char* FACESHIFT_BLENDSHAPES[] = { "LipsStretch_R", "LipsUpperClose", "LipsLowerClose", - "LipsUpperOpen", - "LipsLowerOpen", "LipsFunnel", "LipsPucker", "Puff", diff --git a/libraries/shared/src/BlendshapeConstants.h b/libraries/shared/src/BlendshapeConstants.h index 8db29856c3..e74146eb56 100644 --- a/libraries/shared/src/BlendshapeConstants.h +++ b/libraries/shared/src/BlendshapeConstants.h @@ -51,8 +51,6 @@ enum class Blendshapes : int { LipsStretch_R, LipsUpperClose, LipsLowerClose, - LipsUpperOpen, - LipsLowerOpen, LipsFunnel, LipsPucker, Puff, @@ -114,5 +112,8 @@ enum class LegacyBlendshpaes : int { // * Sneer (split in ARKit) // * ChinLowerRaise (not in ARKit) // * ChinUpperRaise (not in ARKit) +// * LipsUpperOpen (not in ARKit) +// * LipsLowerOpen (not in ARKit) + #endif // hifi_BlendshapeConstants_h diff --git a/libraries/shared/src/shared/Camera.cpp b/libraries/shared/src/shared/Camera.cpp index 6727f89d29..85761e0d29 100644 --- a/libraries/shared/src/shared/Camera.cpp +++ b/libraries/shared/src/shared/Camera.cpp @@ -25,38 +25,46 @@ * * First Person * "first person" - * Legacy first person camera mode. The camera is positioned such that you have the same view as your avatar. - * The camera moves and rotates with your avatar. + *

The camera is positioned such that you have the same view as your avatar. The camera moves and rotates with + * your avatar.

+ *

Legacy first person camera mode.

* * * First Person Look At * "first person look at" - * Default first person camera mode. The camera is positioned such that you have the same view as your avatar. - * The camera moves and rotates with your avatar's head. + *

The camera is positioned such that you have the same view as your avatar. The camera moves and rotates with + * your avatar's head.

+ *

Default first person camera mode.

* * * Third Person * "third person" - * The camera is positioned such that you have a view from just behind your avatar. The camera moves and rotates with - * your avatar. + *

The camera is positioned such that you have a view from just behind your avatar. The camera moves and rotates + * with your avatar.

+ *

Legacy third person camera camera mode.

+ *
Camera.mode = "third person";
* * * 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. + *

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.

+ *

Default third person camera mode. * * * 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. + *

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.

+ *

Default "look at myself" camera mode.

* * * Mirror * "mirror" - * The camera is positioned such that you are looking directly at your avatar. The camera moves and rotates with your - * avatar. + *

The camera is positioned such that you are looking directly at your avatar. The camera is fixed and does not + * move with your avatar.

+ *

Legacy "look at myself" behavior.

+ *
Camera.mode = "mirror";
* * * Independent diff --git a/scripts/system/create/entityList/entityList.js b/scripts/system/create/entityList/entityList.js index 06e100f457..54a39bd165 100644 --- a/scripts/system/create/entityList/entityList.js +++ b/scripts/system/create/entityList/entityList.js @@ -275,23 +275,6 @@ EntityListTool = function(shouldUseEditTabletApp) { Window.saveFileChanged.connect(onFileSaveChanged); Window.saveAsync("Select Where to Save", "", "*.json"); } - } else if (data.type === "pal") { - var sessionIds = {}; // Collect the sessionsIds of all selected entities, w/o duplicates. - selectionManager.selections.forEach(function (id) { - var lastEditedBy = Entities.getEntityProperties(id, 'lastEditedBy').lastEditedBy; - if (lastEditedBy) { - sessionIds[lastEditedBy] = true; - } - }); - var dedupped = Object.keys(sessionIds); - if (!selectionManager.selections.length) { - Window.alert('No objects selected.'); - } else if (!dedupped.length) { - Window.alert('There were no recent users of the ' + selectionManager.selections.length + ' selected objects.'); - } else { - // No need to subscribe if we're just sending. - Messages.sendMessage('com.highfidelity.pal', JSON.stringify({method: 'select', params: [dedupped, true, false]}), 'local'); - } } else if (data.type === "delete") { deleteSelectedEntities(); } else if (data.type === "toggleLocked") { diff --git a/scripts/system/create/entityList/html/entityList.html b/scripts/system/create/entityList/html/entityList.html index 3e17a66df5..b7ff7cd4e4 100644 --- a/scripts/system/create/entityList/html/entityList.html +++ b/scripts/system/create/entityList/html/entityList.html @@ -29,7 +29,6 @@ - diff --git a/scripts/system/create/entityList/html/js/entityList.js b/scripts/system/create/entityList/html/js/entityList.js index b15c4e6703..b70e53ce15 100644 --- a/scripts/system/create/entityList/html/js/entityList.js +++ b/scripts/system/create/entityList/html/js/entityList.js @@ -209,7 +209,6 @@ let elEntityTable, elFilterInView, elFilterRadius, elExport, - elPal, elSelectedEntitiesCount, elVisibleEntitiesCount, elNoEntitiesMessage, @@ -254,7 +253,6 @@ function loaded() { elFilterInView = document.getElementById("filter-in-view"); elFilterRadius = document.getElementById("filter-radius"); elExport = document.getElementById("export"); - elPal = document.getElementById("pal"); elSelectedEntitiesCount = document.getElementById("selected-entities-count"); elVisibleEntitiesCount = document.getElementById("visible-entities-count"); elNoEntitiesMessage = document.getElementById("no-entities"); @@ -272,9 +270,6 @@ function loaded() { elExport.onclick = function() { EventBridge.emitWebEvent(JSON.stringify({ type: 'export'})); }; - elPal.onclick = function() { - EventBridge.emitWebEvent(JSON.stringify({ type: 'pal' })); - }; elDelete.onclick = function() { EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); }; @@ -541,8 +536,9 @@ function loaded() { function onRowClicked(clickEvent) { let entityID = this.dataset.entityID; let selection = [entityID]; + let controlKey = window.navigator.platform.startsWith("Mac") ? clickEvent.metaKey : clickEvent.ctrlKey; - if (clickEvent.ctrlKey) { + if (controlKey) { let selectedIndex = selectedEntities.indexOf(entityID); if (selectedIndex >= 0) { selection = []; @@ -573,7 +569,7 @@ function loaded() { selection.reverse(); } } - } else if (!clickEvent.ctrlKey && !clickEvent.shiftKey && selectedEntities.length === 1) { + } else if (!controlKey && !clickEvent.shiftKey && selectedEntities.length === 1) { // if reselecting the same entity then start renaming it if (selectedEntities[0] === entityID) { if (renameLastBlur && renameLastEntityID === entityID && (Date.now() - renameLastBlur) < RENAME_COOLDOWN) { diff --git a/scripts/system/create/entityProperties/html/js/entityProperties.js b/scripts/system/create/entityProperties/html/js/entityProperties.js index 76264429ac..e581fbd194 100644 --- a/scripts/system/create/entityProperties/html/js/entityProperties.js +++ b/scripts/system/create/entityProperties/html/js/entityProperties.js @@ -398,8 +398,8 @@ const GROUPS = [ { label: "Base", type: "number-draggable", - min: -1000, - max: 1000, + min: -16000, + max: 16000, step: 1, decimals: 0, unit: "m", @@ -409,8 +409,8 @@ const GROUPS = [ { label: "Ceiling", type: "number-draggable", - min: -1000, - max: 5000, + min: -16000, + max: 16000, step: 1, decimals: 0, unit: "m",