Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit 3ad2320

Browse files
MortimerGorobluemarvin
authored andcommitted
Fix resize border z-fighting on non-Oculus devices (#1691)
1 parent b926cae commit 3ad2320

5 files changed

Lines changed: 54 additions & 19 deletions

File tree

app/src/main/cpp/BrowserWorld.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "Pointer.h"
1919
#include "Widget.h"
2020
#include "WidgetMover.h"
21+
#include "WidgetResizer.h"
2122
#include "WidgetPlacement.h"
2223
#include "Cylinder.h"
2324
#include "Quad.h"
@@ -182,6 +183,7 @@ struct BrowserWorld::State {
182183
VRVideoPtr vrVideo;
183184
PerformanceMonitorPtr monitor;
184185
WidgetMoverPtr movingWidget;
186+
WidgetResizerPtr widgetResizer;
185187

186188
State() : paused(true), glInitialized(false), modelsLoaded(false), env(nullptr), cylinderDensity(0.0f), nearClip(0.1f),
187189
farClip(300.0f), activity(nullptr), windowsInitialized(false), exitImmersiveRequested(false), loaderDelay(0) {
@@ -937,7 +939,8 @@ BrowserWorld::StartWidgetResize(int32_t aHandle, const vrb::Vector& aMaxSize, co
937939
ASSERT_ON_RENDER_THREAD();
938940
WidgetPtr widget = m.GetWidget(aHandle);
939941
if (widget) {
940-
widget->StartResize(aMaxSize, aMinSize);
942+
m.widgetResizer = widget->StartResize(aMaxSize, aMinSize);
943+
m.rootTransparent->AddNode(m.widgetResizer->GetRoot());
941944
}
942945
}
943946

@@ -949,6 +952,10 @@ BrowserWorld::FinishWidgetResize(int32_t aHandle) {
949952
return;
950953
}
951954
widget->FinishResize();
955+
if (m.widgetResizer) {
956+
m.widgetResizer->GetRoot()->RemoveFromParents();
957+
m.widgetResizer = nullptr;
958+
}
952959
}
953960

954961
void
@@ -1354,24 +1361,29 @@ BrowserWorld::CreateSkyBox(const std::string& aBasePath, const std::string& aExt
13541361

13551362
float
13561363
BrowserWorld::ComputeNormalizedZ(const vrb::NodePtr& aNode) const {
1357-
WidgetPtr target;
1358-
bool pointer = false;
1364+
Widget * target = nullptr;
1365+
float zDelta = 0.0f;
13591366
for (const auto & widget: m.widgets) {
13601367
if (widget->GetRoot() == aNode) {
1361-
target = widget;
1368+
target = widget.get();
13621369
break;
13631370
}
13641371
}
13651372
if (!target) {
13661373
for (Controller& controller: m.controllers->GetControllers()) {
13671374
if (controller.pointer && controller.pointer->GetRoot() == aNode) {
1368-
target = controller.pointer->GetHitWidget();
1369-
pointer = true;
1375+
target = controller.pointer->GetHitWidget().get();
1376+
zDelta = 0.02f;
13701377
break;
13711378
}
13721379
}
13731380
}
13741381

1382+
if (!target && m.widgetResizer && m.widgetResizer ->GetRoot() == aNode) {
1383+
target = m.widgetResizer->GetWidget();
1384+
zDelta = 0.01f;
1385+
}
1386+
13751387
if (!target) {
13761388
return 1.0f;
13771389
}
@@ -1395,12 +1407,7 @@ BrowserWorld::ComputeNormalizedZ(const vrb::NodePtr& aNode) const {
13951407

13961408
vrb::Vector ndc = viewProjection.MultiplyPosition(hitPoint);
13971409

1398-
float z = ndc.z();
1399-
1400-
if (pointer) {
1401-
z-= 0.001f;
1402-
}
1403-
return z;
1410+
return ndc.z() - zDelta;
14041411
}
14051412

14061413
} // namespace crow

app/src/main/cpp/Widget.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ struct Widget::State {
163163
vrb::Matrix translation = vrb::Matrix::Translation(vrb::Vector(0.0f, 0.0f, radius * scale));
164164
cylinder->SetTransform(translation.PostMultiply(scaleMatrix));
165165
AdjustCylinderRotation(radius * scale);
166+
UpdateResizerTransform();
166167
}
167168

168169
void AdjustCylinderRotation(const float radius) {
@@ -195,6 +196,12 @@ struct Widget::State {
195196
}
196197
borders.clear();
197198
}
199+
200+
void UpdateResizerTransform() {
201+
if (resizer) {
202+
resizer->SetTransform(transformContainer->GetTransform().PostMultiply(transform->GetTransform()));
203+
}
204+
}
198205
};
199206

200207
WidgetPtr
@@ -347,6 +354,7 @@ Widget::SetTransform(const vrb::Matrix& aTransform) {
347354
if (m.cylinder) {
348355
m.UpdateCylinderMatrix();
349356
}
357+
m.UpdateResizerTransform();
350358
}
351359

352360
void
@@ -443,7 +451,7 @@ Widget::SetPlacement(const WidgetPlacementPtr& aPlacement) {
443451
}
444452
}
445453

446-
void
454+
WidgetResizerPtr
447455
Widget::StartResize(const vrb::Vector& aMaxSize, const vrb::Vector& aMinSize) {
448456
vrb::Vector worldMin, worldMax;
449457
GetWidgetMinAndMax(worldMin, worldMax);
@@ -452,11 +460,10 @@ Widget::StartResize(const vrb::Vector& aMaxSize, const vrb::Vector& aMinSize) {
452460
} else {
453461
vrb::RenderContextPtr render = m.context.lock();
454462
if (!render) {
455-
return;
463+
return nullptr;
456464
}
457465
vrb::CreationContextPtr create = render->GetRenderThreadCreationContext();
458466
m.resizer = WidgetResizer::Create(create, this);
459-
m.transform->InsertNode(m.resizer->GetRoot(), 0);
460467
}
461468
m.resizer->SetResizeLimits(aMaxSize, aMinSize);
462469
m.resizing = true;
@@ -465,6 +472,8 @@ Widget::StartResize(const vrb::Vector& aMaxSize, const vrb::Vector& aMinSize) {
465472
m.quad->SetScaleMode(Quad::ScaleMode::AspectFit);
466473
m.quad->SetBackgroundColor(vrb::Color(1.0f, 1.0f, 1.0f, 1.0f));
467474
}
475+
m.UpdateResizerTransform();
476+
return m.resizer;
468477
}
469478

470479
void
@@ -601,6 +610,7 @@ void Widget::LayoutQuadWithCylinderParent(const CylinderPtr& aCylinder) {
601610
} else {
602611
m.transformContainer->SetTransform(vrb::Matrix::Identity());
603612
}
613+
m.UpdateResizerTransform();
604614
}
605615

