From 3bc8e0f72617456e699a345884424187437f17a9 Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Wed, 21 May 2014 11:21:12 -0700 Subject: [PATCH 1/5] Made third person work with oculus --- interface/src/Application.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b73ff41956..ad0d63a8a0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -557,8 +557,10 @@ void Application::paintGL() { float pushback = 0.0f; float pushbackFocalLength = 0.0f; if (OculusManager::isConnected()) { + if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { + _myCamera.setDistance(0.0f); + } _myCamera.setUpShift(0.0f); - _myCamera.setDistance(0.0f); _myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing } From b5ad295756e35c2f0df518e531a1cc3c23b6555c Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Wed, 21 May 2014 11:24:39 -0700 Subject: [PATCH 2/5] Fixed improper coding style in previous pull request --- interface/src/Audio.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 5581c9d571..c5d6ba23cf 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -202,7 +202,7 @@ QAudioDeviceInfo defaultAudioDeviceForMode(QAudio::Mode mode) { CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pMMDeviceEnumerator); IMMDevice* pEndpoint; hr = pMMDeviceEnumerator->GetDefaultAudioEndpoint(mode == QAudio::AudioOutput ? eRender : eCapture, eMultimedia, &pEndpoint); - if (hr == E_NOTFOUND){ + if (hr == E_NOTFOUND) { printf("Audio Error: device not found\n"); deviceName = QString("NONE"); } else { diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 420362a415..d0adebb7e2 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -266,7 +266,7 @@ void MyAvatar::updateFromTrackers(float deltaTime) { Head* head = getHead(); - if (OculusManager::isConnected()){ + if (OculusManager::isConnected()) { head->setDeltaPitch(estimatedRotation.x); head->setDeltaYaw(estimatedRotation.y); } else { From 21f03a4fb5d651e5b91d52da76b8f675d16e36f9 Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Wed, 21 May 2014 12:43:44 -0700 Subject: [PATCH 3/5] Made oculus camera modes only active when AllowOculusCameraModeChange is checked. --- interface/src/Application.cpp | 22 ++++++++++++++-------- interface/src/Menu.cpp | 1 + interface/src/Menu.h | 1 + 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ad0d63a8a0..fc0c810108 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -555,14 +555,7 @@ void Application::paintGL() { glEnable(GL_LINE_SMOOTH); float pushback = 0.0f; - float pushbackFocalLength = 0.0f; - if (OculusManager::isConnected()) { - if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { - _myCamera.setDistance(0.0f); - } - _myCamera.setUpShift(0.0f); - _myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing - } + float pushbackFocalLength = 0.0f; if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { _myCamera.setTightness(0.0f); // In first person, camera follows (untweaked) head exactly without delay @@ -590,6 +583,19 @@ void Application::paintGL() { pushback = relativePosition.z + pushbackRadius - _myCamera.getDistance(); pushbackFocalLength = _myCamera.getDistance(); } + + if (OculusManager::isConnected()) { + // OR in third person causes nausea, so only allow it if option is checked in dev menu + if (!Menu::getInstance()->isOptionChecked(MenuOption::AllowOculusCameraModeChange) || _myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { + _myCamera.setDistance(0.0f); + _myCamera.setTargetPosition(_myAvatar->getHead()->calculateAverageEyePosition()); + _myCamera.setTargetRotation(_myAvatar->getHead()->getCameraOrientation()); + pushback = 0.0f; + pushbackFocalLength = 0.0f; + } + _myCamera.setUpShift(0.0f); + _myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing + } // handle pushback, if any if (pushbackFocalLength > 0.0f) { diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index bff08d5221..c8bf194b25 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -327,6 +327,7 @@ Menu::Menu() : QMenu* avatarOptionsMenu = developerMenu->addMenu("Avatar Options"); + addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::AllowOculusCameraModeChange, 0, false); addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::Avatars, 0, true); addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::RenderSkeletonCollisionShapes); addCheckableActionToQMenuAndActionHash(avatarOptionsMenu, MenuOption::RenderHeadCollisionShapes); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 0a21a27960..9043825b72 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -267,6 +267,7 @@ private: namespace MenuOption { const QString AboutApp = "About Interface"; const QString AlignForearmsWithWrists = "Align Forearms with Wrists"; + const QString AllowOculusCameraModeChange = "Allow Oculus Camera Mode Change (Nausea)"; const QString AlternateIK = "Alternate IK"; const QString AmbientOcclusion = "Ambient Occlusion"; const QString Atmosphere = "Atmosphere"; From 97c0a2fc98912c8fd99b080f605d853ea8fd9f9c Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Wed, 21 May 2014 15:32:23 -0700 Subject: [PATCH 4/5] Made mirror view remain constant no matter what the avatar scale is set to. --- interface/src/Application.cpp | 34 ++-------------------------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fc0c810108..53be1c0faf 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -553,9 +553,6 @@ void Application::paintGL() { PerformanceWarning warn(showWarnings, "Application::paintGL()"); glEnable(GL_LINE_SMOOTH); - - float pushback = 0.0f; - float pushbackFocalLength = 0.0f; if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { _myCamera.setTightness(0.0f); // In first person, camera follows (untweaked) head exactly without delay @@ -571,52 +568,25 @@ void Application::paintGL() { _myCamera.setTightness(0.0f); glm::vec3 eyePosition = _myAvatar->getHead()->calculateAverageEyePosition(); float headHeight = eyePosition.y - _myAvatar->getPosition().y; - _myCamera.setDistance(MIRROR_FULLSCREEN_DISTANCE * _myAvatar->getScale() * _scaleMirror); + _myCamera.setDistance(MIRROR_FULLSCREEN_DISTANCE * _scaleMirror); _myCamera.setTargetPosition(_myAvatar->getPosition() + glm::vec3(0, headHeight + (_raiseMirror * _myAvatar->getScale()), 0)); _myCamera.setTargetRotation(_myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f))); - - // if the head would intersect the near clip plane, we must push the camera out - glm::vec3 relativePosition = glm::inverse(_myCamera.getTargetRotation()) * - (eyePosition - _myCamera.getTargetPosition()); - const float BASE_PUSHBACK_RADIUS = 0.2f; - float pushbackRadius = _myCamera.getNearClip() + _myAvatar->getScale() * BASE_PUSHBACK_RADIUS; - pushback = relativePosition.z + pushbackRadius - _myCamera.getDistance(); - pushbackFocalLength = _myCamera.getDistance(); } if (OculusManager::isConnected()) { - // OR in third person causes nausea, so only allow it if option is checked in dev menu + // Oculus in third person causes nausea, so only allow it if option is checked in dev menu if (!Menu::getInstance()->isOptionChecked(MenuOption::AllowOculusCameraModeChange) || _myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) { _myCamera.setDistance(0.0f); _myCamera.setTargetPosition(_myAvatar->getHead()->calculateAverageEyePosition()); _myCamera.setTargetRotation(_myAvatar->getHead()->getCameraOrientation()); - pushback = 0.0f; - pushbackFocalLength = 0.0f; } _myCamera.setUpShift(0.0f); _myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing } - - // handle pushback, if any - if (pushbackFocalLength > 0.0f) { - const float PUSHBACK_DECAY = 0.5f; - _cameraPushback = qMax(pushback, _cameraPushback * PUSHBACK_DECAY); - if (_cameraPushback > EPSILON) { - _myCamera.setTargetPosition(_myCamera.getTargetPosition() + - _myCamera.getTargetRotation() * glm::vec3(0.0f, 0.0f, _cameraPushback)); - float enlargement = pushbackFocalLength / (pushbackFocalLength + _cameraPushback); - _myCamera.setFieldOfView(glm::degrees(2.0f * atanf(enlargement * tanf( - glm::radians(Menu::getInstance()->getFieldOfView() * 0.5f))))); - } else { - _myCamera.setFieldOfView(Menu::getInstance()->getFieldOfView()); - } - updateProjectionMatrix(_myCamera, true); - } // Update camera position _myCamera.update( 1.f/_fps ); - // Note: whichCamera is used to pick between the normal camera myCamera for our // main camera, vs, an alternate camera. The alternate camera we support right now // is the viewFrustumOffsetCamera. But theoretically, we could use this same mechanism From dad2788b8cd798e9662cc5fa5f5dcd2b1bc32c43 Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Wed, 21 May 2014 17:45:17 -0700 Subject: [PATCH 5/5] Moved 'I am looking at' ball to be immediately above name text, and reduced opacity --- interface/src/avatar/Avatar.cpp | 29 +++++++++++++++++++---------- interface/src/avatar/Avatar.h | 1 + 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 0a3411f858..aff15f4e0b 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -237,11 +237,15 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode) { // If this is the avatar being looked at, render a little ball above their head if (_isLookAtTarget) { const float LOOK_AT_INDICATOR_RADIUS = 0.03f; - const float LOOK_AT_INDICATOR_HEIGHT = 0.60f; - const float LOOK_AT_INDICATOR_COLOR[] = { 0.8f, 0.0f, 0.0f, 0.5f }; + const float LOOK_AT_INDICATOR_OFFSET = 0.22f; + const float LOOK_AT_INDICATOR_COLOR[] = { 0.8f, 0.0f, 0.0f, 0.75f }; glPushMatrix(); glColor4fv(LOOK_AT_INDICATOR_COLOR); - glTranslatef(_position.x, _position.y + (getSkeletonHeight() * LOOK_AT_INDICATOR_HEIGHT), _position.z); + if (_displayName.isEmpty() || _displayNameAlpha == 0.0f) { + glTranslatef(_position.x, getDisplayNamePosition().y, _position.z); + } else { + glTranslatef(_position.x, getDisplayNamePosition().y + LOOK_AT_INDICATOR_OFFSET, _position.z); + } glutSolidSphere(LOOK_AT_INDICATOR_RADIUS, 15, 15); glPopMatrix(); } @@ -460,6 +464,17 @@ float Avatar::getBillboardSize() const { return _scale * BILLBOARD_DISTANCE * tanf(glm::radians(BILLBOARD_FIELD_OF_VIEW / 2.0f)); } +glm::vec3 Avatar::getDisplayNamePosition() { + glm::vec3 namePosition; + if (getSkeletonModel().getNeckPosition(namePosition)) { + namePosition += getBodyUpDirection() * getHeadHeight() * 1.1f; + } else { + const float HEAD_PROPORTION = 0.75f; + namePosition = _position + getBodyUpDirection() * (getBillboardSize() * HEAD_PROPORTION); + } + return namePosition; +} + void Avatar::renderDisplayName() { if (_displayName.isEmpty() || _displayNameAlpha == 0.0f) { @@ -469,13 +484,7 @@ void Avatar::renderDisplayName() { glDisable(GL_LIGHTING); glPushMatrix(); - glm::vec3 textPosition; - if (getSkeletonModel().getNeckPosition(textPosition)) { - textPosition += getBodyUpDirection() * getHeadHeight() * 1.1f; - } else { - const float HEAD_PROPORTION = 0.75f; - textPosition = _position + getBodyUpDirection() * (getBillboardSize() * HEAD_PROPORTION); - } + glm::vec3 textPosition = getDisplayNamePosition(); glTranslatef(textPosition.x, textPosition.y, textPosition.z); diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index c2a8af55b2..db13656546 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -185,6 +185,7 @@ protected: float getHeadHeight() const; float getPelvisFloatingHeight() const; float getPelvisToHeadLength() const; + glm::vec3 getDisplayNamePosition(); void renderDisplayName(); virtual void renderBody(RenderMode renderMode, float glowLevel = 0.0f);