diff --git a/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java b/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java index 8250856fa..6bb75a338 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java @@ -476,6 +476,10 @@ public void setCylinderDensity(float aDensity) { editor.commit(); } + public boolean isCurvedModeEnabled() { + return getCylinderDensity() > 0; + } + public int getFoveatedLevelApp() { return mPrefs.getInt( mContext.getString(R.string.settings_key_foveated_app), FOVEATED_APP_DEFAULT_LEVEL); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java index 189ae1433..459826af2 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/NavigationBarWidget.java @@ -685,6 +685,7 @@ private void enterVRVideo(@VideoProjectionMenuWidget.VideoProjectionFlags int aP mMediaControlsWidget.setMedia(mFullScreenMedia); mMediaControlsWidget.setParentWidget(mAttachedWindow.getHandle()); mMediaControlsWidget.setProjectionSelectorEnabled(true); + mMediaControlsWidget.getPlacement().cylinder = SettingsStore.getInstance(getContext()).isCurvedModeEnabled(); mWidgetManager.updateWidget(mMediaControlsWidget); mWidgetManager.showVRVideo(mAttachedWindow.getHandle(), aProjection); } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java index 572d0a78a..cfdf2e296 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java @@ -1122,8 +1122,11 @@ public void onFullScreen(@NonNull WindowWidget aWindow, boolean aFullScreen) { if (aFullScreen) { mFullscreenWindow = aWindow; aWindow.saveBeforeFullscreenPlacement(); + // Do not depend on how many windows are opened to select flat/curved when entering fullscreen. + boolean fullscreenCurved = SettingsStore.getInstance(mContext).isCurvedModeEnabled() && (mStoredCurvedMode || mForcedCurvedMode); + aWindow.getPlacement().cylinder = fullscreenCurved; setFullScreenSize(aWindow); - placeWindow(aWindow, WindowPlacement.FRONT); + placeWindow(aWindow, WindowPlacement.FRONT, fullscreenCurved); focusWindow(aWindow); for (WindowWidget win: getCurrentWindows()) { setWindowVisible(win, win == mFullscreenWindow); diff --git a/app/src/main/cpp/BrowserWorld.cpp b/app/src/main/cpp/BrowserWorld.cpp index dc644185a..4e0b91643 100644 --- a/app/src/main/cpp/BrowserWorld.cpp +++ b/app/src/main/cpp/BrowserWorld.cpp @@ -229,6 +229,7 @@ struct BrowserWorld::State { int ParentCount(const WidgetPtr& aWidget) const; float ComputeNormalizedZ(const Widget& aWidget) const; void SortWidgets(); + void UpdateWidgetCylinder(const WidgetPtr& aWidget, const float aDensity); }; void @@ -657,9 +658,27 @@ BrowserWorld::State::SortWidgets() { // Depth sort return da->second.second < db->second.second; }); +} - - +void +BrowserWorld::State::UpdateWidgetCylinder(const WidgetPtr& aWidget, const float aDensity) { + const bool useCylinder = aDensity > 0 && aWidget->GetPlacement()->cylinder; + if (useCylinder && aWidget->GetCylinder()) { + aWidget->SetCylinderDensity(aDensity); + } else if (useCylinder && !aWidget->GetCylinder()) { + VRLayerSurfacePtr moveLayer = aWidget->GetLayer(); + VRLayerCylinderPtr layer = device->CreateLayerCylinder(moveLayer); + CylinderPtr cylinder = Cylinder::Create(create, layer); + aWidget->SetCylinder(cylinder); + aWidget->SetCylinderDensity(aDensity); + } else if (aWidget->GetCylinder()) { + float w = 0, h = 0; + aWidget->GetWorldSize(w, h); + VRLayerSurfacePtr moveLayer = aWidget->GetLayer(); + VRLayerQuadPtr layer = device->CreateLayerQuad(moveLayer); + QuadPtr quad = Quad::Create(create, w, h, layer); + aWidget->SetQuad(quad); + } } static BrowserWorldPtr sWorldInstance; @@ -1037,7 +1056,7 @@ BrowserWorld::UpdateWidget(int32_t aHandle, const WidgetPlacementPtr& aPlacement } widget->SetPlacement(aPlacement); - widget->SetCylinderDensity(m.cylinderDensity); + m.UpdateWidgetCylinder(widget, m.cylinderDensity); widget->ToggleWidget(aPlacement->visible); widget->SetSurfaceTextureSize(aPlacement->GetTextureWidth(), aPlacement->GetTextureHeight()); @@ -1233,7 +1252,7 @@ BrowserWorld::LayoutWidget(int32_t aHandle) { } widget->SetTransform(parent ? parent->GetTransform().PostMultiply(transform) : transform); - if (!widget->GetCylinder() && parent) { + if (!widget->GetCylinder()) { widget->LayoutQuadWithCylinderParent(parent); } } @@ -1304,21 +1323,7 @@ void BrowserWorld::SetCylinderDensity(const float aDensity) { m.cylinderDensity = aDensity; for (WidgetPtr& widget: m.widgets) { - const bool useCylinder = m.cylinderDensity > 0 && widget->GetPlacement()->cylinder; - if (useCylinder && widget->GetCylinder()) { - widget->SetCylinderDensity(aDensity); - } else if (useCylinder && !widget->GetCylinder()) { - VRLayerCylinderPtr layer = m.device->CreateLayerCylinder(widget->GetLayer()); - CylinderPtr cylinder = Cylinder::Create(m.create, layer); - widget->SetCylinder(cylinder); - widget->SetCylinderDensity(aDensity); - } else if (widget->GetCylinder()) { - float w = 0, h = 0; - widget->GetWorldSize(w, h); - VRLayerQuadPtr layer = m.device->CreateLayerQuad(widget->GetLayer()); - QuadPtr quad = Quad::Create(m.create, w, h, layer); - widget->SetQuad(quad); - } + m.UpdateWidgetCylinder(widget, aDensity); } } diff --git a/app/src/main/cpp/Widget.cpp b/app/src/main/cpp/Widget.cpp index f97adb539..fd10cc9e4 100644 --- a/app/src/main/cpp/Widget.cpp +++ b/app/src/main/cpp/Widget.cpp @@ -629,6 +629,11 @@ Widget::SetProxifyLayer(const bool aValue) { } void Widget::LayoutQuadWithCylinderParent(const WidgetPtr& aParent) { + if (!aParent) { + // No parent, reset the container transform. + m.transformContainer->SetTransform(vrb::Matrix::Identity()); + return; + } CylinderPtr cylinder = aParent->GetCylinder(); if (cylinder) { // The widget is flat and the parent is a cylinder.