Full screen game preview for Atom viewport

This commit is contained in:
Yuriy Toporovskyy
2021-06-14 10:02:49 -04:00
parent aee7fc72cc
commit 73d5617af3
7 changed files with 174 additions and 4 deletions
+5
View File
@@ -376,6 +376,11 @@ void CCryEditApp::RegisterActionHandlers()
ON_COMMAND(ID_EDIT_FETCH, OnEditFetch)
ON_COMMAND(ID_FILE_EXPORTTOGAMENOSURFACETEXTURE, OnFileExportToGameNoSurfaceTexture)
ON_COMMAND(ID_VIEW_SWITCHTOGAME, OnViewSwitchToGame)
MainWindow::instance()->GetActionManager()->RegisterActionHandler(ID_VIEW_SWITCHTOGAME_FULLSCREEN, [this]() {
auto fs = gEnv->pConsole->GetCVar("ed_previewGameInFullscreen_once");
fs->Set(1);
OnViewSwitchToGame();
});
ON_COMMAND(ID_MOVE_OBJECT, OnMoveObject)
ON_COMMAND(ID_RENAME_OBJ, OnRenameObj)
ON_COMMAND(ID_EDITMODE_MOVE, OnEditmodeMove)
@@ -82,6 +82,8 @@
#include "AnimationContext.h"
#include "Objects/SelectionGroup.h"
#include "Core/QtEditorApplication.h"
#include "MainWindow.h"
#include "LayoutWnd.h"
// ComponentEntityEditorPlugin
#include <Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.h>
@@ -694,6 +696,11 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event)
}
}
SetCurrentCursor(STD_CURSOR_GAME);
if (ShouldPreviewFullscreen())
{
StartFullscreenPreview();
}
}
if (m_renderViewport)
@@ -712,6 +719,11 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event)
m_bInOrbitMode = false;
m_bInZoomMode = false;
if (m_inFullscreenPreview)
{
StopFullscreenPreview();
}
RestoreViewportAfterGameMode();
}
@@ -1368,11 +1380,30 @@ void EditorViewportWidget::SetViewportId(int id)
{
CViewport::SetViewportId(id);
// First delete any existing layout
// This also deletes any existing render viewport widget (since it will be added to the layout
if (QLayout* l = layout())
{
QLayoutItem* item;
while ((item = l->takeAt(0)) != 0)
{
if (QWidget* w = item->widget())
{
delete w;
}
l->removeItem(item);
delete item;
}
delete l;
}
// Now that we have an ID, we can initialize our viewport.
m_renderViewport = new AtomToolsFramework::RenderViewportWidget(this, false);
if (!m_renderViewport->InitializeViewportContext(id))
{
AZ_Warning("EditorViewportWidget", false, "Failed to initialize RenderViewportWidget's ViewportContext");
delete m_renderViewport;
m_renderViewport = nullptr;
return;
}
auto viewportContext = m_renderViewport->GetViewportContext();
@@ -3027,4 +3058,117 @@ float EditorViewportSettings::AngleStep() const
return SandboxEditor::AngleSnappingSize();
}
bool EditorViewportWidget::ShouldPreviewFullscreen()
{
CLayoutWnd* layout = GetIEditor()->GetViewManager()->GetLayout();
if (!layout)
{
AZ_Assert(false, "CRenderViewport: No View Manager layout");
return false;
}
// Doesn't work with split layout (TODO: figure out why and make it work)
if (layout->GetLayout() != EViewLayout::ET_Layout0) { return false; }
// Not supported in VR
if (gSettings.bEnableGameModeVR) { return false; }
// If level not loaded, don't preview in fullscreen (preview shouldn't work at all without a level, but it does)
if (auto ge = GetIEditor()->GetGameEngine())
{
if (!ge->IsLevelLoaded()) { return false; }
}
// Check 'ed_previewGameInFullscreen_once' and 'ed_previewGameInFullscreen' cvars
if (gEnv->pConsole)
{
if (auto v = gEnv->pConsole->GetCVar("ed_previewGameInFullscreen_once"))
{
if (v->GetIVal() != 0)
{
v->Set(0);
return true;
}
}
{
auto v = gEnv->pConsole->GetCVar("ed_previewGameInFullscreen");
return v && v->GetIVal() != 0; // if it doesn't exist, assume its value is 0
}
return true;
}
else
{
return false;
}
}
void EditorViewportWidget::StartFullscreenPreview()
{
AZ_Assert(!m_inFullscreenPreview, AZ_FUNCTION_SIGNATURE " - called when already in full screen preview");
m_inFullscreenPreview = true;
QScreen* screen = QGuiApplication::primaryScreen();
QRect screenGeometry = screen->geometry();
// Unparent this and show it, which turns it into a free floating window
// Also set style to frameless and disable resizing by user
setParent(nullptr);
setWindowFlag(Qt::FramelessWindowHint, true);
setWindowFlag(Qt::MSWindowsFixedSizeDialogHint, true);
setFixedSize(screenGeometry.size());
move(QPoint(screenGeometry.x(), screenGeometry.y()));
showMaximized();
// Hide the main window
MainWindow::instance()->hide();
}
void EditorViewportWidget::StopFullscreenPreview()
{
AZ_Assert(m_inFullscreenPreview, AZ_FUNCTION_SIGNATURE " - called when not in full screen preview");
m_inFullscreenPreview = false;
// Unset frameless window flags
setWindowFlag(Qt::FramelessWindowHint, false);
setWindowFlag(Qt::MSWindowsFixedSizeDialogHint, false);
// Unset fixed size (note that 50x50 is the minimum set in the constructor)
setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
setMinimumSize(50, 50);
// Attach this viewport to the primary view pane (whose index is 0).
if (CLayoutWnd* layout = GetIEditor()->GetViewManager()->GetLayout())
{
if (CLayoutViewPane* viewPane = layout->GetViewPaneByIndex(0))
{
// Force-reattach this viewport to its view pane by first detaching
viewPane->DetachViewport();
viewPane->AttachViewport(this);
// Set the main widget of the layout, which causes this widgets size to be bound to the layout
// and the viewport title bar to be displayed
layout->SetMainWidget(viewPane);
}
else
{
AZ_Assert(false, "CRenderViewport: No view pane with ID 0 (primary view pane)");
}
}
else
{
AZ_Assert(false, "CRenderViewport: No View Manager layout");
}
// Set this as the selected viewport
GetIEditor()->GetViewManager()->SelectViewport(this);
// Show this widget (setting flags may hide it)
showNormal();
// Show the main window
MainWindow::instance()->show();
}
#include <moc_EditorViewportWidget.cpp>
@@ -385,6 +385,11 @@ protected:
};
void ResetToViewSourceType(const ViewSourceType& viewSourType);
bool ShouldPreviewFullscreen();
void StartFullscreenPreview();
void StopFullscreenPreview();
bool m_inFullscreenPreview = false;
bool m_bRenderContextCreated = false;
bool m_bInRotateMode = false;
bool m_bInMoveMode = false;
+12 -4
View File
@@ -949,6 +949,12 @@ void MainWindow::InitActions()
.SetApplyHoverEffect()
.SetCheckable(true)
.RegisterUpdateCallback(cryEdit, &CCryEditApp::OnUpdatePlayGame);
am->AddAction(ID_VIEW_SWITCHTOGAME_FULLSCREEN, tr("Play &Game (Maximized)"))
.SetShortcut(tr("Ctrl+Shift+G"))
.SetStatusTip(tr("Activate the game input mode (maximized)"))
.SetIcon(Style::icon("Play"))
.SetApplyHoverEffect()
.SetCheckable(true);
am->AddAction(ID_TOOLBAR_WIDGET_PLAYCONSOLE_LABEL, tr("Play Controls"))
.SetText(tr("Play Controls"));
am->AddAction(ID_SWITCH_PHYSICS, tr("Simulate"))
@@ -1266,10 +1272,12 @@ void MainWindow::OnGameModeChanged(bool inGameMode)
{
menuBar()->setDisabled(inGameMode);
m_toolbarManager->SetEnabled(!inGameMode);
QAction* action = m_actionManager->GetAction(ID_VIEW_SWITCHTOGAME);
action->blockSignals(true); // avoid a loop
action->setChecked(inGameMode);
action->blockSignals(false);
// avoid a loop
AZStd::vector<QAction*> actions = { m_actionManager->GetAction(ID_VIEW_SWITCHTOGAME), m_actionManager->GetAction(ID_VIEW_SWITCHTOGAME_FULLSCREEN) };
for (auto action : actions) action->blockSignals(true);
for (auto action : actions) action->setChecked(inGameMode);
for (auto action : actions) action->blockSignals(false);
}
void MainWindow::OnEditorNotifyEvent(EEditorNotifyEvent ev)
+1
View File
@@ -111,6 +111,7 @@
#define ID_EDIT_FETCH 33465
#define ID_FILE_EXPORTTOGAMENOSURFACETEXTURE 33473
#define ID_VIEW_SWITCHTOGAME 33477
#define ID_VIEW_SWITCHTOGAME_FULLSCREEN 33478
#define ID_EDIT_DELETE 33480
#define ID_MOVE_OBJECT 33481
#define ID_RENAME_OBJ 33483
+6
View File
@@ -947,6 +947,12 @@ void SEditorSettings::PostInitApply()
REGISTER_CVAR2_CB("ed_keepEditorActive", &keepEditorActive, 0, VF_NULL, "Keep the editor active, even if no focus is set", KeepEditorActiveChanged);
REGISTER_CVAR2("g_TemporaryLevelName", &g_TemporaryLevelName, "temp_level", VF_NULL, "Temporary level named used for experimental levels.");
REGISTER_INT("ed_previewGameInFullscreen", 0, VF_DEV_ONLY, "Preview the game (Ctrl+G, \"Play Game\", etc.) in fullscreen. 0 = no, 1 = yes");
gEnv->pConsole->GetCVar("ed_previewGameInFullscreen")->SetLimits(0, 1);
REGISTER_INT("ed_previewGameInFullscreen_once", 0, VF_DEV_ONLY | VF_INVISIBLE, "Preview the game (Ctrl+G, \"Play Game\", etc.) in fullscreen once. 0 = no, 1 = yes");
gEnv->pConsole->GetCVar("ed_previewGameInFullscreen_once")->SetLimits(0, 1);
CCryEditApp::instance()->KeepEditorActive(keepEditorActive > 0);
}
+1
View File
@@ -603,6 +603,7 @@ AmazonToolbar ToolbarManager::GetPlayConsoleToolbar() const
t.AddAction(ID_TOOLBAR_SEPARATOR, ORIGINAL_TOOLBAR_VERSION);
t.AddAction(ID_TOOLBAR_WIDGET_PLAYCONSOLE_LABEL, ORIGINAL_TOOLBAR_VERSION);
t.AddAction(ID_VIEW_SWITCHTOGAME, TOOLBARS_WITH_PLAY_GAME);
t.AddAction(ID_VIEW_SWITCHTOGAME_FULLSCREEN, TOOLBARS_WITH_PLAY_GAME);
t.AddAction(ID_TOOLBAR_SEPARATOR, ORIGINAL_TOOLBAR_VERSION);
t.AddAction(ID_SWITCH_PHYSICS, TOOLBARS_WITH_PLAY_GAME);
return t;