From a14242632a881700b4ec4a22e3b3ebeb952ca183 Mon Sep 17 00:00:00 2001 From: stojce Date: Tue, 29 Oct 2013 20:51:14 +0100 Subject: [PATCH] Rear view zoom level new zoom icons save and restore state from settings display zoomed out rear view when selected --- interface/resources/images/body.png | Bin 0 -> 4801 bytes interface/resources/images/head.png | Bin 0 -> 4453 bytes interface/src/Application.cpp | 19 ++++-- interface/src/avatar/Avatar.h | 1 + interface/src/ui/RearMirrorTools.cpp | 89 +++++++++++++++++++-------- interface/src/ui/RearMirrorTools.h | 22 ++++++- 6 files changed, 100 insertions(+), 31 deletions(-) create mode 100644 interface/resources/images/body.png create mode 100644 interface/resources/images/head.png diff --git a/interface/resources/images/body.png b/interface/resources/images/body.png new file mode 100644 index 0000000000000000000000000000000000000000..dda65bad07774cab5372349673b487775b22baa0 GIT binary patch literal 4801 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 D(=uVu literal 0 HcmV?d00001 diff --git a/interface/resources/images/head.png b/interface/resources/images/head.png new file mode 100644 index 0000000000000000000000000000000000000000..d21b453beef1d2cb597665bfb4abc647be1de990 GIT binary patch literal 4453 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 z<isOptionChecked(MenuOption::Mirror)) { - _mirrorCamera.setDistance(0.3f); - _mirrorCamera.setTargetPosition(_myAvatar.getHead().calculateAverageEyePosition()); + + if (_rearMirrorTools->getZoomLevel() == BODY) { + _mirrorCamera.setDistance(MIN_ZOOM_DISTANCE); + _mirrorCamera.setTargetPosition(_myAvatar.getChestJointPosition()); + } else { // HEAD zoom level + _mirrorCamera.setDistance(MAX_ZOOM_DISTANCE); + _mirrorCamera.setTargetPosition(_myAvatar.getHead().calculateAverageEyePosition()); + } + _mirrorCamera.setTargetRotation(_myAvatar.getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PIf, 0.0f))); _mirrorCamera.update(1.0f/_fps); @@ -1322,8 +1331,8 @@ void Application::terminate() { // close(serial_fd); LeapManager::terminate(); - Menu::getInstance()->saveSettings(); + _rearMirrorTools->saveSettings(_settings); _settings->sync(); if (_enableNetworkThread) { @@ -1719,7 +1728,7 @@ void Application::init() { _audio.init(_glWidget); - _rearMirrorTools = new RearMirrorTools(_glWidget, _mirrorViewRect); + _rearMirrorTools = new RearMirrorTools(_glWidget, _mirrorViewRect, _settings); connect(_rearMirrorTools, SIGNAL(closeView()), SLOT(closeMirrorView())); connect(_rearMirrorTools, SIGNAL(restoreView()), SLOT(restoreMirrorView())); connect(_rearMirrorTools, SIGNAL(shrinkView()), SLOT(shrinkMirrorView())); diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 7eddb77a14..2c54aa4a50 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -150,6 +150,7 @@ public: SkeletonModel& getSkeletonModel() { return _skeletonModel; } float getHeadYawRate() const { return _head.yawRate; } const glm::vec3& getHeadJointPosition() const { return _skeleton.joint[ AVATAR_JOINT_HEAD_BASE ].position; } + const glm::vec3& getChestJointPosition() const { return _skeleton.joint[ AVATAR_JOINT_CHEST ].position; } float getScale() const { return _scale; } const glm::vec3& getVelocity() const { return _velocity; } Head& getHead() { return _head; } diff --git a/interface/src/ui/RearMirrorTools.cpp b/interface/src/ui/RearMirrorTools.cpp index 302c58d8a3..b090987fa0 100644 --- a/interface/src/ui/RearMirrorTools.cpp +++ b/interface/src/ui/RearMirrorTools.cpp @@ -6,48 +6,81 @@ // Copyright (c) 2013 High Fidelity, Inc. All rights reserved. #include "RearMirrorTools.h" +#include "Util.h" + #include #include -const int ICON_SIZE = 16; +const char SETTINGS_GROUP_NAME[] = "Rear View Tools"; +const char ZOOM_LEVEL_SETTINGS[] = "ZoomLevel"; +const int ICON_SIZE = 20; const int ICON_PADDING = 5; +const int MID_ICON_PADDING = 70; -RearMirrorTools::RearMirrorTools(QGLWidget* parent, QRect& bounds) : _parent(parent), _bounds(bounds), _windowed(false), _fullScreen(false) { +RearMirrorTools::RearMirrorTools(QGLWidget* parent, QRect& bounds, QSettings* settings) : + _parent(parent), + _bounds(bounds), + _windowed(false), + _fullScreen(false) +{ + _zoomLevel = HEAD, switchToResourcesParentIfRequired(); _closeTextureId = _parent->bindTexture(QImage("./resources/images/close.png")); _resetTextureId = _parent->bindTexture(QImage("./resources/images/reset.png")); + _zoomHeadTextureId = _parent->bindTexture(QImage("./resources/images/head.png")); + _zoomBodyTextureId = _parent->bindTexture(QImage("./resources/images/body.png")); + + _shrinkIconRect = QRect(ICON_PADDING, ICON_PADDING, ICON_SIZE, ICON_SIZE); + _closeIconRect = QRect(_bounds.left() + ICON_PADDING, _bounds.top() + ICON_PADDING, ICON_SIZE, ICON_SIZE); + _resetIconRect = QRect(_bounds.width() - ICON_SIZE - ICON_PADDING, _bounds.top() + ICON_PADDING, ICON_SIZE, ICON_SIZE); + _bodyZoomIconRect = QRect(_bounds.width() - MID_ICON_PADDING - ICON_SIZE, _bounds.bottom() - ICON_PADDING - ICON_SIZE, ICON_SIZE, ICON_SIZE); + _headZoomIconRect = QRect(_bounds.left() + MID_ICON_PADDING, _bounds.bottom() - ICON_PADDING - ICON_SIZE, ICON_SIZE, ICON_SIZE); + + settings->beginGroup(SETTINGS_GROUP_NAME); + _zoomLevel = loadSetting(settings, ZOOM_LEVEL_SETTINGS, 0) == HEAD ? HEAD : BODY; + settings->endGroup(); }; void RearMirrorTools::render(bool fullScreen) { if (fullScreen) { _fullScreen = true; - displayIcon(_parent->geometry(), ICON_PADDING, ICON_PADDING, _closeTextureId); + displayIcon(_parent->geometry(), _shrinkIconRect, _closeTextureId); } else { // render rear view tools if mouse is in the bounds QPoint mousePosition = _parent->mapFromGlobal(QCursor::pos()); _windowed = _bounds.contains(mousePosition.x(), mousePosition.y()); if (_windowed) { - displayIcon(_bounds, _bounds.left() + ICON_PADDING, _bounds.top() + ICON_PADDING, _closeTextureId); - displayIcon(_bounds, _bounds.width() - ICON_SIZE - ICON_PADDING, _bounds.top() + ICON_PADDING, _resetTextureId); + displayIcon(_bounds, _closeIconRect, _closeTextureId); + displayIcon(_bounds, _resetIconRect, _resetTextureId); + displayIcon(_bounds, _headZoomIconRect, _zoomHeadTextureId, _zoomLevel == HEAD); + displayIcon(_bounds, _bodyZoomIconRect, _zoomBodyTextureId, _zoomLevel == BODY); } } } bool RearMirrorTools::mousePressEvent(int x, int y) { if (_windowed) { - QRect closeIconRect = QRect(_bounds.left() + ICON_PADDING, _bounds.top() + ICON_PADDING, ICON_SIZE, ICON_SIZE); - if (closeIconRect.contains(x, y)) { + if (_closeIconRect.contains(x, y)) { _windowed = false; emit closeView(); return true; } - QRect resetIconRect = QRect(_bounds.width() - ICON_SIZE - ICON_PADDING, _bounds.top() + ICON_PADDING, ICON_SIZE, ICON_SIZE); - if (resetIconRect.contains(x, y)) { + if (_resetIconRect.contains(x, y)) { emit resetView(); return true; } + if (_headZoomIconRect.contains(x, y)) { + _zoomLevel = HEAD; + return true; + } + + if (_bodyZoomIconRect.contains(x, y)) { + _zoomLevel = BODY; + return true; + } + if (_bounds.contains(x, y)) { _windowed = false; emit restoreView(); @@ -56,8 +89,7 @@ bool RearMirrorTools::mousePressEvent(int x, int y) { } if (_fullScreen) { - QRect shrinkIconRect = QRect(ICON_PADDING, ICON_PADDING, ICON_SIZE, ICON_SIZE); - if (shrinkIconRect.contains(x, y)) { + if (_shrinkIconRect.contains(x, y)) { _fullScreen = false; emit shrinkView(); return true; @@ -66,10 +98,14 @@ bool RearMirrorTools::mousePressEvent(int x, int y) { return false; } -void RearMirrorTools::displayIcon(QRect bounds, int left, int top, GLuint textureId) { +void RearMirrorTools::saveSettings(QSettings* settings) { + settings->beginGroup(SETTINGS_GROUP_NAME); + settings->setValue(ZOOM_LEVEL_SETTINGS, _zoomLevel); + settings->endGroup(); +} + +void RearMirrorTools::displayIcon(QRect bounds, QRect iconBounds, GLuint textureId, bool selected) { - int twp = ICON_SIZE + top; - glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); @@ -78,23 +114,28 @@ void RearMirrorTools::displayIcon(QRect bounds, int left, int top, GLuint textur glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); - - glColor3f(1, 1, 1); + + if (selected) { + glColor3f(1, 1, 0); + } else { + glColor3f(1, 1, 1); + } glBindTexture(GL_TEXTURE_2D, textureId); glBegin(GL_QUADS); { glTexCoord2f(0, 0); - glVertex2f(left, top); - - glTexCoord2f(1, 0); - glVertex2f(ICON_SIZE + left, top); - - glTexCoord2f(1, 1); - glVertex2f(ICON_SIZE + left, twp); + glVertex2f(iconBounds.left(), iconBounds.bottom()); glTexCoord2f(0, 1); - glVertex2f(left, twp); + glVertex2f(iconBounds.left(), iconBounds.top()); + + glTexCoord2f(1, 1); + glVertex2f(iconBounds.right(), iconBounds.top()); + + glTexCoord2f(1, 0); + glVertex2f(iconBounds.right(), iconBounds.bottom()); + } glEnd(); glPopMatrix(); diff --git a/interface/src/ui/RearMirrorTools.h b/interface/src/ui/RearMirrorTools.h index b62731c8b2..7f13eafbee 100644 --- a/interface/src/ui/RearMirrorTools.h +++ b/interface/src/ui/RearMirrorTools.h @@ -12,13 +12,21 @@ #include "InterfaceConfig.h" #include +#include + +enum ZoomLevel { + HEAD, + BODY +}; class RearMirrorTools : public QObject { Q_OBJECT public: - RearMirrorTools(QGLWidget* parent, QRect& bounds); + RearMirrorTools(QGLWidget* parent, QRect& bounds, QSettings* settings); void render(bool fullScreen); bool mousePressEvent(int x, int y); + ZoomLevel getZoomLevel() { return _zoomLevel; } + void saveSettings(QSettings* settings); signals: void closeView(); @@ -31,10 +39,20 @@ private: QRect _bounds; GLuint _closeTextureId; GLuint _resetTextureId; + GLuint _zoomBodyTextureId; + GLuint _zoomHeadTextureId; + ZoomLevel _zoomLevel; + + QRect _closeIconRect; + QRect _resetIconRect; + QRect _shrinkIconRect; + QRect _headZoomIconRect; + QRect _bodyZoomIconRect; + bool _windowed; bool _fullScreen; - void displayIcon(QRect bounds, int left, int top, GLuint textureId); + void displayIcon(QRect bounds, QRect iconBounds, GLuint textureId, bool selected = false); }; #endif /* defined(__hifi__RearMirrorTools__) */