606616
Widget::Widget(State& aState, vrb::RenderContextPtr& aContext) : m(aState) {

app/src/main/cpp/Widget.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ typedef std::shared_ptr<Quad> QuadPtr;
3030
class Widget;
3131
typedef std::shared_ptr<Widget> WidgetPtr;
3232

33+
class WidgetResizer;
34+
typedef std::shared_ptr<WidgetResizer> WidgetResizerPtr;
35+
3336
class WidgetPlacement;
3437
typedef std::shared_ptr<WidgetPlacement> WidgetPlacementPtr;
3538

@@ -66,7 +69,7 @@ class Widget {
6669
vrb::TransformPtr GetTransformNode() const;
6770
const WidgetPlacementPtr& GetPlacement() const;
6871
void SetPlacement(const WidgetPlacementPtr& aPlacement);
69-
void StartResize(const vrb::Vector& aMaxSize, const vrb::Vector& aMinSize);
72+
WidgetResizerPtr StartResize(const vrb::Vector& aMaxSize, const vrb::Vector& aMinSize);
7073
void FinishResize();
7174
bool IsResizing() const;
7275
bool IsResizingActive() const;

app/src/main/cpp/WidgetResizer.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "vrb/Color.h"
1515
#include "vrb/CreationContext.h"
1616
#include "vrb/Matrix.h"
17+
#include "vrb/GLError.h"
1718
#include "vrb/Geometry.h"
1819
#include "vrb/RenderState.h"
1920
#include "vrb/SurfaceTextureFactory.h"
@@ -255,6 +256,7 @@ struct WidgetResizer::State {
255256
vrb::Vector minSize;
256257
bool resizing;
257258
vrb::TogglePtr root;
259+
vrb::TransformPtr transform;
258260
std::vector<ResizeHandlePtr> resizeHandles;
259261
std::vector<ResizeBarPtr> resizeBars;
260262
ResizeHandlePtr activeHandle;
@@ -272,6 +274,8 @@ struct WidgetResizer::State {
272274
return;
273275
}
274276
root = vrb::Toggle::Create(create);
277+
transform = vrb::Transform::Create(create);
278+
root->AddNode(transform);
275279
currentMin = min;
276280
currentMax = max;
277281
maxSize = kDefaultMaxResize;
@@ -313,7 +317,7 @@ struct WidgetResizer::State {
313317
}
314318
ResizeBarPtr result = ResizeBar::Create(create, aCenter, aScale, aBorder, aMode);
315319
resizeBars.push_back(result);
316-
root->AddNode(result->border->GetTransformNode());
320+
transform->AddNode(result->border->GetTransformNode());
317321
return result;
318322
}
319323

@@ -325,7 +329,7 @@ struct WidgetResizer::State {
325329
ResizeHandlePtr result = ResizeHandle::Create(create, aCenter, aResizeMode, aBars);
326330
result->touchRatio = aTouchRatio;
327331
resizeHandles.push_back(result);
328-
root->InsertNode(result->root, 0);
332+
transform->InsertNode(result->root, 0);
329333
return result;
330334
}
331335

@@ -629,6 +633,15 @@ WidgetResizer::IsActive() const {
629633
return m.activeHandle && m.activeHandle->resizeState == ResizeState::Active;
630634
}
631635

636+
void
637+
WidgetResizer::SetTransform(const vrb::Matrix &aTransform){
638+
m.transform->SetTransform(aTransform);
639+
}
640+
641+
Widget*
642+
WidgetResizer::GetWidget() const {
643+
return m.widget;
644+
}
632645

633646
WidgetResizer::WidgetResizer(State& aState, vrb::CreationContextPtr& aContext) : m(aState) {
634647
m.context = aContext;

app/src/main/cpp/WidgetResizer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ typedef std::shared_ptr<WidgetResizer> WidgetResizerPtr;
2222

2323
class WidgetResizer {
2424
public:
25-
static WidgetResizerPtr Create(vrb::CreationContextPtr& aContext, Widget * aWidget);
25+
static WidgetResizerPtr Create(vrb::CreationContextPtr& aContext, Widget* aWidget);
2626
vrb::NodePtr GetRoot() const;
2727
void SetSize(const vrb::Vector& aMin, const vrb::Vector& aMax);
2828
void SetResizeLimits(const vrb::Vector& aMaxSize, const vrb::Vector& aMinSize);
@@ -33,6 +33,8 @@ class WidgetResizer {
3333
const vrb::Vector& GetResizeMin() const;
3434
const vrb::Vector& GetResizeMax() const;
3535
bool IsActive() const;
36+
Widget* GetWidget() const;
37+
void SetTransform(const vrb::Matrix& aTransform);
3638
protected:
3739
struct State;
3840
WidgetResizer(State& aState, vrb::CreationContextPtr& aContext);

0 commit comments

Comments
 (0)