From 1ea056a8a9a9fd9567cddb52b24c6c9f45a76508 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Tue, 3 Apr 2018 16:07:40 -0300 Subject: [PATCH 01/15] Android - Initial Jump button implementation --- .../controllers/touchscreenvirtualpad.json | 2 + .../Basic2DWindowOpenGLDisplayPlugin.cpp | 42 +++++++- .../Basic2DWindowOpenGLDisplayPlugin.h | 3 + .../TouchscreenVirtualPadDevice.cpp | 95 +++++++++++++++++-- .../TouchscreenVirtualPadDevice.h | 29 +++++- libraries/ui/src/VirtualPadManager.cpp | 17 +++- libraries/ui/src/VirtualPadManager.h | 12 ++- 7 files changed, 181 insertions(+), 19 deletions(-) diff --git a/interface/resources/controllers/touchscreenvirtualpad.json b/interface/resources/controllers/touchscreenvirtualpad.json index 907ff8b403..cdea8681cb 100644 --- a/interface/resources/controllers/touchscreenvirtualpad.json +++ b/interface/resources/controllers/touchscreenvirtualpad.json @@ -5,6 +5,8 @@ { "from": "TouchscreenVirtualPad.LX", "when": "!Application.CameraIndependent", "filters": { "type": "deadZone", "min": 0.05 }, "to": "Actions.TranslateX" }, + { "from": "TouchscreenVirtualPad.JUMP_BUTTON_PRESS", "when": "!Application.CameraIndependent", "to": "Actions.VERTICAL_UP" }, + { "from": "TouchscreenVirtualPad.RX", "when": "!Application.CameraIndependent", "filters": [ {"type": "deadZone", "min": 0.05} , "invert" ], "to": "Actions.Yaw" }, { "from": "TouchscreenVirtualPad.RY", "when": "!Application.CameraIndependent", "filters": [ {"type": "deadZone", "min": 0.05}, "invert" ], "to": "Actions.Pitch" } diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index 97f74fa24e..577330a724 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -25,11 +25,11 @@ static const QString FULLSCREEN = "Fullscreen"; void Basic2DWindowOpenGLDisplayPlugin::customizeContext() { #if defined(Q_OS_ANDROID) + qreal dpi = getFullscreenTarget()->physicalDotsPerInch(); + _virtualPadPixelSize = dpi * VirtualPad::Manager::BASE_DIAMETER_PIXELS / VirtualPad::Manager::DPI; + auto iconPath = PathUtils::resourcesPath() + "images/analog_stick.png"; auto image = QImage(iconPath); - qreal dpi = getFullscreenTarget()->physicalDotsPerInch(); - _virtualPadPixelSize = dpi * VirtualPad::Manager::PIXEL_SIZE / VirtualPad::Manager::DPI; - if (image.format() != QImage::Format_ARGB32) { image = image.convertToFormat(QImage::Format_ARGB32); } @@ -69,6 +69,28 @@ void Basic2DWindowOpenGLDisplayPlugin::customizeContext() { _virtualPadStickBaseTexture->assignStoredMip(0, image.byteCount(), image.constBits()); _virtualPadStickBaseTexture->setAutoGenerateMips(true); } + + _virtualPadJumpBtnPixelSize = dpi * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI; + iconPath = PathUtils::resourcesPath() + "images/analog_stick.png"; + 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); + + _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); + } #endif Parent::customizeContext(); } @@ -124,6 +146,20 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { batch.setViewportTransform(ivec4(uvec2(0), getRecommendedRenderSize())); batch.draw(gpu::TRIANGLE_STRIP, 4); }); + + // render stick head + auto jumpTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getJumpButtonPosition(), + _virtualPadJumpBtnPixelSize, _virtualPadJumpBtnPixelSize); + render([&](gpu::Batch& batch) { + batch.enableStereo(false); + batch.setProjectionTransform(mat4()); + batch.setPipeline(_cursorPipeline); + batch.setResourceTexture(0, _virtualPadJumpBtnTexture); + batch.resetViewTransform(); + batch.setModelTransform(jumpTransform); + batch.setViewportTransform(ivec4(uvec2(0), getRecommendedRenderSize())); + batch.draw(gpu::TRIANGLE_STRIP, 4); + }); } #endif Parent::compositeExtra(); diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h index 26c48743b7..a061a4c923 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h @@ -46,5 +46,8 @@ private: gpu::TexturePointer _virtualPadStickTexture; gpu::TexturePointer _virtualPadStickBaseTexture; qreal _virtualPadPixelSize; + + gpu::TexturePointer _virtualPadJumpBtnTexture; + qreal _virtualPadJumpBtnPixelSize; #endif }; diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 0a28368e9e..8b922434da 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -50,12 +50,15 @@ void TouchscreenVirtualPadDevice::init() { _screenDPIProvided = eventScreen->physicalDotsPerInch(); _screenDPI = eventScreen->physicalDotsPerInch(); - _fixedRadius = _screenDPI * 0.5f * VirtualPad::Manager::PIXEL_SIZE / VirtualPad::Manager::DPI; - _fixedRadiusForCalc = _fixedRadius - _screenDPI * VirtualPad::Manager::STICK_RADIUS / VirtualPad::Manager::DPI; + _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; } auto& virtualPadManager = VirtualPad::Manager::instance(); setupFixedCenter(virtualPadManager, true); + setupJumpButton(virtualPadManager); if (_fixedPosition) { virtualPadManager.getLeftVirtualPad()->setShown(virtualPadManager.isEnabled() && !virtualPadManager.isHidden()); // Show whenever it's enabled @@ -67,11 +70,10 @@ void TouchscreenVirtualPadDevice::init() { void TouchscreenVirtualPadDevice::setupFixedCenter(VirtualPad::Manager& virtualPadManager, bool force) { if (!_fixedPosition) return; - //auto& virtualPadManager = VirtualPad::Manager::instance(); if (_extraBottomMargin == virtualPadManager.extraBottomMargin() && !force) return; // Our only criteria to decide a center change is the bottom margin _extraBottomMargin = virtualPadManager.extraBottomMargin(); - float margin = _screenDPI * VirtualPad::Manager::BASE_MARGIN / VirtualPad::Manager::DPI; + float margin = _screenDPI * VirtualPad::Manager::BASE_MARGIN_PIXELS / VirtualPad::Manager::DPI; QScreen* eventScreen = qApp->primaryScreen(); // do not call every time _fixedCenterPosition = glm::vec2( _fixedRadius + margin, eventScreen->size().height() - margin - _fixedRadius - _extraBottomMargin); @@ -79,6 +81,13 @@ void TouchscreenVirtualPadDevice::setupFixedCenter(VirtualPad::Manager& virtualP virtualPadManager.getLeftVirtualPad()->setFirstTouch(_moveRefTouchPoint); } +void TouchscreenVirtualPadDevice::setupJumpButton(VirtualPad::Manager& virtualPadManager) { + QScreen* screen = qApp->primaryScreen(); + float topMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_TOP_MARGIN_PIXELS / VirtualPad::Manager::DPI; + _jumpButtonPosition = glm::vec2( screen->size().width() / 2 + _jumpButtonRadius/2, topMargin + _jumpButtonRadius); + virtualPadManager.setJumpButtonPosition(_jumpButtonPosition); +} + float clip(float n, float lower, float upper) { return std::max(lower, std::min(n, upper)); } @@ -221,6 +230,7 @@ void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { if (!virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { moveTouchEnd(); viewTouchEnd(); + jumpTouchEnd(); return; } // touch end here is a big reset -> resets both pads @@ -229,7 +239,9 @@ void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { debugPoints(event, " END ----------------"); moveTouchEnd(); viewTouchEnd(); + jumpTouchEnd(); _inputDevice->_axisStateMap.clear(); + _inputDevice->_buttonPressedMap.clear(); } void TouchscreenVirtualPadDevice::processUnusedTouches(std::map unusedTouchesInEvent) { @@ -263,9 +275,11 @@ 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; glm::vec2 thisPoint; int thisPointId; @@ -290,6 +304,13 @@ 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 (!moveTouchFound && idxMoveStartingPointCandidate == -1 && moveTouchBeginIsValid(thisPoint) && (!_unusedTouches.count(thisPointId) || _unusedTouches[thisPointId] == MOVE )) { idxMoveStartingPointCandidate = i; @@ -302,8 +323,16 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { continue; } + if (!jumpTouchFound && idxJumpStartingPointCandidate == -1 && jumpTouchBeginIsValid(thisPoint) && + (!_unusedTouches.count(thisPointId) || _unusedTouches[thisPointId] == JUMP )) { + idxJumpStartingPointCandidate = i; + continue; + } + if (moveTouchBeginIsValid(thisPoint)) { unusedTouchesInEvent[thisPointId] = MOVE; + } else if (jumpTouchBeginIsValid(thisPoint)) { + unusedTouchesInEvent[thisPointId] = JUMP; } else if (viewTouchBeginIsValid(thisPoint)) { unusedTouchesInEvent[thisPointId] = VIEW; } @@ -330,11 +359,22 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { viewTouchEnd(); } } + if (!jumpTouchFound) { + if (idxJumpStartingPointCandidate != -1) { + _jumpCurrentTouchId = tPoints[idxJumpStartingPointCandidate].id(); + _unusedTouches.erase(_jumpCurrentTouchId); + jumpTouchBegin(thisPoint); + } else { + if (_jumpHasValidTouch) { + jumpTouchEnd(); + } + } + } } bool TouchscreenVirtualPadDevice::viewTouchBeginIsValid(glm::vec2 touchPoint) { - return !moveTouchBeginIsValid(touchPoint); + return !moveTouchBeginIsValid(touchPoint) && !jumpTouchBeginIsValid(touchPoint); } bool TouchscreenVirtualPadDevice::moveTouchBeginIsValid(glm::vec2 touchPoint) { @@ -347,6 +387,34 @@ bool TouchscreenVirtualPadDevice::moveTouchBeginIsValid(glm::vec2 touchPoint) { } } +bool TouchscreenVirtualPadDevice::jumpTouchBeginIsValid(glm::vec2 touchPoint) { + // position of button and boundaries + return pow(touchPoint.x - _jumpButtonPosition.x, 2.0) + pow(touchPoint.y - _jumpButtonPosition.y, 2.0) < pow(_jumpButtonRadius, 2.0); +} + +void TouchscreenVirtualPadDevice::jumpTouchBegin(glm::vec2 touchPoint) { + auto& virtualPadManager = VirtualPad::Manager::instance(); + if (virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { + _jumpHasValidTouch = true; + + auto input = _inputDevice->makeInput(TouchButtonChannel::JUMP_BUTTON_PRESS); + _inputDevice->_buttonPressedMap.insert(input.getChannel()); + qDebug() << "[TVPD] TouchscreenVirtualPadDevice::jumpTouchBegin buttonsMapSize " << _inputDevice->_buttonPressedMap.size(); + } +} + +void TouchscreenVirtualPadDevice::jumpTouchUpdate(glm::vec2 touchPoint) {} + +void TouchscreenVirtualPadDevice::jumpTouchEnd() { + if (_jumpHasValidTouch) { + _jumpHasValidTouch = false; + + auto input = _inputDevice->makeInput(TouchButtonChannel::JUMP_BUTTON_PRESS); + _inputDevice->_buttonPressedMap.erase(input.getChannel()); + qDebug() << "[TVPD] TouchscreenVirtualPadDevice::jumpTouchEnd buttonsMapSize " << _inputDevice->_buttonPressedMap.size(); + } +} + void TouchscreenVirtualPadDevice::moveTouchBegin(glm::vec2 touchPoint) { auto& virtualPadManager = VirtualPad::Manager::instance(); if (virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { @@ -403,13 +471,22 @@ void TouchscreenVirtualPadDevice::touchGestureEvent(const QGestureEvent* event) } } +controller::Input TouchscreenVirtualPadDevice::InputDevice::makeInput(TouchscreenVirtualPadDevice::TouchAxisChannel axis) const { + return controller::Input(_deviceID, axis, controller::ChannelType::AXIS); +} + +controller::Input TouchscreenVirtualPadDevice::InputDevice::makeInput(TouchscreenVirtualPadDevice::TouchButtonChannel button) const { + return controller::Input(_deviceID, button, controller::ChannelType::BUTTON); +} + controller::Input::NamedVector TouchscreenVirtualPadDevice::InputDevice::getAvailableInputs() const { using namespace controller; QVector availableInputs{ - makePair(LX, "LX"), - makePair(LY, "LY"), - makePair(RX, "RX"), - makePair(RY, "RY") + Input::NamedPair(makeInput(TouchAxisChannel::LX), "LX"), + 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") }; return availableInputs; } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 3540c6d909..010feaf1bb 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -41,6 +41,17 @@ public: static const char* NAME; + enum TouchAxisChannel { + LX, + LY, + RX, + RY + }; + + enum TouchButtonChannel { + JUMP_BUTTON_PRESS = LY + 1, + }; + protected: class InputDevice : public controller::InputDevice { @@ -54,6 +65,9 @@ protected: virtual void focusOutEvent() override; friend class TouchscreenVirtualPadDevice; + + controller::Input makeInput(TouchAxisChannel axis) const; + controller::Input makeInput(TouchButtonChannel button) const; }; public: @@ -63,7 +77,8 @@ protected: enum TouchType { MOVE = 1, - VIEW + VIEW, + JUMP }; float _lastPinchScale; @@ -82,6 +97,9 @@ protected: glm::vec2 _viewCurrentTouchPoint; int _viewCurrentTouchId; + bool _jumpHasValidTouch; + int _jumpCurrentTouchId; + std::map _unusedTouches; int _touchPointCount; @@ -94,6 +112,9 @@ protected: float _fixedRadiusForCalc; int _extraBottomMargin {0}; + glm::vec2 _jumpButtonPosition; + float _jumpButtonRadius; + float _viewStickRadiusInches {0.1333f}; // agreed default void moveTouchBegin(glm::vec2 touchPoint); @@ -106,7 +127,13 @@ 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 setupFixedCenter(VirtualPad::Manager& virtualPadManager, bool force = false); + void setupJumpButton(VirtualPad::Manager& virtualPadManager); void processInputDeviceForMove(VirtualPad::Manager& virtualPadManager); glm::vec2 clippedPointInCircle(float radius, glm::vec2 origin, glm::vec2 touchPoint); diff --git a/libraries/ui/src/VirtualPadManager.cpp b/libraries/ui/src/VirtualPadManager.cpp index cb3ef20e67..d62a3b076c 100644 --- a/libraries/ui/src/VirtualPadManager.cpp +++ b/libraries/ui/src/VirtualPadManager.cpp @@ -35,9 +35,12 @@ namespace VirtualPad { } const float Manager::DPI = 534.0f; - const float Manager::PIXEL_SIZE = 512.0f; - const float Manager::STICK_RADIUS = 105.0f; - const float Manager::BASE_MARGIN = 59.0f; + 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_TOP_MARGIN_PIXELS = 59.0f; + const float Manager::JUMP_BTN_TRIMMED_RADIUS_PIXELS = 105.0f; + const float Manager::JUMP_BTN_FULL_PIXELS = 512.0f; Manager::Manager() { @@ -72,6 +75,14 @@ namespace VirtualPad { _extraBottomMargin = margin; } + glm::vec2 Manager::getJumpButtonPosition() { + return _jumpButtonPosition; + } + + void Manager::setJumpButtonPosition(glm::vec2 point) { + _jumpButtonPosition = point; + } + Instance* Manager::getLeftVirtualPad() { return &_leftVPadInstance; } diff --git a/libraries/ui/src/VirtualPadManager.h b/libraries/ui/src/VirtualPadManager.h index 6b68af3acd..b613f6b42e 100644 --- a/libraries/ui/src/VirtualPadManager.h +++ b/libraries/ui/src/VirtualPadManager.h @@ -44,16 +44,22 @@ namespace VirtualPad { void hide(bool hide); int extraBottomMargin(); void setExtraBottomMargin(int margin); + glm::vec2 getJumpButtonPosition(); + void setJumpButtonPosition(glm::vec2 point); static const float DPI; - static const float PIXEL_SIZE; - static const float STICK_RADIUS; - static const float BASE_MARGIN; + static const float BASE_DIAMETER_PIXELS; + static const float BASE_MARGIN_PIXELS; + static const float STICK_RADIUS_PIXELS; + static const float JUMP_BTN_TOP_MARGIN_PIXELS; + static const float JUMP_BTN_TRIMMED_RADIUS_PIXELS; + static const float JUMP_BTN_FULL_PIXELS; private: Instance _leftVPadInstance; bool _enabled; bool _hidden; + glm::vec2 _jumpButtonPosition; int _extraBottomMargin {0}; }; } From ffb8b0a60efaf90dd1fd2090c1a80d9812b2df2f Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 4 Apr 2018 18:19:01 -0300 Subject: [PATCH 02/15] Android fly - Use new asset and screen position --- interface/resources/images/fly.png | Bin 0 -> 11088 bytes .../Basic2DWindowOpenGLDisplayPlugin.cpp | 3 ++- .../input-plugins/TouchscreenVirtualPadDevice.h | 3 +-- libraries/ui/src/VirtualPadManager.cpp | 7 ++++--- libraries/ui/src/VirtualPadManager.h | 3 ++- 5 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 interface/resources/images/fly.png diff --git a/interface/resources/images/fly.png b/interface/resources/images/fly.png new file mode 100644 index 0000000000000000000000000000000000000000..0edfcab21bbe3f78c684a004a00d5c7ce7c5a3fe GIT binary patch literal 11088 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 literal 0 HcmV?d00001 diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp index 577330a724..f33af1b580 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp @@ -71,13 +71,14 @@ void Basic2DWindowOpenGLDisplayPlugin::customizeContext() { } _virtualPadJumpBtnPixelSize = dpi * VirtualPad::Manager::JUMP_BTN_FULL_PIXELS / VirtualPad::Manager::DPI; - iconPath = PathUtils::resourcesPath() + "images/analog_stick.png"; + iconPath = PathUtils::resourcesPath() + "images/fly.png"; 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), diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 010feaf1bb..1e63d61db3 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -132,8 +132,7 @@ protected: void jumpTouchEnd(); bool jumpTouchBeginIsValid(glm::vec2 touchPoint); - void setupFixedCenter(VirtualPad::Manager& virtualPadManager, bool force = false); - void setupJumpButton(VirtualPad::Manager& virtualPadManager); + void setupControlsPositions(VirtualPad::Manager& virtualPadManager, bool force = false); void processInputDeviceForMove(VirtualPad::Manager& virtualPadManager); glm::vec2 clippedPointInCircle(float radius, glm::vec2 origin, glm::vec2 touchPoint); diff --git a/libraries/ui/src/VirtualPadManager.cpp b/libraries/ui/src/VirtualPadManager.cpp index d62a3b076c..c786110bdf 100644 --- a/libraries/ui/src/VirtualPadManager.cpp +++ b/libraries/ui/src/VirtualPadManager.cpp @@ -38,9 +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_TOP_MARGIN_PIXELS = 59.0f; - const float Manager::JUMP_BTN_TRIMMED_RADIUS_PIXELS = 105.0f; - const float Manager::JUMP_BTN_FULL_PIXELS = 512.0f; + const float Manager::JUMP_BTN_TRIMMED_RADIUS_PIXELS = 67.0f; + const float Manager::JUMP_BTN_FULL_PIXELS = 134.0f; + const float Manager::JUMP_BTN_BOTTOM_MARGIN_PIXELS = 67.0f; + const float Manager::JUMP_BTN_LEFT_MARGIN_PIXELS = 547.0f; Manager::Manager() { diff --git a/libraries/ui/src/VirtualPadManager.h b/libraries/ui/src/VirtualPadManager.h index b613f6b42e..68b3d4f10f 100644 --- a/libraries/ui/src/VirtualPadManager.h +++ b/libraries/ui/src/VirtualPadManager.h @@ -51,9 +51,10 @@ 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_TOP_MARGIN_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_LEFT_MARGIN_PIXELS; private: Instance _leftVPadInstance; From b61a436a844b8370331f73165b3fd0b66d8a5b27 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 4 Apr 2018 18:23:03 -0300 Subject: [PATCH 03/15] Android fly - Use new asset and screen position - missing cpp --- .../TouchscreenVirtualPadDevice.cpp | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 8b922434da..d5df7a7e25 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -57,8 +57,7 @@ void TouchscreenVirtualPadDevice::init() { } auto& virtualPadManager = VirtualPad::Manager::instance(); - setupFixedCenter(virtualPadManager, true); - setupJumpButton(virtualPadManager); + setupControlsPositions(virtualPadManager, true); if (_fixedPosition) { virtualPadManager.getLeftVirtualPad()->setShown(virtualPadManager.isEnabled() && !virtualPadManager.isHidden()); // Show whenever it's enabled @@ -67,24 +66,22 @@ void TouchscreenVirtualPadDevice::init() { KeyboardMouseDevice::enableTouch(false); // Touch for view controls is managed by this plugin } -void TouchscreenVirtualPadDevice::setupFixedCenter(VirtualPad::Manager& virtualPadManager, bool force) { - if (!_fixedPosition) return; - +void TouchscreenVirtualPadDevice::setupControlsPositions(VirtualPad::Manager& virtualPadManager, bool force) { if (_extraBottomMargin == virtualPadManager.extraBottomMargin() && !force) return; // Our only criteria to decide a center change is the bottom margin - _extraBottomMargin = virtualPadManager.extraBottomMargin(); - float margin = _screenDPI * VirtualPad::Manager::BASE_MARGIN_PIXELS / VirtualPad::Manager::DPI; QScreen* eventScreen = qApp->primaryScreen(); // do not call every time - _fixedCenterPosition = glm::vec2( _fixedRadius + margin, eventScreen->size().height() - margin - _fixedRadius - _extraBottomMargin); + _extraBottomMargin = virtualPadManager.extraBottomMargin(); + // Movement stick + float margin = _screenDPI * VirtualPad::Manager::BASE_MARGIN_PIXELS / VirtualPad::Manager::DPI; + _fixedCenterPosition = glm::vec2( _fixedRadius + margin, eventScreen->size().height() - margin - _fixedRadius - _extraBottomMargin); _moveRefTouchPoint = _fixedCenterPosition; virtualPadManager.getLeftVirtualPad()->setFirstTouch(_moveRefTouchPoint); -} -void TouchscreenVirtualPadDevice::setupJumpButton(VirtualPad::Manager& virtualPadManager) { - QScreen* screen = qApp->primaryScreen(); - float topMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_TOP_MARGIN_PIXELS / VirtualPad::Manager::DPI; - _jumpButtonPosition = glm::vec2( screen->size().width() / 2 + _jumpButtonRadius/2, topMargin + _jumpButtonRadius); + // Jump button + float leftMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_LEFT_MARGIN_PIXELS / VirtualPad::Manager::DPI; + float bottomMargin = _screenDPI * VirtualPad::Manager::JUMP_BTN_BOTTOM_MARGIN_PIXELS/ VirtualPad::Manager::DPI; + _jumpButtonPosition = glm::vec2( _jumpButtonRadius + leftMargin, eventScreen->size().height() - bottomMargin - _jumpButtonRadius - _extraBottomMargin); virtualPadManager.setJumpButtonPosition(_jumpButtonPosition); } @@ -165,7 +162,7 @@ void TouchscreenVirtualPadDevice::pluginUpdate(float deltaTime, const controller }); auto& virtualPadManager = VirtualPad::Manager::instance(); - setupFixedCenter(virtualPadManager); + setupControlsPositions(virtualPadManager); if (_moveHasValidTouch) { processInputDeviceForMove(virtualPadManager); From 1a967e45a6d9615871fb9c53028cddefbdf4e706 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Wed, 4 Apr 2018 21:54:12 -0300 Subject: [PATCH 04/15] Android View control - Remove limit, use a scale filter, remove deadZone to increase sensitivity --- .../controllers/touchscreenvirtualpad.json | 19 +++++++++++++++++-- .../TouchscreenVirtualPadDevice.cpp | 18 ++---------------- .../TouchscreenVirtualPadDevice.h | 2 -- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/interface/resources/controllers/touchscreenvirtualpad.json b/interface/resources/controllers/touchscreenvirtualpad.json index cdea8681cb..e0c91d714b 100644 --- a/interface/resources/controllers/touchscreenvirtualpad.json +++ b/interface/resources/controllers/touchscreenvirtualpad.json @@ -7,8 +7,23 @@ { "from": "TouchscreenVirtualPad.JUMP_BUTTON_PRESS", "when": "!Application.CameraIndependent", "to": "Actions.VERTICAL_UP" }, - { "from": "TouchscreenVirtualPad.RX", "when": "!Application.CameraIndependent", "filters": [ {"type": "deadZone", "min": 0.05} , "invert" ], "to": "Actions.Yaw" }, + { "from": "TouchscreenVirtualPad.RX", "when": "!Application.CameraIndependent", + "filters": [ + { "type": "deadZone", "min": 0.000 }, + { "type": "scale", "scale": 0.014175 }, + "invert" + ], + "to": "Actions.Yaw" + }, + + { "from": "TouchscreenVirtualPad.RY", "when": "!Application.CameraIndependent", + "filters": [ + { "type": "deadZone", "min": 0.000 }, + { "type": "scale", "scale": 0.014175 }, + "invert" + ], + "to": "Actions.Pitch" + } - { "from": "TouchscreenVirtualPad.RY", "when": "!Application.CameraIndependent", "filters": [ {"type": "deadZone", "min": 0.05}, "invert" ], "to": "Actions.Pitch" } ] } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index d5df7a7e25..ed626e8700 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -137,20 +137,8 @@ void TouchscreenVirtualPadDevice::processInputDeviceForMove(VirtualPad::Manager& } void TouchscreenVirtualPadDevice::processInputDeviceForView() { - float rightDistanceScaleX, rightDistanceScaleY; - rightDistanceScaleX = (_viewCurrentTouchPoint.x - _viewRefTouchPoint.x) / _screenDPIScale.x; - rightDistanceScaleY = (_viewCurrentTouchPoint.y - _viewRefTouchPoint.y) / _screenDPIScale.y; - - rightDistanceScaleX = clip(rightDistanceScaleX, -_viewStickRadiusInches, _viewStickRadiusInches); - rightDistanceScaleY = clip(rightDistanceScaleY, -_viewStickRadiusInches, _viewStickRadiusInches); - - // NOW BETWEEN -1 1 - rightDistanceScaleX /= _viewStickRadiusInches; - rightDistanceScaleY /= _viewStickRadiusInches; - - _inputDevice->_axisStateMap[controller::RX] = rightDistanceScaleX; - _inputDevice->_axisStateMap[controller::RY] = rightDistanceScaleY; - + _inputDevice->_axisStateMap[controller::RX] = _viewCurrentTouchPoint.x - _viewRefTouchPoint.x; + _inputDevice->_axisStateMap[controller::RY] = _viewCurrentTouchPoint.y - _viewRefTouchPoint.y; // after use, save last touch point as ref _viewRefTouchPoint = _viewCurrentTouchPoint; } @@ -396,7 +384,6 @@ void TouchscreenVirtualPadDevice::jumpTouchBegin(glm::vec2 touchPoint) { auto input = _inputDevice->makeInput(TouchButtonChannel::JUMP_BUTTON_PRESS); _inputDevice->_buttonPressedMap.insert(input.getChannel()); - qDebug() << "[TVPD] TouchscreenVirtualPadDevice::jumpTouchBegin buttonsMapSize " << _inputDevice->_buttonPressedMap.size(); } } @@ -408,7 +395,6 @@ void TouchscreenVirtualPadDevice::jumpTouchEnd() { auto input = _inputDevice->makeInput(TouchButtonChannel::JUMP_BUTTON_PRESS); _inputDevice->_buttonPressedMap.erase(input.getChannel()); - qDebug() << "[TVPD] TouchscreenVirtualPadDevice::jumpTouchEnd buttonsMapSize " << _inputDevice->_buttonPressedMap.size(); } } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 1e63d61db3..78fada0a24 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -115,8 +115,6 @@ protected: glm::vec2 _jumpButtonPosition; float _jumpButtonRadius; - float _viewStickRadiusInches {0.1333f}; // agreed default - void moveTouchBegin(glm::vec2 touchPoint); void moveTouchUpdate(glm::vec2 touchPoint); void moveTouchEnd(); From 55a3dc3a497f0026204c0aec5ca7ca6220800de5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 5 Apr 2018 10:48:26 -0700 Subject: [PATCH 05/15] make client/server only installers have special naming --- cmake/macros/GenerateInstallers.cmake | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/cmake/macros/GenerateInstallers.cmake b/cmake/macros/GenerateInstallers.cmake index 742c5b5b94..af44eab1c9 100644 --- a/cmake/macros/GenerateInstallers.cmake +++ b/cmake/macros/GenerateInstallers.cmake @@ -14,12 +14,21 @@ macro(GENERATE_INSTALLERS) set(CPACK_MODULE_PATH ${CPACK_MODULE_PATH} "${HF_CMAKE_DIR}/templates") - set(_DISPLAY_NAME ${BUILD_ORGANIZATION}) + + if (CLIENT_ONLY) + set(_PACKAGE_NAME_EXTRA "-Interface") + string(REGEX REPLACE "High Fidelity" "High Fidelity Interface" _DISPLAY_NAME ${BUILD_ORGANIZATION}) + elseif (SERVER_ONLY) + set(_PACKAGE_NAME_EXTRA "-Sandbox") + string(REGEX REPLACE "High Fidelity" "High Fidelity Sandbox" _DISPLAY_NAME ${BUILD_ORGANIZATION}) + else () + set(_DISPLAY_NAME ${BUILD_ORGANIZATION}) + endif () set(CPACK_PACKAGE_NAME ${_DISPLAY_NAME}) set(CPACK_PACKAGE_VENDOR "High Fidelity") set(CPACK_PACKAGE_VERSION ${BUILD_VERSION}) - set(CPACK_PACKAGE_FILE_NAME "HighFidelity-Beta-${BUILD_VERSION}") + set(CPACK_PACKAGE_FILE_NAME "HighFidelity-Beta${_PACKAGE_NAME_EXTRA}-${BUILD_VERSION}") set(CPACK_NSIS_DISPLAY_NAME ${_DISPLAY_NAME}) set(CPACK_NSIS_PACKAGE_NAME ${_DISPLAY_NAME}) if (PR_BUILD) From 557b7ded668f56f641f68019620d80ee13d5fa78 Mon Sep 17 00:00:00 2001 From: Alexander Ivash Date: Fri, 6 Apr 2018 02:51:22 +0300 Subject: [PATCH 06/15] fix for closed query dialogs auto-reopening (FB13962 Import Entity URL Dialogue Box Will not Disappear) Signed-off-by: Alexander Ivash --- interface/resources/qml/dialogs/CustomQueryDialog.qml | 4 ++++ interface/resources/qml/dialogs/QueryDialog.qml | 4 ++++ interface/resources/qml/windows/Fadable.qml | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/dialogs/CustomQueryDialog.qml b/interface/resources/qml/dialogs/CustomQueryDialog.qml index 6e1bb4b309..6ce4722d04 100644 --- a/interface/resources/qml/dialogs/CustomQueryDialog.qml +++ b/interface/resources/qml/dialogs/CustomQueryDialog.qml @@ -272,6 +272,8 @@ ModalWindow { root.canceled(); // FIXME we are leaking memory to avoid a crash // root.destroy(); + + root.disableFade = true visible = false; } } @@ -296,6 +298,8 @@ ModalWindow { root.selected(root.result); // FIXME we are leaking memory to avoid a crash // root.destroy(); + + root.disableFade = true visible = false; } } diff --git a/interface/resources/qml/dialogs/QueryDialog.qml b/interface/resources/qml/dialogs/QueryDialog.qml index 6f05179bd5..ec62f16087 100644 --- a/interface/resources/qml/dialogs/QueryDialog.qml +++ b/interface/resources/qml/dialogs/QueryDialog.qml @@ -171,6 +171,8 @@ ModalWindow { root.canceled(); // FIXME we are leaking memory to avoid a crash // root.destroy(); + + root.disableFade = true visible = false; } } @@ -183,6 +185,8 @@ ModalWindow { root.selected(root.result); // FIXME we are leaking memory to avoid a crash // root.destroy(); + + root.disableFade = true visible = false; } } diff --git a/interface/resources/qml/windows/Fadable.qml b/interface/resources/qml/windows/Fadable.qml index 4d506755f2..52d2264e7d 100644 --- a/interface/resources/qml/windows/Fadable.qml +++ b/interface/resources/qml/windows/Fadable.qml @@ -39,7 +39,7 @@ FocusScope { // If someone directly set the visibility to false // toggle it back on and use the targetVisible flag to transition // via fading. - if ((!visible && fadeTargetProperty != 0.0) || (visible && fadeTargetProperty == 0.0)) { + if (!disableFade && ((!visible && fadeTargetProperty != 0.0) || (visible && fadeTargetProperty == 0.0))) { var target = visible; visible = !visible; fadeTargetProperty = target ? 1.0 : 0.0; From 16335a3b4ba2b3b1db046e849577293bbcdaceff Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 5 Apr 2018 16:40:52 -0700 Subject: [PATCH 07/15] only remove selected components on clean install, leave wallet --- cmake/templates/NSIS.template.in | 36 +++++++++++++++++++------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in index 7faa67d1b0..5a76b6a179 100644 --- a/cmake/templates/NSIS.template.in +++ b/cmake/templates/NSIS.template.in @@ -710,11 +710,9 @@ Function PostInstallOptionsPage !insertmacro SetInstallOption $ServerStartupCheckbox @CONSOLE_STARTUP_REG_KEY@ ${BST_CHECKED} ${EndIf} - ${If} @SERVER_COMPONENT_CONDITIONAL@ - ${NSD_CreateCheckbox} 0 $CurrentOffset$OffsetUnits 100% 10u "&Perform a clean install (Delete older settings and content)" - Pop $CleanInstallCheckbox - IntOp $CurrentOffset $CurrentOffset + 15 - ${EndIf} + ${NSD_CreateCheckbox} 0 $CurrentOffset$OffsetUnits 100% 10u "&Perform a clean install (Delete older settings and content)" + Pop $CleanInstallCheckbox + IntOp $CurrentOffset $CurrentOffset + 15 ${If} @PR_BUILD@ == 1 ; a PR build defaults all install options expect LaunchServerNowCheckbox, LaunchClientNowCheckbox and the settings copy to unchecked @@ -809,10 +807,8 @@ Function ReadPostInstallOptions ${NSD_GetState} $LaunchClientNowCheckbox $LaunchClientNowState ${EndIf} - ${If} @CLIENT_COMPONENT_CONDITIONAL@ - ; check if the user asked for a clean install - ${NSD_GetState} $CleanInstallCheckbox $CleanInstallState - ${EndIf} + ; check if the user asked for a clean install + ${NSD_GetState} $CleanInstallCheckbox $CleanInstallState FunctionEnd Function HandlePostInstallOptions @@ -856,13 +852,23 @@ Function HandlePostInstallOptions ${EndIf} ${EndIf} - ${If} @CLIENT_COMPONENT_CONDITIONAL@ - ; check if the user asked for a clean install - ${If} $CleanInstallState == ${BST_CHECKED} - SetShellVarContext current - RMDir /r "$APPDATA\@BUILD_ORGANIZATION@" - RMDir /r "$LOCALAPPDATA\@BUILD_ORGANIZATION@" + ; check if the user asked for a clean install + ${If} $CleanInstallState == ${BST_CHECKED} + SetShellVarContext current + + ${If} @SERVER_COMPONENT_CONDITIONAL@ + RMDir /r "$APPDATA\@BUILD_ORGANIZATION@\Server Console" + RMDir /r "$APPDATA\@BUILD_ORGANIZATION@\assignment-client" + RMDir /r "$APPDATA\@BUILD_ORGANIZATION@\domain-server" + Delete "$APPDATA\@BUILD_ORGANIZATION@\domain-server.json" ${EndIf} + + ${If} @CLIENT_COMPONENT_CONDITIONAL@ + Delete "$APPDATA\@BUILD_ORGANIZATION@\Interface\AccountInfo.bin" + Delete "$APPDATA\@BUILD_ORGANIZATION@\Interface.json" + ${EndIf} + + RMDir /r "$LOCALAPPDATA\@BUILD_ORGANIZATION@" ${EndIf} ${If} @PR_BUILD@ == 1 From a2250a2a6d1b42d29afe599e37aea8c11e77d484 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 5 Apr 2018 18:37:09 -0700 Subject: [PATCH 08/15] write an install info ini file to the installation dir --- cmake/macros/GenerateInstallers.cmake | 3 +++ cmake/templates/CPackProperties.cmake.in | 1 + cmake/templates/NSIS.template.in | 7 +++++++ 3 files changed, 11 insertions(+) diff --git a/cmake/macros/GenerateInstallers.cmake b/cmake/macros/GenerateInstallers.cmake index af44eab1c9..acafd9b6c7 100644 --- a/cmake/macros/GenerateInstallers.cmake +++ b/cmake/macros/GenerateInstallers.cmake @@ -17,12 +17,15 @@ macro(GENERATE_INSTALLERS) if (CLIENT_ONLY) set(_PACKAGE_NAME_EXTRA "-Interface") + set(INSTALLER_TYPE "client_only") string(REGEX REPLACE "High Fidelity" "High Fidelity Interface" _DISPLAY_NAME ${BUILD_ORGANIZATION}) elseif (SERVER_ONLY) set(_PACKAGE_NAME_EXTRA "-Sandbox") + set(INSTALLER_TYPE "server_only") string(REGEX REPLACE "High Fidelity" "High Fidelity Sandbox" _DISPLAY_NAME ${BUILD_ORGANIZATION}) else () set(_DISPLAY_NAME ${BUILD_ORGANIZATION}) + set(INSTALLER_TYPE "full") endif () set(CPACK_PACKAGE_NAME ${_DISPLAY_NAME}) diff --git a/cmake/templates/CPackProperties.cmake.in b/cmake/templates/CPackProperties.cmake.in index 9c303f7532..80d86ac030 100644 --- a/cmake/templates/CPackProperties.cmake.in +++ b/cmake/templates/CPackProperties.cmake.in @@ -48,3 +48,4 @@ set(UNINSTALLER_HEADER_IMAGE "@UNINSTALLER_HEADER_IMAGE@") set(ADD_REMOVE_ICON_PATH "@ADD_REMOVE_ICON_PATH@") set(SERVER_COMPONENT_CONDITIONAL "@SERVER_COMPONENT_CONDITIONAL@") set(CLIENT_COMPONENT_CONDITIONAL "@CLIENT_COMPONENT_CONDITIONAL@") +set(INSTALLER_TYPE "@INSTALLER_TYPE@") diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in index 5a76b6a179..bdedf4cbba 100644 --- a/cmake/templates/NSIS.template.in +++ b/cmake/templates/NSIS.template.in @@ -982,6 +982,13 @@ Section "-Core installation" ;Store installation folder WriteRegStr HKLM "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR + ;Write some information about this install to the installation folder + FileOpen $0 "$INSTDIR\installer.ini" w + FileWrite $0 "type=@INSTALLER_TYPE@$\r$\n" + FileWrite $0 "campaign=$CampaignName$\r$\n" + FileWrite $0 "exepath=$EXEPATH$\r$\n" + FileClose $0 + ;Package the signed uninstaller produced by the inner loop !ifndef INNER ; this packages the signed uninstaller From d38dadaf58e193a53cb002b4960e922e92123b3b Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 6 Apr 2018 09:34:00 -0700 Subject: [PATCH 09/15] possible fix for qml texture leak --- .../src/RenderableEntityItem.cpp | 4 +--- .../src/RenderableWebEntityItem.cpp | 24 ++++++++++++++----- libraries/qml/src/qml/impl/SharedObject.cpp | 14 ++++++----- libraries/qml/src/qml/impl/TextureCache.cpp | 22 +++++++---------- libraries/qml/src/qml/impl/TextureCache.h | 1 - 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index c33b87e5cf..b61f24972a 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -135,10 +135,8 @@ void EntityRenderer::makeStatusGetters(const EntityItemPointer& entity, Item::St template std::shared_ptr make_renderer(const EntityItemPointer& entity) { - T* rawResult = new T(entity); - // We want to use deleteLater so that renderer destruction gets pushed to the main thread - return std::shared_ptr(rawResult, std::bind(&QObject::deleteLater, rawResult)); + return std::shared_ptr(new T(entity), [](T* ptr) { ptr->deleteLater(); }); } EntityRenderer::EntityRenderer(const EntityItemPointer& entity) : _entity(entity) { diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index bd00ded12d..f31ed4e238 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -34,7 +34,7 @@ static const QString WEB_ENTITY_QML = "controls/WebEntityView.qml"; const float METERS_TO_INCHES = 39.3701f; static uint32_t _currentWebCount{ 0 }; -// Don't allow more than 100 concurrent web views +// Don't allow more than 20 concurrent web views static const uint32_t MAX_CONCURRENT_WEB_VIEWS = 20; // If a web-view hasn't been rendered for 30 seconds, de-allocate the framebuffer static uint64_t MAX_NO_RENDER_INTERVAL = 30 * USECS_PER_SECOND; @@ -88,8 +88,14 @@ bool WebEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointe return true; } - if (uvec2(getWindowSize(entity)) != toGlm(_webSurface->size())) { - return true; + { + QSharedPointer webSurface; + withReadLock([&] { + webSurface = _webSurface; + }); + if (webSurface && uvec2(getWindowSize(entity)) != toGlm(webSurface->size())) { + return true; + } } if (_lastSourceUrl != entity->getSourceUrl()) { @@ -108,9 +114,15 @@ bool WebEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityPointe } bool WebEntityRenderer::needsRenderUpdate() const { - if (!_webSurface) { - // If we have rendered recently, and there is no web surface, we're going to create one - return true; + { + QSharedPointer webSurface; + withReadLock([&] { + webSurface = _webSurface; + }); + if (!webSurface) { + // If we have rendered recently, and there is no web surface, we're going to create one + return true; + } } return Parent::needsRenderUpdate(); diff --git a/libraries/qml/src/qml/impl/SharedObject.cpp b/libraries/qml/src/qml/impl/SharedObject.cpp index d66f0f1dab..d593169d94 100644 --- a/libraries/qml/src/qml/impl/SharedObject.cpp +++ b/libraries/qml/src/qml/impl/SharedObject.cpp @@ -37,9 +37,8 @@ static const int MIN_TIMER_MS = 5; using namespace hifi::qml; using namespace hifi::qml::impl; -TextureCache offscreenTextures; - TextureCache& SharedObject::getTextureCache() { + static TextureCache offscreenTextures; return offscreenTextures; } @@ -243,7 +242,7 @@ void SharedObject::releaseTextureAndFence() { QMutexLocker lock(&_mutex); // If the most recent texture was unused, we can directly recycle it if (_latestTextureAndFence.first) { - offscreenTextures.releaseTexture(_latestTextureAndFence); + getTextureCache().releaseTexture(_latestTextureAndFence); _latestTextureAndFence = TextureAndFence{ 0, 0 }; } } @@ -307,7 +306,10 @@ bool SharedObject::preRender() { void SharedObject::shutdownRendering(OffscreenGLCanvas& canvas, const QSize& size) { QMutexLocker locker(&_mutex); if (size != QSize(0, 0)) { - offscreenTextures.releaseSize(size); + getTextureCache().releaseSize(size); + if (_latestTextureAndFence.first) { + getTextureCache().releaseTexture(_latestTextureAndFence); + } } _renderControl->invalidate(); canvas.doneCurrent(); @@ -403,7 +405,7 @@ void SharedObject::onRender() { } void SharedObject::onTimer() { - offscreenTextures.report(); + getTextureCache().report(); if (!_renderRequested) { return; } @@ -436,7 +438,7 @@ void SharedObject::updateTextureAndFence(const TextureAndFence& newTextureAndFen QMutexLocker locker(&_mutex); // If the most recent texture was unused, we can directly recycle it if (_latestTextureAndFence.first) { - offscreenTextures.releaseTexture(_latestTextureAndFence); + getTextureCache().releaseTexture(_latestTextureAndFence); _latestTextureAndFence = { 0, 0 }; } diff --git a/libraries/qml/src/qml/impl/TextureCache.cpp b/libraries/qml/src/qml/impl/TextureCache.cpp index c649a36594..7af8fa1ac9 100644 --- a/libraries/qml/src/qml/impl/TextureCache.cpp +++ b/libraries/qml/src/qml/impl/TextureCache.cpp @@ -11,10 +11,6 @@ using namespace hifi::qml::impl; -#if defined(Q_OS_ANDROID) -#define USE_GLES 1 -#endif - uint64_t uvec2ToUint64(const QSize& size) { uint64_t result = size.width(); result <<= 32; @@ -31,26 +27,23 @@ void TextureCache::acquireSize(const QSize& size) { void TextureCache::releaseSize(const QSize& size) { auto sizeKey = uvec2ToUint64(size); - ValueList texturesToDelete; { Lock lock(_mutex); assert(_textures.count(sizeKey)); auto& textureSet = _textures[sizeKey]; if (0 == --textureSet.clientCount) { - texturesToDelete.swap(textureSet.returnedTextures); + for (const auto& textureAndFence : textureSet.returnedTextures) { + destroy(textureAndFence); + } _textures.erase(sizeKey); } } - for (const auto& textureAndFence : texturesToDelete) { - destroy(textureAndFence); - } } uint32_t TextureCache::acquireTexture(const QSize& size) { Lock lock(_mutex); recycle(); - ++_activeTextureCount; auto sizeKey = uvec2ToUint64(size); assert(_textures.count(sizeKey)); @@ -83,7 +76,12 @@ void TextureCache::report() { } size_t TextureCache::getUsedTextureMemory() { - return _totalTextureUsage; + size_t toReturn; + { + Lock lock(_mutex); + toReturn = _totalTextureUsage; + } + return toReturn; } size_t TextureCache::getMemoryForSize(const QSize& size) { @@ -122,8 +120,6 @@ uint32_t TextureCache::createTexture(const QSize& size) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 8.0f); #if !defined(USE_GLES) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -0.2f); #endif diff --git a/libraries/qml/src/qml/impl/TextureCache.h b/libraries/qml/src/qml/impl/TextureCache.h index 572e1cadea..c146d0bdbf 100644 --- a/libraries/qml/src/qml/impl/TextureCache.h +++ b/libraries/qml/src/qml/impl/TextureCache.h @@ -41,7 +41,6 @@ public: ValueList returnedTextures; }; - void releaseSize(const QSize& size); void acquireSize(const QSize& size); uint32_t acquireTexture(const QSize& size); From 1ff79397356306837776acbfeb462466705087dc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 6 Apr 2018 11:05:17 -0700 Subject: [PATCH 10/15] move file ~ expansion from AddressManager to DomainHandler --- libraries/networking/src/AddressManager.cpp | 4 +--- libraries/networking/src/DomainHandler.cpp | 11 +++++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index cfe05941c0..a23e6c98d7 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include "AddressManager.h" #include "NodeList.h" @@ -311,8 +310,7 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl, LookupTrigger trigger) { // lookupUrl.scheme() == URL_SCHEME_HTTPS || _previousLookup.clear(); _shareablePlaceName.clear(); - QUrl domainURL = PathUtils::expandToLocalDataAbsolutePath(lookupUrl); - setDomainInfo(domainURL, trigger); + setDomainInfo(lookupUrl, trigger); emit lookupResultsFinished(); handlePath(DOMAIN_SPAWNING_POINT, LookupTrigger::Internal, false); return true; diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 7a5ecb2602..c20d6d73be 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -9,8 +9,12 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include "DomainHandler.h" + #include +#include + #include #include @@ -25,8 +29,6 @@ #include "UserActivityLogger.h" #include "NetworkLogging.h" -#include "DomainHandler.h" - DomainHandler::DomainHandler(QObject* parent) : QObject(parent), _sockAddr(HifiSockAddr(QHostAddress::Null, DEFAULT_DOMAIN_SERVER_PORT)), @@ -157,6 +159,11 @@ void DomainHandler::setURLAndID(QUrl domainURL, QUuid domainID) { if (domainURL.scheme() != URL_SCHEME_HIFI) { _sockAddr.clear(); + + // if this is a file URL we need to see if it has a ~ for us to expand + if (domainURL.scheme() == URL_SCHEME_FILE) { + domainURL = PathUtils::expandToLocalDataAbsolutePath(domainURL); + } } if (_domainURL != domainURL || _sockAddr.getPort() != domainURL.port()) { From bd6f0fd59ee4f22d79c9b5b9ddb8714fa9357a0f Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Fri, 6 Apr 2018 16:17:28 -0300 Subject: [PATCH 11/15] Make view/rotation control independent of touchUpdate events rate --- .../resources/controllers/touchscreenvirtualpad.json | 4 ++-- .../input-plugins/TouchscreenVirtualPadDevice.cpp | 12 ++++++++++-- .../src/input-plugins/TouchscreenVirtualPadDevice.h | 1 + 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/interface/resources/controllers/touchscreenvirtualpad.json b/interface/resources/controllers/touchscreenvirtualpad.json index e0c91d714b..bae1172152 100644 --- a/interface/resources/controllers/touchscreenvirtualpad.json +++ b/interface/resources/controllers/touchscreenvirtualpad.json @@ -10,7 +10,7 @@ { "from": "TouchscreenVirtualPad.RX", "when": "!Application.CameraIndependent", "filters": [ { "type": "deadZone", "min": 0.000 }, - { "type": "scale", "scale": 0.014175 }, + { "type": "scale", "scale": 0.06 }, "invert" ], "to": "Actions.Yaw" @@ -19,7 +19,7 @@ { "from": "TouchscreenVirtualPad.RY", "when": "!Application.CameraIndependent", "filters": [ { "type": "deadZone", "min": 0.000 }, - { "type": "scale", "scale": 0.014175 }, + { "type": "scale", "scale": 0.06 }, "invert" ], "to": "Actions.Pitch" diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index ed626e8700..60565a53f0 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -41,6 +41,7 @@ bool TouchscreenVirtualPadDevice::isSupported() const { void TouchscreenVirtualPadDevice::init() { _fixedPosition = true; // This should be config + _viewTouchUpdateCount = 0; QScreen* eventScreen = qApp->primaryScreen(); if (_screenDPIProvided != eventScreen->physicalDotsPerInch()) { @@ -137,10 +138,15 @@ void TouchscreenVirtualPadDevice::processInputDeviceForMove(VirtualPad::Manager& } void TouchscreenVirtualPadDevice::processInputDeviceForView() { - _inputDevice->_axisStateMap[controller::RX] = _viewCurrentTouchPoint.x - _viewRefTouchPoint.x; - _inputDevice->_axisStateMap[controller::RY] = _viewCurrentTouchPoint.y - _viewRefTouchPoint.y; + // We use average across how many times we've got touchUpdate events. + // Using the average instead of the full deltaX and deltaY, makes deltaTime in MyAvatar dont't accelerate rotation when there is a low touchUpdate rate (heavier domains). + // (Because it multiplies this input value by deltaTime (with a coefficient)). + _inputDevice->_axisStateMap[controller::RX] = _viewTouchUpdateCount==0?0:(_viewCurrentTouchPoint.x - _viewRefTouchPoint.x)/_viewTouchUpdateCount++; + _inputDevice->_axisStateMap[controller::RY] = _viewTouchUpdateCount==0?0:(_viewCurrentTouchPoint.y - _viewRefTouchPoint.y)/_viewTouchUpdateCount++; + // after use, save last touch point as ref _viewRefTouchPoint = _viewCurrentTouchPoint; + _viewTouchUpdateCount = 0; } void TouchscreenVirtualPadDevice::pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) { @@ -427,12 +433,14 @@ void TouchscreenVirtualPadDevice::viewTouchBegin(glm::vec2 touchPoint) { if (virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { _viewRefTouchPoint = touchPoint; _viewCurrentTouchPoint = touchPoint; + _viewTouchUpdateCount++; _viewHasValidTouch = true; } } void TouchscreenVirtualPadDevice::viewTouchUpdate(glm::vec2 touchPoint) { _viewCurrentTouchPoint = touchPoint; + _viewTouchUpdateCount++; } void TouchscreenVirtualPadDevice::viewTouchEnd() { diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 78fada0a24..9b9779fee5 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -41,6 +41,7 @@ public: static const char* NAME; + int _viewTouchUpdateCount; enum TouchAxisChannel { LX, LY, From dea5382991e71b75defe29e7afec88736a91433d Mon Sep 17 00:00:00 2001 From: Clement Date: Fri, 6 Apr 2018 10:59:33 -0700 Subject: [PATCH 12/15] Fix location.hostname --- libraries/networking/src/AddressManager.cpp | 8 -------- libraries/networking/src/AddressManager.h | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index cfe05941c0..b4151025a9 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -770,14 +770,6 @@ bool AddressManager::setHost(const QString& host, LookupTrigger trigger, quint16 return false; } -QString AddressManager::getHost() const { - if (isPossiblePlaceName(_domainURL.host())) { - return QString(); - } - - return _domainURL.host(); -} - bool AddressManager::setDomainInfo(const QUrl& domainURL, LookupTrigger trigger) { const QString hostname = domainURL.host(); quint16 port = domainURL.port(); diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index 4add1e9414..b42aec2771 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -160,7 +160,7 @@ public: QString getPlaceName() const; QString getDomainID() const; - QString getHost() const; + QString getHost() const { return _domainURL.host(); } void setPositionGetter(PositionGetter positionGetter) { _positionGetter = positionGetter; } void setOrientationGetter(OrientationGetter orientationGetter) { _orientationGetter = orientationGetter; } From 6e7f8a2ef69c31e3b9bc80a122ac0e021600a43a Mon Sep 17 00:00:00 2001 From: Clement Date: Fri, 6 Apr 2018 17:24:16 -0700 Subject: [PATCH 13/15] Fix value collision for baking version --- assignment-client/src/assets/AssetServer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 1eb43a45a5..23df64be2e 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -1486,16 +1486,16 @@ std::pair AssetServer::readMetaFile(AssetUtils::AssetHash hash) if (error.error == QJsonParseError::NoError && doc.isObject()) { auto root = doc.object(); - auto bakeVersion = root[BAKE_VERSION_KEY].toInt(-1); + auto bakeVersion = root[BAKE_VERSION_KEY]; auto failedLastBake = root[FAILED_LAST_BAKE_KEY]; auto lastBakeErrors = root[LAST_BAKE_ERRORS_KEY]; - if (bakeVersion != -1 + if (bakeVersion.isDouble() && failedLastBake.isBool() && lastBakeErrors.isString()) { AssetMeta meta; - meta.bakeVersion = bakeVersion; + meta.bakeVersion = bakeVersion.toInt(); meta.failedLastBake = failedLastBake.toBool(); meta.lastBakeErrors = lastBakeErrors.toString(); From faddc556d7fa0c277e5fede9ea70ae75d5149c07 Mon Sep 17 00:00:00 2001 From: Alexander Ivash Date: Sat, 7 Apr 2018 17:16:16 +0300 Subject: [PATCH 14/15] FB14015 - Go To app does not close when selecting forward and back arrows on desktop --- interface/resources/qml/hifi/tablet/TabletAddressDialog.qml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml b/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml index d4550d3843..b5f9b32662 100644 --- a/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml +++ b/interface/resources/qml/hifi/tablet/TabletAddressDialog.qml @@ -142,7 +142,10 @@ StackView { bottom: parent.bottom } - onHostChanged: updateLocationTextTimer.restart(); + onHostChanged: { + updateLocationTextTimer.restart(); + DialogsManager.hideAddressBar(); + } Rectangle { id: navBar From 1242446c5274d1b12498d8b27c1cc22a6100b350 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Mon, 9 Apr 2018 19:57:55 -0300 Subject: [PATCH 15/15] Cleanup controller code --- .../input-plugins/TouchscreenVirtualPadDevice.cpp | 14 ++++++-------- .../input-plugins/TouchscreenVirtualPadDevice.h | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 60565a53f0..957104bd30 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -141,8 +141,8 @@ void TouchscreenVirtualPadDevice::processInputDeviceForView() { // We use average across how many times we've got touchUpdate events. // Using the average instead of the full deltaX and deltaY, makes deltaTime in MyAvatar dont't accelerate rotation when there is a low touchUpdate rate (heavier domains). // (Because it multiplies this input value by deltaTime (with a coefficient)). - _inputDevice->_axisStateMap[controller::RX] = _viewTouchUpdateCount==0?0:(_viewCurrentTouchPoint.x - _viewRefTouchPoint.x)/_viewTouchUpdateCount++; - _inputDevice->_axisStateMap[controller::RY] = _viewTouchUpdateCount==0?0:(_viewCurrentTouchPoint.y - _viewRefTouchPoint.y)/_viewTouchUpdateCount++; + _inputDevice->_axisStateMap[controller::RX] = _viewTouchUpdateCount == 0 ? 0 : (_viewCurrentTouchPoint.x - _viewRefTouchPoint.x) / _viewTouchUpdateCount; + _inputDevice->_axisStateMap[controller::RY] = _viewTouchUpdateCount == 0 ? 0 : (_viewCurrentTouchPoint.y - _viewRefTouchPoint.y) / _viewTouchUpdateCount; // after use, save last touch point as ref _viewRefTouchPoint = _viewCurrentTouchPoint; @@ -371,7 +371,7 @@ bool TouchscreenVirtualPadDevice::viewTouchBeginIsValid(glm::vec2 touchPoint) { bool TouchscreenVirtualPadDevice::moveTouchBeginIsValid(glm::vec2 touchPoint) { if (_fixedPosition) { // inside circle - return pow(touchPoint.x - _fixedCenterPosition.x,2.0) + pow(touchPoint.y - _fixedCenterPosition.y, 2.0) < pow(_fixedRadius, 2.0); + return glm::distance2(touchPoint, _fixedCenterPosition) < _fixedRadius * _fixedRadius; } else { // left side return touchPoint.x < _screenWidthCenter; @@ -380,7 +380,7 @@ bool TouchscreenVirtualPadDevice::moveTouchBeginIsValid(glm::vec2 touchPoint) { bool TouchscreenVirtualPadDevice::jumpTouchBeginIsValid(glm::vec2 touchPoint) { // position of button and boundaries - return pow(touchPoint.x - _jumpButtonPosition.x, 2.0) + pow(touchPoint.y - _jumpButtonPosition.y, 2.0) < pow(_jumpButtonRadius, 2.0); + return glm::distance2(touchPoint, _jumpButtonPosition) < _jumpButtonRadius * _jumpButtonRadius; } void TouchscreenVirtualPadDevice::jumpTouchBegin(glm::vec2 touchPoint) { @@ -388,8 +388,7 @@ void TouchscreenVirtualPadDevice::jumpTouchBegin(glm::vec2 touchPoint) { if (virtualPadManager.isEnabled() && !virtualPadManager.isHidden()) { _jumpHasValidTouch = true; - auto input = _inputDevice->makeInput(TouchButtonChannel::JUMP_BUTTON_PRESS); - _inputDevice->_buttonPressedMap.insert(input.getChannel()); + _inputDevice->_buttonPressedMap.insert(TouchButtonChannel::JUMP_BUTTON_PRESS); } } @@ -399,8 +398,7 @@ void TouchscreenVirtualPadDevice::jumpTouchEnd() { if (_jumpHasValidTouch) { _jumpHasValidTouch = false; - auto input = _inputDevice->makeInput(TouchButtonChannel::JUMP_BUTTON_PRESS); - _inputDevice->_buttonPressedMap.erase(input.getChannel()); + _inputDevice->_buttonPressedMap.erase(TouchButtonChannel::JUMP_BUTTON_PRESS); } } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index 9b9779fee5..212b7633ec 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -50,7 +50,7 @@ public: }; enum TouchButtonChannel { - JUMP_BUTTON_PRESS = LY + 1, + JUMP_BUTTON_PRESS }; protected: