Skip to content

Commit b541886

Browse files
solwllmsscomitch
authored andcommitted
Multi-viewport in play mode (#3534)
1 parent b2b48ae commit b541886

3 files changed

Lines changed: 67 additions & 35 deletions

File tree

game/addons/tools/Code/Scene/SceneView/SceneViewWidget.Game.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ public void OnScenePlay()
2020
if ( !Session.IsPlaying ) return;
2121
CurrentView = ViewMode.Game;
2222

23-
OnViewModeChanged();
24-
2523
_gameViewport = _viewports.FirstOrDefault().Value;
26-
_gameViewport.StartPlay();
24+
_gameViewport.SetGameView();
25+
26+
OnViewModeChanged();
2727
_viewportTools.UpdateViewportFromCookie();
2828
}
2929

@@ -33,7 +33,7 @@ public void OnSceneStop()
3333
if ( !_gameViewport.IsValid() ) return;
3434
CurrentView = ViewMode.Scene;
3535

36-
_gameViewport.StopPlay();
36+
_gameViewport.ClearGameView();
3737
_gameViewport = null;
3838

3939
OnViewModeChanged();
@@ -47,11 +47,11 @@ public void ToggleEject()
4747

4848
if ( CurrentView == ViewMode.Game )
4949
{
50-
_gameViewport.PossesGameCamera();
50+
_gameViewport.OnPossessGame();
5151
}
5252
else if ( CurrentView == ViewMode.GameEjected )
5353
{
54-
_gameViewport.EjectGameCamera();
54+
_gameViewport.OnEject();
5555
}
5656

5757
OnViewModeChanged();
@@ -72,7 +72,7 @@ void OnViewModeChanged()
7272

7373
foreach ( var viewport in _viewports.Values )
7474
{
75-
viewport.GizmoInstance.Selection = Session.Selection;
75+
viewport.OnViewModeChanged( CurrentView );
7676
}
7777
}
7878

game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.Game.cs

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,67 @@
22

33
public partial class SceneViewportWidget
44
{
5-
public void StartPlay()
5+
/// <summary>
6+
/// Is this viewport the game view?
7+
/// </summary>
8+
public bool IsGameView { get; private set; }
9+
10+
/// <summary>
11+
/// Called when the SceneView's view mode changes.
12+
/// </summary>
13+
public void OnViewModeChanged( SceneViewWidget.ViewMode viewMode )
614
{
7-
Editor.GameMode.SetPlayWidget( Renderer );
815
Renderer.Scene = Session.Scene;
9-
Renderer.Camera = null;
10-
Renderer.EnableEngineOverlays = true;
11-
ViewportOptions.Visible = false;
16+
GizmoInstance.Selection = Session.Selection;
17+
18+
if ( _editorCamera.IsValid() && _editorCamera.Scene != Session.Scene )
19+
{
20+
// make sure the editor camera exists in the correct scene
21+
_editorCamera.DestroyGameObject();
22+
_editorCamera = Renderer.CreateSceneEditorCamera();
23+
}
24+
25+
_activeCamera = viewMode switch
26+
{
27+
SceneViewWidget.ViewMode.Game => null,
28+
SceneViewWidget.ViewMode.GameEjected => _ejectCamera,
29+
_ => _editorCamera,
30+
};
31+
32+
Renderer.Camera = _activeCamera;
33+
Renderer.EnableEngineOverlays = IsGameView;
34+
ViewportOptions.Visible = !IsGameView;
1235
}
1336

14-
public void StopPlay()
37+
/// <summary>
38+
/// Set this viewport as the game view.
39+
/// </summary>
40+
public void SetGameView()
1541
{
16-
Editor.GameMode.ClearPlayMode();
17-
Renderer.Scene = Session.Scene;
18-
_activeCamera = _editorCamera;
19-
Renderer.Camera = _activeCamera;
20-
Renderer.EnableEngineOverlays = false;
21-
ViewportOptions.Visible = true;
42+
GameMode.SetPlayWidget( Renderer );
43+
IsGameView = true;
44+
}
45+
46+
/// <summary>
47+
/// Clear this viewport as the game view.
48+
/// </summary>
49+
public void ClearGameView()
50+
{
51+
GameMode.ClearPlayMode();
52+
IsGameView = false;
53+
2254
SetDefaultSize();
2355
}
2456

25-
public void EjectGameCamera()
57+
/// <summary>
58+
/// Called when ejecting from the game state.
59+
/// </summary>
60+
public void OnEject()
2661
{
27-
Editor.GameMode.ClearPlayMode();
62+
GameMode.ClearPlayMode();
63+
IsGameView = false;
64+
65+
SetDefaultSize();
2866

2967
var gameCamera = Renderer.Scene.Camera;
3068
if ( gameCamera.IsValid() )
@@ -36,20 +74,14 @@ public void EjectGameCamera()
3674

3775
if ( !_ejectCamera.IsValid() )
3876
_ejectCamera = Renderer.CreateSceneEditorCamera();
39-
40-
_activeCamera = _ejectCamera;
41-
Renderer.Camera = _activeCamera;
42-
Renderer.EnableEngineOverlays = false;
43-
ViewportOptions.Visible = true;
44-
SetDefaultSize();
4577
}
4678

47-
public void PossesGameCamera()
79+
/// <summary>
80+
/// Called when possessing back into the game state.
81+
/// </summary>
82+
public void OnPossessGame()
4883
{
49-
Editor.GameMode.SetPlayWidget( Renderer );
50-
_activeCamera = null;
51-
Renderer.Camera = null;
52-
Renderer.EnableEngineOverlays = true;
53-
ViewportOptions.Visible = false;
84+
GameMode.SetPlayWidget( Renderer );
85+
IsGameView = true;
5486
}
5587
}

game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,8 +412,8 @@ protected override void OnMouseReleased( MouseEvent e )
412412

413413
void OnEditorPreFrame()
414414
{
415-
if ( SceneView.CurrentView == SceneViewWidget.ViewMode.Game )
416-
return;
415+
// don't do editor update if we're the play view
416+
if ( IsGameView ) return;
417417

418418
UpdateInputState();
419419

0 commit comments

Comments
 (0)