Full screen game preview for Atom viewport
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user