void FSceneViewport::ResizeFrame(uint32 NewSizeX, uint32 NewSizeY, EWindowMode::Type NewWindowMode, int32 InPosX, int32 InPosY) { // Resizing the window directly is only supported in the game if( FApp::IsGame() && NewSizeX > 0 && NewSizeY > 0 ) { FWidgetPath WidgetPath; TSharedPtr<SWindow> WindowToResize = FSlateApplication::Get().FindWidgetWindow( ViewportWidget.Pin().ToSharedRef(), WidgetPath ); if( WindowToResize.IsValid() ) { int32 CVarValue = GetBoundFullScreenModeCVar(); EWindowMode::Type DesiredWindowMode = GetWindowModeType(NewWindowMode); // Avoid resizing if nothing changes. bool bNeedsResize = SizeX != NewSizeX || SizeY != NewSizeY || NewWindowMode != DesiredWindowMode || DesiredWindowMode != WindowToResize->GetWindowMode(); if (bNeedsResize) { if (GEngine->HMDDevice.IsValid() && GEngine->HMDDevice->IsHMDEnabled()) { // Resize & move only if moving to a fullscreen mode if (NewWindowMode != EWindowMode::Windowed) { FSlateRect PreFullScreenRect = WindowToResize->GetRectInScreen(); IHeadMountedDisplay::MonitorInfo MonitorInfo; if (GEngine->HMDDevice->GetHMDMonitorInfo(MonitorInfo)) { NewSizeX = MonitorInfo.ResolutionX; NewSizeY = MonitorInfo.ResolutionY; if (GEngine->HMDDevice->IsFullScreenAllowed()) { WindowToResize->ReshapeWindow(FVector2D(MonitorInfo.DesktopX, MonitorInfo.DesktopY), FVector2D(MonitorInfo.ResolutionX, MonitorInfo.ResolutionY)); } else { WindowToResize->Resize(FVector2D(MonitorInfo.ResolutionX, MonitorInfo.ResolutionY)); DesiredWindowMode = EWindowMode::WindowedMirror; } } GEngine->HMDDevice->PushPreFullScreenRect(PreFullScreenRect); } } // Toggle fullscreen and resize WindowToResize->SetWindowMode(DesiredWindowMode); if (GEngine->HMDDevice.IsValid() && GEngine->HMDDevice->IsHMDEnabled()) { if (NewWindowMode == EWindowMode::Windowed) { FSlateRect PreFullScreenRect; GEngine->HMDDevice->PopPreFullScreenRect(PreFullScreenRect); if (PreFullScreenRect.GetSize().X > 0 && PreFullScreenRect.GetSize().Y > 0 && GEngine->HMDDevice->IsFullScreenAllowed()) { NewSizeX = PreFullScreenRect.GetSize().X; NewSizeY = PreFullScreenRect.GetSize().Y; WindowToResize->MoveWindowTo (FVector2D(PreFullScreenRect.Left, PreFullScreenRect.Top)); } } if (NewWindowMode != WindowMode) { // Only notify the HMD if we've actually changed modes GEngine->HMDDevice->OnScreenModeChange(NewWindowMode); } } LockMouseToViewport(!CurrentReplyState.ShouldReleaseMouseLock()); int32 NewWindowSizeX = NewSizeX; int32 NewWindowSizeY = NewSizeY; WindowToResize->Resize( FVector2D(NewWindowSizeX, NewWindowSizeY) ); ResizeViewport(NewWindowSizeX, NewWindowSizeY, NewWindowMode, InPosX, InPosY); } UCanvas::UpdateAllCanvasSafeZoneData(); } } }
void FSceneViewport::ResizeFrame(uint32 NewSizeX, uint32 NewSizeY, EWindowMode::Type NewWindowMode, int32 InPosX, int32 InPosY) { // Resizing the window directly is only supported in the game if( FApp::IsGame() && NewSizeX > 0 && NewSizeY > 0 ) { FWidgetPath WidgetPath; TSharedPtr<SWindow> WindowToResize = FSlateApplication::Get().FindWidgetWindow( ViewportWidget.Pin().ToSharedRef(), WidgetPath ); if( WindowToResize.IsValid() ) { EWindowMode::Type DesiredWindowMode = GetWindowModeType(NewWindowMode); // If we're going into windowed fullscreen mode, we always want the window to fill the entire screen. // When we calculate the scene view, we'll check the fullscreen mode and configure the screen percentage // scaling so we actual render to the resolution we've been asked for. if (DesiredWindowMode == EWindowMode::WindowedFullscreen) { FDisplayMetrics DisplayMetrics; FSlateApplication::Get().GetInitialDisplayMetrics(DisplayMetrics); NewSizeX = DisplayMetrics.PrimaryDisplayWidth;; NewSizeY = DisplayMetrics.PrimaryDisplayHeight;; } uint32 ViewportSizeX = NewSizeX; uint32 ViewportSizeY = NewSizeY; if (GEngine->HMDDevice.IsValid() && GEngine->HMDDevice->IsHMDConnected()) { WindowToResize->SetViewportSizeDrivenByWindow(true); // Resize & move only if moving to a fullscreen mode if (NewWindowMode != EWindowMode::Windowed) { IHeadMountedDisplay::MonitorInfo MonitorInfo; if (GEngine->HMDDevice->GetHMDMonitorInfo(MonitorInfo)) { ViewportSizeX = MonitorInfo.ResolutionX; ViewportSizeY = MonitorInfo.ResolutionY; if (GEngine->HMDDevice->IsFullscreenAllowed()) { NewSizeX = MonitorInfo.ResolutionX; NewSizeY = MonitorInfo.ResolutionY; } else { if (MonitorInfo.WindowSizeX != 0 && MonitorInfo.WindowSizeY != 0) { NewSizeX = MonitorInfo.WindowSizeX; NewSizeY = MonitorInfo.WindowSizeY; } NewWindowMode = DesiredWindowMode = EWindowMode::WindowedMirror; WindowToResize->SetIndependentViewportSize(FVector2D(ViewportSizeX, ViewportSizeY)); } } } } // Avoid resizing if nothing changes. bool bNeedsResize = SizeX != ViewportSizeX || SizeY != ViewportSizeY || NewWindowMode != DesiredWindowMode || DesiredWindowMode != WindowToResize->GetWindowMode(); if (bNeedsResize) { if (GEngine->HMDDevice.IsValid() && GEngine->HMDDevice->IsHMDConnected()) { // Resize & move only if moving to a fullscreen mode if (NewWindowMode != EWindowMode::Windowed) { FSlateRect PreFullScreenRect = WindowToResize->GetRectInScreen(); IHeadMountedDisplay::MonitorInfo MonitorInfo; if (GEngine->HMDDevice->GetHMDMonitorInfo(MonitorInfo)) { if (GEngine->HMDDevice->IsFullscreenAllowed()) { WindowToResize->ReshapeWindow(FVector2D(MonitorInfo.DesktopX, MonitorInfo.DesktopY), FVector2D(MonitorInfo.ResolutionX, MonitorInfo.ResolutionY)); } } GEngine->HMDDevice->PushPreFullScreenRect(PreFullScreenRect); } } // Toggle fullscreen and resize WindowToResize->SetWindowMode(DesiredWindowMode); if (GEngine->HMDDevice.IsValid() && GEngine->HMDDevice->IsHMDEnabled()) { if (NewWindowMode == EWindowMode::Windowed) { FSlateRect PreFullScreenRect; GEngine->HMDDevice->PopPreFullScreenRect(PreFullScreenRect); if (PreFullScreenRect.GetSize().X > 0 && PreFullScreenRect.GetSize().Y > 0 && GEngine->HMDDevice->IsFullscreenAllowed()) { NewSizeX = PreFullScreenRect.GetSize().X; NewSizeY = PreFullScreenRect.GetSize().Y; WindowToResize->MoveWindowTo(FVector2D(PreFullScreenRect.Left, PreFullScreenRect.Top)); } ViewportSizeX = NewSizeX; ViewportSizeY = NewSizeY; WindowToResize->SetViewportSizeDrivenByWindow(true); } if (NewWindowMode != WindowMode) { // Only notify the HMD if we've actually changed modes GEngine->HMDDevice->OnScreenModeChange(NewWindowMode); } } LockMouseToViewport(!CurrentReplyState.ShouldReleaseMouseLock()); WindowToResize->Resize(FVector2D(NewSizeX, NewSizeY)); ResizeViewport(ViewportSizeX, ViewportSizeY, NewWindowMode, InPosX, InPosY); } UCanvas::UpdateAllCanvasSafeZoneData(); } } }