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; }