mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-06-04 23:02:07 +02:00
Merge branch 'master' of github.com:highfidelity/hifi into screenshareElectronApp
This commit is contained in:
commit
40814f9086
22 changed files with 93 additions and 148 deletions
|
@ -399,6 +399,7 @@ void Agent::executeScript() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// these procedural movements are included in the recordings
|
// these procedural movements are included in the recordings
|
||||||
|
scriptedAvatar->setHasScriptedBlendshapes(true);
|
||||||
scriptedAvatar->setHasProceduralEyeFaceMovement(false);
|
scriptedAvatar->setHasProceduralEyeFaceMovement(false);
|
||||||
scriptedAvatar->setHasProceduralBlinkFaceMovement(false);
|
scriptedAvatar->setHasProceduralBlinkFaceMovement(false);
|
||||||
scriptedAvatar->setHasAudioEnabledFaceMovement(false);
|
scriptedAvatar->setHasAudioEnabledFaceMovement(false);
|
||||||
|
@ -406,6 +407,7 @@ void Agent::executeScript() {
|
||||||
scriptedAvatar->clearRecordingBasis();
|
scriptedAvatar->clearRecordingBasis();
|
||||||
|
|
||||||
// restore procedural blendshape movement
|
// restore procedural blendshape movement
|
||||||
|
scriptedAvatar->setHasScriptedBlendshapes(false);
|
||||||
scriptedAvatar->setHasProceduralEyeFaceMovement(true);
|
scriptedAvatar->setHasProceduralEyeFaceMovement(true);
|
||||||
scriptedAvatar->setHasProceduralBlinkFaceMovement(true);
|
scriptedAvatar->setHasProceduralBlinkFaceMovement(true);
|
||||||
scriptedAvatar->setHasAudioEnabledFaceMovement(true);
|
scriptedAvatar->setHasAudioEnabledFaceMovement(true);
|
||||||
|
|
|
@ -58,3 +58,7 @@ if (ANDROID)
|
||||||
list(APPEND EXTERNAL_ARGS -DANDROID_TOOLCHAIN=${ANDROID_TOOLCHAIN})
|
list(APPEND EXTERNAL_ARGS -DANDROID_TOOLCHAIN=${ANDROID_TOOLCHAIN})
|
||||||
list(APPEND EXTERNAL_ARGS -DANDROID_STL=${ANDROID_STL})
|
list(APPEND EXTERNAL_ARGS -DANDROID_STL=${ANDROID_STL})
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--deep")
|
||||||
|
endif()
|
|
@ -201,8 +201,6 @@
|
||||||
{ "from": "Standard.LipsStretch_R", "to": "Actions.LipsStretch_R" },
|
{ "from": "Standard.LipsStretch_R", "to": "Actions.LipsStretch_R" },
|
||||||
{ "from": "Standard.LipsUpperClose", "to": "Actions.LipsUpperClose" },
|
{ "from": "Standard.LipsUpperClose", "to": "Actions.LipsUpperClose" },
|
||||||
{ "from": "Standard.LipsLowerClose", "to": "Actions.LipsLowerClose" },
|
{ "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.LipsFunnel", "to": "Actions.LipsFunnel" },
|
||||||
{ "from": "Standard.LipsPucker", "to": "Actions.LipsPucker" },
|
{ "from": "Standard.LipsPucker", "to": "Actions.LipsPucker" },
|
||||||
{ "from": "Standard.Puff", "to": "Actions.Puff" },
|
{ "from": "Standard.Puff", "to": "Actions.Puff" },
|
||||||
|
|
|
@ -96,8 +96,6 @@
|
||||||
{ "from": "Standard.LipsStretch_R", "to": "Actions.LipsStretch_R" },
|
{ "from": "Standard.LipsStretch_R", "to": "Actions.LipsStretch_R" },
|
||||||
{ "from": "Standard.LipsUpperClose", "to": "Actions.LipsUpperClose" },
|
{ "from": "Standard.LipsUpperClose", "to": "Actions.LipsUpperClose" },
|
||||||
{ "from": "Standard.LipsLowerClose", "to": "Actions.LipsLowerClose" },
|
{ "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.LipsFunnel", "to": "Actions.LipsFunnel" },
|
||||||
{ "from": "Standard.LipsPucker", "to": "Actions.LipsPucker" },
|
{ "from": "Standard.LipsPucker", "to": "Actions.LipsPucker" },
|
||||||
{ "from": "Standard.Puff", "to": "Actions.Puff" },
|
{ "from": "Standard.Puff", "to": "Actions.Puff" },
|
||||||
|
|
|
@ -232,12 +232,6 @@ void AvatarBookmarks::loadBookmark(const QString& bookmarkName) {
|
||||||
emit bookmarkLoaded(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;
|
qCDebug(interfaceapp) << "Start loading avatar bookmark" << bookmarkName;
|
||||||
|
|
||||||
const QString& avatarUrl = bookmark.value(ENTRY_AVATAR_URL, "").toString();
|
const QString& avatarUrl = bookmark.value(ENTRY_AVATAR_URL, "").toString();
|
||||||
|
|
|
@ -3452,7 +3452,7 @@ void MyAvatar::updateOrientation(float deltaTime) {
|
||||||
bool isCameraYawing = getDriveKey(DELTA_YAW) + getDriveKey(STEP_YAW) + getDriveKey(YAW) != 0.0f;
|
bool isCameraYawing = getDriveKey(DELTA_YAW) + getDriveKey(STEP_YAW) + getDriveKey(YAW) != 0.0f;
|
||||||
bool isRotatingWhileSeated = !isCameraYawing && isMovingSideways && _characterController.getSeated();
|
bool isRotatingWhileSeated = !isCameraYawing && isMovingSideways && _characterController.getSeated();
|
||||||
glm::quat previousOrientation = getWorldOrientation();
|
glm::quat previousOrientation = getWorldOrientation();
|
||||||
|
glm::quat previousYaw = _lookAtYaw;
|
||||||
if (!computeLookAt) {
|
if (!computeLookAt) {
|
||||||
setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))));
|
setWorldOrientation(getWorldOrientation() * glm::quat(glm::radians(glm::vec3(0.0f, totalBodyYaw, 0.0f))));
|
||||||
_lookAtCameraTarget = eyesPosition + getWorldOrientation() * Vectors::FRONT;
|
_lookAtCameraTarget = eyesPosition + getWorldOrientation() * Vectors::FRONT;
|
||||||
|
@ -3462,6 +3462,7 @@ void MyAvatar::updateOrientation(float deltaTime) {
|
||||||
// Compute new look at vectors
|
// Compute new look at vectors
|
||||||
if (totalBodyYaw != 0.0f) {
|
if (totalBodyYaw != 0.0f) {
|
||||||
_lookAtYaw = _lookAtYaw * glm::quat(glm::radians(glm::vec3(0.0f, 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
|
float pitchIncrement = getDriveKey(PITCH) * _pitchSpeed * deltaTime
|
||||||
+ getDriveKey(DELTA_PITCH) * _pitchSpeed / PITCH_SPEED_DEFAULT;
|
+ 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_FORWARD_BLEND = 0.25f;
|
||||||
const float REORIENT_TURN_BLEND = 0.03f;
|
const float REORIENT_TURN_BLEND = 0.03f;
|
||||||
const float DIAGONAL_TURN_BLEND = 0.1f;
|
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;
|
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) {
|
if (blend > 1.0f) {
|
||||||
blend = 1.0f;
|
blend = 1.0f;
|
||||||
}
|
}
|
||||||
|
@ -3573,7 +3586,6 @@ void MyAvatar::updateOrientation(float deltaTime) {
|
||||||
if (frontBackDot < limitAngle) {
|
if (frontBackDot < limitAngle) {
|
||||||
if (frontBackDot < 0.0f) {
|
if (frontBackDot < 0.0f) {
|
||||||
ajustedYawVector = (leftRightDot < 0.0f ? -avatarVectorRight : avatarVectorRight);
|
ajustedYawVector = (leftRightDot < 0.0f ? -avatarVectorRight : avatarVectorRight);
|
||||||
cameraVector = (ajustedYawVector * _lookAtPitch) * Vectors::FRONT;
|
|
||||||
}
|
}
|
||||||
if (!isRotatingWhileSeated) {
|
if (!isRotatingWhileSeated) {
|
||||||
if (frontBackDot < triggerAngle) {
|
if (frontBackDot < triggerAngle) {
|
||||||
|
@ -6762,19 +6774,18 @@ glm::vec3 MyAvatar::getLookAtPivotPoint() {
|
||||||
|
|
||||||
glm::vec3 MyAvatar::getCameraEyesPosition(float deltaTime) {
|
glm::vec3 MyAvatar::getCameraEyesPosition(float deltaTime) {
|
||||||
glm::vec3 defaultEyesPosition = getLookAtPivotPoint();
|
glm::vec3 defaultEyesPosition = getLookAtPivotPoint();
|
||||||
if (isFlying()) {
|
|
||||||
return defaultEyesPosition;
|
|
||||||
}
|
|
||||||
glm::vec3 avatarFrontVector = getWorldOrientation() * Vectors::FRONT;
|
glm::vec3 avatarFrontVector = getWorldOrientation() * Vectors::FRONT;
|
||||||
glm::vec3 avatarUpVector = getWorldOrientation() * Vectors::UP;
|
glm::vec3 avatarUpVector = getWorldOrientation() * Vectors::UP;
|
||||||
// Compute the offset between the default and real eye positions.
|
// Compute the offset between the default and real eye positions.
|
||||||
glm::vec3 defaultEyesToEyesVector = getHead()->getEyePosition() - defaultEyesPosition;
|
glm::vec3 defaultEyesToEyesVector = getHead()->getEyePosition() - defaultEyesPosition;
|
||||||
float FRONT_OFFSET_IDLE_MULTIPLIER = 2.5f;
|
const float FRONT_OFFSET_IDLE_MULTIPLIER = 3.5f;
|
||||||
float FRONT_OFFSET_JUMP_MULTIPLIER = 1.5f;
|
const float FRONT_OFFSET_JUMP_MULTIPLIER = 1.5f;
|
||||||
float frontOffset = FRONT_OFFSET_IDLE_MULTIPLIER * glm::length(defaultEyesPosition - getDefaultEyePosition());
|
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);
|
float mixAlpha = glm::dot(_lookAtPitch * Vectors::FRONT, -avatarUpVector);
|
||||||
|
|
||||||
bool isLanding = false;
|
bool isLanding = false;
|
||||||
// When jumping the camera should follow the real eye on the Y coordenate
|
// When jumping the camera should follow the real eye on the Y coordenate
|
||||||
float upOffset = 0.0f;
|
float upOffset = 0.0f;
|
||||||
|
|
|
@ -2693,6 +2693,7 @@ private:
|
||||||
const float MAX_LOOK_AT_TIME_SCRIPT_CONTROL = 2.0f;
|
const float MAX_LOOK_AT_TIME_SCRIPT_CONTROL = 2.0f;
|
||||||
glm::quat _lookAtPitch;
|
glm::quat _lookAtPitch;
|
||||||
glm::quat _lookAtYaw;
|
glm::quat _lookAtYaw;
|
||||||
|
float _lookAtYawSpeed { 0.0f };
|
||||||
glm::vec3 _lookAtCameraTarget;
|
glm::vec3 _lookAtCameraTarget;
|
||||||
glm::vec3 _lookAtScriptTarget;
|
glm::vec3 _lookAtScriptTarget;
|
||||||
bool _headLookAtActive { false };
|
bool _headLookAtActive { false };
|
||||||
|
|
|
@ -57,8 +57,6 @@ static controller::Action blendshapeActions[] = {
|
||||||
controller::Action::LIPSSTRETCH_R,
|
controller::Action::LIPSSTRETCH_R,
|
||||||
controller::Action::LIPSUPPERCLOSE,
|
controller::Action::LIPSUPPERCLOSE,
|
||||||
controller::Action::LIPSLOWERCLOSE,
|
controller::Action::LIPSLOWERCLOSE,
|
||||||
controller::Action::LIPSUPPEROPEN,
|
|
||||||
controller::Action::LIPSLOWEROPEN,
|
|
||||||
controller::Action::LIPSFUNNEL,
|
controller::Action::LIPSFUNNEL,
|
||||||
controller::Action::LIPSPUCKER,
|
controller::Action::LIPSPUCKER,
|
||||||
controller::Action::PUFF,
|
controller::Action::PUFF,
|
||||||
|
|
|
@ -287,18 +287,19 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioD
|
||||||
bool desktopIsSelected = false;
|
bool desktopIsSelected = false;
|
||||||
|
|
||||||
checkHmdDefaultsChange(mode);
|
checkHmdDefaultsChange(mode);
|
||||||
if (!_backupSelectedDesktopDeviceName.isEmpty() && !_backupSelectedHMDDeviceName.isEmpty()) {
|
HifiAudioDeviceInfo oldHmdDevice = HifiAudioDeviceInfo(_selectedHMDDevice);
|
||||||
foreach(const HifiAudioDeviceInfo& deviceInfo, devices) {
|
HifiAudioDeviceInfo oldDesktopDevice = HifiAudioDeviceInfo(_selectedDesktopDevice);
|
||||||
for (bool isHMD : {false, true}) {
|
|
||||||
auto& backupSelectedDeviceName = isHMD ? _backupSelectedHMDDeviceName : _backupSelectedDesktopDeviceName;
|
foreach(const HifiAudioDeviceInfo& deviceInfo, devices) {
|
||||||
if (deviceInfo.deviceName() == backupSelectedDeviceName) {
|
for (bool isHMD : {false, true}) {
|
||||||
if (isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::desktop) {
|
auto& backupSelectedDeviceName = isHMD ? _backupSelectedHMDDeviceName : _backupSelectedDesktopDeviceName;
|
||||||
_selectedHMDDevice= deviceInfo;
|
if (deviceInfo.deviceName() == backupSelectedDeviceName) {
|
||||||
backupSelectedDeviceName.clear();
|
if (isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::desktop) {
|
||||||
} else if (!isHMD && deviceInfo.getDeviceType() != HifiAudioDeviceInfo::hmd) {
|
_selectedHMDDevice = deviceInfo;
|
||||||
_selectedDesktopDevice = deviceInfo;
|
backupSelectedDeviceName.clear();
|
||||||
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}) {
|
for (bool isHMD : {false, true}) {
|
||||||
HifiAudioDeviceInfo& selectedDevice = isHMD ? _selectedHMDDevice : _selectedDesktopDevice;
|
HifiAudioDeviceInfo& selectedDevice = isHMD ? _selectedHMDDevice : _selectedDesktopDevice;
|
||||||
bool& isSelected = isHMD ? device.selectedHMD : device.selectedDesktop;
|
bool& isSelected = isHMD ? device.selectedHMD : device.selectedDesktop;
|
||||||
|
isSelected = !selectedDevice.getDevice().isNull() && (device.info == selectedDevice);
|
||||||
|
|
||||||
if (!selectedDevice.getDevice().isNull()) {
|
if (!isSelected) {
|
||||||
isSelected = (device.info == selectedDevice);
|
if (selectedDevice.isDefault() && device.info.isDefault()) {
|
||||||
}
|
if ((isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::desktop) ||
|
||||||
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) ||
|
|
||||||
(!isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::hmd)) {
|
(!isHMD && device.info.getDeviceType() != HifiAudioDeviceInfo::hmd)) {
|
||||||
|
selectedDevice = device.info;
|
||||||
isSelected = true;
|
isSelected = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -367,19 +364,6 @@ void AudioDeviceList::onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioD
|
||||||
} else {
|
} else {
|
||||||
desktopIsSelected = isSelected;
|
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);
|
_devices.swap(newDevices);
|
||||||
endResetModel();
|
endResetModel();
|
||||||
|
|
||||||
|
if (_selectedHMDDevice.isDefault() && _selectedHMDDevice != oldHmdDevice) {
|
||||||
|
emit selectedDevicePlugged(_selectedHMDDevice, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_selectedDesktopDevice.isDefault() && _selectedDesktopDevice != oldDesktopDevice) {
|
||||||
|
emit selectedDevicePlugged(_selectedDesktopDevice, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AudioInputDeviceList::peakValuesAvailable() {
|
bool AudioInputDeviceList::peakValuesAvailable() {
|
||||||
|
@ -443,19 +435,6 @@ AudioDevices::AudioDevices(bool& contextIsHMD) : _contextIsHMD(contextIsHMD) {
|
||||||
|
|
||||||
checkHmdDefaultsChange(QAudio::AudioInput);
|
checkHmdDefaultsChange(QAudio::AudioInput);
|
||||||
checkHmdDefaultsChange(QAudio::AudioOutput);
|
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() {}
|
AudioDevices::~AudioDevices() {}
|
||||||
|
@ -526,29 +505,12 @@ void AudioDevices::onDevicesChanged(QAudio::Mode mode, const QList<HifiAudioDevi
|
||||||
static std::once_flag once;
|
static std::once_flag once;
|
||||||
std::call_once(once, [&] {
|
std::call_once(once, [&] {
|
||||||
//readout settings
|
//readout settings
|
||||||
auto client = DependencyManager::get<AudioClient>().data();
|
|
||||||
|
|
||||||
_inputs._hmdSavedDeviceName = getTargetDevice(true, QAudio::AudioInput);
|
_inputs._hmdSavedDeviceName = getTargetDevice(true, QAudio::AudioInput);
|
||||||
_inputs._desktopSavedDeviceName = getTargetDevice(false, 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._hmdSavedDeviceName = getTargetDevice(true, QAudio::AudioOutput);
|
||||||
_outputs._desktopSavedDeviceName = getTargetDevice(false, 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());
|
onContextChanged(QString());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -153,9 +153,6 @@ void AudioClient::checkDevices() {
|
||||||
auto inputDevices = getAvailableDevices(QAudio::AudioInput, hmdInputName);
|
auto inputDevices = getAvailableDevices(QAudio::AudioInput, hmdInputName);
|
||||||
auto outputDevices = getAvailableDevices(QAudio::AudioOutput, hmdOutputName);
|
auto outputDevices = getAvailableDevices(QAudio::AudioOutput, hmdOutputName);
|
||||||
|
|
||||||
checkDefaultChanges(inputDevices);
|
|
||||||
checkDefaultChanges(outputDevices);
|
|
||||||
|
|
||||||
Lock lock(_deviceMutex);
|
Lock lock(_deviceMutex);
|
||||||
if (inputDevices != _inputDevices) {
|
if (inputDevices != _inputDevices) {
|
||||||
_inputDevices.swap(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 {
|
HifiAudioDeviceInfo AudioClient::getActiveAudioDevice(QAudio::Mode mode) const {
|
||||||
Lock lock(_deviceMutex);
|
Lock lock(_deviceMutex);
|
||||||
|
|
||||||
|
@ -335,12 +324,10 @@ AudioClient::AudioClient() {
|
||||||
|
|
||||||
connect(&_receivedAudioStream, &InboundAudioStream::mismatchedAudioCodec, this, &AudioClient::handleMismatchAudioFormat);
|
connect(&_receivedAudioStream, &InboundAudioStream::mismatchedAudioCodec, this, &AudioClient::handleMismatchAudioFormat);
|
||||||
|
|
||||||
{
|
// initialize wasapi; if getAvailableDevices is called from the CheckDevicesThread before this, it will crash
|
||||||
QReadLocker readLock(&_hmdNameLock);
|
getAvailableDevices(QAudio::AudioInput, QString());
|
||||||
// initialize wasapi; if getAvailableDevices is called from the CheckDevicesThread before this, it will crash
|
getAvailableDevices(QAudio::AudioOutput, QString());
|
||||||
getAvailableDevices(QAudio::AudioInput, _hmdInputName);
|
|
||||||
getAvailableDevices(QAudio::AudioOutput, _hmdOutputName);
|
|
||||||
}
|
|
||||||
// start a thread to detect any device changes
|
// start a thread to detect any device changes
|
||||||
_checkDevicesTimer = new QTimer(this);
|
_checkDevicesTimer = new QTimer(this);
|
||||||
const unsigned long DEVICE_CHECK_INTERVAL_MSECS = 2 * 1000;
|
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) {
|
bool AudioClient::switchAudioDevice(QAudio::Mode mode, const HifiAudioDeviceInfo& deviceInfo) {
|
||||||
auto device = deviceInfo;
|
auto device = deviceInfo;
|
||||||
if (deviceInfo.getDevice().isNull()) {
|
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.";
|
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
|
//do not update UI that we're changing devices if default or same device
|
||||||
bool doEmit = _inputDeviceInfo.deviceName() != inputDeviceInfo.deviceName();
|
|
||||||
_inputDeviceInfo = inputDeviceInfo;
|
_inputDeviceInfo = inputDeviceInfo;
|
||||||
if (doEmit) {
|
emit deviceChanged(QAudio::AudioInput, _inputDeviceInfo);
|
||||||
emit deviceChanged(QAudio::AudioInput, _inputDeviceInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (adjustedFormatForAudioDevice(_inputDeviceInfo.getDevice(), _desiredInputFormat, _inputFormat)) {
|
if (adjustedFormatForAudioDevice(_inputDeviceInfo.getDevice(), _desiredInputFormat, _inputFormat)) {
|
||||||
qCDebug(audioclient) << "The format to be used for audio input is" << _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.";
|
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
|
//do not update UI that we're changing devices if default or same device
|
||||||
bool doEmit = _outputDeviceInfo.deviceName() != outputDeviceInfo.deviceName();
|
|
||||||
_outputDeviceInfo = outputDeviceInfo;
|
_outputDeviceInfo = outputDeviceInfo;
|
||||||
if (doEmit) {
|
emit deviceChanged(QAudio::AudioOutput, _outputDeviceInfo);
|
||||||
emit deviceChanged(QAudio::AudioOutput, _outputDeviceInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (adjustedFormatForAudioDevice(_outputDeviceInfo.getDevice(), _desiredOutputFormat, _outputFormat)) {
|
if (adjustedFormatForAudioDevice(_outputDeviceInfo.getDevice(), _desiredOutputFormat, _outputFormat)) {
|
||||||
qCDebug(audioclient) << "The format to be used for audio output is" << _outputFormat;
|
qCDebug(audioclient) << "The format to be used for audio output is" << _outputFormat;
|
||||||
|
|
|
@ -237,8 +237,6 @@ public slots:
|
||||||
int setOutputBufferSize(int numFrames, bool persist = true);
|
int setOutputBufferSize(int numFrames, bool persist = true);
|
||||||
|
|
||||||
bool shouldLoopbackInjectors() override { return _shouldEchoToServer; }
|
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
|
// calling with a null QAudioDevice will use the system default
|
||||||
bool switchAudioDevice(QAudio::Mode mode, const HifiAudioDeviceInfo& deviceInfo = HifiAudioDeviceInfo());
|
bool switchAudioDevice(QAudio::Mode mode, const HifiAudioDeviceInfo& deviceInfo = HifiAudioDeviceInfo());
|
||||||
|
|
|
@ -23,6 +23,7 @@ HifiAudioDeviceInfo& HifiAudioDeviceInfo::operator=(const HifiAudioDeviceInfo& o
|
||||||
_mode = other.getMode();
|
_mode = other.getMode();
|
||||||
_isDefault = other.isDefault();
|
_isDefault = other.isDefault();
|
||||||
_deviceType = other.getDeviceType();
|
_deviceType = other.getDeviceType();
|
||||||
|
_debugName = other.getDevice().deviceName();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,13 +35,15 @@ public:
|
||||||
_mode = deviceInfo.getMode();
|
_mode = deviceInfo.getMode();
|
||||||
_isDefault = deviceInfo.isDefault();
|
_isDefault = deviceInfo.isDefault();
|
||||||
_deviceType = deviceInfo.getDeviceType();
|
_deviceType = deviceInfo.getDeviceType();
|
||||||
|
_debugName = deviceInfo.getDevice().deviceName();
|
||||||
}
|
}
|
||||||
|
|
||||||
HifiAudioDeviceInfo(QAudioDeviceInfo deviceInfo, bool isDefault, QAudio::Mode mode, DeviceType devType=both) :
|
HifiAudioDeviceInfo(QAudioDeviceInfo deviceInfo, bool isDefault, QAudio::Mode mode, DeviceType devType=both) :
|
||||||
_audioDeviceInfo(deviceInfo),
|
_audioDeviceInfo(deviceInfo),
|
||||||
_isDefault(isDefault),
|
_isDefault(isDefault),
|
||||||
_mode(mode),
|
_mode(mode),
|
||||||
_deviceType(devType){
|
_deviceType(devType),
|
||||||
|
_debugName(deviceInfo.deviceName()) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void setMode(QAudio::Mode mode) { _mode = mode; }
|
void setMode(QAudio::Mode mode) { _mode = mode; }
|
||||||
|
@ -70,6 +72,7 @@ private:
|
||||||
bool _isDefault { false };
|
bool _isDefault { false };
|
||||||
QAudio::Mode _mode { QAudio::AudioInput };
|
QAudio::Mode _mode { QAudio::AudioInput };
|
||||||
DeviceType _deviceType{ both };
|
DeviceType _deviceType{ both };
|
||||||
|
QString _debugName;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const QString DEFAULT_DEVICE_NAME;
|
static const QString DEFAULT_DEVICE_NAME;
|
||||||
|
|
|
@ -386,8 +386,6 @@ namespace controller {
|
||||||
makeAxisPair(Action::LIPSSTRETCH_R, "LipsStretch_R"),
|
makeAxisPair(Action::LIPSSTRETCH_R, "LipsStretch_R"),
|
||||||
makeAxisPair(Action::LIPSUPPERCLOSE, "LipsUpperClose"),
|
makeAxisPair(Action::LIPSUPPERCLOSE, "LipsUpperClose"),
|
||||||
makeAxisPair(Action::LIPSLOWERCLOSE, "LipsLowerClose"),
|
makeAxisPair(Action::LIPSLOWERCLOSE, "LipsLowerClose"),
|
||||||
makeAxisPair(Action::LIPSUPPEROPEN, "LipsUpperOpen"),
|
|
||||||
makeAxisPair(Action::LIPSLOWEROPEN, "LipsLowerOpen"),
|
|
||||||
makeAxisPair(Action::LIPSFUNNEL, "LipsFunnel"),
|
makeAxisPair(Action::LIPSFUNNEL, "LipsFunnel"),
|
||||||
makeAxisPair(Action::LIPSPUCKER, "LipsPucker"),
|
makeAxisPair(Action::LIPSPUCKER, "LipsPucker"),
|
||||||
makeAxisPair(Action::PUFF, "Puff"),
|
makeAxisPair(Action::PUFF, "Puff"),
|
||||||
|
|
|
@ -220,8 +220,6 @@ enum class Action {
|
||||||
LIPSSTRETCH_R,
|
LIPSSTRETCH_R,
|
||||||
LIPSUPPERCLOSE,
|
LIPSUPPERCLOSE,
|
||||||
LIPSLOWERCLOSE,
|
LIPSLOWERCLOSE,
|
||||||
LIPSUPPEROPEN,
|
|
||||||
LIPSLOWEROPEN,
|
|
||||||
LIPSFUNNEL,
|
LIPSFUNNEL,
|
||||||
LIPSPUCKER,
|
LIPSPUCKER,
|
||||||
PUFF,
|
PUFF,
|
||||||
|
|
|
@ -392,8 +392,6 @@ Input::NamedVector StandardController::getAvailableInputs() const {
|
||||||
makePair(LIPSSTRETCH_R, "LipsStretch_R"),
|
makePair(LIPSSTRETCH_R, "LipsStretch_R"),
|
||||||
makePair(LIPSUPPERCLOSE, "LipsUpperClose"),
|
makePair(LIPSUPPERCLOSE, "LipsUpperClose"),
|
||||||
makePair(LIPSLOWERCLOSE, "LipsLowerClose"),
|
makePair(LIPSLOWERCLOSE, "LipsLowerClose"),
|
||||||
makePair(LIPSUPPEROPEN, "LipsUpperOpen"),
|
|
||||||
makePair(LIPSLOWEROPEN, "LipsLowerOpen"),
|
|
||||||
makePair(LIPSFUNNEL, "LipsFunnel"),
|
makePair(LIPSFUNNEL, "LipsFunnel"),
|
||||||
makePair(LIPSPUCKER, "LipsPucker"),
|
makePair(LIPSPUCKER, "LipsPucker"),
|
||||||
makePair(PUFF, "Puff"),
|
makePair(PUFF, "Puff"),
|
||||||
|
|
|
@ -127,8 +127,6 @@ namespace controller {
|
||||||
LIPSSTRETCH_R,
|
LIPSSTRETCH_R,
|
||||||
LIPSUPPERCLOSE,
|
LIPSUPPERCLOSE,
|
||||||
LIPSLOWERCLOSE,
|
LIPSLOWERCLOSE,
|
||||||
LIPSUPPEROPEN,
|
|
||||||
LIPSLOWEROPEN,
|
|
||||||
LIPSFUNNEL,
|
LIPSFUNNEL,
|
||||||
LIPSPUCKER,
|
LIPSPUCKER,
|
||||||
PUFF,
|
PUFF,
|
||||||
|
|
|
@ -82,6 +82,8 @@ static void fixUpLegacyBlendshapes(QVariantHash& properties) {
|
||||||
removeBlendshape(bs, "JawChew");
|
removeBlendshape(bs, "JawChew");
|
||||||
removeBlendshape(bs, "ChinLowerRaise");
|
removeBlendshape(bs, "ChinLowerRaise");
|
||||||
removeBlendshape(bs, "ChinUpperRaise");
|
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.
|
// 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");
|
splitBlendshapes(bs, "LipsUpperUp", "MouthUpperUp_L", "MouthUpperUp_R");
|
||||||
|
|
|
@ -47,8 +47,6 @@ const char* FACESHIFT_BLENDSHAPES[] = {
|
||||||
"LipsStretch_R",
|
"LipsStretch_R",
|
||||||
"LipsUpperClose",
|
"LipsUpperClose",
|
||||||
"LipsLowerClose",
|
"LipsLowerClose",
|
||||||
"LipsUpperOpen",
|
|
||||||
"LipsLowerOpen",
|
|
||||||
"LipsFunnel",
|
"LipsFunnel",
|
||||||
"LipsPucker",
|
"LipsPucker",
|
||||||
"Puff",
|
"Puff",
|
||||||
|
|
|
@ -51,8 +51,6 @@ enum class Blendshapes : int {
|
||||||
LipsStretch_R,
|
LipsStretch_R,
|
||||||
LipsUpperClose,
|
LipsUpperClose,
|
||||||
LipsLowerClose,
|
LipsLowerClose,
|
||||||
LipsUpperOpen,
|
|
||||||
LipsLowerOpen,
|
|
||||||
LipsFunnel,
|
LipsFunnel,
|
||||||
LipsPucker,
|
LipsPucker,
|
||||||
Puff,
|
Puff,
|
||||||
|
@ -114,5 +112,8 @@ enum class LegacyBlendshpaes : int {
|
||||||
// * Sneer (split in ARKit)
|
// * Sneer (split in ARKit)
|
||||||
// * ChinLowerRaise (not in ARKit)
|
// * ChinLowerRaise (not in ARKit)
|
||||||
// * ChinUpperRaise (not in ARKit)
|
// * ChinUpperRaise (not in ARKit)
|
||||||
|
// * LipsUpperOpen (not in ARKit)
|
||||||
|
// * LipsLowerOpen (not in ARKit)
|
||||||
|
|
||||||
|
|
||||||
#endif // hifi_BlendshapeConstants_h
|
#endif // hifi_BlendshapeConstants_h
|
||||||
|
|
|
@ -25,38 +25,46 @@
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><strong>First Person</strong></td>
|
* <td><strong>First Person</strong></td>
|
||||||
* <td><code>"first person"</code></td>
|
* <td><code>"first person"</code></td>
|
||||||
* <td>Legacy first person camera mode. The camera is positioned such that you have the same view as your avatar.
|
* <td><p>The camera is positioned such that you have the same view as your avatar. The camera moves and rotates with
|
||||||
* The camera moves and rotates with your avatar.</td>
|
* your avatar.</p>
|
||||||
|
* <p><em>Legacy first person camera mode.</em></p></td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><strong>First Person Look At</strong></td>
|
* <td><strong>First Person Look At</strong></td>
|
||||||
* <td><code>"first person look at"</code></td>
|
* <td><code>"first person look at"</code></td>
|
||||||
* <td>Default first person camera mode. The camera is positioned such that you have the same view as your avatar.
|
* <td><p>The camera is positioned such that you have the same view as your avatar. The camera moves and rotates with
|
||||||
* The camera moves and rotates with your avatar's head.</td>
|
* your avatar's head.</p>
|
||||||
|
* <p><em>Default first person camera mode.</em></p></td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><strong>Third Person</strong></td>
|
* <td><strong>Third Person</strong></td>
|
||||||
* <td><code>"third person"</code></td>
|
* <td><code>"third 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
|
* <td><p>The camera is positioned such that you have a view from just behind your avatar. The camera moves and rotates
|
||||||
* your avatar.</td>
|
* 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>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><strong>Look At</strong></td>
|
* <td><strong>Look At</strong></td>
|
||||||
* <td><code>"look at"</code></td>
|
* <td><code>"look at"</code></td>
|
||||||
* <td>The camera is positioned behind your avatar. The camera moves and rotates independently from your avatar.
|
* <td><p>The camera is positioned behind your avatar. The camera moves and rotates independently from your avatar. The
|
||||||
* The avatar's head always faces the camera look at point.</td>
|
* avatar's head always faces the camera look at point.</p>
|
||||||
|
* <p><em>Default third person camera mode.</em></td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><strong>Selfie</strong></td>
|
* <td><strong>Selfie</strong></td>
|
||||||
* <td><code>"selfie"</code></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.
|
* <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.</td>
|
* Your avatar's head is always facing the camera.</p>
|
||||||
|
* <p><em>Default "look at myself" camera mode.</em></p></td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><strong>Mirror</strong></td>
|
* <td><strong>Mirror</strong></td>
|
||||||
* <td><code>"mirror"</code></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
|
* <td><p>The camera is positioned such that you are looking directly at your avatar. The camera is fixed and does not
|
||||||
* avatar.</td>
|
* 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>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td><strong>Independent</strong></td>
|
* <td><strong>Independent</strong></td>
|
||||||
|
|
|
@ -398,8 +398,8 @@ const GROUPS = [
|
||||||
{
|
{
|
||||||
label: "Base",
|
label: "Base",
|
||||||
type: "number-draggable",
|
type: "number-draggable",
|
||||||
min: -1000,
|
min: -16000,
|
||||||
max: 1000,
|
max: 16000,
|
||||||
step: 1,
|
step: 1,
|
||||||
decimals: 0,
|
decimals: 0,
|
||||||
unit: "m",
|
unit: "m",
|
||||||
|
@ -409,8 +409,8 @@ const GROUPS = [
|
||||||
{
|
{
|
||||||
label: "Ceiling",
|
label: "Ceiling",
|
||||||
type: "number-draggable",
|
type: "number-draggable",
|
||||||
min: -1000,
|
min: -16000,
|
||||||
max: 5000,
|
max: 16000,
|
||||||
step: 1,
|
step: 1,
|
||||||
decimals: 0,
|
decimals: 0,
|
||||||
unit: "m",
|
unit: "m",
|
||||||
|
|
Loading…
Reference in a new issue