Merge pull request from highfidelity/master

Merge master into instancing
This commit is contained in:
Sabrina Shanman 2019-11-08 10:10:50 -08:00 committed by GitHub
commit eebb9ad51f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
39 changed files with 152 additions and 218 deletions

View file

@ -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);

View file

@ -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()

View file

@ -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" },

View file

@ -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" },

View file

@ -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

View file

@ -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

View file

@ -232,12 +232,6 @@ void AvatarBookmarks::loadBookmark(const QString& bookmarkName) {
emit bookmarkLoaded(bookmarkName);
});
std::shared_ptr<QMetaObject::Connection> connection2 = std::make_shared<QMetaObject::Connection>();
*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();

View file

@ -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;

View file

@ -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 };

View file

@ -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,

View file

@ -287,18 +287,19 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioD
bool desktopIsSelected = false;
checkHmdDefaultsChange(mode);
if (!_backupSelectedDesktopDeviceName.isEmpty() && !_backupSelectedHMDDeviceName.isEmpty()) {
foreach(const HifiAudioDeviceInfo& deviceInfo, devices) {
for (bool isHMD : {false, true}) {
auto& backupSelectedDeviceName = isHMD ? _backupSelectedHMDDeviceName : _backupSelectedDesktopDeviceName;
if (deviceInfo.deviceName() == backupSelectedDeviceName) {
if (isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::desktop) {
_selectedHMDDevice= deviceInfo;
backupSelectedDeviceName.clear();
} else if (!isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::hmd) {
_selectedDesktopDevice = deviceInfo;
backupSelectedDeviceName.clear();
}
HifiAudioDeviceInfo oldHmdDevice = HifiAudioDeviceInfo(_selectedHMDDevice);
HifiAudioDeviceInfo oldDesktopDevice = HifiAudioDeviceInfo(_selectedDesktopDevice);
foreach(const HifiAudioDeviceInfo& deviceInfo, devices) {
for (bool isHMD : {false, true}) {
auto& backupSelectedDeviceName = isHMD ? _backupSelectedHMDDeviceName : _backupSelectedDesktopDeviceName;
if (deviceInfo.deviceName() == backupSelectedDeviceName) {
if (isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::desktop) {
_selectedHMDDevice = deviceInfo;
backupSelectedDeviceName.clear();
} else if (!isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::hmd) {
_selectedDesktopDevice = deviceInfo;
backupSelectedDeviceName.clear();
}
}
}
@ -345,17 +346,13 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioD
for (bool isHMD : {false, true}) {
HifiAudioDeviceInfo& selectedDevice = isHMD ? _selectedHMDDevice : _selectedDesktopDevice;
bool& isSelected = isHMD ? device.selectedHMD : device.selectedDesktop;
isSelected = !selectedDevice.getDevice().isNull() && (device.info == selectedDevice);
if (!selectedDevice.getDevice().isNull()) {
isSelected = (device.info == selectedDevice);
}
else {
//no selected device for context. fallback to saved
QString& savedDeviceName = isHMD ? _hmdSavedDeviceName : _desktopSavedDeviceName;
if (device.info.deviceName() == savedDeviceName) {
if ((isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::desktop) ||
if (!isSelected) {
if (selectedDevice.isDefault() && device.info.isDefault()) {
if ((isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::desktop) ||
(!isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::hmd)) {
selectedDevice = device.info;
isSelected = true;
}
}
@ -367,19 +364,6 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioD
} else {
desktopIsSelected = isSelected;
}
// check if this device *is not* in old devices list - it means it was just re-plugged so needs to be selected explicitly
bool isNewDevice = true;
for (auto& oldDevice : _devices) {
if (oldDevice->info.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 QList<HifiAudioD
_devices.swap(newDevices);
endResetModel();
if (_selectedHMDDevice.isDefault() && _selectedHMDDevice != oldHmdDevice) {
emit selectedDevicePlugged(_selectedHMDDevice, true);
}
if (_selectedDesktopDevice.isDefault() && _selectedDesktopDevice != oldDesktopDevice) {
emit selectedDevicePlugged(_selectedDesktopDevice, false);
}
}
bool AudioInputDeviceList::peakValuesAvailable() {
@ -443,19 +435,6 @@ AudioDevices::AudioDevices(bool& contextIsHMD) : _contextIsHMD(contextIsHMD) {
checkHmdDefaultsChange(QAudio::AudioInput);
checkHmdDefaultsChange(QAudio::AudioOutput);
_inputs.onDeviceChanged(client->getActiveAudioDevice(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<HifiAudioDeviceInfo>& devicesInput = client->getAudioDevices(QAudio::AudioInput);
const QList<HifiAudioDeviceInfo>& 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<HifiAudioDevi
static std::once_flag once;
std::call_once(once, [&] {
//readout settings
auto client = DependencyManager::get<AudioClient>().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());
});

View file

@ -14,7 +14,16 @@
#include <QFileInfo>
#include <QFile>
#include <QDebug>
#include <QTime>
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";

View file

@ -15,6 +15,7 @@ private:
void createApplicationRegistryKeys();
void deleteShortcuts();
void deleteApplicationRegistryKeys();
bool deleteHQLauncherExecutable();
QDir _launcherInstallDir;
QDir _launcherApplicationsDir;

View file

@ -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.

View file

@ -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();

View file

@ -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++) {

View file

@ -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<HifiAudioDeviceInfo>& 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;

View file

@ -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<HifiAudioDeviceInfo>& devices);
// calling with a null QAudioDevice will use the system default
bool switchAudioDevice(QAudio::Mode mode, const HifiAudioDeviceInfo& deviceInfo = HifiAudioDeviceInfo());

View file

@ -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;
}

View file

@ -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;

View file

@ -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"),

View file

@ -220,8 +220,6 @@ enum class Action {
LIPSSTRETCH_R,
LIPSUPPERCLOSE,
LIPSLOWERCLOSE,
LIPSUPPEROPEN,
LIPSLOWEROPEN,
LIPSFUNNEL,
LIPSPUCKER,
PUFF,

View file

@ -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"),

View file

@ -127,8 +127,6 @@ namespace controller {
LIPSSTRETCH_R,
LIPSUPPERCLOSE,
LIPSLOWERCLOSE,
LIPSUPPEROPEN,
LIPSLOWEROPEN,
LIPSFUNNEL,
LIPSPUCKER,
PUFF,

View file

@ -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");

View file

@ -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<std::vector<ShapeKey>> sortedShapeKeys(keys.size());

View file

@ -47,8 +47,6 @@ const char* FACESHIFT_BLENDSHAPES[] = {
"LipsStretch_R",
"LipsUpperClose",
"LipsLowerClose",
"LipsUpperOpen",
"LipsLowerOpen",
"LipsFunnel",
"LipsPucker",
"Puff",

View file

@ -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

View file

@ -25,38 +25,46 @@
* <tr>
* <td><strong>First&nbsp;Person</strong></td>
* <td><code>"first&nbsp;person"</code></td>
* <td>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.</td>
* <td><p>The camera is positioned such that you have the same view as your avatar. The camera moves and rotates with
* your avatar.</p>
* <p><em>Legacy first person camera mode.</em></p></td>
* </tr>
* <tr>
* <td><strong>First&nbsp;Person&nbsp;Look&nbsp;At</strong></td>
* <td><code>"first&nbsp;person&nbsp;look&nbsp;at"</code></td>
* <td>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.</td>
* <td><p>The camera is positioned such that you have the same view as your avatar. The camera moves and rotates with
* your avatar's head.</p>
* <p><em>Default first person camera mode.</em></p></td>
* </tr>
* <tr>
* <td><strong>Third&nbsp;Person</strong></td>
* <td><code>"third&nbsp;person"</code></td>
* <td>The camera is positioned such that you have a view from just behind your avatar. The camera moves and rotates with
* your avatar.</td>
* <td><p>The camera is positioned such that you have a view from just behind your avatar. The camera moves and rotates
* with your avatar.</p>
* <p><em>Legacy third person camera camera mode.</em></p>
* <pre class="prettyprint"><code>Camera.mode = "third person";</code></pre></td>
* </tr>
* <tr>
* <td><strong>Look&nbsp;At</strong></td>
* <td><code>"look&nbsp;at"</code></td>
* <td>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.</td>
* <td><p>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.</p>
* <p><em>Default third person camera mode.</em></td>
* </tr>
* <tr>
* <td><strong>Selfie</strong></td>
* <td><code>"selfie"</code></td>
* <td>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.</td>
* <td><p>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.</p>
* <p><em>Default "look at myself" camera mode.</em></p></td>
* </tr>
* <tr>
* <td><strong>Mirror</strong></td>
* <td><code>"mirror"</code></td>
* <td>The camera is positioned such that you are looking directly at your avatar. The camera moves and rotates with your
* avatar.</td>
* <td><p>The camera is positioned such that you are looking directly at your avatar. The camera is fixed and does not
* move with your avatar.</p>
* <p><em>Legacy "look at myself" behavior.</em></p>
* <pre class="prettyprint"><code>Camera.mode = "mirror";</code></pre></td>
* </tr>
* <tr>
* <td><strong>Independent</strong></td>

View file

@ -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") {

View file

@ -29,7 +29,6 @@
<input type="button" id="locked" class="glyph" value="&#xe006;" />
<input type="button" id="visible" class="glyph" value="&#xe007;" />
</div>
<input type="button" id="pal" class="glyph" value="&#xe00c;" />
<button id="toggle-space-mode" class="hifi-edit-button space-mode-local">Local</button>
<input type="button" class="red glyph" id="delete" value="{" />
</div>

View file

@ -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) {

View file

@ -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",