Fix Editor crash in test teardown calling set_view_pane_layout
If Atom isn't initialized and able to produce a ViewportContext, the Editor would crash. This attempts to make the initialization fail a bit more gracefully and fixes the crash in the cases I've tested.
This commit is contained in:
@@ -1218,13 +1218,18 @@ void EditorViewportWidget::SetViewportId(int id)
|
||||
CViewport::SetViewportId(id);
|
||||
|
||||
// Now that we have an ID, we can initialize our viewport.
|
||||
m_renderViewport = new AtomToolsFramework::RenderViewportWidget(id, this);
|
||||
m_defaultViewportContextName = m_renderViewport->GetViewportContext()->GetName();
|
||||
m_renderViewport = new AtomToolsFramework::RenderViewportWidget(this, false);
|
||||
if (!m_renderViewport->InitializeViewportContext(id))
|
||||
{
|
||||
AZ_Warning("EditorViewportWidget", false, "Failed to initialize RenderViewportWidget's ViewportContext");
|
||||
return;
|
||||
}
|
||||
auto viewportContext = m_renderViewport->GetViewportContext();
|
||||
m_defaultViewportContextName = viewportContext->GetName();
|
||||
QBoxLayout* layout = new QBoxLayout(QBoxLayout::Direction::TopToBottom, this);
|
||||
layout->setContentsMargins(QMargins());
|
||||
layout->addWidget(m_renderViewport);
|
||||
|
||||
auto viewportContext = m_renderViewport->GetViewportContext();
|
||||
viewportContext->ConnectViewMatrixChangedHandler(m_cameraViewMatrixChangeHandler);
|
||||
viewportContext->ConnectProjectionMatrixChangedHandler(m_cameraProjectionMatrixChangeHandler);
|
||||
|
||||
|
||||
@@ -1234,7 +1234,6 @@ void MainWindow::InitActions()
|
||||
// View actions
|
||||
am->AddAction(ID_VIEW_OPENVIEWPANE, tr("Open View Pane"));
|
||||
am->AddAction(ID_VIEW_CONSOLEWINDOW, tr(LyViewPane::ConsoleMenuName))
|
||||
.SetShortcut(tr("^"))
|
||||
.SetReserved()
|
||||
.SetStatusTip(tr("Show or hide the console window"))
|
||||
.SetCheckable(true)
|
||||
|
||||
+8
-1
@@ -43,9 +43,16 @@ namespace AtomToolsFramework
|
||||
//! Creates a RenderViewportWidget.
|
||||
//! Requires the Atom RPI to be initialized in order
|
||||
//! to internally construct an RPI::ViewportContext.
|
||||
explicit RenderViewportWidget(AzFramework::ViewportId id = AzFramework::InvalidViewportId, QWidget* parent = nullptr);
|
||||
//! If initializeViewportContext is set to false, nothing will be displayed on-screen until InitiliazeViewportContext is called.
|
||||
explicit RenderViewportWidget(QWidget* parent = nullptr, bool shouldInitializeViewportContext = true);
|
||||
~RenderViewportWidget();
|
||||
|
||||
//! Initializes the underlying ViewportContext, if it hasn't already been.
|
||||
//! If id is specified, the target ViewportContext will be overridden.
|
||||
//! NOTE: ViewportContext IDs must be unique.
|
||||
//! Returns true if the ViewportContext is available
|
||||
//! (i.e. GetViewportContext will return a valid pointer).
|
||||
bool InitializeViewportContext(AzFramework::ViewportId id = AzFramework::InvalidViewportId);
|
||||
//! Gets the name associated with this viewport's ViewportContext.
|
||||
//! This context name can be used to adjust the current Camera
|
||||
//! independently of the underlying viewport.
|
||||
|
||||
@@ -31,12 +31,35 @@
|
||||
|
||||
namespace AtomToolsFramework
|
||||
{
|
||||
RenderViewportWidget::RenderViewportWidget(AzFramework::ViewportId id, QWidget* parent)
|
||||
RenderViewportWidget::RenderViewportWidget(QWidget* parent, bool shouldInitializeViewportContext)
|
||||
: QWidget(parent)
|
||||
, AzFramework::InputChannelEventListener(AzFramework::InputChannelEventListener::GetPriorityDefault())
|
||||
{
|
||||
if (shouldInitializeViewportContext)
|
||||
{
|
||||
InitializeViewportContext();
|
||||
}
|
||||
|
||||
setUpdatesEnabled(false);
|
||||
setFocusPolicy(Qt::FocusPolicy::WheelFocus);
|
||||
setMouseTracking(true);
|
||||
}
|
||||
|
||||
bool RenderViewportWidget::InitializeViewportContext(AzFramework::ViewportId id)
|
||||
{
|
||||
if (m_viewportContext != nullptr)
|
||||
{
|
||||
AZ_Assert(id == AzFramework::InvalidViewportId || m_viewportContext->GetId() == id, "Attempted to reinitialize RenderViewportWidget with a different ID");
|
||||
return true;
|
||||
}
|
||||
|
||||
auto viewportContextManager = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get();
|
||||
AZ_Assert(viewportContextManager, "Attempted to construct RenderViewportWidget without ViewportContextManager");
|
||||
AZ_Assert(viewportContextManager, "Attempted to initialize RenderViewportWidget without ViewportContextManager");
|
||||
|
||||
if (viewportContextManager == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Before we do anything else, we must create a ViewportContext which will give us a ViewportId if we didn't manually specify one.
|
||||
AZ::RPI::ViewportContextRequestsInterface::CreationParameters params;
|
||||
@@ -46,6 +69,11 @@ namespace AtomToolsFramework
|
||||
AzFramework::WindowRequestBus::Handler::BusConnect(params.windowHandle);
|
||||
m_viewportContext = viewportContextManager->CreateViewportContext(AZ::Name(), params);
|
||||
|
||||
if (m_viewportContext == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SetControllerList(AZStd::make_shared<AzFramework::ViewportControllerList>());
|
||||
|
||||
AZ::Name cameraName = AZ::Name(AZStd::string::format("Viewport %i Default Camera", m_viewportContext->GetId()));
|
||||
@@ -58,9 +86,7 @@ namespace AtomToolsFramework
|
||||
AZ::TickBus::Handler::BusConnect();
|
||||
AzFramework::WindowRequestBus::Handler::BusConnect(params.windowHandle);
|
||||
|
||||
setUpdatesEnabled(false);
|
||||
setFocusPolicy(Qt::FocusPolicy::WheelFocus);
|
||||
setMouseTracking(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
RenderViewportWidget::~RenderViewportWidget()
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace MaterialEditor
|
||||
{
|
||||
|
||||
MaterialViewportWidget::MaterialViewportWidget(QWidget* parent)
|
||||
: AtomToolsFramework::RenderViewportWidget(AzFramework::InvalidViewportId, parent)
|
||||
: AtomToolsFramework::RenderViewportWidget(parent)
|
||||
, m_ui(new Ui::MaterialViewportWidget)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
@@ -204,7 +204,7 @@ namespace
|
||||
} // anonymous namespace.
|
||||
|
||||
ViewportWidget::ViewportWidget(EditorWindow* parent)
|
||||
: AtomToolsFramework::RenderViewportWidget(AzFramework::InvalidViewportId, parent)
|
||||
: AtomToolsFramework::RenderViewportWidget(parent)
|
||||
, m_editorWindow(parent)
|
||||
, m_viewportInteraction(new ViewportInteraction(m_editorWindow))
|
||||
, m_viewportAnchor(new ViewportAnchor())
|
||||
|
||||
Reference in New Issue
Block a user