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:
nvsickle
2021-04-21 17:42:02 -07:00
parent 104262e048
commit fb2ca8e02c
6 changed files with 49 additions and 12 deletions
@@ -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);