From 428f4b7b9d625f2af340fc10a38acbe8ce6dbe38 Mon Sep 17 00:00:00 2001 From: Cristian Luis Duarte Date: Tue, 27 Feb 2018 21:24:21 -0300 Subject: [PATCH] Android - Make the virtual pad (joystick) position fixed. Change assets. --- interface/resources/images/analog_stick.png | Bin 2713 -> 5098 bytes .../resources/images/analog_stick_base.png | Bin 2020 -> 11853 bytes .../Basic2DWindowOpenGLDisplayPlugin.cpp | 13 ++++- .../Basic2DWindowOpenGLDisplayPlugin.h | 1 + .../src/display-plugins/CompositorHelper.cpp | 5 +- .../src/display-plugins/CompositorHelper.h | 2 +- .../TouchscreenVirtualPadDevice.cpp | 52 +++++++++++++----- .../TouchscreenVirtualPadDevice.h | 6 ++ 8 files changed, 59 insertions(+), 20 deletions(-) diff --git a/interface/resources/images/analog_stick.png b/interface/resources/images/analog_stick.png index e9457c730798ae0a77d6b50c2de30494515b3c61..238c2c74f44532e9561d63dba428bcbaecbdfd9c 100644 GIT binary patch literal 5098 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 literal 2713 zcmb7GZBSI#8Gg>$ySsOn1@6knZt6Ph;z!gX(WXPT2@@6u1T-p2A~6uS8UbyVdW|;0 z#=zktIF3m$(KNBpiutn5hio(L4pRso(lXXIp_w$JYwgqv7^k+j1A%EYFxa_w*|3DB zNq+2{+2?)F^PcTx1aM5|)z>wEqHKJs`$-}~ zxiIlmZg@@0)7HT~7a8El z%F%i3RF6pP;k3JH*_2xCx(#w--@`hMUSY`W@mcE3cp=L>zm{OwRBq5%%pPB1FXbP{ z4@l+UI~vZT2keh2?JIh~cGFH$OSBz(MA+==wP)WgfivazSqFOO@ff7nD@(E=@8B1j z4ZW0i`QF*{k8hJ6sGpdtlLfR0?GJX{uws}j82DwUFhVujof4c@C1{6JOd;N35jKPR z=0dC#+3g#WrjnQ)KRRB2Ge>9V$!;hrX=C8oX1{^L>f$B~T$w0c1Vx4a zIq+;lU>$|o##dY5N<-;lZJ60hCVw)8*%EkAgv-raJQ~{3PW-n}-arC7MVO5|7)B2h zzl-ud1b!&OO!*ayrh|@V;y(^f5NOaVFRei7Qj8el?LF1m_DLQx8PzJYBUB;P-Jx>c(1O#eydy@W_caK`*fBQRDMW@jxIxRvkpB= z2ciZyx=fAio@@UX0)a z`T-zeYvwW%@<+0c4llFtM`NNK;Ku#~g8bV^{i0`1E<|a1lu=wB`>CC+b3~cQCpS)s zJQ&RZ2J!L>x$yVQHX7!u`<}qheIXSPeDrjZRUV5}o#RO_Hr2;l<%utif0dohv5x=a zDzid!&61^UNFnTB(G8g8qVn>o3Lv8*((f7feD3;NMJT;(cDnn;iZ~J&{es^$-dJqM z#pt$wG}xVrw%N#CQLl!*ow-`3!R=5 zfJg%g39RPxY1$sy-8^<#kPn5Y=~iUiuMcVil^>715~;5^k-eX!kLN20J)m!_w6dqe z(9aRttV6F_Sa!~9#dXJa|0Kn>Ll;57?ePLwXu z(ML>vCxuzmEn^X{(#=6Lk|YXqOkks^nM{TUuJ59)S$7{h<$Z=gwy4SJZfcB^9~Tgp z%HFrbdlqz9k>B6V)!l8qi)NpoJ>0 zS=0(LvUBBR3{gghjWAGew+Nd>eQ(~`5==f?w0|+u>v|x|s7@g41Zgi!y>4Z@%x6ld zPHqyF|44AA@?#IJ>7{C?`D`R$Re~dwo!7o*4%i&3ZP18L!VaYnCc%-_-d_TzSIHQm zC^zu_R=|VwIsqb4MvI#+5x%nV`0gIC^H4??!Y67Qk%O{H5fW90^1&qDA5U>=e%UIv zHbp?WQU9;8Nch$K@6SRzsrq3)SP3bcbc4Tv^d}^^P0H0Ku=S27-O6AS*cHb?r-s1s zln%ggczQj$RJowx$EMf6o%r?D`a9h4IVa`Vn`4F}U9GG3Tk*krLknk#`tu9TEOYp> v3)MGFpE0Me#XgfhV^04In{&JKo>|KXOnYOW8Mq_81^^24*5{teksJRDyY64- diff --git a/interface/resources/images/analog_stick_base.png b/interface/resources/images/analog_stick_base.png index 3b7b8aa8a9a6d8a83847680423a18d86ff182b84..ac8c1b9ae8baa098468a38411a5270fd17e3b187 100644 GIT binary patch literal 11853 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 Gh5rLpcxJKy literal 2020 zcmeAS@N?(olHy`uVBq!ia0y~yU}6Aa4mJh`hA$OYelajGNS3%plmzFem6RtIr7}3C zG&JWf&Pa7#JMDHZce=Ff=eQFt9K%C@?TEFftI3B2hWQ5~55; zC`Y&nn;3>W9pux$F|XL#_hZKC6^whXRnpAK=VIS!B6HJr*%Iv2A8;N>U|h3fwJqllwgXT36Y`ZAcmx~% z_A(gQFnrqq3Z#ZCmIHR;3~j6o)v*i`LJV)p!2wpv(O|0&3cUqfj2qswLW9zvX?-)p zn_8qGeei$Jf94zinMe+GXc!P1Nf<#k+@c$iI#5%>XaIo<5IlKwG=N4(0I6M+VQlyd zE|j1}y3XPE3`oV1&S_(YhFW;3^&DJkT~TECwwu8~h2h3)rUM%o66SM*>WLL@3~ve< z6Dk-s>}PFIWIAx~-GdUA_3bZTny?lVZ}F}z7 +#include #include #include #include @@ -25,10 +26,14 @@ static const QString FULLSCREEN = "Fullscreen"; void Basic2DWindowOpenGLDisplayPlugin::customizeContext() { auto iconPath = PathUtils::resourcesPath() + "images/analog_stick.png"; auto image = QImage(iconPath); + qreal dpi = getFullscreenTarget()->physicalDotsPerInch(); + _virtualPadPixelSize = dpi * 512 / 534; // 534 dpi for Pixel XL and Mate 9 Pro + if (image.format() != QImage::Format_ARGB32) { image = image.convertToFormat(QImage::Format_ARGB32); } if ((image.width() > 0) && (image.height() > 0)) { + image = image.scaled(_virtualPadPixelSize, _virtualPadPixelSize, Qt::KeepAspectRatio); _virtualPadStickTexture = gpu::Texture::createStrict( gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA), @@ -49,6 +54,8 @@ void Basic2DWindowOpenGLDisplayPlugin::customizeContext() { image = image.convertToFormat(QImage::Format_ARGB32); } if ((image.width() > 0) && (image.height() > 0)) { + image = image.scaled(_virtualPadPixelSize, _virtualPadPixelSize, Qt::KeepAspectRatio); + _virtualPadStickBaseTexture = gpu::Texture::createStrict( gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::RGBA), image.width(), image.height(), @@ -91,7 +98,8 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { auto& virtualPadManager = VirtualPad::Manager::instance(); if(virtualPadManager.getLeftVirtualPad()->isBeingTouched()) { // render stick base - auto stickBaseTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getLeftVirtualPad()->getFirstTouch()); + auto stickBaseTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getLeftVirtualPad()->getFirstTouch(), + _virtualPadPixelSize, _virtualPadPixelSize); render([&](gpu::Batch& batch) { batch.enableStereo(false); batch.setProjectionTransform(mat4()); @@ -103,7 +111,8 @@ void Basic2DWindowOpenGLDisplayPlugin::compositeExtra() { batch.draw(gpu::TRIANGLE_STRIP, 4); }); // render stick head - auto stickTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getLeftVirtualPad()->getCurrentTouch()); + auto stickTransform = DependencyManager::get()->getPoint2DTransform(virtualPadManager.getLeftVirtualPad()->getCurrentTouch(), + _virtualPadPixelSize, _virtualPadPixelSize); render([&](gpu::Batch& batch) { batch.enableStereo(false); batch.setProjectionTransform(mat4()); diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h index d9b942bd97..04568dcb27 100644 --- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h +++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h @@ -44,4 +44,5 @@ private: gpu::TexturePointer _virtualPadStickTexture; gpu::TexturePointer _virtualPadStickBaseTexture; + qreal _virtualPadPixelSize; }; diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp index 74225b5b39..fb53ca253f 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp @@ -458,9 +458,8 @@ glm::mat4 CompositorHelper::getReticleTransform(const glm::mat4& eyePose, const return result; } -glm::mat4 CompositorHelper::getPoint2DTransform(const glm::vec2& point) const { +glm::mat4 CompositorHelper::getPoint2DTransform(const glm::vec2& point, float sizeX, float sizeY) const { glm::mat4 result; - static const float PIXEL_SIZE = 512.0f; const auto canvasSize = vec2(toGlm(_renderingWidget->size()));; QPoint qPoint(point.x,point.y); vec2 position = toGlm(_renderingWidget->mapFromGlobal(qPoint)); @@ -469,7 +468,7 @@ glm::mat4 CompositorHelper::getPoint2DTransform(const glm::vec2& point) const { position -= 1.0; position.y *= -1.0f; - vec2 size = PIXEL_SIZE / canvasSize; + vec2 size = vec2(sizeX / canvasSize.x, sizeY / canvasSize.y); result = glm::scale(glm::translate(glm::mat4(), vec3(position, 0.0f)), vec3(size, 1.0f)); return result; } diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.h b/libraries/display-plugins/src/display-plugins/CompositorHelper.h index 5b65315f45..234818c740 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.h +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.h @@ -90,7 +90,7 @@ public: glm::vec2 getReticleMaximumPosition() const; glm::mat4 getReticleTransform(const glm::mat4& eyePose = glm::mat4(), const glm::vec3& headPosition = glm::vec3()) const; - glm::mat4 getPoint2DTransform(const glm::vec2& point = glm::vec2()) const; + glm::mat4 getPoint2DTransform(const glm::vec2& point = glm::vec2(), float sizeX = 512.0f, float sizeY = 512.0f) const; ReticleInterface* getReticleInterface() { return _reticleInterface; } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp index 53683870df..40bc341fe2 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.cpp @@ -22,6 +22,8 @@ #include #include "VirtualPadManager.h" +#include + const char* TouchscreenVirtualPadDevice::NAME = "TouchscreenVirtualPad"; bool TouchscreenVirtualPadDevice::isSupported() const { @@ -37,6 +39,21 @@ bool TouchscreenVirtualPadDevice::isSupported() const { return false; } +void TouchscreenVirtualPadDevice::initFromEvent(const QTouchEvent* event) { + QScreen* eventScreen = event->window()->screen(); + if (_screenDPI != eventScreen->physicalDotsPerInch()) { + _screenWidthCenter = eventScreen->size().width() / 2; + _screenDPIScale.x = (float)eventScreen->physicalDotsPerInchX(); + _screenDPIScale.y = (float)eventScreen->physicalDotsPerInchY(); + _screenDPI = eventScreen->physicalDotsPerInch(); + + _fixedPosition = true; // This should be config + _fixedRadius = _screenDPI * 256 / 534; + qreal margin = _screenDPI * 59 / 534; // 59px is for our 'base' of 534dpi (Pixel XL or Huawei Mate 9 Pro) + _fixedCenterPosition = glm::vec2( _fixedRadius + margin, eventScreen->size().height() - margin - _fixedRadius ); + } +} + float clip(float n, float lower, float upper) { return std::max(lower, std::min(n, upper)); } @@ -132,13 +149,7 @@ void TouchscreenVirtualPadDevice::touchBeginEvent(const QTouchEvent* event) { return; } KeyboardMouseDevice::enableTouch(false); - QScreen* eventScreen = event->window()->screen(); - _screenWidthCenter = eventScreen->size().width() / 2; - if (_screenDPI != eventScreen->physicalDotsPerInch()) { - _screenDPIScale.x = (float)eventScreen->physicalDotsPerInchX(); - _screenDPIScale.y = (float)eventScreen->physicalDotsPerInchY(); - _screenDPI = eventScreen->physicalDotsPerInch(); - } + initFromEvent(event); } void TouchscreenVirtualPadDevice::touchEndEvent(const QTouchEvent* event) { @@ -169,14 +180,13 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { bool rightTouchFound = false; for (int i = 0; i < _touchPointCount; ++i) { glm::vec2 thisPoint(tPoints[i].pos().x(), tPoints[i].pos().y()); - if (thisPoint.x < _screenWidthCenter) { + if (_validTouchLeft) { + leftTouchFound = true; + touchLeftUpdate(thisPoint); + } else if (touchLeftBeginPointIsValid(thisPoint)) { if (!leftTouchFound) { leftTouchFound = true; - if (!_validTouchLeft) { - touchLeftBegin(thisPoint); - } else { - touchLeftUpdate(thisPoint); - } + touchLeftBegin(thisPoint); } } else { if (!rightTouchFound) { @@ -197,10 +207,24 @@ void TouchscreenVirtualPadDevice::touchUpdateEvent(const QTouchEvent* event) { } } +bool TouchscreenVirtualPadDevice::touchLeftBeginPointIsValid(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); + } else { + // left side + return touchPoint.x < _screenWidthCenter; + } +} + void TouchscreenVirtualPadDevice::touchLeftBegin(glm::vec2 touchPoint) { auto& virtualPadManager = VirtualPad::Manager::instance(); if (virtualPadManager.isEnabled()) { - _firstTouchLeftPoint = touchPoint; + if (_fixedPosition) { + _firstTouchLeftPoint = _fixedCenterPosition; + } else { + _firstTouchLeftPoint = touchPoint; + } _validTouchLeft = true; } } diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h index fd74009ee8..fd2342bfec 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenVirtualPadDevice.h @@ -74,15 +74,21 @@ protected: int _screenWidthCenter; std::shared_ptr _inputDevice { std::make_shared() }; + bool _fixedPosition; + glm::vec2 _fixedCenterPosition; + qreal _fixedRadius; + void touchLeftBegin(glm::vec2 touchPoint); void touchLeftUpdate(glm::vec2 touchPoint); void touchLeftEnd(); + bool touchLeftBeginPointIsValid(glm::vec2 touchPoint); void touchRightBegin(glm::vec2 touchPoint); void touchRightUpdate(glm::vec2 touchPoint); void touchRightEnd(); // just for debug private: void debugPoints(const QTouchEvent* event, QString who); + void initFromEvent(const QTouchEvent* event); };