diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp
index 3015a638f6..644b08f03d 100644
--- a/interface/src/Menu.cpp
+++ b/interface/src/Menu.cpp
@@ -45,6 +45,7 @@
#include "ui/ModelsBrowser.h"
#include "ui/LoginDialog.h"
#include "ui/NodeBounds.h"
+#include "devices/OculusManager.h"
Menu* Menu::_instance = NULL;
@@ -83,6 +84,7 @@ Menu::Menu() :
_audioJitterBufferSamples(0),
_bandwidthDialog(NULL),
_fieldOfView(DEFAULT_FIELD_OF_VIEW_DEGREES),
+ _realWorldFieldOfView(DEFAULT_REAL_WORLD_FIELD_OF_VIEW_DEGREES),
_faceshiftEyeDeflection(DEFAULT_FACESHIFT_EYE_DEFLECTION),
_frustumDrawMode(FRUSTUM_DRAW_MODE_ALL),
_viewFrustumOffset(DEFAULT_FRUSTUM_OFFSET),
@@ -91,6 +93,9 @@ Menu::Menu() :
_lodToolsDialog(NULL),
_maxVoxels(DEFAULT_MAX_VOXELS_PER_SYSTEM),
_voxelSizeScale(DEFAULT_OCTREE_SIZE_SCALE),
+ _oculusUIAngularSize(DEFAULT_OCULUS_UI_ANGULAR_SIZE),
+ _sixenseReticleMoveSpeed(DEFAULT_SIXENSE_RETICLE_MOVE_SPEED),
+ _invertSixenseButtons(DEFAULT_INVERT_SIXENSE_MOUSE_BUTTONS),
_automaticAvatarLOD(true),
_avatarLODDecreaseFPS(DEFAULT_ADJUST_AVATAR_LOD_DOWN_FPS),
_avatarLODIncreaseFPS(ADJUST_LOD_UP_FPS),
@@ -387,7 +392,6 @@ Menu::Menu() :
QMenu* sixenseOptionsMenu = developerMenu->addMenu("Sixense Options");
addCheckableActionToQMenuAndActionHash(sixenseOptionsMenu, MenuOption::SixenseMouseInput, 0, true);
- addCheckableActionToQMenuAndActionHash(sixenseOptionsMenu, MenuOption::SixenseInvertInputButtons, 0, false);
QMenu* handOptionsMenu = developerMenu->addMenu("Hand Options");
diff --git a/interface/src/Menu.h b/interface/src/Menu.h
index 41f0b41498..4d2174a448 100644
--- a/interface/src/Menu.h
+++ b/interface/src/Menu.h
@@ -90,6 +90,12 @@ public:
void setFieldOfView(float fieldOfView) { _fieldOfView = fieldOfView; }
float getRealWorldFieldOfView() const { return _realWorldFieldOfView; }
void setRealWorldFieldOfView(float realWorldFieldOfView) { _realWorldFieldOfView = realWorldFieldOfView; }
+ float getOculusUIAngularSize() const { return _oculusUIAngularSize; }
+ void setOculusUIAngularSize(float oculusUIAngularSize) { _oculusUIAngularSize = oculusUIAngularSize; }
+ float getSixenseReticleMoveSpeed() const { return _sixenseReticleMoveSpeed; }
+ void setSixenseReticleMoveSpeed(float sixenseReticleMoveSpeed) { _sixenseReticleMoveSpeed = sixenseReticleMoveSpeed; }
+ bool getInvertSixenseButtons() const { return _invertSixenseButtons; }
+ void setInvertSixenseButtons(bool invertSixenseButtons) { _invertSixenseButtons = invertSixenseButtons; }
float getFaceshiftEyeDeflection() const { return _faceshiftEyeDeflection; }
void setFaceshiftEyeDeflection(float faceshiftEyeDeflection) { _faceshiftEyeDeflection = faceshiftEyeDeflection; }
@@ -255,6 +261,9 @@ private:
LodToolsDialog* _lodToolsDialog;
int _maxVoxels;
float _voxelSizeScale;
+ float _oculusUIAngularSize;
+ float _sixenseReticleMoveSpeed;
+ bool _invertSixenseButtons;
bool _automaticAvatarLOD;
float _avatarLODDecreaseFPS;
float _avatarLODIncreaseFPS;
@@ -400,7 +409,6 @@ namespace MenuOption {
const QString SettingsExport = "Export Settings";
const QString SettingsImport = "Import Settings";
const QString SimpleShadows = "Simple";
- const QString SixenseInvertInputButtons = "Invert Sixense Mouse Input Buttons";
const QString SixenseMouseInput = "Enable Sixense Mouse Input";
const QString ShowBordersVoxelNodes = "Show Voxel Nodes";
const QString ShowBordersModelNodes = "Show Model Nodes";
diff --git a/interface/src/devices/OculusManager.h b/interface/src/devices/OculusManager.h
index caff38a6b0..21b9d67f4d 100644
--- a/interface/src/devices/OculusManager.h
+++ b/interface/src/devices/OculusManager.h
@@ -20,6 +20,8 @@
#include "renderer/ProgramObject.h"
+const float DEFAULT_OCULUS_UI_ANGULAR_SIZE = 72.0f;
+
class Camera;
/// Handles interaction with the Oculus Rift.
diff --git a/interface/src/devices/SixenseManager.cpp b/interface/src/devices/SixenseManager.cpp
index fa902be46f..5257a777e0 100644
--- a/interface/src/devices/SixenseManager.cpp
+++ b/interface/src/devices/SixenseManager.cpp
@@ -339,7 +339,7 @@ void SixenseManager::emulateMouse(PalmData* palm, int index) {
Qt::MouseButton bumperButton;
Qt::MouseButton triggerButton;
- if (Menu::getInstance()->isOptionChecked(MenuOption::SixenseInvertInputButtons)) {
+ if (Menu::getInstance()->getInvertSixenseButtons()) {
bumperButton = Qt::LeftButton;
triggerButton = Qt::RightButton;
} else {
@@ -351,7 +351,7 @@ void SixenseManager::emulateMouse(PalmData* palm, int index) {
float xAngle = (atan2(direction.z, direction.x) + M_PI_2) + 0.5f;
float yAngle = 1.0f - ((atan2(direction.z, direction.y) + M_PI_2) + 0.5f);
- float cursorRange = widget->width();
+ float cursorRange = widget->width() * (1.0f - Menu::getInstance()->getSixenseReticleMoveSpeed() * 0.01f) * 2.0f;
pos.setX(cursorRange * xAngle);
pos.setY(cursorRange * yAngle);
diff --git a/interface/src/devices/SixenseManager.h b/interface/src/devices/SixenseManager.h
index f3c5633f90..71511cd06b 100644
--- a/interface/src/devices/SixenseManager.h
+++ b/interface/src/devices/SixenseManager.h
@@ -30,6 +30,9 @@ const unsigned int BUTTON_FWD = 1U << 7;
// Event type that represents moving the controller
const unsigned int CONTROLLER_MOVE_EVENT = 1500U;
+const float DEFAULT_SIXENSE_RETICLE_MOVE_SPEED = 1.0f;
+const bool DEFAULT_INVERT_SIXENSE_MOUSE_BUTTONS = true;
+
/// Handles interaction with the Sixense SDK (e.g., Razer Hydra).
class SixenseManager : public QObject {
Q_OBJECT
diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp
index 95ac803e37..a45e42dc0b 100644
--- a/interface/src/ui/ApplicationOverlay.cpp
+++ b/interface/src/ui/ApplicationOverlay.cpp
@@ -33,7 +33,7 @@ ApplicationOverlay::ApplicationOverlay() :
_framebufferObject(NULL),
_oculusAngle(65.0f * RADIANS_PER_DEGREE),
_distance(0.5f),
- _textureFov(PI / 2.5f),
+ _textureFov(DEFAULT_OCULUS_UI_ANGULAR_SIZE * RADIANS_PER_DEGREE),
_uiType(HEMISPHERE) {
}
@@ -50,6 +50,8 @@ const float WHITE_TEXT[] = { 0.93f, 0.93f, 0.93f };
void ApplicationOverlay::renderOverlay(bool renderToTexture) {
PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "ApplicationOverlay::displayOverlay()");
+ _textureFov = Menu::getInstance()->getOculusUIAngularSize() * RADIANS_PER_DEGREE;
+
Application* application = Application::getInstance();
Overlays& overlays = application->getOverlays();
@@ -154,8 +156,6 @@ void ApplicationOverlay::displayOverlayTextureOculus(Camera& whichCamera) {
MyAvatar* myAvatar = application->getAvatar();
const glm::vec3& viewMatrixTranslation = application->getViewMatrixTranslation();
-
-
// Get vertical FoV of the displayed overlay texture
const float halfVerticalAngle = _oculusAngle / 2.0f;
const float overlayAspectRatio = glWidget->width() / (float)glWidget->height();
@@ -338,7 +338,7 @@ void ApplicationOverlay::renderControllerPointer() {
float xAngle = (atan2(direction.z, direction.x) + M_PI_2) + 0.5f;
float yAngle = 1.0f - ((atan2(direction.z, direction.y) + M_PI_2) + 0.5f);
- float cursorRange = glWidget->width();
+ float cursorRange = glWidget->width() * (1.0f - Menu::getInstance()->getSixenseReticleMoveSpeed() * 0.01f) * 2.0f;
int mouseX = cursorRange * xAngle;
int mouseY = cursorRange * yAngle;
diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h
index 03a323cd5d..b6066099fa 100644
--- a/interface/src/ui/ApplicationOverlay.h
+++ b/interface/src/ui/ApplicationOverlay.h
@@ -31,10 +31,7 @@ public:
// Getters
QOpenGLFramebufferObject* getFramebufferObject();
- float getOculusAngle() const { return _oculusAngle; }
-
- // Setters
- void setOculusAngle(float oculusAngle) { _oculusAngle = oculusAngle; }
+
void setUIType(UIType uiType) { _uiType = uiType; }
private:
diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp
index d5c6079d4b..5e6c6984eb 100644
--- a/interface/src/ui/PreferencesDialog.cpp
+++ b/interface/src/ui/PreferencesDialog.cpp
@@ -137,6 +137,13 @@ void PreferencesDialog::loadPreferences() {
ui.maxVoxelsSpin->setValue(menuInstance->getMaxVoxels());
ui.maxVoxelsPPSSpin->setValue(menuInstance->getMaxVoxelPacketsPerSecond());
+
+ ui.oculusUIAngularSizeSpin->setValue(menuInstance->getOculusUIAngularSize());
+
+ ui.sixenseReticleMoveSpeedSpin->setValue(menuInstance->getSixenseReticleMoveSpeed());
+
+ ui.invertSixenseButtonsCheckBox->setChecked(menuInstance->getInvertSixenseButtons());
+
}
void PreferencesDialog::savePreferences() {
@@ -189,6 +196,12 @@ void PreferencesDialog::savePreferences() {
(float)ui.faceshiftEyeDeflectionSider->maximum());
Menu::getInstance()->setMaxVoxelPacketsPerSecond(ui.maxVoxelsPPSSpin->value());
+ Menu::getInstance()->setOculusUIAngularSize(ui.oculusUIAngularSizeSpin->value());
+
+ Menu::getInstance()->setSixenseReticleMoveSpeed(ui.sixenseReticleMoveSpeedSpin->value());
+
+ Menu::getInstance()->setInvertSixenseButtons(ui.invertSixenseButtonsCheckBox->isChecked());
+
Menu::getInstance()->setAudioJitterBufferSamples(ui.audioJitterSpin->value());
Application::getInstance()->getAudio()->setJitterBufferSamples(ui.audioJitterSpin->value());
diff --git a/interface/ui/preferencesDialog.ui b/interface/ui/preferencesDialog.ui
index a1c2073ab6..f00d7c4788 100644
--- a/interface/ui/preferencesDialog.ui
+++ b/interface/ui/preferencesDialog.ui
@@ -154,9 +154,9 @@ color: #0e7077
0
- -204
- 494
- 1091
+ -1002
+ 477
+ 1386
@@ -1605,6 +1605,331 @@ padding: 10px;margin-top:10px
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 40
+
+
+
+
+ Arial
+ 20
+ 50
+ false
+
+
+
+ color: #0e7077
+
+
+ Oculus Rift
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+
+ -
+
+
+ 0
+
+
+ 10
+
+
+ 0
+
+
+ 10
+
+
-
+
+
+
+ Arial
+
+
+
+ color: rgb(51, 51, 51)
+
+
+ User Interface Angular Size
+
+
+ 15
+
+
+ maxVoxelsSpin
+
+
+
+ -
+
+
+
+ Arial
+
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 125
+ 36
+
+
+
+
+ Arial
+
+
+
+ 30
+
+
+ 160
+
+
+ 1
+
+
+ 72
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 40
+
+
+
+
+ Arial
+ 20
+ 50
+ false
+
+
+
+ color: #0e7077
+
+
+ Sixense Controllers
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+
+ -
+
+
+ 0
+
+
+ 10
+
+
+ 0
+
+
+ 10
+
+
-
+
+
+
+ Arial
+
+
+
+ color: rgb(51, 51, 51)
+
+
+ Invert Mouse Buttons
+
+
+ 15
+
+
+ maxVoxelsSpin
+
+
+
+ -
+
+
+
+ Arial
+
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 32
+ 0
+
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+ 32
+ 32
+
+
+
+
+
+
+ -
+
+
+ 0
+
+
+ 10
+
+
+ 0
+
+
+ 10
+
+
-
+
+
+
+ Arial
+
+
+
+ color: rgb(51, 51, 51)
+
+
+ Reticle Movement Speed
+
+
+ 15
+
+
+ maxVoxelsSpin
+
+
+
+ -
+
+
+
+ Arial
+
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 125
+ 36
+
+
+
+
+ Arial
+
+
+
+ 100
+
+
+ 1
+
+
+ 50
+
+
+
+
+