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.
main
nvsickle 5 years ago
parent 104262e048
commit fb2ca8e02c

@ -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)

@ -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())

Loading…
Cancel
Save