|
@@ -38,6 +38,7 @@
|
|
|
|
|
|
#include <Atom/RPI.Public/Scene.h>
|
|
#include <Atom/RPI.Public/Scene.h>
|
|
#include <Atom/RPI.Public/RenderPipeline.h>
|
|
#include <Atom/RPI.Public/RenderPipeline.h>
|
|
|
|
+#include <Atom/RPI.Public/Image/ImageSystemInterface.h>
|
|
|
|
|
|
#define UICANVASEDITOR_SETTINGS_VIEWPORTWIDGET_DRAW_ELEMENT_BORDERS_KEY "ViewportWidget::m_drawElementBordersFlags"
|
|
#define UICANVASEDITOR_SETTINGS_VIEWPORTWIDGET_DRAW_ELEMENT_BORDERS_KEY "ViewportWidget::m_drawElementBordersFlags"
|
|
#define UICANVASEDITOR_SETTINGS_VIEWPORTWIDGET_DRAW_ELEMENT_BORDERS_DEFAULT ( ViewportWidget::DrawElementBorders_Unselected )
|
|
#define UICANVASEDITOR_SETTINGS_VIEWPORTWIDGET_DRAW_ELEMENT_BORDERS_DEFAULT ( ViewportWidget::DrawElementBorders_Unselected )
|
|
@@ -220,8 +221,6 @@ ViewportWidget::ViewportWidget(EditorWindow* parent)
|
|
{
|
|
{
|
|
setAcceptDrops(true);
|
|
setAcceptDrops(true);
|
|
|
|
|
|
- UpdateViewportBackground();
|
|
|
|
-
|
|
|
|
InitUiRenderer();
|
|
InitUiRenderer();
|
|
|
|
|
|
SetupShortcuts();
|
|
SetupShortcuts();
|
|
@@ -299,19 +298,6 @@ void ViewportWidget::ToggleDrawElementBorders(uint32 flags)
|
|
SetDrawElementBordersFlags(m_drawElementBordersFlags);
|
|
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()
|
|
void ViewportWidget::ActiveCanvasChanged()
|
|
{
|
|
{
|
|
bool canvasLoaded = m_editorWindow->GetCanvas().IsValid();
|
|
bool canvasLoaded = m_editorWindow->GetCanvas().IsValid();
|
|
@@ -519,6 +505,9 @@ void ViewportWidget::OnTick(float deltaTime, [[maybe_unused]] AZ::ScriptTimePoin
|
|
gEnv->pRenderer->SetSrgbWrite(true);
|
|
gEnv->pRenderer->SetSrgbWrite(true);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+ const float dpiScale = QtHelpers::GetHighDpiScaleFactor(*this);
|
|
|
|
+ ViewportIcon::SetDpiScaleFactor(dpiScale);
|
|
|
|
+
|
|
// Set up to render a frame to this viewport's window
|
|
// Set up to render a frame to this viewport's window
|
|
GetViewportContext()->RenderTick();
|
|
GetViewportContext()->RenderTick();
|
|
|
|
|
|
@@ -554,7 +543,9 @@ void ViewportWidget::RefreshTick()
|
|
void ViewportWidget::mousePressEvent(QMouseEvent* ev)
|
|
void ViewportWidget::mousePressEvent(QMouseEvent* ev)
|
|
{
|
|
{
|
|
UiEditorMode editorMode = m_editorWindow->GetEditorMode();
|
|
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)
|
|
if (editorMode == UiEditorMode::Edit)
|
|
{
|
|
{
|
|
// in Edit mode just send input to ViewportInteraction
|
|
// in Edit mode just send input to ViewportInteraction
|
|
@@ -569,8 +560,7 @@ void ViewportWidget::mousePressEvent(QMouseEvent* ev)
|
|
if (ev->button() == Qt::LeftButton)
|
|
if (ev->button() == Qt::LeftButton)
|
|
{
|
|
{
|
|
// Send event to this canvas
|
|
// Send event to this canvas
|
|
- QPointF scaledPos = WidgetToViewport(ev->localPos());
|
|
|
|
- const AZ::Vector2 viewportPosition(aznumeric_cast<float>(scaledPos.x()), aznumeric_cast<float>(scaledPos.y()));
|
|
|
|
|
|
+ const AZ::Vector2 viewportPosition(aznumeric_cast<float>(scaledPosition.x()), aznumeric_cast<float>(scaledPosition.y()));
|
|
const AzFramework::InputChannel::Snapshot inputSnapshot(AzFramework::InputDeviceMouse::Button::Left,
|
|
const AzFramework::InputChannel::Snapshot inputSnapshot(AzFramework::InputDeviceMouse::Button::Left,
|
|
AzFramework::InputDeviceMouse::Id,
|
|
AzFramework::InputDeviceMouse::Id,
|
|
AzFramework::InputChannel::State::Began);
|
|
AzFramework::InputChannel::State::Began);
|
|
@@ -588,7 +578,9 @@ void ViewportWidget::mousePressEvent(QMouseEvent* ev)
|
|
void ViewportWidget::mouseMoveEvent(QMouseEvent* ev)
|
|
void ViewportWidget::mouseMoveEvent(QMouseEvent* ev)
|
|
{
|
|
{
|
|
UiEditorMode editorMode = m_editorWindow->GetEditorMode();
|
|
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)
|
|
if (editorMode == UiEditorMode::Edit)
|
|
{
|
|
{
|
|
@@ -596,7 +588,8 @@ void ViewportWidget::mouseMoveEvent(QMouseEvent* ev)
|
|
m_viewportInteraction->MouseMoveEvent(&scaledEvent,
|
|
m_viewportInteraction->MouseMoveEvent(&scaledEvent,
|
|
m_editorWindow->GetHierarchy()->selectedItems());
|
|
m_editorWindow->GetHierarchy()->selectedItems());
|
|
|
|
|
|
- SetRulerCursorPositions(ev->globalPos());
|
|
|
|
|
|
+ QPointF screenPosition = WidgetToViewport(ev->screenPos());
|
|
|
|
+ SetRulerCursorPositions(screenPosition.toPoint());
|
|
}
|
|
}
|
|
else // if (editorMode == UiEditorMode::Preview)
|
|
else // if (editorMode == UiEditorMode::Preview)
|
|
{
|
|
{
|
|
@@ -604,8 +597,7 @@ void ViewportWidget::mouseMoveEvent(QMouseEvent* ev)
|
|
AZ::EntityId canvasEntityId = m_editorWindow->GetPreviewModeCanvas();
|
|
AZ::EntityId canvasEntityId = m_editorWindow->GetPreviewModeCanvas();
|
|
if (canvasEntityId.IsValid())
|
|
if (canvasEntityId.IsValid())
|
|
{
|
|
{
|
|
- QPointF scaledPos = WidgetToViewport(ev->localPos());
|
|
|
|
- const AZ::Vector2 viewportPosition(aznumeric_cast<float>(scaledPos.x()), aznumeric_cast<float>(scaledPos.y()));
|
|
|
|
|
|
+ const AZ::Vector2 viewportPosition(aznumeric_cast<float>(scaledPosition.x()), aznumeric_cast<float>(scaledPosition.y()));
|
|
const AzFramework::InputChannelId& channelId = (ev->buttons() & Qt::LeftButton) ?
|
|
const AzFramework::InputChannelId& channelId = (ev->buttons() & Qt::LeftButton) ?
|
|
AzFramework::InputDeviceMouse::Button::Left :
|
|
AzFramework::InputDeviceMouse::Button::Left :
|
|
AzFramework::InputDeviceMouse::SystemCursorPosition;
|
|
AzFramework::InputDeviceMouse::SystemCursorPosition;
|
|
@@ -625,7 +617,9 @@ void ViewportWidget::mouseMoveEvent(QMouseEvent* ev)
|
|
void ViewportWidget::mouseReleaseEvent(QMouseEvent* ev)
|
|
void ViewportWidget::mouseReleaseEvent(QMouseEvent* ev)
|
|
{
|
|
{
|
|
UiEditorMode editorMode = m_editorWindow->GetEditorMode();
|
|
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)
|
|
if (editorMode == UiEditorMode::Edit)
|
|
{
|
|
{
|
|
// in Edit mode just send input to ViewportInteraction
|
|
// in Edit mode just send input to ViewportInteraction
|
|
@@ -641,8 +635,7 @@ void ViewportWidget::mouseReleaseEvent(QMouseEvent* ev)
|
|
if (ev->button() == Qt::LeftButton)
|
|
if (ev->button() == Qt::LeftButton)
|
|
{
|
|
{
|
|
// Send event to this canvas
|
|
// Send event to this canvas
|
|
- QPointF scaledPos = WidgetToViewport(ev->localPos());
|
|
|
|
- const AZ::Vector2 viewportPosition(aznumeric_cast<float>(scaledPos.x()), aznumeric_cast<float>(scaledPos.y()));
|
|
|
|
|
|
+ const AZ::Vector2 viewportPosition(aznumeric_cast<float>(scaledPosition.x()), aznumeric_cast<float>(scaledPosition.y()));
|
|
const AzFramework::InputChannel::Snapshot inputSnapshot(AzFramework::InputDeviceMouse::Button::Left,
|
|
const AzFramework::InputChannel::Snapshot inputSnapshot(AzFramework::InputDeviceMouse::Button::Left,
|
|
AzFramework::InputDeviceMouse::Id,
|
|
AzFramework::InputDeviceMouse::Id,
|
|
AzFramework::InputChannel::State::Ended);
|
|
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;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -931,14 +924,16 @@ void ViewportWidget::RenderEditMode(float deltaTime)
|
|
EBUS_EVENT_ID_RESULT(canvasSize, canvasEntityId, UiCanvasBus, GetCanvasSize);
|
|
EBUS_EVENT_ID_RESULT(canvasSize, canvasEntityId, UiCanvasBus, GetCanvasSize);
|
|
|
|
|
|
m_draw2d->SetSortKey(backgroundKey);
|
|
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,
|
|
m_viewportBackground->Draw(draw2d,
|
|
canvasSize,
|
|
canvasSize,
|
|
m_viewportInteraction->GetCanvasToViewportScale(),
|
|
m_viewportInteraction->GetCanvasToViewportScale(),
|
|
m_viewportInteraction->GetCanvasToViewportTranslation());
|
|
m_viewportInteraction->GetCanvasToViewportTranslation());
|
|
|
|
|
|
- AZ::Vector2 viewportSize(aznumeric_cast<float>(size().width()), aznumeric_cast<float>(size().height()));
|
|
|
|
- viewportSize *= QHighDpiScaling::factor(windowHandle()->screen());
|
|
|
|
-
|
|
|
|
#ifdef LYSHINE_ATOM_TODO
|
|
#ifdef LYSHINE_ATOM_TODO
|
|
// clear the stencil buffer before rendering each canvas - required for masking
|
|
// 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
|
|
// 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);
|
|
EBUS_EVENT_ID(canvasEntityId, UiEditorCanvasBus, UpdateCanvasInEditorViewport, deltaTime, false);
|
|
|
|
|
|
// Render this canvas
|
|
// Render this canvas
|
|
|
|
+ QSize scaledViewportSize = QtHelpers::GetDpiScaledViewportSize(*this);
|
|
|
|
+ AZ::Vector2 viewportSize(scaledViewportSize.width(), scaledViewportSize.height());
|
|
EBUS_EVENT_ID(canvasEntityId, UiEditorCanvasBus, RenderCanvasInEditorViewport, false, viewportSize);
|
|
EBUS_EVENT_ID(canvasEntityId, UiEditorCanvasBus, RenderCanvasInEditorViewport, false, viewportSize);
|
|
|
|
|
|
m_draw2d->SetSortKey(topLayerKey);
|
|
m_draw2d->SetSortKey(topLayerKey);
|
|
@@ -1050,6 +1047,9 @@ void ViewportWidget::RenderEditMode(float deltaTime)
|
|
|
|
|
|
void ViewportWidget::RenderPreviewMode(float deltaTime)
|
|
void ViewportWidget::RenderPreviewMode(float deltaTime)
|
|
{
|
|
{
|
|
|
|
+ // sort keys for different layers
|
|
|
|
+ static const int64_t backgroundKey = -0x1000;
|
|
|
|
+
|
|
AZ::EntityId canvasEntityId = m_editorWindow->GetPreviewModeCanvas();
|
|
AZ::EntityId canvasEntityId = m_editorWindow->GetPreviewModeCanvas();
|
|
|
|
|
|
if (m_fontTextureHasChanged)
|
|
if (m_fontTextureHasChanged)
|
|
@@ -1072,10 +1072,10 @@ void ViewportWidget::RenderPreviewMode(float deltaTime)
|
|
|
|
|
|
if (canvasEntityId.IsValid())
|
|
if (canvasEntityId.IsValid())
|
|
{
|
|
{
|
|
- // Get the canvas size
|
|
|
|
- AZ::Vector2 viewportSize(aznumeric_cast<float>(size().width()), aznumeric_cast<float>(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();
|
|
AZ::Vector2 canvasSize = m_editorWindow->GetPreviewCanvasSize();
|
|
if (canvasSize.GetX() == 0.0f && canvasSize.GetY() == 0.0f)
|
|
if (canvasSize.GetX() == 0.0f && canvasSize.GetY() == 0.0f)
|
|
{
|
|
{
|
|
@@ -1139,7 +1139,7 @@ void ViewportWidget::RenderPreviewMode(float deltaTime)
|
|
canvasToViewportMatrix.SetTranslation(translation);
|
|
canvasToViewportMatrix.SetTranslation(translation);
|
|
EBUS_EVENT_ID(canvasEntityId, UiCanvasBus, SetCanvasToViewportMatrix, canvasToViewportMatrix);
|
|
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
|
|
// 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
|
|
// 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
|
|
// 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);
|
|
gEnv->pRenderer->ClearTargetsImmediately(FRT_CLEAR, viewportBackgroundColor);
|
|
#endif
|
|
#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
|
|
// 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
|
|
// not exactly the same as the viewport size
|
|
AZ::Vector2 topLeftInViewportSpace = CanvasHelpers::GetViewportPoint(canvasEntityId, AZ::Vector2(0.0f, 0.0f));
|
|
AZ::Vector2 topLeftInViewportSpace = CanvasHelpers::GetViewportPoint(canvasEntityId, AZ::Vector2(0.0f, 0.0f));
|
|
AZ::Vector2 bottomRightInViewportSpace = CanvasHelpers::GetViewportPoint(canvasEntityId, canvasSize);
|
|
AZ::Vector2 bottomRightInViewportSpace = CanvasHelpers::GetViewportPoint(canvasEntityId, canvasSize);
|
|
AZ::Vector2 sizeInViewportSpace = bottomRightInViewportSpace - topLeftInViewportSpace;
|
|
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
|
|
// Render this canvas
|
|
// NOTE: the displayBounds param is always false. If we wanted a debug option to display the bounds
|
|
// 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<AZ::RPI::Image>& 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()
|
|
void ViewportWidget::SetupShortcuts()
|
|
{
|
|
{
|
|
// Actions with shortcuts are created instead of direct shortcuts because the shortcut dispatcher only looks for matching actions
|
|
// Actions with shortcuts are created instead of direct shortcuts because the shortcut dispatcher only looks for matching actions
|