diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Anchor_Left.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Anchor_Left.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Anchor_Left.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Anchor_Left.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Anchor_TopLeft.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Anchor_TopLeft.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Anchor_TopLeft.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Anchor_TopLeft.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Anchor_Whole.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Anchor_Whole.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Anchor_Whole.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Anchor_Whole.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Border_Selected.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Border_Selected.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Border_Selected.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Border_Selected.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Border_Unselected.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Border_Unselected.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Border_Unselected.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Border_Unselected.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Canvas_Background.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Canvas_Background.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Canvas_Background.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Canvas_Background.tif
diff --git a/Gems/LyShine/Assets/Editor/Icons/Viewport/Canvas_Background.tif.assetinfo b/Gems/LyShine/Assets/Editor/Icons/Viewport/Canvas_Background.tif.assetinfo
new file mode 100644
index 0000000000..61b2832ff3
--- /dev/null
+++ b/Gems/LyShine/Assets/Editor/Icons/Viewport/Canvas_Background.tif.assetinfo
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/DottedLine.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/DottedLine.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/DottedLine.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/DottedLine.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Pivot.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Pivot.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Pivot.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Pivot.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Center_Square.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Center_Square.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Center_Square.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Center_Square.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Circle.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Circle.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Circle.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Circle.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Square_X.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Line_Square_X.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Square_X.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Line_Square_X.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Square_Y.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Line_Square_Y.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Square_Y.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Line_Square_Y.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Triangle_X.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Line_Triangle_X.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Triangle_X.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Line_Triangle_X.tif
diff --git a/Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Triangle_Y.tif b/Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Line_Triangle_Y.tif
similarity index 100%
rename from Assets/Editor/Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Triangle_Y.tif
rename to Gems/LyShine/Assets/Editor/Icons/Viewport/Transform_Gizmo_Line_Triangle_Y.tif
diff --git a/Gems/LyShine/Code/Editor/EditorWindow.cpp b/Gems/LyShine/Code/Editor/EditorWindow.cpp
index 4641b02a13..e3810dcbee 100644
--- a/Gems/LyShine/Code/Editor/EditorWindow.cpp
+++ b/Gems/LyShine/Code/Editor/EditorWindow.cpp
@@ -1451,7 +1451,6 @@ void EditorWindow::OnEditorNotifyEvent(EEditorNotifyEvent ev)
{
// change skin
RefreshEditorMenu();
- m_viewport->UpdateViewportBackground();
break;
}
case eNotify_OnUpdateViewports:
diff --git a/Gems/LyShine/Code/Editor/QtHelpers.cpp b/Gems/LyShine/Code/Editor/QtHelpers.cpp
index 9691c2a618..16a5d42327 100644
--- a/Gems/LyShine/Code/Editor/QtHelpers.cpp
+++ b/Gems/LyShine/Code/Editor/QtHelpers.cpp
@@ -13,6 +13,8 @@
#include "EditorCommon.h"
+#include
+
namespace QtHelpers
{
AZ::Vector2 QPointFToVector2(const QPointF& point)
@@ -34,4 +36,18 @@ namespace QtHelpers
return inWidget;
}
+ float GetHighDpiScaleFactor(const QWidget& widget)
+ {
+ float dpiScale = QHighDpiScaling::factor(widget.windowHandle()->screen());
+ return dpiScale;
+ }
+
+ QSize GetDpiScaledViewportSize(const QWidget& widget)
+ {
+ float dpiScale = GetHighDpiScaleFactor(widget);
+ float width = ceilf(widget.size().width() * dpiScale);
+ float height = ceilf(widget.size().height() * dpiScale);
+ return QSize(width, height);
+ }
+
} // namespace QtHelpers
diff --git a/Gems/LyShine/Code/Editor/QtHelpers.h b/Gems/LyShine/Code/Editor/QtHelpers.h
index f55ffc767e..7af68432d3 100644
--- a/Gems/LyShine/Code/Editor/QtHelpers.h
+++ b/Gems/LyShine/Code/Editor/QtHelpers.h
@@ -21,4 +21,8 @@ namespace QtHelpers
bool IsGlobalPosInWidget(const QWidget* widget, const QPoint& pos);
+ float GetHighDpiScaleFactor(const QWidget& widget);
+
+ QSize GetDpiScaledViewportSize(const QWidget& widget);
+
} // namespace QtHelpers
diff --git a/Gems/LyShine/Code/Editor/ViewportAnchor.cpp b/Gems/LyShine/Code/Editor/ViewportAnchor.cpp
index d61066f4d9..f46a62586d 100644
--- a/Gems/LyShine/Code/Editor/ViewportAnchor.cpp
+++ b/Gems/LyShine/Code/Editor/ViewportAnchor.cpp
@@ -14,10 +14,10 @@
#include "EditorCommon.h"
ViewportAnchor::ViewportAnchor()
- : m_anchorWhole(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Anchor_Whole.tif"))
- , m_anchorLeft(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Anchor_Left.tif"))
- , m_anchorLeftTop(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Anchor_TopLeft.tif"))
- , m_dottedLine(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/DottedLine.tif"))
+ : m_anchorWhole(new ViewportIcon("Editor/Icons/Viewport/Anchor_Whole.tif"))
+ , m_anchorLeft(new ViewportIcon("Editor/Icons/Viewport/Anchor_Left.tif"))
+ , m_anchorLeftTop(new ViewportIcon("Editor/Icons/Viewport/Anchor_TopLeft.tif"))
+ , m_dottedLine(new ViewportIcon("Editor/Icons/Viewport/DottedLine.tif"))
{
}
diff --git a/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp b/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp
index ccc35de305..344e3af9cb 100644
--- a/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp
+++ b/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp
@@ -15,7 +15,7 @@
#include "EditorCommon.h"
ViewportCanvasBackground::ViewportCanvasBackground()
- : m_canvasBackground(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Canvas_Background.tif"))
+ : m_canvasBackground(new ViewportIcon("Editor/Icons/Viewport/Canvas_Background.tif"))
{
}
diff --git a/Gems/LyShine/Code/Editor/ViewportHelpers.h b/Gems/LyShine/Code/Editor/ViewportHelpers.h
index 9a1aadead5..7cb64d01c7 100644
--- a/Gems/LyShine/Code/Editor/ViewportHelpers.h
+++ b/Gems/LyShine/Code/Editor/ViewportHelpers.h
@@ -17,7 +17,6 @@ namespace ViewportHelpers
{
//-------------------------------------------------------------------------------
- const AZ::Color backgroundColorLight(0.85f, 0.85f, 0.85f, 1.0f);
const AZ::Color backgroundColorDark(0.133f, 0.137f, 0.149f, 1.0f); // #222236, RGBA: 34, 35, 38, 255
const AZ::Color selectedColor(1.000f, 1.000f, 1.000f, 1.0f); // #FFFFFF, RGBA: 255, 255, 255, 255
const AZ::Color unselectedColor(0.800f, 0.800f, 0.800f, 0.500f); // #CCCCCC, RGBA: 204, 204, 204, 128
diff --git a/Gems/LyShine/Code/Editor/ViewportHighlight.cpp b/Gems/LyShine/Code/Editor/ViewportHighlight.cpp
index c050d55049..e6699615c6 100644
--- a/Gems/LyShine/Code/Editor/ViewportHighlight.cpp
+++ b/Gems/LyShine/Code/Editor/ViewportHighlight.cpp
@@ -14,8 +14,8 @@
#include "EditorCommon.h"
ViewportHighlight::ViewportHighlight()
- : m_highlightIconSelected(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Border_Selected.tif"))
- , m_highlightIconUnselected(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Border_Unselected.tif"))
+ : m_highlightIconSelected(new ViewportIcon("Editor/Icons/Viewport/Border_Selected.tif"))
+ , m_highlightIconUnselected(new ViewportIcon("Editor/Icons/Viewport/Border_Unselected.tif"))
{
}
diff --git a/Gems/LyShine/Code/Editor/ViewportIcon.cpp b/Gems/LyShine/Code/Editor/ViewportIcon.cpp
index 81ed5dbcb5..b1866efb00 100644
--- a/Gems/LyShine/Code/Editor/ViewportIcon.cpp
+++ b/Gems/LyShine/Code/Editor/ViewportIcon.cpp
@@ -17,6 +17,8 @@
#include
#include
+float ViewportIcon::m_dpiScaleFactor = 1.0f;
+
ViewportIcon::ViewportIcon(const char* textureFilename)
{
m_image = CDraw2d::LoadTexture(textureFilename);
@@ -31,7 +33,12 @@ AZ::Vector2 ViewportIcon::GetTextureSize() const
if (m_image)
{
AZ::RHI::Size size = m_image->GetDescriptor().m_size;
- return AZ::Vector2(size.m_width, size.m_height);
+ AZ::Vector2 scaledSize(size.m_width, size.m_height);
+ if (m_applyDpiScaleFactorToSize)
+ {
+ scaledSize *= m_dpiScaleFactor;
+ }
+ return scaledSize;
}
return AZ::Vector2(0.0f, 0.0f);
@@ -380,5 +387,6 @@ void ViewportIcon::DrawElementRectOutline(Draw2dHelper& draw2d, AZ::EntityId ent
rightVec.NormalizeSafe();
downVec.NormalizeSafe();
- draw2d.DrawRectOutlineTextured(m_image, points, rightVec, downVec, color);
+ uint32_t lineThickness = aznumeric_cast(GetTextureSize().GetY());
+ draw2d.DrawRectOutlineTextured(m_image, points, rightVec, downVec, color, lineThickness);
}
diff --git a/Gems/LyShine/Code/Editor/ViewportIcon.h b/Gems/LyShine/Code/Editor/ViewportIcon.h
index 85fd2fe068..b61d0715b6 100644
--- a/Gems/LyShine/Code/Editor/ViewportIcon.h
+++ b/Gems/LyShine/Code/Editor/ViewportIcon.h
@@ -49,6 +49,21 @@ public:
// width of the border (but the texture can have alpha at edges to make it thinner).
void DrawElementRectOutline(Draw2dHelper& draw2d, AZ::EntityId entityId, AZ::Color color);
+ // Set whether to apply high resolution dpi scaling to the icon size
+ void SetApplyDpiScaleFactorToSize(bool apply) { m_applyDpiScaleFactorToSize = apply; }
+
+ // Get whether to apply high resolution dpi scaling to the icon size
+ bool GetApplyDpiScaleFactorToSize() { return m_applyDpiScaleFactorToSize; }
+
+ // Set scale factor
+ static void SetDpiScaleFactor(float scale) { m_dpiScaleFactor = scale; }
+
+ // Get scale factor
+ static float GetDpiScaleFactor() { return m_dpiScaleFactor; }
+
private:
AZ::Data::Instance m_image;
+ bool m_applyDpiScaleFactorToSize = true;
+
+ static float m_dpiScaleFactor;
};
diff --git a/Gems/LyShine/Code/Editor/ViewportInteraction.cpp b/Gems/LyShine/Code/Editor/ViewportInteraction.cpp
index 60b7f4f35b..c846bbb8c3 100644
--- a/Gems/LyShine/Code/Editor/ViewportInteraction.cpp
+++ b/Gems/LyShine/Code/Editor/ViewportInteraction.cpp
@@ -167,8 +167,8 @@ ViewportInteraction::ViewportInteraction(EditorWindow* editorWindow)
: QObject()
, m_editorWindow(editorWindow)
, m_activeElementId()
- , m_anchorWhole(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Anchor_Whole.tif"))
- , m_pivotIcon(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Pivot.tif"))
+ , m_anchorWhole(new ViewportIcon("Editor/Icons/Viewport/Anchor_Whole.tif"))
+ , m_pivotIcon(new ViewportIcon("Editor/Icons/Viewport/Pivot.tif"))
, m_interactionMode(PersistentGetInteractionMode())
, m_interactionType(InteractionType::NONE)
, m_coordinateSystem(PersistentGetCoordinateSystem())
@@ -186,13 +186,13 @@ ViewportInteraction::ViewportInteraction(EditorWindow* editorWindow)
, m_startAnchors(UiTransform2dInterface::Anchors())
, m_grabbedAnchors(ViewportHelpers::SelectedAnchors())
, m_grabbedGizmoParts(ViewportHelpers::GizmoParts())
- , m_lineTriangleX(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Triangle_X.tif"))
- , m_lineTriangleY(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Triangle_Y.tif"))
- , m_circle(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Circle.tif"))
- , m_lineSquareX(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Square_X.tif"))
- , m_lineSquareY(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Line_Square_Y.tif"))
- , m_centerSquare(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Transform_Gizmo_Center_Square.tif"))
- , m_dottedLine(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/DottedLine.tif"))
+ , m_lineTriangleX(new ViewportIcon("Editor/Icons/Viewport/Transform_Gizmo_Line_Triangle_X.tif"))
+ , m_lineTriangleY(new ViewportIcon("Editor/Icons/Viewport/Transform_Gizmo_Line_Triangle_Y.tif"))
+ , m_circle(new ViewportIcon("Editor/Icons/Viewport/Transform_Gizmo_Circle.tif"))
+ , m_lineSquareX(new ViewportIcon("Editor/Icons/Viewport/Transform_Gizmo_Line_Square_X.tif"))
+ , m_lineSquareY(new ViewportIcon("Editor/Icons/Viewport/Transform_Gizmo_Line_Square_Y.tif"))
+ , m_centerSquare(new ViewportIcon("Editor/Icons/Viewport/Transform_Gizmo_Center_Square.tif"))
+ , m_dottedLine(new ViewportIcon("Editor/Icons/Viewport/DottedLine.tif"))
, m_dragInteraction(nullptr)
, m_expanderWatcher(new ViewportInteractionExpanderWatcher(this))
{
@@ -908,8 +908,9 @@ void ViewportInteraction::GetScaleToFitTransformProps(const AZ::Vector2* newCanv
EBUS_EVENT_ID_RESULT(canvasSize, m_editorWindow->GetCanvas(), UiCanvasBus, GetCanvasSize);
}
- const int viewportWidth = m_editorWindow->GetViewport()->size().width();
- const int viewportHeight = m_editorWindow->GetViewport()->size().height();
+ QSize viewportSize = QtHelpers::GetDpiScaledViewportSize(*m_editorWindow->GetViewport());
+ const int viewportWidth = viewportSize.width();
+ const int viewportHeight = viewportSize.height();
// We pad the edges of the viewport to allow the user to easily see the borders of
// the canvas edges, which is especially helpful if there are anchors sitting on
diff --git a/Gems/LyShine/Code/Editor/ViewportPivot.cpp b/Gems/LyShine/Code/Editor/ViewportPivot.cpp
index 694cf91515..c264f7093d 100644
--- a/Gems/LyShine/Code/Editor/ViewportPivot.cpp
+++ b/Gems/LyShine/Code/Editor/ViewportPivot.cpp
@@ -15,7 +15,7 @@
#include "ViewportPivot.h"
ViewportPivot::ViewportPivot()
- : m_pivot(new ViewportIcon("Plugins/UiCanvasEditor/CanvasIcons/Pivot.tif"))
+ : m_pivot(new ViewportIcon("Editor/Icons/Viewport/Pivot.tif"))
{
}
diff --git a/Gems/LyShine/Code/Editor/ViewportWidget.cpp b/Gems/LyShine/Code/Editor/ViewportWidget.cpp
index 89c5a0bb50..f9464f17c7 100644
--- a/Gems/LyShine/Code/Editor/ViewportWidget.cpp
+++ b/Gems/LyShine/Code/Editor/ViewportWidget.cpp
@@ -38,6 +38,7 @@
#include
#include
+#include
#define UICANVASEDITOR_SETTINGS_VIEWPORTWIDGET_DRAW_ELEMENT_BORDERS_KEY "ViewportWidget::m_drawElementBordersFlags"
#define UICANVASEDITOR_SETTINGS_VIEWPORTWIDGET_DRAW_ELEMENT_BORDERS_DEFAULT ( ViewportWidget::DrawElementBorders_Unselected )
@@ -220,8 +221,6 @@ ViewportWidget::ViewportWidget(EditorWindow* parent)
{
setAcceptDrops(true);
- UpdateViewportBackground();
-
InitUiRenderer();
SetupShortcuts();
@@ -299,19 +298,6 @@ void ViewportWidget::ToggleDrawElementBorders(uint32 flags)
SetDrawElementBordersFlags(m_drawElementBordersFlags);
}
-void ViewportWidget::UpdateViewportBackground()
-{
- const QColor backgroundColor(ViewportHelpers::backgroundColorDark.GetR8(),
- ViewportHelpers::backgroundColorDark.GetG8(),
- ViewportHelpers::backgroundColorDark.GetB8(),
- ViewportHelpers::backgroundColorDark.GetA8());
-
- QPalette pal(palette());
- pal.setColor(QPalette::Window, backgroundColor);
- setPalette(pal);
- setAutoFillBackground(true);
-}
-
void ViewportWidget::ActiveCanvasChanged()
{
bool canvasLoaded = m_editorWindow->GetCanvas().IsValid();
@@ -519,6 +505,9 @@ void ViewportWidget::OnTick(float deltaTime, [[maybe_unused]] AZ::ScriptTimePoin
gEnv->pRenderer->SetSrgbWrite(true);
#endif
+ const float dpiScale = QtHelpers::GetHighDpiScaleFactor(*this);
+ ViewportIcon::SetDpiScaleFactor(dpiScale);
+
// Set up to render a frame to this viewport's window
GetViewportContext()->RenderTick();
@@ -554,7 +543,9 @@ void ViewportWidget::RefreshTick()
void ViewportWidget::mousePressEvent(QMouseEvent* ev)
{
UiEditorMode editorMode = m_editorWindow->GetEditorMode();
- QMouseEvent scaledEvent(ev->type(), WidgetToViewport(ev->localPos()), ev->button(), ev->buttons(), ev->modifiers());
+
+ QPointF scaledPosition = WidgetToViewport(ev->localPos());
+ QMouseEvent scaledEvent(ev->type(), scaledPosition, ev->button(), ev->buttons(), ev->modifiers());
if (editorMode == UiEditorMode::Edit)
{
// in Edit mode just send input to ViewportInteraction
@@ -569,8 +560,7 @@ void ViewportWidget::mousePressEvent(QMouseEvent* ev)
if (ev->button() == Qt::LeftButton)
{
// Send event to this canvas
- QPointF scaledPos = WidgetToViewport(ev->localPos());
- const AZ::Vector2 viewportPosition(aznumeric_cast(scaledPos.x()), aznumeric_cast(scaledPos.y()));
+ const AZ::Vector2 viewportPosition(aznumeric_cast(scaledPosition.x()), aznumeric_cast(scaledPosition.y()));
const AzFramework::InputChannel::Snapshot inputSnapshot(AzFramework::InputDeviceMouse::Button::Left,
AzFramework::InputDeviceMouse::Id,
AzFramework::InputChannel::State::Began);
@@ -588,7 +578,9 @@ void ViewportWidget::mousePressEvent(QMouseEvent* ev)
void ViewportWidget::mouseMoveEvent(QMouseEvent* ev)
{
UiEditorMode editorMode = m_editorWindow->GetEditorMode();
- QMouseEvent scaledEvent(ev->type(), WidgetToViewport(ev->localPos()), ev->button(), ev->buttons(), ev->modifiers());
+
+ QPointF scaledPosition = WidgetToViewport(ev->localPos());
+ QMouseEvent scaledEvent(ev->type(), scaledPosition, ev->button(), ev->buttons(), ev->modifiers());
if (editorMode == UiEditorMode::Edit)
{
@@ -596,7 +588,8 @@ void ViewportWidget::mouseMoveEvent(QMouseEvent* ev)
m_viewportInteraction->MouseMoveEvent(&scaledEvent,
m_editorWindow->GetHierarchy()->selectedItems());
- SetRulerCursorPositions(ev->globalPos());
+ QPointF screenPosition = WidgetToViewport(ev->screenPos());
+ SetRulerCursorPositions(screenPosition.toPoint());
}
else // if (editorMode == UiEditorMode::Preview)
{
@@ -604,8 +597,7 @@ void ViewportWidget::mouseMoveEvent(QMouseEvent* ev)
AZ::EntityId canvasEntityId = m_editorWindow->GetPreviewModeCanvas();
if (canvasEntityId.IsValid())
{
- QPointF scaledPos = WidgetToViewport(ev->localPos());
- const AZ::Vector2 viewportPosition(aznumeric_cast(scaledPos.x()), aznumeric_cast(scaledPos.y()));
+ const AZ::Vector2 viewportPosition(aznumeric_cast(scaledPosition.x()), aznumeric_cast(scaledPosition.y()));
const AzFramework::InputChannelId& channelId = (ev->buttons() & Qt::LeftButton) ?
AzFramework::InputDeviceMouse::Button::Left :
AzFramework::InputDeviceMouse::SystemCursorPosition;
@@ -625,7 +617,9 @@ void ViewportWidget::mouseMoveEvent(QMouseEvent* ev)
void ViewportWidget::mouseReleaseEvent(QMouseEvent* ev)
{
UiEditorMode editorMode = m_editorWindow->GetEditorMode();
- QMouseEvent scaledEvent(ev->type(), WidgetToViewport(ev->localPos()), ev->button(), ev->buttons(), ev->modifiers());
+
+ QPointF scaledPosition = WidgetToViewport(ev->localPos());
+ QMouseEvent scaledEvent(ev->type(), scaledPosition, ev->button(), ev->buttons(), ev->modifiers());
if (editorMode == UiEditorMode::Edit)
{
// in Edit mode just send input to ViewportInteraction
@@ -641,8 +635,7 @@ void ViewportWidget::mouseReleaseEvent(QMouseEvent* ev)
if (ev->button() == Qt::LeftButton)
{
// Send event to this canvas
- QPointF scaledPos = WidgetToViewport(ev->localPos());
- const AZ::Vector2 viewportPosition(aznumeric_cast(scaledPos.x()), aznumeric_cast(scaledPos.y()));
+ const AZ::Vector2 viewportPosition(aznumeric_cast(scaledPosition.x()), aznumeric_cast(scaledPosition.y()));
const AzFramework::InputChannel::Snapshot inputSnapshot(AzFramework::InputDeviceMouse::Button::Left,
AzFramework::InputDeviceMouse::Id,
AzFramework::InputChannel::State::Ended);
@@ -726,7 +719,7 @@ bool ViewportWidget::event(QEvent* ev)
}
}
- bool result = QWidget::event(ev);
+ bool result = RenderViewportWidget::event(ev);
return result;
}
@@ -931,14 +924,16 @@ void ViewportWidget::RenderEditMode(float deltaTime)
EBUS_EVENT_ID_RESULT(canvasSize, canvasEntityId, UiCanvasBus, GetCanvasSize);
m_draw2d->SetSortKey(backgroundKey);
+
+ // Render a rectangle covering the entire editor viewport area
+ RenderViewportBackground();
+
+ // Render a checkerboard background covering the canvas area which represents transparency
m_viewportBackground->Draw(draw2d,
canvasSize,
m_viewportInteraction->GetCanvasToViewportScale(),
m_viewportInteraction->GetCanvasToViewportTranslation());
- AZ::Vector2 viewportSize(aznumeric_cast(size().width()), aznumeric_cast(size().height()));
- viewportSize *= QHighDpiScaling::factor(windowHandle()->screen());
-
#ifdef LYSHINE_ATOM_TODO
// clear the stencil buffer before rendering each canvas - required for masking
// NOTE: the FRT_CLEAR_IMMEDIATE is required since we will not be setting the render target
@@ -953,6 +948,8 @@ void ViewportWidget::RenderEditMode(float deltaTime)
EBUS_EVENT_ID(canvasEntityId, UiEditorCanvasBus, UpdateCanvasInEditorViewport, deltaTime, false);
// Render this canvas
+ QSize scaledViewportSize = QtHelpers::GetDpiScaledViewportSize(*this);
+ AZ::Vector2 viewportSize(scaledViewportSize.width(), scaledViewportSize.height());
EBUS_EVENT_ID(canvasEntityId, UiEditorCanvasBus, RenderCanvasInEditorViewport, false, viewportSize);
m_draw2d->SetSortKey(topLayerKey);
@@ -1050,6 +1047,9 @@ void ViewportWidget::RenderEditMode(float deltaTime)
void ViewportWidget::RenderPreviewMode(float deltaTime)
{
+ // sort keys for different layers
+ static const int64_t backgroundKey = -0x1000;
+
AZ::EntityId canvasEntityId = m_editorWindow->GetPreviewModeCanvas();
if (m_fontTextureHasChanged)
@@ -1072,10 +1072,10 @@ void ViewportWidget::RenderPreviewMode(float deltaTime)
if (canvasEntityId.IsValid())
{
- // Get the canvas size
- AZ::Vector2 viewportSize(aznumeric_cast(size().width()), aznumeric_cast(size().height()));
- viewportSize *= QHighDpiScaling::factor(windowHandle()->screen());
+ QSize scaledViewportSize = QtHelpers::GetDpiScaledViewportSize(*this);
+ AZ::Vector2 viewportSize(scaledViewportSize.width(), scaledViewportSize.height());
+ // Get the canvas size
AZ::Vector2 canvasSize = m_editorWindow->GetPreviewCanvasSize();
if (canvasSize.GetX() == 0.0f && canvasSize.GetY() == 0.0f)
{
@@ -1139,7 +1139,7 @@ void ViewportWidget::RenderPreviewMode(float deltaTime)
canvasToViewportMatrix.SetTranslation(translation);
EBUS_EVENT_ID(canvasEntityId, UiCanvasBus, SetCanvasToViewportMatrix, canvasToViewportMatrix);
-#ifdef LYSHINE_ATOM_TODO
+#ifdef LYSHINE_ATOM_TODO // mask support with Atom
// clear the stencil buffer before rendering each canvas - required for masking
// NOTE: the FRT_CLEAR_IMMEDIATE is required since we will not be setting the render target
// We also clear the color to a mid grey so that we can see the bounds of the canvas
@@ -1147,16 +1147,18 @@ void ViewportWidget::RenderPreviewMode(float deltaTime)
gEnv->pRenderer->ClearTargetsImmediately(FRT_CLEAR, viewportBackgroundColor);
#endif
-#ifdef LYSHINE_ATOM_TODO
+ m_draw2d->SetSortKey(backgroundKey);
+
+ RenderViewportBackground();
+
// Render a black rectangle covering the canvas area. This allows the canvas bounds to be visible when the canvas size is
// not exactly the same as the viewport size
AZ::Vector2 topLeftInViewportSpace = CanvasHelpers::GetViewportPoint(canvasEntityId, AZ::Vector2(0.0f, 0.0f));
AZ::Vector2 bottomRightInViewportSpace = CanvasHelpers::GetViewportPoint(canvasEntityId, canvasSize);
AZ::Vector2 sizeInViewportSpace = bottomRightInViewportSpace - topLeftInViewportSpace;
- Draw2dHelper draw2d(m_draw2d.get())
- int texId = gEnv->pRenderer->GetBlackTextureId();
- draw2d.DrawImage(texId, topLeftInViewportSpace, sizeInViewportSpace);
-#endif
+ Draw2dHelper draw2d(m_draw2d.get());
+ auto image = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::Black);
+ draw2d.DrawImage(image, topLeftInViewportSpace, sizeInViewportSpace);
// Render this canvas
// NOTE: the displayBounds param is always false. If we wanted a debug option to display the bounds
@@ -1166,6 +1168,17 @@ void ViewportWidget::RenderPreviewMode(float deltaTime)
}
}
+void ViewportWidget::RenderViewportBackground()
+{
+ QSize viewportSize = QtHelpers::GetDpiScaledViewportSize(*this);
+ AZ::Color backgroundColor = ViewportHelpers::backgroundColorDark;
+ const AZ::Data::Instance& image = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White);
+
+ Draw2dHelper draw2d(m_draw2d.get());
+ draw2d.SetImageColor(backgroundColor.GetAsVector3());
+ draw2d.DrawImage(image, AZ::Vector2(0.0f, 0.0f), AZ::Vector2(viewportSize.width(), viewportSize.height()));
+}
+
void ViewportWidget::SetupShortcuts()
{
// Actions with shortcuts are created instead of direct shortcuts because the shortcut dispatcher only looks for matching actions
diff --git a/Gems/LyShine/Code/Editor/ViewportWidget.h b/Gems/LyShine/Code/Editor/ViewportWidget.h
index 4d15f3dea4..77f07d7f6e 100644
--- a/Gems/LyShine/Code/Editor/ViewportWidget.h
+++ b/Gems/LyShine/Code/Editor/ViewportWidget.h
@@ -54,8 +54,6 @@ public: // member functions
bool IsDrawingElementBorders(uint32 flags) const;
void ToggleDrawElementBorders(uint32 flags);
- void UpdateViewportBackground();
-
void ActiveCanvasChanged();
void EntityContextChanged();
@@ -154,6 +152,9 @@ private: // member functions
//! Render the viewport when in preview mode
void RenderPreviewMode(float deltaTime);
+ //! Fill the entire viewport area with a background color
+ void RenderViewportBackground();
+
//! Create shortcuts for manipulating the viewport
void SetupShortcuts();
diff --git a/Gems/LyShine/Code/Include/LyShine/Draw2d.h b/Gems/LyShine/Code/Include/LyShine/Draw2d.h
index df61542e25..8270461e73 100644
--- a/Gems/LyShine/Code/Include/LyShine/Draw2d.h
+++ b/Gems/LyShine/Code/Include/LyShine/Draw2d.h
@@ -131,16 +131,18 @@ public: // member functions
//! Draw a rectangular outline with a texture
//
- //! \param image The texture to be used for drawing the outline
- //! \param points The rect's vertices (top left, top right, bottom right, bottom left)
- //! \param rightVec Right vector. Specified because the rect's width/height could be 0
- //! \param downVec Down vector. Specified because the rect's width/height could be 0
- //! \param color The color of the outline
+ //! \param image The texture to be used for drawing the outline
+ //! \param points The rect's vertices (top left, top right, bottom right, bottom left)
+ //! \param rightVec Right vector. Specified because the rect's width/height could be 0
+ //! \param downVec Down vector. Specified because the rect's width/height could be 0
+ //! \param color The color of the outline
+ //! \param lineThickness The thickness in pixels of the outline. If 0, it will be based on image height
void DrawRectOutlineTextured(AZ::Data::Instance image,
UiTransformInterface::RectPoints points,
AZ::Vector2 rightVec,
AZ::Vector2 downVec,
- AZ::Color color);
+ AZ::Color color,
+ uint32_t lineThickness = 0);
//! Get the width and height (in pixels) that would be used to draw the given text string.
//
@@ -439,11 +441,12 @@ public: // member functions
UiTransformInterface::RectPoints points,
AZ::Vector2 rightVec,
AZ::Vector2 downVec,
- AZ::Color color)
+ AZ::Color color,
+ uint32_t lineThickness = 0)
{
if (m_draw2d)
{
- m_draw2d->DrawRectOutlineTextured(image, points, rightVec, downVec, color);
+ m_draw2d->DrawRectOutlineTextured(image, points, rightVec, downVec, color, lineThickness);
}
}
diff --git a/Gems/LyShine/Code/Source/Draw2d.cpp b/Gems/LyShine/Code/Source/Draw2d.cpp
index 308761ff4e..1a639ea299 100644
--- a/Gems/LyShine/Code/Source/Draw2d.cpp
+++ b/Gems/LyShine/Code/Source/Draw2d.cpp
@@ -309,7 +309,8 @@ void CDraw2d::DrawRectOutlineTextured(AZ::Data::Instance image,
UiTransformInterface::RectPoints points,
AZ::Vector2 rightVec,
AZ::Vector2 downVec,
- AZ::Color color)
+ AZ::Color color,
+ uint32_t lineThickness)
{
// since the rect can be transformed we have to add the offsets by multiplying them
// by unit vectors parallel with the edges of the rect. However, the rect could be
@@ -325,18 +326,22 @@ void CDraw2d::DrawRectOutlineTextured(AZ::Data::Instance image,
float rectWidth = widthVec.GetLength();
float rectHeight = heightVec.GetLength();
- // the outline thickness will be based on the texture height
- float textureHeight = image ? aznumeric_cast(image->GetDescriptor().m_size.m_height) : 0.0f;
- if (textureHeight <= 0.0f)
+ if (lineThickness == 0 && image)
{
- AZ_Assert(false, "Attempting to draw a textured rect outline with an image of zero height.");
- return; // avoiding possible divide by zero later
+ lineThickness = image->GetDescriptor().m_size.m_height;
+ }
+
+ if (lineThickness == 0)
+ {
+ AZ_Assert(false, "Attempting to draw a rect outline with of zero thickness.");
+ return;
}
// the outline is centered on the element rect so half the outline is outside
// the rect and half is inside the rect
- float outerOffset = -textureHeight * 0.5f;
- float innerOffset = textureHeight * 0.5f;
+ float offset = aznumeric_cast(lineThickness);
+ float outerOffset = -offset * 0.5f;
+ float innerOffset = offset * 0.5f;
float outerV = 0.0f;
float innerV = 1.0f;
@@ -348,7 +353,7 @@ void CDraw2d::DrawRectOutlineTextured(AZ::Data::Instance image,
{
float oldInnerOffset = innerOffset;
innerOffset = minDimension * 0.5f;
- // note oldInnerOffset can't be zero because of early return if textureHeight is zero
+ // note oldInnerOffset can't be zero because of early return if lineThickness is zero
innerV = 0.5f + 0.5f * innerOffset / oldInnerOffset;
}