From 873f73ffb4929c5fa44a7574e9777d0c629e9abf Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Tue, 9 Jun 2015 00:39:49 -0700 Subject: [PATCH 1/3] Working on cursor manager --- libraries/ui/src/CursorManager.cpp | 32 ++++++++++++++++++++++++++++++ libraries/ui/src/CursorManager.h | 32 ++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 libraries/ui/src/CursorManager.cpp create mode 100644 libraries/ui/src/CursorManager.h diff --git a/libraries/ui/src/CursorManager.cpp b/libraries/ui/src/CursorManager.cpp new file mode 100644 index 0000000000..8b318d549a --- /dev/null +++ b/libraries/ui/src/CursorManager.cpp @@ -0,0 +1,32 @@ +// +// Created by Bradley Austin Davis on 2015/06/08 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "CursorManager.h" + +namespace Cursor { + enum class Source { + MOUSE, + LEFT_HAND, + RIGHT_HAND, + UNKNOWN, + }; + + class Instance { + Source type; + }; + + class Manager { + public: + static Manager& instance(); + + uint8_t getCount(); + Instance + }; +} + + diff --git a/libraries/ui/src/CursorManager.h b/libraries/ui/src/CursorManager.h new file mode 100644 index 0000000000..a2d26efc58 --- /dev/null +++ b/libraries/ui/src/CursorManager.h @@ -0,0 +1,32 @@ +// +// Created by Bradley Austin Davis on 2015/06/08 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#pragma once + +namespace Cursor { + enum class Source { + MOUSE, + LEFT_HAND, + RIGHT_HAND, + UNKNOWN, + }; + + class Instance { + Source type; + }; + + class Manager { + public: + static Manager& instance(); + + uint8_t getCount(); + Instance + }; +} + + From ca1af777637bfaa2d3298822ed1da08acb7f23e0 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 10 Jun 2015 13:24:47 -0700 Subject: [PATCH 2/3] Working on cursor manager --- interface/resources/images/reticleLink.png | Bin 0 -> 6381 bytes interface/resources/images/reticleWhite.png | Bin 0 -> 4749 bytes interface/src/Application.cpp | 39 +++++++-- interface/src/ui/ApplicationOverlay.cpp | 42 ++++----- interface/src/ui/ApplicationOverlay.h | 4 +- libraries/ui/src/CursorManager.cpp | 90 ++++++++++++++++---- libraries/ui/src/CursorManager.h | 35 +++++++- 7 files changed, 164 insertions(+), 46 deletions(-) create mode 100644 interface/resources/images/reticleLink.png create mode 100644 interface/resources/images/reticleWhite.png diff --git a/interface/resources/images/reticleLink.png b/interface/resources/images/reticleLink.png new file mode 100644 index 0000000000000000000000000000000000000000..b36ee79d00b261d2c7d422df39302a46eb19daa4 GIT binary patch literal 6381 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 T{C0ae007unI$FFq>7V#N&}Y{u literal 0 HcmV?d00001 diff --git a/interface/resources/images/reticleWhite.png b/interface/resources/images/reticleWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..4c35a186b2e7aa8939937e909586726ef3a10d09 GIT binary patch literal 4749 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 Har^%O!X>IH literal 0 HcmV?d00001 diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1763623fa6..5f17fd0510 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -57,6 +57,7 @@ #include #include +#include #include #include #include @@ -1229,9 +1230,20 @@ void Application::keyPressEvent(QKeyEvent* event) { } break; - case Qt::Key_Apostrophe: - resetSensors(); + case Qt::Key_Apostrophe: { + if (isMeta) { + auto cursor = Cursor::Manager::instance().getCursor(); + auto curIcon = cursor->getIcon(); + if (curIcon == Cursor::Icon::DEFAULT) { + cursor->setIcon(Cursor::Icon::LINK); + } else { + cursor->setIcon(Cursor::Icon::DEFAULT); + } + } else { + resetSensors(); + } break; + } case Qt::Key_A: if (isShifted) { @@ -1355,12 +1367,27 @@ void Application::keyPressEvent(QKeyEvent* event) { case Qt::Key_Slash: Menu::getInstance()->triggerOption(MenuOption::Stats); break; - case Qt::Key_Plus: - _myAvatar->increaseSize(); + + case Qt::Key_Plus: { + if (isMeta && event->modifiers().testFlag(Qt::KeypadModifier)) { + auto& cursorManager = Cursor::Manager::instance(); + cursorManager.setScale(cursorManager.getScale() * 1.1f); + } else { + _myAvatar->increaseSize(); + } break; - case Qt::Key_Minus: - _myAvatar->decreaseSize(); + } + + case Qt::Key_Minus: { + if (isMeta && event->modifiers().testFlag(Qt::KeypadModifier)) { + auto& cursorManager = Cursor::Manager::instance(); + cursorManager.setScale(cursorManager.getScale() / 1.1f); + } else { + _myAvatar->decreaseSize(); + } break; + } + case Qt::Key_Equal: _myAvatar->resetSize(); break; diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index bc8047fc98..7895232f8a 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include "AudioClient.h" #include "audio/AudioIOStatsRenderer.h" @@ -143,7 +144,6 @@ ApplicationOverlay::ApplicationOverlay() : _alpha(1.0f), _oculusUIRadius(1.0f), _trailingAudioLoudness(0.0f), - _crosshairTexture(0), _previousBorderWidth(-1), _previousBorderHeight(-1), _previousMagnifierBottomLeft(), @@ -257,6 +257,18 @@ void with_each_texture(GLuint firstPassTexture, GLuint secondPassTexture, F f) { glDisable(GL_TEXTURE_2D); } +void ApplicationOverlay::bindCursorTexture(uint8_t cursorIndex) { + auto& cursorManager = Cursor::Manager::instance(); + auto cursor = cursorManager.getCursor(cursorIndex); + auto iconId = cursor->getIcon(); + if (!_cursors.count(iconId)) { + auto iconPath = cursorManager.getIconImage(cursor->getIcon()); + _cursors[iconId] = DependencyManager::get()-> + getImageTexture(iconPath); + } + glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_cursors[iconId])); +} + // Draws the FBO texture for the screen void ApplicationOverlay::displayOverlayTexture() { if (_alpha == 0.0f) { @@ -282,14 +294,10 @@ void ApplicationOverlay::displayOverlayTexture() { glm::vec4(1.0f, 1.0f, 1.0f, _alpha)); }); - if (!_crosshairTexture) { - _crosshairTexture = DependencyManager::get()-> - getImageTexture(PathUtils::resourcesPath() + "images/sixense-reticle.png"); - } - + //draw the mouse pointer glm::vec2 canvasSize = qApp->getCanvasSize(); - glm::vec2 mouseSize = 32.0f / canvasSize; + glm::vec2 mouseSize = 32.0f / canvasSize * Cursor::Manager::instance().getScale(); auto mouseTopLeft = topLeft * mouseSize; auto mouseBottomRight = bottomRight * mouseSize; vec2 mousePosition = vec2(qApp->getMouseX(), qApp->getMouseY()); @@ -300,7 +308,7 @@ void ApplicationOverlay::displayOverlayTexture() { glEnable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_crosshairTexture)); + bindCursorTexture(); glm::vec4 reticleColor = { RETICLE_COLOR[0], RETICLE_COLOR[1], RETICLE_COLOR[2], 1.0f }; DependencyManager::get()->renderQuad( mouseTopLeft + mousePosition, mouseBottomRight + mousePosition, @@ -450,18 +458,14 @@ void ApplicationOverlay::displayOverlayTextureStereo(Camera& whichCamera, float overlayColor); }); - if (!_crosshairTexture) { - _crosshairTexture = TextureCache::getImageTexture(PathUtils::resourcesPath() + - "images/sixense-reticle.png"); - } - //draw the mouse pointer glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_crosshairTexture)); + bindCursorTexture(); glm::vec2 canvasSize = qApp->getCanvasSize(); - const float reticleSize = 40.0f / canvasSize.x * quadWidth; + const float reticleSize = 40.0f / canvasSize.x * quadWidth * + Cursor::Manager::instance().getScale(); x -= reticleSize / 2.0f; y += reticleSize / 2.0f; const float mouseX = (qApp->getMouseX() / (float)canvasSize.x) * quadWidth; @@ -583,16 +587,12 @@ bool ApplicationOverlay::calculateRayUICollisionPoint(const glm::vec3& position, //Renders optional pointers void ApplicationOverlay::renderPointers() { - //lazily load crosshair texture - if (_crosshairTexture == 0) { - _crosshairTexture = TextureCache::getImageTexture(PathUtils::resourcesPath() + "images/sixense-reticle.png"); - } glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_crosshairTexture)); + bindCursorTexture(); if (qApp->isHMDMode() && !qApp->getLastMouseMoveWasSimulated() && !qApp->isMouseHidden()) { //If we are in oculus, render reticle later @@ -757,7 +757,7 @@ void ApplicationOverlay::renderPointersOculus() { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_crosshairTexture)); + bindCursorTexture(); glDisable(GL_DEPTH_TEST); glMatrixMode(GL_MODELVIEW); diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index ee82c9274a..0e8206547a 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -108,6 +108,7 @@ private: void renderCameraToggle(); void renderStatsAndLogs(); void renderDomainConnectionStatusBorder(); + void bindCursorTexture(uint8_t cursorId = 0); TexturedHemisphere _overlays; @@ -127,7 +128,8 @@ private: float _trailingAudioLoudness; - gpu::TexturePointer _crosshairTexture; + QMap _cursors; + GLuint _newUiTexture{ 0 }; int _reticleQuad; diff --git a/libraries/ui/src/CursorManager.cpp b/libraries/ui/src/CursorManager.cpp index 8b318d549a..efadd09142 100644 --- a/libraries/ui/src/CursorManager.cpp +++ b/libraries/ui/src/CursorManager.cpp @@ -8,25 +8,85 @@ #include "CursorManager.h" +#include +#include +#include + +#include + namespace Cursor { - enum class Source { - MOUSE, - LEFT_HAND, - RIGHT_HAND, - UNKNOWN, + + void Instance::setIcon(uint16_t icon) { + _icon = icon; + } + + uint16_t Instance::getIcon() const { + return _icon; + } + + + class MouseInstance : public Instance { + Source getType() const { + return Source::MOUSE; + } + + ivec2 getScreenPosition() const { + return toGlm(QCursor::pos()); + } + + ivec2 getWindowPosition(QWidget* widget) const { + return toGlm(widget->mapFromGlobal(QCursor::pos())); + } + + vec2 getRelativePosition(QWidget* widget) const { + vec2 pos = getWindowPosition(widget); + pos /= vec2(toGlm(widget->size())); + return pos; + } }; - class Instance { - Source type; - }; + static QMap ICONS; + static uint16_t _customIconId = Icon::USER_BASE; - class Manager { - public: - static Manager& instance(); + Manager::Manager() { + ICONS[Icon::DEFAULT] = PathUtils::resourcesPath() + "images/sixense-reticle.png"; + ICONS[Icon::LINK] = PathUtils::resourcesPath() + "images/reticleLink.png"; + } - uint8_t getCount(); - Instance - }; -} + Manager& Manager::instance() { + static Manager instance; + return instance; + } + uint8_t Manager::getCount() { + return 1; + } + Instance* Manager::getCursor(uint8_t index) { + Q_ASSERT(index < getCount()); + static MouseInstance mouseInstance; + if (index == 0) { + return &mouseInstance; + } + return nullptr; + } + + uint16_t Manager::registerIcon(const QString& path) { + ICONS[_customIconId] = path; + return _customIconId++; + } + + const QString& Manager::getIconImage(uint16_t icon) { + Q_ASSERT(ICONS.count(icon)); + return ICONS[icon]; + } + + float Manager::getScale() { + return _scale; + } + + void Manager::setScale(float scale) { + _scale = scale; + } + +} \ No newline at end of file diff --git a/libraries/ui/src/CursorManager.h b/libraries/ui/src/CursorManager.h index a2d26efc58..c5810caf58 100644 --- a/libraries/ui/src/CursorManager.h +++ b/libraries/ui/src/CursorManager.h @@ -7,6 +7,9 @@ // #pragma once +#include + +#include namespace Cursor { enum class Source { @@ -16,16 +19,42 @@ namespace Cursor { UNKNOWN, }; + enum Icon { + DEFAULT, + LINK, + GRAB, + + // Add new system cursors here + + // User cursors will have ids over this value + USER_BASE = 0xFF, + }; + class Instance { - Source type; + public: + virtual Source getType() const = 0; + virtual ivec2 getWindowPosition(QWidget* widget) const = 0; + virtual vec2 getRelativePosition(QWidget* widget) const = 0; + virtual ivec2 getScreenPosition() const = 0; + virtual void setIcon(uint16_t icon); + virtual uint16_t getIcon() const; + private: + uint16_t _icon; }; class Manager { + Manager(); + Manager(const Manager& other) = delete; public: static Manager& instance(); - uint8_t getCount(); - Instance + float getScale(); + void setScale(float scale); + Instance* getCursor(uint8_t index = 0); + uint16_t registerIcon(const QString& path); + const QString& getIconImage(uint16_t icon); + private: + float _scale{ 1.0f }; }; } From 09cfe004a18ab8c9b5622eb6d33dc22a41b7cf36 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 11 Jun 2015 16:55:23 -0700 Subject: [PATCH 3/3] Combining with new cursor render code --- interface/src/ui/ApplicationOverlay.cpp | 16 ++++++++-------- libraries/ui/src/CursorManager.cpp | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 971958ae61..ba0d3a60a9 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -210,7 +210,7 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { overlays.renderHUD(renderArgs); - //renderPointers(); + renderPointers(); renderDomainConnectionStatusBorder(); if (_newUiTexture) { @@ -268,7 +268,7 @@ void ApplicationOverlay::bindCursorTexture(gpu::Batch& batch, uint8_t cursorInde _cursors[iconId] = DependencyManager::get()-> getImageTexture(iconPath); } - glBindTexture(GL_TEXTURE_2D, gpu::GLBackend::getTextureID(_cursors[iconId])); + batch.setUniformTexture(0, _cursors[iconId]); } #define CURSOR_PIXEL_SIZE 32.0f @@ -471,11 +471,11 @@ bool ApplicationOverlay::calculateRayUICollisionPoint(const glm::vec3& position, //Renders optional pointers void ApplicationOverlay::renderPointers() { - glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + //glEnable(GL_TEXTURE_2D); + //glEnable(GL_BLEND); + //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glActiveTexture(GL_TEXTURE0); + //glActiveTexture(GL_TEXTURE0); //bindCursorTexture(); if (qApp->isHMDMode() && !qApp->getLastMouseMoveWasSimulated() && !qApp->isMouseHidden()) { @@ -521,8 +521,8 @@ void ApplicationOverlay::renderPointers() { _magActive[MOUSE] = false; renderControllerPointers(); } - glBindTexture(GL_TEXTURE_2D, 0); - glDisable(GL_TEXTURE_2D); + //glBindTexture(GL_TEXTURE_2D, 0); + //glDisable(GL_TEXTURE_2D); } void ApplicationOverlay::renderControllerPointers() { diff --git a/libraries/ui/src/CursorManager.cpp b/libraries/ui/src/CursorManager.cpp index efadd09142..38c746994d 100644 --- a/libraries/ui/src/CursorManager.cpp +++ b/libraries/ui/src/CursorManager.cpp @@ -49,7 +49,7 @@ namespace Cursor { static uint16_t _customIconId = Icon::USER_BASE; Manager::Manager() { - ICONS[Icon::DEFAULT] = PathUtils::resourcesPath() + "images/sixense-reticle.png"; + ICONS[Icon::DEFAULT] = PathUtils::resourcesPath() + "images/arrow.png"; ICONS[Icon::LINK] = PathUtils::resourcesPath() + "images/reticleLink.png"; }