From 4f3a730d6d883dbd95ab83b23ef8173e16d184a0 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 29 Aug 2018 18:53:14 -0300 Subject: [PATCH 1/6] Android - Handshake implementation - two important notes - IK was disabled on android and this enables it (needs a well thought review) - TouchscreenVirtualPadDevice buttons code does not scale well, it needs a refactor --- .../controllers/touchscreenvirtualpad.json | 4 +- interface/resources/images/handshake.png | Bin 0 -> 20623 bytes .../animation/src/AnimInverseKinematics.cpp | 2 + .../Basic2DWindowOpenGLDisplayPlugin.cpp | 31 +++++++++ .../Basic2DWindowOpenGLDisplayPlugin.h | 3 + .../TouchscreenVirtualPadDevice.cpp | 65 +++++++++++++++++- .../TouchscreenVirtualPadDevice.h | 17 ++++- libraries/ui/src/VirtualPadManager.cpp | 8 +++ libraries/ui/src/VirtualPadManager.h | 3 + scripts/+android/defaultScripts.js | 3 +- 10 files changed, 130 insertions(+), 6 deletions(-) create mode 100644 interface/resources/images/handshake.png diff --git a/interface/resources/controllers/touchscreenvirtualpad.json b/interface/resources/controllers/touchscreenvirtualpad.json index bae1172152..e98fb7ff2f 100644 --- a/interface/resources/controllers/touchscreenvirtualpad.json +++ b/interface/resources/controllers/touchscreenvirtualpad.json @@ -23,7 +23,9 @@ "invert" ], "to": "Actions.Pitch" - } + }, + + { "from": "TouchscreenVirtualPad.RB", "to": "Standard.RB"} ] } diff --git a/interface/resources/images/handshake.png b/interface/resources/images/handshake.png new file mode 100644 index 0000000000000000000000000000000000000000..ae4252e9e5a0293098737349604ae0a60825ab14 GIT binary patch literal 20623 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 Vmwd$pZg5YHt5$ZGh!#E%{{ft?yA=Qc literal 0 HcmV?d00001 diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index 71094cc6e1..037bac52e2 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -851,10 +851,12 @@ const AnimPoseVec& AnimInverseKinematics::evaluate(const AnimVariantMap& animVar //virtual const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, AnimVariantMap& triggersOut, const AnimPoseVec& underPoses) { +/* We need this working so body parts can move #ifdef Q_OS_ANDROID // disable IK on android return underPoses; #endif +*/ // allows solutionSource to be overridden by an animVar auto solutionSource = animVars.lookup(_solutionSourceVar, (int)_solutionSource); diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index d8b8cbd54a..ea5e854712 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -99,6 +99,31 @@ void Basic2DWindowOpenGLDisplayPlugin::customizeContext() { _virtualPadJumpBtnTexture->setAutoGenerateMips(true); } } + + _virtualPadRbBtnPixelSize = dpi * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI; + if (!_virtualPadRbBtnTexture) { + auto iconPath = PathUtils::resourcesPath() + "images/handshake.png"; + auto image = QImage(iconPath); + if (image.format() != QImage::Format_ARGB32) { + image = image.convertToFormat(QImage::Format_ARGB32); + } + if ((image.width() > 0) && (image.height() > 0)) { + image = image.scaled(_virtualPadRbBtnPixelSize, _virtualPadRbBtnPixelSize, Qt::KeepAspectRatio); + image = image.mirrored(); + + _virtualPadRbBtnTexture = gpu::Texture::createStrict( + gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA), + image.width(), image.height(), + gpu::Texture::MAX_NUM_MIPS, + gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)); + _virtualPadRbBtnTexture->setSource("virtualPad handshake"); + auto usage = gpu::Texture::Usage::Builder().withColor().withAlpha(); + _virtualPadRbBtnTexture->setUsage(usage.build()); + _virtualPadRbBtnTexture->setStoredMipFormat(gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA)); + _virtualPadRbBtnTexture->assignStoredMip(0, image.byteCount(), image.constBits()); + _virtualPadRbBtnTexture->setAutoGenerateMips(true); + } + } #endif Parent::customizeContext(); } @@ -135,6 +160,8 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { _virtualPadPixelSize, _virtualPadPixelSize); auto jumpTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getJumpButtonPosition(), _virtualPadJumpBtnPixelSize, _virtualPadJumpBtnPixelSize); + auto rbTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getRbButtonPosition(), + _virtualPadRbBtnPixelSize, _virtualPadRbBtnPixelSize); render([&](gpu::Batch& batch) { batch.enableStereo(false); @@ -154,6 +181,10 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { batch.setResourceTexture(0, _virtualPadJumpBtnTexture); batch.setModelTransform(jumpTransform); batch.draw(gpu::TRIANGLE_STRIP, 4); + + batch.setResourceTexture(0, _virtualPadRbBtnTexture); + batch.setModelTransform(rbTransform); + batch.draw(gpu::TRIANGLE_STRIP, 4); }); } #endif diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h index a061a4c923..955a816799 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h @@ -49,5 +49,8 @@ private: gpu::TexturePointer _virtualPadJumpBtnTexture; qreal _virtualPadJumpBtnPixelSize; + + gpu::TexturePointer _virtualPadRbBtnTexture; + qreal _virtualPadRbBtnPixelSize; #endif }; diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 32194e1b84..48d2555626 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -67,6 +67,7 @@ void TouchscreenVirtualPadDevice::resize() { _fixedRadiusForCalc = _fixedRadius - _screenDPI * VirtualPad::Manager::STICK_RADIUS_PIXELS / VirtualPad::Manager::DPI; _jumpButtonRadius = _screenDPI * VirtualPad::Manager::JUMP_BTN_TRIMMED_RADIUS_PIXELS / VirtualPad::Manager::DPI; + _rbButtonRadius = _jumpButtonRadius; } auto& virtualPadManager = VirtualPad::Manager::instance(); @@ -91,6 +92,10 @@ void TouchscreenVirtualPadDevice::setupControlsPositions(VirtualPad::Manager& vi float bottomMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_BOTTOM_MARGIN_PIXELS/ VirtualPad::Manager::DPI; _jumpButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - jumpBtnPixelSize, eventScreen->availableSize().height() - bottomMargin - _jumpButtonRadius - _extraBottomMargin); virtualPadManager.setJumpButtonPosition(_jumpButtonPosition); + + // RB button (use same size as jump) + _rbButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - jumpBtnPixelSize, eventScreen->availableSize().height() - 2 * bottomMargin - 3 * _rbButtonRadius - _extraBottomMargin); + virtualPadManager.setRbButtonPosition(_rbButtonPosition); } float clip(float n, float lower, float upper) { @@ -236,6 +241,7 @@ void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { moveTouchEnd(); viewTouchEnd(); jumpTouchEnd(); + rbTouchEnd(); return; } // touch end here is a big reset -> resets both pads @@ -245,6 +251,7 @@ void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { moveTouchEnd(); viewTouchEnd(); jumpTouchEnd(); + rbTouchEnd(); _inputDevice->_axisStateMap.clear(); _inputDevice->_buttonPressedMap.clear(); } @@ -281,10 +288,12 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { bool moveTouchFound = false; bool viewTouchFound = false; bool jumpTouchFound = false; + bool rbTouchFound = false; int idxMoveStartingPointCandidate = -1; int idxViewStartingPointCandidate = -1; int idxJumpStartingPointCandidate = -1; + int idxRbStartingPointCandidate = -1; glm::vec2 thisPoint; int thisPointId; @@ -316,6 +325,13 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { continue; } + if (!rbTouchFound && _rbHasValidTouch && _rbCurrentTouchId == thisPointId) { + // valid if it's an ongoing touch + rbTouchFound = true; + rbTouchUpdate(thisPoint); + continue; + } + if (!moveTouchFound && idxMoveStartingPointCandidate == -1 && moveTouchBeginIsValid(thisPoint) && (!_unusedTouches.count(thisPointId) || _unusedTouches[thisPointId] == MOVE )) { idxMoveStartingPointCandidate = i; @@ -334,12 +350,20 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { continue; } + if (!rbTouchFound && idxRbStartingPointCandidate == -1 && rbTouchBeginIsValid(thisPoint) && + (!_unusedTouches.count(thisPointId) || _unusedTouches[thisPointId] == RB_BUTTON )) { + idxRbStartingPointCandidate = i; + continue; + } + if (moveTouchBeginIsValid(thisPoint)) { unusedTouchesInEvent[thisPointId] = MOVE; } else if (jumpTouchBeginIsValid(thisPoint)) { unusedTouchesInEvent[thisPointId] = JUMP; } else if (viewTouchBeginIsValid(thisPoint)) { unusedTouchesInEvent[thisPointId] = VIEW; + } else if (rbTouchBeginIsValid(thisPoint)) { + unusedTouchesInEvent[thisPointId] = RB_BUTTON; } } @@ -381,11 +405,24 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { } } } + if (!rbTouchFound) { + if (idxRbStartingPointCandidate != -1) { + _rbCurrentTouchId = tPoints[idxRbStartingPointCandidate].id(); + _unusedTouches.erase(_rbCurrentTouchId); + thisPoint.x = tPoints[idxRbStartingPointCandidate].pos().x(); + thisPoint.y = tPoints[idxRbStartingPointCandidate].pos().y(); + rbTouchBegin(thisPoint); + } else { + if (_rbHasValidTouch) { + rbTouchEnd(); + } + } + } } bool TouchscreenVirtualPadDevice::viewTouchBeginIsValid(glm::vec2 touchPoint) { - return !moveTouchBeginIsValid(touchPoint) && !jumpTouchBeginIsValid(touchPoint); + return !moveTouchBeginIsValid(touchPoint) && !jumpTouchBeginIsValid(touchPoint) && !rbTouchBeginIsValid(touchPoint); } bool TouchscreenVirtualPadDevice::moveTouchBeginIsValid(glm::vec2 touchPoint) { @@ -419,6 +456,29 @@ void TouchscreenVirtualPadDevice::jumpTouchEnd() { _jumpHasValidTouch = false; _inputDevice->_buttonPressedMap.erase(TouchButtonChannel::JUMP_BUTTON_PRESS); + } +} + +bool TouchscreenVirtualPadDevice::rbTouchBeginIsValid(glm::vec2 touchPoint) { + return glm::distance2(touchPoint, _rbButtonPosition) < _rbButtonRadius * _rbButtonRadius; +} + +void TouchscreenVirtualPadDevice::rbTouchBegin(glm::vec2 touchPoint) { + auto& virtualPadManager = VirtualPad::Manager::instance(); + if (virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { + _rbHasValidTouch = true; + + _inputDevice->_buttonPressedMap.insert(TouchButtonChannel::RB); + } +} + +void TouchscreenVirtualPadDevice::rbTouchUpdate(glm::vec2 touchPoint) {} + +void TouchscreenVirtualPadDevice::rbTouchEnd() { + if (_rbHasValidTouch) { + _rbHasValidTouch = false; + + _inputDevice->_buttonPressedMap.erase(TouchButtonChannel::RB); } } @@ -496,7 +556,8 @@ controller::Input::NamedVector TouchscreenVirtualPadDevice::InputDevice::getAvai Input::NamedPair(makeInput(TouchAxisChannel::LY), "LY"), Input::NamedPair(makeInput(TouchAxisChannel::RX), "RX"), Input::NamedPair(makeInput(TouchAxisChannel::RY), "RY"), - Input::NamedPair(makeInput(TouchButtonChannel::JUMP_BUTTON_PRESS), "JUMP_BUTTON_PRESS") + Input::NamedPair(makeInput(TouchButtonChannel::JUMP_BUTTON_PRESS), "JUMP_BUTTON_PRESS"), + Input::NamedPair(makeInput(TouchButtonChannel::RB), "RB") }; return availableInputs; } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index ef1e7a4d89..9ee3568be3 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -51,7 +51,8 @@ public: }; enum TouchButtonChannel { - JUMP_BUTTON_PRESS + JUMP_BUTTON_PRESS, + RB }; protected: @@ -82,7 +83,8 @@ protected: enum TouchType { MOVE = 1, VIEW, - JUMP + JUMP, + RB_BUTTON }; float _lastPinchScale; @@ -104,6 +106,9 @@ protected: bool _jumpHasValidTouch; int _jumpCurrentTouchId; + bool _rbHasValidTouch; + int _rbCurrentTouchId; + std::map _unusedTouches; int _touchPointCount; @@ -119,6 +124,9 @@ protected: glm::vec2 _jumpButtonPosition; float _jumpButtonRadius; + glm::vec2 _rbButtonPosition; + float _rbButtonRadius; + void moveTouchBegin(glm::vec2 touchPoint); void moveTouchUpdate(glm::vec2 touchPoint); void moveTouchEnd(); @@ -134,6 +142,11 @@ protected: void jumpTouchEnd(); bool jumpTouchBeginIsValid(glm::vec2 touchPoint); + void rbTouchBegin(glm::vec2 touchPoint); + void rbTouchUpdate(glm::vec2 touchPoint); + void rbTouchEnd(); + bool rbTouchBeginIsValid(glm::vec2 touchPoint); + void setupControlsPositions(VirtualPad::Manager& virtualPadManager, bool force = false); void processInputDeviceForMove(VirtualPad::Manager& virtualPadManager); diff --git a/libraries/ui/src/VirtualPadManager.cpp b/libraries/ui/src/VirtualPadManager.cpp index ef2b8670cc..e2e44fda81 100644 --- a/libraries/ui/src/VirtualPadManager.cpp +++ b/libraries/ui/src/VirtualPadManager.cpp @@ -84,6 +84,14 @@ namespace VirtualPad { _jumpButtonPosition = point; } + glm::vec2 Manager::getRbButtonPosition() { + return _rbButtonPosition; + } + + void Manager::setRbButtonPosition(glm::vec2 point) { + _rbButtonPosition = point; + } + void Manager::requestHapticFeedback(int duration) { emit hapticFeedbackRequested(duration); } diff --git a/libraries/ui/src/VirtualPadManager.h b/libraries/ui/src/VirtualPadManager.h index 3c3aa9ec9f..3832be6ed2 100644 --- a/libraries/ui/src/VirtualPadManager.h +++ b/libraries/ui/src/VirtualPadManager.h @@ -46,6 +46,8 @@ namespace VirtualPad { void setExtraBottomMargin(int margin); glm::vec2 getJumpButtonPosition(); void setJumpButtonPosition(glm::vec2 point); + glm::vec2 getRbButtonPosition(); + void setRbButtonPosition(glm::vec2 point); void requestHapticFeedback(int duration); static const float DPI; @@ -65,6 +67,7 @@ namespace VirtualPad { bool _enabled {true}; bool _hidden; glm::vec2 _jumpButtonPosition; + glm::vec2 _rbButtonPosition; int _extraBottomMargin {0}; }; } diff --git a/scripts/+android/defaultScripts.js b/scripts/+android/defaultScripts.js index 8950af808d..fbd03352de 100644 --- a/scripts/+android/defaultScripts.js +++ b/scripts/+android/defaultScripts.js @@ -16,7 +16,8 @@ var DEFAULT_SCRIPTS_COMBINED = [ "system/+android/touchscreenvirtualpad.js", "system/+android/actionbar.js", "system/+android/audio.js" , - "system/+android/modes.js"/*, + "system/+android/modes.js", + "system/makeUserConnection.js"/*, "system/away.js", "system/controllers/controllerDisplayManager.js", "system/controllers/handControllerGrabAndroid.js", From a6c1f3e8ffdc36c9591dac7651303de446bdd86a Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 31 Aug 2018 23:02:38 -0300 Subject: [PATCH 2/6] Android - Handshake - Generic button manager + RB using it --- .../TouchscreenVirtualPadDevice.cpp | 220 ++++++++++++++---- .../TouchscreenVirtualPadDevice.h | 63 ++++- 2 files changed, 226 insertions(+), 57 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 48d2555626..eeaa463159 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -96,6 +96,13 @@ void TouchscreenVirtualPadDevice::setupControlsPositions(VirtualPad::Manager& vi // RB button (use same size as jump) _rbButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - jumpBtnPixelSize, eventScreen->availableSize().height() - 2 * bottomMargin - 3 * _rbButtonRadius - _extraBottomMargin); virtualPadManager.setRbButtonPosition(_rbButtonPosition); + + // Avoid generating buttons in portrait mode + if ( eventScreen->availableSize().width() > eventScreen->availableSize().height() && _buttonsManager.buttonsCount() == 0) { + //_buttonsManager.addButton(TouchscreenButton(JUMP_BUTTON_PRESS, JUMP, _jumpButtonRadius, _jumpButtonPosition, _inputDevice )); + _buttonsManager.addButton(TouchscreenButton(RB, RB_BUTTON, _rbButtonRadius, _rbButtonPosition, _inputDevice )); + } + } float clip(float n, float lower, float upper) { @@ -241,7 +248,7 @@ void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { moveTouchEnd(); viewTouchEnd(); jumpTouchEnd(); - rbTouchEnd(); + _buttonsManager.endTouchForAll(); return; } // touch end here is a big reset -> resets both pads @@ -251,7 +258,7 @@ void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { moveTouchEnd(); viewTouchEnd(); jumpTouchEnd(); - rbTouchEnd(); + _buttonsManager.endTouchForAll(); _inputDevice->_axisStateMap.clear(); _inputDevice->_buttonPressedMap.clear(); } @@ -288,13 +295,14 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { bool moveTouchFound = false; bool viewTouchFound = false; bool jumpTouchFound = false; - bool rbTouchFound = false; int idxMoveStartingPointCandidate = -1; int idxViewStartingPointCandidate = -1; int idxJumpStartingPointCandidate = -1; int idxRbStartingPointCandidate = -1; + _buttonsManager.resetEventValues(); + glm::vec2 thisPoint; int thisPointId; std::map unusedTouchesInEvent; @@ -325,10 +333,7 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { continue; } - if (!rbTouchFound && _rbHasValidTouch && _rbCurrentTouchId == thisPointId) { - // valid if it's an ongoing touch - rbTouchFound = true; - rbTouchUpdate(thisPoint); + if (_buttonsManager.processOngoingTouch(thisPoint, thisPointId)) { continue; } @@ -350,9 +355,7 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { continue; } - if (!rbTouchFound && idxRbStartingPointCandidate == -1 && rbTouchBeginIsValid(thisPoint) && - (!_unusedTouches.count(thisPointId) || _unusedTouches[thisPointId] == RB_BUTTON )) { - idxRbStartingPointCandidate = i; + if (_buttonsManager.findStartingTouchPointCandidate(thisPoint, thisPointId, i, _unusedTouches)) { continue; } @@ -362,8 +365,8 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { unusedTouchesInEvent[thisPointId] = JUMP; } else if (viewTouchBeginIsValid(thisPoint)) { unusedTouchesInEvent[thisPointId] = VIEW; - } else if (rbTouchBeginIsValid(thisPoint)) { - unusedTouchesInEvent[thisPointId] = RB_BUTTON; + } else { + _buttonsManager.saveUnusedTouches(unusedTouchesInEvent, thisPoint, thisPointId); } } @@ -405,24 +408,13 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { } } } - if (!rbTouchFound) { - if (idxRbStartingPointCandidate != -1) { - _rbCurrentTouchId = tPoints[idxRbStartingPointCandidate].id(); - _unusedTouches.erase(_rbCurrentTouchId); - thisPoint.x = tPoints[idxRbStartingPointCandidate].pos().x(); - thisPoint.y = tPoints[idxRbStartingPointCandidate].pos().y(); - rbTouchBegin(thisPoint); - } else { - if (_rbHasValidTouch) { - rbTouchEnd(); - } - } - } + + _buttonsManager.processBeginOrEnd(thisPoint, tPoints, _unusedTouches); } bool TouchscreenVirtualPadDevice::viewTouchBeginIsValid(glm::vec2 touchPoint) { - return !moveTouchBeginIsValid(touchPoint) && !jumpTouchBeginIsValid(touchPoint) && !rbTouchBeginIsValid(touchPoint); + return !moveTouchBeginIsValid(touchPoint) && !jumpTouchBeginIsValid(touchPoint) && _buttonsManager.touchBeginInvalidForAllButtons(touchPoint); } bool TouchscreenVirtualPadDevice::moveTouchBeginIsValid(glm::vec2 touchPoint) { @@ -459,29 +451,6 @@ void TouchscreenVirtualPadDevice::jumpTouchEnd() { } } -bool TouchscreenVirtualPadDevice::rbTouchBeginIsValid(glm::vec2 touchPoint) { - return glm::distance2(touchPoint, _rbButtonPosition) < _rbButtonRadius * _rbButtonRadius; -} - -void TouchscreenVirtualPadDevice::rbTouchBegin(glm::vec2 touchPoint) { - auto& virtualPadManager = VirtualPad::Manager::instance(); - if (virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { - _rbHasValidTouch = true; - - _inputDevice->_buttonPressedMap.insert(TouchButtonChannel::RB); - } -} - -void TouchscreenVirtualPadDevice::rbTouchUpdate(glm::vec2 touchPoint) {} - -void TouchscreenVirtualPadDevice::rbTouchEnd() { - if (_rbHasValidTouch) { - _rbHasValidTouch = false; - - _inputDevice->_buttonPressedMap.erase(TouchButtonChannel::RB); - } -} - void TouchscreenVirtualPadDevice::moveTouchBegin(glm::vec2 touchPoint) { auto& virtualPadManager = VirtualPad::Manager::instance(); if (virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { @@ -566,3 +535,156 @@ QString TouchscreenVirtualPadDevice::InputDevice::getDefaultMappingConfig() cons static const QString MAPPING_JSON = PathUtils::resourcesPath() + "/controllers/touchscreenvirtualpad.json"; return MAPPING_JSON; } + +TouchscreenVirtualPadDevice::TouchscreenButton::TouchscreenButton( + TouchscreenVirtualPadDevice::TouchButtonChannel channelIn, + TouchscreenVirtualPadDevice::TouchType touchTypeIn, float buttonRadiusIn, + glm::vec2 buttonPositionIn, std::shared_ptr inputDeviceIn) : + channel(channelIn), + touchType(touchTypeIn), + buttonRadius(buttonRadiusIn), + buttonPosition(buttonPositionIn), + _inputDevice(inputDeviceIn) +{ +} + +void TouchscreenVirtualPadDevice::TouchscreenButton::touchBegin(glm::vec2 touchPoint) { + auto& virtualPadManager = VirtualPad::Manager::instance(); + if (virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { + hasValidTouch = true; + + _inputDevice->_buttonPressedMap.insert(channel); + } +} + +void TouchscreenVirtualPadDevice::TouchscreenButton::touchUpdate(glm::vec2 touchPoint) { + +} + +void TouchscreenVirtualPadDevice::TouchscreenButton::touchEnd() { + if (hasValidTouch) { + hasValidTouch = false; + + _inputDevice->_buttonPressedMap.erase(channel); + } +} + +bool TouchscreenVirtualPadDevice::TouchscreenButton::touchBeginIsValid(glm::vec2 touchPoint) { + qDebug() << "[HANDSHAKE] isValid " << (glm::distance2(touchPoint, buttonPosition) < buttonRadius * buttonRadius) << + " dist2 " << glm::distance2(touchPoint, buttonPosition) << " vs " << buttonRadius * buttonRadius; + return glm::distance2(touchPoint, buttonPosition) < buttonRadius * buttonRadius; +} + +void TouchscreenVirtualPadDevice::TouchscreenButton::resetEventValues() { + _candidatePointIdx = -1; + _found = false; +} + +TouchscreenVirtualPadDevice::TouchscreenButtonsManager::TouchscreenButtonsManager() {} + +void TouchscreenVirtualPadDevice::TouchscreenButtonsManager::addButton( + TouchscreenVirtualPadDevice::TouchscreenButton button) { + buttons.push_back(button); +} + +void TouchscreenVirtualPadDevice::TouchscreenButtonsManager::resetEventValues() { + for(int i = 0; i < buttons.size(); i++) { + TouchscreenButton &button = buttons[i]; + button.resetEventValues(); + } +} + +bool +TouchscreenVirtualPadDevice::TouchscreenButtonsManager::processOngoingTouch(glm::vec2 thisPoint, + int thisPointId) { + for(int i = 0; i < buttons.size(); i++) { + TouchscreenButton &button = buttons[i]; + + if (!button._found && button.hasValidTouch && button.currentTouchId == thisPointId) { + // valid if it's an ongoing touch + button._found = true; + button.touchUpdate(thisPoint); + return true; + } + } + return false; + +} + +bool TouchscreenVirtualPadDevice::TouchscreenButtonsManager::findStartingTouchPointCandidate( + glm::vec2 thisPoint, int thisPointId, int thisPointIdx, std::map &globalUnusedTouches) { + + for(int i = 0; i < buttons.size(); i++) { + TouchscreenButton &button = buttons[i]; + qDebug() << "[HANDSHAKE] !button._found && button._candidatePointIdx == -1 " << (!button._found && button._candidatePointIdx == -1); + qDebug() << "[HANDSHAKE] button.touchBeginIsValid(thisPoint) " << (button.touchBeginIsValid(thisPoint)); + qDebug() << "[HANDSHAKE] !globalUnusedTouches.count(thisPointId) " << (!globalUnusedTouches.count(thisPointId)); + if (globalUnusedTouches.count(thisPointId)) { + qDebug() << "[HANDSHAKE] globalUnusedTouches[thisPointId] == button.touchType " << (globalUnusedTouches[thisPointId] == button.touchType); + } + if (!button._found && button._candidatePointIdx == -1 && button.touchBeginIsValid(thisPoint)) { + qDebug() << "[HANDSHAKE] CHECK AGAIN !globalUnusedTouches.count(thisPointId) " << (!globalUnusedTouches.count(thisPointId)); + qDebug() << "[HANDSHAKE] CHECK AGAIN double-check !globalUnusedTouches.count(thisPointId) " << (!globalUnusedTouches.count(thisPointId)); + if (!globalUnusedTouches.count(thisPointId) ) { + button._candidatePointIdx = thisPointIdx; + return true; + } else if (globalUnusedTouches[thisPointId] == button.touchType) { + button._candidatePointIdx = thisPointIdx; + return true; + } + } + } + return false; + +} + +void TouchscreenVirtualPadDevice::TouchscreenButtonsManager::saveUnusedTouches( + std::map &unusedTouchesInEvent, glm::vec2 thisPoint, + int thisPointId) { + for(int i = 0; i < buttons.size(); i++) { + TouchscreenButton &button = buttons[i]; + if (button.touchBeginIsValid(thisPoint)) { + unusedTouchesInEvent[thisPointId] = button.touchType; + return; + } + } + +} + +void TouchscreenVirtualPadDevice::TouchscreenButtonsManager::processBeginOrEnd( + glm::vec2 thisPoint, const QList &tPoints, std::map globalUnusedTouches) { + for(int i = 0; i < buttons.size(); i++) { + TouchscreenButton &button = buttons[i]; + if (!button._found) { + if (button._candidatePointIdx != -1) { + button.currentTouchId = tPoints[button._candidatePointIdx].id(); + globalUnusedTouches.erase(button.currentTouchId); + thisPoint.x = tPoints[button._candidatePointIdx].pos().x(); + thisPoint.y = tPoints[button._candidatePointIdx].pos().y(); + button.touchBegin(thisPoint); + } else { + if (button.hasValidTouch) { + button.touchEnd(); + } + } + } + } + +} + +void TouchscreenVirtualPadDevice::TouchscreenButtonsManager::endTouchForAll() { + for(int i = 0; i < buttons.size(); i++) { + TouchscreenButton &button = buttons[i]; + button.touchEnd(); + } +} + +bool TouchscreenVirtualPadDevice::TouchscreenButtonsManager::touchBeginInvalidForAllButtons(glm::vec2 touchPoint) { + for(int i = 0; i < buttons.size(); i++) { + TouchscreenButton &button = buttons[i]; + if (button.touchBeginIsValid(touchPoint)) { + return false; + } + } + return true; +} diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 9ee3568be3..6ce4a1d412 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -15,6 +15,7 @@ #include #include "InputPlugin.h" #include +#include #include "VirtualPadManager.h" class QTouchEvent; @@ -87,6 +88,58 @@ protected: RB_BUTTON }; + class TouchscreenButton { + public: + + TouchscreenButton() {}; + + TouchscreenButton(TouchButtonChannel channelIn, TouchType touchTypeIn, float buttonRadiusIn, glm::vec2 buttonPositionIn, + std::shared_ptr inputDeviceIn); + + void touchBegin(glm::vec2 touchPoint); + void touchUpdate(glm::vec2 touchPoint); + void touchEnd(); + bool touchBeginIsValid(glm::vec2 touchPoint); + + bool hasValidTouch { false }; + int currentTouchId; + + // per event tmp values + int _candidatePointIdx { -1 }; + bool _found { false }; + void resetEventValues(); + + glm::vec2 buttonPosition; + float buttonRadius; + TouchType touchType; + TouchButtonChannel channel; + + std::shared_ptr _inputDevice; + + }; + + class TouchscreenButtonsManager { + public: + + TouchscreenButtonsManager(); + + QVector buttons; + + void addButton(TouchscreenButton button); + int buttonsCount() { + return buttons.size(); + } + + void resetEventValues(); + bool processOngoingTouch(glm::vec2 thisPoint, int thisPointId); + bool findStartingTouchPointCandidate(glm::vec2 thisPoint, int thisPointId, int thisPointIdx, std::map &globalUnusedTouches); + void saveUnusedTouches(std::map &unusedTouchesInEvent, glm::vec2 thisPoint, int thisPointId); + void processBeginOrEnd(glm::vec2 thisPoint, const QList& tPoints, std::map globalUnusedTouches); + + void endTouchForAll(); + bool touchBeginInvalidForAllButtons(glm::vec2 touchPoint); + }; + float _lastPinchScale; float _pinchScale; float _screenDPI; @@ -106,9 +159,6 @@ protected: bool _jumpHasValidTouch; int _jumpCurrentTouchId; - bool _rbHasValidTouch; - int _rbCurrentTouchId; - std::map _unusedTouches; int _touchPointCount; @@ -127,6 +177,8 @@ protected: glm::vec2 _rbButtonPosition; float _rbButtonRadius; + TouchscreenButtonsManager _buttonsManager; + void moveTouchBegin(glm::vec2 touchPoint); void moveTouchUpdate(glm::vec2 touchPoint); void moveTouchEnd(); @@ -142,11 +194,6 @@ protected: void jumpTouchEnd(); bool jumpTouchBeginIsValid(glm::vec2 touchPoint); - void rbTouchBegin(glm::vec2 touchPoint); - void rbTouchUpdate(glm::vec2 touchPoint); - void rbTouchEnd(); - bool rbTouchBeginIsValid(glm::vec2 touchPoint); - void setupControlsPositions(VirtualPad::Manager& virtualPadManager, bool force = false); void processInputDeviceForMove(VirtualPad::Manager& virtualPadManager); From 2e43912e923c807c26b094dd0cde6fedd619a91e Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Sat, 1 Sep 2018 02:31:36 -0300 Subject: [PATCH 3/6] Android - Handshake - Make the Jump button use buttonsManager code --- .../TouchscreenVirtualPadDevice.cpp | 66 ++----------------- .../TouchscreenVirtualPadDevice.h | 8 --- 2 files changed, 5 insertions(+), 69 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index eeaa463159..aa4955427b 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -91,16 +91,17 @@ void TouchscreenVirtualPadDevice::setupControlsPositions(VirtualPad::Manager& vi float rightMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_RIGHT_MARGIN_PIXELS / VirtualPad::Manager::DPI; float bottomMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_BOTTOM_MARGIN_PIXELS/ VirtualPad::Manager::DPI; _jumpButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - jumpBtnPixelSize, eventScreen->availableSize().height() - bottomMargin - _jumpButtonRadius - _extraBottomMargin); - virtualPadManager.setJumpButtonPosition(_jumpButtonPosition); // RB button (use same size as jump) _rbButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - jumpBtnPixelSize, eventScreen->availableSize().height() - 2 * bottomMargin - 3 * _rbButtonRadius - _extraBottomMargin); - virtualPadManager.setRbButtonPosition(_rbButtonPosition); // Avoid generating buttons in portrait mode if ( eventScreen->availableSize().width() > eventScreen->availableSize().height() && _buttonsManager.buttonsCount() == 0) { - //_buttonsManager.addButton(TouchscreenButton(JUMP_BUTTON_PRESS, JUMP, _jumpButtonRadius, _jumpButtonPosition, _inputDevice )); + _buttonsManager.addButton(TouchscreenButton(JUMP_BUTTON_PRESS, JUMP, _jumpButtonRadius, _jumpButtonPosition, _inputDevice )); _buttonsManager.addButton(TouchscreenButton(RB, RB_BUTTON, _rbButtonRadius, _rbButtonPosition, _inputDevice )); + + virtualPadManager.setJumpButtonPosition(_jumpButtonPosition); + virtualPadManager.setRbButtonPosition(_rbButtonPosition); } } @@ -247,7 +248,6 @@ void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { if (!virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { moveTouchEnd(); viewTouchEnd(); - jumpTouchEnd(); _buttonsManager.endTouchForAll(); return; } @@ -257,7 +257,6 @@ void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { debugPoints(event, " END ----------------"); moveTouchEnd(); viewTouchEnd(); - jumpTouchEnd(); _buttonsManager.endTouchForAll(); _inputDevice->_axisStateMap.clear(); _inputDevice->_buttonPressedMap.clear(); @@ -294,12 +293,9 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { const QList& tPoints = event->touchPoints(); bool moveTouchFound = false; bool viewTouchFound = false; - bool jumpTouchFound = false; int idxMoveStartingPointCandidate = -1; int idxViewStartingPointCandidate = -1; - int idxJumpStartingPointCandidate = -1; - int idxRbStartingPointCandidate = -1; _buttonsManager.resetEventValues(); @@ -326,13 +322,6 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { continue; } - if (!jumpTouchFound && _jumpHasValidTouch && _jumpCurrentTouchId == thisPointId) { - // valid if it's an ongoing touch - jumpTouchFound = true; - jumpTouchUpdate(thisPoint); - continue; - } - if (_buttonsManager.processOngoingTouch(thisPoint, thisPointId)) { continue; } @@ -349,20 +338,12 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { continue; } - if (!jumpTouchFound && idxJumpStartingPointCandidate == -1 && jumpTouchBeginIsValid(thisPoint) && - (!_unusedTouches.count(thisPointId) || _unusedTouches[thisPointId] == JUMP )) { - idxJumpStartingPointCandidate = i; - continue; - } - if (_buttonsManager.findStartingTouchPointCandidate(thisPoint, thisPointId, i, _unusedTouches)) { continue; } if (moveTouchBeginIsValid(thisPoint)) { unusedTouchesInEvent[thisPointId] = MOVE; - } else if (jumpTouchBeginIsValid(thisPoint)) { - unusedTouchesInEvent[thisPointId] = JUMP; } else if (viewTouchBeginIsValid(thisPoint)) { unusedTouchesInEvent[thisPointId] = VIEW; } else { @@ -395,26 +376,13 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { viewTouchEnd(); } } - if (!jumpTouchFound) { - if (idxJumpStartingPointCandidate != -1) { - _jumpCurrentTouchId = tPoints[idxJumpStartingPointCandidate].id(); - _unusedTouches.erase(_jumpCurrentTouchId); - thisPoint.x = tPoints[idxJumpStartingPointCandidate].pos().x(); - thisPoint.y = tPoints[idxJumpStartingPointCandidate].pos().y(); - jumpTouchBegin(thisPoint); - } else { - if (_jumpHasValidTouch) { - jumpTouchEnd(); - } - } - } _buttonsManager.processBeginOrEnd(thisPoint, tPoints, _unusedTouches); } bool TouchscreenVirtualPadDevice::viewTouchBeginIsValid(glm::vec2 touchPoint) { - return !moveTouchBeginIsValid(touchPoint) && !jumpTouchBeginIsValid(touchPoint) && _buttonsManager.touchBeginInvalidForAllButtons(touchPoint); + return !moveTouchBeginIsValid(touchPoint) && _buttonsManager.touchBeginInvalidForAllButtons(touchPoint); } bool TouchscreenVirtualPadDevice::moveTouchBeginIsValid(glm::vec2 touchPoint) { @@ -427,30 +395,6 @@ bool TouchscreenVirtualPadDevice::moveTouchBeginIsValid(glm::vec2 touchPoint) { } } -bool TouchscreenVirtualPadDevice::jumpTouchBeginIsValid(glm::vec2 touchPoint) { - // position of button and boundaries - return glm::distance2(touchPoint, _jumpButtonPosition) < _jumpButtonRadius * _jumpButtonRadius; -} - -void TouchscreenVirtualPadDevice::jumpTouchBegin(glm::vec2 touchPoint) { - auto& virtualPadManager = VirtualPad::Manager::instance(); - if (virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { - _jumpHasValidTouch = true; - - _inputDevice->_buttonPressedMap.insert(TouchButtonChannel::JUMP_BUTTON_PRESS); - } -} - -void TouchscreenVirtualPadDevice::jumpTouchUpdate(glm::vec2 touchPoint) {} - -void TouchscreenVirtualPadDevice::jumpTouchEnd() { - if (_jumpHasValidTouch) { - _jumpHasValidTouch = false; - - _inputDevice->_buttonPressedMap.erase(TouchButtonChannel::JUMP_BUTTON_PRESS); - } -} - void TouchscreenVirtualPadDevice::moveTouchBegin(glm::vec2 touchPoint) { auto& virtualPadManager = VirtualPad::Manager::instance(); if (virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 6ce4a1d412..4f8d03fb5f 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -156,9 +156,6 @@ protected: glm::vec2 _viewCurrentTouchPoint; int _viewCurrentTouchId; - bool _jumpHasValidTouch; - int _jumpCurrentTouchId; - std::map _unusedTouches; int _touchPointCount; @@ -189,11 +186,6 @@ protected: void viewTouchEnd(); bool viewTouchBeginIsValid(glm::vec2 touchPoint); - void jumpTouchBegin(glm::vec2 touchPoint); - void jumpTouchUpdate(glm::vec2 touchPoint); - void jumpTouchEnd(); - bool jumpTouchBeginIsValid(glm::vec2 touchPoint); - void setupControlsPositions(VirtualPad::Manager& virtualPadManager, bool force = false); void processInputDeviceForMove(VirtualPad::Manager& virtualPadManager); From 1891b0fd8123ebed2c65c4925cab5fe367bbde8b Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Mon, 3 Sep 2018 19:19:55 -0300 Subject: [PATCH 4/6] Android - Virtual Pad - Refactor in Basic2D..Plugin code for multiple buttons --- .../Basic2DWindowOpenGLDisplayPlugin.cpp | 116 +++++++++--------- .../Basic2DWindowOpenGLDisplayPlugin.h | 19 +++ .../TouchscreenVirtualPadDevice.cpp | 33 ++--- .../TouchscreenVirtualPadDevice.h | 6 +- libraries/ui/src/VirtualPadManager.cpp | 27 ++-- libraries/ui/src/VirtualPadManager.h | 14 ++- 6 files changed, 107 insertions(+), 108 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index ea5e854712..928ccc5d78 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -74,55 +74,15 @@ void Basic2DWindowOpenGLDisplayPlugin::customizeContext() { } } - - _virtualPadJumpBtnPixelSize = dpi * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI; - if (!_virtualPadJumpBtnTexture) { - auto iconPath = PathUtils::resourcesPath() + "images/fly.png"; - auto image = QImage(iconPath); - if (image.format() != QImage::Format_ARGB32) { - image = image.convertToFormat(QImage::Format_ARGB32); - } - if ((image.width() > 0) && (image.height() > 0)) { - image = image.scaled(_virtualPadJumpBtnPixelSize, _virtualPadJumpBtnPixelSize, Qt::KeepAspectRatio); - image = image.mirrored(); - - _virtualPadJumpBtnTexture = gpu::Texture::createStrict( - gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA), - image.width(), image.height(), - gpu::Texture::MAX_NUM_MIPS, - gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)); - _virtualPadJumpBtnTexture->setSource("virtualPad jump"); - auto usage = gpu::Texture::Usage::Builder().withColor().withAlpha(); - _virtualPadJumpBtnTexture->setUsage(usage.build()); - _virtualPadJumpBtnTexture->setStoredMipFormat(gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA)); - _virtualPadJumpBtnTexture->assignStoredMip(0, image.byteCount(), image.constBits()); - _virtualPadJumpBtnTexture->setAutoGenerateMips(true); - } - } - - _virtualPadRbBtnPixelSize = dpi * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI; - if (!_virtualPadRbBtnTexture) { - auto iconPath = PathUtils::resourcesPath() + "images/handshake.png"; - auto image = QImage(iconPath); - if (image.format() != QImage::Format_ARGB32) { - image = image.convertToFormat(QImage::Format_ARGB32); - } - if ((image.width() > 0) && (image.height() > 0)) { - image = image.scaled(_virtualPadRbBtnPixelSize, _virtualPadRbBtnPixelSize, Qt::KeepAspectRatio); - image = image.mirrored(); - - _virtualPadRbBtnTexture = gpu::Texture::createStrict( - gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA), - image.width(), image.height(), - gpu::Texture::MAX_NUM_MIPS, - gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)); - _virtualPadRbBtnTexture->setSource("virtualPad handshake"); - auto usage = gpu::Texture::Usage::Builder().withColor().withAlpha(); - _virtualPadRbBtnTexture->setUsage(usage.build()); - _virtualPadRbBtnTexture->setStoredMipFormat(gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA)); - _virtualPadRbBtnTexture->assignStoredMip(0, image.byteCount(), image.constBits()); - _virtualPadRbBtnTexture->setAutoGenerateMips(true); - } + if (_virtualPadButtons.size() == 0) { + _virtualPadButtons.append(VirtualPadButton( + dpi * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI, + PathUtils::resourcesPath() + "images/fly.png", + VirtualPad::Manager::Button::JUMP)); + _virtualPadButtons.append(VirtualPadButton( + dpi * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI, + PathUtils::resourcesPath() + "images/handshake.png", + VirtualPad::Manager::Button::HANDSHAKE)); } #endif Parent::customizeContext(); @@ -158,10 +118,6 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { _virtualPadPixelSize, _virtualPadPixelSize); auto stickTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getLeftVirtualPad()->getCurrentTouch(), _virtualPadPixelSize, _virtualPadPixelSize); - auto jumpTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getJumpButtonPosition(), - _virtualPadJumpBtnPixelSize, _virtualPadJumpBtnPixelSize); - auto rbTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getRbButtonPosition(), - _virtualPadRbBtnPixelSize, _virtualPadRbBtnPixelSize); render([&](gpu::Batch& batch) { batch.enableStereo(false); @@ -178,13 +134,9 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { batch.setModelTransform(stickTransform); batch.draw(gpu::TRIANGLE_STRIP, 4); - batch.setResourceTexture(0, _virtualPadJumpBtnTexture); - batch.setModelTransform(jumpTransform); - batch.draw(gpu::TRIANGLE_STRIP, 4); - - batch.setResourceTexture(0, _virtualPadRbBtnTexture); - batch.setModelTransform(rbTransform); - batch.draw(gpu::TRIANGLE_STRIP, 4); + foreach(VirtualPadButton virtualPadButton, _virtualPadButtons) { + virtualPadButton.draw(batch, virtualPadManager.getButtonPosition(virtualPadButton._button)); + } }); } #endif @@ -209,3 +161,47 @@ bool Basic2DWindowOpenGLDisplayPlugin::isThrottled() const { QScreen* Basic2DWindowOpenGLDisplayPlugin::getFullscreenTarget() { return qApp->primaryScreen(); } + +#if defined(Q_OS_ANDROID) + +Basic2DWindowOpenGLDisplayPlugin::VirtualPadButton::VirtualPadButton(qreal pixelSize, + QString iconPath, + VirtualPad::Manager::Button button) : + _pixelSize { pixelSize }, + _button { button } +{ + if (!_texture) { + auto image = QImage(iconPath); + if (image.format() != QImage::Format_ARGB32) { + image = image.convertToFormat(QImage::Format_ARGB32); + } + if ((image.width() > 0) && (image.height() > 0)) { + image = image.scaled(_pixelSize, _pixelSize, Qt::KeepAspectRatio); + image = image.mirrored(); + + _texture = gpu::Texture::createStrict( + gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA), + image.width(), image.height(), + gpu::Texture::MAX_NUM_MIPS, + gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)); + _texture->setSource(iconPath.toStdString()); + auto usage = gpu::Texture::Usage::Builder().withColor().withAlpha(); + _texture->setUsage(usage.build()); + _texture->setStoredMipFormat(gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA)); + _texture->assignStoredMip(0, image.byteCount(), image.constBits()); + _texture->setAutoGenerateMips(true); + } + } +} + +void Basic2DWindowOpenGLDisplayPlugin::VirtualPadButton::draw(gpu::Batch &batch, + glm::vec2 buttonPosition) { + auto transform = DependencyManager::get()->getPoint2DTransform( + buttonPosition, + _pixelSize, _pixelSize); + batch.setResourceTexture(0, _texture); + batch.setModelTransform(transform); + batch.draw(gpu::TRIANGLE_STRIP, 4); +} + +#endif \ No newline at end of file diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h index 955a816799..d6b1242a47 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h @@ -9,6 +9,10 @@ #include "OpenGLDisplayPlugin.h" +#if defined(Q_OS_ANDROID) +#include "VirtualPadManager.h" +#endif + const float TARGET_FRAMERATE_Basic2DWindowOpenGL = 60.0f; class QScreen; @@ -52,5 +56,20 @@ private: gpu::TexturePointer _virtualPadRbBtnTexture; qreal _virtualPadRbBtnPixelSize; + + class VirtualPadButton { + public: + + VirtualPadButton() {} + VirtualPadButton(qreal pixelSize, QString iconPath, VirtualPad::Manager::Button button); + + void draw(gpu::Batch& batch, glm::vec2 buttonPosition); + + gpu::TexturePointer _texture; + qreal _pixelSize; + VirtualPad::Manager::Button _button; + }; + QVector _virtualPadButtons; + #endif }; diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index aa4955427b..bf9dbb8604 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -66,8 +66,7 @@ void TouchscreenVirtualPadDevice::resize() { _fixedRadius = _screenDPI * 0.5f * VirtualPad::Manager::BASE_DIAMETER_PIXELS / VirtualPad::Manager::DPI; _fixedRadiusForCalc = _fixedRadius - _screenDPI * VirtualPad::Manager::STICK_RADIUS_PIXELS / VirtualPad::Manager::DPI; - _jumpButtonRadius = _screenDPI * VirtualPad::Manager::JUMP_BTN_TRIMMED_RADIUS_PIXELS / VirtualPad::Manager::DPI; - _rbButtonRadius = _jumpButtonRadius; + _buttonRadius = _screenDPI * VirtualPad::Manager::JUMP_BTN_TRIMMED_RADIUS_PIXELS / VirtualPad::Manager::DPI; } auto& virtualPadManager = VirtualPad::Manager::instance(); @@ -90,18 +89,16 @@ void TouchscreenVirtualPadDevice::setupControlsPositions(VirtualPad::Manager& vi float jumpBtnPixelSize = _screenDPI * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI; float rightMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_RIGHT_MARGIN_PIXELS / VirtualPad::Manager::DPI; float bottomMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_BOTTOM_MARGIN_PIXELS/ VirtualPad::Manager::DPI; - _jumpButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - jumpBtnPixelSize, eventScreen->availableSize().height() - bottomMargin - _jumpButtonRadius - _extraBottomMargin); - - // RB button (use same size as jump) - _rbButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - jumpBtnPixelSize, eventScreen->availableSize().height() - 2 * bottomMargin - 3 * _rbButtonRadius - _extraBottomMargin); + glm::vec2 jumpButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - jumpBtnPixelSize, eventScreen->availableSize().height() - bottomMargin - _buttonRadius - _extraBottomMargin); + glm::vec2 rbButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - jumpBtnPixelSize, eventScreen->availableSize().height() - 2 * bottomMargin - 3 * _buttonRadius - _extraBottomMargin); // Avoid generating buttons in portrait mode if ( eventScreen->availableSize().width() > eventScreen->availableSize().height() && _buttonsManager.buttonsCount() == 0) { - _buttonsManager.addButton(TouchscreenButton(JUMP_BUTTON_PRESS, JUMP, _jumpButtonRadius, _jumpButtonPosition, _inputDevice )); - _buttonsManager.addButton(TouchscreenButton(RB, RB_BUTTON, _rbButtonRadius, _rbButtonPosition, _inputDevice )); + _buttonsManager.addButton(TouchscreenButton(JUMP_BUTTON_PRESS, JUMP, _buttonRadius, jumpButtonPosition, _inputDevice )); + _buttonsManager.addButton(TouchscreenButton(RB, RB_BUTTON, _buttonRadius, rbButtonPosition, _inputDevice )); - virtualPadManager.setJumpButtonPosition(_jumpButtonPosition); - virtualPadManager.setRbButtonPosition(_rbButtonPosition); + virtualPadManager.setButtonPosition(VirtualPad::Manager::Button::JUMP, jumpButtonPosition); + virtualPadManager.setButtonPosition(VirtualPad::Manager::Button::HANDSHAKE, rbButtonPosition); } } @@ -484,10 +481,10 @@ TouchscreenVirtualPadDevice::TouchscreenButton::TouchscreenButton( TouchscreenVirtualPadDevice::TouchButtonChannel channelIn, TouchscreenVirtualPadDevice::TouchType touchTypeIn, float buttonRadiusIn, glm::vec2 buttonPositionIn, std::shared_ptr inputDeviceIn) : - channel(channelIn), - touchType(touchTypeIn), - buttonRadius(buttonRadiusIn), buttonPosition(buttonPositionIn), + buttonRadius(buttonRadiusIn), + touchType(touchTypeIn), + channel(channelIn), _inputDevice(inputDeviceIn) { } @@ -514,8 +511,6 @@ void TouchscreenVirtualPadDevice::TouchscreenButton::touchEnd() { } bool TouchscreenVirtualPadDevice::TouchscreenButton::touchBeginIsValid(glm::vec2 touchPoint) { - qDebug() << "[HANDSHAKE] isValid " << (glm::distance2(touchPoint, buttonPosition) < buttonRadius * buttonRadius) << - " dist2 " << glm::distance2(touchPoint, buttonPosition) << " vs " << buttonRadius * buttonRadius; return glm::distance2(touchPoint, buttonPosition) < buttonRadius * buttonRadius; } @@ -560,15 +555,7 @@ bool TouchscreenVirtualPadDevice::TouchscreenButtonsManager::findStartingTouchPo for(int i = 0; i < buttons.size(); i++) { TouchscreenButton &button = buttons[i]; - qDebug() << "[HANDSHAKE] !button._found && button._candidatePointIdx == -1 " << (!button._found && button._candidatePointIdx == -1); - qDebug() << "[HANDSHAKE] button.touchBeginIsValid(thisPoint) " << (button.touchBeginIsValid(thisPoint)); - qDebug() << "[HANDSHAKE] !globalUnusedTouches.count(thisPointId) " << (!globalUnusedTouches.count(thisPointId)); - if (globalUnusedTouches.count(thisPointId)) { - qDebug() << "[HANDSHAKE] globalUnusedTouches[thisPointId] == button.touchType " << (globalUnusedTouches[thisPointId] == button.touchType); - } if (!button._found && button._candidatePointIdx == -1 && button.touchBeginIsValid(thisPoint)) { - qDebug() << "[HANDSHAKE] CHECK AGAIN !globalUnusedTouches.count(thisPointId) " << (!globalUnusedTouches.count(thisPointId)); - qDebug() << "[HANDSHAKE] CHECK AGAIN double-check !globalUnusedTouches.count(thisPointId) " << (!globalUnusedTouches.count(thisPointId)); if (!globalUnusedTouches.count(thisPointId) ) { button._candidatePointIdx = thisPointIdx; return true; diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 4f8d03fb5f..3c79901483 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -168,11 +168,7 @@ protected: float _fixedRadiusForCalc; int _extraBottomMargin {0}; - glm::vec2 _jumpButtonPosition; - float _jumpButtonRadius; - - glm::vec2 _rbButtonPosition; - float _rbButtonRadius; + float _buttonRadius; TouchscreenButtonsManager _buttonsManager; diff --git a/libraries/ui/src/VirtualPadManager.cpp b/libraries/ui/src/VirtualPadManager.cpp index e2e44fda81..a592549201 100644 --- a/libraries/ui/src/VirtualPadManager.cpp +++ b/libraries/ui/src/VirtualPadManager.cpp @@ -76,22 +76,6 @@ namespace VirtualPad { _extraBottomMargin = margin; } - glm::vec2 Manager::getJumpButtonPosition() { - return _jumpButtonPosition; - } - - void Manager::setJumpButtonPosition(glm::vec2 point) { - _jumpButtonPosition = point; - } - - glm::vec2 Manager::getRbButtonPosition() { - return _rbButtonPosition; - } - - void Manager::setRbButtonPosition(glm::vec2 point) { - _rbButtonPosition = point; - } - void Manager::requestHapticFeedback(int duration) { emit hapticFeedbackRequested(duration); } @@ -100,6 +84,17 @@ namespace VirtualPad { return &_leftVPadInstance; } + glm::vec2 Manager::getButtonPosition(Manager::Button button) { + if (_buttonsPositions.count(button)) { + return _buttonsPositions.at(button); + } + return glm::vec2(); + } + + void Manager::setButtonPosition(Manager::Button button, glm::vec2 point) { + _buttonsPositions[button] = point; + } + bool Instance::isShown() { return _shown; } diff --git a/libraries/ui/src/VirtualPadManager.h b/libraries/ui/src/VirtualPadManager.h index 3832be6ed2..4938c1ceb3 100644 --- a/libraries/ui/src/VirtualPadManager.h +++ b/libraries/ui/src/VirtualPadManager.h @@ -44,10 +44,15 @@ namespace VirtualPad { void hide(bool hide); int extraBottomMargin(); void setExtraBottomMargin(int margin); - glm::vec2 getJumpButtonPosition(); - void setJumpButtonPosition(glm::vec2 point); - glm::vec2 getRbButtonPosition(); - void setRbButtonPosition(glm::vec2 point); + + enum Button { + JUMP, + HANDSHAKE + }; + + glm::vec2 getButtonPosition(Button button); + void setButtonPosition(Button button, glm::vec2 point); + void requestHapticFeedback(int duration); static const float DPI; @@ -69,6 +74,7 @@ namespace VirtualPad { glm::vec2 _jumpButtonPosition; glm::vec2 _rbButtonPosition; int _extraBottomMargin {0}; + std::map _buttonsPositions; }; } From 8839a3b027fcbfaff74656722d7151cd014c5934 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Mon, 3 Sep 2018 20:07:30 -0300 Subject: [PATCH 5/6] Android - Virtual Pad - make jump button references generic --- .../Basic2DWindowOpenGLDisplayPlugin.cpp | 4 ++-- .../TouchscreenVirtualPadDevice.cpp | 16 ++++++++-------- .../input-plugins/TouchscreenVirtualPadDevice.h | 4 ++-- libraries/ui/src/VirtualPadManager.cpp | 8 ++++---- libraries/ui/src/VirtualPadManager.h | 14 ++++++-------- 5 files changed, 22 insertions(+), 24 deletions(-) diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index 928ccc5d78..9828a8beda 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -76,11 +76,11 @@ void Basic2DWindowOpenGLDisplayPlugin::customizeContext() { if (_virtualPadButtons.size() == 0) { _virtualPadButtons.append(VirtualPadButton( - dpi * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI, + dpi * VirtualPad::Manager::BTN_FULL_PIXELS / VirtualPad::Manager::DPI, PathUtils::resourcesPath() + "images/fly.png", VirtualPad::Manager::Button::JUMP)); _virtualPadButtons.append(VirtualPadButton( - dpi * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI, + dpi * VirtualPad::Manager::BTN_FULL_PIXELS / VirtualPad::Manager::DPI, PathUtils::resourcesPath() + "images/handshake.png", VirtualPad::Manager::Button::HANDSHAKE)); } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index bf9dbb8604..d368bf4d61 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -66,7 +66,7 @@ void TouchscreenVirtualPadDevice::resize() { _fixedRadius = _screenDPI * 0.5f * VirtualPad::Manager::BASE_DIAMETER_PIXELS / VirtualPad::Manager::DPI; _fixedRadiusForCalc = _fixedRadius - _screenDPI * VirtualPad::Manager::STICK_RADIUS_PIXELS / VirtualPad::Manager::DPI; - _buttonRadius = _screenDPI * VirtualPad::Manager::JUMP_BTN_TRIMMED_RADIUS_PIXELS / VirtualPad::Manager::DPI; + _buttonRadius = _screenDPI * VirtualPad::Manager::BTN_TRIMMED_RADIUS_PIXELS / VirtualPad::Manager::DPI; } auto& virtualPadManager = VirtualPad::Manager::instance(); @@ -86,15 +86,15 @@ void TouchscreenVirtualPadDevice::setupControlsPositions(VirtualPad::Manager& vi virtualPadManager.getLeftVirtualPad()->setFirstTouch(_moveRefTouchPoint); // Jump button - float jumpBtnPixelSize = _screenDPI * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI; - float rightMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_RIGHT_MARGIN_PIXELS / VirtualPad::Manager::DPI; - float bottomMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_BOTTOM_MARGIN_PIXELS/ VirtualPad::Manager::DPI; - glm::vec2 jumpButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - jumpBtnPixelSize, eventScreen->availableSize().height() - bottomMargin - _buttonRadius - _extraBottomMargin); - glm::vec2 rbButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - jumpBtnPixelSize, eventScreen->availableSize().height() - 2 * bottomMargin - 3 * _buttonRadius - _extraBottomMargin); + float btnPixelSize = _screenDPI * VirtualPad::Manager::BTN_FULL_PIXELS / VirtualPad::Manager::DPI; + float rightMargin = _screenDPI * VirtualPad::Manager::BTN_RIGHT_MARGIN_PIXELS / VirtualPad::Manager::DPI; + float bottomMargin = _screenDPI * VirtualPad::Manager::BTN_BOTTOM_MARGIN_PIXELS/ VirtualPad::Manager::DPI; + glm::vec2 jumpButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - btnPixelSize, eventScreen->availableSize().height() - bottomMargin - _buttonRadius - _extraBottomMargin); + glm::vec2 rbButtonPosition = glm::vec2( eventScreen->availableSize().width() - rightMargin - btnPixelSize, eventScreen->availableSize().height() - 2 * bottomMargin - 3 * _buttonRadius - _extraBottomMargin); // Avoid generating buttons in portrait mode if ( eventScreen->availableSize().width() > eventScreen->availableSize().height() && _buttonsManager.buttonsCount() == 0) { - _buttonsManager.addButton(TouchscreenButton(JUMP_BUTTON_PRESS, JUMP, _buttonRadius, jumpButtonPosition, _inputDevice )); + _buttonsManager.addButton(TouchscreenButton(JUMP, JUMP_BUTTON, _buttonRadius, jumpButtonPosition, _inputDevice )); _buttonsManager.addButton(TouchscreenButton(RB, RB_BUTTON, _buttonRadius, rbButtonPosition, _inputDevice )); virtualPadManager.setButtonPosition(VirtualPad::Manager::Button::JUMP, jumpButtonPosition); @@ -466,7 +466,7 @@ controller::Input::NamedVector TouchscreenVirtualPadDevice::InputDevice::getAvai Input::NamedPair(makeInput(TouchAxisChannel::LY), "LY"), Input::NamedPair(makeInput(TouchAxisChannel::RX), "RX"), Input::NamedPair(makeInput(TouchAxisChannel::RY), "RY"), - Input::NamedPair(makeInput(TouchButtonChannel::JUMP_BUTTON_PRESS), "JUMP_BUTTON_PRESS"), + Input::NamedPair(makeInput(TouchButtonChannel::JUMP), "JUMP_BUTTON_PRESS"), Input::NamedPair(makeInput(TouchButtonChannel::RB), "RB") }; return availableInputs; diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 3c79901483..4ef1dbd4f6 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -52,7 +52,7 @@ public: }; enum TouchButtonChannel { - JUMP_BUTTON_PRESS, + JUMP, RB }; @@ -84,7 +84,7 @@ protected: enum TouchType { MOVE = 1, VIEW, - JUMP, + JUMP_BUTTON, RB_BUTTON }; diff --git a/libraries/ui/src/VirtualPadManager.cpp b/libraries/ui/src/VirtualPadManager.cpp index a592549201..bf325a0bd6 100644 --- a/libraries/ui/src/VirtualPadManager.cpp +++ b/libraries/ui/src/VirtualPadManager.cpp @@ -38,10 +38,10 @@ namespace VirtualPad { const float Manager::BASE_DIAMETER_PIXELS = 512.0f; const float Manager::BASE_MARGIN_PIXELS = 59.0f; const float Manager::STICK_RADIUS_PIXELS = 105.0f; - const float Manager::JUMP_BTN_TRIMMED_RADIUS_PIXELS = 67.0f; - const float Manager::JUMP_BTN_FULL_PIXELS = 164.0f; - const float Manager::JUMP_BTN_BOTTOM_MARGIN_PIXELS = 80.0f; - const float Manager::JUMP_BTN_RIGHT_MARGIN_PIXELS = 13.0f; + const float Manager::BTN_TRIMMED_RADIUS_PIXELS = 67.0f; + const float Manager::BTN_FULL_PIXELS = 164.0f; + const float Manager::BTN_BOTTOM_MARGIN_PIXELS = 80.0f; + const float Manager::BTN_RIGHT_MARGIN_PIXELS = 13.0f; Manager::Manager() { diff --git a/libraries/ui/src/VirtualPadManager.h b/libraries/ui/src/VirtualPadManager.h index 4938c1ceb3..a1f2e17597 100644 --- a/libraries/ui/src/VirtualPadManager.h +++ b/libraries/ui/src/VirtualPadManager.h @@ -59,21 +59,19 @@ namespace VirtualPad { static const float BASE_DIAMETER_PIXELS; static const float BASE_MARGIN_PIXELS; static const float STICK_RADIUS_PIXELS; - static const float JUMP_BTN_TRIMMED_RADIUS_PIXELS; - static const float JUMP_BTN_FULL_PIXELS; - static const float JUMP_BTN_BOTTOM_MARGIN_PIXELS; - static const float JUMP_BTN_RIGHT_MARGIN_PIXELS; + static const float BTN_TRIMMED_RADIUS_PIXELS; + static const float BTN_FULL_PIXELS; + static const float BTN_BOTTOM_MARGIN_PIXELS; + static const float BTN_RIGHT_MARGIN_PIXELS; signals: void hapticFeedbackRequested(int duration); private: Instance _leftVPadInstance; - bool _enabled {true}; + bool _enabled { true }; bool _hidden; - glm::vec2 _jumpButtonPosition; - glm::vec2 _rbButtonPosition; - int _extraBottomMargin {0}; + int _extraBottomMargin { 0 }; std::map _buttonsPositions; }; } From 514c552a4d4f5fadce1b5c48e5c0ba3bcb6301ff Mon Sep 17 00:00:00 2001 From: Cristian Duarte Date: Fri, 8 Feb 2019 19:53:59 -0300 Subject: [PATCH 6/6] Android - Remove block that disabled AnimInverseKinematics::overlay method --- libraries/animation/src/AnimInverseKinematics.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/libraries/animation/src/AnimInverseKinematics.cpp b/libraries/animation/src/AnimInverseKinematics.cpp index 82224808da..d710e9d8ff 100644 --- a/libraries/animation/src/AnimInverseKinematics.cpp +++ b/libraries/animation/src/AnimInverseKinematics.cpp @@ -865,12 +865,6 @@ const AnimPoseVec& AnimInverseKinematics::evaluate(const AnimVariantMap& animVar //virtual const AnimPoseVec& AnimInverseKinematics::overlay(const AnimVariantMap& animVars, const AnimContext& context, float dt, AnimVariantMap& triggersOut, const AnimPoseVec& underPoses) { -/* We need this working so body parts can move -#ifdef Q_OS_ANDROID - // disable IK on android - return underPoses; -#endif -*/ // allows solutionSource to be overridden by an animVar auto solutionSource = animVars.lookup(_solutionSourceVar, (int)_solutionSource);