From aa1bb8cd8263a250efd1286950be6ff820fadb86 Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Fri, 1 Mar 2019 14:56:54 +0100 Subject: [PATCH] Fix sticking out border in curved resize mode (#980) --- app/src/main/cpp/Cylinder.cpp | 9 +++++++++ app/src/main/cpp/Cylinder.h | 1 + app/src/main/cpp/WidgetResizer.cpp | 24 ++++++++++++++++++++++++ app/src/main/cpp/vrb | 2 +- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/src/main/cpp/Cylinder.cpp b/app/src/main/cpp/Cylinder.cpp index 3bbc3b5e1..4c55baabe 100644 --- a/app/src/main/cpp/Cylinder.cpp +++ b/app/src/main/cpp/Cylinder.cpp @@ -281,6 +281,15 @@ Cylinder::GetCylinderTheta() const { return m.theta; } +vrb::RenderStatePtr +Cylinder::GetRenderState() const { + if (m.geometry) { + return m.geometry->GetRenderState(); + } + + return nullptr; +} + void Cylinder::SetCylinderTheta(const float aAngleLength) { m.theta = aAngleLength; diff --git a/app/src/main/cpp/Cylinder.h b/app/src/main/cpp/Cylinder.h index 6a34885ee..ab9303661 100644 --- a/app/src/main/cpp/Cylinder.h +++ b/app/src/main/cpp/Cylinder.h @@ -38,6 +38,7 @@ class Cylinder { float GetCylinderRadius() const; float GetCylinderHeight() const; float GetCylinderTheta() const; + vrb::RenderStatePtr GetRenderState() const; void SetCylinderTheta(const float aAngleLength); void SetTintColor(const vrb::Color& aColor); vrb::NodePtr GetRoot() const; diff --git a/app/src/main/cpp/WidgetResizer.cpp b/app/src/main/cpp/WidgetResizer.cpp index c3011238f..67cf69cee 100644 --- a/app/src/main/cpp/WidgetResizer.cpp +++ b/app/src/main/cpp/WidgetResizer.cpp @@ -15,6 +15,7 @@ #include "vrb/Geometry.h" #include "vrb/RenderState.h" #include "vrb/SurfaceTextureFactory.h" +#include "vrb/TextureGL.h" #include "vrb/TextureSurface.h" #include "vrb/Toggle.h" #include "vrb/Transform.h" @@ -23,6 +24,23 @@ namespace crow { +static const char* sCylinderFragmentShader = R"SHADER( +precision highp float; + +uniform sampler2D u_texture0; +varying vec4 v_color; +varying vec2 v_uv; + +void main() { + vec4 color = vec4(1.0f, 1.0f, 1.0f, 1.0f); + if ((v_uv.x < 0.0f) || (v_uv.x > 1.0f)) { + color.a = 0.0f; + } + gl_FragColor = color * v_color; +} + +)SHADER"; + struct ResizeBar; typedef std::shared_ptr ResizeBarPtr; @@ -74,6 +92,12 @@ struct ResizeBar { if (aMode == ResizeBar::Mode::Cylinder) { result->cylinder = Cylinder::Create(aContext, 1.0f, kBarSize, vrb::Color(1.0f, 1.0f, 1.0f, 1.0f), kBorder, vrb::Color(1.0f, 1.0f, 1.0f, 0.0f)); result->cylinder->SetLightsEnabled(false); + if (aScale.x() == 1.0f) { + // Fix sticking out border at the bottom of the resize bar (No handles to hide it...) + vrb::TextureGLPtr defaultTexture = aContext->GetDefaultTexture(); + result->cylinder->SetTexture(defaultTexture, defaultTexture->GetWidth(), defaultTexture->GetHeight()); + result->cylinder->GetRenderState()->SetCustomFragmentShader(sCylinderFragmentShader); + } result->transform->AddNode(result->cylinder->GetRoot()); } else { result->geometry = CreateGeometry(aContext, -max, max, aBorder); diff --git a/app/src/main/cpp/vrb b/app/src/main/cpp/vrb index 635714938..730055923 160000 --- a/app/src/main/cpp/vrb +++ b/app/src/main/cpp/vrb @@ -1 +1 @@ -Subproject commit 63571493855d62db137759303314a9d5726f35d4 +Subproject commit 730055923a7fe30d342a0cf3ab5c4e0d56667743