From 63533e66c17c9ab53b3d8895225dd43179374285 Mon Sep 17 00:00:00 2001 From: stojce Date: Fri, 18 Oct 2013 00:22:25 +0200 Subject: [PATCH 1/8] render mirror box --- interface/src/Application.cpp | 14 ++++++++++++-- interface/src/Application.h | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f9424500a7..47280e2c18 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -425,7 +425,6 @@ void Application::paintGL() { } else { _glowEffect.prepare(); - glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); @@ -434,6 +433,17 @@ void Application::paintGL() { _glowEffect.render(); + // mirror + if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { + glViewport(50, 600, 265, 215); + glLogicOp(GL_CLEAR); + _mirrorCamera.setMode(CAMERA_MODE_MIRROR); + displaySide(_mirrorCamera); + + glViewport(0, 0, _glWidget->width(), _glWidget->height()); + } + // mirror + displayOverlay(); } @@ -2482,7 +2492,6 @@ void Application::displaySide(Camera& whichCamera) { if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { glScalef(-1.0f, 1.0f, 1.0f); glFrontFace(GL_CW); - } else { glFrontFace(GL_CCW); } @@ -2770,6 +2779,7 @@ void Application::displaySide(Camera& whichCamera) { glPopMatrix(); } + } void Application::displayOverlay() { diff --git a/interface/src/Application.h b/interface/src/Application.h index 595f337bf5..cd4cb39ad5 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -294,6 +294,7 @@ private: Camera _myCamera; // My view onto the world Camera _viewFrustumOffsetCamera; // The camera we use to sometimes show the view frustum from an offset mode + Camera _mirrorCamera; Environment _environment; From 4ba071adba686d074c7377bd7aca864cc0f292ca Mon Sep 17 00:00:00 2001 From: stojce Date: Sun, 20 Oct 2013 14:32:22 +0200 Subject: [PATCH 2/8] Revert "render mirror box" This reverts commit 63533e66c17c9ab53b3d8895225dd43179374285. --- interface/src/Application.cpp | 14 ++------------ interface/src/Application.h | 1 - 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2c32a7f126..3c1cd23a2a 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -425,6 +425,7 @@ void Application::paintGL() { } else { _glowEffect.prepare(); + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); @@ -433,17 +434,6 @@ void Application::paintGL() { _glowEffect.render(); - // mirror - if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { - glViewport(50, 600, 265, 215); - glLogicOp(GL_CLEAR); - _mirrorCamera.setMode(CAMERA_MODE_MIRROR); - displaySide(_mirrorCamera); - - glViewport(0, 0, _glWidget->width(), _glWidget->height()); - } - // mirror - displayOverlay(); } @@ -2492,6 +2482,7 @@ void Application::displaySide(Camera& whichCamera) { if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { glScalef(-1.0f, 1.0f, 1.0f); glFrontFace(GL_CW); + } else { glFrontFace(GL_CCW); } @@ -2779,7 +2770,6 @@ void Application::displaySide(Camera& whichCamera) { glPopMatrix(); } - } void Application::displayOverlay() { diff --git a/interface/src/Application.h b/interface/src/Application.h index cd4cb39ad5..595f337bf5 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -294,7 +294,6 @@ private: Camera _myCamera; // My view onto the world Camera _viewFrustumOffsetCamera; // The camera we use to sometimes show the view frustum from an offset mode - Camera _mirrorCamera; Environment _environment; From b45525ae21595408a309b9d2695ada6581bb9ad2 Mon Sep 17 00:00:00 2001 From: stojce Date: Mon, 21 Oct 2013 08:28:38 +0200 Subject: [PATCH 3/8] Mirror View initial setup --- interface/src/Application.cpp | 82 +++++++++++++++++++------------ interface/src/Application.h | 1 + interface/src/Camera.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 2 +- 4 files changed, 54 insertions(+), 33 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7c7ab7aab6..48e6d1d176 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -86,6 +86,11 @@ const int STARTUP_JITTER_SAMPLES = PACKET_LENGTH_SAMPLES_PER_CHANNEL / 2; // will start playback on the second received audio packet. +const int MIRROR_VIEW_TOP_PADDING = 5; +const int MIRROR_VIEW_LEFT_PADDING = 10; +const int MIRROR_VIEW_WIDTH = 265; +const int MIRROR_VIEW_HEIGHT = 215; + void messageHandler(QtMsgType type, const QMessageLogContext& context, const QString &message) { fprintf(stdout, "%s", message.toLocal8Bit().constData()); LogDisplay::instance.addMessage(message.toLocal8Bit().constData()); @@ -360,20 +365,7 @@ void Application::paintGL() { glEnable(GL_LINE_SMOOTH); - if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { - _myCamera.setTightness (100.0f); - glm::vec3 targetPosition = _myAvatar.getUprightHeadPosition(); - if (_myAvatar.getHead().getBlendFace().isActive()) { - // make sure we're aligned to the blend face eyes - glm::vec3 leftEyePosition, rightEyePosition; - if (_myAvatar.getHead().getBlendFace().getEyePositions(leftEyePosition, rightEyePosition, true)) { - targetPosition = (leftEyePosition + rightEyePosition) * 0.5f; - } - } - _myCamera.setTargetPosition(targetPosition); - _myCamera.setTargetRotation(_myAvatar.getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PIf, 0.0f))); - - } else if (OculusManager::isConnected()) { + if (OculusManager::isConnected()) { _myCamera.setUpShift (0.0f); _myCamera.setDistance (0.0f); _myCamera.setTightness (0.0f); // Camera is directly connected to head without smoothing @@ -434,6 +426,35 @@ void Application::paintGL() { _glowEffect.render(); + if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { + + glm::vec3 targetPosition = _myAvatar.getEyeLevelPosition(); + if (_myAvatar.getHead().getBlendFace().isActive()) { + // make sure we're aligned to the blend face eyes + glm::vec3 leftEyePosition, rightEyePosition; + if (_myAvatar.getHead().getBlendFace().getEyePositions(leftEyePosition, rightEyePosition, true)) { + targetPosition = (leftEyePosition + rightEyePosition) * 0.5f; + } + } + + _mirrorCamera.setTargetPosition(targetPosition); + _mirrorCamera.setTargetRotation(_myAvatar.getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PIf, 0.0f))); + _mirrorCamera.update(1.0f/_fps); + + glViewport(MIRROR_VIEW_LEFT_PADDING, _glWidget->height() - MIRROR_VIEW_HEIGHT - MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT); + glScissor(MIRROR_VIEW_LEFT_PADDING, _glWidget->height() - MIRROR_VIEW_HEIGHT - MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT); + + glEnable(GL_SCISSOR_TEST); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glPushMatrix(); + displaySide(_mirrorCamera); + glPopMatrix(); + + // reset Viewport + glViewport(0, 0, _glWidget->width(), _glWidget->height()); + glDisable(GL_SCISSOR_TEST); + } + displayOverlay(); } @@ -1608,7 +1629,10 @@ void Application::init() { _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); _myCamera.setModeShiftRate(1.0f); _myAvatar.setDisplayingLookatVectors(false); - + _mirrorCamera.setMode(CAMERA_MODE_MIRROR); + _mirrorCamera.setModeShiftRate(1.0f); + _mirrorCamera.setAspectRatio(MIRROR_VIEW_WIDTH / MIRROR_VIEW_HEIGHT); + _mirrorCamera.setFieldOfView(DEFAULT_FIELD_OF_VIEW_DEGREES); OculusManager::connect(); if (OculusManager::isConnected()) { @@ -2061,12 +2085,7 @@ void Application::update(float deltaTime) { } if (!OculusManager::isConnected()) { - if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { - if (_myCamera.getMode() != CAMERA_MODE_MIRROR) { - _myCamera.setMode(CAMERA_MODE_MIRROR); - _myCamera.setModeShiftRate(100.0f); - } - } else if (Menu::getInstance()->isOptionChecked(MenuOption::FirstPerson)) { + if (Menu::getInstance()->isOptionChecked(MenuOption::FirstPerson)) { if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON) { _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); _myCamera.setModeShiftRate(1.0f); @@ -2079,7 +2098,7 @@ void Application::update(float deltaTime) { } if (Menu::getInstance()->isOptionChecked(MenuOption::OffAxisProjection)) { - float xSign = Menu::getInstance()->isOptionChecked(MenuOption::Mirror) ? 1.0f : -1.0f; + float xSign = _myCamera.getMode() != CAMERA_MODE_MIRROR ? 1.0f : -1.0f; if (_faceshift.isActive()) { const float EYE_OFFSET_SCALE = 0.025f; glm::vec3 position = _faceshift.getHeadTranslation() * EYE_OFFSET_SCALE; @@ -2368,7 +2387,7 @@ void Application::displayOculus(Camera& whichCamera) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluOrtho2D(0, _glWidget->width(), 0, _glWidget->height()); + gluOrtho2D(0, _glWidget->width(), 0, _glWidget->height()); glDisable(GL_DEPTH_TEST); // for reference on setting these values, see SDK file Samples/OculusRoomTiny/RenderTiny_Device.cpp @@ -2446,12 +2465,14 @@ void Application::computeOffAxisFrustum(float& left, float& right, float& bottom _viewFrustum.computeOffAxisFrustum(left, right, bottom, top, near, far, nearClipPlane, farClipPlane); + /* // when mirrored, we must flip left and right - if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { + if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { float tmp = left; left = -right; right = -tmp; } + */ } void Application::displaySide(Camera& whichCamera) { @@ -2459,7 +2480,7 @@ void Application::displaySide(Camera& whichCamera) { // transform by eye offset // flip x if in mirror mode (also requires reversing winding order for backface culling) - if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { + if (whichCamera.getMode() == CAMERA_MODE_MIRROR) { glScalef(-1.0f, 1.0f, 1.0f); glFrontFace(GL_CW); @@ -2664,7 +2685,7 @@ void Application::displaySide(Camera& whichCamera) { } // Set lookAt to myCamera on client side if other avatars are looking at client if (isLookingAtMyAvatar(avatar)) { - avatar->getHead().setLookAtPosition(_myCamera.getPosition()); + avatar->getHead().setLookAtPosition(whichCamera.getPosition()); } avatar->render(false, Menu::getInstance()->isOptionChecked(MenuOption::AvatarAsBalls)); avatar->setDisplayingLookatVectors(Menu::getInstance()->isOptionChecked(MenuOption::LookAtVectors)); @@ -2674,10 +2695,10 @@ void Application::displaySide(Camera& whichCamera) { } // Render my own Avatar - if (_myCamera.getMode() == CAMERA_MODE_MIRROR && !_faceshift.isActive()) { - _myAvatar.getHead().setLookAtPosition(_myCamera.getPosition()); + if (whichCamera.getMode() == CAMERA_MODE_MIRROR && !_faceshift.isActive()) { + _myAvatar.getHead().setLookAtPosition(whichCamera.getPosition()); } - _myAvatar.render(Menu::getInstance()->isOptionChecked(MenuOption::Mirror), + _myAvatar.render(whichCamera.getMode() == CAMERA_MODE_MIRROR, Menu::getInstance()->isOptionChecked(MenuOption::AvatarAsBalls)); _myAvatar.setDisplayingLookatVectors(Menu::getInstance()->isOptionChecked(MenuOption::LookAtVectors)); @@ -2689,7 +2710,7 @@ void Application::displaySide(Camera& whichCamera) { _myAvatar.renderScreenTint(SCREEN_TINT_AFTER_AVATARS, whichCamera); // Render the world box - if (!Menu::getInstance()->isOptionChecked(MenuOption::Mirror) && Menu::getInstance()->isOptionChecked(MenuOption::Stats)) { + if (whichCamera.getMode() != CAMERA_MODE_MIRROR && Menu::getInstance()->isOptionChecked(MenuOption::Stats)) { renderWorldBox(); } @@ -2782,7 +2803,6 @@ void Application::displayOverlay() { //noiseTest(_glWidget->width(), _glWidget->height()); if (Menu::getInstance()->isOptionChecked(MenuOption::HeadMouse) - && !Menu::getInstance()->isOptionChecked(MenuOption::Mirror) && USING_INVENSENSE_MPU9150) { // Display small target box at center or head mouse target that can also be used to measure LOD glColor3f(1.0, 1.0, 1.0); diff --git a/interface/src/Application.h b/interface/src/Application.h index 0aae683844..8f63337cb0 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -291,6 +291,7 @@ private: Camera _myCamera; // My view onto the world Camera _viewFrustumOffsetCamera; // The camera we use to sometimes show the view frustum from an offset mode + Camera _mirrorCamera; // Cammera for mirror view Environment _environment; diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index 6b99f9db2e..94bc693c2b 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -23,7 +23,7 @@ const float CAMERA_THIRD_PERSON_MODE_DISTANCE = 1.5f; const float CAMERA_THIRD_PERSON_MODE_TIGHTNESS = 8.0f; const float CAMERA_MIRROR_MODE_UP_SHIFT = 0.0f; -const float CAMERA_MIRROR_MODE_DISTANCE = 0.3f; +const float CAMERA_MIRROR_MODE_DISTANCE = 0.17f; const float CAMERA_MIRROR_MODE_TIGHTNESS = 100.0f; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index e1c18089fd..c59f12044f 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -597,7 +597,7 @@ float MyAvatar::getBallRenderAlpha(int ball, bool lookingInMirror) const { void MyAvatar::renderBody(bool lookingInMirror, bool renderAvatarBalls) { - if (Application::getInstance()->getCamera()->getMode() == CAMERA_MODE_FIRST_PERSON) { + if (Application::getInstance()->getCamera()->getMode() == CAMERA_MODE_FIRST_PERSON && !lookingInMirror) { // Dont display body, only the hand _hand.render(lookingInMirror); From 890313b8ca2ce4c132bd9d7eb3fea2ba01d52049 Mon Sep 17 00:00:00 2001 From: stojce Date: Mon, 21 Oct 2013 23:55:08 +0200 Subject: [PATCH 4/8] - fixed aspect ratio on mirror view - stop rendering voxel selectors on mirror view --- interface/src/Application.cpp | 16 ++++++++++++---- interface/src/Application.h | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 48e6d1d176..a39f34f331 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -444,6 +444,8 @@ void Application::paintGL() { glViewport(MIRROR_VIEW_LEFT_PADDING, _glWidget->height() - MIRROR_VIEW_HEIGHT - MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT); glScissor(MIRROR_VIEW_LEFT_PADDING, _glWidget->height() - MIRROR_VIEW_HEIGHT - MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT); + updateProjectionMatrix(_mirrorCamera); + glEnable(GL_SCISSOR_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); @@ -453,6 +455,8 @@ void Application::paintGL() { // reset Viewport glViewport(0, 0, _glWidget->width(), _glWidget->height()); glDisable(GL_SCISSOR_TEST); + + updateProjectionMatrix(); } displayOverlay(); @@ -485,11 +489,15 @@ void Application::resizeGL(int width, int height) { } void Application::updateProjectionMatrix() { + updateProjectionMatrix(_myCamera); +} + +void Application::updateProjectionMatrix(Camera& camera) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Tell our viewFrustum about this change, using the application camera - loadViewFrustum(_myCamera, _viewFrustum); + loadViewFrustum(camera, _viewFrustum); float left, right, bottom, top, nearVal, farVal; glm::vec4 nearClipPlane, farClipPlane; @@ -1631,7 +1639,7 @@ void Application::init() { _myAvatar.setDisplayingLookatVectors(false); _mirrorCamera.setMode(CAMERA_MODE_MIRROR); _mirrorCamera.setModeShiftRate(1.0f); - _mirrorCamera.setAspectRatio(MIRROR_VIEW_WIDTH / MIRROR_VIEW_HEIGHT); + _mirrorCamera.setAspectRatio((float)MIRROR_VIEW_WIDTH / (float)MIRROR_VIEW_HEIGHT); _mirrorCamera.setFieldOfView(DEFAULT_FIELD_OF_VIEW_DEGREES); OculusManager::connect(); @@ -2601,7 +2609,7 @@ void Application::displaySide(Camera& whichCamera) { glMaterialfv(GL_FRONT, GL_SPECULAR, WHITE_SPECULAR_COLOR); // indicate what we'll be adding/removing in mouse mode, if anything - if (_mouseVoxel.s != 0) { + if (_mouseVoxel.s != 0 && whichCamera.getMode() != CAMERA_MODE_MIRROR) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide() ... voxels TOOLS UX..."); @@ -2649,7 +2657,7 @@ void Application::displaySide(Camera& whichCamera) { glEnable(GL_LIGHTING); } - if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode) && _pasteMode) { + if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode) && _pasteMode && whichCamera.getMode() != CAMERA_MODE_MIRROR) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide() ... PASTE Preview..."); diff --git a/interface/src/Application.h b/interface/src/Application.h index 8f63337cb0..6160f00b17 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -196,6 +196,7 @@ private slots: private: void resetCamerasOnResizeGL(Camera& camera, int width, int height); void updateProjectionMatrix(); + void updateProjectionMatrix(Camera& camera); static bool sendVoxelsOperation(VoxelNode* node, void* extraData); static void processAvatarURLsMessage(unsigned char* packetData, size_t dataBytes); From 2fcb2469232ad5069af7c866031cee9da87ffbf1 Mon Sep 17 00:00:00 2001 From: stojce Date: Tue, 22 Oct 2013 20:42:31 +0200 Subject: [PATCH 5/8] close button on rear mirror view --- interface/resources/images/close.png | Bin 0 -> 3817 bytes interface/resources/images/close.svg | 16 ++++ interface/src/Application.cpp | 112 ++++++++++++++++++++------- interface/src/Application.h | 6 +- interface/src/Audio.cpp | 4 +- 5 files changed, 108 insertions(+), 30 deletions(-) create mode 100644 interface/resources/images/close.png create mode 100644 interface/resources/images/close.svg diff --git a/interface/resources/images/close.png b/interface/resources/images/close.png new file mode 100644 index 0000000000000000000000000000000000000000..8090e3d3d090a60ec2e8b0591b6e088baef2db03 GIT binary patch literal 3817 zcmVX+uL$Nkc;* zP;zf(X>4Tx07wm;mUmQB*%pV-y*Itk5+Wca^cs2zAksTX6$DXM^`x7XQc?|s+0 z08spb1j2M!0f022SQPH-!CVp(%f$Br7!UytSOLJ{W@ZFO_(THK{JlMynW#v{v-a*T zfMmPdEWc1DbJqWVks>!kBnAKqMb$PuekK>?0+ds;#ThdH1j_W4DKdsJG8Ul;qO2n0 z#IJ1jr{*iW$(WZWsE0n`c;fQ!l&-AnmjxZO1uWyz`0VP>&nP`#itsL#`S=Q!g`M=rU9)45( zJ;-|dRq-b5&z?byo>|{)?5r=n76A4nTALlSzLiw~v~31J<>9PP?;rs31pu_(obw)r zY+jPY;tVGXi|p)da{-@gE-UCa`=5eu%D;v=_nFJ?`&K)q7e9d`Nfk3?MdhZarb|T3 z%nS~f&t(1g5dY)AIcd$w!z`Siz!&j_=v7hZlnI21XuE|xfmo0(WD10T)!}~_HYW!e zew}L+XmwuzeT6wtxJd`dZ#@7*BLgIEKY9Xv>st^p3dp{^Xswa2bB{85{^$B13tWnB z;Y>jyQ|9&zk7RNsqAVGs--K+z0uqo1bf5|}fi5rtEMN^BfHQCd-XH*kfJhJnmIE$G z0%<@5vOzxB0181d*a3EfYH$G5fqKvcPJ%XY23!PJzzuK<41h;K3WmW;Fah3yX$XSw z5EY_9s*o0>51B&N5F1(uc|$=^I1~fLLy3?Ol0f;;Ca4%HgQ}rJP(Ab`bQ-z{U4#0d z2hboi2K@njgb|nm(_szR0JebHusa+GN5aeCM0gdP2N%HG;Yzp`J`T6S7vUT504#-H z!jlL<$Or?`Mpy_N@kBz9SR?@vA#0H$qyni$nvf2p8@Y{0k#Xb$28W?xm>3qu8RLgp zjNxKdVb)?wFx8l2m{v>|<~C*!GlBVnrDD~wrdTJeKXwT=5u1%I#8zOBU|X=4u>;s) z>^mF|$G{ol9B_WP7+f-LHLe7=57&&lfa}8z;U@8Tyei%l?}87(bMRt(A-)QK9Dg3) zj~~XrCy)tR1Z#p1A(kK{Y$Q|=8VKhI{e%(1G*N-5Pjn)N5P8I0VkxnX*g?EW941ba z6iJ387g8iCnY4jaNopcpCOsy-A(P2EWJhusSwLP-t|XrzUnLKcKTwn?CKOLf97RIe zPB}`sKzTrUL#0v;sBY9)s+hW+T2H-1eM)^VN0T#`^Oxhvt&^*fYnAJldnHel*Ozyf zUoM{~Um<@={-*r60#U(0!Bc^wuvVc);k3d%g-J!4qLpHZVwz%!VuRu}#Ze`^l7W)9 z5>Kf>>9Eozr6C$Z)1`URxU@~QI@)F0FdauXr2Es8>BaOP=)Lp_WhG@>R;lZ?BJkMlIuMhw8ApiF&yDYW2hFJ?fJhni{?u z85&g@mo&yT8JcdI$(rSw=QPK(Xj%)k1X|@<=e1rim6`6$RAwc!i#egKuI;BS(LSWz zt39n_sIypSqfWEV6J3%nTQ@-4i zi$R;gsG*9XzhRzXqv2yCs*$VFDx+GXJH|L;wsDH_KI2;^u!)^Xl1YupO;gy^-c(?^ z&$Q1BYvyPsG^;hc$D**@Sy`+`)}T4VJji^bd7Jqw3q6Zii=7tT7GEswEK@D(EFW1Z zSp`^awCb?>!`j4}Yh7b~$A)U-W3$et-R8BesV(1jzwLcHnq9En7Q0Tn&-M=XBKs!$ zF$X<|c!#|X_tWYh)GZit z(Q)Cp9CDE^WG;+fcyOWARoj*0TI>4EP1lX*cEoMO-Pk?Z{kZ!p4@(b`M~lalr<3Oz z&kJ6Nm#vN_+kA5{dW4@^Vjg_`q%qU1ULk& z3Fr!>1V#i_2R;ij2@(Z$1jE4r!MlPVFVbHmT+|iPIq0wy5aS{>yK?9ZAjVh%SOwMWgFjair&;wpi!{CU}&@N=Eg#~ zLQ&zpEzVmGY{hI9Z0+4-0xS$$Xe-OToc?Y*V;rTcf_ zb_jRe-RZjXSeas3UfIyD;9afd%<`i0x4T#DzE)vdabOQ=k7SRuGN`h>O0Q~1)u-yD z>VX=Mn&!Rgd$;YK+Q-}1zu#?t(*cbG#Ronf6db&N$oEidtwC+YVcg-Y!_VuY>bk#Y ze_ww@?MU&F&qswvrN_dLb=5o6*Egs)ls3YRlE$&)amR1{;Ppd$6RYV^Go!iq1UMl% z@#4q$AMc(FJlT1QeX8jv{h#)>&{~RGq1N2iiMFIRX?sk2-|2wUogK~{EkB$8eDsX= znVPf8XG_nK&J~=SIiGia@9y}|z3FhX{g&gcj=lwb=lWgyFW&aLedUh- zof`v-2Kw$UzI*>(+&$@i-u=-BsSjR1%z8NeX#HdC`Hh-Z(6xI-`hmHDqv!v)W&&nrf>M(RhcN6(D;jNN*%^u_SYjF;2ng}*8Ow)d6M ztDk;%`@Lsk$;9w$(d(H%O5UixIr`T2ZRcd@fIj#Yr0i@`Lw2CjpP;8*akA`j7< z!F%8`C?og<_nv@B@C5kB(Ta$#z$g)}d!O;#9k3AmZB!t_bI_ISF!oKvxt2{)BEsQ3 z?mYrIK0+ugEEIKhb)u}SOcWOvi*!0I*4Ea~kflN}u$a$;ga?(XhN7v|>XAp=X+!n!Fd}AGTGj%ykS`AGjT8Cr)jJ;M*!co2a&kT#tep%V=pQt}`a$B#Pr>#;mNY)cG>GFDo^tO)*%3t&3h%LJn3AU^5Qe zwq8`CdU|?-{&$t2Ml(=jW21T|bajccEqqa87f-S65r_E2AZkmzaWB>1lA+ z{ui+1@e)%I%T5iJ5K%yHi>|INF+4nMb;A}Rnwy)&;v%b9H`do#>H44z=U~>~ldGx= zuJM!0pdK6?)HyTx?<;x7&|nR$9azr<;S$3EoXfPYudnA~sB@xy1Jqzau5YrqG7%+4 zRRD2(R7_R?m>l~?PF9a6wHh>%#!au%V{t_sCQ)49zP`R4GauS7K_7Tj;pss4k}5s6 zx3^_&ZLPM`Cu*J9-`}^c+O4gv-V3g-uFCxU{O@Kiv~PhS+<`?W=0IhoN3e^Ps3 zGyVj7iqA5}-rk;UXlQtE=0W={=-XKF+XK%{o1hlOvXhk_!GL^AHD)|x#2+O}iJ@zE zclQS~ex`jLS0{LG(t_A#*~wXy3;6l?$=NdwF)8HWS{MoLx;{}XUs>tp0*)EWXJY)< zAjfW2P%+OocvK1XR*tq5o{ROF;OE2{+~HB>cSLb& zb2iy}4CdUxqY6(4!9B<&l-mJUU@m&rbq4kjTw^HYXc!p$5_l2h{=@&Em4K{gSi6w3 f;4| + + close + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + + + + + + + + + \ No newline at end of file diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a39f34f331..6eb46b5ec0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -69,6 +69,11 @@ #include "ui/TextRenderer.h" #include "InfoView.h" +#include +#include +#include +#include + using namespace std; // Starfield information @@ -85,11 +90,12 @@ const int STARTUP_JITTER_SAMPLES = PACKET_LENGTH_SAMPLES_PER_CHANNEL / 2; // Startup optimistically with small jitter buffer that // will start playback on the second received audio packet. - const int MIRROR_VIEW_TOP_PADDING = 5; const int MIRROR_VIEW_LEFT_PADDING = 10; const int MIRROR_VIEW_WIDTH = 265; const int MIRROR_VIEW_HEIGHT = 215; +const int MIRROR_ICON_SIZE = 16; +const int MIRROR_CLOSE_ICON_PADDING = 5; void messageHandler(QtMsgType type, const QMessageLogContext& context, const QString &message) { fprintf(stdout, "%s", message.toLocal8Bit().constData()); @@ -258,12 +264,12 @@ void Application::restoreSizeAndPosition() { settings->beginGroup("Window"); - float x = loadSetting(settings, "x", 0); - float y = loadSetting(settings, "y", 0); + int x = (int) loadSetting(settings, "x", 0); + int y = (int) loadSetting(settings, "y", 0); _window->move(x, y); - int width = loadSetting(settings, "width", available.width()); - int height = loadSetting(settings, "height", available.height()); + int width = (int) loadSetting(settings, "width", available.width()); + int height = (int) loadSetting(settings, "height", available.height()); _window->resize(width, height); settings->endGroup(); @@ -427,7 +433,6 @@ void Application::paintGL() { _glowEffect.render(); if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { - glm::vec3 targetPosition = _myAvatar.getEyeLevelPosition(); if (_myAvatar.getHead().getBlendFace().isActive()) { // make sure we're aligned to the blend face eyes @@ -441,21 +446,30 @@ void Application::paintGL() { _mirrorCamera.setTargetRotation(_myAvatar.getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PIf, 0.0f))); _mirrorCamera.update(1.0f/_fps); - glViewport(MIRROR_VIEW_LEFT_PADDING, _glWidget->height() - MIRROR_VIEW_HEIGHT - MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT); - glScissor(MIRROR_VIEW_LEFT_PADDING, _glWidget->height() - MIRROR_VIEW_HEIGHT - MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT); - + // set the bounds of rear mirror view + glViewport(_mirrorViewRect.x(), _glWidget->height() - _mirrorViewRect.y() - _mirrorViewRect.height(), _mirrorViewRect.width(), _mirrorViewRect.height()); + glScissor(_mirrorViewRect.x(), _glWidget->height() - _mirrorViewRect.y() - _mirrorViewRect.height(), _mirrorViewRect.width(), _mirrorViewRect.height()); updateProjectionMatrix(_mirrorCamera); - glEnable(GL_SCISSOR_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // render rear mirror view glPushMatrix(); displaySide(_mirrorCamera); glPopMatrix(); - // reset Viewport + // render rear view tools if mouse is in the bounds + QPoint mousePosition = _glWidget->mapFromGlobal(QCursor::pos()); + + qDebug("mouse pos: x = %d, y = %d\n", mousePosition.x(), mousePosition.y()); + + if (_mirrorViewRect.contains(mousePosition.x(), mousePosition.y())) { + displayRearMirrorTools(); + } + + // reset Viewport and projection matrix glViewport(0, 0, _glWidget->width(), _glWidget->height()); glDisable(GL_SCISSOR_TEST); - updateProjectionMatrix(); } @@ -481,6 +495,8 @@ void Application::resetCamerasOnResizeGL(Camera& camera, int width, int height) void Application::resizeGL(int width, int height) { resetCamerasOnResizeGL(_viewFrustumOffsetCamera, width, height); resetCamerasOnResizeGL(_myCamera, width, height); + + _mirrorViewRect = QRect(MIRROR_VIEW_LEFT_PADDING, MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT); glViewport(0, 0, width, height); // shouldn't this account for the menu??? @@ -1024,7 +1040,7 @@ void Application::mouseMoveEvent(QMouseEvent* event) { if (activeWindow() == _window) { _mouseX = event->x(); _mouseY = event->y(); - + // detect drag glm::vec3 mouseVoxelPos(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z); if (!_justEditedVoxel && mouseVoxelPos != _lastMouseVoxelPos) { @@ -1062,6 +1078,15 @@ void Application::mousePressEvent(QMouseEvent* event) { return; } + if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { + + QRect closeIconRect = QRect(MIRROR_CLOSE_ICON_PADDING + _mirrorViewRect.left(), MIRROR_CLOSE_ICON_PADDING + _mirrorViewRect.top(), MIRROR_ICON_SIZE, MIRROR_ICON_SIZE); + + if (closeIconRect.contains(_mouseX, _mouseY)) { + Menu::getInstance()->triggerOption(MenuOption::Mirror); + } + } + if (!_palette.isActive() && (!_isHoverVoxel || _lookatTargetAvatar)) { _pieMenu.mousePressEvent(_mouseX, _mouseY); } @@ -1636,11 +1661,14 @@ void Application::init() { _myAvatar.setPosition(START_LOCATION); _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); _myCamera.setModeShiftRate(1.0f); - _myAvatar.setDisplayingLookatVectors(false); + _myAvatar.setDisplayingLookatVectors(false); + _mirrorCamera.setMode(CAMERA_MODE_MIRROR); - _mirrorCamera.setModeShiftRate(1.0f); _mirrorCamera.setAspectRatio((float)MIRROR_VIEW_WIDTH / (float)MIRROR_VIEW_HEIGHT); - _mirrorCamera.setFieldOfView(DEFAULT_FIELD_OF_VIEW_DEGREES); + _mirrorViewRect = QRect(MIRROR_VIEW_LEFT_PADDING, MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT); + + switchToResourcesParentIfRequired(); + _closeTextureId = _glWidget->bindTexture(QImage("./resources/images/close.png")); OculusManager::connect(); if (OculusManager::isConnected()) { @@ -2472,15 +2500,6 @@ void Application::computeOffAxisFrustum(float& left, float& right, float& bottom float& far, glm::vec4& nearClipPlane, glm::vec4& farClipPlane) const { _viewFrustum.computeOffAxisFrustum(left, right, bottom, top, near, far, nearClipPlane, farClipPlane); - - /* - // when mirrored, we must flip left and right - if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { - float tmp = left; - left = -right; - right = -tmp; - } - */ } void Application::displaySide(Camera& whichCamera) { @@ -2730,7 +2749,7 @@ void Application::displaySide(Camera& whichCamera) { } // brad's frustum for debugging - if (Menu::getInstance()->isOptionChecked(MenuOption::DisplayFrustum)) { + if (Menu::getInstance()->isOptionChecked(MenuOption::DisplayFrustum) && whichCamera.getMode() != CAMERA_MODE_MIRROR) { PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings), "Application::displaySide() ... renderViewFrustum..."); renderViewFrustum(_viewFrustum); @@ -2962,7 +2981,7 @@ void Application::displayOverlay() { if (_pieMenu.isDisplayed()) { _pieMenu.render(); } - + glPopMatrix(); } @@ -3781,3 +3800,42 @@ void* Application::networkReceive(void* args) { void Application::packetSentNotification(ssize_t length) { _bandwidthMeter.outputStream(BandwidthMeter::VOXELS).updateValue(length); } + +void Application::displayRearMirrorTools() { + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluOrtho2D(_mirrorViewRect.left(), _mirrorViewRect.right(), _mirrorViewRect.bottom(), _mirrorViewRect.top()); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, _closeTextureId); + + glColor3f(1, 1, 1); + glBegin(GL_QUADS); + + int lp = MIRROR_CLOSE_ICON_PADDING + _mirrorViewRect.left(); + int tp = MIRROR_CLOSE_ICON_PADDING + _mirrorViewRect.top(); + int lwp = MIRROR_ICON_SIZE + lp; + int twp = MIRROR_ICON_SIZE + tp; + + glTexCoord2f(1, 1); + glVertex2f(lp, tp); + + glTexCoord2f(0, 1); + glVertex2f(lwp, tp); + + glTexCoord2f(0, 0); + glVertex2f(lwp, twp); + + glTexCoord2f(1, 0); + glVertex2f(lp, twp); + + glEnd(); + + glPopMatrix(); + + glDisable(GL_TEXTURE_2D); +} diff --git a/interface/src/Application.h b/interface/src/Application.h index 6160f00b17..5658c48846 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -240,7 +240,9 @@ private: static void attachNewHeadToNode(Node *newNode); static void* networkReceive(void* args); // network receive thread - void findAxisAlignment(); + void findAxisAlignment(); + + void displayRearMirrorTools(); QMainWindow* _window; QGLWidget* _glWidget; @@ -293,6 +295,8 @@ private: Camera _myCamera; // My view onto the world Camera _viewFrustumOffsetCamera; // The camera we use to sometimes show the view frustum from an offset mode Camera _mirrorCamera; // Cammera for mirror view + QRect _mirrorViewRect; + GLuint _closeTextureId; Environment _environment; diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 0f3b047a3f..7e72d4b5ab 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -839,9 +839,9 @@ bool Audio::eventuallyAnalyzePing() { return true; } -void Audio::renderToolIcon(int screenHeigh) { +void Audio::renderToolIcon(int screenHeight) { - _iconBounds = QRect(ICON_LEFT, screenHeigh - BOTTOM_PADDING, ICON_SIZE, ICON_SIZE); + _iconBounds = QRect(ICON_LEFT, screenHeight - BOTTOM_PADDING, ICON_SIZE, ICON_SIZE); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, _micTextureId); From 1cea3b403b9002baa0d30223a4ba1556ca1eb7dc Mon Sep 17 00:00:00 2001 From: stojce Date: Tue, 22 Oct 2013 22:02:17 +0200 Subject: [PATCH 6/8] Fixed camera view options - fixed camera lens angle - xamera distance --- interface/src/Application.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6eb46b5ec0..ae80fc06e9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -433,15 +433,8 @@ void Application::paintGL() { _glowEffect.render(); if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { - glm::vec3 targetPosition = _myAvatar.getEyeLevelPosition(); - if (_myAvatar.getHead().getBlendFace().isActive()) { - // make sure we're aligned to the blend face eyes - glm::vec3 leftEyePosition, rightEyePosition; - if (_myAvatar.getHead().getBlendFace().getEyePositions(leftEyePosition, rightEyePosition, true)) { - targetPosition = (leftEyePosition + rightEyePosition) * 0.5f; - } - } - + glm::vec3 targetPosition = _myAvatar.getHeadJointPosition(); + _mirrorCamera.setDistance(0.3f); _mirrorCamera.setTargetPosition(targetPosition); _mirrorCamera.setTargetRotation(_myAvatar.getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PIf, 0.0f))); _mirrorCamera.update(1.0f/_fps); @@ -460,9 +453,6 @@ void Application::paintGL() { // render rear view tools if mouse is in the bounds QPoint mousePosition = _glWidget->mapFromGlobal(QCursor::pos()); - - qDebug("mouse pos: x = %d, y = %d\n", mousePosition.x(), mousePosition.y()); - if (_mirrorViewRect.contains(mousePosition.x(), mousePosition.y())) { displayRearMirrorTools(); } @@ -1665,6 +1655,8 @@ void Application::init() { _mirrorCamera.setMode(CAMERA_MODE_MIRROR); _mirrorCamera.setAspectRatio((float)MIRROR_VIEW_WIDTH / (float)MIRROR_VIEW_HEIGHT); + _mirrorCamera.setFieldOfView(45); + _mirrorCamera.setDistance(3.3f); _mirrorViewRect = QRect(MIRROR_VIEW_LEFT_PADDING, MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT); switchToResourcesParentIfRequired(); From b728689c6de656da7031277c1940bdcd0936e433 Mon Sep 17 00:00:00 2001 From: stojce Date: Tue, 22 Oct 2013 22:18:56 +0200 Subject: [PATCH 7/8] more camera fixes --- interface/src/Application.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ae80fc06e9..554f798d47 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -433,8 +433,8 @@ void Application::paintGL() { _glowEffect.render(); if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { - glm::vec3 targetPosition = _myAvatar.getHeadJointPosition(); - _mirrorCamera.setDistance(0.3f); + glm::vec3 targetPosition = _myAvatar.getUprightHeadPosition(); + _mirrorCamera.setDistance(0.2f); _mirrorCamera.setTargetPosition(targetPosition); _mirrorCamera.setTargetRotation(_myAvatar.getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PIf, 0.0f))); _mirrorCamera.update(1.0f/_fps); @@ -1655,8 +1655,7 @@ void Application::init() { _mirrorCamera.setMode(CAMERA_MODE_MIRROR); _mirrorCamera.setAspectRatio((float)MIRROR_VIEW_WIDTH / (float)MIRROR_VIEW_HEIGHT); - _mirrorCamera.setFieldOfView(45); - _mirrorCamera.setDistance(3.3f); + _mirrorCamera.setFieldOfView(70); _mirrorViewRect = QRect(MIRROR_VIEW_LEFT_PADDING, MIRROR_VIEW_TOP_PADDING, MIRROR_VIEW_WIDTH, MIRROR_VIEW_HEIGHT); switchToResourcesParentIfRequired(); From 9382268ee30613321dd3254298df5f55657d1ca8 Mon Sep 17 00:00:00 2001 From: stojce Date: Wed, 23 Oct 2013 09:30:26 +0200 Subject: [PATCH 8/8] CR fixes --- interface/src/Application.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 554f798d47..3e15067054 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -69,11 +69,6 @@ #include "ui/TextRenderer.h" #include "InfoView.h" -#include -#include -#include -#include - using namespace std; // Starfield information @@ -264,12 +259,12 @@ void Application::restoreSizeAndPosition() { settings->beginGroup("Window"); - int x = (int) loadSetting(settings, "x", 0); - int y = (int) loadSetting(settings, "y", 0); + int x = (int)loadSetting(settings, "x", 0); + int y = (int)loadSetting(settings, "y", 0); _window->move(x, y); - int width = (int) loadSetting(settings, "width", available.width()); - int height = (int) loadSetting(settings, "height", available.height()); + int width = (int)loadSetting(settings, "width", available.width()); + int height = (int)loadSetting(settings, "height", available.height()); _window->resize(width, height); settings->endGroup(); @@ -1069,7 +1064,6 @@ void Application::mousePressEvent(QMouseEvent* event) { } if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { - QRect closeIconRect = QRect(MIRROR_CLOSE_ICON_PADDING + _mirrorViewRect.left(), MIRROR_CLOSE_ICON_PADDING + _mirrorViewRect.top(), MIRROR_ICON_SIZE, MIRROR_ICON_SIZE); if (closeIconRect.contains(_mouseX, _mouseY)) { @@ -2125,7 +2119,7 @@ void Application::update(float deltaTime) { } if (Menu::getInstance()->isOptionChecked(MenuOption::OffAxisProjection)) { - float xSign = _myCamera.getMode() != CAMERA_MODE_MIRROR ? 1.0f : -1.0f; + float xSign = _myCamera.getMode() == CAMERA_MODE_MIRROR ? 1.0f : -1.0f; if (_faceshift.isActive()) { const float EYE_OFFSET_SCALE = 0.025f; glm::vec3 position = _faceshift.getHeadTranslation() * EYE_OFFSET_SCALE;